Recalculate ratsnest after zone fill
Push the mutex down into the ZONE::Fill() routine and set the connectivity update to run after zone fills. The connectivity update cannot run while the mutex is locked for zone fills. Fixes https://gitlab.com/kicad/code/kicad/issues/9993
This commit is contained in:
parent
7f419e4468
commit
401de24274
|
@ -129,8 +129,6 @@ void PCB_EDIT_FRAME::Edit_Zone_Params( ZONE* aZone )
|
||||||
// Only auto-refill zones here if in user preferences
|
// Only auto-refill zones here if in user preferences
|
||||||
if( Settings().m_AutoRefillZones )
|
if( Settings().m_AutoRefillZones )
|
||||||
{
|
{
|
||||||
std::lock_guard<KISPINLOCK> lock( GetBoard()->GetConnectivity()->GetLock() );
|
|
||||||
|
|
||||||
if( zones_to_refill.size() )
|
if( zones_to_refill.size() )
|
||||||
{
|
{
|
||||||
ZONE_FILLER filler( GetBoard(), &commit );
|
ZONE_FILLER filler( GetBoard(), &commit );
|
||||||
|
@ -143,6 +141,7 @@ void PCB_EDIT_FRAME::Edit_Zone_Params( ZONE* aZone )
|
||||||
|
|
||||||
if( !filler.Fill( zones_to_refill ) )
|
if( !filler.Fill( zones_to_refill ) )
|
||||||
{
|
{
|
||||||
|
GetBoard()->GetConnectivity()->Build( GetBoard() );
|
||||||
// User has already OK'ed dialog so we're going to go ahead and commit even if the
|
// User has already OK'ed dialog so we're going to go ahead and commit even if the
|
||||||
// fill was cancelled.
|
// fill was cancelled.
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,10 +82,9 @@ void ZONE_FILLER_TOOL::CheckAllZones( wxWindow* aCaller, PROGRESS_REPORTER* aRep
|
||||||
filler.SetProgressReporter( reporter.get() );
|
filler.SetProgressReporter( reporter.get() );
|
||||||
}
|
}
|
||||||
|
|
||||||
std::lock_guard<KISPINLOCK> lock( board()->GetConnectivity()->GetLock() );
|
|
||||||
|
|
||||||
if( filler.Fill( toFill, true, aCaller ) )
|
if( filler.Fill( toFill, true, aCaller ) )
|
||||||
{
|
{
|
||||||
|
board()->GetConnectivity()->Build( board() );
|
||||||
commit.Push( _( "Fill Zone(s)" ), false );
|
commit.Push( _( "Fill Zone(s)" ), false );
|
||||||
getEditFrame<PCB_EDIT_FRAME>()->m_ZoneFillsDirty = false;
|
getEditFrame<PCB_EDIT_FRAME>()->m_ZoneFillsDirty = false;
|
||||||
}
|
}
|
||||||
|
@ -155,20 +154,21 @@ void ZONE_FILLER_TOOL::FillAllZones( wxWindow* aCaller, PROGRESS_REPORTER* aRepo
|
||||||
filler.SetProgressReporter( reporter.get() );
|
filler.SetProgressReporter( reporter.get() );
|
||||||
}
|
}
|
||||||
|
|
||||||
std::lock_guard<KISPINLOCK> lock( board()->GetConnectivity()->GetLock() );
|
|
||||||
|
|
||||||
if( filler.Fill( toFill ) )
|
|
||||||
{
|
{
|
||||||
commit.Push( _( "Fill Zone(s)" ), true ); // Allow undoing zone fill
|
if( filler.Fill( toFill ) )
|
||||||
frame->m_ZoneFillsDirty = false;
|
{
|
||||||
}
|
board()->GetConnectivity()->Build( board() );
|
||||||
else
|
commit.Push( _( "Fill Zone(s)" ), true ); // Allow undoing zone fill
|
||||||
{
|
frame->m_ZoneFillsDirty = false;
|
||||||
commit.Revert();
|
}
|
||||||
}
|
else
|
||||||
|
{
|
||||||
|
commit.Revert();
|
||||||
|
}
|
||||||
|
|
||||||
if( filler.IsDebug() )
|
if( filler.IsDebug() )
|
||||||
frame->UpdateUserInterface();
|
frame->UpdateUserInterface();
|
||||||
|
}
|
||||||
|
|
||||||
canvas()->Refresh();
|
canvas()->Refresh();
|
||||||
m_fillInProgress = false;
|
m_fillInProgress = false;
|
||||||
|
@ -211,10 +211,11 @@ int ZONE_FILLER_TOOL::ZoneFill( const TOOL_EVENT& aEvent )
|
||||||
reporter = std::make_unique<WX_PROGRESS_REPORTER>( frame(), _( "Fill Zone" ), 4 );
|
reporter = std::make_unique<WX_PROGRESS_REPORTER>( frame(), _( "Fill Zone" ), 4 );
|
||||||
filler.SetProgressReporter( reporter.get() );
|
filler.SetProgressReporter( reporter.get() );
|
||||||
|
|
||||||
std::lock_guard<KISPINLOCK> lock( board()->GetConnectivity()->GetLock() );
|
|
||||||
|
|
||||||
if( filler.Fill( toFill ) )
|
if( filler.Fill( toFill ) )
|
||||||
|
{
|
||||||
|
board()->GetConnectivity()->Build( board() );
|
||||||
commit.Push( _( "Fill Zone(s)" ), true ); // Allow undoing zone fill
|
commit.Push( _( "Fill Zone(s)" ), true ); // Allow undoing zone fill
|
||||||
|
}
|
||||||
else
|
else
|
||||||
commit.Revert();
|
commit.Revert();
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,8 @@ void ZONE_FILLER::SetProgressReporter( PROGRESS_REPORTER* aReporter )
|
||||||
|
|
||||||
bool ZONE_FILLER::Fill( std::vector<ZONE*>& aZones, bool aCheck, wxWindow* aParent )
|
bool ZONE_FILLER::Fill( std::vector<ZONE*>& aZones, bool aCheck, wxWindow* aParent )
|
||||||
{
|
{
|
||||||
|
std::lock_guard<KISPINLOCK> lock( m_board->GetConnectivity()->GetLock() );
|
||||||
|
|
||||||
std::vector<std::pair<ZONE*, PCB_LAYER_ID>> toFill;
|
std::vector<std::pair<ZONE*, PCB_LAYER_ID>> toFill;
|
||||||
std::vector<CN_ZONE_ISOLATED_ISLAND_LIST> islandsList;
|
std::vector<CN_ZONE_ISOLATED_ISLAND_LIST> islandsList;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue