KiCad PCB EDA Suite
PNS::LINE Class Reference

#include <pns_line.h>

Inheritance diagram for PNS::LINE:
PNS::ITEM

Public Types

typedef std::vector< SEGMENT * > SEGMENT_REFS
 
enum  PnsKind {
  SOLID_T = 1, LINE_T = 2, JOINT_T = 4, SEGMENT_T = 8,
  VIA_T = 16, DIFF_PAIR_T = 32, ANY_T = 0xff
}
 

Supported item types

More...
 

Public Member Functions

 LINE ()
 Constructor Makes an empty line. More...
 
 LINE (const LINE &aOther)
 
 LINE (const LINE &aBase, const SHAPE_LINE_CHAIN &aLine)
 Constructor Copies properties (net, layers, etc.) from a base line and replaces the shape by another. More...
 
 ~LINE ()
 
virtual LINEClone () const override
 Function Clone() More...
 
LINEoperator= (const LINE &aOther)
 
void SetShape (const SHAPE_LINE_CHAIN &aLine)
 

Assigns a shape to the line (a polyline/line chain)

More...
 
const SHAPEShape () const override
 

Returns the shape of the line

More...
 
SHAPE_LINE_CHAINLine ()
 

Modifiable accessor to the underlying shape

More...
 
const SHAPE_LINE_CHAINCLine () const
 

Const accessor to the underlying shape

More...
 
int SegmentCount () const
 

Returns the number of segments in the line

More...
 
int PointCount () const
 

Returns the number of points in the line

More...
 
const VECTOR2ICPoint (int aIdx) const
 

Returns the aIdx-th point of the line

More...
 
const SEG CSegment (int aIdx) const
 

Returns the aIdx-th segment of the line

More...
 
void SetWidth (int aWidth)
 

Sets line width

More...
 
int Width () const
 

Returns line width

More...
 
bool CompareGeometry (const LINE &aOther)
 

Returns true if the line is geometrically identical as line aOther

More...
 
void Reverse ()
 

Reverses the point/vertex order

More...
 
void LinkSegment (SEGMENT *aSeg)
 

Adds a reference to a segment registered in a NODE that is a part of this line.

More...
 
SEGMENT_REFSLinkedSegments ()
 

Returns the list of segments from the owning node that constitute this line (or NULL if the line is not linked)

More...
 
bool IsLinked () const
 
bool IsLinkedChecked () const
 
bool ContainsSegment (SEGMENT *aSeg) const
 

Checks if the segment aSeg is a part of the line.

More...
 
SEGMENTGetLink (int aIndex) const
 
void ClearSegmentLinks ()
 

Erases the linking information. Used to detach the line from the owning node.

More...
 
int LinkCount () const
 

Returns the number of segments that were assembled together to form this line.

More...
 
const LINE ClipToNearestObstacle (NODE *aNode) const
 

Clips the line to the nearest obstacle, traversing from the line's start vertex (0).

More...
 
void ClipVertexRange (int aStart, int aEnd)
 

Clips the line to a given range of vertices.

More...
 
int CountCorners (int aAngles) const
 

Returns the number of corners of angles specified by mask aAngles.

More...
 
bool Walkaround (SHAPE_LINE_CHAIN aObstacle, SHAPE_LINE_CHAIN &aPre, SHAPE_LINE_CHAIN &aWalk, SHAPE_LINE_CHAIN &aPost, bool aCw) const
 

Calculates a line thightly wrapping a convex hull of an obstacle object (aObstacle).

More...
 
bool Walkaround (const SHAPE_LINE_CHAIN &aObstacle, SHAPE_LINE_CHAIN &aPath, bool aCw) const
 
bool Is45Degree () const
 
void ShowLinks () const
 

Prints out all linked segments

More...
 
bool EndsWithVia () const
 
void AppendVia (const VIA &aVia)
 
void RemoveVia ()
 
const VIAVia () const
 
virtual void Mark (int aMarker) override
 
virtual void Unmark (int aMarker=-1) override
 
virtual int Marker () const override
 
void DragSegment (const VECTOR2I &aP, int aIndex, int aSnappingThreshold=0, bool aFreeAngle=false)
 
void DragCorner (const VECTOR2I &aP, int aIndex, int aSnappingThreshold=0, bool aFreeAngle=false)
 
void SetRank (int aRank) override
 
int Rank () const override
 
bool HasLoops () const
 
bool HasLockedSegments () const
 
OPT_BOX2I ChangedArea (const LINE *aOther) const
 
virtual const SHAPE_LINE_CHAIN Hull (int aClearance=0, int aWalkaroundThickness=0) const
 
PnsKind Kind () const
 Function Kind() More...
 
bool OfKind (int aKindMask) const
 Function OfKind() More...
 
const std::string KindStr () const
 Function KindStr() More...
 
void SetParent (BOARD_CONNECTED_ITEM *aParent)
 Function SetParent() More...
 
BOARD_CONNECTED_ITEMParent () const
 Function Parent() More...
 
void SetNet (int aNet)
 Function SetNet() More...
 
int Net () const
 Function Net() More...
 
void SetLayers (const LAYER_RANGE &aLayers)
 Function SetLayers() More...
 
void SetLayer (int aLayer)
 Function SetLayer() More...
 
const LAYER_RANGELayers () const
 Function Layers() More...
 
virtual int Layer () const
 Function Layer() More...
 
bool LayersOverlap (const ITEM *aOther) const
 Function LayersOverlap() More...
 
void SetOwner (NODE *aOwner)
 Functon SetOwner() More...
 
bool BelongsTo (NODE *aNode) const
 Function BelongsTo() More...
 
NODEOwner () const
 Function Owner() More...
 
virtual bool Collide (const ITEM *aOther, int aClearance, bool aNeedMTV, VECTOR2I &aMTV, bool aDifferentNetsOnly=true) const
 Function Collide() More...
 
bool Collide (const ITEM *aOther, int aClearance, bool aDifferentNetsOnly=true) const
 Function Collide() More...
 
virtual VECTOR2I Anchor (int n) const
 
virtual int AnchorCount () const
 
bool IsLocked () const
 
void SetRoutable (bool aRoutable)
 
bool IsRoutable () const
 

Static Public Member Functions

static bool ClassOf (const ITEM *aItem)
 

Static Public Attributes

static const int UnusedNet = INT_MAX
 

Protected Attributes

PnsKind m_kind
 
BOARD_CONNECTED_ITEMm_parent
 
NODEm_owner
 
LAYER_RANGE m_layers
 
bool m_movable
 
int m_net
 
int m_marker
 
int m_rank
 
bool m_routable
 

Private Member Functions

void dragSegment45 (const VECTOR2I &aP, int aIndex, int aSnappingThreshold)
 
void dragCorner45 (const VECTOR2I &aP, int aIndex, int aSnappingThreshold)
 
void dragSegmentFree (const VECTOR2I &aP, int aIndex, int aSnappingThreshold)
 
void dragCornerFree (const VECTOR2I &aP, int aIndex, int aSnappingThreshold)
 
VECTOR2I snapToNeighbourSegments (const SHAPE_LINE_CHAIN &aPath, const VECTOR2I &aP, int aIndex, int aThreshold) const
 
VECTOR2I snapDraggedCorner (const SHAPE_LINE_CHAIN &aPath, const VECTOR2I &aP, int aIndex, int aThreshold) const
 
void copyLinks (const LINE *aParent)
 

Copies m_segmentRefs from the line aParent.

More...
 

Private Attributes

SEGMENT_REFS m_segmentRefs
 

List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is not a part of any node.

More...
 
SHAPE_LINE_CHAIN m_line
 

The actual shape of the line

More...
 
int m_width
 

our width

More...
 
bool m_hasVia
 

If true, the line ends with a via

More...
 
VIA m_via
 

Via at the end point, if m_hasVia == true

More...
 

Detailed Description

Definition at line 60 of file pns_line.h.

Member Typedef Documentation

typedef std::vector<SEGMENT*> PNS::LINE::SEGMENT_REFS

Definition at line 63 of file pns_line.h.

Member Enumeration Documentation

enum PNS::ITEM::PnsKind
inherited

Supported item types

Enumerator
SOLID_T 
LINE_T 
JOINT_T 
SEGMENT_T 
VIA_T 
DIFF_PAIR_T 
ANY_T 

Definition at line 59 of file pns_item.h.

60  {
61  SOLID_T = 1,
62  LINE_T = 2,
63  JOINT_T = 4,
64  SEGMENT_T = 8,
65  VIA_T = 16,
66  DIFF_PAIR_T = 32,
67  ANY_T = 0xff
68  };

Constructor & Destructor Documentation

PNS::LINE::LINE ( )
inline

Constructor Makes an empty line.

Definition at line 69 of file pns_line.h.

References m_hasVia, and m_width.

Referenced by Clone().

69  : ITEM( LINE_T )
70  {
71  m_hasVia = false;
72  m_width = 1; // Dummy value
73  }
ITEM(PnsKind aKind)
Definition: pns_item.h:70
bool m_hasVia
If true, the line ends with a via
Definition: pns_line.h:297
int m_width
our width
Definition: pns_line.h:294
PNS::LINE::LINE ( const LINE aOther)

Definition at line 36 of file pns_line.cpp.

References copyLinks(), m_hasVia, PNS::ITEM::m_layers, PNS::ITEM::m_marker, PNS::ITEM::m_movable, PNS::ITEM::m_net, PNS::ITEM::m_rank, and m_via.

