31#include <lib_table_lexer.h>
46using namespace LIB_TABLE_T;
84 if( in->CurTok() != T_fp_lib_table )
88 if( ( tok = in->NextTok() ) != T_fp_lib_table )
89 in->Expecting( T_fp_lib_table );
92 while( ( tok = in->NextTok() ) != T_RIGHT )
94 std::unique_ptr<FP_LIB_TABLE_ROW> row = std::make_unique<FP_LIB_TABLE_ROW>();
97 in->Expecting( T_RIGHT );
100 in->Expecting( T_LEFT );
103 int lineNum = in->CurLineNumber();
107 if( tok == T_version )
109 in->NeedNUMBER(
"version" );
116 in->Expecting( T_lib );
121 if( ( tok = in->NextTok() ) != T_name )
122 in->Expecting( T_name );
124 in->NeedSYMBOLorNUMBER();
126 row->SetNickName( in->FromUTF8() );
132 bool sawType =
false;
133 bool sawOpts =
false;
134 bool sawDesc =
false;
136 bool sawDisabled =
false;
138 while( ( tok = in->NextTok() ) != T_RIGHT )
141 in->Unexpected( T_EOF );
144 in->Expecting( T_LEFT );
146 tok = in->NeedSYMBOLorNUMBER();
152 in->Duplicate( tok );
154 in->NeedSYMBOLorNUMBER();
155 row->SetFullURI( in->FromUTF8() );
160 in->Duplicate( tok );
162 in->NeedSYMBOLorNUMBER();
163 row->SetType( in->FromUTF8() );
168 in->Duplicate( tok );
170 in->NeedSYMBOLorNUMBER();
171 row->SetOptions( in->FromUTF8() );
176 in->Duplicate( tok );
178 in->NeedSYMBOLorNUMBER();
179 row->SetDescr( in->FromUTF8() );
184 in->Duplicate( tok );
186 row->SetEnabled(
false );
196 in->Unexpected( tok );
203 in->Expecting( T_type );
206 in->Expecting( T_uri );
211 wxString nickname = row->GetNickName();
213 bool doReplace =
false;
220 wxString msg = wxString::Format(
_(
"Duplicate library nickname '%s' found in "
221 "footprint library table file line %d." ),
225 if( !errMsg.IsEmpty() )
232 if( !errMsg.IsEmpty() )
241 for(
unsigned i = 0; i <
m_rows.size(); ++i )
256 aOutput->
Print( aIndentLevel,
"(fp_lib_table\n" );
260 it->Format( aOutput, aIndentLevel+1 );
262 aOutput->
Print( aIndentLevel,
")\n" );
274 wxCHECK( row && row->
plugin, hash );
277 wxHashTable::MakeKey( *aNickname );
286 row =
FindRow( nickname,
true );
293 wxCHECK2( row && row->
plugin,
continue );
296 wxHashTable::MakeKey( nickname );
308 row->
plugin->FootprintEnumerate( aFootprintNames, row->
GetFullURI(
true ), aBestEfforts,
329 wxString msg = wxString::Format( wxS(
"'%s' not found in fp-lib-table." ), aNickname );
343 const wxString& aFootprintName )
367 const wxString& aFootprintName )
372 return row->
plugin->GetEnumeratedFootprint( row->
GetFullURI(
true ), aFootprintName,
384 return row->
plugin->FootprintExists( row->
GetFullURI(
true ), aFootprintName,
395 const wxString& aFootprintName,
bool aKeepUUID )
410 const FOOTPRINT* aFootprint,
bool aOverwrite )
422 std::unique_ptr<FOOTPRINT> footprint( row->
plugin->FootprintLoad( row->
GetFullURI(
true ),
426 if( footprint.get() )
440 return row->
plugin->FootprintDelete( row->
GetFullURI(
true ), aFootprintName,
451 if( !row || !row->
plugin )
487 if( nickname.size() )
498 for(
unsigned i = 0; i < nicks.size(); ++i )
523 const wxString& aPrefix ) :
528 wxFileName f( aPath, wxS(
"" ) );
532 wxDirTraverseResult
OnFile(
const wxString& aFilePath )
override {
return wxDIR_CONTINUE; }
534 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
536 wxFileName dir = wxFileName::DirName( dirPath );
540 if( dirPath.EndsWith( wxS(
".pretty" ) ) && dir.GetDirCount() >=
m_prefix_dir_count + 3 )
542 wxString versionedPath = wxString::Format( wxS(
"${%s}" ),
545 wxArrayString parts = dir.GetDirs();
547 parts.Insert( versionedPath, 0 );
549 wxString libPath = wxJoin( parts,
'/' );
553 wxString
name = parts.Last().substr( 0, parts.Last().length() - 7 );
561 nickname = wxString::Format( wxS(
"%s%s_%d" ),
m_lib_prefix,
name, increment );
568 _(
"Added by Plugin and Content Manager" ) ) );
572 return wxDIR_CONTINUE;
585 bool tableExists =
true;
588 if( !fn.FileExists() )
592 if( !fn.DirExists() && !fn.Mkdir( 0x777, wxPATH_MKDIR_FULL ) )
594 THROW_IO_ERROR( wxString::Format(
_(
"Cannot create global library table path '%s'." ),
606 wxT(
"TEMPLATE_DIR" ) );
608 if( v && !v->IsEmpty() )
614 if( fileName.IsEmpty() || !::wxCopyFile( fileName, fn.GetFullPath(),
false ) )
618 emptyTable.
Save( fn.GetFullPath() );
622 aTable.
Load( fn.GetFullPath() );
628 wxString packagesPath;
637 wxFileName d( packagesPath, wxS(
"" ) );
638 d.AppendDir( wxS(
"footprints" ) );
643 wxDir dir( d.GetPath() );
645 dir.Traverse( traverser );
652 std::vector<wxString> to_remove;
654 for(
size_t i = 0; i < aTable.
GetCount(); i++ )
659 if(
path.StartsWith( packagesPath ) && !wxDir::Exists(
path ) )
663 for(
const wxString& nickName : to_remove )
678 return fn.GetFullPath();
Hold a record identifying a library accessed by the appropriate footprint library #PLUGIN object in t...
void setPlugin(PCB_IO *aPlugin)
void SetType(const wxString &aType) override
Change the type represented by this row.
IO_RELEASER< PCB_IO > plugin
bool operator==(const FP_LIB_TABLE_ROW &aRow) const
PCB_IO_MGR::PCB_FILE_T type
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()
A logical library item identifier and consists of various portions much like a URI.
int SetLibNickname(const UTF8 &aLibNickname)
Override the logical library name portion of the LIB_ID to aLibNickname.
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 std::map< std::string, UTF8 > * GetProperties() const
Return the constant #PROPERTIES for this library (LIB_TABLE_ROW).
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
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.
LIB_TABLE_ROWS m_rows
Owning set of rows.
bool doInsertRow(LIB_TABLE_ROW *aRow, bool doReplace=false)
Performs the mechanics of inserting a row, but without locking or reindexing.
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 and frees the pointer.
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,...
static wxString GetUserSettingsPath()
Return the user configuration path used to store KiCad's configuration files.
static PCB_IO * PluginFind(PCB_FILE_T aFileType)
Return a #PLUGIN which the caller can use to import, export, save, or load design documents.
static PCB_FILE_T EnumFromStr(const wxString &aFileType)
Return the PCB_FILE_T from the corresponding plugin type name: "kicad", "legacy", etc.
PCB_FILE_T
The set of file types that the PCB_IO_MGR knows about, and for which there has been a plugin written,...
@ KICAD_SEXP
S-expression Pcbnew file format.
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
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
virtual SETTINGS_MANAGER & GetSettingsManager() const
Look for files in a number of paths.
void AddPaths(const wxString &aPaths, int aIndex=-1)
Insert or append path(s).
T * GetAppSettings()
Returns a handle to the a given settings by type If the settings have already been loaded,...
std::string::size_type size() const
static void setLibNickname(DESIGN_BLOCK *aModule, const wxString &aNickname, const wxString &aDesignBlockName)
static const wxChar global_tbl_name[]
Functions related to environment variables, including help functions.
static const wxChar global_tbl_name[]
static void setLibNickname(FOOTPRINT *aModule, const wxString &aNickname, const wxString &aFootprintName)
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
#define THROW_IO_ERROR(msg)
LIB_TABLE_ROWS::const_iterator LIB_TABLE_ROWS_CITER
KICOMMON_API std::optional< wxString > GetVersionedEnvVarValue(const std::map< wxString, ENV_VAR_ITEM > &aMap, const wxString &aBaseName)
Attempts to retrieve the value of a versioned environment variable, such as KICAD8_TEMPLATE_DIR.
KICOMMON_API wxString GetVersionedEnvVarName(const wxString &aBaseName)
Constructs a versioned environment variable based on this KiCad major version.
PGM_BASE & Pgm()
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.