Index: trunk/src_plugins/export_svg/svg.c =================================================================== --- trunk/src_plugins/export_svg/svg.c (revision 23530) +++ trunk/src_plugins/export_svg/svg.c (revision 23531) @@ -281,12 +281,42 @@ fprintf(f, "\n"); } +static void svg_header(void) +{ + pcb_coord_t w, h, x1, y1, x2, y2; + + fprintf(f, "\n"); + w = PCB->MaxWidth; + h = PCB->MaxHeight; + while((w < PCB_MM_TO_COORD(1024)) && (h < PCB_MM_TO_COORD(1024))) { + w *= 2; + h *= 2; + } + + x1 = PCB_MM_TO_COORD(2); + y1 = PCB_MM_TO_COORD(2); + x2 = PCB->MaxWidth; + y2 = PCB->MaxHeight; + x2 += PCB_MM_TO_COORD(5); + y2 += PCB_MM_TO_COORD(5); + pcb_fprintf(f, "\n", w, h, x1, y1, x2, y2); +} + +static void svg_footer(void) +{ + while(group_open) { + group_close(); + group_open--; + } + + fprintf(f, "\n"); +} + static void svg_do_export(pcb_hid_attr_val_t * options) { const char *filename; int save_ons[PCB_MAX_LAYER + 2]; int i; - pcb_coord_t w, h, x1, y1, x2, y2; comp_cnt = 0; @@ -299,32 +329,21 @@ pcb_cam_begin(PCB, &svg_cam, options[HA_cam].str_value, svg_attribute_list, NUM_OPTIONS, options); - filename = options[HA_svgfile].str_value; - if (!filename) - filename = "pcb.svg"; + if (svg_cam.fn_template == NULL) { + filename = options[HA_svgfile].str_value; + if (!filename) + filename = "pcb.svg"; - f = pcb_fopen(svg_cam.active ? svg_cam.fn : filename, "wb"); - if (!f) { - perror(filename); - return; + f = pcb_fopen(svg_cam.active ? svg_cam.fn : filename, "wb"); + if (!f) { + perror(filename); + return; + } + svg_header(); } + else + f = NULL; - fprintf(f, "\n"); - w = PCB->MaxWidth; - h = PCB->MaxHeight; - while((w < PCB_MM_TO_COORD(1024)) && (h < PCB_MM_TO_COORD(1024))) { - w *= 2; - h *= 2; - } - - x1 = PCB_MM_TO_COORD(2); - y1 = PCB_MM_TO_COORD(2); - x2 = PCB->MaxWidth; - y2 = PCB->MaxHeight; - x2 += PCB_MM_TO_COORD(5); - y2 += PCB_MM_TO_COORD(5); - pcb_fprintf(f, "\n", w, h, x1, y1, x2, y2); - if (!svg_cam.active) pcb_hid_save_and_show_layer_ons(save_ons); @@ -333,12 +352,7 @@ if (!svg_cam.active) pcb_hid_restore_layer_ons(save_ons); - while(group_open) { - group_close(); - group_open--; - } - - fprintf(f, "\n"); + svg_footer(); fclose(f); f = NULL; @@ -364,6 +378,20 @@ pcb_cam_set_layer_group(&svg_cam, group, purpose, purpi, flags, xform); + if (svg_cam.fn_changed) { + if (f != NULL) { + svg_footer(); + fclose(f); + } + + f = pcb_fopen(svg_cam.fn, "wb"); + if (f == NULL) { + perror(svg_cam.fn); + return 0; + } + svg_header(); + } + if (!svg_cam.active) { if (flags & PCB_LYT_INVIS) return 0;