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:
parent
50ac5db8d2
commit
fa060c7c58
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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() )
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
Loading…
Reference in New Issue