184 result.docType = wxS(
"kicad_sch" );
190 std::vector<WalkedItem> beforeWalk;
191 std::vector<WalkedItem> afterWalk;
192 std::vector<std::unique_ptr<SCH_SHEET_PATH>> beforePaths;
193 std::vector<std::unique_ptr<SCH_SHEET_PATH>> afterPaths;
202 std::vector<ITEM_DESCRIPTOR> beforeDesc;
203 std::vector<ITEM_DESCRIPTOR> afterDesc;
204 std::map<KIID_PATH, const WalkedItem*> beforeMap;
205 std::map<KIID_PATH, const WalkedItem*> afterMap;
217 d.
keyProps.emplace_back( wxS(
"lib_id" ),
218 std::string( sym->GetLibId().Format().c_str() ) );
219 d.
keyProps.emplace_back( wxS(
"reference" ),
220 sym->GetRef( aW.
sheetPath ).ToStdString() );
228 beforeDesc.push_back( makeDescriptor( w,
m_before ) );
229 beforeMap[w.id] = &w;
234 afterDesc.push_back( makeDescriptor( w,
m_after ) );
251 result.changes.push_back( std::move( c ) );
256 if( std::find_if(
result.changes.begin(),
result.changes.end(),
258 { return aC.id == dup && aC.kind == CHANGE_KIND::DUPLICATE_UUID; } )
268 result.changes.push_back( std::move( c ) );
272 for(
const auto& [idA, idB] : recon.
aToB )
274 auto itA = beforeMap.find( idA );
275 auto itB = afterMap.find( idB );
276 const WalkedItem* a = itA == beforeMap.end() ? nullptr : itA->second;
277 const WalkedItem* b = itB == afterMap.end() ? nullptr : itB->second;
282 std::vector<PROPERTY_DELTA> propDeltas;
287 bool semanticallyEqual = ( *a->
item == *b->
item );
290 if( propDeltas.empty() && ( semanticallyEqual || scoped ) )
300 result.changes.push_back( std::move( c ) );
305 auto it = beforeMap.find( idA );
307 if( it == beforeMap.end() || !it->second )
323 result.changes.push_back( std::move( c ) );
328 auto it = afterMap.find( idB );
330 if( it == afterMap.end() || !it->second )
347 result.changes.push_back( std::move( c ) );
353 std::vector<PROPERTY_DELTA> docDeltas;
358 if( beforeRoot && afterRoot )
368 [](
const SCHEMATIC* aSch ) ->
const std::map<int, SEVERITY>*
370 if( !aSch || !aSch->IsValid() )
373 return &aSch->ErcSettings().m_ERCSeverities;
376 const std::map<int, SEVERITY>* beforeERC = ercSeverities(
m_before );
377 const std::map<int, SEVERITY>* afterERC = ercSeverities(
m_after );
379 if( beforeERC && afterERC && *beforeERC != *afterERC )
385 docDeltas.push_back( std::move( d ) );
392 auto schDrawingSheet = [](
const SCHEMATIC* aSch ) -> wxString
394 if( !aSch || !aSch->IsValid() )
395 return wxEmptyString;
397 return aSch->Settings().m_SchDrawingSheetFileName;
400 const wxString beforeSheet = schDrawingSheet(
m_before );
401 const wxString afterSheet = schDrawingSheet(
m_after );
403 if( beforeSheet != afterSheet )
409 docDeltas.push_back( std::move( d ) );
412 if( !docDeltas.empty() )
420 result.changes.push_back( std::move( c ) );
429 auto sheetPaperByScreen =
431 -> std::map<
const SCH_SCREEN*, std::pair<KIID_PATH, const PAGE_INFO*>>
433 std::map<const SCH_SCREEN*, std::pair<KIID_PATH, const PAGE_INFO*>> out;
435 if( !aSch || !aSch->IsValid() )
441 out.try_emplace( screen,
path.Path(), &screen->GetPageSettings() );
447 const SCH_SCREEN*
const beforeRootScreen = beforeRoot;
453 std::map<KIID_PATH, const SCH_SCREEN*> afterScreensByPath;
459 if(
const SCH_SCREEN* screen = p.LastScreen() )
460 afterScreensByPath.try_emplace( p.Path(), screen );
464 for(
const auto& [beforeScreen, entry] : sheetPaperByScreen(
m_before ) )
468 if( beforeScreen == beforeRootScreen )
471 const KIID_PATH& sheetPath = entry.first;
472 const PAGE_INFO& beforePaper = *entry.second;
478 auto afterIt = afterScreensByPath.find( sheetPath );
480 if( afterIt == afterScreensByPath.end() || !afterIt->second )
483 std::vector<PROPERTY_DELTA> sheetDeltas;
485 afterIt->second->GetPageSettings() );
487 if( !sheetDeltas.empty() )
499 result.changes.push_back( std::move( c ) );
Describe the page size and margins of a paper page on which to eventually print or plot.
wxString result
Test unit parsing edge cases and error handling.