30#include <lib_table_lexer.h>
44using namespace LIB_TABLE_T;
82 if( in->CurTok() != T_fp_lib_table )
86 if( ( tok = in->NextTok() ) != T_fp_lib_table )
87 in->Expecting( T_fp_lib_table );
90 while( ( tok = in->NextTok() ) != T_RIGHT )
92 std::unique_ptr<FP_LIB_TABLE_ROW> row = std::make_unique<FP_LIB_TABLE_ROW>();
95 in->Expecting( T_RIGHT );
98 in->Expecting( T_LEFT );
101 int lineNum = in->CurLineNumber();
105 if( tok == T_version )
107 in->NeedNUMBER(
"version" );
114 in->Expecting( T_lib );
119 if( ( tok = in->NextTok() ) != T_name )
120 in->Expecting( T_name );
122 in->NeedSYMBOLorNUMBER();
124 row->SetNickName( in->FromUTF8() );
130 bool sawType =
false;
131 bool sawOpts =
false;
132 bool sawDesc =
false;
134 bool sawDisabled =
false;
136 while( ( tok = in->NextTok() ) != T_RIGHT )
139 in->Unexpected( T_EOF );
142 in->Expecting( T_LEFT );
144 tok = in->NeedSYMBOLorNUMBER();
150 in->Duplicate( tok );
152 in->NeedSYMBOLorNUMBER();
153 row->SetFullURI( in->FromUTF8() );
158 in->Duplicate( tok );
160 in->NeedSYMBOLorNUMBER();
161 row->SetType( in->FromUTF8() );
166 in->Duplicate( tok );
168 in->NeedSYMBOLorNUMBER();
169 row->SetOptions( in->FromUTF8() );
174 in->Duplicate( tok );
176 in->NeedSYMBOLorNUMBER();
177 row->SetDescr( in->FromUTF8() );
182 in->Duplicate( tok );
184 row->SetEnabled(
false );
194 in->Unexpected( tok );
201 in->Expecting( T_type );
204 in->Expecting( T_uri );
210 wxString nickname = row->GetNickName();
219 "footprint library table file line %d." ),
223 if( !errMsg.IsEmpty() )
230 if( !errMsg.IsEmpty() )
239 for(
unsigned i = 0; i <
m_rows.size(); ++i )
254 aOutput->
Print( aIndentLevel,
"(fp_lib_table\n" );
258 it->Format( aOutput, aIndentLevel+1 );
260 aOutput->
Print( aIndentLevel,
")\n" );
272 wxCHECK( row && row->
plugin, hash );
275 wxHashTable::MakeKey( *aNickname );
282 wxCHECK2( row && row->
plugin,
continue );
285 wxHashTable::MakeKey( nickname );
319 wxString msg =
wxString::Format(
_(
"fp-lib-table files contain no library named '%s'." ),
336 const wxString& aFootprintName )
360 const wxString& aFootprintName )
388 const wxString& aFootprintName,
bool aKeepUUID )
403 const FOOTPRINT* aFootprint,
bool aOverwrite )
419 if( footprint.get() )
468 if( nickname.size() )
479 for(
unsigned i = 0; i < nicks.size(); ++i )
496 return wxS(
"KICAD7_FOOTPRINT_DIR" );
504 const wxString& aPrefix ) :
509 wxFileName f( aPath, wxS(
"" ) );
513 wxDirTraverseResult
OnFile(
const wxString& aFilePath )
override {
return wxDIR_CONTINUE; }
515 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
517 wxFileName dir = wxFileName::DirName( dirPath );
521 if( dirPath.EndsWith( wxS(
".pretty" ) ) && dir.GetDirCount() >=
m_prefix_dir_count + 3 )
523 wxArrayString parts = dir.GetDirs();
525 parts.Insert( wxS(
"${KICAD7_3RD_PARTY}" ), 0 );
527 wxString libPath = wxJoin( parts,
'/' );
531 wxString
name = parts.Last().substr( 0, parts.Last().length() - 7 );
546 _(
"Added by Plugin and Content Manager" ) ) );
550 return wxDIR_CONTINUE;
563 bool tableExists =
true;
566 if( !fn.FileExists() )
570 if( !fn.DirExists() && !fn.Mkdir( 0x777, wxPATH_MKDIR_FULL ) )
582 wxString templatePath =
583 Pgm().GetLocalEnvVariables().at( wxT(
"KICAD7_TEMPLATE_DIR" ) ).GetValue();
585 if( !templatePath.IsEmpty() )
591 if( fileName.IsEmpty() || !::wxCopyFile( fileName, fn.GetFullPath(),
false ) )
595 emptyTable.
Save( fn.GetFullPath() );
600 aTable.
Load( fn.GetFullPath() );
605 wxString packagesPath =
Pgm().GetLocalEnvVariables().at( wxT(
"KICAD7_3RD_PARTY" ) ).GetValue();
611 wxFileName d( packagesPath, wxS(
"" ) );
612 d.AppendDir( wxS(
"footprints" ) );
617 wxDir dir( d.GetPath() );
619 dir.Traverse( traverser );
626 std::vector<wxString> to_remove;
628 for(
size_t i = 0; i < aTable.
GetCount(); i++ )
633 if(
path.StartsWith( packagesPath ) && !wxDir::Exists(
path ) )
637 for(
const wxString& nickName : to_remove )
652 return fn.GetFullPath();
Hold a record identifying a library accessed by the appropriate footprint library PLUGIN object in th...
void SetType(const wxString &aType) override
Change the type represented by this row.
bool operator==(const FP_LIB_TABLE_ROW &aRow) const
void setPlugin(PLUGIN *aPlugin)
const FP_LIB_TABLE_ROW * FindRow(const wxString &aNickName, bool aCheckIfEnabled=false)
Return an FP_LIB_TABLE_ROW if aNickName is found in this table or in any chained fall back table frag...
void FootprintDelete(const wxString &aNickname, const wxString &aFootprintName)
Delete the aFootprintName from the library given by aNickname.
static bool LoadGlobalTable(FP_LIB_TABLE &aTable)
Load the global footprint library table into aTable.
bool operator==(const FP_LIB_TABLE &aFpTable) const
void FootprintEnumerate(wxArrayString &aFootprintNames, const wxString &aNickname, bool aBestEfforts)
Return a list of footprint names contained within the library given by aNickname.
void FootprintLibCreate(const wxString &aNickname)
FP_LIB_TABLE(FP_LIB_TABLE *aFallBackTable=nullptr)
Build a footprint library table by pre-pending this table fragment in front of aFallBackTable.
const FOOTPRINT * GetEnumeratedFootprint(const wxString &aNickname, const wxString &aFootprintName)
A version of FootprintLoad() for use after FootprintEnumerate() for more efficient cache management.
static const wxString GlobalPathEnvVariableName()
Return the name of the environment variable used to hold the directory of locally installed "KiCad sp...
FOOTPRINT * FootprintLoadWithOptionalNickname(const LIB_ID &aFootprintId, bool aKeepUUID=false)
Load a footprint having aFootprintId with possibly an empty nickname.
long long GenerateTimestamp(const wxString *aNickname)
Generate a hashed timestamp representing the last-mod-times of the library indicated by aNickname,...
void FootprintLibDelete(const wxString &aNickname)
bool FootprintExists(const wxString &aNickname, const wxString &aFootprintName)
Indicates whether or not the given footprint already exists in the given library.
virtual void Parse(LIB_TABLE_LEXER *aLexer) override
Parse the #LIB_TABLE_LEXER s-expression library table format into the appropriate LIB_TABLE_ROW objec...
bool IsFootprintLibWritable(const wxString &aNickname)
Return true if the library given by aNickname is writable.
void PrefetchLib(const wxString &aNickname)
If possible, prefetches the specified library (e.g.
virtual void Format(OUTPUTFORMATTER *aOutput, int aIndentLevel) const override
Generate the table in s-expression format to aOutput with an indentation level of aIndentLevel.
SAVE_T
The set of return values from FootprintSave() below.
FOOTPRINT * FootprintLoad(const wxString &aNickname, const wxString &aFootprintName, bool aKeepUUID=false)
Load a footprint having aFootprintName from the library given by aNickname.
SAVE_T FootprintSave(const wxString &aNickname, const FOOTPRINT *aFootprint, bool aOverwrite=true)
Write aFootprint to an existing library given by aNickname.
static wxString GetGlobalTableFileName()
PCB_FILE_T
The set of file types that the IO_MGR knows about, and for which there has been a plugin written.
@ KICAD_SEXP
S-expression Pcbnew file format.
static PCB_FILE_T EnumFromStr(const wxString &aFileType)
Return the PCB_FILE_T from the corresponding plugin type name: "kicad", "legacy", etc.
static PLUGIN * PluginFind(PCB_FILE_T aFileType)
Return a PLUGIN which the caller can use to import, export, save, or load design documents.
A logical library item identifier and consists of various portions much like a URI.
int SetLibNickname(const UTF8 &aNickname)
Override the logical library name portion of the LIB_ID to aNickname.
const UTF8 & GetLibItemName() const
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Hold a record identifying a library accessed by the appropriate plug in object in the LIB_TABLE.
const wxString & GetNickName() const
const wxString GetFullURI(bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
bool operator==(const LIB_TABLE_ROW &r) const
const STRING_UTF8_MAP * GetProperties() const
Return the constant #PROPERTIES for this library (LIB_TABLE_ROW).
Manage LIB_TABLE_ROW records (rows), and can be searched based on library nickname.
std::vector< wxString > GetLogicalLibs()
Return the logical library names, all of them that are pertinent to a look up done on this LIB_TABLE.
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
int m_version
Versioning to handle importing old tables.
LIB_TABLE_ROW & At(unsigned aIndex)
Get the 'n'th LIB_TABLE_ROW object.
bool InsertRow(LIB_TABLE_ROW *aRow, bool doReplace=false)
Adds aRow if it does not already exist or if doReplace is true.
void Load(const wxString &aFileName)
Load the library table using the path defined by aFileName aFallBackTable.
bool HasLibraryWithPath(const wxString &aPath) const
Test for the existence of aPath in the library table.
bool RemoveRow(const LIB_TABLE_ROW *aRow)
Removes a row from the table.
void Clear()
Delete all rows.
unsigned GetCount() const
Get the number of rows contained in the table.
void Save(const wxString &aFileName) const
Write this library table to aFileName in s-expression form.
LIB_TABLE_ROW * findRow(const wxString &aNickname, bool aCheckIfEnabled=false) const
Return a LIB_TABLE_ROW if aNickname is found in this table or in any chained fallBack table fragment,...
PCM_FP_LIB_TRAVERSER(const wxString &aPath, FP_LIB_TABLE &aTable, const wxString &aPrefix)
wxDirTraverseResult OnFile(const wxString &aFilePath) override
size_t m_prefix_dir_count
wxDirTraverseResult OnDir(const wxString &dirPath) override
FP_LIB_TABLE & m_lib_table
A base class that BOARD loading and saving plugins should derive from.
virtual const FOOTPRINT * GetEnumeratedFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const STRING_UTF8_MAP *aProperties=nullptr)
A version of FootprintLoad() for use after FootprintEnumerate() for more efficient cache management.
virtual void FootprintLibCreate(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr)
Create a new empty footprint library at aLibraryPath empty.
virtual bool FootprintLibDelete(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr)
Delete an existing footprint library and returns true, or if library does not exist returns false,...
virtual void FootprintSave(const wxString &aLibraryPath, const FOOTPRINT *aFootprint, const STRING_UTF8_MAP *aProperties=nullptr)
Write aFootprint to an existing library located at aLibraryPath.
virtual void FootprintDelete(const wxString &aLibraryPath, const wxString &aFootprintName, const STRING_UTF8_MAP *aProperties=nullptr)
Delete aFootprintName from the library at aLibraryPath.
virtual bool FootprintExists(const wxString &aLibraryPath, const wxString &aFootprintName, const STRING_UTF8_MAP *aProperties=nullptr)
Check for the existence of a footprint.
virtual FOOTPRINT * FootprintLoad(const wxString &aLibraryPath, const wxString &aFootprintName, bool aKeepUUID=false, const STRING_UTF8_MAP *aProperties=nullptr)
Load a footprint having aFootprintName from the aLibraryPath containing a library format that this PL...
virtual bool IsFootprintLibWritable(const wxString &aLibraryPath)
Return true if the library at aLibraryPath is writable.
virtual long long GetLibraryTimestamp(const wxString &aLibraryPath) const =0
Generate a timestamp representing all the files in the library (including the library directory).
virtual void PrefetchLib(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr)
If possible, prefetches the specified library (e.g.
virtual void FootprintEnumerate(wxArrayString &aFootprintNames, const wxString &aLibraryPath, bool aBestEfforts, const STRING_UTF8_MAP *aProperties=nullptr)
Return a list of footprint names contained within the library at aLibraryPath.
Look for files in a number of paths.
void AddPaths(const wxString &aPaths, int aIndex=-1)
Insert or append path(s).
T * GetAppSettings(bool aLoadNow=true)
Returns a handle to the a given settings by type If the settings have already been loaded,...
static wxString GetUserSettingsPath()
Return the user configuration path used to store KiCad's configuration files.
std::string::size_type size() const
static const wxChar global_tbl_name[]
static void setLibNickname(FOOTPRINT *aModule, const wxString &aNickname, const wxString &aFootprintName)
#define THROW_IO_ERROR(msg)
LIB_TABLE_ROWS::const_iterator LIB_TABLE_ROWS_CITER
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
void SystemDirsAppend(SEARCH_STACK *aSearchStack)
Append system places to aSearchStack in a platform specific way and pertinent to KiCad programs.
System directories search utilities.