From 912657dd238ad78cfc5d9d5e426ea850d5554fb3 Mon Sep 17 00:00:00 2001 From: Jon Evans Date: Tue, 22 Dec 2020 22:43:44 -0500 Subject: [PATCH] Component dragger: make relaxed segment pickup work for PTH pads --- pcbnew/router/pns_component_dragger.cpp | 21 ++++++++++----------- pcbnew/router/pns_node.cpp | 6 +++--- pcbnew/router/pns_node.h | 4 ++-- pcbnew/router/pns_optimizer.cpp | 2 +- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/pcbnew/router/pns_component_dragger.cpp b/pcbnew/router/pns_component_dragger.cpp index 621d369db8..3aa81b9208 100644 --- a/pcbnew/router/pns_component_dragger.cpp +++ b/pcbnew/router/pns_component_dragger.cpp @@ -91,18 +91,17 @@ bool COMPONENT_DRAGGER::Start( const VECTOR2I& aP, ITEM_SET& aPrimitives ) std::vector extraJoints; - if( m_world->QueryJoints( solid->Hull().BBox(), extraJoints, solid->Layer(), - ITEM::SEGMENT_T | ITEM::ARC_T ) ) - { - for( JOINT* extraJoint : extraJoints ) - { - if( extraJoint->Net() == jt->Net() && extraJoint->LinkCount() == 1 ) - { - LINKED_ITEM* li = static_cast( extraJoint->LinkList()[0].item ); + m_world->QueryJoints( solid->Hull().BBox(), extraJoints, solid->Layers(), + ITEM::SEGMENT_T | ITEM::ARC_T ); - if( li->Collide( solid, 0, false, nullptr, nullptr, false ) ) - addLinked( solid, li, extraJoint->Pos() - solid->Pos() ); - } + for( JOINT* extraJoint : extraJoints ) + { + if( extraJoint->Net() == jt->Net() && extraJoint->LinkCount() == 1 ) + { + LINKED_ITEM* li = static_cast( extraJoint->LinkList()[0].item ); + + if( li->Collide( solid, 0, false, nullptr, nullptr, false ) ) + addLinked( solid, li, extraJoint->Pos() - solid->Pos() ); } } } diff --git a/pcbnew/router/pns_node.cpp b/pcbnew/router/pns_node.cpp index bd467a934a..6871b68dfc 100644 --- a/pcbnew/router/pns_node.cpp +++ b/pcbnew/router/pns_node.cpp @@ -1417,7 +1417,7 @@ ARC* NODE::findRedundantArc( ARC* aArc ) } -int NODE::QueryJoints( const BOX2I& aBox, std::vector& aJoints, int aLayerMask, +int NODE::QueryJoints( const BOX2I& aBox, std::vector& aJoints, LAYER_RANGE aLayerMask, int aKindMask ) { int n = 0; @@ -1426,7 +1426,7 @@ int NODE::QueryJoints( const BOX2I& aBox, std::vector& aJoints, int aLay for( JOINT_MAP::value_type& j : m_joints ) { - if( j.second.Layer() != aLayerMask ) + if( !j.second.Layers().Overlaps( aLayerMask ) ) continue; if( aBox.Contains( j.second.Pos() ) && j.second.LinkCount( aKindMask ) ) @@ -1441,7 +1441,7 @@ int NODE::QueryJoints( const BOX2I& aBox, std::vector& aJoints, int aLay for( JOINT_MAP::value_type& j : m_root->m_joints ) { - if( !Overrides( &j.second ) && j.second.Layer() == aLayerMask ) + if( !Overrides( &j.second ) && j.second.Layers().Overlaps( aLayerMask ) ) { if( aBox.Contains( j.second.Pos() ) && j.second.LinkCount( aKindMask ) ) { diff --git a/pcbnew/router/pns_node.h b/pcbnew/router/pns_node.h index d476b371a4..07624670e1 100644 --- a/pcbnew/router/pns_node.h +++ b/pcbnew/router/pns_node.h @@ -233,8 +233,8 @@ public: int QueryJoints( const BOX2I& aBox, std::vector& aJoints, - int aLayerMask = -1, - int aKindMask = ITEM::ANY_T); + LAYER_RANGE aLayerMask = LAYER_RANGE::All(), + int aKindMask = ITEM::ANY_T ); int QueryColliding( const ITEM* aItem, OBSTACLE_VISITOR& aVisitor ); diff --git a/pcbnew/router/pns_optimizer.cpp b/pcbnew/router/pns_optimizer.cpp index cc4cc80d91..67e1ce3dea 100644 --- a/pcbnew/router/pns_optimizer.cpp +++ b/pcbnew/router/pns_optimizer.cpp @@ -404,7 +404,7 @@ bool KEEP_TOPOLOGY_CONSTRAINT::Check( int aVertex1, int aVertex2, const LINE* aO auto bb = encPoly.BBox(); std::vector joints; - int cnt = m_world->QueryJoints( bb, joints, aOriginLine->Layers().Start(), ITEM::SOLID_T ); + int cnt = m_world->QueryJoints( bb, joints, aOriginLine->Layers(), ITEM::SOLID_T ); if( !cnt ) return true;