48#include <api/common/types/base_types.pb.h> 
   83    switch( aShape.
Type() )
 
   87        auto rect = static_cast<const SHAPE_RECT&>( aShape );
 
   88        m_shape = SHAPE_T::RECTANGLE;
 
   89        SetStart( rect.GetPosition() );
 
   90        SetEnd( rect.GetPosition() + rect.GetSize() );
 
   96        auto seg = static_cast<const SHAPE_SEGMENT&>( aShape );
 
   97        m_shape = SHAPE_T::SEGMENT;
 
   98        SetStart( seg.GetSeg().A );
 
   99        SetEnd( seg.GetSeg().B );
 
  100        SetWidth( seg.GetWidth() );
 
  106        auto line = static_cast<const SHAPE_LINE_CHAIN&>( aShape );
 
  107        m_shape = SHAPE_T::POLY;
 
  108        m_poly = SHAPE_POLY_SET();
 
  109        m_poly.AddOutline( line );
 
  110        SetWidth( line.Width() );
 
  116        auto circle = static_cast<const SHAPE_CIRCLE&>( aShape );
 
  117        m_shape = SHAPE_T::CIRCLE;
 
  118        SetStart( circle.GetCenter() );
 
  119        SetEnd( circle.GetCenter() + circle.GetRadius() );
 
  125        auto arc = static_cast<const SHAPE_ARC&>( aShape );
 
  126        m_shape = SHAPE_T::ARC;
 
  127        SetArcGeometry( arc.GetP0(), arc.GetArcMid(), arc.GetP1() );
 
  128        SetWidth( arc.GetWidth() );
 
  134        auto poly = static_cast<const SHAPE_SIMPLE&>( aShape );
 
  135        m_shape = SHAPE_T::POLY;
 
  136        poly.TransformToPolygon( m_poly, 0, ERROR_INSIDE );
 
 
  155    types::GraphicShape shape;
 
  157    types::StrokeAttributes* stroke = shape.mutable_attributes()->mutable_stroke();
 
  158    types::GraphicFillAttributes* fill = shape.mutable_attributes()->mutable_fill();
 
  160    stroke->mutable_width()->set_value_nm( 
GetWidth() );
 
  176    default:                   fill->set_fill_type( types::GFT_UNFILLED ); 
break;
 
  183        types::GraphicSegmentAttributes* segment = shape.mutable_segment();
 
  191        types::GraphicRectangleAttributes* rectangle = shape.mutable_rectangle();
 
  200        types::GraphicArcAttributes* arc = shape.mutable_arc();
 
  209        types::GraphicCircleAttributes* 
circle = shape.mutable_circle();
 
  223        types::GraphicBezierAttributes* bezier = shape.mutable_bezier();
 
  232        wxASSERT_MSG( 
false, 
"Unhandled shape in PCB_SHAPE::Serialize" );
 
  237    aContainer.PackFrom( shape );
 
 
  245    types::GraphicShape shape;
 
  247    if( !aContainer.UnpackTo( &shape ) )
 
  262    SetFilled( shape.attributes().fill().fill_type() == types::GFT_FILLED );
 
  263    SetWidth( shape.attributes().stroke().width().value_nm() );
 
  265    switch( shape.attributes().stroke().style() )
 
  276    if( shape.has_segment() )
 
  282    else if( shape.has_rectangle() )
 
  289    else if( shape.has_arc() )
 
  296    else if( shape.has_circle() )
 
  302    else if( shape.has_polygon() )
 
  307    else if( shape.has_bezier() )
 
 
  329        default:                 
return wxT( 
"??" );
 
  342        default:                 
return wxT( 
"??" );
 
 
  361    return wxEmptyString;  
 
 
  376        return m_poly.CVertex( 0 );
 
 
  398        for( 
int ii = 0; ii < 
m_poly.COutline( 0 ).SegmentCount(); ii++ )
 
  399            length += 
