KiCad PCB EDA Suite
getpart.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) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
5  * Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
6  * Copyright (C) 2004-2018 KiCad Developers, see AUTHORS.txt for contributors.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, you may find one here:
20  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21  * or you may search the http://www.gnu.org website for the version 2 license,
22  * or you may write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24  */
25 
31 #include <algorithm>
32 #include <fctsys.h>
33 #include <pgm_base.h>
34 #include <kiway.h>
35 #include <gr_basic.h>
36 #include <class_drawpanel.h>
37 #include <confirm.h>
38 #include <sch_edit_frame.h>
39 #include <kicad_device_context.h>
40 #include <msgpanel.h>
41 
42 #include <general.h>
43 #include <class_library.h>
44 #include <sch_component.h>
45 #include <lib_edit_frame.h>
46 #include <viewlib_frame.h>
47 #include <eeschema_id.h>
48 #include <symbol_lib_table.h>
49 
51 #include <cmp_tree_model_adapter.h>
52 
53 
55  wxTopLevelWindow* aParent,
56  const SCHLIB_FILTER* aFilter, const LIB_ID& aPreselectedLibId,
57  int aUnit, int aConvert )
58 {
59  // Close any open non-modal Lib browser, and open a new one, in "modal" mode:
60  LIB_VIEW_FRAME* viewlibFrame = (LIB_VIEW_FRAME*) Kiway().Player( FRAME_SCH_VIEWER, false );
61 
62  if( viewlibFrame )
63  viewlibFrame->Destroy();
64 
65  viewlibFrame = (LIB_VIEW_FRAME*) Kiway().Player( FRAME_SCH_VIEWER_MODAL, true, aParent );
66 
67  if( aFilter )
68  viewlibFrame->SetFilter( aFilter );
69 
70  if( aPreselectedLibId.IsValid() )
71  {
72  viewlibFrame->SetSelectedLibrary( aPreselectedLibId.GetLibNickname() );
73  viewlibFrame->SetSelectedComponent( aPreselectedLibId.GetLibItemName() );
74  }
75 
76  viewlibFrame->SetUnitAndConvert( aUnit, aConvert );
77 
78  viewlibFrame->Refresh();
79 
81 
82  wxString symbol = sel.LibId.Format();
83 
84  if( viewlibFrame->ShowModal( &symbol, aParent ) )
85  {
86  LIB_ID id;
87 
88  if( id.Parse( symbol ) == -1 )
89  sel.LibId = id;
90 
91  sel.Unit = viewlibFrame->GetUnit();
92  sel.Convert = viewlibFrame->GetConvert();
93  }
94 
95  viewlibFrame->Destroy();
96 
97  return sel;
98 }
99 
100 
102  const SCHLIB_FILTER* aFilter,
103  std::vector<COMPONENT_SELECTION>& aHistoryList,
104  bool aUseLibBrowser,
105  int aUnit,
106  int aConvert,
107  bool aShowFootprints,
108  const LIB_ID* aHighlight,
109  bool aAllowFields )
110 {
111  std::unique_lock<std::mutex> dialogLock( DIALOG_CHOOSE_COMPONENT::g_Mutex, std::defer_lock );
112  wxString dialogTitle;
113  SYMBOL_LIB_TABLE* libs = Prj().SchSymbolLibTable();
114 
115  // One CHOOSE_COMPONENT dialog at a time. User probaby can't handle more anyway.
116  if( !dialogLock.try_lock() )
117  return COMPONENT_SELECTION();
118 
119  auto adapter( CMP_TREE_MODEL_ADAPTER::Create( libs ) );
120  bool loaded = false;
121 
122  if( aFilter )
123  {
124  const wxArrayString& liblist = aFilter->GetAllowedLibList();
125 
126  for( unsigned ii = 0; ii < liblist.GetCount(); ii++ )
127  {
128  if( libs->HasLibrary( liblist[ii], true ) )
129  {
130  loaded = true;
131  adapter->AddLibrary( liblist[ii] );
132  }
133  }
134 
135  if( aFilter->GetFilterPowerParts() )
136  adapter->SetFilter( CMP_TREE_MODEL_ADAPTER::CMP_FILTER_POWER );
137 
138  }
139 
140  if( !aHistoryList.empty() )
141  {
142  std::vector< LIB_ALIAS* > history_list;
143 
144  for( auto const& i : aHistoryList )
145  {
146  LIB_ALIAS* alias = GetLibAlias( i.LibId );
147 
148  if( alias )
149  history_list.push_back( alias );
150  }
151 
152  adapter->AddAliasList( "-- " + _( "History" ) + " --", _( "Recently used items" ), history_list );
153  adapter->SetPreselectNode( aHistoryList[0].LibId, aHistoryList[0].Unit );
154  }
155 
156  const std::vector< wxString > libNicknames = libs->GetLogicalLibs();
157 
158  if( !loaded )
159  {
160  adapter->AddLibrariesWithProgress( libNicknames, this );
161  }
162 
163  if( aHighlight && aHighlight->IsValid() )
164  adapter->SetPreselectNode( *aHighlight, /* aUnit */ 0 );
165 
166  if( adapter->GetFilter() == CMP_TREE_MODEL_ADAPTER::CMP_FILTER_POWER )
167  dialogTitle.Printf( _( "Choose Power Symbol (%d items loaded)" ), adapter->GetComponentsCount() );
168  else
169  dialogTitle.Printf( _( "Choose Symbol (%d items loaded)" ), adapter->GetComponentsCount() );
170 
171  DIALOG_CHOOSE_COMPONENT dlg( this, dialogTitle, adapter, aConvert, aAllowFields, aShowFootprints );
172 
173  if( dlg.ShowQuasiModal() == wxID_CANCEL )
174  return COMPONENT_SELECTION();
175 
177  LIB_ID id;
178 
179  if( dlg.IsExternalBrowserSelected() ) // User requested component browser.
180  {
181  sel = SelectComponentFromLibBrowser( this, aFilter, id, sel.Unit, sel.Convert );
182  id = sel.LibId;
183  }
184  else
185  id = dlg.GetSelectedLibId( &sel.Unit );
186 
187  if( !id.IsValid() ) // Dialog closed by OK button,
188  // or the selection by lib browser was requested,
189  // but no symbol selected
190  return COMPONENT_SELECTION();
191 
192  if( sel.Unit == 0 )
193  sel.Unit = 1;
194 
195  sel.Fields = dlg.GetFields();
196  sel.LibId = id;
197 
198  if( sel.LibId.IsValid() )
199  {
200  aHistoryList.erase(
201  std::remove_if(
202  aHistoryList.begin(),
203  aHistoryList.end(),
204  [ &sel ]( COMPONENT_SELECTION const& i ){ return i.LibId == sel.LibId; } ),
205  aHistoryList.end() );
206 
207  aHistoryList.insert( aHistoryList.begin(), sel );
208  }
209 
210  return sel;
211 }
212 
213 
215  const SCHLIB_FILTER* aFilter,
216  SCH_BASE_FRAME::HISTORY_LIST& aHistoryList,
217  bool aUseLibBrowser )
218 {
219  wxString msg;
220 
221  SetRepeatItem( NULL );
223 
224  auto sel = SelectComponentFromLibrary( aFilter, aHistoryList, aUseLibBrowser, 1, 1,
225  m_footprintPreview );
226 
227  if( !sel.LibId.IsValid() )
228  {
229  m_canvas->SetIgnoreMouseEvents( false );
231  return NULL;
232  }
233 
234  m_canvas->SetIgnoreMouseEvents( false );
236 
237  wxString libsource; // the library name to use. If empty, load from any lib
238 
239  if( aFilter )
240  libsource = aFilter->GetLibSource();
241 
242  LIB_ID libId = sel.LibId;
243 
244  LIB_PART* part = GetLibPart( libId, true );
245 
246  if( !part )
247  return NULL;
248 
249  SCH_COMPONENT* component = new SCH_COMPONENT( *part, m_CurrentSheet, sel.Unit, sel.Convert,
250  GetCrossHairPosition(), true );
251 
252  // Set the m_ChipName value, from component name in lib, for aliases
253  // Note if part is found, and if name is an alias of a component,
254  // alias exists because its root component was found
255  component->SetLibId( libId );
256 
257  // Be sure the link to the corresponding LIB_PART is OK:
258  component->Resolve( *Prj().SchSymbolLibTable() );
259 
260  // Set any fields that have been modified
261  for( auto const& i : sel.Fields )
262  {
263  auto field = component->GetField( i.first );
264 
265  if( field )
266  field->SetText( i.second );
267  }
268 
269  // Set the component value that can differ from component name in lib, for aliases
270  component->GetField( VALUE )->SetText( sel.LibId.GetLibItemName() );
271 
272  // If there is no field defined in the component, copy one over from the library
273  // ( from the .dcm file )
274  // This way the Datasheet field will not be empty and can be changed from the schematic
275  if( component->GetField( DATASHEET )->GetText().IsEmpty() )
276  {
277  LIB_ALIAS* entry = GetLibAlias( component->GetLibId(), true, true );
278 
279  if( entry && !!entry->GetDocFileName() )
280  component->GetField( DATASHEET )->SetText( entry->GetDocFileName() );
281  }
282 
283  MSG_PANEL_ITEMS items;
284 
285  component->SetCurrentSheetPath( &GetCurrentSheet() );
286  component->GetMsgPanelInfo( items );
287 
288  SetMsgPanel( items );
289  component->Draw( m_canvas, aDC, wxPoint( 0, 0 ), g_XorMode );
290  component->SetFlags( IS_NEW );
291 
292  if( m_autoplaceFields )
293  component->AutoplaceFields( /* aScreen */ NULL, /* aManual */ false );
294 
295  PrepareMoveItem( (SCH_ITEM*) component, aDC );
296 
297  return component;
298 }
299 
300 
302 {
303  SCH_SCREEN* screen = GetScreen();
304  SCH_ITEM* item = screen->GetCurItem();
305 
306  wxCHECK_RET( item != NULL && item->Type() == SCH_COMPONENT_T,
307  wxT( "Cannot change orientation of invalid schematic item." ) );
308 
309  SCH_COMPONENT* component = (SCH_COMPONENT*) item;
310 
312 
313  if( item->GetFlags() == 0 )
314  SetUndoItem( item );
315 
317 
318  component->SetOrientation( aOrientation );
319 
320  m_canvas->CrossHairOn( &dc );
321 
322  if( item->GetFlags() == 0 )
323  {
324  addCurrentItemToList();
325  SchematicCleanUp( true );
326  }
327 
328  if( GetScreen()->TestDanglingEnds() )
329  m_canvas->Refresh();
330 
331  OnModify();
332 }
333 
334 
335 void SCH_EDIT_FRAME::OnSelectUnit( wxCommandEvent& aEvent )
336 {
337  SCH_SCREEN* screen = GetScreen();
338  SCH_ITEM* item = screen->GetCurItem();
339 
340  wxCHECK_RET( item != NULL && item->Type() == SCH_COMPONENT_T,
341  wxT( "Cannot select unit of invalid schematic item." ) );
342 
344 
346 
347  SCH_COMPONENT* component = (SCH_COMPONENT*) item;
348 
349  int unit = aEvent.GetId() + 1 - ID_POPUP_SCH_SELECT_UNIT1;
350 
351  LIB_PART* part = GetLibPart( component->GetLibId() );
352 
353  if( !part )
354  return;
355 
356  int unitCount = part->GetUnitCount();
357 
358  wxCHECK_RET( (unit >= 1) && (unit <= unitCount),
359  wxString::Format( wxT( "Cannot select unit %d from component " ), unit ) +
360  part->GetName() );
361 
362  if( unitCount <= 1 || component->GetUnit() == unit )
363  return;
364 
365  if( unit > unitCount )
366  unit = unitCount;
367 
368  STATUS_FLAGS flags = component->GetFlags();
369 
370  if( !flags ) // No command in progress: save in undo list
371  SaveCopyInUndoList( component, UR_CHANGED );
372 
373  if( flags )
374  component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode, g_GhostColor );
375  else
376  component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode );
377 
378  /* Update the unit number. */
379  component->SetUnitSelection( m_CurrentSheet, unit );
380  component->SetUnit( unit );
381  component->ClearFlags();
382  component->SetFlags( flags ); // Restore m_Flag modified by SetUnit()
383 
384  if( m_autoplaceFields )
385  component->AutoAutoplaceFields( GetScreen() );
386 
387  if( screen->TestDanglingEnds() )
388  m_canvas->Refresh();
389 
390  OnModify();
391 }
392 
393 
394 void SCH_EDIT_FRAME::ConvertPart( SCH_COMPONENT* aComponent, wxDC* DC )
395 {
396  if( !aComponent )
397  return;
398 
399  LIB_ID id = aComponent->GetLibId();
400  LIB_PART* part = GetLibPart( id );
401 
402  if( part )
403  {
404  wxString msg;
405 
406  if( !part->HasConversion() )
407  {
408  msg.Printf( _( "No alternate body style found for symbol \"%s\" in library \"%s\"." ),
409  id.GetLibItemName().wx_str(), id.GetLibNickname().wx_str() );
410  DisplayError( this, msg );
411  return;
412  }
413 
414  STATUS_FLAGS flags = aComponent->GetFlags();
415 
416  if( aComponent->GetFlags() )
417  aComponent->Draw( m_canvas, DC, wxPoint( 0, 0 ), g_XorMode, g_GhostColor );
418  else
419  aComponent->Draw( m_canvas, DC, wxPoint( 0, 0 ), g_XorMode );
420 
421  aComponent->SetConvert( aComponent->GetConvert() + 1 );
422 
423  // ensure m_Convert = 0, 1 or 2
424  // 0 and 1 = shape 1 = not converted
425  // 2 = shape 2 = first converted shape
426  // > 2 is not used but could be used for more shapes
427  // like multiple shapes for a programmable component
428  // When m_Convert = val max, return to the first shape
429  if( aComponent->GetConvert() > 2 )
430  aComponent->SetConvert( 1 );
431 
432  // The alternate symbol may cause a change in the connection status so test the
433  // connections so the connection indicators are drawn correctly.
435  aComponent->ClearFlags();
436  aComponent->SetFlags( flags ); // Restore m_Flag (modified by SetConvert())
437 
438  /* Redraw the component in the new position. */
439  if( aComponent->IsMoving() )
440  aComponent->Draw( m_canvas, DC, wxPoint( 0, 0 ), g_XorMode, g_GhostColor );
441  else
442  aComponent->Draw( m_canvas, DC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE );
443 
444  OnModify();
445  }
446 }
GR_DRAWMODE g_XorMode
Definition: gr_basic.cpp:73
bool IsValid() const
Definition: lib_id.h:175
void OrientComponent(COMPONENT_ORIENTATION_T aOrientation=CMP_NORMAL)
Rotate and mirror a component.
Definition: getpart.cpp:301
KICAD_T Type() const
Function Type()
Definition: base_struct.h:209
void GetMsgPanelInfo(std::vector< MSG_PANEL_ITEM > &aList) override
Function GetMsgPanelInfo populates aList of MSG_PANEL_ITEM objects with it&#39;s internal state for displ...
void SetFilter(const SCHLIB_FILTER *aFilter)
Set a filter to display only libraries and/or components which match the filter.
void AutoAutoplaceFields(SCH_SCREEN *aScreen)
Autoplace fields only if correct to do so automatically.
STATUS_FLAGS GetFlags() const
Definition: base_struct.h:266
Part library alias object definition.
bool IsMoving() const
Definition: base_struct.h:229
KIWAY & Kiway() const
Function Kiway returns a reference to the KIWAY that this object has an opportunity to participate in...
Definition: kiway_player.h:60
name of datasheet
void Parse(void *yyp, int yymajor, ParseTOKENTYPE yyminorParseARG_PDECL)
void SetUnitAndConvert(int aUnit, int aConvert)
Set unit and convert, and set flag preventing them from automatically resetting to 1...
bool HasConversion() const
Test if part has more than one body conversion type (DeMorgan).
virtual void Refresh(bool eraseBackground=true, const wxRect *rect=NULL) override
Update the board display after modifying it bu a python script (note: it is automatically called by a...
Definition: draw_panel.cpp:338
COMPONENT_ORIENTATION_T
enum used in RotationMiroir()
This file is part of the common library.
COMPONENT_SELECTION SelectComponentFromLibBrowser(wxTopLevelWindow *aParent, const SCHLIB_FILTER *aFilter, const LIB_ID &aPreselectedLibid, int aUnit, int aConvert)
Function SelectComponentFromLibBrowser Calls the library viewer to select component to import into sc...
Definition: getpart.cpp:54
bool Resolve(PART_LIBS *aLibs)
Assigns the current LIB_PART from aLibs which this symbol is based on.
SCH_SCREEN * GetScreen() const override
Function GetScreen returns a pointer to a BASE_SCREEN or one of its derivatives.
std::vector< COMPONENT_SELECTION > HISTORY_LIST
LIB_PART * GetLibPart(const LIB_ID &aLibId, bool aUseCacheLib=false, bool aShowErrorMsg=false)
void SetUnitSelection(SCH_SHEET_PATH *aSheet, int aUnitSelection)
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
void MoveCursorToCrossHair()
Function MoveCursorToCrossHair warps the cursor to the current cross hair position.
Definition: draw_panel.cpp:360
void SetSelectedComponent(const wxString &aComponentName)
Set the selected component.
Symbol library viewer main window.
Definition: viewlib_frame.h:49
static PTR Create(SYMBOL_LIB_TABLE *aLibs)
Factory function: create a model adapter in a reference-counting container.
void SetConvert(int aConvert)
#define IS_NEW
New item, just created.
Definition: base_struct.h:109
void SetCurrentSheetPath(const SCH_SHEET_PATH *aSheetPath)
Dialog class to select a component from the libraries.
int GetConvert() const
PROJECT & Prj() const
Function Prj returns a reference to the PROJECT "associated with" this KIWAY.
void SetLibId(const LIB_ID &aName, PART_LIBS *aLibs=NULL)
std::vector< std::pair< int, wxString > > GetFields() const
Get a list of fields edited by the user.
a helper to handle the real device context used in KiCad
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
void SetFlags(STATUS_FLAGS aMask)
Definition: base_struct.h:264
SCH_FIELD * GetField(int aFieldNdx) const
Returns a field in this symbol.
bool IsExternalBrowserSelected() const
Function IsExternalBrowserSelected.
VTBL_ENTRY KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=NULL)
Function Player returns the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:300
const wxArrayString & GetAllowedLibList() const
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Function SetMsgPanel clears the message panel and populates it with the contents of aList...
Definition: draw_frame.cpp:831
SCH_ITEM * GetCurItem() const
Return the currently selected SCH_ITEM, overriding BASE_SCREEN::GetCurItem().
Definition: sch_screen.h:174
int GetUnit(void)
const UTF8 & GetLibItemName() const
Definition: lib_id.h:118
int ShowQuasiModal()
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:128
Define a library symbol object.
void OnSelectUnit(wxCommandEvent &aEvent)
Definition: getpart.cpp:335
unsigned STATUS_FLAGS
Definition: base_struct.h:142
bool GetFilterPowerParts() const
void SetUnit(int aUnit)
Change the unit number to aUnit.
std::vector< std::pair< int, wxString > > Fields
int GetConvert(void)
int GetUnitCount() const
EDA_DRAW_PANEL * m_canvas
The area to draw on.
Definition: draw_frame.h:106
wxString GetDocFileName() const
#define GR_DEFAULT_DRAWMODE
Definition: general.h:70
Definition the SCH_COMPONENT class for Eeschema.
void CrossHairOn(wxDC *DC)
Definition: draw_panel.cpp:272
SCH_COMPONENT * Load_Component(wxDC *aDC, const SCHLIB_FILTER *aFilter, SCH_BASE_FRAME::HISTORY_LIST &aHistoryList, bool aUseLibBrowser)
Load a symbol library and places it on the current schematic.
Definition: getpart.cpp:214
see class PGM_BASE
void AutoplaceFields(SCH_SCREEN *aScreen, bool aManual)
Automatically orient all the fields in the component.
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
#define INSTALL_UNBUFFERED_DC(name, parent)
bool TestDanglingEnds()
Test all of the connectable objects in the schematic for unused connection points.
Definition: sch_screen.cpp:913
void Draw(EDA_DRAW_PANEL *aPanel, wxDC *aDC, const wxPoint &aOffset, GR_DRAWMODE aDrawMode, COLOR4D aColor=COLOR4D::UNSPECIFIED) override
Function Draw Draw a schematic item.
size_t i
Definition: json11.cpp:597
void SetIgnoreMouseEvents(bool aIgnore)
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:69
const LIB_ID & GetLibId() const
std::vector< MSG_PANEL_ITEM > MSG_PANEL_ITEMS
Definition: msgpanel.h:102
UTF8 Format() const
Definition: lib_id.cpp:263
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
void ClearFlags(STATUS_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: base_struct.h:265
COMPONENT_SELECTION SelectComponentFromLibrary(const SCHLIB_FILTER *aFilter, std::vector< COMPONENT_SELECTION > &aHistoryList, bool aUseLibBrowser, int aUnit, int aConvert, bool aShowFootprints, const LIB_ID *aHighlight=nullptr, bool aAllowFields=true)
Function SelectComponentFromLib Calls the library viewer to select component to import into schematic...
Definition: getpart.cpp:101
const wxString & GetName() const
LIB_ID GetSelectedLibId(int *aUnit=nullptr) const
To be called after this dialog returns from ShowModal().
Definition of class LIB_EDIT_FRAME.
Definition for part library class.
const wxString & GetLibSource() const
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition: lib_id.h:101
Message panel definition file.
LIB_ALIAS * GetLibAlias(const LIB_ID &aLibId, bool aUseCacheLib=false, bool aShowErrorMsg=false)
Load symbol from symbol library table.
#define VALUE
void DisplayError(wxWindow *parent, const wxString &text, int displaytime)
Function DisplayError displays an error or warning message box with aMessage.
Definition: confirm.cpp:185
wxPoint GetCrossHairPosition(bool aInvertY=false) const
Function GetCrossHairPosition return the current cross hair position in logical (drawing) coordinates...
Class SCH_ITEM is a base class for any item which can be embedded within the SCHEMATIC container clas...
VTBL_ENTRY bool ShowModal(wxString *aResult=NULL, wxWindow *aResultantFocusWindow=NULL)
Function ShowModal puts up this wxFrame as if it were a modal dialog, with all other instantiated wxF...
COLOR4D g_GhostColor
Draw color for moving objects.
Definition: common.cpp:58
std::vector< wxString > GetLogicalLibs()
Return the logical library names, all of them that are pertinent to a look up done on this LIB_TABLE...
void SetSelectedLibrary(const wxString &aLibName)
Set the selected library in the library window.
virtual void SetText(const wxString &aText)
Definition: eda_text.h:139
void ConvertPart(SCH_COMPONENT *DrawComponent, wxDC *DC)
Definition: getpart.cpp:394