23 Track(
const Point_25 &start) : mStart(start), mEnd(start) { }
25 const Point_25& start()
const {
return mStart; }
26 const Point_25& end()
const {
return mEnd; }
28 bool empty()
const {
return mSegments.empty() && mVias.empty(); }
30 const WideSegment_25& getSegment(uint i)
const { assert(i < mSegments.size());
return mSegments[i]; }
31 const std::vector<WideSegment_25>& getSegments()
const {
return mSegments; }
32 uint numSegments()
const {
return mSegments.size(); }
33 bool hasSegments()
const {
return !mSegments.empty(); }
34 void setSegments(
const std::vector<Segment_25>&);
35 void setSegments(
const std::vector<WideSegment_25>&);
36 void setSegments(std::vector<WideSegment_25>&&);
38 const Via& getVia(uint i)
const { assert(i < mVias.size());
return mVias[i]; }
39 const std::vector<Via>& getVias()
const {
return mVias; }
40 uint numVias()
const {
return mVias.size(); }
41 bool hasVias()
const {
return !mVias.empty(); }
42 bool startsWithVia()
const;
43 bool endsWithVia()
const;
44 bool inferStartsWithVia()
const;
45 bool inferEndsWithVia()
const;
47 ContactType canAttach(
const Track&)
const;
48 bool touchesEndToStart(
const Track&)
const;
49 bool touchesEndToEnd(
const Track&)
const;
50 bool touchesStartToStart(
const Track&)
const;
51 bool touchesStartToEnd(
const Track&)
const;
58 void _setEndLayer(uint);
62 void inferEndpoints();
64 void setPath(
const Path&,
bool updateStart =
false);
65 void _setPath(
const Path&);
66 void getPath(
Path&)
const;
67 void setVias(
const std::vector<Via> &vias) { setModified(); mVias = vias; }
68 void setVias(std::vector<Via> &&vias) { setModified(); mVias = std::move(vias); }
69 void autocreateVias(
const Point_25 &end);
71 void setModified() { mCacheDirty =
true; }
73 void append(
const Track&);
74 void appendMove(Track *);
77 void append(
const Via&);
78 void appendVia(
const Point_2&, uint z0, uint z1, Real r = std::numeric_limits<Real>::quiet_NaN());
79 void prepend(
const Via&);
85 void _appendVia(
const Point_2&, uint z0, uint z1, Real r);
87 void extendTo(
const Point_25&, uint viaLocation);
89 void extendToLayer(uint z);
91 bool isContiguous()
const;
92 bool hasValidEnds()
const;
95 Real reduceBy_cells(Real len_cells,
const Real len_perLayer,
const Real tolerance);
96 Real reduceSegmentsBy_cells(Real len_cells,
const Real tolerance);
97 Real reduceViaBy_cells(Real len_cells,
const Real len_perLayer,
const Real tolerance);
100 static void _reverseSegments(std::vector<WideSegment_25>&);
102 Real defaultWidth()
const {
return mWidth; }
103 Real defaultViaDiameter()
const {
return mViaDiameter; }
104 Real defaultViaRadius()
const {
return mViaDiameter * 0.5; }
106 void setDefaultWidth(
float w) { mWidth = w; }
107 void setDefaultViaDiameter(Real d) { mViaDiameter = d; }
109 Real length()
const {
return mLength; }
110 void computeLength();
112 void setSegmentCapsMask(uint8_t m) { mSegmentCapsMask = m; }
113 bool hasStartCap()
const {
return mSegmentCapsMask & 0x1; }
114 bool hasEndCap()
const {
return mSegmentCapsMask & 0x2; }
115 bool hasSegmentJoints()
const {
return mSegmentCapsMask & 0x4; }
118 Bbox_2
bbox(Real clearance,
int z = -1)
const;
122 int snapToEndpoint(
Point_25&,
const Point_25&, Real maxDistance = 0.0)
const;
124 void determineForks(std::vector<uint> &indices,
const Connection&);
125 Real shortcutBetween(uint sourcePos, uint targetPos);
130 bool violatesClearance2D(
const Track&, Real clearance,
Point_25 * = 0)
const;
133 bool intersects(
const Bbox_2&, uint zmin, uint zmax)
const;
135 bool isRasterized()
const {
return mRasterizedCount > 0; }
136 void resetRasterizedCount() { mRasterizedCount = 0; }
137 void addRasterizedCount(
int count)
const;
138 bool checkRasterization(
const NavGrid&)
const;
140 bool updateForRemovedLayers(uint zmin, uint zmax);
142 std::string str()
const;
143 void setPy(PyObject *);
144 PyObject *getViasPy()
const;
145 PyObject *getViasNumpy()
const;
146 PyObject *getSegmentsPy()
const;
147 PyObject *getSegmentsNumpy()
const;
148 PyObject *getPathPy()
const;
149 PyObject *getPathNumpy()
const;
150 PyObject *getPy(
bool asNumpy)
const;
152 std::vector<WideSegment_25> mSegments;
153 std::vector<Via> mVias;
157 Real mViaDiameter{0.0};
159 mutable Bbox_2 mCachedBbox;
160 mutable bool mCacheDirty{
true};
161 uint8_t mSegmentCapsMask{0x7};
163 mutable int mRasterizedCount{0};
238 append(WideSegment_25(v0.xy(), v1.xy(), v0.z(), mWidth * 0.5));
bool violatesClearance(const Pin &, Real clearance, Point_25 *=0) const
Check whether the other item comes within @clearance distance of this one.