m_poly.COutline( 0 ).CSegment( ii ).Length();
 
 
  453        int maxRadius = std::min( width, height ) / 2;
 
 
  525            return m_poly.Outline( 0 ).IsClosed();
 
 
  580    std::vector<double> slopes;
 
  588        slopes = { 1.0, -1.0 };
 
  622        shapeBuffer = 
m_poly.CloneDropTriangulation();
 
  633    if( majorAxis / spacing > 100 )
 
  634        spacing = majorAxis / 100;
 
  641            int maxError = lineWidth;
 
  653        int gridsize = spacing;
 
  662        hole_base.
Append( corner );
 
  663        corner.
x += hole_size;
 
  664        hole_base.
Append( corner );
 
  665        corner.
y += hole_size;
 
  666        hole_base.
Append( corner );
 
  668        hole_base.
Append( corner );
 
  675        int x_offset = bbox.
GetX() - ( bbox.
GetX() ) % gridsize - gridsize;
 
  676        int y_offset = bbox.
GetY() - ( bbox.
GetY() ) % gridsize - gridsize;
 
  678        for( 
int xx = x_offset; xx <= bbox.
GetRight(); xx += gridsize )
 
  680            for( 
int yy = y_offset; yy <= bbox.
GetBottom(); yy += gridsize )
 
 
  714        m_end += aMoveVector;
 
  718        m_poly.Move( aMoveVector );
 
  723        m_end += aMoveVector;
 
 
  746                pt.x = 
KiROUND( pt.x * aScale );
 
  747                pt.y = 
KiROUND( pt.y * aScale );
 
  765        std::vector<VECTOR2I> pts;
 
  767        for( 
int ii = 0; ii < 
m_poly.OutlineCount(); ++ ii )
 
  771                pts.emplace_back( pt );
 
  772                scalePt( pts.back() );
 
 
  829            m_poly.Rotate( aAngle, aRotCentre );
 
  835        m_poly.Rotate( aAngle, aRotCentre );
 
 
  882        m_poly.Mirror( aCentre, aFlipDirection );
 
 
  919    std::vector<VECTOR2I> bezierPoints;
 
  924    converter.
GetPoly( bezierPoints, aMaxError );
 
 
  996    if( aEndAngle == aStartAngle )
 
  999    while( aEndAngle < aStartAngle )
 
 
 1023    if( 
radius > (
double) INT_MAX / 2.0 )
 
 1024        radius = (double) INT_MAX / 2.0;
 
 
 1086    return endAngle - startAngle;
 
 
 1114    if( aCheckNegativeAngle && aAngle < 
ANGLE_0 )
 
 
 1130        default:                 
return _( 
"Unrecognized" );
 
 1143        default:                 
return _( 
"Unrecognized" );
 
 
 1153    wxString shape = 
_( 
"Shape" );
 
 1166        aList.emplace_back( 
_( 
"Angle" ), msg );
 
 1176        msg.Printf( wxS( 
"%d" ), 
GetPolyShape().Outline(0).PointCount() );
 
 1177        aList.emplace_back( 
_( 
"Points" ), msg );
 
 1200    m_stroke.GetMsgPanelInfo( aFrame, aList );
 
 
 1234        for( 
auto iter = 
m_poly.CIterate(); iter; iter++ )
 
 1235            bbox.
Merge( *iter );
 
 
 1261    double maxdist = aAccuracy;
 
 1274            return dist <= 
radius + maxdist;          
 
 1275        else if( abs( 
radius - dist ) <= maxdist )    
 
 1299            if( dist > 
radius + maxdist )
 
 1305            if( abs( 
radius - dist ) > maxdist )
 
 1320        if( endAngle > startAngle )
 
 1321            return relPosAngle >= startAngle && relPosAngle <= endAngle;
 
 1323            return relPosAngle >= startAngle || relPosAngle <= endAngle;
 
 1329        std::vector<VECTOR2I> updatedBezierPoints;
 
 1334            converter.
GetPoly( updatedBezierPoints, aAccuracy / 2 );
 
 1335            pts = &updatedBezierPoints;
 
 1338        for( 
unsigned int i = 1; i < pts->size(); i++ )
 
 1340            if( 
TestSegmentHit( aPosition, ( *pts )[i - 1], ( *pts )[i], maxdist ) )
 
 1358            return poly.
Collide( aPosition, maxdist );
 
 1366            if( poly.
CollideEdge( aPosition, 
nullptr, maxdist ) )
 
 1390            if( !
m_poly.COutline( 0 ).IsClosed() )
 
 1394                copy.SetClosed( 
true );
 
 1395                return copy.Collide( aPosition, maxdist );
 
 1399                return m_poly.Collide( aPosition, maxdist );
 
 1404            if( 
m_poly.CollideEdge( aPosition, 
nullptr, maxdist ) )
 
 
 1422    BOX2I arect = aRect;
 
 1431                int count = (int) outline.GetPointCount();
 
 1433                for( 
int ii = 0; ii < count; ii++ )
 
 1435                    VECTOR2I vertex = outline.GetPoint( ii );
 
 1441                    if( ii + 1 < count )
 
 1443                        VECTOR2I vertexNext = outline.GetPoint( ii + 1 );
 
 1449                    else if( outline.IsClosed() )
 
 1451                        VECTOR2I vertexNext = outline.GetPoint( 0 );
 
 1517            return checkOutline( poly.
Outline( 0 ) );
 
 1558            for( 
int ii = 0; ii < 
m_poly.OutlineCount(); ++ii )
 
 1560                if( checkOutline( 
m_poly.Outline( ii ) ) )
 
 1582            std::vector<VECTOR2I> updatedBezierPoints;
 
 1587                converter.
GetPoly( updatedBezierPoints, aAccuracy / 2 );
 
 1588                pts = &updatedBezierPoints;
 
 1591            for( 
unsigned ii = 1; ii < pts->size(); ii++ )
 
 1593                VECTOR2I vertex = ( *pts )[ii - 1];
 
 1594                VECTOR2I vertexNext = ( *pts )[ii];
 
 
 1625    std::vector<VECTOR2I> pts;
 
 1629    pts.emplace_back( topLeft );
 
 1630    pts.emplace_back( botRight.
x, topLeft.
y );
 
 1631    pts.emplace_back( botRight );
 
 1632    pts.emplace_back( topLeft.
x, botRight.
y );
 
 
 1640    std::vector<VECTOR2I> pts;
 
 1689        std::vector<VECTOR2I> corners;
 
 1694                corners.emplace_back( pt );
 
 1697        while( corners.size() < 4 )
 
 1698            corners.emplace_back( corners.back() + 
VECTOR2I( 10, 10 ) );
 
 1705        for( 
const VECTOR2I& corner : corners )
 
 1707            if( corner.x < minX.
x )
 
 1710            if( corner.x > maxX.
x )
 
 1713            if( corner.y < minY.
y )
 
 1716            if( corner.y > maxY.
y )
 
 1722            pts.emplace_back( minX );
 
 1723            pts.emplace_back( minY );
 
 1724            pts.emplace_back( maxX );
 
 1725            pts.emplace_back( maxY );
 
 1729            pts.emplace_back( maxY );
 
 1730            pts.emplace_back( minX );
 
 1731            pts.emplace_back( minY );
 
 1732            pts.emplace_back( maxX );
 
 1736            pts.emplace_back( maxX );
 
 1737            pts.emplace_back( maxY );
 
 1738            pts.emplace_back( minX );
 
 1739            pts.emplace_back( minY );
 
 1743            pts.emplace_back( minY );
 
 1744            pts.emplace_back( maxX );
 
 1745            pts.emplace_back( maxY );
 
 1746            pts.emplace_back( minX );
 
 
 1775        if( t1 < ANGLE_0 && t2 > 
ANGLE_0 )
 
 1778        if( t1 < ANGLE_90 && t2 > 
ANGLE_90 )
 
 1789        if( t1 < ANGLE_0 || t2 > 
ANGLE_0 )
 
 1792        if( t1 < ANGLE_90 || t2 > 
ANGLE_90 )
 
 
 1806    m_poly.RemoveAllContours();
 
 1810        m_poly.Append( p.x, p.y );
 
 
 1816    std::vector<SHAPE*> effectiveShapes;
 
 1846                effectiveShapes.emplace_back( 
new SHAPE_SIMPLE( outline ) );
 
 1848            if( width > 0 || !solidFill )
 
 1850                std::set<size_t> arcsHandled;
 
 1856                        size_t arcIndex = outline.
ArcIndex( ii );
 
 1858                        if( !arcsHandled.contains( arcIndex ) )
 
 1860                            arcsHandled.insert( arcIndex );
 
 1861                            effectiveShapes.emplace_back( 
new SHAPE_ARC( outline.
Arc( arcIndex ), width ) );
 
 1876                effectiveShapes.emplace_back( 
new SHAPE_SIMPLE( pts ) );
 
 1878            if( width > 0 || !solidFill )
 
 1880                effectiveShapes.emplace_back( 
new SHAPE_SEGMENT( pts[0], pts[1], width ) );
 
 1881                effectiveShapes.emplace_back( 
new SHAPE_SEGMENT( pts[1], pts[2], width ) );
 
 1882                effectiveShapes.emplace_back( 
new SHAPE_SEGMENT( pts[2], pts[3], width ) );
 
 1883                effectiveShapes.emplace_back( 
new SHAPE_SEGMENT( pts[3], pts[0], width ) );
 
 1894        if( width > 0 || !solidFill )
 
 1903        VECTOR2I              start_pt = bezierPoints[0];
 
 1905        for( 
unsigned int jj = 1; jj < bezierPoints.size(); jj++ )
 
 1907            VECTOR2I end_pt = bezierPoints[jj];
 
 1908            effectiveShapes.emplace_back( 
new SHAPE_SEGMENT( start_pt, end_pt, width ) );
 
 1931                if( aLineChainOnly && l.
IsClosed() )
 
 1934                for( 
int jj = 0; jj < segCount; jj++ )
 
 1946    return effectiveShapes;
 
 
 1952    std::vector<VECTOR2I> points;
 
 1954    for( 
int ii = 0; ii < 
m_poly.OutlineCount(); ++ii )
 
 1961            points.reserve( points.size() + pointCount );
 
 1964                points.emplace_back( pt );
 
 
 2015        m_poly.Outline( 0 ).SetClosed( 
false );
 
 2018        m_poly.Outline( 0 ).Append( aPosition );
 
 2019        m_poly.Outline( 0 ).Append( aPosition, 
true );
 
 
 2051            poly.
Append( aPosition, 
true );
 
 
 2064#define sq( x ) pow( x, 2 ) 
 2142            if( chordBefore > 0 )
 
 2143                ratio = chordAfter / chordBefore;
 
 2146                radius = std::max( sqrt( 
sq( 
radius ) * ratio ), sqrt( chordAfter ) / 2 );
 
 2152            double radialA = 
m_start.Distance( aPosition );
 
 2153            double radialB = 
m_end.Distance( aPosition );
 
 2154            radius = ( radialA + radialB ) / 2.0;
 
 2168        double   sqRadDiff = ( 
radius * 
radius ) - ( l * l ) / 4.0;
 
 2173        if( l > 0 && sqRadDiff >= 0 )
 
 2215        m_poly.Outline( 0 ).SetPoint( 
m_poly.Outline( 0 ).GetPointCount() - 1, aPosition );
 
 
 2267    #define SWAPITEM( x ) std::swap( x, image->x ) 
 
 2292#define TEST( a, b ) { if( a != b ) return a - b; } 
 2293#define TEST_E( a, b ) { if( abs( a - b ) > EPSILON ) return a - b; } 
 2294#define TEST_PT( a, b ) { TEST_E( a.x, b.x ); TEST_E( a.y, b.y ); } 
 2322    for( 
int ii = 0; ii < 
m_poly.TotalVertices(); ++ii )
 
 
 2334                                         ERROR_LOC aErrorLoc, 
bool ignoreLineWidth, 
bool includeFill )
 const 
 2337    int  width = ignoreLineWidth ? 0 : 
GetWidth();
 
 2339    width += 2 * aClearance;
 
 2366                                                      0.0, 0, width / 2, aError, aErrorLoc );
 
 2373                                                      0.0, 0, 0, aError, aErrorLoc );
 
 2377                for( 
int ii = 0; ii < outline.
PointCount(); ii++ )
 
 2380                                            aError, aErrorLoc );
 
 2396            if( width > 0 || !solidFill )
 
 2424            for( 
int ii = 0; ii < 
m_poly.OutlineCount(); ++ii )
 
 2435                    int inflate = width / 2;
 
 2448            for( 
int ii = 0; ii < 
m_poly.OutlineCount(); ++ii )
 
 2452                for( 
int jj = 0; jj < (int) poly.
SegmentCount(); ++jj )
 
 2467        std::vector<VECTOR2I> poly;
 
 2468        converter.
GetPoly( poly, aError );
 
 2470        for( 
unsigned ii = 1; ii < poly.size(); ii++ )
 
 
 2546    for( 
int ii = 0; ii < 
m_poly.TotalVertices(); ++ii )
 
 
 2561    double similarity = 1.0;
 
 2596        similarity *= std::pow( 0.9, m + n - 2 * longest );
 
 2600        int m = 
m_poly.TotalVertices();
 
 2602        std::vector<VECTOR2I> poly;
 
 2603        std::vector<VECTOR2I> otherPoly;
 
 2611        for( 
int ii = 0; ii < m; ++ii )
 
 2613            poly.emplace_back( lastPt - 
m_poly.CVertex( ii ) );
 
 2614            lastPt = 
m_poly.CVertex( ii );
 
 2619        for( 
int ii = 0; ii < n; ++ii )
 
 2621            otherPoly.emplace_back( lastPt - aOther.
m_poly.
CVertex( ii ) );
 
 2627        similarity *= std::pow( 0.9, m + n - 2 * longest );
 
 
 2653        if( lineStyleEnum.
Choices().GetCount() == 0 )
 
 2664        if( hatchModeEnum.
Choices().GetCount() == 0 )
 
 2676        auto isNotPolygonOrCircle =
 
 2706        const wxString shapeProps = 
_HKI( 
"Shape Properties" );
 
 2772                                   wxASSERT_MSG( aValue.CheckType<
int>(),
 
 2773                                                 "Expecting int-containing value" );
 
 2775                                   int radius = aValue.As<
int>();
 
 2781                                       wxLogDebug( wxT( 
"Corner Radius Validator: Not an EDA_SHAPE" ) );
 
 2782                                       return std::nullopt;
 
 2785                                   int maxRadius = std::min( prop_shape->GetRectangleWidth(),
 
 2786                                                             prop_shape->GetRectangleHeight() ) / 2;
 
 2789                                       return std::make_unique<VALIDATION_ERROR_TOO_LARGE<int>>( 
radius, maxRadius );
 
 2791                                       return std::make_unique<VALIDATION_ERROR_TOO_SMALL<int>>( 
radius, 0 );
 
 2793                                   return std::nullopt;
 
 2812        angle->SetAvailableFunc(
 
 2822        auto fillAvailable =
 
 2835                        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 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 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
 
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)
 
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
 
std::vector< VECTOR2I > GetPolyPoints() const
Duplicate the polygon outlines into a flat list of VECTOR2I points.
 
COLOR4D GetLineColor() const
 
std::vector< SHAPE * > makeEffectiveShapes(bool aEdgeOnly, bool aLineChainOnly=false, bool aHittesting=false) const
Make a set of SHAPE objects representing the EDA_SHAPE.
 
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)
 
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)
 
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
 
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, int aMaxError) 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
 
const SHAPE_ARC & Arc(size_t aArc) const
 
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.
 
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.
 
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
 
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.
 
@ 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