50#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 GetPolyShape() = SHAPE_POLY_SET();
111 GetPolyShape().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( GetPolyShape(), 0, ERROR_INSIDE );
144 auto ellipse = static_cast<const SHAPE_ELLIPSE&>( aShape );
145 m_shape = ellipse.IsArc() ? SHAPE_T::ELLIPSE_ARC : SHAPE_T::ELLIPSE;
146 SetEllipseCenter( ellipse.GetCenter() );
147 SetEllipseMajorRadius( ellipse.GetMajorRadius() );
148 SetEllipseMinorRadius( ellipse.GetMinorRadius() );
149 SetEllipseRotation( ellipse.GetRotation() );
151 if( ellipse.IsArc() )
153 SetEllipseStartAngle( ellipse.GetStartAngle() );
154 SetEllipseEndAngle( ellipse.GetEndAngle() );
193 m_poly = std::make_unique<SHAPE_POLY_SET>( *aOther.
m_poly );
199 if(
this == &aOther )
221 m_poly = std::make_unique<SHAPE_POLY_SET>( *aOther.
m_poly );
240 types::GraphicShape shape;
242 types::StrokeAttributes* stroke = shape.mutable_attributes()->mutable_stroke();
243 types::GraphicFillAttributes* fill = shape.mutable_attributes()->mutable_fill();
260 types::GraphicSegmentAttributes* segment = shape.mutable_segment();
268 types::GraphicRectangleAttributes* rectangle = shape.mutable_rectangle();
277 types::GraphicArcAttributes* arc = shape.mutable_arc();
286 types::GraphicCircleAttributes*
circle = shape.mutable_circle();
300 types::GraphicBezierAttributes* bezier = shape.mutable_bezier();
310 types::GraphicEllipseAttributes* ellipse = shape.mutable_ellipse();
320 types::GraphicEllipseArcAttributes* arc = shape.mutable_ellipse_arc();
331 wxASSERT_MSG(
false,
"Unhandled shape in EDA_SHAPE::Serialize" );
336 aContainer.PackFrom( shape );
350 types::GraphicShape shape;
352 if( !aContainer.UnpackTo( &shape ) )
368 if( shape.attributes().stroke().has_color() )
373 if( shape.attributes().fill().has_color() )
376 if( shape.attributes().has_stroke() )
382 if( shape.attributes().has_fill() )
385 if( shape.has_segment() )
391 else if( shape.has_rectangle() )
398 else if( shape.has_arc() )
405 else if( shape.has_circle() )
411 else if( shape.has_polygon() )
416 else if( shape.has_bezier() )
425 else if( shape.has_ellipse() )
433 else if( shape.has_ellipse_arc() )
456 default:
return wxT(
"??" );
471 default:
return wxT(
"??" );
492 return wxEmptyString;
587 int maxRadius = std::min( width, height ) / 2;
748 std::vector<double> slopes;
758 slopes = { 1.0, -1.0 };
799 chain.SetClosed(
true );
819 if( majorAxis / spacing > 100 )
820 spacing = majorAxis / 100;
837 for(
const SEG& seg : hatchSegs )
840 int maxError = lineWidth;
854 int gridsize = spacing;
863 hole_base.
Append( corner );
864 corner.
x += hole_size;
865 hole_base.
Append( corner );
866 corner.
y += hole_size;
867 hole_base.
Append( corner );
869 hole_base.
Append( corner );
876 int x_offset = bbox.
GetX() - ( bbox.
GetX() ) % gridsize - gridsize;
877 int y_offset = bbox.
GetY() - ( bbox.
GetY() ) % gridsize - gridsize;
879 for(
int xx = x_offset; xx <= bbox.
GetRight(); xx += gridsize )
881 for(
int yy = y_offset; yy <= bbox.
GetBottom(); yy += gridsize )
923 m_end += aMoveVector;
932 m_end += aMoveVector;
945 m_end += aMoveVector;
960 seg.
A += aMoveVector;
961 seg.
B += aMoveVector;
976 pt.x =
KiROUND( pt.x * aScale );
977 pt.y =
KiROUND( pt.y * aScale );
995 std::vector<VECTOR2I> pts;
1001 pts.emplace_back( pt );
1002 scalePt( pts.back() );
1146 m_ellipse.Mirror( aCentre, aFlipDirection );
1175 std::vector<VECTOR2I> bezierPoints;
1180 converter.
GetPoly( bezierPoints, aMaxError );
1182 return bezierPoints;
1203 const double phi =
m_ellipse.Rotation.AsRadians();
1218 const double phi =
m_ellipse.Rotation.AsRadians();
1219 const double cosPhi = std::cos( phi );
1220 const double sinPhi = std::sin( phi );
1223 auto eval = [&](
double theta ) ->
VECTOR2I
1225 const double lx = a * std::cos( theta );
1226 const double ly = b * std::sin( theta );
1316 if( aEndAngle == aStartAngle )
1319 while( aEndAngle < aStartAngle )
1343 if(
radius > (
double) INT_MAX / 2.0 )
1344 radius = (double) INT_MAX / 2.0;
1406 return endAngle - startAngle;
1434 if( aCheckNegativeAngle && aAngle <
ANGLE_0 )
1450 default:
return _(
"Unrecognized" );
1465 default:
return _(
"Unrecognized" );
1475 wxString shape =
_(
"Shape" );
1488 aList.emplace_back(
_(
"Angle" ), msg );
1514 msg.Printf( wxS(
"%d" ),
GetPolyShape().Outline(0).PointCount() );
1515 aList.emplace_back(
_(
"Points" ), msg );
1538 m_stroke.GetMsgPanelInfo( aFrame, aList );
1575 for(
auto iter =
GetPolyShape().CIterate(); iter; iter++ )
1576 bbox.
Merge( *iter );
1602 double maxdist = aAccuracy;
1615 return dist <=
radius + maxdist;
1616 else if( abs(
radius - dist ) <= maxdist )
1640 if( dist >
radius + maxdist )
1646 if( abs(
radius - dist ) > maxdist )
1661 if( endAngle > startAngle )
1662 return relPosAngle >= startAngle && relPosAngle <= endAngle;
1664 return relPosAngle >= startAngle || relPosAngle <= endAngle;
1670 std::vector<VECTOR2I> updatedBezierPoints;
1675 converter.
GetPoly( updatedBezierPoints, aAccuracy / 2 );
1676 pts = &updatedBezierPoints;
1679 for(
unsigned int i = 1; i < pts->size(); i++ )
1681 if(
TestSegmentHit( aPosition, ( *pts )[i - 1], ( *pts )[i], maxdist ) )
1699 return poly.
Collide( aPosition, maxdist );
1707 if( poly.
CollideEdge( aPosition,
nullptr, maxdist ) )
1738 copy.SetClosed(
true );
1739 return copy.Collide( aPosition, maxdist );
1748 if(
GetPolyShape().CollideEdge( aPosition,
nullptr, maxdist ) )
1762 const double maxdistSq = maxdist * maxdist;
1767 if(
static_cast<double>( e.
SquaredDistance( aPosition,
false ) ) <= maxdistSq )
1773 if(
static_cast<double>( e.
SquaredDistance( aPosition,
true ) ) <= maxdistSq )
1792 BOX2I arect = aRect;
1801 int count = (int) outline.GetPointCount();
1803 for(
int ii = 0; ii < count; ii++ )
1805 VECTOR2I vertex = outline.GetPoint( ii );
1811 if( ii + 1 < count )
1813 VECTOR2I vertexNext = outline.GetPoint( ii + 1 );
1819 else if( outline.IsClosed() )
1821 VECTOR2I vertexNext = outline.GetPoint( 0 );
1887 return checkOutline( poly.
Outline( 0 ) );
1952 std::vector<VECTOR2I> updatedBezierPoints;
1957 converter.
GetPoly( updatedBezierPoints, aAccuracy / 2 );
1958 pts = &updatedBezierPoints;
1961 for(
unsigned ii = 1; ii < pts->size(); ii++ )
1963 VECTOR2I vertex = ( *pts )[ii - 1];
1964 VECTOR2I vertexNext = ( *pts )[ii];
1989 const int tessError = std::max( 1, aAccuracy / 2 );
1994 return checkOutline(
chain );
2014 std::vector<VECTOR2I> pts;
2018 pts.emplace_back( topLeft );
2019 pts.emplace_back( botRight.
x, topLeft.
y );
2020 pts.emplace_back( botRight );
2021 pts.emplace_back( topLeft.
x, botRight.
y );
2029 std::vector<VECTOR2I> pts;
2082 pts.emplace_back( tl );
2083 pts.emplace_back( tr );
2084 pts.emplace_back( br );
2085 pts.emplace_back( bl );
2098 std::vector<VECTOR2I> corners;
2103 corners.emplace_back( pt );
2106 if( corners.empty() )
2109 while( corners.size() < 4 )
2110 corners.emplace_back( corners.back() +
VECTOR2I( 10, 10 ) );
2117 for(
const VECTOR2I& corner : corners )
2119 if( corner.x < minX.
x )
2122 if( corner.x > maxX.
x )
2125 if( corner.y < minY.
y )
2128 if( corner.y > maxY.
y )
2134 pts.emplace_back( minX );
2135 pts.emplace_back( minY );
2136 pts.emplace_back( maxX );
2137 pts.emplace_back( maxY );
2141 pts.emplace_back( maxY );
2142 pts.emplace_back( minX );
2143 pts.emplace_back( minY );
2144 pts.emplace_back( maxX );
2148 pts.emplace_back( maxX );
2149 pts.emplace_back( maxY );
2150 pts.emplace_back( minX );
2151 pts.emplace_back( minY );
2155 pts.emplace_back( minY );
2156 pts.emplace_back( maxX );
2157 pts.emplace_back( maxY );
2158 pts.emplace_back( minX );
2187 if( t1 < ANGLE_0 && t2 >
ANGLE_0 )
2190 if( t1 < ANGLE_90 && t2 >
ANGLE_90 )
2201 if( t1 < ANGLE_0 || t2 >
ANGLE_0 )
2204 if( t1 < ANGLE_90 || t2 >
ANGLE_90 )
2228 std::vector<SHAPE*> effectiveShapes;
2258 effectiveShapes.emplace_back(
new SHAPE_SIMPLE( outline ) );
2260 if( width > 0 || !solidFill )
2262 std::set<size_t> arcsHandled;
2268 size_t arcIndex = outline.
ArcIndex( ii );
2270 if( !arcsHandled.contains( arcIndex ) )
2272 arcsHandled.insert( arcIndex );
2273 effectiveShapes.emplace_back(
new SHAPE_ARC( outline.
Arc( arcIndex ), width ) );
2288 effectiveShapes.emplace_back(
new SHAPE_SIMPLE( pts ) );
2290 if( width > 0 || !solidFill )
2292 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( pts[0], pts[1], width ) );
2293 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( pts[1], pts[2], width ) );
2294 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( pts[2], pts[3], width ) );
2295 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( pts[3], pts[0], width ) );
2306 if( width > 0 || !solidFill )
2315 VECTOR2I start_pt = bezierPoints[0];
2317 for(
unsigned int jj = 1; jj < bezierPoints.size(); jj++ )
2319 VECTOR2I end_pt = bezierPoints[jj];
2320 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( start_pt, end_pt, width ) );
2343 if( aLineChainOnly && l.
IsClosed() )
2346 for(
int jj = 0; jj < segCount; jj++ )
2361 std::vector<VECTOR2I> pts;
2363 for(
int ii = 0; ii <
chain.PointCount(); ++ii )
2364 pts.emplace_back(
chain.CPoint( ii ) );
2366 effectiveShapes.emplace_back(
new SHAPE_SIMPLE( pts ) );
2369 if( width > 0 || !solidFill )
2374 for(
int ii = 0; ii <
chain.SegmentCount(); ++ii )
2386 return effectiveShapes;
2392 std::vector<VECTOR2I> points;
2401 points.reserve( points.size() + pointCount );
2404 points.emplace_back( pt );
2415 m_poly = std::make_unique<SHAPE_POLY_SET>();
2423 m_poly = std::make_unique<SHAPE_POLY_SET>();
2539 poly.
Append( aPosition,
true );
2552#define sq( x ) pow( x, 2 )
2630 if( chordBefore > 0 )
2631 ratio = chordAfter / chordBefore;
2634 radius = std::max( sqrt(
sq(
radius ) * ratio ), sqrt( chordAfter ) / 2 );
2640 double radialA =
m_start.Distance( aPosition );
2641 double radialB =
m_end.Distance( aPosition );
2642 radius = ( radialA + radialB ) / 2.0;
2656 double sqRadDiff = (
radius *
radius ) - ( l * l ) / 4.0;
2661 if( l > 0 && sqRadDiff >= 0 )
2710 const VECTOR2I secondCorner = aPosition;
2712 const int halfW =
std::abs( secondCorner.
x - firstCorner.
x ) / 2;
2713 const int halfH =
std::abs( secondCorner.
y - firstCorner.
y ) / 2;
2719 if( halfW >= halfH )
2721 majorRadius = std::max( halfW, 1 );
2722 minorRadius = std::max( halfH, 1 );
2727 majorRadius = std::max( halfH, 1 );
2728 minorRadius = std::max( halfW, 1 );
2749 const VECTOR2I secondCorner = aPosition;
2751 const int halfW =
std::abs( secondCorner.
x - firstCorner.
x ) / 2;
2752 const int halfH =
std::abs( secondCorner.
y - firstCorner.
y ) / 2;
2758 if( halfW >= halfH )
2760 majorRadius = std::max( halfW, 1 );
2761 minorRadius = std::max( halfH, 1 );
2766 majorRadius = std::max( halfH, 1 );
2767 minorRadius = std::max( halfW, 1 );
2789 const double a = std::max( 1,
m_ellipse.MajorRadius );
2790 const double b = std::max( 1,
m_ellipse.MinorRadius );
2793 const double dx = aPosition.
x -
center.x;
2794 const double dy = aPosition.
y -
center.y;
2796 const double cosRot = rotation.
Cos();
2797 const double sinRot = rotation.
Sin();
2798 const double lx = dx * cosRot + dy * sinRot;
2799 const double ly = -dx * sinRot + dy * cosRot;
2813 while( cursorAngle <=
m_ellipse.StartAngle )
2880 #define SWAPITEM( x ) std::swap( x, image->x )
2906#define TEST( a, b ) { if( a != b ) return a - b; }
2907#define TEST_E( a, b ) { if( abs( a - b ) > EPSILON ) return a - b; }
2908#define TEST_PT( a, b ) { TEST_E( a.x, b.x ); TEST_E( a.y, b.y ); }
2961 ERROR_LOC aErrorLoc,
bool ignoreLineWidth,
bool includeFill )
const
2964 int width = ignoreLineWidth ? 0 :
GetWidth();
2966 width += 2 * aClearance;
2993 0.0, 0, width / 2, aError, aErrorLoc );
3003 std::set<size_t> arcsHandled;
3009 size_t arcIndex = outline.
ArcIndex( ii );
3011 if( arcsHandled.contains( arcIndex ) )
3014 arcsHandled.insert( arcIndex );
3040 if( width > 0 || !solidFill )
3079 int inflate = width / 2;
3096 for(
int jj = 0; jj < (int) poly.
SegmentCount(); ++jj )
3111 std::vector<VECTOR2I> poly;
3112 converter.
GetPoly( poly, aError );
3114 for(
unsigned ii = 1; ii < poly.size(); ii++ )
3133 for(
int ii = 0; ii <
chain.PointCount(); ++ii )
3138 int inflate = width / 2;
3151 for(
int ii = 0; ii <
chain.SegmentCount(); ++ii )
3153 const SEG& seg =
chain.CSegment( ii );
3305 double similarity = 1.0;
3340 similarity *= std::pow( 0.9, m + n - 2 * longest );
3346 std::vector<VECTOR2I> poly;
3347 std::vector<VECTOR2I> otherPoly;
3355 for(
int ii = 0; ii < m; ++ii )
3357 poly.emplace_back( lastPt -
GetPolyShape().CVertex( ii ) );
3363 for(
int ii = 0; ii < n; ++ii )
3371 similarity *= std::pow( 0.9, m + n - 2 * longest );
3399 if( lineStyleEnum.
Choices().GetCount() == 0 )
3410 if( hatchModeEnum.
Choices().GetCount() == 0 )
3422 auto isNotPolygonOrCircle =
3452 auto isEllipseOrEllipseArc = [](
INSPECTABLE* aItem ) ->
bool
3462 auto isEllipseArc = [](
INSPECTABLE* aItem ) ->
bool
3470 const wxString shapeProps =
_HKI(
"Shape Properties" );
3536 wxASSERT_MSG( aValue.CheckType<
int>(),
3537 "Expecting int-containing value" );
3539 int radius = aValue.As<
int>();
3544 return std::nullopt;
3546 int maxRadius = std::min( prop_shape->GetRectangleWidth(),
3547 prop_shape->GetRectangleHeight() ) / 2;
3550 return std::make_unique<VALIDATION_ERROR_TOO_LARGE<int>>(
radius, maxRadius );
3552 return std::make_unique<VALIDATION_ERROR_TOO_SMALL<int>>(
radius, 0 );
3554 return std::nullopt;
3603 angle->SetAvailableFunc(
3613 auto fillAvailable =
3626 switch( edaShape->GetShape() )
types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
KICAD_T FromProtoEnum(types::KiCadObjectType aValue)
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
constexpr EDA_IU_SCALE pcbIUScale
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 size_type GetWidth() 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 const Vec GetCenter() const
constexpr size_type GetHeight() const
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
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
int AsTenthsOfADegree() 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
virtual void SetEnd(const VECTOR2I &aEnd)
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.
int GetEllipseMinorRadius() const
const VECTOR2I & GetBezierC2() const
const VECTOR2I & GetEllipseCenter() const
void move(const VECTOR2I &aMoveVector)
void SetCenter(const VECTOR2I &aCenter)
VECTOR2I getCenter() const
void SetFillModeProp(UI_FILL_MODE)
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
EDA_ANGLE GetEllipseEndAngle() const
FILL_T GetFillMode() const
void SetCornerRadius(int aRadius)
long long int m_rectangleHeight
int GetEllipseMajorRadius() const
std::unique_ptr< EDA_SHAPE_HATCH_CACHE_DATA > m_hatchingCache
virtual int GetEffectiveWidth() const
std::vector< VECTOR2I > GetPolyPoints() const
Duplicate the polygon outlines into a flat list of VECTOR2I points.
COLOR4D GetLineColor() const
SHAPE_ELLIPSE buildShapeEllipse() const
std::vector< SHAPE * > makeEffectiveShapes(bool aEdgeOnly, bool aLineChainOnly=false, bool aHittesting=false) const
Make a set of SHAPE objects representing the EDA_SHAPE.
int GetRectangleWidth() const
void SetLineStyle(const LINE_STYLE aStyle)
void recalcEllipseArcEndpoints()
When m_shape == ELLIPSE_ARC, recompute m_start/m_end from m_ellipse.
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.
virtual std::vector< VECTOR2I > GetCornersInSequence(EDA_ANGLE angle) const
EDA_ANGLE GetEllipseRotation() const
void ShapeGetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
virtual bool isMoving() const
virtual void SetEllipseEndAngle(const EDA_ANGLE &aA)
bool operator==(const EDA_SHAPE &aOther) const
virtual void SetBezierC2(const VECTOR2I &aPt)
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
const std::vector< SEG > & GetHatchLines() const
void SetRectangleHeight(const int &aHeight)
SHAPE_POLY_SET & hatching() const
bool IsHatchedFill() const
virtual SHAPE_POLY_SET getHatchingKnockouts() const
virtual void SetBezierC1(const VECTOR2I &aPt)
virtual void SetFilled(bool aFlag)
virtual bool IsFilledForHitTesting() const
virtual void SetEllipseRotation(const EDA_ANGLE &aA)
bool continueEdit(const VECTOR2I &aPosition)
wxString ShowShape() const
void SetFillColor(const COLOR4D &aColor)
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.
virtual int GetHatchLineWidth() const
void flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
EDA_SHAPE(SHAPE_T aType, int aLineWidth, FILL_T aFill)
std::vector< SEG > & hatchLines() const
void beginEdit(const VECTOR2I &aStartPoint)
int GetPointCount() const
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
LINE_STYLE GetLineStyle() const
void endEdit(bool aClosed=true)
Finish editing the shape.
virtual void SetEllipseCenter(const VECTOR2I &aPt)
virtual void SetEllipseMinorRadius(int aR)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
virtual void SetEllipseMajorRadius(int aR)
void SetLineColor(const COLOR4D &aColor)
COLOR4D GetFillColor() const
void SetRectangle(const long long int &aHeight, const long long int &aWidth)
virtual void SetShape(SHAPE_T aShape)
void SwapShape(EDA_SHAPE *aImage)
std::vector< VECTOR2I > GetRectCorners() const
std::vector< VECTOR2I > m_bezierPoints
void setPosition(const VECTOR2I &aPos)
EDA_ANGLE GetEllipseStartAngle() const
virtual bool IsProxyItem() const
void computeArcBBox(BOX2I &aBBox) const
virtual void UpdateHatching() const
void SetRectangleWidth(const int &aWidth)
virtual void SetEllipseStartAngle(const EDA_ANGLE &aA)
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 RebuildBezierToSegmentsPointsList()
void SetPolyPoints(const std::vector< VECTOR2I > &aPoints)
wxString getFriendlyName() const
EDA_SHAPE & operator=(const EDA_SHAPE &aOther)
virtual void SetWidth(int aWidth)
EDA_ANGLE GetSegmentAngle() const
int GetCornerRadius() const
void SetFillMode(FILL_T aFill)
std::unique_ptr< SHAPE_POLY_SET > m_poly
virtual void SetPolyShape(const SHAPE_POLY_SET &aShape)
virtual void SetStart(const VECTOR2I &aStart)
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
VECTOR2< NumericType > Center
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, int aMaxError) const
Get the polygonal representation of the roundrect.
int Length() const
Return the length (this).
const VECTOR2I & GetArcMid() const
const VECTOR2I & GetP1() const
const VECTOR2I & GetP0() const
SHAPE_TYPE Type() const
Return the type of the shape.
SHAPE_LINE_CHAIN ConvertToPolyline(int aMaxError) const
Build a polyline approximation of the ellipse or arc.
SEG::ecoord SquaredDistance(const VECTOR2I &aP, bool aOutlineOnly=false) const override
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
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
const SHAPE_ARC & Arc(size_t aArc) const
bool IsClosed() const override
virtual const VECTOR2I GetPoint(int aIndex) const override
void SetPoint(int aIndex, const VECTOR2I &aPos)
Move a point to a specific location.
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.
ssize_t ArcIndex(size_t aSegment) const
Return the arc index for the given segment index.
SEG Segment(int aIndex) const
Return a copy of the aIndex-th segment in the 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.
bool IsArcSegment(size_t aSegment) const
const std::vector< VECTOR2I > & CPoints() const
Represent a set of closed polygons.
void Rotate(const EDA_ANGLE &aAngle, const VECTOR2I &aCenter={ 0, 0 }) override
Rotate all vertices by a given angle.
void RemoveAllContours()
Remove all outlines & holes (clears) the polygon set.
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.
void ClearArcs()
Removes all arc references from all the outlines and holes in the polyset.
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 IsEmpty() const
Return true if the set is empty (no polygons at all)
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.
void Mirror(const VECTOR2I &aRef, FLIP_DIRECTION aFlipDirection)
Mirror the line points about y or x (or both)
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.
void Move(const VECTOR2I &aVector) override
void Fracture(bool aSimplify=true)
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
SHAPE_POLY_SET CloneDropTriangulation() const
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
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.
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 void PackColor(types::Color &aOutput, const KIGFX::COLOR4D &aInput)
KICOMMON_API int UnpackDistance(const types::Distance &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackPolySet(types::PolySet &aOutput, const SHAPE_POLY_SET &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API KIGFX::COLOR4D UnpackColor(const types::Color &aInput)
KICOMMON_API VECTOR2I UnpackVector2(const types::Vector2 &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackDistance(types::Distance &aOutput, int aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackVector2(types::Vector2 &aOutput, const VECTOR2I &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API SHAPE_POLY_SET UnpackPolySet(const types::PolySet &aInput, const EDA_IU_SCALE &aScale)
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_ELLIPSE
ellipse or elliptical arc
@ 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.
const SHAPE_LINE_CHAIN chain
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_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D