28#include <lib_table_lexer.h>
56using namespace LIB_TABLE_T;
91 if( in->CurTok() != T_design_block_lib_table )
95 if( ( tok = in->NextTok() ) != T_design_block_lib_table )
96 in->Expecting( T_design_block_lib_table );
99 while( ( tok = in->NextTok() ) != T_RIGHT )
101 std::unique_ptr<DESIGN_BLOCK_LIB_TABLE_ROW> row =
102 std::make_unique<DESIGN_BLOCK_LIB_TABLE_ROW>();
105 in->Expecting( T_RIGHT );
108 in->Expecting( T_LEFT );
111 int lineNum = in->CurLineNumber();
115 if( tok == T_version )
117 in->NeedNUMBER(
"version" );
124 in->Expecting( T_lib );
129 if( ( tok = in->NextTok() ) != T_name )
130 in->Expecting( T_name );
132 in->NeedSYMBOLorNUMBER();
134 row->SetNickName( in->FromUTF8() );
140 bool sawType =
false;
141 bool sawOpts =
false;
142 bool sawDesc =
false;
144 bool sawDisabled =
false;
146 while( ( tok = in->NextTok() ) != T_RIGHT )
149 in->Unexpected( T_EOF );
152 in->Expecting( T_LEFT );
154 tok = in->NeedSYMBOLorNUMBER();
160 in->Duplicate( tok );
163 in->NeedSYMBOLorNUMBER();
164 row->SetFullURI( in->FromUTF8() );
169 in->Duplicate( tok );
172 in->NeedSYMBOLorNUMBER();
173 row->SetType( in->FromUTF8() );
178 in->Duplicate( tok );
181 in->NeedSYMBOLorNUMBER();
182 row->SetOptions( in->FromUTF8() );
187 in->Duplicate( tok );
190 in->NeedSYMBOLorNUMBER();
191 row->SetDescr( in->FromUTF8() );
196 in->Duplicate( tok );
199 row->SetEnabled(
false );
209 in->Unexpected( tok );
216 in->Expecting( T_type );
219 in->Expecting( T_uri );
224 wxString nickname = row->GetNickName();
226 bool doReplace =
false;
233 wxString msg = wxString::Format(
_(
"Duplicate library nickname '%s' found in "
234 "design block library table file line %d." ),
237 if( !errMsg.IsEmpty() )
244 if( !errMsg.IsEmpty() )
253 for(
unsigned i = 0; i <
m_rows.size(); ++i )
271 aOutput->
Print( aIndentLevel,
"(design_block_lib_table\n" );
275 row.Format( aOutput, aIndentLevel + 1 );
277 aOutput->
Print( aIndentLevel,
")\n" );
289 wxCHECK( row && row->
plugin, hash );
292 + wxHashTable::MakeKey( *aNickname );
301 row =
FindRow( nickname,
true );
308 wxCHECK2( row && row->
plugin,
continue );
311 + wxHashTable::MakeKey( nickname );
319 const wxString& aNickname,
bool aBestEfforts )
323 row->
plugin->DesignBlockEnumerate( aDesignBlockNames, row->
GetFullURI(
true ), aBestEfforts,
329 bool aCheckIfEnabled )
336 THROW_IO_ERROR( wxString::Format(
_(
"design-block-lib-table files contain no library "
349 const wxString& aDesignBlockName )
375 const wxString& aDesignBlockName )
380 return row->
plugin->GetEnumeratedDesignBlock( row->
GetFullURI(
true ), aDesignBlockName,
386 const wxString& aDesignBlockName )
393 return row->
plugin->DesignBlockExists( row->
GetFullURI(
true ), aDesignBlockName,
404 const wxString& aDesignBlockName,
433 std::unique_ptr<DESIGN_BLOCK> design_block( row->
plugin->DesignBlockLoad(
436 if( design_block.get() )
447 const wxString& aDesignBlockName )
452 return row->
plugin->DesignBlockDelete( row->
GetFullURI(
true ), aDesignBlockName,
488 if( nickname.size() )
522 const wxString& aPrefix ) :
527 wxFileName f( aPath, wxS(
"" ) );
531 wxDirTraverseResult
OnFile(
const wxString& aFilePath )
override {
return wxDIR_CONTINUE; }
533 wxDirTraverseResult
OnDir(
const wxString& dirPath )
override
535 wxFileName dir = wxFileName::DirName( dirPath );
540 if( dirPath.EndsWith( wxString::Format( wxS(
".%s" ),
544 wxString versionedPath;
545 versionedPath.Printf( wxS(
"${%s}" ),
548 wxArrayString parts = dir.GetDirs();
550 parts.Insert( versionedPath, 0 );
552 wxString libPath = wxJoin( parts,
'/' );
556 wxString
name = parts.Last().substr( 0, parts.Last().length() - 7 );
558 nickname.Printf( wxS(
"%s%s" ),
568 nickname.Printf( wxS(
"%s%s_%d" ),
576 nickname, libPath, wxT(
"KiCad" ), wxEmptyString,
577 _(
"Added by Plugin and Content Manager" ) ) );
581 return wxDIR_CONTINUE;
594 bool tableExists =
true;
597 if( !fn.FileExists() )
601 if( !fn.DirExists() && !fn.Mkdir( 0x777, wxPATH_MKDIR_FULL ) )
603 THROW_IO_ERROR( wxString::Format(
_(
"Cannot create global library table path '%s'." ),
615 wxT(
"TEMPLATE_DIR" ) );
617 if( v && !v->IsEmpty() )
623 if( fileName.IsEmpty() || !::wxCopyFile( fileName, fn.GetFullPath(),
false ) )
627 emptyTable.
Save( fn.GetFullPath() );
632 aTable.
Load( fn.GetFullPath() );
638 wxString packagesPath;
647 wxFileName d( packagesPath, wxS(
"" ) );
648 d.AppendDir( wxS(
"design_blocks" ) );
654 wxDir dir( d.GetPath() );
656 dir.Traverse( traverser );
663 std::vector<wxString> to_remove;
665 for(
size_t i = 0; i < aTable.
GetCount(); i++ )
670 if(
path.StartsWith( packagesPath ) && !wxDir::Exists(
path ) )
674 for(
const wxString& nickName : to_remove )
701 return fn.GetFullPath();
@ KICAD_SEXP
S-expression KiCad file format.
static DESIGN_BLOCK_FILE_T EnumFromStr(const wxString &aFileType)
static DESIGN_BLOCK_IO * FindPlugin(DESIGN_BLOCK_FILE_T aFileType)
Hold a record identifying a library accessed by the appropriate design block library #PLUGIN object i...
void SetType(const wxString &aType) override
Change the type represented by this row.
void setPlugin(DESIGN_BLOCK_IO *aPlugin)
DESIGN_BLOCK_IO_MGR::DESIGN_BLOCK_FILE_T type
IO_RELEASER< DESIGN_BLOCK_IO > plugin
bool operator==(const DESIGN_BLOCK_LIB_TABLE_ROW &aRow) const
void DesignBlockLibDelete(const wxString &aNickname)
bool operator==(const DESIGN_BLOCK_LIB_TABLE &aFpTable) const
long long GenerateTimestamp(const wxString *aNickname)
Generate a hashed timestamp representing the last-mod-times of the library indicated by aNickname,...
static wxString GetGlobalTableFileName()
const DESIGN_BLOCK * GetEnumeratedDesignBlock(const wxString &aNickname, const wxString &aDesignBlockName)
A version of DesignBlockLoad() for use after DesignBlockEnumerate() for more efficient cache manageme...
bool IsDesignBlockLibWritable(const wxString &aNickname)
Return true if the library given by aNickname is writable.
void DesignBlockDelete(const wxString &aNickname, const wxString &aDesignBlockName)
Delete the aDesignBlockName from the library given by aNickname.
void DesignBlockLibCreate(const wxString &aNickname)
DESIGN_BLOCK * DesignBlockLoad(const wxString &aNickname, const wxString &aDesignBlockName, bool aKeepUUID=false)
Load a design block having aDesignBlockName from the library given by aNickname.
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...
SAVE_T
The set of return values from DesignBlockSave() below.
DESIGN_BLOCK_LIB_TABLE(DESIGN_BLOCK_LIB_TABLE *aFallBackTable=nullptr)
Build a design block library table by pre-pending this table fragment in front of aFallBackTable.
SAVE_T DesignBlockSave(const wxString &aNickname, const DESIGN_BLOCK *aDesignBlock, bool aOverwrite=true)
Write aDesignBlock to an existing library given by aNickname.
DESIGN_BLOCK * DesignBlockLoadWithOptionalNickname(const LIB_ID &aDesignBlockId, bool aKeepUUID=false)
Load a design block having aDesignBlockId with possibly an empty nickname.
bool DesignBlockExists(const wxString &aNickname, const wxString &aDesignBlockName)
Indicates whether or not the given design block already exists in the given library.
static DESIGN_BLOCK_LIST_IMPL & GetGlobalList()
static bool LoadGlobalTable(DESIGN_BLOCK_LIB_TABLE &aTable)
Load the global design block library table into aTable.
const DESIGN_BLOCK_LIB_TABLE_ROW * FindRow(const wxString &aNickName, bool aCheckIfEnabled=false)
Return an DESIGN_BLOCK_LIB_TABLE_ROW if aNickName is found in this table or in any chained fall back ...
void DesignBlockEnumerate(wxArrayString &aDesignBlockNames, const wxString &aNickname, bool aBestEfforts)
Return a list of design block names contained within the library given by aNickname.
static const wxString GlobalPathEnvVariableName()
Return the name of the environment variable used to hold the directory of locally installed "KiCad sp...
static DESIGN_BLOCK_LIB_TABLE & GetGlobalLibTable()
virtual void Format(OUTPUTFORMATTER *aOutput, int aIndentLevel) const override
Generate the table in s-expression format to aOutput with an indentation level of aIndentLevel.
const LIB_ID & GetLibId() const
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.
PCM_DESIGN_BLOCK_LIB_TRAVERSER(const wxString &aPath, DESIGN_BLOCK_LIB_TABLE &aTable, const wxString &aPrefix)
wxDirTraverseResult OnFile(const wxString &aFilePath) override
wxDirTraverseResult OnDir(const wxString &dirPath) override
DESIGN_BLOCK_LIB_TABLE & m_lib_table
size_t m_prefix_dir_count
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(const wxString &aFilename)
Return a handle to the a given settings by type.
std::string::size_type size() const
static void setLibNickname(DESIGN_BLOCK *aModule, const wxString &aNickname, const wxString &aDesignBlockName)
DESIGN_BLOCK_LIB_TABLE GDesignBlockTable
The global design block library table.
DESIGN_BLOCK_LIST_IMPL GDesignBlockList
The global footprint info table.
Functions related to environment variables, including help functions.
static const std::string KiCadDesignBlockLibPathExtension
static const std::string DesignBlockLibraryTableFileName
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
#define THROW_IO_ERROR(msg)
KICOMMON_API std::optional< wxString > GetVersionedEnvVarValue(const std::map< wxString, ENV_VAR_ITEM > &aMap, const wxString &aBaseName)
Attempt to retrieve the value of a versioned environment variable, such as KICAD8_TEMPLATE_DIR.
KICOMMON_API wxString GetVersionedEnvVarName(const wxString &aBaseName)
Construct 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.
Definition of file extensions used in Kicad.