6 * PCB, interactive printed circuit board design
7 * Copyright (C) 1994,1995,1996 Thomas Nau
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.
23 * Contact addresses for paper mail and Email:
24 * Thomas Nau, Schlehenweg 15, 88471 Baustetten, Germany
25 * Thomas.Nau@rz.uni-ulm.de
48 #include <sys/types.h>
57 #ifdef HAVE_LIBDMALLOC
65 /* ---------------------------------------------------------------------------
66 * toggle selection of pin
67 * This SelectPin function was moved to here from the original netlist.c
68 * as part of the gui code separation for the Gtk port. SelectPin() is
69 * written by and is Copyright (C) 1998, 1999, 2000, 2001 harry eaton
72 SelectPin (LibraryEntryTypePtr entry
, Boolean toggle
)
76 if (SeekPad (entry
, &conn
, False
))
82 PinTypePtr pin
= (PinTypePtr
) conn
.ptr2
;
84 AddObjectToFlagUndoList (PIN_TYPE
, conn
.ptr1
, conn
.ptr2
,
88 TOGGLE_FLAG (SELECTEDFLAG
, pin
);
89 CenterDisplay (pin
->X
, pin
->Y
, False
);
92 SET_FLAG (SELECTEDFLAG
, pin
);
98 PadTypePtr pad
= (PadTypePtr
) conn
.ptr2
;
100 AddObjectToFlagUndoList (PAD_TYPE
, conn
.ptr1
, conn
.ptr2
,
104 TOGGLE_FLAG (SELECTEDFLAG
, pad
);
105 CenterDisplay (pad
->Point1
.X
, pad
->Point1
.Y
, False
);
108 SET_FLAG (SELECTEDFLAG
, pad
);
117 /* ---------------------------------------------------------------------------
118 * toggles the selection of any kind of object
119 * the different types are defined by search.h
124 void *ptr1
, *ptr2
, *ptr3
;
128 Boolean changed
= True
;
130 type
= SearchScreen (Crosshair
.X
, Crosshair
.Y
, SELECT_TYPES
,
131 &ptr1
, &ptr2
, &ptr3
);
132 if (type
== NO_TYPE
|| TEST_FLAG (LOCKFLAG
, (PinTypePtr
) ptr2
))
137 AddObjectToFlagUndoList (VIA_TYPE
, ptr1
, ptr1
, ptr1
);
138 TOGGLE_FLAG (SELECTEDFLAG
, (PinTypePtr
) ptr1
);
139 DrawVia ((PinTypePtr
) ptr1
, 0);
144 LineType
*line
= (LineTypePtr
) ptr2
;
146 layer
= (LayerTypePtr
) ptr1
;
147 AddObjectToFlagUndoList (LINE_TYPE
, ptr1
, ptr2
, ptr2
);
148 TOGGLE_FLAG (SELECTEDFLAG
, line
);
149 DrawLine (layer
, line
, 0);
155 RatTypePtr rat
= (RatTypePtr
) ptr2
;
157 AddObjectToFlagUndoList (RATLINE_TYPE
, ptr1
, ptr1
, ptr1
);
158 TOGGLE_FLAG (SELECTEDFLAG
, rat
);
165 ArcType
*arc
= (ArcTypePtr
) ptr2
;
167 layer
= (LayerTypePtr
) ptr1
;
168 AddObjectToFlagUndoList (ARC_TYPE
, ptr1
, ptr2
, ptr2
);
169 TOGGLE_FLAG (SELECTEDFLAG
, arc
);
170 DrawArc (layer
, arc
, 0);
176 TextType
*text
= (TextTypePtr
) ptr2
;
178 layer
= (LayerTypePtr
) ptr1
;
179 AddObjectToFlagUndoList (TEXT_TYPE
, ptr1
, ptr2
, ptr2
);
180 TOGGLE_FLAG (SELECTEDFLAG
, text
);
181 DrawText (layer
, text
, 0);
187 PolygonType
*poly
= (PolygonTypePtr
) ptr2
;
189 layer
= (LayerTypePtr
) ptr1
;
190 AddObjectToFlagUndoList (POLYGON_TYPE
, ptr1
, ptr2
, ptr2
);
191 TOGGLE_FLAG (SELECTEDFLAG
, poly
);
192 DrawPolygon (layer
, poly
, 0);
193 /* changing memory order no longer effects draw order */
198 AddObjectToFlagUndoList (PIN_TYPE
, ptr1
, ptr2
, ptr2
);
199 TOGGLE_FLAG (SELECTEDFLAG
, (PinTypePtr
) ptr2
);
200 DrawPin ((PinTypePtr
) ptr2
, 0);
204 AddObjectToFlagUndoList (PAD_TYPE
, ptr1
, ptr2
, ptr2
);
205 TOGGLE_FLAG (SELECTEDFLAG
, (PadTypePtr
) ptr2
);
206 DrawPad ((PadTypePtr
) ptr2
, 0);
209 case ELEMENTNAME_TYPE
:
211 ElementTypePtr element
= (ElementTypePtr
) ptr1
;
213 /* select all names of the element */
214 ELEMENTTEXT_LOOP (element
);
216 AddObjectToFlagUndoList (ELEMENTNAME_TYPE
, element
, text
, text
);
217 TOGGLE_FLAG (SELECTEDFLAG
, text
);
220 DrawElementName (element
, 0);
226 ElementTypePtr element
= (ElementTypePtr
) ptr1
;
228 /* select all pins and names of the element */
231 AddObjectToFlagUndoList (PIN_TYPE
, element
, pin
, pin
);
232 TOGGLE_FLAG (SELECTEDFLAG
, pin
);
237 AddObjectToFlagUndoList (PAD_TYPE
, element
, pad
, pad
);
238 TOGGLE_FLAG (SELECTEDFLAG
, pad
);
241 ELEMENTTEXT_LOOP (element
);
243 AddObjectToFlagUndoList (ELEMENTNAME_TYPE
, element
, text
, text
);
244 TOGGLE_FLAG (SELECTEDFLAG
, text
);
247 AddObjectToFlagUndoList (ELEMENT_TYPE
, element
, element
, element
);
248 TOGGLE_FLAG (SELECTEDFLAG
, element
);
249 if (PCB
->ElementOn
&&
250 ((TEST_FLAG (ONSOLDERFLAG
, element
) != 0) == SWAP_IDENT
||
251 PCB
->InvisibleObjectsOn
))
254 DrawElementName (element
, 0);
255 DrawElementPackage (element
, 0);
258 DrawElementPinsAndPads (element
, 0);
263 IncrementUndoSerialNumber ();
267 /* ----------------------------------------------------------------------
268 * selects/unselects all visible objects within the passed box
269 * Flag determines if the block is to be selected or unselected
270 * returns True if the state of any object has changed
273 SelectBlock (BoxTypePtr Box
, Boolean Flag
)
275 Boolean changed
= False
;
277 if (PCB
->RatOn
|| !Flag
)
278 RAT_LOOP (PCB
->Data
);
280 if (LINE_IN_BOX ((LineTypePtr
) line
, Box
) &&
281 !TEST_FLAG (LOCKFLAG
, line
) && TEST_FLAG (SELECTEDFLAG
, line
) != Flag
)
283 AddObjectToFlagUndoList (RATLINE_TYPE
, line
, line
, line
);
284 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, line
);
293 LAYER_LOOP(PCB
->Data
, max_layer
+ 2);
295 if (! (layer
->On
|| !Flag
))
300 if (LINE_IN_BOX (line
, Box
)
301 && !TEST_FLAG (LOCKFLAG
, line
)
302 && TEST_FLAG (SELECTEDFLAG
, line
) != Flag
)
304 AddObjectToFlagUndoList (LINE_TYPE
, layer
, line
, line
);
305 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, line
);
307 DrawLine (layer
, line
, 0);
314 if (ARC_IN_BOX (arc
, Box
)
315 && !TEST_FLAG (LOCKFLAG
, arc
)
316 && TEST_FLAG (SELECTEDFLAG
, arc
) != Flag
)
318 AddObjectToFlagUndoList (ARC_TYPE
, layer
, arc
, arc
);
319 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, arc
);
321 DrawArc (layer
, arc
, 0);
328 if (!Flag
|| TEXT_IS_VISIBLE(PCB
, layer
, text
))
330 if (TEXT_IN_BOX (text
, Box
)
331 && !TEST_FLAG (LOCKFLAG
, text
)
332 && TEST_FLAG (SELECTEDFLAG
, text
) != Flag
)
334 AddObjectToFlagUndoList (TEXT_TYPE
, layer
, text
, text
);
335 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, text
);
336 if (TEXT_IS_VISIBLE(PCB
, layer
, text
))
337 DrawText (layer
, text
, 0);
343 POLYGON_LOOP (layer
);
345 if (POLYGON_IN_BOX (polygon
, Box
)
346 && !TEST_FLAG (LOCKFLAG
, polygon
)
347 && TEST_FLAG (SELECTEDFLAG
, polygon
) != Flag
)
349 AddObjectToFlagUndoList (POLYGON_TYPE
, layer
, polygon
, polygon
);
350 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, polygon
);
352 DrawPolygon (layer
, polygon
, 0);
361 ELEMENT_LOOP (PCB
->Data
);
364 Boolean gotElement
= False
;
365 if ((PCB
->ElementOn
|| !Flag
)
366 && !TEST_FLAG (LOCKFLAG
, element
)
367 && ((TEST_FLAG (ONSOLDERFLAG
, element
) != 0) == SWAP_IDENT
368 || PCB
->InvisibleObjectsOn
))
371 (&ELEMENT_TEXT (PCB
, element
).BoundingBox
, Box
)
372 && !TEST_FLAG (LOCKFLAG
, &ELEMENT_TEXT (PCB
, element
))
373 && TEST_FLAG (SELECTEDFLAG
,
374 &ELEMENT_TEXT (PCB
, element
)) != Flag
)
376 /* select all names of element */
377 ELEMENTTEXT_LOOP (element
);
379 AddObjectToFlagUndoList (ELEMENTNAME_TYPE
,
380 element
, text
, text
);
381 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, text
);
385 DrawElementName (element
, 0);
388 if ((PCB
->PinOn
|| !Flag
) && ELEMENT_IN_BOX (element
, Box
))
389 if (TEST_FLAG (SELECTEDFLAG
, element
) != Flag
)
391 AddObjectToFlagUndoList (ELEMENT_TYPE
,
392 element
, element
, element
);
393 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, element
);
396 if (TEST_FLAG (SELECTEDFLAG
, pin
) != Flag
)
398 AddObjectToFlagUndoList (PIN_TYPE
, element
, pin
, pin
);
399 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, pin
);
408 if (TEST_FLAG (SELECTEDFLAG
, pad
) != Flag
)
410 AddObjectToFlagUndoList (PAD_TYPE
, element
, pad
, pad
);
411 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, pad
);
419 DrawElement (element
, 0);
424 if ((PCB
->PinOn
|| !Flag
) && !TEST_FLAG (LOCKFLAG
, element
) && !gotElement
)
428 if ((VIA_OR_PIN_IN_BOX (pin
, Box
)
429 && TEST_FLAG (SELECTEDFLAG
, pin
) != Flag
))
431 AddObjectToFlagUndoList (PIN_TYPE
, element
, pin
, pin
);
432 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, pin
);
441 if (PAD_IN_BOX (pad
, Box
)
442 && TEST_FLAG (SELECTEDFLAG
, pad
) != Flag
)
444 AddObjectToFlagUndoList (PAD_TYPE
, element
, pad
, pad
);
445 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, pad
);
457 if (PCB
->ViaOn
|| !Flag
)
458 VIA_LOOP (PCB
->Data
);
460 if (VIA_OR_PIN_IN_BOX (via
, Box
)
461 && !TEST_FLAG (LOCKFLAG
, via
)
462 && TEST_FLAG (SELECTEDFLAG
, via
) != Flag
)
464 AddObjectToFlagUndoList (VIA_TYPE
, via
, via
, via
);
465 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, via
);
475 IncrementUndoSerialNumber ();
480 /* ----------------------------------------------------------------------
481 * performs several operations on the passed object
484 ObjectOperation (ObjectFunctionTypePtr F
,
485 int Type
, void *Ptr1
, void *Ptr2
, void *Ptr3
)
491 return (F
->Line ((LayerTypePtr
) Ptr1
, (LineTypePtr
) Ptr2
));
496 return (F
->Arc ((LayerTypePtr
) Ptr1
, (ArcTypePtr
) Ptr2
));
501 return (F
->LinePoint ((LayerTypePtr
) Ptr1
, (LineTypePtr
) Ptr2
,
502 (PointTypePtr
) Ptr3
));
507 return (F
->Text ((LayerTypePtr
) Ptr1
, (TextTypePtr
) Ptr2
));
512 return (F
->Polygon ((LayerTypePtr
) Ptr1
, (PolygonTypePtr
) Ptr2
));
515 case POLYGONPOINT_TYPE
:
517 return (F
->Point ((LayerTypePtr
) Ptr1
, (PolygonTypePtr
) Ptr2
,
518 (PointTypePtr
) Ptr3
));
523 return (F
->Via ((PinTypePtr
) Ptr1
));
528 return (F
->Element ((ElementTypePtr
) Ptr1
));
533 return (F
->Pin ((ElementTypePtr
) Ptr1
, (PinTypePtr
) Ptr2
));
538 return (F
->Pad ((ElementTypePtr
) Ptr1
, (PadTypePtr
) Ptr2
));
541 case ELEMENTNAME_TYPE
:
543 return (F
->ElementName ((ElementTypePtr
) Ptr1
));
548 return (F
->Rat ((RatTypePtr
) Ptr1
));
554 /* ----------------------------------------------------------------------
555 * performs several operations on selected objects which are also visible
556 * The lowlevel procedures are passed together with additional information
557 * resets the selected flag if requested
558 * returns True if anything has changed
561 SelectedOperation (ObjectFunctionTypePtr F
, Boolean Reset
, int type
)
563 Boolean changed
= False
;
566 if (type
& LINE_TYPE
&& F
->Line
)
567 VISIBLELINE_LOOP (PCB
->Data
);
569 if (TEST_FLAG (SELECTEDFLAG
, line
))
573 AddObjectToFlagUndoList (LINE_TYPE
, layer
, line
, line
);
574 CLEAR_FLAG (SELECTEDFLAG
, line
);
576 F
->Line (layer
, line
);
583 if (type
& ARC_TYPE
&& F
->Arc
)
584 VISIBLEARC_LOOP (PCB
->Data
);
586 if (TEST_FLAG (SELECTEDFLAG
, arc
))
590 AddObjectToFlagUndoList (ARC_TYPE
, layer
, arc
, arc
);
591 CLEAR_FLAG (SELECTEDFLAG
, arc
);
600 if (type
& TEXT_TYPE
&& F
->Text
)
601 ALLTEXT_LOOP (PCB
->Data
);
603 if (TEST_FLAG (SELECTEDFLAG
, text
) && TEXT_IS_VISIBLE (PCB
, layer
, text
))
607 AddObjectToFlagUndoList (TEXT_TYPE
, layer
, text
, text
);
608 CLEAR_FLAG (SELECTEDFLAG
, text
);
610 F
->Text (layer
, text
);
617 if (type
& POLYGON_TYPE
&& F
->Polygon
)
618 VISIBLEPOLYGON_LOOP (PCB
->Data
);
620 if (TEST_FLAG (SELECTEDFLAG
, polygon
))
624 AddObjectToFlagUndoList (POLYGON_TYPE
, layer
, polygon
, polygon
);
625 CLEAR_FLAG (SELECTEDFLAG
, polygon
);
627 F
->Polygon (layer
, polygon
);
633 /* elements silkscreen */
634 if (type
& ELEMENT_TYPE
&& PCB
->ElementOn
&& F
->Element
)
635 ELEMENT_LOOP (PCB
->Data
);
637 if (TEST_FLAG (SELECTEDFLAG
, element
))
641 AddObjectToFlagUndoList (ELEMENT_TYPE
, element
, element
, element
);
642 CLEAR_FLAG (SELECTEDFLAG
, element
);
644 F
->Element (element
);
649 if (type
& ELEMENTNAME_TYPE
&& PCB
->ElementOn
&& F
->ElementName
)
650 ELEMENT_LOOP (PCB
->Data
);
652 if (TEST_FLAG (SELECTEDFLAG
, &ELEMENT_TEXT (PCB
, element
)))
656 AddObjectToFlagUndoList (ELEMENTNAME_TYPE
,
658 &ELEMENT_TEXT (PCB
, element
),
659 &ELEMENT_TEXT (PCB
, element
));
660 CLEAR_FLAG (SELECTEDFLAG
, &ELEMENT_TEXT (PCB
, element
));
662 F
->ElementName (element
);
668 if (type
& PIN_TYPE
&& PCB
->PinOn
&& F
->Pin
)
669 ELEMENT_LOOP (PCB
->Data
);
673 if (TEST_FLAG (SELECTEDFLAG
, pin
))
677 AddObjectToFlagUndoList (PIN_TYPE
, element
, pin
, pin
);
678 CLEAR_FLAG (SELECTEDFLAG
, pin
);
680 F
->Pin (element
, pin
);
688 if (type
& PAD_TYPE
&& PCB
->PinOn
&& F
->Pad
)
689 ELEMENT_LOOP (PCB
->Data
);
693 if (TEST_FLAG (SELECTEDFLAG
, pad
))
697 AddObjectToFlagUndoList (PAD_TYPE
, element
, pad
, pad
);
698 CLEAR_FLAG (SELECTEDFLAG
, pad
);
700 F
->Pad (element
, pad
);
709 if (type
& VIA_TYPE
&& PCB
->ViaOn
&& F
->Via
)
710 VIA_LOOP (PCB
->Data
);
712 if (TEST_FLAG (SELECTEDFLAG
, via
))
716 AddObjectToFlagUndoList (VIA_TYPE
, via
, via
, via
);
717 CLEAR_FLAG (SELECTEDFLAG
, via
);
725 if (type
& RATLINE_TYPE
&& PCB
->RatOn
&& F
->Rat
)
726 RAT_LOOP (PCB
->Data
);
728 if (TEST_FLAG (SELECTEDFLAG
, line
))
732 AddObjectToFlagUndoList (RATLINE_TYPE
, line
, line
, line
);
733 CLEAR_FLAG (SELECTEDFLAG
, line
);
740 if (Reset
&& changed
)
741 IncrementUndoSerialNumber ();
745 /* ----------------------------------------------------------------------
746 * selects/unselects all objects which were found during a connection scan
747 * Flag determines if they are to be selected or unselected
748 * returns True if the state of any object has changed
750 * text objects and elements cannot be selected by this routine
753 SelectConnection (Boolean Flag
)
755 Boolean changed
= False
;
758 RAT_LOOP (PCB
->Data
);
760 if (TEST_FLAG (FOUNDFLAG
, line
))
762 AddObjectToFlagUndoList (RATLINE_TYPE
, line
, line
, line
);
763 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, line
);
770 VISIBLELINE_LOOP (PCB
->Data
);
772 if (TEST_FLAG (FOUNDFLAG
, line
) && !TEST_FLAG (LOCKFLAG
, line
))
774 AddObjectToFlagUndoList (LINE_TYPE
, layer
, line
, line
);
775 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, line
);
776 DrawLine (layer
, line
, 0);
781 VISIBLEARC_LOOP (PCB
->Data
);
783 if (TEST_FLAG (FOUNDFLAG
, arc
) && !TEST_FLAG (LOCKFLAG
, arc
))
785 AddObjectToFlagUndoList (ARC_TYPE
, layer
, arc
, arc
);
786 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, arc
);
787 DrawArc (layer
, arc
, 0);
792 VISIBLEPOLYGON_LOOP (PCB
->Data
);
794 if (TEST_FLAG (FOUNDFLAG
, polygon
) && !TEST_FLAG (LOCKFLAG
, polygon
))
796 AddObjectToFlagUndoList (POLYGON_TYPE
, layer
, polygon
, polygon
);
797 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, polygon
);
798 DrawPolygon (layer
, polygon
, 0);
804 if (PCB
->PinOn
&& PCB
->ElementOn
)
806 ALLPIN_LOOP (PCB
->Data
);
808 if (!TEST_FLAG (LOCKFLAG
, element
) && TEST_FLAG (FOUNDFLAG
, pin
))
810 AddObjectToFlagUndoList (PIN_TYPE
, element
, pin
, pin
);
811 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, pin
);
817 ALLPAD_LOOP (PCB
->Data
);
819 if (!TEST_FLAG (LOCKFLAG
, element
) && TEST_FLAG (FOUNDFLAG
, pad
))
821 AddObjectToFlagUndoList (PAD_TYPE
, element
, pad
, pad
);
822 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, pad
);
831 VIA_LOOP (PCB
->Data
);
833 if (TEST_FLAG (FOUNDFLAG
, via
) && !TEST_FLAG (LOCKFLAG
, via
))
835 AddObjectToFlagUndoList (VIA_TYPE
, via
, via
, via
);
836 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, via
);
846 #if defined(HAVE_REGCOMP) || defined(HAVE_RE_COMP)
847 /* ---------------------------------------------------------------------------
848 * selects objects as defined by Type by name;
849 * it's a case insensitive match
850 * returns True if any object has been selected
853 #if defined (HAVE_REGCOMP)
855 regexec_match_all (const regex_t
*preg
, const char *string
)
859 if (regexec (preg
, string
, 1, &match
, 0) != 0)
861 if (match
.rm_so
!= 0)
863 if (match
.rm_eo
!= strlen(string
))
870 SelectObjectByName (int Type
, char *Pattern
, Boolean Flag
)
872 Boolean changed
= False
;
874 #if defined(HAVE_REGCOMP)
875 #define REGEXEC(arg) (regexec_match_all(&compiled, (arg)))
880 /* compile the regular expression */
881 result
= regcomp (&compiled
, Pattern
, REG_EXTENDED
| REG_ICASE
);
884 char errorstring
[128];
886 regerror (result
, &compiled
, errorstring
, 128);
887 Message (_("regexp error: %s\n"), errorstring
);
892 #define REGEXEC(arg) (re_exec((arg)) == 1)
896 /* compile the regular expression */
897 if ((compiled
= re_comp (Pattern
)) != NULL
)
899 Message (_("re_comp error: %s\n"), compiled
);
904 /* loop over all visible objects with names */
905 if (Type
& TEXT_TYPE
)
906 ALLTEXT_LOOP (PCB
->Data
);
908 if (!TEST_FLAG (LOCKFLAG
, text
)
909 && TEXT_IS_VISIBLE (PCB
, layer
, text
)
911 && REGEXEC (text
->TextString
)
912 && TEST_FLAG (SELECTEDFLAG
, text
) != Flag
)
914 AddObjectToFlagUndoList (TEXT_TYPE
, layer
, text
, text
);
915 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, text
);
916 DrawText (layer
, text
, 0);
922 if (PCB
->ElementOn
&& (Type
& ELEMENT_TYPE
))
923 ELEMENT_LOOP (PCB
->Data
);
925 if (!TEST_FLAG (LOCKFLAG
, element
)
926 && ((TEST_FLAG (ONSOLDERFLAG
, element
) != 0) == SWAP_IDENT
927 || PCB
->InvisibleObjectsOn
)
928 && TEST_FLAG (SELECTEDFLAG
, element
) != Flag
)
930 String name
= ELEMENT_NAME (PCB
, element
);
931 if (name
&& REGEXEC (name
))
933 AddObjectToFlagUndoList (ELEMENT_TYPE
, element
, element
, element
);
934 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, element
);
937 AddObjectToFlagUndoList (PIN_TYPE
, element
, pin
, pin
);
938 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, pin
);
943 AddObjectToFlagUndoList (PAD_TYPE
, element
, pad
, pad
);
944 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, pad
);
947 ELEMENTTEXT_LOOP (element
);
949 AddObjectToFlagUndoList (ELEMENTNAME_TYPE
, element
, text
, text
);
950 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, text
);
953 DrawElementName (element
, 0);
954 DrawElement (element
, 0);
960 if (PCB
->PinOn
&& (Type
& PIN_TYPE
))
961 ALLPIN_LOOP (PCB
->Data
);
963 if (!TEST_FLAG (LOCKFLAG
, element
)
964 && pin
->Name
&& REGEXEC (pin
->Name
)
965 && TEST_FLAG (SELECTEDFLAG
, pin
) != Flag
)
967 AddObjectToFlagUndoList (PIN_TYPE
, element
, pin
, pin
);
968 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, pin
);
974 if (PCB
->PinOn
&& (Type
& PAD_TYPE
))
975 ALLPAD_LOOP (PCB
->Data
);
977 if (!TEST_FLAG (LOCKFLAG
, element
)
978 && ((TEST_FLAG (ONSOLDERFLAG
, pad
) != 0) == SWAP_IDENT
979 || PCB
->InvisibleObjectsOn
)
980 && TEST_FLAG (SELECTEDFLAG
, pad
) != Flag
)
981 if (pad
->Name
&& REGEXEC (pad
->Name
))
983 AddObjectToFlagUndoList (PAD_TYPE
, element
, pad
, pad
);
984 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, pad
);
990 if (PCB
->ViaOn
&& (Type
& VIA_TYPE
))
991 VIA_LOOP (PCB
->Data
);
993 if (!TEST_FLAG (LOCKFLAG
, via
)
995 && REGEXEC (via
->Name
) && TEST_FLAG (SELECTEDFLAG
, via
) != Flag
)
997 AddObjectToFlagUndoList (VIA_TYPE
, via
, via
, via
);
998 ASSIGN_FLAG (SELECTEDFLAG
, Flag
, via
);
1005 #if defined(HAVE_REGCOMP)
1007 regfree (&compiled
);
1013 IncrementUndoSerialNumber ();
1018 #endif /* defined(HAVE_REGCOMP) || defined(HAVE_RE_COMP) */