CADSTAR SCH: Separate out saving loaded lib symbols to library
This commit is contained in:
parent
7a6b64d371
commit
2da13a9e07
|
@ -53,10 +53,10 @@
|
||||||
const wxString PartNameFieldName = "Part Name";
|
const wxString PartNameFieldName = "Part Name";
|
||||||
|
|
||||||
|
|
||||||
void CADSTAR_SCH_ARCHIVE_LOADER::Load( SCHEMATIC* aSchematic, SCH_SHEET* aRootSheet,
|
void CADSTAR_SCH_ARCHIVE_LOADER::Load( SCHEMATIC* aSchematic, SCH_SHEET* aRootSheet )
|
||||||
SCH_PLUGIN::SCH_PLUGIN_RELEASER* aSchPlugin,
|
|
||||||
const wxFileName& aLibraryFileName )
|
|
||||||
{
|
{
|
||||||
|
wxCHECK( aSchematic );
|
||||||
|
|
||||||
if( m_progressReporter )
|
if( m_progressReporter )
|
||||||
m_progressReporter->SetNumPhases( 3 ); // (0) Read file, (1) Parse file, (2) Load file
|
m_progressReporter->SetNumPhases( 3 ); // (0) Read file, (1) Parse file, (2) Load file
|
||||||
|
|
||||||
|
@ -88,10 +88,8 @@ void CADSTAR_SCH_ARCHIVE_LOADER::Load( SCHEMATIC* aSchematic, SCH_SHEET* aRootSh
|
||||||
// Assume the center at 0,0 since we are going to be translating the design afterwards anyway
|
// Assume the center at 0,0 since we are going to be translating the design afterwards anyway
|
||||||
m_designCenter = { 0, 0 };
|
m_designCenter = { 0, 0 };
|
||||||
|
|
||||||
m_schematic = aSchematic;
|
m_schematic = aSchematic;
|
||||||
m_rootSheet = aRootSheet;
|
m_rootSheet = aRootSheet;
|
||||||
m_plugin = aSchPlugin;
|
|
||||||
m_libraryFileName = aLibraryFileName;
|
|
||||||
|
|
||||||
if( m_progressReporter )
|
if( m_progressReporter )
|
||||||
{
|
{
|
||||||
|
@ -414,12 +412,8 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadPartsLibrary()
|
||||||
|
|
||||||
if( ok && part.Definition.GateSymbols.size() != 0 )
|
if( ok && part.Definition.GateSymbols.size() != 0 )
|
||||||
{
|
{
|
||||||
( *m_plugin )->SaveSymbol( m_libraryFileName.GetFullPath(), kiPart );
|
m_loadedSymbols.push_back( kiPart );
|
||||||
|
m_partMap.insert( { partID, kiPart } );
|
||||||
LIB_SYMBOL* loadedPart =
|
|
||||||
( *m_plugin )->LoadSymbol( m_libraryFileName.GetFullPath(), kiPart->GetName() );
|
|
||||||
|
|
||||||
m_partMap.insert( { partID, loadedPart } );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -636,7 +630,7 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSchematicSymbolInstances()
|
||||||
|
|
||||||
kiPart->GetReferenceField().SetText( "#PWR" );
|
kiPart->GetReferenceField().SetText( "#PWR" );
|
||||||
kiPart->GetReferenceField().SetVisible( false );
|
kiPart->GetReferenceField().SetVisible( false );
|
||||||
( *m_plugin )->SaveSymbol( m_libraryFileName.GetFullPath(), kiPart );
|
m_loadedSymbols.push_back( kiPart );
|
||||||
m_powerSymLibMap.insert( { libPartName, kiPart } );
|
m_powerSymLibMap.insert( { libPartName, kiPart } );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1749,8 +1743,10 @@ SCH_SYMBOL* CADSTAR_SCH_ARCHIVE_LOADER::loadSchematicSymbol( const SYMBOL& aCads
|
||||||
const LIB_SYMBOL& aKiCadPart,
|
const LIB_SYMBOL& aKiCadPart,
|
||||||
EDA_ANGLE& aComponentOrientation )
|
EDA_ANGLE& aComponentOrientation )
|
||||||
{
|
{
|
||||||
LIB_ID libId( m_libraryFileName.GetName(), aKiCadPart.GetName() );
|
LIB_ID libId;
|
||||||
int unit = getKiCadUnitNumberFromGate( aCadstarSymbol.GateID );
|
libId.SetLibItemName( aKiCadPart.GetName() );
|
||||||
|
|
||||||
|
int unit = getKiCadUnitNumberFromGate( aCadstarSymbol.GateID );
|
||||||
|
|
||||||
SCH_SHEET_PATH sheetpath;
|
SCH_SHEET_PATH sheetpath;
|
||||||
SCH_SHEET* kiSheet = m_sheetMap.at( aCadstarSymbol.LayerID );
|
SCH_SHEET* kiSheet = m_sheetMap.at( aCadstarSymbol.LayerID );
|
||||||
|
|
|
@ -62,7 +62,6 @@ public:
|
||||||
{
|
{
|
||||||
m_schematic = nullptr;
|
m_schematic = nullptr;
|
||||||
m_rootSheet = nullptr;
|
m_rootSheet = nullptr;
|
||||||
m_plugin = nullptr;
|
|
||||||
m_designCenter.x = 0;
|
m_designCenter.x = 0;
|
||||||
m_designCenter.y = 0;
|
m_designCenter.y = 0;
|
||||||
m_reporter = aReporter;
|
m_reporter = aReporter;
|
||||||
|
@ -74,13 +73,14 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::vector<LIB_SYMBOL*>& GetLoadedSymbols() const { return m_loadedSymbols; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Loads a CADSTAR PCB Archive file into the KiCad BOARD object given
|
* @brief Loads a CADSTAR Schematic Archive file into the KiCad SCHEMATIC object given
|
||||||
* @param aSchematic Schematic to add the design onto
|
* @param aSchematic Schematic to add the design onto
|
||||||
* @param aRootSheet Root sheet to add the design onto
|
* @param aRootSheet Root sheet to add the design onto
|
||||||
*/
|
*/
|
||||||
void Load( SCHEMATIC* aSchematic, SCH_SHEET* aRootSheet,
|
void Load( SCHEMATIC* aSchematic, SCH_SHEET* aRootSheet );
|
||||||
SCH_PLUGIN::SCH_PLUGIN_RELEASER* aSchPlugin, const wxFileName& aLibraryFileName );
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -96,8 +96,6 @@ private:
|
||||||
REPORTER* m_reporter;
|
REPORTER* m_reporter;
|
||||||
SCHEMATIC* m_schematic;
|
SCHEMATIC* m_schematic;
|
||||||
SCH_SHEET* m_rootSheet;
|
SCH_SHEET* m_rootSheet;
|
||||||
SCH_PLUGIN::SCH_PLUGIN_RELEASER* m_plugin;
|
|
||||||
wxFileName m_libraryFileName;
|
|
||||||
wxPoint m_designCenter; ///< Used for calculating the required
|
wxPoint m_designCenter; ///< Used for calculating the required
|
||||||
///< offset to apply to the Cadstar design
|
///< offset to apply to the Cadstar design
|
||||||
///< so that it fits in KiCad canvas
|
///< so that it fits in KiCad canvas
|
||||||
|
@ -105,6 +103,7 @@ private:
|
||||||
std::map<BLOCK_PIN_ID, SCH_HIERLABEL*>
|
std::map<BLOCK_PIN_ID, SCH_HIERLABEL*>
|
||||||
m_sheetPinMap; ///< Map between Cadstar and KiCad Sheets Pins
|
m_sheetPinMap; ///< Map between Cadstar and KiCad Sheets Pins
|
||||||
std::map<PART_ID, LIB_SYMBOL*> m_partMap; ///< Map between Cadstar and KiCad Parts
|
std::map<PART_ID, LIB_SYMBOL*> m_partMap; ///< Map between Cadstar and KiCad Parts
|
||||||
|
std::vector<LIB_SYMBOL*> m_loadedSymbols; ///< Loaded symbols so far
|
||||||
std::map<PART_GATE_ID, SYMDEF_ID> m_partSymbolsMap; ///< Map holding the symbols loaded so far
|
std::map<PART_GATE_ID, SYMDEF_ID> m_partSymbolsMap; ///< Map holding the symbols loaded so far
|
||||||
/// for a particular PART_ID and GATE_ID
|
/// for a particular PART_ID and GATE_ID
|
||||||
std::map<PART_ID, TERMINAL_TO_PINNUM_MAP> m_pinNumsMap; ///< Map of pin numbers in CADSTAR parts
|
std::map<PART_ID, TERMINAL_TO_PINNUM_MAP> m_pinNumsMap; ///< Map of pin numbers in CADSTAR parts
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include <sch_screen.h>
|
#include <sch_screen.h>
|
||||||
#include <sch_sheet.h>
|
#include <sch_sheet.h>
|
||||||
#include <schematic.h>
|
#include <schematic.h>
|
||||||
|
#include <sch_plugins/kicad/sch_sexpr_plugin.h>
|
||||||
#include <wildcards_and_files_ext.h>
|
#include <wildcards_and_files_ext.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,7 +62,7 @@ int CADSTAR_SCH_ARCHIVE_PLUGIN::GetModifyHash() const
|
||||||
SCH_SHEET* CADSTAR_SCH_ARCHIVE_PLUGIN::Load( const wxString& aFileName, SCHEMATIC* aSchematic,
|
SCH_SHEET* CADSTAR_SCH_ARCHIVE_PLUGIN::Load( const wxString& aFileName, SCHEMATIC* aSchematic,
|
||||||
SCH_SHEET* aAppendToMe, const STRING_UTF8_MAP* aProperties )
|
SCH_SHEET* aAppendToMe, const STRING_UTF8_MAP* aProperties )
|
||||||
{
|
{
|
||||||
wxASSERT( !aFileName || aSchematic != NULL );
|
wxCHECK( !aFileName.IsEmpty() && aSchematic, nullptr );
|
||||||
|
|
||||||
SCH_SHEET* rootSheet = nullptr;
|
SCH_SHEET* rootSheet = nullptr;
|
||||||
|
|
||||||
|
@ -78,7 +79,6 @@ SCH_SHEET* CADSTAR_SCH_ARCHIVE_PLUGIN::Load( const wxString& aFileName, SCHEMATI
|
||||||
aSchematic->SetRoot( rootSheet );
|
aSchematic->SetRoot( rootSheet );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if( !rootSheet->GetScreen() )
|
if( !rootSheet->GetScreen() )
|
||||||
{
|
{
|
||||||
SCH_SCREEN* screen = new SCH_SCREEN( aSchematic );
|
SCH_SCREEN* screen = new SCH_SCREEN( aSchematic );
|
||||||
|
@ -86,9 +86,13 @@ SCH_SHEET* CADSTAR_SCH_ARCHIVE_PLUGIN::Load( const wxString& aFileName, SCHEMATI
|
||||||
rootSheet->SetScreen( screen );
|
rootSheet->SetScreen( screen );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CADSTAR_SCH_ARCHIVE_LOADER csaLoader( aFileName, m_reporter, m_progressReporter );
|
||||||
|
csaLoader.Load( aSchematic, rootSheet );
|
||||||
|
|
||||||
|
// SAVE SYMBOLS TO PROJECT LIBRARY:
|
||||||
SYMBOL_LIB_TABLE* libTable = aSchematic->Prj().SchSymbolLibTable();
|
SYMBOL_LIB_TABLE* libTable = aSchematic->Prj().SchSymbolLibTable();
|
||||||
|
|
||||||
wxCHECK_MSG( libTable, NULL, "Could not load symbol lib table." );
|
wxCHECK_MSG( libTable, nullptr, "Could not load symbol lib table." );
|
||||||
|
|
||||||
// Lets come up with a nice library name
|
// Lets come up with a nice library name
|
||||||
wxString libName = aSchematic->Prj().GetProjectName();
|
wxString libName = aSchematic->Prj().GetProjectName();
|
||||||
|
@ -104,8 +108,8 @@ SCH_SHEET* CADSTAR_SCH_ARCHIVE_PLUGIN::Load( const wxString& aFileName, SCHEMATI
|
||||||
|
|
||||||
libName = LIB_ID::FixIllegalChars( libName, true );
|
libName = LIB_ID::FixIllegalChars( libName, true );
|
||||||
|
|
||||||
wxFileName libFileName(
|
wxFileName libFileName( aSchematic->Prj().GetProjectPath(), libName,
|
||||||
aSchematic->Prj().GetProjectPath(), libName, KiCadSymbolLibFileExtension );
|
KiCadSymbolLibFileExtension );
|
||||||
|
|
||||||
SCH_PLUGIN::SCH_PLUGIN_RELEASER sch_plugin;
|
SCH_PLUGIN::SCH_PLUGIN_RELEASER sch_plugin;
|
||||||
sch_plugin.set( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
sch_plugin.set( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||||
|
@ -121,8 +125,8 @@ SCH_SHEET* CADSTAR_SCH_ARCHIVE_PLUGIN::Load( const wxString& aFileName, SCHEMATI
|
||||||
new SYMBOL_LIB_TABLE_ROW( libName, libTableUri, wxString( "KiCad" ) ) );
|
new SYMBOL_LIB_TABLE_ROW( libName, libTableUri, wxString( "KiCad" ) ) );
|
||||||
|
|
||||||
// Save project symbol library table.
|
// Save project symbol library table.
|
||||||
wxFileName fn(
|
wxFileName fn( aSchematic->Prj().GetProjectPath(),
|
||||||
aSchematic->Prj().GetProjectPath(), SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
|
SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() );
|
||||||
|
|
||||||
// So output formatter goes out of scope and closes the file before reloading.
|
// So output formatter goes out of scope and closes the file before reloading.
|
||||||
{
|
{
|
||||||
|
@ -135,11 +139,31 @@ SCH_SHEET* CADSTAR_SCH_ARCHIVE_PLUGIN::Load( const wxString& aFileName, SCHEMATI
|
||||||
aSchematic->Prj().SchSymbolLibTable();
|
aSchematic->Prj().SchSymbolLibTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
CADSTAR_SCH_ARCHIVE_LOADER csaFile( aFileName, m_reporter, m_progressReporter );
|
// set properties to prevent save file on every symbol save
|
||||||
csaFile.Load( aSchematic, rootSheet, &sch_plugin, libFileName );
|
STRING_UTF8_MAP properties;
|
||||||
|
properties.emplace( SCH_SEXPR_PLUGIN::PropBuffering, "" );
|
||||||
|
|
||||||
|
for( LIB_SYMBOL* const& symbol : csaLoader.GetLoadedSymbols() )
|
||||||
|
sch_plugin->SaveSymbol( libFileName.GetFullPath(), symbol, &properties );
|
||||||
|
|
||||||
sch_plugin->SaveLibrary( libFileName.GetFullPath() );
|
sch_plugin->SaveLibrary( libFileName.GetFullPath() );
|
||||||
|
|
||||||
|
// Link up all symbols in the design to the newly created library
|
||||||
|
for( SCH_SHEET_PATH& sheet : aSchematic->GetSheets() )
|
||||||
|
{
|
||||||
|
for( SCH_ITEM* item : sheet.LastScreen()->Items().OfType( SCH_SYMBOL_T ) )
|
||||||
|
{
|
||||||
|
SCH_SYMBOL* sym = static_cast<SCH_SYMBOL*>( item );
|
||||||
|
|
||||||
|
if( sym->GetLibId().IsLegacy() )
|
||||||
|
{
|
||||||
|
LIB_ID libid = sym->GetLibId();
|
||||||
|
libid.SetLibNickname( libName );
|
||||||
|
sym->SetLibId( libid );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// Need to fix up junctions after import to retain connectivity
|
// Need to fix up junctions after import to retain connectivity
|
||||||
aSchematic->FixupJunctions();
|
aSchematic->FixupJunctions();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue