mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 02:03:12 +02:00
router: fix updating of leader segments set in MULTI_DRAGGER
This commit is contained in:
parent
728e185b81
commit
0f75dcb5ed
@ -277,7 +277,7 @@ PNS::DRAG_MODE MULTI_DRAGGER::Mode() const
|
||||
|
||||
bool clipToOtherLine( NODE* aNode, const LINE& aRef, LINE& aClipped )
|
||||
{
|
||||
std::vector<OBSTACLE> obstacles;
|
||||
std::set<OBSTACLE> 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<MDRAG_LINE>& aCompletedLi
|
||||
{
|
||||
if( m_dragMode == DM_CORNER )
|
||||
{
|
||||
m_leaderSegments.push_back(
|
||||
if( l.draggedLine.LinkCount() > 0 )
|
||||
{
|
||||
m_leaderSegments.push_back(
|
||||
static_cast<PNS::ITEM*>( l.draggedLine.GetLink( -1 ) ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -473,7 +476,7 @@ bool MULTI_DRAGGER::multidragWalkaround( std::vector<MDRAG_LINE>& 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<MDRAG_LINE>& 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<MDRAG_LINE>& 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<MDRAG_LINE>& 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") );
|
||||
|
@ -159,7 +159,7 @@ private:
|
||||
bool multidragWalkaround ( std::vector<MDRAG_LINE>& aCompletedLines );
|
||||
void restoreLeaderSegments( std::vector<MDRAG_LINE>& 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
|
||||
#endif
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user