Loading pcbnew/router/pns_node.cpp +23 −11 Original line number Diff line number Diff line Loading @@ -715,25 +715,34 @@ void PNS_NODE::Remove( PNS_ITEM* aItem ) void PNS_NODE::followLine( PNS_SEGMENT* aCurrent, bool aScanDirection, int& aPos, int aLimit, VECTOR2I* aCorners, PNS_SEGMENT** aSegments ) int aLimit, VECTOR2I* aCorners, PNS_SEGMENT** aSegments, bool& aGuardHit ) { bool prevReversed = false; for( ; ; ) const VECTOR2I guard = aScanDirection ? aCurrent->Seg().B : aCurrent->Seg().A; for( int count = 0 ; ; ++count ) { const VECTOR2I p = ( aScanDirection ^ prevReversed ) ? aCurrent->Seg().B : aCurrent->Seg().A; const PNS_JOINT* jt = FindJoint( p, aCurrent ); assert( jt ); assert( aPos > 0 && aPos < aLimit ); aCorners[aPos] = jt->Pos(); if( count && guard == p ) { aSegments[aPos] = NULL; aGuardHit = true; break; } aSegments[aPos] = aCurrent; aPos += ( aScanDirection ? 1 : -1 ); if( !jt->IsLineCorner() ) if( !jt->IsLineCorner() || aPos < 0 || aPos == aLimit ) break; aCurrent = jt->NextSegment( aCurrent ); Loading @@ -752,6 +761,8 @@ PNS_LINE* PNS_NODE::AssembleLine( PNS_SEGMENT* aSeg, int* aOriginSegmentIndex) PNS_SEGMENT* segs[MaxVerts + 1]; PNS_LINE* pl = new PNS_LINE; bool guardHit = false; int i_start = MaxVerts / 2, i_end = i_start + 1; pl->SetWidth( aSeg->Width() ); Loading @@ -759,8 +770,10 @@ PNS_LINE* PNS_NODE::AssembleLine( PNS_SEGMENT* aSeg, int* aOriginSegmentIndex) pl->SetNet( aSeg->Net() ); pl->SetOwner( this ); followLine( aSeg, false, i_start, MaxVerts, corners, segs ); followLine( aSeg, true, i_end, MaxVerts, corners, segs ); followLine( aSeg, false, i_start, MaxVerts, corners, segs, guardHit ); if( !guardHit ) followLine( aSeg, true, i_end, MaxVerts, corners, segs, guardHit ); int n = 0; Loading @@ -772,7 +785,7 @@ PNS_LINE* PNS_NODE::AssembleLine( PNS_SEGMENT* aSeg, int* aOriginSegmentIndex) pl->Line().Append( p ); if( prev_seg != segs[i] ) if( segs[i] && prev_seg != segs[i] ) { pl->LinkSegment( segs[i] ); Loading @@ -785,7 +798,6 @@ PNS_LINE* PNS_NODE::AssembleLine( PNS_SEGMENT* aSeg, int* aOriginSegmentIndex) prev_seg = segs[i]; } assert( pl->SegmentCount() != 0 ); assert( pl->SegmentCount() == (int) pl->LinkedSegments()->size() ); Loading pcbnew/router/pns_node.h +2 −1 Original line number Diff line number Diff line Loading @@ -380,7 +380,8 @@ private: int& aPos, int aLimit, VECTOR2I* aCorners, PNS_SEGMENT** aSegments ); PNS_SEGMENT** aSegments, bool& aGuardHit ); ///> hash table with the joints, linking the items. Joints are hashed by ///> their position, layer set and net. Loading Loading
pcbnew/router/pns_node.cpp +23 −11 Original line number Diff line number Diff line Loading @@ -715,25 +715,34 @@ void PNS_NODE::Remove( PNS_ITEM* aItem ) void PNS_NODE::followLine( PNS_SEGMENT* aCurrent, bool aScanDirection, int& aPos, int aLimit, VECTOR2I* aCorners, PNS_SEGMENT** aSegments ) int aLimit, VECTOR2I* aCorners, PNS_SEGMENT** aSegments, bool& aGuardHit ) { bool prevReversed = false; for( ; ; ) const VECTOR2I guard = aScanDirection ? aCurrent->Seg().B : aCurrent->Seg().A; for( int count = 0 ; ; ++count ) { const VECTOR2I p = ( aScanDirection ^ prevReversed ) ? aCurrent->Seg().B : aCurrent->Seg().A; const PNS_JOINT* jt = FindJoint( p, aCurrent ); assert( jt ); assert( aPos > 0 && aPos < aLimit ); aCorners[aPos] = jt->Pos(); if( count && guard == p ) { aSegments[aPos] = NULL; aGuardHit = true; break; } aSegments[aPos] = aCurrent; aPos += ( aScanDirection ? 1 : -1 ); if( !jt->IsLineCorner() ) if( !jt->IsLineCorner() || aPos < 0 || aPos == aLimit ) break; aCurrent = jt->NextSegment( aCurrent ); Loading @@ -752,6 +761,8 @@ PNS_LINE* PNS_NODE::AssembleLine( PNS_SEGMENT* aSeg, int* aOriginSegmentIndex) PNS_SEGMENT* segs[MaxVerts + 1]; PNS_LINE* pl = new PNS_LINE; bool guardHit = false; int i_start = MaxVerts / 2, i_end = i_start + 1; pl->SetWidth( aSeg->Width() ); Loading @@ -759,8 +770,10 @@ PNS_LINE* PNS_NODE::AssembleLine( PNS_SEGMENT* aSeg, int* aOriginSegmentIndex) pl->SetNet( aSeg->Net() ); pl->SetOwner( this ); followLine( aSeg, false, i_start, MaxVerts, corners, segs ); followLine( aSeg, true, i_end, MaxVerts, corners, segs ); followLine( aSeg, false, i_start, MaxVerts, corners, segs, guardHit ); if( !guardHit ) followLine( aSeg, true, i_end, MaxVerts, corners, segs, guardHit ); int n = 0; Loading @@ -772,7 +785,7 @@ PNS_LINE* PNS_NODE::AssembleLine( PNS_SEGMENT* aSeg, int* aOriginSegmentIndex) pl->Line().Append( p ); if( prev_seg != segs[i] ) if( segs[i] && prev_seg != segs[i] ) { pl->LinkSegment( segs[i] ); Loading @@ -785,7 +798,6 @@ PNS_LINE* PNS_NODE::AssembleLine( PNS_SEGMENT* aSeg, int* aOriginSegmentIndex) prev_seg = segs[i]; } assert( pl->SegmentCount() != 0 ); assert( pl->SegmentCount() == (int) pl->LinkedSegments()->size() ); Loading
pcbnew/router/pns_node.h +2 −1 Original line number Diff line number Diff line Loading @@ -380,7 +380,8 @@ private: int& aPos, int aLimit, VECTOR2I* aCorners, PNS_SEGMENT** aSegments ); PNS_SEGMENT** aSegments, bool& aGuardHit ); ///> hash table with the joints, linking the items. Joints are hashed by ///> their position, layer set and net. Loading