Index: globalconst.h =================================================================== RCS file: /cvsroot/pcb/pcb/globalconst.h,v retrieving revision 1.8 diff -p -U2 -r1.8 globalconst.h --- globalconst.h 3 Mar 2006 21:33:43 -0000 1.8 +++ globalconst.h 28 May 2006 02:31:47 -0000 @@ -61,6 +61,7 @@ * some limit specifications */ -#define MAX_LAYER 8 /* max number of layer, check source */ +#define MAX_LAYER 16 /* max number of layer, check source */ /* code for more changes, a *lot* more changes */ +#define DEF_LAYER 8 /* default number of layers for new boards */ #define NUM_STYLES 4 #define MIN_LINESIZE 1 /* thickness of lines in 1/100000'' */ Index: src/action.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/action.c,v retrieving revision 1.83 diff -p -U2 -r1.83 src/action.c --- src/action.c 1 May 2006 21:47:46 -0000 1.83 +++ src/action.c 28 May 2006 02:31:48 -0000 @@ -1301,5 +1301,5 @@ NotifyMode (void) if (GetLayerGroupNumberByNumber (INDEXOFCURRENT) == - GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER)) + GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER)) flag = ONSOLDERFLAG; if ((text = CreateNewText (CURRENT, &PCB->Font, Note.X, @@ -5127,4 +5127,6 @@ ActionNew (int argc, char **argv, int x, RemovePCB (PCB); PCB = CreateNewPCB (True); + PCB->Data->LayerN = DEF_LAYER; + CreateNewPCBPost (PCB, 1); /* setup the new name and reset some values to default */ @@ -5679,5 +5681,5 @@ ActionToggleVisibility (char *str) { number = atoi (str) - 1; - if (number >= 0 && number < MAX_LAYER + 2) + if (number >= 0 && number < max_layer + 2) { if (PCB->Data->Layer[number].On == False) @@ -5707,5 +5709,5 @@ ActionSwitchDrawingLayer (char *str) { number = atoi (str) - 1; - if (number >= 0 && number < MAX_LAYER + 2) + if (number >= 0 && number < max_layer + 2) { ChangeGroupVisibility (number, True, True); Index: src/autoplace.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/autoplace.c,v retrieving revision 1.17 diff -p -U2 -r1.17 src/autoplace.c --- src/autoplace.c 13 Apr 2006 23:45:39 -0000 1.17 +++ src/autoplace.c 28 May 2006 02:31:48 -0000 @@ -159,6 +159,6 @@ UpdateXY (NetListTypePtr Nets) Cardinal i, j; /* find layer groups of the component side and solder side */ - SLayer = GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER); - CLayer = GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER); + SLayer = GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER); + CLayer = GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER); /* update all nets */ for (i = 0; i < Nets->NetN; i++) @@ -215,5 +215,5 @@ showboxes (BoxListTypePtr blist) { Cardinal i; - LayerTypePtr SLayer = &(PCB->Data->Layer[MAX_LAYER + SOLDER_LAYER]); + LayerTypePtr SLayer = &(PCB->Data->Layer[max_layer + SOLDER_LAYER]); for (i = 0; i < blist->BoxN; i++) { Index: src/autoroute.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/autoroute.c,v retrieving revision 1.31 diff -p -U2 -r1.31 src/autoroute.c --- src/autoroute.c 28 Mar 2006 04:29:19 -0000 1.31 +++ src/autoroute.c 28 May 2006 02:31:49 -0000 @@ -337,5 +337,5 @@ static int __routebox_is_good (routebox_t * rb) { - assert (rb && (0 <= rb->group) && (rb->group < MAX_LAYER) && + assert (rb && (0 <= rb->group) && (rb->group < max_layer) && (rb->box.X1 <= rb->box.X2) && (rb->box.Y1 <= rb->box.Y2) && (rb->flags.orphan ? @@ -484,8 +484,8 @@ is_layer_group_active (Cardinal group) { int i; - assert (0 <= group && group < MAX_LAYER); + assert (0 <= group && group < max_layer); for (i = 0; i < PCB->LayerGroups.Number[group]; i++) - /* layer must be 1) not silk (ie, < MAX_LAYER) and 2) on */ - if ((PCB->LayerGroups.Entries[group][i] < MAX_LAYER) && + /* layer must be 1) not silk (ie, < max_layer) and 2) on */ + if ((PCB->LayerGroups.Entries[group][i] < max_layer) && PCB->Data->Layer[PCB->LayerGroups.Entries[group][i]].On) return True; /* this layer group is active. */ @@ -499,5 +499,5 @@ AddPin (PointerListType layergroupboxes[ int i; /* a pin cuts through every layer group */ - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { rbpp = (routebox_t **) GetPointerMemory (&layergroupboxes[i]); @@ -542,5 +542,5 @@ AddPad (PointerListType layergroupboxes[ routebox_t **rbpp; int layergroup = TEST_FLAG (ONSOLDERFLAG, pad) ? back : front; - assert (0 <= layergroup && layergroup < MAX_LAYER); + assert (0 <= layergroup && layergroup < max_layer); assert (PCB->LayerGroups.Number[layergroup] > 0); rbpp = (routebox_t **) GetPointerMemory (&layergroupboxes[layergroup]); @@ -572,8 +572,8 @@ AddLine (PointerListType layergroupboxes int layergroup; assert (layergroupboxes && line); - assert (0 <= layer && layer < MAX_LAYER); + assert (0 <= layer && layer < max_layer); layergroup = GetLayerGroupNumberByNumber (layer); - assert (0 <= layergroup && layergroup < MAX_LAYER); + assert (0 <= layergroup && layergroup < max_layer); assert (PCB->LayerGroups.Number[layergroup] > 0); @@ -616,9 +616,9 @@ AddIrregularObstacle (PointerListType la int layergroup; assert (layergroupboxes && parent); - assert (0 <= layer && layer < MAX_LAYER); + assert (0 <= layer && layer < max_layer); assert (X1 <= X2 && Y1 <= Y2); layergroup = GetLayerGroupNumberByNumber (layer); - assert (0 <= layergroup && layergroup < MAX_LAYER); + assert (0 <= layergroup && layergroup < max_layer); assert (PCB->LayerGroups.Number[layergroup] > 0); @@ -711,5 +711,5 @@ FindRouteBox (routedata_t * rd, Location region.X1 = region.X2 = X; region.Y1 = region.Y2 = Y; - for (group = 0; group < MAX_LAYER; group++) + for (group = 0; group < max_layer; group++) if (r_search (rd->layergrouptree[group], ®ion, NULL, __found_one, &fc)) return fc.match; @@ -795,8 +795,8 @@ CreateRouteData () int i; - front = GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER); - back = GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER); + front = GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER); + back = GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER); /* determine prefered routing direction on each group */ - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { if (i != back && i != front) @@ -833,5 +833,5 @@ CreateRouteData () /* initialize pointerlisttype */ - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { layergroupboxes[i].Ptr = NULL; @@ -858,5 +858,5 @@ CreateRouteData () END_LOOP; - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { /* add all (non-rat) lines */ @@ -887,5 +887,5 @@ CreateRouteData () /* create r-trees from pointer lists */ - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { /* initialize style (we'll fill in a "real" style later, when we add @@ -976,5 +976,5 @@ CreateRouteData () /* create "empty-space" structures for via placement (now that we know * appropriate keepaways for all the fixed elements) */ - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { POINTER_LOOP (&layergroupboxes[i]); @@ -988,5 +988,5 @@ CreateRouteData () } /* free pointer lists */ - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) FreePointerListMemory (&layergroupboxes[i]); /* done! */ @@ -998,5 +998,5 @@ DestroyRouteData (routedata_t ** rd) { int i; - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) r_destroy_tree (&(*rd)->layergrouptree[i]); mtspace_destroy (&(*rd)->mtspace); @@ -1152,28 +1152,28 @@ showbox (BoxType b, Dimension thickness, if (b.Y1 == b.Y2 || b.X1 == b.X2) thickness = 5; - line = CreateNewLineOnLayer (LAYER_PTR (MAX_LAYER + COMPONENT_LAYER), + line = CreateNewLineOnLayer (LAYER_PTR (max_layer + COMPONENT_LAYER), b.X1, b.Y1, b.X2, b.Y1, thickness, 0, 0); AddObjectToCreateUndoList (LINE_TYPE, - LAYER_PTR (MAX_LAYER + COMPONENT_LAYER), line, + LAYER_PTR (max_layer + COMPONENT_LAYER), line, line); if (b.Y1 != b.Y2) { - line = CreateNewLineOnLayer (LAYER_PTR (MAX_LAYER + COMPONENT_LAYER), + line = CreateNewLineOnLayer (LAYER_PTR (max_layer + COMPONENT_LAYER), b.X1, b.Y2, b.X2, b.Y2, thickness, 0, 0); AddObjectToCreateUndoList (LINE_TYPE, - LAYER_PTR (MAX_LAYER + COMPONENT_LAYER), + LAYER_PTR (max_layer + COMPONENT_LAYER), line, line); } - line = CreateNewLineOnLayer (LAYER_PTR (MAX_LAYER + COMPONENT_LAYER), + line = CreateNewLineOnLayer (LAYER_PTR (max_layer + COMPONENT_LAYER), b.X1, b.Y1, b.X1, b.Y2, thickness, 0, 0); AddObjectToCreateUndoList (LINE_TYPE, - LAYER_PTR (MAX_LAYER + COMPONENT_LAYER), line, + LAYER_PTR (max_layer + COMPONENT_LAYER), line, line); if (b.X1 != b.X2) { - line = CreateNewLineOnLayer (LAYER_PTR (MAX_LAYER + COMPONENT_LAYER), + line = CreateNewLineOnLayer (LAYER_PTR (max_layer + COMPONENT_LAYER), b.X2, b.Y1, b.X2, b.Y2, thickness, 0, 0); AddObjectToCreateUndoList (LINE_TYPE, - LAYER_PTR (MAX_LAYER + COMPONENT_LAYER), + LAYER_PTR (max_layer + COMPONENT_LAYER), line, line); } @@ -1218,5 +1218,5 @@ showroutebox (routebox_t * rb) { showbox (rb->box, rb->flags.source ? 5 : 3, - rb->flags.is_via ? MAX_LAYER + COMPONENT_LAYER : rb->group); + rb->flags.is_via ? max_layer + COMPONENT_LAYER : rb->group); } #endif @@ -2233,5 +2233,5 @@ RD_DrawVia (routedata_t * rd, LocationTy int i; /* a via cuts through every layer group */ - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { if (!is_layer_group_active (i)) @@ -2733,5 +2733,5 @@ add_via_sites (struct routeone_state *s, assert (__box_is_good (&cliparea)); count++; - for (j = 0; j < MAX_LAYER; j++) + for (j = 0; j < max_layer; j++) { edge_t *ne; Index: src/buffer.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/buffer.c,v retrieving revision 1.27 diff -p -U2 -r1.27 src/buffer.c --- src/buffer.c 30 Apr 2006 04:28:55 -0000 1.27 +++ src/buffer.c 28 May 2006 02:31:49 -0000 @@ -632,5 +632,5 @@ SmashBufferElement (BufferTypePtr Buffer END_LOOP; group = - GetLayerGroupNumberByNumber (MAX_LAYER + + GetLayerGroupNumberByNumber (max_layer + (SWAP_IDENT ? SOLDER_LAYER : COMPONENT_LAYER)); @@ -694,5 +694,5 @@ ConvertBufferToElement (BufferTypePtr Bu END_LOOP; /* get the component-side SM pads */ - group = GetLayerGroupNumberByNumber (MAX_LAYER + + group = GetLayerGroupNumberByNumber (max_layer + (SWAP_IDENT ? SOLDER_LAYER : COMPONENT_LAYER)); @@ -722,5 +722,5 @@ ConvertBufferToElement (BufferTypePtr Bu END_LOOP; /* now get the opposite side pads */ - group = GetLayerGroupNumberByNumber (MAX_LAYER + + group = GetLayerGroupNumberByNumber (max_layer + (SWAP_IDENT ? COMPONENT_LAYER : SOLDER_LAYER)); @@ -915,5 +915,5 @@ MirrorBuffer (BufferTypePtr Buffer) return; } - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) { LayerTypePtr layer = Buffer->Data->Layer + i; @@ -1038,12 +1038,12 @@ SwapBuffer (BufferTypePtr Buffer) ENDALL_LOOP; /* swap silkscreen layers */ - swap = Buffer->Data->Layer[MAX_LAYER + SOLDER_LAYER]; - Buffer->Data->Layer[MAX_LAYER + SOLDER_LAYER] = - Buffer->Data->Layer[MAX_LAYER + COMPONENT_LAYER]; - Buffer->Data->Layer[MAX_LAYER + COMPONENT_LAYER] = swap; + swap = Buffer->Data->Layer[max_layer + SOLDER_LAYER]; + Buffer->Data->Layer[max_layer + SOLDER_LAYER] = + Buffer->Data->Layer[max_layer + COMPONENT_LAYER]; + Buffer->Data->Layer[max_layer + COMPONENT_LAYER] = swap; /* swap layer groups when balanced */ - sgroup = GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER); - cgroup = GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER); + sgroup = GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER); + cgroup = GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER); if (PCB->LayerGroups.Number[cgroup] == PCB->LayerGroups.Number[sgroup]) { @@ -1054,9 +1054,9 @@ SwapBuffer (BufferTypePtr Buffer) Cardinal snumber = PCB->LayerGroups.Entries[sgroup][j]; - if (snumber >= MAX_LAYER) + if (snumber >= max_layer) continue; swap = Buffer->Data->Layer[snumber]; - while (cnumber >= MAX_LAYER) + while (cnumber >= max_layer) { k++; Index: src/copy.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/copy.c,v retrieving revision 1.14 diff -p -U2 -r1.14 src/copy.c --- src/copy.c 22 Mar 2006 23:17:20 -0000 1.14 +++ src/copy.c 28 May 2006 02:31:49 -0000 @@ -321,5 +321,5 @@ CopyPastebufferToLayout (LocationType X, /* paste all layers */ - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) { LayerTypePtr sourcelayer = &PASTEBUFFER->Data->Layer[i], Index: src/create.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/create.c,v retrieving revision 1.27 diff -p -U2 -r1.27 src/create.c --- src/create.c 22 Mar 2006 23:17:20 -0000 1.27 +++ src/create.c 28 May 2006 02:31:49 -0000 @@ -113,13 +113,13 @@ pcb_colors_from_settings (PCBTypePtr ptr ptr->Data->Layer[i].SelectedColor = Settings.LayerSelectedColor[i]; } - ptr->Data->Layer[MAX_LAYER + COMPONENT_LAYER].Color = + ptr->Data->Layer[max_layer + COMPONENT_LAYER].Color = Settings.ShowSolderSide ? Settings.InvisibleObjectsColor : Settings.ElementColor; - ptr->Data->Layer[MAX_LAYER + COMPONENT_LAYER].SelectedColor = + ptr->Data->Layer[max_layer + COMPONENT_LAYER].SelectedColor = Settings.ElementSelectedColor; - ptr->Data->Layer[MAX_LAYER + SOLDER_LAYER].Color = + ptr->Data->Layer[max_layer + SOLDER_LAYER].Color = Settings.ShowSolderSide ? Settings.ElementColor : Settings.InvisibleObjectsColor; - ptr->Data->Layer[MAX_LAYER + SOLDER_LAYER].SelectedColor = + ptr->Data->Layer[max_layer + SOLDER_LAYER].SelectedColor = Settings.ElementSelectedColor; } @@ -138,16 +138,4 @@ CreateNewPCB (Boolean SetDefaultNames) ptr->Data = CreateNewBuffer (); - /* copy default settings */ - pcb_colors_from_settings (ptr); - - if (SetDefaultNames) - for (i = 0; i < MAX_LAYER; i++) - ptr->Data->Layer[i].Name = MyStrdup (Settings.DefaultLayerName[i], - "CreateNewPCB()"); - ptr->Data->Layer[MAX_LAYER + COMPONENT_LAYER].Name = - MyStrdup ("silk", "CreateNewPCB()"); - ptr->Data->Layer[MAX_LAYER + SOLDER_LAYER].Name = - MyStrdup ("silk", "CreateNewPCB()"); - ptr->SilkActive = False; ptr->RatDraw = False; @@ -201,4 +189,27 @@ CreateNewPCB (Boolean SetDefaultNames) } +int +CreateNewPCBPost(PCBTypePtr pcb, int use_defaults) +{ + /* copy default settings */ + pcb_colors_from_settings (pcb); + + if (use_defaults) + { + int i; + if (ParseGroupString(Settings.Groups, &pcb->LayerGroups, DEF_LAYER)) + return 1; + + for (i = 0; i < max_layer; i++) + pcb->Data->Layer[i].Name = MyStrdup (Settings.DefaultLayerName[i], + "CreateNewPCB()"); + pcb->Data->Layer[max_layer + COMPONENT_LAYER].Name = + MyStrdup ("silk", "CreateNewPCB()"); + pcb->Data->Layer[max_layer + SOLDER_LAYER].Name = + MyStrdup ("silk", "CreateNewPCB()"); + } + return 0; +} + /* --------------------------------------------------------------------------- * creates a new via Index: src/create.h =================================================================== RCS file: /cvsroot/pcb/pcb/src/create.h,v retrieving revision 1.6 diff -p -U2 -r1.6 src/create.h --- src/create.h 22 Mar 2006 23:17:20 -0000 1.6 +++ src/create.h 28 May 2006 02:31:49 -0000 @@ -37,4 +37,7 @@ DataTypePtr CreateNewBuffer (void); void pcb_colors_from_settings (PCBTypePtr); PCBTypePtr CreateNewPCB (Boolean); +/* Called after PCB->Data->LayerN is set. Returns zero if no errors, + else nonzero. */ +int CreateNewPCBPost (PCBTypePtr, int /* set defaults */); PinTypePtr CreateNewVia (DataTypePtr, LocationType, LocationType, BDimension, BDimension, BDimension, BDimension, char *, Index: src/crosshair.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/crosshair.c,v retrieving revision 1.23 diff -p -U2 -r1.23 src/crosshair.c --- src/crosshair.c 14 May 2006 23:22:23 -0000 1.23 +++ src/crosshair.c 28 May 2006 02:31:49 -0000 @@ -293,5 +293,5 @@ XORDrawBuffer (BufferTypePtr Buffer) /* draw all visible layers */ - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) if (PCB->Data->Layer[i].On) { Index: src/data.h =================================================================== RCS file: /cvsroot/pcb/pcb/src/data.h,v retrieving revision 1.9 diff -p -U2 -r1.9 src/data.h --- src/data.h 22 Mar 2006 23:17:20 -0000 1.9 +++ src/data.h 28 May 2006 02:31:49 -0000 @@ -56,4 +56,6 @@ extern OutputType Output; extern PCBTypePtr PCB; +#define max_layer (PCB->Data->LayerN) + extern SettingType Settings; Index: src/djopt.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/djopt.c,v retrieving revision 1.34 diff -p -U2 -r1.34 src/djopt.c --- src/djopt.c 19 Apr 2006 22:36:46 -0000 1.34 +++ src/djopt.c 28 May 2006 02:31:49 -0000 @@ -556,5 +556,5 @@ new_line (corner_s * s, corner_s * e, in line_s *ls; - if (layer >= MAX_LAYER) + if (layer >= max_layer) dj_abort ("layer %d\n", layer); @@ -1926,5 +1926,5 @@ vianudge () directions[c->lines[i]->layer] |= o; } - for (o = 0, i = 0; i < MAX_LAYER; i++) + for (o = 0, i = 0; i < max_layer; i++) if (counts[i] == 1) { @@ -1945,5 +1945,5 @@ vianudge () continue; } - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) if (counts[i] && directions[i] != o && directions[i] != oboth) goto vianudge_continue; @@ -2561,5 +2561,5 @@ pinsnap () dprintf ("%s x %d-%d y %d-%d\n", corner_name (c), left, right, bottom, top); - for (l = 0; l <= MAX_LAYER; l++) + for (l = 0; l <= max_layer; l++) { best_dist[l] = close * 2; @@ -2607,8 +2607,8 @@ pinsnap () if (!got_one && c->n_lines == (c->pad ? 1 : 0)) { - for (l = 0; l <= MAX_LAYER; l++) + for (l = 0; l <= max_layer; l++) if (best_c[l]) dprintf ("best[%d] = %s\n", l, corner_name (best_c[l])); - for (l = 0; l <= MAX_LAYER; l++) + for (l = 0; l <= max_layer; l++) if (best_c[l]) { @@ -2782,22 +2782,22 @@ grok_layer_groups () solder_layer = component_layer = -1; - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { layer_type[i] = 0; layer_groupings[i] = 0; } - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { f = 0; for (j = 0; j < l->Number[i]; j++) { - if (l->Entries[i][j] == MAX_LAYER + SOLDER_LAYER) + if (l->Entries[i][j] == max_layer + SOLDER_LAYER) f |= LT_SOLDER; - if (l->Entries[i][j] == MAX_LAYER + COMPONENT_LAYER) + if (l->Entries[i][j] == max_layer + COMPONENT_LAYER) f |= LT_COMPONENT; } for (j = 0; j < l->Number[i]; j++) { - if (l->Entries[i][j] >= 0 && l->Entries[i][j] < MAX_LAYER) + if (l->Entries[i][j] >= 0 && l->Entries[i][j] < max_layer) { layer_type[l->Entries[i][j]] |= f; @@ -2926,5 +2926,5 @@ ActionDJopt (int argc, char **argv, int check (0, 0); - for (layn = 0; layn < MAX_LAYER; layn++) + for (layn = 0; layn < max_layer; layn++) { LayerType *layer = LAYER_PTR (layn); Index: src/draw.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/draw.c,v retrieving revision 1.53 diff -p -U2 -r1.53 src/draw.c --- src/draw.c 20 May 2006 20:04:45 -0000 1.53 +++ src/draw.c 28 May 2006 02:31:49 -0000 @@ -466,5 +466,5 @@ DrawEverything (BoxTypePtr drawn_area) memset (do_group, 0, sizeof (do_group)); - for (ngroups = 0, i = 0; i < MAX_LAYER; i++) + for (ngroups = 0, i = 0; i < max_layer; i++) { LayerType *l = LAYER_ON_STACK (i); @@ -477,6 +477,6 @@ DrawEverything (BoxTypePtr drawn_area) } - component = GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER); - solder = GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER); + component = GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER); + solder = GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER); /* @@ -761,5 +761,5 @@ DrawSilk (int new_swap, int layer, BoxTy gui->use_mask (HID_MASK_BEFORE); #endif - DrawLayer (LAYER_PTR (MAX_LAYER + layer), drawn_area); + DrawLayer (LAYER_PTR (max_layer + layer), drawn_area); /* draw package */ r_search (PCB->Data->element_tree, drawn_area, NULL, frontE_callback, @@ -779,5 +779,5 @@ DrawSilk (int new_swap, int layer, BoxTy { gui->use_mask (HID_MASK_AFTER); - DrawLayer (LAYER_PTR (MAX_LAYER + layer), drawn_area); + DrawLayer (LAYER_PTR (max_layer + layer), drawn_area); /* draw package */ r_search (PCB->Data->element_tree, drawn_area, NULL, frontE_callback, @@ -927,5 +927,5 @@ DrawLayerGroup (int group, const BoxType for (i = n_entries - 1; i >= 0; i--) - if (layers[i] < MAX_LAYER) + if (layers[i] < max_layer) { Layer = PCB->Data->Layer + layers[i]; @@ -953,5 +953,5 @@ got_mask: gui->use_mask (HID_MASK_BEFORE); for (i = n_entries - 1; i >= 0; i--) - if (layers[i] < MAX_LAYER) + if (layers[i] < max_layer) { Layer = PCB->Data->Layer + layers[i]; @@ -971,5 +971,5 @@ got_mask: gui->use_mask (HID_MASK_CLEAR); for (i = n_entries - 1; i >= 0; i--) - if (layers[i] < MAX_LAYER) + if (layers[i] < max_layer) { /* Make clearances around lines, arcs, pins and vias @@ -983,5 +983,5 @@ got_mask: gui->use_mask (HID_MASK_AFTER); for (i = n_entries - 1; i >= 0; i--) - if (layers[i] < MAX_LAYER) + if (layers[i] < max_layer) { Layer = PCB->Data->Layer + layers[i]; @@ -1007,5 +1007,5 @@ got_mask: layernum = layers[i]; Layer = PCB->Data->Layer + layers[i]; - if (layernum < MAX_LAYER && Layer->On && Layer->PolygonN) + if (layernum < max_layer && Layer->On && Layer->PolygonN) { /* print the non-clearing polys */ @@ -1030,5 +1030,5 @@ got_mask: layernum = layers[i]; Layer = PCB->Data->Layer + layers[i]; - if (layernum < MAX_LAYER && Layer->On) + if (layernum < max_layer && Layer->On) { /* draw all visible lines this layer */ @@ -1360,5 +1360,5 @@ ClearPin (PinTypePtr Pin, int Type, int } /* draw all the thermal(s) */ - for (i = MAX_LAYER; i; i--) + for (i = max_layer; i; i--) { layer = LAYER_ON_STACK (i - 1); Index: src/file.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/file.c,v retrieving revision 1.37 diff -p -U2 -r1.37 src/file.c --- src/file.c 28 Apr 2006 03:09:14 -0000 1.37 +++ src/file.c 28 May 2006 02:31:49 -0000 @@ -713,5 +713,5 @@ WriteBuffer (FILE * FP) WriteViaData (FP, PASTEBUFFER->Data); WriteElementData (FP, PASTEBUFFER->Data); - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) WriteLayerData (FP, i, &(PASTEBUFFER->Data->Layer[i])); return (STATUS_OK); @@ -732,5 +732,5 @@ WritePCB (FILE * FP) WriteElementData (FP, PCB->Data); WritePCBRatData (FP); - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) WriteLayerData (FP, i, &(PCB->Data->Layer[i])); WritePCBNetlistData (FP); Index: src/find.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/find.c,v retrieving revision 1.50 diff -p -U2 -r1.50 src/find.c --- src/find.c 20 Apr 2006 00:39:01 -0000 1.50 +++ src/find.c 28 May 2006 02:31:50 -0000 @@ -488,5 +488,5 @@ FreeLayoutLookupMemory (void) Cardinal i; - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { MyFree ((char **) &LineList[i].Data); @@ -551,5 +551,5 @@ InitLayoutLookup (void) /* initialize line arc and polygon data */ - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { LayerTypePtr layer = LAYER_PTR (i); @@ -702,5 +702,5 @@ LookupLOConnectionsToPVList (Boolean And /* now all lines, arcs and polygons of the several layers */ - for (layer = 0; layer < MAX_LAYER; layer++) + for (layer = 0; layer < max_layer; layer++) { PolygonTypePtr polygon = PCB->Data->Layer[layer].Polygon; @@ -781,5 +781,5 @@ LookupLOConnectionsToLOList (Boolean And * list entries plus the new ones */ - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { lineposition[i] = LineList[i].Location; @@ -814,5 +814,5 @@ LookupLOConnectionsToLOList (Boolean And } /* loop over all layergroups */ - for (group = 0; group < MAX_LAYER; group++) + for (group = 0; group < max_layer; group++) { Cardinal entry; @@ -822,8 +822,8 @@ LookupLOConnectionsToLOList (Boolean And layer = PCB->LayerGroups.Entries[group][entry]; - /* be aware that the layer number equal MAX_LAYER - * and MAX_LAYER+1 have a special meaning for pads + /* be aware that the layer number equal max_layer + * and max_layer+1 have a special meaning for pads */ - if (layer < MAX_LAYER) + if (layer < max_layer) { /* try all new lines */ @@ -851,5 +851,5 @@ LookupLOConnectionsToLOList (Boolean And { /* try all new pads */ - layer -= MAX_LAYER; + layer -= max_layer; position = &padposition[layer]; for (; *position < PadList[layer].Number; (*position)++) @@ -865,7 +865,7 @@ LookupLOConnectionsToLOList (Boolean And */ done = !AndRats || ratposition >= RatList.Number; - for (layer = 0; layer < MAX_LAYER + 2; layer++) + for (layer = 0; layer < max_layer + 2; layer++) { - if (layer < MAX_LAYER) + if (layer < max_layer) done = done && lineposition[layer] >= LineList[layer].Number @@ -874,6 +874,6 @@ LookupLOConnectionsToLOList (Boolean And else done = done - && padposition[layer - MAX_LAYER] >= - PadList[layer - MAX_LAYER].Number; + && padposition[layer - max_layer] >= + PadList[layer - max_layer].Number; } } @@ -1065,5 +1065,5 @@ LookupPVConnectionsToLOList (Boolean And /* loop over all layers */ - for (layer = 0; layer < MAX_LAYER; layer++) + for (layer = 0; layer < max_layer; layer++) { /* do nothing if there are no PV's */ @@ -1775,5 +1775,5 @@ LookupLOConnectionsToArc (ArcTypePtr Arc /* handle normal layers */ - if (layer < MAX_LAYER) + if (layer < max_layer) { PolygonTypePtr polygon; @@ -1803,5 +1803,5 @@ LookupLOConnectionsToArc (ArcTypePtr Arc else { - info.layer = layer - MAX_LAYER; + info.layer = layer - max_layer; if (setjmp (info.env) == 0) r_search (PCB->Data->pad_tree, &info.arc.BoundingBox, NULL, @@ -1911,5 +1911,5 @@ LookupLOConnectionsToLine (LineTypePtr L /* handle normal layers */ - if (layer < MAX_LAYER) + if (layer < max_layer) { PolygonTypePtr polygon; @@ -1943,5 +1943,5 @@ LookupLOConnectionsToLine (LineTypePtr L { /* handle special 'pad' layers */ - info.layer = layer - MAX_LAYER; + info.layer = layer - max_layer; if (setjmp (info.env) == 0) r_search (PCB->Data->pad_tree, &info.line.BoundingBox, NULL, @@ -2008,5 +2008,5 @@ LOTouchesLine (LineTypePtr Line, Cardina /* handle normal layers */ - if (layer < MAX_LAYER) + if (layer < max_layer) { PolygonTypePtr polygon; @@ -2036,5 +2036,5 @@ LOTouchesLine (LineTypePtr Line, Cardina { /* handle special 'pad' layers */ - info.layer = layer - MAX_LAYER; + info.layer = layer - max_layer; if (setjmp (info.env) == 0) r_search (PCB->Data->pad_tree, &info.line.BoundingBox, NULL, @@ -2126,5 +2126,5 @@ LookupLOConnectionsToRatEnd (PointTypePt */ - if (layer < MAX_LAYER) + if (layer < max_layer) { info.layer = layer; @@ -2141,5 +2141,5 @@ LookupLOConnectionsToRatEnd (PointTypePt { /* handle special 'pad' layers */ - info.layer = layer - MAX_LAYER; + info.layer = layer - max_layer; if (setjmp (info.env) == 0) r_search (PCB->Data->pad_tree, (BoxType *) Point, NULL, @@ -2269,5 +2269,5 @@ LookupLOConnectionsToPad (PadTypePtr Pad layer = PCB->LayerGroups.Entries[LayerGroup][entry]; /* handle normal layers */ - if (layer < MAX_LAYER) + if (layer < max_layer) { info.layer = layer; @@ -2294,5 +2294,5 @@ LookupLOConnectionsToPad (PadTypePtr Pad { /* handle special 'pad' layers */ - info.layer = layer - MAX_LAYER; + info.layer = layer - max_layer; if (setjmp (info.env) == 0) r_search (PCB->Data->pad_tree, (BoxType *) & info.pad, NULL, @@ -2389,5 +2389,5 @@ LookupLOConnectionsToPolygon (PolygonTyp /* handle normal layers */ - if (layer < MAX_LAYER) + if (layer < max_layer) { PolygonTypePtr polygon; @@ -2427,5 +2427,5 @@ LookupLOConnectionsToPolygon (PolygonTyp if (!TEST_FLAG (CLEARPOLYFLAG, Polygon)) { - info.layer = layer - MAX_LAYER; + info.layer = layer - max_layer; if (setjmp (info.env) == 0) r_search (PCB->Data->pad_tree, (BoxType *) & info.polygon, @@ -2778,5 +2778,5 @@ ListsEmpty (Boolean AndRats) if (AndRats) empty = empty && (RatList.Location >= RatList.Number); - for (i = 0; i < MAX_LAYER && empty; i++) + for (i = 0; i < max_layer && empty; i++) empty = empty && LineList[i].Location >= LineList[i].Number && ArcList[i].Location >= ArcList[i].Number @@ -2944,5 +2944,5 @@ PrepareNextLoop (FILE * FP) /* reset found LOs for the next pin */ - for (layer = 0; layer < MAX_LAYER; layer++) + for (layer = 0; layer < max_layer; layer++) { LineList[layer].Location = LineList[layer].Number = 0; @@ -3045,5 +3045,5 @@ DrawNewConnections (void) /* decrement 'i' to keep layerstack order */ - for (i = MAX_LAYER - 1; i != -1; i--) + for (i = max_layer - 1; i != -1; i--) { Cardinal layer = LayerStack[i]; @@ -3272,5 +3272,5 @@ LookupConnection (LocationType X, Locati /* don't mess with silk objects! */ - if (laynum >= MAX_LAYER) + if (laynum >= max_layer) return; } @@ -3523,5 +3523,5 @@ DumpList (void) PVList.Location = 0; - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { LineList[i].Location = 0; @@ -3828,5 +3828,5 @@ DRCAll (void) all.Y1 = -MAX_COORD; all.Y2 = MAX_COORD; - for (group = 0; group < MAX_LAYER; group++) + for (group = 0; group < max_layer; group++) PolygonPlows (group, &all, drc_callback); } Index: src/global.h =================================================================== RCS file: /cvsroot/pcb/pcb/src/global.h,v retrieving revision 1.45 diff -p -U2 -r1.45 src/global.h --- src/global.h 24 Apr 2006 05:10:10 -0000 1.45 +++ src/global.h 28 May 2006 02:31:50 -0000 @@ -322,4 +322,5 @@ typedef struct /* holds all objects */ RatN, /* and rat-lines */ RatMax; + int LayerN; /* number of layers in this board */ PinTypePtr Via; /* pointer to object data */ ElementTypePtr Element; @@ -697,4 +698,5 @@ typedef struct #define UNDO_CHANGEMASKSIZE 0x2000 /* change mask size */ #define UNDO_CHANGEANGLES 0x4000 /* change arc angles */ +#define UNDO_LAYERCHANGE 0x8000 /* layer new/delete/move */ Index: src/line.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/line.c,v retrieving revision 1.10 diff -p -U2 -r1.10 src/line.c --- src/line.c 28 Mar 2006 04:29:19 -0000 1.10 +++ src/line.c 28 May 2006 02:31:50 -0000 @@ -321,11 +321,11 @@ drc_lines (PointTypePtr end, Boolean way } group = GetGroupOfLayer (INDEXOFCURRENT); - comp = MAX_LAYER + 10; /* this out-of-range group might save a call */ - if (GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER) == group) + comp = max_layer + 10; /* this out-of-range group might save a call */ + if (GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER) == group) info.solder = True; else { info.solder = False; - comp = GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER); + comp = GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER); } temp = length; @@ -491,5 +491,5 @@ EnforceLineDRC (void) if (gui->control_is_pressed () || PCB->RatDraw - || INDEXOFCURRENT >= MAX_LAYER) + || INDEXOFCURRENT >= max_layer) return; rs.X = r45.X = Crosshair.X; Index: src/macro.h =================================================================== RCS file: /cvsroot/pcb/pcb/src/macro.h,v retrieving revision 1.21 diff -p -U2 -r1.21 src/macro.h --- src/macro.h 21 Apr 2006 21:04:09 -0000 1.21 +++ src/macro.h 28 May 2006 02:31:50 -0000 @@ -169,13 +169,13 @@ #define LAYER_ON_STACK(n) (&PCB->Data->Layer[LayerStack[(n)]]) #define LAYER_PTR(n) (&PCB->Data->Layer[(n)]) -#define CURRENT (PCB->SilkActive ? &PCB->Data->Layer[MAX_LAYER + \ +#define CURRENT (PCB->SilkActive ? &PCB->Data->Layer[max_layer + \ (Settings.ShowSolderSide ? SOLDER_LAYER : COMPONENT_LAYER)] \ : LAYER_ON_STACK(0)) -#define INDEXOFCURRENT (PCB->SilkActive ? MAX_LAYER + \ +#define INDEXOFCURRENT (PCB->SilkActive ? max_layer + \ (Settings.ShowSolderSide ? SOLDER_LAYER : COMPONENT_LAYER) \ : LayerStack[0]) -#define SILKLAYER Layer[MAX_LAYER + \ +#define SILKLAYER Layer[max_layer + \ (Settings.ShowSolderSide ? SOLDER_LAYER : COMPONENT_LAYER)] -#define BACKSILKLAYER Layer[MAX_LAYER + \ +#define BACKSILKLAYER Layer[max_layer + \ (Settings.ShowSolderSide ? COMPONENT_LAYER : SOLDER_LAYER)] @@ -433,5 +433,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (top)->Layer; \ - for (l = 0; l < MAX_LAYER + 2; l++, layer++) \ + for (l = 0; l < max_layer + 2; l++, layer++) \ { \ LINE_LOOP(layer) @@ -440,5 +440,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (top)->Layer; \ - for (l =0; l < MAX_LAYER + 2; l++, layer++) \ + for (l =0; l < max_layer + 2; l++, layer++) \ { \ ARC_LOOP(layer) @@ -447,5 +447,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (top)->Layer; \ - for (l = 0; l < MAX_LAYER + 2; l++, layer++) \ + for (l = 0; l < max_layer + 2; l++, layer++) \ { \ POLYGON_LOOP(layer) @@ -454,5 +454,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (top)->Layer; \ - for (l = 0; l < MAX_LAYER; l++, layer++) \ + for (l = 0; l < max_layer; l++, layer++) \ { \ LINE_LOOP(layer) @@ -461,5 +461,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (top)->Layer; \ - for (l =0; l < MAX_LAYER; l++, layer++) \ + for (l =0; l < max_layer; l++, layer++) \ { \ ARC_LOOP(layer) @@ -468,5 +468,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (top)->Layer; \ - for (l = 0; l < MAX_LAYER; l++, layer++) \ + for (l = 0; l < max_layer; l++, layer++) \ { \ POLYGON_LOOP(layer) @@ -475,5 +475,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (top)->Layer; \ - layer += MAX_LAYER; \ + layer += max_layer; \ for (l = 0; l < 2; l++, layer++) \ { \ @@ -483,5 +483,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (top)->Layer; \ - layer += MAX_LAYER; \ + layer += max_layer; \ for (l = 0; l < 2; l++, layer++) \ { \ @@ -491,5 +491,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (top)->Layer; \ - layer += MAX_LAYER; \ + layer += max_layer; \ for (l = 0; l < 2; l++, layer++) \ { \ @@ -499,5 +499,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (top)->Layer; \ - for (l = 0; l < MAX_LAYER + 2; l++, layer++) \ + for (l = 0; l < max_layer + 2; l++, layer++) \ { \ TEXT_LOOP(layer) @@ -506,5 +506,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (top)->Layer; \ - for (l = 0; l < MAX_LAYER + 2; l++, layer++) \ + for (l = 0; l < max_layer + 2; l++, layer++) \ { \ if (layer->On) \ @@ -514,5 +514,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (top)->Layer; \ - for (l = 0; l < MAX_LAYER + 2; l++, layer++) \ + for (l = 0; l < max_layer + 2; l++, layer++) \ { \ if (layer->On) \ @@ -522,5 +522,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (board)->Data->Layer; \ - for (l = 0; l < MAX_LAYER + 2; l++, layer++) \ + for (l = 0; l < max_layer + 2; l++, layer++) \ { \ TEXT_LOOP(layer); \ @@ -530,5 +530,5 @@ extern int mem_any_set (unsigned char *, Cardinal l; \ LayerTypePtr layer = (top)->Layer; \ - for (l = 0; l < MAX_LAYER + 2; l++, layer++) \ + for (l = 0; l < max_layer + 2; l++, layer++) \ { \ if (layer->On) \ @@ -563,5 +563,5 @@ extern int mem_any_set (unsigned char *, Cardinal number; \ number = PCB->LayerGroups.Entries[(group)][entry]; \ - if (number >= MAX_LAYER) \ + if (number >= max_layer) \ continue; \ layer = LAYER_PTR (number) Index: src/main.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/main.c,v retrieving revision 1.53 diff -p -U2 -r1.53 src/main.c --- src/main.c 18 Apr 2006 16:40:58 -0000 1.53 +++ src/main.c 28 May 2006 02:31:50 -0000 @@ -524,4 +524,5 @@ static void settings_post_process () { + int i; if (Settings.LibraryCommand[0] != '/' && Settings.LibraryCommand[0] != '.') { @@ -551,6 +552,6 @@ settings_post_process () Settings.MaxHeight = MIN (MAX_COORD, MAX (Settings.MaxHeight, MIN_SIZE)); - ParseGroupString (Settings.Groups, &Settings.LayerGroups); ParseRouteString (Settings.Routes, &Settings.RouteStyle[0], 1); + } @@ -579,5 +580,5 @@ int main (int argc, char *argv[]) { - /* GdkRectangle Big; */ + int i; /* init application: @@ -633,4 +634,13 @@ main (int argc, char *argv[]) exit (1); + for (i=0; iparse_arguments (&argc, &argv); @@ -665,4 +675,7 @@ main (int argc, char *argv[]) PCB = CreateNewPCB (True); + PCB->Data->LayerN = DEF_LAYER; + ParseGroupString(Settings.Groups, &PCB->LayerGroups, DEF_LAYER); + CreateNewPCBPost (PCB, 1); if (argc > 1) command_line_pcb = argv[1]; Index: src/misc.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/misc.c,v retrieving revision 1.51 diff -p -U2 -r1.51 src/misc.c --- src/misc.c 28 Apr 2006 03:09:14 -0000 1.51 +++ src/misc.c 28 May 2006 02:31:50 -0000 @@ -448,5 +448,5 @@ IsDataEmpty (DataTypePtr Data) hasNoObjects = (Data->ViaN == 0); hasNoObjects &= (Data->ElementN == 0); - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) hasNoObjects = hasNoObjects && Data->Layer[i].LineN == 0 && @@ -719,15 +719,20 @@ error: */ int -ParseGroupString (char *s, LayerGroupTypePtr LayerGroup) +ParseGroupString (char *s, LayerGroupTypePtr LayerGroup, int LayerN) { int group, member, layer; Boolean c_set = False, /* flags for the two special layers to */ s_set = False; /* provide a default setting for old formats */ + int groupnum[MAX_LAYER+2]; /* clear struct */ memset (LayerGroup, 0, sizeof (LayerGroupType)); + /* Clear assignments */ + for (layer=0; layer MAX_LAYER + MAX (SOLDER_LAYER, COMPONENT_LAYER) || - member >= MAX_LAYER + 1) + if (layer > LayerN + MAX (SOLDER_LAYER, COMPONENT_LAYER) || + member >= LayerN + 1) goto error; + groupnum[layer] = group; LayerGroup->Entries[group][member++] = layer; while (*++s && isdigit ((int) *s)); @@ -780,9 +786,17 @@ ParseGroupString (char *s, LayerGroupTyp if (!s_set) LayerGroup->Entries[SOLDER_LAYER][LayerGroup->Number[SOLDER_LAYER]++] = - MAX_LAYER + SOLDER_LAYER; + LayerN + SOLDER_LAYER; if (!c_set) LayerGroup-> Entries[COMPONENT_LAYER][LayerGroup->Number[COMPONENT_LAYER]++] = - MAX_LAYER + COMPONENT_LAYER; + LayerN + COMPONENT_LAYER; + + for (layer=0; layerEntries[group][0] = layer; + LayerGroup->Number[group] = 1; + group ++; + } return (0); @@ -921,5 +935,5 @@ GetLayerNumber (DataTypePtr Data, LayerT int i; - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) if (Layer == &Data->Layer[i]) break; @@ -936,8 +950,8 @@ PushOnTopOfLayerStack (int NewTop) /* ignore COMPONENT_LAYER and SOLDER_LAYER */ - if (NewTop < MAX_LAYER) + if (NewTop < max_layer) { /* first find position of passed one */ - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) if (LayerStack[i] == NewTop) break; @@ -996,5 +1010,5 @@ ChangeGroupVisibility (int Layer, Boolea /* decrement 'i' to keep stack in order of layergroup */ - if ((group = GetGroupOfLayer (Layer)) < MAX_LAYER) + if ((group = GetGroupOfLayer (Layer)) < max_layer) for (i = PCB->LayerGroups.Number[group]; i;) { @@ -1002,5 +1016,5 @@ ChangeGroupVisibility (int Layer, Boolea /* dont count the passed member of the group */ - if (layer != Layer && layer < MAX_LAYER) + if (layer != Layer && layer < max_layer) { PCB->Data->Layer[layer].On = On; @@ -1025,5 +1039,5 @@ ChangeGroupVisibility (int Layer, Boolea /* ---------------------------------------------------------------------- * lookup the group to which a layer belongs to - * returns MAX_LAYER if no group is found + * returns max_layer if no group is found */ int @@ -1032,11 +1046,11 @@ GetGroupOfLayer (int Layer) int group, i; - if (Layer == MAX_LAYER) + if (Layer == max_layer) return (Layer); - for (group = 0; group < MAX_LAYER; group++) + for (group = 0; group < max_layer; group++) for (i = 0; i < PCB->LayerGroups.Number[group]; i++) if (PCB->LayerGroups.Entries[group][i] == Layer) return (group); - return (MAX_LAYER); + return (max_layer); } @@ -1059,5 +1073,5 @@ GetLayerGroupNumberByNumber (Cardinal La int group, entry; - for (group = 0; group < MAX_LAYER; group++) + for (group = 0; group < max_layer; group++) for (entry = 0; entry < PCB->LayerGroups.Number[group]; entry++) if (PCB->LayerGroups.Entries[group][entry] == Layer) @@ -1289,7 +1303,7 @@ ResetStackAndVisibility (void) Cardinal i; - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) { - if (i < MAX_LAYER) + if (i < max_layer) LayerStack[i] = i; PCB->Data->Layer[i].On = True; @@ -1324,7 +1338,7 @@ SaveStackAndVisibility (void) } - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) { - if (i < MAX_LAYER) + if (i < max_layer) SavedStack.LayerStack[i] = LayerStack[i]; SavedStack.LayerOn[i] = PCB->Data->Layer[i].On; @@ -1358,7 +1372,7 @@ RestoreStackAndVisibility (void) } - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) { - if (i < MAX_LAYER) + if (i < max_layer) LayerStack[i] = SavedStack.LayerStack[i]; PCB->Data->Layer[i].On = SavedStack.LayerOn[i]; @@ -1734,16 +1748,15 @@ MoveLayerToGroup (int layer, int group) int prev, i, j; - if (layer < 0 || layer > MAX_LAYER + 1) + if (layer < 0 || layer > max_layer + 1) return -1; prev = GetLayerGroupNumberByNumber (layer); - if ((layer == MAX_LAYER - && group == GetLayerGroupNumberByNumber (MAX_LAYER + 1)) - || (layer == MAX_LAYER + 1 - && group == GetLayerGroupNumberByNumber (MAX_LAYER)) - || (group < 0 || group >= MAX_LAYER) || (prev == group)) + if ((layer == max_layer + && group == GetLayerGroupNumberByNumber (max_layer + 1)) + || (layer == max_layer + 1 + && group == GetLayerGroupNumberByNumber (max_layer)) + || (group < 0 || group >= max_layer) || (prev == group)) return prev; /* Remove layer from prev group */ - printf ("removing layer %d from group %d\n", layer, prev); for (j = i = 0; i < PCB->LayerGroups.Number[prev]; i++) if (PCB->LayerGroups.Entries[prev][i] != layer) @@ -1752,5 +1765,4 @@ MoveLayerToGroup (int layer, int group) /* Add layer to new group. */ - printf ("adding layer %d to group %d\n", layer, group); i = PCB->LayerGroups.Number[group]++; PCB->LayerGroups.Entries[group][i] = layer; @@ -1768,30 +1780,28 @@ LayerGroupsToString (LayerGroupTypePtr l char *cp = buf; int group, entry; - for (group = 0; group < MAX_LAYER; group++) + for (group = 0; group < max_layer; group++) if (PCB->LayerGroups.Number[group]) { for (entry = 0; entry < PCB->LayerGroups.Number[group]; entry++) { - switch (PCB->LayerGroups.Entries[group][entry]) + int layer = PCB->LayerGroups.Entries[group][entry]; + if (layer == max_layer + COMPONENT_LAYER) { - case MAX_LAYER + COMPONENT_LAYER: *cp++ = 'c'; - break; - - case MAX_LAYER + SOLDER_LAYER: + } + else if (layer == max_layer + SOLDER_LAYER) + { *cp++ = 's'; - break; - - default: - sprintf (cp, "%d", - PCB->LayerGroups.Entries[group][entry] + 1); + } + else + { + sprintf (cp, "%d", layer + 1); while (*++cp) ; - break; } if (entry != PCB->LayerGroups.Number[group] - 1) *cp++ = ','; } - if (group != MAX_LAYER - 1) + if (group != max_layer - 1) *cp++ = ':'; } Index: src/misc.h =================================================================== RCS file: /cvsroot/pcb/pcb/src/misc.h,v retrieving revision 1.17 diff -p -U2 -r1.17 src/misc.h --- src/misc.h 28 Apr 2006 03:09:14 -0000 1.17 +++ src/misc.h 28 May 2006 02:31:50 -0000 @@ -47,5 +47,5 @@ BoxTypePtr GetDataBoundingBox (DataTypeP void CenterDisplay (LocationType, LocationType, Boolean); void SetFontInfo (FontTypePtr); -int ParseGroupString (char *, LayerGroupTypePtr); +int ParseGroupString (char *, LayerGroupTypePtr, int /* LayerN */); int ParseRouteString (char *, RouteStyleTypePtr, int); void QuitApplication (void); Index: src/move.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/move.c,v retrieving revision 1.29 diff -p -U2 -r1.29 src/move.c --- src/move.c 22 Mar 2006 23:17:20 -0000 1.29 +++ src/move.c 28 May 2006 02:31:50 -0000 @@ -830,2 +830,171 @@ MoveSelectedObjectsToLayer (LayerTypePtr return (changed); } + +/* --------------------------------------------------------------------------- + * moves the selected layers to a new index in the layer list. + */ + +int +MoveLayer (int old_index, int new_index) +{ + int groups[MAX_LAYER+2], l, g; + LayerType saved_layer; + int saved_group; + + AddLayerChangeToUndoList (old_index, new_index); + IncrementUndoSerialNumber (); + + if (old_index < -1 || old_index >= max_layer) + { + Message("Invalid old layer %d for move: must be -1..%d\n", + old_index, max_layer-1); + return 1; + } + if (new_index < -1 || new_index > max_layer || new_index >= MAX_LAYER) + { + Message("Invalid new layer %d for move: must be -1..%d\n", + new_index, max_layer); + return 1; + } + if (old_index == new_index) + return 0; + + for (g=0; gLayerGroups.Number[g]; l++) + groups[PCB->LayerGroups.Entries[g][l]] = g; + + if (old_index == -1) + { + LayerTypePtr lp; + if (max_layer == MAX_LAYER) + { + Message("No room for new layers\n"); + return 1; + } + /* Create a new layer at new_index. */ + lp = &PCB->Data->Layer[new_index]; + memmove (&PCB->Data->Layer[new_index+1], + &PCB->Data->Layer[new_index], + (max_layer-new_index+2) * sizeof(LayerType)); + memmove (&groups[new_index+1], + &groups[new_index], + (max_layer-new_index+2) * sizeof(int)); + max_layer ++; + memset (lp, 0, sizeof(LayerType)); + lp->On = 1; + lp->Name = MyStrdup("New Layer", "MoveLayer"); + lp->Color = Settings.LayerColor[new_index]; + lp->SelectedColor = Settings.LayerSelectedColor[new_index]; + } + else if (new_index == -1) + { + /* Delete the layer at old_index */ + memmove (&PCB->Data->Layer[old_index], + &PCB->Data->Layer[old_index+1], + (max_layer-old_index+2-1) * sizeof(LayerType)); + memmove (&groups[old_index], + &groups[old_index+1], + (max_layer-old_index+2-1) * sizeof(int)); + max_layer --; + } + else + { + /* Move an existing layer */ + memcpy (&saved_layer, &PCB->Data->Layer[old_index], sizeof(LayerType)); + saved_group = groups[old_index]; + if (old_index < new_index) + { + memmove (&PCB->Data->Layer[old_index], + &PCB->Data->Layer[old_index+1], + (new_index - old_index) * sizeof(LayerType)); + memmove (&groups[old_index], + &groups[old_index+1], + (new_index - old_index) * sizeof(int)); + } + else + { + memmove (&PCB->Data->Layer[new_index+1], + &PCB->Data->Layer[new_index], + (old_index - new_index) * sizeof(LayerType)); + memmove (&groups[new_index+1], + &groups[new_index], + (old_index - new_index) * sizeof(int)); + } + memcpy (&PCB->Data->Layer[new_index], &saved_layer, sizeof(LayerType)); + groups[new_index] = saved_group; + } + + for (g=0; gLayerGroups.Number[g] = 0; + for (l=0; lLayerGroups.Number[g] ++; + PCB->LayerGroups.Entries[g][i] = l; + } + + for (g=0; gLayerGroups.Number[g] == 0) + { + memmove (&PCB->LayerGroups.Number[g], + &PCB->LayerGroups.Number[g+1], + (MAX_LAYER - g - 1) * sizeof(PCB->LayerGroups.Number[g])); + memmove (&PCB->LayerGroups.Entries[g], + &PCB->LayerGroups.Entries[g+1], + (MAX_LAYER - g - 1) * sizeof(PCB->LayerGroups.Entries[g])); + } + + hid_action ("LayersChanged"); + gui->invalidate_all (); + return 0; +} + +int +MoveLayerAction (int argc, char **argv, int x, int y) +{ + int old_index, new_index; + int new_top = -1; + int rv; + + if (argc != 2) + { + Message("Usage; MoveLayer(old,new)"); + return 1; + } + + if (strcmp (argv[0], "c") == 0) + old_index = INDEXOFCURRENT; + else + old_index = atoi (argv[0]); + + if (strcmp (argv[1], "c") == 0) + { + new_index = INDEXOFCURRENT; + if (new_index < 0) + new_index = 0; + } + else if (strcmp (argv[1], "up") == 0) + { + new_index = INDEXOFCURRENT - 1; + new_top = new_index; + } + else if (strcmp (argv[1], "down") == 0) + { + new_index = INDEXOFCURRENT + 1; + new_top = new_index; + } + else + new_index = atoi (argv[1]); + + if (MoveLayer (old_index, new_index)) + return 1; + if (new_top != -1) + ChangeGroupVisibility (new_index, 1, 1); +} + +HID_Action move_action_list[] = { + { "MoveLayer", 0, MoveLayerAction } +}; + +REGISTER_ACTIONS (move_action_list) Index: src/move.h =================================================================== RCS file: /cvsroot/pcb/pcb/src/move.h,v retrieving revision 1.7 diff -p -U2 -r1.7 src/move.h --- src/move.h 22 Mar 2006 23:17:20 -0000 1.7 +++ src/move.h 28 May 2006 02:31:50 -0000 @@ -102,3 +102,8 @@ void *MovePolygonToLayerLowLevel (LayerT Boolean MoveSelectedObjectsToLayer (LayerTypePtr); +/* index is 0..MAX_LAYER-1. If old_index is -1, a new layer is + inserted at that index. If new_index is -1, the specified layer is + deleted. Returns non-zero on error, zero if OK. */ +int MoveLayer(int old_index, int new_index); + #endif Index: src/parse_y.y =================================================================== RCS file: /cvsroot/pcb/pcb/src/parse_y.y,v retrieving revision 1.25 diff -p -U2 -r1.25 src/parse_y.y --- src/parse_y.y 19 Apr 2006 22:36:47 -0000 1.25 +++ src/parse_y.y 28 May 2006 02:31:50 -0000 @@ -68,4 +68,6 @@ extern int yylineno; /* linenumber * extern char *yyfilename; /* in this file */ +static char *layer_group_string; + int yyerror(const char *s); int yylex(); @@ -139,4 +141,6 @@ parsepcb yyFont = &yyPCB->Font; yyData = yyPCB->Data; + yyData->LayerN = 0; + layer_group_string = NULL; } pcbname @@ -151,4 +155,14 @@ parsepcb pcbdata pcbnetlist + { + if (layer_group_string == NULL) + layer_group_string = Settings.Groups; + CreateNewPCBPost (yyPCB, 0); + if (ParseGroupString(layer_group_string, &yyPCB->LayerGroups, yyData->LayerN)) + { + Message("illegal layer-group string\n"); + YYABORT; + } + } ; @@ -167,4 +181,5 @@ parsedata for (i = 0; i < MAX_LAYER + 2; i++) LayerFlag[i] = False; + yyData->LayerN = 0; } pcbdata @@ -487,9 +502,5 @@ pcbgroups : T_GROUPS '(' STRING ')' { - if (ParseGroupString($3, &yyPCB->LayerGroups)) - { - Message("illegal layer-group string\n"); - YYABORT; - } + layer_group_string = $3; } | @@ -751,4 +762,6 @@ layer Layer->Name = $4; LayerFlag[$3-1] = True; + if (yyData->LayerN + 2 < $3) + yyData->LayerN = $3 - 2; } layerdata ')' @@ -968,5 +981,5 @@ text_newformat if ($8 & ONSILKFLAG) { - LayerTypePtr lay = &yyData->Layer[MAX_LAYER + + LayerTypePtr lay = &yyData->Layer[max_layer + (($8 & ONSOLDERFLAG) ? SOLDER_LAYER : COMPONENT_LAYER)]; @@ -987,5 +1000,5 @@ text_hi_format if ($8.f & ONSILKFLAG) { - LayerTypePtr lay = &yyData->Layer[MAX_LAYER + + LayerTypePtr lay = &yyData->Layer[max_layer + (($8.f & ONSOLDERFLAG) ? SOLDER_LAYER : COMPONENT_LAYER)]; Index: src/pcb-menu.res =================================================================== RCS file: /cvsroot/pcb/pcb/src/pcb-menu.res,v retrieving revision 1.21 diff -p -U2 -r1.21 src/pcb-menu.res --- src/pcb-menu.res 27 Mar 2006 23:05:10 -0000 1.21 +++ src/pcb-menu.res 28 May 2006 02:31:50 -0000 @@ -88,4 +88,9 @@ MainMenu = {"Current Layer" @layerpick + - + {"Delete current layer" MoveLayer(c,-1)} + {"Add new layer" MoveLayer(-1,c)} + {"Move current layer up" MoveLayer(c,up)} + {"Move current layer down" MoveLayer(c,down)} } } Index: src/polygon.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/polygon.c,v retrieving revision 1.34 diff -p -U2 -r1.34 src/polygon.c --- src/polygon.c 22 Mar 2006 23:17:20 -0000 1.34 +++ src/polygon.c 28 May 2006 02:31:51 -0000 @@ -301,5 +301,5 @@ UpdatePIPFlags (PinTypePtr Pin, ElementT { Cardinal l; - for (l = 0; l < MAX_LAYER; l++) + for (l = 0; l < max_layer; l++) UpdatePIPFlags (Pin, Element, LAYER_PTR (l), AddUndo); } @@ -522,6 +522,6 @@ PolygonPlows (int group, const BoxType * info.group = group; - info.component = GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER); - info.solder = GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER); + info.component = GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER); + info.solder = GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER); info.callback = any_call; info.range = range; Index: src/print.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/print.c,v retrieving revision 1.45 diff -p -U2 -r1.45 src/print.c --- src/print.c 13 Apr 2006 03:33:57 -0000 1.45 +++ src/print.c 28 May 2006 02:31:51 -0000 @@ -269,5 +269,5 @@ PrintFab (void) strftime (utcTime, sizeof utcTime, "%c UTC", gmtime (¤ttime)); yoff = -TEXT_LINE; - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { LayerType *l = LAYER_PTR (i); @@ -280,5 +280,5 @@ PrintFab (void) } } - if (i == MAX_LAYER) + if (i == max_layer) { gui->set_line_width (Output.fgGC, 1000); Index: src/rats.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/rats.c,v retrieving revision 1.24 diff -p -U2 -r1.24 src/rats.c --- src/rats.c 22 Mar 2006 23:17:20 -0000 1.24 +++ src/rats.c 28 May 2006 02:31:51 -0000 @@ -233,6 +233,6 @@ ProcNetlist (LibraryTypePtr net_menu) /* find layer groups of the component side and solder side */ - SLayer = GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER); - CLayer = GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER); + SLayer = GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER); + CLayer = GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER); Wantlist = MyCalloc (1, sizeof (NetListType), "ProcNetlist()"); @@ -840,6 +840,6 @@ AddNet (void) /* will work for pins to since the FLAG is common */ group1 = (TEST_FLAG (ONSOLDERFLAG, (PadTypePtr) ptr2) ? - GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER) : - GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER)); + GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER) : + GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER)); strcpy (name1, ConnectionName (found, ptr1, ptr2)); found = SearchObjectByLocation (PAD_TYPE | PIN_TYPE, &ptr1, &ptr2, &ptr3, @@ -858,6 +858,6 @@ AddNet (void) } group2 = (TEST_FLAG (ONSOLDERFLAG, (PadTypePtr) ptr2) ? - GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER) : - GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER)); + GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER) : + GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER)); name2 = ConnectionName (found, ptr1, ptr2); #ifdef FIXME Index: src/rtree.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/rtree.c,v retrieving revision 1.24 diff -p -U2 -r1.24 src/rtree.c --- src/rtree.c 28 Mar 2006 04:29:20 -0000 1.24 +++ src/rtree.c 28 May 2006 02:31:51 -0000 @@ -249,5 +249,5 @@ __r_dump_tree (struct rtree_node *node, GDK_JOIN_ROUND); - if (depth < MAX_LAYER + 1) + if (depth < max_layer + 1) gdk_gc_set_foreground (Output.fgGC, (LAYER_PTR (depth)->Color)); else Index: src/rubberband.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/rubberband.c,v retrieving revision 1.13 diff -p -U2 -r1.13 src/rubberband.c --- src/rubberband.c 22 Mar 2006 23:17:21 -0000 1.13 +++ src/rubberband.c 28 May 2006 02:31:51 -0000 @@ -221,5 +221,5 @@ CheckPadForRubberbandConnection (PadType info.radius = 0; info.line = NULL; - i = MAX_LAYER + + i = max_layer + (TEST_FLAG (ONSOLDERFLAG, Pad) ? SOLDER_LAYER : COMPONENT_LAYER); group = GetLayerGroupNumberByNumber (i); @@ -300,5 +300,5 @@ CheckPadForRat (PadTypePtr Pad) Cardinal i; - i = MAX_LAYER + + i = max_layer + (TEST_FLAG (ONSOLDERFLAG, Pad) ? SOLDER_LAYER : COMPONENT_LAYER); info.group = GetLayerGroupNumberByNumber (i); @@ -362,5 +362,5 @@ CheckPinForRubberbandConnection (PinType } - for (n = 0; n < MAX_LAYER; n++) + for (n = 0; n < max_layer; n++) { info.layer = LAYER_PTR (n); @@ -489,5 +489,5 @@ LookupRubberbandLines (int Type, void *P LayerTypePtr layer = (LayerTypePtr) Ptr1; LineTypePtr line = (LineTypePtr) Ptr2; - if (GetLayerNumber (PCB->Data, layer) < MAX_LAYER) + if (GetLayerNumber (PCB->Data, layer) < max_layer) { CheckLinePointForRubberbandConnection (layer, line, @@ -500,5 +500,5 @@ LookupRubberbandLines (int Type, void *P case LINEPOINT_TYPE: - if (GetLayerNumber (PCB->Data, (LayerTypePtr) Ptr1) < MAX_LAYER) + if (GetLayerNumber (PCB->Data, (LayerTypePtr) Ptr1) < max_layer) CheckLinePointForRubberbandConnection ((LayerTypePtr) Ptr1, (LineTypePtr) Ptr2, @@ -511,5 +511,5 @@ LookupRubberbandLines (int Type, void *P case POLYGON_TYPE: - if (GetLayerNumber (PCB->Data, (LayerTypePtr) Ptr1) < MAX_LAYER) + if (GetLayerNumber (PCB->Data, (LayerTypePtr) Ptr1) < max_layer) CheckPolygonForRubberbandConnection ((LayerTypePtr) Ptr1, (PolygonTypePtr) Ptr2); Index: src/search.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/search.c,v retrieving revision 1.24 diff -p -U2 -r1.24 src/search.c --- src/search.c 20 May 2006 17:41:48 -0000 1.24 +++ src/search.c 28 May 2006 02:31:51 -0000 @@ -1139,9 +1139,9 @@ SearchObjectByLocation (int Type, } - for (i = -1; i < MAX_LAYER + 1; i++) + for (i = -1; i < max_layer + 1; i++) { if (i < 0) SearchLayer = &PCB->Data->SILKLAYER; - else if (i < MAX_LAYER) + else if (i < max_layer) SearchLayer = LAYER_ON_STACK (i); else Index: src/undo.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/undo.c,v retrieving revision 1.18 diff -p -U2 -r1.18 src/undo.c --- src/undo.c 23 Mar 2006 03:00:04 -0000 1.18 +++ src/undo.c 28 May 2006 02:31:51 -0000 @@ -114,4 +114,11 @@ typedef struct /* information about mo MoveToLayerType, *MoveToLayerTypePtr; +typedef struct /* information about layer changes */ +{ + int old_index; + int new_index; +} +LayerChangeType, *LayerChangeTypePtr; + typedef struct /* holds information about an operation */ { @@ -129,4 +136,5 @@ typedef struct /* holds information ab FlagType Flags; BDimension Size; + LayerChangeType LayerChange; } Data; @@ -745,4 +753,24 @@ UndoInsertPoint (UndoListTypePtr Entry) /* --------------------------------------------------------------------------- + * undo a layer change + * returns true on success + */ +static Boolean +UndoLayerChange (UndoListTypePtr Entry) +{ + LayerChangeTypePtr l = & Entry->Data.LayerChange; + int tmp; + + tmp = l->new_index; + l->new_index = l->old_index; + l->old_index = tmp; + + if (MoveLayer (l->old_index, l->new_index)) + return False; + else + return True; +} + +/* --------------------------------------------------------------------------- * undo of any 'hard to recover' operation * @@ -867,4 +895,9 @@ PerformUndo (UndoListTypePtr ptr) break; + case UNDO_LAYERCHANGE: + if (UndoLayerChange (ptr)) + return (UNDO_LAYERCHANGE); + break; + case UNDO_MIRROR: if (UndoMirror (ptr)) @@ -1280,4 +1313,20 @@ AddObjectToChangeAnglesUndoList (int Typ /* --------------------------------------------------------------------------- + * adds a layer change (new, delete, move) to the undo list. + */ +void +AddLayerChangeToUndoList (int old_index, int new_index) +{ + UndoListTypePtr undo; + + if (!Locked) + { + undo = GetUndoSlot (UNDO_LAYERCHANGE, 0, 0); + undo->Data.LayerChange.old_index = old_index; + undo->Data.LayerChange.new_index = new_index; + } +} + +/* --------------------------------------------------------------------------- * set lock flag */ Index: src/undo.h =================================================================== RCS file: /cvsroot/pcb/pcb/src/undo.h,v retrieving revision 1.6 diff -p -U2 -r1.6 src/undo.h --- src/undo.h 22 Mar 2006 23:17:21 -0000 1.6 +++ src/undo.h 28 May 2006 02:31:51 -0000 @@ -62,4 +62,5 @@ void AddObjectToClearSizeUndoList (int, void AddObjectToMaskSizeUndoList (int, void *, void *, void *); void AddObjectToChangeAnglesUndoList (int, void *, void *, void *); +void AddLayerChangeToUndoList (int, int); void LockUndo (void); void UnlockUndo (void); Index: src/hid/common/extents.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/hid/common/extents.c,v retrieving revision 1.4 diff -p -U2 -r1.4 src/hid/common/extents.c --- src/hid/common/extents.c 20 May 2006 20:04:45 -0000 1.4 +++ src/hid/common/extents.c 28 May 2006 02:31:51 -0000 @@ -38,9 +38,9 @@ extents_set_layer (const char *name, int { int idx = group; - if (idx >= 0 && idx < MAX_LAYER) + if (idx >= 0 && idx < max_layer) { idx = PCB->LayerGroups.Entries[idx][0]; } - if (idx >= 0 && idx < MAX_LAYER + 2) + if (idx >= 0 && idx < max_layer + 2) return 1; if (idx < 0) Index: src/hid/common/flags.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/hid/common/flags.c,v retrieving revision 1.4 diff -p -U2 -r1.4 src/hid/common/flags.c --- src/hid/common/flags.c 22 Mar 2006 23:03:14 -0000 1.4 +++ src/hid/common/flags.c 28 May 2006 02:31:51 -0000 @@ -133,5 +133,5 @@ hid_save_and_show_layer_ons (int *save_a { int i; - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) { save_array[i] = PCB->Data->Layer[i].On; @@ -144,5 +144,5 @@ hid_restore_layer_ons (int *save_array) { int i; - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) PCB->Data->Layer[i].On = save_array[i]; } Index: src/hid/gerber/gerber.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/hid/gerber/gerber.c,v retrieving revision 1.11 diff -p -U2 -r1.11 src/hid/gerber/gerber.c --- src/hid/gerber/gerber.c 21 May 2006 03:52:44 -0000 1.11 +++ src/hid/gerber/gerber.c 28 May 2006 02:31:51 -0000 @@ -280,8 +280,8 @@ static int group_for_layer (int l) { - if (l < MAX_LAYER + 2 && l >= 0) + if (l < max_layer + 2 && l >= 0) return GetLayerGroupNumberByNumber (l); /* else something unique */ - return MAX_LAYER + 3 + l; + return max_layer + 3 + l; } @@ -342,5 +342,5 @@ gerber_do_export (HID_Attr_Val * options hid_save_and_show_layer_ons (save_ons); - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { LayerType *layer = PCB->Data->Layer + i; @@ -348,12 +348,12 @@ gerber_do_export (HID_Attr_Val * options print_group[GetLayerGroupNumberByNumber (i)] = 1; } - print_group[GetLayerGroupNumberByNumber (MAX_LAYER)] = 1; - print_group[GetLayerGroupNumberByNumber (MAX_LAYER + 1)] = 1; - for (i = 0; i < MAX_LAYER; i++) + print_group[GetLayerGroupNumberByNumber (max_layer)] = 1; + print_group[GetLayerGroupNumberByNumber (max_layer + 1)] = 1; + for (i = 0; i < max_layer; i++) if (print_group[GetLayerGroupNumberByNumber (i)]) print_layer[i] = 1; memcpy (saved_layer_stack, LayerStack, sizeof (LayerStack)); - qsort (LayerStack, MAX_LAYER, sizeof (LayerStack[0]), layer_sort); + qsort (LayerStack, max_layer, sizeof (LayerStack[0]), layer_sort); linewidth = -1; lastcap = -1; @@ -414,9 +414,9 @@ gerber_set_layer (const char *name, int int idx = (group >= 0 && group < - MAX_LAYER) ? PCB->LayerGroups.Entries[group][0] : group; + max_layer) ? PCB->LayerGroups.Entries[group][0] : group; if (name == 0) name = PCB->Data->Layer[idx].Name; - if (idx >= 0 && idx < MAX_LAYER && !print_layer[idx]) + if (idx >= 0 && idx < max_layer && !print_layer[idx]) return 0; Index: src/hid/gtk/gtkhid-main.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/hid/gtk/gtkhid-main.c,v retrieving revision 1.19 diff -p -U2 -r1.19 src/hid/gtk/gtkhid-main.c --- src/hid/gtk/gtkhid-main.c 20 May 2006 20:04:45 -0000 1.19 +++ src/hid/gtk/gtkhid-main.c 28 May 2006 02:31:51 -0000 @@ -321,7 +321,7 @@ ghid_set_layer (const char *name, int gr int idx = (group >= 0 && group < - MAX_LAYER) ? PCB->LayerGroups.Entries[group][0] : group; + max_layer) ? PCB->LayerGroups.Entries[group][0] : group; - if (idx >= 0 && idx < MAX_LAYER + 2) + if (idx >= 0 && idx < max_layer + 2) return /*pinout ? 1 : */ PCB->Data->Layer[idx].On; if (idx < 0) @@ -1221,6 +1221,6 @@ SwapSides (int argc, char **argv, int x, gint dx; - int comp_group = GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER); - int solder_group = GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER); + int comp_group = GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER); + int solder_group = GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER); int active_group = GetLayerGroupNumberByNumber (LayerStack[0]); int comp_showing = Index: src/hid/gtk/gui-config.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/hid/gtk/gui-config.c,v retrieving revision 1.7 diff -p -U2 -r1.7 src/hid/gtk/gui-config.c --- src/hid/gtk/gui-config.c 21 Apr 2006 21:05:00 -0000 1.7 +++ src/hid/gtk/gui-config.c 28 May 2006 02:31:52 -0000 @@ -1436,5 +1436,5 @@ make_layer_group_string (LayerGroupType string = g_string_new (""); - for (group = 0; group < MAX_LAYER; group++) + for (group = 0; group < max_layer; group++) { if (lg->Number[group] == 0) @@ -1443,7 +1443,7 @@ make_layer_group_string (LayerGroupType { layer = lg->Entries[group][entry]; - if (layer == MAX_LAYER + COMPONENT_LAYER) + if (layer == max_layer + COMPONENT_LAYER) string = g_string_append (string, "c"); - else if (layer == MAX_LAYER + SOLDER_LAYER) + else if (layer == max_layer + SOLDER_LAYER) string = g_string_append (string, "s"); else @@ -1453,5 +1453,5 @@ make_layer_group_string (LayerGroupType string = g_string_append (string, ","); } - if (group != MAX_LAYER - 1) + if (group != max_layer - 1) string = g_string_append (string, ":"); } @@ -1475,5 +1475,5 @@ config_layers_apply (void) | and, if to use as default, the Settings layer names. */ - for (i = 0; i < MAX_LAYER; ++i) + for (i = 0; i < max_layer; ++i) { layer = &PCB->Data->Layer[i]; @@ -1498,15 +1498,15 @@ config_layers_apply (void) /* clear all entries and read layer by layer */ - for (group = 0; group < MAX_LAYER; group++) + for (group = 0; group < max_layer; group++) layer_groups.Number[group] = 0; - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) { group = config_layer_group[i] - 1; layer_groups.Entries[group][layer_groups.Number[group]++] = i; - if (i == MAX_LAYER + COMPONENT_LAYER) + if (i == max_layer + COMPONENT_LAYER) componentgroup = group; - else if (i == MAX_LAYER + SOLDER_LAYER) + else if (i == max_layer + SOLDER_LAYER) soldergroup = group; } @@ -1540,5 +1540,5 @@ config_layers_apply (void) if (dup_string (&Settings.Groups, s)) { - ParseGroupString (Settings.Groups, &Settings.LayerGroups); + /* ParseGroupString (Settings.Groups, &Settings.LayerGroups); */ ghidgui->config_modified = TRUE; } @@ -1555,5 +1555,5 @@ config_layer_group_button_state_update ( */ groups_holdoff = TRUE; - for (g = 0; g < MAX_LAYER; g++) + for (g = 0; g < max_layer; g++) for (i = 0; i < layer_groups.Number[g]; i++) { @@ -1582,5 +1582,5 @@ config_layers_tab_create (GtkWidget * ta vbox = ghid_notebook_page (tabs, _("Setup"), 0, 6); - table = gtk_table_new (MAX_LAYER + 3, MAX_LAYER + 1, FALSE); + table = gtk_table_new (max_layer + 3, max_layer + 1, FALSE); gtk_table_set_row_spacings (GTK_TABLE (table), 3); @@ -1594,5 +1594,5 @@ config_layers_tab_create (GtkWidget * ta gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); - for (i = 1; i < MAX_LAYER + 1; ++i) + for (i = 1; i < max_layer + 1; ++i) { snprintf (buf, sizeof (buf), "%d", i); @@ -1604,14 +1604,14 @@ config_layers_tab_create (GtkWidget * ta | can have an active radio button set for the group it needs to be in. */ - for (layer = 0; layer < MAX_LAYER + 2; ++layer) + for (layer = 0; layer < max_layer + 2; ++layer) { - if (layer == MAX_LAYER + COMPONENT_LAYER) + if (layer == max_layer + COMPONENT_LAYER) name = _("component side"); - else if (layer == MAX_LAYER + SOLDER_LAYER) + else if (layer == max_layer + SOLDER_LAYER) name = _("solder side"); else name = UNKNOWN (PCB->Data->Layer[layer].Name); - if (layer >= MAX_LAYER) + if (layer >= max_layer) { label = gtk_label_new (name); @@ -1629,7 +1629,7 @@ config_layers_tab_create (GtkWidget * ta group = NULL; - for (i = 0; i < MAX_LAYER; ++i) + for (i = 0; i < max_layer; ++i) { - if (layer < MAX_LAYER || i > 0) + if (layer < max_layer || i > 0) button = gtk_radio_button_new (group); else /* See layer button fixup below */ @@ -1677,5 +1677,5 @@ layer_button_post_show_fixup (void) gint l; - for (l = MAX_LAYER; l < MAX_LAYER + 2; ++l) + for (l = max_layer; l < max_layer + 2; ++l) gtk_button_set_label (GTK_BUTTON (group_button[l][0]), ""); } Index: src/hid/gtk/gui-top-window.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/hid/gtk/gui-top-window.c,v retrieving revision 1.28 diff -p -U2 -r1.28 src/hid/gtk/gui-top-window.c --- src/hid/gtk/gui-top-window.c 15 May 2006 04:48:17 -0000 1.28 +++ src/hid/gtk/gui-top-window.c 28 May 2006 02:31:52 -0000 @@ -2459,5 +2459,5 @@ layer_select_button_cb (GtkWidget * widg PCB->RatDraw = (lb->index == LAYER_BUTTON_RATS); - if (lb->index < MAX_LAYER) + if (lb->index < max_layer) ChangeGroupVisibility (lb->index, True, True); @@ -2522,8 +2522,8 @@ layer_enable_button_cb (GtkWidget * widg */ if ((group = GetGroupOfLayer (layer)) == - GetGroupOfLayer (MIN (MAX_LAYER, INDEXOFCURRENT))) + GetGroupOfLayer (MIN (max_layer, INDEXOFCURRENT))) { - for (i = (layer + 1) % (MAX_LAYER + 1); i != layer; - i = (i + 1) % (MAX_LAYER + 1)) + for (i = (layer + 1) % (max_layer + 1); i != layer; + i = (i + 1) % (max_layer + 1)) if (PCB->Data->Layer[i].On == True && GetGroupOfLayer (i) != group) @@ -2743,5 +2743,5 @@ ghid_layer_enable_buttons_update (void) */ layer_enable_button_cb_hold_off = TRUE; - for (i = 0; i < MAX_LAYER; ++i) + for (i = 0; i < max_layer; ++i) { lb = &layer_buttons[i]; @@ -2828,5 +2828,5 @@ ghid_layer_buttons_update (void) layer = PCB->SilkActive ? LAYER_BUTTON_SILK : LayerStack[0]; - if (layer < MAX_LAYER) + if (layer < max_layer) active = PCB->Data->Layer[layer].On; else if (layer == LAYER_BUTTON_SILK) Index: src/hid/lesstif/dialogs.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/hid/lesstif/dialogs.c,v retrieving revision 1.15 diff -p -U2 -r1.15 src/hid/lesstif/dialogs.c --- src/hid/lesstif/dialogs.c 20 Apr 2006 03:23:07 -0000 1.15 +++ src/hid/lesstif/dialogs.c 28 May 2006 02:31:52 -0000 @@ -298,4 +298,10 @@ log_clear (Widget w, void *up, void *cbp } +static void +log_dismiss (Widget w, void *up, void *cbp) +{ + XtUnmanageChild (log_form); +} + void lesstif_logv (const char *fmt, va_list ap) @@ -310,5 +316,5 @@ lesstif_logv (const char *fmt, va_list a if (!log_form) { - Widget clear_button; + Widget clear_button, dismiss_button; n = 0; @@ -328,4 +334,13 @@ lesstif_logv (const char *fmt, va_list a n = 0; + stdarg (XmNrightAttachment, XmATTACH_WIDGET); + stdarg (XmNrightWidget, clear_button); + stdarg (XmNbottomAttachment, XmATTACH_FORM); + dismiss_button = XmCreatePushButton (log_form, "dismiss", args, n); + XtManageChild (dismiss_button); + XtAddCallback (dismiss_button, XmNactivateCallback, + (XtCallbackProc) log_dismiss, 0); + + n = 0; stdarg (XmNeditable, False); stdarg (XmNeditMode, XmMULTI_LINE_EDIT); @@ -1180,8 +1195,33 @@ AdjustSizes (int argc, char **argv, int static Widget layer_groups_form = 0; +static Widget lg_buttonform = 0; + +static int lg_setcol[MAX_LAYER+2]; +static int lg_width, lg_height; +static int lg_r[MAX_LAYER+3]; +static int lg_c[MAX_LAYER+1]; +static int lg_label_width, lg_fa, lg_fd; +static GC lg_gc = 0; +#if 0 static Widget lglabels[MAX_LAYER + 2]; static Widget lgbuttons[MAX_LAYER + 2][MAX_LAYER]; +#endif + +typedef struct { + XFontStruct *font; + Pixel fg, bg, sel; +} LgResource; + +static LgResource lgr; + +static XtResource lg_resources[] = { + { "font", "Font", XtRFontStruct, sizeof(XFontStruct*), XtOffset(LgResource*, font), XtRString, "fixed" }, + { "foreground", "Foreground", XtRPixel, sizeof(Pixel), XtOffset(LgResource*, fg), XtRString, "black" }, + { "selectColor", "Foreground", XtRPixel, sizeof(Pixel), XtOffset(LgResource*, sel), XtRString, "blue" }, + { "background", "Background", XtRPixel, sizeof(Pixel), XtOffset(LgResource*, bg), XtRString, "white" } +}; +#if 0 static void lgbutton_cb (Widget w, int ij, void *cbs) @@ -1189,8 +1229,8 @@ lgbutton_cb (Widget w, int ij, void *cbs int layer, group, k; - layer = ij / MAX_LAYER; - group = ij % MAX_LAYER; + layer = ij / max_layer; + group = ij % max_layer; group = MoveLayerToGroup (layer, group); - for (k = 0; k < MAX_LAYER; k++) + for (k = 0; k < max_layer; k++) { if (k == group) @@ -1200,4 +1240,95 @@ lgbutton_cb (Widget w, int ij, void *cbs } } +#endif + +static void +lgbutton_expose (Widget w, XtPointer u, XmDrawingAreaCallbackStruct *cbs) +{ + int i; + Window win = XtWindow(w); + + if (cbs && cbs->event->xexpose.count) + return; + if (lg_gc == 0 && !cbs) + return; + if (lg_gc == 0 && cbs) + { + lg_gc = XCreateGC (display, win, 0, 0); + XSetFont (display, lg_gc, lgr.font->fid); + } + + XSetForeground (display, lg_gc, lgr.bg); + XFillRectangle (display, win, lg_gc, 0, 0, lg_width, lg_height); + XSetForeground (display, lg_gc, lgr.fg); + for (i=0; iData->Layer[i].Name; + XTextExtents (lgr.font, name, strlen(name), &dir, &lg_fa, &lg_fd, &size); + swidth = size.rbearing - size.lbearing; + XDrawString(display, win, lg_gc, + (lg_label_width - swidth)/2 - size.lbearing, + (lg_r[i] + lg_r[i+1] + lg_fd + lg_fa)/2 - 1, + name, strlen(name)); + } + XSetForeground (display, lg_gc, lgr.sel); + for (i=0; ievent->type != ButtonPress) + return; + layer = cbs->event->xbutton.y * (max_layer+2) / lg_height; + group = (cbs->event->xbutton.x - lg_label_width) * max_layer / (lg_width - lg_label_width); + group = MoveLayerToGroup (layer, group); + lg_setcol[layer] = group; + lgbutton_expose (w, 0, 0); + gui->invalidate_all (); +} + +static void +lgbutton_resize (Widget w, XtPointer u, XmDrawingAreaCallbackStruct *cbs) +{ + int i, label_width = 0; + int fa, fd; + Dimension width, height; + n = 0; + stdarg(XmNwidth, &width); + stdarg(XmNheight, &height); + XtGetValues(w, args, n); + lg_width = width; + lg_height = height; + + for (i=0; i<=max_layer; i++) + lg_c[i] = lg_label_width + (lg_width - lg_label_width) * i / max_layer; + for (i=0; i<=max_layer+2; i++) + lg_r[i] = lg_height * i / (max_layer+2); + lgbutton_expose (w, 0, 0); +} void @@ -1208,23 +1339,57 @@ lesstif_update_layer_groups () LayerGroupType *l = &(PCB->LayerGroups); + if (!layer_groups_form) + return; + memset (sets, 0, sizeof (sets)); - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) for (j = 0; j < l->Number[i]; j++) - sets[l->Entries[i][j]][i] = 1; + { + sets[l->Entries[i][j]][i] = 1; + lg_setcol[l->Entries[i][j]] = i; + } + + lg_label_width = 0; + for (i=0; iData->Layer[i].Name; + XTextExtents (lgr.font, name, strlen(name), &dir, &lg_fa, &lg_fd, &size); + swidth = size.rbearing - size.lbearing; + if (lg_label_width < swidth) + lg_label_width = swidth; + } + lg_label_width += 4; + + n = 0; + stdarg(XmNwidth, lg_label_width + (lg_fa+lg_fd) * max_layer); + stdarg(XmNheight, (lg_fa+lg_fd) * (max_layer + 2)); + XtSetValues(lg_buttonform, args, n); + lgbutton_expose (lg_buttonform, 0, 0); + +#if 0 + for (i = 0; i < max_layer + 2; i++) { char *name = "unknown"; n = 0; - if (i < MAX_LAYER) + if (i < max_layer) name = PCB->Data->Layer[i].Name; - else if (i == MAX_LAYER) + else if (i == max_layer) name = "solder"; - else if (i == MAX_LAYER + 1) + else if (i == max_layer + 1) name = "component"; stdarg (XmNlabelString, XmStringCreateLocalized (name)); XtSetValues (lglabels[i], args, n); - for (j = 0; j < MAX_LAYER; j++) + for (j = 0; j < max_layer; j++) { if (sets[i][j] != XmToggleButtonGetState (lgbuttons[i][j])) @@ -1234,4 +1399,29 @@ lesstif_update_layer_groups () } } + XtUnmanageChild(lg_buttonform); + for (i = 0; i < MAX_LAYER + 2; i++) + for (j = 0; j < MAX_LAYER; j++) + { + if (i < max_layer + 2 && j < max_layer) + { + XtManageChild(lgbuttons[i][j]); + n = 0; + stdarg (XmNleftPosition, j * (max_layer + 2)); + stdarg (XmNrightPosition, (j + 1) * (max_layer + 2)); + stdarg (XmNtopPosition, i * max_layer); + stdarg (XmNbottomPosition, (i + 1) * max_layer); + XtSetValues(lgbuttons[i][j], args, n); + } + else + XtUnmanageChild(lgbuttons[i][j]); + } + n = 0; + stdarg (XmNfractionBase, max_layer + 2); + XtSetValues (layer_groups_form, args, n); + n = 0; + stdarg (XmNfractionBase, max_layer * (max_layer + 2)); + XtSetValues (lg_buttonform, args, n); + XtManageChild(lg_buttonform); +#endif } @@ -1259,19 +1449,33 @@ EditLayerGroups (int argc, char **argv, if (!layer_groups_form) { + Widget lb; int i, j; - Widget buttonform; n = 0; - stdarg (XmNfractionBase, MAX_LAYER + 2); + stdarg (XmNfractionBase, max_layer + 2); stdarg (XmNtitle, "Layer Groups"); layer_groups_form = XmCreateFormDialog (mainwind, "layers", args, n); n = 0; - stdarg (XmNtopAttachment, XmATTACH_WIDGET); - stdarg (XmNbottomAttachment, XmATTACH_WIDGET); - stdarg (XmNrightAttachment, XmATTACH_WIDGET); - stdarg (XmNfractionBase, MAX_LAYER * (MAX_LAYER + 2)); - buttonform = XmCreateForm (layer_groups_form, "layers", args, n); - XtManageChild (buttonform); + stdarg (XmNtopAttachment, XmATTACH_FORM); + stdarg (XmNbottomAttachment, XmATTACH_FORM); + stdarg (XmNrightAttachment, XmATTACH_FORM); + stdarg (XmNleftAttachment, XmATTACH_FORM); + lg_buttonform = XmCreateDrawingArea (layer_groups_form, "layers", args, n); + XtManageChild (lg_buttonform); + + XtAddCallback (lg_buttonform, XmNexposeCallback, + (XtCallbackProc) lgbutton_expose, 0); + XtAddCallback (lg_buttonform, XmNinputCallback, + (XtCallbackProc) lgbutton_input, 0); + XtAddCallback (lg_buttonform, XmNresizeCallback, + (XtCallbackProc) lgbutton_resize, 0); + + XtGetSubresources (layer_groups_form, &lgr, + "layergroups", "LayerGroups", + &lg_resources, XtNumber(lg_resources), 0, 0); +#if 0 + stdarg (XmNfractionBase, max_layer * (MAX_LAYER + 2)); + lg_buttonform = XmCreateForm (layer_groups_form, "lgbutton", args, n); for (i = 0; i < MAX_LAYER + 2; i++) @@ -1284,5 +1488,5 @@ EditLayerGroups (int argc, char **argv, stdarg (XmNbottomPosition, i + 1); stdarg (XmNrightAttachment, XmATTACH_WIDGET); - stdarg (XmNrightWidget, buttonform); + stdarg (XmNrightWidget, lg_buttonform); lglabels[i] = XmCreateLabel (layer_groups_form, "layer", args, n); XtManageChild (lglabels[i]); @@ -1308,12 +1512,13 @@ EditLayerGroups (int argc, char **argv, stdarg (XmNhighlightThickness, 0); lgbuttons[i][j] = - XmCreateToggleButton (buttonform, "label", args, n); + XmCreateToggleButton (lg_buttonform, "label", args, n); XtManageChild (lgbuttons[i][j]); XtAddCallback (lgbuttons[i][j], XmNvalueChangedCallback, (XtCallbackProc) lgbutton_cb, - (XtPointer) (i * MAX_LAYER + j)); + (XtPointer) (i * max_layer + j)); } } +#endif } lesstif_update_layer_groups (); Index: src/hid/lesstif/main.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/hid/lesstif/main.c,v retrieving revision 1.23 diff -p -U2 -r1.23 src/hid/lesstif/main.c --- src/hid/lesstif/main.c 20 May 2006 20:04:45 -0000 1.23 +++ src/hid/lesstif/main.c 28 May 2006 02:31:52 -0000 @@ -282,4 +282,5 @@ PCBChanged (int argc, char **argv, int x hid_action ("RouteStylesChanged"); lesstif_sizes_reset (); + lesstif_update_layer_groups (); while (pinouts) pinout_unmap (0, pinouts, 0); @@ -504,6 +505,6 @@ static int SwapSides (int argc, char **argv, int x, int y) { - int comp_group = GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER); - int solder_group = GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER); + int comp_group = GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER); + int solder_group = GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER); int active_group = GetLayerGroupNumberByNumber (LayerStack[0]); int comp_showing = @@ -2391,5 +2392,5 @@ lesstif_set_layer (const char *name, int { int idx = group; - if (idx >= 0 && idx < MAX_LAYER) + if (idx >= 0 && idx < max_layer) { idx = PCB->LayerGroups.Entries[idx][0]; @@ -2407,5 +2408,5 @@ lesstif_set_layer (const char *name, int autofade = 0; #endif - if (idx >= 0 && idx < MAX_LAYER + 2) + if (idx >= 0 && idx < max_layer + 2) return pinout ? 1 : PCB->Data->Layer[idx].On; if (idx < 0) Index: src/hid/lesstif/menu.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/hid/lesstif/menu.c,v retrieving revision 1.12 diff -p -U2 -r1.12 src/hid/lesstif/menu.c --- src/hid/lesstif/menu.c 21 May 2006 04:36:31 -0000 1.12 +++ src/hid/lesstif/menu.c 28 May 2006 02:31:52 -0000 @@ -182,7 +182,20 @@ LayersChanged (int argc, char **argv, in return 0; - if (!got_colors) + if (PCB && PCB->Data) + { + DataType *d = PCB->Data; + for (i = 0; i < MAX_LAYER; i++) + fg_colors[i] = lesstif_parse_color (d->Layer[i].Color); + fg_colors[LB_SILK] = lesstif_parse_color (PCB->ElementColor); + fg_colors[LB_RATS] = lesstif_parse_color (PCB->RatColor); + fg_colors[LB_PINS] = lesstif_parse_color (PCB->PinColor); + fg_colors[LB_VIAS] = lesstif_parse_color (PCB->ViaColor); + fg_colors[LB_BACK] = + lesstif_parse_color (PCB->InvisibleObjectsColor); + fg_colors[LB_MASK] = lesstif_parse_color (PCB->MaskColor); + bg_color = lesstif_parse_color (Settings.BackgroundColor); + } + else { - got_colors = 1; for (i = 0; i < MAX_LAYER; i++) fg_colors[i] = lesstif_parse_color (Settings.LayerColor[i]); @@ -261,4 +274,9 @@ LayersChanged (int argc, char **argv, in } XtSetValues (lb->w[i], args, n); + + if (i >= max_layer && i < MAX_LAYER) + XtUnmanageChild(lb->w[i]); + else + XtManageChild(lb->w[i]); } } @@ -285,4 +303,6 @@ LayersChanged (int argc, char **argv, in } + lesstif_update_layer_groups (); + return 0; } @@ -344,5 +364,5 @@ layer_button_callback (Widget w, int lay show_one_layer_button (layer, set); - if (layer < MAX_LAYER) + if (layer < max_layer) { int i; @@ -351,5 +371,5 @@ layer_button_callback (Widget w, int lay { l = PCB->LayerGroups.Entries[group][i]; - if (l != layer && l < MAX_LAYER) + if (l != layer && l < max_layer) { show_one_layer_button (l, set); @@ -369,5 +389,5 @@ layerpick_button_callback (Widget w, int PCB->RatDraw = (layer == LB_RATS); PCB->SilkActive = (layer == LB_SILK); - if (layer < MAX_LAYER) + if (layer < max_layer) ChangeGroupVisibility (layer, 1, 1); for (l = 0; l < num_layer_buttons; l++) @@ -476,5 +496,5 @@ ToggleView (int argc, char **argv, int x { l = -1; - for (i = 0; i < MAX_LAYER + 2; i++) + for (i = 0; i < max_layer + 2; i++) if (strcmp (argv[0], PCB->Data->Layer[i].Name) == 0) { @@ -529,5 +549,5 @@ insert_layerview_buttons (Widget menu) } n = 0; - if (i < MAX_LAYER) + if (i < MAX_LAYER && i < 9) { char buf[20], av[30]; @@ -584,5 +604,5 @@ insert_layerpick_buttons (Widget menu) } n = 0; - if (i < MAX_LAYER) + if (i < MAX_LAYER && i < 9) { char buf[20], av[30]; Index: src/hid/png/png.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/hid/png/png.c,v retrieving revision 1.11 diff -p -U2 -r1.11 src/hid/png/png.c --- src/hid/png/png.c 20 May 2006 20:04:45 -0000 1.11 +++ src/hid/png/png.c 28 May 2006 02:31:52 -0000 @@ -211,8 +211,8 @@ static int group_for_layer (int l) { - if (l < MAX_LAYER + 2 && l >= 0) + if (l < max_layer + 2 && l >= 0) return GetLayerGroupNumberByNumber (l); /* else something unique */ - return MAX_LAYER + 3 + l; + return max_layer + 3 + l; } @@ -226,5 +226,5 @@ layer_sort (const void *va, const void * int d = bl - al; - if (a >= 0 && a <= MAX_LAYER + 1) + if (a >= 0 && a <= max_layer + 1) { int aside = (al == solder_layer ? 0 : al == comp_layer ? 2 : 1); @@ -264,5 +264,5 @@ png_hid_export_to_file (FILE * the_file, memset (print_layer, 0, sizeof (print_layer)); - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { LayerType *layer = PCB->Data->Layer + i; @@ -270,7 +270,7 @@ png_hid_export_to_file (FILE * the_file, print_group[GetLayerGroupNumberByNumber (i)] = 1; } - print_group[GetLayerGroupNumberByNumber (MAX_LAYER)] = 1; - print_group[GetLayerGroupNumberByNumber (MAX_LAYER + 1)] = 1; - for (i = 0; i < MAX_LAYER; i++) + print_group[GetLayerGroupNumberByNumber (max_layer)] = 1; + print_group[GetLayerGroupNumberByNumber (max_layer + 1)] = 1; + for (i = 0; i < max_layer; i++) if (print_group[GetLayerGroupNumberByNumber (i)]) print_layer[i] = 1; @@ -280,7 +280,7 @@ png_hid_export_to_file (FILE * the_file, if (!options[HA_as_shown].int_value) { - comp_layer = GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER); - solder_layer = GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER); - qsort (LayerStack, MAX_LAYER, sizeof (LayerStack[0]), layer_sort); + comp_layer = GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER); + solder_layer = GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER); + qsort (LayerStack, max_layer, sizeof (LayerStack[0]), layer_sort); } linewidth = -1; @@ -505,9 +505,9 @@ png_set_layer (const char *name, int gro int idx = (group >= 0 && group < - MAX_LAYER) ? PCB->LayerGroups.Entries[group][0] : group; + max_layer) ? PCB->LayerGroups.Entries[group][0] : group; if (name == 0) name = PCB->Data->Layer[idx].Name; - if (idx >= 0 && idx < MAX_LAYER && !print_layer[idx]) + if (idx >= 0 && idx < max_layer && !print_layer[idx]) return 0; if (SL_TYPE (idx) == SL_ASSY || SL_TYPE (idx) == SL_FAB) Index: src/hid/ps/eps.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/hid/ps/eps.c,v retrieving revision 1.8 diff -p -U2 -r1.8 src/hid/ps/eps.c --- src/hid/ps/eps.c 20 May 2006 20:04:45 -0000 1.8 +++ src/hid/ps/eps.c 28 May 2006 02:31:52 -0000 @@ -104,8 +104,8 @@ static int group_for_layer (int l) { - if (l < MAX_LAYER + 2 && l >= 0) + if (l < max_layer + 2 && l >= 0) return GetLayerGroupNumberByNumber (l); /* else something unique */ - return MAX_LAYER + 3 + l; + return max_layer + 3 + l; } @@ -119,5 +119,5 @@ layer_sort (const void *va, const void * int d = bl - al; - if (a >= 0 && a <= MAX_LAYER + 1) + if (a >= 0 && a <= max_layer + 1) { int aside = (al == solder_layer ? 0 : al == comp_layer ? 2 : 1); @@ -158,5 +158,5 @@ eps_hid_export_to_file (FILE * the_file, /* Figure out which layers actually have stuff on them. */ - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { LayerType *layer = PCB->Data->Layer + i; @@ -169,5 +169,5 @@ eps_hid_export_to_file (FILE * the_file, erase. */ fast_erase = 0; - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) if (print_group[i]) fast_erase ++; @@ -177,5 +177,5 @@ eps_hid_export_to_file (FILE * the_file, if (fast_erase == 0) { - print_group[GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER)] = 1; + print_group[GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER)] = 1; fast_erase = 1; } @@ -186,5 +186,5 @@ eps_hid_export_to_file (FILE * the_file, /* Now, for each group we're printing, mark its layers for printing. */ - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) if (print_group[GetLayerGroupNumberByNumber (i)]) print_layer[i] = 1; @@ -202,7 +202,7 @@ eps_hid_export_to_file (FILE * the_file, if (!options[HA_as_shown].int_value) { - comp_layer = GetLayerGroupNumberByNumber (MAX_LAYER + COMPONENT_LAYER); - solder_layer = GetLayerGroupNumberByNumber (MAX_LAYER + SOLDER_LAYER); - qsort (LayerStack, MAX_LAYER, sizeof (LayerStack[0]), layer_sort); + comp_layer = GetLayerGroupNumberByNumber (max_layer + COMPONENT_LAYER); + solder_layer = GetLayerGroupNumberByNumber (max_layer + SOLDER_LAYER); + qsort (LayerStack, max_layer, sizeof (LayerStack[0]), layer_sort); } fprintf (f, "%%!PS-Adobe-3.0 EPSF-3.0\n"); @@ -315,9 +315,9 @@ eps_set_layer (const char *name, int gro int idx = (group >= 0 && group < - MAX_LAYER) ? PCB->LayerGroups.Entries[group][0] : group; + max_layer) ? PCB->LayerGroups.Entries[group][0] : group; if (name == 0) name = PCB->Data->Layer[idx].Name; - if (idx >= 0 && idx < MAX_LAYER && !print_layer[idx]) + if (idx >= 0 && idx < max_layer && !print_layer[idx]) return 0; if (SL_TYPE (idx) == SL_ASSY || SL_TYPE (idx) == SL_FAB) Index: src/hid/ps/ps.c =================================================================== RCS file: /cvsroot/pcb/pcb/src/hid/ps/ps.c,v retrieving revision 1.7 diff -p -U2 -r1.7 src/hid/ps/ps.c --- src/hid/ps/ps.c 20 May 2006 20:04:45 -0000 1.7 +++ src/hid/ps/ps.c 28 May 2006 02:31:52 -0000 @@ -149,8 +149,8 @@ static int group_for_layer (int l) { - if (l < MAX_LAYER + 2 && l >= 0) + if (l < max_layer + 2 && l >= 0) return GetLayerGroupNumberByNumber (l); /* else something unique */ - return MAX_LAYER + 3 + l; + return max_layer + 3 + l; } @@ -231,5 +231,5 @@ ps_hid_export_to_file (FILE * the_file, memset (print_layer, 0, sizeof (print_layer)); - for (i = 0; i < MAX_LAYER; i++) + for (i = 0; i < max_layer; i++) { LayerType *layer = PCB->Data->Layer + i; @@ -237,12 +237,12 @@ ps_hid_export_to_file (FILE * the_file, print_group[GetLayerGroupNumberByNumber (i)] = 1; } - print_group[GetLayerGroupNumberByNumber (MAX_LAYER)] = 1; - print_group[GetLayerGroupNumberByNumber (MAX_LAYER + 1)] = 1; - for (i = 0; i < MAX_LAYER; i++) + print_group[GetLayerGroupNumberByNumber (max_layer)] = 1; + print_group[GetLayerGroupNumberByNumber (max_layer + 1)] = 1; + for (i = 0; i < max_layer; i++) if (print_group[GetLayerGroupNumberByNumber (i)]) print_layer[i] = 1; memcpy (saved_layer_stack, LayerStack, sizeof (LayerStack)); - qsort (LayerStack, MAX_LAYER, sizeof (LayerStack[0]), layer_sort); + qsort (LayerStack, max_layer, sizeof (LayerStack[0]), layer_sort); fprintf (f, "%%!PS-Adobe-3.0\n\n"); linewidth = -1; @@ -352,9 +352,9 @@ ps_set_layer (const char *name, int grou int idx = (group >= 0 && group < - MAX_LAYER) ? PCB->LayerGroups.Entries[group][0] : group; + max_layer) ? PCB->LayerGroups.Entries[group][0] : group; if (name == 0) name = PCB->Data->Layer[idx].Name; - if (idx >= 0 && idx < MAX_LAYER && !print_layer[idx]) + if (idx >= 0 && idx < max_layer && !print_layer[idx]) return 0; @@ -404,5 +404,5 @@ ps_set_layer (const char *name, int grou || (automirror && - ((idx >= 0 && group == GetLayerGroupNumberByNumber (MAX_LAYER)) + ((idx >= 0 && group == GetLayerGroupNumberByNumber (max_layer)) || (idx < 0 && SL_SIDE (idx) == SL_BOTTOM_SIDE)))) fprintf (f, "1 -1 scale\n");