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 <boost/ptr_container/ptr_vector.hpp>
35 #include <wx/filename.h>
36 
37 #include <sch_io_mgr.h>
38 
39 #include <project.h>
40 
41 #include <map>
42 
43 class LIB_PART;
44 class LIB_ID;
45 class LINE_READER;
46 class OUTPUTFORMATTER;
47 class SCH_LEGACY_PLUGIN;
48 class SCH_PLUGIN;
49 
50 
51 #define DOC_EXT "dcm"
52 
53 /*
54  * Part Library version and file header macros.
55  */
56 #define LIB_VERSION_MAJOR 2
57 #define LIB_VERSION_MINOR 4
58 
59 /* Must be the first line of part library (.lib) files. */
60 #define LIBFILE_IDENT "EESchema-LIBRARY Version"
61 
62 #define LIB_VERSION( major, minor ) ( major * 100 + minor )
63 
64 #define IS_LIB_CURRENT_VERSION( major, minor ) \
65  ( \
66  LIB_VERSION( major1, minor1 ) == \
67  LIB_VERSION( LIB_VERSION_MAJOR, LIB_VERSION_MINOR) \
68  )
69 
70 /*
71  * Library versions 2.4 and lower use the old separate library (.lib) and
72  * document (.dcm) files. Part libraries after 2.4 merged the library
73  * and document files into a single library file. This macro checks if the
74  * library version supports the old format
75  */
76 #define USE_OLD_DOC_FILE_FORMAT( major, minor ) \
77  ( LIB_VERSION( major, minor ) <= LIB_VERSION( 2, 4 ) )
78 
79 // Helper class to filter a list of libraries, and/or a list of PART_LIB
80 // in dialogs
82 {
83  wxArrayString m_allowedLibs;
84  bool m_filterPowerParts;
86  bool m_forceLoad; // When true, load a part lib from the lib
87  // which is given in m_allowedLibs[0]
88 
89 public:
91  {
92  m_filterPowerParts = false;
93  m_forceLoad = false;
94  }
95 
99  void AddLib( const wxString& aLibName )
100  {
101  m_allowedLibs.Add( aLibName );
102  m_forceLoad = false;
103  }
104 
105 
109  void LoadFrom( const wxString& aLibName )
110  {
111  m_allowedLibs.Clear();
112  m_allowedLibs.Add( aLibName );
113  m_forceLoad = true;
114  }
115 
120  {
121  m_allowedLibs.Clear();
122  m_forceLoad = false;
123  }
124 
128  void FilterPowerParts( bool aFilterEnable )
129  {
130  m_filterPowerParts = aFilterEnable;
131  }
132 
133  // Accessors
134 
138  bool GetFilterPowerParts() const { return m_filterPowerParts; }
139 
140 
144  const wxArrayString& GetAllowedLibList() const { return m_allowedLibs; }
145 
150  const wxString& GetLibSource() const
151  {
152  static wxString dummy;
153 
154  if( m_forceLoad && m_allowedLibs.GetCount() > 0 )
155  return m_allowedLibs[0];
156  else
157  return dummy;
158  }
159 };
160 
161 
162 /* Helpers for creating a list of part libraries. */
163 class PART_LIB;
164 class wxRegEx;
165 
170 {
171  bool operator() ( const wxString& aItem1, const wxString& aItem2 ) const
172  {
173  return aItem1 < aItem2;
174  }
175 };
176 
178 
179 typedef std::map< wxString, LIB_PART*, LibPartMapSort > LIB_PART_MAP;
180 typedef std::vector< LIB_PART* > LIB_PARTS;
181 typedef boost::ptr_vector< PART_LIB > PART_LIBS_BASE;
182 
183 
191 {
192 public:
193  KICAD_T Type() override { return PART_LIBS_T; }
194 
195  static int s_modify_generation;
196 
198  {
200  }
201 
204  int GetModifyHash();
205 
212  PART_LIB* AddLibrary( const wxString& aFileName );
213 
222  PART_LIB* AddLibrary( const wxString& aFileName, PART_LIBS::iterator& aIterator );
223 
231  void LoadAllLibraries( PROJECT* aProject, bool aShowProgress=true );
232 
236  static void LibNamesAndPaths( PROJECT* aProject, bool doSave,
237  wxString* aPaths, wxArrayString* aNames=NULL );
238 
245  static const wxString CacheName( const wxString& aFullProjectFilename );
246 
253  PART_LIB* FindLibrary( const wxString& aName );
254 
255  PART_LIB* FindLibraryByFullFileName( const wxString& aFullFileName );
256 
258 
265  wxArrayString GetLibraryNames( bool aSorted = true );
266 
277  LIB_PART* FindLibPart( const LIB_ID& aLibId, const wxString& aLibraryName = wxEmptyString );
278 
292  void FindLibraryNearEntries( std::vector<LIB_PART*>& aCandidates, const wxString& aEntryName,
293  const wxString& aLibraryName = wxEmptyString );
294 
295  int GetLibraryCount() { return size(); }
296 };
297 
298 
305 class PART_LIB
306 {
307  int type;
308  wxFileName fileName;
309  wxDateTime timeStamp;
312  wxString header;
313  bool isModified;
315 
316  SCH_IO_MGR::SCH_FILE_T m_pluginType;
317  std::unique_ptr< SCH_PLUGIN > m_plugin;
318  std::unique_ptr< PROPERTIES > m_properties;
319 
320 public:
321  PART_LIB( int aType, const wxString& aFileName,
322  SCH_IO_MGR::SCH_FILE_T aPluginType = SCH_IO_MGR::SCH_LEGACY );
323  ~PART_LIB();
324 
328  int GetModHash() const { return m_mod_hash; }
329 
330  SCH_IO_MGR::SCH_FILE_T GetPluginType() const { return m_pluginType; }
331 
332  void SetPluginType( SCH_IO_MGR::SCH_FILE_T aPluginType );
333 
334  void Create( const wxString& aFileName = wxEmptyString );
335 
336  void SetFileName( const wxString& aFileName ) { fileName = aFileName; }
337 
338  bool IsModified() const
339  {
340  return isModified;
341  }
342 
343  bool IsCache() const;
344 
345  void SetCache();
346 
347  bool IsBuffering() const;
348 
349  void EnableBuffering( bool aEnable = true );
350 
351  void Save( bool aSaveDocFile = true );
352 
356  bool IsReadOnly() const { return !fileName.IsFileWritable(); }
357 
363  void GetPartNames( wxArrayString& aNames ) const;
364 
370  void GetParts( std::vector<LIB_PART*>& aPart) const;
371 
378  LIB_PART* FindPart( const wxString& aName ) const;
379 
380  LIB_PART* FindPart( const LIB_ID& aLibId ) const;
381 
390  void AddPart( LIB_PART* aPart );
391 
403  LIB_PART* RemovePart( LIB_PART* aEntry );
404 
413  LIB_PART* ReplacePart( LIB_PART* aOldPart, LIB_PART* aNewPart );
414 
420  const wxString GetName() const { return fileName.GetName(); }
421 
427  wxString GetFullFileName() const { return fileName.GetFullPath(); }
428 
434  const wxString GetLogicalName() const
435  {
436  /* for now is the filename without path or extension.
437 
438  Technically the library should not know its logical name!
439  This will eventually come out of a pair of lookup tables using a
440  reverse lookup using the full name or library pointer as a key.
441  Search will be by project lookup table and then user lookup table if
442  not found.
443  */
444  return fileName.GetName();
445  }
446 
447 
455  static PART_LIB* LoadLibrary( const wxString& aFileName );
456 };
457 
458 
462 bool operator==( const PART_LIB& aLibrary, const wxString& aName );
463 bool operator!=( const PART_LIB& aLibrary, const wxString& aName );
464 
465 #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.
Class LINE_READER is an abstract class from which implementation specific LINE_READERs may be derived...
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
Class PROJECT holds project specific data.
Definition: project.h:58
const wxString & GetLibSource() const
bool m_filterPowerParts
true to filter (show only) power parts
Definition: class_library.h:85
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.
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.
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:99
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:187
const wxString GetLogicalName() const
Return the logical name of the library.
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:83
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:68
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)