KiCad PCB EDA Suite
EDA_SHAPE Class Referenceabstract

#include <eda_shape.h>

Inheritance diagram for EDA_SHAPE:
EDA_SHAPE_MOCK 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
 
bool IsClosed () 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
 
wxString GetFriendlyName () 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 TransformShapeToPolygon (SHAPE_POLY_SET &aBuffer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) 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:364
bool m_endsSwapped
Definition: eda_shape.h:363
int m_editState
Definition: eda_shape.h:381
bool m_annotationProxy
Definition: eda_shape.h:382
STROKE_PARAMS m_stroke
Definition: eda_shape.h:365
FILL_T m_fill
Definition: eda_shape.h:366
COLOR4D m_fillColor
Definition: eda_shape.h:367

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 1265 of file eda_shape.cpp.

1266{
1267 switch( GetShape() )
1268 {
1269 case SHAPE_T::SEGMENT:
1270 case SHAPE_T::CIRCLE:
1271 case SHAPE_T::RECT:
1272 SetStart( aPosition );
1273 SetEnd( aPosition );
1274 break;
1275
1276 case SHAPE_T::ARC:
1277 SetArcGeometry( aPosition, aPosition, aPosition );
1278 m_editState = 1;
1279 break;
1280
1281 case SHAPE_T::POLY:
1283 m_poly.Outline( 0 ).SetClosed( false );
1284
1285 // Start and end of the first segment (co-located for now)
1286 m_poly.Outline( 0 ).Append( aPosition );
1287 m_poly.Outline( 0 ).Append( aPosition, true );
1288 break;
1289
1290 default:
1292 }
1293}
SHAPE_T GetShape() const
Definition: eda_shape.h:113
void SetStart(const VECTOR2I &aStart)
Definition: eda_shape.h:124
void SetEnd(const VECTOR2I &aEnd)
Definition: eda_shape.h:149
void SetArcGeometry(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Set the three controlling points for an arc.
Definition: eda_shape.cpp:555
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:75
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:379
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 431 of file eda_shape.cpp.

432{
433 std::vector<VECTOR2I> bezierPoints;
434
435 // Rebuild the m_BezierPoints vertex list that approximate the Bezier curve
436 std::vector<VECTOR2I> ctrlPoints = { m_start, m_bezierC1, m_bezierC2, m_end };
437 BEZIER_POLY converter( ctrlPoints );
438 converter.GetPoly( bezierPoints, aMinSegLen );
439
440 return bezierPoints;
441}
Bezier curves to polygon converter.
Definition: bezier_curves.h:38
VECTOR2I m_start
Definition: eda_shape.h:369
VECTOR2I m_end
Definition: eda_shape.h:370
VECTOR2I m_bezierC1
Definition: eda_shape.h:375
VECTOR2I m_bezierC2
Definition: eda_shape.h:376

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 502 of file eda_shape.cpp.

503{
504 VECTOR2D startRadial( GetStart() - getCenter() );
505 VECTOR2D endRadial( GetEnd() - getCenter() );
506
507 aStartAngle = EDA_ANGLE( startRadial );
508 aEndAngle = EDA_ANGLE( endRadial );
509
510 if( aEndAngle == aStartAngle )
511 aEndAngle = aStartAngle + ANGLE_360; // ring, not null
512
513 if( aStartAngle > aEndAngle )
514 {
515 if( aEndAngle < ANGLE_0 )
516 aEndAngle.Normalize();
517 else
518 aStartAngle = aStartAngle.Normalize() - ANGLE_360;
519 }
520}
EDA_ANGLE Normalize()
Definition: eda_angle.h:249
VECTOR2I getCenter() const
Definition: eda_shape.cpp:444
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:145
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:120
static constexpr EDA_ANGLE & ANGLE_360
Definition: eda_angle.h:429
static constexpr EDA_ANGLE & ANGLE_0
Definition: eda_angle.h:423

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 1323 of file eda_shape.cpp.

1324{
1325#define sq( x ) pow( x, 2 )
1326
1327 switch( GetShape() )
1328 {
1329 case SHAPE_T::SEGMENT:
1330 case SHAPE_T::CIRCLE:
1331 case SHAPE_T::RECT:
1332 SetEnd( aPosition );
1333 break;
1334
1335 case SHAPE_T::ARC:
1336 {
1337 int radius = GetRadius();
1338
1339 // Edit state 0: drawing: place start
1340 // Edit state 1: drawing: place end (center calculated for 90-degree subtended angle)
1341 // Edit state 2: point edit: move start (center calculated for invariant subtended angle)
1342 // Edit state 3: point edit: move end (center calculated for invariant subtended angle)
1343 // Edit state 4: point edit: move center
1344 // Edit state 5: point edit: move arc-mid-point
1345
1346 switch( m_editState )
1347 {
1348 case 0:
1349 SetArcGeometry( aPosition, aPosition, aPosition );
1350 return;
1351
1352 case 1:
1353 m_end = aPosition;
1354 radius = KiROUND( sqrt( sq( GetLineLength( m_start, m_end ) ) / 2.0 ) );
1355 break;
1356
1357 case 2:
1358 case 3:
1359 {
1360 VECTOR2I v = m_start - m_end;
1361 double chordBefore = sq( v.x ) + sq( v.y );
1362
1363 if( m_editState == 2 )
1364 m_start = aPosition;
1365 else
1366 m_end = aPosition;
1367
1368 v = m_start - m_end;
1369 double chordAfter = sq( v.x ) + sq( v.y );
1370 double ratio = chordAfter / chordBefore;
1371
1372 if( ratio != 0 )
1373 {
1374 radius = std::max( int( sqrt( sq( radius ) * ratio ) ) + 1,
1375 int( sqrt( chordAfter ) / 2 ) + 1 );
1376 }
1377 }
1378 break;
1379
1380 case 4:
1381 {
1382 double radialA = GetLineLength( m_start, aPosition );
1383 double radialB = GetLineLength( m_end, aPosition );
1384 radius = int( ( radialA + radialB ) / 2.0 ) + 1;
1385 }
1386 break;
1387
1388 case 5:
1389 SetArcGeometry( GetStart(), aPosition, GetEnd() );
1390 return;
1391 }
1392
1393 // Calculate center based on start, end, and radius
1394 //
1395 // Let 'l' be the length of the chord and 'm' the middle point of the chord
1396 double l = GetLineLength( m_start, m_end );
1397 VECTOR2I m = ( m_start + m_end ) / 2;
1398
1399 // Calculate 'd', the vector from the chord midpoint to the center
1400 VECTOR2I d;
1401 d.x = KiROUND( sqrt( sq( radius ) - sq( l/2 ) ) * ( m_start.y - m_end.y ) / l );
1402 d.y = KiROUND( sqrt( sq( radius ) - sq( l/2 ) ) * ( m_end.x - m_start.x ) / l );
1403
1404 VECTOR2I c1 = m + d;
1405 VECTOR2I c2 = m - d;
1406
1407 // Solution gives us 2 centers; we need to pick one:
1408 switch( m_editState )
1409 {
1410 case 1:
1411 // Keep arc clockwise while drawing i.e. arc angle = 90 deg.
1412 // it can be 90 or 270 deg depending on the arc center choice (c1 or c2)
1413 m_arcCenter = c1; // first trial
1414
1415 if( GetArcAngle() > ANGLE_180 )
1416 m_arcCenter = c2;
1417
1418 break;
1419
1420 case 2:
1421 case 3:
1422 // Pick the one of c1, c2 to keep arc <= 180 deg
1423 m_arcCenter = c1; // first trial
1424
1425 if( GetArcAngle() > ANGLE_180 )
1426 m_arcCenter = c2;
1427
1428 break;
1429
1430 case 4:
1431 // Pick the one closer to the mouse position
1432 m_arcCenter = GetLineLength( c1, aPosition ) < GetLineLength( c2, aPosition ) ? c1 : c2;
1433
1434 // keep arc angle <= 180 deg
1435 if( GetArcAngle() > ANGLE_180 )
1436 std::swap( m_start, m_end );
1437
1438 break;
1439 }
1440 }
1441 break;
1442
1443 case SHAPE_T::POLY:
1444 m_poly.Outline( 0 ).SetPoint( m_poly.Outline( 0 ).GetPointCount() - 1, aPosition );
1445 break;
1446
1447 default:
1449 }
1450}
EDA_ANGLE GetArcAngle() const
Definition: eda_shape.cpp:585
int GetRadius() const
Definition: eda_shape.cpp:523
VECTOR2I m_arcCenter
Definition: eda_shape.h:372
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:427
#define sq(x)
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:85

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, SHAPE_POLY_SET::Outline(), POLY, RECT, 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 1508 of file eda_shape.cpp.

1509{
1510#define EPSILON 2 // Should be enough for rounding errors on calculated items
1511
1512#define TEST( a, b ) { if( a != b ) return a - b; }
1513#define TEST_E( a, b ) { if( abs( a - b ) > EPSILON ) return a - b; }
1514#define TEST_PT( a, b ) { TEST_E( a.x, b.x ); TEST_E( a.y, b.y ); }
1515
1516 TEST_PT( m_start, aOther->m_start );
1517 TEST_PT( m_end, aOther->m_end );
1518
1519 TEST( (int) m_shape, (int) aOther->m_shape );
1520
1521 if( m_shape == SHAPE_T::ARC )
1522 {
1523 TEST_PT( m_arcCenter, aOther->m_arcCenter );
1524 }
1525 else if( m_shape == SHAPE_T::BEZIER )
1526 {
1527 TEST_PT( m_bezierC1, aOther->m_bezierC1 );
1528 TEST_PT( m_bezierC2, aOther->m_bezierC2 );
1529 }
1530 else if( m_shape == SHAPE_T::POLY )
1531 {
1533 }
1534
1535 for( size_t ii = 0; ii < m_bezierPoints.size(); ++ii )
1536 TEST_PT( m_bezierPoints[ii], aOther->m_bezierPoints[ii] );
1537
1538 for( int ii = 0; ii < m_poly.TotalVertices(); ++ii )
1539 TEST_PT( m_poly.CVertex( ii ), aOther->m_poly.CVertex( ii ) );
1540
1541 TEST_E( m_stroke.GetWidth(), aOther->m_stroke.GetWidth() );
1542 TEST( (int) m_stroke.GetPlotStyle(), (int) aOther->m_stroke.GetPlotStyle() );
1543 TEST( (int) m_fill, (int) aOther->m_fill );
1544
1545 return 0;
1546}
std::vector< VECTOR2I > m_bezierPoints
Definition: eda_shape.h:378
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 1071 of file eda_shape.cpp.

1072{
1073 // Start, end, and each inflection point the arc crosses will enclose the entire arc.
1074 // Only include the center when filled; it's not necessarily inside the BB of an unfilled
1075 // arc with a small included angle.
1076 aBBox.SetOrigin( m_start );
1077 aBBox.Merge( m_end );
1078
1079 if( IsFilled() )
1080 aBBox.Merge( m_arcCenter );
1081
1082 int radius = GetRadius();
1083 EDA_ANGLE t1, t2;
1084
1085 CalcArcAngles( t1, t2 );
1086
1087 t1.Normalize();
1088 t2.Normalize();
1089
1090 if( t2 > t1 )
1091 {
1092 if( t1 < ANGLE_0 && t2 > ANGLE_0 )
1093 aBBox.Merge( VECTOR2I( m_arcCenter.x + radius, m_arcCenter.y ) ); // right
1094
1095 if( t1 < ANGLE_90 && t2 > ANGLE_90 )
1096 aBBox.Merge( VECTOR2I( m_arcCenter.x, m_arcCenter.y + radius ) ); // down
1097
1098 if( t1 < ANGLE_180 && t2 > ANGLE_180 )
1099 aBBox.Merge( VECTOR2I( m_arcCenter.x - radius, m_arcCenter.y ) ); // left
1100
1101 if( t1 < ANGLE_270 && t2 > ANGLE_270 )
1102 aBBox.Merge( VECTOR2I( m_arcCenter.x, m_arcCenter.y - radius ) ); // up
1103 }
1104 else
1105 {
1106 if( t1 < ANGLE_0 || t2 > ANGLE_0 )
1107 aBBox.Merge( VECTOR2I( m_arcCenter.x + radius, m_arcCenter.y ) ); // right
1108
1109 if( t1 < ANGLE_90 || t2 > ANGLE_90 )
1110 aBBox.Merge( VECTOR2I( m_arcCenter.x, m_arcCenter.y + radius ) ); // down
1111
1112 if( t1 < ANGLE_180 || t2 > ANGLE_180 )
1113 aBBox.Merge( VECTOR2I( m_arcCenter.x - radius, m_arcCenter.y ) ); // left
1114
1115 if( t1 < ANGLE_270 || t2 > ANGLE_270 )
1116 aBBox.Merge( VECTOR2I( m_arcCenter.x, m_arcCenter.y - radius ) ); // up
1117 }
1118}
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:502
static constexpr EDA_ANGLE & ANGLE_90
Definition: eda_angle.h:425
static constexpr EDA_ANGLE & ANGLE_270
Definition: eda_angle.h:428
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 1296 of file eda_shape.cpp.

1297{
1298 switch( GetShape() )
1299 {
1300 case SHAPE_T::ARC:
1301 case SHAPE_T::SEGMENT:
1302 case SHAPE_T::CIRCLE:
1303 case SHAPE_T::RECT:
1304 return false;
1305
1306 case SHAPE_T::POLY:
1307 {
1308 SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
1309
1310 // do not add zero-length segments
1311 if( poly.CPoint( poly.GetPointCount() - 2 ) != poly.CLastPoint() )
1312 poly.Append( aPosition, true );
1313 }
1314 return true;
1315
1316 default:
1318 return false;
1319 }
1320}
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 1225 of file eda_shape.cpp.

1226{
1227 for( int ii = 0; ii < m_poly.OutlineCount(); ++ii )
1228 {
1229 int pointCount = m_poly.COutline( ii ).PointCount();
1230
1231 if( pointCount )
1232 {
1233 aBuffer.reserve( pointCount );
1234
1235 for ( auto iter = m_poly.CIterate(); iter; iter++ )
1236 aBuffer.emplace_back( iter->x, iter->y );
1237 }
1238 }
1239}
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 BRDITEMS_PLOTTER::PlotFootprintShape(), TransformShapeToPolygon(), 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 1453 of file eda_shape.cpp.

1454{
1455 switch( GetShape() )
1456 {
1457 case SHAPE_T::ARC:
1458 case SHAPE_T::SEGMENT:
1459 case SHAPE_T::CIRCLE:
1460 case SHAPE_T::RECT:
1461 break;
1462
1463 case SHAPE_T::POLY:
1464 {
1465 SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
1466
1467 // do not include last point twice
1468 if( poly.GetPointCount() > 2 )
1469 {
1470 if( poly.CPoint( poly.GetPointCount() - 2 ) == poly.CLastPoint() )
1471 {
1472 poly.SetClosed( aClosed );
1473 poly.Remove( poly.GetPointCount() - 1 );
1474 }
1475 }
1476 }
1477 break;
1478
1479 default:
1481 }
1482}
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 195 of file eda_shape.h.

195{ return m_endsSwapped; }

References m_endsSwapped.

Referenced by BOOST_AUTO_TEST_CASE(), and CADSTAR_PCB_ARCHIVE_LOADER::makeTracksFromShapes().

◆ flip()

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

Definition at line 320 of file eda_shape.cpp.

321{
322 switch ( m_shape )
323 {
324 case SHAPE_T::SEGMENT:
325 case SHAPE_T::RECT:
326 if( aFlipLeftRight )
327 {
328 m_start.x = aCentre.x - ( m_start.x - aCentre.x );
329 m_end.x = aCentre.x - ( m_end.x - aCentre.x );
330 }
331 else
332 {
333 m_start.y = aCentre.y - ( m_start.y - aCentre.y );
334 m_end.y = aCentre.y - ( m_end.y - aCentre.y );
335 }
336
337 std::swap( m_start, m_end );
338 break;
339
340 case SHAPE_T::CIRCLE:
341 if( aFlipLeftRight )
342 {
343 m_start.x = aCentre.x - ( m_start.x - aCentre.x );
344 m_end.x = aCentre.x - ( m_end.x - aCentre.x );
345 }
346 else
347 {
348 m_start.y = aCentre.y - ( m_start.y - aCentre.y );
349 m_end.y = aCentre.y - ( m_end.y - aCentre.y );
350 }
351 break;
352
353 case SHAPE_T::ARC:
354 if( aFlipLeftRight )
355 {
356 m_start.x = aCentre.x - ( m_start.x - aCentre.x );
357 m_end.x = aCentre.x - ( m_end.x - aCentre.x );
358 m_arcCenter.x = aCentre.x - ( m_arcCenter.x - aCentre.x );
359 }
360 else
361 {
362 m_start.y = aCentre.y - ( m_start.y - aCentre.y );
363 m_end.y = aCentre.y - ( m_end.y - aCentre.y );
364 m_arcCenter.y = aCentre.y - ( m_arcCenter.y - aCentre.y );
365 }
366
367 std::swap( m_start, m_end );
368 break;
369
370 case SHAPE_T::POLY:
371 m_poly.Mirror( aFlipLeftRight, !aFlipLeftRight, aCentre );
372 break;
373
374 case SHAPE_T::BEZIER:
375 if( aFlipLeftRight )
376 {
377 m_start.x = aCentre.x - ( m_start.x - aCentre.x );
378 m_end.x = aCentre.x - ( m_end.x - aCentre.x );
379 m_bezierC1.x = aCentre.x - ( m_bezierC1.x - aCentre.x );
380 m_bezierC2.x = aCentre.x - ( m_bezierC2.x - aCentre.x );
381 }
382 else
383 {
384 m_start.y = aCentre.y - ( m_start.y - aCentre.y );
385 m_end.y = aCentre.y - ( m_end.y - aCentre.y );
386 m_bezierC1.y = aCentre.y - ( m_bezierC1.y - aCentre.y );
387 m_bezierC2.y = aCentre.y - ( m_bezierC2.y - aCentre.y );
388 }
389
390 // Rebuild the poly points shape
391 {
392 std::vector<VECTOR2I> ctrlPoints = { m_start, m_bezierC1, m_bezierC2, m_end };
393 BEZIER_POLY converter( ctrlPoints );
394 converter.GetPoly( m_bezierPoints, m_stroke.GetWidth() );
395 }
396 break;
397
398 default:
400 break;
401 }
402}
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 488 of file eda_shape.cpp.

489{
490 // If none of the input data have changed since we loaded the arc,
491 // keep the original mid point data to minimize churn
494 return m_arcMidData.mid;
495
496 VECTOR2I mid = m_start;
497 RotatePoint( mid, m_arcCenter, -GetArcAngle() / 2.0 );
498 return mid;
499}
ARC_MID m_arcMidData
Definition: eda_shape.h:373
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
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Definition: trigo.cpp:183

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_POINT_EDITOR::editArcMidKeepEndpoints(), PCB_PLUGIN::format(), formatArc(), PCB_SHAPE::GetFocusPosition(), PCB_POINT_EDITOR::makePoints(), CONVERT_TOOL::makePolysFromChainedSegs(), SetArcGeometry(), TransformShapeToPolygon(), 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 168 of file eda_shape.h.

168{ 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 684 of file eda_shape.cpp.

685{
686 BOX2I bbox;
687
688 switch( m_shape )
689 {
690 case SHAPE_T::RECT:
691 for( VECTOR2I& pt : GetRectCorners() )
692 bbox.Merge( pt );
693
694 break;
695
696 case SHAPE_T::SEGMENT:
697 bbox.SetOrigin( GetStart() );
698 bbox.SetEnd( GetEnd() );
699 break;
700
701 case SHAPE_T::CIRCLE:
702 bbox.SetOrigin( GetStart() );
703 bbox.Inflate( GetRadius() );
704 break;
705
706 case SHAPE_T::ARC:
707 computeArcBBox( bbox );
708 break;
709
710 case SHAPE_T::POLY:
711 if( m_poly.IsEmpty() )
712 break;
713
714 for( auto iter = m_poly.CIterate(); iter; iter++ )
715 {
716 VECTOR2I pt( iter->x, iter->y );
717
719 pt += getParentPosition();
720
721 bbox.Merge( pt );
722 }
723
724 break;
725
726 case SHAPE_T::BEZIER:
727 bbox.SetOrigin( GetStart() );
728 bbox.Merge( GetBezierC1() );
729 bbox.Merge( GetBezierC2() );
730 bbox.Merge( GetEnd() );
731 break;
732
733 default:
735 break;
736 }
737
738 bbox.Inflate( std::max( 0, GetWidth() ) / 2 );
739 bbox.Normalize();
740
741 return bbox;
742}
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:179
virtual EDA_ANGLE getParentOrientation() const =0
std::vector< VECTOR2I > GetRectCorners() const
Definition: eda_shape.cpp:1035
int GetWidth() const
Definition: eda_shape.h:109
void computeArcBBox(BOX2I &aBBox) const
Definition: eda_shape.cpp:1071
const VECTOR2I & GetBezierC1() const
Definition: eda_shape.h:176
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

◆ GetEffectiveWidth()

virtual int EDA_SHAPE::GetEffectiveWidth ( ) const
inlinevirtual

Reimplemented in SCH_SHAPE.

Definition at line 110 of file eda_shape.h.

110{ 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 145 of file eda_shape.h.

145{ return m_end; }

References m_end.

Referenced by PCB_POINT_EDITOR::addCorner(), BOARD_ADAPTER::addShape(), GRAPHICS_CLEANER::areEquivalent(), BOOST_AUTO_TEST_CASE(), CalcArcAngles(), calcEdit(), KI_TEST::CheckFpShape(), ConvertOutlineToPolygon(), CreateBoardSection(), MICROWAVE_TOOL::createMicrowaveInductor(), KIGFX::SCH_PAINTER::draw(), KIGFX::PCB_PAINTER::draw(), DRAWING_TOOL::DrawLine(), PCB_POINT_EDITOR::editArcEndpointKeepCenter(), 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_EDITOR_CONTROL::Paste(), SCH_SHAPE::Plot(), BRDITEMS_PLOTTER::PlotFootprintShape(), BRDITEMS_PLOTTER::PlotPcbShape(), SCH_SHAPE::Print(), SCH_TEXTBOX::Print(), SCH_SHAPE::PrintBackground(), SCH_LEGACY_PLUGIN_CACHE::saveArc(), SCH_LEGACY_PLUGIN_CACHE::saveBezier(), 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(), TransformShapeToPolygon(), EE_POINT_EDITOR::updatePoints(), and PCB_POINT_EDITOR::updatePoints().

◆ GetEndX()

◆ GetEndY()

◆ GetFillColor()

◆ GetFillMode()

◆ GetFriendlyName()

wxString EDA_SHAPE::GetFriendlyName ( ) const

Definition at line 611 of file eda_shape.cpp.

612{
613 switch( m_shape )
614 {
615 case SHAPE_T::CIRCLE: return _( "Circle" );
616 case SHAPE_T::ARC: return _( "Arc" );
617 case SHAPE_T::BEZIER: return _( "Curve" );
618 case SHAPE_T::POLY: return _( "Polygon" );
619 case SHAPE_T::RECT: return IsAnnotationProxy() ? _( "Pad Number Box" ) : _( "Rectangle" );
620 case SHAPE_T::SEGMENT: return _( "Segment" );
621 default: return _( "Unrecognized" );
622 }
623}
bool IsAnnotationProxy() const
Definition: eda_shape.h:87
#define _(s)

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

Referenced by PCB_SHAPE::GetFriendlyName(), and ShapeGetMsgPanelInfo().

◆ 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:326
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 1254 of file eda_shape.cpp.

1255{
1256 // return the number of corners of the polygonal shape
1257 // this shape is expected to be only one polygon without hole
1258 if( GetPolyShape().OutlineCount() )
1259 return GetPolyShape().VertexCount( 0 );
1260
1261 return 0;
1262}
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:247
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 248 of file eda_shape.h.

248{ 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 1035 of file eda_shape.cpp.

1036{
1037 std::vector<VECTOR2I> pts;
1038 VECTOR2I topLeft = GetStart();
1039 VECTOR2I botRight = GetEnd();
1040
1041 // Un-rotate rect topLeft and botRight
1042 if( !getParentOrientation().IsCardinal() )
1043 {
1044 topLeft -= getParentPosition();
1045 RotatePoint( topLeft, -getParentOrientation() );
1046
1047 botRight -= getParentPosition();
1048 RotatePoint( botRight, -getParentOrientation() );
1049 }
1050
1051 // Set up the un-rotated 4 corners
1052 pts.emplace_back( topLeft );
1053 pts.emplace_back( botRight.x, topLeft.y );
1054 pts.emplace_back( botRight );
1055 pts.emplace_back( topLeft.x, botRight.y );
1056
1057 // Now re-rotate the 4 corners to get a diamond
1058 if( !getParentOrientation().IsCardinal() )
1059 {
1060 for( VECTOR2I& pt : pts )
1061 {
1063 pt += getParentPosition();
1064 }
1065 }
1066
1067 return pts;
1068}

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_EDITOR_CONTROL::Paste(), SCH_SHAPE::Plot(), BRDITEMS_PLOTTER::PlotFootprintShape(), BRDITEMS_PLOTTER::PlotPcbShape(), TransformShapeToPolygon(), FP_TEXTBOX::TransformShapeToPolygon(), and PCB_TEXTBOX::TransformShapeToPolygon().

◆ GetShape()

SHAPE_T EDA_SHAPE::GetShape ( ) const
inline

Definition at line 113 of file eda_shape.h.

113{ 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(), 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::GetItemDescription(), SCH_SHAPE::GetItemDescription(), LIB_SHAPE::GetMenuImage(), SCH_SHAPE::GetMenuImage(), CADSTAR_SCH_ARCHIVE_LOADER::getScaledLibPart(), 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_EDITOR_CONTROL::Paste(), SCH_SHAPE::Plot(), LIB_SHAPE::Plot(), BRDITEMS_PLOTTER::PlotFootprintShape(), BRDITEMS_PLOTTER::PlotPcbShape(), SCH_SHAPE::Print(), LIB_SHAPE::print(), SCH_SHAPE::PrintBackground(), 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 120 of file eda_shape.h.

120{ return m_start; }

References m_start.

Referenced by PCB_POINT_EDITOR::addCorner(), BOARD_ADAPTER::addShape(), GRAPHICS_CLEANER::areEquivalent(), BOOST_AUTO_TEST_CASE(), CalcArcAngles(), calcEdit(), KI_TEST::CheckFpShape(), 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_EDITOR_CONTROL::Paste(), SCH_SHAPE::Plot(), BRDITEMS_PLOTTER::PlotFootprintShape(), BRDITEMS_PLOTTER::PlotPcbShape(), BRDITEMS_PLOTTER::PlotPcbTarget(), SCH_SHAPE::Print(), SCH_TEXTBOX::Print(), SCH_SHAPE::PrintBackground(), SCH_LEGACY_PLUGIN_CACHE::saveArc(), SCH_LEGACY_PLUGIN_CACHE::saveBezier(), 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(), TransformShapeToPolygon(), 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 167 of file eda_shape.h.

167{ 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 109 of file eda_shape.h.

109{ return m_stroke.GetWidth(); }

References STROKE_PARAMS::GetWidth(), and m_stroke.

Referenced by BOARD_ADAPTER::addShape(), GRAPHICS_CLEANER::areEquivalent(), 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(), 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(), TransformShapeToPolygon(), FP_TEXTBOX::TransformShapeToPolygon(), PCB_TEXTBOX::TransformShapeToPolygon(), 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 859 of file eda_shape.cpp.

860{
861 BOX2I arect = aRect;
862 arect.Normalize();
863 arect.Inflate( aAccuracy );
864
865 BOX2I bbox = getBoundingBox();
866
867 switch( m_shape )
868 {
869 case SHAPE_T::CIRCLE:
870 // Test if area intersects or contains the circle:
871 if( aContained )
872 {
873 return arect.Contains( bbox );
874 }
875 else
876 {
877 // If the rectangle does not intersect the bounding box, this is a much quicker test
878 if( !arect.Intersects( bbox ) )
879 return false;
880 else
881 return arect.IntersectsCircleEdge( getCenter(), GetRadius(), GetWidth() );
882 }
883
884 case SHAPE_T::ARC:
885 // Test for full containment of this arc in the rect
886 if( aContained )
887 {
888 return arect.Contains( bbox );
889 }
890 // Test if the rect crosses the arc
891 else
892 {
893 if( !arect.Intersects( bbox ) )
894 return false;
895
896 if( IsFilled() )
897 {
898 return ( arect.Intersects( getCenter(), GetStart() )
899 || arect.Intersects( getCenter(), GetEnd() )
900 || arect.IntersectsCircleEdge( getCenter(), GetRadius(), GetWidth() ) );
901 }
902 else
903 {
904 return arect.IntersectsCircleEdge( getCenter(), GetRadius(), GetWidth() );
905 }
906 }
907
908 case SHAPE_T::RECT:
909 if( aContained )
910 {
911 return arect.Contains( bbox );
912 }
913 else
914 {
915 std::vector<VECTOR2I> pts = GetRectCorners();
916
917 // Account for the width of the lines
918 arect.Inflate( GetWidth() / 2 );
919 return ( arect.Intersects( pts[0], pts[1] )
920 || arect.Intersects( pts[1], pts[2] )
921 || arect.Intersects( pts[2], pts[3] )
922 || arect.Intersects( pts[3], pts[0] ) );
923 }
924
925 case SHAPE_T::SEGMENT:
926 if( aContained )
927 {
928 return arect.Contains( GetStart() ) && aRect.Contains( GetEnd() );
929 }
930 else
931 {
932 // Account for the width of the line
933 arect.Inflate( GetWidth() / 2 );
934 return arect.Intersects( GetStart(), GetEnd() );
935 }
936
937 case SHAPE_T::POLY:
938 if( aContained )
939 {
940 return arect.Contains( bbox );
941 }
942 else
943 {
944 // Fast test: if aRect is outside the polygon bounding box,
945 // rectangles cannot intersect
946 if( !arect.Intersects( bbox ) )
947 return false;
948
949 // Account for the width of the line
950 arect.Inflate( GetWidth() / 2 );
951
952 // Polygons in footprints use coordinates relative to the footprint.
953 // Therefore, instead of using m_poly, we make a copy which is translated
954 // to the actual location in the board.
955 VECTOR2I offset = getParentPosition();
956
957 for( int ii = 0; ii < m_poly.OutlineCount(); ++ii )
958 {
959 SHAPE_LINE_CHAIN poly = m_poly.Outline( ii );
961 poly.Move( offset );
962
963 int count = poly.GetPointCount();
964
965 for( int jj = 0; jj < count; jj++ )
966 {
967 VECTOR2I vertex = poly.GetPoint( jj );
968
969 // Test if the point is within aRect
970 if( arect.Contains( vertex ) )
971 return true;
972
973 if( jj + 1 < count )
974 {
975 VECTOR2I vertexNext = poly.GetPoint( jj + 1 );
976
977 // Test if this edge intersects aRect
978 if( arect.Intersects( vertex, vertexNext ) )
979 return true;
980 }
981 else if( poly.IsClosed() )
982 {
983 VECTOR2I vertexNext = poly.GetPoint( 0 );
984
985 // Test if this edge intersects aRect
986 if( arect.Intersects( vertex, vertexNext ) )
987 return true;
988 }
989 }
990 }
991
992 return false;
993 }
994
995 case SHAPE_T::BEZIER:
996 if( aContained )
997 {
998 return arect.Contains( bbox );
999 }
1000 else
1001 {
1002 // Fast test: if aRect is outside the polygon bounding box,
1003 // rectangles cannot intersect
1004 if( !arect.Intersects( bbox ) )
1005 return false;
1006
1007 // Account for the width of the line
1008 arect.Inflate( GetWidth() / 2 );
1009 unsigned count = m_bezierPoints.size();
1010
1011 for( unsigned ii = 1; ii < count; ii++ )
1012 {
1013 VECTOR2I vertex = m_bezierPoints[ii - 1];
1014 VECTOR2I vertexNext = m_bezierPoints[ii];
1015
1016 // Test if the point is within aRect
1017 if( arect.Contains( vertex ) )
1018 return true;
1019
1020 // Test if this edge intersects aRect
1021 if( arect.Intersects( vertex, vertexNext ) )
1022 return true;
1023 }
1024
1025 return false;
1026 }
1027
1028 default:
1030 return false;
1031 }
1032}
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(), SHAPE_POLY_SET::OutlineCount(), 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 745 of file eda_shape.cpp.

746{
747 int maxdist = aAccuracy;
748
749 if( GetWidth() > 0 )
750 maxdist += GetWidth() / 2;
751
752 switch( m_shape )
753 {
754 case SHAPE_T::CIRCLE:
755 {
756 int radius = GetRadius();
757
758 VECTOR2I::extended_type dist = KiROUND<double, VECTOR2I::extended_type>(
759 EuclideanNorm( aPosition - getCenter() ) );
760
761 if( IsFilled() )
762 return dist <= radius + maxdist; // Filled circle hit-test
763 else
764 return abs( radius - dist ) <= maxdist; // Ring hit-test
765 }
766
767 case SHAPE_T::ARC:
768 {
769 if( EuclideanNorm( aPosition - m_start ) <= maxdist )
770 return true;
771
772 if( EuclideanNorm( aPosition - m_end ) <= maxdist )
773 return true;
774
775 VECTOR2I relPos = aPosition - getCenter();
776 int radius = GetRadius();
777
779 KiROUND<double, VECTOR2I::extended_type>( EuclideanNorm( relPos ) );
780
781 if( IsFilled() )
782 {
783 // Check distance from arc center
784 if( dist > radius + maxdist )
785 return false;
786 }
787 else
788 {
789 // Check distance from arc circumference
790 if( abs( radius - dist ) > maxdist )
791 return false;
792 }
793
794 // Finally, check to see if it's within arc's swept angle.
795 EDA_ANGLE startAngle;
796 EDA_ANGLE endAngle;
797 CalcArcAngles( startAngle, endAngle );
798
799 EDA_ANGLE relPosAngle( relPos );
800
801 startAngle.Normalize();
802 endAngle.Normalize();
803 relPosAngle.Normalize();
804
805 if( endAngle > startAngle )
806 return relPosAngle >= startAngle && relPosAngle <= endAngle;
807 else
808 return relPosAngle >= startAngle || relPosAngle <= endAngle;
809 }
810
811 case SHAPE_T::BEZIER:
812 const_cast<EDA_SHAPE*>( this )->RebuildBezierToSegmentsPointsList( GetWidth() );
813
814 for( unsigned int i= 1; i < m_bezierPoints.size(); i++)
815 {
816 if( TestSegmentHit( aPosition, m_bezierPoints[ i - 1], m_bezierPoints[i], maxdist ) )
817 return true;
818 }
819
820 return false;
821
822 case SHAPE_T::SEGMENT:
823 return TestSegmentHit( aPosition, GetStart(), GetEnd(), maxdist );
824
825 case SHAPE_T::RECT:
826 if( IsAnnotationProxy() || IsFilled() ) // Filled rect hit-test
827 {
828 SHAPE_POLY_SET poly;
829 poly.NewOutline();
830
831 for( const VECTOR2I& pt : GetRectCorners() )
832 poly.Append( pt );
833
834 return poly.Collide( aPosition, maxdist );
835 }
836 else // Open rect hit-test
837 {
838 std::vector<VECTOR2I> pts = GetRectCorners();
839
840 return TestSegmentHit( aPosition, pts[0], pts[1], maxdist )
841 || TestSegmentHit( aPosition, pts[1], pts[2], maxdist )
842 || TestSegmentHit( aPosition, pts[2], pts[3], maxdist )
843 || TestSegmentHit( aPosition, pts[3], pts[0], maxdist );
844 }
845
846 case SHAPE_T::POLY:
847 if( IsFilled() )
848 return m_poly.Collide( aPosition, maxdist );
849 else
850 return m_poly.CollideEdge( aPosition, nullptr, maxdist );
851
852 default:
854 return false;
855 }
856}
void RebuildBezierToSegmentsPointsList(int aMinSegLen)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
Definition: eda_shape.cpp:405
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:412
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()

◆ IsClosed()

bool EDA_SHAPE::IsClosed ( ) const

Definition at line 141 of file eda_shape.cpp.

142{
143 switch( m_shape )
144 {
145 case SHAPE_T::CIRCLE:
146 case SHAPE_T::RECT:
147 return true;
148
149 case SHAPE_T::ARC:
150 case SHAPE_T::SEGMENT:
151 return false;
152
153 case SHAPE_T::POLY:
154 if( m_poly.IsEmpty() )
155 return false;
156 else
157 return m_poly.Outline( 0 ).IsClosed();
158
159 case SHAPE_T::BEZIER:
160 if( m_bezierPoints.size() < 3 )
161 return false;
162 else
163 return m_bezierPoints[0] == m_bezierPoints[ m_bezierPoints.size() - 1 ];
164
165 default:
167 return false;
168 }
169}

References ARC, BEZIER, CIRCLE, SHAPE_LINE_CHAIN::IsClosed(), SHAPE_POLY_SET::IsEmpty(), m_bezierPoints, m_poly, m_shape, SHAPE_POLY_SET::Outline(), POLY, RECT, SEGMENT, SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by CONVERT_TOOL::makePolysFromClosedGraphics(), and CONVERT_TOOL::makePolysFromOpenGraphics().

◆ IsFilled()

◆ IsPolyShapeValid()

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

Definition at line 1242 of file eda_shape.cpp.

1243{
1244 // return true if the polygonal shape is valid (has more than 2 points)
1245 if( GetPolyShape().OutlineCount() == 0 )
1246 return false;
1247
1248 const SHAPE_LINE_CHAIN& outline = static_cast<const SHAPE_POLY_SET&>( GetPolyShape() ).Outline( 0 );
1249
1250 return outline.PointCount() > 2;
1251}

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

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

◆ 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 1131 of file eda_shape.cpp.

1132{
1133 std::vector<SHAPE*> effectiveShapes;
1134 int width = GetEffectiveWidth();
1135
1136 switch( m_shape )
1137 {
1138 case SHAPE_T::ARC:
1139 effectiveShapes.emplace_back( new SHAPE_ARC( m_arcCenter, m_start, GetArcAngle(), width ) );
1140 break;
1141
1142 case SHAPE_T::SEGMENT:
1143 effectiveShapes.emplace_back( new SHAPE_SEGMENT( m_start, m_end, width ) );
1144 break;
1145
1146 case SHAPE_T::RECT:
1147 {
1148 std::vector<VECTOR2I> pts = GetRectCorners();
1149
1150 if( ( IsFilled() || IsAnnotationProxy() ) && !aEdgeOnly )
1151 effectiveShapes.emplace_back( new SHAPE_SIMPLE( pts ) );
1152
1153 if( width > 0 || !IsFilled() || aEdgeOnly )
1154 {
1155 effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[0], pts[1], width ) );
1156 effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[1], pts[2], width ) );
1157 effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[2], pts[3], width ) );
1158 effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[3], pts[0], width ) );
1159 }
1160 }
1161 break;
1162
1163 case SHAPE_T::CIRCLE:
1164 {
1165 if( IsFilled() && !aEdgeOnly )
1166 effectiveShapes.emplace_back( new SHAPE_CIRCLE( getCenter(), GetRadius() ) );
1167
1168 if( width > 0 || !IsFilled() || aEdgeOnly )
1169 effectiveShapes.emplace_back( new SHAPE_ARC( getCenter(), GetEnd(), ANGLE_360, width ) );
1170
1171 break;
1172 }
1173
1174 case SHAPE_T::BEZIER:
1175 {
1176 std::vector<VECTOR2I> bezierPoints = buildBezierToSegmentsPointsList( width );
1177 VECTOR2I start_pt = bezierPoints[0];
1178
1179 for( unsigned int jj = 1; jj < bezierPoints.size(); jj++ )
1180 {
1181 VECTOR2I end_pt = bezierPoints[jj];
1182 effectiveShapes.emplace_back( new SHAPE_SEGMENT( start_pt, end_pt, width ) );
1183 start_pt = end_pt;
1184 }
1185
1186 break;
1187 }
1188
1189 case SHAPE_T::POLY:
1190 {
1191 if( GetPolyShape().OutlineCount() == 0 ) // malformed/empty polygon
1192 break;
1193
1194 for( int ii = 0; ii < GetPolyShape().OutlineCount(); ++ii )
1195 {
1197
1198 if( aLineChainOnly )
1199 l.SetClosed( false );
1200
1202 l.Move( getParentPosition() );
1203
1204 if( IsFilled() && !aEdgeOnly )
1205 effectiveShapes.emplace_back( new SHAPE_SIMPLE( l ) );
1206
1207 if( width > 0 || !IsFilled() || aEdgeOnly )
1208 {
1209 for( int jj = 0; jj < l.SegmentCount(); jj++ )
1210 effectiveShapes.emplace_back( new SHAPE_SEGMENT( l.Segment( jj ), width ) );
1211 }
1212 }
1213 }
1214 break;
1215
1216 default:
1218 break;
1219 }
1220
1221 return effectiveShapes;
1222}
virtual int GetEffectiveWidth() const
Definition: eda_shape.h:110
const std::vector< VECTOR2I > buildBezierToSegmentsPointsList(int aMinSegLen) const
Definition: eda_shape.cpp:431
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(), SHAPE_POLY_SET::OutlineCount(), 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 289 of file eda_shape.h.

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

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 173 of file eda_shape.cpp.

174{
175 switch ( m_shape )
176 {
177 case SHAPE_T::ARC:
178 case SHAPE_T::SEGMENT:
179 case SHAPE_T::RECT:
180 case SHAPE_T::CIRCLE:
181 m_start += aMoveVector;
182 m_end += aMoveVector;
183 m_arcCenter += aMoveVector;
184 break;
185
186 case SHAPE_T::POLY:
187 m_poly.Move( VECTOR2I( aMoveVector ) );
188 break;
189
190 case SHAPE_T::BEZIER:
191 m_start += aMoveVector;
192 m_end += aMoveVector;
193 m_bezierC1 += aMoveVector;
194 m_bezierC2 += aMoveVector;
195
196 for( VECTOR2I& pt : m_bezierPoints )
197 pt += aMoveVector;
198
199 break;
200
201 default:
203 break;
204 }
205}
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 405 of file eda_shape.cpp.

406{
407 // Has meaning only for SHAPE_T::BEZIER
408 if( m_shape != SHAPE_T::BEZIER )
409 {
410 m_bezierPoints.clear();
411 return;
412 }
413
414 // Rebuild the m_BezierPoints vertex list that approximate the Bezier curve
416
417 // Ensure last point respects aMinSegLen parameter
418 if( m_bezierPoints.size() > 2 )
419 {
420 int idx = m_bezierPoints.size()-1;
421
422 if( VECTOR2I( m_bezierPoints[idx] - m_bezierPoints[idx]-1 ).EuclideanNorm() < aMinSegLen )
423 {
424 m_bezierPoints[idx]-1 = m_bezierPoints[idx];
425 m_bezierPoints.pop_back();
426 }
427 }
428}

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

Referenced by 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 263 of file eda_shape.cpp.

264{
265 switch( m_shape )
266 {
267 case SHAPE_T::SEGMENT:
268 case SHAPE_T::CIRCLE:
269 RotatePoint( m_start, aRotCentre, aAngle );
270 RotatePoint( m_end, aRotCentre, aAngle );
271 break;
272
273 case SHAPE_T::ARC:
274 RotatePoint( m_start, aRotCentre, aAngle );
275 RotatePoint( m_end, aRotCentre, aAngle );
276 RotatePoint( m_arcCenter, aRotCentre, aAngle );
277 break;
278
279 case SHAPE_T::RECT:
280 if( aAngle.IsCardinal() )
281 {
282 RotatePoint( m_start, aRotCentre, aAngle );
283 RotatePoint( m_end, aRotCentre, aAngle );
284 break;
285 }
286
287 // Convert non-cardinally-rotated rect to a diamond
295
297
298 case SHAPE_T::POLY:
299 m_poly.Rotate( aAngle, aRotCentre );
300 break;
301
302 case SHAPE_T::BEZIER:
303 RotatePoint( m_start, aRotCentre, aAngle );
304 RotatePoint( m_end, aRotCentre, aAngle );
305 RotatePoint( m_bezierC1, aRotCentre, aAngle );
306 RotatePoint( m_bezierC2, aRotCentre, aAngle );
307
308 for( VECTOR2I& pt : m_bezierPoints )
309 RotatePoint( pt, aRotCentre, aAngle);
310
311 break;
312
313 default:
315 break;
316 }
317}
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 208 of file eda_shape.cpp.

