From 0f75dcb5ed331dc5cab64cbd81d33588d899a151 Mon Sep 17 00:00:00 2001 From: Tomasz Wlostowski Date: Sat, 2 Nov 2024 18:28:09 +0100 Subject: [PATCH] router: fix updating of leader segments set in MULTI_DRAGGER --- pcbnew/router/pns_multi_dragger.cpp | 43 +++++++++++++++++++---------- pcbnew/router/pns_multi_dragger.h | 4 +-- pcbnew/router/pns_router.cpp | 2 ++ 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/pcbnew/router/pns_multi_dragger.cpp b/pcbnew/router/pns_multi_dragger.cpp index 6595f9cb1d..0608aed9b6 100644 --- a/pcbnew/router/pns_multi_dragger.cpp +++ b/pcbnew/router/pns_multi_dragger.cpp @@ -277,7 +277,7 @@ PNS::DRAG_MODE MULTI_DRAGGER::Mode() const bool clipToOtherLine( NODE* aNode, const LINE& aRef, LINE& aClipped ) { - std::vector obstacles; + std::set obstacles; COLLISION_SEARCH_CONTEXT ctx( obstacles ); constexpr int clipLengthThreshold = 100; @@ -360,7 +360,7 @@ bool MULTI_DRAGGER::FixRoute( bool aForceCommit ) return false; } -bool MULTI_DRAGGER::tryWalkaround( NODE* aNode, LINE& aOrig, LINE& aWalk, const LINE& aLeader ) +bool MULTI_DRAGGER::tryWalkaround( NODE* aNode, LINE& aOrig, LINE& aWalk ) { WALKAROUND walkaround( aNode, Router() ); bool ok = false; @@ -416,8 +416,11 @@ void MULTI_DRAGGER::restoreLeaderSegments( std::vector& aCompletedLi { if( m_dragMode == DM_CORNER ) { - m_leaderSegments.push_back( + if( l.draggedLine.LinkCount() > 0 ) + { + m_leaderSegments.push_back( static_cast( l.draggedLine.GetLink( -1 ) ) ); + } } else { @@ -473,7 +476,7 @@ bool MULTI_DRAGGER::multidragWalkaround( std::vector& aCompletedLine MDRAG_LINE& l = aCompletedLines[attempt ? aCompletedLines.size() - 1 - lidx : lidx]; LINE walk( l.draggedLine ); - auto result = tryWalkaround( node, l.draggedLine, walk, l.draggedLine ); + auto result = tryWalkaround( node, l.draggedLine, walk ); PNS_DBG( Dbg(), AddItem, &l.draggedLine, YELLOW, 100000, wxString::Format("dragged lidx=%d attempt=%d dd=%d isPrimary=%d", lidx, attempt, l.dragDist, l.isPrimaryLine?1:0) ); PNS_DBG( Dbg(), AddItem, &walk, BLUE, 100000, wxString::Format("walk lidx=%d attempt=%d", lidx, attempt) ); @@ -483,45 +486,53 @@ bool MULTI_DRAGGER::multidragWalkaround( std::vector& aCompletedLine { node->Add( walk ); totalLength[attempt] += walk.CLine().Length() - l.draggedLine.CLine().Length(); + l.draggedLine = walk; } else { delete node; tmpNodes[attempt] = nullptr; + fail = true; break; } } } + if( fail ) + return false; + + + bool rv = false; + if( tmpNodes[0] && tmpNodes[1] ) { if ( totalLength[0] < totalLength[1] ) { delete tmpNodes[1]; m_lastNode = tmpNodes[0]; - return true; + rv = true; } else { delete tmpNodes[0]; m_lastNode = tmpNodes[1]; - return true; + rv = true; } } else if ( tmpNodes[0] ) { m_lastNode = tmpNodes[0]; - return true; + rv = true; } else if ( tmpNodes[1] ) { m_lastNode = tmpNodes[1]; - return true; + rv = true; } restoreLeaderSegments( aCompletedLines ); - return false; + return rv; } @@ -558,6 +569,12 @@ bool MULTI_DRAGGER::multidragMarkObstacles( std::vector& aCompletedL } } + for ( auto&l : aCompletedLines ) + { + m_lastNode->Remove( l.originalLine ); + m_lastNode->Add( l.draggedLine ); + } + restoreLeaderSegments( aCompletedLines ); return true; @@ -624,7 +641,6 @@ bool MULTI_DRAGGER::multidragShove( std::vector& aCompletedLines ) } else { - //delete preShoveNode; return false; } @@ -788,14 +804,14 @@ bool MULTI_DRAGGER::Drag( const VECTOR2I& aP ) //PNS_DBG( Dbg(), AddPoint, projected, LIGHTYELLOW, 600000, // wxT( "l-end" ) ); + l.dragOK = true; + if( !l.isPrimaryLine ) { l.draggedLine = parallelDragged; completed.push_back( l ); m_draggedItems.Add( parallelDragged ); } - - l.dragOK = true; } } else if ( m_dragMode == DM_SEGMENT ) @@ -828,7 +844,7 @@ bool MULTI_DRAGGER::Drag( const VECTOR2I& aP ) PNS_DBG( Dbg(), AddShape, &ll2, LIGHTBLUE, 100000, "sdrag" ); VECTOR2I v = projected - startProj; l.dragDist = v.EuclideanNorm() * sign( v.Dot( perp ) ); - + l.dragOK = true; if(!l.isPrimaryLine) { @@ -840,7 +856,6 @@ bool MULTI_DRAGGER::Drag( const VECTOR2I& aP ) completed.push_back( l ); PNS_DBG( Dbg(), AddItem, &l.draggedLine, LIGHTBLUE, 100000, "dragged" ); } - l.dragOK = true; PNS_DBG( Dbg(), AddPoint, startProj, LIGHTBLUE, 400000, wxT("startProj") ); diff --git a/pcbnew/router/pns_multi_dragger.h b/pcbnew/router/pns_multi_dragger.h index e576447816..861676c184 100644 --- a/pcbnew/router/pns_multi_dragger.h +++ b/pcbnew/router/pns_multi_dragger.h @@ -159,7 +159,7 @@ private: bool multidragWalkaround ( std::vector& aCompletedLines ); void restoreLeaderSegments( std::vector& aCompletedLines ); int findNewLeaderSegment( const MDRAG_LINE& aLine ) const; - bool tryWalkaround( NODE* aNode, LINE& aOrig, LINE& aWalk, const LINE& aLeader ); + bool tryWalkaround( NODE* aNode, LINE& aOrig, LINE& aWalk ); int m_mode; @@ -180,4 +180,4 @@ private: } -#endif \ No newline at end of file +#endif diff --git a/pcbnew/router/pns_router.cpp b/pcbnew/router/pns_router.cpp index 4a737439e8..bff4406ca7 100644 --- a/pcbnew/router/pns_router.cpp +++ b/pcbnew/router/pns_router.cpp @@ -635,6 +635,8 @@ bool ROUTER::moveDragging( const VECTOR2I& aP, ITEM* aEndItem ) bool ret = m_dragger->Drag( aP ); ITEM_SET dragged = m_dragger->Traces(); + m_leaderSegments = m_dragger->GetLastCommittedLeaderSegments(); + updateView( m_dragger->CurrentNode(), dragged, true ); return ret; }