Fix node_label() function to work with self-intersection
[geda-pcb/gde.git] / src / flags.c
blobc6c745807e55a02f103a68dca4e8f6190b3ea018
1 /* $Id$ */
3 /*
4 * COPYRIGHT
6 * PCB, interactive printed circuit board design
7 * Copyright (C) 2005 DJ Delorie
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
30 #include <math.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #ifdef HAVE_STRING_H
34 #include <string.h>
35 #endif
37 #include "global.h"
38 #include "data.h"
40 #ifdef HAVE_LIBDMALLOC
41 #include <dmalloc.h>
42 #endif
44 RCSID ("$Id$");
46 static int
47 FlagCurrentStyle (int dummy)
49 STYLE_LOOP (PCB);
51 if (style->Thick == Settings.LineThickness &&
52 style->Diameter == Settings.ViaThickness &&
53 style->Hole == Settings.ViaDrillingHole &&
54 style->Keepaway == Settings.Keepaway)
55 return n + 1;
57 END_LOOP;
58 return 0;
61 static int
62 FlagGrid (int dummy)
64 return PCB->Grid > 1.0;
67 static int
68 FlagGridSize (int dummy)
70 return (int) (PCB->Grid + 0.5);
73 static int
74 FlagBuffer (int dummy)
76 return (int) (Settings.BufferNumber + 1);
79 static int
80 FlagElementName (int dummy)
82 if (TEST_FLAG (NAMEONPCBFLAG, PCB))
83 return 2;
84 if (TEST_FLAG (DESCRIPTIONFLAG, PCB))
85 return 1;
86 return 3;
89 static int
90 FlagTESTFLAG (int bit)
92 return TEST_FLAG (bit, PCB) ? 1 : 0;
95 static int
96 FlagSETTINGS (int ofs)
98 return *(Boolean *) ((char *) (&Settings) + ofs);
101 static int
102 FlagMode (int x)
104 if (x == -1)
105 return Settings.Mode;
106 return Settings.Mode == x;
109 static int
110 FlagHaveRegex (int x)
112 #if defined(HAVE_REGCOMP) || defined(HAVE_RE_COMP)
113 return 1;
114 #else
115 return 0;
116 #endif
119 enum {
120 FL_SILK = -6,
121 FL_PINS,
122 FL_RATS,
123 FL_VIAS,
124 FL_BACK,
125 FL_MASK
128 static int
129 FlagLayerShown (int n)
131 switch (n)
133 case FL_SILK:
134 return PCB->ElementOn;
135 case FL_PINS:
136 return PCB->PinOn;
137 case FL_RATS:
138 return PCB->RatOn;
139 case FL_VIAS:
140 return PCB->ViaOn;
141 case FL_BACK:
142 return PCB->InvisibleObjectsOn;
143 case FL_MASK:
144 return TEST_FLAG (SHOWMASKFLAG, PCB);
145 default:
146 if (n >= 0 && n < max_layer)
147 return PCB->Data->Layer[n].On;
149 return 0;
152 static int
153 FlagLayerActive (int n)
155 int current_layer;
156 if (PCB->RatDraw)
157 current_layer = FL_RATS;
158 else if (PCB->SilkActive)
159 current_layer = FL_SILK;
160 else
161 return 0;
163 return current_layer == n;
166 #define OffsetOf(a,b) (int)(&(((a *)0)->b))
168 HID_Flag flags_flag_list[] = {
169 {"style", FlagCurrentStyle, 0},
170 {"grid", FlagGrid, 0},
171 {"gridsize", FlagGridSize, 0},
172 {"elementname", FlagElementName, 0},
173 {"have_regex", FlagHaveRegex, 0},
175 {"silk_shown", FlagLayerShown, FL_SILK},
176 {"pins_shown", FlagLayerShown, FL_PINS},
177 {"rats_shown", FlagLayerShown, FL_RATS},
178 {"vias_shown", FlagLayerShown, FL_VIAS},
179 {"back_shown", FlagLayerShown, FL_BACK},
180 {"mask_shown", FlagLayerShown, FL_MASK},
181 {"silk_active", FlagLayerActive, FL_SILK},
182 {"rats_active", FlagLayerActive, FL_RATS},
184 {"mode", FlagMode, -1},
185 {"nomode", FlagMode, NO_MODE},
186 {"arcmode", FlagMode, ARC_MODE},
187 {"arrowmode", FlagMode, ARROW_MODE},
188 {"copymode", FlagMode, COPY_MODE},
189 {"insertpointmode", FlagMode, INSERTPOINT_MODE},
190 {"linemode", FlagMode, LINE_MODE},
191 {"lockmode", FlagMode, LOCK_MODE},
192 {"movemode", FlagMode, MOVE_MODE},
193 {"pastebuffermode", FlagMode, PASTEBUFFER_MODE},
194 {"polygonmode", FlagMode, POLYGON_MODE},
195 {"rectanglemode", FlagMode, RECTANGLE_MODE},
196 {"removemode", FlagMode, REMOVE_MODE},
197 {"rotatemode", FlagMode, ROTATE_MODE},
198 {"rubberbandmovemode", FlagMode, RUBBERBANDMOVE_MODE},
199 {"textmode", FlagMode, TEXT_MODE},
200 {"thermalmode", FlagMode, THERMAL_MODE},
201 {"viamode", FlagMode, VIA_MODE},
203 {"shownumber", FlagTESTFLAG, SHOWNUMBERFLAG},
204 {"localref", FlagTESTFLAG, LOCALREFFLAG},
205 {"checkplanes", FlagTESTFLAG, CHECKPLANESFLAG},
206 {"showdrc", FlagTESTFLAG, SHOWDRCFLAG},
207 {"rubberband", FlagTESTFLAG, RUBBERBANDFLAG},
208 {"description", FlagTESTFLAG, DESCRIPTIONFLAG},
209 {"nameonpcb", FlagTESTFLAG, NAMEONPCBFLAG},
210 {"autodrc", FlagTESTFLAG, AUTODRCFLAG},
211 {"alldirection", FlagTESTFLAG, ALLDIRECTIONFLAG},
212 {"swapstartdir", FlagTESTFLAG, SWAPSTARTDIRFLAG},
213 {"uniquename", FlagTESTFLAG, UNIQUENAMEFLAG},
214 {"clearnew", FlagTESTFLAG, CLEARNEWFLAG},
215 {"snappin", FlagTESTFLAG, SNAPPINFLAG},
216 {"showmask", FlagTESTFLAG, SHOWMASKFLAG},
217 {"thindraw", FlagTESTFLAG, THINDRAWFLAG},
218 {"orthomove", FlagTESTFLAG, ORTHOMOVEFLAG},
219 {"liveroute", FlagTESTFLAG, LIVEROUTEFLAG},
220 {"thindrawpoly", FlagTESTFLAG, THINDRAWPOLYFLAG},
221 {"locknames", FlagTESTFLAG, LOCKNAMESFLAG},
222 {"onlynames", FlagTESTFLAG, ONLYNAMESFLAG},
223 {"newfullpoly", FlagTESTFLAG, NEWFULLPOLYFLAG},
224 {"hidenames", FlagTESTFLAG, HIDENAMESFLAG},
226 {"fullpoly", FlagSETTINGS, OffsetOf (SettingType, FullPoly)},
227 {"grid_units_mm", FlagSETTINGS, OffsetOf (SettingType, grid_units_mm)},
228 {"clearline", FlagSETTINGS, OffsetOf (SettingType, ClearLine)},
229 {"uniquenames", FlagSETTINGS, OffsetOf (SettingType, UniqueNames)},
230 {"showsolderside", FlagSETTINGS, OffsetOf (SettingType, ShowSolderSide)},
231 {"savelastcommand", FlagSETTINGS, OffsetOf (SettingType, SaveLastCommand)},
232 {"saveintmp", FlagSETTINGS, OffsetOf (SettingType, SaveInTMP)},
233 {"drawgrid", FlagSETTINGS, OffsetOf (SettingType, DrawGrid)},
234 {"ratwarn", FlagSETTINGS, OffsetOf (SettingType, RatWarn)},
235 {"stipplepolygons", FlagSETTINGS, OffsetOf (SettingType, StipplePolygons)},
236 {"alldirectionlines", FlagSETTINGS,
237 OffsetOf (SettingType, AllDirectionLines)},
238 {"rubberbandmode", FlagSETTINGS, OffsetOf (SettingType, RubberBandMode)},
239 {"swapstartdirection", FlagSETTINGS,
240 OffsetOf (SettingType, SwapStartDirection)},
241 {"showdrcmode", FlagSETTINGS, OffsetOf (SettingType, ShowDRC)},
242 {"resetafterelement", FlagSETTINGS,
243 OffsetOf (SettingType, ResetAfterElement)},
244 {"ringbellwhenfinished", FlagSETTINGS,
245 OffsetOf (SettingType, RingBellWhenFinished)},
247 {"buffer", FlagBuffer, 0},
251 REGISTER_FLAGS (flags_flag_list)