48#include <api/common/types/base_types.pb.h>
85 switch( aShape.
Type() )
89 auto rect = static_cast<const SHAPE_RECT&>( aShape );
90 m_shape = SHAPE_T::RECTANGLE;
91 SetStart( rect.GetPosition() );
92 SetEnd( rect.GetPosition() + rect.GetSize() );
98 auto seg = static_cast<const SHAPE_SEGMENT&>( aShape );
99 m_shape = SHAPE_T::SEGMENT;
100 SetStart( seg.GetSeg().A );
101 SetEnd( seg.GetSeg().B );
102 SetWidth( seg.GetWidth() );
108 auto line = static_cast<const SHAPE_LINE_CHAIN&>( aShape );
109 m_shape = SHAPE_T::POLY;
110 m_poly = SHAPE_POLY_SET();
111 m_poly.AddOutline( line );
112 SetWidth( line.Width() );
118 auto circle = static_cast<const SHAPE_CIRCLE&>( aShape );
119 m_shape = SHAPE_T::CIRCLE;
120 SetStart( circle.GetCenter() );
121 SetEnd( circle.GetCenter() + circle.GetRadius() );
127 auto arc = static_cast<const SHAPE_ARC&>( aShape );
128 m_shape = SHAPE_T::ARC;
129 SetArcGeometry( arc.GetP0(), arc.GetArcMid(), arc.GetP1() );
130 SetWidth( arc.GetWidth() );
136 auto poly = static_cast<const SHAPE_SIMPLE&>( aShape );
137 m_shape = SHAPE_T::POLY;
138 poly.TransformToPolygon( m_poly, 0, ERROR_INSIDE );
157 types::GraphicShape shape;
159 types::StrokeAttributes* stroke = shape.mutable_attributes()->mutable_stroke();
160 types::GraphicFillAttributes* fill = shape.mutable_attributes()->mutable_fill();
162 stroke->mutable_width()->set_value_nm(
GetWidth() );
178 default: fill->set_fill_type( types::GFT_UNFILLED );
break;
185 types::GraphicSegmentAttributes* segment = shape.mutable_segment();
193 types::GraphicRectangleAttributes* rectangle = shape.mutable_rectangle();
202 types::GraphicArcAttributes* arc = shape.mutable_arc();
211 types::GraphicCircleAttributes*
circle = shape.mutable_circle();
225 types::GraphicBezierAttributes* bezier = shape.mutable_bezier();
234 wxASSERT_MSG(
false,
"Unhandled shape in PCB_SHAPE::Serialize" );
239 aContainer.PackFrom( shape );
247 types::GraphicShape shape;
249 if( !aContainer.UnpackTo( &shape ) )
264 SetFilled( shape.attributes().fill().fill_type() == types::GFT_FILLED );
265 SetWidth( shape.attributes().stroke().width().value_nm() );
267 switch( shape.attributes().stroke().style() )
278 if( shape.has_segment() )
284 else if( shape.has_rectangle() )
291 else if( shape.has_arc() )
298 else if( shape.has_circle() )
304 else if( shape.has_polygon() )
309 else if( shape.has_bezier() )
331 default:
return wxT(
"??" );
344 default:
return wxT(
"??" );
363 return wxEmptyString;
378 return m_poly.CVertex( 0 );
400 for(
int ii = 0; ii <
m_poly.COutline( 0 ).SegmentCount(); ii++ )
401 length +=
m_poly.COutline( 0 ).CSegment( ii ).Length();
455 int maxRadius = std::min( width, height ) / 2;
555 return m_poly.Outline( 0 ).IsClosed();
610 std::vector<double> slopes;
618 slopes = { 1.0, -1.0 };
652 shapeBuffer =
m_poly.CloneDropTriangulation();
665 int maxError = lineWidth;
686 hole_base.
Append( corner );
687 corner.
x += hole_size;
688 hole_base.
Append( corner );
689 corner.
y += hole_size;
690 hole_base.
Append( corner );
692 hole_base.
Append( corner );
699 int x_offset = bbox.
GetX() - ( bbox.
GetX() ) % gridsize - gridsize;
700 int y_offset = bbox.
GetY() - ( bbox.
GetY() ) % gridsize - gridsize;
702 for(
int xx = x_offset; xx <= bbox.
GetRight(); xx += gridsize )
704 for(
int yy = y_offset; yy <= bbox.
GetBottom(); yy += gridsize )
738 m_end += aMoveVector;
742 m_poly.Move( aMoveVector );
747 m_end += aMoveVector;
769 pt.x =
KiROUND( pt.x * aScale );
770 pt.y =
KiROUND( pt.y * aScale );
788 std::vector<VECTOR2I> pts;
790 for(
int ii = 0; ii <
m_poly.OutlineCount(); ++ ii )
794 pts.emplace_back( pt );
795 scalePt( pts.back() );
850 m_poly.RemoveAllContours();
860 m_poly.Rotate( aAngle, aRotCentre );
907 m_poly.Mirror( aCentre, aFlipDirection );
944 std::vector<VECTOR2I> bezierPoints;
949 converter.
GetPoly( bezierPoints, aMaxError );
1021 if( aEndAngle == aStartAngle )
1024 while( aEndAngle < aStartAngle )
1048 if(
radius > (
double) INT_MAX / 2.0 )
1049 radius = (double) INT_MAX / 2.0;
1111 return endAngle - startAngle;
1139 if( aCheckNegativeAngle && aAngle <
ANGLE_0 )
1155 default:
return _(
"Unrecognized" );
1168 default:
return _(
"Unrecognized" );
1178 wxString shape =
_(
"Shape" );
1191 aList.emplace_back(
_(
"Angle" ), msg );
1201 msg.Printf( wxS(
"%d" ),
GetPolyShape().Outline(0).PointCount() );
1202 aList.emplace_back(
_(
"Points" ), msg );
1225 m_stroke.GetMsgPanelInfo( aFrame, aList );
1259 for(
auto iter =
m_poly.CIterate(); iter; iter++ )
1260 bbox.
Merge( *iter );
1286 double maxdist = aAccuracy;
1299 return dist <=
radius + maxdist;
1300 else if( abs(
radius - dist ) <= maxdist )
1324 if( dist >
radius + maxdist )
1330 if( abs(
radius - dist ) > maxdist )
1345 if( endAngle > startAngle )
1346 return relPosAngle >= startAngle && relPosAngle <= endAngle;
1348 return relPosAngle >= startAngle || relPosAngle <= endAngle;
1354 std::vector<VECTOR2I> updatedBezierPoints;
1359 converter.
GetPoly( updatedBezierPoints, aAccuracy / 2 );
1360 pts = &updatedBezierPoints;
1363 for(
unsigned int i = 1; i < pts->size(); i++ )
1365 if(
TestSegmentHit( aPosition, ( *pts )[i - 1], ( *pts )[i], maxdist ) )
1383 return poly.
Collide( aPosition, maxdist );
1391 if( poly.
CollideEdge( aPosition,
nullptr, maxdist ) )
1415 if( !
m_poly.COutline( 0 ).IsClosed() )
1419 copy.SetClosed(
true );
1420 return copy.Collide( aPosition, maxdist );
1424 return m_poly.Collide( aPosition, maxdist );
1429 if(
m_poly.CollideEdge( aPosition,
nullptr, maxdist ) )
1447 BOX2I arect = aRect;
1456 int count = (int) outline.GetPointCount();
1458 for(
int ii = 0; ii < count; ii++ )
1460 VECTOR2I vertex = outline.GetPoint( ii );
1466 if( ii + 1 < count )
1468 VECTOR2I vertexNext = outline.GetPoint( ii + 1 );
1474 else if( outline.IsClosed() )
1476 VECTOR2I vertexNext = outline.GetPoint( 0 );
1542 return checkOutline( poly.
Outline( 0 ) );
1583 for(
int ii = 0; ii <
m_poly.OutlineCount(); ++ii )
1585 if( checkOutline(
m_poly.Outline( ii ) ) )
1607 std::vector<VECTOR2I> updatedBezierPoints;
1612 converter.
GetPoly( updatedBezierPoints, aAccuracy / 2 );
1613 pts = &updatedBezierPoints;
1616 for(
unsigned ii = 1; ii < pts->size(); ii++ )
1618 VECTOR2I vertex = ( *pts )[ii - 1];
1619 VECTOR2I vertexNext = ( *pts )[ii];
1650 std::vector<VECTOR2I> pts;
1654 pts.emplace_back( topLeft );
1655 pts.emplace_back( botRight.
x, topLeft.
y );
1656 pts.emplace_back( botRight );
1657 pts.emplace_back( topLeft.
x, botRight.
y );
1665 std::vector<VECTOR2I> pts;
1714 std::vector<VECTOR2I> corners;
1719 corners.emplace_back( pt );
1722 while( corners.size() < 4 )
1723 corners.emplace_back( corners.back() +
VECTOR2I( 10, 10 ) );
1730 for(
const VECTOR2I& corner : corners )
1732 if( corner.x < minX.
x )
1735 if( corner.x > maxX.
x )
1738 if( corner.y < minY.
y )
1741 if( corner.y > maxY.
y )
1747 pts.emplace_back( minX );
1748 pts.emplace_back( minY );
1749 pts.emplace_back( maxX );
1750 pts.emplace_back( maxY );
1754 pts.emplace_back( maxY );
1755 pts.emplace_back( minX );
1756 pts.emplace_back( minY );
1757 pts.emplace_back( maxX );
1761 pts.emplace_back( maxX );
1762 pts.emplace_back( maxY );
1763 pts.emplace_back( minX );
1764 pts.emplace_back( minY );
1768 pts.emplace_back( minY );
1769 pts.emplace_back( maxX );
1770 pts.emplace_back( maxY );
1771 pts.emplace_back( minX );
1800 if( t1 < ANGLE_0 && t2 >
ANGLE_0 )
1803 if( t1 < ANGLE_90 && t2 >
ANGLE_90 )
1814 if( t1 < ANGLE_0 || t2 >
ANGLE_0 )
1817 if( t1 < ANGLE_90 || t2 >
ANGLE_90 )
1831 m_poly.RemoveAllContours();
1835 m_poly.Append( p.x, p.y );
1841 std::vector<SHAPE*> effectiveShapes;
1865 effectiveShapes.emplace_back(
new SHAPE_SIMPLE( outline ) );
1867 if( width > 0 || !solidFill )
1869 for(
int i = 0; i < outline.
PointCount() - 1; ++i )
1876 outline.
CPoint( 0 ), width ) );
1884 effectiveShapes.emplace_back(
new SHAPE_SIMPLE( pts ) );
1886 if( width > 0 || !solidFill )
1888 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( pts[0], pts[1], width ) );
1889 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( pts[1], pts[2], width ) );
1890 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( pts[2], pts[3], width ) );
1891 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( pts[3], pts[0], width ) );
1902 if( width > 0 || !solidFill )
1911 VECTOR2I start_pt = bezierPoints[0];
1913 for(
unsigned int jj = 1; jj < bezierPoints.size(); jj++ )
1915 VECTOR2I end_pt = bezierPoints[jj];
1916 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( start_pt, end_pt, width ) );
1939 if( aLineChainOnly && l.
IsClosed() )
1942 for(
int jj = 0; jj < segCount; jj++ )
1954 return effectiveShapes;
1960 for(
int ii = 0; ii <
m_poly.OutlineCount(); ++ii )
1962 int pointCount =
m_poly.COutline( ii ).PointCount();
1966 aBuffer.reserve( pointCount );
1968 for (
auto iter =
m_poly.CIterate(); iter; iter++ )
1969 aBuffer.emplace_back( iter->x, iter->y );
2018 m_poly.Outline( 0 ).SetClosed(
false );
2021 m_poly.Outline( 0 ).Append( aPosition );
2022 m_poly.Outline( 0 ).Append( aPosition,
true );
2054 poly.
Append( aPosition,
true );
2067#define sq( x ) pow( x, 2 )
2145 if( chordBefore > 0 )
2146 ratio = chordAfter / chordBefore;
2149 radius = std::max( sqrt(
sq(
radius ) * ratio ), sqrt( chordAfter ) / 2 );
2155 double radialA =
m_start.Distance( aPosition );
2156 double radialB =
m_end.Distance( aPosition );
2157 radius = ( radialA + radialB ) / 2.0;
2171 double sqRadDiff = (
radius *
radius ) - ( l * l ) / 4.0;
2176 if( l > 0 && sqRadDiff >= 0 )
2218 m_poly.Outline( 0 ).SetPoint(
m_poly.Outline( 0 ).GetPointCount() - 1, aPosition );
2270 #define SWAPITEM( x ) std::swap( x, image->x )
2295#define TEST( a, b ) { if( a != b ) return a - b; }
2296#define TEST_E( a, b ) { if( abs( a - b ) > EPSILON ) return a - b; }
2297#define TEST_PT( a, b ) { TEST_E( a.x, b.x ); TEST_E( a.y, b.y ); }
2325 for(
int ii = 0; ii <
m_poly.TotalVertices(); ++ii )
2337 ERROR_LOC aErrorLoc,
bool ignoreLineWidth,
bool includeFill )
const
2340 int width = ignoreLineWidth ? 0 :
GetWidth();
2342 width += 2 * aClearance;
2369 0.0, 0, width / 2, aError, aErrorLoc );
2376 0.0, 0, 0, aError, aErrorLoc );
2380 for(
int ii = 0; ii < outline.
PointCount(); ii++ )
2383 aError, aErrorLoc );
2399 if( width > 0 || !solidFill )
2427 for(
int ii = 0; ii <
m_poly.OutlineCount(); ++ii )
2438 int inflate = width / 2;
2451 for(
int ii = 0; ii <
m_poly.OutlineCount(); ++ii )
2455 for(
int jj = 0; jj < (int) poly.
SegmentCount(); ++jj )
2470 std::vector<VECTOR2I> poly;
2471 converter.
GetPoly( poly, aError );
2473 for(
unsigned ii = 1; ii < poly.size(); ii++ )
2549 for(
int ii = 0; ii <
m_poly.TotalVertices(); ++ii )
2564 double similarity = 1.0;
2599 similarity *= std::pow( 0.9, m + n - 2 * longest );
2603 int m =
m_poly.TotalVertices();
2605 std::vector<VECTOR2I> poly;
2606 std::vector<VECTOR2I> otherPoly;
2614 for(
int ii = 0; ii < m; ++ii )
2616 poly.emplace_back( lastPt -
m_poly.CVertex( ii ) );
2617 lastPt =
m_poly.CVertex( ii );
2622 for(
int ii = 0; ii < n; ++ii )
2624 otherPoly.emplace_back( lastPt - aOther.
m_poly.
CVertex( ii ) );
2630 similarity *= std::pow( 0.9, m + n - 2 * longest );
2656 if( lineStyleEnum.
Choices().GetCount() == 0 )
2667 if( hatchModeEnum.
Choices().GetCount() == 0 )
2679 auto isNotPolygonOrCircle =
2709 const wxString shapeProps =
_HKI(
"Shape Properties" );
2775 wxASSERT_MSG( aValue.CheckType<
int>(),
2776 "Expecting int-containing value" );
2778 int radius = aValue.As<
int>();
2784 wxLogDebug( wxT(
"Corner Radius Validator: Not an EDA_SHAPE" ) );
2785 return std::nullopt;
2788 int maxRadius = std::min( prop_shape->GetRectangleWidth(),
2789 prop_shape->GetRectangleHeight() ) / 2;
2792 return std::make_unique<VALIDATION_ERROR_TOO_LARGE<int>>(
radius, maxRadius );
2794 return std::make_unique<VALIDATION_ERROR_TOO_SMALL<int>>(
radius, 0 );
2796 return std::nullopt;
2815 angle->SetAvailableFunc(
2825 auto fillAvailable =
2838 switch( edaShape->GetShape() )
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Bezier curves to polygon converter.
void GetPoly(std::vector< VECTOR2I > &aOutput, int aMaxError=10)
Convert a Bezier curve to a polygon.
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr void SetOrigin(const Vec &pos)
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
constexpr coord_type GetY() const
constexpr Vec Centre() const
constexpr coord_type GetX() const
bool IntersectsCircleEdge(const Vec &aCenter, const int aRadius, const int aWidth) const
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr coord_type GetLeft() const
constexpr bool Contains(const Vec &aPoint) const
constexpr coord_type GetRight() const
constexpr void SetEnd(coord_type x, coord_type y)
constexpr coord_type GetTop() const
constexpr bool Intersects(const BOX2< Vec > &aRect) const
constexpr coord_type GetBottom() const
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
UI_FILL_MODE GetFillModeProp() const
virtual int GetHatchLineSpacing() const
EDA_ANGLE GetArcAngle() const
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false, bool includeFill=false) const
Convert the shape to a closed polygon.
const VECTOR2I & GetBezierC2() const
void SetBezierC2(const VECTOR2I &aPt)
void move(const VECTOR2I &aMoveVector)
void SetCenter(const VECTOR2I &aCenter)
VECTOR2I getCenter() const
void SetFillModeProp(UI_FILL_MODE)
void SetLength(const double &aLength)
virtual int getMaxError() const
void rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
const std::vector< VECTOR2I > buildBezierToSegmentsPointsList(int aMaxError) const
const SHAPE_POLY_SET & GetHatching() const
FILL_T GetFillMode() const
void SetCornerRadius(int aRadius)
long long int m_rectangleHeight
virtual int GetEffectiveWidth() const
COLOR4D GetLineColor() const
SHAPE_POLY_SET m_hatching
int GetRectangleWidth() const
void SetLineStyle(const LINE_STYLE aStyle)
void calcEdit(const VECTOR2I &aPosition)
virtual std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const
Make a set of SHAPE objects representing the EDA_SHAPE.
SHAPE_POLY_SET & GetPolyShape()
void CalcArcAngles(EDA_ANGLE &aStartAngle, EDA_ANGLE &aEndAngle) const
Calc arc start and end angles such that aStartAngle < aEndAngle.
std::vector< VECTOR2I > GetCornersInSequence(EDA_ANGLE angle) const
void ShapeGetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
virtual bool isMoving() const
bool operator==(const EDA_SHAPE &aOther) const
void SetPolyShape(const SHAPE_POLY_SET &aShape)
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
void SetRectangleHeight(const int &aHeight)
bool IsHatchedFill() const
virtual void SetFilled(bool aFlag)
virtual bool IsFilledForHitTesting() const
bool continueEdit(const VECTOR2I &aPosition)
wxString ShowShape() const
void SetFillColor(const COLOR4D &aColor)
std::vector< SHAPE * > makeEffectiveShapes(bool aEdgeOnly, bool aLineChainOnly=false) const
Make a set of SHAPE objects representing the EDA_SHAPE.
bool hitTest(const VECTOR2I &aPosition, int aAccuracy=0) const
void SetCachedArcData(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, const VECTOR2I &aCenter)
Set the data used for mid point caching.
void RebuildBezierToSegmentsPointsList(int aMaxError)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
virtual int GetHatchLineWidth() const
void flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
EDA_SHAPE(SHAPE_T aType, int aLineWidth, FILL_T aFill)
void beginEdit(const VECTOR2I &aStartPoint)
int GetPointCount() const
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
void SetStart(const VECTOR2I &aStart)
void DupPolyPointsList(std::vector< VECTOR2I > &aBuffer) const
Duplicate the list of corners in a std::vector<VECTOR2I>.
LINE_STYLE GetLineStyle() const
void endEdit(bool aClosed=true)
Finish editing the shape.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
void SetLineColor(const COLOR4D &aColor)
COLOR4D GetFillColor() const
void SetRectangle(const long long int &aHeight, const long long int &aWidth)
void SetShape(SHAPE_T aShape)
void SwapShape(EDA_SHAPE *aImage)
std::vector< VECTOR2I > GetRectCorners() const
void SetSegmentAngle(const EDA_ANGLE &aAngle)
std::vector< VECTOR2I > m_bezierPoints
void setPosition(const VECTOR2I &aPos)
virtual bool IsProxyItem() const
void computeArcBBox(BOX2I &aBBox) const
virtual void UpdateHatching() const
void SetEnd(const VECTOR2I &aEnd)
void SetRectangleWidth(const int &aWidth)
void SetBezierC1(const VECTOR2I &aPt)
void SetArcGeometry(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Set the three controlling points for an arc.
wxString SHAPE_T_asString() const
void scale(double aScale)
double Similarity(const EDA_SHAPE &aOther) const
const VECTOR2I & GetBezierC1() const
const BOX2I getBoundingBox() const
void SetArcAngleAndEnd(const EDA_ANGLE &aAngle, bool aCheckNegativeAngle=false)
Set the end point from the angle center and start.
int GetRectangleHeight() const
virtual int GetWidth() const
VECTOR2I getPosition() const
bool IsClockwiseArc() const
void SetPolyPoints(const std::vector< VECTOR2I > &aPoints)
wxString getFriendlyName() const
void SetWidth(int aWidth)
EDA_ANGLE GetSegmentAngle() const
int GetCornerRadius() const
void SetFillMode(FILL_T aFill)
long long int m_rectangleWidth
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
bool IsPolyShapeValid() const
int Compare(const EDA_SHAPE *aOther) const
VECTOR2I GetArcMid() const
ENUM_MAP & Map(T aValue, const wxString &aName)
static ENUM_MAP< T > & Instance()
Class that other classes need to inherit from, in order to be inspectable.
A color representation with 4 components: red, green, blue, alpha.
PROPERTY_BASE & SetAvailableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Set a callback function to determine whether an object provides this property.
PROPERTY_BASE & SetValidator(PROPERTY_VALIDATOR_FN &&aValidator)
PROPERTY_BASE & SetIsHiddenFromRulesEditor(bool aHide=true)
Provide class metadata.Helper macro to map type hashes to names.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
A round rectangle shape, based on a rectangle and a radius.
void TransformToPolygon(SHAPE_POLY_SET &aBuffer) const
Get the polygonal representation of the roundrect.
SHAPE_TYPE Type() const
Return the type of the shape.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
void Move(const VECTOR2I &aVector) override
bool IsClosed() const override
virtual const VECTOR2I GetPoint(int aIndex) const override
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
int PointCount() const
Return the number of points (vertices) in this line chain.
virtual size_t GetPointCount() const override
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
virtual const SEG GetSegment(int aIndex) const override
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
int SegmentCount() const
Return the number of segments in this line chain.
const VECTOR2I & CLastPoint() const
Return the last point in the line chain.
void Remove(int aStartIndex, int aEndIndex)
Remove the range of points [start_index, end_index] from the line chain.
const SEG CSegment(int aIndex) const
Return a constant copy of the aIndex segment in the line chain.
Represent a set of closed polygons.
bool CollideEdge(const VECTOR2I &aPoint, VERTEX_INDEX *aClosestVertex=nullptr, int aClearance=0) const
Check whether aPoint collides with any edge of any of the contours of the polygon.
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index.
int VertexCount(int aOutline=-1, int aHole=-1) const
Return the number of vertices in a given outline/hole.
bool Collide(const SHAPE *aShape, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
Check if the boundary of shape (this) lies closer to the shape aShape than aClearance,...
int TotalVertices() const
Return total number of vertices stored in the set.
void Inflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError, bool aSimplify=false)
Perform outline inflation/deflation.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
const std::vector< SEG > GenerateHatchLines(const std::vector< double > &aSlopes, int aSpacing, int aLineLength) const
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
int NewOutline()
Creates a new empty polygon in the set and returns its index.
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the index-th vertex in a given hole outline within a given outline.
int OutlineCount() const
Return the number of outlines in the set.
SHAPE_POLY_SET CloneDropTriangulation() const
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
Represent a simple polygon consisting of a zero-thickness closed chain of connected line segments.
An abstract shape on 2D plane.
LINE_STYLE GetLineStyle() const
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
double Distance(const VECTOR2< extended_type > &aVector) const
Compute the distance between two vectors.
constexpr extended_type SquaredEuclideanNorm() const
Compute the squared euclidean norm of the vector, which is defined as (x ** 2 + y ** 2).
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
void TransformRingToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aCentre, int aRadius, int aWidth, int aError, ERROR_LOC aErrorLoc)
Convert arcs to multiple straight segments.
void TransformCircleToPolygon(SHAPE_LINE_CHAIN &aBuffer, const VECTOR2I &aCenter, int aRadius, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a circle to a polygon, using multiple straight lines.
void TransformArcToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, int aWidth, int aError, ERROR_LOC aErrorLoc)
Convert arc to multiple straight segments.
void TransformRoundChamferedRectToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aPosition, const VECTOR2I &aSize, const EDA_ANGLE &aRotation, int aCornerRadius, double aChamferRatio, int aChamferCorners, int aInflate, int aError, ERROR_LOC aErrorLoc)
Convert a rectangle with rounded corners and/or chamfered corners to a polygon.
void TransformOvalToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aWidth, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a oblong shape to a polygon, using multiple segments.
@ ROUND_ALL_CORNERS
All angles are rounded.
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_45
static constexpr EDA_ANGLE ANGLE_270
static constexpr EDA_ANGLE ANGLE_360
static constexpr EDA_ANGLE ANGLE_180
static struct EDA_SHAPE_DESC _EDA_SHAPE_DESC
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
@ FILLED_SHAPE
Fill with object color.
a few functions useful in geometry calculations.
This file contains miscellaneous commonly used macros and functions.
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
#define UNIMPLEMENTED_FOR(type)
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
KICOMMON_API wxString MessageTextFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
A helper to convert the double length aValue to a string in inches, millimeters, or unscaled units.
bool ShapeHitTest(const SHAPE_LINE_CHAIN &aHitter, const SHAPE &aHittee, bool aHitteeContained)
Perform a shape-to-shape hit test.
size_t longest_common_subset(const _Container &__c1, const _Container &__c2)
Returns the length of the longest common subset of values between two containers.
KICOMMON_API VECTOR2I UnpackVector2(const types::Vector2 &aInput)
KICOMMON_API SHAPE_POLY_SET UnpackPolySet(const types::PolySet &aInput)
KICOMMON_API void PackVector2(types::Vector2 &aOutput, const VECTOR2I &aInput)
KICOMMON_API void PackPolySet(types::PolySet &aOutput, const SHAPE_POLY_SET &aInput)
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
#define IMPLEMENT_ENUM_TO_WXANY(type)
#define NO_SETTER(owner, type)
@ PT_COORD
Coordinate expressed in distance units (mm/inch)
@ PT_DECIDEGREE
Angle expressed in decidegrees.
@ PT_SIZE
Size expressed in distance units (mm/inch)
std::optional< std::unique_ptr< VALIDATION_ERROR > > VALIDATOR_RESULT
Null optional means validation succeeded.
@ SH_POLY_SET
set of polygons (with holes, etc.)
@ SH_SIMPLE
simple polygon
@ SH_NULL
empty shape (no shape...),
@ SH_POLY_SET_TRIANGLE
a single triangle belonging to a POLY_SET triangulation
@ SH_LINE_CHAIN
line chain (polyline)
@ SH_COMPOUND
compound shape, consisting of multiple simple shapes
static bool Collide(const SHAPE_CIRCLE &aA, const SHAPE_CIRCLE &aB, int aClearance, int *aActual, VECTOR2I *aLocation, VECTOR2I *aMTV)
LINE_STYLE
Dashed line types.
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
bool TestSegmentHit(const VECTOR2I &aRefPoint, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aDist)
Test if aRefPoint is with aDistance on the line defined by aStart and aEnd.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
const VECTOR2I CalcArcCenter(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Determine the center of an arc or circle given three points on its circumference.
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D