From 2da13a9e074f4560f94f8715f4ab62bd199acaea Mon Sep 17 00:00:00 2001 From: Roberto Fernandez Bautista Date: Sun, 26 Feb 2023 17:27:25 +0100 Subject: [PATCH] CADSTAR SCH: Separate out saving loaded lib symbols to library --- .../cadstar/cadstar_sch_archive_loader.cpp | 28 ++++++------- .../cadstar/cadstar_sch_archive_loader.h | 11 +++-- .../cadstar/cadstar_sch_archive_plugin.cpp | 42 +++++++++++++++---- 3 files changed, 50 insertions(+), 31 deletions(-) diff --git a/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.cpp b/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.cpp index 2555493a34..1fe0d75b51 100644 --- a/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.cpp +++ b/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.cpp @@ -53,10 +53,10 @@ const wxString PartNameFieldName = "Part Name"; -void CADSTAR_SCH_ARCHIVE_LOADER::Load( SCHEMATIC* aSchematic, SCH_SHEET* aRootSheet, - SCH_PLUGIN::SCH_PLUGIN_RELEASER* aSchPlugin, - const wxFileName& aLibraryFileName ) +void CADSTAR_SCH_ARCHIVE_LOADER::Load( SCHEMATIC* aSchematic, SCH_SHEET* aRootSheet ) { + wxCHECK( aSchematic ); + if( m_progressReporter ) 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 m_designCenter = { 0, 0 }; - m_schematic = aSchematic; - m_rootSheet = aRootSheet; - m_plugin = aSchPlugin; - m_libraryFileName = aLibraryFileName; + m_schematic = aSchematic; + m_rootSheet = aRootSheet; if( m_progressReporter ) { @@ -414,12 +412,8 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadPartsLibrary() if( ok && part.Definition.GateSymbols.size() != 0 ) { - ( *m_plugin )->SaveSymbol( m_libraryFileName.GetFullPath(), kiPart ); - - LIB_SYMBOL* loadedPart = - ( *m_plugin )->LoadSymbol( m_libraryFileName.GetFullPath(), kiPart->GetName() ); - - m_partMap.insert( { partID, loadedPart } ); + m_loadedSymbols.push_back( kiPart ); + m_partMap.insert( { partID, kiPart } ); } else { @@ -636,7 +630,7 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSchematicSymbolInstances() kiPart->GetReferenceField().SetText( "#PWR" ); kiPart->GetReferenceField().SetVisible( false ); - ( *m_plugin )->SaveSymbol( m_libraryFileName.GetFullPath(), kiPart ); + m_loadedSymbols.push_back( kiPart ); m_powerSymLibMap.insert( { libPartName, kiPart } ); } else @@ -1749,8 +1743,10 @@ SCH_SYMBOL* CADSTAR_SCH_ARCHIVE_LOADER::loadSchematicSymbol( const SYMBOL& aCads const LIB_SYMBOL& aKiCadPart, EDA_ANGLE& aComponentOrientation ) { - LIB_ID libId( m_libraryFileName.GetName(), aKiCadPart.GetName() ); - int unit = getKiCadUnitNumberFromGate( aCadstarSymbol.GateID ); + LIB_ID libId; + libId.SetLibItemName( aKiCadPart.GetName() ); + + int unit = getKiCadUnitNumberFromGate( aCadstarSymbol.GateID ); SCH_SHEET_PATH sheetpath; SCH_SHEET* kiSheet = m_sheetMap.at( aCadstarSymbol.LayerID ); diff --git a/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.h b/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.h index 17d9b7e6b9..9906ae2a52 100644 --- a/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.h +++ b/eeschema/sch_plugins/cadstar/cadstar_sch_archive_loader.h @@ -62,7 +62,6 @@ public: { m_schematic = nullptr; m_rootSheet = nullptr; - m_plugin = nullptr; m_designCenter.x = 0; m_designCenter.y = 0; m_reporter = aReporter; @@ -74,13 +73,14 @@ public: { } + const std::vector& 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 aRootSheet Root sheet to add the design onto */ - void Load( SCHEMATIC* aSchematic, SCH_SHEET* aRootSheet, - SCH_PLUGIN::SCH_PLUGIN_RELEASER* aSchPlugin, const wxFileName& aLibraryFileName ); + void Load( SCHEMATIC* aSchematic, SCH_SHEET* aRootSheet ); private: @@ -96,8 +96,6 @@ private: REPORTER* m_reporter; SCHEMATIC* m_schematic; SCH_SHEET* m_rootSheet; - SCH_PLUGIN::SCH_PLUGIN_RELEASER* m_plugin; - wxFileName m_libraryFileName; wxPoint m_designCenter; ///< Used for calculating the required ///< offset to apply to the Cadstar design ///< so that it fits in KiCad canvas @@ -105,6 +103,7 @@ private: std::map m_sheetPinMap; ///< Map between Cadstar and KiCad Sheets Pins std::map m_partMap; ///< Map between Cadstar and KiCad Parts + std::vector m_loadedSymbols; ///< Loaded symbols so far std::map m_partSymbolsMap; ///< Map holding the symbols loaded so far /// for a particular PART_ID and GATE_ID std::map m_pinNumsMap; ///< Map of pin numbers in CADSTAR parts diff --git a/eeschema/sch_plugins/cadstar/cadstar_sch_archive_plugin.cpp b/eeschema/sch_plugins/cadstar/cadstar_sch_archive_plugin.cpp index f5c6df4140..92ce45f43a 100644 --- a/eeschema/sch_plugins/cadstar/cadstar_sch_archive_plugin.cpp +++ b/eeschema/sch_plugins/cadstar/cadstar_sch_archive_plugin.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -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* aAppendToMe, const STRING_UTF8_MAP* aProperties ) { - wxASSERT( !aFileName || aSchematic != NULL ); + wxCHECK( !aFileName.IsEmpty() && aSchematic, nullptr ); SCH_SHEET* rootSheet = nullptr; @@ -78,7 +79,6 @@ SCH_SHEET* CADSTAR_SCH_ARCHIVE_PLUGIN::Load( const wxString& aFileName, SCHEMATI aSchematic->SetRoot( rootSheet ); } - if( !rootSheet->GetScreen() ) { 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 ); } + 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(); - 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 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 ); - wxFileName libFileName( - aSchematic->Prj().GetProjectPath(), libName, KiCadSymbolLibFileExtension ); + wxFileName libFileName( aSchematic->Prj().GetProjectPath(), libName, + KiCadSymbolLibFileExtension ); SCH_PLUGIN::SCH_PLUGIN_RELEASER sch_plugin; 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" ) ) ); // Save project symbol library table. - wxFileName fn( - aSchematic->Prj().GetProjectPath(), SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() ); + wxFileName fn( aSchematic->Prj().GetProjectPath(), + SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() ); // 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(); } - CADSTAR_SCH_ARCHIVE_LOADER csaFile( aFileName, m_reporter, m_progressReporter ); - csaFile.Load( aSchematic, rootSheet, &sch_plugin, libFileName ); + // set properties to prevent save file on every symbol save + 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() ); + // 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( 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 aSchematic->FixupJunctions();