KiCad PCB EDA Suite
Loading...
Searching...
No Matches
dialog_pin_properties.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) 2010 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright The 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 <bitmaps.h>
26#include <sch_painter.h>
27#include <symbol_edit_frame.h>
28#include <sch_pin.h>
30#include <confirm.h>
31#include <kiplatform/ui.h>
33#include <widgets/wx_grid.h>
34#include <grid_tricks.h>
37#include <wx/hyperlink.h>
39
40class ALT_PIN_DATA_MODEL : public wxGridTableBase, public std::vector<SCH_PIN::ALT>
41{
42public:
44 {
45 }
46
47 int GetNumberRows() override { return (int) size(); }
48 int GetNumberCols() override { return COL_COUNT; }
49
50 wxString GetColLabelValue( int aCol ) override
51 {
52 switch( aCol )
53 {
54 case COL_NAME: return _( "Alternate Pin Name" );
55 case COL_TYPE: return _( "Electrical Type" );
56 case COL_SHAPE: return _( "Graphic Style" );
57 default: wxFAIL; return wxEmptyString;
58 }
59 }
60
61 bool IsEmptyCell( int row, int col ) override
62 {
63 return false; // don't allow adjacent cell overflow, even if we are actually empty
64 }
65
66 wxString GetValue( int aRow, int aCol ) override
67 {
68 switch( aCol )
69 {
70 case COL_NAME: return at( aRow ).m_Name;
71 case COL_TYPE: return PinTypeNames()[static_cast<int>( at( aRow ).m_Type )];
72 case COL_SHAPE: return PinShapeNames()[static_cast<int>( at( aRow ).m_Shape )];
73 default: wxFAIL; return wxEmptyString;
74 }
75 }
76
77 void SetValue( int aRow, int aCol, const wxString &aValue ) override
78 {
79 switch( aCol )
80 {
81 case COL_NAME:
82 at( aRow ).m_Name = aValue;
83 break;
84
85 case COL_TYPE:
86 if( PinTypeNames().Index( aValue ) != wxNOT_FOUND )
87 at( aRow ).m_Type = (ELECTRICAL_PINTYPE) PinTypeNames().Index( aValue );
88
89 break;
90
91 case COL_SHAPE:
92 if( PinShapeNames().Index( aValue ) != wxNOT_FOUND )
93 at( aRow ).m_Shape = (GRAPHIC_PINSHAPE) PinShapeNames().Index( aValue );
94
95 break;
96
97 default:
98 wxFAIL;
99 break;
100 }
101 }
102
103 void AppendRow( const SCH_PIN::ALT& aAlt )
104 {
105 push_back( aAlt );
106
107 if ( GetView() )
108 {
109 wxGridTableMessage msg( this, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
110 GetView()->ProcessTableMessage( msg );
111 }
112 }
113
114 void RemoveRow( int aRow )
115 {
116 erase( begin() + aRow );
117
118 if ( GetView() )
119 {
120 wxGridTableMessage msg( this, wxGRIDTABLE_NOTIFY_ROWS_DELETED, aRow, 1 );
121 GetView()->ProcessTableMessage( msg );
122 }
123 }
124};
125
126
128 bool aFocusPinNumber ) :
130 m_frame( parent ),
131 m_pin( aPin ),
132 m_posX( parent, m_posXLabel, m_posXCtrl, m_posXUnits ),
133 m_posY( parent, m_posYLabel, m_posYCtrl, m_posYUnits ),
134 m_pinLength( parent, m_pinLengthLabel, m_pinLengthCtrl, m_pinLengthUnits ),
135 m_nameSize( parent, m_nameSizeLabel, m_nameSizeCtrl, m_nameSizeUnits ),
136 m_numberSize( parent, m_numberSizeLabel, m_numberSizeCtrl, m_numberSizeUnits ),
137 m_delayedFocusRow( -1 ),
138 m_delayedFocusColumn( -1 ),
139 m_initialized( false )
140{
141 // Create a dummy symbol with a single pin for the preview widget:
142 m_dummyParent = new LIB_SYMBOL( *static_cast<LIB_SYMBOL*>( m_pin->GetParentSymbol() ) );
143
144 // Move everything in the copied symbol to unit 1; we'll use unit 2 for the dummy pin:
145 m_dummyParent->SetUnitCount( 2, false );
146 m_dummyParent->RunOnChildren( [&]( SCH_ITEM* child )
147 {
148 child->SetUnit( 1 );
149 },
150 RECURSE_MODE::NO_RECURSE );
151
152 m_dummyPin = new SCH_PIN( *m_pin );
153 m_dummyPin->SetUnit( 2 );
155
158
161
162 m_previewWidget->SetLayoutDirection( wxLayout_LeftToRight );
164
165 wxBoxSizer* previewSizer = new wxBoxSizer( wxHORIZONTAL );
166 previewSizer->Add( m_previewWidget, 1, wxEXPAND, 5 );
167 m_panelShowPin->SetSizer( previewSizer );
168
169 const wxArrayString& orientationNames = PinOrientationNames();
170 const std::vector<BITMAPS>& orientationIcons = PinOrientationIcons();
171
172 for ( unsigned ii = 0; ii < orientationNames.GetCount(); ii++ )
173 m_choiceOrientation->Insert( orientationNames[ii], KiBitmapBundle( orientationIcons[ii] ), ii );
174
175 // We can't set the tab order through wxWidgets due to shortcomings in their mnemonics
176 // implementation on MSW
177 m_tabOrder = {
193 };
194
195 // Default alternates turndown to whether or not alternates exist, or if we've had it open
196 // before
198
199 // wxwidgets doesn't call the OnCollapseChange even at init, so we update this value if
200 // the alternates pane defaults to open
201 if ( m_pin->GetAlternates().size() > 0 )
203
205
206 // Save original columns widths so we can do proportional sizing.
207 for( int i = 0; i < COL_COUNT; ++i )
208 m_originalColWidths[ i ] = m_alternatesGrid->GetColSize( i );
209
211 m_alternatesGrid->PushEventHandler( new GRID_TRICKS( m_alternatesGrid,
212 [this]( wxCommandEvent& aEvent )
213 {
214 OnAddAlternate( aEvent );
215 } ) );
216
218 {
219 m_alternatesTurndown->Collapse();
220 m_alternatesTurndown->Disable();
221 m_alternatesTurndown->SetToolTip( _( "Alternate pin assignments are not available for "
222 "De Morgan symbols." ) );
223 }
224
225 // Set special attributes
226 wxGridCellAttr* attr;
227
228 attr = new wxGridCellAttr;
229 attr->SetRenderer( new GRID_CELL_ICON_TEXT_RENDERER( PinTypeIcons(), PinTypeNames() ) );
230 attr->SetEditor( new GRID_CELL_ICON_TEXT_POPUP( PinTypeIcons(), PinTypeNames() ) );
231 m_alternatesGrid->SetColAttr( COL_TYPE, attr );
232
233 attr = new wxGridCellAttr;
234 attr->SetRenderer( new GRID_CELL_ICON_TEXT_RENDERER( PinShapeIcons(), PinShapeNames() ) );
235 attr->SetEditor( new GRID_CELL_ICON_TEXT_POPUP( PinShapeIcons(), PinShapeNames() ) );
236 m_alternatesGrid->SetColAttr( COL_SHAPE, attr );
237
238 m_addAlternate->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
239 m_deleteAlternate->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
240 m_addAlternate->GetParent()->Layout();
241
243
244 SetInitialFocus( aFocusPinNumber ? m_textPinNumber : m_textPinName );
245
246 // Now all widgets have the size fixed, call FinishDialogSettings
248
249 // On some window managers (Unity, XFCE) the dialog is not always raised, depending on
250 // how it is run.
251 Raise();
252
253 m_initialized = true;
254}
255
256
258{
259 delete m_dummyParent;
260
261 // Prevents crash bug in wxGrid's d'tor
263
264 // Delete the GRID_TRICKS.
265 m_alternatesGrid->PopEventHandler( true );
266}
267
268
270{
271 if( !DIALOG_SHIM::TransferDataToWindow() )
272 return false;
273
275
279 m_textPinName->SetValue( m_pin->GetName() );
283 m_textPinNumber->SetValue( m_pin->GetNumber() );
287 m_checkApplyToAllParts->SetValue( m_pin->GetParentSymbol()->IsMulti() && m_pin->GetUnit() == 0 );
289 m_checkShow->SetValue( m_pin->IsVisible() );
290
292
293 wxString commonUnitsToolTip;
294
296 {
297 wxHyperlinkCtrl* button = new wxHyperlinkCtrl( m_infoBar, wxID_ANY, _( "Exit sync pins mode" ),
298 wxEmptyString );
299
300 button->Bind( wxEVT_COMMAND_HYPERLINK,
301 std::function<void( wxHyperlinkEvent& aEvent )>(
302 [&]( wxHyperlinkEvent& aEvent )
303 {
304 m_frame->m_SyncPinEdit = false;
306 } ) );
307
309 m_infoBar->AddButton( button );
311
312 commonUnitsToolTip = _( "Synchronized pins mode is enabled.\n"
313 "Similar pins will be edited regardless of this option." );
314 }
315 else
316 {
317 commonUnitsToolTip = _( "If checked, this pin will exist in all units." );
318 }
319
320 if( !m_pin->GetParentSymbol()->IsMulti() )
321 commonUnitsToolTip = _( "This symbol only has one unit. This control has no effect." );
322
323 m_checkApplyToAllParts->SetToolTip( commonUnitsToolTip );
324
325 for( const std::pair<const wxString, SCH_PIN::ALT>& alt : m_pin->GetAlternates() )
326 m_alternatesDataModel->AppendRow( alt.second );
327
328 return true;
329}
330
331
333{
335 return false;
336
337 // Check for missing alternate names.
338 for( size_t i = 0; i < m_alternatesDataModel->size(); ++i )
339 {
340 if( m_alternatesDataModel->at( i ).m_Name.IsEmpty() )
341 {
342 DisplayErrorMessage( this, _( "Alternate pin definitions must have a name." ) );
343
346
347 return false;
348 }
349 }
350
351 if( !DIALOG_SHIM::TransferDataFromWindow() )
352 return false;
353
355
356 const int standard_grid = 50;
357
358 // Only show the warning if the position has been changed
359 if( ( m_origPos != newPos )
360 && ( ( m_posX.GetValue() % standard_grid ) || ( m_posY.GetValue() % standard_grid ) ) )
361 {
362 wxString msg = wxString::Format( _( "This pin is not on a %d mils grid which will make it "
363 "difficult to connect to in the schematic.\n"
364 "Do you wish to continue?" ),
365 standard_grid );
366 if( !IsOK( this, msg ) )
367 return false;
368 }
369
370 m_pin->SetName( m_textPinName->GetValue() );
371 m_pin->SetNumber( m_textPinNumber->GetValue() );
375 m_pin->SetPosition( newPos );
380 m_pin->SetUnit( m_checkApplyToAllParts->GetValue() ? 0 : m_frame->GetUnit() );
381 m_pin->SetVisible( m_checkShow->GetValue() );
382
383 std::map<wxString, SCH_PIN::ALT>& alternates = m_pin->GetAlternates();
384 alternates.clear();
385
386 for( const SCH_PIN::ALT& alt : *m_alternatesDataModel )
387 alternates[ alt.m_Name ] = alt;
388
389 return true;
390}
391
392
393void DIALOG_PIN_PROPERTIES::OnPropertiesChange( wxCommandEvent& event )
394{
395 if( !IsShownOnScreen() ) // do nothing at init time
396 return;
397
398 m_dummyPin->SetName( m_textPinName->GetValue() );
399 m_dummyPin->SetNumber( m_textPinNumber->GetValue() );
406 m_dummyPin->SetVisible( m_checkShow->GetValue() );
407
408 if( event.GetEventObject() == m_checkApplyToAllParts && m_frame->m_SyncPinEdit )
410
412}
413
414
416{
417 if( m_checkApplyToAllParts->GetValue() )
418 return _( "Synchronized Pins Mode." );
419 else if( m_pin->IsNew() )
420 return _( "Synchronized Pins Mode. New pin will be added to all units." );
421 else
422 return _( "Synchronized Pins Mode. Matching pins in other units will be updated." );
423}
424
425
426void DIALOG_PIN_PROPERTIES::OnAddAlternate( wxCommandEvent& event )
427{
429 return;
430
431 SCH_PIN::ALT newAlt;
432 newAlt.m_Name = wxEmptyString;
433 newAlt.m_Type = m_pin->GetType();
434 newAlt.m_Shape = m_pin->GetShape();
435
437
438 m_alternatesGrid->MakeCellVisible( m_alternatesGrid->GetNumberRows() - 1, 0 );
439 m_alternatesGrid->SetGridCursor( m_alternatesGrid->GetNumberRows() - 1, 0 );
440
441 m_alternatesGrid->EnableCellEditControl( true );
442 m_alternatesGrid->ShowCellEditControl();
443}
444
445
446void DIALOG_PIN_PROPERTIES::OnDeleteAlternate( wxCommandEvent& event )
447{
449 return;
450
451 if( m_alternatesDataModel->size() == 0 ) // empty table
452 return;
453
454 int curRow = m_alternatesGrid->GetGridCursorRow();
455
456 if( curRow < 0 )
457 return;
458
460
461 curRow = std::max( 0, curRow - 1 );
462 m_alternatesGrid->MakeCellVisible( curRow, m_alternatesGrid->GetGridCursorCol() );
463 m_alternatesGrid->SetGridCursor( curRow, m_alternatesGrid->GetGridCursorCol() );
464}
465
466
468{
469 // Account for scroll bars
471
472 wxGridUpdateLocker deferRepaintsTillLeavingScope;
473
476
478}
479
480
481void DIALOG_PIN_PROPERTIES::OnSize( wxSizeEvent& event )
482{
483 auto new_size = event.GetSize();
484
485 if( m_initialized && m_size != new_size )
486 {
487 m_size = new_size;
488
490 }
491
492 // Always propagate for a grid repaint (needed if the height changes, as well as width)
493 event.Skip();
494}
495
496
497void DIALOG_PIN_PROPERTIES::OnUpdateUI( wxUpdateUIEvent& event )
498{
499 // Handle a delayed focus
500 if( m_delayedFocusRow >= 0 )
501 {
502 m_alternatesTurndown->Collapse( false );
503
504 m_alternatesGrid->SetFocus();
507
508 m_alternatesGrid->EnableCellEditControl( true );
509 m_alternatesGrid->ShowCellEditControl();
510
513 }
514}
515
516
517void DIALOG_PIN_PROPERTIES::OnCollapsiblePaneChange( wxCollapsiblePaneEvent& event )
518{
519 if( !event.GetCollapsed() )
520 {
521 wxTopLevelWindow* tlw = dynamic_cast<wxTopLevelWindow*>( wxGetTopLevelParent( this ) );
522
523 if( tlw )
524 {
525 tlw->InvalidateBestSize();
526 wxSize bestSize = tlw->GetBestSize();
527 wxSize currentSize = tlw->GetSize();
528 tlw->SetSize( wxMax( bestSize.GetWidth(), currentSize.GetWidth() ),
529 wxMax( bestSize.GetHeight(), currentSize.GetHeight() ) );
530 }
531 }
532}
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Definition: bitmap.cpp:110
wxString GetColLabelValue(int aCol) override
void SetValue(int aRow, int aCol, const wxString &aValue) override
ALT_PIN_DATA_MODEL(EDA_UNITS aUserUnits)
wxString GetValue(int aRow, int aCol) override
void AppendRow(const SCH_PIN::ALT &aAlt)
bool IsEmptyCell(int row, int col) override
Class DIALOG_PIN_PROPERTIES_BASE.
WX_BITMAP_COMBOBOX * m_choiceOrientation
SYMBOL_EDIT_FRAME * m_frame
void OnUpdateUI(wxUpdateUIEvent &event) override
std::map< int, int > m_originalColWidths
void OnCollapsiblePaneChange(wxCollapsiblePaneEvent &event) override
void OnPropertiesChange(wxCommandEvent &event) override
bool TransferDataToWindow() override
void OnAddAlternate(wxCommandEvent &event) override
SYMBOL_PREVIEW_WIDGET * m_previewWidget
ALT_PIN_DATA_MODEL * m_alternatesDataModel
void OnSize(wxSizeEvent &event) override
DIALOG_PIN_PROPERTIES(SYMBOL_EDIT_FRAME *parent, SCH_PIN *aPin, bool aFocusPinNumber)
bool TransferDataFromWindow() override
void OnDeleteAlternate(wxCommandEvent &event) override
std::vector< wxWindow * > m_tabOrder
Definition: dialog_shim.h:214
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
Definition: dialog_shim.h:66
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...
EDA_UNITS GetUserUnits() const
Definition: dialog_shim.h:102
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
bool IsNew() const
Definition: eda_item.h:123
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
Definition: grid_tricks.h:61
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:55
Define a library symbol object.
Definition: lib_symbol.h:85
void SetUnitCount(int aCount, bool aDuplicateDrawItems=true)
Set the units per symbol count.
void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode) override
void AddDrawItem(SCH_ITEM *aItem, bool aSort=true)
Add a new draw aItem to the draw object list and sort according to aSort.
Definition: lib_symbol.cpp:786
GRAPHIC_PINSHAPE GetPinShapeSelection()
void SetSelection(GRAPHIC_PINSHAPE aShape)
ELECTRICAL_PINTYPE GetPinTypeSelection()
void SetSelection(ELECTRICAL_PINTYPE aType)
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:168
virtual void SetBodyStyle(int aBodyStyle)
Definition: sch_item.h:245
const SYMBOL * GetParentSymbol() const
Definition: sch_item.cpp:218
int GetBodyStyle() const
Definition: sch_item.h:246
int GetUnit() const
Definition: sch_item.h:242
virtual void SetUnit(int aUnit)
Definition: sch_item.h:241
int GetNumberTextSize() const
Definition: sch_pin.cpp:591
int GetLength() const
Definition: sch_pin.cpp:281
const std::map< wxString, ALT > & GetAlternates() const
Definition: sch_pin.h:133
void SetNumber(const wxString &aNumber)
Definition: sch_pin.cpp:554
void SetVisible(bool aVisible)
Definition: sch_pin.h:113
void ChangeLength(int aLength)
Change the length of a pin and adjust its position based on orientation.
Definition: sch_pin.cpp:1021
void SetOrientation(PIN_ORIENTATION aOrientation)
Definition: sch_pin.h:92
void SetName(const wxString &aName)
Definition: sch_pin.cpp:405
bool IsVisible() const
Definition: sch_pin.cpp:373
void SetPosition(const VECTOR2I &aPos) override
Definition: sch_pin.h:224
const wxString & GetName() const
Definition: sch_pin.cpp:387
void SetLength(int aLength)
Definition: sch_pin.h:98
PIN_ORIENTATION GetOrientation() const
Definition: sch_pin.cpp:246
void SetNumberTextSize(int aSize)
Definition: sch_pin.cpp:605
void SetShape(GRAPHIC_PINSHAPE aShape)
Definition: sch_pin.h:95
VECTOR2I GetPosition() const override
Definition: sch_pin.cpp:238
int GetNameTextSize() const
Definition: sch_pin.cpp:567
void SetType(ELECTRICAL_PINTYPE aType)
Definition: sch_pin.cpp:315
const wxString & GetNumber() const
Definition: sch_pin.h:123
GRAPHIC_PINSHAPE GetShape() const
Definition: sch_pin.cpp:260
ELECTRICAL_PINTYPE GetType() const
Definition: sch_pin.cpp:295
void SetNameTextSize(int aSize)
Definition: sch_pin.cpp:581
void SetBitmap(const wxBitmapBundle &aBmp)
The symbol library editor main window.
int GetBodyStyle() const
bool m_SyncPinEdit
Set to true to synchronize pins at the same position when editing symbols with multiple units or mult...
void DisplayPart(LIB_SYMBOL *aSymbol, int aUnit, int aBodyStyle=0)
virtual bool IsMulti() const =0
virtual void SetShowPinNumbers(bool aShow)
Set or clear the pin number visibility flag.
Definition: symbol.h:164
virtual void SetShowPinNames(bool aShow)
Set or clear the pin name visibility flag.
Definition: symbol.h:158
virtual bool HasAlternateBodyStyle() const =0
Test if symbol has more than one body conversion type (DeMorgan).
int GetIntValue()
Definition: unit_binder.h:129
virtual long long int GetValue()
Return the current value in Internal Units.
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
void SetTable(wxGridTableBase *table, bool aTakeOwnership=false)
Hide wxGrid's SetTable() method with one which doesn't mess up the grid column widths when setting th...
Definition: wx_grid.cpp:273
void DestroyTable(wxGridTableBase *aTable)
Work-around for a bug in wxGrid which crashes when deleting the table if the cell edit control was no...
Definition: wx_grid.cpp:446
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:640
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
Definition: wx_infobar.cpp:369
void AddButton(wxButton *aButton)
Add an already created button to the infobar.
Definition: wx_infobar.cpp:325
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
Definition: wx_infobar.cpp:190
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
Definition: wx_infobar.cpp:154
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
Definition: confirm.cpp:260
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:203
This file is part of the common library.
#define _(s)
EDA_UNITS
Definition: eda_units.h:48
wxSize GetUnobscuredSize(const wxWindow *aWindow)
Tries to determine the size of the viewport of a scrollable widget (wxDataViewCtrl,...
Definition: wxgtk/ui.cpp:252
const std::vector< BITMAPS > & PinTypeIcons()
Definition: pin_type.cpp:167
const wxArrayString & PinTypeNames()
Definition: pin_type.cpp:158
int PinOrientationIndex(PIN_ORIENTATION code)
Definition: pin_type.cpp:70
const wxArrayString & PinShapeNames()
Definition: pin_type.cpp:176
const std::vector< BITMAPS > & PinShapeIcons()
Definition: pin_type.cpp:185
const wxArrayString & PinOrientationNames()
Definition: pin_type.cpp:194
PIN_ORIENTATION PinOrientationCode(size_t index)
Definition: pin_type.cpp:63
const std::vector< BITMAPS > & PinOrientationIcons()
Definition: pin_type.cpp:203
ELECTRICAL_PINTYPE
The symbol library pin object electrical types used in ERC tests.
Definition: pin_type.h:36
GRAPHIC_PINSHAPE
Definition: pin_type.h:59
wxString m_Name
Definition: sch_pin.h:44
GRAPHIC_PINSHAPE m_Shape
Definition: sch_pin.h:45
ELECTRICAL_PINTYPE m_Type
Definition: sch_pin.h:46
Functions for manipulating tab traversal in forms and dialogs.