Eeschema: add save code to legacy symbol library plugin.
Make LIB_PART copy constructor take a const LIB_PART reference. Add SaveSymbol to legacy symbol library plugin. Add removeAlias to legacy symbol library cache. Add AddSymbol to legacy symbol library cache.
This commit is contained in:
parent
6117713f33
commit
3ae240ea46
|
@ -206,7 +206,7 @@ LIB_PART::LIB_PART( const wxString& aName, PART_LIB* aLibrary ) :
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LIB_PART::LIB_PART( LIB_PART& aPart, PART_LIB* aLibrary ) :
|
LIB_PART::LIB_PART( const LIB_PART& aPart, PART_LIB* aLibrary ) :
|
||||||
EDA_ITEM( aPart ),
|
EDA_ITEM( aPart ),
|
||||||
m_me( this, null_deleter() )
|
m_me( this, null_deleter() )
|
||||||
{
|
{
|
||||||
|
|
|
@ -218,7 +218,7 @@ private:
|
||||||
public:
|
public:
|
||||||
|
|
||||||
LIB_PART( const wxString& aName, PART_LIB* aLibrary = NULL );
|
LIB_PART( const wxString& aName, PART_LIB* aLibrary = NULL );
|
||||||
LIB_PART( LIB_PART& aPart, PART_LIB* aLibrary = NULL );
|
LIB_PART( const LIB_PART& aPart, PART_LIB* aLibrary = NULL );
|
||||||
|
|
||||||
virtual ~LIB_PART();
|
virtual ~LIB_PART();
|
||||||
|
|
||||||
|
|
|
@ -242,7 +242,7 @@ bool PART_LIB::AddPart( LIB_PART* aPart )
|
||||||
}
|
}
|
||||||
|
|
||||||
// add a clone, not the caller's copy
|
// add a clone, not the caller's copy
|
||||||
LIB_PART* my_part = new LIB_PART( *aPart, this );
|
LIB_PART* my_part = new LIB_PART( *aPart );
|
||||||
|
|
||||||
for( size_t i = 0; i < my_part->m_aliases.size(); i++ )
|
for( size_t i = 0; i < my_part->m_aliases.size(); i++ )
|
||||||
{
|
{
|
||||||
|
|
|
@ -303,25 +303,27 @@ public:
|
||||||
const PROPERTIES* aProperties = NULL );
|
const PROPERTIES* aProperties = NULL );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function SymbolSave
|
* Function SaveSymbol
|
||||||
* will write @a aModule to an existing library located at @a aLibraryPath.
|
* will write @a aSymbol to an existing library located at @a aLibraryPath.
|
||||||
* If a footprint by the same name already exists, it is replaced.
|
* If a #LIB_PART by the same name already exists or there are any conflicting
|
||||||
|
* alias names, an exception is thrown. Symbol libraries cannot have duplicate
|
||||||
|
* alias names.
|
||||||
*
|
*
|
||||||
* @param aLibraryPath is a locator for the "library", usually a directory, file,
|
* @param aLibraryPath is a locator for the "library", usually a directory, file,
|
||||||
* or URL containing several footprints.
|
* or URL containing several footprints.
|
||||||
*
|
*
|
||||||
* @param aSymbol is what to store in the library. The caller continues
|
* @param aSymbol is what to store in the library. The library is refreshed and the
|
||||||
* to own the footprint after this call.
|
* caller must update any #LIB_PART pointers that may have changed.
|
||||||
*
|
*
|
||||||
* @param aProperties is an associative array that can be used to tell the
|
* @param aProperties is an associative array that can be used to tell the
|
||||||
* saver how to save the footprint, because it can take any number of
|
* saver how to save the symbol, because it can take any number of
|
||||||
* additional named tuning arguments that the plugin is known to support.
|
* additional named tuning arguments that the plugin is known to support.
|
||||||
* The caller continues to own this object (plugin may not delete it), and
|
* The caller continues to own this object (plugin may not delete it), and
|
||||||
* plugins should expect it to be optionally NULL.
|
* plugins should expect it to be optionally NULL.
|
||||||
*
|
*
|
||||||
* @throw IO_ERROR if there is a problem saving.
|
* @throw IO_ERROR if there is a problem saving or duplicate alias names.
|
||||||
*/
|
*/
|
||||||
virtual void SymbolSave( const wxString& aLibraryPath, const LIB_PART* aSymbol,
|
virtual void SaveSymbol( const wxString& aLibraryPath, const LIB_PART* aSymbol,
|
||||||
const PROPERTIES* aProperties = NULL );
|
const PROPERTIES* aProperties = NULL );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1901,6 +1901,7 @@ class SCH_LEGACY_PLUGIN_CACHE
|
||||||
wxDateTime m_fileModTime;
|
wxDateTime m_fileModTime;
|
||||||
LIB_ALIAS_MAP m_aliases; // Map of names of LIB_ALIAS pointers.
|
LIB_ALIAS_MAP m_aliases; // Map of names of LIB_ALIAS pointers.
|
||||||
bool m_isWritable;
|
bool m_isWritable;
|
||||||
|
bool m_isModified;
|
||||||
int m_modHash; // Keep track of the modification status of the library.
|
int m_modHash; // Keep track of the modification status of the library.
|
||||||
int m_versionMajor;
|
int m_versionMajor;
|
||||||
int m_versionMinor;
|
int m_versionMinor;
|
||||||
|
@ -1926,6 +1927,7 @@ class SCH_LEGACY_PLUGIN_CACHE
|
||||||
FILL_T parseFillMode( FILE_LINE_READER& aReader, const char* aLine,
|
FILL_T parseFillMode( FILE_LINE_READER& aReader, const char* aLine,
|
||||||
const char** aOutput );
|
const char** aOutput );
|
||||||
bool checkForDuplicates( wxString& aAliasName );
|
bool checkForDuplicates( wxString& aAliasName );
|
||||||
|
LIB_ALIAS* removeAlias( LIB_ALIAS* aAlias );
|
||||||
|
|
||||||
friend SCH_LEGACY_PLUGIN;
|
friend SCH_LEGACY_PLUGIN;
|
||||||
|
|
||||||
|
@ -1938,10 +1940,12 @@ public:
|
||||||
// Catch these exceptions higher up please.
|
// Catch these exceptions higher up please.
|
||||||
|
|
||||||
/// Save the entire library to file m_libFileName;
|
/// Save the entire library to file m_libFileName;
|
||||||
// void Save();
|
void Save();
|
||||||
|
|
||||||
void Load();
|
void Load();
|
||||||
|
|
||||||
|
void AddSymbol( const LIB_PART* aPart );
|
||||||
|
|
||||||
wxDateTime GetLibModificationTime();
|
wxDateTime GetLibModificationTime();
|
||||||
|
|
||||||
bool IsFile( const wxString& aFullPathAndFileName ) const;
|
bool IsFile( const wxString& aFullPathAndFileName ) const;
|
||||||
|
@ -1954,7 +1958,8 @@ public:
|
||||||
|
|
||||||
SCH_LEGACY_PLUGIN_CACHE::SCH_LEGACY_PLUGIN_CACHE( const wxString& aFullPathAndFileName ) :
|
SCH_LEGACY_PLUGIN_CACHE::SCH_LEGACY_PLUGIN_CACHE( const wxString& aFullPathAndFileName ) :
|
||||||
m_libFileName( aFullPathAndFileName ),
|
m_libFileName( aFullPathAndFileName ),
|
||||||
m_isWritable( true )
|
m_isWritable( true ),
|
||||||
|
m_isModified( false )
|
||||||
{
|
{
|
||||||
m_versionMajor = -1;
|
m_versionMajor = -1;
|
||||||
m_versionMinor = -1;
|
m_versionMinor = -1;
|
||||||
|
@ -2004,6 +2009,76 @@ bool SCH_LEGACY_PLUGIN_CACHE::IsFileChanged() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LIB_ALIAS* SCH_LEGACY_PLUGIN_CACHE::removeAlias( LIB_ALIAS* aAlias )
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( aAlias != NULL, NULL, "NULL pointer cannot be removed from library." );
|
||||||
|
|
||||||
|
LIB_ALIAS_MAP::iterator it = m_aliases.find( aAlias->GetName() );
|
||||||
|
|
||||||
|
if( it == m_aliases.end() )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
// If the entry pointer doesn't match the name it is mapped to in the library, we
|
||||||
|
// have done something terribly wrong.
|
||||||
|
wxCHECK_MSG( *it->second == aAlias, NULL,
|
||||||
|
"Pointer mismatch while attempting to remove alias entry <" + aAlias->GetName() +
|
||||||
|
"> from library cache <" + m_libFileName.GetName() + ">." );
|
||||||
|
|
||||||
|
LIB_ALIAS* alias = aAlias;
|
||||||
|
LIB_PART* part = alias->GetPart();
|
||||||
|
|
||||||
|
alias = part->RemoveAlias( alias );
|
||||||
|
|
||||||
|
if( !alias )
|
||||||
|
{
|
||||||
|
delete part;
|
||||||
|
|
||||||
|
if( m_aliases.size() > 1 )
|
||||||
|
{
|
||||||
|
LIB_ALIAS_MAP::iterator next = it;
|
||||||
|
next++;
|
||||||
|
|
||||||
|
if( next == m_aliases.end() )
|
||||||
|
next = m_aliases.begin();
|
||||||
|
|
||||||
|
alias = next->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_aliases.erase( it );
|
||||||
|
m_isModified = true;
|
||||||
|
++m_modHash;
|
||||||
|
return alias;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_LEGACY_PLUGIN_CACHE::AddSymbol( const LIB_PART* aPart )
|
||||||
|
{
|
||||||
|
// add a clone, not the caller's copy
|
||||||
|
LIB_PART* part = new LIB_PART( *aPart );
|
||||||
|
|
||||||
|
wxArrayString aliasNames = aPart->GetAliasNames();
|
||||||
|
|
||||||
|
for( size_t i = 0; i < aliasNames.size(); i++ )
|
||||||
|
{
|
||||||
|
LIB_ALIAS_MAP::iterator it = m_aliases.find( aliasNames[i] );
|
||||||
|
|
||||||
|
if( it != m_aliases.end() )
|
||||||
|
removeAlias( it->second );
|
||||||
|
|
||||||
|
LIB_ALIAS* alias = aPart->GetAlias( aliasNames[i] );
|
||||||
|
|
||||||
|
wxASSERT_MSG( alias != NULL, "No alias <" + aliasNames[i] + "> found in symbol <" +
|
||||||
|
aPart->GetName() +">." );
|
||||||
|
|
||||||
|
m_aliases[ aliasNames[i] ] = alias;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_isModified = true;
|
||||||
|
++m_modHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_LEGACY_PLUGIN_CACHE::Load()
|
void SCH_LEGACY_PLUGIN_CACHE::Load()
|
||||||
{
|
{
|
||||||
FILE_LINE_READER reader( m_libFileName.GetFullPath() );
|
FILE_LINE_READER reader( m_libFileName.GetFullPath() );
|
||||||
|
@ -3100,6 +3175,29 @@ void SCH_LEGACY_PLUGIN_CACHE::loadFootprintFilters( std::unique_ptr< LIB_PART >&
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_LEGACY_PLUGIN_CACHE::Save()
|
||||||
|
{
|
||||||
|
if( !m_isModified )
|
||||||
|
return;
|
||||||
|
|
||||||
|
FILE_OUTPUTFORMATTER formatter( m_libFileName.GetFullPath() );
|
||||||
|
formatter.Print( 0, "%s %d.%d\n", LIBFILE_IDENT, LIB_VERSION_MAJOR, LIB_VERSION_MINOR );
|
||||||
|
formatter.Print( 0, "#encoding utf-8\n");
|
||||||
|
|
||||||
|
for( LIB_ALIAS_MAP::iterator it = m_aliases.begin(); it != m_aliases.end(); it++ )
|
||||||
|
{
|
||||||
|
if( !it->second->IsRoot() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
it->second->GetPart()->Save( formatter );
|
||||||
|
}
|
||||||
|
|
||||||
|
formatter.Print( 0, "#\n#End Library\n" );
|
||||||
|
m_fileModTime = m_libFileName.GetModificationTime();
|
||||||
|
m_isModified = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_LEGACY_PLUGIN::cacheLib( const wxString& aLibraryFileName )
|
void SCH_LEGACY_PLUGIN::cacheLib( const wxString& aLibraryFileName )
|
||||||
{
|
{
|
||||||
if( !m_cache || !m_cache->IsFile( aLibraryFileName ) || m_cache->IsFileChanged() )
|
if( !m_cache || !m_cache->IsFile( aLibraryFileName ) || m_cache->IsFileChanged() )
|
||||||
|
@ -3163,3 +3261,15 @@ LIB_ALIAS* SCH_LEGACY_PLUGIN::LoadSymbol( const wxString& aLibraryPath, const wx
|
||||||
|
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_LEGACY_PLUGIN::SaveSymbol( const wxString& aLibraryPath, const LIB_PART* aSymbol,
|
||||||
|
const PROPERTIES* aProperties )
|
||||||
|
{
|
||||||
|
m_props = aProperties;
|
||||||
|
|
||||||
|
cacheLib( aLibraryPath );
|
||||||
|
|
||||||
|
m_cache->AddSymbol( aSymbol );
|
||||||
|
m_cache->Save();
|
||||||
|
}
|
||||||
|
|
|
@ -88,6 +88,8 @@ public:
|
||||||
const PROPERTIES* aProperties = NULL );
|
const PROPERTIES* aProperties = NULL );
|
||||||
LIB_ALIAS* LoadSymbol( const wxString& aLibraryPath, const wxString& aAliasName,
|
LIB_ALIAS* LoadSymbol( const wxString& aLibraryPath, const wxString& aAliasName,
|
||||||
const PROPERTIES* aProperties = NULL );
|
const PROPERTIES* aProperties = NULL );
|
||||||
|
void SaveSymbol( const wxString& aLibraryPath, const LIB_PART* aSymbol,
|
||||||
|
const PROPERTIES* aProperties = NULL );
|
||||||
|
|
||||||
// Temporary for testing using PART_LIB instead of SCH_PLUGIN.
|
// Temporary for testing using PART_LIB instead of SCH_PLUGIN.
|
||||||
void TransferCache( PART_LIB& aTarget );
|
void TransferCache( PART_LIB& aTarget );
|
||||||
|
|
|
@ -83,7 +83,7 @@ LIB_ALIAS* SCH_PLUGIN::LoadSymbol( const wxString& aLibraryPath, const wxString&
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_PLUGIN::SymbolSave( const wxString& aLibraryPath, const LIB_PART* aSymbol,
|
void SCH_PLUGIN::SaveSymbol( const wxString& aLibraryPath, const LIB_PART* aSymbol,
|
||||||
const PROPERTIES* aProperties )
|
const PROPERTIES* aProperties )
|
||||||
{
|
{
|
||||||
// not pure virtual so that plugins only have to implement subset of the SCH_PLUGIN interface.
|
// not pure virtual so that plugins only have to implement subset of the SCH_PLUGIN interface.
|
||||||
|
|
Loading…
Reference in New Issue