Make sure find/replace respects different values in the hierarchy.

Fixes https://gitlab.com/kicad/code/kicad/issues/8328
This commit is contained in:
Jeff Young 2021-04-30 17:54:15 +01:00
parent 9b35757e18
commit 1ed54d2314
3 changed files with 44 additions and 11 deletions

View File

@ -587,6 +587,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
SetSheetNumberAndCount(); SetSheetNumberAndCount();
RecomputeIntersheetRefs(); RecomputeIntersheetRefs();
GetCurrentSheet().UpdateAllScreenReferences();
// re-create junctions if needed. Eeschema optimizes wires by merging // re-create junctions if needed. Eeschema optimizes wires by merging
// colinear segments. If a schematic is saved without a valid // colinear segments. If a schematic is saved without a valid

View File

@ -394,29 +394,53 @@ bool SCH_FIELD::IsReplaceable() const
bool SCH_FIELD::Replace( const wxFindReplaceData& aSearchData, void* aAuxData ) bool SCH_FIELD::Replace( const wxFindReplaceData& aSearchData, void* aAuxData )
{ {
bool isReplaced = false; wxString text;
bool resolve = false; // Replace in source text, not shown text
bool isReplaced = false;
if( m_parent && m_parent->Type() == SCH_COMPONENT_T ) if( m_parent && m_parent->Type() == SCH_COMPONENT_T )
{ {
SCH_COMPONENT* parentSymbol = static_cast<SCH_COMPONENT*>( m_parent ); SCH_COMPONENT* parentSymbol = static_cast<SCH_COMPONENT*>( m_parent );
if( m_id == REFERENCE_FIELD ) switch( m_id )
{ {
wxCHECK_MSG( aAuxData != NULL, false, case REFERENCE_FIELD:
wxT( "Cannot replace reference designator without valid sheet path." ) ); wxCHECK_MSG( aAuxData, false, wxT( "Need sheetpath to replace in refdes." ) );
if( !( aSearchData.GetFlags() & FR_REPLACE_REFERENCES ) ) if( !( aSearchData.GetFlags() & FR_REPLACE_REFERENCES ) )
return false; return false;
wxString text = parentSymbol->GetRef((SCH_SHEET_PATH*) aAuxData ); text = parentSymbol->GetRef( (SCH_SHEET_PATH*) aAuxData );
isReplaced = EDA_ITEM::Replace( aSearchData, text ); isReplaced = EDA_ITEM::Replace( aSearchData, text );
if( isReplaced ) if( isReplaced )
parentSymbol->SetRef((SCH_SHEET_PATH*) aAuxData, text ); parentSymbol->SetRef( (SCH_SHEET_PATH*) aAuxData, text );
}
else break;
{
case VALUE_FIELD:
wxCHECK_MSG( aAuxData, false, wxT( "Need sheetpath to replace in value field." ) );
text = parentSymbol->GetValue((SCH_SHEET_PATH*) aAuxData, resolve );
isReplaced = EDA_ITEM::Replace( aSearchData, text );
if( isReplaced )
parentSymbol->SetValue( (SCH_SHEET_PATH*) aAuxData, text );
break;
case FOOTPRINT_FIELD:
wxCHECK_MSG( aAuxData, false, wxT( "Need sheetpath to replace in footprint field." ) );
text = parentSymbol->GetFootprint((SCH_SHEET_PATH*) aAuxData, resolve );
isReplaced = EDA_ITEM::Replace( aSearchData, text );
if( isReplaced )
parentSymbol->SetFootprint( (SCH_SHEET_PATH*) aAuxData, text );
break;
default:
isReplaced = EDA_TEXT::Replace( aSearchData ); isReplaced = EDA_TEXT::Replace( aSearchData );
} }
} }

View File

@ -477,6 +477,7 @@ int SCH_EDITOR_CONTROL::ReplaceAndFindNext( const TOOL_EVENT& aEvent )
if( item->Replace( *data, sheet ) ) if( item->Replace( *data, sheet ) )
{ {
m_frame->UpdateItem( item ); m_frame->UpdateItem( item );
m_frame->GetCurrentSheet().UpdateAllScreenReferences();
m_frame->OnModify(); m_frame->OnModify();
} }
@ -490,6 +491,7 @@ int SCH_EDITOR_CONTROL::ReplaceAndFindNext( const TOOL_EVENT& aEvent )
int SCH_EDITOR_CONTROL::ReplaceAll( const TOOL_EVENT& aEvent ) int SCH_EDITOR_CONTROL::ReplaceAll( const TOOL_EVENT& aEvent )
{ {
wxFindReplaceData* data = m_frame->GetFindReplaceData(); wxFindReplaceData* data = m_frame->GetFindReplaceData();
bool modified = false;
if( !data ) if( !data )
return FindAndReplace( ACTIONS::find.MakeEvent() ); return FindAndReplace( ACTIONS::find.MakeEvent() );
@ -506,13 +508,19 @@ int SCH_EDITOR_CONTROL::ReplaceAll( const TOOL_EVENT& aEvent )
if( item->Replace( *data, sheet ) ) if( item->Replace( *data, sheet ) )
{ {
m_frame->UpdateItem( item ); m_frame->UpdateItem( item );
m_frame->OnModify(); modified = true;
} }
item = nextMatch( screen, sheet, dynamic_cast<SCH_ITEM*>( item ), data ); item = nextMatch( screen, sheet, dynamic_cast<SCH_ITEM*>( item ), data );
} }
} }
if( modified )
{
m_frame->GetCurrentSheet().UpdateAllScreenReferences();
m_frame->OnModify();
}
return 0; return 0;
} }