Index: trunk/src/layer.c =================================================================== --- trunk/src/layer.c (revision 19118) +++ trunk/src/layer.c (revision 19119) @@ -45,8 +45,8 @@ pcb_virt_layer_t pcb_virt_layers[] = { {"invisible", PCB_LYT_VIRTUAL + 1, PCB_LYT_VIRTUAL | PCB_LYT_INVIS, NULL, -1 }, {"rats", PCB_LYT_VIRTUAL + 2, PCB_LYT_VIRTUAL | PCB_LYT_RAT, NULL, -1 }, - {"topassembly", PCB_LYT_VIRTUAL + 3, PCB_LYT_VIRTUAL | PCB_LYT_ASSY | PCB_LYT_TOP, "assy", F_assy }, - {"bottomassembly", PCB_LYT_VIRTUAL + 4, PCB_LYT_VIRTUAL | PCB_LYT_ASSY | PCB_LYT_BOTTOM, "assy", F_assy }, + {"topassembly", PCB_LYT_VIRTUAL + 3, PCB_LYT_VIRTUAL | PCB_LYT_TOP, "assy", F_assy }, + {"bottomassembly", PCB_LYT_VIRTUAL + 4, PCB_LYT_VIRTUAL | PCB_LYT_BOTTOM, "assy", F_assy }, {"fab", PCB_LYT_VIRTUAL + 5, PCB_LYT_VIRTUAL | PCB_LYT_FAB | PCB_LYT_LOGICAL, "fab", F_fab }, {"plated-drill", PCB_LYT_VIRTUAL + 6, PCB_LYT_VIRTUAL | PCB_LYT_PDRILL, "plated", F_plated }, {"unplated-drill", PCB_LYT_VIRTUAL + 7, PCB_LYT_VIRTUAL | PCB_LYT_UDRILL, "unplated", F_unplated }, @@ -86,7 +86,6 @@ { PCB_LYT_OUTLINE, 2, "outline" }, { PCB_LYT_RAT, 2, "rat" }, { PCB_LYT_INVIS, 2, "invis" }, - { PCB_LYT_ASSY, 2, "assy" }, { PCB_LYT_FAB, 2, "fab" }, { PCB_LYT_PDRILL, 2, "plateddrill" }, { PCB_LYT_UDRILL, 2, "unplateddrill" }, Index: trunk/src/layer.h =================================================================== --- trunk/src/layer.h (revision 19118) +++ trunk/src/layer.h (revision 19119) @@ -51,7 +51,6 @@ PCB_LYT_OUTLINE = 0x00001000, /* outline (contour of the board) */ PCB_LYT_RAT = 0x00002000, /* (virtual) rats nest (one, not in the stackup) */ PCB_LYT_INVIS = 0x00004000, /* (virtual) layer is invisible (one, not in the stackup) */ - PCB_LYT_ASSY = 0x00008000, /* (virtual) assembly drawing (top and bottom) */ PCB_LYT_FAB = 0x00010000, /* (virtual) fab drawing (one, not in the stackup) */ PCB_LYT_PDRILL = 0x00020000, /* (virtual) plated drills (affects all physical layers) */ PCB_LYT_UDRILL = 0x00040000, /* (virtual) unplated drills (affects all physical layers) */ @@ -95,6 +94,7 @@ #define PCB_LAYER_IN_STACK(lyt) (((lyt) & PCB_LYT_COPPER) || ((lyt) & PCB_LYT_SILK) || ((lyt) & PCB_LYT_MASK) || ((lyt) & PCB_LYT_PASTE) || ((lyt) & PCB_LYT_SUBSTRATE)) #define PCB_LAYER_SIDED(lyt) (((lyt) & PCB_LYT_COPPER) || ((lyt) & PCB_LYT_SILK) || ((lyt) & PCB_LYT_MASK) || ((lyt) & PCB_LYT_PASTE)) +#define PCB_LAYER_IS_ASSY(lyt, purpi) (((lyt) & PCB_LYT_VIRTUAL) && ((purpi) == F_assy)) #include "globalconst.h" #include "global_typedefs.h" Index: trunk/src_plugins/export_bboard/bboard.c =================================================================== --- trunk/src_plugins/export_bboard/bboard.c (revision 19118) +++ trunk/src_plugins/export_bboard/bboard.c (revision 19119) @@ -53,6 +53,7 @@ #include "compat_misc.h" #include "compat_fs.h" #include "misc_util.h" +#include "funchash_core.h" #include "rtree.h" #include "hid.h" @@ -179,9 +180,9 @@ return bboard_options; } -static int bboard_validate_layer(unsigned long flags, int group, int skipsolder) +static int bboard_validate_layer(unsigned long flags, int purpi, int group, int skipsolder) { - if ((flags & PCB_LYT_INVIS) || (flags & PCB_LYT_ASSY) || (flags & PCB_LYT_OUTLINE)) + if ((flags & PCB_LYT_INVIS) || PCB_LAYER_IS_ASSY(flags, purpi) || (flags & PCB_LYT_OUTLINE)) return 0; if (group_data[group].solder && skipsolder) @@ -552,9 +553,21 @@ /* draw all wires from all valid layers */ for (i = pcb_max_layer; i >= 0; i--) { unsigned int flg = pcb_layer_flags(PCB, i); + pcb_layergrp_id_t gid; + pcb_layergrp_t *grp; + int purpi; + if (flg & PCB_LYT_SILK) continue; - if (bboard_validate_layer(flg, pcb_layer_get_group(PCB, i), options[HA_skipsolder].int_value)) { + + gid = pcb_layer_get_group(PCB, i); + grp = pcb_get_layergrp(PCB, gid); + if (grp == NULL) + purpi = -1; + else + purpi = grp->purpi; + + if (bboard_validate_layer(flg, purpi, gid, options[HA_skipsolder].int_value)) { bboard_get_layer_color(&(PCB->Data->Layer[i]), &clr_r, &clr_g, &clr_b); bboard_set_color_cairo(clr_r, clr_g, clr_b); PCB_LINE_LOOP(&(PCB->Data->Layer[i])); Index: trunk/src_plugins/export_gerber/gerber.c =================================================================== --- trunk/src_plugins/export_gerber/gerber.c (revision 19118) +++ trunk/src_plugins/export_gerber/gerber.c (revision 19119) @@ -24,6 +24,7 @@ #include "compat_misc.h" #include "safe_fs.h" #include "macro.h" +#include "funchash_core.h" #include "hid.h" #include "hid_nogui.h" @@ -397,7 +398,7 @@ /* Very similar to pcb_layer_to_file_name() but appends only a three-character suffix compatible with Eagle's defaults. */ -static void assign_eagle_file_suffix(char *dest, pcb_layer_id_t lid, unsigned int flags) +static void assign_eagle_file_suffix(char *dest, pcb_layer_id_t lid, unsigned int flags, int purpi) { const char *suff = "out"; @@ -425,9 +426,9 @@ suff = "inv"; else if (fmatch(flags, PCB_LYT_FAB)) suff = "fab"; - else if (fmatch(flags, PCB_LYT_TOP | PCB_LYT_ASSY)) + else if (fmatch(flags, PCB_LYT_TOP) && PCB_LAYER_IS_ASSY(flags, purpi)) suff = "ast"; - else if (fmatch(flags, PCB_LYT_BOTTOM | PCB_LYT_ASSY)) + else if (fmatch(flags, PCB_LYT_BOTTOM) && PCB_LAYER_IS_ASSY(flags, purpi)) suff = "asb"; else if (fmatch(flags, PCB_LYT_OUTLINE)) suff = "oln"; @@ -442,7 +443,7 @@ /* Very similar to layer_type_to_file_name() but appends only a three-character suffix compatible with Hackvana's naming requirements */ -static void assign_hackvana_file_suffix(char *dest, pcb_layer_id_t lid, unsigned int flags) +static void assign_hackvana_file_suffix(char *dest, pcb_layer_id_t lid, unsigned int flags, int purpi) { char *suff; @@ -470,9 +471,9 @@ suff = "inv"; else if (fmatch(flags, PCB_LYT_FAB)) suff = "fab"; - else if (fmatch(flags, PCB_LYT_TOP | PCB_LYT_ASSY)) + else if (fmatch(flags, PCB_LYT_TOP) && PCB_LAYER_IS_ASSY(flags, purpi)) suff = "ast"; - else if (fmatch(flags, PCB_LYT_BOTTOM | PCB_LYT_ASSY)) + else if (fmatch(flags, PCB_LYT_BOTTOM) && PCB_LAYER_IS_ASSY(flags, purpi)) suff = "asb"; else if (fmatch(flags, PCB_LYT_OUTLINE)) suff = "gm1"; @@ -486,7 +487,7 @@ } /* Very similar to layer_type_to_file_name() but appends the group name _and_ the magic suffix */ -static void assign_universal_file_suffix(char *dest, pcb_layergrp_id_t gid, unsigned int flags) +static void assign_universal_file_suffix(char *dest, pcb_layergrp_id_t gid, unsigned int flags, int purpi) { char *suff; int name_len; @@ -516,9 +517,9 @@ suff = "inv"; else if (fmatch(flags, PCB_LYT_FAB)) suff = "fab"; - else if (fmatch(flags, PCB_LYT_TOP | PCB_LYT_ASSY)) + else if (fmatch(flags, PCB_LYT_TOP) && PCB_LAYER_IS_ASSY(flags, purpi)) suff = "ast"; - else if (fmatch(flags, PCB_LYT_BOTTOM | PCB_LYT_ASSY)) + else if (fmatch(flags, PCB_LYT_BOTTOM) && PCB_LAYER_IS_ASSY(flags, purpi)) suff = "asb"; else if (fmatch(flags, PCB_LYT_OUTLINE)) suff = "gko"; @@ -546,7 +547,7 @@ #undef fmatch -static void assign_file_suffix(char *dest, pcb_layergrp_id_t gid, pcb_layer_id_t lid, unsigned int flags) +static void assign_file_suffix(char *dest, pcb_layergrp_id_t gid, pcb_layer_id_t lid, unsigned int flags, int purpi) { int fns_style; const char *sext = ".gbr"; @@ -563,13 +564,13 @@ fns_style = PCB_FNS_first; break; case NAME_STYLE_EAGLE: - assign_eagle_file_suffix(dest, lid, flags); + assign_eagle_file_suffix(dest, lid, flags, purpi); return; case NAME_STYLE_HACKVANA: - assign_hackvana_file_suffix(dest, lid, flags); + assign_hackvana_file_suffix(dest, lid, flags, purpi); return; case NAME_STYLE_UNIVERSAL: - assign_universal_file_suffix(dest, gid, flags); + assign_universal_file_suffix(dest, gid, flags, purpi); return; } @@ -696,7 +697,7 @@ const char *group_name; /* before cam lets this happen... */ - if (flags & PCB_LYT_ASSY) + if (PCB_LAYER_IS_ASSY(flags, purpi)) return 0; pcb_cam_set_layer_group(&gerber_cam, group, purpose, purpi, flags); @@ -721,7 +722,7 @@ if (copy_outline_mode == COPY_OUTLINE_SILK && (flags & PCB_LYT_SILK)) stay = 1; if (copy_outline_mode == COPY_OUTLINE_ALL && \ ((flags & PCB_LYT_SILK) || (flags & PCB_LYT_MASK) || - (flags & PCB_LYT_FAB) || (flags & PCB_LYT_ASSY) || + (flags & PCB_LYT_FAB) || PCB_LAYER_IS_ASSY(flags, purpi) || (flags & PCB_LYT_OUTLINE))) stay = 1; if (!stay) return 0; @@ -728,7 +729,7 @@ } } - if ((flags & PCB_LYT_INVIS) || (flags & PCB_LYT_ASSY)) { + if ((flags & PCB_LYT_INVIS) || PCB_LAYER_IS_ASSY(flags, purpi)) { /* printf(" nope: invis %d or assy %d\n", (flags & PCB_LYT_INVIS), (flags & PCB_LYT_ASSY));*/ return 0; } @@ -793,7 +794,7 @@ } pagecount++; - assign_file_suffix(filesuff, group, layer, flags); + assign_file_suffix(filesuff, group, layer, flags, purpi); if (f == NULL) { /* open a new file if we closed the previous (cam mode: only one file) */ f = pcb_fopen(gerber_cam.active ? gerber_cam.fn : filename, "wb"); /* Binary needed to force CR-LF */ if (f == NULL) { @@ -877,7 +878,7 @@ if (copy_outline_mode == COPY_OUTLINE_SILK && (flags & PCB_LYT_SILK)) want_outline = 1; - if (copy_outline_mode == COPY_OUTLINE_ALL && ((flags & PCB_LYT_SILK) || (flags & PCB_LYT_MASK) || (flags & PCB_LYT_FAB) || (flags & PCB_LYT_ASSY))) + if (copy_outline_mode == COPY_OUTLINE_ALL && ((flags & PCB_LYT_SILK) || (flags & PCB_LYT_MASK) || (flags & PCB_LYT_FAB) || PCB_LAYER_IS_ASSY(flags, purpi))) want_outline = 1; if (want_outline && !(flags & PCB_LYT_OUTLINE)) { Index: trunk/src_plugins/export_png/png.c =================================================================== --- trunk/src_plugins/export_png/png.c (revision 19118) +++ trunk/src_plugins/export_png/png.c (revision 19119) @@ -47,6 +47,7 @@ #include "compat_misc.h" #include "plugins.h" #include "safe_fs.h" +#include "funchash_core.h" #include "hid.h" #include "hid_nogui.h" @@ -1277,7 +1278,7 @@ if (flags & PCB_LYT_NOEXPORT) return 0; - if ((flags & PCB_LYT_ASSY) || (flags & PCB_LYT_FAB) || (flags & PCB_LYT_PASTE) || (flags & PCB_LYT_INVIS) || (flags & PCB_LYT_CSECT)) + if (PCB_LAYER_IS_ASSY(flags, purpi) || (flags & PCB_LYT_FAB) || (flags & PCB_LYT_PASTE) || (flags & PCB_LYT_INVIS) || (flags & PCB_LYT_CSECT)) return 0; } Index: trunk/src_plugins/export_ps/eps.c =================================================================== --- trunk/src_plugins/export_ps/eps.c (revision 19118) +++ trunk/src_plugins/export_ps/eps.c (revision 19119) @@ -23,6 +23,7 @@ #include "hid_cam.h" #include "hid_flags.h" #include "hid_color.h" +#include "funchash_core.h" #define CRASH(func) fprintf(stderr, "HID error: pcb called unimplemented EPS function %s.\n", func); abort() @@ -374,7 +375,7 @@ if (flags & PCB_LYT_NOEXPORT) return 0; - if ((flags & PCB_LYT_ASSY) || (flags & PCB_LYT_FAB) || (flags & PCB_LYT_CSECT) || (flags & PCB_LYT_INVIS)) + if (PCB_LAYER_IS_ASSY(flags, purpi) || (flags & PCB_LYT_FAB) || (flags & PCB_LYT_CSECT) || (flags & PCB_LYT_INVIS)) return 0; if ((group >= 0) && pcb_layergrp_is_empty(PCB, group) && (flags & PCB_LYT_OUTLINE)) Index: trunk/src_plugins/export_ps/ps.c =================================================================== --- trunk/src_plugins/export_ps/ps.c (revision 19118) +++ trunk/src_plugins/export_ps/ps.c (revision 19119) @@ -17,6 +17,7 @@ #include "plugins.h" #include "hid_cam.h" #include "safe_fs.h" +#include "funchash_core.h" #include "hid.h" #include "hid_nogui.h" @@ -828,7 +829,7 @@ global.is_drill = ((flags & PCB_LYT_PDRILL) || (flags & PCB_LYT_UDRILL)); global.is_mask = !!(flags & PCB_LYT_MASK); - global.is_assy = !!(flags & PCB_LYT_ASSY); + global.is_assy = PCB_LAYER_IS_ASSY(flags, purpi); global.is_copper = !!(flags & PCB_LYT_COPPER); global.is_paste = !!(flags & PCB_LYT_PASTE); Index: trunk/src_plugins/gpmi/pcb-gpmi/gpmi_plugin/gpmi_pkg/layout/layout.h =================================================================== --- trunk/src_plugins/gpmi/pcb-gpmi/gpmi_plugin/gpmi_pkg/layout/layout.h (revision 19118) +++ trunk/src_plugins/gpmi/pcb-gpmi/gpmi_plugin/gpmi_pkg/layout/layout.h (revision 19119) @@ -92,7 +92,6 @@ LYT_OUTLINE = PCB_LYT_OUTLINE, LYT_RAT = PCB_LYT_RAT, LYT_INVIS = PCB_LYT_INVIS, - LYT_ASSY = PCB_LYT_ASSY, LYT_FAB = PCB_LYT_FAB, LYT_PDRILL = PCB_LYT_PDRILL, LYT_UDRILL = PCB_LYT_UDRILL, Index: trunk/src_plugins/hid_gtk2_gdk/gtkhid-gdk.c =================================================================== --- trunk/src_plugins/hid_gtk2_gdk/gtkhid-gdk.c (revision 19118) +++ trunk/src_plugins/hid_gtk2_gdk/gtkhid-gdk.c (revision 19119) @@ -10,6 +10,7 @@ #include "hid_draw_helpers.h" #include "hid_attrib.h" #include "hid_color.h" +#include "funchash_core.h" #include "../src_plugins/lib_gtk_hid/gui.h" #include "../src_plugins/lib_gtk_hid/coord_conv.h" @@ -122,6 +123,9 @@ if (idx >= 0 && idx < pcb_max_layer && ((flags & PCB_LYT_ANYTHING) != PCB_LYT_SILK)) return /*pinout ? 1 : */ PCB->Data->Layer[idx].meta.real.vis; + if (PCB_LAYER_IS_ASSY(flags, purpi)) + return 0; + /* virtual layers */ { switch (flags & PCB_LYT_ANYTHING) { @@ -131,8 +135,6 @@ if (PCB_LAYERFLG_ON_VISIBLE_SIDE(flags) /*|| pinout */ ) return pcb_silk_on(PCB); return 0; - case PCB_LYT_ASSY: - return 0; case PCB_LYT_PDRILL: case PCB_LYT_UDRILL: return 1; Index: trunk/src_plugins/hid_gtk2_gl/gtkhid-gl.c =================================================================== --- trunk/src_plugins/hid_gtk2_gl/gtkhid-gl.c (revision 19118) +++ trunk/src_plugins/hid_gtk2_gl/gtkhid-gl.c (revision 19119) @@ -8,6 +8,7 @@ #include "hid_draw_helpers.h" #include "hid_attrib.h" #include "hid_color.h" +#include "funchash_core.h" #include "../src_plugins/lib_hid_common/clip.h" #include "../src_plugins/lib_gtk_config/hid_gtk_conf.h" @@ -188,6 +189,9 @@ return PCB->Data->Layer[idx].meta.real.vis; } + if (PCB_LAYER_IS_ASSY(flags, purpi)) + return 0; + /* virtual layers */ { switch (flags & PCB_LYT_ANYTHING) { @@ -197,8 +201,6 @@ if (PCB_LAYERFLG_ON_VISIBLE_SIDE(flags)) return pcb_silk_on(PCB); return 0; - case PCB_LYT_ASSY: - return 0; case PCB_LYT_PDRILL: case PCB_LYT_UDRILL: return 1; Index: trunk/src_plugins/hid_gtk3_cairo/gtkhid-cairo.c =================================================================== --- trunk/src_plugins/hid_gtk3_cairo/gtkhid-cairo.c (revision 19118) +++ trunk/src_plugins/hid_gtk3_cairo/gtkhid-cairo.c (revision 19119) @@ -38,6 +38,7 @@ #include "hid_draw_helpers.h" #include "hid_attrib.h" #include "hid_color.h" +#include "funchash_core.h" #include "../src_plugins/lib_gtk_hid/gui.h" #include "../src_plugins/lib_gtk_hid/coord_conv.h" @@ -234,6 +235,9 @@ if (idx >= 0 && idx < pcb_max_layer && ((flags & PCB_LYT_ANYTHING) != PCB_LYT_SILK)) return /*pinout ? 1 : */ PCB->Data->Layer[idx].meta.real.vis; + if (PCB_LAYER_IS_ASSY(flags, purpi)) + return 0; + /* virtual layers */ { switch (flags & PCB_LYT_ANYTHING) { @@ -243,8 +247,6 @@ if (PCB_LAYERFLG_ON_VISIBLE_SIDE(flags) /*|| pinout */ ) return pcb_silk_on(PCB); return 0; - case PCB_LYT_ASSY: - return 0; case PCB_LYT_PDRILL: case PCB_LYT_UDRILL: return 1; Index: trunk/src_plugins/hid_lesstif/main.c =================================================================== --- trunk/src_plugins/hid_lesstif/main.c (revision 19118) +++ trunk/src_plugins/hid_lesstif/main.c (revision 19119) @@ -27,6 +27,7 @@ #include "plugins.h" #include "macro.h" #include "safe_fs.h" +#include "funchash_core.h" #include "hid.h" #include "hid_nogui.h" @@ -2921,6 +2922,9 @@ if (flags & PCB_LYT_COPPER) return pinout ? 1 : PCB->Data->Layer[idx].meta.real.vis; + if (PCB_LAYER_IS_ASSY(flags, purpi)) + return 0; + /* virtual layers */ { switch (flags & PCB_LYT_ANYTHING) { @@ -2930,8 +2934,6 @@ if (PCB_LAYERFLG_ON_VISIBLE_SIDE(flags)) return pcb_silk_on(PCB); return 0; - case PCB_LYT_ASSY: - return 0; case PCB_LYT_UDRILL: case PCB_LYT_PDRILL: return 1;