Choose the first unused priority value for zones
Default the new zone priority value to the lowest available unused priority. Ensures that, by default, a new zone has a unique priority level preventing zones from unintenionally shorting
This commit is contained in:
parent
ee95224517
commit
e661545ecf
|
@ -54,6 +54,37 @@ ZONE_CREATE_HELPER::~ZONE_CREATE_HELPER()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ZONE_CREATE_HELPER::setUniquePriority( ZONE_SETTINGS& aZoneInfo )
|
||||||
|
{
|
||||||
|
PCB_BASE_EDIT_FRAME* frame = m_tool.getEditFrame<PCB_BASE_EDIT_FRAME>();
|
||||||
|
BOARD* board = frame->GetBoard();
|
||||||
|
|
||||||
|
// By default, new zones get the first unused priority
|
||||||
|
std::set<unsigned> priorities;
|
||||||
|
|
||||||
|
for( ZONE* zone : board->Zones() )
|
||||||
|
{
|
||||||
|
if( zone->GetTeardropAreaType() == TEARDROP_TYPE::TD_NONE
|
||||||
|
&& ( zone->GetLayerSet() & LSET::AllCuMask() ).any() )
|
||||||
|
{
|
||||||
|
priorities.insert( zone->GetAssignedPriority() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned priority = 0;
|
||||||
|
|
||||||
|
for( unsigned exist_priority : priorities )
|
||||||
|
{
|
||||||
|
if( priority != exist_priority )
|
||||||
|
break;
|
||||||
|
|
||||||
|
++priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
aZoneInfo.m_ZonePriority = priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
std::unique_ptr<ZONE> ZONE_CREATE_HELPER::createNewZone( bool aKeepout )
|
std::unique_ptr<ZONE> ZONE_CREATE_HELPER::createNewZone( bool aKeepout )
|
||||||
{
|
{
|
||||||
PCB_BASE_EDIT_FRAME* frame = m_tool.getEditFrame<PCB_BASE_EDIT_FRAME>();
|
PCB_BASE_EDIT_FRAME* frame = m_tool.getEditFrame<PCB_BASE_EDIT_FRAME>();
|
||||||
|
@ -68,20 +99,12 @@ std::unique_ptr<ZONE> ZONE_CREATE_HELPER::createNewZone( bool aKeepout )
|
||||||
zoneInfo.m_NetcodeSelection = highlightedNets.empty() ? -1 : *highlightedNets.begin();
|
zoneInfo.m_NetcodeSelection = highlightedNets.empty() ? -1 : *highlightedNets.begin();
|
||||||
zoneInfo.SetIsRuleArea( m_params.m_keepout );
|
zoneInfo.SetIsRuleArea( m_params.m_keepout );
|
||||||
|
|
||||||
// By default, new zones should have the highest available priority
|
|
||||||
if( m_params.m_mode != ZONE_MODE::GRAPHIC_POLYGON
|
if( m_params.m_mode != ZONE_MODE::GRAPHIC_POLYGON
|
||||||
&& ( zoneInfo.m_Layers & LSET::AllCuMask() ).any() )
|
&& ( zoneInfo.m_Layers & LSET::AllCuMask() ).any() )
|
||||||
{
|
{
|
||||||
unsigned priority = 0;
|
setUniquePriority( zoneInfo );
|
||||||
|
|
||||||
for( ZONE* zone : board->Zones() )
|
|
||||||
{
|
|
||||||
if( zone->GetTeardropAreaType() == TEARDROP_TYPE::TD_NONE )
|
|
||||||
priority = std::max( priority, zone->GetAssignedPriority() );
|
|
||||||
}
|
|
||||||
|
|
||||||
zoneInfo.m_ZonePriority = static_cast<int>( priority + 1 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we don't have a net from highlighting, maybe we can get one from the selection
|
// If we don't have a net from highlighting, maybe we can get one from the selection
|
||||||
PCB_SELECTION_TOOL* selectionTool = m_tool.GetManager()->GetTool<PCB_SELECTION_TOOL>();
|
PCB_SELECTION_TOOL* selectionTool = m_tool.GetManager()->GetTool<PCB_SELECTION_TOOL>();
|
||||||
|
|
||||||
|
|
|
@ -117,6 +117,13 @@ public:
|
||||||
void commitZone( std::unique_ptr<ZONE> aZone );
|
void commitZone( std::unique_ptr<ZONE> aZone );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Choose a new priority for @aZoneInfo. This will be the lowest unused zone priority number
|
||||||
|
* @param aZoneInfo ZONE_SETTINGS to apply the new priority number to
|
||||||
|
*/
|
||||||
|
void setUniquePriority( ZONE_SETTINGS& aZoneInfo );
|
||||||
|
|
||||||
DRAWING_TOOL& m_tool;
|
DRAWING_TOOL& m_tool;
|
||||||
|
|
||||||
///< Parameters of the zone to be drawn
|
///< Parameters of the zone to be drawn
|
||||||
|
|
Loading…
Reference in New Issue