static void draw_element_name (ElementType *element) { if ((TEST_FLAG (HIDENAMESFLAG, PCB) && gui->gui) || TEST_FLAG (HIDENAMEFLAG, element)) return; if (doing_pinout || doing_assy) gui->graphics->set_color (Output.fgGC, PCB->ElementColor); else if (TEST_FLAG (SELECTEDFLAG, &ELEMENT_TEXT (PCB, element))) gui->graphics->set_color (Output.fgGC, PCB->ElementSelectedColor); else if (FRONT (element)) gui->graphics->set_color (Output.fgGC, PCB->ElementColor); else gui->graphics->set_color (Output.fgGC, PCB->InvisibleObjectsColor); gui->graphics->draw_pcb_text (Output.fgGC, &ELEMENT_TEXT (PCB, element), PCB->minSlk); }
/* --------------------------------------------------------------------------- * erases the name of an element */ void EraseElementName (ElementType *Element) { if (TEST_FLAG (HIDENAMEFLAG, Element)) return; DrawText (NULL, &ELEMENT_TEXT (PCB, Element)); }
/* ---------------------------------------------------------------------- * performs several operations on selected objects which are also visible * The lowlevel procedures are passed together with additional information * resets the selected flag if requested * returns true if anything has changed */ bool SelectedOperation (ObjectFunctionTypePtr F, bool Reset, int type) { bool changed = false; /* check lines */ if (type & LINE_TYPE && F->Line) VISIBLELINE_LOOP (PCB->Data); { if (TEST_FLAG (SELECTEDFLAG, line)) { if (Reset) { AddObjectToFlagUndoList (LINE_TYPE, layer, line, line); CLEAR_FLAG (SELECTEDFLAG, line); } F->Line (layer, line); changed = true; } } ENDALL_LOOP; /* check arcs */ if (type & ARC_TYPE && F->Arc) VISIBLEARC_LOOP (PCB->Data); { if (TEST_FLAG (SELECTEDFLAG, arc)) { if (Reset) { AddObjectToFlagUndoList (ARC_TYPE, layer, arc, arc); CLEAR_FLAG (SELECTEDFLAG, arc); } F->Arc (layer, arc); changed = true; } } ENDALL_LOOP; /* check text */ if (type & TEXT_TYPE && F->Text) ALLTEXT_LOOP (PCB->Data); { if (TEST_FLAG (SELECTEDFLAG, text) && TEXT_IS_VISIBLE (PCB, layer, text)) { if (Reset) { AddObjectToFlagUndoList (TEXT_TYPE, layer, text, text); CLEAR_FLAG (SELECTEDFLAG, text); } F->Text (layer, text); changed = true; } } ENDALL_LOOP; /* check polygons */ if (type & POLYGON_TYPE && F->Polygon) VISIBLEPOLYGON_LOOP (PCB->Data); { if (TEST_FLAG (SELECTEDFLAG, polygon)) { if (Reset) { AddObjectToFlagUndoList (POLYGON_TYPE, layer, polygon, polygon); CLEAR_FLAG (SELECTEDFLAG, polygon); } F->Polygon (layer, polygon); changed = true; } } ENDALL_LOOP; /* elements silkscreen */ if (type & ELEMENT_TYPE && PCB->ElementOn && F->Element) ELEMENT_LOOP (PCB->Data); { if (TEST_FLAG (SELECTEDFLAG, element)) { if (Reset) { AddObjectToFlagUndoList (ELEMENT_TYPE, element, element, element); CLEAR_FLAG (SELECTEDFLAG, element); } F->Element (element); changed = true; } } END_LOOP; if (type & ELEMENTNAME_TYPE && PCB->ElementOn && F->ElementName) ELEMENT_LOOP (PCB->Data); { if (TEST_FLAG (SELECTEDFLAG, &ELEMENT_TEXT (PCB, element))) { if (Reset) { AddObjectToFlagUndoList (ELEMENTNAME_TYPE, element, &ELEMENT_TEXT (PCB, element), &ELEMENT_TEXT (PCB, element)); CLEAR_FLAG (SELECTEDFLAG, &ELEMENT_TEXT (PCB, element)); } F->ElementName (element); changed = true; } } END_LOOP; if (type & PIN_TYPE && PCB->PinOn && F->Pin) ELEMENT_LOOP (PCB->Data); { PIN_LOOP (element); { if (TEST_FLAG (SELECTEDFLAG, pin)) { if (Reset) { AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); CLEAR_FLAG (SELECTEDFLAG, pin); } F->Pin (element, pin); changed = true; } } END_LOOP; } END_LOOP; if (type & PAD_TYPE && PCB->PinOn && F->Pad) ELEMENT_LOOP (PCB->Data); { PAD_LOOP (element); { if (TEST_FLAG (SELECTEDFLAG, pad)) { if (Reset) { AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); CLEAR_FLAG (SELECTEDFLAG, pad); } F->Pad (element, pad); changed = true; } } END_LOOP; } END_LOOP; /* process vias */ if (type & VIA_TYPE && PCB->ViaOn && F->Via) VIA_LOOP (PCB->Data); { if (TEST_FLAG (SELECTEDFLAG, via)) { if (Reset) { AddObjectToFlagUndoList (VIA_TYPE, via, via, via); CLEAR_FLAG (SELECTEDFLAG, via); } F->Via (via); changed = true; } } END_LOOP; /* and rat-lines */ if (type & RATLINE_TYPE && PCB->RatOn && F->Rat) RAT_LOOP (PCB->Data); { if (TEST_FLAG (SELECTEDFLAG, line)) { if (Reset) { AddObjectToFlagUndoList (RATLINE_TYPE, line, line, line); CLEAR_FLAG (SELECTEDFLAG, line); } F->Rat (line); changed = true; } } END_LOOP; if (Reset && changed) IncrementUndoSerialNumber (); return (changed); }
/* ---------------------------------------------------------------------- * selects/unselects all visible objects within the passed box * Flag determines if the block is to be selected or unselected * returns true if the state of any object has changed */ bool SelectBlock (BoxTypePtr Box, bool Flag) { bool changed = false; if (PCB->RatOn || !Flag) RAT_LOOP (PCB->Data); { if (LINE_IN_BOX ((LineTypePtr) line, Box) && !TEST_FLAG (LOCKFLAG, line) && TEST_FLAG (SELECTEDFLAG, line) != Flag) { AddObjectToFlagUndoList (RATLINE_TYPE, line, line, line); ASSIGN_FLAG (SELECTEDFLAG, Flag, line); if (PCB->RatOn) DrawRat (line, 0); changed = true; } } END_LOOP; /* check layers */ LAYER_LOOP(PCB->Data, max_copper_layer + 2); { if (layer == & PCB->Data->SILKLAYER) { if (! (PCB->ElementOn || !Flag)) continue; } else if (layer == & PCB->Data->BACKSILKLAYER) { if (! (PCB->InvisibleObjectsOn || !Flag)) continue; } else if (! (layer->On || !Flag)) continue; LINE_LOOP (layer); { if (LINE_IN_BOX (line, Box) && !TEST_FLAG (LOCKFLAG, line) && TEST_FLAG (SELECTEDFLAG, line) != Flag) { AddObjectToFlagUndoList (LINE_TYPE, layer, line, line); ASSIGN_FLAG (SELECTEDFLAG, Flag, line); if (layer->On) DrawLine (layer, line, 0); changed = true; } } END_LOOP; ARC_LOOP (layer); { if (ARC_IN_BOX (arc, Box) && !TEST_FLAG (LOCKFLAG, arc) && TEST_FLAG (SELECTEDFLAG, arc) != Flag) { AddObjectToFlagUndoList (ARC_TYPE, layer, arc, arc); ASSIGN_FLAG (SELECTEDFLAG, Flag, arc); if (layer->On) DrawArc (layer, arc, 0); changed = true; } } END_LOOP; TEXT_LOOP (layer); { if (!Flag || TEXT_IS_VISIBLE(PCB, layer, text)) { if (TEXT_IN_BOX (text, Box) && !TEST_FLAG (LOCKFLAG, text) && TEST_FLAG (SELECTEDFLAG, text) != Flag) { AddObjectToFlagUndoList (TEXT_TYPE, layer, text, text); ASSIGN_FLAG (SELECTEDFLAG, Flag, text); if (TEXT_IS_VISIBLE(PCB, layer, text)) DrawText (layer, text, 0); changed = true; } } } END_LOOP; POLYGON_LOOP (layer); { if (POLYGON_IN_BOX (polygon, Box) && !TEST_FLAG (LOCKFLAG, polygon) && TEST_FLAG (SELECTEDFLAG, polygon) != Flag) { AddObjectToFlagUndoList (POLYGON_TYPE, layer, polygon, polygon); ASSIGN_FLAG (SELECTEDFLAG, Flag, polygon); if (layer->On) DrawPolygon (layer, polygon, 0); changed = true; } } END_LOOP; } END_LOOP; /* elements */ ELEMENT_LOOP (PCB->Data); { { bool gotElement = false; if ((PCB->ElementOn || !Flag) && !TEST_FLAG (LOCKFLAG, element) && ((TEST_FLAG (ONSOLDERFLAG, element) != 0) == SWAP_IDENT || PCB->InvisibleObjectsOn)) { if (BOX_IN_BOX (&ELEMENT_TEXT (PCB, element).BoundingBox, Box) && !TEST_FLAG (LOCKFLAG, &ELEMENT_TEXT (PCB, element)) && TEST_FLAG (SELECTEDFLAG, &ELEMENT_TEXT (PCB, element)) != Flag) { /* select all names of element */ ELEMENTTEXT_LOOP (element); { AddObjectToFlagUndoList (ELEMENTNAME_TYPE, element, text, text); ASSIGN_FLAG (SELECTEDFLAG, Flag, text); } END_LOOP; if (PCB->ElementOn) DrawElementName (element, 0); changed = true; } if ((PCB->PinOn || !Flag) && ELEMENT_IN_BOX (element, Box)) if (TEST_FLAG (SELECTEDFLAG, element) != Flag) { AddObjectToFlagUndoList (ELEMENT_TYPE, element, element, element); ASSIGN_FLAG (SELECTEDFLAG, Flag, element); PIN_LOOP (element); { if (TEST_FLAG (SELECTEDFLAG, pin) != Flag) { AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); ASSIGN_FLAG (SELECTEDFLAG, Flag, pin); if (PCB->PinOn) DrawPin (pin, 0); changed = true; } } END_LOOP; PAD_LOOP (element); { if (TEST_FLAG (SELECTEDFLAG, pad) != Flag) { AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); ASSIGN_FLAG (SELECTEDFLAG, Flag, pad); if (PCB->PinOn) DrawPad (pad, 0); changed = true; } } END_LOOP; if (PCB->PinOn) DrawElement (element, 0); changed = true; gotElement = true; } } if ((PCB->PinOn || !Flag) && !TEST_FLAG (LOCKFLAG, element) && !gotElement) { PIN_LOOP (element); { if ((VIA_OR_PIN_IN_BOX (pin, Box) && TEST_FLAG (SELECTEDFLAG, pin) != Flag)) { AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); ASSIGN_FLAG (SELECTEDFLAG, Flag, pin); if (PCB->PinOn) DrawPin (pin, 0); changed = true; } } END_LOOP; PAD_LOOP (element); { if (PAD_IN_BOX (pad, Box) && TEST_FLAG (SELECTEDFLAG, pad) != Flag) { AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); ASSIGN_FLAG (SELECTEDFLAG, Flag, pad); if (PCB->PinOn) DrawPad (pad, 0); changed = true; } } END_LOOP; } } } END_LOOP; /* end with vias */ if (PCB->ViaOn || !Flag) VIA_LOOP (PCB->Data); { if (VIA_OR_PIN_IN_BOX (via, Box) && !TEST_FLAG (LOCKFLAG, via) && TEST_FLAG (SELECTEDFLAG, via) != Flag) { AddObjectToFlagUndoList (VIA_TYPE, via, via, via); ASSIGN_FLAG (SELECTEDFLAG, Flag, via); if (PCB->ViaOn) DrawVia (via, 0); changed = true; } } END_LOOP; if (changed) { Draw (); IncrementUndoSerialNumber (); } return (changed); }