Index: trunk/src/plug_io.c =================================================================== --- trunk/src/plug_io.c (revision 9493) +++ trunk/src/plug_io.c (revision 9494) @@ -280,13 +280,13 @@ } -int pcb_write_buffer(FILE *f, pcb_buffer_t *buff, const char *fmt) +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); if (p != NULL) { - res = p->write_buffer(p, f, buff); + res = p->write_buffer(p, f, buff, elem_only); newfmt = 1; } @@ -636,7 +636,7 @@ if (PCB_SWAP_IDENT) pcb_buffers_flip_side(PCB); - result = pcb_write_pipe(Filename, pcb_false, fmt); + result = pcb_write_pipe(Filename, pcb_false, fmt, pcb_true); if (PCB_SWAP_IDENT) pcb_buffers_flip_side(PCB); return (result); @@ -650,10 +650,10 @@ int retcode; if (pcb_gui->notify_save_pcb == NULL) - return pcb_write_pipe(file, pcb_true, fmt); + return pcb_write_pipe(file, pcb_true, fmt, pcb_false); pcb_gui->notify_save_pcb(file, pcb_false); - retcode = pcb_write_pipe(file, pcb_true, fmt); + retcode = pcb_write_pipe(file, pcb_true, fmt, pcb_false); pcb_gui->notify_save_pcb(file, pcb_true); return retcode; @@ -713,7 +713,7 @@ if (PCB && PCB->Changed && (conf_core.rc.emergency_name != NULL) && (*conf_core.rc.emergency_name != '\0')) { sprintf(filename, conf_core.rc.emergency_name, (long int)pcb_getpid()); pcb_message(PCB_MSG_INFO, _("Trying to save your layout in '%s'\n"), filename); - pcb_write_pcb_file(filename, pcb_true, DEFAULT_FMT, pcb_true); + pcb_write_pcb_file(filename, pcb_true, DEFAULT_FMT, pcb_true, pcb_false); } } @@ -797,7 +797,7 @@ } } - pcb_write_pcb_file(filename, pcb_true, NULL, pcb_true); + pcb_write_pcb_file(filename, pcb_true, NULL, pcb_true, pcb_false); free(filename); } @@ -811,7 +811,7 @@ void pcb_tmp_data_save(void) { char *fn = pcb_build_fn(conf_core.rc.emergency_name); - pcb_write_pcb_file(fn, pcb_true, NULL, pcb_true); + pcb_write_pcb_file(fn, pcb_true, NULL, pcb_true, pcb_false); if (TMPFilename != NULL) free(TMPFilename); TMPFilename = fn; @@ -828,7 +828,7 @@ #endif /* Write the pcb file, a footprint or a buffer */ -static int pcb_write_file(FILE *fp, pcb_bool thePcb, const char *old_path, const char *new_path, const char *fmt, pcb_bool emergency) +static int pcb_write_file(FILE *fp, pcb_bool thePcb, const char *old_path, const char *new_path, const char *fmt, pcb_bool emergency, pcb_bool elem_only) { if (thePcb) { if (PCB->is_footprint) @@ -835,13 +835,13 @@ return pcb_write_element_data(fp, PCB->Data, fmt); return pcb_write_pcb(fp, old_path, new_path, fmt, emergency); } - return pcb_write_buffer(fp, PCB_PASTEBUFFER, fmt); + return pcb_write_buffer(fp, PCB_PASTEBUFFER, fmt, elem_only); } /* --------------------------------------------------------------------------- * writes PCB to file */ -int pcb_write_pcb_file(const char *Filename, pcb_bool thePcb, const char *fmt, pcb_bool emergency) +int pcb_write_pcb_file(const char *Filename, pcb_bool thePcb, const char *fmt, pcb_bool emergency, pcb_bool elem_only) { FILE *fp; int result, overwrite; @@ -871,7 +871,7 @@ return (-1); } - result = pcb_write_file(fp, thePcb, fn_tmp, Filename, fmt, emergency); + result = pcb_write_file(fp, thePcb, fn_tmp, Filename, fmt, emergency, elem_only); fclose(fp); if (fn_tmp != NULL) { @@ -887,7 +887,7 @@ * writes to pipe using the command defined by conf_core.rc.save_command * %f are replaced by the passed filename */ -int pcb_write_pipe(const char *Filename, pcb_bool thePcb, const char *fmt) +int pcb_write_pipe(const char *Filename, pcb_bool thePcb, const char *fmt, pcb_bool elem_only) { FILE *fp; int result; @@ -895,7 +895,7 @@ static gds_t command; if (PCB_EMPTY_STRING_P(conf_core.rc.save_command)) - return pcb_write_pcb_file(Filename, thePcb, fmt, pcb_false); + return pcb_write_pcb_file(Filename, thePcb, fmt, pcb_false, elem_only); /* setup commandline */ gds_truncate(&command,0); @@ -916,7 +916,7 @@ return (-1); } - result = pcb_write_file(fp, thePcb, NULL, NULL, fmt, pcb_false); + result = pcb_write_file(fp, thePcb, NULL, NULL, fmt, pcb_false, elem_only); return (pclose(fp) ? (-1) : result); } Index: trunk/src/plug_io.h =================================================================== --- trunk/src/plug_io.h (revision 9493) +++ trunk/src/plug_io.h (revision 9494) @@ -77,7 +77,7 @@ /* Write the buffer to a file. Return 0 on success. */ - int (*write_buffer)(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff); + int (*write_buffer)(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff, pcb_bool elem_only); /* Write element data to a file. Return 0 on success. */ int (*write_element)(pcb_plug_io_t *ctx, FILE *f, pcb_data_t *e); @@ -108,7 +108,7 @@ int pcb_parse_pcb(pcb_board_t *Ptr, const char *Filename, const char *fmt, int load_settings, int ignore_missing); int pcb_parse_element(pcb_data_t *Ptr, const char *name); int pcb_parse_font(pcb_font_t *Ptr, const char *Filename); -int pcb_write_buffer(FILE *f, pcb_buffer_t *buff, const char *fmt); +int pcb_write_buffer(FILE *f, pcb_buffer_t *buff, const char *fmt, pcb_bool elem_only); int pcb_write_element_data(FILE *f, pcb_data_t *e, const char *fmt); int pcb_write_font(pcb_font_t *Ptr, const char *Filename, const char *fmt); @@ -129,8 +129,8 @@ void pcb_print_quoted_string(FILE *, const char *); void pcb_library_sort(pcb_lib_t *lib); void pcb_set_some_route_style(); -int pcb_write_pcb_file(const char *Filename, pcb_bool thePcb, const char *fmt, pcb_bool emergency); -int pcb_write_pipe(const char *, pcb_bool, const char *fmt); +int pcb_write_pcb_file(const char *Filename, pcb_bool thePcb, const char *fmt, pcb_bool emergency, pcb_bool elem_only); +int pcb_write_pipe(const char *, pcb_bool, const char *fmt, pcb_bool elem_only); #ifndef HAS_ATEXIT void pcb_tmp_data_save(void); Index: trunk/src_plugins/fp_board/fp_board.c =================================================================== --- trunk/src_plugins/fp_board/fp_board.c (revision 9493) +++ trunk/src_plugins/fp_board/fp_board.c (revision 9494) @@ -122,7 +122,7 @@ f = fopen(tmp_name, "w"); memset(&buff2, 0, sizeof(buff2)); buff2.Data = op.buffer.dst; - pcb_write_buffer(f, &buff2, "pcb"); + pcb_write_buffer(f, &buff2, "pcb", pcb_true); fclose(f); pcb_data_free(op.buffer.dst); Index: trunk/src_plugins/io_kicad/write.c =================================================================== --- trunk/src_plugins/io_kicad/write.c (revision 9493) +++ trunk/src_plugins/io_kicad/write.c (revision 9494) @@ -53,7 +53,7 @@ static int write_kicad_layout_via_drill_size(FILE * FP, pcb_cardinal_t indentation); /* writes the buffer to file */ -int io_kicad_write_buffer(pcb_plug_io_t *ctx, FILE * FP, pcb_buffer_t *buff) +int io_kicad_write_buffer(pcb_plug_io_t *ctx, FILE * FP, pcb_buffer_t *buff, pcb_bool elem_only) { 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 9493) +++ trunk/src_plugins/io_kicad/write.h (revision 9494) @@ -30,7 +30,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); +int io_kicad_write_buffer(pcb_plug_io_t *ctx, FILE * FP, pcb_buffer_t *buff, pcb_bool elem_only); int io_kicad_write_pcb(pcb_plug_io_t *ctx, FILE * FP, const char *old_filename, const char *new_filename, pcb_bool emergency); int write_kicad_module_header(FILE * FP, pcb_cardinal_t indentation); int write_kicad_layout_header(FILE * FP, pcb_cardinal_t indentation); Index: trunk/src_plugins/io_kicad_legacy/write.c =================================================================== --- trunk/src_plugins/io_kicad_legacy/write.c (revision 9493) +++ trunk/src_plugins/io_kicad_legacy/write.c (revision 9494) @@ -52,7 +52,7 @@ static int write_kicad_legacy_layout_via_drill_size(FILE * FP); /* writes the buffer to file */ -int io_kicad_legacy_write_buffer(pcb_plug_io_t *ctx, FILE * FP, pcb_buffer_t *buff) +int io_kicad_legacy_write_buffer(pcb_plug_io_t *ctx, FILE * FP, pcb_buffer_t *buff, pcb_bool elem_only) { /*fputs("io_kicad_legacy_write_buffer()", FP); */ Index: trunk/src_plugins/io_kicad_legacy/write.h =================================================================== --- trunk/src_plugins/io_kicad_legacy/write.h (revision 9493) +++ trunk/src_plugins/io_kicad_legacy/write.h (revision 9494) @@ -30,7 +30,7 @@ #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); +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_pcb(pcb_plug_io_t *ctx, FILE * FP, const char *old_filename, const char *new_filename, pcb_bool emergency); int write_kicad_legacy_module_header(FILE * FP); int write_kicad_legacy_layout_header(FILE * FP); Index: trunk/src_plugins/io_pcb/file.c =================================================================== --- trunk/src_plugins/io_pcb/file.c (revision 9493) +++ trunk/src_plugins/io_pcb/file.c (revision 9494) @@ -586,16 +586,22 @@ /* --------------------------------------------------------------------------- * writes the buffer to file */ -int io_pcb_WriteBuffer(pcb_plug_io_t *ctx, FILE * FP, pcb_buffer_t *buff) +int io_pcb_WriteBuffer(pcb_plug_io_t *ctx, FILE * FP, pcb_buffer_t *buff, pcb_bool elem_only) { pcb_cardinal_t i; - LayersFixup(); + pcb_printf_slot[0] = ((io_pcb_ctx_t *)(ctx->plugin_data))->write_coord_fmt; - pcb_printf_slot[0] = ((io_pcb_ctx_t *)(ctx->plugin_data))->write_coord_fmt; - WriteViaData(FP, buff->Data); + if (!elem_only) { + LayersFixup(); + WriteViaData(FP, buff->Data); + } + io_pcb_WriteElementData(ctx, FP, buff->Data); - WriteLayers(FP, buff->Data); + + if (!elem_only) + WriteLayers(FP, buff->Data); + return (0); } Index: trunk/src_plugins/io_pcb/file.h =================================================================== --- trunk/src_plugins/io_pcb/file.h (revision 9493) +++ trunk/src_plugins/io_pcb/file.h (revision 9494) @@ -47,7 +47,7 @@ const char *write_coord_fmt; } io_pcb_ctx_t; -int io_pcb_WriteBuffer(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff); +int io_pcb_WriteBuffer(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff, pcb_bool elem_only); int io_pcb_WriteElementData(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);