209{
210 auto scalePt = [&]( VECTOR2I& pt )
211 {
212 pt.x = KiROUND( pt.x * aScale );
213 pt.y = KiROUND( pt.y * aScale );
214 };
215
216 switch( m_shape )
217 {
218 case SHAPE_T::ARC:
219 case SHAPE_T::SEGMENT:
220 case SHAPE_T::RECT:
221 scalePt( m_start );
222 scalePt( m_end );
223 scalePt( m_arcCenter );
224 break;
225
226 case SHAPE_T::CIRCLE: // ring or circle
227 scalePt( m_start );
228 m_end.x = m_start.x + KiROUND( GetRadius() * aScale );
229 m_end.y = m_start.y;
230 break;
231
232 case SHAPE_T::POLY: // polygon
233 {
234 std::vector<VECTOR2I> pts;
235
236 for( int ii = 0; ii < m_poly.OutlineCount(); ++ ii )
237 {
238 for( const VECTOR2I& pt : m_poly.Outline( ii ).CPoints() )
239 {
240 pts.emplace_back( pt );
241 scalePt( pts.back() );
242 }
243 }
244
245 SetPolyPoints( pts );
246 }
247 break;
248
249 case SHAPE_T::BEZIER:
250 scalePt( m_start );
251 scalePt( m_end );
252 scalePt( m_bezierC1 );
253 scalePt( m_bezierC2 );
254 break;
255
256 default:
258 break;
259 }
260}
void SetPolyPoints(const std::vector< VECTOR2I > &aPoints)
Definition: eda_shape.cpp:1121
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(), SHAPE_POLY_SET::OutlineCount(), 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 
)

