Index: file.c =================================================================== --- file.c (revision 27344) +++ file.c (revision 27345) @@ -420,16 +420,12 @@ } } -int io_pcb_WriteSubcData(pcb_plug_io_t *ctx, FILE *FP, pcb_data_t *Data, long subc_idx) +static void io_pcb_print_subc(pcb_plug_io_t *ctx, FILE *FP, pcb_subc_t *sc) { - gdl_iterator_t sit, it; - pcb_subc_t *sc; + const char *attr_inhibit[] = {"refdes", "value", "footprint", NULL }; /* these are saved in the header if the element */ + gdl_iterator_t it; int l; - const char *attr_inhibit[] = {"refdes", "value", "footprint", NULL }; /* these are saved in the header if the element */ - pcb_printf_slot[0] = ((io_pcb_ctx_t *)(ctx->plugin_data))->write_coord_fmt; - - subclist_foreach(&Data->subc, &sit, sc) { pcb_coord_t ox, oy, rx = 0, ry = 0; int rdir = 0, rscale = 100, on_bot = 0; pcb_text_t *trefdes; @@ -436,9 +432,6 @@ pcb_pstk_t *ps; pcb_any_obj_t fobj; - if ((subc_idx != -1) && (subc_idx != sit.count)) - continue; - pcb_subc_get_origin(sc, &ox, &oy); trefdes = pcb_subc_get_refdes_text(sc); if (pcb_subc_get_side(sc, &on_bot) != 0) @@ -538,7 +531,7 @@ pcb_io_incompat_save(sc->data, NULL, "element-obj", desc, "only lines and arcs are exported"); free(desc); } - continue; + return; } if (!(ly->meta.bound.type & PCB_LYT_VIRTUAL) && (!pcb_layer_is_pure_empty(ly))) { @@ -548,10 +541,41 @@ } } fputs("\n)\n", FP); +} + +int io_pcb_WriteSubcData(pcb_plug_io_t *ctx, FILE *FP, pcb_data_t *Data, long subc_idx) +{ + gdl_iterator_t sit; + pcb_subc_t *sc; + + pcb_printf_slot[0] = ((io_pcb_ctx_t *)(ctx->plugin_data))->write_coord_fmt; + + subclist_foreach(&Data->subc, &sit, sc) { + if ((subc_idx != -1) && (subc_idx != sit.count)) + continue; + + io_pcb_print_subc(ctx, FP, sc); } return 0; } +int io_pcb_write_subcs_head(pcb_plug_io_t *ctx, void **udata, FILE *f, int lib, long num_subcs) +{ + return 0; +} + +int io_pcb_write_subcs_subc(pcb_plug_io_t *ctx, void **udata, FILE *f, pcb_subc_t *subc) +{ + pcb_printf_slot[0] = ((io_pcb_ctx_t *)(ctx->plugin_data))->write_coord_fmt; + io_pcb_print_subc(ctx, f, subc); + return 0; +} + +int io_pcb_write_subcs_tail(pcb_plug_io_t *ctx, void **udata, FILE *f) +{ + return 0; +} + static const char *layer_name_hack(pcb_layer_t *layer, const char *name) { unsigned long lflg = pcb_layer_flags_(layer); Index: file.h =================================================================== --- file.h (revision 27344) +++ file.h (revision 27345) @@ -58,7 +58,11 @@ int io_pcb_WriteSubcData(pcb_plug_io_t *ctx, FILE *f, pcb_data_t *data, long subc_idx); int io_pcb_WritePCB(pcb_plug_io_t *ctx, FILE *f, const char *old_filename, const char *new_filename, pcb_bool emergency); +int io_pcb_write_subcs_head(pcb_plug_io_t *ctx, void **udata, FILE *f, int lib, long num_subcs); +int io_pcb_write_subcs_subc(pcb_plug_io_t *ctx, void **udata, FILE *f, pcb_subc_t *subc); +int io_pcb_write_subcs_tail(pcb_plug_io_t *ctx, void **udata, FILE *f); + void PreLoadElementPCB(void); void PostLoadElementPCB(void); Index: io_pcb.c =================================================================== --- io_pcb.c (revision 27344) +++ io_pcb.c (revision 27345) @@ -76,6 +76,9 @@ io_pcb[0].parse_font = io_pcb_ParseFont; io_pcb[0].write_buffer = NULL; io_pcb[0].write_footprint = io_pcb_WriteSubcData; + io_pcb[0].write_subcs_head = io_pcb_write_subcs_head; + io_pcb[0].write_subcs_subc = io_pcb_write_subcs_subc; + io_pcb[0].write_subcs_tail = io_pcb_write_subcs_tail; io_pcb[0].write_pcb = io_pcb_WritePCB; io_pcb[0].default_fmt = "pcb"; io_pcb[0].description = "geda/pcb - mainline (centimils)"; @@ -91,6 +94,9 @@ io_pcb[1].fmt_support_prio = io_pcb_fmt; io_pcb[1].write_buffer = NULL; io_pcb[1].write_footprint = io_pcb_WriteSubcData; + io_pcb[1].write_subcs_head = io_pcb_write_subcs_head; + io_pcb[1].write_subcs_subc = io_pcb_write_subcs_subc; + io_pcb[1].write_subcs_tail = io_pcb_write_subcs_tail; io_pcb[1].write_pcb = io_pcb_WritePCB; io_pcb[1].default_fmt = "pcb"; io_pcb[1].description = "geda/pcb - readable units"; @@ -106,6 +112,9 @@ io_pcb[2].fmt_support_prio = io_pcb_fmt; io_pcb[2].write_buffer = NULL; io_pcb[2].write_footprint = io_pcb_WriteSubcData; + io_pcb[2].write_subcs_head = io_pcb_write_subcs_head; + io_pcb[2].write_subcs_subc = io_pcb_write_subcs_subc; + io_pcb[2].write_subcs_tail = io_pcb_write_subcs_tail; io_pcb[2].write_pcb = io_pcb_WritePCB; io_pcb[2].default_fmt = "pcb"; io_pcb[2].description = "geda/pcb - nanometer";