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.
This commit is contained in:
Jeff Young 2023-11-12 14:14:41 +00:00
parent 05e954ad5d
commit 03953e80fc
14 changed files with 168 additions and 154 deletions

View File

@ -332,31 +332,39 @@ wxString CONNECTION_SUBGRAPH::driverName( SCH_ITEM* aItem ) const
{ {
case SCH_PIN_T: case SCH_PIN_T:
{ {
bool forceNoConnect = m_no_connect != nullptr;
SCH_PIN* pin = static_cast<SCH_PIN*>( aItem ); SCH_PIN* pin = static_cast<SCH_PIN*>( aItem );
bool forceNoConnect = m_no_connect != nullptr;
return pin->GetDefaultNetName( m_sheet, forceNoConnect ); return pin->GetDefaultNetName( m_sheet, forceNoConnect );
break;
} }
case SCH_LABEL_T: case SCH_LABEL_T:
case SCH_GLOBAL_LABEL_T: case SCH_GLOBAL_LABEL_T:
case SCH_HIER_LABEL_T: case SCH_HIER_LABEL_T:
{
SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( aItem );
// NB: any changes here will need corresponding changes in SCH_LABEL_BASE::cacheShownText() // NB: any changes here will need corresponding changes in SCH_LABEL_BASE::cacheShownText()
return EscapeString( static_cast<SCH_TEXT*>( aItem )->GetShownText( &m_sheet, false ), return EscapeString( label->GetShownText( &m_sheet, false ), CTX_NETNAME );
CTX_NETNAME ); }
case SCH_SHEET_PIN_T: 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 // Sheet pins need to use their parent sheet as their starting sheet or they will resolve
return EscapeString( static_cast<SCH_TEXT*>( aItem )->GetShownText( nullptr, false ), // variables on the current sheet first
CTX_NETNAME ); SCH_SHEET_PIN* sheetPin = static_cast<SCH_SHEET_PIN*>( 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: default:
wxFAIL_MSG( wxS( "Unhandled item type in GetNameForDriver" ) ); wxFAIL_MSG( wxS( "Unhandled item type in GetNameForDriver" ) );
break;
}
return wxEmptyString; return wxEmptyString;
}
} }
@ -2688,7 +2696,8 @@ std::vector<const CONNECTION_SUBGRAPH*> CONNECTION_GRAPH::GetBusesNeedingMigrati
if( !subgraph->m_driver ) if( !subgraph->m_driver )
continue; 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() ) if( !connection->IsBus() )
continue; continue;
@ -2698,11 +2707,11 @@ std::vector<const CONNECTION_SUBGRAPH*> CONNECTION_GRAPH::GetBusesNeedingMigrati
if( labels.size() > 1 ) if( labels.size() > 1 )
{ {
bool different = false; bool different = false;
wxString first = static_cast<SCH_TEXT*>( labels.at( 0 ) )->GetShownText( false ); wxString first = static_cast<SCH_TEXT*>( labels.at( 0 ) )->GetShownText( sheet, false );
for( unsigned i = 1; i < labels.size(); ++i ) for( unsigned i = 1; i < labels.size(); ++i )
{ {
if( static_cast<SCH_TEXT*>( labels.at( i ) )->GetShownText( false ) != first ) if( static_cast<SCH_TEXT*>( labels.at( i ) )->GetShownText( sheet, false ) != first )
{ {
different = true; different = true;
break; break;
@ -2945,6 +2954,8 @@ bool CONNECTION_GRAPH::ercCheckMultipleDrivers( const CONNECTION_SUBGRAPH* aSubg
std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_DRIVER_CONFLICT ); std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_DRIVER_CONFLICT );
ercItem->SetItems( aSubgraph->m_driver, driver ); ercItem->SetItems( aSubgraph->m_driver, driver );
ercItem->SetSheetSpecificPath( aSubgraph->GetSheet() );
ercItem->SetItemsSheetPaths( aSubgraph->GetSheet(), aSubgraph->m_sheet );
ercItem->SetErrorMessage( msg ); ercItem->SetErrorMessage( msg );
SCH_MARKER* marker = new SCH_MARKER( ercItem, driver->GetPosition() ); SCH_MARKER* marker = new SCH_MARKER( ercItem, driver->GetPosition() );
@ -2963,6 +2974,7 @@ bool CONNECTION_GRAPH::ercCheckNetclassConflicts( const std::vector<CONNECTION_S
{ {
wxString firstNetclass; wxString firstNetclass;
SCH_ITEM* firstNetclassDriver = nullptr; SCH_ITEM* firstNetclassDriver = nullptr;
const SCH_SHEET_PATH* firstNetclassDriverSheet = nullptr;
for( const CONNECTION_SUBGRAPH* subgraph : subgraphs ) for( const CONNECTION_SUBGRAPH* subgraph : subgraphs )
{ {
@ -2979,11 +2991,14 @@ bool CONNECTION_GRAPH::ercCheckNetclassConflicts( const std::vector<CONNECTION_S
{ {
firstNetclass = netclass; firstNetclass = netclass;
firstNetclassDriver = item; firstNetclassDriver = item;
firstNetclassDriverSheet = &subgraph->GetSheet();
continue; continue;
} }
std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_NETCLASS_CONFLICT ); std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_NETCLASS_CONFLICT );
ercItem->SetItems( firstNetclassDriver, item ); ercItem->SetItems( firstNetclassDriver, item );
ercItem->SetSheetSpecificPath( subgraph->GetSheet() );
ercItem->SetItemsSheetPaths( *firstNetclassDriverSheet, subgraph->GetSheet() );
SCH_MARKER* marker = new SCH_MARKER( ercItem, item->GetPosition() ); SCH_MARKER* marker = new SCH_MARKER( ercItem, item->GetPosition() );
subgraph->m_sheet.LastScreen()->Append( marker ); 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; bus_item = ( !bus_item ) ? item : bus_item;
else else
net_item = ( !net_item ) ? item : net_item; net_item = ( !net_item ) ? item : net_item;
break; break;
} }
@ -3025,12 +3041,14 @@ bool CONNECTION_GRAPH::ercCheckBusToNetConflicts( const CONNECTION_SUBGRAPH* aSu
case SCH_HIER_LABEL_T: case SCH_HIER_LABEL_T:
{ {
SCH_TEXT* text = static_cast<SCH_TEXT*>( item ); SCH_TEXT* text = static_cast<SCH_TEXT*>( item );
conn.ConfigureFromLabel( EscapeString( text->GetShownText( false ), CTX_NETNAME ) ); conn.ConfigureFromLabel( EscapeString( text->GetShownText( &sheet, false ),
CTX_NETNAME ) );
if( conn.IsBus() ) if( conn.IsBus() )
bus_item = ( !bus_item ) ? item : bus_item; bus_item = ( !bus_item ) ? item : bus_item;
else else
net_item = ( !net_item ) ? item : net_item; net_item = ( !net_item ) ? item : net_item;
break; break;
} }
@ -3614,15 +3632,15 @@ bool CONNECTION_GRAPH::ercCheckLabels( const CONNECTION_SUBGRAPH* aSubgraph )
if( allPins == 1 && !has_nc ) if( allPins == 1 && !has_nc )
{ {
reportError( text, reportError( text, type == SCH_GLOBAL_LABEL_T ? ERCE_GLOBLABEL
type == SCH_GLOBAL_LABEL_T ? ERCE_GLOBLABEL : ERCE_LABEL_NOT_CONNECTED ); : ERCE_LABEL_NOT_CONNECTED );
ok = false; ok = false;
} }
if( allPins == 0 ) if( allPins == 0 )
{ {
reportError( text, reportError( text, type == SCH_GLOBAL_LABEL_T ? ERCE_GLOBLABEL
type == SCH_GLOBAL_LABEL_T ? ERCE_GLOBLABEL : ERCE_LABEL_NOT_CONNECTED ); : ERCE_LABEL_NOT_CONNECTED );
ok = false; ok = false;
} }
} }
@ -3640,12 +3658,12 @@ int CONNECTION_GRAPH::ercCheckHierSheets()
for( const SCH_SHEET_PATH& sheet : m_sheetList ) 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<SCH_SHEET*>( item ); SCH_SHEET* parentSheet = static_cast<SCH_SHEET*>( item );
SCH_SHEET_PATH parentSheetPath = sheet;
parentSheetPath.push_back( parentSheet );
std::map<wxString, SCH_SHEET_PIN*> pins; std::map<wxString, SCH_SHEET_PIN*> pins;
std::map<wxString, SCH_HIERLABEL*> labels; std::map<wxString, SCH_HIERLABEL*> labels;
@ -3653,7 +3671,7 @@ int CONNECTION_GRAPH::ercCheckHierSheets()
for( SCH_SHEET_PIN* pin : parentSheet->GetPins() ) for( SCH_SHEET_PIN* pin : parentSheet->GetPins() )
{ {
if( settings.IsTestEnabled( ERCE_HIERACHICAL_LABEL ) ) 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 ) ) if( pin->IsDangling() && settings.IsTestEnabled( ERCE_PIN_NOT_CONNECTED ) )
{ {
@ -3676,11 +3694,12 @@ int CONNECTION_GRAPH::ercCheckHierSheets()
if( subItem->Type() == SCH_HIER_LABEL_T ) if( subItem->Type() == SCH_HIER_LABEL_T )
{ {
SCH_HIERLABEL* label = static_cast<SCH_HIERLABEL*>( subItem ); SCH_HIERLABEL* label = static_cast<SCH_HIERLABEL*>( subItem );
wxString labelText = label->GetShownText( &parentSheetPath, false );
if( !pins.count( label->GetText() ) ) if( !pins.count( labelText ) )
labels[label->GetText()] = label; labels[ labelText ] = label;
else else
matchedPins.insert( label->GetText() ); matchedPins.insert( labelText );
} }
} }
@ -3711,9 +3730,6 @@ int CONNECTION_GRAPH::ercCheckHierSheets()
"sheet pin in the parent sheet" ), "sheet pin in the parent sheet" ),
UnescapeString( unmatched.first ) ); UnescapeString( unmatched.first ) );
SCH_SHEET_PATH parentSheetPath = sheet;
parentSheetPath.push_back( parentSheet );
std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_HIERACHICAL_LABEL ); std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_HIERACHICAL_LABEL );
ercItem->SetItems( unmatched.second ); ercItem->SetItems( unmatched.second );
ercItem->SetErrorMessage( msg ); ercItem->SetErrorMessage( msg );

View File

@ -421,7 +421,8 @@ wxString DIALOG_PLOT_SCHEMATIC::getOutputPath()
std::function<bool( wxString* )> textResolver = std::function<bool( wxString* )> textResolver =
[&]( wxString* token ) -> bool [&]( 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(); wxString path = m_outputDirectoryName->GetValue();

View File

@ -1225,10 +1225,13 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnExport( wxCommandEvent& aEvent )
// Create output directory if it does not exist (also transform it in absolute form). // Create output directory if it does not exist (also transform it in absolute form).
// Bail if it fails. // Bail if it fails.
std::function<bool( wxString* )> textResolver = [&]( wxString* token ) -> bool std::function<bool( wxString* )> textResolver =
[&]( wxString* token ) -> bool
{ {
SCHEMATIC& schematic = m_parent->Schematic();
// Handles m_board->GetTitleBlock() *and* m_board->GetProject() // Handles m_board->GetTitleBlock() *and* m_board->GetProject()
return m_parent->Schematic().ResolveTextVar( token, 0 ); return schematic.ResolveTextVar( &schematic.CurrentSheet(), token, 0 );
}; };
wxString path = m_outputFileName->GetValue(); wxString path = m_outputFileName->GetValue();

View File

@ -196,12 +196,8 @@ void ERC_TESTER::TestTextVars( DS_PROXY_VIEW_ITEM* aDrawingSheet )
wsItems.BuildDrawItemsList( aDrawingSheet->GetPageInfo(), aDrawingSheet->GetTitleBlock() ); wsItems.BuildDrawItemsList( aDrawingSheet->GetPageInfo(), aDrawingSheet->GetTitleBlock() );
} }
SCH_SHEET_PATH savedCurrentSheet = m_schematic->CurrentSheet(); for( SCH_SHEET_PATH& sheet : m_schematic->GetSheets() )
SCH_SHEET_LIST sheets = m_schematic->GetSheets();
for( SCH_SHEET_PATH& sheet : sheets )
{ {
m_schematic->SetCurrentSheet( sheet );
SCH_SCREEN* screen = sheet.LastScreen(); SCH_SCREEN* screen = sheet.LastScreen();
for( SCH_ITEM* item : screen->Items().OfType( SCH_LOCATE_ANY_T ) ) 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() ) for( SCH_FIELD& field : symbol->GetFields() )
{ {
if( unresolved( field.GetShownText( true ) ) ) if( unresolved( field.GetShownText( &sheet, true ) ) )
{ {
std::shared_ptr<ERC_ITEM> ercItem = auto ercItem = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE );
ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE );
ercItem->SetItems( &field ); ercItem->SetItems( &field );
SCH_MARKER* marker = new SCH_MARKER( ercItem, field.GetPosition() ); 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() ) for( SCH_FIELD& field : subSheet->GetFields() )
{ {
if( unresolved( field.GetShownText( true ) ) ) if( unresolved( field.GetShownText( &sheet, true ) ) )
{ {
std::shared_ptr<ERC_ITEM> ercItem = auto ercItem = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE );
ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE );
ercItem->SetItems( &field ); ercItem->SetItems( &field );
SCH_MARKER* marker = new SCH_MARKER( ercItem, field.GetPosition() ); 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<SCH_SHEET*>( 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<ERC_ITEM> ercItem = auto ercItem = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE );
ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE );
ercItem->SetItems( pin ); ercItem->SetItems( pin );
SCH_MARKER* marker = new SCH_MARKER( ercItem, pin->GetPosition() ); 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<SCH_TEXT*>( item ) ) else if( SCH_TEXT* text = dynamic_cast<SCH_TEXT*>( item ) )
{ {
if( text->GetShownText( true ).Matches( wxS( "*${*}*" ) ) ) if( text->GetShownText( &sheet, true ).Matches( wxS( "*${*}*" ) ) )
{ {
std::shared_ptr<ERC_ITEM> ercItem = auto ercItem = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE );
ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE );
ercItem->SetItems( text ); ercItem->SetItems( text );
SCH_MARKER* marker = new SCH_MARKER( ercItem, text->GetPosition() ); 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<SCH_TEXTBOX*>( item ) ) else if( SCH_TEXTBOX* textBox = dynamic_cast<SCH_TEXTBOX*>( item ) )
{ {
if( textBox->GetShownText( true ).Matches( wxS( "*${*}*" ) ) ) if( textBox->GetShownText( &sheet, true ).Matches( wxS( "*${*}*" ) ) )
{ {
std::shared_ptr<ERC_ITEM> ercItem = auto ercItem = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE );
ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE );
ercItem->SetItems( textBox ); ercItem->SetItems( textBox );
SCH_MARKER* marker = new SCH_MARKER( ercItem, textBox->GetPosition() ); 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<DS_DRAW_ITEM_TEXT*>( item ) ) if( DS_DRAW_ITEM_TEXT* text = dynamic_cast<DS_DRAW_ITEM_TEXT*>( item ) )
{ {
if( text->GetShownText( true ).Matches( wxS( "*${*}*" ) ) ) if( text->GetShownText( &sheet, true ).Matches( wxS( "*${*}*" ) ) )
{ {
std::shared_ptr<ERC_ITEM> erc = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE ); std::shared_ptr<ERC_ITEM> erc = ERC_ITEM::Create( ERCE_UNRESOLVED_VARIABLE );
erc->SetErrorMessage( _( "Unresolved text variable in drawing sheet" ) ); 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 ) for( CONNECTION_SUBGRAPH* subgraph : net.second )
{ {
const SCH_SHEET_PATH& sheet = subgraph->GetSheet();
for( SCH_ITEM* item : subgraph->GetItems() ) for( SCH_ITEM* item : subgraph->GetItems() )
{ {
switch( item->Type() ) switch( item->Type() )
@ -891,23 +885,26 @@ int ERC_TESTER::TestSimilarLabels()
{ {
SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( item ); SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( item );
wxString normalized = label->GetShownText( false ).Lower(); wxString normalized = label->GetShownText( &sheet, false ).Lower();
if( !labelMap.count( normalized ) ) 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<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_SIMILAR_LABELS ); std::shared_ptr<ERC_ITEM> ercItem = ERC_ITEM::Create( ERCE_SIMILAR_LABELS );
ercItem->SetItems( label, labelMap.at( normalized ).first ); ercItem->SetItems( label, labelMap.at( normalized ).first );
ercItem->SetSheetSpecificPath( subgraph->GetSheet() ); ercItem->SetSheetSpecificPath( sheet );
ercItem->SetItemsSheetPaths( subgraph->GetSheet(), ercItem->SetItemsSheetPaths( sheet, labelMap.at( normalized ).second );
labelMap.at( normalized ).second );
SCH_MARKER* marker = new SCH_MARKER( ercItem, label->GetPosition() ); SCH_MARKER* marker = new SCH_MARKER( ercItem, label->GetPosition() );
subgraph->GetSheet().LastScreen()->Append( marker ); sheet.LastScreen()->Append( marker );
errors += 1; errors += 1;
} }

View File

@ -304,8 +304,12 @@ void ERC_TREE_MODEL::GetValue( wxVariant& aVariant, wxDataViewItem const& aItem,
if( aSheet != curSheet ) if( aSheet != curSheet )
{ {
schEditFrame->SetCurrentSheet( aSheet );
aSheet.UpdateAllScreenReferences(); aSheet.UpdateAllScreenReferences();
{
desc = aCurrItem->GetItemDescription( m_editFrame ); desc = aCurrItem->GetItemDescription( m_editFrame );
}
schEditFrame->SetCurrentSheet( curSheet );
curSheet.UpdateAllScreenReferences(); curSheet.UpdateAllScreenReferences();
} }
else else

View File

@ -862,16 +862,11 @@ bool SCH_LABEL_BASE::ResolveTextVar( const SCH_SHEET_PATH* aPath, wxString* toke
if( sheet->ResolveTextVar( &path, token, aDepth + 1 ) ) if( sheet->ResolveTextVar( &path, token, aDepth + 1 ) )
return true; return true;
} }
else if( aPath && aPath->Last() ) else
{ {
if( aPath->Last()->ResolveTextVar( aPath, token, aDepth + 1 ) ) if( aPath->Last()->ResolveTextVar( aPath, token, aDepth + 1 ) )
return true; return true;
} }
else if( SCH_SHEET* sheet = schematic->CurrentSheet().Last() )
{
if( sheet->ResolveTextVar( aPath, token, aDepth + 1 ) )
return true;
}
return false; return false;
} }
@ -1437,7 +1432,8 @@ const BOX2I SCH_LABEL::GetBodyBoundingBox() const
wxString SCH_LABEL::GetItemDescription( UNITS_PROVIDER* aUnitsProvider ) 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]" ), return wxString::Format( _( "Directive Label [%s %s]" ),
UnescapeString( m_fields[0].GetName() ), 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 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 wxString SCH_HIERLABEL::GetItemDescription( UNITS_PROVIDER* aUnitsProvider ) const
{ {
return wxString::Format( _( "Hierarchical Label '%s'" ), return wxString::Format( _( "Hierarchical Label '%s'" ),
KIUI::EllipsizeMenuText( GetText() ) ); KIUI::EllipsizeMenuText( GetShownText( false ) ) );
} }

View File

@ -254,7 +254,12 @@ public:
wxString GetShownText( bool aAllowExtraText, int aDepth = 0 ) const override 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; bool HasCachedDriverName() const override;

View File

@ -253,7 +253,7 @@ bool SCH_SHEET::ResolveTextVar( const SCH_SHEET_PATH* aPath, wxString* token, in
{ {
if( token->IsSameAs( m_fields[i].GetCanonicalName().Upper() ) ) 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; 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() ) ) 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; return true;
} }
} }
@ -300,12 +300,12 @@ bool SCH_SHEET::ResolveTextVar( const SCH_SHEET_PATH* aPath, wxString* token, in
SCH_SHEET_PATH path = *aPath; SCH_SHEET_PATH path = *aPath;
path.pop_back(); path.pop_back();
if( path.Last()->ResolveTextVar( aPath, token, aDepth + 1 ) ) if( path.Last()->ResolveTextVar( &path, token, aDepth + 1 ) )
return true; return true;
} }
else else
{ {
if( schematic->ResolveTextVar( token, aDepth + 1 ) ) if( schematic->ResolveTextVar( aPath, token, aDepth + 1 ) )
return true; return true;
} }

View File

@ -947,10 +947,10 @@ SCH_FIELD* SCH_SYMBOL::GetFieldById( int aFieldId )
SCH_FIELD* SCH_SYMBOL::GetFieldByName( const wxString& aFieldName ) 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 ) if( field.GetName() == aFieldName )
return &m_fields[ii]; return &field;
} }
return nullptr; return nullptr;
@ -959,35 +959,23 @@ SCH_FIELD* SCH_SYMBOL::GetFieldByName( const wxString& aFieldName )
const SCH_FIELD* SCH_SYMBOL::GetFieldByName( const wxString& aFieldName ) const 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 ) if( field.GetName() == aFieldName )
return &m_fields[ii]; return &field;
} }
return nullptr; 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<SCH_FIELD*>& aVector, bool aVisibleOnly ) void SCH_SYMBOL::GetFields( std::vector<SCH_FIELD*>& aVector, bool aVisibleOnly )
{ {
for( SCH_FIELD& field : m_fields ) for( SCH_FIELD& field : m_fields )
{ {
if( aVisibleOnly ) if( aVisibleOnly )
{ {
if( !field.IsVisible() || field.GetShownText( nullptr, true ).IsEmpty() ) if( !field.IsVisible() || field.GetText().IsEmpty() )
continue; continue;
} }
@ -998,10 +986,8 @@ void SCH_SYMBOL::GetFields( std::vector<SCH_FIELD*>& aVector, bool aVisibleOnly
SCH_FIELD* SCH_SYMBOL::AddField( const SCH_FIELD& aField ) SCH_FIELD* SCH_SYMBOL::AddField( const SCH_FIELD& aField )
{ {
int newNdx = m_fields.size();
m_fields.push_back( aField ); m_fields.push_back( aField );
return &m_fields[newNdx]; return &m_fields.back();
} }

View File

@ -401,13 +401,6 @@ public:
const SCH_FIELD* GetFieldByName( const wxString& aFieldName ) const; 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. * Populate a std::vector with SCH_FIELDs.
* *

View File

@ -30,6 +30,7 @@
#include <sch_item.h> #include <sch_item.h>
#include <sch_field.h> #include <sch_field.h>
#include <sch_connection.h> // for CONNECTION_TYPE #include <sch_connection.h> // for CONNECTION_TYPE
#include <schematic.h>
class HTML_MESSAGE_BOX; class HTML_MESSAGE_BOX;
@ -59,7 +60,12 @@ public:
wxString GetShownText( bool aAllowExtraText, int aDepth = 0 ) const override 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(); } int GetSchTextSize() const { return GetTextWidth(); }

View File

@ -27,6 +27,7 @@
#include <eda_text.h> #include <eda_text.h>
#include <sch_shape.h> #include <sch_shape.h>
#include <schematic.h>
class HTML_MESSAGE_BOX; class HTML_MESSAGE_BOX;
@ -63,7 +64,12 @@ public:
wxString GetShownText( bool aAllowExtraText, int aDepth = 0 ) const override 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 bool IsHypertext() const override

View File

@ -153,13 +153,14 @@ 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() ) wxCHECK( aSheetPath, false );
{
if( token->IsSameAs( wxT( "#" ) ) ) if( token->IsSameAs( wxT( "#" ) ) )
{ {
*token = CurrentSheet().GetPageNumber(); *token = aSheetPath->GetPageNumber();
return true; return true;
} }
else if( token->IsSameAs( wxT( "##" ) ) ) else if( token->IsSameAs( wxT( "##" ) ) )
@ -169,12 +170,12 @@ bool SCHEMATIC::ResolveTextVar( wxString* token, int aDepth ) const
} }
else if( token->IsSameAs( wxT( "SHEETPATH" ) ) ) else if( token->IsSameAs( wxT( "SHEETPATH" ) ) )
{ {
*token = CurrentSheet().PathHumanReadable(); *token = aSheetPath->PathHumanReadable();
return true; return true;
} }
else if( token->IsSameAs( wxT( "SHEETNAME" ) ) ) else if( token->IsSameAs( wxT( "SHEETNAME" ) ) )
{ {
*token = CurrentSheet().Last()->GetName(); *token = aSheetPath->Last()->GetName();
return true; return true;
} }
else if( token->IsSameAs( wxT( "FILENAME" ) ) ) else if( token->IsSameAs( wxT( "FILENAME" ) ) )
@ -189,9 +190,8 @@ bool SCHEMATIC::ResolveTextVar( wxString* token, int aDepth ) const
return true; return true;
} }
if( CurrentSheet().LastScreen()->GetTitleBlock().TextVarResolver( token, m_project ) ) if( aSheetPath->LastScreen()->GetTitleBlock().TextVarResolver( token, m_project ) )
return true; return true;
}
if( Prj().TextVarResolver( token ) ) if( Prj().TextVarResolver( token ) )
return true; return true;

View File

@ -128,7 +128,7 @@ public:
void GetContextualTextVars( wxArrayString* aVars ) const; 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 /// Helper to retrieve the filename from the root sheet screen
wxString GetFileName() const override; wxString GetFileName() const override;