36  :
37  ITEM( aOther ),
38  m_line( aOther.m_line ),
39  m_width( aOther.m_width )
40 {
41  m_net = aOther.m_net;
42  m_movable = aOther.m_movable;
43  m_layers = aOther.m_layers;
44  m_via = aOther.m_via;
45  m_hasVia = aOther.m_hasVia;
46  m_marker = aOther.m_marker;
47  m_rank = aOther.m_rank;
48 
49  copyLinks( &aOther );
50 }
VIA m_via
Via at the end point, if m_hasVia == true
Definition: pns_line.h:300
LAYER_RANGE m_layers
Definition: pns_item.h:362
int m_rank
Definition: pns_item.h:367
bool m_movable
Definition: pns_item.h:364
ITEM(PnsKind aKind)
Definition: pns_item.h:70
int m_marker
Definition: pns_item.h:366
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
void copyLinks(const LINE *aParent)
Copies m_segmentRefs from the line aParent.
Definition: pns_line.cpp:116
bool m_hasVia
If true, the line ends with a via
Definition: pns_line.h:297
int m_net
Definition: pns_item.h:365
int m_width
our width
Definition: pns_line.h:294
PNS::LINE::LINE ( const LINE aBase,
const SHAPE_LINE_CHAIN aLine 
)
inline

Constructor Copies properties (net, layers, etc.) from a base line and replaces the shape by another.

Definition at line 82 of file pns_line.h.

References m_hasVia, PNS::ITEM::m_layers, PNS::ITEM::m_net, and ~LINE().

82  :
83  ITEM( aBase ),
84  m_line( aLine ),
85  m_width( aBase.m_width )
86  {
87  m_net = aBase.m_net;
88  m_layers = aBase.m_layers;
89  m_hasVia = false;
90  }
LAYER_RANGE m_layers
Definition: pns_item.h:362
ITEM(PnsKind aKind)
Definition: pns_item.h:70
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
bool m_hasVia
If true, the line ends with a via
Definition: pns_line.h:297
int m_net
Definition: pns_item.h:365
int m_width
our width
Definition: pns_line.h:294
PNS::LINE::~LINE ( )

Definition at line 53 of file pns_line.cpp.

Referenced by LINE().

54 {
55 }

Member Function Documentation

virtual VECTOR2I PNS::ITEM::Anchor ( int  n) const
inlinevirtualinherited

Reimplemented in PNS::VIA, PNS::SEGMENT, and PNS::SOLID.

Definition at line 328 of file pns_item.h.

Referenced by PNS::DP_PRIMITIVE_PAIR::CursorOrientation(), PNS::DP_PRIMITIVE_PAIR::DP_PRIMITIVE_PAIR(), and PNS::DIFF_PAIR_PLACER::getDanglingAnchor().

329  {
330  return VECTOR2I();
331  }
VECTOR2< int > VECTOR2I
Definition: vector2d.h:587
virtual int PNS::ITEM::AnchorCount ( ) const
inlinevirtualinherited

Reimplemented in PNS::VIA, PNS::SEGMENT, and PNS::SOLID.

Definition at line 333 of file pns_item.h.

334  {
335  return 0;
336  }
void PNS::LINE::AppendVia ( const VIA aVia)

Definition at line 750 of file pns_line.cpp.

References SHAPE_LINE_CHAIN::CPoint(), m_hasVia, m_line, PNS::ITEM::m_net, m_via, SHAPE_LINE_CHAIN::PointCount(), PNS::VIA::Pos(), Reverse(), and PNS::ITEM::SetNet().

Referenced by PNS::LINE_PLACER::buildInitialLine(), EndsWithVia(), PNS::SHOVE::onReverseCollidingVia(), PNS::LINE_PLACER::rhShoveOnly(), PNS::LINE_PLACER::rhWalkOnly(), and PNS::DIFF_PAIR::updateLine().

751 {
752  if( m_line.PointCount() > 1 && aVia.Pos() == m_line.CPoint( 0 ) )
753  {
754  Reverse();
755  }
756 
757  m_hasVia = true;
758  m_via = aVia;
759  m_via.SetNet( m_net );
760 }
VIA m_via
Via at the end point, if m_hasVia == true
Definition: pns_line.h:300
int PointCount() const
Function PointCount()
void SetNet(int aNet)
Function SetNet()
Definition: pns_item.h:169
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
void Reverse()
Reverses the point/vertex order
Definition: pns_line.cpp:742
bool m_hasVia
If true, the line ends with a via
Definition: pns_line.h:297
int m_net
Definition: pns_item.h:365
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
bool PNS::ITEM::BelongsTo ( NODE aNode) const
inlineinherited

Function BelongsTo()

Returns
true if the item is owned by the node aNode.

Definition at line 251 of file pns_item.h.

References PNS::ITEM::m_owner.

Referenced by PNS::NODE::doRemove().

252  {
253  return m_owner == aNode;
254  }
NODE * m_owner
Definition: pns_item.h:361
OPT_BOX2I PNS::LINE::ChangedArea ( const LINE aOther) const

Definition at line 847 of file pns_line.cpp.

References SEG::Contains(), CPoint(), SHAPE_LINE_CHAIN::CPoint(), PNS::extendBox(), i, BOX2< Vec >::Inflate(), m_line, max, min, SHAPE_LINE_CHAIN::PointCount(), SHAPE_LINE_CHAIN::Simplify(), and Width().

Referenced by PNS::ChangedArea(), and Via().

848 {
849  BOX2I area;
850  bool areaDefined = false;
851 
852  int i_start = -1;
853  int i_end_self = -1, i_end_other = -1;
854 
855  SHAPE_LINE_CHAIN self( m_line );
856  self.Simplify();
857  SHAPE_LINE_CHAIN other( aOther->m_line );
858  other.Simplify();
859 
860  int np_self = self.PointCount();
861  int np_other = other.PointCount();
862 
863  int n = std::min( np_self, np_other );
864 
865  for( int i = 0; i < n; i++ )
866  {
867  const VECTOR2I p1 = self.CPoint( i );
868  const VECTOR2I p2 = other.CPoint( i );
869 
870  if( p1 != p2 )
871  {
872  if( i != n - 1 )
873  {
874  SEG s = self.CSegment( i );
875 
876  if( !s.Contains( p2 ) )
877  {
878  i_start = i;
879  break;
880  }
881  }
882  else
883  {
884  i_start = i;
885  break;
886  }
887  }
888  }
889 
890  for( int i = 0; i < n; i++ )
891  {
892  const VECTOR2I p1 = self.CPoint( np_self - 1 - i );
893  const VECTOR2I p2 = other.CPoint( np_other - 1 - i );
894 
895  if( p1 != p2 )
896  {
897  i_end_self = np_self - 1 - i;
898  i_end_other = np_other - 1 - i;
899  break;
900  }
901  }
902 
903  if( i_start < 0 )
904  i_start = n;
905 
906  if( i_end_self < 0 )
907  i_end_self = np_self - 1;
908 
909  if( i_end_other < 0 )
910  i_end_other = np_other - 1;
911 
912  for( int i = i_start; i <= i_end_self; i++ )
913  extendBox( area, areaDefined, self.CPoint( i ) );
914 
915  for( int i = i_start; i <= i_end_other; i++ )
916  extendBox( area, areaDefined, other.CPoint( i ) );
917 
918  if( areaDefined )
919  {
920  area.Inflate( std::max( Width(), aOther->Width() ) );
921  return area;
922  }
923 
924  return OPT_BOX2I();
925 }
int Width() const
Returns line width
Definition: pns_line.h:159
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
SHAPE_LINE_CHAIN & Simplify()
Function Simplify()
Definition: seg.h:36
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:300
#define max(a, b)
Definition: auxiliary.h:86
Class SHAPE_LINE_CHAIN.
static void extendBox(BOX2I &aBox, bool &aDefined, const VECTOR2I &aP)
Definition: pns_line.cpp:833
size_t i
Definition: json11.cpp:597
OPT< BOX2I > OPT_BOX2I
Definition: box2.h:523
bool Contains(const VECTOR2I &aP) const
Definition: seg.cpp:188
#define min(a, b)
Definition: auxiliary.h:85
const VECTOR2I & CPoint(int aIdx) const
Returns the aIdx-th point of the line
Definition: pns_line.h:141
static bool PNS::LINE::ClassOf ( const ITEM aItem)
inlinestatic

Definition at line 94 of file pns_line.h.

References Clone(), PNS::ITEM::Kind(), PNS::ITEM::LINE_T, and operator=().

95  {
96  return aItem && LINE_T == aItem->Kind();
97  }
void PNS::LINE::ClearSegmentLinks ( )

Erases the linking information. Used to detach the line from the owning node.

Definition at line 827 of file pns_line.cpp.

References m_segmentRefs.

Referenced by PNS::DRAGGER::dragMarkObstacles(), PNS::DRAGGER::dragShove(), PNS::DRAGGER::dumbDragVia(), GetLink(), PNS::SHOVE::onCollidingSolid(), PNS::SHOVE::onReverseCollidingVia(), PNS::SHOVE::ProcessSingleLine(), PNS::NODE::Remove(), PNS::SHOVE::ShoveLines(), PNS::SHOVE::ShoveMultiLines(), and PNS::DRAGGER::startDragSegment().

828 {
829  m_segmentRefs.clear();
830 }
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
const LINE PNS::LINE::ClipToNearestObstacle ( NODE aNode) const

