From 25a60fac54722a171e6a96a29974fb0bfc043d24 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Wed, 6 Sep 2023 11:36:27 -0700 Subject: [PATCH] Altium fixes - Designators and Parameters are shared by all display modes, so don't try to extract one, just place the elements on them all --- .../sch_plugins/altium/sch_altium_plugin.cpp | 185 ++++++++++-------- .../sch_plugins/altium/sch_altium_plugin.h | 12 +- 2 files changed, 108 insertions(+), 89 deletions(-) diff --git a/eeschema/sch_plugins/altium/sch_altium_plugin.cpp b/eeschema/sch_plugins/altium/sch_altium_plugin.cpp index b8220f57bd..63145aa762 100644 --- a/eeschema/sch_plugins/altium/sch_altium_plugin.cpp +++ b/eeschema/sch_plugins/altium/sch_altium_plugin.cpp @@ -3415,38 +3415,10 @@ void SCH_ALTIUM_PLUGIN::ParseFileName( const std::map& aProp } -void SCH_ALTIUM_PLUGIN::ParseDesignator( const std::map& aProperties, - std::vector& aSymbol, - std::vector& aFontSizes ) +void SCH_ALTIUM_PLUGIN::ParseDesignator( const std::map& aProperties ) { ASCH_DESIGNATOR elem( aProperties ); - if( !aSymbol.empty() ) - { - wxCHECK_RET( static_cast( aSymbol.size() ) > elem.ownerpartdisplaymode, wxT( "Invalid ownerpartdisplaymode" ) ); - - LIB_SYMBOL* symbol = aSymbol[elem.ownerpartdisplaymode]; - - bool emptyRef = elem.text.IsEmpty(); - LIB_FIELD& refField = symbol->GetReferenceField(); - - if( emptyRef ) - refField.SetText( wxT( "X" ) ); - else - refField.SetText( elem.text.BeforeLast( '?' ) ); // remove the '?' at the end for KiCad-style - - refField.SetPosition( GetLibEditPosition( elem.location ) ); - - if( elem.fontId > 0 && elem.fontId <= static_cast( aFontSizes.size() ) ) - { - int size = aFontSizes[elem.fontId - 1]; - refField.SetTextSize( { size, size } ); - } - - return; - } - - const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex ); if( libSymbolIt == m_libSymbols.end() ) @@ -3482,6 +3454,34 @@ void SCH_ALTIUM_PLUGIN::ParseDesignator( const std::map& aPr } +void SCH_ALTIUM_PLUGIN::ParseLibDesignator( const std::map& aProperties, + std::vector& aSymbol, + std::vector& aFontSizes ) +{ + ASCH_DESIGNATOR elem( aProperties ); + + // Designators are shared by everyone + for( LIB_SYMBOL* symbol : aSymbol ) + { + bool emptyRef = elem.text.IsEmpty(); + LIB_FIELD& refField = symbol->GetReferenceField(); + + if( emptyRef ) + refField.SetText( wxT( "X" ) ); + else + refField.SetText( elem.text.BeforeLast( '?' ) ); // remove the '?' at the end for KiCad-style + + refField.SetPosition( GetLibEditPosition( elem.location ) ); + + if( elem.fontId > 0 && elem.fontId <= static_cast( aFontSizes.size() ) ) + { + int size = aFontSizes[elem.fontId - 1]; + refField.SetTextSize( { size, size } ); + } + } +} + + void SCH_ALTIUM_PLUGIN::ParseBusEntry( const std::map& aProperties ) { ASCH_BUS_ENTRY elem( aProperties ); @@ -3499,9 +3499,7 @@ void SCH_ALTIUM_PLUGIN::ParseBusEntry( const std::map& aProp } -void SCH_ALTIUM_PLUGIN::ParseParameter( const std::map& aProperties, - std::vector& aSymbol, - std::vector& aFontSizes ) +void SCH_ALTIUM_PLUGIN::ParseParameter( const std::map& aProperties ) { ASCH_PARAMETER elem( aProperties ); @@ -3511,7 +3509,7 @@ void SCH_ALTIUM_PLUGIN::ParseParameter( const std::map& aPro { "VALUE", "ALTIUM_VALUE" }, }; - if( aSymbol.empty() && elem.ownerindex <= 0 && elem.ownerpartid == ALTIUM_COMPONENT_NONE ) + if( elem.ownerindex <= 0 && elem.ownerpartid == ALTIUM_COMPONENT_NONE ) { // This is some sheet parameter if( elem.text == "*" ) @@ -3546,44 +3544,28 @@ void SCH_ALTIUM_PLUGIN::ParseParameter( const std::map& aPro } else { - wxCHECK_RET( static_cast( aSymbol.size() ) > elem.ownerpartdisplaymode, wxT( "Invalid ownerpartdisplaymode" ) ); + const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex ); - LIB_SYMBOL* libSymbol = aSymbol[elem.ownerpartdisplaymode]; - SCH_SYMBOL* symbol = nullptr; - - if( !symbol ) + if( libSymbolIt == m_libSymbols.end() ) { - const auto& libSymbolIt = m_libSymbols.find( elem.ownerindex ); - - if( libSymbolIt == m_libSymbols.end() ) - { - // TODO: e.g. can depend on Template (RECORD=39 - return; - } - - libSymbol = libSymbolIt->second; - symbol = m_symbols.at( libSymbolIt->first ); + // TODO: e.g. can depend on Template (RECORD=39 + return; } - EDA_TEXT* field = nullptr; + SCH_SYMBOL* symbol = m_symbols.at( libSymbolIt->first ); + SCH_FIELD* field = nullptr; wxString upperName = elem.name.Upper(); if( upperName == "COMMENT" ) { - if( !symbol ) - field = &libSymbol->GetValueField(); - else - field = symbol->GetField( VALUE_FIELD ); + field = symbol->GetField( VALUE_FIELD ); } else { int fieldIdx = 0; wxString fieldName = elem.name.Upper(); - if( !symbol ) - fieldIdx = libSymbol->GetFieldCount(); - else - fieldIdx = symbol->GetFieldCount(); + fieldIdx = symbol->GetFieldCount(); if( fieldName.IsEmpty() ) { @@ -3593,16 +3575,9 @@ void SCH_ALTIUM_PLUGIN::ParseParameter( const std::map& aPro { fieldName = wxString::Format( "ALTIUM_UNNAMED_%d", disambiguate++ ); - if( symbol ) - { - if( !symbol->FindField( fieldName ) ) - break; - } - else - { - if( !libSymbol->FindField( fieldName ) ) - break; - } + if( !symbol->FindField( fieldName ) ) + break; + } } else if( fieldName == "VALUE" ) @@ -3610,31 +3585,73 @@ void SCH_ALTIUM_PLUGIN::ParseParameter( const std::map& aPro fieldName = "ALTIUM_VALUE"; } - if( !symbol ) + field = symbol->AddField( SCH_FIELD( VECTOR2I(), fieldIdx, symbol, fieldName ) ); + } + + wxString kicadText = AltiumSpecialStringsToKiCadVariables( elem.text, variableMap ); + field->SetText( kicadText ); + field->SetPosition( elem.location + m_sheetOffset ); + field->SetVisible( !elem.isHidden ); + SetTextPositioning( field, elem.justification, elem.orientation ); + } +} + + +void SCH_ALTIUM_PLUGIN::ParseLibParameter( const std::map& aProperties, + std::vector& aSymbol, + std::vector& aFontSizes ) +{ + ASCH_PARAMETER elem( aProperties ); + + // TODO: fill in replacements from variant, sheet and project + // N.B. We do not keep the Altium "VALUE" variable here because + // we don't have a way to assign variables to specific symbols + std::map variableMap = { + { "COMMENT", "VALUE" }, + }; + + for( LIB_SYMBOL* libSymbol : aSymbol ) + { + LIB_FIELD* field = nullptr; + wxString upperName = elem.name.Upper(); + + if( upperName == "COMMENT" ) + { + field = &libSymbol->GetValueField(); + } + else + { + int fieldIdx = libSymbol->GetFieldCount(); + wxString fieldName = elem.name.Upper(); + + if( fieldName.IsEmpty() ) { - LIB_FIELD* new_field = new LIB_FIELD( fieldIdx, fieldName ); - libSymbol->AddField( new_field ); - field = new_field; + int disambiguate = 1; + + while( 1 ) + { + fieldName = wxString::Format( "ALTIUM_UNNAMED_%d", disambiguate++ ); + + if( !libSymbol->FindField( fieldName ) ) + break; + } } - else + else if( fieldName == "VALUE" ) { - field = symbol->AddField( SCH_FIELD( VECTOR2I(), fieldIdx, symbol, fieldName ) ); + fieldName = "ALTIUM_VALUE"; } + + LIB_FIELD* new_field = new LIB_FIELD( fieldIdx, fieldName ); + libSymbol->AddField( new_field ); + field = new_field; } wxString kicadText = AltiumSpecialStringsToKiCadVariables( elem.text, variableMap ); field->SetText( kicadText ); - if( !symbol ) - { - field->SetTextPos( elem.location ); - SetTextPositioning( field, elem.justification, elem.orientation ); - } - else - { - static_cast( field )->SetPosition( elem.location + m_sheetOffset ); - } + field->SetTextPos( GetLibEditPosition( elem.location ) ); + SetTextPositioning( field, elem.justification, elem.orientation ); field->SetVisible( !elem.isHidden ); SetTextPositioning( field, elem.justification, elem.orientation ); @@ -3856,9 +3873,9 @@ std::map SCH_ALTIUM_PLUGIN::ParseLibFile( const ALTIUM_COM case ALTIUM_SCH_RECORD::RECTANGLE: ParseRectangle( properties, symbols ); break; - case ALTIUM_SCH_RECORD::DESIGNATOR: ParseDesignator( properties, symbols, fontSizes ); break; + case ALTIUM_SCH_RECORD::DESIGNATOR: ParseLibDesignator( properties, symbols, fontSizes ); break; - case ALTIUM_SCH_RECORD::PARAMETER: ParseParameter( properties, symbols, fontSizes ); break; + case ALTIUM_SCH_RECORD::PARAMETER: ParseLibParameter( properties, symbols, fontSizes ); break; case ALTIUM_SCH_RECORD::TEXT_FRAME: ParseTextFrame( properties, symbols, fontSizes ); break; diff --git a/eeschema/sch_plugins/altium/sch_altium_plugin.h b/eeschema/sch_plugins/altium/sch_altium_plugin.h index 0ad86a3145..8695b4c417 100644 --- a/eeschema/sch_plugins/altium/sch_altium_plugin.h +++ b/eeschema/sch_plugins/altium/sch_altium_plugin.h @@ -131,12 +131,12 @@ private: bool IsComponentPartVisible( int aOwnerindex, int aOwnerpartdisplaymode ) const; const ASCH_STORAGE_FILE* GetFileFromStorage( const wxString& aFilename ) const; void AddTextBox( const ASCH_TEXT_FRAME* aElem ); - void AddLibTextBox( const ASCH_TEXT_FRAME* aElem, std::vector& aSymbol = nullsym, std::vector& aSymbolIndex = nullint ); + void AddLibTextBox( const ASCH_TEXT_FRAME* aElem, std::vector& aSymbol = nullsym, std::vector& aFontSize = nullint ); void ParseComponent( int aIndex, const std::map& aProperties ); void ParsePin( const std::map& aProperties, std::vector& aSymbol = nullsym); - void ParseLabel( const std::map& aProperties, std::vector& aSymbol = nullsym, std::vector& aSymbolIndex = nullint ); - void ParseTextFrame( const std::map& aProperties, std::vector& aSymbol = nullsym, std::vector& aSymbolIndex = nullint ); + void ParseLabel( const std::map& aProperties, std::vector& aSymbol = nullsym, std::vector& aFontSize = nullint ); + void ParseTextFrame( const std::map& aProperties, std::vector& aSymbol = nullsym, std::vector& aFontSize = nullint ); void ParseNote( const std::map& aProperties ); void ParseBezier( const std::map& aProperties, std::vector& aSymbol = nullsym); void ParsePolyline( const std::map& aProperties, std::vector& aSymbol = nullsym); @@ -167,9 +167,11 @@ private: void ParseSheet( const std::map& aProperties ); void ParseSheetName( const std::map& aProperties ); void ParseFileName( const std::map& aProperties ); - void ParseDesignator( const std::map& aProperties, std::vector& aSymbol = nullsym, std::vector& aSymbolIndex = nullint ); + void ParseDesignator( const std::map& aProperties ); + void ParseLibDesignator( const std::map& aProperties, std::vector& aSymbol = nullsym, std::vector& aFontSize = nullint ); void ParseBusEntry( const std::map& aProperties ); - void ParseParameter( const std::map& aProperties, std::vector& aSymbol = nullsym, std::vector& aSymbolIndex = nullint ); + void ParseParameter( const std::map& aProperties ); + void ParseLibParameter( const std::map& aProperties, std::vector& aSymbol = nullsym, std::vector& aFontSize = nullint ); void ParseImplementationList( int aIndex, const std::map& aProperties ); void ParseImplementation( const std::map& aProperties, std::vector& aSymbol = nullsym );