◆ 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 555 of file eda_shape.cpp.

556{
557 m_arcMidData = {};
558 m_start = aStart;
559 m_end = aEnd;
560 m_arcCenter = CalcArcCenter( aStart, aMid, aEnd );
561 VECTOR2I new_mid = GetArcMid();
562
563 m_endsSwapped = false;
564
565 // Watch the ordering here. GetArcMid above needs to be called prior to initializing the
566 // m_arcMidData structure in order to ensure we get the calculated variant, not the cached
567 SetCachedArcData( aStart, aMid, aEnd, m_arcCenter );
568
569 /*
570 * If the input winding doesn't match our internal winding, the calculated midpoint will end
571 * up on the other side of the arc. In this case, we need to flip the start/end points and
572 * flag this change for the system.
573 */
574 VECTOR2D dist( new_mid - aMid );
575 VECTOR2D dist2( new_mid - m_arcCenter );
576
577 if( dist.SquaredEuclideanNorm() > dist2.SquaredEuclideanNorm() )
578 {
579 std::swap( m_start, m_end );
580 m_endsSwapped = true;
581 }
582}
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:546
VECTOR2I GetArcMid() const
Definition: eda_shape.cpp:488
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(), and FABMASTER::loadOutline().

◆ SetBezierC1()

◆ SetBezierC2()

