Make sure dummy tracks have ROUTER_TRANSIENT flags.

Also give them more info that might be queried by custom DRC rules.
This currently just includes positioning info (it already included
nets and principal layer).  We *could* also try to figure out all
layers for dummy vias, and/or widths for dummy tracks / arcs....
This commit is contained in:
Jeff Young 2023-08-19 17:06:07 +01:00
parent 50ac5db8d2
commit fa060c7c58
3 changed files with 63 additions and 27 deletions

View File

@ -352,18 +352,33 @@ bool PNS_PCBNEW_RULE_RESOLVER::QueryConstraint( PNS::CONSTRAINT_TYPE aType,
{ {
switch( aItemA->Kind() ) switch( aItemA->Kind() )
{ {
case PNS::ITEM::ARC_T: parentA = &m_dummyArcs[0]; break; case PNS::ITEM::ARC_T:
case PNS::ITEM::VIA_T: parentA = &m_dummyVias[0]; break; m_dummyArcs[0].SetLayer( ToLAYER_ID( aLayer ) );
case PNS::ITEM::SEGMENT_T: parentA = &m_dummyTracks[0]; break; m_dummyArcs[0].SetNetCode( aItemA->Net(), true );
case PNS::ITEM::LINE_T: parentA = &m_dummyTracks[0]; break; m_dummyArcs[0].SetStart( aItemA->Anchor( 0 ) );
case PNS::ITEM::HOLE_T: parentA = &m_dummyVias[0]; break; m_dummyArcs[0].SetEnd( aItemA->Anchor( 1 ) );
default: break; parentA = &m_dummyArcs[0];
} break;
if( parentA ) case PNS::ITEM::VIA_T:
{ case PNS::ITEM::HOLE_T:
parentA->SetLayer( ToLAYER_ID( aLayer ) ); m_dummyVias[0].SetLayer( ToLAYER_ID( aLayer ) );
static_cast<BOARD_CONNECTED_ITEM*>( parentA )->SetNetCode( aItemA->Net(), true ); m_dummyVias[0].SetNetCode( aItemA->Net(), true );
m_dummyVias[0].SetStart( aItemA->Anchor( 0 ) );
parentA = &m_dummyVias[0];
break;
case PNS::ITEM::SEGMENT_T:
case PNS::ITEM::LINE_T:
m_dummyTracks[0].SetLayer( ToLAYER_ID( aLayer ) );
m_dummyTracks[0].SetNetCode( aItemA->Net(), true );
m_dummyTracks[0].SetStart( aItemA->Anchor( 0 ) );
m_dummyTracks[0].SetEnd( aItemA->Anchor( 1 ) );
parentA = &m_dummyTracks[0];
break;
default:
break;
} }
} }
@ -371,18 +386,33 @@ bool PNS_PCBNEW_RULE_RESOLVER::QueryConstraint( PNS::CONSTRAINT_TYPE aType,
{ {
switch( aItemB->Kind() ) switch( aItemB->Kind() )
{ {
case PNS::ITEM::ARC_T: parentB = &m_dummyArcs[1]; break; case PNS::ITEM::ARC_T:
case PNS::ITEM::VIA_T: parentB = &m_dummyVias[1]; break; m_dummyArcs[1].SetLayer( ToLAYER_ID( aLayer ) );
case PNS::ITEM::SEGMENT_T: parentB = &m_dummyTracks[1]; break; m_dummyArcs[1].SetNetCode( aItemB->Net(), true );
case PNS::ITEM::LINE_T: parentB = &m_dummyTracks[1]; break; m_dummyArcs[1].SetStart( aItemB->Anchor( 0 ) );
case PNS::ITEM::HOLE_T: parentB = &m_dummyVias[1]; break; m_dummyArcs[1].SetEnd( aItemB->Anchor( 1 ) );
default: break; parentA = &m_dummyArcs[1];
} break;
if( parentB ) case PNS::ITEM::VIA_T:
{ case PNS::ITEM::HOLE_T:
parentB->SetLayer( ToLAYER_ID( aLayer ) ); m_dummyVias[1].SetLayer( ToLAYER_ID( aLayer ) );
static_cast<BOARD_CONNECTED_ITEM*>( parentB )->SetNetCode( aItemB->Net(), true ); m_dummyVias[1].SetNetCode( aItemB->Net(), true );
m_dummyVias[1].SetStart( aItemB->Anchor( 0 ) );
parentA = &m_dummyVias[1];
break;
case PNS::ITEM::SEGMENT_T:
case PNS::ITEM::LINE_T:
m_dummyTracks[1].SetLayer( ToLAYER_ID( aLayer ) );
m_dummyTracks[1].SetNetCode( aItemB->Net(), true );
m_dummyTracks[1].SetStart( aItemB->Anchor( 0 ) );
m_dummyTracks[1].SetEnd( aItemB->Anchor( 1 ) );
parentA = &m_dummyTracks[1];
break;
default:
break;
} }
} }

View File

@ -708,11 +708,11 @@ void ROUTER_TOOL::switchLayerOnViaPlacement()
m_router->SwitchLayer( *newLayer ); m_router->SwitchLayer( *newLayer );
m_lastTargetLayer = *newLayer; m_lastTargetLayer = *newLayer;
updateSizesAfterLayerSwitch( ToLAYER_ID( *newLayer ) ); updateSizesAfterLayerSwitch( ToLAYER_ID( *newLayer ), m_endSnapPoint );
} }
void ROUTER_TOOL::updateSizesAfterLayerSwitch( PCB_LAYER_ID targetLayer ) void ROUTER_TOOL::updateSizesAfterLayerSwitch( PCB_LAYER_ID targetLayer, const VECTOR2I& aPos )
{ {
std::vector<int> nets = m_router->GetCurrentNets(); std::vector<int> nets = m_router->GetCurrentNets();
@ -722,8 +722,11 @@ void ROUTER_TOOL::updateSizesAfterLayerSwitch( PCB_LAYER_ID targetLayer )
DRC_CONSTRAINT constraint; DRC_CONSTRAINT constraint;
PCB_TRACK dummyTrack( board() ); PCB_TRACK dummyTrack( board() );
dummyTrack.SetFlags( ROUTER_TRANSIENT );
dummyTrack.SetLayer( targetLayer ); dummyTrack.SetLayer( targetLayer );
dummyTrack.SetNetCode( nets.empty() ? 0 : nets[0] ); dummyTrack.SetNetCode( nets.empty() ? 0 : nets[0] );
dummyTrack.SetStart( aPos );
dummyTrack.SetEnd( dummyTrack.GetStart() );
if( bds.UseNetClassTrack() || !sizes.TrackWidthIsExplicit() ) if( bds.UseNetClassTrack() || !sizes.TrackWidthIsExplicit() )
{ {
@ -757,8 +760,11 @@ void ROUTER_TOOL::updateSizesAfterLayerSwitch( PCB_LAYER_ID targetLayer )
if( nets.size() >= 2 && ( bds.UseNetClassDiffPair() || !sizes.TrackWidthIsExplicit() ) ) if( nets.size() >= 2 && ( bds.UseNetClassDiffPair() || !sizes.TrackWidthIsExplicit() ) )
{ {
PCB_TRACK dummyTrackB( board() ); PCB_TRACK dummyTrackB( board() );
dummyTrackB.SetFlags( ROUTER_TRANSIENT );
dummyTrackB.SetLayer( targetLayer ); dummyTrackB.SetLayer( targetLayer );
dummyTrackB.SetNetCode( nets[1] ); dummyTrackB.SetNetCode( nets[1] );
dummyTrackB.SetStart( aPos );
dummyTrackB.SetEnd( dummyTrackB.GetStart() );
constraint = drcEngine->EvalRules( TRACK_WIDTH_CONSTRAINT, &dummyTrack, &dummyTrackB, constraint = drcEngine->EvalRules( TRACK_WIDTH_CONSTRAINT, &dummyTrack, &dummyTrackB,
targetLayer ); targetLayer );
@ -1010,8 +1016,8 @@ int ROUTER_TOOL::handleLayerSwitch( const TOOL_EVENT& aEvent, bool aForceVia )
if( !aForceVia && m_router && m_router->SwitchLayer( targetLayer ) ) if( !aForceVia && m_router && m_router->SwitchLayer( targetLayer ) )
{ {
updateSizesAfterLayerSwitch( targetLayer );
updateEndItem( aEvent ); updateEndItem( aEvent );
updateSizesAfterLayerSwitch( targetLayer, m_endSnapPoint );
m_router->Move( m_endSnapPoint, m_endItem ); // refresh m_router->Move( m_endSnapPoint, m_endItem ); // refresh
return 0; return 0;
} }
@ -1851,8 +1857,8 @@ int ROUTER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
else if( evt->IsAction( &PCB_ACTIONS::layerChanged ) ) else if( evt->IsAction( &PCB_ACTIONS::layerChanged ) )
{ {
m_router->SwitchLayer( frame->GetActiveLayer() ); m_router->SwitchLayer( frame->GetActiveLayer() );
updateSizesAfterLayerSwitch( frame->GetActiveLayer() );
updateStartItem( *evt ); updateStartItem( *evt );
updateSizesAfterLayerSwitch( frame->GetActiveLayer(), m_startSnapPoint );
} }
else if( evt->IsKeyPressed() ) else if( evt->IsKeyPressed() )
{ {

View File

@ -79,7 +79,7 @@ private:
int getStartLayer( const PNS::ITEM* aItem ); int getStartLayer( const PNS::ITEM* aItem );
void switchLayerOnViaPlacement(); void switchLayerOnViaPlacement();
void updateSizesAfterLayerSwitch( PCB_LAYER_ID targetLayer ); void updateSizesAfterLayerSwitch( PCB_LAYER_ID targetLayer, const VECTOR2I& aPos );
bool getNearestRatnestAnchor( VECTOR2I& aPoint, LAYER_RANGE& aLayers ); bool getNearestRatnestAnchor( VECTOR2I& aPoint, LAYER_RANGE& aLayers );
int onLayerCommand( const TOOL_EVENT& aEvent ); int onLayerCommand( const TOOL_EVENT& aEvent );