Clips the line to the nearest obstacle, traversing from the line's start vertex (0).

Returns the clipped line.

Definition at line 302 of file pns_line.cpp.

References SHAPE_LINE_CHAIN::Clear(), i, Line(), PNS::NODE::NearestObstacle(), SHAPE_LINE_CHAIN::Remove(), RemoveVia(), and SHAPE_LINE_CHAIN::Split().

Referenced by LinkCount(), PNS::LINE_PLACER::rhShoveOnly(), PNS::LINE_PLACER::rhWalkOnly(), and PNS::WALKAROUND::singleStep().

303 {
304  const int IterationLimit = 5;
305  int i;
306  LINE l( *this );
307 
308  for( i = 0; i < IterationLimit; i++ )
309  {
310  NODE::OPT_OBSTACLE obs = aNode->NearestObstacle( &l );
311 
312  if( obs )
313  {
314  l.RemoveVia();
315  int p = l.Line().Split( obs->m_ipFirst );
316  l.Line().Remove( p + 1, -1 );
317  } else
318  break;
319  }
320 
321  if( i == IterationLimit )
322  l.Line().Clear();
323 
324  return l;
325 }
LINE()
Constructor Makes an empty line.
Definition: pns_line.h:69
size_t i
Definition: json11.cpp:597
OPT< OBSTACLE > OPT_OBSTACLE
Definition: pns_node.h:139
void PNS::LINE::ClipVertexRange ( int  aStart,
int  aEnd 
)

Clips the line to a given range of vertices.

Definition at line 792 of file pns_line.cpp.

References IsLinked(), m_line, m_segmentRefs, and SHAPE_LINE_CHAIN::Slice().

Referenced by PNS::NODE::FindLinesBetweenJoints(), and LinkCount().

793 {
794  m_line = m_line.Slice( aStart, aEnd );
795 
796  if( IsLinked() ) {
797  assert( m_segmentRefs.size() < INT_MAX );
798  assert( (int) m_segmentRefs.size() >= (aEnd - aStart) );
799 
800  // Note: The range includes aEnd, but we have n-1 segments.
801  std::rotate(
802  m_segmentRefs.begin(),
803  m_segmentRefs.begin() + aStart,
804  m_segmentRefs.begin() + aEnd
805  );
806 
807  m_segmentRefs.resize( aEnd - aStart );
808  }
809 }
const SHAPE_LINE_CHAIN Slice(int aStartIndex, int aEndIndex=-1) const
Function Slice()
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
bool IsLinked() const
Definition: pns_line.h:186
LINE * PNS::LINE::Clone ( ) const
overridevirtual

Function Clone()

Returns a deep copy of the item

Implements PNS::ITEM.

Definition at line 76 of file pns_line.cpp.

References LINE().

Referenced by PNS::ITEM_SET::Add(), ClassOf(), and PNS::ITEM_SET::Prepend().

77 {
78  LINE* l = new LINE( *this );
79 
80  return l;
81 }
LINE()
Constructor Makes an empty line.
Definition: pns_line.h:69
bool PNS::ITEM::Collide ( const ITEM aOther,
int  aClearance,
bool  aNeedMTV,
VECTOR2I aMTV,
bool  aDifferentNetsOnly = true 
) const
virtualinherited

Function Collide()

Checks for a collision (clearance violation) with between us and item aOther. Collision checking takes all PCB stuff into accound (layers, nets, DRC rules). Optionally returns a minimum translation vector for force propagation algorithm.

Parameters
aOtheritem to check collision against
aClearancedesired clearance
aNeedMTVwhen true, the minimum translation vector is calculated
aMTVthe minimum translation vector
Returns
true, if a collision was found.

Definition at line 44 of file pns_item.cpp.

References PNS::ITEM::collideSimple(), EndsWithVia(), PNS::ITEM::LINE_T, PNS::ITEM::m_kind, Via(), and Width().

Referenced by PNS::NODE::CheckColliding(), PNS::ITEM::Collide(), PNS::OPTIMIZER::CACHE_VISITOR::operator()(), PNS::NODE::DEFAULT_OBSTACLE_VISITOR::operator()(), and PNS::ITEM::Owner().

46 {
47  if( collideSimple( aOther, aClearance, aNeedMTV, aMTV, aDifferentNetsOnly ) )
48  return true;
49 
50  // special case for "head" line with a via attached at the end.
51  if( aOther->m_kind == LINE_T )
52  {
53  const LINE* line = static_cast<const LINE*>( aOther );
54 
55  if( line->EndsWithVia() )
56  return collideSimple( &line->Via(), aClearance - line->Width() / 2, aNeedMTV, aMTV, aDifferentNetsOnly );
57  }
58 
59  return false;
60 }
bool collideSimple(const ITEM *aOther, int aClearance, bool aNeedMTV, VECTOR2I &aMTV, bool aDifferentNetsOnly) const
Definition: pns_item.cpp:27
bool PNS::ITEM::Collide ( const ITEM aOther,
int  aClearance,
bool  aDifferentNetsOnly = true 
) const
inlineinherited

Function Collide()

A shortcut for ITEM::Colllide() without MTV stuff.

Definition at line 285 of file pns_item.h.

References PNS::ITEM::Collide(), and dummy().

286  {
287  VECTOR2I dummy;
288 
289  return Collide( aOther, aClearance, false, dummy, aDifferentNetsOnly );
290  }
virtual bool Collide(const ITEM *aOther, int aClearance, bool aNeedMTV, VECTOR2I &aMTV, bool aDifferentNetsOnly=true) const
Function Collide()
Definition: pns_item.cpp:44
static LIB_PART * dummy()
Used when a LIB_PART is not found in library to draw a dummy shape This component is a 400 mils squar...
bool PNS::LINE::CompareGeometry ( const LINE aOther)

Returns true if the line is geometrically identical as line aOther

Definition at line 736 of file pns_line.cpp.

References SHAPE_LINE_CHAIN::CompareGeometry(), and m_line.

Referenced by Width().

737 {
738  return m_line.CompareGeometry( aOther.m_line );
739 }
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
bool CompareGeometry(const SHAPE_LINE_CHAIN &aOther) const
bool PNS::LINE::ContainsSegment ( SEGMENT aSeg) const
inline

Checks if the segment aSeg is a part of the line.

Definition at line 197 of file pns_line.h.

References m_segmentRefs.

198  {
199  return std::find( m_segmentRefs.begin(), m_segmentRefs.end(),
200  aSeg ) != m_segmentRefs.end();
201  }
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
void PNS::LINE::copyLinks ( const LINE aParent)
private

Copies m_segmentRefs from the line aParent.

Definition at line 116 of file pns_line.cpp.

References m_segmentRefs.

Referenced by LINE(), operator=(), and Via().

117 {
118  m_segmentRefs = aParent->m_segmentRefs;
119 }
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
int PNS::LINE::CountCorners ( int  aAngles) const

Returns the number of corners of angles specified by mask aAngles.

Definition at line 136 of file pns_line.cpp.

References DIRECTION_45::Angle(), SHAPE_LINE_CHAIN::CSegment(), i, m_line, and SHAPE_LINE_CHAIN::SegmentCount().

Referenced by LinkCount(), PNS::LINE_PLACER::mergeHead(), and PNS::OPTIMIZER::smartPadsSingle().

137 {
138  int count = 0;
139 
140  for( int i = 0; i < m_line.SegmentCount() - 1; i++ )
141  {
142  const SEG seg1 = m_line.CSegment( i );
143  const SEG seg2 = m_line.CSegment( i + 1 );
144 
145  const DIRECTION_45 dir1( seg1 );
146  const DIRECTION_45 dir2( seg2 );
147 
148  DIRECTION_45::AngleType a = dir1.Angle( dir2 );
149 
150  if( a & aAngles )
151  count++;
152  }
153 
154  return count;
155 }
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
const SEG CSegment(int aIndex) const
Function CSegment()
Class DIRECTION_45.
Definition: direction45.h:36
Definition: seg.h:36
AngleType
Enum AngleType Represents kind of angle formed by vectors heading in two DIRECTION_45s.
Definition: direction45.h:62
size_t i
Definition: json11.cpp:597
int SegmentCount() const
Function SegmentCount()
const VECTOR2I& PNS::LINE::CPoint ( int  aIdx) const
inline
const SEG PNS::LINE::CSegment ( int  aIdx) const
inline

Returns the aIdx-th segment of the line

Definition at line 147 of file pns_line.h.

References SHAPE_LINE_CHAIN::CSegment(), and m_line.

Referenced by PNS::SHOVE::checkBumpDirection(), PNS::dragCornerInternal(), PNS::DIFF_PAIR::EndingPrimitives(), PNS::LINE_PLACER::FixRoute(), PNS::OPTIMIZER::mergeStep(), PNS::LINE_PLACER::optimizeTailHeadTransition(), and PNS::SHOVE::ProcessSingleLine().

148  {
149  return m_line.CSegment( aIdx );
150  }
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
const SEG CSegment(int aIndex) const
Function CSegment()
void PNS::LINE::DragCorner ( const VECTOR2I aP,
int  aIndex,
int  aSnappingThreshold = 0,
bool  aFreeAngle = false 
)

Definition at line 450 of file pns_line.cpp.

References dragCorner45(), and dragCornerFree().

Referenced by PNS::DRAGGER::dragMarkObstacles(), PNS::DRAGGER::dragShove(), PNS::DRAGGER::dumbDragVia(), and Via().

