From 03953e80fcd9bd0e9a5de2e3d8ff30ded44d39ad Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Sun, 12 Nov 2023 14:14:41 +0000 Subject: [PATCH] Enforce SCH_SHEET_PATH processing in (yet) more places. Also fixes a bug where ERC testing for text variables in sheet pins would start with the wrong sheet. Also fixes a bug where ERC testing of similar labels would use the wrong sheet. Also fixes a bug where ERC testing of bus-to-net conflicts would use the wrong sheet. Also fixes a bug where ERC didn't process variable references when checking hierarchical labels against sheet pins. Also fixes a bug where ERC multiple-drivers and netclass-conflicts tests didn't set a sheetpath. --- eeschema/connection_graph.cpp | 80 +++++++++++-------- eeschema/dialogs/dialog_plot_schematic.cpp | 3 +- .../dialogs/dialog_symbol_fields_table.cpp | 13 +-- eeschema/erc.cpp | 61 +++++++------- eeschema/erc_item.cpp | 6 +- eeschema/sch_label.cpp | 17 ++-- eeschema/sch_label.h | 7 +- eeschema/sch_sheet.cpp | 8 +- eeschema/sch_symbol.cpp | 30 ++----- eeschema/sch_symbol.h | 7 -- eeschema/sch_text.h | 8 +- eeschema/sch_textbox.h | 8 +- eeschema/schematic.cpp | 72 ++++++++--------- eeschema/schematic.h | 2 +- 14 files changed, 168 insertions(+), 154 deletions(-) diff --git a/eeschema/connection_graph.cpp b/eeschema/connection_graph.cpp index 7d03c5addf..461b6ced6c 100644 --- a/eeschema/connection_graph.cpp +++ b/eeschema/connection_graph.cpp @@ -332,31 +332,39 @@ wxString CONNECTION_SUBGRAPH::driverName( SCH_ITEM* aItem ) const { case SCH_PIN_T: { - bool forceNoConnect = m_no_connect != nullptr; SCH_PIN* pin = static_cast( aItem ); + bool forceNoConnect = m_no_connect != nullptr; + return pin->GetDefaultNetName( m_sheet, forceNoConnect ); - break; } case SCH_LABEL_T: case SCH_GLOBAL_LABEL_T: case SCH_HIER_LABEL_T: + { + SCH_LABEL_BASE* label = static_cast( aItem ); + // NB: any changes here will need corresponding changes in SCH_LABEL_BASE::cacheShownText() - return EscapeString( static_cast( aItem )->GetShownText( &m_sheet, false ), - CTX_NETNAME ); + return EscapeString( label->GetShownText( &m_sheet, false ), CTX_NETNAME ); + } case SCH_SHEET_PIN_T: - // Sheet pins need to use their parent sheet as their starting sheet or they will - // resolve variables on the current sheet first - return EscapeString( static_cast( aItem )->GetShownText( nullptr, false ), - CTX_NETNAME ); + { + // Sheet pins need to use their parent sheet as their starting sheet or they will resolve + // variables on the current sheet first + SCH_SHEET_PIN* sheetPin = static_cast( aItem ); + SCH_SHEET_PATH path = m_sheet; + + if( path.Last() != sheetPin->GetParent() ) + path.push_back( sheetPin->GetParent() ); + + return EscapeString( sheetPin->GetShownText( &path, false ), CTX_NETNAME ); + } default: wxFAIL_MSG( wxS( "Unhandled item type in GetNameForDriver" ) ); - break; + return wxEmptyString; } - - return wxEmptyString; } @@ -2688,7 +2696,8 @@ std::vector CONNECTION_GRAPH::GetBusesNeedingMigrati if( !subgraph->m_driver ) continue; - SCH_CONNECTION* connection = subgraph->m_driver->Connection( &subgraph->m_sheet ); + SCH_SHEET_PATH* sheet = &subgraph->m_sheet; + SCH_CONNECTION* connection = subgraph->m_driver->Connection( sheet ); if( !connection->IsBus() ) continue; @@ -2698,11 +2707,11 @@ std::vector CONNECTION_GRAPH::GetBusesNeedingMigrati if( labels.size() > 1 ) { bool different = false; - wxString first = static_cast( labels.at( 0 ) )->GetShownText( false ); + wxString first = static_cast( labels.at( 0 ) )->GetShownText( sheet, false ); for( unsigned i = 1; i < labels.size(); ++i ) { - if( static_cast( labels.at( i ) )->GetShownText( false ) != first ) + if( static_cast( labels.at( i ) )->GetShownText( sheet, false ) != first ) { different = true; break; @@ -2945,6 +2954,8 @@ bool CONNECTION_GRAPH::ercCheckMultipleDrivers( const CONNECTION_SUBGRAPH* aSubg std::shared_ptr ercItem = ERC_ITEM::Create( ERCE_DRIVER_CONFLICT ); ercItem->SetItems( aSubgraph->m_driver, driver ); + ercItem->SetSheetSpecificPath( aSubgraph->GetSheet() ); + ercItem->SetItemsSheetPaths( aSubgraph->GetSheet(), aSubgraph->m_sheet ); ercItem->SetErrorMessage( msg ); SCH_MARKER* marker = new SCH_MARKER( ercItem, driver->GetPosition() ); @@ -2961,8 +2972,9 @@ bool CONNECTION_GRAPH::ercCheckMultipleDrivers( const CONNECTION_SUBGRAPH* aSubg bool CONNECTION_GRAPH::ercCheckNetclassConflicts( const std::vector& subgraphs ) { - wxString firstNetclass; - SCH_ITEM* firstNetclassDriver = nullptr; + wxString firstNetclass; + SCH_ITEM* firstNetclassDriver = nullptr; + const SCH_SHEET_PATH* firstNetclassDriverSheet = nullptr; for( const CONNECTION_SUBGRAPH* subgraph : subgraphs ) { @@ -2979,11 +2991,14 @@ bool CONNECTION_GRAPH::ercCheckNetclassConflicts( const std::vectorGetSheet(); continue; } std::shared_ptr ercItem = ERC_ITEM::Create( ERCE_NETCLASS_CONFLICT ); ercItem->SetItems( firstNetclassDriver, item ); + ercItem->SetSheetSpecificPath( subgraph->GetSheet() ); + ercItem->SetItemsSheetPaths( *firstNetclassDriverSheet, subgraph->GetSheet() ); SCH_MARKER* marker = new SCH_MARKER( ercItem, item->GetPosition() ); subgraph->m_sheet.LastScreen()->Append( marker ); @@ -3016,6 +3031,7 @@ bool CONNECTION_GRAPH::ercCheckBusToNetConflicts( const CONNECTION_SUBGRAPH* aSu bus_item = ( !bus_item ) ? item : bus_item; else net_item = ( !net_item ) ? item : net_item; + break; } @@ -3025,12 +3041,14 @@ bool CONNECTION_GRAPH::ercCheckBusToNetConflicts( const CONNECTION_SUBGRAPH* aSu case SCH_HIER_LABEL_T: { SCH_TEXT* text = static_cast( item ); - conn.ConfigureFromLabel( EscapeString( text->GetShownText( false ), CTX_NETNAME ) ); + conn.ConfigureFromLabel( EscapeString( text->GetShownText( &sheet, false ), + CTX_NETNAME ) ); if( conn.IsBus() ) bus_item = ( !bus_item ) ? item : bus_item; else net_item = ( !net_item ) ? item : net_item; + break; } @@ -3614,15 +3632,15 @@ bool CONNECTION_GRAPH::ercCheckLabels( const CONNECTION_SUBGRAPH* aSubgraph ) if( allPins == 1 && !has_nc ) { - reportError( text, - type == SCH_GLOBAL_LABEL_T ? ERCE_GLOBLABEL : ERCE_LABEL_NOT_CONNECTED ); + reportError( text, type == SCH_GLOBAL_LABEL_T ? ERCE_GLOBLABEL + : ERCE_LABEL_NOT_CONNECTED ); ok = false; } if( allPins == 0 ) { - reportError( text, - type == SCH_GLOBAL_LABEL_T ? ERCE_GLOBLABEL : ERCE_LABEL_NOT_CONNECTED ); + reportError( text, type == SCH_GLOBAL_LABEL_T ? ERCE_GLOBLABEL + : ERCE_LABEL_NOT_CONNECTED ); ok = false; } } @@ -3640,12 +3658,12 @@ int CONNECTION_GRAPH::ercCheckHierSheets() for( const SCH_SHEET_PATH& sheet : m_sheetList ) { - for( SCH_ITEM* item : sheet.LastScreen()->Items() ) + for( SCH_ITEM* item : sheet.LastScreen()->Items().OfType( SCH_SHEET_T ) ) { - if( item->Type() != SCH_SHEET_T ) - continue; - SCH_SHEET* parentSheet = static_cast( item ); + SCH_SHEET_PATH parentSheetPath = sheet; + + parentSheetPath.push_back( parentSheet ); std::map pins; std::map labels; @@ -3653,7 +3671,7 @@ int CONNECTION_GRAPH::ercCheckHierSheets() for( SCH_SHEET_PIN* pin : parentSheet->GetPins() ) { if( settings.IsTestEnabled( ERCE_HIERACHICAL_LABEL ) ) - pins[pin->GetText()] = pin; + pins[ pin->GetShownText( &parentSheetPath, false ) ] = pin; if( pin->IsDangling() && settings.IsTestEnabled( ERCE_PIN_NOT_CONNECTED ) ) { @@ -3676,11 +3694,12 @@ int CONNECTION_GRAPH::ercCheckHierSheets() if( subItem->Type() == SCH_HIER_LABEL_T ) { SCH_HIERLABEL* label = static_cast( subItem ); + wxString labelText = label->GetShownText( &parentSheetPath, false ); - if( !pins.count( label->GetText() ) ) - labels[label->GetText()] = label; + if( !pins.count( labelText ) ) + labels[ labelText ] = label; else - matchedPins.insert( label->GetText() ); + matchedPins.insert( labelText ); } } @@ -3711,9 +3730,6 @@ int CONNECTION_GRAPH::ercCheckHierSheets() "sheet pin in the parent sheet" ), UnescapeString( unmatched.first ) ); - SCH_SHEET_PATH parentSheetPath = sheet; - parentSheetPath.push_back( parentSheet ); - std::shared_ptr ercItem = ERC_ITEM::Create( ERCE_HIERACHICAL_LABEL ); ercItem->SetItems( unmatched.second ); ercItem->SetErrorMessage( msg ); diff --git a/eeschema/dialogs/dialog_plot_schematic.cpp b/eeschema/dialogs/dialog_plot_schematic.cpp index 15514a66c0..7c21f97a2b 100644 --- a/eeschema/dialogs/dialog_plot_schematic.cpp +++ b/eeschema/dialogs/dialog_plot_schematic.cpp @@ -421,7 +421,8 @@ wxString DIALOG_PLOT_SCHEMATIC::getOutputPath() std::function textResolver = [&]( wxString* token ) -> bool { - return m_parent->Schematic().ResolveTextVar( token, 0 ); + SCHEMATIC& schematic = m_parent->Schematic(); + return schematic.ResolveTextVar( &schematic.CurrentSheet(), token, 0 ); }; wxString path = m_outputDirectoryName->GetValue(); diff --git a/eeschema/dialogs/dialog_symbol_fields_table.cpp b/eeschema/dialogs/dialog_symbol_fields_table.cpp index d8e35f8244..60560a717d 100644 --- a/eeschema/dialogs/dialog_symbol_fields_table.cpp +++ b/eeschema/dialogs/dialog_symbol_fields_table.cpp @@ -1225,11 +1225,14 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnExport( wxCommandEvent& aEvent ) // Create output directory if it does not exist (also transform it in absolute form). // Bail if it fails. - std::function textResolver = [&]( wxString* token ) -> bool - { - // Handles m_board->GetTitleBlock() *and* m_board->GetProject() - return m_parent->Schematic().ResolveTextVar( token, 0 ); - }; + std::function textResolver = + [&]( wxString* token ) -> bool + { + SCHEMATIC& schematic = m_parent->Schematic(); + + // Handles m_board->GetTitleBlock() *and* m_board->GetProject() + return schematic.ResolveTextVar( &schematic.CurrentSheet(), token, 0 ); + }; wxString path = m_outputFileName->GetValue(); diff --git a/eeschema/erc.cpp b/eeschema/erc.cpp index 886b3c154e..be366c056d 100644 --- a/eeschema/erc.cpp +++ b/eeschema/erc.cpp @@ -196,12 +196,8 @@ void ERC_TESTER::TestTextVars( DS_PROXY_VIEW_ITEM* aDrawingSheet ) wsItems.BuildDrawItemsList( aDrawingSheet->GetPageInfo(), aDrawingSheet->GetTitleBlock() ); } - SCH_SHEET_PATH savedCurrentSheet = m_schematic->CurrentSheet(); - SCH_SHEET_LIST sheets = m_schematic->GetSheets(); - - for( SCH_SHEET_PATH& sheet : sheets ) + for( SCH_SHEET_PATH& sheet : m_schematic->GetSheets() ) { - m_schematic->SetCurrentSheet( sheet ); SCH_SCREEN* screen = sheet.LastScreen(); for( SCH_ITEM* item : screen->Items().OfType( SCH_LOCATE_ANY_T ) ) @@ -212,10 +208,9 @@ void ERC_TESTER::TestTextVars( DS_PROXY_VIEW_ITEM* aDrawingSheet ) for( SCH_FIELD& field : symbol->GetFields() ) { - if( unresolved( field.GetShownText( true ) ) ) + if( unresolved( field.GetShownText( &sheet, true ) ) ) { - std::shared_ptr ercItem = - ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE ); + auto ercItem = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE ); ercItem->SetItems( &field ); SCH_MARKER* marker = new SCH_MARKER( ercItem, field.GetPosition() ); @@ -229,10 +224,9 @@ void ERC_TESTER::TestTextVars( DS_PROXY_VIEW_ITEM* aDrawingSheet ) for( SCH_FIELD& field : subSheet->GetFields() ) { - if( unresolved( field.GetShownText( true ) ) ) + if( unresolved( field.GetShownText( &sheet, true ) ) ) { - std::shared_ptr ercItem = - ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE ); + auto ercItem = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE ); ercItem->SetItems( &field ); SCH_MARKER* marker = new SCH_MARKER( ercItem, field.GetPosition() ); @@ -240,12 +234,14 @@ void ERC_TESTER::TestTextVars( DS_PROXY_VIEW_ITEM* aDrawingSheet ) } } - for( SCH_SHEET_PIN* pin : static_cast( item )->GetPins() ) + SCH_SHEET_PATH subSheetPath = sheet; + subSheetPath.push_back( subSheet ); + + for( SCH_SHEET_PIN* pin : subSheet->GetPins() ) { - if( pin->GetShownText( true ).Matches( wxS( "*${*}*" ) ) ) + if( pin->GetShownText( &subSheetPath, true ).Matches( wxS( "*${*}*" ) ) ) { - std::shared_ptr ercItem = - ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE ); + auto ercItem = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE ); ercItem->SetItems( pin ); SCH_MARKER* marker = new SCH_MARKER( ercItem, pin->GetPosition() ); @@ -255,10 +251,9 @@ void ERC_TESTER::TestTextVars( DS_PROXY_VIEW_ITEM* aDrawingSheet ) } else if( SCH_TEXT* text = dynamic_cast( item ) ) { - if( text->GetShownText( true ).Matches( wxS( "*${*}*" ) ) ) + if( text->GetShownText( &sheet, true ).Matches( wxS( "*${*}*" ) ) ) { - std::shared_ptr ercItem = - ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE ); + auto ercItem = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE ); ercItem->SetItems( text ); SCH_MARKER* marker = new SCH_MARKER( ercItem, text->GetPosition() ); @@ -267,10 +262,9 @@ void ERC_TESTER::TestTextVars( DS_PROXY_VIEW_ITEM* aDrawingSheet ) } else if( SCH_TEXTBOX* textBox = dynamic_cast( item ) ) { - if( textBox->GetShownText( true ).Matches( wxS( "*${*}*" ) ) ) + if( textBox->GetShownText( &sheet, true ).Matches( wxS( "*${*}*" ) ) ) { - std::shared_ptr ercItem = - ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE ); + auto ercItem = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE ); ercItem->SetItems( textBox ); SCH_MARKER* marker = new SCH_MARKER( ercItem, textBox->GetPosition() ); @@ -283,7 +277,7 @@ void ERC_TESTER::TestTextVars( DS_PROXY_VIEW_ITEM* aDrawingSheet ) { if( DS_DRAW_ITEM_TEXT* text = dynamic_cast( item ) ) { - if( text->GetShownText( true ).Matches( wxS( "*${*}*" ) ) ) + if( text->GetShownText( &sheet, true ).Matches( wxS( "*${*}*" ) ) ) { std::shared_ptr erc = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE ); erc->SetErrorMessage( _( "Unresolved text variable in drawing sheet" ) ); @@ -294,8 +288,6 @@ void ERC_TESTER::TestTextVars( DS_PROXY_VIEW_ITEM* aDrawingSheet ) } } } - - m_schematic->SetCurrentSheet( savedCurrentSheet ); } @@ -881,6 +873,8 @@ int ERC_TESTER::TestSimilarLabels() { for( CONNECTION_SUBGRAPH* subgraph : net.second ) { + const SCH_SHEET_PATH& sheet = subgraph->GetSheet(); + for( SCH_ITEM* item : subgraph->GetItems() ) { switch( item->Type() ) @@ -891,23 +885,26 @@ int ERC_TESTER::TestSimilarLabels() { SCH_LABEL_BASE* label = static_cast( item ); - wxString normalized = label->GetShownText( false ).Lower(); + wxString normalized = label->GetShownText( &sheet, false ).Lower(); if( !labelMap.count( normalized ) ) { - labelMap[normalized] = std::make_pair( label, subgraph->GetSheet() ); + labelMap[normalized] = std::make_pair( label, sheet ); + break; } - else if( labelMap.at( normalized ).first->GetShownText( false ) - != label->GetShownText( false ) ) + + auto& [ otherLabel, otherSheet ] = labelMap.at( normalized ); + + if( otherLabel->GetShownText( &otherSheet, false ) + != label->GetShownText( &sheet, false ) ) { std::shared_ptr ercItem = ERC_ITEM::Create( ERCE_SIMILAR_LABELS ); ercItem->SetItems( label, labelMap.at( normalized ).first ); - ercItem->SetSheetSpecificPath( subgraph->GetSheet() ); - ercItem->SetItemsSheetPaths( subgraph->GetSheet(), - labelMap.at( normalized ).second ); + ercItem->SetSheetSpecificPath( sheet ); + ercItem->SetItemsSheetPaths( sheet, labelMap.at( normalized ).second ); SCH_MARKER* marker = new SCH_MARKER( ercItem, label->GetPosition() ); - subgraph->GetSheet().LastScreen()->Append( marker ); + sheet.LastScreen()->Append( marker ); errors += 1; } diff --git a/eeschema/erc_item.cpp b/eeschema/erc_item.cpp index f502b91255..8b07c823ca 100644 --- a/eeschema/erc_item.cpp +++ b/eeschema/erc_item.cpp @@ -304,8 +304,12 @@ void ERC_TREE_MODEL::GetValue( wxVariant& aVariant, wxDataViewItem const& aItem, if( aSheet != curSheet ) { + schEditFrame->SetCurrentSheet( aSheet ); aSheet.UpdateAllScreenReferences(); - desc = aCurrItem->GetItemDescription( m_editFrame ); + { + desc = aCurrItem->GetItemDescription( m_editFrame ); + } + schEditFrame->SetCurrentSheet( curSheet ); curSheet.UpdateAllScreenReferences(); } else diff --git a/eeschema/sch_label.cpp b/eeschema/sch_label.cpp index e70289364c..3bc44a0a00 100644 --- a/eeschema/sch_label.cpp +++ b/eeschema/sch_label.cpp @@ -862,16 +862,11 @@ bool SCH_LABEL_BASE::ResolveTextVar( const SCH_SHEET_PATH* aPath, wxString* toke if( sheet->ResolveTextVar( &path, token, aDepth + 1 ) ) return true; } - else if( aPath && aPath->Last() ) + else { if( aPath->Last()->ResolveTextVar( aPath, token, aDepth + 1 ) ) return true; } - else if( SCH_SHEET* sheet = schematic->CurrentSheet().Last() ) - { - if( sheet->ResolveTextVar( aPath, token, aDepth + 1 ) ) - return true; - } return false; } @@ -1437,7 +1432,8 @@ const BOX2I SCH_LABEL::GetBodyBoundingBox() const wxString SCH_LABEL::GetItemDescription( UNITS_PROVIDER* aUnitsProvider ) const { - return wxString::Format( _( "Label '%s'" ), KIUI::EllipsizeMenuText( GetText() ) ); + return wxString::Format( _( "Label '%s'" ), + KIUI::EllipsizeMenuText( GetShownText( false ) ) ); } @@ -1706,7 +1702,7 @@ wxString SCH_DIRECTIVE_LABEL::GetItemDescription( UNITS_PROVIDER* aUnitsProvider { return wxString::Format( _( "Directive Label [%s %s]" ), UnescapeString( m_fields[0].GetName() ), - KIUI::EllipsizeMenuText( m_fields[0].GetText() ) ); + KIUI::EllipsizeMenuText( m_fields[0].GetShownText( false ) ) ); } } @@ -1914,7 +1910,8 @@ void SCH_GLOBALLABEL::CreateGraphicShape( const RENDER_SETTINGS* aRenderSettings wxString SCH_GLOBALLABEL::GetItemDescription( UNITS_PROVIDER* aUnitsProvider ) const { - return wxString::Format( _( "Global Label '%s'" ), KIUI::EllipsizeMenuText( GetText() ) ); + return wxString::Format( _( "Global Label '%s'" ), + KIUI::EllipsizeMenuText( GetShownText( false ) ) ); } @@ -2048,7 +2045,7 @@ VECTOR2I SCH_HIERLABEL::GetSchematicTextOffset( const RENDER_SETTINGS* aSettings wxString SCH_HIERLABEL::GetItemDescription( UNITS_PROVIDER* aUnitsProvider ) const { return wxString::Format( _( "Hierarchical Label '%s'" ), - KIUI::EllipsizeMenuText( GetText() ) ); + KIUI::EllipsizeMenuText( GetShownText( false ) ) ); } diff --git a/eeschema/sch_label.h b/eeschema/sch_label.h index f54b69bcbd..caac565fd0 100644 --- a/eeschema/sch_label.h +++ b/eeschema/sch_label.h @@ -254,7 +254,12 @@ public: wxString GetShownText( bool aAllowExtraText, int aDepth = 0 ) const override { - return GetShownText( nullptr, aAllowExtraText, aDepth ); + SCHEMATIC* schematic = Schematic(); + + if( schematic ) + return GetShownText( &schematic->CurrentSheet(), aAllowExtraText, aDepth ); + else + return GetText(); } bool HasCachedDriverName() const override; diff --git a/eeschema/sch_sheet.cpp b/eeschema/sch_sheet.cpp index 87faf21668..8a43e27bdf 100644 --- a/eeschema/sch_sheet.cpp +++ b/eeschema/sch_sheet.cpp @@ -253,7 +253,7 @@ bool SCH_SHEET::ResolveTextVar( const SCH_SHEET_PATH* aPath, wxString* token, in { if( token->IsSameAs( m_fields[i].GetCanonicalName().Upper() ) ) { - *token = m_fields[i].GetShownText( nullptr, false, aDepth + 1 ); + *token = m_fields[i].GetShownText( aPath, false, aDepth + 1 ); return true; } } @@ -262,7 +262,7 @@ bool SCH_SHEET::ResolveTextVar( const SCH_SHEET_PATH* aPath, wxString* token, in { if( token->IsSameAs( m_fields[i].GetName() ) ) { - *token = m_fields[i].GetShownText( nullptr, false, aDepth + 1 ); + *token = m_fields[i].GetShownText( aPath, false, aDepth + 1 ); return true; } } @@ -300,12 +300,12 @@ bool SCH_SHEET::ResolveTextVar( const SCH_SHEET_PATH* aPath, wxString* token, in SCH_SHEET_PATH path = *aPath; path.pop_back(); - if( path.Last()->ResolveTextVar( aPath, token, aDepth + 1 ) ) + if( path.Last()->ResolveTextVar( &path, token, aDepth + 1 ) ) return true; } else { - if( schematic->ResolveTextVar( token, aDepth + 1 ) ) + if( schematic->ResolveTextVar( aPath, token, aDepth + 1 ) ) return true; } diff --git a/eeschema/sch_symbol.cpp b/eeschema/sch_symbol.cpp index f58d8691b3..7f47d8f755 100644 --- a/eeschema/sch_symbol.cpp +++ b/eeschema/sch_symbol.cpp @@ -947,10 +947,10 @@ SCH_FIELD* SCH_SYMBOL::GetFieldById( int aFieldId ) SCH_FIELD* SCH_SYMBOL::GetFieldByName( const wxString& aFieldName ) { - for( size_t ii = 0; ii < m_fields.size(); ++ii ) + for( SCH_FIELD& field : m_fields ) { - if( m_fields[ii].GetName() == aFieldName ) - return &m_fields[ii]; + if( field.GetName() == aFieldName ) + return &field; } return nullptr; @@ -959,35 +959,23 @@ SCH_FIELD* SCH_SYMBOL::GetFieldByName( const wxString& aFieldName ) const SCH_FIELD* SCH_SYMBOL::GetFieldByName( const wxString& aFieldName ) const { - for( size_t ii = 0; ii < m_fields.size(); ++ii ) + for( const SCH_FIELD& field : m_fields ) { - if( m_fields[ii].GetName() == aFieldName ) - return &m_fields[ii]; + if( field.GetName() == aFieldName ) + return &field; } return nullptr; } -wxString SCH_SYMBOL::GetFieldText( const wxString& aFieldName ) const -{ - for( const SCH_FIELD& field : m_fields ) - { - if( aFieldName == field.GetName() || aFieldName == field.GetCanonicalName() ) - return field.GetText(); - } - - return wxEmptyString; -} - - void SCH_SYMBOL::GetFields( std::vector& aVector, bool aVisibleOnly ) { for( SCH_FIELD& field : m_fields ) { if( aVisibleOnly ) { - if( !field.IsVisible() || field.GetShownText( nullptr, true ).IsEmpty() ) + if( !field.IsVisible() || field.GetText().IsEmpty() ) continue; } @@ -998,10 +986,8 @@ void SCH_SYMBOL::GetFields( std::vector& aVector, bool aVisibleOnly SCH_FIELD* SCH_SYMBOL::AddField( const SCH_FIELD& aField ) { - int newNdx = m_fields.size(); - m_fields.push_back( aField ); - return &m_fields[newNdx]; + return &m_fields.back(); } diff --git a/eeschema/sch_symbol.h b/eeschema/sch_symbol.h index c687c87e77..2c6fa66910 100644 --- a/eeschema/sch_symbol.h +++ b/eeschema/sch_symbol.h @@ -401,13 +401,6 @@ public: const SCH_FIELD* GetFieldByName( const wxString& aFieldName ) const; - /** - * Search for a field named \a aFieldName and returns text associated with this field. - * - * @param aFieldName is the name of the field - */ - wxString GetFieldText( const wxString& aFieldName ) const; - /** * Populate a std::vector with SCH_FIELDs. * diff --git a/eeschema/sch_text.h b/eeschema/sch_text.h index 2660dc2fb7..c8e639b466 100644 --- a/eeschema/sch_text.h +++ b/eeschema/sch_text.h @@ -30,6 +30,7 @@ #include #include #include // for CONNECTION_TYPE +#include class HTML_MESSAGE_BOX; @@ -59,7 +60,12 @@ public: wxString GetShownText( bool aAllowExtraText, int aDepth = 0 ) const override { - return GetShownText( nullptr, aAllowExtraText, aDepth ); + SCHEMATIC* schematic = Schematic(); + + if( schematic ) + return GetShownText( &schematic->CurrentSheet(), aAllowExtraText, aDepth ); + else + return GetText(); } int GetSchTextSize() const { return GetTextWidth(); } diff --git a/eeschema/sch_textbox.h b/eeschema/sch_textbox.h index e1ae7747a8..b595b46509 100644 --- a/eeschema/sch_textbox.h +++ b/eeschema/sch_textbox.h @@ -27,6 +27,7 @@ #include #include +#include class HTML_MESSAGE_BOX; @@ -63,7 +64,12 @@ public: wxString GetShownText( bool aAllowExtraText, int aDepth = 0 ) const override { - return GetShownText( nullptr, aAllowExtraText, aDepth ); + SCHEMATIC* schematic = Schematic(); + + if( schematic ) + return GetShownText( &schematic->CurrentSheet(), aAllowExtraText, aDepth ); + else + return GetText(); } bool IsHypertext() const override diff --git a/eeschema/schematic.cpp b/eeschema/schematic.cpp index ffa77937bf..c5bd4308ed 100644 --- a/eeschema/schematic.cpp +++ b/eeschema/schematic.cpp @@ -153,45 +153,45 @@ void SCHEMATIC::GetContextualTextVars( wxArrayString* aVars ) const } -bool SCHEMATIC::ResolveTextVar( wxString* token, int aDepth ) const +bool SCHEMATIC::ResolveTextVar( const SCH_SHEET_PATH* aSheetPath, wxString* token, + int aDepth ) const { - if( !CurrentSheet().empty() ) - { - if( token->IsSameAs( wxT( "#" ) ) ) - { - *token = CurrentSheet().GetPageNumber(); - return true; - } - else if( token->IsSameAs( wxT( "##" ) ) ) - { - *token = wxString::Format( "%i", Root().CountSheets() ); - return true; - } - else if( token->IsSameAs( wxT( "SHEETPATH" ) ) ) - { - *token = CurrentSheet().PathHumanReadable(); - return true; - } - else if( token->IsSameAs( wxT( "SHEETNAME" ) ) ) - { - *token = CurrentSheet().Last()->GetName(); - return true; - } - else if( token->IsSameAs( wxT( "FILENAME" ) ) ) - { - wxFileName fn( GetFileName() ); - *token = fn.GetFullName(); - return true; - } - else if( token->IsSameAs( wxT( "PROJECTNAME" ) ) ) - { - *token = Prj().GetProjectName(); - return true; - } + wxCHECK( aSheetPath, false ); - if( CurrentSheet().LastScreen()->GetTitleBlock().TextVarResolver( token, m_project ) ) - return true; + if( token->IsSameAs( wxT( "#" ) ) ) + { + *token = aSheetPath->GetPageNumber(); + return true; } + else if( token->IsSameAs( wxT( "##" ) ) ) + { + *token = wxString::Format( "%i", Root().CountSheets() ); + return true; + } + else if( token->IsSameAs( wxT( "SHEETPATH" ) ) ) + { + *token = aSheetPath->PathHumanReadable(); + return true; + } + else if( token->IsSameAs( wxT( "SHEETNAME" ) ) ) + { + *token = aSheetPath->Last()->GetName(); + return true; + } + else if( token->IsSameAs( wxT( "FILENAME" ) ) ) + { + wxFileName fn( GetFileName() ); + *token = fn.GetFullName(); + return true; + } + else if( token->IsSameAs( wxT( "PROJECTNAME" ) ) ) + { + *token = Prj().GetProjectName(); + return true; + } + + if( aSheetPath->LastScreen()->GetTitleBlock().TextVarResolver( token, m_project ) ) + return true; if( Prj().TextVarResolver( token ) ) return true; diff --git a/eeschema/schematic.h b/eeschema/schematic.h index 718d91c703..81186a744d 100644 --- a/eeschema/schematic.h +++ b/eeschema/schematic.h @@ -128,7 +128,7 @@ public: void GetContextualTextVars( wxArrayString* aVars ) const; - bool ResolveTextVar( wxString* token, int aDepth ) const; + bool ResolveTextVar( const SCH_SHEET_PATH* aSheetPath, wxString* token, int aDepth ) const; /// Helper to retrieve the filename from the root sheet screen wxString GetFileName() const override;