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 Wayne Stambaugh <stambaughw@gmail.com>
6  * Copyright (C) 2004-2019 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 <map>
35 #include <boost/ptr_container/ptr_vector.hpp>
36 #include <wx/filename.h>
37 
38 #include <sch_io_mgr.h>
39 #include <project.h>
40 
41 class LIB_PART;
42 class LIB_ID;
43 class LINE_READER;
44 class OUTPUTFORMATTER;
45 class SCH_LEGACY_PLUGIN;
46 class SCH_PLUGIN;
47 
48 
49 #define DOC_EXT "dcm"
50 
51 /*
52  * Part Library version and file header macros.
53  */
54 #define LIB_VERSION_MAJOR 2
55 #define LIB_VERSION_MINOR 4
56 
57 /* Must be the first line of part library (.lib) files. */
58 #define LIBFILE_IDENT "EESchema-LIBRARY Version"
59 
60 #define LIB_VERSION( major, minor ) ( major * 100 + minor )
61 
62 #define IS_LIB_CURRENT_VERSION( major, minor ) \
63  ( \
64  LIB_VERSION( major1, minor1 ) == \
65  LIB_VERSION( LIB_VERSION_MAJOR, LIB_VERSION_MINOR) \
66  )
67 
68 /*
69  * Library versions 2.4 and lower use the old separate library (.lib) and
70  * document (.dcm) files. Part libraries after 2.4 merged the library
71  * and document files into a single library file. This macro checks if the
72  * library version supports the old format
73  */
74 #define USE_OLD_DOC_FILE_FORMAT( major, minor ) \
75  ( LIB_VERSION( major, minor ) <= LIB_VERSION( 2, 4 ) )
76 
77 // Helper class to filter a list of libraries, and/or a list of PART_LIB
78 // in dialogs
80 {
81  wxArrayString m_allowedLibs;
82  bool m_filterPowerParts;
84  bool m_forceLoad; // When true, load a part lib from the lib
85  // which is given in m_allowedLibs[0]
86 
87 public:
89  {
90  m_filterPowerParts = false;
91  m_forceLoad = false;
92  }
93 
97  void AddLib( const wxString& aLibName )
98  {
99  m_allowedLibs.Add( aLibName );
100  m_forceLoad = false;
101  }
102 
103 
107  void LoadFrom( const wxString& aLibName )
108  {
109  m_allowedLibs.Clear();
110  m_allowedLibs.Add( aLibName );
111  m_forceLoad = true;
112  }
113 
118  {
119  m_allowedLibs.Clear();
120  m_forceLoad = false;
121  }
122 
126  void FilterPowerParts( bool aFilterEnable )
127  {
128  m_filterPowerParts = aFilterEnable;
129  }
130 
131  // Accessors
132 
136  bool GetFilterPowerParts() const { return m_filterPowerParts; }
137 
138 
142  const wxArrayString& GetAllowedLibList() const { return m_allowedLibs; }
143 
148  const wxString& GetLibSource() const
149  {
150  static wxString dummy;
151 
152  if( m_forceLoad && m_allowedLibs.GetCount() > 0 )
153  return m_allowedLibs[0];
154  else
155  return dummy;
156  }
157 };
158 
159 
160 /* Helpers for creating a list of part libraries. */
161 class PART_LIB;
162 class wxRegEx;
163 
168 {
169  bool operator() ( const wxString& aItem1, const wxString& aItem2 ) const
170  {
171  return aItem1 < aItem2;
172  }
173 };
174 
176 
177 typedef std::map< wxString, LIB_PART*, LibPartMapSort > LIB_PART_MAP;
178 typedef std::vector< LIB_PART* > LIB_PARTS;
179 typedef boost::ptr_vector< PART_LIB > PART_LIBS_BASE;
180 
181 
189 {
190 public:
191  KICAD_T Type() override { return PART_LIBS_T; }
192 
193  static int s_modify_generation;
194 
196  {
198  }
199 
202  int GetModifyHash();
203 
210  PART_LIB* AddLibrary( const wxString& aFileName );
211 
220  PART_LIB* AddLibrary( const wxString& aFileName, PART_LIBS::iterator& aIterator );
221 
229  void LoadAllLibraries( PROJECT* aProject, bool aShowProgress=true );
230 
234  static void LibNamesAndPaths( PROJECT* aProject, bool doSave,
235  wxString* aPaths, wxArrayString* aNames=NULL );
236 
243  static const wxString CacheName( const wxString& aFullProjectFilename );
244 
251  PART_LIB* FindLibrary( const wxString& aName );
252 
253  PART_LIB* FindLibraryByFullFileName( const wxString& aFullFileName );
254 
256 
263  wxArrayString GetLibraryNames( bool aSorted = true );
264 
275  LIB_PART* FindLibPart( const LIB_ID& aLibId, const wxString& aLibraryName = wxEmptyString );
276 
290  void FindLibraryNearEntries( std::vector<LIB_PART*>& aCandidates, const wxString& aEntryName,
291  const wxString& aLibraryName = wxEmptyString );
292 
293  int GetLibraryCount() { return size(); }
294 };
295 
296 
303 class PART_LIB
304 {
305  int type;
306  wxFileName fileName;
307  wxDateTime timeStamp;
310  wxString header;
311  bool isModified;
313 
314  SCH_IO_MGR::SCH_FILE_T m_pluginType;
315  std::unique_ptr< SCH_PLUGIN > m_plugin;
316  std::unique_ptr< PROPERTIES > m_properties;
317 
318 public:
319  PART_LIB( int aType, const wxString& aFileName,
320  SCH_IO_MGR::SCH_FILE_T aPluginType = SCH_IO_MGR::SCH_LEGACY );
321  ~PART_LIB();
322 
326  int GetModHash() const { return m_mod_hash; }
327 
328  SCH_IO_MGR::SCH_FILE_T GetPluginType() const { return m_pluginType; }
329 
330  void SetPluginType( SCH_IO_MGR::SCH_FILE_T aPluginType );
331 
332  void Create( const wxString& aFileName = wxEmptyString );
333 
334  void SetFileName( const wxString& aFileName ) { fileName = aFileName; }
335 
336  bool IsModified() const
337  {
338  return isModified;
339  }
340 
341  bool IsCache() const;
342 
343  void SetCache();
344 
345  bool IsBuffering() const;
346 
347  void EnableBuffering( bool aEnable = true );
348 
349  void Save( bool aSaveDocFile = true );
350 
354  bool IsReadOnly() const { return !fileName.IsFileWritable(); }
355 
361  void GetPartNames( wxArrayString& aNames ) const;
362 
368  void GetParts( std::vector<LIB_PART*>& aPart) const;
369 
376  LIB_PART* FindPart( const wxString& aName ) const;
377 
378  LIB_PART* FindPart( const LIB_ID& aLibId ) const;
379 
388  void AddPart( LIB_PART* aPart );
389 
401  LIB_PART* RemovePart( LIB_PART* aEntry );
402 
411  LIB_PART* ReplacePart( LIB_PART* aOldPart, LIB_PART* aNewPart );
412 
418  const wxString GetName() const { return fileName.GetName(); }
419 
425  wxString GetFullFileName() const { return fileName.GetFullPath(); }
426 
432  const wxString GetLogicalName() const
433  {
434  /* for now is the filename without path or extension.
435 
436  Technically the library should not know its logical name!
437  This will eventually come out of a pair of lookup tables using a
438  reverse lookup using the full name or library pointer as a key.
439  Search will be by project lookup table and then user lookup table if
440  not found.
441  */
442  return fileName.GetName();
443  }
444 
445 
453  static PART_LIB* LoadLibrary( const wxString& aFileName );
454 };
455 
456 
460 bool operator==( const PART_LIB& aLibrary, const wxString& aName );
461 bool operator!=( const PART_LIB& aLibrary, const wxString& aName );
462 
463 #endif // CLASS_LIBRARY_H
const wxString GetName() const
Return the file name without path or extension.
wxString GetFullFileName() const
Return the full file library name with path and extension.
bool IsModified() const
int m_mod_hash
incremented each time library is changed.
LINE_READER is an abstract class from which implementation specific LINE_READERs may be derived to re...
Definition: richio.h:81
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)
Save or load the names of the currently configured part libraries (without paths).
void FilterPowerParts(bool aFilterEnable)
set the filtering of power parts
PROJECT holds project specific data.
Definition: project.h:61
const wxString & GetLibSource() const
bool m_filterPowerParts
true to filter (show only) power parts
Definition: class_library.h:83
void LoadAllLibraries(PROJECT *aProject, bool aShowProgress=true)
Load 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 isModified
Library modification status.
PART_LIB * GetCacheLibrary()
void LoadFrom(const wxString &aLibName)
add a lib name to the allowed libraries
std::map< wxString, LIB_PART *, LibPartMapSort > LIB_PART_MAP
Part map used by part library object.
wxArrayString GetLibraryNames(bool aSorted=true)
Return 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.
void FindLibraryNearEntries(std::vector< LIB_PART * > &aCandidates, const wxString &aEntryName, const wxString &aLibraryName=wxEmptyString)
Search all libraries in the list for a LIB_PART using a case insensitive comparison.
OUTPUTFORMATTER is an important interface (abstract class) used to output 8 bit text in a convenient ...
Definition: richio.h:327
int GetLibraryCount()
int type
Library type indicator.
LIB_PART * RemovePart(LIB_PART *aEntry)
Safely remove aEntry from the library and return the next entry.
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)
Find a part library by aName.
static const wxString CacheName(const wxString &aFullProjectFilename)
Return the name of the cache library after potentially fixing it from an older naming scheme.
void GetPartNames(wxArrayString &aNames) const
Load a string array with the names of all the entries in this library.
std::vector< LIB_PART * > LIB_PARTS
KICAD_T
Enum KICAD_T is the set of class identification values, stored in EDA_ITEM::m_StructType.
Definition: typeinfo.h:78
void AddLib(const wxString &aLibName)
add a lib name to the allowed libraries
Definition: class_library.h:97
bool IsBuffering() const
void EnableBuffering(bool aEnable=true)
int GetModHash() const
SCH_IO_MGR::SCH_FILE_T GetPluginType() const
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:152
const wxString GetLogicalName() const
Return the logical name of the library.
#define NULL
KICAD_T Type() override
wxDateTime timeStamp
Library save time and date.
PART_LIB * AddLibrary(const wxString &aFileName)
Allocate and adds a part library to the library list.
static PART_LIB * LoadLibrary(const wxString &aFileName)
Allocate and load a symbol library file.
Define a library symbol object.
void SetCache()
boost::ptr_vector< PART_LIB > PART_LIBS_BASE
std::unique_ptr< PROPERTIES > m_properties
Library properties.
LIB_PART * FindLibPart(const LIB_ID &aLibId, const wxString &aLibraryName=wxEmptyString)
Search all libraries in the list for a part.
SCH_IO_MGR::SCH_FILE_T m_pluginType
bool GetFilterPowerParts() const
LIB_PART * FindPart(const wxString &aName) const
Find LIB_PART by aName.
wxArrayString m_allowedLibs
a list of lib names to list some libraries if empty: no filter
Definition: class_library.h:81
A SCH_PLUGIN derivation for loading schematic files created before the new s-expression file format.
wxFileName fileName
Library file name.
void GetParts(std::vector< LIB_PART * > &aPart) const
Load a vector with all the entries in this library.
A collection of PART_LIB objects.
void AddPart(LIB_PART *aPart)
Add aPart entry to library.
LIB_PART map sorting.
static LIB_PART * dummy()
Used to draw a dummy shape when a LIB_PART is not found in library.
int versionMinor
Library minor version number.
bool operator()(const wxString &aItem1, const wxString &aItem2) const
const wxArrayString & GetAllowedLibList() const
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:74
bool IsReadOnly() const
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)
Object used to load, save, search, and otherwise manipulate symbol library files.
bool IsCache() const
int versionMajor
Library major version number.
bool operator!=(const PART_LIB &aLibrary, const wxString &aName)