Fix broken pasted sheet page numbering.

This change no longer sorts pasted sheets by page number.  This was done
because pasted sheets may not be numbered.  When sheets are not numbered
they are sorted by UUID path which results in some unexpected results.
Since the pasted sheet code uses recursion, pages will be numbered in the
order they are added.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/16580
This commit is contained in:
Wayne Stambaugh 2024-01-22 16:55:29 -05:00
parent 43a3ed2522
commit 4cf22e428c
1 changed files with 21 additions and 9 deletions

View File

@ -1468,7 +1468,8 @@ void SCH_EDITOR_CONTROL::updatePastedSymbol( SCH_SYMBOL* aSymbol, SCH_SCREEN* aP
SCH_SHEET_PATH SCH_EDITOR_CONTROL::updatePastedSheet( const SCH_SHEET_PATH& aPastePath, SCH_SHEET_PATH SCH_EDITOR_CONTROL::updatePastedSheet( const SCH_SHEET_PATH& aPastePath,
const KIID_PATH& aClipPath, SCH_SHEET* aSheet, const KIID_PATH& aClipPath,
SCH_SHEET* aSheet,
bool aForceKeepAnnotations, bool aForceKeepAnnotations,
SCH_SHEET_LIST* aPastedSheetsSoFar, SCH_SHEET_LIST* aPastedSheetsSoFar,
SCH_REFERENCE_LIST* aPastedSymbolsSoFar ) SCH_REFERENCE_LIST* aPastedSymbolsSoFar )
@ -1479,6 +1480,8 @@ SCH_SHEET_PATH SCH_EDITOR_CONTROL::updatePastedSheet( const SCH_SHEET_PATH& aPas
sheetPath.push_back( aSheet ); sheetPath.push_back( aSheet );
aPastedSheetsSoFar->push_back( sheetPath ); aPastedSheetsSoFar->push_back( sheetPath );
wxLogDebug( wxS( "Adding pasted sheet path: %s from clipboard path: %s." ),
sheetPath.Path().AsString(), aClipPath.AsString() );
if( aSheet->GetScreen() == nullptr ) if( aSheet->GetScreen() == nullptr )
return sheetPath; // We can only really set the page number but not load any items return sheetPath; // We can only really set the page number but not load any items
@ -1930,15 +1933,11 @@ int SCH_EDITOR_CONTROL::Paste( const TOOL_EVENT& aEvent )
getView()->Hide( item, true ); getView()->Hide( item, true );
} }
sheetPathsForScreen.SortByPageNumbers();
if( sheetsPasted ) if( sheetsPasted )
{ {
// Update page numbers: Find next free numeric page number // Update page numbers: Find next free numeric page number
for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen ) for( SCH_SHEET_PATH& sheetPath : sheetPathsForScreen )
{ {
pastedSheets[sheetPath].SortByPageNumbers();
for( SCH_SHEET_PATH& pastedSheet : pastedSheets[sheetPath] ) for( SCH_SHEET_PATH& pastedSheet : pastedSheets[sheetPath] )
{ {
int page = 1; int page = 1;
@ -1947,14 +1946,27 @@ int SCH_EDITOR_CONTROL::Paste( const TOOL_EVENT& aEvent )
while( hierarchy.PageNumberExists( pageNum ) ) while( hierarchy.PageNumberExists( pageNum ) )
pageNum = wxString::Format( "%d", ++page ); pageNum = wxString::Format( "%d", ++page );
pastedSheet.SetPageNumber( pageNum ); wxLogDebug( wxS( "Setting sheet path %s instance." ),
pastedSheet.Path().AsString() );
SCH_SHEET_INSTANCE sheetInstance;
sheetInstance.m_Path = pastedSheet.Path();
// Don't include the actual sheet in the instance path.
sheetInstance.m_Path.pop_back();
sheetInstance.m_PageNumber = pageNum;
sheetInstance.m_ProjectName = m_frame->Prj().GetProjectName();
SCH_SHEET* sheet = pastedSheet.Last();
wxCHECK2( sheet, continue );
sheet->AddInstance( sheetInstance );
hierarchy.push_back( pastedSheet ); hierarchy.push_back( pastedSheet );
// Remove all pasted sheet instance data that is not part of the current project. // Remove all pasted sheet instance data that is not part of the current project.
std::vector<KIID_PATH> instancesToRemove; std::vector<KIID_PATH> instancesToRemove;
SCH_SHEET* sheet = pastedSheet.Last();
wxCHECK2( sheet, continue );
for( const SCH_SHEET_INSTANCE& instance : sheet->GetInstances() ) for( const SCH_SHEET_INSTANCE& instance : sheet->GetInstances() )
{ {