Update Page Number when Duplicating or Pasting sheets

Fixes https://gitlab.com/kicad/code/kicad/-/issues/7872

Also, update hierarchy before renaming pasted sheets
Avoids duplicate sheet names when pasting multiple sheets
This commit is contained in:
Roberto Fernandez Bautista 2021-03-22 20:55:44 +00:00 committed by Seth Hillbrand
parent 381cc27548
commit be51be22a7
4 changed files with 38 additions and 2 deletions

View File

@ -515,6 +515,18 @@ bool SCH_SHEET_LIST::NameExists( const wxString& aSheetName ) const
} }
bool SCH_SHEET_LIST::PageNumberExists( const wxString& aPageNumber ) const
{
for( const SCH_SHEET_PATH& sheet : *this )
{
if( sheet.Last()->GetPageNumber( sheet ) == aPageNumber )
return true;
}
return false;
}
bool SCH_SHEET_LIST::IsModified() const bool SCH_SHEET_LIST::IsModified() const
{ {
for( const SCH_SHEET_PATH& sheet : *this ) for( const SCH_SHEET_PATH& sheet : *this )

View File

@ -457,6 +457,8 @@ public:
bool NameExists( const wxString& aSheetName ) const; bool NameExists( const wxString& aSheetName ) const;
bool PageNumberExists( const wxString& aPageNumber ) const;
/** /**
* Update all of the symbol instance information using \a aSymbolInstances. * Update all of the symbol instance information using \a aSymbolInstances.
* WARNING: Do not call this on anything other than the full hierarchy. * WARNING: Do not call this on anything other than the full hierarchy.

View File

@ -861,6 +861,17 @@ int SCH_EDIT_TOOL::Duplicate( const TOOL_EVENT& aEvent )
nameField.SetText( candidateName ); nameField.SetText( candidateName );
sheet->SetParent( m_frame->GetCurrentSheet().Last() ); sheet->SetParent( m_frame->GetCurrentSheet().Last() );
SCH_SHEET_PATH sheetpath = m_frame->GetCurrentSheet();
sheetpath.push_back( sheet );
int page = 1;
wxString pageNum = wxString::Format( "%d", page );
while( hierarchy.PageNumberExists( pageNum ) )
pageNum = wxString::Format( "%d", ++page );
sheet->AddInstance( sheetpath.Path() );
sheet->SetPageNumber( sheetpath, pageNum );
m_frame->AddToScreen( sheet, m_frame->GetScreen() ); m_frame->AddToScreen( sheet, m_frame->GetScreen() );
copiedSheets = true; copiedSheets = true;

View File

@ -1485,6 +1485,10 @@ int SCH_EDITOR_CONTROL::Paste( const TOOL_EVENT& aEvent )
int uniquifier = std::max( 0, wxAtoi( number ) ) + 1; int uniquifier = std::max( 0, wxAtoi( number ) ) + 1;
// Ensure we have latest hierarchy, as we may have added a sheet in the previous
// iteration
hierarchy = m_frame->Schematic().GetSheets();
while( hierarchy.NameExists( candidateName ) ) while( hierarchy.NameExists( candidateName ) )
candidateName = wxString::Format( wxT( "%s%d" ), baseName, uniquifier++ ); candidateName = wxString::Format( wxT( "%s%d" ), baseName, uniquifier++ );
@ -1531,7 +1535,14 @@ int SCH_EDITOR_CONTROL::Paste( const TOOL_EVENT& aEvent )
SCH_SHEET_PATH pastePath = pasteRoot; SCH_SHEET_PATH pastePath = pasteRoot;
pastePath.push_back( sheet ); pastePath.push_back( sheet );
int page = 1;
wxString pageNum = wxString::Format( "%d", page );
while( hierarchy.PageNumberExists( pageNum ) )
pageNum = wxString::Format( "%d", ++page );
sheet->AddInstance( pastePath.Path() ); sheet->AddInstance( pastePath.Path() );
sheet->SetPageNumber( pastePath, pageNum );
updatePastedInstances( pastePath, clipPath, sheet, forceKeepAnnotations ); updatePastedInstances( pastePath, clipPath, sheet, forceKeepAnnotations );
} }