KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcbnew/dialogs/dialog_global_edit_text_and_graphics.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 1992-2024 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include <string_utils.h>
26#include <board_commit.h>
27#include <pcb_edit_frame.h>
30#include <board.h>
32#include <footprint.h>
33#include <pcb_group.h>
34#include <pcb_dimension.h>
35#include <pcb_shape.h>
36#include <pcb_text.h>
37#include <widgets/unit_binder.h>
38#include <widgets/font_choice.h>
39#include <tool/tool_manager.h>
43
44// Columns of layer classes grid
45enum
46{
54};
55
56enum
57{
65};
66
67
69static bool g_modifyValues;
76static bool g_filterByLayer;
77static int g_layerFilter;
79static wxString g_referenceFilter;
81static wxString g_footprintFilter;
82static bool g_filterSelected = false;
83static bool g_setToSpecifiedValues = true;
84
85
87{
92
97
98public:
101
102protected:
103 void onActionButtonChange( wxCommandEvent& event ) override;
104 void onSpecifiedValueUpdateUI( wxUpdateUIEvent& event ) override;
105 void onDimensionItemCheckbox( wxCommandEvent& aEvent ) override;
106
107 void OnLayerFilterSelect( wxCommandEvent& event ) override
108 {
109 m_layerFilterOpt->SetValue( true );
110 }
111 void OnReferenceFilterText( wxCommandEvent& event ) override
112 {
113 m_referenceFilterOpt->SetValue( true );
114 }
115 void OnFootprintFilterText( wxCommandEvent& event ) override
116 {
117 m_footprintFilterOpt->SetValue( true );
118 }
119
120 bool TransferDataToWindow() override;
121 bool TransferDataFromWindow() override;
122
123 void visitItem( BOARD_COMMIT& aCommit, BOARD_ITEM* aItem );
124 void processItem( BOARD_COMMIT& aCommit, BOARD_ITEM* aItem );
125};
126
127
130 m_lineWidth( parent, m_lineWidthLabel, m_LineWidthCtrl, m_lineWidthUnits ),
131 m_textWidth( parent, m_SizeXlabel, m_SizeXCtrl, m_SizeXunit ),
132 m_textHeight( parent, m_SizeYlabel, m_SizeYCtrl, m_SizeYunit ),
133 m_thickness( parent, m_ThicknessLabel, m_ThicknessCtrl, m_ThicknessUnit )
134{
135 m_parent = parent;
136 m_brdSettings = &m_parent->GetDesignSettings();
137 m_isBoardEditor = dynamic_cast<PCB_EDIT_FRAME*>( m_parent ) != nullptr;
138
139 if( !m_isBoardEditor )
140 {
141 m_otherFootprintTexts->SetLabel( _( "Other footprint text items" ) );
142 m_footprintGraphics->SetLabel( _( "Graphic items" ) );
143 m_footprintDimensions->SetLabel( _( "Dimension items" ) );
144
145 m_boardText->Show( false );
146 m_boardGraphics->Show( false );
147
148 m_referenceFilterOpt->Show( false );
149 m_referenceFilter->Show( false );
150 m_footprintFilterOpt->Show( false );
151 m_footprintFilter->Show( false );
152 }
153
157
162
163 m_grid->SetCellHighlightPenWidth( 0 );
164 m_grid->SetDefaultCellFont( KIUI::GetInfoFont( this ) );
165
166 if( g_setToSpecifiedValues == true )
167 m_setToSpecifiedValues->SetValue( true );
168 else
169 m_setToLayerDefaults->SetValue( true );
170
171 SetupStandardButtons( { { wxID_OK, _( "Apply and Close" ) },
172 { wxID_CANCEL, _( "Close" ) } } );
173
175}
176
177
179{
180 g_modifyReferences = m_references->GetValue();
181 g_modifyValues = m_values->GetValue();
186
187 if( m_isBoardEditor )
188 {
189 g_modifyBoardText = m_boardText->GetValue();
191 }
192
193 g_filterByLayer = m_layerFilterOpt->GetValue();
195
196 if( m_isBoardEditor )
197 {
202 }
203
206}
207
208
210{
212 m_selection = selTool->GetSelection();
213
214 m_references->SetValue( g_modifyReferences );
215 m_values->SetValue( g_modifyValues );
220
221 if( m_isBoardEditor )
222 {
223 m_boardText->SetValue( g_modifyBoardText );
225 }
226
227 if( m_layerFilter->SetLayerSelection( g_layerFilter ) != wxNOT_FOUND )
229
230 if( m_isBoardEditor )
231 {
232 // SetValue() generates events, ChangeValue() does not
233 m_referenceFilter->ChangeValue( g_referenceFilter );
235 m_footprintFilter->ChangeValue( g_footprintFilter );
237 }
238
240
242
244 m_fontCtrl->SetStringSelection( INDETERMINATE_ACTION );
245
249 m_bold->Set3StateValue( wxCHK_UNDETERMINED );
250 m_italic->Set3StateValue( wxCHK_UNDETERMINED );
251 m_keepUpright->Set3StateValue( wxCHK_UNDETERMINED );
252 m_visible->Set3StateValue( wxCHK_UNDETERMINED );
254
255 wxCommandEvent dummy;
257
258#define SET_INT_VALUE( aRow, aCol, aValue ) \
259 m_grid->SetCellValue( aRow, aCol, m_parent->StringFromValue( aValue, true ) )
260
261#define SET_BOOL_VALUE( aRow, aCol, aValue ) \
262 attr = new wxGridCellAttr; \
263 attr->SetRenderer( new wxGridCellBoolRenderer() ); \
264 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER ); \
265 attr->SetReadOnly(); \
266 m_grid->SetAttr( aRow, aCol, attr ); \
267 m_grid->SetCellValue( aRow, aCol, ( aValue ) ? wxT( "1" ) : wxT( "" ) )
268
269 const BOARD_DESIGN_SETTINGS& bds = m_parent->GetBoard()->GetDesignSettings();
270 wxGridCellAttr* attr;
271
272 m_grid->SetCellValue( ROW_SILK, COL_CLASS_NAME, _( "Silk Layers" ) );
273 m_grid->SetCellValue( ROW_COPPER, COL_CLASS_NAME, _( "Copper Layers" ) );
274 m_grid->SetCellValue( ROW_EDGES, COL_CLASS_NAME, _( "Edge Cuts" ) );
275 m_grid->SetCellValue( ROW_COURTYARD, COL_CLASS_NAME, _( "Courtyards" ) );
276 m_grid->SetCellValue( ROW_FAB, COL_CLASS_NAME, _( "Fab Layers" ) );
277 m_grid->SetCellValue( ROW_OTHERS, COL_CLASS_NAME, _( "Other Layers" ) );
278
279 m_grid->SetCellValue( ROW_HEADER, COL_LINE_THICKNESS, _( "Line Thickness" ) );
286
287 m_grid->SetCellValue( ROW_HEADER, COL_TEXT_WIDTH, _( "Text Width" ) );
292
293 m_grid->SetCellValue( ROW_HEADER, COL_TEXT_HEIGHT, _( "Text Height" ) );
298
299 m_grid->SetCellValue( ROW_HEADER, COL_TEXT_THICKNESS, _( "Text Thickness" ) );
304
305 m_grid->SetCellValue( ROW_HEADER, COL_TEXT_ITALIC, _( "Italic" ) );
310
311 m_grid->SetCellValue( ROW_HEADER, COL_TEXT_UPRIGHT, _( "Upright" ) );
316
317 return true;
318
319#undef SET_INT_VALUE
320#undef SET_BOOL_VALUE
321}
322
323
325{
326 // Update the UNIT_BINDER controls if the action to take is changed
327 bool enable = m_setToSpecifiedValues->GetValue();
328
329 m_LayerLabel->Enable( enable );
330 m_LayerCtrl->Enable( enable );
331
332 m_lineWidth.Enable( enable );
333 m_textWidth.Enable( enable );
334 m_textHeight.Enable( enable );
335 m_thickness.Enable( enable );
336
337 m_fontLabel->Enable( enable );
338 m_fontCtrl->Enable( enable );
339
340 m_centerOnFP->Enable( enable );
341
342 enable = !enable;
343 m_grid->Enable( enable );
344}
345
346
348{
349 // Update the UI for the elements inside the use specified values sizer
350 event.Enable( m_setToSpecifiedValues->GetValue() );
351}
352
353
355{
356 if( m_footprintDimensions->GetValue() || m_boardDimensions->GetValue() )
357 m_setToLayerDefaults->SetLabel( _( "Set to layer and dimension default values:" ) );
358 else
359 m_setToLayerDefaults->SetLabel( _( "Set to layer default values:" ) );
360}
361
362
364{
365 aCommit.Modify( aItem );
366
367 PCB_TEXT* text = dynamic_cast<PCB_TEXT*>( aItem );
368 PCB_SHAPE* shape = dynamic_cast<PCB_SHAPE*>( aItem );
369 PCB_DIMENSION_BASE* dimension = dynamic_cast<PCB_DIMENSION_BASE*>( aItem );
370 FOOTPRINT* parentFP = aItem->GetParentFootprint();
371
372 if( m_setToSpecifiedValues->GetValue() )
373 {
376
377 if( text )
378 {
380 text->SetTextSize( VECTOR2I( m_textWidth.GetValue(), text->GetTextSize().y ) );
381
383 text->SetTextSize( VECTOR2I( text->GetTextSize().x, m_textHeight.GetValue() ) );
384
386 text->SetTextThickness( m_thickness.GetValue() );
387
388 // Must be after SetTextSize()
389 if( m_bold->Get3StateValue() != wxCHK_UNDETERMINED )
390 text->SetBold( m_bold->GetValue() );
391
392 if( m_italic->Get3StateValue() != wxCHK_UNDETERMINED )
393 text->SetItalic( m_italic->GetValue() );
394
395 // Must come after setting bold & italic
396 if( m_fontCtrl->GetStringSelection() != INDETERMINATE_ACTION )
397 {
398 text->SetFont( m_fontCtrl->GetFontSelection( text->IsBold(), text->IsItalic() ) );
399 }
400 else if(( m_italic->Get3StateValue() != wxCHK_UNDETERMINED
401 || m_bold->Get3StateValue() != wxCHK_UNDETERMINED ) )
402 {
403 wxString fontName = text->GetFontName();
404
405 if( !text->GetFontName().IsEmpty() )
406 {
407 text->SetFont( KIFONT::FONT::GetFont( text->GetFontName(), text->IsBold(),
408 text->IsItalic(),
409 m_parent->GetBoard()->GetEmbeddedFiles()->GetFontFiles() ) );
410 }
411 }
412
413 if( parentFP )
414 {
415 if( m_visible->Get3StateValue() != wxCHK_UNDETERMINED )
416 text->SetVisible( m_visible->GetValue() );
417
418 if( m_keepUpright->Get3StateValue() != wxCHK_UNDETERMINED )
419 text->SetKeepUpright( m_keepUpright->GetValue() );
420
421 if( m_centerOnFP->GetValue() == wxCHK_CHECKED )
422 text->SetTextPos( text->GetParent()->GetCenter() );
423 }
424 }
425
427 {
428 if( shape )
429 {
430 STROKE_PARAMS stroke = shape->GetStroke();
431 stroke.SetWidth( m_lineWidth.GetValue() );
432 shape->SetStroke( stroke );
433 }
434
435 if( dimension )
436 dimension->SetLineThickness( m_lineWidth.GetValue() );
437 }
438 }
439 else
440 {
441 PCB_LAYER_ID layer = aItem->GetLayer();
442
443 if( text )
444 {
445 text->SetTextSize( m_brdSettings->GetTextSize( layer ) );
446 text->SetTextThickness( m_brdSettings->GetTextThickness( layer ) );
447 text->SetItalic( m_brdSettings->GetTextItalic( layer ) );
448
449 if( parentFP )
450 text->SetKeepUpright( m_brdSettings->GetTextUpright( layer ) );
451 }
452
453 if( shape )
454 {
455 STROKE_PARAMS stroke = shape->GetStroke();
456 stroke.SetWidth( m_brdSettings->GetLineThickness( layer ) );
457 shape->SetStroke( stroke );
458 }
459
460 if( dimension )
461 {
462 dimension->SetLineThickness( m_brdSettings->GetLineThickness( layer ) );
469 dimension->Update(); // refresh text & geometry
470 }
471 }
472}
473
474
476{
477 if( m_selectedItemsFilter->GetValue() )
478 {
479 BOARD_ITEM* candidate = aItem;
480
481 if( !candidate->IsSelected() )
482 {
483 if( candidate->GetParent() && candidate->GetParent()->Type() == PCB_FOOTPRINT_T )
484 candidate = candidate->GetParent();
485 }
486
487 if( !candidate->IsSelected() )
488 {
489 candidate = candidate->GetParentGroup();
490
491 while( candidate && !candidate->IsSelected() )
492 candidate = candidate->GetParentGroup();
493
494 if( !candidate )
495 return;
496 }
497 }
498
500 {
501 if( aItem->GetLayer() != m_layerFilter->GetLayerSelection() )
502 return;
503 }
504
505 if( m_isBoardEditor )
506 {
507 if( m_referenceFilterOpt->GetValue() && !m_referenceFilter->GetValue().IsEmpty() )
508 {
509 if( FOOTPRINT* fp = aItem->GetParentFootprint() )
510 {
511 if( !WildCompareString( m_referenceFilter->GetValue(), fp->GetReference(), false ) )
512 return;
513 }
514 }
515
516 if( m_footprintFilterOpt->GetValue() && !m_footprintFilter->GetValue().IsEmpty() )
517 {
518 if( FOOTPRINT* fp = aItem->GetParentFootprint() )
519 {
520 if( !WildCompareString( m_footprintFilter->GetValue(), fp->GetFPID().Format(), false ) )
521 return;
522 }
523 }
524 }
525
526 processItem( aCommit, aItem );
527}
528
529
531{
532 int minTextSize = pcbIUScale.mmToIU( TEXT_MIN_SIZE_MM );
533 int maxTextSize = pcbIUScale.mmToIU( TEXT_MAX_SIZE_MM );
534
535 if( !m_textWidth.Validate( minTextSize, maxTextSize )
536 || !m_textHeight.Validate( minTextSize, maxTextSize ) )
537 {
538 return false;
539 }
540
541 BOARD_COMMIT commit( m_parent );
542
543 // Go through the footprints
544 for( FOOTPRINT* fp : m_parent->GetBoard()->Footprints() )
545 {
546 if( m_references->GetValue() )
547 visitItem( commit, &fp->Reference() );
548
549 if( m_values->GetValue() )
550 visitItem( commit, &fp->Value() );
551
552 if( m_footprintFields->GetValue() )
553 {
554 for( PCB_FIELD* field : fp->GetFields() )
555 {
556 if( field->IsReference() )
557 continue;
558
559 if( field->IsValue() )
560 continue;
561
562 visitItem( commit, field );
563 }
564 }
565
566 // Go through all other footprint items
567 for( BOARD_ITEM* boardItem : fp->GraphicalItems() )
568 {
569 KICAD_T itemType = boardItem->Type();
570
571 if( itemType == PCB_TEXT_T || itemType == PCB_TEXTBOX_T )
572 {
573 if( m_otherFootprintTexts->GetValue() )
574 visitItem( commit, boardItem );
575 }
576 else if( BaseType( itemType ) == PCB_DIMENSION_T )
577 {
578 if( m_footprintDimensions->GetValue() )
579 visitItem( commit, boardItem );
580 }
581 else if( itemType == PCB_SHAPE_T )
582 {
583 if( m_footprintGraphics->GetValue() )
584 visitItem( commit, boardItem );
585 }
586 }
587 }
588
589 if( m_isBoardEditor )
590 {
591 // Go through the PCB text & graphic items
592 for( BOARD_ITEM* boardItem : m_parent->GetBoard()->Drawings() )
593 {
594 KICAD_T itemType = boardItem->Type();
595
596 if( itemType == PCB_TEXT_T || itemType == PCB_TEXTBOX_T )
597 {
598 if( m_boardText->GetValue() )
599 visitItem( commit, boardItem );
600 }
601 else if( BaseType( itemType ) == PCB_DIMENSION_T )
602 {
603 if( m_boardDimensions->GetValue() )
604 visitItem( commit, boardItem );
605 }
606 else if( itemType == PCB_SHAPE_T || BaseType( itemType ) == PCB_DIMENSION_T )
607 {
608 if( m_boardGraphics->GetValue() )
609 visitItem( commit, boardItem );
610 }
611 }
612 }
613
614 commit.Push( _( "Edit Text and Graphics" ) );
616
617 return true;
618}
619
620
622{
623 PCB_EDIT_FRAME* editFrame = getEditFrame<PCB_EDIT_FRAME>();
625
626 dlg.ShowModal();
627 return 0;
628}
629
630
632{
633 FOOTPRINT_EDIT_FRAME* editFrame = getEditFrame<FOOTPRINT_EDIT_FRAME>();
635
636 dlg.ShowModal();
637 return 0;
638}
639
640
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
@ LAYER_CLASS_OTHERS
@ LAYER_CLASS_FAB
@ LAYER_CLASS_COURTYARD
@ LAYER_CLASS_SILK
@ LAYER_CLASS_COPPER
@ LAYER_CLASS_EDGES
Container for design settings for a BOARD object.
DIM_PRECISION m_DimensionPrecision
Number of digits after the decimal.
DIM_UNITS_FORMAT m_DimensionUnitsFormat
bool GetTextUpright(PCB_LAYER_ID aLayer) const
int GetTextThickness(PCB_LAYER_ID aLayer) const
Return the default text thickness from the layer class for the given layer.
bool m_TextUpright[LAYER_CLASS_COUNT]
bool GetTextItalic(PCB_LAYER_ID aLayer) const
int m_TextThickness[LAYER_CLASS_COUNT]
int m_LineThickness[LAYER_CLASS_COUNT]
VECTOR2I GetTextSize(PCB_LAYER_ID aLayer) const
Return the default text size from the layer class for the given layer.
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
VECTOR2I m_TextSize[LAYER_CLASS_COUNT]
bool m_TextItalic[LAYER_CLASS_COUNT]
DIM_TEXT_POSITION m_DimensionTextPosition
DIM_UNITS_MODE m_DimensionUnitsMode
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:79
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:237
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:90
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:288
FOOTPRINT * GetParentFootprint() const
Definition: board_item.cpp:298
BOARD_ITEM_CONTAINER * GetParent() const
Definition: board_item.h:215
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
Definition: commit.h:105
void processItem(SCH_COMMIT *aCommit, const SCH_SHEET_PATH &aSheetPath, SCH_ITEM *aItem)
void visitItem(SCH_COMMIT *aCommit, const SCH_SHEET_PATH &aSheetPath, SCH_ITEM *aItem)
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
int ShowModal() override
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:101
bool IsSelected() const
Definition: eda_item.h:110
KIFONT::FONT * GetFontSelection(bool aBold, bool aItalic, bool aForDrawingSheet=false) const
static FONT * GetFont(const wxString &aFontName=wxEmptyString, bool aBold=false, bool aItalic=false, const std::vector< wxString > *aEmbeddedFiles=nullptr, bool aForDrawingSheet=false)
Definition: font.cpp:146
int SetLayerSelection(int layer)
bool SetLayersHotkeys(bool value)
Common, abstract interface for edit frames.
Abstract dimension API.
void Update()
Update the dimension's cached text and geometry.
void SetUnitsFormat(const DIM_UNITS_FORMAT aFormat)
void SetSuppressZeroes(bool aSuppress)
void SetTextPositionMode(DIM_TEXT_POSITION aMode)
void SetLineThickness(int aWidth)
void SetPrecision(DIM_PRECISION aPrecision)
void SetUnitsMode(DIM_UNITS_MODE aMode)
void SetKeepTextAligned(bool aKeepAligned)
The main frame for Pcbnew.
void SetBoardFrame(PCB_BASE_FRAME *aFrame)
void SetUndefinedLayerName(const wxString &aName)
The selection tool: currently supports:
PCB_SELECTION & GetSelection()
STROKE_PARAMS GetStroke() const override
Definition: pcb_shape.h:89
void SetStroke(const STROKE_PARAMS &aStroke) override
Definition: pcb_shape.h:90
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
Simple container to manage line stroke parameters.
Definition: stroke_params.h:79
void SetWidth(int aWidth)
Definition: stroke_params.h:90
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
Generic, UI-independent tool event.
Definition: tool_event.h:167
virtual long long int GetValue()
Return the current value in Internal Units.
void Enable(bool aEnable)
Enable/disable the label, widget and units label.
bool IsIndeterminate() const
Return true if the control holds the indeterminate value (for instance, if it represents a multiple s...
virtual bool Validate(double aMin, double aMax, EDA_UNITS aUnits=EDA_UNITS::UNSCALED)
Validate the control against the given range, informing the user of any errors found.
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
#define _(s)
#define TEXT_MIN_SIZE_MM
Minimum text size (1 micron).
Definition: eda_text.h:47
#define TEXT_MAX_SIZE_MM
Maximum text size in mm (~10 inches)
Definition: eda_text.h:48
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ UNDEFINED_LAYER
Definition: layer_ids.h:61
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:820
KICOMMON_API wxFont GetInfoFont(wxWindow *aWindow)
Definition: ui_common.cpp:154
Class to handle a set of BOARD_ITEMs.
#define SET_INT_VALUE(aRow, aCol, aValue)
#define SET_BOOL_VALUE(aRow, aCol, aValue)
std::vector< FAB_LAYER_COLOR > dummy
bool WildCompareString(const wxString &pattern, const wxString &string_to_tst, bool case_sensitive)
Compare a string against wild card (* and ?) pattern using the usual rules.
constexpr int mmToIU(double mm) const
Definition: base_units.h:88
constexpr KICAD_T BaseType(const KICAD_T aType)
Return the underlying type of the given type.
Definition: typeinfo.h:249
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:78
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:88
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition: typeinfo.h:93
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition: typeinfo.h:92
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition: typeinfo.h:86
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
Definition: typeinfo.h:100
#define INDETERMINATE_ACTION
Definition: ui_common.h:47