451 {
452  if( aFreeAngle )
453  {
454  dragCornerFree ( aP, aIndex, aSnappingThreshold );
455  }
456  else
457  {
458  dragCorner45 ( aP, aIndex, aSnappingThreshold );
459  }
460 }
void dragCorner45(const VECTOR2I &aP, int aIndex, int aSnappingThreshold)
Definition: pns_line.cpp:420
void dragCornerFree(const VECTOR2I &aP, int aIndex, int aSnappingThreshold)
Definition: pns_line.cpp:444
void PNS::LINE::dragCorner45 ( const VECTOR2I aP,
int  aIndex,
int  aSnappingThreshold 
)
private

Definition at line 420 of file pns_line.cpp.

References SHAPE_LINE_CHAIN::Append(), PNS::dragCornerInternal(), m_line, Reverse(), SHAPE_LINE_CHAIN::Reverse(), SHAPE_LINE_CHAIN::SegmentCount(), SHAPE_LINE_CHAIN::Simplify(), SHAPE_LINE_CHAIN::Slice(), and snapDraggedCorner().

Referenced by DragCorner(), and Via().

421 {
422  SHAPE_LINE_CHAIN path;
423 
424  VECTOR2I snapped = snapDraggedCorner( m_line, aP, aIndex, aSnappingThreshold );
425 
426  if( aIndex == 0 )
427  path = dragCornerInternal( m_line.Reverse(), snapped ).Reverse();
428  else if( aIndex == m_line.SegmentCount() )
429  path = dragCornerInternal( m_line, snapped );
430  else
431  {
432  // fixme: awkward behaviour for "outwards" drags
433  path = dragCornerInternal( m_line.Slice( 0, aIndex ), snapped );
434  SHAPE_LINE_CHAIN path_rev = dragCornerInternal( m_line.Slice( aIndex, -1 ).Reverse(),
435  snapped ).Reverse();
436  path.Append( path_rev );
437  }
438 
439  path.Simplify();
440  m_line = path;
441 }
const SHAPE_LINE_CHAIN Reverse() const
Function Reverse()
const SHAPE_LINE_CHAIN Slice(int aStartIndex, int aEndIndex=-1) const
Function Slice()
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
SHAPE_LINE_CHAIN dragCornerInternal(const SHAPE_LINE_CHAIN &aOrigin, const VECTOR2I &aP)
Definition: pns_line.cpp:343
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
SHAPE_LINE_CHAIN & Simplify()
Function Simplify()
void Reverse()
Reverses the point/vertex order
Definition: pns_line.cpp:742
VECTOR2I snapDraggedCorner(const SHAPE_LINE_CHAIN &aPath, const VECTOR2I &aP, int aIndex, int aThreshold) const
Definition: pns_line.cpp:475
Class SHAPE_LINE_CHAIN.
int SegmentCount() const
Function SegmentCount()
void PNS::LINE::dragCornerFree ( const VECTOR2I aP,
int  aIndex,
int  aSnappingThreshold 
)
private

Definition at line 444 of file pns_line.cpp.

References m_line, SHAPE_LINE_CHAIN::Point(), and SHAPE_LINE_CHAIN::Simplify().

Referenced by DragCorner(), and Via().

445 {
446  m_line.Point( aIndex ) = aP;
447  m_line.Simplify();
448 }
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
SHAPE_LINE_CHAIN & Simplify()
Function Simplify()
VECTOR2I & Point(int aIndex)
Function Point()
void PNS::LINE::DragSegment ( const VECTOR2I aP,
int  aIndex,
int  aSnappingThreshold = 0,
bool  aFreeAngle = false 
)

Definition at line 462 of file pns_line.cpp.

References dragSegment45().

Referenced by PNS::DRAGGER::dragMarkObstacles(), PNS::DRAGGER::dragShove(), and Via().

463 {
464  if( aFreeAngle )
465  {
466  assert( false );
467  }
468  else
469  {
470  dragSegment45 ( aP, aIndex, aSnappingThreshold );
471  }
472 }
void dragSegment45(const VECTOR2I &aP, int aIndex, int aSnappingThreshold)
Definition: pns_line.cpp:563
void PNS::LINE::dragSegment45 ( const VECTOR2I aP,
int  aIndex,
int  aSnappingThreshold 
)
private

Definition at line 563 of file pns_line.cpp.

References SEG::A, SHAPE_LINE_CHAIN::Append(), SEG::B, SHAPE_LINE_CHAIN::CPoint(), SHAPE_LINE_CHAIN::CSegment(), i, SHAPE_LINE_CHAIN::Insert(), SEG::Intersect(), DIRECTION_45::IsObtuse(), DIRECTION_45::Left(), SHAPE_LINE_CHAIN::Length(), m_line, SHAPE_LINE_CHAIN::PointCount(), SHAPE_LINE_CHAIN::Remove(), SHAPE_LINE_CHAIN::Replace(), DIRECTION_45::Right(), SHAPE_LINE_CHAIN::SegmentCount(), SHAPE_LINE_CHAIN::Simplify(), snapToNeighbourSegments(), and DIRECTION_45::ToVector().

Referenced by DragSegment(), and Via().

564 {
565  SHAPE_LINE_CHAIN path( m_line );
566  VECTOR2I target( aP );
567 
568  SEG guideA[2], guideB[2];
569  int index = aIndex;
570 
571  target = snapToNeighbourSegments( path, aP, aIndex, aSnappingThreshold );
572 
573  if( index == 0 )
574  {
575  path.Insert( 0, path.CPoint( 0 ) );
576  index++;
577  }
578 
579  if( index == path.SegmentCount() - 1 )
580  {
581  path.Insert( path.PointCount() - 1, path.CPoint( -1 ) );
582  }
583 
584  SEG dragged = path.CSegment( index );
585  DIRECTION_45 drag_dir( dragged );
586 
587  SEG s_prev = path.CSegment( index - 1 );
588  SEG s_next = path.CSegment( index + 1 );
589 
590  DIRECTION_45 dir_prev( s_prev );
591  DIRECTION_45 dir_next( s_next );
592 
593  if( dir_prev == drag_dir )
594  {
595  dir_prev = dir_prev.Left();
596  path.Insert( index, path.CPoint( index ) );
597  index++;
598  }
599 
600  if( dir_next == drag_dir )
601  {
602  dir_next = dir_next.Right();
603  path.Insert( index + 1, path.CPoint( index + 1 ) );
604  }
605 
606  s_prev = path.CSegment( index - 1 );
607  s_next = path.CSegment( index + 1 );
608  dragged = path.CSegment( index );
609 
610  const bool lockEndpointA = true;
611  const bool lockEndpointB = true;
612 
613  if( aIndex == 0 )
614  {
615  if( !lockEndpointA )
616  {
617  guideA[0] = guideA[1] = SEG( dragged.A,
618  dragged.A + drag_dir.Right().Right().ToVector() );
619  }
620  else
621  {
622  guideA[0] = SEG( dragged.A, dragged.A + drag_dir.Right().ToVector() );
623  guideA[1] = SEG( dragged.A, dragged.A + drag_dir.Left().ToVector() );
624  }
625  }
626  else
627  {
628  if( dir_prev.IsObtuse(drag_dir ) )
629  {
630  guideA[0] = SEG( s_prev.A, s_prev.A + drag_dir.Left().ToVector() );
631  guideA[1] = SEG( s_prev.A, s_prev.A + drag_dir.Right().ToVector() );
632  }
633  else
634  guideA[0] = guideA[1] = SEG( dragged.A, dragged.A + dir_prev.ToVector() );
635  }
636 
637  if( aIndex == m_line.SegmentCount() - 1 )
638  {
639  if( !lockEndpointB )
640  {
641  guideB[0] = guideB[1] = SEG( dragged.B,
642  dragged.B + drag_dir.Right().Right().ToVector() );
643  }
644  else
645  {
646  guideB[0] = SEG( dragged.B, dragged.B + drag_dir.Right().ToVector() );
647  guideB[1] = SEG( dragged.B, dragged.B + drag_dir.Left().ToVector() );
648  }
649  }
650  else
651  {
652  if( dir_next.IsObtuse( drag_dir ) )
653  {
654  guideB[0] = SEG( s_next.B, s_next.B + drag_dir.Left().ToVector() );
655  guideB[1] = SEG( s_next.B, s_next.B + drag_dir.Right().ToVector() );
656  }
657  else
658  guideB[0] = guideB[1] = SEG( dragged.B, dragged.B + dir_next.ToVector() );
659  }
660 
661  SEG s_current( target, target + drag_dir.ToVector() );
662 
663  int best_len = INT_MAX;
664  SHAPE_LINE_CHAIN best;
665 
666  for( int i = 0; i < 2; i++ )
667  {
668  for( int j = 0; j < 2; j++ )
669  {
670  OPT_VECTOR2I ip1 = s_current.IntersectLines( guideA[i] );
671  OPT_VECTOR2I ip2 = s_current.IntersectLines( guideB[j] );
672 
673  SHAPE_LINE_CHAIN np;
674 
675  if( !ip1 || !ip2 )
676  continue;
677 
678  SEG s1( s_prev.A, *ip1 );
679  SEG s2( *ip1, *ip2 );
680  SEG s3( *ip2, s_next.B );
681 
682  OPT_VECTOR2I ip;
683 
684  if( (ip = s1.Intersect( s_next )) )
685  {
686  np.Append( s1.A );
687  np.Append( *ip );
688  np.Append( s_next.B );
689  }
690  else if( (ip = s3.Intersect( s_prev )) )
691  {
692  np.Append( s_prev.A );
693  np.Append( *ip );
694  np.Append( s3.B );
695  }
696  else if( (ip = s1.Intersect( s3 )) )
697  {
698  np.Append( s_prev.A );
699  np.Append( *ip );
700  np.Append( s_next.B );
701  }
702  else
703  {
704  np.Append( s_prev.A );
705  np.Append( *ip1 );
706  np.Append( *ip2 );
707  np.Append( s_next.B );
708  }
709 
710  if( np.Length() < best_len )
711  {
712  best_len = np.Length();
713  best = np;
714  }
715  }
716  }
717 
718  if( !lockEndpointA && aIndex == 0 )
719  best.Remove( 0, 0 );
720  if( !lockEndpointB && aIndex == m_line.SegmentCount() - 1 )
721  best.Remove( -1, -1 );
722 
723  if( m_line.PointCount() == 1 )
724  m_line = best;
725  else if( aIndex == 0 )
726  m_line.Replace( 0, 1, best );
727  else if( aIndex == m_line.SegmentCount() - 1 )
728  m_line.Replace( -2, -1, best );
729  else
730  m_line.Replace( aIndex, aIndex + 1, best );
731 
732  m_line.Simplify();
733 }
int PointCount() const
Function PointCount()
VECTOR2I snapToNeighbourSegments(const SHAPE_LINE_CHAIN &aPath, const VECTOR2I &aP, int aIndex, int aThreshold) const
Definition: pns_line.cpp:517
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
SHAPE_LINE_CHAIN & Simplify()
Function Simplify()
OPT< VECTOR2I > OPT_VECTOR2I
Definition: seg.h:34
Class DIRECTION_45.
Definition: direction45.h:36
void Remove(int aStartIndex, int aEndIndex)
Function Remove()
Definition: seg.h:36
Class SHAPE_LINE_CHAIN.
size_t i
Definition: json11.cpp:597
VECTOR2I A
Definition: seg.h:44
void Replace(int aStartIndex, int aEndIndex, const VECTOR2I &aP)
Function Replace()
int SegmentCount() const
Function SegmentCount()
int Length() const
Function Length()
VECTOR2I B
Definition: seg.h:45
void PNS::LINE::dragSegmentFree ( const VECTOR2I aP,
int  aIndex,
int  aSnappingThreshold 
)
private

