diff --git a/pcbnew/router/pns_kicad_iface.cpp b/pcbnew/router/pns_kicad_iface.cpp index c6c1375115..4415560da8 100644 --- a/pcbnew/router/pns_kicad_iface.cpp +++ b/pcbnew/router/pns_kicad_iface.cpp @@ -352,18 +352,33 @@ bool PNS_PCBNEW_RULE_RESOLVER::QueryConstraint( PNS::CONSTRAINT_TYPE aType, { switch( aItemA->Kind() ) { - case PNS::ITEM::ARC_T: parentA = &m_dummyArcs[0]; break; - case PNS::ITEM::VIA_T: parentA = &m_dummyVias[0]; break; - case PNS::ITEM::SEGMENT_T: parentA = &m_dummyTracks[0]; break; - case PNS::ITEM::LINE_T: parentA = &m_dummyTracks[0]; break; - case PNS::ITEM::HOLE_T: parentA = &m_dummyVias[0]; break; - default: break; - } + case PNS::ITEM::ARC_T: + m_dummyArcs[0].SetLayer( ToLAYER_ID( aLayer ) ); + m_dummyArcs[0].SetNetCode( aItemA->Net(), true ); + m_dummyArcs[0].SetStart( aItemA->Anchor( 0 ) ); + m_dummyArcs[0].SetEnd( aItemA->Anchor( 1 ) ); + parentA = &m_dummyArcs[0]; + break; - if( parentA ) - { - parentA->SetLayer( ToLAYER_ID( aLayer ) ); - static_cast( parentA )->SetNetCode( aItemA->Net(), true ); + case PNS::ITEM::VIA_T: + case PNS::ITEM::HOLE_T: + m_dummyVias[0].SetLayer( ToLAYER_ID( aLayer ) ); + 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() ) { - case PNS::ITEM::ARC_T: parentB = &m_dummyArcs[1]; break; - case PNS::ITEM::VIA_T: parentB = &m_dummyVias[1]; break; - case PNS::ITEM::SEGMENT_T: parentB = &m_dummyTracks[1]; break; - case PNS::ITEM::LINE_T: parentB = &m_dummyTracks[1]; break; - case PNS::ITEM::HOLE_T: parentB = &m_dummyVias[1]; break; - default: break; - } + case PNS::ITEM::ARC_T: + m_dummyArcs[1].SetLayer( ToLAYER_ID( aLayer ) ); + m_dummyArcs[1].SetNetCode( aItemB->Net(), true ); + m_dummyArcs[1].SetStart( aItemB->Anchor( 0 ) ); + m_dummyArcs[1].SetEnd( aItemB->Anchor( 1 ) ); + parentA = &m_dummyArcs[1]; + break; - if( parentB ) - { - parentB->SetLayer( ToLAYER_ID( aLayer ) ); - static_cast( parentB )->SetNetCode( aItemB->Net(), true ); + case PNS::ITEM::VIA_T: + case PNS::ITEM::HOLE_T: + m_dummyVias[1].SetLayer( ToLAYER_ID( aLayer ) ); + 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; } } diff --git a/pcbnew/router/router_tool.cpp b/pcbnew/router/router_tool.cpp index 492ff227a4..2c8d7b1b17 100644 --- a/pcbnew/router/router_tool.cpp +++ b/pcbnew/router/router_tool.cpp @@ -708,11 +708,11 @@ void ROUTER_TOOL::switchLayerOnViaPlacement() m_router->SwitchLayer( *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 nets = m_router->GetCurrentNets(); @@ -722,8 +722,11 @@ void ROUTER_TOOL::updateSizesAfterLayerSwitch( PCB_LAYER_ID targetLayer ) DRC_CONSTRAINT constraint; PCB_TRACK dummyTrack( board() ); + dummyTrack.SetFlags( ROUTER_TRANSIENT ); dummyTrack.SetLayer( targetLayer ); dummyTrack.SetNetCode( nets.empty() ? 0 : nets[0] ); + dummyTrack.SetStart( aPos ); + dummyTrack.SetEnd( dummyTrack.GetStart() ); 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() ) ) { PCB_TRACK dummyTrackB( board() ); + dummyTrackB.SetFlags( ROUTER_TRANSIENT ); dummyTrackB.SetLayer( targetLayer ); dummyTrackB.SetNetCode( nets[1] ); + dummyTrackB.SetStart( aPos ); + dummyTrackB.SetEnd( dummyTrackB.GetStart() ); constraint = drcEngine->EvalRules( TRACK_WIDTH_CONSTRAINT, &dummyTrack, &dummyTrackB, targetLayer ); @@ -1010,8 +1016,8 @@ int ROUTER_TOOL::handleLayerSwitch( const TOOL_EVENT& aEvent, bool aForceVia ) if( !aForceVia && m_router && m_router->SwitchLayer( targetLayer ) ) { - updateSizesAfterLayerSwitch( targetLayer ); updateEndItem( aEvent ); + updateSizesAfterLayerSwitch( targetLayer, m_endSnapPoint ); m_router->Move( m_endSnapPoint, m_endItem ); // refresh return 0; } @@ -1851,8 +1857,8 @@ int ROUTER_TOOL::MainLoop( const TOOL_EVENT& aEvent ) else if( evt->IsAction( &PCB_ACTIONS::layerChanged ) ) { m_router->SwitchLayer( frame->GetActiveLayer() ); - updateSizesAfterLayerSwitch( frame->GetActiveLayer() ); updateStartItem( *evt ); + updateSizesAfterLayerSwitch( frame->GetActiveLayer(), m_startSnapPoint ); } else if( evt->IsKeyPressed() ) { diff --git a/pcbnew/router/router_tool.h b/pcbnew/router/router_tool.h index bfc01836ad..63d4026dfa 100644 --- a/pcbnew/router/router_tool.h +++ b/pcbnew/router/router_tool.h @@ -79,7 +79,7 @@ private: int getStartLayer( const PNS::ITEM* aItem ); void switchLayerOnViaPlacement(); - void updateSizesAfterLayerSwitch( PCB_LAYER_ID targetLayer ); + void updateSizesAfterLayerSwitch( PCB_LAYER_ID targetLayer, const VECTOR2I& aPos ); bool getNearestRatnestAnchor( VECTOR2I& aPoint, LAYER_RANGE& aLayers ); int onLayerCommand( const TOOL_EVENT& aEvent );