136 m_report.requiresConnectivityRebuild =
m_plan.requiresConnectivityRebuild;
139 std::vector<std::unique_ptr<SCH_SHEET_PATH>> ancStorage;
140 std::vector<std::unique_ptr<SCH_SHEET_PATH>> oursStorage;
141 std::vector<std::unique_ptr<SCH_SHEET_PATH>> theirsStorage;
157 std::set<const SCH_ITEM*> freedAncestorItems;
158 std::set<std::pair<SCH_SCREEN*, KIID>> placedScreenItems;
159 std::map<KIID, SCH_ITEM*> placedByItemUuid;
163 if( !aSource || !aTargetScreen )
169 if( !placedScreenItems.insert( { aTargetScreen, aSource->m_Uuid } ).second )
173 auto* schClone =
dynamic_cast<SCH_ITEM*
>( cloned );
185 aTargetScreen->Append( schClone );
194 if( aFullPath.empty() )
198 sheetPathKey.pop_back();
200 for(
auto& storedPath : ancStorage )
202 if( storedPath->Path() == sheetPathKey )
203 return storedPath.get();
209 auto takeFrom = [&](
const std::map<KIID_PATH, PathedItem>& aIndex,
210 std::map<KIID_PATH, PathedItem>::const_iterator aIt,
212 std::map<KIID_PATH, PathedItem>::iterator aAncIt,
213 std::size_t& aCounter ) ->
bool
215 if( aIt == aIndex.end() )
222 wxT(
"applier: sheet-level resolution skipped for %s" ),
223 aRes.id.AsString() );
230 if( aAncIt != ancestorIndex.end() )
232 ancestorItem = aAncIt->second.item;
233 ancestorScreen = aAncIt->second.sheetPath->LastScreen();
241 wxT(
"applier: target sheet path missing for %s" ),
242 aRes.id.AsString() );
250 if( ancestorItem && ancestorScreen )
253 ancestorScreen->
Remove( ancestorItem );
260 if( ancestorItem && ancestorScreen )
261 ancestorScreen->
Append( ancestorItem );
266 if( !aRes.id.empty() )
267 placedByItemUuid[aRes.id.back()] = placed;
269 if( ancestorItem && ancestorScreen )
271 freedAncestorItems.insert( ancestorItem );
273 ancestorIndex.erase( aAncIt );
289 if( !dstSym || !srcSym )
302 auto applyInstanceResolution =
304 std::map<KIID_PATH, PathedItem>::iterator aOursIt,
305 std::map<KIID_PATH, PathedItem>::iterator aTheirsIt )
312 SCH_ITEM* ours = aOursIt != oursIndex.end() ? aOursIt->second.item :
nullptr;
313 SCH_ITEM* theirs = aTheirsIt != theirsIndex.end() ? aTheirsIt->second.item :
nullptr;
326 copyInstanceData( aPlaced, theirs, targetSheet->
Path() );
330 copyInstanceData( aPlaced, ours, targetSheet->
Path() );
355 auto markProjectFieldTouched = [&](
const wxString& aProp )
358 m_report.ercSeveritiesTouched =
true;
360 m_report.drawingSheetFileTouched =
true;
370 auto markDivergedProjectFields = [&](
const SCHEMATIC* aSide )
372 if( !aSide || !aSide->IsValid() || !
m_ancestor->IsValid() )
375 if( aSide->ErcSettings().m_ERCSeverities
376 !=
m_ancestor->ErcSettings().m_ERCSeverities )
381 if( aSide->Settings().m_SchDrawingSheetFileName
382 !=
m_ancestor->Settings().m_SchDrawingSheetFileName )
390 markDivergedProjectFields(
m_ours );
391 markDivergedProjectFields(
m_theirs );
394 auto applyWholeSide = [&](
const SCHEMATIC* aSrc )
399 if( aSrc->RootScreen() &&
m_ancestor->RootScreen() )
402 aSrc->RootScreen()->GetPageSettings() );
403 m_ancestor->RootScreen()->SetTitleBlock( aSrc->RootScreen()->GetTitleBlock() );
407 && aSrc->ErcSettings().m_ERCSeverities
408 !=
m_ancestor->ErcSettings().m_ERCSeverities )
411 aSrc->ErcSettings().m_ERCSeverities;
419 && aSrc->Settings().m_SchDrawingSheetFileName
420 !=
m_ancestor->Settings().m_SchDrawingSheetFileName )
422 m_ancestor->Settings().m_SchDrawingSheetFileName =
423 aSrc->Settings().m_SchDrawingSheetFileName;
440 bool pageTouched =
false;
467 !=
m_ancestor->ErcSettings().m_ERCSeverities )
479 !=
m_ancestor->Settings().m_SchDrawingSheetFileName )
481 m_ancestor->Settings().m_SchDrawingSheetFileName =
493 if( pageTouched && ancRoot )
509 sheetPath.pop_back();
512 [&](
const std::vector<std::unique_ptr<SCH_SHEET_PATH>>& aPaths )
515 for(
const auto& p : aPaths )
517 if( p->Path() == sheetPath )
518 return p->LastScreen();
524 SCH_SCREEN* ancScreen = resolveScreen( ancStorage );
531 if(
SCH_SCREEN* src = resolveScreen( oursStorage ) )
539 if(
SCH_SCREEN* src = resolveScreen( theirsStorage ) )
555 if( aKind ==
PROP_RES::OURS )
return resolveScreen( oursStorage );
586 auto ancIt = ancestorIndex.find(
res.id );
587 auto oursIt = oursIndex.find(
res.id );
588 auto theirsIt = theirsIndex.find(
res.id );
593 auto resolutionTargetsSheet = [&]() ->
bool
595 if( ancIt != ancestorIndex.end() &&
isSheetItem( ancIt->second.item ) )
return true;
596 if( oursIt != oursIndex.end() &&
isSheetItem( oursIt->second.item ) )
return true;
597 if( theirsIt != theirsIndex.end() &&
isSheetItem( theirsIt->second.item ) )
return true;
601 if( resolutionTargetsSheet() )
611 if( !
res.id.empty() )
613 auto placedIt = placedByItemUuid.find(
res.id.back() );
615 if( placedIt != placedByItemUuid.end() )
617 applyInstanceResolution( placedIt->second,
res, oursIt, theirsIt );
625 if( ancIt != ancestorIndex.end() && freedAncestorItems.count( ancIt->second.item ) )
631 takeFrom( oursIndex, oursIt,
res, ancIt,
m_report.itemsTakenOurs );
635 takeFrom( theirsIndex, theirsIt,
res, ancIt,
m_report.itemsTakenTheirs );
644 if( ancIt != ancestorIndex.end() )
646 SCH_ITEM* victim = ancIt->second.item;
647 freedAncestorItems.insert( victim );
648 ancIt->second.sheetPath->LastScreen()->DeleteItem( victim );
649 ancestorIndex.erase( ancIt );
666 if( oursIt == oursIndex.end() )
677 const SCH_ITEM* theirs = theirsIt != theirsIndex.end()
678 ? theirsIt->second.item :
nullptr;
682 if( ancIt != ancestorIndex.end() )
684 ancestorItem = ancIt->second.item;
685 ancestorScreen = ancIt->second.sheetPath->LastScreen();
692 if( ancestorItem && ancestorScreen )
695 ancestorScreen->
Remove( ancestorItem );
699 SCH_ITEM* placed = cloneIntoSheet( oursIt->second.item, targetScreen );
703 if( ancestorItem && ancestorScreen )
704 ancestorScreen->
Append( ancestorItem );
709 if( !
res.id.empty() )
710 placedByItemUuid[
res.id.back()] = placed;
720 oursIt->second.item, theirs, ancestorItem );
723 targetScreen->
Update( placed );
730 if( ancestorItem && ancestorScreen )
732 freedAncestorItems.insert( ancestorItem );
734 ancestorIndex.erase( ancIt );
764 entry.
id = sheetPath.Path();
Describe the page size and margins of a paper page on which to eventually print or plot.
bool SetType(PAGE_SIZE_TYPE aPageSize, bool aIsPortrait=false)
Set the name of the page type and also the sizes and margins commonly associated with that type name.