Referenced by Via().

SEGMENT* PNS::LINE::GetLink ( int  aIndex) const
inline

Definition at line 203 of file pns_line.h.

References ClearSegmentLinks(), and m_segmentRefs.

Referenced by PNS::LINE_PLACER::removeLoops(), PNS::TOPOLOGY::SimplifyLine(), PNS::MEANDER_SKEW_PLACER::Start(), and PNS::DP_MEANDER_PLACER::Start().

204  {
205  return m_segmentRefs[aIndex];
206  }
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
bool PNS::LINE::HasLockedSegments ( ) const

Definition at line 928 of file pns_line.cpp.

References m_segmentRefs, and PNS::MK_LOCKED.

Referenced by PNS::SHOVE::onCollidingSegment(), and Via().

929 {
930  for( const SEGMENT* seg : m_segmentRefs )
931  {
932  if( seg->Marker() & MK_LOCKED )
933  return true;
934  }
935  return false;
936 }
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
bool PNS::LINE::HasLoops ( ) const

Definition at line 812 of file pns_line.cpp.

References CPoint(), i, and PointCount().

Referenced by PNS::SHOVE::onCollidingSolid(), PNS::LINE_PLACER::rhShoveOnly(), and Via().

813 {
814  for( int i = 0; i < PointCount(); i++ )
815  {
816  for( int j = i + 2; j < PointCount(); j++ )
817  {
818  if( CPoint( i ) == CPoint( j ) )
819  return true;
820  }
821  }
822 
823  return false;
824 }
int PointCount() const
Returns the number of points in the line
Definition: pns_line.h:135
size_t i
Definition: json11.cpp:597
const VECTOR2I & CPoint(int aIdx) const
Returns the aIdx-th point of the line
Definition: pns_line.h:141
virtual const SHAPE_LINE_CHAIN PNS::ITEM::Hull ( int  aClearance = 0,
int  aWalkaroundThickness = 0 
) const
inlinevirtualinherited

Reimplemented in PNS::VIA, PNS::SEGMENT, and PNS::SOLID.

Definition at line 112 of file pns_item.h.

113  {
114  return SHAPE_LINE_CHAIN();
115  }
Class SHAPE_LINE_CHAIN.
bool PNS::LINE::Is45Degree ( ) const

Definition at line 276 of file pns_line.cpp.

