43 m_endsSwapped( false ),
48 m_rectangleHeight( 0 ),
49 m_rectangleWidth( 0 ),
68 case SHAPE_T::SEGMENT:
return _(
"Thermal Spoke" );
69 case SHAPE_T::RECTANGLE:
return _(
"Number Box" );
70 default:
return wxT(
"??" );
77 case SHAPE_T::SEGMENT:
return _(
"Line" );
78 case SHAPE_T::RECTANGLE:
return _(
"Rect" );
79 case SHAPE_T::ARC:
return _(
"Arc" );
80 case SHAPE_T::CIRCLE:
return _(
"Circle" );
81 case SHAPE_T::BEZIER:
return _(
"Bezier Curve" );
82 case SHAPE_T::POLY:
return _(
"Polygon" );
83 default:
return wxT(
"??" );
93 case SHAPE_T::SEGMENT:
return wxS(
"S_SEGMENT" );
94 case SHAPE_T::RECTANGLE:
return wxS(
"S_RECT" );
95 case SHAPE_T::ARC:
return wxS(
"S_ARC" );
96 case SHAPE_T::CIRCLE:
return wxS(
"S_CIRCLE" );
97 case SHAPE_T::POLY:
return wxS(
"S_POLYGON" );
98 case SHAPE_T::BEZIER:
return wxS(
"S_CURVE" );
99 case SHAPE_T::UNDEFINED:
return wxS(
"UNDEFINED" );
102 return wxEmptyString;
116 else if(
m_shape == SHAPE_T::POLY )
129 case SHAPE_T::BEZIER:
135 case SHAPE_T::SEGMENT:
157 case SHAPE_T::RECTANGLE:
170 case SHAPE_T::RECTANGLE:
183 case SHAPE_T::SEGMENT:
195 case SHAPE_T::RECTANGLE:
209 case SHAPE_T::RECTANGLE:
223 case SHAPE_T::RECTANGLE:
238 case SHAPE_T::SEGMENT:
251 case SHAPE_T::CIRCLE:
252 case SHAPE_T::RECTANGLE:
256 case SHAPE_T::SEGMENT:
265 case SHAPE_T::BEZIER:
287 case SHAPE_T::SEGMENT:
288 case SHAPE_T::RECTANGLE:
289 case SHAPE_T::CIRCLE:
291 m_end += aMoveVector;
298 case SHAPE_T::BEZIER:
300 m_end += aMoveVector;
320 pt.x =
KiROUND( pt.x * aScale );
321 pt.y =
KiROUND( pt.y * aScale );
330 case SHAPE_T::SEGMENT:
331 case SHAPE_T::RECTANGLE:
336 case SHAPE_T::CIRCLE:
344 std::vector<VECTOR2I> pts;
350 pts.emplace_back( pt );
351 scalePt( pts.back() );
359 case SHAPE_T::BEZIER:
378 case SHAPE_T::SEGMENT:
379 case SHAPE_T::CIRCLE:
390 case SHAPE_T::RECTANGLE:
413 case SHAPE_T::BEZIER:
435 case SHAPE_T::SEGMENT:
436 case SHAPE_T::RECTANGLE:
441 case SHAPE_T::CIRCLE:
458 case SHAPE_T::BEZIER:
477 if(
m_shape != SHAPE_T::BEZIER )
490 std::vector<VECTOR2I> bezierPoints;
495 converter.
GetPoly( bezierPoints, aMaxError );
508 case SHAPE_T::CIRCLE:
511 case SHAPE_T::SEGMENT:
516 case SHAPE_T::RECTANGLE:
517 case SHAPE_T::BEZIER:
535 case SHAPE_T::CIRCLE:
567 if( aEndAngle == aStartAngle )
570 while( aEndAngle < aStartAngle )
585 case SHAPE_T::CIRCLE:
594 return std::max( 1,
KiROUND( radius ) );
652 return endAngle - startAngle;
680 if( aCheckNegativeAngle && aAngle <
ANGLE_0 )
694 case SHAPE_T::RECTANGLE:
return _(
"Pad Number Box" );
695 case SHAPE_T::SEGMENT:
return _(
"Thermal Spoke Template" );
696 default:
return _(
"Unrecognized" );
703 case SHAPE_T::CIRCLE:
return _(
"Circle" );
704 case SHAPE_T::ARC:
return _(
"Arc" );
705 case SHAPE_T::BEZIER:
return _(
"Curve" );
706 case SHAPE_T::POLY:
return _(
"Polygon" );
707 case SHAPE_T::RECTANGLE:
return _(
"Rectangle" );
708 case SHAPE_T::SEGMENT:
return _(
"Segment" );
709 default:
return _(
"Unrecognized" );
719 wxString shape =
_(
"Shape" );
724 case SHAPE_T::CIRCLE:
730 aList.emplace_back(
_(
"Angle" ), msg );
735 case SHAPE_T::BEZIER:
740 msg.Printf( wxS(
"%d" ),
GetPolyShape().Outline(0).PointCount() );
741 aList.emplace_back(
_(
"Points" ), msg );
744 case SHAPE_T::RECTANGLE:
745 aList.emplace_back(
_(
"Width" ),
748 aList.emplace_back(
_(
"Height" ),
752 case SHAPE_T::SEGMENT:
754 aList.emplace_back(
_(
"Length" ),
778 case SHAPE_T::RECTANGLE:
784 case SHAPE_T::SEGMENT:
789 case SHAPE_T::CIRCLE:
807 case SHAPE_T::BEZIER:
828 double maxdist = aAccuracy;
835 case SHAPE_T::CIRCLE:
841 return dist <= radius + maxdist;
843 return abs( radius - dist ) <= maxdist;
861 if( dist > radius + maxdist )
867 if( abs( radius - dist ) > maxdist )
882 if( endAngle > startAngle )
883 return relPosAngle >= startAngle && relPosAngle <= endAngle;
885 return relPosAngle >= startAngle || relPosAngle <= endAngle;
888 case SHAPE_T::BEZIER:
891 std::vector<VECTOR2I> updatedBezierPoints;
896 converter.
GetPoly( updatedBezierPoints, aAccuracy / 2 );
897 pts = &updatedBezierPoints;
900 for(
unsigned int i = 1; i < pts->size(); i++ )
902 if(
TestSegmentHit( aPosition, ( *pts )[i - 1], ( *pts )[i], maxdist ) )
908 case SHAPE_T::SEGMENT:
911 case SHAPE_T::RECTANGLE:
920 return poly.
Collide( aPosition, maxdist );
938 copy.Outline( 0 ).Append(
copy.Outline( 0 ).CPoint( 0 ) );
939 return copy.Collide( aPosition, maxdist );
968 case SHAPE_T::CIRCLE:
1007 case SHAPE_T::RECTANGLE:
1024 case SHAPE_T::SEGMENT:
1056 for(
int jj = 0; jj < count; jj++ )
1064 if( jj + 1 < count )
1086 case SHAPE_T::BEZIER:
1101 std::vector<VECTOR2I> updatedBezierPoints;
1106 converter.
GetPoly( updatedBezierPoints, aAccuracy / 2 );
1107 pts = &updatedBezierPoints;
1110 for(
unsigned ii = 1; ii < pts->size(); ii++ )
1112 VECTOR2I vertex = ( *pts )[ii - 1];
1113 VECTOR2I vertexNext = ( *pts )[ii];
1136 std::vector<VECTOR2I> pts;
1140 pts.emplace_back( topLeft );
1141 pts.emplace_back( botRight.
x, topLeft.
y );
1142 pts.emplace_back( botRight );
1143 pts.emplace_back( topLeft.
x, botRight.
y );
1170 if( t1 < ANGLE_0 && t2 >
ANGLE_0 )
1173 if( t1 < ANGLE_90 && t2 >
ANGLE_90 )
1184 if( t1 < ANGLE_0 || t2 >
ANGLE_0 )
1187 if( t1 < ANGLE_90 || t2 >
ANGLE_90 )
1211 std::vector<SHAPE*> effectiveShapes;
1220 case SHAPE_T::SEGMENT:
1224 case SHAPE_T::RECTANGLE:
1229 effectiveShapes.emplace_back(
new SHAPE_SIMPLE( pts ) );
1231 if( width > 0 || !
IsFilled() || aEdgeOnly )
1233 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( pts[0], pts[1], width ) );
1234 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( pts[1], pts[2], width ) );
1235 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( pts[2], pts[3], width ) );
1236 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( pts[3], pts[0], width ) );
1241 case SHAPE_T::CIRCLE:
1246 if( width > 0 || !
IsFilled() || aEdgeOnly )
1252 case SHAPE_T::BEZIER:
1255 VECTOR2I start_pt = bezierPoints[0];
1257 for(
unsigned int jj = 1; jj < bezierPoints.size(); jj++ )
1259 VECTOR2I end_pt = bezierPoints[jj];
1260 effectiveShapes.emplace_back(
new SHAPE_SEGMENT( start_pt, end_pt, width ) );
1279 if( width > 0 || !
IsFilled() || aEdgeOnly )
1283 if( aLineChainOnly && l.
IsClosed() )
1286 for(
int jj = 0; jj < segCount; jj++ )
1298 return effectiveShapes;
1310 aBuffer.reserve( pointCount );
1313 aBuffer.emplace_back( iter->x, iter->y );
1338 case SHAPE_T::SEGMENT:
1339 case SHAPE_T::CIRCLE:
1340 case SHAPE_T::RECTANGLE:
1350 case SHAPE_T::BEZIER:
1380 case SHAPE_T::SEGMENT:
1381 case SHAPE_T::CIRCLE:
1382 case SHAPE_T::RECTANGLE:
1385 case SHAPE_T::BEZIER:
1398 poly.
Append( aPosition,
true );
1411#define sq( x ) pow( x, 2 )
1415 case SHAPE_T::SEGMENT:
1416 case SHAPE_T::CIRCLE:
1417 case SHAPE_T::RECTANGLE:
1421 case SHAPE_T::BEZIER:
1482 if( chordBefore > 0 )
1483 ratio = chordAfter / chordBefore;
1486 radius = std::max( sqrt(
sq( radius ) * ratio ), sqrt( chordAfter ) / 2 );
1494 radius = ( radialA + radialB ) / 2.0;
1508 double sqRadDiff = ( radius * radius ) - ( l * l ) / 4.0;
1513 if( l > 0 && sqRadDiff >= 0 )
1568 case SHAPE_T::SEGMENT:
1569 case SHAPE_T::CIRCLE:
1570 case SHAPE_T::RECTANGLE:
1571 case SHAPE_T::BEZIER:
1605 #define SWAPITEM( x ) std::swap( x, image->x )
1627#define TEST( a, b ) { if( a != b ) return a - b; }
1628#define TEST_E( a, b ) { if( abs( a - b ) > EPSILON ) return a - b; }
1629#define TEST_PT( a, b ) { TEST_E( a.x, b.x ); TEST_E( a.y, b.y ); }
1640 else if(
m_shape == SHAPE_T::BEZIER )
1645 else if(
m_shape == SHAPE_T::POLY )
1665 ERROR_LOC aErrorLoc,
bool ignoreLineWidth )
const
1667 int width = ignoreLineWidth ? 0 :
GetWidth();
1669 width += 2 * aClearance;
1673 case SHAPE_T::CIRCLE:
1685 case SHAPE_T::RECTANGLE:
1713 case SHAPE_T::SEGMENT:
1735 int inflate = width / 2;
1740 tmp.
Inflate( inflate, CORNER_STRATEGY::ROUND_ALL_CORNERS, aError );
1752 for(
int jj = 0; jj < (int) poly.
SegmentCount(); ++jj )
1763 case SHAPE_T::BEZIER:
1767 std::vector<VECTOR2I> poly;
1768 converter.
GetPoly( poly, aError );
1770 for(
unsigned ii = 1; ii < poly.size(); ii++ )
1794 return LINE_STYLE::SOLID;
1848 double similarity = 1.0;
1883 similarity *= std::pow( 0.9, m + n - 2 * longest );
1889 std::vector<VECTOR2I> poly;
1890 std::vector<VECTOR2I> otherPoly;
1898 for(
int ii = 0; ii < m; ++ii )
1906 for(
int ii = 0; ii < n; ++ii )
1908 otherPoly.emplace_back( lastPt - aOther.
m_poly.
CVertex( ii ) );
1914 similarity *= std::pow( 0.9, m + n - 2 * longest );
1939 if( plotDashTypeEnum.Choices().GetCount() == 0 )
1952 auto isNotPolygonOrCircle = [](
INSPECTABLE* aItem ) ->
bool
1970 auto isRectangle = [](
INSPECTABLE* aItem ) ->
bool
1979 const wxString shapeProps =
_HKI(
"Shape Properties" );
2054 angle->SetAvailableFunc(
2064 auto fillAvailable =
2077 switch( edaShape->GetShape() )
2096 .SetAvailableFunc( fillAvailable );
2100 fillColor->SetWriteableFunc(
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 Vec Centre() 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 bool Contains(const Vec &aPoint) const
constexpr void SetEnd(coord_type x, coord_type y)
constexpr bool Intersects(const BOX2< Vec > &aRect) 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.
EDA_ANGLE GetArcAngle() const
const VECTOR2I & GetBezierC2() const
void SetBezierC2(const VECTOR2I &aPt)
void move(const VECTOR2I &aMoveVector)
void SetCenter(const VECTOR2I &aCenter)
VECTOR2I getCenter() const
void SetLength(const double &aLength)
void rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
const std::vector< VECTOR2I > buildBezierToSegmentsPointsList(int aMaxError) const
long long int m_rectangleHeight
virtual int GetEffectiveWidth() const
COLOR4D GetLineColor() const
int GetRectangleWidth() const
void SetLineStyle(const LINE_STYLE aStyle)
void calcEdit(const VECTOR2I &aPosition)
SHAPE_POLY_SET & GetPolyShape()
void CalcArcAngles(EDA_ANGLE &aStartAngle, EDA_ANGLE &aEndAngle) const
Calc arc start and end angles such that aStartAngle < aEndAngle.
void ShapeGetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
void SetFilled(bool aFlag)
bool operator==(const EDA_SHAPE &aOther) const
void SetRectangleHeight(const int &aHeight)
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.
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)
Finishes 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 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
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)
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const
Convert the shape to a closed polygon.
wxString getFriendlyName() const
void SetWidth(int aWidth)
EDA_ANGLE GetSegmentAngle() const
long long int m_rectangleWidth
bool IsPolyShapeValid() const
int Compare(const EDA_SHAPE *aOther) const
VECTOR2I GetArcMid() const
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 & 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.
int Length() const
Return the length (this).
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
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.
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.
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.
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)
CONST_ITERATOR CIterate(int aFirst, int aLast, bool aIterateHoles=false) const
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)
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
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
Represent a simple polygon consisting of a zero-thickness closed chain of connected line segments.
void SetLineStyle(LINE_STYLE aLineStyle)
void GetMsgPanelInfo(UNITS_PROVIDER *aUnitsProvider, std::vector< MSG_PANEL_ITEM > &aList, bool aIncludeStyle=true, bool aIncludeWidth=true)
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 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.
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_90
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
@ ARC
use RECTANGLE instead of RECT to avoid collision in a Windows header
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.
size_t longest_common_subset(const _Container &__c1, const _Container &__c2)
Returns the length of the longest common subset of values between two containers.
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)
LINE_STYLE
Dashed line types.
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