CADSTAR Schematic Archive Importer: Handle Pin Swaps

Each schematic symbol instance can have pin numbers that diverge from
the pin number definitions in the library
This commit is contained in:
Roberto Fernandez Bautista 2021-02-03 20:06:41 +00:00 committed by Wayne Stambaugh
parent 4ea487936b
commit cb90a4b7e6
2 changed files with 60 additions and 7 deletions

View File

@ -340,10 +340,10 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSchematicSymbolInstances()
continue;
}
LIB_PART* kiPart = mPartMap.at( sym.PartRef.RefID );
LIB_PART* kiPart = mPartMap.at( sym.PartRef.RefID );
double symOrientDeciDeg = 0.0;
SCH_COMPONENT* component = loadSchematicSymbol( sym, kiPart, symOrientDeciDeg );
SCH_COMPONENT* component = loadSchematicSymbol( sym, *kiPart, symOrientDeciDeg );
SCH_FIELD* refField = component->GetField( REFERENCE_FIELD );
@ -478,7 +478,7 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSchematicSymbolInstances()
double compOrientationTenthDegree = 0.0;
SCH_COMPONENT* component =
loadSchematicSymbol( sym, kiPart, compOrientationTenthDegree );
loadSchematicSymbol( sym, *kiPart, compOrientationTenthDegree );
mPowerSymMap.insert( { sym.ID, component } );
}
@ -1078,6 +1078,8 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSymDefIntoLibrary( const SYMDEF_ID& aSymdef
}
}
TERMINAL_TO_PINNUM_MAP pinNumMap;
for( std::pair<TERMINAL_ID, TERMINAL> termPair : symbol.Terminals )
{
TERMINAL term = termPair.second;
@ -1103,6 +1105,8 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSymDefIntoLibrary( const SYMDEF_ID& aSymdef
}
pin->SetType( getKiCadPinType( csPin.Type ) );
pinNumMap.insert( { term.ID, pinNum } );
}
else
{
@ -1138,6 +1142,9 @@ void CADSTAR_SCH_ARCHIVE_LOADER::loadSymDefIntoLibrary( const SYMDEF_ID& aSymdef
aPart->AddDrawItem( pin );
}
if(aCadstarPart)
mPinNumsMap.insert( { aCadstarPart->ID + aGateID, pinNumMap } );
for( std::pair<TEXT_ID, TEXT> textPair : symbol.Texts )
{
TEXT csText = textPair.second;
@ -1411,16 +1418,16 @@ void CADSTAR_SCH_ARCHIVE_LOADER::applyToLibraryFieldAttribute(
SCH_COMPONENT* CADSTAR_SCH_ARCHIVE_LOADER::loadSchematicSymbol(
const SYMBOL& aCadstarSymbol, LIB_PART* aKiCadPart, double& aComponentOrientationDeciDeg )
const SYMBOL& aCadstarSymbol, const LIB_PART& aKiCadPart, double& aComponentOrientationDeciDeg )
{
LIB_ID libId( mLibraryFileName.GetName(), aKiCadPart->GetName() );
LIB_ID libId( mLibraryFileName.GetName(), aKiCadPart.GetName() );
int unit = getKiCadUnitNumberFromGate( aCadstarSymbol.GateID );
SCH_SHEET_PATH sheetpath;
SCH_SHEET* kiSheet = mSheetMap.at( aCadstarSymbol.LayerID );
mRootSheet->LocatePathOfScreen( kiSheet->GetScreen(), &sheetpath );
SCH_COMPONENT* component = new SCH_COMPONENT( *aKiCadPart, libId, &sheetpath, unit );
SCH_COMPONENT* component = new SCH_COMPONENT( aKiCadPart, libId, &sheetpath, unit );
if( aCadstarSymbol.IsComponent )
{
@ -1463,6 +1470,50 @@ SCH_COMPONENT* CADSTAR_SCH_ARCHIVE_LOADER::loadSchematicSymbol(
return nullptr;
}
wxString gate = ( aCadstarSymbol.GateID.IsEmpty() ) ? wxT( "A" ) : aCadstarSymbol.GateID;
wxString partGateIndex = aCadstarSymbol.PartRef.RefID + gate;
//Handle pin swaps
if( mPinNumsMap.find( partGateIndex ) != mPinNumsMap.end() )
{
TERMINAL_TO_PINNUM_MAP termNumMap = mPinNumsMap.at( partGateIndex );
std::map<wxString, LIB_PIN*> pinNumToLibPinMap;
for( auto& term : termNumMap )
{
wxString pinNum = term.second;
pinNumToLibPinMap.insert( { pinNum, component->GetPartRef()->GetPin( term.second ) } );
}
auto replacePinNumber = [&]( wxString aOldPinNum, wxString aNewPinNum )
{
if( aOldPinNum == aNewPinNum )
return;
LIB_PIN* libpin = pinNumToLibPinMap.at( aOldPinNum );
libpin->SetNumber( aNewPinNum );
};
//Older versions of Cadstar used pin numbers
for( auto& pinPair : aCadstarSymbol.PinNumbers )
{
SYMBOL::PIN_NUM pin = pinPair.second;
replacePinNumber( termNumMap.at( pin.TerminalID ),
wxString::Format( "%ld", pin.PinNum ) );
}
//Newer versions of Cadstar use pin names
for( auto& pinPair : aCadstarSymbol.PinNames )
{
SYMPINNAME_LABEL pin = pinPair.second;
replacePinNumber( termNumMap.at( pin.TerminalID ), pin.NameOrLabel );
}
component->UpdatePins();
}
kiSheet->GetScreen()->Append( component );
return component;

View File

@ -78,6 +78,7 @@ public:
private:
typedef std::pair<BLOCK_ID, TERMINAL_ID> BLOCK_PIN_ID;
typedef std::map<TERMINAL_ID, wxString> TERMINAL_TO_PINNUM_MAP;
::SCHEMATIC* mSchematic;
::SCH_SHEET* mRootSheet;
@ -92,6 +93,7 @@ private:
std::map<BLOCK_PIN_ID, SCH_HIERLABEL*>
mSheetPinMap; ///< Map between Cadstar and KiCad Sheets Pins
std::map<PART_ID, LIB_PART*> mPartMap; ///< Map between Cadstar and KiCad Parts
std::map<PART_ID, TERMINAL_TO_PINNUM_MAP> mPinNumsMap; ///< Map of pin numbers
std::map<SYMDEF_ID, LIB_PART*>
mPowerSymLibMap; ///< Map between Cadstar and KiCad Power Symbol Library items
std::map<SYMBOL_ID, SCH_COMPONENT*>
@ -134,7 +136,7 @@ private:
wxPoint aSymbolOrigin, LIB_FIELD* aKiCadField );
//Helper Functions for loading symbols in schematic
SCH_COMPONENT* loadSchematicSymbol( const SYMBOL& aCadstarSymbol, LIB_PART* aKiCadPart,
SCH_COMPONENT* loadSchematicSymbol( const SYMBOL& aCadstarSymbol, const LIB_PART& aKiCadPart,
double& aComponentOrientationDeciDeg );
void loadSymbolFieldAttribute( const ATTRIBUTE_LOCATION& aCadstarAttrLoc,