bool PNS_DIFF_PAIR::BuildInitial( PNS_DP_GATEWAY& aEntry, PNS_DP_GATEWAY &aTarget, bool aPrefDiagonal ) { SHAPE_LINE_CHAIN p = DIRECTION_45().BuildInitialTrace ( aEntry.AnchorP(), aTarget.AnchorP(), aPrefDiagonal ); SHAPE_LINE_CHAIN n = DIRECTION_45().BuildInitialTrace ( aEntry.AnchorN(), aTarget.AnchorN(), aPrefDiagonal ); int mask = aEntry.AllowedAngles() | DIRECTION_45::ANG_STRAIGHT | DIRECTION_45::ANG_OBTUSE; SHAPE_LINE_CHAIN sum_n, sum_p; m_p = p; m_n = n; if( aEntry.HasEntryLines() ) { if( !aEntry.Entry().CheckConnectionAngle( *this, mask ) ) return false; sum_p = aEntry.Entry().CP(); sum_n = aEntry.Entry().CN(); sum_p.Append( p ); sum_n.Append( n ); } else { sum_p = p; sum_n = n; } mask = aTarget.AllowedAngles() | DIRECTION_45::ANG_STRAIGHT | DIRECTION_45::ANG_OBTUSE; m_p = sum_p; m_n = sum_n; if( aTarget.HasEntryLines() ) { PNS_DP_GATEWAY t(aTarget) ; t.Reverse(); if( !CheckConnectionAngle( t.Entry(), mask ) ) return false; sum_p.Append( t.Entry().CP() ); sum_n.Append( t.Entry().CN() ); } m_p = sum_p; m_n = sum_n; if( !checkGap ( p, n, m_gapConstraint ) ) return false; if( p.SelfIntersecting() || n.SelfIntersecting() ) return false; if( p.Intersects( n ) ) return false; return true; }