Index: trunk/src/plug_io.c =================================================================== --- trunk/src/plug_io.c (revision 27313) +++ trunk/src/plug_io.c (revision 27314) @@ -377,10 +377,13 @@ int pcb_write_buffer(FILE *f, pcb_buffer_t *buff, const char *fmt, pcb_bool elem_only) { int res/*, newfmt = 0*/; - pcb_plug_io_t *p = find_writer(PCB_IOT_BUFFER, fmt); + pcb_plug_io_t *p = find_writer(elem_only ? PCB_IOT_BUFFER_SUBC : PCB_IOT_BUFFER, fmt); if (p != NULL) { - res = p->write_buffer(p, f, buff, elem_only); + if (elem_only) + res = p->write_buffer_subc(p, f, buff, 0); + else + res = p->write_buffer(p, f, buff); /*newfmt = 1;*/ } Index: trunk/src/plug_io.h =================================================================== --- trunk/src/plug_io.h (revision 27313) +++ trunk/src/plug_io.h (revision 27314) @@ -37,7 +37,8 @@ PCB_IOT_PCB = 1, PCB_IOT_FOOTPRINT = 2, PCB_IOT_FONT = 4, - PCB_IOT_BUFFER = 8 + PCB_IOT_BUFFER = 8, + PCB_IOT_BUFFER_SUBC= 16 } pcb_plug_iot_t; /**************************** API definition *********************************/ @@ -78,8 +79,11 @@ /* Write the buffer to a file. Return 0 on success. */ - int (*write_buffer)(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff, pcb_bool elem_only); + int (*write_buffer)(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff); + /* Write the idxth subcircuit from buffer to a file. Return 0 on success. */ + int (*write_buffer_subc)(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff, long idx); + /* Write element data to a file. Return 0 on success. */ int (*write_footprint)(pcb_plug_io_t *ctx, FILE *f, pcb_data_t *e); Index: trunk/src_plugins/io_autotrax/io_autotrax.c =================================================================== --- trunk/src_plugins/io_autotrax/io_autotrax.c (revision 27313) +++ trunk/src_plugins/io_autotrax/io_autotrax.c (revision 27314) @@ -79,6 +79,7 @@ io_autotrax.parse_footprint = NULL; io_autotrax.parse_font = NULL; io_autotrax.write_buffer = NULL; + io_autotrax.write_buffer_subc = NULL; io_autotrax.write_footprint = NULL; io_autotrax.write_pcb = io_autotrax_write_pcb; io_autotrax.default_fmt = "Protel autotrax"; Index: trunk/src_plugins/io_dsn/io_dsn.c =================================================================== --- trunk/src_plugins/io_dsn/io_dsn.c (revision 27313) +++ trunk/src_plugins/io_dsn/io_dsn.c (revision 27314) @@ -76,6 +76,7 @@ io_dsn.parse_footprint = NULL; io_dsn.parse_font = NULL; io_dsn.write_buffer = NULL; + io_dsn.write_buffer_subc = NULL; io_dsn.write_footprint = NULL; io_dsn.write_pcb = io_dsn_write_pcb; io_dsn.default_fmt = "dsn"; Index: trunk/src_plugins/io_eagle/io_eagle.c =================================================================== --- trunk/src_plugins/io_eagle/io_eagle.c (revision 27313) +++ trunk/src_plugins/io_eagle/io_eagle.c (revision 27314) @@ -75,6 +75,7 @@ /* io_eagle_xml.parse_footprint = NULL; io_eagle_xml.parse_font = NULL; io_eagle_xml.write_buffer = io_eagle_write_buffer; + io_eagle_xml.write_buffer_subc = io_eagle_write_buffer_subc; io_eagle_xml.write_footprint = io_eagle_write_element; io_eagle_xml.write_pcb = io_eagle_write_pcb;*/ io_eagle_xml.default_fmt = "eagle"; @@ -94,6 +95,7 @@ /* io_eagle_bin.parse_footprint = NULL; io_eagle_bin.parse_font = NULL; io_eagle_bin.write_buffer = io_eagle_write_buffer; + io_eagle_bin.write_buffer_subc = io_eagle_write_buffer_subc; io_eagle_bin.write_footprint = io_eagle_write_element; io_eagle_bin.write_pcb = io_eagle_write_pcb;*/ io_eagle_bin.default_fmt = "eagle"; @@ -113,6 +115,7 @@ io_eagle_dru.parse_footprint = NULL; io_eagle_dru.parse_font = NULL; io_eagle_dru.write_buffer = NULL; + io_eagle_dru.write_buffer_subc = NULL; io_eagle_dru.write_footprint = NULL; io_eagle_dru.write_pcb = /*io_eagle_write_pcb_dru*/ NULL; io_eagle_dru.default_fmt = "eagle"; Index: trunk/src_plugins/io_hyp/io_hyp.c =================================================================== --- trunk/src_plugins/io_hyp/io_hyp.c (revision 27313) +++ trunk/src_plugins/io_hyp/io_hyp.c (revision 27314) @@ -177,6 +177,7 @@ /* io_hyp.parse_footprint = NULL; io_hyp.parse_font = NULL; io_hyp.write_buffer = io_hyp_write_buffer; + io_hyp.write_buffer_subc = io_hyp_write_buffer_subc; io_hyp.write_footprint = io_hyp_write_element;*/ io_hyp.write_pcb = io_hyp_write_pcb; io_hyp.default_fmt = "hyp"; Index: trunk/src_plugins/io_kicad/io_kicad.c =================================================================== --- trunk/src_plugins/io_kicad/io_kicad.c (revision 27313) +++ trunk/src_plugins/io_kicad/io_kicad.c (revision 27314) @@ -79,7 +79,8 @@ io_kicad.parse_pcb = io_kicad_read_pcb; io_kicad.parse_footprint = io_kicad_parse_element; io_kicad.parse_font = NULL; - io_kicad.write_buffer = io_kicad_write_buffer; + io_kicad.write_buffer = NULL; + io_kicad.write_buffer_subc = io_kicad_write_buffer_subc; io_kicad.write_footprint = io_kicad_write_element; io_kicad.write_pcb = io_kicad_write_pcb; io_kicad.default_fmt = "kicad"; Index: trunk/src_plugins/io_kicad/write.c =================================================================== --- trunk/src_plugins/io_kicad/write.c (revision 27313) +++ trunk/src_plugins/io_kicad/write.c (revision 27314) @@ -45,7 +45,7 @@ static int force_center = 0; /* writes the buffer to file */ -int io_kicad_write_buffer(pcb_plug_io_t *ctx, FILE *FP, pcb_buffer_t *buff, pcb_bool elem_only) +int io_kicad_write_buffer_subc(pcb_plug_io_t *ctx, FILE *FP, pcb_buffer_t *buff, long idx) { pcb_message(PCB_MSG_ERROR, "can't save buffer in s-expr yet, please use kicad legacy for this\n"); return -1; Index: trunk/src_plugins/io_kicad/write.h =================================================================== --- trunk/src_plugins/io_kicad/write.h (revision 27313) +++ trunk/src_plugins/io_kicad/write.h (revision 27314) @@ -31,7 +31,7 @@ #include "data.h" int io_kicad_write_element(pcb_plug_io_t *ctx, FILE *FP, pcb_data_t *Data); -int io_kicad_write_buffer(pcb_plug_io_t *ctx, FILE *FP, pcb_buffer_t *buff, pcb_bool elem_only); +int io_kicad_write_buffer_subc(pcb_plug_io_t *ctx, FILE *FP, pcb_buffer_t *buff, long idx); int io_kicad_write_pcb(pcb_plug_io_t *ctx, FILE *FP, const char *old_filename, const char *new_filename, pcb_bool emergency); Index: trunk/src_plugins/io_kicad_legacy/io_kicad_legacy.c =================================================================== --- trunk/src_plugins/io_kicad_legacy/io_kicad_legacy.c (revision 27313) +++ trunk/src_plugins/io_kicad_legacy/io_kicad_legacy.c (revision 27314) @@ -65,7 +65,8 @@ io_kicad_legacy.parse_pcb = NULL; io_kicad_legacy.parse_footprint = NULL; io_kicad_legacy.parse_font = NULL; - io_kicad_legacy.write_buffer = io_kicad_legacy_write_buffer; + io_kicad_legacy.write_buffer = NULL; + io_kicad_legacy.write_buffer_subc = io_kicad_legacy_write_buffer_subc; io_kicad_legacy.write_footprint = io_kicad_legacy_write_element; io_kicad_legacy.write_pcb = io_kicad_legacy_write_pcb; io_kicad_legacy.default_fmt = "kicadl"; Index: trunk/src_plugins/io_kicad_legacy/write.c =================================================================== --- trunk/src_plugins/io_kicad_legacy/write.c (revision 27313) +++ trunk/src_plugins/io_kicad_legacy/write.c (revision 27314) @@ -663,8 +663,13 @@ } } -int io_kicad_legacy_write_buffer(pcb_plug_io_t *ctx, FILE *FP, pcb_buffer_t *buff, pcb_bool elem_only) +int io_kicad_legacy_write_buffer_subc(pcb_plug_io_t *ctx, FILE *FP, pcb_buffer_t *buff, long idx) { + if (idx != 0) { + pcb_message(PCB_MSG_ERROR, "Only the first subcircuit can be saved at the moment\n"); + return -1; + } + if (pcb_subclist_length(&buff->Data->subc) == 0) { pcb_message(PCB_MSG_ERROR, "Buffer has no subcircuits!\n"); return -1; Index: trunk/src_plugins/io_kicad_legacy/write.h =================================================================== --- trunk/src_plugins/io_kicad_legacy/write.h (revision 27313) +++ trunk/src_plugins/io_kicad_legacy/write.h (revision 27314) @@ -31,5 +31,5 @@ #include "data.h" int io_kicad_legacy_write_element(pcb_plug_io_t *ctx, FILE *FP, pcb_data_t *Data); -int io_kicad_legacy_write_buffer(pcb_plug_io_t *ctx, FILE *FP, pcb_buffer_t *buff, pcb_bool elem_only); +int io_kicad_legacy_write_buffer_subc(pcb_plug_io_t *ctx, FILE *FP, pcb_buffer_t *buff, long idx); int io_kicad_legacy_write_pcb(pcb_plug_io_t *ctx, FILE *FP, const char *old_filename, const char *new_filename, pcb_bool emergency); Index: trunk/src_plugins/io_lihata/io_lihata.c =================================================================== --- trunk/src_plugins/io_lihata/io_lihata.c (revision 27313) +++ trunk/src_plugins/io_lihata/io_lihata.c (revision 27314) @@ -47,6 +47,9 @@ if ((lih) && (typ & PCB_IOT_BUFFER) && (ctx->write_buffer != NULL)) return 40; + if ((lih) && (typ & PCB_IOT_BUFFER_SUBC) && (ctx->write_buffer_subc != NULL)) + return 40; + if (!lih || ((typ & (~(PCB_IOT_PCB | PCB_IOT_FONT | PCB_IOT_FOOTPRINT))) != 0)) return 0; @@ -83,6 +86,7 @@ plug_io_lihata_v6.parse_font = io_lihata_parse_font; plug_io_lihata_v6.write_font = io_lihata_write_font; plug_io_lihata_v6.write_buffer = io_lihata_write_buffer; + plug_io_lihata_v6.write_buffer_subc = io_lihata_write_buffer_subc; plug_io_lihata_v6.write_footprint = io_lihata_write_element; plug_io_lihata_v6.write_pcb = io_lihata_write_pcb_v6; plug_io_lihata_v6.default_fmt = "lihata"; @@ -106,7 +110,8 @@ plug_io_lihata_v5.parse_footprint = io_lihata_parse_element; plug_io_lihata_v5.parse_font = io_lihata_parse_font; plug_io_lihata_v5.write_font = io_lihata_write_font; - plug_io_lihata_v5.write_buffer = io_lihata_write_buffer; + plug_io_lihata_v5.write_buffer = NULL; + plug_io_lihata_v5.write_buffer_subc = io_lihata_write_buffer_subc; plug_io_lihata_v5.write_footprint = io_lihata_write_element; plug_io_lihata_v5.write_pcb = io_lihata_write_pcb_v5; plug_io_lihata_v5.default_fmt = "lihata"; @@ -128,7 +133,8 @@ plug_io_lihata_v4.parse_footprint = io_lihata_parse_element; plug_io_lihata_v4.parse_font = io_lihata_parse_font; plug_io_lihata_v4.write_font = io_lihata_write_font; - plug_io_lihata_v4.write_buffer = io_lihata_write_buffer; + plug_io_lihata_v4.write_buffer = NULL; + plug_io_lihata_v4.write_buffer_subc = io_lihata_write_buffer_subc; plug_io_lihata_v4.write_footprint = io_lihata_write_element; plug_io_lihata_v4.write_pcb = io_lihata_write_pcb_v4; plug_io_lihata_v4.default_fmt = "lihata"; @@ -150,7 +156,8 @@ plug_io_lihata_v3.parse_footprint = io_lihata_parse_element; plug_io_lihata_v3.parse_font = io_lihata_parse_font; plug_io_lihata_v3.write_font = io_lihata_write_font; - plug_io_lihata_v3.write_buffer = io_lihata_write_buffer; + plug_io_lihata_v3.write_buffer = NULL; + plug_io_lihata_v3.write_buffer_subc = io_lihata_write_buffer_subc; plug_io_lihata_v3.write_footprint = io_lihata_write_element; plug_io_lihata_v3.write_pcb = io_lihata_write_pcb_v3; plug_io_lihata_v3.default_fmt = "lihata"; @@ -173,6 +180,7 @@ plug_io_lihata_v2.parse_font = io_lihata_parse_font; plug_io_lihata_v2.write_font = io_lihata_write_font; plug_io_lihata_v2.write_buffer = NULL; + plug_io_lihata_v2.write_buffer_subc = NULL; plug_io_lihata_v2.write_footprint = NULL; plug_io_lihata_v2.write_pcb = io_lihata_write_pcb_v2; plug_io_lihata_v2.default_fmt = "lihata"; @@ -195,6 +203,7 @@ plug_io_lihata_v1.parse_font = io_lihata_parse_font; plug_io_lihata_v1.write_font = io_lihata_write_font; plug_io_lihata_v1.write_buffer = NULL; + plug_io_lihata_v1.write_buffer_subc = NULL; plug_io_lihata_v1.write_footprint = NULL; plug_io_lihata_v1.write_pcb = io_lihata_write_pcb_v1; plug_io_lihata_v1.default_fmt = "lihata"; Index: trunk/src_plugins/io_lihata/write.c =================================================================== --- trunk/src_plugins/io_lihata/write.c (revision 27313) +++ trunk/src_plugins/io_lihata/write.c (revision 27314) @@ -1712,10 +1712,16 @@ return res; } -int io_lihata_write_buffer(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff, pcb_bool elem_only) +int io_lihata_write_buffer(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff) { - if (!elem_only) { - pcb_message(PCB_MSG_ERROR, "Can't save full buffer (yet), only a single subcircuits from a buffer\n"); + pcb_message(PCB_MSG_ERROR, "Can't save full buffer (yet), only a single subcircuits from a buffer\n"); + return -1; +} + +int io_lihata_write_buffer_subc(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff, long idx) +{ + if (idx != 0) { + pcb_message(PCB_MSG_ERROR, "Only the first subcircuit can be saved at the moment\n"); return -1; } Index: trunk/src_plugins/io_lihata/write.h =================================================================== --- trunk/src_plugins/io_lihata/write.h (revision 27313) +++ trunk/src_plugins/io_lihata/write.h (revision 27314) @@ -33,7 +33,8 @@ int io_lihata_write_pcb_v5(pcb_plug_io_t *ctx, FILE *FP, const char *old_filename, const char *new_filename, pcb_bool emergency); int io_lihata_write_pcb_v6(pcb_plug_io_t *ctx, FILE *FP, const char *old_filename, const char *new_filename, pcb_bool emergency); int io_lihata_write_font(pcb_plug_io_t *ctx, pcb_font_t *font, const char *Filename); -int io_lihata_write_buffer(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff, pcb_bool elem_only); +int io_lihata_write_buffer(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff); +int io_lihata_write_buffer_subc(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff, long idx); int io_lihata_write_element(pcb_plug_io_t *ctx, FILE *f, pcb_data_t *dt); void *io_lihata_save_as_subd_init(const pcb_plug_io_t *ctx, pcb_hid_dad_subdialog_t *sub, pcb_plug_iot_t type); Index: trunk/src_plugins/io_mentor_cell/io_mentor_cell.c =================================================================== --- trunk/src_plugins/io_mentor_cell/io_mentor_cell.c (revision 27313) +++ trunk/src_plugins/io_mentor_cell/io_mentor_cell.c (revision 27314) @@ -70,6 +70,7 @@ io_mentor_cell.parse_footprint = NULL; io_mentor_cell.parse_font = NULL; io_mentor_cell.write_buffer = NULL; + io_mentor_cell.write_buffer_subc = NULL; io_mentor_cell.write_footprint = NULL; io_mentor_cell.write_pcb = NULL; io_mentor_cell.default_fmt = "mentor_cell"; Index: trunk/src_plugins/io_pcb/file.c =================================================================== --- trunk/src_plugins/io_pcb/file.c (revision 27313) +++ trunk/src_plugins/io_pcb/file.c (revision 27314) @@ -703,17 +703,16 @@ } } -int io_pcb_WriteBuffer(pcb_plug_io_t *ctx, FILE * FP, pcb_buffer_t *buff, pcb_bool elem_only) +int io_pcb_WriteBuffer_subc(pcb_plug_io_t *ctx, FILE *FP, pcb_buffer_t *buff, long idx) { pcb_printf_slot[0] = ((io_pcb_ctx_t *)(ctx->plugin_data))->write_coord_fmt; - if (elem_only) { - if (pcb_subclist_length(&buff->Data->subc) == 0) { - pcb_message(PCB_MSG_ERROR, "Buffer has no subcircuits!\n"); - return -1; - } + if (pcb_subclist_length(&buff->Data->subc) == 0) { + pcb_message(PCB_MSG_ERROR, "Buffer has no subcircuits!\n"); + return -1; } - else { + if (idx != 0) { + pcb_message(PCB_MSG_ERROR, "Only the first subcircuit can be saved at the moment\n"); return -1; } Index: trunk/src_plugins/io_pcb/file.h =================================================================== --- trunk/src_plugins/io_pcb/file.h (revision 27313) +++ trunk/src_plugins/io_pcb/file.h (revision 27314) @@ -57,7 +57,7 @@ extern pcb_plug_io_t *pcb_preferred_io_pcb, *pcb_nanometer_io_pcb, *pcb_centimil_io_pcb; -int io_pcb_WriteBuffer(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff, pcb_bool elem_only); +int io_pcb_WriteBuffer_subc(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff, long idx); int io_pcb_WriteSubcData(pcb_plug_io_t *ctx, FILE *f, pcb_data_t *); int io_pcb_WritePCB(pcb_plug_io_t *ctx, FILE *f, const char *old_filename, const char *new_filename, pcb_bool emergency); Index: trunk/src_plugins/io_pcb/io_pcb.c =================================================================== --- trunk/src_plugins/io_pcb/io_pcb.c (revision 27313) +++ trunk/src_plugins/io_pcb/io_pcb.c (revision 27314) @@ -74,7 +74,8 @@ io_pcb[0].parse_pcb = io_pcb_ParsePCB; io_pcb[0].parse_footprint = io_pcb_ParseElement; io_pcb[0].parse_font = io_pcb_ParseFont; - io_pcb[0].write_buffer = io_pcb_WriteBuffer; + io_pcb[0].write_buffer = NULL; + io_pcb[0].write_buffer_subc = io_pcb_WriteBuffer_subc; io_pcb[0].write_footprint = io_pcb_WriteSubcData; io_pcb[0].write_pcb = io_pcb_WritePCB; io_pcb[0].default_fmt = "pcb"; @@ -89,7 +90,8 @@ ctx[1].write_coord_fmt = pcb_printf_slot[9]; io_pcb[1].plugin_data = &ctx[1]; io_pcb[1].fmt_support_prio = io_pcb_fmt; - io_pcb[1].write_buffer = io_pcb_WriteBuffer; + io_pcb[1].write_buffer = NULL; + io_pcb[1].write_buffer_subc = io_pcb_WriteBuffer_subc; io_pcb[1].write_footprint = io_pcb_WriteSubcData; io_pcb[1].write_pcb = io_pcb_WritePCB; io_pcb[1].default_fmt = "pcb"; @@ -104,7 +106,8 @@ ctx[2].write_coord_fmt = "%$$mn"; io_pcb[2].plugin_data = &ctx[2]; io_pcb[2].fmt_support_prio = io_pcb_fmt; - io_pcb[2].write_buffer = io_pcb_WriteBuffer; + io_pcb[2].write_buffer = NULL; + io_pcb[2].write_buffer_subc = io_pcb_WriteBuffer_subc; io_pcb[2].write_footprint = io_pcb_WriteSubcData; io_pcb[2].write_pcb = io_pcb_WritePCB; io_pcb[2].default_fmt = "pcb"; Index: trunk/src_plugins/io_tedax/io_tedax.c =================================================================== --- trunk/src_plugins/io_tedax/io_tedax.c (revision 27313) +++ trunk/src_plugins/io_tedax/io_tedax.c (revision 27314) @@ -188,8 +188,12 @@ return tedax_fp_fsave(dt, f); } -static int io_tedax_write_buffer(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff, pcb_bool elem_only) +static int io_tedax_write_buffer_subc(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff, long idx) { + if (idx != 0) { + pcb_message(PCB_MSG_ERROR, "Only the first subcircuit cna be saved at the moment\n"); + return -1; + } return tedax_fp_fsave(buff->Data, f); } @@ -253,7 +257,8 @@ io_tedax.parse_pcb = io_tedax_parse_pcb; io_tedax.parse_footprint = io_tedax_parse_element; io_tedax.parse_font = NULL; - io_tedax.write_buffer = io_tedax_write_buffer; + io_tedax.write_buffer = NULL; + io_tedax.write_buffer_subc = io_tedax_write_buffer_subc; io_tedax.write_footprint = io_tedax_write_element; io_tedax.write_pcb = NULL; io_tedax.default_fmt = "tEDAx";