KiCad PCB EDA Suite
eeschema/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) 2019-2021 KiCad Developers, see AUTHORS.txt for contributors.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you may find one here:
18  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19  * or you may search the http://www.gnu.org website for the version 2 license,
20  * or you may write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23 
24 #include <connection_graph.h>
26 #include <string_utils.h>
27 #include <sch_symbol.h>
28 #include <sch_connection.h>
29 #include <sch_edit_frame.h>
30 #include <sch_line.h>
31 #include <sch_junction.h>
32 #include <sch_sheet.h>
33 #include <schematic.h>
34 #include <advanced_config.h>
35 #include <tool/tool_manager.h>
37 #include <tools/sch_edit_tool.h>
38 #include <widgets/unit_binder.h>
39 
40 static bool g_modifyReferences;
41 static bool g_modifyValues;
42 static bool g_modifyOtherFields;
43 static bool g_modifyWires;
44 static bool g_modifyBuses;
46 static bool g_modifyHierLabels;
47 static bool g_modifySheetTitles;
49 static bool g_modifySheetPins;
52 
53 static bool g_filterByFieldname;
54 static wxString g_fieldnameFilter;
55 static bool g_filterByReference;
56 static wxString g_referenceFilter;
57 static bool g_filterBySymbol;
58 static wxString g_symbolFilter;
59 static bool g_filterByType;
60 static bool g_typeFilterIsPower;
61 static bool g_filterByNet;
62 static wxString g_netFilter;
63 static bool g_filterSelected;
64 
65 
66 #define DEFAULT_STYLE _( "Default" )
67 
69 {
72 
76 
78 
79 public:
82 
83 protected:
84  void OnUpdateUI( wxUpdateUIEvent& event ) override;
85  void OnReferenceFilterText( wxCommandEvent& event ) override
86  {
87  m_referenceFilterOpt->SetValue( true );
88  }
89  void OnSymbolFilterText( wxCommandEvent& event ) override
90  {
91  m_symbolFilterOpt->SetValue( true );
92  }
93 
94  bool TransferDataToWindow() override;
95  bool TransferDataFromWindow() override;
96 
97  void visitItem( const SCH_SHEET_PATH& aSheetPath, SCH_ITEM* aItem );
98  void processItem( const SCH_SHEET_PATH& aSheetPath, SCH_ITEM* aItem );
99 };
100 
101 
104  m_textSize( parent, m_textSizeLabel, m_textSizeCtrl, m_textSizeUnits, true ),
105  m_lineWidth( parent, m_lineWidthLabel, m_LineWidthCtrl, m_lineWidthUnits, true ),
106  m_junctionSize( parent, m_dotSizeLabel, m_dotSizeCtrl, m_dotSizeUnits, true )
107 {
108  m_parent = parent;
109  m_appendUndo = false;
110 
111  // TODO(JE) remove once real-time connectivity is a given
112  if( !ADVANCED_CFG::GetCfg().m_RealTimeConnectivity || !CONNECTION_GRAPH::m_allowRealTime )
114 
115  m_lineStyle->Append( DEFAULT_STYLE );
117 
118  m_colorSwatch->SetSwatchColor( COLOR4D::UNSPECIFIED, false );
119  m_colorSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
120  m_bgColorSwatch->SetSwatchColor( COLOR4D::UNSPECIFIED, false );
121  m_bgColorSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
122  m_dotColorSwatch->SetSwatchColor( COLOR4D::UNSPECIFIED, false );
123  m_dotColorSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
124 
125  m_sdbSizerButtonsOK->SetDefault();
126 
128 }
129 
130 
132 {
133  g_modifyReferences = m_references->GetValue();
134  g_modifyValues = m_values->GetValue();
135  g_modifyOtherFields = m_otherFields->GetValue();
136  g_modifyWires = m_wires->GetValue();
137  g_modifyBuses = m_buses->GetValue();
138  g_modifyGlobalLabels = m_globalLabels->GetValue();
139  g_modifyHierLabels = m_hierLabels->GetValue();
140  g_modifySheetTitles = m_sheetTitles->GetValue();
142  g_modifySheetPins = m_sheetPins->GetValue();
143  g_modifySheetBorders = m_sheetBorders->GetValue();
145 
147  g_fieldnameFilter = m_fieldnameFilter->GetValue();
149  g_referenceFilter = m_referenceFilter->GetValue();
150  g_filterBySymbol = m_symbolFilterOpt->GetValue();
151  g_symbolFilter = m_symbolFilter->GetValue();
152  g_filterByType = m_typeFilterOpt->GetValue();
153  g_typeFilterIsPower = m_typeFilter->GetSelection() == 1;
154  g_filterByNet = m_netFilterOpt->GetValue();
155  g_netFilter = m_netFilter->GetValue();
157 }
158 
159 
161 {
163  m_selection = selectionTool->GetSelection();
164 
165  m_references->SetValue( g_modifyReferences );
166  m_values->SetValue( g_modifyValues );
167  m_otherFields->SetValue( g_modifyOtherFields );
168  m_wires->SetValue( g_modifyWires );
169  m_buses->SetValue( g_modifyBuses );
171  m_hierLabels->SetValue( g_modifyHierLabels );
172  m_sheetTitles->SetValue( g_modifySheetTitles );
174  m_sheetPins->SetValue( g_modifySheetPins );
177 
178  // SetValue() generates events, ChangeValue() does not
179  m_fieldnameFilter->ChangeValue( g_fieldnameFilter );
181  m_referenceFilter->ChangeValue( g_referenceFilter );
183  m_symbolFilter->ChangeValue( g_symbolFilter );
184  m_symbolFilterOpt->SetValue( g_filterBySymbol );
185  m_typeFilter->SetSelection( g_typeFilterIsPower ? 1 : 0 );
186  m_typeFilterOpt->SetValue( g_filterByType );
188 
189  if( g_filterByNet && !g_netFilter.IsEmpty() )
190  {
191  m_netFilter->SetValue( g_netFilter );
192  m_netFilterOpt->SetValue( true );
193  }
194  else if( m_parent->GetHighlightedConnection() )
195  {
197  }
198  else if( m_selection.GetSize() )
199  {
200  SCH_ITEM* sch_item = (SCH_ITEM*) m_selection.Front();
201  SCH_CONNECTION* connection = sch_item->Connection();
202 
203  if( connection )
204  m_netFilter->SetValue( connection->Name() );
205  }
206 
207  m_netFilterOpt->SetValue( g_filterByNet );
208 
210  m_orientation->SetStringSelection( INDETERMINATE_ACTION );
211  m_hAlign->SetStringSelection( INDETERMINATE_ACTION );
212  m_vAlign->SetStringSelection( INDETERMINATE_ACTION );
213  m_Italic->Set3StateValue( wxCHK_UNDETERMINED );
214  m_Bold->Set3StateValue( wxCHK_UNDETERMINED );
215  m_Visible->Set3StateValue( wxCHK_UNDETERMINED );
217  m_lineStyle->SetStringSelection( INDETERMINATE_ACTION );
219  m_setColor->SetValue( false );
220  m_setBgColor->SetValue( false );
221  m_setDotColor->SetValue( false );
222 
223  return true;
224 }
225 
226 
228 {
229 }
230 
231 
233  SCH_ITEM* aItem )
234 {
235  if( m_selectedFilterOpt->GetValue() )
236  {
237  if( !aItem->IsSelected() && ( !aItem->GetParent() || !aItem->GetParent()->IsSelected() ) )
238  return;
239  }
240 
241  EDA_TEXT* eda_text = dynamic_cast<EDA_TEXT*>( aItem );
242  SCH_TEXT* sch_text = dynamic_cast<SCH_TEXT*>( aItem );
243  SCH_LINE* lineItem = dynamic_cast<SCH_LINE*>( aItem );
244  SCH_JUNCTION* junction = dynamic_cast<SCH_JUNCTION*>( aItem );
245 
247  m_appendUndo = true;
248 
249  if( eda_text )
250  {
251  if( !m_textSize.IsIndeterminate() )
252  eda_text->SetTextSize( wxSize( m_textSize.GetValue(), m_textSize.GetValue() ) );
253 
254  if( m_hAlign->GetStringSelection() != INDETERMINATE_ACTION )
255  eda_text->SetHorizJustify( EDA_TEXT::MapHorizJustify( m_hAlign->GetSelection() - 1 ) );
256 
257  if( m_vAlign->GetStringSelection() != INDETERMINATE_ACTION )
258  eda_text->SetVertJustify( EDA_TEXT::MapVertJustify( m_vAlign->GetSelection() - 1 ) );
259 
260  if( m_Visible->Get3StateValue() != wxCHK_UNDETERMINED )
261  eda_text->SetVisible( m_Visible->GetValue() );
262 
263  if( m_Italic->Get3StateValue() != wxCHK_UNDETERMINED )
264  eda_text->SetItalic( m_Italic->GetValue() );
265 
266  if( m_Bold->Get3StateValue() != wxCHK_UNDETERMINED )
267  eda_text->SetBold( m_Bold->GetValue() );
268  }
269 
270  // No else! Labels are both.
271  if( sch_text )
272  {
273  if( m_orientation->GetStringSelection() != INDETERMINATE_ACTION )
274  sch_text->SetLabelSpinStyle( (LABEL_SPIN_STYLE::SPIN) m_orientation->GetSelection() );
275  }
276 
277  if( lineItem )
278  {
280  lineItem->SetLineWidth( m_lineWidth.GetValue() );
281 
282  if( m_lineStyle->GetStringSelection() != INDETERMINATE_ACTION )
283  {
284  if( m_lineStyle->GetStringSelection() == DEFAULT_STYLE )
286  else
287  lineItem->SetLineStyle( m_lineStyle->GetSelection() );
288  }
289 
290  if( m_setColor->GetValue() )
291  lineItem->SetLineColor( m_colorSwatch->GetSwatchColor() );
292  }
293 
294  if( junction )
295  {
297  junction->SetDiameter( m_junctionSize.GetValue() );
298 
299  if( m_setDotColor->GetValue() )
300  junction->SetColor( m_dotColorSwatch->GetSwatchColor() );
301  }
302 }
303 
305  SCH_ITEM* aItem )
306 {
307  if( m_netFilterOpt->GetValue() && !m_netFilter->GetValue().IsEmpty() )
308  {
309  SCH_CONNECTION* connection = aItem->Connection( &aSheetPath );
310 
311  if( !connection )
312  return;
313 
314  if( !WildCompareString( m_netFilter->GetValue(), connection->Name(), false ) )
315  return;
316  }
317 
318  if( m_referenceFilterOpt->GetValue() && !m_referenceFilter->GetValue().IsEmpty() )
319  {
320  if( aItem->Type() == SCH_SYMBOL_T )
321  {
322  wxString ref = static_cast<SCH_SYMBOL*>( aItem )->GetRef( &aSheetPath );
323 
324  if( !WildCompareString( m_referenceFilter->GetValue(), ref, false ) )
325  return;
326  }
327  }
328 
329  if( m_symbolFilterOpt->GetValue() && !m_symbolFilter->GetValue().IsEmpty() )
330  {
331  if( aItem->Type() == SCH_SYMBOL_T )
332  {
333  wxString id = UnescapeString( static_cast<SCH_SYMBOL*>( aItem )->GetLibId().Format() );
334 
335  if( !WildCompareString( m_symbolFilter->GetValue(), id, false ) )
336  return;
337  }
338  }
339 
340  if( m_typeFilterOpt->GetValue() )
341  {
342  if( aItem->Type() == SCH_SYMBOL_T )
343  {
344  bool isPower = static_cast<SCH_SYMBOL*>( aItem )->GetLibSymbolRef()->IsPower();
345 
346  if( isPower != ( m_typeFilter->GetSelection() == 1 ) )
347  return;
348  }
349  }
350 
351  static KICAD_T wireTypes[] = { SCH_LINE_LOCATE_WIRE_T, SCH_LABEL_LOCATE_WIRE_T, EOT };
352  static KICAD_T busTypes[] = { SCH_LINE_LOCATE_BUS_T, SCH_LABEL_LOCATE_BUS_T, EOT };
353  static KICAD_T schTextAndGraphics[] = { SCH_TEXT_T, SCH_LINE_LOCATE_GRAPHIC_LINE_T, EOT };
354 
355  if( aItem->Type() == SCH_SYMBOL_T )
356  {
357  SCH_SYMBOL* symbol = (SCH_SYMBOL*) aItem;
358 
359  if( m_references->GetValue() )
360  processItem( aSheetPath, symbol->GetField( REFERENCE_FIELD ) );
361 
362  if( m_values->GetValue() )
363  processItem( aSheetPath, symbol->GetField( VALUE_FIELD ) );
364 
365  if( m_otherFields->GetValue() )
366  {
367  for( int i = 2; i < symbol->GetFieldCount(); ++i )
368  {
369  SCH_FIELD& field = symbol->GetFields()[i];
370  const wxString& fieldName = field.GetName();
371 
372  if( !m_fieldnameFilterOpt->GetValue() || m_fieldnameFilter->GetValue().IsEmpty()
373  || WildCompareString( m_fieldnameFilter->GetValue(), fieldName, false ) )
374  {
375  processItem( aSheetPath, &field );
376  }
377  }
378  }
379  }
380  else if( aItem->Type() == SCH_SHEET_T )
381  {
382  SCH_SHEET* sheet = static_cast<SCH_SHEET*>( aItem );
383 
384  if( m_sheetTitles->GetValue() )
385  processItem( aSheetPath, &sheet->GetFields()[SHEETNAME] );
386 
387  if( m_sheetFields->GetValue() )
388  {
389  for( SCH_FIELD& field : sheet->GetFields() )
390  {
391  if( field.GetId() == SHEETNAME )
392  continue;
393 
394  const wxString& fieldName = field.GetName();
395 
396  if( !m_fieldnameFilterOpt->GetValue() || m_fieldnameFilter->GetValue().IsEmpty()
397  || WildCompareString( m_fieldnameFilter->GetValue(), fieldName, false ) )
398  {
399  processItem( aSheetPath, &field );
400  }
401  }
402  }
403 
404  if( m_sheetBorders->GetValue() )
405  {
407  sheet->SetBorderWidth( m_lineWidth.GetValue() );
408 
409  if( m_setColor->GetValue() )
411 
412  if( m_setBgColor->GetValue() )
414  }
415  }
416  else if( aItem->Type() == SCH_JUNCTION_T )
417  {
418  SCH_JUNCTION* junction = static_cast<SCH_JUNCTION*>( aItem );
419 
420  for( SCH_ITEM* item : junction->ConnectedItems( aSheetPath ) )
421  {
422  if( item->GetLayer() == LAYER_BUS && m_buses->GetValue() )
423  {
424  processItem( aSheetPath, aItem );
425  break;
426  }
427  else if( item->GetLayer() == LAYER_WIRE && m_wires->GetValue() )
428  {
429  processItem( aSheetPath, aItem );
430  break;
431  }
432  }
433  }
434  else if( m_wires->GetValue() && aItem->IsType( wireTypes ) )
435  processItem( aSheetPath, aItem );
436  else if( m_buses->GetValue() && aItem->IsType( busTypes ) )
437  processItem( aSheetPath, aItem );
438  else if( m_globalLabels->GetValue() && aItem->Type() == SCH_GLOBAL_LABEL_T )
439  processItem( aSheetPath, aItem );
440  else if( m_hierLabels->GetValue() && aItem->Type() == SCH_HIER_LABEL_T )
441  processItem( aSheetPath, aItem );
442  else if( m_sheetPins->GetValue() && aItem->Type() == SCH_SHEET_PIN_T )
443  processItem( aSheetPath, aItem );
444  else if( m_schTextAndGraphics->GetValue() && aItem->IsType( schTextAndGraphics ) )
445  processItem( aSheetPath, aItem );
446 }
447 
448 
450 {
451  if( !m_textSize.Validate( 1.0, 10000.0, EDA_UNITS::MILS ) ) // 1 mil .. 10 inches
452  return false;
453 
454  SCH_SHEET_PATH currentSheet = m_parent->GetCurrentSheet();
455  m_appendUndo = false;
456 
457  // Go through sheets
458  for( const SCH_SHEET_PATH& sheetPath : m_parent->Schematic().GetSheets() )
459  {
460  SCH_SCREEN* screen = sheetPath.LastScreen();
461 
462  if( screen )
463  {
464  m_parent->SetCurrentSheet( sheetPath );
465 
466  for( SCH_ITEM* item : screen->Items() )
467  visitItem( sheetPath, item );
468  }
469  }
470 
471  if( m_appendUndo )
472  {
473  m_parent->OnModify();
474  m_parent->HardRedraw();
475  }
476 
477  // Reset the view to where we left the user
478  m_parent->SetCurrentSheet( currentSheet );
479 
480  return true;
481 }
482 
483 
485 {
487  dlg.ShowModal();
488  return 0;
489 }
490 
491 
void SetSwatchColor(const KIGFX::COLOR4D &aColor, bool aSendEvent)
Set the current swatch color directly.
Field Reference of part, i.e. "IC21".
void SetCurrentSheet(const SCH_SHEET_PATH &aSheet)
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Definition: sch_field.h:49
KIGFX::COLOR4D GetSwatchColor() const
void RecalculateConnections(SCH_CLEANUP_FLAGS aCleanupFlags)
Generate the connection data for the entire schematic hierarchy.
bool IsSelected() const
Definition: eda_item.h:123
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
Definition: sch_symbol.cpp:675
const SCH_CONNECTION * GetHighlightedConnection() const
void visitItem(const SCH_SHEET_PATH &aSheetPath, SCH_ITEM *aItem)
void SetLineWidth(const int aSize)
Definition: sch_line.cpp:275
void SetDiameter(int aDiameter)
Definition: sch_junction.h:100
void SetItalic(bool isItalic)
Definition: eda_text.h:179
void SetColor(const COLOR4D &aColor)
Definition: sch_junction.h:105
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
Definition: sch_symbol.cpp:711
Schematic editor (Eeschema) main window.
void SetTextSize(const wxSize &aNewSize)
Definition: eda_text.h:237
bool IsIndeterminate() const
Return true if the control holds the indeterminate value (for instance, if it represents a multiple s...
search types array terminator (End Of Types)
Definition: typeinfo.h:81
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:77
void SetBorderWidth(int aWidth)
Definition: sch_sheet.h:109
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
Definition: sch_item.cpp:131
EE_SELECTION & GetSelection()
Return the set of currently selected items.
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition: eda_text.h:119
std::vector< SCH_FIELD > & GetFields()
Definition: sch_sheet.h:88
virtual void SetVisible(bool aVisible)
Definition: eda_text.h:185
int GlobalEdit(const TOOL_EVENT &aEvent)
Delete the selected items, or the item under the cursor.
void SetLineStyle(const PLOT_DASH_TYPE aStyle)
Definition: sch_line.cpp:243
void SetBackgroundColor(KIGFX::COLOR4D aColor)
Definition: sch_sheet.h:115
wxString Name(bool aIgnoreSheet=false) const
Field Value of part, i.e. "3.3K".
static EDA_TEXT_HJUSTIFY_T MapHorizJustify(int aHorizJustify)
Definition: eda_text.cpp:63
void HardRedraw() override
Rebuild the GAL and redraw the screen.
void SetVertJustify(EDA_TEXT_VJUSTIFY_T aType)
Definition: eda_text.h:202
int GetFieldCount() const
Return the number of fields in this symbol.
Definition: sch_symbol.h:424
Generic, UI-independent tool event.
Definition: tool_event.h:152
SCHEMATIC & Schematic() const
void SetBorderColor(KIGFX::COLOR4D aColor)
Definition: sch_sheet.h:112
EDA_ITEM * GetParent() const
Definition: eda_item.h:115
void SetDefaultColor(const KIGFX::COLOR4D &aColor)
Sets the color that will be chosen with the "Reset to Default" button in the chooser.
virtual bool IsType(const KICAD_T aScanTypes[]) const
Check whether the item is one of the listed types.
Definition: eda_item.h:183
void SetLineColor(const COLOR4D &aColor)
Definition: sch_line.cpp:193
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
static EDA_TEXT_VJUSTIFY_T MapVertJustify(int aVertJustify)
Definition: eda_text.cpp:77
wxString UnescapeString(const wxString &aSource)
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:54
virtual unsigned int GetSize() const override
Return the number of stored items.
Definition: selection.h:88
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
static bool m_allowRealTime
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
SCH_SHEET_LIST GetSheets() const override
Builds and returns an updated schematic hierarchy TODO: can this be cached?
Definition: schematic.h:87
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.
Schematic symbol object.
Definition: sch_symbol.h:78
SCH_SCREEN * LastScreen()
Segment description base class to describe items which have 2 end points (track, wire,...
Definition: sch_line.h:37
SCH_ITEM_SET & ConnectedItems(const SCH_SHEET_PATH &aPath)
Retrieve the set of items connected to this item on the given sheet.
Definition: sch_item.cpp:164
void SetHorizJustify(EDA_TEXT_HJUSTIFY_T aType)
Definition: eda_text.h:201
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
void SaveCopyInUndoList(SCH_SCREEN *aScreen, SCH_ITEM *aItemToCopy, UNDO_REDO aTypeCommand, bool aAppend)
Create a copy of the current schematic item, and put it in the undo list.
virtual void SetValue(int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
wxString GetName(bool aUseDefaultName=true) const
Return the field name.
Definition: sch_field.cpp:582
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
Definition: sch_screen.h:110
void processItem(const SCH_SHEET_PATH &aSheetPath, SCH_ITEM *aItem)
virtual long long int GetValue()
Return the current value in Internal Units.
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.
SCH_SHEET_PATH & GetCurrentSheet() const
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:54
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag of the current screen and u...
virtual void SetLabelSpinStyle(LABEL_SPIN_STYLE aSpinStyle)
Set a spin or rotation angle, along with specific horizontal and vertical justification styles with e...
Definition: sch_text.cpp:320
#define INDETERMINATE_ACTION
Definition: base_units.h:48
void SetBold(bool aBold)
Definition: eda_text.h:182
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:182
EDA_ITEM * Front() const
Definition: selection.h:145
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:113