From 468beb5a053dcf18e7851f29bc75ab53b1b18c69 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Wed, 6 Sep 2023 10:10:54 -0700 Subject: [PATCH] Handle font sizes in Altium libs --- .../sch_plugins/altium/altium_parser_sch.cpp | 3 + .../sch_plugins/altium/altium_parser_sch.h | 2 + .../sch_plugins/altium/sch_altium_plugin.cpp | 106 +++++++++--------- .../sch_plugins/altium/sch_altium_plugin.h | 14 +-- 4 files changed, 67 insertions(+), 58 deletions(-) diff --git a/eeschema/sch_plugins/altium/altium_parser_sch.cpp b/eeschema/sch_plugins/altium/altium_parser_sch.cpp index 0cd4539c8f..6cf220ec3a 100644 --- a/eeschema/sch_plugins/altium/altium_parser_sch.cpp +++ b/eeschema/sch_plugins/altium/altium_parser_sch.cpp @@ -851,6 +851,7 @@ ASCH_DESIGNATOR::ASCH_DESIGNATOR( const std::map& aProps ) : name = ALTIUM_PARSER::ReadString( aProps, "NAME", "" ); text = ALTIUM_PARSER::ReadString( aProps, "TEXT", "" ); + fontId = ALTIUM_PARSER::ReadInt( aProps, "FONTID", 0 ); justification = ReadEnum( aProps, "JUSTIFICATION", 0, 8, ASCH_LABEL_JUSTIFICATION::BOTTOM_LEFT ); @@ -916,6 +917,8 @@ ASCH_PARAMETER::ASCH_PARAMETER( const std::map& aProps ) : isHidden = ALTIUM_PARSER::ReadBool( aProps, "ISHIDDEN", false ); isMirrored = ALTIUM_PARSER::ReadBool( aProps, "ISMIRRORED", false ); isShowName = ALTIUM_PARSER::ReadBool( aProps, "SHOWNAME", false ); + + fontId = ALTIUM_PARSER::ReadInt( aProps, "FONTID", 0 ); } diff --git a/eeschema/sch_plugins/altium/altium_parser_sch.h b/eeschema/sch_plugins/altium/altium_parser_sch.h index 8d0df4463b..0bfe05b7ca 100644 --- a/eeschema/sch_plugins/altium/altium_parser_sch.h +++ b/eeschema/sch_plugins/altium/altium_parser_sch.h @@ -847,6 +847,7 @@ struct ASCH_DESIGNATOR : ASCH_OWNER_INTERFACE { wxString name; wxString text; + int fontId; ASCH_RECORD_ORIENTATION orientation; ASCH_LABEL_JUSTIFICATION justification; @@ -895,6 +896,7 @@ struct ASCH_PARAMETER : ASCH_OWNER_INTERFACE bool isHidden; bool isMirrored; bool isShowName; + int fontId; explicit ASCH_PARAMETER( const std::map& aProps ); }; diff --git a/eeschema/sch_plugins/altium/sch_altium_plugin.cpp b/eeschema/sch_plugins/altium/sch_altium_plugin.cpp index 5e9f603143..b8220f57bd 100644 --- a/eeschema/sch_plugins/altium/sch_altium_plugin.cpp +++ b/eeschema/sch_plugins/altium/sch_altium_plugin.cpp @@ -1202,7 +1202,7 @@ void SetTextPositioning( EDA_TEXT* text, ASCH_LABEL_JUSTIFICATION justification, } -void SCH_ALTIUM_PLUGIN::ParseLabel( const std::map& aProperties, std::vector& aSymbol ) +void SCH_ALTIUM_PLUGIN::ParseLabel( const std::map& aProperties, std::vector& aSymbol, std::vector& aFontSizes ) { ASCH_LABEL elem( aProperties ); @@ -1289,18 +1289,23 @@ void SCH_ALTIUM_PLUGIN::ParseLabel( const std::map& aPropert textItem->SetBold( font.Bold ); textItem->SetTextSize( { font.Size / 2, font.Size / 2 } ); } + else if( fontId > 0 && fontId <= aFontSizes.size() ) + { + int size = aFontSizes[fontId - 1]; + textItem->SetTextSize( { size, size } ); + } } } -void SCH_ALTIUM_PLUGIN::ParseTextFrame( const std::map& aProperties, std::vector& aSymbol ) +void SCH_ALTIUM_PLUGIN::ParseTextFrame( const std::map& aProperties, std::vector& aSymbol, std::vector& aFontSizes ) { ASCH_TEXT_FRAME elem( aProperties ); if( aSymbol.empty() ) AddTextBox( &elem ); else - AddLibTextBox( &elem, aSymbol ); + AddLibTextBox( &elem, aSymbol, aFontSizes ); } @@ -1376,7 +1381,7 @@ void SCH_ALTIUM_PLUGIN::AddTextBox(const ASCH_TEXT_FRAME *aElem ) } -void SCH_ALTIUM_PLUGIN::AddLibTextBox(const ASCH_TEXT_FRAME *aElem, std::vector& aSymbol ) +void SCH_ALTIUM_PLUGIN::AddLibTextBox(const ASCH_TEXT_FRAME *aElem, std::vector& aSymbol, std::vector& aFontSizes ) { if( aElem->ownerpartdisplaymode >= static_cast( aSymbol.size() ) ) return; @@ -1419,6 +1424,12 @@ void SCH_ALTIUM_PLUGIN::AddLibTextBox(const ASCH_TEXT_FRAME *aElem, std::vector< break; } + if( aElem->FontID > 0 && aElem->FontID <= static_cast( aFontSizes.size() ) ) + { + int size = aFontSizes[aElem->FontID - 1]; + textBox->SetTextSize( { size, size } ); + } + symbol->AddDrawItem( textBox, false ); } @@ -3405,7 +3416,8 @@ void SCH_ALTIUM_PLUGIN::ParseFileName( const std::map& aProp void SCH_ALTIUM_PLUGIN::ParseDesignator( const std::map& aProperties, - std::vector& aSymbol ) + std::vector& aSymbol, + std::vector& aFontSizes ) { ASCH_DESIGNATOR elem( aProperties ); @@ -3419,11 +3431,17 @@ void SCH_ALTIUM_PLUGIN::ParseDesignator( const std::map& aPr LIB_FIELD& refField = symbol->GetReferenceField(); if( emptyRef ) - refField.SetText( wxT( "X?" ) ); + refField.SetText( wxT( "X" ) ); else - refField.SetText( elem.text ); + refField.SetText( elem.text.BeforeLast( '?' ) ); // remove the '?' at the end for KiCad-style - refField.SetPosition( elem.location ); + 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; } @@ -3482,7 +3500,8 @@ void SCH_ALTIUM_PLUGIN::ParseBusEntry( const std::map& aProp void SCH_ALTIUM_PLUGIN::ParseParameter( const std::map& aProperties, - std::vector& aSymbol ) + std::vector& aSymbol, + std::vector& aFontSizes ) { ASCH_PARAMETER elem( aProperties ); @@ -3618,6 +3637,12 @@ void SCH_ALTIUM_PLUGIN::ParseParameter( const std::map& aPro field->SetVisible( !elem.isHidden ); SetTextPositioning( field, elem.justification, elem.orientation ); + + if( elem.fontId > 0 && elem.fontId <= static_cast( aFontSizes.size() ) ) + { + int size = aFontSizes[elem.fontId - 1]; + field->SetTextSize( { size, size } ); + } } } @@ -3721,20 +3746,9 @@ std::vector SCH_ALTIUM_PLUGIN::ParseLibComponent( const std::map SCH_ALTIUM_PLUGIN::ParseLibFile( const ALTIUM_COMPOUND_FILE& aAltiumLibFile ) { std::map ret; + std::vector fontSizes; - { - const CFB::COMPOUND_FILE_ENTRY* file = aAltiumLibFile.FindStream( { "FileHeader" } ); - - if( file == nullptr ) - THROW_IO_ERROR( "FileHeader not found" ); - - ALTIUM_PARSER reader( aAltiumLibFile, file ); - - if( reader.GetRemainingBytes() <= 0 ) - { - THROW_IO_ERROR( "FileHeader does not contain any data" ); - } - } + ParseLibHeader( aAltiumLibFile, fontSizes ); std::map syms = aAltiumLibFile.GetLibSymbols( nullptr ); @@ -3822,7 +3836,7 @@ std::map SCH_ALTIUM_PLUGIN::ParseLibFile( const ALTIUM_COM { case ALTIUM_SCH_RECORD::PIN: ParsePin( properties, symbols ); break; - case ALTIUM_SCH_RECORD::LABEL: ParseLabel( properties, symbols ); break; + case ALTIUM_SCH_RECORD::LABEL: ParseLabel( properties, symbols, fontSizes ); break; case ALTIUM_SCH_RECORD::BEZIER: ParseBezier( properties, symbols ); break; @@ -3842,11 +3856,11 @@ 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 ); break; + case ALTIUM_SCH_RECORD::DESIGNATOR: ParseDesignator( properties, symbols, fontSizes ); break; - case ALTIUM_SCH_RECORD::PARAMETER: ParseParameter( properties, symbols ); break; + case ALTIUM_SCH_RECORD::PARAMETER: ParseParameter( properties, symbols, fontSizes ); break; - case ALTIUM_SCH_RECORD::TEXT_FRAME: ParseTextFrame( properties, symbols ); break; + case ALTIUM_SCH_RECORD::TEXT_FRAME: ParseTextFrame( properties, symbols, fontSizes ); break; // Nothing for now. TODO: Figure out how implementation lists are generted in libs case ALTIUM_SCH_RECORD::IMPLEMENTATION_LIST: break; @@ -3884,6 +3898,11 @@ std::map SCH_ALTIUM_PLUGIN::ParseLibFile( const ALTIUM_COM LIB_SYMBOL* symbol = symbols[ii]; symbol->FixupDrawItems(); + LIB_FIELD& valField = symbol->GetValueField(); + + if( valField.GetText().IsEmpty() ) + valField.SetText( name ); + if( symbols.size() == 1 ) ret[name] = symbol; else @@ -3940,8 +3959,7 @@ void SCH_ALTIUM_PLUGIN::ensureLoadedLibrary( const wxString& aLibraryPath, } -void SCH_ALTIUM_PLUGIN::ParseLibHeader( const ALTIUM_COMPOUND_FILE& aAltiumSchFile, - wxArrayString& aSymbolNameList ) +void SCH_ALTIUM_PLUGIN::ParseLibHeader( const ALTIUM_COMPOUND_FILE& aAltiumSchFile, std::vector& aFontSizes ) { const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.FindStream( { "FileHeader" } ); @@ -3965,34 +3983,20 @@ void SCH_ALTIUM_PLUGIN::ParseLibHeader( const ALTIUM_COMPOUND_FILE& aAltiumSchFi for( auto& [key, value] : properties ) { wxString upperKey = key.Upper(); - wxString* remaining = nullptr; + wxString remaining; - if( upperKey.StartsWith( "LIBREF" ) ) + if( upperKey.StartsWith( "SIZE", &remaining ) ) { - aSymbolNameList.Add( value ); - } - else if( upperKey.StartsWith( "SIZE", remaining ) ) - { - if( remaining ) + if( !remaining.empty() ) { - int ind = wxAtoi( *remaining ); + int ind = wxAtoi( remaining ); - if( static_cast( m_fonts.size() ) <= ind ) - m_fonts.resize( ind + 1 ); + if( static_cast( aFontSizes.size() ) < ind ) + aFontSizes.resize( ind ); - m_fonts[ind].second = wxAtoi( value ); - } - } - else if( upperKey.StartsWith( "FONTNAME", remaining ) ) - { - if( remaining ) - { - int ind = wxAtoi( *remaining ); - - if( static_cast( m_fonts.size() ) <= ind ) - m_fonts.resize( ind + 1 ); - - m_fonts[ind].first = value; + // Altium stores in pt. 1 pt = 1/72 inch. 1 mil = 1/1000 inch. + int scaled = schIUScale.MilsToIU( wxAtoi( value ) * 72.0 / 10.0 ); + aFontSizes[ind - 1] = scaled; } } } diff --git a/eeschema/sch_plugins/altium/sch_altium_plugin.h b/eeschema/sch_plugins/altium/sch_altium_plugin.h index d2cc88087e..0ad86a3145 100644 --- a/eeschema/sch_plugins/altium/sch_altium_plugin.h +++ b/eeschema/sch_plugins/altium/sch_altium_plugin.h @@ -48,7 +48,7 @@ class ALTIUM_COMPOUND_FILE; */ static std::vector nullsym; - +static std::vector nullint; class SCH_ALTIUM_PLUGIN : public SCH_PLUGIN { public: @@ -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); + void AddLibTextBox( const ASCH_TEXT_FRAME* aElem, std::vector& aSymbol = nullsym, std::vector& aSymbolIndex = 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); - void ParseTextFrame( 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 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,13 +167,13 @@ 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); + void ParseDesignator( const std::map& aProperties, std::vector& aSymbol = nullsym, std::vector& aSymbolIndex = nullint ); void ParseBusEntry( const std::map& aProperties ); - void ParseParameter( const std::map& aProperties, std::vector& aSymbol = nullsym); + void ParseParameter( const std::map& aProperties, std::vector& aSymbol = nullsym, std::vector& aSymbolIndex = nullint ); void ParseImplementationList( int aIndex, const std::map& aProperties ); void ParseImplementation( const std::map& aProperties, std::vector& aSymbol = nullsym ); - void ParseLibHeader( const ALTIUM_COMPOUND_FILE& aAltiumSchFile, wxArrayString& aLibNames ); + void ParseLibHeader( const ALTIUM_COMPOUND_FILE& aAltiumSchFile, std::vector& aFontSizes ); std::map ParseLibFile( const ALTIUM_COMPOUND_FILE& aAltiumSchFile ); std::vector ParseLibComponent( const std::map& aProperties );