References SEG::A, PNS::angle(), SEG::B, SHAPE_LINE_CHAIN::CSegment(), i, SEG::Length(), m_line, SHAPE_LINE_CHAIN::SegmentCount(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by LinkCount(), and PNS::LINE_PLACER::routeStep().

277 {
278  for( int i = 0; i < m_line.SegmentCount(); i++ )
279  {
280  const SEG& s = m_line.CSegment( i );
281 
282  if( s.Length() < 10 )
283  continue;
284 
285  double angle = 180.0 / M_PI *
286  atan2( (double) s.B.y - (double) s.A.y,
287  (double) s.B.x - (double) s.A.x );
288 
289  if( angle < 0 )
290  angle += 360.0;
291 
292  double angle_a = fabs( fmod( angle, 45.0 ) );
293 
294  if( angle_a > 1.0 && angle_a < 44.0 )
295  return false;
296  }
297 
298  return true;
299 }
int Length() const
Function Length()
Definition: seg.h:296
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
const SEG CSegment(int aIndex) const
Function CSegment()
Definition: seg.h:36
static DIRECTION_45::AngleType angle(const VECTOR2I &a, const VECTOR2I &b)
size_t i
Definition: json11.cpp:597
VECTOR2I A
Definition: seg.h:44
int SegmentCount() const
Function SegmentCount()
VECTOR2I B
Definition: seg.h:45
bool PNS::LINE::IsLinked ( ) const
inline

Definition at line 186 of file pns_line.h.

References m_segmentRefs.

Referenced by PNS::NODE::Add(), ClipVertexRange(), PNS::TOPOLOGY::followTrivialPath(), IsLinkedChecked(), Rank(), PNS::OPTIMIZER::removeCachedSegments(), ShowLinks(), and PNS::TOPOLOGY::SimplifyLine().

187  {
188  return m_segmentRefs.size() != 0;
189  }
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
bool PNS::LINE::IsLinkedChecked ( ) const
inline

Definition at line 191 of file pns_line.h.

References IsLinked(), LinkCount(), and SegmentCount().

Referenced by PNS::SHOVE::pushLine().

192  {
193  return IsLinked() && LinkCount() == SegmentCount();
194  }
int SegmentCount() const
Returns the number of segments in the line
Definition: pns_line.h:129
int LinkCount() const
Returns the number of segments that were assembled together to form this line.
Definition: pns_line.h:212
bool IsLinked() const
Definition: pns_line.h:186
bool PNS::ITEM::IsLocked ( ) const
inlineinherited

Definition at line 338 of file pns_item.h.

References PNS::ITEM::Marker(), and PNS::MK_LOCKED.

Referenced by ROUTER_TOOL::InlineDrag(), ROUTER_TOOL::performDragging(), and PNS::SHOVE::pushVia().

339  {
340  return Marker() & MK_LOCKED;
341  }
virtual int Marker() const
Definition: pns_item.h:313
bool PNS::ITEM::IsRoutable ( ) const
inlineinherited

Definition at line 348 of file pns_item.h.

References PNS::ITEM::collideSimple(), and PNS::ITEM::m_routable.

349  {
350  return m_routable;
351  }
bool m_routable
Definition: pns_item.h:368
const std::string PNS::ITEM::KindStr ( ) const
inherited

Function KindStr()

Returns the kind of the item, as string

Definition at line 63 of file pns_item.cpp.

References PNS::ITEM::JOINT_T, PNS::ITEM::LINE_T, PNS::ITEM::m_kind, PNS::ITEM::SEGMENT_T, PNS::ITEM::SOLID_T, and PNS::ITEM::VIA_T.

Referenced by PNS::ITEM::OfKind(), PNS::TOOL_BASE::pickSingleItem(), and PNS::TOOL_BASE::updateEndItem().

64 {
65  switch( m_kind )
66  {
67  case LINE_T:
68  return "line";
69 
70  case SEGMENT_T:
71  return "segment";
72 
73  case VIA_T:
74  return "via";
75 
76  case JOINT_T:
77  return "joint";
78 
79  case SOLID_T:
80  return "solid";
81 
82  default:
83  return "unknown";
84  }
85 }
PnsKind m_kind
Definition: pns_item.h:358
virtual int PNS::ITEM::Layer ( ) const
inlinevirtualinherited

Function Layer()

Returns the item's layer, for single-layered items only.

Reimplemented in PNS::SEGMENT.

Definition at line 219 of file pns_item.h.

References PNS::ITEM::Layers(), and LAYER_RANGE::Start().

Referenced by PNS::OPTIMIZER::fanoutCleanup(), and PNS::OPTIMIZER::runSmartPads().

220  {
221  return Layers().Start();
222  }
const LAYER_RANGE & Layers() const
Function Layers()
Definition: pns_item.h:209
int Start() const
Definition: pns_layerset.h:83
bool PNS::ITEM::LayersOverlap ( const ITEM aOther) const
inlineinherited

Function LayersOverlap()

Returns true if the set of layers spanned by aOther overlaps our layers.

Definition at line 230 of file pns_item.h.

References PNS::ITEM::Layers(), and LAYER_RANGE::Overlaps().

Referenced by PNS::SHOVE::onCollidingSegment(), PNS::SHOVE::ProcessSingleLine(), and PNS::NODE::removeViaIndex().

231  {
232  return Layers().Overlaps( aOther->Layers() );
233  }
const LAYER_RANGE & Layers() const
Function Layers()
Definition: pns_item.h:209
bool Overlaps(const LAYER_RANGE &aOther) const
Definition: pns_layerset.h:68
int PNS::LINE::LinkCount ( ) const
inline

Returns the number of segments that were assembled together to form this line.

Definition at line 212 of file pns_line.h.

References ClipToNearestObstacle(), ClipVertexRange(), CountCorners(), Is45Degree(), m_segmentRefs, ShowLinks(), and Walkaround().

Referenced by IsLinkedChecked(), and PNS::LINE_PLACER::removeLoops().

213  {
214  return m_segmentRefs.size();
215  }
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
SEGMENT_REFS& PNS::LINE::LinkedSegments ( )
inline

Returns the list of segments from the owning node that constitute this line (or NULL if the line is not linked)

Definition at line 181 of file pns_line.h.

References m_segmentRefs.

Referenced by PNS::NODE::Dump(), PNS::TOPOLOGY::followTrivialPath(), PNS::SHOVE::popLine(), PNS::SHOVE::ProcessSingleLine(), PNS::NODE::Remove(), PNS::OPTIMIZER::removeCachedSegments(), and PNS::SHOVE::unwindStack().

182  {
183  return m_segmentRefs;
184  }
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
void PNS::LINE::LinkSegment ( SEGMENT aSeg)
inline

Adds a reference to a segment registered in a NODE that is a part of this line.

Definition at line 174 of file pns_line.h.

References m_segmentRefs.

Referenced by PNS::NODE::Add(), and PNS::NODE::AssembleLine().

175  {
176  m_segmentRefs.push_back( aSeg );
177  }
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
void PNS::LINE::Mark ( int  aMarker)
overridevirtual

Reimplemented from PNS::ITEM.

Definition at line 84 of file pns_line.cpp.

References PNS::ITEM::m_marker, and m_segmentRefs.

Referenced by PNS::SHOVE::onCollidingSolid(), PNS::SHOVE::ProcessSingleLine(), PNS::SHOVE::ShoveLines(), PNS::SHOVE::ShoveMultiLines(), and Via().

85 {
86  m_marker = aMarker;
87 
88  for( SEGMENT* s : m_segmentRefs )
89  s->Mark( aMarker );
90 
91 }
int m_marker
Definition: pns_item.h:366
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
int PNS::LINE::Marker ( ) const
overridevirtual

Reimplemented from PNS::ITEM.

Definition at line 103 of file pns_line.cpp.

References PNS::ITEM::m_marker, and m_segmentRefs.

Referenced by PNS::SHOVE::onCollidingLine(), PNS::SHOVE::onCollidingSegment(), PNS::SHOVE::onCollidingSolid(), PNS::SHOVE::processHullSet(), PNS::SHOVE::ProcessSingleLine(), PNS::SHOVE::runOptimizer(), PNS::SEGMENT::SEGMENT(), and Via().

104 {
105  int marker = m_marker;
106 
107  for( SEGMENT* s : m_segmentRefs )
108  {
109  marker |= s->Marker();
110  }
111 
112  return marker;
113 }
int m_marker
Definition: pns_item.h:366
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
LINE & PNS::LINE::operator= ( const LINE aOther)

Definition at line 58 of file pns_line.cpp.

References copyLinks(), m_hasVia, PNS::ITEM::m_layers, m_line, PNS::ITEM::m_marker, PNS::ITEM::m_movable, PNS::ITEM::m_net, PNS::ITEM::m_rank, m_via, and m_width.

Referenced by ClassOf().

59 {
60  m_line = aOther.m_line;
61  m_width = aOther.m_width;
62  m_net = aOther.m_net;
63  m_movable = aOther.m_movable;
64  m_layers = aOther.m_layers;
65  m_via = aOther.m_via;
66  m_hasVia = aOther.m_hasVia;
67  m_marker = aOther.m_marker;
68  m_rank = aOther.m_rank;
69 
70  copyLinks( &aOther );
71 
72  return *this;
73 }
VIA m_via
Via at the end point, if m_hasVia == true
Definition: pns_line.h:300
LAYER_RANGE m_layers
Definition: pns_item.h:362
int m_rank
Definition: pns_item.h:367
bool m_movable
Definition: pns_item.h:364
int m_marker
Definition: pns_item.h:366
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
void copyLinks(const LINE *aParent)
Copies m_segmentRefs from the line aParent.
Definition: pns_line.cpp:116
bool m_hasVia
If true, the line ends with a via
Definition: pns_line.h:297
int m_net
Definition: pns_item.h:365
int m_width
our width
Definition: pns_line.h:294
NODE* PNS::ITEM::Owner ( ) const
inlineinherited

Function Owner()

Returns the owner of this item, or NULL if there's none.

Definition at line 261 of file pns_item.h.

References PNS::ITEM::Collide(), and PNS::ITEM::m_owner.

Referenced by PNS::SIZES_SETTINGS::inheritTrackWidth(), and PNS::LINE_PLACER::Move().

261 { return m_owner; }
NODE * m_owner
Definition: pns_item.h:361
BOARD_CONNECTED_ITEM* PNS::ITEM::Parent ( ) const
inlineinherited

Function Parent()

Returns the corresponding parent object in the host application's model.

Definition at line 159 of file pns_item.h.

References PNS::ITEM::m_parent.

Referenced by PNS_PCBNEW_RULE_RESOLVER::DpNetPair(), PNS_KICAD_IFACE::HideItem(), PNS_PCBNEW_RULE_RESOLVER::localPadClearance(), ROUTER_TOOL::prepareInteractive(), and PNS_KICAD_IFACE::RemoveItem().

160  {
161  return m_parent;
162  }
BOARD_CONNECTED_ITEM * m_parent
Definition: pns_item.h:360
int PNS::LINE::PointCount ( ) const
inline

Returns the number of points in the line

Definition at line 135 of file pns_line.h.

References m_line, and SHAPE_LINE_CHAIN::PointCount().

Referenced by PNS::OPTIMIZER::fanoutCleanup(), HasLoops(), PNS::TOPOLOGY::LeadingRatLine(), PNS::LINE_PLACER::Move(), PNS::OPTIMIZER::removeCachedSegments(), PNS::LINE_PLACER::rhShoveOnly(), PNS::WALKAROUND::Route(), PNS::TOPOLOGY::SimplifyLine(), and PNS::LINE_PLACER::simplifyNewLine().

136  {
137  return m_line.PointCount();
138  }
int PointCount() const
Function PointCount()
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
int PNS::LINE::Rank ( ) const
overridevirtual

Reimplemented from PNS::ITEM.

Definition at line 773 of file pns_line.cpp.

References IsLinked(), PNS::ITEM::m_rank, m_segmentRefs, and min.

Referenced by PNS::SHOVE::onCollidingLine(), PNS::SHOVE::onCollidingSegment(), PNS::SHOVE::onCollidingSolid(), PNS::SHOVE::onCollidingVia(), PNS::SHOVE::onReverseCollidingVia(), PNS::SEGMENT::SEGMENT(), PNS::SHOVE::shoveIteration(), and Via().

774 {
775  int min_rank = INT_MAX;
776 
777  if( IsLinked() ) {
778  for( SEGMENT *s : m_segmentRefs )
779  {
780  min_rank = std::min( min_rank, s->Rank() );
781  }
782  } else {
783  min_rank = m_rank;
784  }
785 
786  int rank = ( min_rank == INT_MAX ) ? -1 : min_rank;
787 
788  return rank;
789 }
int m_rank
Definition: pns_item.h:367
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
#define min(a, b)
Definition: auxiliary.h:85
bool IsLinked() const
Definition: pns_line.h:186
void PNS::LINE::RemoveVia ( )
inline

Definition at line 251 of file pns_line.h.

References m_hasVia.

Referenced by ClipToNearestObstacle(), PNS::LINE_PLACER::initPlacement(), PNS::SHOVE::onReverseCollidingVia(), and PNS::LINE_PLACER::ToggleVia().

251 { m_hasVia = false; }
bool m_hasVia
If true, the line ends with a via
Definition: pns_line.h:297
void PNS::LINE::Reverse ( )

Reverses the point/vertex order

Definition at line 742 of file pns_line.cpp.

References m_line, m_segmentRefs, SHAPE_LINE_CHAIN::Reverse(), and reverse().

Referenced by AppendVia(), dragCorner45(), PNS::TOPOLOGY::followTrivialPath(), PNS::DRAGGER::startDragVia(), and Width().

743 {
744  m_line = m_line.Reverse();
745 
746  std::reverse( m_segmentRefs.begin(), m_segmentRefs.end() );
747 }
const SHAPE_LINE_CHAIN Reverse() const
Function Reverse()
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
static void reverse(privcurve_t *curve)
Definition: trace.cpp:1025
void PNS::ITEM::SetLayer ( int  aLayer)
inlineinherited

Function SetLayer()

Sets the layers spanned by the item to a single layer aLayer.

Definition at line 199 of file pns_item.h.

References PNS::ITEM::m_layers.

Referenced by PNS::LINE_PLACER::initPlacement(), PNS::DIFF_PAIR_PLACER::propagateDpHeadForces(), PNS::DIFF_PAIR_PLACER::routeHead(), and PNS::DIFF_PAIR::updateLine().

200  {
201  m_layers = LAYER_RANGE( aLayer, aLayer );
202  }
LAYER_RANGE m_layers
Definition: pns_item.h:362
Class LAYER_RANGE.
Definition: pns_layerset.h:32
void PNS::ITEM::SetLayers ( const LAYER_RANGE aLayers)
inlineinherited

Function SetLayers()

Sets the layers spanned by the item to aLayers.

Definition at line 189 of file pns_item.h.

References PNS::ITEM::m_layers.

Referenced by PNS::TOPOLOGY::AssembleDiffPair(), PNS::NODE::AssembleLine(), PNS::VIA::Clone(), PNS::SEGMENT::SetLayer(), and PNS::VIA::VIA().

190  {
191  m_layers = aLayers;
192  }
LAYER_RANGE m_layers
Definition: pns_item.h:362
void PNS::ITEM::SetNet ( int  aNet)
inlineinherited
void PNS::ITEM::SetOwner ( NODE aOwner)
inlineinherited

Functon SetOwner()

Sets the node that owns this item. An item can belong to a single NODE or stay unowned.

Definition at line 241 of file pns_item.h.

References PNS::ITEM::m_owner.

Referenced by PNS::NODE::AssembleLine(), PNS::NODE::doRemove(), and PNS::NODE::Remove().

242  {
243  m_owner = aOwner;
244  }
NODE * m_owner
Definition: pns_item.h:361
void PNS::ITEM::SetParent ( BOARD_CONNECTED_ITEM aParent)
inlineinherited

Function SetParent()

Sets the corresponding parent object in the host application's model.

Definition at line 149 of file pns_item.h.

References PNS::ITEM::m_parent.

Referenced by PNS_KICAD_IFACE::AddItem().

150  {
151  m_parent = aParent;
152  }
BOARD_CONNECTED_ITEM * m_parent
Definition: pns_item.h:360
void PNS::LINE::SetRank ( int  aRank)
overridevirtual

Reimplemented from PNS::ITEM.

Definition at line 763 of file pns_line.cpp.

References PNS::ITEM::m_rank, and m_segmentRefs.

Referenced by PNS::SHOVE::onCollidingLine(), PNS::SHOVE::onCollidingSegment(), PNS::SHOVE::onCollidingSolid(), PNS::SHOVE::onReverseCollidingVia(), PNS::SHOVE::ShoveLines(), PNS::SHOVE::ShoveMultiLines(), and Via().

764 {
765  m_rank = aRank;
766 
767  for( SEGMENT* s : m_segmentRefs )
768  s->SetRank( aRank );
769 
770 }
int m_rank
Definition: pns_item.h:367
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
void PNS::ITEM::SetRoutable ( bool  aRoutable)
inlineinherited

Definition at line 343 of file pns_item.h.

References PNS::ITEM::m_routable.

344  {
345  m_routable = aRoutable;
346  }
bool m_routable
Definition: pns_item.h:368
void PNS::LINE::SetWidth ( int  aWidth)
inline

Sets line width

Definition at line 153 of file pns_line.h.

References m_width.

Referenced by PNS::NODE::AssembleLine(), PNS::LINE_PLACER::initPlacement(), and PNS::DIFF_PAIR::updateLine().

154  {
155  m_width = aWidth;
156  }
int m_width
our width
Definition: pns_line.h:294
const SHAPE* PNS::LINE::Shape ( ) const
inlineoverridevirtual

Returns the shape of the line

Reimplemented from PNS::ITEM.

Definition at line 111 of file pns_line.h.

References m_line.

Referenced by PNS::LOGGER::Log(), and PNS::SHOVE::onCollidingVia().

112  {
113  return &m_line;
114  }
SHAPE_LINE_CHAIN m_line
The actual shape of the line
Definition: pns_line.h:291
void PNS::LINE::ShowLinks ( ) const

Prints out all linked segments

Definition at line 328 of file pns_line.cpp.

References i, IsLinked(), and m_segmentRefs.

Referenced by LinkCount().

329 {
330  if( !IsLinked() )
331  {
332  wxLogTrace( "PNS", "line %p: no links", this );
333  return;
334  }
335 
336  wxLogTrace( "PNS", "line %p: %d linked segs", this, (int) m_segmentRefs.size() );
337 
338  for( int i = 0; i < (int) m_segmentRefs.size(); i++ )
339  wxLogTrace( "PNS", "seg %d: %p\n", i, m_segmentRefs[i] );
340 }
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
size_t i
Definition: json11.cpp:597
bool IsLinked() const
Definition: pns_line.h:186
VECTOR2I PNS::LINE::snapDraggedCorner ( const SHAPE_LINE_CHAIN aPath,
const VECTOR2I aP,
int  aIndex,
int  aThreshold 
) const
private

Definition at line 475 of file pns_line.cpp.

References SHAPE_LINE_CHAIN::CSegment(), dist, EuclideanNorm(), i, SEG::IntersectLines(), max, min, and SHAPE_LINE_CHAIN::SegmentCount().

Referenced by dragCorner45(), and Via().

477 {
478  int s_start = std::max( aIndex - 2, 0 );
479  int s_end = std::min( aIndex + 2, aPath.SegmentCount() - 1 );
480 
481  int i, j;
482  int best_dist = INT_MAX;
483  VECTOR2I best_snap = aP;
484 
485  if( aThreshold <= 0 )
486  return aP;
487 
488  for( i = s_start; i <= s_end; i++ )
489  {
490  const SEG& a = aPath.CSegment( i );
491 
492  for( j = s_start; j < i; j++ )
493  {
494  const SEG& b = aPath.CSegment( j );
495 
496  if( !( DIRECTION_45( a ).IsObtuse(DIRECTION_45( b ) ) ) )
497  continue;
498 
499  OPT_VECTOR2I ip = a.IntersectLines(b);
500 
501  if( ip )
502  {
503  int dist = ( *ip - aP ).EuclideanNorm();
504 
505  if( dist < aThreshold && dist < best_dist )
506  {
507  best_dist = dist;
508  best_snap = *ip;
509  }
510  }
511  }
512  }
513 
514  return best_snap;
515 }
double EuclideanNorm(const wxPoint &vector)
Euclidean norm of a 2D vector.
Definition: trigo.h:112
static const int dist[10][10]
Definition: ar_matrix.cpp:320
OPT_VECTOR2I IntersectLines(const SEG &aSeg) const
Function IntersectLines()
Definition: seg.h:183
const SEG CSegment(int aIndex) const
Function CSegment()
OPT< VECTOR2I > OPT_VECTOR2I
Definition: seg.h:34
Class DIRECTION_45.
Definition: direction45.h:36
Definition: seg.h:36
#define max(a, b)
Definition: auxiliary.h:86
size_t i
Definition: json11.cpp:597
int SegmentCount() const
Function SegmentCount()
#define min(a, b)
Definition: auxiliary.h:85
VECTOR2I PNS::LINE::snapToNeighbourSegments ( const SHAPE_LINE_CHAIN aPath,
const VECTOR2I aP,
int  aIndex,
int  aThreshold 
) const
private

Definition at line 517 of file pns_line.cpp.

References SEG::A, SHAPE_LINE_CHAIN::CSegment(), i, SEG::LineDistance(), and SHAPE_LINE_CHAIN::SegmentCount().

Referenced by dragSegment45(), and Via().

519 {
520  VECTOR2I snap_p[2];
521  DIRECTION_45 dragDir( aPath.CSegment( aIndex ) );
522  int snap_d[2] = { -1, -1 };
523 
524  if( aThreshold == 0 )
525  return aP;
526 
527  if( aIndex >= 2 )
528  {
529  SEG s = aPath.CSegment( aIndex - 2 );
530 
531  if( DIRECTION_45( s ) == dragDir )
532  snap_d[0] = s.LineDistance( aP );
533 
534  snap_p[0] = s.A;
535  }
536 
537  if( aIndex < aPath.SegmentCount() - 2 )
538  {
539  SEG s = aPath.CSegment( aIndex + 2 );
540 
541  if( DIRECTION_45( s ) == dragDir )
542  snap_d[1] = s.LineDistance(aP);
543 
544  snap_p[1] = s.A;
545  }
546 
547  VECTOR2I best = aP;
548  int minDist = INT_MAX;
549 
550  for( int i = 0; i < 2; i++ )
551  {
552  if( snap_d[i] >= 0 && snap_d[i] < minDist && snap_d[i] <= aThreshold )
553  {
554  minDist = snap_d[i];
555  best = snap_p[i];
556  }
557  }
558 
559  return best;
560 }
const SEG CSegment(int aIndex) const
Function CSegment()
Class DIRECTION_45.
Definition: direction45.h:36
int LineDistance(const VECTOR2I &aP, bool aDetermineSide=false) const
Function LineDistance()
Definition: seg.h:357
Definition: seg.h:36
size_t i
Definition: json11.cpp:597
VECTOR2I A
Definition: seg.h:44
int SegmentCount() const
Function SegmentCount()
void PNS::LINE::Unmark ( int  aMarker = -1)
overridevirtual

Reimplemented from PNS::ITEM.

Definition at line 94 of file pns_line.cpp.

References PNS::ITEM::m_marker, and m_segmentRefs.

Referenced by PNS::DRAGGER::dragMarkObstacles(), PNS::DRAGGER::dragShove(), PNS::SHOVE::onCollidingSolid(), and Via().

95 {
96  for( SEGMENT* s : m_segmentRefs )
97  s->Unmark( aMarker );
98 
99  m_marker = 0;
100 }
int m_marker
Definition: pns_item.h:366
SEGMENT_REFS m_segmentRefs
List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is...
Definition: pns_line.h:288
bool PNS::LINE::Walkaround ( SHAPE_LINE_CHAIN  aObstacle,
SHAPE_LINE_CHAIN aPre,
SHAPE_LINE_CHAIN aWalk,
SHAPE_LINE_CHAIN aPost,
bool  aCw 
) const

Calculates a line thightly wrapping a convex hull of an obstacle object (aObstacle).

aPrePath = path from origin to the obstacle aWalkaroundPath = path around the obstacle aPostPath = past from obstacle till the end aCW = whether to walk around in clockwise or counter-clockwise direction.

Definition at line 158 of file pns_line.cpp.

References SHAPE_LINE_CHAIN::Append(), SHAPE_LINE_CHAIN::Clear(), CLine(), SHAPE_LINE_CHAIN::CPoint(), dist, SHAPE_LINE_CHAIN::Find(), i, SEG::Index(), SHAPE_LINE_CHAIN::Intersect(), SHAPE_LINE_CHAIN::INTERSECTION::our, SHAPE_LINE_CHAIN::INTERSECTION::p, SHAPE_LINE_CHAIN::PathLength(), SHAPE_LINE_CHAIN::PointCount(), SHAPE_LINE_CHAIN::PointInside(), SHAPE_LINE_CHAIN::SegmentCount(), SHAPE_LINE_CHAIN::SetClosed(), SHAPE_LINE_CHAIN::Simplify(), SHAPE_LINE_CHAIN::Slice(), SHAPE_LINE_CHAIN::Split(), and SHAPE_LINE_CHAIN::INTERSECTION::their.

Referenced by LinkCount(), PNS::SHOVE::processHullSet(), PNS::WALKAROUND::singleStep(), Walkaround(), and PNS::SHOVE::walkaroundLoneVia().

160 {
161  const SHAPE_LINE_CHAIN& line( CLine() );
162 
163  if( line.SegmentCount() < 1 )
164  return false;
165 
166  if( aObstacle.PointInside( line.CPoint( 0 ) ) || aObstacle.PointInside( line.CPoint( -1 ) ) )
167  return false;
168 
170 
171  line.Intersect( aObstacle, ips );
172 
173  aWalk.Clear();
174  aPost.Clear();
175 
176  int nearest_dist = INT_MAX;
177  int farthest_dist = 0;
178 
179  SHAPE_LINE_CHAIN::INTERSECTION nearest, farthest;
180 
181  for( int i = 0; i < (int) ips.size(); i++ )
182  {
183  const VECTOR2I p = ips[i].p;
184  int dist = line.PathLength( p );
185 
186  if( dist < 0 )
187  return false;
188 
189  if( dist <= nearest_dist )
190  {
191  nearest_dist = dist;
192  nearest = ips[i];
193  }
194 
195  if( dist >= farthest_dist )
196  {
197  farthest_dist = dist;
198  farthest = ips[i];
199  }
200  }
201 
202  if( ips.size() <= 1 || nearest.p == farthest.p )
203  {
204  aPre = line;
205  return true;
206  }
207 
208  aPre = line.Slice( 0, nearest.our.Index() );
209  aPre.Append( nearest.p );
210  aPre.Simplify();
211 
212  aWalk.Clear();
213  aWalk.SetClosed( false );
214  aWalk.Append( nearest.p );
215 
216  assert( nearest.their.Index() >= 0 );
217  assert( farthest.their.Index() >= 0 );
218 
219  assert( nearest_dist <= farthest_dist );
220 
221  aObstacle.Split( nearest.p );
222  aObstacle.Split( farthest.p );
223 
224  int i_first = aObstacle.Find( nearest.p );
225  int i_last = aObstacle.Find( farthest.p );
226 
227  int i = i_first;
228 
229  if( i_first < 0 || i_last < 0 )
230  return false;
231 
232  while( i != i_last )
233  {
234  aWalk.Append( aObstacle.CPoint( i ) );
235  i += ( aCw ? 1 : -1 );
236 
237  if( i < 0 )
238  i = aObstacle.PointCount() - 1;
239  else if( i == aObstacle.PointCount() )
240  i = 0;
241  }
242 
243  aWalk.Append( farthest.p );
244  aWalk.Simplify();
245 
246  aPost.Clear();
247  aPost.Append( farthest.p );
248  aPost.Append( line.Slice( farthest.our.Index() + 1, -1 ) );
249  aPost.Simplify();
250 
251  return true;
252 }
const SHAPE_LINE_CHAIN & CLine() const
Const accessor to the underlying shape
Definition: pns_line.h:123
int Index() const
Function Index()
Definition: seg.h:314
bool PointInside(const VECTOR2I &aP) const
Function PointInside()
int Split(const VECTOR2I &aP)
Function Split()
std::vector< INTERSECTION > INTERSECTIONS
static const int dist[10][10]
Definition: ar_matrix.cpp:320
int PointCount() const
Function PointCount()
VECTOR2I p
point of intersection between our and their.
const SHAPE_LINE_CHAIN Slice(int aStartIndex, int aEndIndex=-1) const
Function Slice()
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
SHAPE_LINE_CHAIN & Simplify()
Function Simplify()
void SetClosed(bool aClosed)
Function SetClosed()
int Find(const VECTOR2I &aP) const
Function Find()
SEG their
segment belonging from the aOther argument of Intersect()
Class SHAPE_LINE_CHAIN.
size_t i
Definition: json11.cpp:597
void Clear()
Function Clear() Removes all points from the line chain.
SEG our
segment belonging from the (this) argument of Intersect()
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
bool PNS::LINE::Walkaround ( const SHAPE_LINE_CHAIN aObstacle,
SHAPE_LINE_CHAIN aPath,
bool  aCw 
) const

Definition at line 255 of file pns_line.cpp.

References SHAPE_LINE_CHAIN::Append(), SHAPE_LINE_CHAIN::Simplify(), and Walkaround().

256 {
257  SHAPE_LINE_CHAIN walk, post;
258 
259  if( ! Walkaround( aObstacle, aPath, walk, post, aCw ) )
260  return false;
261 
262  aPath.Append( walk );
263  aPath.Append( post );
264  aPath.Simplify();
265 
266  return true;
267 }
bool Walkaround(SHAPE_LINE_CHAIN aObstacle, SHAPE_LINE_CHAIN &aPre, SHAPE_LINE_CHAIN &aWalk, SHAPE_LINE_CHAIN &aPost, bool aCw) const
Calculates a line thightly wrapping a convex hull of an obstacle object (aObstacle).
Definition: pns_line.cpp:158
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
SHAPE_LINE_CHAIN & Simplify()
Function Simplify()
Class SHAPE_LINE_CHAIN.

Member Data Documentation

bool PNS::LINE::m_hasVia
private

If true, the line ends with a via

Definition at line 297 of file pns_line.h.

Referenced by AppendVia(), EndsWithVia(), LINE(), operator=(), and RemoveVia().

PnsKind PNS::ITEM::m_kind
protectedinherited
bool PNS::ITEM::m_movable
protectedinherited

Definition at line 364 of file pns_item.h.

Referenced by PNS::ITEM::ITEM(), LINE(), operator=(), and PNS::SOLID::SOLID().

NODE* PNS::ITEM::m_owner
protectedinherited
BOARD_CONNECTED_ITEM* PNS::ITEM::m_parent
protectedinherited

Definition at line 360 of file pns_item.h.

Referenced by PNS::ITEM::ITEM(), PNS::ITEM::Parent(), and PNS::ITEM::SetParent().

bool PNS::ITEM::m_routable
protectedinherited

Definition at line 368 of file pns_item.h.

Referenced by PNS::ITEM::IsRoutable(), PNS::ITEM::ITEM(), and PNS::ITEM::SetRoutable().

SEGMENT_REFS PNS::LINE::m_segmentRefs
private

List of segments in the owning NODE (ITEM::m_owner) that constitute this line, or NULL if the line is not a part of any node.

Definition at line 288 of file pns_line.h.

Referenced by ClearSegmentLinks(), ClipVertexRange(), ContainsSegment(), copyLinks(), GetLink(), HasLockedSegments(), IsLinked(), LinkCount(), LinkedSegments(), LinkSegment(), Mark(), Marker(), Rank(), Reverse(), SetRank(), ShowLinks(), and Unmark().

VIA PNS::LINE::m_via
private

Via at the end point, if m_hasVia == true

Definition at line 300 of file pns_line.h.

Referenced by AppendVia(), LINE(), operator=(), and Via().

int PNS::LINE::m_width
private

our width

Definition at line 294 of file pns_line.h.

Referenced by LINE(), operator=(), SetWidth(), and Width().

const int PNS::ITEM::UnusedNet = INT_MAX
staticinherited

Definition at line 56 of file pns_item.h.

Referenced by PNS::ITEM::ITEM().


The documentation for this class was generated from the following files: