KiCad PCB EDA Suite
EDA_SHAPE Class Referenceabstract

#include <eda_shape.h>

Inheritance diagram for EDA_SHAPE:
LIB_SHAPE PCB_SHAPE SCH_SHAPE LIB_TEXTBOX FP_SHAPE PCB_TEXTBOX SCH_TEXTBOX FP_TEXTBOX

Public Member Functions

 EDA_SHAPE (SHAPE_T aType, int aLineWidth, FILL_T aFill)
 
virtual ~EDA_SHAPE ()
 
void SwapShape (EDA_SHAPE *aImage)
 
wxString ShowShape () const
 
wxString SHAPE_T_asString () const
 
bool IsAnnotationProxy () const
 
void SetIsAnnotationProxy (bool aIsProxy=true)
 
bool IsFilled () const
 
void SetFilled (bool aFlag)
 
void SetFillMode (FILL_T aFill)
 
FILL_T GetFillMode () const
 
COLOR4D GetFillColor () const
 
void SetFillColor (const COLOR4D &aColor)
 
void SetWidth (int aWidth)
 
int GetWidth () const
 
virtual int GetEffectiveWidth () const
 
void SetShape (SHAPE_T aShape)
 
SHAPE_T GetShape () const
 
const VECTOR2IGetStart () const
 Return the starting point of the graphic. More...
 
int GetStartY () const
 
int GetStartX () const
 
void SetStart (const VECTOR2I &aStart)
 
void SetStartY (int y)
 
void SetStartX (int x)
 
const VECTOR2IGetEnd () const
 Return the ending point of the graphic. More...
 
int GetEndY () const
 
int GetEndX () const
 
void SetEnd (const VECTOR2I &aEnd)
 
void SetEndY (int y)
 
void SetEndX (int x)
 
virtual VECTOR2I GetTopLeft () const
 
virtual VECTOR2I GetBotRight () const
 
virtual void SetTop (int val)
 
virtual void SetLeft (int val)
 
virtual void SetRight (int val)
 
virtual void SetBottom (int val)
 
void SetBezierC1 (const VECTOR2I &aPt)
 
const VECTOR2IGetBezierC1 () const
 
void SetBezierC2 (const VECTOR2I &aPt)
 
const VECTOR2IGetBezierC2 () const
 
VECTOR2I getCenter () const
 
void SetCenter (const VECTOR2I &aCenter)
 
void SetArcAngleAndEnd (const EDA_ANGLE &aAngle, bool aCheckNegativeAngle=false)
 Set the end point from the angle center and start. More...
 
EDA_ANGLE GetArcAngle () const
 
bool EndsSwapped () const
 Have the start and end points been swapped since they were set? More...
 
VECTOR2I GetArcMid () const
 
std::vector< VECTOR2IGetRectCorners () const
 
void CalcArcAngles (EDA_ANGLE &aStartAngle, EDA_ANGLE &aEndAngle) const
 Calc arc start and end angles such that aStartAngle < aEndAngle. More...
 
int GetRadius () const
 
void SetArcGeometry (const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
 Set the three controlling points for an arc. More...
 
void SetCachedArcData (const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, const VECTOR2I &aCenter)
 Set the data used for mid point caching. More...
 
const std::vector< VECTOR2I > & GetBezierPoints () const
 
void DupPolyPointsList (std::vector< VECTOR2I > &aBuffer) const
 Duplicate the list of corners in a std::vector<VECTOR2I> More...
 
int GetPointCount () const
 
SHAPE_POLY_SETGetPolyShape ()
 
const SHAPE_POLY_SETGetPolyShape () const
 
bool IsPolyShapeValid () const
 
void SetPolyShape (const SHAPE_POLY_SET &aShape)
 
void SetPolyPoints (const std::vector< VECTOR2I > &aPoints)
 
void RebuildBezierToSegmentsPointsList (int aMinSegLen)
 Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments. More...
 
virtual std::vector< SHAPE * > MakeEffectiveShapes (bool aEdgeOnly=false) const
 Make a set of SHAPE objects representing the EDA_SHAPE. More...
 
void ShapeGetMsgPanelInfo (EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
 
double GetLength () const
 Return the length of the track using the hypotenuse calculation. More...
 
void TransformShapeWithClearanceToPolygon (SHAPE_POLY_SET &aCornerBuffer, int aClearanceValue, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth) const
 Convert the shape to a closed polygon. More...
 
int Compare (const EDA_SHAPE *aOther) const
 

Protected Member Functions

void setPosition (const VECTOR2I &aPos)
 
VECTOR2I getPosition () const
 
void move (const VECTOR2I &aMoveVector)
 
void rotate (const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
 
void flip (const VECTOR2I &aCentre, bool aFlipLeftRight)
 
void scale (double aScale)
 
virtual EDA_ANGLE getParentOrientation () const =0
 
virtual VECTOR2I getParentPosition () const =0
 
const BOX2I getBoundingBox () const
 
void computeArcBBox (BOX2I &aBBox) const
 
bool hitTest (const VECTOR2I &aPosition, int aAccuracy=0) const
 
bool hitTest (const BOX2I &aRect, bool aContained, int aAccuracy=0) const
 
const std::vector< VECTOR2IbuildBezierToSegmentsPointsList (int aMinSegLen) const
 
void beginEdit (const VECTOR2I &aStartPoint)
 
bool continueEdit (const VECTOR2I &aPosition)
 
void calcEdit (const VECTOR2I &aPosition)
 
void endEdit (bool aClosed=true)
 Finishes editing the shape. More...
 
void setEditState (int aState)
 
std::vector< SHAPE * > makeEffectiveShapes (bool aEdgeOnly, bool aLineChainOnly=false) const
 Make a set of SHAPE objects representing the EDA_SHAPE. More...
 

Protected Attributes

bool m_endsSwapped
 
SHAPE_T m_shape
 
STROKE_PARAMS m_stroke
 
FILL_T m_fill
 
COLOR4D m_fillColor
 
VECTOR2I m_start
 
VECTOR2I m_end
 
VECTOR2I m_arcCenter
 
ARC_MID m_arcMidData
 
VECTOR2I m_bezierC1
 
VECTOR2I m_bezierC2
 
std::vector< VECTOR2Im_bezierPoints
 
SHAPE_POLY_SET m_poly
 
int m_editState
 
bool m_annotationProxy
 

Detailed Description

Definition at line 71 of file eda_shape.h.

Constructor & Destructor Documentation

◆ EDA_SHAPE()

EDA_SHAPE::EDA_SHAPE ( SHAPE_T  aType,
int  aLineWidth,
FILL_T  aFill 
)

Definition at line 40 of file eda_shape.cpp.

40 :
41 m_endsSwapped( false ),
42 m_shape( aType ),
43 m_stroke( aLineWidth, PLOT_DASH_TYPE::DEFAULT, COLOR4D::UNSPECIFIED ),
44 m_fill( aFill ),
45 m_fillColor( COLOR4D::UNSPECIFIED ),
46 m_editState( 0 ),
47 m_annotationProxy( false )
48{
49}
SHAPE_T m_shape
Definition: eda_shape.h:363
bool m_endsSwapped
Definition: eda_shape.h:362
int m_editState
Definition: eda_shape.h:380
bool m_annotationProxy
Definition: eda_shape.h:381
STROKE_PARAMS m_stroke
Definition: eda_shape.h:364
FILL_T m_fill
Definition: eda_shape.h:365
COLOR4D m_fillColor
Definition: eda_shape.h:366

References DEFAULT, and UNSPECIFIED.

◆ ~EDA_SHAPE()

EDA_SHAPE::~EDA_SHAPE ( )
virtual

Definition at line 52 of file eda_shape.cpp.

53{
54}

Member Function Documentation

◆ beginEdit()

void EDA_SHAPE::beginEdit ( const VECTOR2I aStartPoint)
protected

Definition at line 1210 of file eda_shape.cpp.

1211{
1212 switch( GetShape() )
1213 {
1214 case SHAPE_T::SEGMENT:
1215 case SHAPE_T::CIRCLE:
1216 case SHAPE_T::RECT:
1217 SetStart( aPosition );
1218 SetEnd( aPosition );
1219 break;
1220
1221 case SHAPE_T::ARC:
1222 SetArcGeometry( aPosition, aPosition, aPosition );
1223 m_editState = 1;
1224 break;
1225
1226 case SHAPE_T::POLY:
1228 m_poly.Outline( 0 ).SetClosed( false );
1229
1230 // Start and end of the first segment (co-located for now)
1231 m_poly.Outline( 0 ).Append( aPosition );
1232 m_poly.Outline( 0 ).Append( aPosition, true );
1233 break;
1234
1235 default:
1237 }
1238}
SHAPE_T GetShape() const
Definition: eda_shape.h:111
void SetStart(const VECTOR2I &aStart)
Definition: eda_shape.h:120
void SetEnd(const VECTOR2I &aEnd)
Definition: eda_shape.h:145
void SetArcGeometry(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Set the three controlling points for an arc.
Definition: eda_shape.cpp:508
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:75
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:378
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
SHAPE_LINE_CHAIN & Outline(int aIndex)
int NewOutline()
Creates a new hole in a given outline.
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120

References SHAPE_LINE_CHAIN::Append(), ARC, CIRCLE, GetShape(), m_editState, m_poly, SHAPE_POLY_SET::NewOutline(), SHAPE_POLY_SET::Outline(), POLY, RECT, SEGMENT, SetArcGeometry(), SHAPE_LINE_CHAIN::SetClosed(), SetEnd(), SetStart(), SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by SCH_SHAPE::BeginEdit(), and LIB_SHAPE::BeginEdit().

◆ buildBezierToSegmentsPointsList()

const std::vector< VECTOR2I > EDA_SHAPE::buildBezierToSegmentsPointsList ( int  aMinSegLen) const
protected

Definition at line 384 of file eda_shape.cpp.

385{
386 std::vector<VECTOR2I> bezierPoints;
387
388 // Rebuild the m_BezierPoints vertex list that approximate the Bezier curve
389 std::vector<VECTOR2I> ctrlPoints = { m_start, m_bezierC1, m_bezierC2, m_end };
390 BEZIER_POLY converter( ctrlPoints );
391 converter.GetPoly( bezierPoints, aMinSegLen );
392
393 return bezierPoints;
394}
Bezier curves to polygon converter.
Definition: bezier_curves.h:36
VECTOR2I m_start
Definition: eda_shape.h:368
VECTOR2I m_end
Definition: eda_shape.h:369
VECTOR2I m_bezierC1
Definition: eda_shape.h:374
VECTOR2I m_bezierC2
Definition: eda_shape.h:375

References BEZIER_POLY::GetPoly(), m_bezierC1, m_bezierC2, m_end, and m_start.

Referenced by makeEffectiveShapes(), and RebuildBezierToSegmentsPointsList().

◆ CalcArcAngles()

void EDA_SHAPE::CalcArcAngles ( EDA_ANGLE aStartAngle,
EDA_ANGLE aEndAngle 
) const

Calc arc start and end angles such that aStartAngle < aEndAngle.

Each may be between -360.0 and 360.0.

Definition at line 455 of file eda_shape.cpp.

456{
457 VECTOR2D startRadial( GetStart() - getCenter() );
458 VECTOR2D endRadial( GetEnd() - getCenter() );
459
460 aStartAngle = EDA_ANGLE( startRadial );
461 aEndAngle = EDA_ANGLE( endRadial );
462
463 if( aEndAngle == aStartAngle )
464 aEndAngle = aStartAngle + ANGLE_360; // ring, not null
465
466 if( aStartAngle > aEndAngle )
467 {
468 if( aEndAngle < ANGLE_0 )
469 aEndAngle.Normalize();
470 else
471 aStartAngle = aStartAngle.Normalize() - ANGLE_360;
472 }
473}
EDA_ANGLE Normalize()
Definition: eda_angle.h:249
VECTOR2I getCenter() const
Definition: eda_shape.cpp:397
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:141
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:116
static constexpr EDA_ANGLE & ANGLE_360
Definition: eda_angle.h:418
static constexpr EDA_ANGLE & ANGLE_0
Definition: eda_angle.h:412

References ANGLE_0, ANGLE_360, getCenter(), GetEnd(), GetStart(), and EDA_ANGLE::Normalize().

Referenced by computeArcBBox(), KIGFX::PCB_PAINTER::draw(), KIGFX::SCH_PAINTER::draw(), GetArcAngle(), hitTest(), LIB_SHAPE::Plot(), LIB_SHAPE::print(), and SCH_LEGACY_PLUGIN_CACHE::saveArc().

◆ calcEdit()

void EDA_SHAPE::calcEdit ( const VECTOR2I aPosition)
protected

Definition at line 1268 of file eda_shape.cpp.

1269{
1270#define sq( x ) pow( x, 2 )
1271
1272 switch( GetShape() )
1273 {
1274 case SHAPE_T::SEGMENT:
1275 case SHAPE_T::CIRCLE:
1276 case SHAPE_T::RECT:
1277 SetEnd( aPosition );
1278 break;
1279
1280 case SHAPE_T::ARC:
1281 {
1282 int radius = GetRadius();
1283
1284 // Edit state 0: drawing: place start
1285 // Edit state 1: drawing: place end (center calculated for 90-degree subtended angle)
1286 // Edit state 2: point edit: move start (center calculated for invariant subtended angle)
1287 // Edit state 3: point edit: move end (center calculated for invariant subtended angle)
1288 // Edit state 4: point edit: move center
1289 // Edit state 5: point edit: move arc-mid-point
1290
1291 switch( m_editState )
1292 {
1293 case 0:
1294 SetArcGeometry( aPosition, aPosition, aPosition );
1295 return;
1296
1297 case 1:
1298 m_end = aPosition;
1299 radius = KiROUND( sqrt( sq( GetLineLength( m_start, m_end ) ) / 2.0 ) );
1300 break;
1301
1302 case 2:
1303 case 3:
1304 {
1305 VECTOR2I v = m_start - m_end;
1306 double chordBefore = sq( v.x ) + sq( v.y );
1307
1308 if( m_editState == 2 )
1309 m_start = aPosition;
1310 else
1311 m_end = aPosition;
1312
1313 v = m_start - m_end;
1314 double chordAfter = sq( v.x ) + sq( v.y );
1315 double ratio = chordAfter / chordBefore;
1316
1317 if( ratio != 0 )
1318 {
1319 radius = std::max( int( sqrt( sq( radius ) * ratio ) ) + 1,
1320 int( sqrt( chordAfter ) / 2 ) + 1 );
1321 }
1322 }
1323 break;
1324
1325 case 4:
1326 {
1327 double radialA = GetLineLength( m_start, aPosition );
1328 double radialB = GetLineLength( m_end, aPosition );
1329 radius = int( ( radialA + radialB ) / 2.0 ) + 1;
1330 }
1331 break;
1332
1333 case 5:
1334 SetArcGeometry( GetStart(), aPosition, GetEnd() );
1335 return;
1336 }
1337
1338 // Calculate center based on start, end, and radius
1339 //
1340 // Let 'l' be the length of the chord and 'm' the middle point of the chord
1341 double l = GetLineLength( m_start, m_end );
1342 VECTOR2I m = ( m_start + m_end ) / 2;
1343
1344 // Calculate 'd', the vector from the chord midpoint to the center
1345 VECTOR2I d;
1346 d.x = KiROUND( sqrt( sq( radius ) - sq( l/2 ) ) * ( m_start.y - m_end.y ) / l );
1347 d.y = KiROUND( sqrt( sq( radius ) - sq( l/2 ) ) * ( m_end.x - m_start.x ) / l );
1348
1349 VECTOR2I c1 = m + d;
1350 VECTOR2I c2 = m - d;
1351
1352 // Solution gives us 2 centers; we need to pick one:
1353 switch( m_editState )
1354 {
1355 case 1:
1356 {
1357 // Keep center clockwise from chord while drawing
1358 VECTOR2I chordVector = m_end - m_start;
1359 EDA_ANGLE chordAngle( chordVector );
1360
1361 VECTOR2I c1Test = c1;
1362 RotatePoint( c1Test, m_start, -chordAngle.Normalize() );
1363
1364 m_arcCenter = c1Test.x > 0 ? c2 : c1;
1365 }
1366 break;
1367
1368 case 2:
1369 case 3:
1370 // Pick the one closer to the old center
1372 break;
1373
1374 case 4:
1375 // Pick the one closer to the mouse position
1376 m_arcCenter = GetLineLength( c1, aPosition ) < GetLineLength( c2, aPosition ) ? c1 : c2;
1377
1378 if( GetArcAngle() > ANGLE_180 )
1379 std::swap( m_start, m_end );
1380
1381 break;
1382 }
1383 }
1384 break;
1385
1386 case SHAPE_T::POLY:
1387 m_poly.Outline( 0 ).SetPoint( m_poly.Outline( 0 ).GetPointCount() - 1, aPosition );
1388 break;
1389
1390 default:
1392 }
1393}
EDA_ANGLE GetArcAngle() const
Definition: eda_shape.cpp:538
int GetRadius() const
Definition: eda_shape.cpp:476
VECTOR2I m_arcCenter
Definition: eda_shape.h:371
void SetPoint(int aIndex, const VECTOR2I &aPos)
Move a point to a specific location.
virtual size_t GetPointCount() const override
static constexpr EDA_ANGLE & ANGLE_180
Definition: eda_angle.h:416
#define sq(x)
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Definition: trigo.cpp:183
double GetLineLength(const VECTOR2I &aPointA, const VECTOR2I &aPointB)
Return the length of a line segment defined by aPointA and aPointB.
Definition: trigo.h:188
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:80

References ANGLE_180, ARC, CIRCLE, GetArcAngle(), GetEnd(), GetLineLength(), SHAPE_LINE_CHAIN::GetPointCount(), GetRadius(), GetShape(), GetStart(), KiROUND(), m_arcCenter, m_editState, m_end, m_poly, m_start, EDA_ANGLE::Normalize(), SHAPE_POLY_SET::Outline(), POLY, RECT, RotatePoint(), SEGMENT, SetArcGeometry(), SetEnd(), SHAPE_LINE_CHAIN::SetPoint(), SHAPE_T_asString(), sq, UNIMPLEMENTED_FOR, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by SCH_SHAPE::CalcEdit(), and LIB_SHAPE::CalcEdit().

◆ Compare()

int EDA_SHAPE::Compare ( const EDA_SHAPE aOther) const

Definition at line 1451 of file eda_shape.cpp.

1452{
1453#define EPSILON 2 // Should be enough for rounding errors on calculated items
1454
1455#define TEST( a, b ) { if( a != b ) return a - b; }
1456#define TEST_E( a, b ) { if( abs( a - b ) > EPSILON ) return a - b; }
1457#define TEST_PT( a, b ) { TEST_E( a.x, b.x ); TEST_E( a.y, b.y ); }
1458
1459 TEST_PT( m_start, aOther->m_start );
1460 TEST_PT( m_end, aOther->m_end );
1461
1462 TEST( (int) m_shape, (int) aOther->m_shape );
1463
1464 if( m_shape == SHAPE_T::ARC )
1465 {
1466 TEST_PT( m_arcCenter, aOther->m_arcCenter );
1467 }
1468 else if( m_shape == SHAPE_T::BEZIER )
1469 {
1470 TEST_PT( m_bezierC1, aOther->m_bezierC1 );
1471 TEST_PT( m_bezierC2, aOther->m_bezierC2 );
1472 }
1473 else if( m_shape == SHAPE_T::POLY )
1474 {
1476 }
1477
1478 for( size_t ii = 0; ii < m_bezierPoints.size(); ++ii )
1479 TEST_PT( m_bezierPoints[ii], aOther->m_bezierPoints[ii] );
1480
1481 for( int ii = 0; ii < m_poly.TotalVertices(); ++ii )
1482 TEST_PT( m_poly.CVertex( ii ), aOther->m_poly.CVertex( ii ) );
1483
1484 TEST_E( m_stroke.GetWidth(), aOther->m_stroke.GetWidth() );
1485 TEST( (int) m_stroke.GetPlotStyle(), (int) aOther->m_stroke.GetPlotStyle() );
1486 TEST( (int) m_fill, (int) aOther->m_fill );
1487
1488 return 0;
1489}
std::vector< VECTOR2I > m_bezierPoints
Definition: eda_shape.h:377
int TotalVertices() const
Delete aIdx-th polygon from the set.
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the aGlobalIndex-th vertex in the poly set.
int GetWidth() const
Definition: stroke_params.h:98
PLOT_DASH_TYPE GetPlotStyle() const
#define TEST_PT(a, b)
#define TEST(a, b)
#define TEST_E(a, b)

References ARC, BEZIER, SHAPE_POLY_SET::CVertex(), STROKE_PARAMS::GetPlotStyle(), STROKE_PARAMS::GetWidth(), m_arcCenter, m_bezierC1, m_bezierC2, m_bezierPoints, m_end, m_fill, m_poly, m_shape, m_start, m_stroke, POLY, TEST, TEST_E, TEST_PT, and SHAPE_POLY_SET::TotalVertices().

Referenced by LIB_SHAPE::compare(), LIB_TEXTBOX::compare(), and BOARD::cmp_drawings::operator()().

◆ computeArcBBox()

void EDA_SHAPE::computeArcBBox ( BOX2I aBBox) const
protected

Definition at line 1019 of file eda_shape.cpp.

1020{
1021 // Start, end, and each inflection point the arc crosses will enclose the entire arc.
1022 // Only include the center when filled; it's not necessarily inside the BB of an unfilled
1023 // arc with a small included angle.
1024 aBBox.SetOrigin( m_start );
1025 aBBox.Merge( m_end );
1026
1027 if( IsFilled() )
1028 aBBox.Merge( m_arcCenter );
1029
1030 int radius = GetRadius();
1031 EDA_ANGLE t1, t2;
1032
1033 CalcArcAngles( t1, t2 );
1034
1035 t1.Normalize();
1036 t2.Normalize();
1037
1038 if( t2 > t1 )
1039 {
1040 if( t1 < ANGLE_0 && t2 > ANGLE_0 )
1041 aBBox.Merge( VECTOR2I( m_arcCenter.x + radius, m_arcCenter.y ) ); // right
1042
1043 if( t1 < ANGLE_90 && t2 > ANGLE_90 )
1044 aBBox.Merge( VECTOR2I( m_arcCenter.x, m_arcCenter.y + radius ) ); // down
1045
1046 if( t1 < ANGLE_180 && t2 > ANGLE_180 )
1047 aBBox.Merge( VECTOR2I( m_arcCenter.x - radius, m_arcCenter.y ) ); // left
1048
1049 if( t1 < ANGLE_270 && t2 > ANGLE_270 )
1050 aBBox.Merge( VECTOR2I( m_arcCenter.x, m_arcCenter.y - radius ) ); // up
1051 }
1052 else
1053 {
1054 if( t1 < ANGLE_0 || t2 > ANGLE_0 )
1055 aBBox.Merge( VECTOR2I( m_arcCenter.x + radius, m_arcCenter.y ) ); // right
1056
1057 if( t1 < ANGLE_90 || t2 > ANGLE_90 )
1058 aBBox.Merge( VECTOR2I( m_arcCenter.x, m_arcCenter.y + radius ) ); // down
1059
1060 if( t1 < ANGLE_180 || t2 > ANGLE_180 )
1061 aBBox.Merge( VECTOR2I( m_arcCenter.x - radius, m_arcCenter.y ) ); // left
1062
1063 if( t1 < ANGLE_270 || t2 > ANGLE_270 )
1064 aBBox.Merge( VECTOR2I( m_arcCenter.x, m_arcCenter.y - radius ) ); // up
1065 }
1066}
void SetOrigin(const Vec &pos)
Definition: box2.h:202
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
Definition: box2.h:588
bool IsFilled() const
Definition: eda_shape.h:90
void CalcArcAngles(EDA_ANGLE &aStartAngle, EDA_ANGLE &aEndAngle) const
Calc arc start and end angles such that aStartAngle < aEndAngle.
Definition: eda_shape.cpp:455
static constexpr EDA_ANGLE & ANGLE_90
Definition: eda_angle.h:414
static constexpr EDA_ANGLE & ANGLE_270
Definition: eda_angle.h:417
VECTOR2< int > VECTOR2I
Definition: vector2d.h:618

References ANGLE_0, ANGLE_180, ANGLE_270, ANGLE_90, CalcArcAngles(), GetRadius(), IsFilled(), m_arcCenter, m_end, m_start, BOX2< Vec >::Merge(), EDA_ANGLE::Normalize(), BOX2< Vec >::SetOrigin(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by getBoundingBox().

◆ continueEdit()

bool EDA_SHAPE::continueEdit ( const VECTOR2I aPosition)
protected

Definition at line 1241 of file eda_shape.cpp.

1242{
1243 switch( GetShape() )
1244 {
1245 case SHAPE_T::ARC:
1246 case SHAPE_T::SEGMENT:
1247 case SHAPE_T::CIRCLE:
1248 case SHAPE_T::RECT:
1249 return false;
1250
1251 case SHAPE_T::POLY:
1252 {
1253 SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
1254
1255 // do not add zero-length segments
1256 if( poly.CPoint( poly.GetPointCount() - 2 ) != poly.CLastPoint() )
1257 poly.Append( aPosition, true );
1258 }
1259 return true;
1260
1261 default:
1263 return false;
1264 }
1265}
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
const VECTOR2I & CLastPoint() const
Return the last point in the line chain.

References SHAPE_LINE_CHAIN::Append(), ARC, CIRCLE, SHAPE_LINE_CHAIN::CLastPoint(), SHAPE_LINE_CHAIN::CPoint(), SHAPE_LINE_CHAIN::GetPointCount(), GetShape(), m_poly, SHAPE_POLY_SET::Outline(), POLY, RECT, SEGMENT, SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by SCH_SHAPE::ContinueEdit(), and LIB_SHAPE::ContinueEdit().

◆ DupPolyPointsList()

void EDA_SHAPE::DupPolyPointsList ( std::vector< VECTOR2I > &  aBuffer) const

Duplicate the list of corners in a std::vector<VECTOR2I>

It must be used only to convert the SHAPE_POLY_SET internal corner buffer to a list of VECTOR2Is, and nothing else, because it duplicates the buffer, that is inefficient to know for instance the corner count

Definition at line 1170 of file eda_shape.cpp.

1171{
1172 if( m_poly.OutlineCount() )
1173 {
1174 int pointCount = m_poly.COutline( 0 ).PointCount();
1175
1176 if( pointCount )
1177 {
1178 aBuffer.reserve( pointCount );
1179
1180 for ( auto iter = m_poly.CIterate(); iter; iter++ )
1181 aBuffer.emplace_back( iter->x, iter->y );
1182 }
1183 }
1184}
int PointCount() const
Return the number of points (vertices) in this line chain.
CONST_ITERATOR CIterate(int aFirst, int aLast, bool aIterateHoles=false) const
int OutlineCount() const
Return the number of vertices in a given outline/hole.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const

References SHAPE_POLY_SET::CIterate(), SHAPE_POLY_SET::COutline(), m_poly, SHAPE_POLY_SET::OutlineCount(), and SHAPE_LINE_CHAIN::PointCount().

Referenced by PCB_GRID_HELPER::computeAnchors(), BRDITEMS_PLOTTER::PlotFootprintShape(), TransformShapeWithClearanceToPolygon(), and PCB_POINT_EDITOR::updatePoints().

◆ endEdit()

void EDA_SHAPE::endEdit ( bool  aClosed = true)
protected

Finishes editing the shape.

Parameters
aClosedShould polygon shapes be closed (yes for pcbnew/fpeditor, no for libedit)

Definition at line 1396 of file eda_shape.cpp.

1397{
1398 switch( GetShape() )
1399 {
1400 case SHAPE_T::ARC:
1401 case SHAPE_T::SEGMENT:
1402 case SHAPE_T::CIRCLE:
1403 case SHAPE_T::RECT:
1404 break;
1405
1406 case SHAPE_T::POLY:
1407 {
1408 SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
1409
1410 // do not include last point twice
1411 if( poly.GetPointCount() > 2 )
1412 {
1413 if( poly.CPoint( poly.GetPointCount() - 2 ) == poly.CLastPoint() )
1414 {
1415 poly.SetClosed( aClosed );
1416 poly.Remove( poly.GetPointCount() - 1 );
1417 }
1418 }
1419 }
1420 break;
1421
1422 default:
1424 }
1425}
void Remove(int aStartIndex, int aEndIndex)
Remove the range of points [start_index, end_index] from the line chain.

References ARC, CIRCLE, SHAPE_LINE_CHAIN::CLastPoint(), SHAPE_LINE_CHAIN::CPoint(), SHAPE_LINE_CHAIN::GetPointCount(), GetShape(), m_poly, SHAPE_POLY_SET::Outline(), POLY, RECT, SHAPE_LINE_CHAIN::Remove(), SEGMENT, SHAPE_LINE_CHAIN::SetClosed(), SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by SCH_SHAPE::EndEdit(), and LIB_SHAPE::EndEdit().

◆ EndsSwapped()

bool EDA_SHAPE::EndsSwapped ( ) const
inline

Have the start and end points been swapped since they were set?

Returns
true if they have

Definition at line 191 of file eda_shape.h.

191{ return m_endsSwapped; }

References m_endsSwapped.

Referenced by CADSTAR_PCB_ARCHIVE_LOADER::makeTracksFromShapes().

◆ flip()

void EDA_SHAPE::flip ( const VECTOR2I aCentre,
bool  aFlipLeftRight 
)
protected

Definition at line 285 of file eda_shape.cpp.

286{
287 switch ( m_shape )
288 {
289 case SHAPE_T::SEGMENT:
290 case SHAPE_T::RECT:
291 if( aFlipLeftRight )
292 {
293 m_start.x = aCentre.x - ( m_start.x - aCentre.x );
294 m_end.x = aCentre.x - ( m_end.x - aCentre.x );
295 }
296 else
297 {
298 m_start.y = aCentre.y - ( m_start.y - aCentre.y );
299 m_end.y = aCentre.y - ( m_end.y - aCentre.y );
300 }
301
302 std::swap( m_start, m_end );
303 break;
304
305 case SHAPE_T::CIRCLE:
306 if( aFlipLeftRight )
307 {
308 m_start.x = aCentre.x - ( m_start.x - aCentre.x );
309 m_end.x = aCentre.x - ( m_end.x - aCentre.x );
310 }
311 else
312 {
313 m_start.y = aCentre.y - ( m_start.y - aCentre.y );
314 m_end.y = aCentre.y - ( m_end.y - aCentre.y );
315 }
316 break;
317
318 case SHAPE_T::ARC:
319 if( aFlipLeftRight )
320 {
321 m_start.x = aCentre.x - ( m_start.x - aCentre.x );
322 m_end.x = aCentre.x - ( m_end.x - aCentre.x );
323 m_arcCenter.x = aCentre.x - ( m_arcCenter.x - aCentre.x );
324 }
325 else
326 {
327 m_start.y = aCentre.y - ( m_start.y - aCentre.y );
328 m_end.y = aCentre.y - ( m_end.y - aCentre.y );
329 m_arcCenter.y = aCentre.y - ( m_arcCenter.y - aCentre.y );
330 }
331
332 std::swap( m_start, m_end );
333 break;
334
335 case SHAPE_T::POLY:
336 m_poly.Mirror( aFlipLeftRight, !aFlipLeftRight, aCentre );
337 break;
338
339 case SHAPE_T::BEZIER:
340 if( aFlipLeftRight )
341 {
342 m_start.x = aCentre.x - ( m_start.x - aCentre.x );
343 m_end.x = aCentre.x - ( m_end.x - aCentre.x );
344 m_bezierC1.x = aCentre.x - ( m_bezierC1.x - aCentre.x );
345 m_bezierC2.x = aCentre.x - ( m_bezierC2.x - aCentre.x );
346 }
347 else
348 {
349 m_start.y = aCentre.y - ( m_start.y - aCentre.y );
350 m_end.y = aCentre.y - ( m_end.y - aCentre.y );
351 m_bezierC1.y = aCentre.y - ( m_bezierC1.y - aCentre.y );
352 m_bezierC2.y = aCentre.y - ( m_bezierC2.y - aCentre.y );
353 }
354
355 // Rebuild the poly points shape
356 {
357 std::vector<VECTOR2I> ctrlPoints = { m_start, m_bezierC1, m_bezierC2, m_end };
358 BEZIER_POLY converter( ctrlPoints );
359 converter.GetPoly( m_bezierPoints, m_stroke.GetWidth() );
360 }
361 break;
362
363 default:
365 break;
366 }
367}
void Mirror(bool aX=true, bool aY=false, const VECTOR2I &aRef={ 0, 0 })
Mirror the line points about y or x (or both)

References ARC, BEZIER, CIRCLE, BEZIER_POLY::GetPoly(), STROKE_PARAMS::GetWidth(), m_arcCenter, m_bezierC1, m_bezierC2, m_bezierPoints, m_end, m_poly, m_shape, m_start, m_stroke, SHAPE_POLY_SET::Mirror(), POLY, RECT, SEGMENT, SHAPE_T_asString(), UNIMPLEMENTED_FOR, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by PCB_SHAPE::Flip(), LIB_SHAPE::MirrorHorizontal(), SCH_SHAPE::MirrorHorizontally(), LIB_SHAPE::MirrorVertical(), and SCH_SHAPE::MirrorVertically().

◆ GetArcAngle()

◆ GetArcMid()

VECTOR2I EDA_SHAPE::GetArcMid ( ) const

Definition at line 441 of file eda_shape.cpp.

442{
443 // If none of the input data have changed since we loaded the arc,
444 // keep the original mid point data to minimize churn
447 return m_arcMidData.mid;
448
449 VECTOR2I mid = m_start;
450 RotatePoint( mid, m_arcCenter, -GetArcAngle() / 2.0 );
451 return mid;
452}
ARC_MID m_arcMidData
Definition: eda_shape.h:372
VECTOR2I end
Definition: eda_shape.h:67
VECTOR2I center
Definition: eda_shape.h:68
VECTOR2I start
Definition: eda_shape.h:66
VECTOR2I mid
Definition: eda_shape.h:65

References ARC_MID::center, ARC_MID::end, GetArcAngle(), m_arcCenter, m_arcMidData, m_end, m_start, ARC_MID::mid, RotatePoint(), and ARC_MID::start.

Referenced by KI_TEST::CheckFpShape(), PCB_GRID_HELPER::computeAnchors(), PCB_POINT_EDITOR::editArcMidKeepEndpoints(), PCB_PLUGIN::format(), formatArc(), PCB_SHAPE::GetFocusPosition(), PCB_POINT_EDITOR::makePoints(), CONVERT_TOOL::makePolysFromChainedSegs(), SetArcGeometry(), TransformShapeWithClearanceToPolygon(), and PCB_POINT_EDITOR::updatePoints().

◆ GetBezierC1()

◆ GetBezierC2()

◆ GetBezierPoints()

const std::vector< VECTOR2I > & EDA_SHAPE::GetBezierPoints ( ) const
inline

◆ GetBotRight()

virtual VECTOR2I EDA_SHAPE::GetBotRight ( ) const
inlinevirtual

Reimplemented in FP_TEXTBOX, and PCB_TEXTBOX.

Definition at line 164 of file eda_shape.h.

164{ return GetEnd(); }

References GetEnd().

Referenced by KIGFX::PCB_PAINTER::draw(), PCB_POINT_EDITOR::makePoints(), and PCB_POINT_EDITOR::updatePoints().

◆ getBoundingBox()

const BOX2I EDA_SHAPE::getBoundingBox ( ) const
protected

Definition at line 635 of file eda_shape.cpp.

636{
637 BOX2I bbox;
638
639 switch( m_shape )
640 {
641 case SHAPE_T::RECT:
642 for( VECTOR2I& pt : GetRectCorners() )
643 bbox.Merge( pt );
644
645 break;
646
647 case SHAPE_T::SEGMENT:
648 bbox.SetOrigin( GetStart() );
649 bbox.SetEnd( GetEnd() );
650 break;
651
652 case SHAPE_T::CIRCLE:
653 bbox.SetOrigin( GetStart() );
654 bbox.Inflate( GetRadius() );
655 break;
656
657 case SHAPE_T::ARC:
658 computeArcBBox( bbox );
659 break;
660
661 case SHAPE_T::POLY:
662 if( m_poly.IsEmpty() )
663 break;
664
665 for( auto iter = m_poly.CIterate(); iter; iter++ )
666 {
667 VECTOR2I pt( iter->x, iter->y );
668
670 pt += getParentPosition();
671
672 bbox.Merge( pt );
673 }
674
675 break;
676
677 case SHAPE_T::BEZIER:
678 bbox.SetOrigin( GetStart() );
679 bbox.Merge( GetBezierC1() );
680 bbox.Merge( GetBezierC2() );
681 bbox.Merge( GetEnd() );
682 break;
683
684 default:
686 break;
687 }
688
689 bbox.Inflate( std::max( 0, GetWidth() ) / 2 );
690 bbox.Normalize();
691
692 return bbox;
693}
BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
Definition: box2.h:119
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:506
void SetEnd(coord_type x, coord_type y)
Definition: box2.h:255
virtual VECTOR2I getParentPosition() const =0
const VECTOR2I & GetBezierC2() const
Definition: eda_shape.h:175
virtual EDA_ANGLE getParentOrientation() const =0
std::vector< VECTOR2I > GetRectCorners() const
Definition: eda_shape.cpp:983
int GetWidth() const
Definition: eda_shape.h:107
void computeArcBBox(BOX2I &aBBox) const
Definition: eda_shape.cpp:1019
const VECTOR2I & GetBezierC1() const
Definition: eda_shape.h:172
bool IsEmpty() const

References ARC, BEZIER, CIRCLE, SHAPE_POLY_SET::CIterate(), computeArcBBox(), GetBezierC1(), GetBezierC2(), GetEnd(), getParentOrientation(), getParentPosition(), GetRadius(), GetRectCorners(), GetStart(), GetWidth(), BOX2< Vec >::Inflate(), SHAPE_POLY_SET::IsEmpty(), m_poly, m_shape, BOX2< Vec >::Merge(), BOX2< Vec >::Normalize(), POLY, RECT, RotatePoint(), SEGMENT, BOX2< Vec >::SetEnd(), BOX2< Vec >::SetOrigin(), SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by LIB_SHAPE::GetBoundingBox(), SCH_SHAPE::GetBoundingBox(), PCB_SHAPE::GetBoundingBox(), getCenter(), and hitTest().

◆ getCenter()

VECTOR2I EDA_SHAPE::getCenter ( ) const

Definition at line 397 of file eda_shape.cpp.

398{
399 switch( m_shape )
400 {
401 case SHAPE_T::ARC:
402 return m_arcCenter;
403
404 case SHAPE_T::CIRCLE:
405 return m_start;
406
407 case SHAPE_T::SEGMENT:
408 // Midpoint of the line
409 return ( m_start + m_end ) / 2;
410
411 case SHAPE_T::POLY:
412 case SHAPE_T::RECT:
413 case SHAPE_T::BEZIER:
414 return getBoundingBox().Centre();
415
416 default:
418 return VECTOR2I();
419 }
420}
Vec Centre() const
Definition: box2.h:70
const BOX2I getBoundingBox() const
Definition: eda_shape.cpp:635

References ARC, BEZIER, BOX2< Vec >::Centre(), CIRCLE, getBoundingBox(), m_arcCenter, m_end, m_shape, m_start, POLY, RECT, SEGMENT, SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by CalcArcAngles(), LIB_SHAPE::GetCenter(), SCH_SHAPE::GetCenter(), PCB_SHAPE::GetCenter(), getPosition(), hitTest(), makeEffectiveShapes(), SCH_SHAPE::Plot(), LIB_SHAPE::Plot(), SCH_SHAPE::Print(), LIB_SHAPE::print(), PLOTTER::ThickArc(), GERBER_PLOTTER::ThickArc(), and TransformShapeWithClearanceToPolygon().

◆ GetEffectiveWidth()

virtual int EDA_SHAPE::GetEffectiveWidth ( ) const
inlinevirtual

Reimplemented in SCH_SHAPE.

Definition at line 108 of file eda_shape.h.

108{ return GetWidth(); }

References GetWidth().

Referenced by makeEffectiveShapes().

◆ GetEnd()

const VECTOR2I & EDA_SHAPE::GetEnd ( ) const
inline

Return the ending point of the graphic.

Definition at line 141 of file eda_shape.h.

141{ return m_end; }

References m_end.

Referenced by PCB_POINT_EDITOR::addCorner(), BOARD_ADAPTER::addShape(), GRAPHICS_CLEANER::areEquivalent(), CalcArcAngles(), calcEdit(), KI_TEST::CheckFpShape(), PCB_GRID_HELPER::computeAnchors(), ConvertOutlineToPolygon(), CreateBoardSection(), MICROWAVE_TOOL::createMicrowaveInductor(), KIGFX::SCH_PAINTER::draw(), KIGFX::PCB_PAINTER::draw(), DRAWING_TOOL::DrawLine(), PCB_POINT_EDITOR::editArcEndpointKeepTangent(), PCB_PLUGIN::format(), formatArc(), formatBezier(), formatRect(), GetBotRight(), FP_TEXTBOX::GetBotRight(), PCB_TEXTBOX::GetBotRight(), getBoundingBox(), GetLength(), LIB_TEXTBOX::GetMsgPanelInfo(), SCH_TEXTBOX::GetMsgPanelInfo(), FP_TEXTBOX::GetMsgPanelInfo(), PCB_TEXTBOX::GetMsgPanelInfo(), GetRectCorners(), CADSTAR_SCH_ARCHIVE_LOADER::getScaledLibPart(), LIB_TEXTBOX::GetShownText(), SCH_TEXTBOX::GetShownText(), CONVERT_TOOL::getStartEndPoints(), FP_TEXTBOX::GetTopLeft(), PCB_TEXTBOX::GetTopLeft(), hash_fp_item(), hitTest(), idf_export_outline(), GRAPHICS_CLEANER::isNullShape(), SCH_LEGACY_PLUGIN_CACHE::loadArc(), SCH_EAGLE_PLUGIN::loadSymbolRectangle(), EDIT_POINTS_FACTORY::Make(), makeEffectiveShapes(), DSN::SPECCTRA_DB::makeIMAGE(), PCB_POINT_EDITOR::makePoints(), CONVERT_TOOL::makePolysFromChainedSegs(), GRAPHICS_CLEANER::mergeRects(), LIB_SHAPE::Normalize(), SCH_SHAPE::Normalize(), PCB_SHAPE::NormalizeRect(), PCB_PARSER::parsePAD(), SCH_SHAPE::Plot(), BRDITEMS_PLOTTER::PlotFootprintShape(), BRDITEMS_PLOTTER::PlotPcbShape(), SCH_SHAPE::Print(), SCH_TEXTBOX::Print(), SCH_LEGACY_PLUGIN_CACHE::saveArc(), SCH_LEGACY_PLUGIN_CACHE::saveRectangle(), SCH_SEXPR_PLUGIN_CACHE::saveTextBox(), SCH_SEXPR_PLUGIN::saveTextBox(), ShapeGetMsgPanelInfo(), PLOTTER::ThickArc(), GERBER_PLOTTER::ThickArc(), AR_MATRIX::TraceSegmentPcb(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataToWindow(), DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataToWindow(), TransformShapeWithClearanceToPolygon(), EE_POINT_EDITOR::updatePoints(), and PCB_POINT_EDITOR::updatePoints().

◆ GetEndX()

◆ GetEndY()

◆ GetFillColor()

◆ GetFillMode()

◆ GetLength()

double EDA_SHAPE::GetLength ( ) const

Return the length of the track using the hypotenuse calculation.

Returns
the length of the track

Definition at line 110 of file eda_shape.cpp.

111{
112 double length = 0.0;
113
114 switch( m_shape )
115 {
116 case SHAPE_T::BEZIER:
117 for( size_t ii = 1; ii < m_bezierPoints.size(); ++ii )
118 length += GetLineLength( m_bezierPoints[ ii - 1], m_bezierPoints[ii] );
119
120 return length;
121
122 case SHAPE_T::SEGMENT:
123 return GetLineLength( GetStart(), GetEnd() );
124
125 case SHAPE_T::POLY:
126 for( int ii = 0; ii < m_poly.COutline( 0 ).SegmentCount(); ii++ )
127 length += m_poly.COutline( 0 ).CSegment( ii ).Length();
128
129 return length;
130
131 case SHAPE_T::ARC:
132 return GetRadius() * GetArcAngle().AsRadians();
133
134 default:
136 return 0.0;
137 }
138}
double AsRadians() const
Definition: eda_angle.h:153
int Length() const
Return the length (this).
Definition: seg.h:351
const SEG CSegment(int aIndex) const
Return a constant copy of the aIndex segment in the line chain.

References ARC, EDA_ANGLE::AsRadians(), BEZIER, SHAPE_POLY_SET::COutline(), SHAPE_LINE_CHAIN::CSegment(), GetArcAngle(), GetEnd(), GetLineLength(), GetRadius(), GetStart(), SEG::Length(), m_bezierPoints, m_poly, m_shape, POLY, SEGMENT, SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by DRAWING_TOOL::drawShape(), and ShapeGetMsgPanelInfo().

◆ getParentOrientation()

virtual EDA_ANGLE EDA_SHAPE::getParentOrientation ( ) const
protectedpure virtual

◆ getParentPosition()

virtual VECTOR2I EDA_SHAPE::getParentPosition ( ) const
protectedpure virtual

◆ GetPointCount()

int EDA_SHAPE::GetPointCount ( ) const
Returns
the number of corners of the polygonal shape

Definition at line 1199 of file eda_shape.cpp.

1200{
1201 // return the number of corners of the polygonal shape
1202 // this shape is expected to be only one polygon without hole
1203 if( GetPolyShape().OutlineCount() )
1204 return GetPolyShape().VertexCount( 0 );
1205
1206 return 0;
1207}
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:243
int VertexCount(int aOutline=-1, int aHole=-1) const
Return the number of points in the shape poly set.

References GetPolyShape(), and SHAPE_POLY_SET::VertexCount().

Referenced by GRAPHICS_CLEANER::isNullShape(), SCH_SEXPR_PARSER::ParseSchematic(), and EE_POINT_EDITOR::updatePoints().

◆ GetPolyShape() [1/2]

◆ GetPolyShape() [2/2]

const SHAPE_POLY_SET & EDA_SHAPE::GetPolyShape ( ) const
inline

Definition at line 244 of file eda_shape.h.

244{ return m_poly; }

References m_poly.

◆ getPosition()

VECTOR2I EDA_SHAPE::getPosition ( ) const
protected

Definition at line 99 of file eda_shape.cpp.

100{
101 if( m_shape == SHAPE_T::ARC )
102 return getCenter();
103 else if( m_shape == SHAPE_T::POLY )
104 return m_poly.CVertex( 0 );
105 else
106 return m_start;
107}

References ARC, SHAPE_POLY_SET::CVertex(), getCenter(), m_poly, m_shape, m_start, and POLY.

Referenced by LIB_SHAPE::GetPosition(), SCH_SHAPE::GetPosition(), PCB_SHAPE::GetPosition(), and setPosition().

◆ GetRadius()

◆ GetRectCorners()

std::vector< VECTOR2I > EDA_SHAPE::GetRectCorners ( ) const

Definition at line 983 of file eda_shape.cpp.

984{
985 std::vector<VECTOR2I> pts;
986 VECTOR2I topLeft = GetStart();
987 VECTOR2I botRight = GetEnd();
988
989 // Un-rotate rect topLeft and botRight
990 if( !getParentOrientation().IsCardinal() )
991 {
992 topLeft -= getParentPosition();
993 RotatePoint( topLeft, -getParentOrientation() );
994
995 botRight -= getParentPosition();
996 RotatePoint( botRight, -getParentOrientation() );
997 }
998
999 // Set up the un-rotated 4 corners
1000 pts.emplace_back( topLeft );
1001 pts.emplace_back( botRight.x, topLeft.y );
1002 pts.emplace_back( botRight );
1003 pts.emplace_back( topLeft.x, botRight.y );
1004
1005 // Now re-rotate the 4 corners to get a diamond
1006 if( !getParentOrientation().IsCardinal() )
1007 {
1008 for( VECTOR2I& pt : pts )
1009 {
1011 pt += getParentPosition();
1012 }
1013 }
1014
1015 return pts;
1016}

References GetEnd(), getParentOrientation(), getParentPosition(), GetStart(), RotatePoint(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by BOARD_ADAPTER::addShape(), ConvertOutlineToPolygon(), KIGFX::PCB_PAINTER::draw(), getBoundingBox(), PCB_SHAPE::GetCorners(), hitTest(), makeEffectiveShapes(), SCH_SHAPE::Plot(), BRDITEMS_PLOTTER::PlotFootprintShape(), BRDITEMS_PLOTTER::PlotPcbShape(), TransformShapeWithClearanceToPolygon(), FP_TEXTBOX::TransformShapeWithClearanceToPolygon(), and PCB_TEXTBOX::TransformShapeWithClearanceToPolygon().

◆ GetShape()

SHAPE_T EDA_SHAPE::GetShape ( ) const
inline

Definition at line 111 of file eda_shape.h.

111{ return m_shape; }

References m_shape.

Referenced by PCB_POINT_EDITOR::addCorner(), EE_POINT_EDITOR::addCornerCondition(), LIB_SHAPE::AddPoint(), SCH_SHAPE::AddPoint(), BOARD_ADAPTER::addShape(), GRAPHICS_CLEANER::areEquivalent(), beginEdit(), calcEdit(), PCB_POINT_EDITOR::canAddCorner(), KI_TEST::CheckFpShape(), PCB_GRID_HELPER::computeAnchors(), continueEdit(), ConvertOutlineToPolygon(), KIGFX::SCH_PAINTER::draw(), KIGFX::PCB_PAINTER::draw(), EDA_SHAPE_DESC::EDA_SHAPE_DESC(), endEdit(), PAD_TOOL::explodePad(), CADSTAR_SCH_ARCHIVE_LOADER::fixUpLibraryPins(), FP_SHAPE::Flip(), FootprintWriteShape(), PCB_PLUGIN::format(), PCB_SHAPE::GetCorners(), FOOTPRINT::GetCoverageArea(), LIB_SHAPE::GetMenuImage(), SCH_SHAPE::GetMenuImage(), CADSTAR_SCH_ARCHIVE_LOADER::getScaledLibPart(), LIB_SHAPE::GetSelectMenuText(), SCH_SHAPE::GetSelectMenuText(), CONVERT_TOOL::getStartEndPoints(), EE_SELECTION_TOOL::GuessSelectionCandidates(), hash_fp_item(), idf_export_outline(), GRAPHICS_CLEANER::isNullShape(), EE_POINT_EDITOR::Main(), EDIT_POINTS_FACTORY::Make(), DSN::SPECCTRA_DB::makeIMAGE(), PCB_POINT_EDITOR::makePoints(), CONVERT_TOOL::makePolysFromChainedSegs(), GRAPHICS_CLEANER::mergeRects(), PCB_SHAPE::Mirror(), FP_SHAPE::Mirror(), FP_SHAPE::Move(), LIB_SHAPE::Normalize(), SCH_SHAPE::Normalize(), PCB_SHAPE::cmp_drawings::operator()(), FOOTPRINT::cmp_drawings::operator()(), ALTIUM_PCB::Parse(), SCH_SHAPE::Plot(), LIB_SHAPE::Plot(), BRDITEMS_PLOTTER::PlotFootprintShape(), BRDITEMS_PLOTTER::PlotPcbShape(), SCH_SHAPE::Print(), LIB_SHAPE::print(), PAD_TOOL::RecombinePad(), PCB_POINT_EDITOR::removeCorner(), PCB_POINT_EDITOR::removeCornerCondition(), PCB_TEXTBOX::Rotate(), DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run(), SCH_LEGACY_PLUGIN_CACHE::saveArc(), SCH_LEGACY_PLUGIN_CACHE::saveBezier(), SCH_LEGACY_PLUGIN_CACHE::saveCircle(), SCH_LEGACY_PLUGIN_CACHE::savePolyLine(), SCH_LEGACY_PLUGIN_CACHE::saveRectangle(), SCH_SEXPR_PLUGIN::saveShape(), SCH_LEGACY_PLUGIN_CACHE::SaveSymbol(), SCH_SEXPR_PLUGIN_CACHE::saveSymbolDrawItem(), shapesNeedUpdate(), GERBER_PLOTTER::ThickArc(), AR_MATRIX::TraceSegmentPcb(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow(), DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataFromWindow(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataToWindow(), DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataToWindow(), PCB_POINT_EDITOR::updateItem(), EE_POINT_EDITOR::updateParentItem(), EE_POINT_EDITOR::updatePoints(), PCB_POINT_EDITOR::updatePoints(), and DIALOG_GRAPHIC_ITEM_PROPERTIES::Validate().

◆ GetStart()

const VECTOR2I & EDA_SHAPE::GetStart ( ) const
inline

Return the starting point of the graphic.

Definition at line 116 of file eda_shape.h.

116{ return m_start; }

References m_start.

Referenced by PCB_POINT_EDITOR::addCorner(), BOARD_ADAPTER::addShape(), GRAPHICS_CLEANER::areEquivalent(), CalcArcAngles(), calcEdit(), KI_TEST::CheckFpShape(), PCB_GRID_HELPER::computeAnchors(), ALTIUM_PCB::ConvertArcs6ToBoardItemOnLayer(), ConvertOutlineToPolygon(), CreateBoardSection(), MICROWAVE_TOOL::createMicrowaveInductor(), KIGFX::PCB_PAINTER::draw(), PCB_POINT_EDITOR::editArcEndpointKeepCenter(), PCB_POINT_EDITOR::editArcEndpointKeepTangent(), PCB_PLUGIN::format(), formatArc(), formatBezier(), formatCircle(), formatRect(), FP_TEXTBOX::GetBotRight(), PCB_TEXTBOX::GetBotRight(), getBoundingBox(), PCB_SHAPE::GetFocusPosition(), GetLength(), LIB_TEXTBOX::GetMsgPanelInfo(), SCH_TEXTBOX::GetMsgPanelInfo(), FP_TEXTBOX::GetMsgPanelInfo(), PCB_TEXTBOX::GetMsgPanelInfo(), GetRectCorners(), CADSTAR_SCH_ARCHIVE_LOADER::getScaledLibPart(), LIB_TEXTBOX::GetShownText(), SCH_TEXTBOX::GetShownText(), CONVERT_TOOL::getStartEndPoints(), GetTopLeft(), FP_TEXTBOX::GetTopLeft(), PCB_TEXTBOX::GetTopLeft(), hash_fp_item(), hitTest(), idf_export_outline(), GRAPHICS_CLEANER::isNullShape(), SCH_LEGACY_PLUGIN_CACHE::loadArc(), EDIT_POINTS_FACTORY::Make(), DSN::SPECCTRA_DB::makeIMAGE(), PCB_POINT_EDITOR::makePoints(), CONVERT_TOOL::makePolysFromChainedSegs(), GRAPHICS_CLEANER::mergeRects(), PCB_SHAPE::NormalizeRect(), PCB_PARSER::parsePAD(), SCH_SHAPE::Plot(), BRDITEMS_PLOTTER::PlotFootprintShape(), BRDITEMS_PLOTTER::PlotPcbShape(), BRDITEMS_PLOTTER::PlotPcbTarget(), SCH_SHAPE::Print(), SCH_TEXTBOX::Print(), SCH_LEGACY_PLUGIN_CACHE::saveArc(), SCH_SEXPR_PLUGIN_CACHE::saveTextBox(), SCH_SEXPR_PLUGIN::saveTextBox(), ShapeGetMsgPanelInfo(), PLOTTER::ThickArc(), GERBER_PLOTTER::ThickArc(), AR_MATRIX::TraceSegmentPcb(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow(), DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataFromWindow(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataToWindow(), DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataToWindow(), TransformShapeWithClearanceToPolygon(), EE_POINT_EDITOR::updatePoints(), and PCB_POINT_EDITOR::updatePoints().

◆ GetStartX()

◆ GetStartY()

◆ GetTopLeft()

virtual VECTOR2I EDA_SHAPE::GetTopLeft ( ) const
inlinevirtual

Reimplemented in FP_TEXTBOX, and PCB_TEXTBOX.

Definition at line 163 of file eda_shape.h.

163{ return GetStart(); }

References GetStart().

Referenced by KIGFX::PCB_PAINTER::draw(), PCB_POINT_EDITOR::makePoints(), and PCB_POINT_EDITOR::updatePoints().

◆ GetWidth()

int EDA_SHAPE::GetWidth ( ) const
inline

Definition at line 107 of file eda_shape.h.

107{ return m_stroke.GetWidth(); }

References STROKE_PARAMS::GetWidth(), and m_stroke.

Referenced by BOARD_ADAPTER::addShape(), GRAPHICS_CLEANER::areEquivalent(), ConvertOutlineToPolygon(), KIGFX::PCB_PAINTER::draw(), EDA_SHAPE_DESC::EDA_SHAPE_DESC(), FP_SHAPE::Flip(), getBoundingBox(), FOOTPRINT::GetCoverageArea(), FP_TEXTBOX::GetEffectiveShape(), PCB_TEXTBOX::GetEffectiveShape(), GetEffectiveWidth(), LIB_SHAPE::GetPenWidth(), SCH_SHAPE::GetPenWidth(), CONVERT_TOOL::getStartEndPoints(), hash_fp_item(), hitTest(), GRAPHICS_CLEANER::isNullShape(), SCH_LEGACY_PLUGIN_CACHE::loadBezier(), FABMASTER::loadOutline(), FABMASTER::loadPolygon(), DSN::SPECCTRA_DB::makeIMAGE(), CONVERT_TOOL::makePolysFromChainedSegs(), PCB_SHAPE::Mirror(), FP_SHAPE::Mirror(), FOOTPRINT::cmp_drawings::operator()(), PCB_PARSER::parsePAD(), BRDITEMS_PLOTTER::PlotFootprintShape(), BRDITEMS_PLOTTER::PlotPcbShape(), SCH_LEGACY_PLUGIN_CACHE::saveArc(), SCH_LEGACY_PLUGIN_CACHE::saveBezier(), SCH_LEGACY_PLUGIN_CACHE::saveCircle(), SCH_LEGACY_PLUGIN_CACHE::savePolyLine(), SCH_LEGACY_PLUGIN_CACHE::saveRectangle(), FP_SHAPE::SetDrawCoord(), PLOTTER::ThickArc(), GERBER_PLOTTER::ThickArc(), AR_MATRIX::TraceSegmentPcb(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow(), DIALOG_LIB_SHAPE_PROPERTIES::TransferDataToWindow(), DIALOG_LIB_TEXTBOX_PROPERTIES::TransferDataToWindow(), DIALOG_SHAPE_PROPERTIES::TransferDataToWindow(), DIALOG_TEXT_PROPERTIES::TransferDataToWindow(), DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataToWindow(), DIALOG_PAD_PRIMITIVE_POLY_PROPS::TransferDataToWindow(), TransformShapeWithClearanceToPolygon(), FP_TEXTBOX::TransformShapeWithClearanceToPolygon(), PCB_TEXTBOX::TransformShapeWithClearanceToPolygon(), PCB_POINT_EDITOR::updateItem(), and PCB_SHAPE::ViewBBox().

◆ hitTest() [1/2]

bool EDA_SHAPE::hitTest ( const BOX2I aRect,
bool  aContained,
int  aAccuracy = 0 
) const
protected

Definition at line 810 of file eda_shape.cpp.

811{
812 BOX2I arect = aRect;
813 arect.Normalize();
814 arect.Inflate( aAccuracy );
815
816 BOX2I bbox = getBoundingBox();
817
818 switch( m_shape )
819 {
820 case SHAPE_T::CIRCLE:
821 // Test if area intersects or contains the circle:
822 if( aContained )
823 {
824 return arect.Contains( bbox );
825 }
826 else
827 {
828 // If the rectangle does not intersect the bounding box, this is a much quicker test
829 if( !arect.Intersects( bbox ) )
830 return false;
831 else
832 return arect.IntersectsCircleEdge( getCenter(), GetRadius(), GetWidth() );
833 }
834
835 case SHAPE_T::ARC:
836 // Test for full containment of this arc in the rect
837 if( aContained )
838 {
839 return arect.Contains( bbox );
840 }
841 // Test if the rect crosses the arc
842 else
843 {
844 if( !arect.Intersects( bbox ) )
845 return false;
846
847 if( IsFilled() )
848 {
849 return ( arect.Intersects( getCenter(), GetStart() )
850 || arect.Intersects( getCenter(), GetEnd() )
851 || arect.IntersectsCircleEdge( getCenter(), GetRadius(), GetWidth() ) );
852 }
853 else
854 {
855 return arect.IntersectsCircleEdge( getCenter(), GetRadius(), GetWidth() );
856 }
857 }
858
859 case SHAPE_T::RECT:
860 if( aContained )
861 {
862 return arect.Contains( bbox );
863 }
864 else
865 {
866 std::vector<VECTOR2I> pts = GetRectCorners();
867
868 // Account for the width of the lines
869 arect.Inflate( GetWidth() / 2 );
870 return ( arect.Intersects( pts[0], pts[1] )
871 || arect.Intersects( pts[1], pts[2] )
872 || arect.Intersects( pts[2], pts[3] )
873 || arect.Intersects( pts[3], pts[0] ) );
874 }
875
876 case SHAPE_T::SEGMENT:
877 if( aContained )
878 {
879 return arect.Contains( GetStart() ) && aRect.Contains( GetEnd() );
880 }
881 else
882 {
883 // Account for the width of the line
884 arect.Inflate( GetWidth() / 2 );
885 return arect.Intersects( GetStart(), GetEnd() );
886 }
887
888 case SHAPE_T::POLY:
889 if( aContained )
890 {
891 return arect.Contains( bbox );
892 }
893 else
894 {
895 // Fast test: if aRect is outside the polygon bounding box,
896 // rectangles cannot intersect
897 if( !arect.Intersects( bbox ) )
898 return false;
899
900 // Account for the width of the line
901 arect.Inflate( GetWidth() / 2 );
902
903 // Polygons in footprints use coordinates relative to the footprint.
904 // Therefore, instead of using m_poly, we make a copy which is translated
905 // to the actual location in the board.
906 VECTOR2I offset = getParentPosition();
907
908 SHAPE_LINE_CHAIN poly = m_poly.Outline( 0 );
910 poly.Move( offset );
911
912 int count = poly.GetPointCount();
913
914 for( int ii = 0; ii < count; ii++ )
915 {
916 VECTOR2I vertex = poly.GetPoint( ii );
917
918 // Test if the point is within aRect
919 if( arect.Contains( vertex ) )
920 return true;
921
922 if( ii + 1 < count )
923 {
924 VECTOR2I vertexNext = poly.GetPoint( ii + 1 );
925
926 // Test if this edge intersects aRect
927 if( arect.Intersects( vertex, vertexNext ) )
928 return true;
929 }
930 else if( poly.IsClosed() )
931 {
932 VECTOR2I vertexNext = poly.GetPoint( 0 );
933
934 // Test if this edge intersects aRect
935 if( arect.Intersects( vertex, vertexNext ) )
936 return true;
937 }
938 }
939
940 return false;
941 }
942
943 case SHAPE_T::BEZIER:
944 if( aContained )
945 {
946 return arect.Contains( bbox );
947 }
948 else
949 {
950 // Fast test: if aRect is outside the polygon bounding box,
951 // rectangles cannot intersect
952 if( !arect.Intersects( bbox ) )
953 return false;
954
955 // Account for the width of the line
956 arect.Inflate( GetWidth() / 2 );
957 unsigned count = m_bezierPoints.size();
958
959 for( unsigned ii = 1; ii < count; ii++ )
960 {
961 VECTOR2I vertex = m_bezierPoints[ii - 1];
962 VECTOR2I vertexNext = m_bezierPoints[ii];
963
964 // Test if the point is within aRect
965 if( arect.Contains( vertex ) )
966 return true;
967
968 // Test if this edge intersects aRect
969 if( arect.Intersects( vertex, vertexNext ) )
970 return true;
971 }
972
973 return false;
974 }
975
976 default:
978 return false;
979 }
980}
bool Intersects(const BOX2< Vec > &aRect) const
Definition: box2.h:269
bool IntersectsCircleEdge(const Vec &aCenter, const int aRadius, const int aWidth) const
Definition: box2.h:471
bool Contains(const Vec &aPoint) const
Definition: box2.h:141
void Move(const VECTOR2I &aVector) override
bool IsClosed() const override
virtual const VECTOR2I GetPoint(int aIndex) const override
void Rotate(const EDA_ANGLE &aAngle, const VECTOR2I &aCenter={ 0, 0 }) override
Rotate all vertices by a given angle.

References ARC, BEZIER, CIRCLE, BOX2< Vec >::Contains(), getBoundingBox(), getCenter(), GetEnd(), getParentOrientation(), getParentPosition(), SHAPE_LINE_CHAIN::GetPoint(), SHAPE_LINE_CHAIN::GetPointCount(), GetRadius(), GetRectCorners(), GetStart(), GetWidth(), BOX2< Vec >::Inflate(), BOX2< Vec >::Intersects(), BOX2< Vec >::IntersectsCircleEdge(), SHAPE_LINE_CHAIN::IsClosed(), IsFilled(), m_bezierPoints, m_poly, m_shape, SHAPE_LINE_CHAIN::Move(), BOX2< Vec >::Normalize(), SHAPE_POLY_SET::Outline(), POLY, RECT, SHAPE_LINE_CHAIN::Rotate(), SEGMENT, SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

◆ hitTest() [2/2]

bool EDA_SHAPE::hitTest ( const VECTOR2I aPosition,
int  aAccuracy = 0 
) const
protected

Definition at line 696 of file eda_shape.cpp.

697{
698 int maxdist = aAccuracy;
699
700 if( GetWidth() > 0 )
701 maxdist += GetWidth() / 2;
702
703 switch( m_shape )
704 {
705 case SHAPE_T::CIRCLE:
706 {
707 int radius = GetRadius();
708
709 VECTOR2I::extended_type dist = KiROUND<double, VECTOR2I::extended_type>(
710 EuclideanNorm( aPosition - getCenter() ) );
711
712 if( IsFilled() )
713 return dist <= radius + maxdist; // Filled circle hit-test
714 else
715 return abs( radius - dist ) <= maxdist; // Ring hit-test
716 }
717
718 case SHAPE_T::ARC:
719 {
720 if( EuclideanNorm( aPosition - m_start ) <= maxdist )
721 return true;
722
723 if( EuclideanNorm( aPosition - m_end ) <= maxdist )
724 return true;
725
726 VECTOR2I relPos = aPosition - getCenter();
727 int radius = GetRadius();
728
730 KiROUND<double, VECTOR2I::extended_type>( EuclideanNorm( relPos ) );
731
732 if( IsFilled() )
733 {
734 // Check distance from arc center
735 if( dist > radius + maxdist )
736 return false;
737 }
738 else
739 {
740 // Check distance from arc circumference
741 if( abs( radius - dist ) > maxdist )
742 return false;
743 }
744
745 // Finally, check to see if it's within arc's swept angle.
746 EDA_ANGLE startAngle;
747 EDA_ANGLE endAngle;
748 CalcArcAngles( startAngle, endAngle );
749
750 EDA_ANGLE relPosAngle( relPos );
751
752 startAngle.Normalize();
753 endAngle.Normalize();
754 relPosAngle.Normalize();
755
756 if( endAngle > startAngle )
757 return relPosAngle >= startAngle && relPosAngle <= endAngle;
758 else
759 return relPosAngle >= startAngle || relPosAngle <= endAngle;
760 }
761
762 case SHAPE_T::BEZIER:
763 const_cast<EDA_SHAPE*>( this )->RebuildBezierToSegmentsPointsList( GetWidth() );
764
765 for( unsigned int i= 1; i < m_bezierPoints.size(); i++)
766 {
767 if( TestSegmentHit( aPosition, m_bezierPoints[ i - 1], m_bezierPoints[i], maxdist ) )
768 return true;
769 }
770
771 return false;
772
773 case SHAPE_T::SEGMENT:
774 return TestSegmentHit( aPosition, GetStart(), GetEnd(), maxdist );
775
776 case SHAPE_T::RECT:
777 if( IsAnnotationProxy() || IsFilled() ) // Filled rect hit-test
778 {
779 SHAPE_POLY_SET poly;
780 poly.NewOutline();
781
782 for( const VECTOR2I& pt : GetRectCorners() )
783 poly.Append( pt );
784
785 return poly.Collide( aPosition, maxdist );
786 }
787 else // Open rect hit-test
788 {
789 std::vector<VECTOR2I> pts = GetRectCorners();
790
791 return TestSegmentHit( aPosition, pts[0], pts[1], maxdist )
792 || TestSegmentHit( aPosition, pts[1], pts[2], maxdist )
793 || TestSegmentHit( aPosition, pts[2], pts[3], maxdist )
794 || TestSegmentHit( aPosition, pts[3], pts[0], maxdist );
795 }
796
797 case SHAPE_T::POLY:
798 if( IsFilled() )
799 return m_poly.Collide( aPosition, maxdist );
800 else
801 return m_poly.CollideEdge( aPosition, nullptr, maxdist );
802
803 default:
805 return false;
806 }
807}
void RebuildBezierToSegmentsPointsList(int aMinSegLen)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
Definition: eda_shape.cpp:370
bool IsAnnotationProxy() const
Definition: eda_shape.h:87
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.
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 Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Add a new vertex to the contour indexed by aOutline and aHole (defaults to the outline of the last po...
VECTOR2_TRAITS< int >::extended_type extended_type
Definition: vector2d.h:76
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition: eda_angle.h:401
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.
Definition: trigo.cpp:129
double EuclideanNorm(const VECTOR2I &vector)
Definition: trigo.h:129

References std::abs(), SHAPE_POLY_SET::Append(), ARC, BEZIER, CalcArcAngles(), CIRCLE, SHAPE_POLY_SET::Collide(), SHAPE_POLY_SET::CollideEdge(), EuclideanNorm(), getCenter(), GetEnd(), GetRadius(), GetRectCorners(), GetStart(), GetWidth(), IsAnnotationProxy(), IsFilled(), m_bezierPoints, m_end, m_poly, m_shape, m_start, SHAPE_POLY_SET::NewOutline(), EDA_ANGLE::Normalize(), POLY, RebuildBezierToSegmentsPointsList(), RECT, SEGMENT, SHAPE_T_asString(), TestSegmentHit(), and UNIMPLEMENTED_FOR.

Referenced by LIB_SHAPE::HitTest(), SCH_SHAPE::HitTest(), and PCB_SHAPE::HitTest().

◆ IsAnnotationProxy()

◆ IsFilled()

◆ IsPolyShapeValid()

bool EDA_SHAPE::IsPolyShapeValid ( ) const
Returns
true if the polygonal shape is valid (has more than 2 points)

Definition at line 1187 of file eda_shape.cpp.

1188{
1189 // return true if the polygonal shape is valid (has more than 2 points)
1190 if( GetPolyShape().OutlineCount() == 0 )
1191 return false;
1192
1193 const SHAPE_LINE_CHAIN& outline = static_cast<const SHAPE_POLY_SET&>( GetPolyShape() ).Outline( 0 );
1194
1195 return outline.PointCount() > 2;
1196}

References GetPolyShape(), and SHAPE_LINE_CHAIN::PointCount().

Referenced by PCB_PLUGIN::format(), BRDITEMS_PLOTTER::PlotFootprintShape(), BRDITEMS_PLOTTER::PlotPcbShape(), and TransformShapeWithClearanceToPolygon().

◆ makeEffectiveShapes()

std::vector< SHAPE * > EDA_SHAPE::makeEffectiveShapes ( bool  aEdgeOnly,
bool  aLineChainOnly = false 
) const
protected

Make a set of SHAPE objects representing the EDA_SHAPE.

Caller owns the objects.

Parameters
aEdgeOnlyindicates only edges should be generated (even if 0 width), and no fill shapes.
aLineChainOnlyindicates SHAPE_POLY_SET is being abused slightly to represent a lineChain rather than a closed polygon

Definition at line 1079 of file eda_shape.cpp.

1080{
1081 std::vector<SHAPE*> effectiveShapes;
1082 int width = GetEffectiveWidth();
1083
1084 switch( m_shape )
1085 {
1086 case SHAPE_T::ARC:
1087 effectiveShapes.emplace_back( new SHAPE_ARC( m_arcCenter, m_start, GetArcAngle(), width ) );
1088 break;
1089
1090 case SHAPE_T::SEGMENT:
1091 effectiveShapes.emplace_back( new SHAPE_SEGMENT( m_start, m_end, width ) );
1092 break;
1093
1094 case SHAPE_T::RECT:
1095 {
1096 std::vector<VECTOR2I> pts = GetRectCorners();
1097
1098 if( ( IsFilled() || IsAnnotationProxy() ) && !aEdgeOnly )
1099 effectiveShapes.emplace_back( new SHAPE_SIMPLE( pts ) );
1100
1101 if( width > 0 || !IsFilled() || aEdgeOnly )
1102 {
1103 effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[0], pts[1], width ) );
1104 effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[1], pts[2], width ) );
1105 effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[2], pts[3], width ) );
1106 effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[3], pts[0], width ) );
1107 }
1108 }
1109 break;
1110
1111 case SHAPE_T::CIRCLE:
1112 {
1113 if( IsFilled() && !aEdgeOnly )
1114 effectiveShapes.emplace_back( new SHAPE_CIRCLE( getCenter(), GetRadius() ) );
1115
1116 if( width > 0 || !IsFilled() || aEdgeOnly )
1117 effectiveShapes.emplace_back( new SHAPE_ARC( getCenter(), GetEnd(), ANGLE_360, width ) );
1118
1119 break;
1120 }
1121
1122 case SHAPE_T::BEZIER:
1123 {
1124 std::vector<VECTOR2I> bezierPoints = buildBezierToSegmentsPointsList( width );
1125 VECTOR2I start_pt = bezierPoints[0];
1126
1127 for( unsigned int jj = 1; jj < bezierPoints.size(); jj++ )
1128 {
1129 VECTOR2I end_pt = bezierPoints[jj];
1130 effectiveShapes.emplace_back( new SHAPE_SEGMENT( start_pt, end_pt, width ) );
1131 start_pt = end_pt;
1132 }
1133
1134 break;
1135 }
1136
1137 case SHAPE_T::POLY:
1138 {
1139 if( GetPolyShape().OutlineCount() == 0 ) // malformed/empty polygon
1140 break;
1141
1143
1144 if( aLineChainOnly )
1145 l.SetClosed( false );
1146
1148 l.Move( getParentPosition() );
1149
1150 if( IsFilled() && !aEdgeOnly )
1151 effectiveShapes.emplace_back( new SHAPE_SIMPLE( l ) );
1152
1153 if( width > 0 || !IsFilled() || aEdgeOnly )
1154 {
1155 for( int i = 0; i < l.SegmentCount(); i++ )
1156 effectiveShapes.emplace_back( new SHAPE_SEGMENT( l.Segment( i ), width ) );
1157 }
1158 }
1159 break;
1160
1161 default:
1163 break;
1164 }
1165
1166 return effectiveShapes;
1167}
virtual int GetEffectiveWidth() const
Definition: eda_shape.h:108
const std::vector< VECTOR2I > buildBezierToSegmentsPointsList(int aMinSegLen) const
Definition: eda_shape.cpp:384
int SegmentCount() const
Return the number of segments in this line chain.
SEG Segment(int aIndex)
Return a copy of the aIndex-th segment in the line chain.
Represent a simple polygon consisting of a zero-thickness closed chain of connected line segments.
Definition: shape_simple.h:42

References ANGLE_360, ARC, BEZIER, buildBezierToSegmentsPointsList(), CIRCLE, SHAPE_POLY_SET::COutline(), GetArcAngle(), getCenter(), GetEffectiveWidth(), GetEnd(), getParentOrientation(), getParentPosition(), GetPolyShape(), GetRadius(), GetRectCorners(), IsAnnotationProxy(), IsFilled(), m_arcCenter, m_end, m_shape, m_start, SHAPE_LINE_CHAIN::Move(), POLY, RECT, SHAPE_LINE_CHAIN::Rotate(), SEGMENT, SHAPE_LINE_CHAIN::Segment(), SHAPE_LINE_CHAIN::SegmentCount(), SHAPE_LINE_CHAIN::SetClosed(), SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by MakeEffectiveShapes(), and LIB_SHAPE::MakeEffectiveShapes().

◆ MakeEffectiveShapes()

virtual std::vector< SHAPE * > EDA_SHAPE::MakeEffectiveShapes ( bool  aEdgeOnly = false) const
inlinevirtual

Make a set of SHAPE objects representing the EDA_SHAPE.

Caller owns the objects.

Parameters
aEdgeOnlyindicates only edges should be generated (even if 0 width), and no fill shapes.

Reimplemented in LIB_SHAPE.

Definition at line 285 of file eda_shape.h.

286 {
287 return makeEffectiveShapes( aEdgeOnly );
288 }
std::vector< SHAPE * > makeEffectiveShapes(bool aEdgeOnly, bool aLineChainOnly=false) const
Make a set of SHAPE objects representing the EDA_SHAPE.
Definition: eda_shape.cpp:1079

References makeEffectiveShapes().

Referenced by BOARD_ADAPTER::addShape(), KIGFX::PCB_PAINTER::draw(), KIGFX::SCH_PAINTER::draw(), PCB_SHAPE::GetEffectiveShape(), BRDITEMS_PLOTTER::PlotFootprintShape(), BRDITEMS_PLOTTER::PlotPcbShape(), SCH_SHAPE::Print(), SCH_TEXTBOX::Print(), and PNS_KICAD_IFACE_BASE::syncGraphicalItem().

◆ move()

void EDA_SHAPE::move ( const VECTOR2I aMoveVector)
protected

Definition at line 141 of file eda_shape.cpp.

142{
143 switch ( m_shape )
144 {
145 case SHAPE_T::ARC:
146 case SHAPE_T::SEGMENT:
147 case SHAPE_T::RECT:
148 case SHAPE_T::CIRCLE:
149 m_start += aMoveVector;
150 m_end += aMoveVector;
151 m_arcCenter += aMoveVector;
152 break;
153
154 case SHAPE_T::POLY:
155 m_poly.Move( VECTOR2I( aMoveVector ) );
156 break;
157
158 case SHAPE_T::BEZIER:
159 m_start += aMoveVector;
160 m_end += aMoveVector;
161 m_bezierC1 += aMoveVector;
162 m_bezierC2 += aMoveVector;
163
164 for( VECTOR2I& pt : m_bezierPoints )
165 pt += aMoveVector;
166
167 break;
168
169 default:
171 break;
172 }
173}
void Move(const VECTOR2I &aVector) override

References ARC, BEZIER, CIRCLE, m_arcCenter, m_bezierC1, m_bezierC2, m_bezierPoints, m_end, m_poly, m_shape, m_start, SHAPE_POLY_SET::Move(), POLY, RECT, SEGMENT, SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by SCH_TEXTBOX::Move(), PCB_SHAPE::Move(), SCH_SHAPE::Move(), LIB_SHAPE::Offset(), and setPosition().

◆ RebuildBezierToSegmentsPointsList()

void EDA_SHAPE::RebuildBezierToSegmentsPointsList ( int  aMinSegLen)

Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.

Has meaning only for BEZIER shape.

Parameters
aMinSegLenis the min length of segments approximating the bezier. The shape's last segment can be shorter. This parameter avoids having too many very short segment in list. Good values are between m_width/2 and m_width.

Definition at line 370 of file eda_shape.cpp.

371{
372 // Has meaning only for SHAPE_T::BEZIER
373 if( m_shape != SHAPE_T::BEZIER )
374 {
375 m_bezierPoints.clear();
376 return;
377 }
378
379 // Rebuild the m_BezierPoints vertex list that approximate the Bezier curve
381}

References BEZIER, buildBezierToSegmentsPointsList(), m_bezierPoints, and m_shape.

Referenced by ConvertOutlineToPolygon(), FP_SHAPE::Flip(), hitTest(), GRAPHICS_CLEANER::isNullShape(), SCH_LEGACY_PLUGIN_CACHE::loadBezier(), PCB_SHAPE::Mirror(), FP_SHAPE::Mirror(), FP_SHAPE::SetDrawCoord(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow(), and PCB_POINT_EDITOR::updateItem().

◆ rotate()

void EDA_SHAPE::rotate ( const VECTOR2I aRotCentre,
const EDA_ANGLE aAngle 
)
protected

Definition at line 228 of file eda_shape.cpp.

229{
230 switch( m_shape )
231 {
232 case SHAPE_T::SEGMENT:
233 case SHAPE_T::CIRCLE:
234 RotatePoint( m_start, aRotCentre, aAngle );
235 RotatePoint( m_end, aRotCentre, aAngle );
236 break;
237
238 case SHAPE_T::ARC:
239 RotatePoint( m_start, aRotCentre, aAngle );
240 RotatePoint( m_end, aRotCentre, aAngle );
241 RotatePoint( m_arcCenter, aRotCentre, aAngle );
242 break;
243
244 case SHAPE_T::RECT:
245 if( aAngle.IsCardinal() )
246 {
247 RotatePoint( m_start, aRotCentre, aAngle );
248 RotatePoint( m_end, aRotCentre, aAngle );
249 break;
250 }
251
252 // Convert non-cardinally-rotated rect to a diamond
260
262
263 case SHAPE_T::POLY:
264 m_poly.Rotate( aAngle, aRotCentre );
265 break;
266
267 case SHAPE_T::BEZIER:
268 RotatePoint( m_start, aRotCentre, aAngle );
269 RotatePoint( m_end, aRotCentre, aAngle );
270 RotatePoint( m_bezierC1, aRotCentre, aAngle );
271 RotatePoint( m_bezierC2, aRotCentre, aAngle );
272
273 for( VECTOR2I& pt : m_bezierPoints )
274 RotatePoint( pt, aRotCentre, aAngle);
275
276 break;
277
278 default:
280 break;
281 }
282}
bool IsCardinal() const
Definition: eda_angle.cpp:49
void Rotate(const EDA_ANGLE &aAngle, const VECTOR2I &aCenter={ 0, 0 }) override
Rotate all vertices by a given angle.
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
Definition: macros.h:83

References SHAPE_POLY_SET::Append(), ARC, BEZIER, CIRCLE, EDA_ANGLE::IsCardinal(), KI_FALLTHROUGH, m_arcCenter, m_bezierC1, m_bezierC2, m_bezierPoints, m_end, m_poly, m_shape, m_start, SHAPE_POLY_SET::NewOutline(), POLY, RECT, SHAPE_POLY_SET::RemoveAllContours(), SHAPE_POLY_SET::Rotate(), RotatePoint(), SEGMENT, SHAPE_T_asString(), UNIMPLEMENTED_FOR, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by SCH_SHAPE::Rotate(), LIB_SHAPE::Rotate(), and PCB_SHAPE::Rotate().

◆ scale()

void EDA_SHAPE::scale ( double  aScale)
protected

Definition at line 176 of file eda_shape.cpp.

177{
178 auto scalePt = [&]( VECTOR2I& pt )
179 {
180 pt.x = KiROUND( pt.x * aScale );
181 pt.y = KiROUND( pt.y * aScale );
182 };
183
184 switch( m_shape )
185 {
186 case SHAPE_T::ARC:
187 case SHAPE_T::SEGMENT:
188 case SHAPE_T::RECT:
189 scalePt( m_start );
190 scalePt( m_end );
191 scalePt( m_arcCenter );
192 break;
193
194 case SHAPE_T::CIRCLE: // ring or circle
195 scalePt( m_start );
196 m_end.x = m_start.x + KiROUND( GetRadius() * aScale );
197 m_end.y = m_start.y;
198 break;
199
200 case SHAPE_T::POLY: // polygon
201 {
202 std::vector<VECTOR2I> pts;
203
204 for( const VECTOR2I& pt : m_poly.Outline( 0 ).CPoints() )
205 {
206 pts.emplace_back( pt );
207 scalePt( pts.back() );
208 }
209
210 SetPolyPoints( pts );
211 }
212 break;
213
214 case SHAPE_T::BEZIER:
215 scalePt( m_start );
216 scalePt( m_end );
217 scalePt( m_bezierC1 );
218 scalePt( m_bezierC2 );
219 break;
220
221 default:
223 break;
224 }
225}
void SetPolyPoints(const std::vector< VECTOR2I > &aPoints)
Definition: eda_shape.cpp:1069
const std::vector< VECTOR2I > & CPoints() const

References ARC, BEZIER, CIRCLE, SHAPE_LINE_CHAIN::CPoints(), GetRadius(), KiROUND(), m_arcCenter, m_bezierC1, m_bezierC2, m_end, m_poly, m_shape, m_start, SHAPE_POLY_SET::Outline(), POLY, RECT, SEGMENT, SetPolyPoints(), SHAPE_T_asString(), UNIMPLEMENTED_FOR, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by PCB_SHAPE::Scale().

◆ SetArcAngleAndEnd()

void EDA_SHAPE::SetArcAngleAndEnd ( const EDA_ANGLE aAngle,
bool  aCheckNegativeAngle = false 
)

Set the end point from the angle center and start.

Definition at line 549 of file eda_shape.cpp.

550{
551 EDA_ANGLE angle( aAngle );
552
553 m_end = m_start;
554 RotatePoint( m_end, m_arcCenter, -angle.Normalize720() );
555
556 if( aCheckNegativeAngle && aAngle < ANGLE_0 )
557 {
558 std::swap( m_start, m_end );
559 m_endsSwapped = true;
560 }
561}
static DIRECTION_45::AngleType angle(const VECTOR2I &a, const VECTOR2I &b)

References PNS::angle(), ANGLE_0, m_arcCenter, m_end, m_endsSwapped, m_start, and RotatePoint().

Referenced by PAD::AddPrimitiveArc(), PCAD2KICAD::PCB_ARC::AddToBoard(), ALTIUM_PCB::ConvertArcs6ToBoardItemOnLayer(), ALTIUM_PCB::ConvertArcs6ToPcbShape(), DRAWING_TOOL::drawArc(), CADSTAR_PCB_ARCHIVE_LOADER::getShapeFromVertex(), SCH_LEGACY_PLUGIN_CACHE::loadArc(), EAGLE_PLUGIN::loadPlain(), SCH_ALTIUM_PLUGIN::ParseArc(), and DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataFromWindow().

◆ SetArcGeometry()

void EDA_SHAPE::SetArcGeometry ( const VECTOR2I aStart,
const VECTOR2I aMid,
const VECTOR2I aEnd 
)

Set the three controlling points for an arc.

NB: these are NOT what's currently stored, so we have to do some calculations behind the scenes. However, they are what SHOULD be stored.

Definition at line 508 of file eda_shape.cpp.

509{
510 m_arcMidData = {};
511 m_start = aStart;
512 m_end = aEnd;
513 m_arcCenter = CalcArcCenter( aStart, aMid, aEnd );
514 VECTOR2I new_mid = GetArcMid();
515
516 m_endsSwapped = false;
517
518 // Watch the ordering here. GetArcMid above needs to be called prior to initializing the
519 // m_arcMidData structure in order to ensure we get the calculated variant, not the cached
520 SetCachedArcData( aStart, aMid, aEnd, m_arcCenter );
521
522 /*
523 * If the input winding doesn't match our internal winding, the calculated midpoint will end
524 * up on the other side of the arc. In this case, we need to flip the start/end points and
525 * flag this change for the system.
526 */
527 VECTOR2D dist( new_mid - aMid );
528 VECTOR2D dist2( new_mid - m_arcCenter );
529
530 if( dist.SquaredEuclideanNorm() > dist2.SquaredEuclideanNorm() )
531 {
532 std::swap( m_start, m_end );
533 m_endsSwapped = true;
534 }
535}
void SetCachedArcData(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, const VECTOR2I &aCenter)
Set the data used for mid point caching.
Definition: eda_shape.cpp:499
VECTOR2I GetArcMid() const
Definition: eda_shape.cpp:441
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.
Definition: trigo.cpp:472

References CalcArcCenter(), GetArcMid(), m_arcCenter, m_arcMidData, m_end, m_endsSwapped, m_start, SetCachedArcData(), and VECTOR2< T >::SquaredEuclideanNorm().

Referenced by beginEdit(), calcEdit(), PCB_POINT_EDITOR::editArcMidKeepEndpoints(), ALTIUM_PCB::HelperCreateBoardOutline(), FABMASTER::loadFootprints(), FABMASTER::loadGraphics(), FABMASTER::loadOutline(), and SCH_EAGLE_PLUGIN::loadSymbolWire().

◆ SetBezierC1()

◆ SetBezierC2()

◆ SetBottom()

virtual void EDA_SHAPE::SetBottom ( int  val)
inlinevirtual

Reimplemented in FP_TEXTBOX, and PCB_TEXTBOX.

Definition at line 169 of file eda_shape.h.

169{ SetEndY( val ); }
void SetEndY(int y)
Definition: eda_shape.h:151

References SetEndY().

Referenced by PCB_POINT_EDITOR::updateItem().

◆ SetCachedArcData()

void EDA_SHAPE::SetCachedArcData ( const VECTOR2I aStart,
const VECTOR2I aMid,
const VECTOR2I aEnd,
const VECTOR2I aCenter 
)

Set the data used for mid point caching.

If the controlling points remain constant, then we keep the midpoint the same as it was when read in. This minimizes VCS churn

Parameters
aStartCached start point
aMidCached mid point
aEndCached end point
aCenterCalculated center point using the preceeding three

Definition at line 499 of file eda_shape.cpp.

500{
501 m_arcMidData.start = aStart;
502 m_arcMidData.end = aEnd;
503 m_arcMidData.center = aCenter;
504 m_arcMidData.mid = aMid;
505}

References ARC_MID::center, ARC_MID::end, m_arcMidData, ARC_MID::mid, and ARC_MID::start.

Referenced by SetArcGeometry().

◆ SetCenter()

◆ setEditState()

void EDA_SHAPE::setEditState ( int  aState)
inlineprotected

Definition at line 348 of file eda_shape.h.

348{ m_editState = aState; }

References m_editState.

Referenced by LIB_SHAPE::SetEditState(), and SCH_SHAPE::SetEditState().

◆ SetEnd()

void EDA_SHAPE::SetEnd ( const VECTOR2I aEnd)
inline

Definition at line 145 of file eda_shape.h.

146 {
147 m_end = aEnd;
148 m_endsSwapped = false;
149 }

References m_end, and m_endsSwapped.

Referenced by PCB_POINT_EDITOR::addCorner(), PAD::AddPrimitiveAnnotationBox(), PAD::AddPrimitiveCircle(), PAD::AddPrimitiveCurve(), PAD::AddPrimitiveRect(), PAD::AddPrimitiveSegment(), SCH_ALTIUM_PLUGIN::AddTextBox(), PCAD2KICAD::PCB_LINE::AddToBoard(), beginEdit(), calcEdit(), SCH_EDIT_TOOL::ChangeTextType(), ALTIUM_PCB::ConvertArcs6ToPcbShape(), ALTIUM_PCB::ConvertFills6ToBoardItemOnLayer(), ALTIUM_PCB::ConvertFills6ToFootprintItem(), ALTIUM_PCB::ConvertFills6ToFootprintItemOnLayer(), ALTIUM_PCB::ConvertTracks6ToBoardItem(), ALTIUM_PCB::ConvertTracks6ToBoardItemOnLayer(), ALTIUM_PCB::ConvertTracks6ToFootprintItem(), ALTIUM_PCB::ConvertTracks6ToFootprintItemOnLayer(), MICROWAVE_TOOL::createMicrowaveInductor(), PCB_POINT_EDITOR::editArcEndpointKeepCenter(), PCB_POINT_EDITOR::editArcEndpointKeepTangent(), PCB_POINT_EDITOR::editArcMidKeepCenter(), PAD_TOOL::explodePad(), CADSTAR_SCH_ARCHIVE_LOADER::getScaledLibPart(), CADSTAR_PCB_ARCHIVE_LOADER::getShapeFromVertex(), ALTIUM_PCB::HelperCreateBoardOutline(), HelperGeneratePowerPortGraphics(), ALTIUM_PCB::HelperParseDimensions6Leader(), ALTIUM_PCB::HelperParsePad6NonCopper(), initTextTable(), SCH_LEGACY_PLUGIN_CACHE::loadArc(), SCH_LEGACY_PLUGIN_CACHE::loadBezier(), SCH_LEGACY_PLUGIN_CACHE::loadCircle(), FABMASTER::loadFootprints(), FABMASTER::loadGraphics(), CADSTAR_SCH_ARCHIVE_LOADER::loadLibrarySymbolShapeVertices(), FABMASTER::loadOutline(), EAGLE_PLUGIN::loadPlain(), SCH_LEGACY_PLUGIN_CACHE::loadRect(), SCH_EAGLE_PLUGIN::loadSymbolCircle(), SCH_EAGLE_PLUGIN::loadSymbolRectangle(), GRAPHICS_CLEANER::mergeRects(), PCB_SHAPE::NormalizeRect(), SCH_ALTIUM_PLUGIN::ParseArc(), SCH_ALTIUM_PLUGIN::ParseBezier(), SCH_ALTIUM_PLUGIN::ParseEllipse(), SCH_ALTIUM_PLUGIN::ParseRectangle(), SCH_ALTIUM_PLUGIN::ParseRoundRectangle(), DRAWING_TOOL::PlaceCharacteristics(), DRAWING_TOOL::PlaceStackup(), BRDITEMS_PLOTTER::PlotDimension(), BRDITEMS_PLOTTER::PlotPcbTarget(), PAD_TOOL::RecombinePad(), PCB_TEXTBOX::Rotate(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow(), DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataFromWindow(), PCB_TARGET::TransformShapeWithClearanceToPolygon(), updateArcFromConstructionMgr(), PCB_POINT_EDITOR::updateItem(), EE_POINT_EDITOR::updateParentItem(), and updateSegmentFromGeometryMgr().

◆ SetEndX()

◆ SetEndY()

◆ SetFillColor()

◆ SetFilled()

void EDA_SHAPE::SetFilled ( bool  aFlag)
inline

Definition at line 95 of file eda_shape.h.

96 {
98 }
@ FILLED_SHAPE

References FILLED_SHAPE, m_fill, and NO_FILL.

Referenced by PAD::AddPrimitiveAnnotationBox(), PAD::AddPrimitiveArc(), PAD::AddPrimitiveCircle(), PAD::AddPrimitiveCurve(), PAD::AddPrimitivePoly(), PAD::AddPrimitiveRect(), PAD::AddPrimitiveSegment(), SCH_ALTIUM_PLUGIN::AddTextBox(), PCAD2KICAD::PCB_ARC::AddToBoard(), ZONE_CREATE_HELPER::commitZone(), ALTIUM_PCB::ConvertFills6ToBoardItemOnLayer(), ALTIUM_PCB::ConvertFills6ToFootprintItemOnLayer(), ALTIUM_PCB::ConvertShapeBasedRegions6ToBoardItemOnLayer(), ALTIUM_PCB::ConvertShapeBasedRegions6ToFootprintItemOnLayer(), MICROWAVE_TOOL::createPolygonShape(), CONVERT_TOOL::CreatePolys(), CADSTAR_PCB_ARCHIVE_LOADER::drawCadstarShape(), DRAWING_TOOL::DrawCircle(), DRAWING_TOOL::DrawRectangle(), DRAWING_TOOL::drawShape(), PAD_TOOL::explodePad(), CADSTAR_PCB_ARCHIVE_LOADER::getKiCadPad(), ALTIUM_PCB::HelperParsePad6NonCopper(), FABMASTER::loadGraphics(), EAGLE_PLUGIN::loadPlain(), FABMASTER::loadPolygon(), CONVERT_TOOL::makePolysFromGraphics(), GRAPHICS_CLEANER::mergeRects(), DIALOG_PAD_PROPERTIES::onAddPrimitive(), EAGLE_PLUGIN::packageCircle(), EAGLE_PLUGIN::packagePolygon(), EAGLE_PLUGIN::packageRectangle(), SCH_ALTIUM_PLUGIN::ParseEllipse(), BRDITEMS_PLOTTER::PlotDimension(), BRDITEMS_PLOTTER::PlotPcbTarget(), PAD_TOOL::RecombinePad(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow(), DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataFromWindow(), and DIALOG_PAD_PRIMITIVE_POLY_PROPS::TransferDataFromWindow().

◆ SetFillMode()

◆ SetIsAnnotationProxy()

void EDA_SHAPE::SetIsAnnotationProxy ( bool  aIsProxy = true)
inline

◆ SetLeft()

virtual void EDA_SHAPE::SetLeft ( int  val)
inlinevirtual

Reimplemented in FP_TEXTBOX, and PCB_TEXTBOX.

Definition at line 167 of file eda_shape.h.

167{ SetStartX( val ); }
void SetStartX(int x)
Definition: eda_shape.h:132

References SetStartX().

Referenced by PCB_POINT_EDITOR::updateItem().

◆ SetPolyPoints()

◆ SetPolyShape()

void EDA_SHAPE::SetPolyShape ( const SHAPE_POLY_SET aShape)
inline

Definition at line 251 of file eda_shape.h.

252 {
253 m_poly = aShape;
254
255 for( int ii = 0; ii < m_poly.OutlineCount(); ++ii )
256 {
257 if( m_poly.HoleCount( ii ) )
258 {
260 break;
261 }
262 }
263 }
void Fracture(POLYGON_MODE aFastMode)
Convert a single outline slitted ("fractured") polygon into a set ouf outlines with holes.
int HoleCount(int aOutline) const
Return the reference to aIndex-th outline in the set.

References SHAPE_POLY_SET::Fracture(), SHAPE_POLY_SET::HoleCount(), m_poly, SHAPE_POLY_SET::OutlineCount(), and SHAPE_POLY_SET::PM_FAST.

Referenced by PAD::AddPrimitivePoly(), ZONE_CREATE_HELPER::commitZone(), ALTIUM_PCB::ConvertShapeBasedRegions6ToBoardItemOnLayer(), ALTIUM_PCB::ConvertShapeBasedRegions6ToFootprintItemOnLayer(), CONVERT_TOOL::CreatePolys(), CADSTAR_PCB_ARCHIVE_LOADER::drawCadstarShape(), PAD_TOOL::explodePad(), CADSTAR_PCB_ARCHIVE_LOADER::getKiCadPad(), FABMASTER::loadGraphics(), FABMASTER::loadPolygon(), and PAD_TOOL::RecombinePad().

◆ setPosition()

void EDA_SHAPE::setPosition ( const VECTOR2I aPos)
protected

Definition at line 93 of file eda_shape.cpp.

94{
95 move( aPos - getPosition() );
96}
void move(const VECTOR2I &aMoveVector)
Definition: eda_shape.cpp:141
VECTOR2I getPosition() const
Definition: eda_shape.cpp:99

References getPosition(), and move().

Referenced by LIB_SHAPE::MoveTo(), SCH_SHAPE::SetPosition(), PCB_SHAPE::SetPosition(), and LIB_SHAPE::SetPosition().

◆ SetRight()

virtual void EDA_SHAPE::SetRight ( int  val)
inlinevirtual

Reimplemented in FP_TEXTBOX, and PCB_TEXTBOX.

Definition at line 168 of file eda_shape.h.

168{ SetEndX( val ); }
void SetEndX(int x)
Definition: eda_shape.h:157

References SetEndX().

Referenced by PCB_POINT_EDITOR::updateItem().

◆ SetShape()

◆ SetStart()

void EDA_SHAPE::SetStart ( const VECTOR2I aStart)
inline

Definition at line 120 of file eda_shape.h.

121 {
122 m_start = aStart;
123 m_endsSwapped = false;
124 }

References m_endsSwapped, and m_start.

Referenced by PCB_POINT_EDITOR::addCorner(), PAD::AddPrimitiveAnnotationBox(), PAD::AddPrimitiveArc(), PAD::AddPrimitiveCircle(), PAD::AddPrimitiveCurve(), PAD::AddPrimitiveRect(), PAD::AddPrimitiveSegment(), SCH_ALTIUM_PLUGIN::AddTextBox(), PCAD2KICAD::PCB_ARC::AddToBoard(), PCAD2KICAD::PCB_LINE::AddToBoard(), beginEdit(), ALTIUM_PCB::ConvertArcs6ToBoardItemOnLayer(), ALTIUM_PCB::ConvertArcs6ToPcbShape(), ALTIUM_PCB::ConvertFills6ToBoardItemOnLayer(), ALTIUM_PCB::ConvertFills6ToFootprintItem(), ALTIUM_PCB::ConvertFills6ToFootprintItemOnLayer(), ALTIUM_PCB::ConvertTracks6ToBoardItem(), ALTIUM_PCB::ConvertTracks6ToBoardItemOnLayer(), ALTIUM_PCB::ConvertTracks6ToFootprintItem(), ALTIUM_PCB::ConvertTracks6ToFootprintItemOnLayer(), MICROWAVE_TOOL::createMicrowaveInductor(), PCB_POINT_EDITOR::editArcEndpointKeepCenter(), PCB_POINT_EDITOR::editArcEndpointKeepTangent(), PCB_POINT_EDITOR::editArcMidKeepCenter(), PAD_TOOL::explodePad(), CADSTAR_SCH_ARCHIVE_LOADER::getScaledLibPart(), CADSTAR_PCB_ARCHIVE_LOADER::getShapeFromVertex(), ALTIUM_PCB::HelperCreateBoardOutline(), ALTIUM_PCB::HelperParseDimensions6Datum(), ALTIUM_PCB::HelperParseDimensions6Leader(), ALTIUM_PCB::HelperParsePad6NonCopper(), initTextTable(), SCH_LEGACY_PLUGIN_CACHE::loadArc(), SCH_LEGACY_PLUGIN_CACHE::loadBezier(), SCH_LEGACY_PLUGIN_CACHE::loadCircle(), FABMASTER::loadFootprints(), FABMASTER::loadGraphics(), CADSTAR_SCH_ARCHIVE_LOADER::loadLibrarySymbolShapeVertices(), FABMASTER::loadOutline(), EAGLE_PLUGIN::loadPlain(), GRAPHICS_CLEANER::mergeRects(), PCB_SHAPE::NormalizeRect(), SCH_ALTIUM_PLUGIN::ParseArc(), SCH_ALTIUM_PLUGIN::ParseBezier(), DRAWING_TOOL::PlaceCharacteristics(), DRAWING_TOOL::PlaceStackup(), BRDITEMS_PLOTTER::PlotDimension(), BRDITEMS_PLOTTER::PlotPcbTarget(), PAD_TOOL::RecombinePad(), PCB_TEXTBOX::Rotate(), DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataFromWindow(), PCB_TARGET::TransformShapeWithClearanceToPolygon(), updateArcFromConstructionMgr(), PCB_POINT_EDITOR::updateItem(), and updateSegmentFromGeometryMgr().

◆ SetStartX()

◆ SetStartY()

◆ SetTop()

virtual void EDA_SHAPE::SetTop ( int  val)
inlinevirtual

Reimplemented in FP_TEXTBOX, and PCB_TEXTBOX.

Definition at line 166 of file eda_shape.h.

166{ SetStartY( val ); }
void SetStartY(int y)
Definition: eda_shape.h:126

References SetStartY().

Referenced by PCB_POINT_EDITOR::updateItem().

◆ SetWidth()

void EDA_SHAPE::SetWidth ( int  aWidth)
inline

◆ SHAPE_T_asString()

wxString EDA_SHAPE::SHAPE_T_asString ( ) const

Definition at line 75 of file eda_shape.cpp.

76{
77 switch( m_shape )
78 {
79 case SHAPE_T::SEGMENT: return "S_SEGMENT";
80 case SHAPE_T::RECT: return "S_RECT";
81 case SHAPE_T::ARC: return "S_ARC";
82 case SHAPE_T::CIRCLE: return "S_CIRCLE";
83 case SHAPE_T::POLY: return "S_POLYGON";
84 case SHAPE_T::BEZIER: return "S_CURVE";
85 case SHAPE_T::LAST: return "!S_LAST!"; // Synthetic value, but if we come across it then
86 // we're going to want to know.
87 }
88
89 return wxEmptyString; // Just to quiet GCC.
90}
@ LAST
marker for list end

References ARC, BEZIER, CIRCLE, LAST, m_shape, POLY, RECT, and SEGMENT.

Referenced by LIB_SHAPE::AddPoint(), SCH_SHAPE::AddPoint(), BOARD_ADAPTER::addShape(), GRAPHICS_CLEANER::areEquivalent(), beginEdit(), calcEdit(), continueEdit(), ConvertOutlineToPolygon(), endEdit(), PAD_TOOL::explodePad(), flip(), FP_SHAPE::Flip(), PCB_PLUGIN::format(), getBoundingBox(), getCenter(), FP_SHAPE::GetCenter0(), PCB_SHAPE::GetCorners(), GetLength(), LIB_SHAPE::GetMenuImage(), SCH_SHAPE::GetMenuImage(), GetRadius(), LIB_SHAPE::GetSelectMenuText(), SCH_SHAPE::GetSelectMenuText(), hitTest(), GRAPHICS_CLEANER::isNullShape(), EDIT_POINTS_FACTORY::Make(), makeEffectiveShapes(), PCB_SHAPE::Mirror(), FP_SHAPE::Mirror(), move(), FP_SHAPE::Move(), SCH_SHAPE::Plot(), LIB_SHAPE::Plot(), BRDITEMS_PLOTTER::PlotPcbShape(), SCH_SHAPE::Print(), LIB_SHAPE::print(), PAD_TOOL::RecombinePad(), rotate(), SCH_SEXPR_PLUGIN::saveShape(), SCH_SEXPR_PLUGIN_CACHE::saveSymbolDrawItem(), scale(), SetCenter(), FP_SHAPE::SetCenter0(), shapesNeedUpdate(), TransformShapeWithClearanceToPolygon(), EE_POINT_EDITOR::updateParentItem(), EE_POINT_EDITOR::updatePoints(), and DIALOG_GRAPHIC_ITEM_PROPERTIES::Validate().

◆ ShapeGetMsgPanelInfo()

void EDA_SHAPE::ShapeGetMsgPanelInfo ( EDA_DRAW_FRAME aFrame,
std::vector< MSG_PANEL_ITEM > &  aList 
)

Definition at line 564 of file eda_shape.cpp.

565{
566 ORIGIN_TRANSFORMS originTransforms = aFrame->GetOriginTransforms();
567 wxString msg;
568
569 wxString shape = _( "Shape" );
570
571 switch( m_shape )
572 {
573 case SHAPE_T::CIRCLE:
574 aList.emplace_back( shape, _( "Circle" ) );
575 aList.emplace_back( _( "Radius" ), aFrame->MessageTextFromValue( GetRadius() ) );
576 break;
577
578 case SHAPE_T::ARC:
579 aList.emplace_back( shape, _( "Arc" ) );
580
582 aList.emplace_back( _( "Angle" ), msg );
583
584 aList.emplace_back( _( "Radius" ), aFrame->MessageTextFromValue( GetRadius() ) );
585 break;
586
587 case SHAPE_T::BEZIER:
588 aList.emplace_back( shape, _( "Curve" ) );
589 aList.emplace_back( _( "Length" ), aFrame->MessageTextFromValue( GetLength() ) );
590 break;
591
592 case SHAPE_T::POLY:
593 aList.emplace_back( shape, _( "Polygon" ) );
594
595 msg.Printf( "%d", GetPolyShape().Outline(0).PointCount() );
596 aList.emplace_back( _( "Points" ), msg );
597 break;
598
599 case SHAPE_T::RECT:
600 if( IsAnnotationProxy() )
601 aList.emplace_back( shape, _( "Pad Number Box" ) );
602 else
603 aList.emplace_back( shape, _( "Rectangle" ) );
604
605 aList.emplace_back( _( "Width" ),
606 aFrame->MessageTextFromValue( std::abs( GetEnd().x - GetStart().x ) ) );
607
608 aList.emplace_back( _( "Height" ),
609 aFrame->MessageTextFromValue( std::abs( GetEnd().y - GetStart().y ) ) );
610 break;
611
612 case SHAPE_T::SEGMENT:
613 {
614 aList.emplace_back( shape, _( "Segment" ) );
615
616 aList.emplace_back( _( "Length" ),
618
619 // angle counter-clockwise from 3'o-clock
620 EDA_ANGLE angle( atan2( (double)( GetStart().y - GetEnd().y ),
621 (double)( GetEnd().x - GetStart().x ) ), RADIANS_T );
622 aList.emplace_back( _( "Angle" ), EDA_UNIT_UTILS::UI::MessageTextFromValue( angle ) );
623 break;
624 }
625
626 default:
627 aList.emplace_back( shape, _( "Unrecognized" ) );
628 break;
629 }
630
631 m_stroke.GetMsgPanelInfo( aFrame, aList );
632}
virtual ORIGIN_TRANSFORMS & GetOriginTransforms()
Return a reference to the default ORIGIN_TRANSFORMS object.
double GetLength() const
Return the length of the track using the hypotenuse calculation.
Definition: eda_shape.cpp:110
A class to perform either relative or absolute display origin transforms for a single axis of a point...
void GetMsgPanelInfo(UNITS_PROVIDER *aUnitsProvider, std::vector< MSG_PANEL_ITEM > &aList, bool aIncludeStyle=true, bool aIncludeWidth=true)
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
A lower-precision version of StringFromValue().
#define _(s)
@ RADIANS_T
Definition: eda_angle.h:32
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.
Definition: eda_units.cpp:323

References _, std::abs(), PNS::angle(), ARC, BEZIER, CIRCLE, GetArcAngle(), GetEnd(), GetLength(), GetLineLength(), STROKE_PARAMS::GetMsgPanelInfo(), EDA_BASE_FRAME::GetOriginTransforms(), GetPolyShape(), GetRadius(), GetStart(), IsAnnotationProxy(), m_shape, m_stroke, EDA_UNIT_UTILS::UI::MessageTextFromValue(), UNITS_PROVIDER::MessageTextFromValue(), POLY, RADIANS_T, RECT, and SEGMENT.

Referenced by LIB_SHAPE::GetMsgPanelInfo(), SCH_SHAPE::GetMsgPanelInfo(), and PCB_SHAPE::GetMsgPanelInfo().

◆ ShowShape()

wxString EDA_SHAPE::ShowShape ( ) const

Definition at line 57 of file eda_shape.cpp.

58{
59 if( IsAnnotationProxy() )
60 return _( "Number Box" );
61
62 switch( m_shape )
63 {
64 case SHAPE_T::SEGMENT: return _( "Line" );
65 case SHAPE_T::RECT: return _( "Rect" );
66 case SHAPE_T::ARC: return _( "Arc" );
67 case SHAPE_T::CIRCLE: return _( "Circle" );
68 case SHAPE_T::BEZIER: return _( "Bezier Curve" );
69 case SHAPE_T::POLY: return _( "Polygon" );
70 default: return wxT( "??" );
71 }
72}

References _, ARC, BEZIER, CIRCLE, IsAnnotationProxy(), m_shape, POLY, RECT, and SEGMENT.

Referenced by DIALOG_SHAPE_PROPERTIES::DIALOG_SHAPE_PROPERTIES(), FP_SHAPE::GetSelectMenuText(), PCB_SHAPE::GetSelectMenuText(), and LIB_SHAPE::GetTypeName().

◆ SwapShape()

void EDA_SHAPE::SwapShape ( EDA_SHAPE aImage)

Definition at line 1428 of file eda_shape.cpp.

1429{
1430 EDA_SHAPE* image = dynamic_cast<EDA_SHAPE*>( aImage );
1431 assert( image );
1432
1433 #define SWAPITEM( x ) std::swap( x, image->x )
1434 SWAPITEM( m_stroke );
1435 SWAPITEM( m_start );
1436 SWAPITEM( m_end );
1438 SWAPITEM( m_shape );
1442 SWAPITEM( m_poly );
1443 SWAPITEM( m_fill );
1447 #undef SWAPITEM
1448}
#define SWAPITEM(x)

References image, m_arcCenter, m_bezierC1, m_bezierC2, m_bezierPoints, m_editState, m_end, m_endsSwapped, m_fill, m_fillColor, m_poly, m_shape, m_start, m_stroke, and SWAPITEM.

Referenced by PCB_SHAPE::SwapData(), and SCH_SHAPE::SwapData().

◆ TransformShapeWithClearanceToPolygon()

void EDA_SHAPE::TransformShapeWithClearanceToPolygon ( SHAPE_POLY_SET aCornerBuffer,
int  aClearanceValue,
int  aError,
ERROR_LOC  aErrorLoc,
bool  ignoreLineWidth 
) const

Convert the shape to a closed polygon.

Used in filling zones calculations. Circles and arcs are approximated by segments.

Parameters
aCornerBufferis a buffer to store the polygon.
aClearanceValueis the clearance around the pad.
aErroris the maximum deviation from a true arc.
aErrorLocwhether any approximation error shoule be placed inside or outside
ignoreLineWidthis used for edge cut items where the line width is only for visualization

Definition at line 1492 of file eda_shape.cpp.

1496{
1497 int width = ignoreLineWidth ? 0 : GetWidth();
1498
1499 width += 2 * aClearanceValue;
1500
1501 switch( m_shape )
1502 {
1503 case SHAPE_T::CIRCLE:
1504 if( IsFilled() )
1505 {
1506 TransformCircleToPolygon( aCornerBuffer, getCenter(), GetRadius() + width / 2, aError,
1507 aErrorLoc );
1508 }
1509 else
1510 {
1511 TransformRingToPolygon( aCornerBuffer, getCenter(), GetRadius(), width, aError,
1512 aErrorLoc );
1513 }
1514
1515 break;
1516
1517 case SHAPE_T::RECT:
1518 {
1519 std::vector<VECTOR2I> pts = GetRectCorners();
1520
1521 if( IsFilled() || IsAnnotationProxy() )
1522 {
1523 aCornerBuffer.NewOutline();
1524
1525 for( const VECTOR2I& pt : pts )
1526 aCornerBuffer.Append( pt );
1527 }
1528
1529 if( width > 0 || !IsFilled() )
1530 {
1531 // Add in segments
1532 TransformOvalToPolygon( aCornerBuffer, pts[0], pts[1], width, aError, aErrorLoc );
1533 TransformOvalToPolygon( aCornerBuffer, pts[1], pts[2], width, aError, aErrorLoc );
1534 TransformOvalToPolygon( aCornerBuffer, pts[2], pts[3], width, aError, aErrorLoc );
1535 TransformOvalToPolygon( aCornerBuffer, pts[3], pts[0], width, aError, aErrorLoc );
1536 }
1537
1538 break;
1539 }
1540
1541 case SHAPE_T::ARC:
1542 TransformArcToPolygon( aCornerBuffer, GetStart(), GetArcMid(), GetEnd(), width, aError,
1543 aErrorLoc );
1544 break;
1545
1546 case SHAPE_T::SEGMENT:
1547 TransformOvalToPolygon( aCornerBuffer, GetStart(), GetEnd(), width, aError, aErrorLoc );
1548 break;
1549
1550 case SHAPE_T::POLY:
1551 {
1552 if( !IsPolyShapeValid() )
1553 break;
1554
1555 // The polygon is expected to be a simple polygon; not self intersecting, no hole.
1556 EDA_ANGLE orientation = getParentOrientation();
1557 VECTOR2I offset = getParentPosition();
1558
1559 // Build the polygon with the actual position and orientation:
1560 std::vector<VECTOR2I> poly;
1561 DupPolyPointsList( poly );
1562
1563 for( VECTOR2I& point : poly )
1564 {
1565 RotatePoint( point, orientation );
1566 point += offset;
1567 }
1568
1569 if( IsFilled() )
1570 {
1571 aCornerBuffer.NewOutline();
1572
1573 for( const VECTOR2I& point : poly )
1574 aCornerBuffer.Append( point.x, point.y );
1575 }
1576
1577 if( width > 0 || !IsFilled() )
1578 {
1579 VECTOR2I pt1( poly[poly.size() - 1] );
1580
1581 for( const VECTOR2I& pt2 : poly )
1582 {
1583 if( pt2 != pt1 )
1584 TransformOvalToPolygon( aCornerBuffer, pt1, pt2, width, aError, aErrorLoc );
1585
1586 pt1 = pt2;
1587 }
1588 }
1589
1590 break;
1591 }
1592
1593 case SHAPE_T::BEZIER:
1594 {
1595 std::vector<VECTOR2I> ctrlPts = { GetStart(), GetBezierC1(), GetBezierC2(), GetEnd() };
1596 BEZIER_POLY converter( ctrlPts );
1597 std::vector<VECTOR2I> poly;
1598 converter.GetPoly( poly, GetWidth() );
1599
1600 for( unsigned ii = 1; ii < poly.size(); ii++ )
1601 {
1602 TransformOvalToPolygon( aCornerBuffer, poly[ii - 1], poly[ii], width, aError,
1603 aErrorLoc );
1604 }
1605
1606 break;
1607 }
1608
1609 default:
1611 break;
1612 }
1613}
void DupPolyPointsList(std::vector< VECTOR2I > &aBuffer) const
Duplicate the list of corners in a std::vector<VECTOR2I>
Definition: eda_shape.cpp:1170
bool IsPolyShapeValid() const
Definition: eda_shape.cpp:1187
void TransformCircleToPolygon(SHAPE_LINE_CHAIN &aCornerBuffer, 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 &aCornerBuffer, const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, int aWidth, int aError, ERROR_LOC aErrorLoc)
Convert arc to multiple straight segments.
void TransformRingToPolygon(SHAPE_POLY_SET &aCornerBuffer, const VECTOR2I &aCentre, int aRadius, int aWidth, int aError, ERROR_LOC aErrorLoc)
Convert arcs to multiple straight segments.
void TransformOvalToPolygon(SHAPE_POLY_SET &aCornerBuffer, 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.

References SHAPE_POLY_SET::Append(), ARC, BEZIER, CIRCLE, DupPolyPointsList(), GetArcMid(), GetBezierC1(), GetBezierC2(), getCenter(), GetEnd(), getParentOrientation(), getParentPosition(), BEZIER_POLY::GetPoly(), GetRadius(), GetRectCorners(), GetStart(), GetWidth(), IsAnnotationProxy(), IsFilled(), IsPolyShapeValid(), m_shape, SHAPE_POLY_SET::NewOutline(), POLY, RECT, RotatePoint(), SEGMENT, SHAPE_T_asString(), TransformArcToPolygon(), TransformCircleToPolygon(), TransformOvalToPolygon(), TransformRingToPolygon(), and UNIMPLEMENTED_FOR.

Referenced by PCB_SHAPE::TransformShapeWithClearanceToPolygon().

Member Data Documentation

◆ m_annotationProxy

bool EDA_SHAPE::m_annotationProxy
protected

Definition at line 381 of file eda_shape.h.

Referenced by IsAnnotationProxy(), and SetIsAnnotationProxy().

◆ m_arcCenter

◆ m_arcMidData

ARC_MID EDA_SHAPE::m_arcMidData
protected

Definition at line 372 of file eda_shape.h.

Referenced by GetArcMid(), SetArcGeometry(), and SetCachedArcData().

◆ m_bezierC1

◆ m_bezierC2

◆ m_bezierPoints

◆ m_editState

int EDA_SHAPE::m_editState
protected

Definition at line 380 of file eda_shape.h.

Referenced by beginEdit(), calcEdit(), LIB_SHAPE::LIB_SHAPE(), setEditState(), and SwapShape().

◆ m_end

◆ m_endsSwapped

bool EDA_SHAPE::m_endsSwapped
protected

◆ m_fill

FILL_T EDA_SHAPE::m_fill
protected

◆ m_fillColor

COLOR4D EDA_SHAPE::m_fillColor
protected

Definition at line 366 of file eda_shape.h.

Referenced by GetFillColor(), SetFillColor(), and SwapShape().

◆ m_poly

◆ m_shape

◆ m_start

◆ m_stroke


The documentation for this class was generated from the following files: