KiCad PCB EDA Suite
class_library.h
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-2017 Wayne Stambaugh <stambaughw@verizon.net>
6  * Copyright (C) 2004-2017 KiCad Developers, see change_log.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 #ifndef CLASS_LIBRARY_H
32 #define CLASS_LIBRARY_H
33 
34 #include <wx/filename.h>
35 
36 #include <class_libentry.h>
37 #include <sch_io_mgr.h>
38 
39 #include <project.h>
40 
41 #include <map>
42 
43 class LIB_ID;
44 class LINE_READER;
45 class OUTPUTFORMATTER;
46 class SCH_LEGACY_PLUGIN;
47 class SCH_PLUGIN;
48 
49 
50 #define DOC_EXT "dcm"
51 
52 /*
53  * Part Library version and file header macros.
54  */
55 #define LIB_VERSION_MAJOR 2
56 #define LIB_VERSION_MINOR 4
57 
58 /* Must be the first line of part library (.lib) files. */
59 #define LIBFILE_IDENT "EESchema-LIBRARY Version"
60 
61 #define LIB_VERSION( major, minor ) ( major * 100 + minor )
62 
63 #define IS_LIB_CURRENT_VERSION( major, minor ) \
64  ( \
65  LIB_VERSION( major1, minor1 ) == \
66  LIB_VERSION( LIB_VERSION_MAJOR, LIB_VERSION_MINOR) \
67  )
68 
69 /*
70  * Library versions 2.4 and lower use the old separate library (.lib) and
71  * document (.dcm) files. Part libraries after 2.4 merged the library
72  * and document files into a single library file. This macro checks if the
73  * library version supports the old format
74  */
75 #define USE_OLD_DOC_FILE_FORMAT( major, minor ) \
76  ( LIB_VERSION( major, minor ) <= LIB_VERSION( 2, 4 ) )
77 
78 // Helper class to filter a list of libraries, and/or a list of PART_LIB
79 // in dialogs
81 {
82  wxArrayString m_allowedLibs;
83  bool m_filterPowerParts;
85  bool m_forceLoad; // When true, load a part lib from the lib
86  // which is given in m_allowedLibs[0]
87 
88 public:
90  {
91  m_filterPowerParts = false;
92  m_forceLoad = false;
93  }
94 
98  void AddLib( const wxString& aLibName )
99  {
100  m_allowedLibs.Add( aLibName );
101  m_forceLoad = false;
102  }
103 
104 
108  void LoadFrom( const wxString& aLibName )
109  {
110  m_allowedLibs.Clear();
111  m_allowedLibs.Add( aLibName );
112  m_forceLoad = true;
113  }
114 
119  {
120  m_allowedLibs.Clear();
121  m_forceLoad = false;
122  }
123 
127  void FilterPowerParts( bool aFilterEnable )
128  {
129  m_filterPowerParts = aFilterEnable;
130  }
131 
132  // Accessors
133 
138  bool GetFilterPowerParts() const { return m_filterPowerParts; }
139 
140 
145  const wxArrayString& GetAllowedLibList() const { return m_allowedLibs; }
146 
152  const wxString& GetLibSource() const
153  {
154  static wxString dummy;
155 
156  if( m_forceLoad && m_allowedLibs.GetCount() > 0 )
157  return m_allowedLibs[0];
158  else
159  return dummy;
160  }
161 };
162 
163 
164 /* Helpers for creating a list of part libraries. */
165 class PART_LIB;
166 class wxRegEx;
167 
172 {
173  bool operator() ( const wxString& aItem1, const wxString& aItem2 ) const
174  {
175  return aItem1 < aItem2;
176  }
177 };
178 
180 
181 typedef std::map< wxString, LIB_ALIAS*, AliasMapSort > LIB_ALIAS_MAP;
182 typedef std::vector< LIB_ALIAS* > LIB_ALIASES;
183 typedef boost::ptr_vector< PART_LIB > PART_LIBS_BASE;
184 
185 
193 {
194 public:
195 
196  static int s_modify_generation;
197 
199  {
201  }
202 
205  int GetModifyHash();
206 
214  PART_LIB* AddLibrary( const wxString& aFileName );
215 
225  PART_LIB* AddLibrary( const wxString& aFileName, PART_LIBS::iterator& aIterator );
226 
232  void LoadAllLibraries( PROJECT* aProject, bool aShowProgress=true );
233 
239  static void LibNamesAndPaths( PROJECT* aProject, bool doSave,
240  wxString* aPaths, wxArrayString* aNames=NULL );
241 
248  static const wxString CacheName( const wxString& aFullProjectFilename );
249 
257  PART_LIB* FindLibrary( const wxString& aName );
258 
259  PART_LIB* FindLibraryByFullFileName( const wxString& aFullFileName );
260 
262 
271  wxArrayString GetLibraryNames( bool aSorted = true );
272 
284  LIB_PART* FindLibPart( const LIB_ID& aLibId, const wxString& aLibraryName = wxEmptyString );
285 
296  LIB_ALIAS* FindLibraryAlias( const LIB_ID& aLibId,
297  const wxString& aLibraryName = wxEmptyString );
298 
312  void FindLibraryNearEntries( std::vector<LIB_ALIAS*>& aCandidates, const wxString& aEntryName,
313  const wxString& aLibraryName = wxEmptyString );
314 
315  int GetLibraryCount() { return size(); }
316 };
317 
318 
324 class PART_LIB
325 {
326  int type;
327  wxFileName fileName;
328  wxDateTime timeStamp;
331  wxString header;
332  bool isModified;
334 
335  SCH_IO_MGR::SCH_FILE_T m_pluginType;
336  std::unique_ptr< SCH_PLUGIN > m_plugin;
337  std::unique_ptr< PROPERTIES > m_properties;
338 
339 public:
340  PART_LIB( int aType, const wxString& aFileName,
341  SCH_IO_MGR::SCH_FILE_T aPluginType = SCH_IO_MGR::SCH_LEGACY );
342  ~PART_LIB();
343 
347  int GetModHash() const { return m_mod_hash; }
348 
349  SCH_IO_MGR::SCH_FILE_T GetPluginType() const { return m_pluginType; }
350 
351  void SetPluginType( SCH_IO_MGR::SCH_FILE_T aPluginType );
352 
353  void Create( const wxString& aFileName = wxEmptyString );
354 
355  void SetFileName( const wxString& aFileName ) { fileName = aFileName; }
356 
362  bool IsEmpty() const
363  {
364  return m_plugin->GetSymbolLibCount( fileName.GetFullPath() ) == 0;
365  }
366 
373  int GetCount() const
374  {
375  return (int) m_plugin->GetSymbolLibCount( fileName.GetFullPath() );
376  }
377 
378  bool IsModified() const
379  {
380  return isModified;
381  }
382 
383  bool IsCache() const;
384 
385  void SetCache();
386 
387  bool IsBuffering() const;
388 
389  void EnableBuffering( bool aEnable = true );
390 
391  void Save( bool aSaveDocFile = true );
392 
397  bool IsReadOnly() const { return !fileName.IsFileWritable(); }
398 
404  void GetAliasNames( wxArrayString& aNames ) const;
405 
411  void GetAliases( std::vector<LIB_ALIAS*>& aAliases ) const;
412 
418  void GetEntryTypePowerNames( wxArrayString& aNames ) const;
419 
426  LIB_ALIAS* FindAlias( const wxString& aName ) const;
427 
437  LIB_PART* FindPart( const wxString& aName ) const;
438 
447  void AddPart( LIB_PART* aPart );
448 
460  LIB_ALIAS* RemoveAlias( LIB_ALIAS* aEntry );
461 
469  LIB_PART* ReplacePart( LIB_PART* aOldPart, LIB_PART* aNewPart );
470 
476  const wxString GetName() const { return fileName.GetName(); }
477 
484  wxString GetFullFileName() const { return fileName.GetFullPath(); }
485 
491  const wxString GetLogicalName() const
492  {
493  /* for now is the filename without path or extension.
494 
495  Technically the library should not know its logical name!
496  This will eventually come out of a pair of lookup tables using a
497  reverse lookup using the full name or library pointer as a key.
498  Search will be by project lookup table and then user lookup table if
499  not found.
500  */
501  return fileName.GetName();
502  }
503 
504 
514  static PART_LIB* LoadLibrary( const wxString& aFileName );
515 
521  bool HasPowerParts() const;
522 };
523 
524 
528 bool operator==( const PART_LIB& aLibrary, const wxString& aName );
529 bool operator!=( const PART_LIB& aLibrary, const wxString& aName );
530 
531 #endif // CLASS_LIBRARY_H
int m_mod_hash
incremented each time library is changed.
Class LINE_READER is an abstract class from which implementation specific LINE_READERs may be derived...
Definition: richio.h:81
Part library alias object definition.
bool IsBuffering() const
void GetAliasNames(wxArrayString &aNames) const
Load a string array with the names of all the entries in this library.
LIB_PART * ReplacePart(LIB_PART *aOldPart, LIB_PART *aNewPart)
Replace an existing part entry in the library.
std::unique_ptr< SCH_PLUGIN > m_plugin
static void LibNamesAndPaths(PROJECT *aProject, bool doSave, wxString *aPaths, wxArrayString *aNames=NULL)
Function LibNamesAndPaths either saves or loads the names of the currently configured part libraries ...
void FilterPowerParts(bool aFilterEnable)
set the filtering of power parts
Class PROJECT holds project specific data.
Definition: project.h:56
bool m_filterPowerParts
true to filter (show only) power parts
Definition: class_library.h:84
void LoadAllLibraries(PROJECT *aProject, bool aShowProgress=true)
Function LoadAllLibraries loads all of the project's libraries into this container, which should be cleared before calling it.
static int s_modify_generation
helper for GetModifyHash()
void Save(bool aSaveDocFile=true)
bool operator()(const wxString &aItem1, const wxString &aItem2) const
bool isModified
Library modification status.
PART_LIB * GetCacheLibrary()
LIB_ALIAS * RemoveAlias(LIB_ALIAS *aEntry)
Safely remove aEntry from the library and return the next entry.
void LoadFrom(const wxString &aLibName)
add a lib name to the allowed libraries
bool IsCache() const
wxArrayString GetLibraryNames(bool aSorted=true)
Function GetLibraryNames returns the list of part library file names without path and extension...
int GetModifyHash()
Return the modification hash for all libraries.
wxString header
first line of loaded library.
SCH_IO_MGR::SCH_FILE_T GetPluginType() const
Class OUTPUTFORMATTER is an important interface (abstract class) used to output 8 bit text in a conve...
Definition: richio.h:327
int GetLibraryCount()
int type
Library type indicator.
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
bool operator==(const PART_LIB &aLibrary, const wxString &aName)
Case insensitive library name comparison.
PART_LIB * FindLibrary(const wxString &aName)
Function FindLibrary finds a part library by aName.
static const wxString CacheName(const wxString &aFullProjectFilename)
Function cacheName returns the name of the cache library after potentially fixing it from an older na...
LIB_ALIAS map sorting.
LIB_ALIAS * FindLibraryAlias(const LIB_ID &aLibId, const wxString &aLibraryName=wxEmptyString)
Function FindLibraryEntry searches all libraries in the list for an entry.
std::map< wxString, LIB_ALIAS *, AliasMapSort > LIB_ALIAS_MAP
Alias map used by part library object.
void AddLib(const wxString &aLibName)
add a lib name to the allowed libraries
Definition: class_library.h:98
wxString GetFullFileName() const
Function GetFullFileName returns the full file library name with path and extension.
void EnableBuffering(bool aEnable=true)
void ClearLibList()
Clear the allowed libraries list (allows all libs)
Base class that schematic file and library loading and saving plugins should derive from...
Definition: sch_io_mgr.h:188
const wxArrayString & GetAllowedLibList() const
Function GetAllowedLibList.
Class LIB_ITEM definition.
wxDateTime timeStamp
Library save time and date.
PART_LIB * AddLibrary(const wxString &aFileName)
Function AddLibrary allocates and adds a part library to the library list.
const wxString GetName() const
Return the file name without path or extension.
static PART_LIB * LoadLibrary(const wxString &aFileName)
Function LoadLibrary allocates and loads a part library file.
Class LIB_PART defines a library part object.
LIB_ALIAS * FindAlias(const wxString &aName) const
Find LIB_ALIAS by aName.
bool HasPowerParts() const
Function HasPowerParts.
void SetCache()
boost::ptr_vector< PART_LIB > PART_LIBS_BASE
std::unique_ptr< PROPERTIES > m_properties
Library properties.
const wxString GetLogicalName() const
Function GetLogicalName returns the logical name of the library.
LIB_PART * FindLibPart(const LIB_ID &aLibId, const wxString &aLibraryName=wxEmptyString)
Function FindLibPart searches all libraries in the list for a part.
bool GetFilterPowerParts() const
Function GetFilterPowerParts.
SCH_IO_MGR::SCH_FILE_T m_pluginType
bool IsModified() const
std::vector< LIB_ALIAS * > LIB_ALIASES
wxArrayString m_allowedLibs
a list of lib names to list some libraries if empty: no filter
Definition: class_library.h:82
A SCH_PLUGIN derivation for loading schematic files created before the new s-expression file format...
wxFileName fileName
Library file name.
Class PART_LIBS is a collection of PART_LIBs.
void AddPart(LIB_PART *aPart)
Add aPart entry to library.
bool IsEmpty() const
Get library entry status.
int GetModHash() const
static LIB_PART * dummy()
Used when a LIB_PART is not found in library to draw a dummy shape This component is a 400 mils squar...
int versionMinor
Library minor version number.
void GetAliases(std::vector< LIB_ALIAS * > &aAliases) const
Load a vector with all the entries in this library.
PART_LIB * FindLibraryByFullFileName(const wxString &aFullFileName)
void SetPluginType(SCH_IO_MGR::SCH_FILE_T aPluginType)
A PROJECT can hold stuff it knows nothing about, in the form of _ELEM derivatives.
Definition: project.h:66
bool IsReadOnly() const
Function IsReadOnly.
void GetEntryTypePowerNames(wxArrayString &aNames) const
Load a string array with the names of entries of type POWER in this library.
LIB_PART * FindPart(const wxString &aName) const
Find part by aName.
const wxString & GetLibSource() const
Function GetLibSource.
PART_LIB(int aType, const wxString &aFileName, SCH_IO_MGR::SCH_FILE_T aPluginType=SCH_IO_MGR::SCH_LEGACY)
void SetFileName(const wxString &aFileName)
void Create(const wxString &aFileName=wxEmptyString)
Class PART_LIB is used to load, save, search, and otherwise manipulate part library files...
int versionMajor
Library major version number.
void FindLibraryNearEntries(std::vector< LIB_ALIAS * > &aCandidates, const wxString &aEntryName, const wxString &aLibraryName=wxEmptyString)
Function FindLibraryNearEntries Searches all libraries in the list for an entry, using a case insensi...
bool operator!=(const PART_LIB &aLibrary, const wxString &aName)
int GetCount() const
Function GetCount returns the number of entries in the library.