◆ SetBottom()

virtual void EDA_SHAPE::SetBottom ( int  val)
inlinevirtual

Reimplemented in FP_TEXTBOX, and PCB_TEXTBOX.

Definition at line 173 of file eda_shape.h.

173{ SetEndY( val ); }
void SetEndY(int y)
Definition: eda_shape.h:155

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 546 of file eda_shape.cpp.

547{
548 m_arcMidData.start = aStart;
549 m_arcMidData.end = aEnd;
550 m_arcMidData.center = aCenter;
551 m_arcMidData.mid = aMid;
552}

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 349 of file eda_shape.h.

349{ 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 149 of file eda_shape.h.

150 {
151 m_end = aEnd;
152 m_endsSwapped = false;
153 }

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::TransformShapeToPolygon(), 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(), CADSTAR_PCB_ARCHIVE_LOADER::drawCadstarShape(), DRAWING_TOOL::DrawCircle(), DRAWING_TOOL::DrawRectangle(), DRAWING_TOOL::drawShape(), EDA_SHAPE_DESC::EDA_SHAPE_DESC(), PAD_TOOL::explodePad(), CADSTAR_PCB_ARCHIVE_LOADER::getKiCadPad(), ALTIUM_PCB::HelperParsePad6NonCopper(), FABMASTER::loadGraphics(), EAGLE_PLUGIN::loadPlain(), FABMASTER::loadPolygon(), CONVERT_TOOL::makePolysFromClosedGraphics(), 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 171 of file eda_shape.h.

171{ SetStartX( val ); }
void SetStartX(int x)
Definition: eda_shape.h:136

References SetStartX().

Referenced by PCB_POINT_EDITOR::updateItem().

◆ SetPolyPoints()

◆ SetPolyShape()

void EDA_SHAPE::SetPolyShape ( const SHAPE_POLY_SET aShape)
inline

◆ 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:173
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 172 of file eda_shape.h.

172{ SetEndX( val ); }
void SetEndX(int x)
Definition: eda_shape.h:161

References SetEndX().

Referenced by PCB_POINT_EDITOR::updateItem().

◆ SetShape()

◆ SetStart()

void EDA_SHAPE::SetStart ( const VECTOR2I aStart)
inline

Definition at line 124 of file eda_shape.h.

125 {
126 m_start = aStart;
127 m_endsSwapped = false;
128 }

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(), BOOST_AUTO_TEST_CASE(), 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(), SCH_EAGLE_PLUGIN::loadSymbolWire(), 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::TransformShapeToPolygon(), 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 170 of file eda_shape.h.

170{ SetStartY( val ); }
void SetStartY(int y)
Definition: eda_shape.h:130

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 wxS( "S_SEGMENT" );
80 case SHAPE_T::RECT: return wxS( "S_RECT" );
81 case SHAPE_T::ARC: return wxS( "S_ARC" );
82 case SHAPE_T::CIRCLE: return wxS( "S_CIRCLE" );
83 case SHAPE_T::POLY: return wxS( "S_POLYGON" );
84 case SHAPE_T::BEZIER: return wxS( "S_CURVE" );
85 case SHAPE_T::LAST: return wxS( "!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(), LIB_SHAPE::GetItemDescription(), SCH_SHAPE::GetItemDescription(), GetLength(), LIB_SHAPE::GetMenuImage(), SCH_SHAPE::GetMenuImage(), GetRadius(), hitTest(), IsClosed(), 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(), SCH_SHAPE::PrintBackground(), PAD_TOOL::RecombinePad(), rotate(), SCH_SEXPR_PLUGIN::saveShape(), SCH_SEXPR_PLUGIN_CACHE::saveSymbolDrawItem(), scale(), SetCenter(), FP_SHAPE::SetCenter0(), shapesNeedUpdate(), TransformShapeToPolygon(), 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 626 of file eda_shape.cpp.

627{
628 ORIGIN_TRANSFORMS originTransforms = aFrame->GetOriginTransforms();
629 wxString msg;
630
631 wxString shape = _( "Shape" );
632 aList.emplace_back( shape, GetFriendlyName() );
633
634 switch( m_shape )
635 {
636 case SHAPE_T::CIRCLE:
637 aList.emplace_back( _( "Radius" ), aFrame->MessageTextFromValue( GetRadius() ) );
638 break;
639
640 case SHAPE_T::ARC:
642 aList.emplace_back( _( "Angle" ), msg );
643
644 aList.emplace_back( _( "Radius" ), aFrame->MessageTextFromValue( GetRadius() ) );
645 break;
646
647 case SHAPE_T::BEZIER:
648 aList.emplace_back( _( "Length" ), aFrame->MessageTextFromValue( GetLength() ) );
649 break;
650
651 case SHAPE_T::POLY:
652 msg.Printf( wxS( "%d" ), GetPolyShape().Outline(0).PointCount() );
653 aList.emplace_back( _( "Points" ), msg );
654 break;
655
656 case SHAPE_T::RECT:
657 aList.emplace_back( _( "Width" ),
658 aFrame->MessageTextFromValue( std::abs( GetEnd().x - GetStart().x ) ) );
659
660 aList.emplace_back( _( "Height" ),
661 aFrame->MessageTextFromValue( std::abs( GetEnd().y - GetStart().y ) ) );
662 break;
663
664 case SHAPE_T::SEGMENT:
665 {
666 aList.emplace_back( _( "Length" ),
668
669 // angle counter-clockwise from 3'o-clock
670 EDA_ANGLE angle( atan2( (double)( GetStart().y - GetEnd().y ),
671 (double)( GetEnd().x - GetStart().x ) ), RADIANS_T );
672 aList.emplace_back( _( "Angle" ), EDA_UNIT_UTILS::UI::MessageTextFromValue( angle ) );
673 break;
674 }
675
676 default:
677 break;
678 }
679
680 m_stroke.GetMsgPanelInfo( aFrame, aList );
681}
ORIGIN_TRANSFORMS & GetOriginTransforms() override
Return a reference to the default ORIGIN_TRANSFORMS object.
wxString GetFriendlyName() const
Definition: eda_shape.cpp:611
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().
@ 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:326

References _, std::abs(), PNS::angle(), ARC, BEZIER, CIRCLE, GetArcAngle(), GetEnd(), GetFriendlyName(), GetLength(), GetLineLength(), STROKE_PARAMS::GetMsgPanelInfo(), EDA_BASE_FRAME::GetOriginTransforms(), GetPolyShape(), GetRadius(), GetStart(), 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::GetItemDescription(), PCB_SHAPE::GetItemDescription(), and LIB_SHAPE::GetTypeName().

◆ SwapShape()

void EDA_SHAPE::SwapShape ( EDA_SHAPE aImage)

Definition at line 1485 of file eda_shape.cpp.

1486{
1487 EDA_SHAPE* image = dynamic_cast<EDA_SHAPE*>( aImage );
1488 assert( image );
1489
1490 #define SWAPITEM( x ) std::swap( x, image->x )
1491 SWAPITEM( m_stroke );
1492 SWAPITEM( m_start );
1493 SWAPITEM( m_end );
1495 SWAPITEM( m_shape );
1499 SWAPITEM( m_poly );
1500 SWAPITEM( m_fill );
1504 #undef SWAPITEM
1505}
#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().

◆ TransformShapeToPolygon()

void EDA_SHAPE::TransformShapeToPolygon ( SHAPE_POLY_SET aBuffer,
int  aClearance,
int  aError,
ERROR_LOC  aErrorLoc,
bool  ignoreLineWidth = false 
) const

Convert the shape to a closed polygon.

Circles and arcs are approximated by segments.

Parameters
aBufferis a buffer to store the polygon.
aClearanceis 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 1549 of file eda_shape.cpp.

1551{
1552 int width = ignoreLineWidth ? 0 : GetWidth();
1553
1554 width += 2 * aClearance;
1555
1556 switch( m_shape )
1557 {
1558 case SHAPE_T::CIRCLE:
1559 {
1560 int r = GetRadius();
1561
1562 if( IsFilled() )
1563 TransformCircleToPolygon( aBuffer, getCenter(), r + width / 2, aError, aErrorLoc );
1564 else
1565 TransformRingToPolygon( aBuffer, getCenter(), r, width, aError, aErrorLoc );
1566
1567 break;
1568 }
1569
1570 case SHAPE_T::RECT:
1571 {
1572 std::vector<VECTOR2I> pts = GetRectCorners();
1573
1574 if( IsFilled() || IsAnnotationProxy() )
1575 {
1576 aBuffer.NewOutline();
1577
1578 for( const VECTOR2I& pt : pts )
1579 aBuffer.Append( pt );
1580 }
1581
1582 if( width > 0 || !IsFilled() )
1583 {
1584 // Add in segments
1585 TransformOvalToPolygon( aBuffer, pts[0], pts[1], width, aError, aErrorLoc );
1586 TransformOvalToPolygon( aBuffer, pts[1], pts[2], width, aError, aErrorLoc );
1587 TransformOvalToPolygon( aBuffer, pts[2], pts[3], width, aError, aErrorLoc );
1588 TransformOvalToPolygon( aBuffer, pts[3], pts[0], width, aError, aErrorLoc );
1589 }
1590
1591 break;
1592 }
1593
1594 case SHAPE_T::ARC:
1595 TransformArcToPolygon( aBuffer, GetStart(), GetArcMid(), GetEnd(), width, aError, aErrorLoc );
1596 break;
1597
1598 case SHAPE_T::SEGMENT:
1599 TransformOvalToPolygon( aBuffer, GetStart(), GetEnd(), width, aError, aErrorLoc );
1600 break;
1601
1602 case SHAPE_T::POLY:
1603 {
1604 if( !IsPolyShapeValid() )
1605 break;
1606
1607 // The polygon is expected to be a simple polygon; not self intersecting, no hole.
1608 EDA_ANGLE orientation = getParentOrientation();
1609 VECTOR2I offset = getParentPosition();
1610
1611 // Build the polygon with the actual position and orientation:
1612 std::vector<VECTOR2I> poly;
1613 DupPolyPointsList( poly );
1614
1615 for( VECTOR2I& point : poly )
1616 {
1617 RotatePoint( point, orientation );
1618 point += offset;
1619 }
1620
1621 if( IsFilled() )
1622 {
1623 aBuffer.NewOutline();
1624
1625 for( const VECTOR2I& point : poly )
1626 aBuffer.Append( point.x, point.y );
1627 }
1628
1629 if( width > 0 || !IsFilled() )
1630 {
1631 VECTOR2I pt1( poly[poly.size() - 1] );
1632
1633 for( const VECTOR2I& pt2 : poly )
1634 {
1635 if( pt2 != pt1 )
1636 TransformOvalToPolygon( aBuffer, pt1, pt2, width, aError, aErrorLoc );
1637
1638 pt1 = pt2;
1639 }
1640 }
1641
1642 break;
1643 }
1644
1645 case SHAPE_T::BEZIER:
1646 {
1647 std::vector<VECTOR2I> ctrlPts = { GetStart(), GetBezierC1(), GetBezierC2(), GetEnd() };
1648 BEZIER_POLY converter( ctrlPts );
1649 std::vector<VECTOR2I> poly;
1650 converter.GetPoly( poly, GetWidth() );
1651
1652 for( unsigned ii = 1; ii < poly.size(); ii++ )
1653 TransformOvalToPolygon( aBuffer, poly[ii - 1], poly[ii], width, aError, aErrorLoc );
1654
1655 break;
1656 }
1657
1658 default:
1660 break;
1661 }
1662}
void DupPolyPointsList(std::vector< VECTOR2I > &aBuffer) const
Duplicate the list of corners in a std::vector<VECTOR2I>
Definition: eda_shape.cpp:1225
bool IsPolyShapeValid() const
Definition: eda_shape.cpp:1242
void TransformRingToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aCentre, int aRadius, int aWidth, int aError, ERROR_LOC aErrorLoc)
Convert arcs to multiple straight segments.
void TransformCircleToPolygon(SHAPE_LINE_CHAIN &aBuffer, const VECTOR2I &aCenter, int aRadius, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a circle to a polygon, using multiple straight lines.
void TransformArcToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, int aWidth, int aError, ERROR_LOC aErrorLoc)
Convert arc to multiple straight segments.
void TransformOvalToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aWidth, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a oblong shape to a polygon, using multiple segments.

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::TransformShapeToPolygon().

Member Data Documentation

◆ m_annotationProxy

bool EDA_SHAPE::m_annotationProxy
protected

Definition at line 382 of file eda_shape.h.

Referenced by IsAnnotationProxy(), and SetIsAnnotationProxy().

◆ m_arcCenter

◆ m_arcMidData

ARC_MID EDA_SHAPE::m_arcMidData
protected

Definition at line 373 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 381 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 367 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: