diff --git a/pcbnew/board.cpp b/pcbnew/board.cpp index 4a652d6a18..9c52fb14b0 100644 --- a/pcbnew/board.cpp +++ b/pcbnew/board.cpp @@ -322,17 +322,37 @@ void BOARD::UpdateRatsnestExclusions() } +void BOARD::RecordDRCExclusions() +{ + m_designSettings->m_DrcExclusions.clear(); + + for( PCB_MARKER* marker : m_markers ) + { + if( marker->IsExcluded() ) + m_designSettings->m_DrcExclusions.insert( marker->Serialize() ); + } +} + + std::vector BOARD::ResolveDRCExclusions( bool aCreateMarkers ) { + std::set exclusions = m_designSettings->m_DrcExclusions; + + m_designSettings->m_DrcExclusions.clear(); + for( PCB_MARKER* marker : GetBoard()->Markers() ) { wxString serialized = marker->Serialize(); - std::set::iterator it = m_designSettings->m_DrcExclusions.find( serialized ); + std::set::iterator it = exclusions.find( serialized ); - if( it != m_designSettings->m_DrcExclusions.end() ) + if( it != exclusions.end() ) { marker->SetExcluded( true ); - m_designSettings->m_DrcExclusions.erase( it ); + + // Exclusion still valid; store back to BOARD_DESIGN_SETTINGS + m_designSettings->m_DrcExclusions.insert( serialized ); + + exclusions.erase( it ); } } @@ -340,7 +360,7 @@ std::vector BOARD::ResolveDRCExclusions( bool aCreateMarkers ) if( aCreateMarkers ) { - for( const wxString& serialized : m_designSettings->m_DrcExclusions ) + for( const wxString& serialized : exclusions ) { PCB_MARKER* marker = PCB_MARKER::Deserialize( serialized ); @@ -362,12 +382,13 @@ std::vector BOARD::ResolveDRCExclusions( bool aCreateMarkers ) { marker->SetExcluded( true ); newMarkers.push_back( marker ); + + // Exclusion still valid; store back to BOARD_DESIGN_SETTINGS + m_designSettings->m_DrcExclusions.insert( serialized ); } } } - m_designSettings->m_DrcExclusions.clear(); - return newMarkers; } @@ -2715,13 +2736,3 @@ bool BOARD::operator==( const BOARD_ITEM& aItem ) const } -void BOARD::RecordDRCExclusions() -{ - m_designSettings->m_DrcExclusions.clear(); - - for( PCB_MARKER* marker : m_markers ) - { - if( marker->IsExcluded() ) - m_designSettings->m_DrcExclusions.insert( marker->Serialize() ); - } -} \ No newline at end of file diff --git a/pcbnew/pcbnew_jobs_handler.cpp b/pcbnew/pcbnew_jobs_handler.cpp index 53e0acacbd..7a5df613a6 100644 --- a/pcbnew/pcbnew_jobs_handler.cpp +++ b/pcbnew/pcbnew_jobs_handler.cpp @@ -1180,10 +1180,8 @@ int PCBNEW_JOBS_HANDLER::JobExportDrc( JOB* aJob ) commit.Push( _( "DRC" ), SKIP_UNDO | SKIP_SET_DIRTY ); - // now "resolve" the drc exclusions again because its the only way to set exclusion status on - // a marker - for( PCB_MARKER* marker : brd->ResolveDRCExclusions( false ) ) - brd->Add( marker ); + // Update the exclusion status on any excluded markers that still exist. + brd->ResolveDRCExclusions( false ); std::shared_ptr markersProvider = std::make_shared( brd, MARKER_BASE::MARKER_DRC, MARKER_BASE::MARKER_DRAWING_SHEET ); diff --git a/pcbnew/python/scripting/pcbnew_scripting_helpers.cpp b/pcbnew/python/scripting/pcbnew_scripting_helpers.cpp index 949aa94032..e6559dc1cf 100644 --- a/pcbnew/python/scripting/pcbnew_scripting_helpers.cpp +++ b/pcbnew/python/scripting/pcbnew_scripting_helpers.cpp @@ -611,9 +611,8 @@ bool WriteDRCReport( BOARD* aBoard, const wxString& aFileName, EDA_UNITS aUnits, engine->RunTests( aUnits, aReportAllTrackErrors, false ); engine->ClearViolationHandler(); - // now "resolve" the drc exclusions again because its the only way to set exclusion status on a marker - for( PCB_MARKER* marker : aBoard->ResolveDRCExclusions( false ) ) - aBoard->Add( marker ); + // Update the exclusion status on any excluded markers that still exist. + aBoard->ResolveDRCExclusions( false ); // TODO: Unify this with DIALOG_DRC::writeReport