KiCad PCB EDA Suite
FP_SHAPE Class Reference

#include <fp_shape.h>

Inheritance diagram for FP_SHAPE:
PCB_SHAPE BOARD_ITEM EDA_SHAPE EDA_ITEM KIGFX::VIEW_ITEM INSPECTABLE

Public Member Functions

 FP_SHAPE (FOOTPRINT *parent, SHAPE_T aShape=SHAPE_T::SEGMENT)
 
 ~FP_SHAPE ()
 
bool IsType (const KICAD_T aScanTypes[]) const override
 Check whether the item is one of the listed types. More...
 
void SetArcAngleAndEnd0 (double aAngle, bool aCheckNegativeAngle=false)
 Sets the angle for arcs, and normalizes it within the range 0 - 360 degrees. More...
 
void SetArcGeometry0 (const wxPoint &aStart, const wxPoint &aMid, const wxPoint &aEnd)
 
void Move (const wxPoint &aMoveVector) override
 Move an edge of the footprint. More...
 
void Mirror (const wxPoint &aCentre, bool aMirrorAroundXAxis)
 Mirror an edge of the footprint. More...
 
void Rotate (const wxPoint &aRotCentre, double aAngle) override
 Rotate an edge of the footprint. More...
 
void Flip (const wxPoint &aCentre, bool aFlipLeftRight) override
 Flip entity relative to aCentre. More...
 
bool IsParentFlipped () const
 
void SetStart0 (const wxPoint &aPoint)
 
const wxPoint & GetStart0 () const
 
void SetEnd0 (const wxPoint &aPoint)
 
const wxPoint & GetEnd0 () const
 
void SetBezierC1_0 (const wxPoint &aPoint)
 
const wxPoint & GetBezierC1_0 () const
 
void SetBezierC2_0 (const wxPoint &aPoint)
 
const wxPoint & GetBezierC2_0 () const
 
wxPoint GetCenter0 () const
 
void SetCenter0 (const wxPoint &aPt)
 
wxPoint GetArcMid0 () const
 
void SetLocalCoord ()
 Set relative coordinates from draw coordinates. More...
 
void SetDrawCoord ()
 Set draw coordinates (absolute values ) from relative coordinates. More...
 
void GetMsgPanelInfo (EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
 Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes. More...
 
wxString GetClass () const override
 Return the class name. More...
 
wxString GetParentAsString () const
 
wxString GetSelectMenuText (EDA_UNITS aUnits) const override
 Return the text to display to be used in the selection clarification context menu when multiple items are found at the current cursor position. More...
 
BITMAPS GetMenuImage () const override
 Return a pointer to an image to be used in menus. More...
 
EDA_ITEMClone () const override
 Create a duplicate of this item with linked list members set to NULL. More...
 
double ViewGetLOD (int aLayer, KIGFX::VIEW *aView) const override
 Return the level of detail (LOD) of the item. More...
 
void SetPosition (const wxPoint &aPos) override
 
wxPoint GetPosition () const override
 
wxPoint GetCenter () const override
 This defaults to the center of the bounding box if not overridden. More...
 
const wxPoint GetFocusPosition () const override
 Allows items to return their visual center rather than their anchor. More...
 
FOOTPRINTGetParentFootprint () const
 Return the parent footprint or NULL if PCB_SHAPE does not belong to a footprint. More...
 
std::shared_ptr< SHAPEGetEffectiveShape (PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
 Make a set of SHAPE objects representing the PCB_SHAPE. More...
 
const EDA_RECT GetBoundingBox () const override
 Return the orthogonal bounding box of this object for display purposes. More...
 
bool HitTest (const wxPoint &aPosition, int aAccuracy=0) const override
 Test if aPosition is inside or on the boundary of this item. More...
 
bool HitTest (const EDA_RECT &aRect, bool aContained, int aAccuracy=0) const override
 Test if aRect intersects this item. More...
 
void Move (const VECTOR2I &aMoveVector)
 
void Rotate (const VECTOR2I &aRotCentre, double aAngle)
 
void Flip (const VECTOR2I &aCentre, bool aFlipLeftRight)
 
void Scale (double aScale)
 
void TransformShapeWithClearanceToPolygon (SHAPE_POLY_SET &aCornerBuffer, PCB_LAYER_ID aLayer, int aClearanceValue, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
 Convert the shape to a closed polygon. More...
 
void TransformShapeWithClearanceToPolygon (SHAPE_POLY_SET &aCornerBuffer, int aClearanceValue, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth) const
 Convert the shape to a closed polygon. More...
 
virtual const BOX2I ViewBBox () const override
 Return the bounding box of the item covering all its layers. More...
 
virtual void SwapData (BOARD_ITEM *aImage) override
 Swap data between aItem and aImage. More...
 
void SetParentGroup (PCB_GROUP *aGroup)
 
PCB_GROUPGetParentGroup () const
 
int GetX () const
 
int GetY () const
 
void SetX (int aX)
 
void SetY (int aY)
 
virtual bool IsConnected () const
 Returns information if the object is derived from BOARD_CONNECTED_ITEM. More...
 
virtual bool IsOnCopperLayer () const
 
BOARD_ITEM_CONTAINERGetParent () const
 
virtual PCB_LAYER_ID GetLayer () const
 Return the primary layer this item is on. More...
 
virtual LSET GetLayerSet () const
 Return a std::bitset of all layers on which the item physically resides. More...
 
virtual void SetLayerSet (LSET aLayers)
 
virtual void SetLayer (PCB_LAYER_ID aLayer)
 Set the layer this item is on. More...
 
virtual BOARD_ITEMDuplicate () const
 Create a copy of this BOARD_ITEM. More...
 
virtual bool IsOnLayer (PCB_LAYER_ID aLayer) const
 Test to see if this object is on the given layer. More...
 
bool IsTrack () const
 Test to see if this object is a track or via (or microvia). More...
 
virtual bool IsLocked () const
 
virtual void SetLocked (bool aLocked)
 Modify the 'lock' status for of the item. More...
 
void DeleteStructure ()
 Delete this object after removing from its parent if it has one. More...
 
virtual const BOARDGetBoard () const
 Return the BOARD in which this BOARD_ITEM resides, or NULL if none. More...
 
virtual BOARDGetBoard ()
 
wxString GetLayerName () const
 Return the name of the PCB layer on which the item resides. More...
 
virtual void ViewGetLayers (int aLayers[], int &aCount) const override
 Return the all the layers within the VIEW the object is painted on. More...
 
KICAD_T Type () const
 Returns the type of object. More...
 
virtual void SetParent (EDA_ITEM *aParent)
 
bool IsModified () const
 
bool IsNew () const
 
bool IsMoving () const
 
bool IsDragging () const
 
bool IsWireImage () const
 
bool IsSelected () const
 
bool IsEntered () const
 
bool IsResized () const
 
bool IsBrightened () const
 
void SetWireImage ()
 
void SetSelected ()
 
void SetBrightened ()
 
void ClearSelected ()
 
void ClearBrightened ()
 
void SetModified ()
 
int GetState (EDA_ITEM_FLAGS type) const
 
void SetState (EDA_ITEM_FLAGS type, bool state)
 
EDA_ITEM_FLAGS GetStatus () const
 
void SetStatus (EDA_ITEM_FLAGS aStatus)
 
void SetFlags (EDA_ITEM_FLAGS aMask)
 
void ClearFlags (EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
 
EDA_ITEM_FLAGS GetFlags () const
 
bool HasFlag (EDA_ITEM_FLAGS aFlag) const
 
EDA_ITEM_FLAGS GetEditFlags () const
 
void ClearTempFlags ()
 
void ClearEditFlags ()
 
void SetForceVisible (bool aEnable)
 Set and clear force visible flag used to force the item to be drawn even if it's draw attribute is set to not visible. More...
 
bool IsForceVisible () const
 
virtual SEARCH_RESULT Visit (INSPECTOR inspector, void *testData, const KICAD_T scanTypes[])
 May be re-implemented for each derived class in order to handle all the types given by its member data. More...
 
virtual bool Matches (const wxFindReplaceData &aSearchData, void *aAuxData) const
 Compare the item against the search criteria in aSearchData. More...
 
virtual bool Replace (const wxFindReplaceData &aSearchData, void *aAuxData=nullptr)
 Perform a text replace using the find and replace criteria in aSearchData on items that support text find and replace. More...
 
virtual bool IsReplaceable () const
 Override this method in any derived object that supports test find and replace. More...
 
bool operator< (const EDA_ITEM &aItem) const
 Test if another item is less than this object. More...
 
virtual void ViewDraw (int aLayer, VIEW *aView) const
 Draw the parts of the object belonging to layer aLayer. More...
 
VIEW_ITEM_DATA * viewPrivData () const
 
void ClearViewPrivData ()
 
bool Set (PROPERTY_BASE *aProperty, wxAny &aValue)
 
template<typename T >
bool Set (PROPERTY_BASE *aProperty, T aValue)
 
template<typename T >
bool Set (const wxString &aProperty, T aValue)
 
wxAny Get (PROPERTY_BASE *aProperty)
 
template<typename T >
Get (PROPERTY_BASE *aProperty)
 
template<typename T >
boost::optional< T > Get (const wxString &aProperty)
 
void SwapShape (EDA_SHAPE *aImage)
 
wxString ShowShape () const
 
wxString SHAPE_T_asString () const
 
void SetFillMode (FILL_T aFill)
 
FILL_T GetFillType () const
 
bool IsFilled () const
 
void SetFilled (bool aFlag)
 
void SetWidth (int aWidth)
 
int GetWidth () const
 
void SetShape (SHAPE_T aShape)
 
SHAPE_T GetShape () const
 
const wxPoint & GetStart () const
 Return the starting point of the graphic. More...
 
int GetStartY ()
 
int GetStartX ()
 
void SetStart (const wxPoint &aStart)
 
void SetStartY (int y)
 
void SetStartX (int x)
 
const wxPoint & GetEnd () const
 Return the ending point of the graphic. More...
 
int GetEndY ()
 
int GetEndX ()
 
void SetEnd (const wxPoint &aEnd)
 
void SetEndY (int y)
 
void SetEndX (int x)
 
void SetBezierC1 (const wxPoint &aPt)
 
const wxPoint & GetBezierC1 () const
 
void SetBezierC2 (const wxPoint &aPt)
 
const wxPoint & GetBezierC2 () const
 
wxPoint getCenter () const
 
void SetCenter (const wxPoint &aCenter)
 
void SetArcAngleAndEnd (double aAngle, bool aCheckNegativeAngle=false)
 Set the end point from the angle center and start. More...
 
double GetArcAngle () const
 
bool EndsSwapped () const
 Have the start and end points been swapped since they were set? More...
 
wxPoint GetArcMid () const
 
std::vector< wxPoint > GetRectCorners () const
 
void CalcArcAngles (double &aStartAngle, double &aEndAngle) const
 Calc arc start and end angles such that aStartAngle < aEndAngle. More...
 
int GetRadius () const
 
void SetArcGeometry (const wxPoint &aStart, const wxPoint &aMid, const wxPoint &aEnd)
 Set the three controlling points for an arc. More...
 
void SetCachedArcData (const wxPoint &aStart, const wxPoint &aMid, const wxPoint &aEnd, const wxPoint &aCenter)
 Set the data used for mid point caching. More...
 
const std::vector< wxPoint > & GetBezierPoints () const
 
void DupPolyPointsList (std::vector< wxPoint > &aBuffer) const
 Duplicate the list of corners in a std::vector<wxPoint> 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< wxPoint > &aPoints)
 
void RebuildBezierToSegmentsPointsList (int aMinSegLen)
 Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments. More...
 
std::vector< SHAPE * > MakeEffectiveShapes () 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...
 
int Compare (const EDA_SHAPE *aOther) const
 

Static Public Member Functions

static bool ClassOf (const EDA_ITEM *aItem)
 
template<class T >
static SEARCH_RESULT IterateForward (std::deque< T > &aList, INSPECTOR inspector, void *testData, const KICAD_T scanTypes[])
 This changes first parameter to avoid the DList and use the main queue instead. More...
 
template<class T >
static SEARCH_RESULT IterateForward (std::vector< T > &aList, INSPECTOR inspector, void *testData, const KICAD_T scanTypes[])
 Change first parameter to avoid the DList and use std::vector instead. More...
 
static bool Replace (const wxFindReplaceData &aSearchData, wxString &aText)
 Perform a text replace on aText using the find and replace criteria in aSearchData on items that support text find and replace. More...
 
static bool Sort (const EDA_ITEM *aLeft, const EDA_ITEM *aRight)
 Helper function to be used by the C++ STL sort algorithm for sorting a STL container of EDA_ITEM pointers. More...
 

Public Attributes

const KIID m_Uuid
 

Static Public Attributes

static wxPoint ZeroOffset
 A value of wxPoint(0,0) which can be passed to the Draw() functions. More...
 

Protected Member Functions

double getParentOrientation () const override
 
wxPoint getParentPosition () const override
 
virtual wxString layerMaskDescribe () const
 Return a string (to be shown to the user) describing a layer mask. More...
 
bool Matches (const wxString &aText, const wxFindReplaceData &aSearchData) const
 Compare aText against search criteria in aSearchData. More...
 
void setPosition (const wxPoint &aPos)
 
wxPoint getPosition () const
 
void move (const wxPoint &aMoveVector)
 
void rotate (const wxPoint &aRotCentre, double aAngle)
 
void flip (const wxPoint &aCentre, bool aFlipLeftRight)
 
void scale (double aScale)
 
const EDA_RECT getBoundingBox () const
 
void computeArcBBox (EDA_RECT &aBBox) const
 
bool hitTest (const wxPoint &aPosition, int aAccuracy=0) const
 
bool hitTest (const EDA_RECT &aRect, bool aContained, int aAccuracy=0) const
 
const std::vector< wxPoint > buildBezierToSegmentsPointsList (int aMinSegLen) const
 
void beginEdit (const wxPoint &aStartPoint)
 
bool continueEdit (const wxPoint &aPosition)
 
void calcEdit (const wxPoint &aPosition)
 
void endEdit (bool aClosed=true)
 Finishes editing the shape. More...
 
void setEditState (int aState)
 

Protected Attributes

wxPoint m_start0
 Start point or circle center, relative to footprint origin, orient 0. More...
 
wxPoint m_end0
 End point or circle edge, relative to footprint origin, orient 0. More...
 
wxPoint m_arcCenter0
 Center of arc, relative to footprint origin, orient 0. More...
 
wxPoint m_bezierC1_0
 Bezier Control Point 1, relative to footprint origin, orient 0. More...
 
wxPoint m_bezierC2_0
 Bezier Control Point 2, relative to footprint origin, orient 0. More...
 
ARC_MID m_arcMidData_0
 Originating Arc data, orient 0. More...
 
PCB_LAYER_ID m_layer
 
PCB_GROUPm_group
 
EDA_ITEM_FLAGS m_status
 
EDA_ITEMm_parent
 Linked list: Link (parent struct) More...
 
bool m_forceVisible
 
EDA_ITEM_FLAGS m_flags
 
bool m_endsSwapped
 
SHAPE_T m_shape
 
int m_width
 
FILL_T m_fill
 
wxPoint m_start
 
wxPoint m_end
 
wxPoint m_arcCenter
 
ARC_MID m_arcMidData
 
wxPoint m_bezierC1
 
wxPoint m_bezierC2
 
std::vector< wxPoint > m_bezierPoints
 
SHAPE_POLY_SET m_poly
 
int m_editState
 
bool m_eeWinding
 

Detailed Description

Definition at line 39 of file fp_shape.h.

Constructor & Destructor Documentation

◆ FP_SHAPE()

FP_SHAPE::FP_SHAPE ( FOOTPRINT parent,
SHAPE_T  aShape = SHAPE_T::SEGMENT 
)

Definition at line 40 of file fp_shape.cpp.

40  :
41  PCB_SHAPE( parent, PCB_FP_SHAPE_T, aShape )
42 {
43  m_layer = F_SilkS;
44 }
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:93
PCB_SHAPE(BOARD_ITEM *aParent, KICAD_T idtype, SHAPE_T shapetype)
Definition: pcb_shape.cpp:36
PCB_LAYER_ID m_layer
Definition: board_item.h:313

References F_SilkS, and BOARD_ITEM::m_layer.

Referenced by Clone().

◆ ~FP_SHAPE()

FP_SHAPE::~FP_SHAPE ( )

Definition at line 47 of file fp_shape.cpp.

48 {
49 }

Member Function Documentation

◆ beginEdit()

void EDA_SHAPE::beginEdit ( const wxPoint &  aStartPoint)
protectedinherited

Definition at line 1233 of file eda_shape.cpp.

1234 {
1235  switch( GetShape() )
1236  {
1237  case SHAPE_T::SEGMENT:
1238  case SHAPE_T::CIRCLE:
1239  case SHAPE_T::RECT:
1240  SetStart( aPosition );
1241  SetEnd( aPosition );
1242  break;
1243 
1244  case SHAPE_T::ARC:
1245  SetArcGeometry( aPosition, aPosition, aPosition );
1246  m_editState = 1;
1247  break;
1248 
1249  case SHAPE_T::POLY:
1250  m_poly.NewOutline();
1251  m_poly.Outline( 0 ).SetClosed( false );
1252 
1253  // Start and end of the first segment (co-located for now)
1254  m_poly.Outline( 0 ).Append( aPosition );
1255  m_poly.Outline( 0 ).Append( aPosition, true );
1256  break;
1257 
1258  default:
1260  }
1261 }
void SetEnd(const wxPoint &aEnd)
Definition: eda_shape.h:135
void SetArcGeometry(const wxPoint &aStart, const wxPoint &aMid, const wxPoint &aEnd)
Set the three controlling points for an arc.
Definition: eda_shape.cpp:504
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
void SetStart(const wxPoint &aStart)
Definition: eda_shape.h:110
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
SHAPE_LINE_CHAIN & Outline(int aIndex)
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
int m_editState
Definition: eda_shape.h:334
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
int NewOutline()
Creates a new hole in a given outline.
SHAPE_T GetShape() const
Definition: eda_shape.h:101

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

Referenced by LIB_SHAPE::BeginEdit().

◆ buildBezierToSegmentsPointsList()

const std::vector< wxPoint > EDA_SHAPE::buildBezierToSegmentsPointsList ( int  aMinSegLen) const
protectedinherited

Definition at line 380 of file eda_shape.cpp.

381 {
382  std::vector<wxPoint> bezierPoints;
383 
384  // Rebuild the m_BezierPoints vertex list that approximate the Bezier curve
385  std::vector<wxPoint> ctrlPoints = { m_start, m_bezierC1, m_bezierC2, m_end };
386  BEZIER_POLY converter( ctrlPoints );
387  converter.GetPoly( bezierPoints, aMinSegLen );
388 
389  return bezierPoints;
390 }
wxPoint m_bezierC1
Definition: eda_shape.h:328
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_bezierC2
Definition: eda_shape.h:329
wxPoint m_start
Definition: eda_shape.h:322
Bezier curves to polygon converter.
Definition: bezier_curves.h:36

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

Referenced by EDA_SHAPE::MakeEffectiveShapes(), and EDA_SHAPE::RebuildBezierToSegmentsPointsList().

◆ CalcArcAngles()

void EDA_SHAPE::CalcArcAngles ( double &  aStartAngle,
double &  aEndAngle 
) const
inherited

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

Each may be between -360.0 and 360.0.

Definition at line 451 of file eda_shape.cpp.

452 {
453  VECTOR2D startRadial( GetStart() - getCenter() );
454  VECTOR2D endRadial( GetEnd() - getCenter() );
455 
456  aStartAngle = 180.0 / M_PI * atan2( startRadial.y, startRadial.x );
457  aEndAngle = 180.0 / M_PI * atan2( endRadial.y, endRadial.x );
458 
459  if( aEndAngle == aStartAngle )
460  aEndAngle = aStartAngle + 360.0; // ring, not null
461 
462  if( aStartAngle > aEndAngle )
463  {
464  if( aEndAngle < 0 )
465  aEndAngle = NormalizeAngleDegrees( aEndAngle, 0.0, 360.0 );
466  else
467  aStartAngle = NormalizeAngleDegrees( aStartAngle, -360.0, 0.0 );
468  }
469 }
wxPoint getCenter() const
Definition: eda_shape.cpp:393
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:106
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:131
double NormalizeAngleDegrees(double Angle, double aMin, double aMax)
Normalize angle to be aMin < angle <= aMax angle is in degrees.
Definition: trigo.h:327

References EDA_SHAPE::getCenter(), EDA_SHAPE::GetEnd(), EDA_SHAPE::GetStart(), NormalizeAngleDegrees(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by EDA_SHAPE::computeArcBBox(), KIGFX::PCB_PAINTER::draw(), EDA_SHAPE::GetArcAngle(), and EDA_SHAPE::hitTest().

◆ calcEdit()

void EDA_SHAPE::calcEdit ( const wxPoint &  aPosition)
protectedinherited

Definition at line 1291 of file eda_shape.cpp.

1292 {
1293 #define sq( x ) pow( x, 2 )
1294 
1295  switch( GetShape() )
1296  {
1297  case SHAPE_T::SEGMENT:
1298  case SHAPE_T::CIRCLE:
1299  case SHAPE_T::RECT:
1300  SetEnd( aPosition );
1301  break;
1302 
1303  case SHAPE_T::ARC:
1304  {
1305  int radius = GetRadius();
1306 
1307  // Edit state 0: drawing: place start
1308  // Edit state 1: drawing: place end (center calculated for 90-degree subtended angle)
1309  // Edit state 2: point edit: move start (center calculated for invariant subtended angle)
1310  // Edit state 3: point edit: move end (center calculated for invariant subtended angle)
1311  // Edit state 4: point edit: move center
1312  // Edit state 5: point edit: move arc-mid-point
1313 
1314  switch( m_editState )
1315  {
1316  case 0:
1317  SetArcGeometry( aPosition, aPosition, aPosition );
1318  return;
1319 
1320  case 1:
1321  m_end = aPosition;
1322  radius = KiROUND( sqrt( sq( GetLineLength( m_start, m_end ) ) / 2.0 ) );
1323  break;
1324 
1325  case 2:
1326  case 3:
1327  {
1328  wxPoint v = m_start - m_end;
1329  double chordBefore = sq( v.x ) + sq( v.y );
1330 
1331  if( m_editState == 2 )
1332  m_start = aPosition;
1333  else
1334  m_end = aPosition;
1335 
1336  v = m_start - m_end;
1337  double chordAfter = sq( v.x ) + sq( v.y );
1338  double ratio = chordAfter / chordBefore;
1339 
1340  if( ratio != 0 )
1341  {
1342  radius = std::max( int( sqrt( sq( radius ) * ratio ) ) + 1,
1343  int( sqrt( chordAfter ) / 2 ) + 1 );
1344  }
1345  }
1346  break;
1347 
1348  case 4:
1349  {
1350  double chordA = GetLineLength( m_start, aPosition );
1351  double chordB = GetLineLength( m_end, aPosition );
1352  radius = int( ( chordA + chordB ) / 2.0 ) + 1;
1353  }
1354  break;
1355 
1356  case 5:
1357  SetArcGeometry( GetStart(), aPosition, GetEnd() );
1358  return;
1359  }
1360 
1361  // Calculate center based on start, end, and radius
1362  //
1363  // Let 'l' be the length of the chord and 'm' the middle point of the chord
1364  double l = GetLineLength( m_start, m_end );
1365  wxPoint m = ( m_start + m_end ) / 2;
1366 
1367  // Calculate 'd', the vector from the chord midpoint to the center
1368  wxPoint d;
1369  d.x = KiROUND( sqrt( sq( radius ) - sq( l/2 ) ) * ( m_start.y - m_end.y ) / l );
1370  d.y = KiROUND( sqrt( sq( radius ) - sq( l/2 ) ) * ( m_end.x - m_start.x ) / l );
1371 
1372  wxPoint c1 = m + d;
1373  wxPoint c2 = m - d;
1374 
1375  // Solution gives us 2 centers; we need to pick one:
1376  switch( m_editState )
1377  {
1378  case 1:
1379  {
1380  // Keep center clockwise from chord while drawing
1381  wxPoint chordVector = m_end - m_start;
1382  double chordAngle = ArcTangente( chordVector.y, chordVector.x );
1383  NORMALIZE_ANGLE_POS( chordAngle );
1384 
1385  wxPoint c1Test = c1;
1386  RotatePoint( &c1Test, m_start, -chordAngle );
1387 
1388  m_arcCenter = c1Test.x > 0 ? c2 : c1;
1389  }
1390  break;
1391 
1392  case 2:
1393  case 3:
1394  // Pick the one closer to the old center
1395  m_arcCenter = GetLineLength( c1, m_arcCenter ) < GetLineLength( c2, m_arcCenter ) ? c1 : c2;
1396  break;
1397 
1398  case 4:
1399  // Pick the one closer to the mouse position
1400  m_arcCenter = GetLineLength( c1, aPosition ) < GetLineLength( c2, aPosition ) ? c1 : c2;
1401  break;
1402  }
1403  }
1404  break;
1405 
1406  case SHAPE_T::POLY:
1407  m_poly.Outline( 0 ).SetPoint( m_poly.Outline( 0 ).GetPointCount() - 1, aPosition );
1408  break;
1409 
1410  default:
1412  }
1413 }
double GetLineLength(const wxPoint &aPointA, const wxPoint &aPointB)
Return the length of a line segment defined by aPointA and aPointB.
Definition: trigo.h:222
virtual size_t GetPointCount() const override
#define sq(x)
void SetEnd(const wxPoint &aEnd)
Definition: eda_shape.h:135
void SetArcGeometry(const wxPoint &aStart, const wxPoint &aMid, const wxPoint &aEnd)
Set the three controlling points for an arc.
Definition: eda_shape.cpp:504
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:106
void SetPoint(int aIndex, const VECTOR2I &aPos)
Move a point to a specific location.
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:229
void NORMALIZE_ANGLE_POS(T &Angle)
Definition: trigo.h:290
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_arcCenter
Definition: eda_shape.h:325
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:131
SHAPE_LINE_CHAIN & Outline(int aIndex)
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
int m_editState
Definition: eda_shape.h:334
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
wxPoint m_start
Definition: eda_shape.h:322
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:73
SHAPE_T GetShape() const
Definition: eda_shape.h:101
double ArcTangente(int dy, int dx)
Definition: trigo.cpp:183
int GetRadius() const
Definition: eda_shape.cpp:472

References ARC, ArcTangente(), CIRCLE, EDA_SHAPE::GetEnd(), GetLineLength(), SHAPE_LINE_CHAIN::GetPointCount(), EDA_SHAPE::GetRadius(), EDA_SHAPE::GetShape(), EDA_SHAPE::GetStart(), KiROUND(), EDA_SHAPE::m_arcCenter, EDA_SHAPE::m_editState, EDA_SHAPE::m_end, EDA_SHAPE::m_poly, EDA_SHAPE::m_start, NORMALIZE_ANGLE_POS(), SHAPE_POLY_SET::Outline(), POLY, RECT, RotatePoint(), SEGMENT, EDA_SHAPE::SetArcGeometry(), EDA_SHAPE::SetEnd(), SHAPE_LINE_CHAIN::SetPoint(), EDA_SHAPE::SHAPE_T_asString(), sq, and UNIMPLEMENTED_FOR.

Referenced by LIB_SHAPE::CalcEdit().

◆ ClassOf()

static bool FP_SHAPE::ClassOf ( const EDA_ITEM aItem)
inlinestatic

Definition at line 49 of file fp_shape.h.

50  {
51  return aItem && PCB_FP_SHAPE_T == aItem->Type();
52  }
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:93
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112

References PCB_FP_SHAPE_T, and EDA_ITEM::Type().

◆ ClearBrightened()

void EDA_ITEM::ClearBrightened ( )
inlineinherited

◆ ClearEditFlags()

◆ ClearFlags()

void EDA_ITEM::ClearFlags ( EDA_ITEM_FLAGS  aMask = EDA_ITEM_ALL_FLAGS)
inlineinherited

Definition at line 153 of file eda_item.h.

153 { m_flags &= ~aMask; }
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:480

References EDA_ITEM::m_flags.

Referenced by FOOTPRINT_VIEWER_FRAME::AddFootprintToPCB(), PNS_KICAD_IFACE::AddItem(), SCH_EDIT_FRAME::AddItemToScreenAndUndoList(), SCH_MOVE_TOOL::AlignElements(), FOOTPRINT::BuildPolyCourtyards(), EDA_ITEM::ClearBrightened(), EDA_ITEM::ClearEditFlags(), EDA_ITEM::ClearSelected(), EDA_ITEM::ClearTempFlags(), ConvertOutlineToPolygon(), SCH_EDIT_FRAME::ConvertPart(), SYMBOL_EDITOR_EDIT_TOOL::Copy(), FOOTPRINT_EDITOR_CONTROL::CreateFootprint(), SYMBOL_EDITOR_PIN_TOOL::CreateImagePins(), MICROWAVE_TOOL::createMicrowaveInductor(), DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES(), KIGFX::SCH_PAINTER::draw(), SYMBOL_EDITOR_EDIT_TOOL::Duplicate(), SCH_ITEM::Duplicate(), PCB_EDIT_FRAME::ExchangeFootprint(), PCB_SELECTION_TOOL::ExitGroup(), SYMBOL_EDIT_FRAME::GetSymbolFromRedoList(), SYMBOL_EDIT_FRAME::GetSymbolFromUndoList(), FOOTPRINT_EDITOR_CONTROL::ImportFootprint(), FOOTPRINT_EDIT_FRAME::LoadFootprintFromBoard(), FOOTPRINT_EDIT_FRAME::LoadFootprintFromLibrary(), EE_SELECTION_TOOL::Main(), EE_SELECTION_TOOL::narrowSelection(), FOOTPRINT_EDITOR_CONTROL::NewFootprint(), FOOTPRINT_EDIT_FRAME::OpenProjectFiles(), PCB_BASE_FRAME::PlaceFootprint(), SYMBOL_EDITOR_PIN_TOOL::PlacePin(), BOARD_COMMIT::Push(), PCB_SELECTION_TOOL::RebuildSelection(), SCH_EDIT_TOOL::RepeatDrawItem(), SYMBOL_EDIT_FRAME::RollbackSymbolFromUndo(), SCH_EDIT_FRAME::SaveCopyForRepeatItem(), FOOTPRINT_EDIT_FRAME::SaveFootprintToBoard(), SCH_SEXPR_PLUGIN_CACHE::savePin(), EE_SELECTION_TOOL::selectMultiple(), SCH_EDIT_FRAME::SelectUnit(), DIALOG_SYMBOL_PROPERTIES::TransferDataFromWindow(), DIALOG_PAD_PROPERTIES::TransferDataFromWindow(), and SCH_DRAWING_TOOLS::TwoClickPlace().

◆ ClearSelected()

◆ ClearTempFlags()

void EDA_ITEM::ClearTempFlags ( )
inlineinherited

Definition at line 165 of file eda_item.h.

166  {
168  DO_NOT_DRAW );
169  }
#define DO_NOT_DRAW
Used to disable draw function.
#define STARTPOINT
When a line is selected, these flags indicate which.
#define ENDPOINT
ends. (Used to support dragging.)
#define IS_LINKED
Used in calculation to mark linked items (temporary use)
#define CANDIDATE
flag indicating that the structure is connected
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: eda_item.h:153
#define SKIP_STRUCT
flag indicating that the structure should be ignored
#define TEMP_SELECTED
flag indicating that the structure has already selected

References CANDIDATE, EDA_ITEM::ClearFlags(), DO_NOT_DRAW, ENDPOINT, IS_LINKED, SKIP_STRUCT, STARTPOINT, and TEMP_SELECTED.

Referenced by SCH_EDIT_FRAME::PutDataInPreviousState().

◆ ClearViewPrivData()

void KIGFX::VIEW_ITEM::ClearViewPrivData ( )
inlineinherited

Definition at line 143 of file view_item.h.

144  {
145  m_viewPrivData = nullptr;
146  }
VIEW_ITEM_DATA * m_viewPrivData
Definition: view_item.h:151

References KIGFX::VIEW_ITEM::m_viewPrivData.

Referenced by KIGFX::VIEW::OnDestroy().

◆ Clone()

EDA_ITEM * FP_SHAPE::Clone ( ) const
overridevirtual

Create a duplicate of this item with linked list members set to NULL.

The default version will return NULL in release builds and likely crash the program. In debug builds, a warning message indicating the derived class has not implemented cloning. This really should be a pure virtual function. Due to the fact that there are so many objects derived from EDA_ITEM, the decision was made to return NULL until all the objects derived from EDA_ITEM implement cloning. Once that happens, this function should be made pure.

Returns
A clone of the item.

Reimplemented from PCB_SHAPE.

Definition at line 139 of file fp_shape.cpp.

140 {
141  return new FP_SHAPE( *this );
142 }
FP_SHAPE(FOOTPRINT *parent, SHAPE_T aShape=SHAPE_T::SEGMENT)
Definition: fp_shape.cpp:40

References FP_SHAPE().

◆ Compare()

int EDA_SHAPE::Compare ( const EDA_SHAPE aOther) const
inherited

Definition at line 1465 of file eda_shape.cpp.

1466 {
1467 #define EPSILON 2 // Should be enough for rounding errors on calculated items
1468 
1469 #define TEST( a, b ) { if( a != b ) return a - b; }
1470 #define TEST_E( a, b ) { if( abs( a - b ) > EPSILON ) return a - b; }
1471 #define TEST_PT( a, b ) { TEST_E( a.x, b.x ); TEST_E( a.y, b.y ); }
1472 
1473  TEST_PT( m_start, aOther->m_start );
1474  TEST_PT( m_end, aOther->m_end );
1475 
1476  TEST( (int) m_shape, (int) aOther->m_shape );
1477 
1478  if( m_shape == SHAPE_T::ARC )
1479  {
1480  TEST_PT( m_arcCenter, aOther->m_arcCenter );
1481  }
1482  else if( m_shape == SHAPE_T::BEZIER )
1483  {
1484  TEST_PT( m_bezierC1, aOther->m_bezierC1 );
1485  TEST_PT( m_bezierC2, aOther->m_bezierC2 );
1486  }
1487  else if( m_shape == SHAPE_T::POLY )
1488  {
1489  TEST( m_poly.TotalVertices(), aOther->m_poly.TotalVertices() );
1490 
1491  for( int ii = 0; ii < m_poly.TotalVertices(); ++ii )
1492  TEST_PT( m_poly.CVertex( ii ), aOther->m_poly.CVertex( ii ) );
1493  }
1494 
1495  TEST_E( m_width, aOther->m_width );
1496  TEST( (int) m_fill, (int) aOther->m_fill );
1497 
1498  return 0;
1499 }
int TotalVertices() const
Delete aIdx-th polygon from the set.
SHAPE_T m_shape
Definition: eda_shape.h:319
wxPoint m_bezierC1
Definition: eda_shape.h:328
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the aGlobalIndex-th vertex in the poly set.
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_arcCenter
Definition: eda_shape.h:325
wxPoint m_bezierC2
Definition: eda_shape.h:329
#define TEST(a, b)
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
#define TEST_E(a, b)
FILL_T m_fill
Definition: eda_shape.h:321
wxPoint m_start
Definition: eda_shape.h:322
#define TEST_PT(a, b)
int m_width
Definition: eda_shape.h:320

References ARC, BEZIER, SHAPE_POLY_SET::CVertex(), EDA_SHAPE::m_arcCenter, EDA_SHAPE::m_bezierC1, EDA_SHAPE::m_bezierC2, EDA_SHAPE::m_end, EDA_SHAPE::m_fill, EDA_SHAPE::m_poly, EDA_SHAPE::m_shape, EDA_SHAPE::m_start, EDA_SHAPE::m_width, POLY, TEST, TEST_E, TEST_PT, and SHAPE_POLY_SET::TotalVertices().

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

◆ computeArcBBox()

void EDA_SHAPE::computeArcBBox ( EDA_RECT aBBox) const
protectedinherited

Definition at line 1017 of file eda_shape.cpp.

1018 {
1019  wxPoint start = m_start;
1020  wxPoint end = m_end;
1021  double t1, t2;
1022 
1023  CalcArcAngles( t1, t2 );
1024 
1025  if( m_eeWinding && NormalizeAngleDegrees( t1 - t2, -180.0, 180.0 ) > 0 )
1026  std::swap( start, end );
1027 
1028  // Do not include the center, which is not necessarily inside the BB of an arc with a small
1029  // included angle
1030  aBBox.SetOrigin( start );
1031  aBBox.Merge( end );
1032 
1033  // Determine the starting quarter
1034  // 0 right-bottom
1035  // 1 left-bottom
1036  // 2 left-top
1037  // 3 right-top
1038  unsigned int quarter;
1039 
1040  if( start.x < m_arcCenter.x )
1041  {
1042  if( start.y <= m_arcCenter.y )
1043  quarter = 2;
1044  else
1045  quarter = 1;
1046  }
1047  else if( start.x == m_arcCenter.x )
1048  {
1049  if( start.y < m_arcCenter.y )
1050  quarter = 3;
1051  else
1052  quarter = 1;
1053  }
1054  else
1055  {
1056  if( start.y < m_arcCenter.y )
1057  quarter = 3;
1058  else
1059  quarter = 0;
1060  }
1061 
1062  int radius = GetRadius();
1063  VECTOR2I startRadial = start - m_arcCenter;
1064  VECTOR2I endRadial = end - m_arcCenter;
1065  double angleStart = ArcTangente( startRadial.y, startRadial.x );
1066  double arcAngle = RAD2DECIDEG( endRadial.Angle() - startRadial.Angle() );
1067  int angle = (int) NormalizeAnglePos( angleStart ) % 900 + NormalizeAnglePos( arcAngle );
1068 
1069  while( angle > 900 )
1070  {
1071  switch( quarter )
1072  {
1073  case 0: aBBox.Merge( wxPoint( m_arcCenter.x, m_arcCenter.y + radius ) ); break; // down
1074  case 1: aBBox.Merge( wxPoint( m_arcCenter.x - radius, m_arcCenter.y ) ); break; // left
1075  case 2: aBBox.Merge( wxPoint( m_arcCenter.x, m_arcCenter.y - radius ) ); break; // up
1076  case 3: aBBox.Merge( wxPoint( m_arcCenter.x + radius, m_arcCenter.y ) ); break; // right
1077  }
1078 
1079  ++quarter %= 4;
1080  angle -= 900;
1081  }
1082 }
void Merge(const EDA_RECT &aRect)
Modify the position and size of the rectangle in order to contain aRect.
Definition: eda_rect.cpp:432
double RAD2DECIDEG(double rad)
Definition: trigo.h:234
void CalcArcAngles(double &aStartAngle, double &aEndAngle) const
Calc arc start and end angles such that aStartAngle < aEndAngle.
Definition: eda_shape.cpp:451
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:130
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_arcCenter
Definition: eda_shape.h:325
double Angle() const
Compute the angle of the vector.
Definition: vector2d.h:307
wxPoint m_start
Definition: eda_shape.h:322
bool m_eeWinding
Definition: eda_shape.h:335
T NormalizeAnglePos(T Angle)
Normalize angle to be in the 0.0 .. 360.0 range: angle is in 1/10 degrees.
Definition: trigo.h:281
static DIRECTION_45::AngleType angle(const VECTOR2I &a, const VECTOR2I &b)
double NormalizeAngleDegrees(double Angle, double aMin, double aMax)
Normalize angle to be aMin < angle <= aMax angle is in degrees.
Definition: trigo.h:327
double ArcTangente(int dy, int dx)
Definition: trigo.cpp:183
int GetRadius() const
Definition: eda_shape.cpp:472

References PNS::angle(), VECTOR2< T >::Angle(), ArcTangente(), EDA_SHAPE::CalcArcAngles(), EDA_SHAPE::GetRadius(), EDA_SHAPE::m_arcCenter, EDA_SHAPE::m_eeWinding, EDA_SHAPE::m_end, EDA_SHAPE::m_start, EDA_RECT::Merge(), NormalizeAngleDegrees(), NormalizeAnglePos(), RAD2DECIDEG(), EDA_RECT::SetOrigin(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by EDA_SHAPE::getBoundingBox().

◆ continueEdit()

bool EDA_SHAPE::continueEdit ( const wxPoint &  aPosition)
protectedinherited

Definition at line 1264 of file eda_shape.cpp.

1265 {
1266  switch( GetShape() )
1267  {
1268  case SHAPE_T::ARC:
1269  case SHAPE_T::SEGMENT:
1270  case SHAPE_T::CIRCLE:
1271  case SHAPE_T::RECT:
1272  return false;
1273 
1274  case SHAPE_T::POLY:
1275  {
1276  SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
1277 
1278  // do not add zero-length segments
1279  if( poly.CPoint( poly.GetPointCount() - 2 ) != poly.CLastPoint() )
1280  poly.Append( aPosition, true );
1281  }
1282  return true;
1283 
1284  default:
1286  return false;
1287  }
1288 }
virtual size_t GetPointCount() const override
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
SHAPE_LINE_CHAIN & Outline(int aIndex)
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
const VECTOR2I & CLastPoint() const
Return the last point in the line chain.
SHAPE_T GetShape() const
Definition: eda_shape.h:101

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

Referenced by LIB_SHAPE::ContinueEdit().

◆ DeleteStructure()

void BOARD_ITEM::DeleteStructure ( )
inherited

Delete this object after removing from its parent if it has one.

Definition at line 128 of file board_item.cpp.

129 {
130  BOARD_ITEM_CONTAINER* parent = GetParent();
131 
132  if( parent )
133  parent->Remove( this );
134 
135  delete this;
136 }
virtual void Remove(BOARD_ITEM *aItem, REMOVE_MODE aMode=REMOVE_MODE::NORMAL)=0
Removes an item from the container.
Abstract interface for BOARD_ITEMs capable of storing other items inside.
BOARD_ITEM_CONTAINER * GetParent() const
Definition: board_item.h:136

References BOARD_ITEM::GetParent(), and BOARD_ITEM_CONTAINER::Remove().

Referenced by BOARD::PadDelete(), and DIALOG_FOOTPRINT_PROPERTIES::TransferDataFromWindow().

◆ Duplicate()

BOARD_ITEM * BOARD_ITEM::Duplicate ( ) const
virtualinherited

Create a copy of this BOARD_ITEM.

Reimplemented in FOOTPRINT.

Definition at line 144 of file board_item.cpp.

145 {
146  BOARD_ITEM* dupe = static_cast<BOARD_ITEM*>( Clone() );
147  const_cast<KIID&>( dupe->m_Uuid ) = KIID();
148 
149  if( dupe->GetParentGroup() )
150  dupe->GetParentGroup()->AddItem( dupe );
151 
152  return static_cast<BOARD_ITEM*>( dupe );
153 }
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:60
bool AddItem(BOARD_ITEM *aItem)
Add item to group.
Definition: pcb_group.cpp:39
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:49
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
Definition: eda_item.cpp:83
Definition: kiid.h:44
const KIID m_Uuid
Definition: eda_item.h:474

References PCB_GROUP::AddItem(), EDA_ITEM::Clone(), BOARD_ITEM::GetParentGroup(), and EDA_ITEM::m_Uuid.

Referenced by CADSTAR_PCB_ARCHIVE_LOADER::addAttribute(), BOOST_AUTO_TEST_CASE(), PCB_GROUP::DeepDuplicate(), KIGFX::PCB_PAINTER::draw(), CADSTAR_PCB_ARCHIVE_LOADER::drawCadstarText(), EDIT_TOOL::Duplicate(), FOOTPRINT::Duplicate(), and ARRAY_CREATOR::Invoke().

◆ DupPolyPointsList()

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

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

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

Definition at line 1193 of file eda_shape.cpp.

1194 {
1195  if( m_poly.OutlineCount() )
1196  {
1197  int pointCount = m_poly.COutline( 0 ).PointCount();
1198 
1199  if( pointCount )
1200  {
1201  aBuffer.reserve( pointCount );
1202 
1203  for ( auto iter = m_poly.CIterate(); iter; iter++ )
1204  aBuffer.emplace_back( iter->x, iter->y );
1205  }
1206  }
1207 }
int OutlineCount() const
Return the number of vertices in a given outline/hole.
int PointCount() const
Return the number of points (vertices) in this line chain.
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
CONST_ITERATOR CIterate(int aFirst, int aLast, bool aIterateHoles=false) const
const SHAPE_LINE_CHAIN & COutline(int aIndex) const

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

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

◆ endEdit()

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

Finishes editing the shape.

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

Definition at line 1416 of file eda_shape.cpp.

1417 {
1418  switch( GetShape() )
1419  {
1420  case SHAPE_T::ARC:
1421  case SHAPE_T::SEGMENT:
1422  case SHAPE_T::CIRCLE:
1423  case SHAPE_T::RECT:
1424  break;
1425 
1426  case SHAPE_T::POLY:
1427  {
1428  SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
1429 
1430  // do not include last point twice
1431  if( poly.GetPointCount() > 2 )
1432  {
1433  if( poly.CPoint( poly.GetPointCount() - 2 ) == poly.CLastPoint() )
1434  {
1435  poly.SetClosed( aClosed );
1436  poly.Remove( poly.GetPointCount() - 1 );
1437  }
1438  }
1439  }
1440  break;
1441 
1442  default:
1444  }
1445 }
virtual size_t GetPointCount() const override
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
SHAPE_LINE_CHAIN & Outline(int aIndex)
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
void Remove(int aStartIndex, int aEndIndex)
Remove the range of points [start_index, end_index] from the line chain.
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
const VECTOR2I & CLastPoint() const
Return the last point in the line chain.
SHAPE_T GetShape() const
Definition: eda_shape.h:101

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

Referenced by LIB_SHAPE::EndEdit().

◆ EndsSwapped()

bool EDA_SHAPE::EndsSwapped ( ) const
inlineinherited

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

Returns
true if they have

Definition at line 175 of file eda_shape.h.

175 { return m_endsSwapped; }
bool m_endsSwapped
Definition: eda_shape.h:318

References EDA_SHAPE::m_endsSwapped.

Referenced by CADSTAR_PCB_ARCHIVE_LOADER::makeTracksFromShapes().

◆ Flip() [1/2]

void FP_SHAPE::Flip ( const wxPoint &  aCentre,
bool  aFlipLeftRight 
)
overridevirtual

Flip entity relative to aCentre.

The item is mirrored, and layer changed to the paired corresponding layer if it is on a paired layer. This function should be called only from FOOTPRINT::Flip because it is not usual to flip an item alone, without flipping the parent footprint (consider Mirror() instead).

Reimplemented from PCB_SHAPE.

Definition at line 217 of file fp_shape.cpp.

218 {
219  wxPoint pt( 0, 0 );
220 
221  switch( GetShape() )
222  {
223  case SHAPE_T::ARC:
224  case SHAPE_T::SEGMENT:
225  case SHAPE_T::RECT:
226  case SHAPE_T::CIRCLE:
227  case SHAPE_T::BEZIER:
228  // If Start0 and Start are equal (ie: Footprint Editor), then flip both sets around the
229  // centre point.
230  if( m_start == m_start0 )
231  pt = aCentre;
232 
233  if( aFlipLeftRight )
234  {
235  MIRROR( m_start.x, aCentre.x );
236  MIRROR( m_end.x, aCentre.x );
237  MIRROR( m_arcCenter.x, aCentre.x );
238  MIRROR( m_bezierC1.x, aCentre.x );
239  MIRROR( m_bezierC2.x, aCentre.x );
240  MIRROR( m_start0.x, pt.x );
241  MIRROR( m_end0.x, pt.x );
242  MIRROR( m_arcCenter0.x, pt.x );
243  MIRROR( m_bezierC1_0.x, pt.x );
244  MIRROR( m_bezierC2_0.x, pt.x );
245  }
246  else
247  {
248  MIRROR( m_start.y, aCentre.y );
249  MIRROR( m_end.y, aCentre.y );
250  MIRROR( m_arcCenter.y, aCentre.y );
251  MIRROR( m_bezierC1.y, aCentre.y );
252  MIRROR( m_bezierC2.y, aCentre.y );
253  MIRROR( m_start0.y, pt.y );
254  MIRROR( m_end0.y, pt.y );
255  MIRROR( m_arcCenter0.y, pt.y );
256  MIRROR( m_bezierC1_0.y, pt.y );
257  MIRROR( m_bezierC2_0.y, pt.y );
258  }
259 
260  if( GetShape() == SHAPE_T::BEZIER )
262 
263  if( GetShape() == SHAPE_T::ARC )
264  {
265  std::swap( m_start, m_end );
266  std::swap( m_start0, m_end0 );
267  }
268 
269  break;
270 
271  case SHAPE_T::POLY:
272  // polygon corners coordinates are relative to the footprint position, orientation 0
273  m_poly.Mirror( aFlipLeftRight, !aFlipLeftRight );
274  break;
275 
276  default:
278  }
279 
280  SetLayer( FlipLayer( GetLayer(), GetBoard()->GetCopperLayerCount() ) );
281 }
wxPoint m_bezierC1
Definition: eda_shape.h:328
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:164
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayerId, int aCopperLayersCount)
Definition: lset.cpp:530
wxPoint m_arcCenter0
Center of arc, relative to footprint origin, orient 0.
Definition: fp_shape.h:165
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_arcCenter
Definition: eda_shape.h:325
void Mirror(bool aX=true, bool aY=false, const VECTOR2I &aRef={ 0, 0 })
Mirror the line points about y or x (or both)
wxPoint m_end0
End point or circle edge, relative to footprint origin, orient 0.
Definition: fp_shape.h:164
void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
Definition: mirror.h:40
wxPoint m_bezierC2
Definition: eda_shape.h:329
wxPoint m_bezierC2_0
Bezier Control Point 2, relative to footprint origin, orient 0.
Definition: fp_shape.h:167
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
wxPoint m_start
Definition: eda_shape.h:322
void RebuildBezierToSegmentsPointsList(int aMinSegLen)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
Definition: eda_shape.cpp:366
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:36
SHAPE_T GetShape() const
Definition: eda_shape.h:101
wxPoint m_start0
Start point or circle center, relative to footprint origin, orient 0.
Definition: fp_shape.h:163
int m_width
Definition: eda_shape.h:320
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:143
wxPoint m_bezierC1_0
Bezier Control Point 1, relative to footprint origin, orient 0.
Definition: fp_shape.h:166

References ARC, BEZIER, CIRCLE, FlipLayer(), BOARD_ITEM::GetBoard(), BOARD_ITEM::GetLayer(), EDA_SHAPE::GetShape(), EDA_SHAPE::m_arcCenter, m_arcCenter0, EDA_SHAPE::m_bezierC1, m_bezierC1_0, EDA_SHAPE::m_bezierC2, m_bezierC2_0, EDA_SHAPE::m_end, m_end0, EDA_SHAPE::m_poly, EDA_SHAPE::m_start, m_start0, EDA_SHAPE::m_width, MIRROR(), SHAPE_POLY_SET::Mirror(), POLY, EDA_SHAPE::RebuildBezierToSegmentsPointsList(), RECT, SEGMENT, BOARD_ITEM::SetLayer(), EDA_SHAPE::SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

◆ Flip() [2/2]

void BOARD_ITEM::Flip ( const VECTOR2I aCentre,
bool  aFlipLeftRight 
)
inlineinherited

Definition at line 264 of file board_item.h.

265  {
266  Flip( wxPoint( aCentre.x, aCentre.y ), aFlipLeftRight );
267  }
virtual void Flip(const wxPoint &aCentre, bool aFlipLeftRight)
Flip this object, i.e.
Definition: board_item.cpp:208

References BOARD_ITEM::Flip(), VECTOR2< T >::x, and VECTOR2< T >::y.

◆ flip()

void EDA_SHAPE::flip ( const wxPoint &  aCentre,
bool  aFlipLeftRight 
)
protectedinherited

Definition at line 281 of file eda_shape.cpp.

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

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

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

◆ Get() [1/3]

wxAny INSPECTABLE::Get ( PROPERTY_BASE aProperty)
inlineinherited

Definition at line 86 of file inspectable.h.

87  {
89  TYPE_ID thisType = TYPE_HASH( *this );
90  void* object = propMgr.TypeCast( this, thisType, aProperty->OwnerHash() );
91  return object ? aProperty->getter( object ) : wxAny();
92  }
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:65
#define TYPE_HASH(x)
Definition: property.h:59
size_t TYPE_ID
Unique type identifier.
Definition: property_mgr.h:42
const void * TypeCast(const void *aSource, TYPE_ID aBase, TYPE_ID aTarget) const
Cast a type to another type.
virtual wxAny getter(void *aObject) const =0
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:62
virtual size_t OwnerHash() const =0
Return type-id of the Owner class.

References PROPERTY_BASE::getter(), PROPERTY_MANAGER::Instance(), PROPERTY_BASE::OwnerHash(), TYPE_HASH, and PROPERTY_MANAGER::TypeCast().

Referenced by BOOST_AUTO_TEST_CASE(), CLASS_D_DESC::CLASS_D_DESC(), PCB_EXPR_VAR_REF::GetValue(), and PAD_DESC::PAD_DESC().

◆ Get() [2/3]

template<typename T >
T INSPECTABLE::Get ( PROPERTY_BASE aProperty)
inlineinherited

Definition at line 95 of file inspectable.h.

96  {
98  TYPE_ID thisType = TYPE_HASH( *this );
99  void* object = propMgr.TypeCast( this, thisType, aProperty->OwnerHash() );
100  return object ? aProperty->get<T>( object ) : T();
101  }
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:65
#define TYPE_HASH(x)
Definition: property.h:59
size_t TYPE_ID
Unique type identifier.
Definition: property_mgr.h:42
const void * TypeCast(const void *aSource, TYPE_ID aBase, TYPE_ID aTarget) const
Cast a type to another type.
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:62
T get(void *aObject)
Definition: property.h:268
virtual size_t OwnerHash() const =0
Return type-id of the Owner class.

References PROPERTY_BASE::get(), PROPERTY_MANAGER::Instance(), PROPERTY_BASE::OwnerHash(), TYPE_HASH, and PROPERTY_MANAGER::TypeCast().

◆ Get() [3/3]

template<typename T >
boost::optional<T> INSPECTABLE::Get ( const wxString &  aProperty)
inlineinherited

Definition at line 104 of file inspectable.h.

105  {
107  TYPE_ID thisType = TYPE_HASH( *this );
108  PROPERTY_BASE* prop = propMgr.GetProperty( thisType, aProperty );
109  boost::optional<T> ret = T();
110 
111  if( prop )
112  {
113  void* object = propMgr.TypeCast( this, thisType, prop->OwnerHash() );
114 
115  if( object )
116  ret = prop->get<T>( object );
117  }
118 
119  return ret;
120  }
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:65
#define TYPE_HASH(x)
Definition: property.h:59
size_t TYPE_ID
Unique type identifier.
Definition: property_mgr.h:42
const void * TypeCast(const void *aSource, TYPE_ID aBase, TYPE_ID aTarget) const
Cast a type to another type.
PROPERTY_BASE * GetProperty(TYPE_ID aType, const wxString &aProperty) const
Return a property for a specific type.
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:62
T get(void *aObject)
Definition: property.h:268
virtual size_t OwnerHash() const =0
Return type-id of the Owner class.

References PROPERTY_BASE::get(), PROPERTY_MANAGER::GetProperty(), PROPERTY_MANAGER::Instance(), PROPERTY_BASE::OwnerHash(), TYPE_HASH, and PROPERTY_MANAGER::TypeCast().

◆ GetArcAngle()

double EDA_SHAPE::GetArcAngle ( ) const
inherited

◆ GetArcMid()

wxPoint EDA_SHAPE::GetArcMid ( ) const
inherited

Definition at line 437 of file eda_shape.cpp.

438 {
439  // If none of the input data have changed since we loaded the arc,
440  // keep the original mid point data to minimize churn
443  return m_arcMidData.mid;
444 
445  wxPoint mid = m_start;
446  RotatePoint( &mid, m_arcCenter, -GetArcAngle() / 2.0 );
447  return mid;
448 }
double GetArcAngle() const
Definition: eda_shape.cpp:536
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:229
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_arcCenter
Definition: eda_shape.h:325
wxPoint m_start
Definition: eda_shape.h:322
wxPoint mid
Definition: eda_shape.h:65
wxPoint start
Definition: eda_shape.h:66
wxPoint center
Definition: eda_shape.h:68
wxPoint end
Definition: eda_shape.h:67
ARC_MID m_arcMidData
Definition: eda_shape.h:326

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

Referenced by PCB_GRID_HELPER::computeAnchors(), CONVERT_TOOL::CreateLines(), PCB_POINT_EDITOR::editArcMidKeepEndpoints(), PCB_PLUGIN::format(), formatArc(), PCB_SHAPE::GetFocusPosition(), PCB_POINT_EDITOR::makePoints(), CONVERT_TOOL::makePolysFromSegs(), EDA_SHAPE::SetArcGeometry(), EDA_SHAPE::TransformShapeWithClearanceToPolygon(), and PCB_POINT_EDITOR::updatePoints().

◆ GetArcMid0()

wxPoint FP_SHAPE::GetArcMid0 ( ) const

Definition at line 180 of file fp_shape.cpp.

181 {
182  // If none of the input data have changed since we loaded the arc,
183  // keep the original mid point data to minimize churn
186  return m_arcMidData_0.mid;
187 
188  wxPoint mid0 = m_start0;
189  RotatePoint( &mid0, m_arcCenter0, -GetArcAngle() / 2.0 );
190  return mid0;
191 }
double GetArcAngle() const
Definition: eda_shape.cpp:536
ARC_MID m_arcMidData_0
Originating Arc data, orient 0.
Definition: fp_shape.h:169
wxPoint m_arcCenter0
Center of arc, relative to footprint origin, orient 0.
Definition: fp_shape.h:165
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:229
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_arcCenter
Definition: eda_shape.h:325
wxPoint m_start
Definition: eda_shape.h:322
wxPoint mid
Definition: eda_shape.h:65
wxPoint start
Definition: eda_shape.h:66
wxPoint center
Definition: eda_shape.h:68
wxPoint end
Definition: eda_shape.h:67
wxPoint m_start0
Start point or circle center, relative to footprint origin, orient 0.
Definition: fp_shape.h:163

References ARC_MID::center, ARC_MID::end, EDA_SHAPE::GetArcAngle(), EDA_SHAPE::m_arcCenter, m_arcCenter0, m_arcMidData_0, EDA_SHAPE::m_end, EDA_SHAPE::m_start, m_start0, ARC_MID::mid, RotatePoint(), and ARC_MID::start.

Referenced by PCB_PLUGIN::format(), and CADSTAR_PCB_ARCHIVE_LOADER::makeTracksFromShapes().

◆ GetBezierC1()

◆ GetBezierC1_0()

const wxPoint& FP_SHAPE::GetBezierC1_0 ( ) const
inline

Definition at line 118 of file fp_shape.h.

118 { return m_bezierC1_0; }
wxPoint m_bezierC1_0
Bezier Control Point 1, relative to footprint origin, orient 0.
Definition: fp_shape.h:166

References m_bezierC1_0.

Referenced by PCB_PLUGIN::format().

◆ GetBezierC2()

◆ GetBezierC2_0()

const wxPoint& FP_SHAPE::GetBezierC2_0 ( ) const
inline

Definition at line 121 of file fp_shape.h.

121 { return m_bezierC2_0; }
wxPoint m_bezierC2_0
Bezier Control Point 2, relative to footprint origin, orient 0.
Definition: fp_shape.h:167

References m_bezierC2_0.

Referenced by PCB_PLUGIN::format().

◆ GetBezierPoints()

const std::vector<wxPoint>& EDA_SHAPE::GetBezierPoints ( ) const
inlineinherited

◆ GetBoard() [1/2]

const BOARD * BOARD_ITEM::GetBoard ( ) const
virtualinherited

Return the BOARD in which this BOARD_ITEM resides, or NULL if none.

Definition at line 36 of file board_item.cpp.

37 {
38  if( Type() == PCB_T )
39  return static_cast<const BOARD*>( this );
40 
41  BOARD_ITEM* parent = GetParent();
42 
43  if( parent )
44  return parent->GetBoard();
45 
46  return nullptr;
47 }
Definition: typeinfo.h:84
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:49
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:36
BOARD_ITEM_CONTAINER * GetParent() const
Definition: board_item.h:136
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112

References BOARD_ITEM::GetBoard(), BOARD_ITEM::GetParent(), PCB_T, and EDA_ITEM::Type().

Referenced by ZONE_FILLER::addHoleKnockout(), PAD::BuildEffectivePolygon(), PAD::BuildEffectiveShapes(), ZONE::BuildSmoothedPoly(), calcIsInsideArea(), KIGFX::PCB_PAINTER::Draw(), KIGFX::PCB_PAINTER::draw(), PCB_LAYER_VALUE::EqualTo(), existsOnLayer(), exprFromTo(), PCB_VIA::FlashLayer(), PAD::FlashLayer(), PCB_TARGET::Flip(), PCB_TEXT::Flip(), PCB_TRACK::Flip(), Flip(), PCB_SHAPE::Flip(), FP_TEXT::Flip(), PCB_DIMENSION_BASE::Flip(), PCB_ARC::Flip(), PCB_VIA::Flip(), ZONE::Flip(), PCB_EXPR_CONTEXT::GetBoard(), BOARD_ITEM::GetBoard(), FOOTPRINT::GetBoundingBox(), FOOTPRINT::GetBoundingHull(), BOARD_CONNECTED_ITEM::GetEffectiveNetclass(), PAD::GetEffectiveShape(), PCB_VIA::GetEffectiveShape(), ZONE::GetInteractingZones(), BOARD_ITEM::GetLayerName(), PCB_VIA::GetMinAnnulus(), PCB_DRAW_PANEL_GAL::GetMsgPanelInfo(), ZONE::GetMsgPanelInfo(), NETINFO_ITEM::GetMsgPanelInfo(), PCB_TRACK::GetMsgPanelInfo(), PCB_TRACK::GetMsgPanelInfoBase_Common(), BOARD_CONNECTED_ITEM::GetNetClass(), BOARD_CONNECTED_ITEM::GetNetnameMsg(), BOARD_CONNECTED_ITEM::GetOwnClearance(), ZONE::GetSelectMenuText(), DRC_ENGINE::GetShape(), FP_TEXT::GetShownText(), PAD::GetSolderMaskMargin(), PAD::GetSolderPasteMargin(), BOARD::GetTrackLength(), inDiffPair(), insideArea(), insideBackCourtyard(), insideCourtyard(), insideFrontCourtyard(), isInsideArea(), isInsideCourtyard(), BOARD_ITEM::IsLocked(), BOARD_ITEM::layerMaskDescribe(), PCB_VIA::layerMaskDescribe(), CONVERT_TOOL::makePolysFromCircles(), PAD::MergePrimitivesAsPolygon(), EAGLE_PLUGIN::packageWire(), PCB_BASE_EDIT_FRAME::PutDataInPreviousState(), BOARD::ResolveDRCExclusions(), BOARD_CONNECTED_ITEM::SetNetCode(), DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::TransferDataToWindow(), DIALOG_FOOTPRINT_PROPERTIES::TransferDataToWindow(), ZONE::TransformSmoothedOutlineToPolygon(), ZONE::TransformSolidAreasShapesToPolygon(), PCB_TRACK::ViewBBox(), FOOTPRINT::ViewBBox(), PCB_VIA::ViewGetLOD(), and PAD::ViewGetLOD().

◆ GetBoard() [2/2]

BOARD * BOARD_ITEM::GetBoard ( )
virtualinherited

Definition at line 50 of file board_item.cpp.

51 {
52  if( Type() == PCB_T )
53  return static_cast<BOARD*>( this );
54 
55  BOARD_ITEM* parent = GetParent();
56 
57  if( parent )
58  return parent->GetBoard();
59 
60  return nullptr;
61 }
Definition: typeinfo.h:84
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:49
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:36
BOARD_ITEM_CONTAINER * GetParent() const
Definition: board_item.h:136
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112

References BOARD_ITEM::GetBoard(), BOARD_ITEM::GetParent(), PCB_T, and EDA_ITEM::Type().

◆ GetBoundingBox()

const EDA_RECT PCB_SHAPE::GetBoundingBox ( ) const
inlineoverridevirtualinherited

Return the orthogonal bounding box of this object for display purposes.

This box should be an enclosing perimeter for visible components of this object, and the units should be in the pcb or schematic coordinate system. It is OK to overestimate the size by a few counts.

Reimplemented from EDA_ITEM.

Definition at line 102 of file pcb_shape.h.

102 { return getBoundingBox(); }
const EDA_RECT getBoundingBox() const
Definition: eda_shape.cpp:634

References EDA_SHAPE::getBoundingBox().

Referenced by BOARD_ADAPTER::addShapeWithClearance().

◆ getBoundingBox()

const EDA_RECT EDA_SHAPE::getBoundingBox ( ) const
protectedinherited

Definition at line 634 of file eda_shape.cpp.

635 {
636  EDA_RECT bbox;
637 
638  switch( m_shape )
639  {
640  case SHAPE_T::RECT:
641  for( wxPoint& pt : GetRectCorners() )
642  bbox.Merge( pt );
643 
644  break;
645 
646  case SHAPE_T::SEGMENT:
647  bbox.SetOrigin( GetStart() );
648  bbox.SetEnd( GetEnd() );
649  break;
650 
651  case SHAPE_T::CIRCLE:
652  bbox.SetOrigin( GetStart() );
653  bbox.Inflate( GetRadius() );
654  break;
655 
656  case SHAPE_T::ARC:
657  computeArcBBox( bbox );
658  break;
659 
660  case SHAPE_T::POLY:
661  if( m_poly.IsEmpty() )
662  break;
663 
664  for( auto iter = m_poly.CIterate(); iter; iter++ )
665  {
666  wxPoint pt( iter->x, iter->y );
667 
669  pt += getParentPosition();
670 
671  bbox.Merge( pt );
672  }
673 
674  break;
675 
676  case SHAPE_T::BEZIER:
677  bbox.SetOrigin( GetStart() );
678  bbox.Merge( GetBezierC1() );
679  bbox.Merge( GetBezierC2() );
680  bbox.Merge( GetEnd() );
681  break;
682 
683  default:
685  break;
686  }
687 
688  bbox.Inflate( std::max( 0, m_width / 2 ) );
689  bbox.Normalize();
690 
691  return bbox;
692 }
SHAPE_T m_shape
Definition: eda_shape.h:319
void Merge(const EDA_RECT &aRect)
Modify the position and size of the rectangle in order to contain aRect.
Definition: eda_rect.cpp:432
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:106
bool IsEmpty() const
void computeArcBBox(EDA_RECT &aBBox) const
Definition: eda_shape.cpp:1017
virtual wxPoint getParentPosition() const =0
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:130
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:229
const wxPoint & GetBezierC1() const
Definition: eda_shape.h:154
std::vector< wxPoint > GetRectCorners() const
Definition: eda_shape.cpp:981
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:131
void SetEnd(int x, int y)
Definition: eda_rect.h:191
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
const wxPoint & GetBezierC2() const
Definition: eda_shape.h:157
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
CONST_ITERATOR CIterate(int aFirst, int aLast, bool aIterateHoles=false) const
void Normalize()
Ensures that the height ant width are positive.
Definition: eda_rect.cpp:35
virtual double getParentOrientation() const =0
Handle the component boundary box.
Definition: eda_rect.h:42
int m_width
Definition: eda_shape.h:320
int GetRadius() const
Definition: eda_shape.cpp:472
EDA_RECT & Inflate(wxCoord dx, wxCoord dy)
Inflate the rectangle horizontally by dx and vertically by dy.
Definition: eda_rect.cpp:364

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

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

◆ GetCenter()

◆ getCenter()

wxPoint EDA_SHAPE::getCenter ( ) const
inherited

Definition at line 393 of file eda_shape.cpp.

394 {
395  switch( m_shape )
396  {
397  case SHAPE_T::ARC:
398  return m_arcCenter;
399 
400  case SHAPE_T::CIRCLE:
401  return m_start;
402 
403  case SHAPE_T::SEGMENT:
404  // Midpoint of the line
405  return ( m_start + m_end ) / 2;
406 
407  case SHAPE_T::POLY:
408  case SHAPE_T::RECT:
409  case SHAPE_T::BEZIER:
410  return getBoundingBox().Centre();
411 
412  default:
414  return wxPoint();
415  }
416 }
SHAPE_T m_shape
Definition: eda_shape.h:319
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_arcCenter
Definition: eda_shape.h:325
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
wxPoint m_start
Definition: eda_shape.h:322
const EDA_RECT getBoundingBox() const
Definition: eda_shape.cpp:634
wxPoint Centre() const
Definition: eda_rect.h:64

References ARC, BEZIER, EDA_RECT::Centre(), CIRCLE, EDA_SHAPE::getBoundingBox(), EDA_SHAPE::m_arcCenter, EDA_SHAPE::m_end, EDA_SHAPE::m_shape, EDA_SHAPE::m_start, POLY, RECT, SEGMENT, EDA_SHAPE::SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by EDA_SHAPE::CalcArcAngles(), PCB_SHAPE::GetCenter(), LIB_SHAPE::GetCenter(), EDA_SHAPE::getPosition(), EDA_SHAPE::hitTest(), EDA_SHAPE::MakeEffectiveShapes(), LIB_SHAPE::Plot(), LIB_SHAPE::print(), and EDA_SHAPE::TransformShapeWithClearanceToPolygon().

◆ GetCenter0()

wxPoint FP_SHAPE::GetCenter0 ( ) const

Definition at line 145 of file fp_shape.cpp.

146 {
147  switch( m_shape )
148  {
149  case SHAPE_T::ARC:
150  return m_arcCenter0;
151 
152  case SHAPE_T::CIRCLE:
153  return m_start0;
154 
155  default:
157  return wxPoint();
158  }
159 }
SHAPE_T m_shape
Definition: eda_shape.h:319
wxPoint m_arcCenter0
Center of arc, relative to footprint origin, orient 0.
Definition: fp_shape.h:165
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
wxPoint m_start0
Start point or circle center, relative to footprint origin, orient 0.
Definition: fp_shape.h:163

References ARC, CIRCLE, m_arcCenter0, EDA_SHAPE::m_shape, m_start0, EDA_SHAPE::SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by FootprintWriteShape(), CADSTAR_PCB_ARCHIVE_LOADER::getLineChainFromShapes(), hash_fp_item(), and DSN::SPECCTRA_DB::makeIMAGE().

◆ GetClass()

wxString FP_SHAPE::GetClass ( ) const
inlineoverridevirtual

Return the class name.

Implements EDA_ITEM.

Definition at line 143 of file fp_shape.h.

144  {
145  return wxT( "MGRAPHIC" );
146  }

◆ GetEditFlags()

EDA_ITEM_FLAGS EDA_ITEM::GetEditFlags ( ) const
inlineinherited

Definition at line 157 of file eda_item.h.

158  {
159  constexpr int mask = ( IS_NEW | IS_PASTED | IS_MOVING | IS_RESIZING | IS_DRAGGING
161 
162  return m_flags & mask;
163  }
#define IS_NEW
New item, just created.
#define IS_RESIZING
Item being resized.
#define IS_DRAGGING
Item being dragged.
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:480
#define IS_PASTED
Modifier on IS_NEW which indicates it came from clipboard.
#define IS_MOVING
Item being moved.
#define STRUCT_DELETED
flag indication structures to be erased
#define IS_WIRE_IMAGE
Item to be drawn as wireframe while editing.

References IS_DRAGGING, IS_MOVING, IS_NEW, IS_PASTED, IS_RESIZING, IS_WIRE_IMAGE, EDA_ITEM::m_flags, and STRUCT_DELETED.

Referenced by EDA_ITEM::ClearEditFlags(), SCH_EDIT_FRAME::DeleteJunction(), SCH_EDIT_TOOL::editFieldText(), SYMBOL_EDITOR_PIN_TOOL::EditPinProperties(), SCH_EDITOR_CONTROL::EditWithSymbolEditor(), SCH_SYMBOL::GetMsgPanelInfo(), SELECTION_CONDITIONS::Idle(), SELECTION_CONDITIONS::IdleSelection(), SYMBOL_EDITOR_MOVE_TOOL::Main(), PCB_POINT_EDITOR::OnSelectionChange(), SYMBOL_EDITOR_EDIT_TOOL::Properties(), SCH_EDIT_TOOL::Properties(), PAD_TOOL::recombinePad(), SCH_EDIT_FRAME::SchematicCleanUp(), SCH_EDIT_FRAME::SelectUnit(), DIALOG_DIMENSION_PROPERTIES::TransferDataFromWindow(), DIALOG_TARGET_PROPERTIES::TransferDataFromWindow(), DIALOG_TEXT_PROPERTIES::TransferDataFromWindow(), DIALOG_TEXT_AND_LABEL_PROPERTIES::TransferDataFromWindow(), DIALOG_FOOTPRINT_PROPERTIES::TransferDataFromWindow(), and DIALOG_SYMBOL_PROPERTIES::TransferDataFromWindow().

◆ GetEffectiveShape()

std::shared_ptr< SHAPE > PCB_SHAPE::GetEffectiveShape ( PCB_LAYER_ID  aLayer = UNDEFINED_LAYER,
FLASHING  aFlash = FLASHING::DEFAULT 
) const
overridevirtualinherited

Make a set of SHAPE objects representing the PCB_SHAPE.

Caller owns the objects.

Reimplemented from BOARD_ITEM.

Definition at line 192 of file pcb_shape.cpp.

193 {
194  return std::make_shared<SHAPE_COMPOUND>( MakeEffectiveShapes() );
195 }
std::vector< SHAPE * > MakeEffectiveShapes() const
Make a set of SHAPE objects representing the EDA_SHAPE.
Definition: eda_shape.cpp:1095

References EDA_SHAPE::MakeEffectiveShapes().

◆ GetEnd()

const wxPoint& EDA_SHAPE::GetEnd ( ) const
inlineinherited

Return the ending point of the graphic.

Definition at line 131 of file eda_shape.h.

131 { return m_end; }
wxPoint m_end
Definition: eda_shape.h:323

References EDA_SHAPE::m_end.

Referenced by PCB_POINT_EDITOR::addCorner(), BOARD_ADAPTER::addShapeWithClearance(), GRAPHICS_CLEANER::areEquivalent(), LIB_SHAPE::CalcArcAngles(), EDA_SHAPE::CalcArcAngles(), EDA_SHAPE::calcEdit(), PCB_GRID_HELPER::computeAnchors(), ConvertOutlineToPolygon(), CreateBoardSection(), CONVERT_TOOL::CreateLines(), MICROWAVE_TOOL::createMicrowaveInductor(), CONVERT_TOOL::CreatePolys(), KIGFX::SCH_PAINTER::draw(), KIGFX::PCB_PAINTER::draw(), PCB_POINT_EDITOR::editArcEndpointKeepTangent(), PCB_PLUGIN::format(), formatArc(), formatBezier(), formatRect(), EDA_SHAPE::getBoundingBox(), EDA_SHAPE::GetLength(), EDA_SHAPE::GetRectCorners(), CADSTAR_SCH_ARCHIVE_LOADER::getScaledLibPart(), CONVERT_TOOL::getStartEndPoints(), hash_fp_item(), EDA_SHAPE::hitTest(), idf_export_outline(), GRAPHICS_CLEANER::isNullShape(), SCH_LEGACY_PLUGIN_CACHE::loadArc(), SCH_EAGLE_PLUGIN::loadSymbolRectangle(), EDIT_POINTS_FACTORY::Make(), EDA_SHAPE::MakeEffectiveShapes(), DSN::SPECCTRA_DB::makeIMAGE(), PCB_POINT_EDITOR::makePoints(), CONVERT_TOOL::makePolysFromRects(), CONVERT_TOOL::makePolysFromSegs(), GRAPHICS_CLEANER::mergeRects(), PCB_PARSER::parsePAD(), BRDITEMS_PLOTTER::PlotFootprintGraphicItem(), BRDITEMS_PLOTTER::PlotPcbShape(), SCH_LEGACY_PLUGIN_CACHE::saveArc(), SCH_LEGACY_PLUGIN_CACHE::saveRectangle(), EDA_SHAPE::ShapeGetMsgPanelInfo(), AR_MATRIX::TraceSegmentPcb(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataToWindow(), DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataToWindow(), EDA_SHAPE::TransformShapeWithClearanceToPolygon(), EE_POINT_EDITOR::updatePoints(), and PCB_POINT_EDITOR::updatePoints().

◆ GetEnd0()

const wxPoint& FP_SHAPE::GetEnd0 ( ) const
inline

Definition at line 115 of file fp_shape.h.

115 { return m_end0; }
wxPoint m_end0
End point or circle edge, relative to footprint origin, orient 0.
Definition: fp_shape.h:164

References m_end0.

Referenced by FootprintWriteShape(), PCB_PLUGIN::format(), CADSTAR_PCB_ARCHIVE_LOADER::getLineChainFromShapes(), hash_fp_item(), DSN::SPECCTRA_DB::makeIMAGE(), and CADSTAR_PCB_ARCHIVE_LOADER::makeTracksFromShapes().

◆ GetEndX()

int EDA_SHAPE::GetEndX ( )
inlineinherited

Definition at line 133 of file eda_shape.h.

133 { return m_end.x; }
wxPoint m_end
Definition: eda_shape.h:323

References EDA_SHAPE::m_end.

Referenced by EDA_SHAPE_DESC::EDA_SHAPE_DESC(), PCB_SHAPE_DESC::PCB_SHAPE_DESC(), and DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run().

◆ GetEndY()

int EDA_SHAPE::GetEndY ( )
inlineinherited

Definition at line 132 of file eda_shape.h.

132 { return m_end.y; }
wxPoint m_end
Definition: eda_shape.h:323

References EDA_SHAPE::m_end.

Referenced by EDA_SHAPE_DESC::EDA_SHAPE_DESC(), PCB_SHAPE_DESC::PCB_SHAPE_DESC(), and DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run().

◆ GetFillType()

◆ GetFlags()

◆ GetFocusPosition()

const wxPoint PCB_SHAPE::GetFocusPosition ( ) const
overridevirtualinherited

Allows items to return their visual center rather than their anchor.

For some shapes this is similar to GetCenter(), but for unfilled shapes a point on the outline is better.

Reimplemented from EDA_ITEM.

Definition at line 55 of file pcb_shape.cpp.

56 {
57  // For some shapes return the visual center, but for not filled polygonal shapes,
58  // the center is usually far from the shape: a point on the outline is better
59 
60  switch( m_shape )
61  {
62  case SHAPE_T::CIRCLE:
63  if( !IsFilled() )
64  return wxPoint( GetCenter().x + GetRadius(), GetCenter().y );
65  else
66  return GetCenter();
67 
68  case SHAPE_T::RECT:
69  if( !IsFilled() )
70  return GetStart();
71  else
72  return GetCenter();
73 
74  case SHAPE_T::POLY:
75  if( !IsFilled() )
76  {
77  VECTOR2I pos = GetPolyShape().Outline(0).CPoint(0);
78  return wxPoint( pos.x, pos.y );
79  }
80  else
81  {
82  return GetCenter();
83  }
84 
85  case SHAPE_T::ARC:
86  return GetArcMid();
87 
88  case SHAPE_T::BEZIER:
89  return GetStart();
90 
91  default:
92  return GetCenter();
93  }
94 }
SHAPE_T m_shape
Definition: eda_shape.h:319
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:106
bool IsFilled() const
Definition: eda_shape.h:90
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
SHAPE_LINE_CHAIN & Outline(int aIndex)
wxPoint GetCenter() const override
This defaults to the center of the bounding box if not overridden.
Definition: pcb_shape.h:79
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:227
wxPoint GetArcMid() const
Definition: eda_shape.cpp:437
int GetRadius() const
Definition: eda_shape.cpp:472

References ARC, BEZIER, CIRCLE, SHAPE_LINE_CHAIN::CPoint(), EDA_SHAPE::GetArcMid(), PCB_SHAPE::GetCenter(), EDA_SHAPE::GetPolyShape(), EDA_SHAPE::GetRadius(), EDA_SHAPE::GetStart(), EDA_SHAPE::IsFilled(), EDA_SHAPE::m_shape, SHAPE_POLY_SET::Outline(), POLY, RECT, VECTOR2< T >::x, and VECTOR2< T >::y.

◆ GetLayer()

virtual PCB_LAYER_ID BOARD_ITEM::GetLayer ( ) const
inlinevirtualinherited

Return the primary layer this item is on.

Reimplemented in ZONE.

Definition at line 143 of file board_item.h.

143 { return m_layer; }
PCB_LAYER_ID m_layer
Definition: board_item.h:313

References BOARD_ITEM::m_layer.

Referenced by CN_LIST::Add(), BOARD_ADAPTER::addFootprintShapesWithClearance(), GRAPHICS_CLEANER::areEquivalent(), BOARD_CONNECTED_ITEM_DESC::BOARD_CONNECTED_ITEM_DESC(), BOARD_ITEM_DESC::BOARD_ITEM_DESC(), AR_AUTOPLACER::buildFpAreas(), TRACKS_CLEANER::cleanup(), CreateBoardSection(), MICROWAVE_TOOL::createMicrowaveInductor(), PCB_BASE_FRAME::CreateNewFootprint(), CreateRoutesSection(), DIALOG_DIMENSION_PROPERTIES::DIALOG_DIMENSION_PROPERTIES(), DIALOG_GRAPHIC_ITEM_PROPERTIES::DIALOG_GRAPHIC_ITEM_PROPERTIES(), DIALOG_TEXT_PROPERTIES::DIALOG_TEXT_PROPERTIES(), DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES(), EDIT_TOOL::DragArcTrack(), KIGFX::PCB_PAINTER::draw(), PCB_EDIT_FRAME::ExchangeFootprint(), EXPORTER_PCB_VRML::ExportVrmlFootprint(), extractDiffPairCoupledItems(), EDIT_TOOL::FilletTracks(), PCB_TARGET::Flip(), PCB_TEXT::Flip(), PCB_TRACK::Flip(), Flip(), PCB_SHAPE::Flip(), FP_TEXT::Flip(), PCB_DIMENSION_BASE::Flip(), FOOTPRINT::Flip(), PCB_ARC::Flip(), FOOTPRINT_DESC::FOOTPRINT_DESC(), PCB_PLUGIN::FootprintSave(), FootprintWriteShape(), PCB_PLUGIN::format(), PCB_PLUGIN::formatLayer(), FP_TEXT::FP_TEXT(), DSN::SPECCTRA_DB::FromBOARD(), AR_AUTOPLACER::genModuleOnRoutingMatrix(), FOOTPRINT::GetBoundingBox(), ZONE::GetLayer(), getMatchingTextItem(), PCB_TRACK::GetMsgPanelInfo(), PCB_VIA::GetMsgPanelInfo(), PAD::GetMsgPanelInfo(), AR_AUTOPLACER::getOptimalFPPlacement(), BOARD::GetPad(), PCB_SELECTION_TOOL::GuessSelectionCandidates(), idf_export_footprint(), GENERAL_COLLECTOR::Inspect(), BOARD_INSPECTION_TOOL::InspectClearance(), BOARD_INSPECTION_TOOL::InspectConstraints(), BOARD_INSPECTION_TOOL::InspectDRCError(), isEdge(), PAD::IsFlipped(), FOOTPRINT::IsFlipped(), PNS_KICAD_IFACE::IsItemVisible(), BOARD_ITEM::IsOnCopperLayer(), IsParentFlipped(), FP_TEXT::IsParentFlipped(), itemIsIncludedByFilter(), FOOTPRINT_EDIT_FRAME::LoadFootprintFromBoard(), CADSTAR_PCB_ARCHIVE_LOADER::makeTracksFromShapes(), DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::OnAddField(), DIALOG_FOOTPRINT_PROPERTIES::OnAddField(), DIALOG_FOOTPRINT_CHECKER::OnSelectItem(), PCB_SHAPE::cmp_drawings::operator()(), PCB_TRACK::cmp_tracks::operator()(), BOARD_ITEM::ptr_cmp::operator()(), FOOTPRINT::cmp_drawings::operator()(), BOARD::cmp_items::operator()(), BOARD::cmp_drawings::operator()(), EAGLE_PLUGIN::packagePad(), BRDITEMS_PLOTTER::PlotDimension(), BRDITEMS_PLOTTER::PlotFootprintGraphicItem(), BRDITEMS_PLOTTER::PlotFootprintGraphicItems(), BRDITEMS_PLOTTER::PlotFootprintTextItem(), BRDITEMS_PLOTTER::PlotFootprintTextItems(), BRDITEMS_PLOTTER::PlotPcbShape(), BRDITEMS_PLOTTER::PlotPcbTarget(), BRDITEMS_PLOTTER::PlotPcbText(), DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::processItem(), processTextItem(), PAD_TOOL::recombinePad(), CLIPBOARD_IO::SaveSelection(), CONVERT_TOOL::SegmentToArc(), PCB_SELECTION_TOOL::Selectable(), PCB_SELECTION_TOOL::selectConnectedTracks(), GLOBAL_EDIT_TOOL::swapBoardItem(), PNS_KICAD_IFACE_BASE::syncArc(), PNS_KICAD_IFACE_BASE::syncGraphicalItem(), PNS_KICAD_IFACE_BASE::syncTrack(), DRC_TEST_PROVIDER_EDGE_CLEARANCE::testAgainstEdge(), AR_AUTOPLACER::testFootprintOnBoard(), CONNECTIVITY_DATA::TestTrackEndpointDangling(), TRACK_VIA_DESC::TRACK_VIA_DESC(), DIALOG_FOOTPRINT_PROPERTIES::TransferDataFromWindow(), DIALOG_DIMENSION_PROPERTIES::TransferDataToWindow(), DIALOG_TEXT_PROPERTIES::TransferDataToWindow(), DIALOG_FOOTPRINT_PROPERTIES::TransferDataToWindow(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataToWindow(), DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::TransferDataToWindow(), BOARD_ADAPTER::transformFPShapesToPolygon(), FOOTPRINT::TransformFPShapesWithClearanceToPolygon(), PCB_TRACK::ViewGetLayers(), FP_TEXT::ViewGetLayers(), FP_TEXT::ViewGetLOD(), FP_ZONE::ViewGetLOD(), DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::visitItem(), and DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::visitItem().

◆ GetLayerName()

wxString BOARD_ITEM::GetLayerName ( ) const
inherited

Return the name of the PCB layer on which the item resides.

Returns
the layer name associated with this item.

Definition at line 75 of file board_item.cpp.

76 {
77  const BOARD* board = GetBoard();
78 
79  if( board )
80  return board->GetLayerName( m_layer );
81 
82  // If no parent, return standard name
84 }
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:362
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:191
PCB_LAYER_ID m_layer
Definition: board_item.h:313
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:36
static wxString GetStandardLayerName(PCB_LAYER_ID aLayerId)
Return an "English Standard" name of a PCB layer when given aLayerNumber.
Definition: board.h:606

References BOARD_ITEM::GetBoard(), BOARD::GetLayerName(), BOARD::GetStandardLayerName(), and BOARD_ITEM::m_layer.

Referenced by PCB_TEXT::GetMsgPanelInfo(), PCB_TARGET::GetMsgPanelInfo(), PCB_SHAPE::GetMsgPanelInfo(), FP_TEXT::GetMsgPanelInfo(), PCB_DIMENSION_BASE::GetMsgPanelInfo(), PCB_DIM_LEADER::GetMsgPanelInfo(), PCB_SHAPE::GetSelectMenuText(), PCB_TEXT::GetSelectMenuText(), GetSelectMenuText(), PCB_TRACK::GetSelectMenuText(), PCB_DIMENSION_BASE::GetSelectMenuText(), PCB_TEXT::GetShownText(), and FOOTPRINT::ResolveTextVar().

◆ GetLayerSet()

◆ GetLength()

double EDA_SHAPE::GetLength ( ) const
inherited

Return the length of the track using the hypotenuse calculation.

Returns
the length of the track

Definition at line 106 of file eda_shape.cpp.

107 {
108  double length = 0.0;
109 
110  switch( m_shape )
111  {
112  case SHAPE_T::BEZIER:
113  for( size_t ii = 1; ii < m_bezierPoints.size(); ++ii )
114  length += GetLineLength( m_bezierPoints[ ii - 1], m_bezierPoints[ii] );
115 
116  return length;
117 
118  case SHAPE_T::SEGMENT:
119  return GetLineLength( GetStart(), GetEnd() );
120 
121  case SHAPE_T::POLY:
122  for( int ii = 0; ii < m_poly.COutline( 0 ).SegmentCount(); ii++ )
123  length += m_poly.COutline( 0 ).CSegment( ii ).Length();
124 
125  return length;
126 
127  case SHAPE_T::ARC:
128  return 2 * M_PI * GetRadius() * ( GetArcAngle() / 3600.0 );
129 
130  default:
132  return 0.0;
133  }
134 }
int Length() const
Return the length (this).
Definition: seg.h:350
SHAPE_T m_shape
Definition: eda_shape.h:319
double GetLineLength(const wxPoint &aPointA, const wxPoint &aPointB)
Return the length of a line segment defined by aPointA and aPointB.
Definition: trigo.h:222
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:106
double GetArcAngle() const
Definition: eda_shape.cpp:536
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:131
std::vector< wxPoint > m_bezierPoints
Definition: eda_shape.h:331
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
int SegmentCount() const
Return the number of segments in this line chain.
const SEG CSegment(int aIndex) const
Return a constant copy of the aIndex segment in the line chain.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
int GetRadius() const
Definition: eda_shape.cpp:472

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

Referenced by EDA_SHAPE::ShapeGetMsgPanelInfo().

◆ GetMenuImage()

BITMAPS FP_SHAPE::GetMenuImage ( ) const
overridevirtual

Return a pointer to an image to be used in menus.

The default version returns the right arrow image. Override this function to provide object specific menu images.

Returns
The menu image associated with the item.

Reimplemented from PCB_SHAPE.

Definition at line 133 of file fp_shape.cpp.

134 {
135  return BITMAPS::show_mod_edge;
136 }

References show_mod_edge.

◆ GetMsgPanelInfo()

void FP_SHAPE::GetMsgPanelInfo ( EDA_DRAW_FRAME aFrame,
std::vector< MSG_PANEL_ITEM > &  aList 
)
overridevirtual

Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.

Parameters
aListis the list to populate.

Reimplemented from EDA_ITEM.

Definition at line 110 of file fp_shape.cpp.

111 {
112  if( aFrame->GetName() == PCB_EDIT_FRAME_NAME )
113  {
114  FOOTPRINT* fp = static_cast<FOOTPRINT*>( m_parent );
115 
116  if( fp )
117  aList.emplace_back( _( "Footprint" ), fp->GetReference() );
118  }
119 
120  // append the features shared with the base class
121  PCB_SHAPE::GetMsgPanelInfo( aFrame, aList );
122 }
EDA_ITEM * m_parent
Linked list: Link (parent struct)
Definition: eda_item.h:478
const wxString & GetReference() const
Definition: footprint.h:466
#define _(s)
#define PCB_EDIT_FRAME_NAME
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
Definition: pcb_shape.cpp:150

References _, PCB_SHAPE::GetMsgPanelInfo(), FOOTPRINT::GetReference(), EDA_ITEM::m_parent, and PCB_EDIT_FRAME_NAME.

◆ GetParent()

BOARD_ITEM_CONTAINER* BOARD_ITEM::GetParent ( void  ) const
inlineinherited

Definition at line 136 of file board_item.h.

136 { return (BOARD_ITEM_CONTAINER*) m_parent; }
EDA_ITEM * m_parent
Linked list: Link (parent struct)
Definition: eda_item.h:478
Abstract interface for BOARD_ITEMs capable of storing other items inside.

References EDA_ITEM::m_parent.

Referenced by PCB_POINT_EDITOR::addCorner(), ALIGN_DISTRIBUTE_TOOL::AlignBottom(), ALIGN_DISTRIBUTE_TOOL::AlignCenterX(), ALIGN_DISTRIBUTE_TOOL::AlignCenterY(), ALIGN_DISTRIBUTE_TOOL::AlignTop(), PNS_KICAD_IFACE::Commit(), EDIT_TOOL::copyToClipboard(), FOOTPRINT::CoverageRatio(), BOARD_ITEM::DeleteStructure(), ALIGN_DISTRIBUTE_TOOL::doAlignLeft(), ALIGN_DISTRIBUTE_TOOL::doAlignRight(), ALIGN_DISTRIBUTE_TOOL::doDistributeCentersHorizontally(), ALIGN_DISTRIBUTE_TOOL::doDistributeCentersVertically(), ALIGN_DISTRIBUTE_TOOL::doDistributeGapsHorizontally(), ALIGN_DISTRIBUTE_TOOL::doDistributeGapsVertically(), EDIT_TOOL::DragArcTrack(), KIGFX::PCB_PAINTER::draw(), EDIT_TOOL::Duplicate(), PCB_SELECTION_TOOL::FilterCollectorForFreePads(), PCB_SELECTION_TOOL::FilterCollectorForHierarchy(), PCB_PLUGIN::format(), FormatProbeItem(), BOARD_ITEM::GetBoard(), PCB_MARKER::GetColorLayer(), BOARD_ITEM::GetParentFootprint(), ALIGN_DISTRIBUTE_TOOL::GetSelections(), FP_TEXT::GetSelectMenuText(), PCB_TEXT::GetShownText(), FP_TEXT::GetShownText(), getTopLevelGroup(), GENERAL_COLLECTOR::Inspect(), ARRAY_CREATOR::Invoke(), isInsideArea(), DRC_ENGINE::IsNetTie(), IsParentFlipped(), FP_TEXT::IsParentFlipped(), PCB_SELECTION_TOOL::itemPassesFilter(), LEGACY_PLUGIN::loadMODULE_TEXT(), memberOf(), EDIT_TOOL::MoveExact(), ALTIUM_PCB::ParseTexts6Data(), BRDITEMS_PLOTTER::PlotFootprintGraphicItem(), BRDITEMS_PLOTTER::PlotFootprintTextItem(), POSITION_RELATIVE_TOOL::PositionRelative(), BOARD_COMMIT::Push(), DRC_TEST_PROVIDER_SILK_CLEARANCE::Run(), PCB_BASE_EDIT_FRAME::SaveCopyInUndoList(), CLIPBOARD_IO::SaveSelection(), PCB_SELECTION_TOOL::select(), PCB_SELECTION_TOOL::Selectable(), SwapItemData(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testPadAgainstItem(), DIALOG_TEXT_PROPERTIES::TransferDataToWindow(), PCB_MARKER::ViewGetLayers(), FP_ZONE::ViewGetLOD(), and DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::visitItem().

◆ GetParentAsString()

wxString FP_SHAPE::GetParentAsString ( ) const
inline

Definition at line 148 of file fp_shape.h.

148 { return m_parent->m_Uuid.AsString(); }
EDA_ITEM * m_parent
Linked list: Link (parent struct)
Definition: eda_item.h:478
wxString AsString() const
Definition: kiid.cpp:236
const KIID m_Uuid
Definition: eda_item.h:474

References KIID::AsString(), EDA_ITEM::m_parent, and EDA_ITEM::m_Uuid.

Referenced by FP_SHAPE_DESC::FP_SHAPE_DESC().

◆ GetParentFootprint()

FOOTPRINT * PCB_SHAPE::GetParentFootprint ( ) const
inherited

Return the parent footprint or NULL if PCB_SHAPE does not belong to a footprint.

Returns
the parent footprint or NULL.

Definition at line 123 of file pcb_shape.cpp.

124 {
125  if( !m_parent || m_parent->Type() != PCB_FOOTPRINT_T )
126  return nullptr;
127 
128  return (FOOTPRINT*) m_parent;
129 }
EDA_ITEM * m_parent
Linked list: Link (parent struct)
Definition: eda_item.h:478
class FOOTPRINT, a footprint
Definition: typeinfo.h:88
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112

References EDA_ITEM::m_parent, PCB_FOOTPRINT_T, and EDA_ITEM::Type().

Referenced by ConvertOutlineToPolygon(), KIGFX::PCB_PAINTER::draw(), PCB_SHAPE::getParentOrientation(), PCB_SHAPE::getParentPosition(), and BRDITEMS_PLOTTER::PlotFootprintGraphicItem().

◆ GetParentGroup()

◆ getParentOrientation()

double PCB_SHAPE::getParentOrientation ( ) const
overrideprotectedvirtualinherited

Implements EDA_SHAPE.

Definition at line 132 of file pcb_shape.cpp.

133 {
134  if( GetParentFootprint() )
136  else
137  return 0.0;
138 }
double GetOrientation() const
Definition: footprint.h:191
FOOTPRINT * GetParentFootprint() const
Return the parent footprint or NULL if PCB_SHAPE does not belong to a footprint.
Definition: pcb_shape.cpp:123

References FOOTPRINT::GetOrientation(), and PCB_SHAPE::GetParentFootprint().

◆ getParentPosition()

wxPoint PCB_SHAPE::getParentPosition ( ) const
overrideprotectedvirtualinherited

Implements EDA_SHAPE.

Definition at line 141 of file pcb_shape.cpp.

142 {
143  if( GetParentFootprint() )
144  return GetParentFootprint()->GetPosition();
145  else
146  return wxPoint( 0, 0 );
147 }
FOOTPRINT * GetParentFootprint() const
Return the parent footprint or NULL if PCB_SHAPE does not belong to a footprint.
Definition: pcb_shape.cpp:123
wxPoint GetPosition() const override
Definition: footprint.h:187

References PCB_SHAPE::GetParentFootprint(), and FOOTPRINT::GetPosition().

◆ GetPointCount()

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

Definition at line 1222 of file eda_shape.cpp.

1223 {
1224  // return the number of corners of the polygonal shape
1225  // this shape is expected to be only one polygon without hole
1226  if( GetPolyShape().OutlineCount() )
1227  return GetPolyShape().VertexCount( 0 );
1228 
1229  return 0;
1230 }
int VertexCount(int aOutline=-1, int aHole=-1) const
Return the number of points in the shape poly set.
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:227

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

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

◆ GetPolyShape() [1/2]

◆ GetPolyShape() [2/2]

const SHAPE_POLY_SET& EDA_SHAPE::GetPolyShape ( ) const
inlineinherited

Definition at line 228 of file eda_shape.h.

228 { return m_poly; }
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332

References EDA_SHAPE::m_poly.

◆ GetPosition()

wxPoint PCB_SHAPE::GetPosition ( ) const
inlineoverridevirtualinherited

Reimplemented from EDA_ITEM.

Definition at line 77 of file pcb_shape.h.

77 { return getPosition(); }
wxPoint getPosition() const
Definition: eda_shape.cpp:95

References EDA_SHAPE::getPosition().

Referenced by PCB_GRID_HELPER::computeAnchors(), CONVERT_TOOL::makePolysFromCircles(), and ALTIUM_PCB::Parse().

◆ getPosition()

wxPoint EDA_SHAPE::getPosition ( ) const
protectedinherited

Definition at line 95 of file eda_shape.cpp.

96 {
97  if( m_shape == SHAPE_T::ARC )
98  return getCenter();
99  else if( m_shape == SHAPE_T::POLY )
100  return (wxPoint) m_poly.CVertex( 0 );
101  else
102  return m_start;
103 }
SHAPE_T m_shape
Definition: eda_shape.h:319
wxPoint getCenter() const
Definition: eda_shape.cpp:393
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the aGlobalIndex-th vertex in the poly set.
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
wxPoint m_start
Definition: eda_shape.h:322

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

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

◆ GetRadius()

int EDA_SHAPE::GetRadius ( ) const
inherited

Definition at line 472 of file eda_shape.cpp.

473 {
474  double radius = 0.0;
475 
476  switch( m_shape )
477  {
478  case SHAPE_T::ARC:
479  radius = GetLineLength( m_arcCenter, m_start );
480  break;
481 
482  case SHAPE_T::CIRCLE:
483  radius = GetLineLength( m_start, m_end );
484  break;
485 
486  default:
488  }
489 
490  // don't allow degenerate circles/arcs
491  return std::max( 1, KiROUND( radius ) );
492 }
SHAPE_T m_shape
Definition: eda_shape.h:319
double GetLineLength(const wxPoint &aPointA, const wxPoint &aPointB)
Return the length of a line segment defined by aPointA and aPointB.
Definition: trigo.h:222
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_arcCenter
Definition: eda_shape.h:325
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
wxPoint m_start
Definition: eda_shape.h:322
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:73

References ARC, CIRCLE, GetLineLength(), KiROUND(), EDA_SHAPE::m_arcCenter, EDA_SHAPE::m_end, EDA_SHAPE::m_shape, EDA_SHAPE::m_start, EDA_SHAPE::SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by BOARD_ADAPTER::addShapeWithClearance(), EDA_SHAPE::calcEdit(), EDA_SHAPE::computeArcBBox(), ConvertOutlineToPolygon(), KIGFX::SCH_PAINTER::draw(), KIGFX::PCB_PAINTER::draw(), formatCircle(), EDA_SHAPE::getBoundingBox(), PCB_SHAPE::GetFocusPosition(), EDA_SHAPE::GetLength(), LIB_SHAPE::GetSelectMenuText(), hash_fp_item(), EDA_SHAPE::hitTest(), idf_export_outline(), GRAPHICS_CLEANER::isNullShape(), EDA_SHAPE::MakeEffectiveShapes(), DSN::SPECCTRA_DB::makeIMAGE(), CONVERT_TOOL::makePolysFromCircles(), ALTIUM_PCB::Parse(), PCB_PARSER::parsePAD(), LIB_SHAPE::Plot(), BRDITEMS_PLOTTER::PlotPcbShape(), LIB_SHAPE::print(), SCH_LEGACY_PLUGIN_CACHE::saveArc(), SCH_LEGACY_PLUGIN_CACHE::saveCircle(), EDA_SHAPE::scale(), EDA_SHAPE::ShapeGetMsgPanelInfo(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataToWindow(), DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataToWindow(), and EDA_SHAPE::TransformShapeWithClearanceToPolygon().

◆ GetRectCorners()

std::vector< wxPoint > EDA_SHAPE::GetRectCorners ( ) const
inherited

Definition at line 981 of file eda_shape.cpp.

982 {
983  std::vector<wxPoint> pts;
984  wxPoint topLeft = GetStart();
985  wxPoint botRight = GetEnd();
986 
987  // Un-rotate rect topLeft and botRight
988  if( KiROUND( getParentOrientation() ) % 900 != 0 )
989  {
990  topLeft -= getParentPosition();
991  RotatePoint( &topLeft, -getParentOrientation() );
992 
993  botRight -= getParentPosition();
994  RotatePoint( &botRight, -getParentOrientation() );
995  }
996 
997  // Set up the un-rotated 4 corners
998  pts.emplace_back( topLeft );
999  pts.emplace_back( botRight.x, topLeft.y );
1000  pts.emplace_back( botRight );
1001  pts.emplace_back( topLeft.x, botRight.y );
1002 
1003  // Now re-rotate the 4 corners to get a diamond
1004  if( KiROUND( getParentOrientation() ) % 900 != 0 )
1005  {
1006  for( wxPoint& pt : pts )
1007  {
1009  pt += getParentPosition();
1010  }
1011  }
1012 
1013  return pts;
1014 }
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:106
virtual wxPoint getParentPosition() const =0
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:229
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:131
virtual double getParentOrientation() const =0
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:73

References EDA_SHAPE::GetEnd(), EDA_SHAPE::getParentOrientation(), EDA_SHAPE::getParentPosition(), EDA_SHAPE::GetStart(), KiROUND(), and RotatePoint().

Referenced by BOARD_ADAPTER::addShapeWithClearance(), ConvertOutlineToPolygon(), KIGFX::PCB_PAINTER::draw(), EDA_SHAPE::getBoundingBox(), EDA_SHAPE::hitTest(), EDA_SHAPE::MakeEffectiveShapes(), BRDITEMS_PLOTTER::PlotFootprintGraphicItem(), BRDITEMS_PLOTTER::PlotPcbShape(), and EDA_SHAPE::TransformShapeWithClearanceToPolygon().

◆ GetSelectMenuText()

wxString FP_SHAPE::GetSelectMenuText ( EDA_UNITS  aUnits) const
overridevirtual

Return the text to display to be used in the selection clarification context menu when multiple items are found at the current cursor position.

The default version of this function raises an assertion in the debug mode and returns a string to indicate that it was not overridden to provide the object specific text.

Returns
The menu text string.

Reimplemented from PCB_SHAPE.

Definition at line 125 of file fp_shape.cpp.

126 {
127  return wxString::Format( _( "%s on %s" ),
128  ShowShape(),
129  GetLayerName() );
130 }
wxString ShowShape() const
Definition: eda_shape.cpp:56
#define _(s)
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
Definition: board_item.cpp:75

References _, Format(), BOARD_ITEM::GetLayerName(), and EDA_SHAPE::ShowShape().

◆ GetShape()

SHAPE_T EDA_SHAPE::GetShape ( ) const
inlineinherited

Definition at line 101 of file eda_shape.h.

101 { return m_shape; }
SHAPE_T m_shape
Definition: eda_shape.h:319

References EDA_SHAPE::m_shape.

Referenced by PCB_POINT_EDITOR::addCorner(), EE_POINT_EDITOR::addCornerCondition(), LIB_SHAPE::AddPoint(), BOARD_ADAPTER::addShapeWithClearance(), GRAPHICS_CLEANER::areEquivalent(), EDA_SHAPE::beginEdit(), EDA_SHAPE::calcEdit(), PCB_POINT_EDITOR::canAddCorner(), PCB_GRID_HELPER::computeAnchors(), EDA_SHAPE::continueEdit(), ConvertOutlineToPolygon(), CONVERT_TOOL::CreateLines(), CONVERT_TOOL::CreatePolys(), KIGFX::SCH_PAINTER::draw(), KIGFX::PCB_PAINTER::draw(), EDA_SHAPE_DESC::EDA_SHAPE_DESC(), EDA_SHAPE::endEdit(), PAD_TOOL::explodePad(), CADSTAR_SCH_ARCHIVE_LOADER::fixUpLibraryPins(), Flip(), FootprintWriteShape(), PCB_PLUGIN::format(), FOOTPRINT::GetCoverageArea(), LIB_SHAPE::GetMenuImage(), CADSTAR_SCH_ARCHIVE_LOADER::getScaledLibPart(), LIB_SHAPE::GetSelectMenuText(), 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::makePolysFromCircles(), CONVERT_TOOL::makePolysFromRects(), GRAPHICS_CLEANER::mergeRects(), Mirror(), Move(), PCB_SHAPE::cmp_drawings::operator()(), FOOTPRINT::cmp_drawings::operator()(), ALTIUM_PCB::Parse(), LIB_SHAPE::Plot(), BRDITEMS_PLOTTER::PlotFootprintGraphicItem(), BRDITEMS_PLOTTER::PlotPcbShape(), LIB_SHAPE::print(), PAD_TOOL::recombinePad(), PCB_POINT_EDITOR::removeCorner(), 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_LEGACY_PLUGIN_CACHE::SaveSymbol(), SCH_SEXPR_PLUGIN_CACHE::saveSymbolDrawItem(), PNS_KICAD_IFACE_BASE::syncGraphicalItem(), 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 wxPoint& EDA_SHAPE::GetStart ( ) const
inlineinherited

Return the starting point of the graphic.

Definition at line 106 of file eda_shape.h.

106 { return m_start; }
wxPoint m_start
Definition: eda_shape.h:322

References EDA_SHAPE::m_start.

Referenced by PCB_POINT_EDITOR::addCorner(), BOARD_ADAPTER::addShapeWithClearance(), GRAPHICS_CLEANER::areEquivalent(), LIB_SHAPE::CalcArcAngles(), EDA_SHAPE::CalcArcAngles(), EDA_SHAPE::calcEdit(), PCB_GRID_HELPER::computeAnchors(), ConvertOutlineToPolygon(), CreateBoardSection(), CONVERT_TOOL::CreateLines(), MICROWAVE_TOOL::createMicrowaveInductor(), CONVERT_TOOL::CreatePolys(), KIGFX::PCB_PAINTER::draw(), PCB_POINT_EDITOR::editArcEndpointKeepCenter(), PCB_POINT_EDITOR::editArcEndpointKeepTangent(), PCB_PLUGIN::format(), formatArc(), formatBezier(), formatCircle(), formatRect(), EDA_SHAPE::getBoundingBox(), PCB_SHAPE::GetFocusPosition(), EDA_SHAPE::GetLength(), EDA_SHAPE::GetRectCorners(), CADSTAR_SCH_ARCHIVE_LOADER::getScaledLibPart(), CONVERT_TOOL::getStartEndPoints(), hash_fp_item(), EDA_SHAPE::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::makePolysFromRects(), CONVERT_TOOL::makePolysFromSegs(), GRAPHICS_CLEANER::mergeRects(), PCB_PARSER::parsePAD(), BRDITEMS_PLOTTER::PlotFootprintGraphicItem(), BRDITEMS_PLOTTER::PlotPcbShape(), BRDITEMS_PLOTTER::PlotPcbTarget(), SCH_LEGACY_PLUGIN_CACHE::saveArc(), EDA_SHAPE::ShapeGetMsgPanelInfo(), AR_MATRIX::TraceSegmentPcb(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow(), DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataFromWindow(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataToWindow(), DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataToWindow(), EDA_SHAPE::TransformShapeWithClearanceToPolygon(), EE_POINT_EDITOR::updatePoints(), and PCB_POINT_EDITOR::updatePoints().

◆ GetStart0()

const wxPoint& FP_SHAPE::GetStart0 ( ) const
inline

Definition at line 112 of file fp_shape.h.

112 { return m_start0; }
wxPoint m_start0
Start point or circle center, relative to footprint origin, orient 0.
Definition: fp_shape.h:163

References m_start0.

Referenced by FootprintWriteShape(), PCB_PLUGIN::format(), CADSTAR_PCB_ARCHIVE_LOADER::getLineChainFromShapes(), hash_fp_item(), DSN::SPECCTRA_DB::makeIMAGE(), and CADSTAR_PCB_ARCHIVE_LOADER::makeTracksFromShapes().

◆ GetStartX()

int EDA_SHAPE::GetStartX ( )
inlineinherited

Definition at line 108 of file eda_shape.h.

108 { return m_start.x; }
wxPoint m_start
Definition: eda_shape.h:322

References EDA_SHAPE::m_start.

Referenced by EDA_SHAPE_DESC::EDA_SHAPE_DESC(), and DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run().

◆ GetStartY()

int EDA_SHAPE::GetStartY ( )
inlineinherited

Definition at line 107 of file eda_shape.h.

107 { return m_start.y; }
wxPoint m_start
Definition: eda_shape.h:322

References EDA_SHAPE::m_start.

Referenced by EDA_SHAPE_DESC::EDA_SHAPE_DESC(), and DRC_TEST_PROVIDER_EDGE_CLEARANCE::Run().

◆ GetState()

int EDA_ITEM::GetState ( EDA_ITEM_FLAGS  type) const
inlineinherited

Definition at line 136 of file eda_item.h.

137  {
138  return m_status & type;
139  }
EDA_ITEM_FLAGS m_status
Definition: eda_item.h:477

References EDA_ITEM::m_status.

Referenced by BOARD_ITEM::IsLocked().

◆ GetStatus()

EDA_ITEM_FLAGS EDA_ITEM::GetStatus ( ) const
inlineinherited

Definition at line 149 of file eda_item.h.

149 { return m_status; }
EDA_ITEM_FLAGS m_status
Definition: eda_item.h:477

References EDA_ITEM::m_status.

◆ GetWidth()

int EDA_SHAPE::GetWidth ( ) const
inlineinherited

◆ GetX()

int BOARD_ITEM::GetX ( ) const
inlineinherited

◆ GetY()

int BOARD_ITEM::GetY ( ) const
inlineinherited

◆ HasFlag()

◆ HitTest() [1/2]

bool PCB_SHAPE::HitTest ( const wxPoint &  aPosition,
int  aAccuracy = 0 
) const
inlineoverridevirtualinherited

Test if aPosition is inside or on the boundary of this item.

Parameters
aPositionA reference to a wxPoint object containing the coordinates to test.
aAccuracyIncrease the item bounding box by this amount.
Returns
True if aPosition is within the item bounding box.

Reimplemented from EDA_ITEM.

Definition at line 104 of file pcb_shape.h.

105  {
106  return hitTest( aPosition, aAccuracy );
107  }
bool hitTest(const wxPoint &aPosition, int aAccuracy=0) const
Definition: eda_shape.cpp:695

References EDA_SHAPE::hitTest().

Referenced by GENERAL_COLLECTOR::Inspect().

◆ HitTest() [2/2]

bool PCB_SHAPE::HitTest ( const EDA_RECT aRect,
bool  aContained,
int  aAccuracy = 0 
) const
inlineoverridevirtualinherited

Test if aRect intersects this item.

Parameters
aRectA reference to a EDA_RECT object containing the rectangle to test.
aContainedSet to true to test for containment instead of an intersection.
aAccuracyIncrease aRect by this amount.
Returns
True if aRect contains or intersects the item bounding box.

Reimplemented from EDA_ITEM.

Definition at line 109 of file pcb_shape.h.

110  {
111  return hitTest( aRect, aContained, aAccuracy );
112  }
bool hitTest(const wxPoint &aPosition, int aAccuracy=0) const
Definition: eda_shape.cpp:695

References EDA_SHAPE::hitTest().

◆ hitTest() [1/2]

bool EDA_SHAPE::hitTest ( const wxPoint &  aPosition,
int  aAccuracy = 0 
) const
protectedinherited

Definition at line 695 of file eda_shape.cpp.

696 {
697  int maxdist = aAccuracy;
698 
699  if( m_width > 0 )
700  maxdist += m_width / 2;
701 
702  switch( m_shape )
703  {
704  case SHAPE_T::CIRCLE:
705  {
706  int radius = GetRadius();
707  int dist = KiROUND( EuclideanNorm( aPosition - getCenter() ) );
708 
709  if( IsFilled() )
710  return dist <= radius + maxdist; // Filled circle hit-test
711  else
712  return abs( radius - dist ) <= maxdist; // Ring hit-test
713  }
714 
715  case SHAPE_T::ARC:
716  {
717  if( EuclideanNorm( aPosition - m_start ) <= maxdist )
718  return true;
719 
720  if( EuclideanNorm( aPosition - m_end ) <= maxdist )
721  return true;
722 
723  wxPoint relPos = aPosition - getCenter();
724  int radius = GetRadius();
725  int dist = KiROUND( EuclideanNorm( relPos ) );
726 
727  if( abs( radius - dist ) <= maxdist )
728  {
729  double startAngle;
730  double endAngle;
731  CalcArcAngles( startAngle, endAngle );
732 
733  if( m_eeWinding && NormalizeAngleDegrees( startAngle - endAngle, -180.0, 180.0 ) > 0 )
734  std::swap( startAngle, endAngle );
735 
736  double relPosAngle = 180.0 / M_PI * atan2( relPos.y, relPos.x );
737 
738  startAngle = NormalizeAngleDegrees( startAngle, 0.0, 360.0 );
739  endAngle = NormalizeAngleDegrees( endAngle, 0.0, 360.0 );
740  relPosAngle = NormalizeAngleDegrees( relPosAngle, 0.0, 360.0 );
741 
742  if( endAngle > startAngle )
743  return relPosAngle >= startAngle && relPosAngle <= endAngle;
744  else
745  return relPosAngle >= startAngle || relPosAngle <= endAngle;
746  }
747 
748  return false;
749  }
750 
751  case SHAPE_T::BEZIER:
752  const_cast<EDA_SHAPE*>( this )->RebuildBezierToSegmentsPointsList( m_width );
753 
754  for( unsigned int i= 1; i < m_bezierPoints.size(); i++)
755  {
756  if( TestSegmentHit( aPosition, m_bezierPoints[ i - 1], m_bezierPoints[i], maxdist ) )
757  return true;
758  }
759 
760  return false;
761 
762  case SHAPE_T::SEGMENT:
763  return TestSegmentHit( aPosition, GetStart(), GetEnd(), maxdist );
764 
765  case SHAPE_T::RECT:
766  if( IsFilled() ) // Filled rect hit-test
767  {
768  SHAPE_POLY_SET poly;
769  poly.NewOutline();
770 
771  for( const wxPoint& pt : GetRectCorners() )
772  poly.Append( pt );
773 
774  return poly.Collide( VECTOR2I( aPosition ), maxdist );
775  }
776  else // Open rect hit-test
777  {
778  std::vector<wxPoint> pts = GetRectCorners();
779 
780  return TestSegmentHit( aPosition, pts[0], pts[1], maxdist )
781  || TestSegmentHit( aPosition, pts[1], pts[2], maxdist )
782  || TestSegmentHit( aPosition, pts[2], pts[3], maxdist )
783  || TestSegmentHit( aPosition, pts[3], pts[0], maxdist );
784  }
785 
786  case SHAPE_T::POLY:
787  if( IsFilled() )
788  {
789  return m_poly.Collide( VECTOR2I( aPosition ), maxdist );
790  }
791  else
792  {
794  return m_poly.CollideEdge( VECTOR2I( aPosition ), dummy, maxdist );
795  }
796 
797  default:
799  return false;
800  }
801 }
double EuclideanNorm(const wxPoint &vector)
Euclidean norm of a 2D vector.
Definition: trigo.h:146
SHAPE_T m_shape
Definition: eda_shape.h:319
wxPoint getCenter() const
Definition: eda_shape.cpp:393
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:106
void CalcArcAngles(double &aStartAngle, double &aEndAngle) const
Calc arc start and end angles such that aStartAngle < aEndAngle.
Definition: eda_shape.cpp:451
Structure to hold the necessary information in order to index a vertex on a SHAPE_POLY_SET object: th...
VECTOR2< int > VECTOR2I
Definition: vector2d.h:622
wxPoint m_end
Definition: eda_shape.h:323
bool IsFilled() const
Definition: eda_shape.h:90
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:72
std::vector< wxPoint > GetRectCorners() const
Definition: eda_shape.cpp:981
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:131
Represent a set of closed polygons.
std::vector< wxPoint > m_bezierPoints
Definition: eda_shape.h:331
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
bool TestSegmentHit(const wxPoint &aRefPoint, const wxPoint &aStart, const wxPoint &aEnd, int aDist)
Test if aRefPoint is with aDistance on the line defined by aStart and aEnd.
Definition: trigo.cpp:129
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
int NewOutline()
Creates a new hole in a given outline.
wxPoint m_start
Definition: eda_shape.h:322
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,...
bool CollideEdge(const VECTOR2I &aPoint, VERTEX_INDEX &aClosestVertex, int aClearance=0) const
Check whether aPoint collides with any edge of any of the contours of the polygon.
bool m_eeWinding
Definition: eda_shape.h:335
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:73
double NormalizeAngleDegrees(double Angle, double aMin, double aMax)
Normalize angle to be aMin < angle <= aMax angle is in degrees.
Definition: trigo.h:327
int m_width
Definition: eda_shape.h:320
int GetRadius() const
Definition: eda_shape.cpp:472
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...

References SHAPE_POLY_SET::Append(), ARC, BEZIER, EDA_SHAPE::CalcArcAngles(), CIRCLE, SHAPE_POLY_SET::Collide(), SHAPE_POLY_SET::CollideEdge(), dummy(), EuclideanNorm(), EDA_SHAPE::getCenter(), EDA_SHAPE::GetEnd(), EDA_SHAPE::GetRadius(), EDA_SHAPE::GetRectCorners(), EDA_SHAPE::GetStart(), EDA_SHAPE::IsFilled(), KiROUND(), EDA_SHAPE::m_bezierPoints, EDA_SHAPE::m_eeWinding, EDA_SHAPE::m_end, EDA_SHAPE::m_poly, EDA_SHAPE::m_shape, EDA_SHAPE::m_start, EDA_SHAPE::m_width, SHAPE_POLY_SET::NewOutline(), NormalizeAngleDegrees(), POLY, RECT, SEGMENT, EDA_SHAPE::SHAPE_T_asString(), TestSegmentHit(), and UNIMPLEMENTED_FOR.

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

◆ hitTest() [2/2]

bool EDA_SHAPE::hitTest ( const EDA_RECT aRect,
bool  aContained,
int  aAccuracy = 0 
) const
protectedinherited

Definition at line 804 of file eda_shape.cpp.

805 {
806  EDA_RECT arect = aRect;
807  arect.Normalize();
808  arect.Inflate( aAccuracy );
809 
810  EDA_RECT arcRect;
811  EDA_RECT bb = getBoundingBox();
812 
813  switch( m_shape )
814  {
815  case SHAPE_T::CIRCLE:
816  // Test if area intersects or contains the circle:
817  if( aContained )
818  {
819  return arect.Contains( bb );
820  }
821  else
822  {
823  // If the rectangle does not intersect the bounding box, this is a much quicker test
824  if( !aRect.Intersects( bb ) )
825  {
826  return false;
827  }
828  else
829  {
830  return arect.IntersectsCircleEdge( getCenter(), GetRadius(), GetWidth() );
831  }
832  }
833 
834  case SHAPE_T::ARC:
835  // Test for full containment of this arc in the rect
836  if( aContained )
837  {
838  return arect.Contains( bb );
839  }
840  // Test if the rect crosses the arc
841  else
842  {
843  arcRect = bb.Common( arect );
844 
845  /* All following tests must pass:
846  * 1. Rectangle must intersect arc BoundingBox
847  * 2. Rectangle must cross the outside of the arc
848  */
849  return arcRect.Intersects( arect ) &&
851  }
852 
853  case SHAPE_T::RECT:
854  if( aContained )
855  {
856  return arect.Contains( bb );
857  }
858  else
859  {
860  std::vector<wxPoint> pts = GetRectCorners();
861 
862  // Account for the width of the lines
863  arect.Inflate( GetWidth() / 2 );
864  return ( arect.Intersects( pts[0], pts[1] )
865  || arect.Intersects( pts[1], pts[2] )
866  || arect.Intersects( pts[2], pts[3] )
867  || arect.Intersects( pts[3], pts[0] ) );
868  }
869 
870  case SHAPE_T::SEGMENT:
871  if( aContained )
872  {
873  return arect.Contains( GetStart() ) && aRect.Contains( GetEnd() );
874  }
875  else
876  {
877  // Account for the width of the line
878  arect.Inflate( GetWidth() / 2 );
879  return arect.Intersects( GetStart(), GetEnd() );
880  }
881 
882  case SHAPE_T::POLY:
883  if( aContained )
884  {
885  return arect.Contains( bb );
886  }
887  else
888  {
889  // Fast test: if aRect is outside the polygon bounding box,
890  // rectangles cannot intersect
891  if( !arect.Intersects( bb ) )
892  return false;
893 
894  // Account for the width of the line
895  arect.Inflate( GetWidth() / 2 );
896 
897  // Polygons in footprints use coordinates relative to the footprint.
898  // Therefore, instead of using m_poly, we make a copy which is translated
899  // to the actual location in the board.
900  double orientation = 0.0;
901  wxPoint offset = getParentPosition();
902 
903  if( getParentOrientation() )
904  orientation = -DECIDEG2RAD( getParentOrientation() );
905 
906  SHAPE_LINE_CHAIN poly = m_poly.Outline( 0 );
907  poly.Rotate( orientation );
908  poly.Move( offset );
909 
910  int count = poly.GetPointCount();
911 
912  for( int ii = 0; ii < count; ii++ )
913  {
914  VECTOR2I vertex = poly.GetPoint( ii );
915 
916  // Test if the point is within aRect
917  if( arect.Contains( ( wxPoint ) vertex ) )
918  return true;
919 
920  if( ii + 1 < count )
921  {
922  VECTOR2I vertexNext = poly.GetPoint( ii + 1 );
923 
924  // Test if this edge intersects aRect
925  if( arect.Intersects( ( wxPoint ) vertex, ( wxPoint ) vertexNext ) )
926  return true;
927  }
928  else if( poly.IsClosed() )
929  {
930  VECTOR2I vertexNext = poly.GetPoint( 0 );
931 
932  // Test if this edge intersects aRect
933  if( arect.Intersects( ( wxPoint ) vertex, ( wxPoint ) vertexNext ) )
934  return true;
935  }
936  }
937 
938  return false;
939  }
940 
941  case SHAPE_T::BEZIER:
942  if( aContained )
943  {
944  return arect.Contains( bb );
945  }
946  else
947  {
948  // Fast test: if aRect is outside the polygon bounding box,
949  // rectangles cannot intersect
950  if( !arect.Intersects( bb ) )
951  return false;
952 
953  // Account for the width of the line
954  arect.Inflate( GetWidth() / 2 );
955  unsigned count = m_bezierPoints.size();
956 
957  for( unsigned ii = 1; ii < count; ii++ )
958  {
959  wxPoint vertex = m_bezierPoints[ ii - 1];
960  wxPoint vertexNext = m_bezierPoints[ii];
961 
962  // Test if the point is within aRect
963  if( arect.Contains( ( wxPoint ) vertex ) )
964  return true;
965 
966  // Test if this edge intersects aRect
967  if( arect.Intersects( vertex, vertexNext ) )
968  return true;
969  }
970 
971  return false;
972  }
973 
974  default:
976  return false;
977  }
978 }
SHAPE_T m_shape
Definition: eda_shape.h:319
int GetWidth() const
Definition: eda_shape.h:98
virtual size_t GetPointCount() const override
wxPoint getCenter() const
Definition: eda_shape.cpp:393
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:106
void Move(const VECTOR2I &aVector) override
virtual wxPoint getParentPosition() const =0
bool IntersectsCircleEdge(const wxPoint &aCenter, const int aRadius, const int aWidth) const
Test for intersection between this rect and the edge (radius) of a circle.
Definition: eda_rect.cpp:331
EDA_RECT Common(const EDA_RECT &aRect) const
Return the area that is common with another rectangle.
Definition: eda_rect.cpp:489
bool Contains(const wxPoint &aPoint) const
Definition: eda_rect.cpp:57
std::vector< wxPoint > GetRectCorners() const
Definition: eda_shape.cpp:981
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:131
bool IsClosed() const override
SHAPE_LINE_CHAIN & Outline(int aIndex)
std::vector< wxPoint > m_bezierPoints
Definition: eda_shape.h:331
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
virtual const VECTOR2I GetPoint(int aIndex) const override
void Rotate(double aAngle, const VECTOR2I &aCenter=VECTOR2I(0, 0)) override
Rotate all vertices by a given angle.
void Normalize()
Ensures that the height ant width are positive.
Definition: eda_rect.cpp:35
const EDA_RECT getBoundingBox() const
Definition: eda_shape.cpp:634
virtual double getParentOrientation() const =0
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
Handle the component boundary box.
Definition: eda_rect.h:42
double DECIDEG2RAD(double deg)
Definition: trigo.h:233
bool Intersects(const EDA_RECT &aRect) const
Test for a common area between rectangles.
Definition: eda_rect.cpp:150
int GetRadius() const
Definition: eda_shape.cpp:472
EDA_RECT & Inflate(wxCoord dx, wxCoord dy)
Inflate the rectangle horizontally by dx and vertically by dy.
Definition: eda_rect.cpp:364

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

◆ IsBrightened()

◆ IsConnected()

◆ IsDragging()

bool EDA_ITEM::IsDragging ( ) const
inlineinherited

Definition at line 120 of file eda_item.h.

120 { return m_flags & IS_DRAGGING; }
#define IS_DRAGGING
Item being dragged.
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:480

References IS_DRAGGING, and EDA_ITEM::m_flags.

Referenced by DIALOG_SYMBOL_PROPERTIES::DIALOG_SYMBOL_PROPERTIES().

◆ IsEntered()

bool EDA_ITEM::IsEntered ( ) const
inlineinherited

Definition at line 123 of file eda_item.h.

123 { return m_flags & ENTERED; }
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:480
#define ENTERED
indicates a group has been entered

References ENTERED, and EDA_ITEM::m_flags.

Referenced by KIGFX::PCB_PAINTER::draw().

◆ IsFilled()

◆ IsForceVisible()

bool EDA_ITEM::IsForceVisible ( ) const
inlineinherited

Definition at line 205 of file eda_item.h.

205 { return m_forceVisible; }
bool m_forceVisible
Definition: eda_item.h:479

References EDA_ITEM::m_forceVisible.

Referenced by KIGFX::SCH_PAINTER::draw(), and SCH_FIELD::Print().

◆ IsLocked()

bool BOARD_ITEM::IsLocked ( ) const
virtualinherited
Returns
true if the object is locked, else false.

Reimplemented in FOOTPRINT, and PAD.

Definition at line 64 of file board_item.cpp.

65 {
66  if( GetParentGroup() )
67  return GetParentGroup()->IsLocked();
68 
69  const BOARD* board = GetBoard();
70 
71  return board && board->GetBoardUse() != BOARD_USE::FPHOLDER && GetState( LOCKED );
72 }
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:60
virtual bool IsLocked() const
Definition: board_item.cpp:64
#define LOCKED
Pcbnew: locked from movement and deletion.
int GetState(EDA_ITEM_FLAGS type) const
Definition: eda_item.h:136
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:191
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:36
BOARD_USE GetBoardUse() const
Get what the board use is.
Definition: board.h:211

References FPHOLDER, BOARD_ITEM::GetBoard(), BOARD::GetBoardUse(), BOARD_ITEM::GetParentGroup(), EDA_ITEM::GetState(), BOARD_ITEM::IsLocked(), and LOCKED.

Referenced by BOARD_ITEM_DESC::BOARD_ITEM_DESC(), PCB_CONTROL::DeleteItemCursor(), DIALOG_GROUP_PROPERTIES::DIALOG_GROUP_PROPERTIES(), DIALOG_TRACK_VIA_PROPERTIES::DIALOG_TRACK_VIA_PROPERTIES(), EDIT_TOOL::DragArcTrack(), EDIT_TOOL::FilletTracks(), PCB_PLUGIN::format(), DSN::SPECCTRA_DB::FromBOARD(), DSN::SPECCTRA_DB::FromSESSION(), PCB_TEXT::GetMsgPanelInfo(), PCB_SHAPE::GetMsgPanelInfo(), ZONE::GetMsgPanelInfo(), FP_TEXT::GetMsgPanelInfo(), PCB_GROUP::GetMsgPanelInfo(), PCB_DIMENSION_BASE::GetMsgPanelInfo(), PCB_TRACK::GetMsgPanelInfoBase_Common(), ALIGN_DISTRIBUTE_TOOL::GetSelections(), GROUP_TOOL::Group(), ROUTER_TOOL::InlineDrag(), GENERAL_COLLECTOR::Inspect(), PAD::IsLocked(), BOARD_ITEM::IsLocked(), PCB_SELECTION_TOOL::itemPassesFilter(), CADSTAR_PCB_ARCHIVE_LOADER::makeTracksFromShapes(), TRACKS_CLEANER::mergeCollinearSegments(), BOARD_EDITOR_CONTROL::modifyLockSelected(), PCB_POINT_EDITOR::OnSelectionChange(), ZONE_SETTINGS::operator<<(), POSITION_RELATIVE_TOOL::PositionRelative(), processTextItem(), PCB_SELECTION_TOOL::RequestSelection(), PNS_KICAD_IFACE_BASE::syncArc(), PNS_KICAD_IFACE_BASE::syncTrack(), PNS_KICAD_IFACE_BASE::syncVia(), DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow(), DIALOG_TEXT_PROPERTIES::TransferDataToWindow(), and DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataToWindow().

◆ IsModified()

bool EDA_ITEM::IsModified ( ) const
inlineinherited

Definition at line 117 of file eda_item.h.

117 { return m_flags & IS_CHANGED; }
#define IS_CHANGED
Item was edited, and modified.
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:480

References IS_CHANGED, and EDA_ITEM::m_flags.

Referenced by PCB_EDIT_FRAME::OpenProjectFiles().

◆ IsMoving()

◆ IsNew()

◆ IsOnCopperLayer()

virtual bool BOARD_ITEM::IsOnCopperLayer ( ) const
inlinevirtualinherited
Returns
true if the object is on any copper layer, false otherwise.

Reimplemented in PAD, PCB_TRACK, and ZONE.

Definition at line 111 of file board_item.h.

112  {
113  return IsCopperLayer( GetLayer() );
114  }
bool IsCopperLayer(LAYER_NUM aLayerId)
Tests whether a layer is a copper layer.
Definition: layer_ids.h:808
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:143

References BOARD_ITEM::GetLayer(), and IsCopperLayer().

Referenced by CN_CONNECTIVITY_ALGO::Add(), DRC_ENGINE::EvalRules(), and BOARD_CONNECTED_ITEM::SetNetCode().

◆ IsOnLayer()

virtual bool BOARD_ITEM::IsOnLayer ( PCB_LAYER_ID  aLayer) const
inlinevirtualinherited

Test to see if this object is on the given layer.

Virtual so objects like PAD, which reside on multiple layers can do their own form of testing.

Parameters
aLayerThe layer to test for.
Returns
true if on given layer, else false.

Reimplemented in PAD, PCB_VIA, FOOTPRINT, ZONE, and PCB_GROUP.

Definition at line 195 of file board_item.h.

196  {
197  return m_layer == aLayer;
198  }
PCB_LAYER_ID m_layer
Definition: board_item.h:313

References BOARD_ITEM::m_layer.

Referenced by BOARD_ADAPTER::createLayers(), existsOnLayer(), GENERAL_COLLECTOR::Inspect(), PCB_LAYER_COLLECTOR::Inspect(), BOARD_INSPECTION_TOOL::InspectClearance(), and PNS_KICAD_IFACE::IsItemVisible().

◆ IsParentFlipped()

bool FP_SHAPE::IsParentFlipped ( ) const

Definition at line 283 of file fp_shape.cpp.

284 {
285  if( GetParent() && GetParent()->GetLayer() == B_Cu )
286  return true;
287  return false;
288 }
BOARD_ITEM_CONTAINER * GetParent() const
Definition: board_item.h:136
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:143

References B_Cu, BOARD_ITEM::GetLayer(), and BOARD_ITEM::GetParent().

Referenced by ViewGetLOD().

◆ IsPolyShapeValid()

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

Definition at line 1210 of file eda_shape.cpp.

1211 {
1212  // return true if the polygonal shape is valid (has more than 2 points)
1213  if( GetPolyShape().OutlineCount() == 0 )
1214  return false;
1215 
1216  const SHAPE_LINE_CHAIN& outline = ( (SHAPE_POLY_SET&)GetPolyShape() ).Outline( 0 );
1217 
1218  return outline.PointCount() > 2;
1219 }
int PointCount() const
Return the number of points (vertices) in this line chain.
Represent a set of closed polygons.
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:227
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...

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

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

◆ IsReplaceable()

virtual bool EDA_ITEM::IsReplaceable ( ) const
inlinevirtualinherited

Override this method in any derived object that supports test find and replace.

Returns
True if the item has replaceable text that can be modified using the find and replace dialog.

Reimplemented in SCH_SYMBOL, SCH_SHEET, SCH_LABEL, SCH_TEXT, SCH_FIELD, and SCH_SHEET_PIN.

Definition at line 402 of file eda_item.h.

402 { return false; }

Referenced by EDA_ITEM::Matches().

◆ IsResized()

bool EDA_ITEM::IsResized ( ) const
inlineinherited

Definition at line 124 of file eda_item.h.

124 { return m_flags & IS_RESIZING; }
#define IS_RESIZING
Item being resized.
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:480

References IS_RESIZING, and EDA_ITEM::m_flags.

◆ IsSelected()

bool EDA_ITEM::IsSelected ( ) const
inlineinherited

Definition at line 122 of file eda_item.h.

122 { return m_flags & SELECTED; }
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:480
#define SELECTED

References EDA_ITEM::m_flags, and SELECTED.

Referenced by ALIGN_DISTRIBUTE_TOOL::AlignBottom(), ALIGN_DISTRIBUTE_TOOL::AlignCenterX(), ALIGN_DISTRIBUTE_TOOL::AlignCenterY(), ALIGN_DISTRIBUTE_TOOL::AlignTop(), SCH_EDIT_FRAME::ConvertPart(), DIALOG_CHANGE_SYMBOLS::DIALOG_CHANGE_SYMBOLS(), ALIGN_DISTRIBUTE_TOOL::doAlignLeft(), ALIGN_DISTRIBUTE_TOOL::doAlignRight(), ALIGN_DISTRIBUTE_TOOL::doDistributeCentersHorizontally(), ALIGN_DISTRIBUTE_TOOL::doDistributeCentersVertically(), ALIGN_DISTRIBUTE_TOOL::doDistributeGapsHorizontally(), ALIGN_DISTRIBUTE_TOOL::doDistributeGapsVertically(), KIGFX::SCH_PAINTER::draw(), KIGFX::PCB_PAINTER::Draw(), KIGFX::PCB_PAINTER::draw(), DS_PROXY_UNDO_ITEM::DS_PROXY_UNDO_ITEM(), KIGFX::DS_RENDER_SETTINGS::GetColor(), KIGFX::GERBVIEW_RENDER_SETTINGS::GetColor(), KIGFX::PCB_RENDER_SETTINGS::GetColor(), SCH_MOVE_TOOL::getConnectedDragItems(), KIGFX::SCH_PAINTER::getLineWidth(), KIGFX::SCH_PAINTER::getRenderColor(), KIGFX::SCH_PAINTER::getTextThickness(), DIALOG_EXCHANGE_FOOTPRINTS::isMatch(), DIALOG_CHANGE_SYMBOLS::isMatch(), SCH_LINE::MergeOverlap(), SCH_EDIT_TOOL::Mirror(), EDIT_TOOL::MoveExact(), SCH_MOVE_TOOL::moveItem(), DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::processItem(), BOARD_COMMIT::Push(), PCB_SELECTION_TOOL::RebuildSelection(), EE_SELECTION_TOOL::RebuildSelection(), RENDER_3D_OPENGL::renderFootprint(), SCH_EDIT_TOOL::Rotate(), EE_TOOL_BASE< SCH_BASE_FRAME >::saveCopyInUndoList(), SCH_EDIT_FRAME::SchematicCleanUp(), GERBVIEW_SELECTION_TOOL::select(), PCB_SELECTION_TOOL::select(), PCB_SELECTION_TOOL::selectionContains(), PCB_SELECTION_TOOL::selectMultiple(), GERBVIEW_SELECTION_TOOL::selectPoint(), KIGFX::SCH_PAINTER::setDeviceColors(), GERBVIEW_SELECTION_TOOL::unselect(), DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::visitItem(), and DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::visitItem().

◆ IsTrack()

bool BOARD_ITEM::IsTrack ( ) const
inlineinherited

Test to see if this object is a track or via (or microvia).

Returns
true if a track or via, else false.

Definition at line 205 of file board_item.h.

206  {
207  return ( Type() == PCB_TRACE_T ) || ( Type() == PCB_VIA_T );
208  }
class PCB_TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:95
class PCB_VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:96
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112

References PCB_TRACE_T, PCB_VIA_T, and EDA_ITEM::Type().

◆ IsType()

bool FP_SHAPE::IsType ( const KICAD_T  aScanTypes[]) const
inlineoverridevirtual

Check whether the item is one of the listed types.

Parameters
aScanTypesList of item types
Returns
true if the item type is contained in the list aScanTypes

Reimplemented from EDA_ITEM.

Definition at line 54 of file fp_shape.h.

55  {
56  if( BOARD_ITEM::IsType( aScanTypes ) )
57  return true;
58 
59  for( const KICAD_T* p = aScanTypes; *p != EOT; ++p )
60  {
61  if( *p == PCB_LOCATE_GRAPHIC_T )
62  return true;
63  else if( *p == PCB_LOCATE_BOARD_EDGE_T )
64  return m_layer == Edge_Cuts;
65  }
66 
67  return false;
68  }
search types array terminator (End Of Types)
Definition: typeinfo.h:81
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:77
virtual bool IsType(const KICAD_T aScanTypes[]) const
Check whether the item is one of the listed types.
Definition: eda_item.h:182
PCB_LAYER_ID m_layer
Definition: board_item.h:313

References Edge_Cuts, EOT, EDA_ITEM::IsType(), BOARD_ITEM::m_layer, PCB_LOCATE_BOARD_EDGE_T, and PCB_LOCATE_GRAPHIC_T.

◆ IsWireImage()

bool EDA_ITEM::IsWireImage ( ) const
inlineinherited

Definition at line 121 of file eda_item.h.

121 { return m_flags & IS_WIRE_IMAGE; }
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:480
#define IS_WIRE_IMAGE
Item to be drawn as wireframe while editing.

References IS_WIRE_IMAGE, and EDA_ITEM::m_flags.

◆ IterateForward() [1/2]

template<class T >
static SEARCH_RESULT EDA_ITEM::IterateForward ( std::deque< T > &  aList,
INSPECTOR  inspector,
void *  testData,
const KICAD_T  scanTypes[] 
)
inlinestaticinherited

This changes first parameter to avoid the DList and use the main queue instead.

Definition at line 294 of file eda_item.h.

298  {
299  for( auto it : aList )
300  {
301  if( static_cast<EDA_ITEM*>( it )->Visit( inspector, testData, scanTypes )
303  return SEARCH_RESULT::QUIT;
304  }
305 
307  }
virtual SEARCH_RESULT Visit(INSPECTOR inspector, void *testData, const KICAD_T scanTypes[])
May be re-implemented for each derived class in order to handle all the types given by its member dat...
Definition: eda_item.cpp:93

References CONTINUE, QUIT, and EDA_ITEM::Visit().

Referenced by GERBER_FILE_IMAGE::Visit().

◆ IterateForward() [2/2]

template<class T >
static SEARCH_RESULT EDA_ITEM::IterateForward ( std::vector< T > &  aList,
INSPECTOR  inspector,
void *  testData,
const KICAD_T  scanTypes[] 
)
inlinestaticinherited

Change first parameter to avoid the DList and use std::vector instead.

Definition at line 313 of file eda_item.h.

315  {
316  for( auto it : aList )
317  {
318  if( static_cast<EDA_ITEM*>( it )->Visit( inspector, testData, scanTypes )
320  return SEARCH_RESULT::QUIT;
321  }
322 
324  }
virtual SEARCH_RESULT Visit(INSPECTOR inspector, void *testData, const KICAD_T scanTypes[])
May be re-implemented for each derived class in order to handle all the types given by its member dat...
Definition: eda_item.cpp:93

References CONTINUE, QUIT, and EDA_ITEM::Visit().

◆ layerMaskDescribe()

wxString BOARD_ITEM::layerMaskDescribe ( ) const
protectedvirtualinherited

Return a string (to be shown to the user) describing a layer mask.

The BOARD is needed because layer names are customizable.

Reimplemented in PCB_VIA.

Definition at line 87 of file board_item.cpp.

88 {
89  const BOARD* board = GetBoard();
90  LSET layers = GetLayerSet();
91 
92  // Try to be smart and useful. Check all copper first.
93  if( layers[F_Cu] && layers[B_Cu] )
94  return _( "all copper layers" );
95 
96  LSET copperLayers = layers & board->GetEnabledLayers().AllCuMask();
97  LSET techLayers = layers & board->GetEnabledLayers().AllTechMask();
98 
99  for( LSET testLayers : { copperLayers, techLayers, layers } )
100  {
101  for( int bit = PCBNEW_LAYER_ID_START; bit < PCB_LAYER_ID_COUNT; ++bit )
102  {
103  if( testLayers[ bit ] )
104  {
105  wxString layerInfo = board->GetLayerName( static_cast<PCB_LAYER_ID>( bit ) );
106 
107  if( testLayers.count() > 1 )
108  layerInfo << wxS( " " ) + _( "and others" );
109 
110  return layerInfo;
111  }
112  }
113  }
114 
115  // No copper, no technicals: no layer
116  return _( "no layers" );
117 }
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:759
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:362
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition: board.cpp:467
static LSET AllTechMask()
Return a mask holding all technical layers (no CU layer) on both side.
Definition: lset.cpp:829
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:516
#define _(s)
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:191
Definition: layer_ids.h:71
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:36
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
Definition: board_item.h:148

References _, LSET::AllCuMask(), LSET::AllTechMask(), B_Cu, F_Cu, BOARD_ITEM::GetBoard(), BOARD::GetEnabledLayers(), BOARD::GetLayerName(), BOARD_ITEM::GetLayerSet(), PCB_LAYER_ID_COUNT, and PCBNEW_LAYER_ID_START.

Referenced by PCB_TRACK::GetMsgPanelInfo(), PAD::GetMsgPanelInfo(), and PAD::GetSelectMenuText().

◆ MakeEffectiveShapes()

std::vector< SHAPE * > EDA_SHAPE::MakeEffectiveShapes ( ) const
inherited

Make a set of SHAPE objects representing the EDA_SHAPE.

Caller owns the objects.

Definition at line 1095 of file eda_shape.cpp.

1096 {
1097  std::vector<SHAPE*> effectiveShapes;
1098 
1099  switch( m_shape )
1100  {
1101  case SHAPE_T::ARC:
1102  effectiveShapes.emplace_back( new SHAPE_ARC( m_arcCenter, m_start, GetArcAngle() / 10.0,
1103  m_width ) );
1104  break;
1105 
1106  case SHAPE_T::SEGMENT:
1107  effectiveShapes.emplace_back( new SHAPE_SEGMENT( m_start, m_end, m_width ) );
1108  break;
1109 
1110  case SHAPE_T::RECT:
1111  {
1112  std::vector<wxPoint> pts = GetRectCorners();
1113 
1114  if( IsFilled() )
1115  effectiveShapes.emplace_back( new SHAPE_SIMPLE( pts ) );
1116 
1117  if( m_width > 0 || !IsFilled() )
1118  {
1119  effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[0], pts[1], m_width ) );
1120  effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[1], pts[2], m_width ) );
1121  effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[2], pts[3], m_width ) );
1122  effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[3], pts[0], m_width ) );
1123  }
1124  }
1125  break;
1126 
1127  case SHAPE_T::CIRCLE:
1128  {
1129  if( IsFilled() )
1130  effectiveShapes.emplace_back( new SHAPE_CIRCLE( getCenter(), GetRadius() ) );
1131 
1132  if( m_width > 0 || !IsFilled() )
1133  {
1134  // SHAPE_CIRCLE has no ConvertToPolyline() method, so use a 360.0 SHAPE_ARC
1135  SHAPE_ARC circle( getCenter(), GetEnd(), 360.0 );
1136  SHAPE_LINE_CHAIN l = circle.ConvertToPolyline();
1137 
1138  for( int i = 0; i < l.SegmentCount(); i++ )
1139  {
1140  effectiveShapes.emplace_back( new SHAPE_SEGMENT( l.Segment( i ).A, l.Segment( i ).B,
1141  m_width ) );
1142  }
1143  }
1144 
1145  break;
1146  }
1147 
1148  case SHAPE_T::BEZIER:
1149  {
1150  auto bezierPoints = buildBezierToSegmentsPointsList( GetWidth() );
1151  wxPoint start_pt = bezierPoints[0];
1152 
1153  for( unsigned int jj = 1; jj < bezierPoints.size(); jj++ )
1154  {
1155  wxPoint end_pt = bezierPoints[jj];
1156  effectiveShapes.emplace_back( new SHAPE_SEGMENT( start_pt, end_pt, m_width ) );
1157  start_pt = end_pt;
1158  }
1159 
1160  break;
1161  }
1162 
1163  case SHAPE_T::POLY:
1164  {
1165  if( GetPolyShape().OutlineCount() == 0 ) // malformed/empty polygon
1166  break;
1167 
1169 
1171  l.Move( getParentPosition() );
1172 
1173  if( IsFilled() )
1174  effectiveShapes.emplace_back( new SHAPE_SIMPLE( l ) );
1175 
1176  if( m_width > 0 || !IsFilled() )
1177  {
1178  for( int i = 0; i < l.SegmentCount(); i++ )
1179  effectiveShapes.emplace_back( new SHAPE_SEGMENT( l.Segment( i ), m_width ) );
1180  }
1181  }
1182  break;
1183 
1184  default:
1186  break;
1187  }
1188 
1189  return effectiveShapes;
1190 }
SHAPE_T m_shape
Definition: eda_shape.h:319
Represent a simple polygon consisting of a zero-thickness closed chain of connected line segments.
Definition: shape_simple.h:41
int GetWidth() const
Definition: eda_shape.h:98
wxPoint getCenter() const
Definition: eda_shape.cpp:393
void Move(const VECTOR2I &aVector) override
double GetArcAngle() const
Definition: eda_shape.cpp:536
virtual wxPoint getParentPosition() const =0
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_arcCenter
Definition: eda_shape.h:325
bool IsFilled() const
Definition: eda_shape.h:90
std::vector< wxPoint > GetRectCorners() const
Definition: eda_shape.cpp:981
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:131
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
const std::vector< wxPoint > buildBezierToSegmentsPointsList(int aMinSegLen) const
Definition: eda_shape.cpp:380
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
int SegmentCount() const
Return the number of segments in this line chain.
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:227
wxPoint m_start
Definition: eda_shape.h:322
void Rotate(double aAngle, const VECTOR2I &aCenter=VECTOR2I(0, 0)) override
Rotate all vertices by a given angle.
SEG Segment(int aIndex)
Return a copy of the aIndex-th segment in the line chain.
virtual double getParentOrientation() const =0
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
VECTOR2I A
Definition: seg.h:48
double DECIDEG2RAD(double deg)
Definition: trigo.h:233
int m_width
Definition: eda_shape.h:320
int GetRadius() const
Definition: eda_shape.cpp:472
VECTOR2I B
Definition: seg.h:49

References SEG::A, ARC, SEG::B, BEZIER, EDA_SHAPE::buildBezierToSegmentsPointsList(), CIRCLE, SHAPE_ARC::ConvertToPolyline(), SHAPE_POLY_SET::COutline(), DECIDEG2RAD(), EDA_SHAPE::GetArcAngle(), EDA_SHAPE::getCenter(), EDA_SHAPE::GetEnd(), EDA_SHAPE::getParentOrientation(), EDA_SHAPE::getParentPosition(), EDA_SHAPE::GetPolyShape(), EDA_SHAPE::GetRadius(), EDA_SHAPE::GetRectCorners(), EDA_SHAPE::GetWidth(), EDA_SHAPE::IsFilled(), EDA_SHAPE::m_arcCenter, EDA_SHAPE::m_end, EDA_SHAPE::m_shape, EDA_SHAPE::m_start, EDA_SHAPE::m_width, SHAPE_LINE_CHAIN::Move(), POLY, RECT, SHAPE_LINE_CHAIN::Rotate(), SEGMENT, SHAPE_LINE_CHAIN::Segment(), SHAPE_LINE_CHAIN::SegmentCount(), EDA_SHAPE::SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by PCB_SHAPE::GetEffectiveShape(), and PNS_KICAD_IFACE_BASE::syncGraphicalItem().

◆ Matches() [1/2]

virtual bool EDA_ITEM::Matches ( const wxFindReplaceData &  aSearchData,
void *  aAuxData 
) const
inlinevirtualinherited

Compare the item against the search criteria in aSearchData.

The base class returns false since many of the objects derived from EDA_ITEM do not have any text to search.

Parameters
aSearchDataA reference to a wxFindReplaceData object containing the search criteria.
aAuxDataA pointer to optional data required for the search or NULL if not used.
Returns
True if the item's text matches the search criteria in aSearchData.

Reimplemented in SCH_SYMBOL, SCH_SHEET, SCH_TEXT, SCH_FIELD, SCH_SHEET_PIN, ZONE, SCH_PIN, PCB_MARKER, SCH_MARKER, FP_TEXT, and PCB_TEXT.

Definition at line 364 of file eda_item.h.

365  {
366  return false;
367  }

Referenced by SCH_EDITOR_CONTROL::HasMatch(), PCB_TEXT::Matches(), FP_TEXT::Matches(), SCH_MARKER::Matches(), PCB_MARKER::Matches(), SCH_PIN::Matches(), ZONE::Matches(), SCH_SHEET_PIN::Matches(), SCH_FIELD::Matches(), SCH_TEXT::Matches(), SCH_EDITOR_CONTROL::ReplaceAndFindNext(), and SCH_EDITOR_CONTROL::UpdateFind().

◆ Matches() [2/2]

bool EDA_ITEM::Matches ( const wxString &  aText,
const wxFindReplaceData &  aSearchData 
) const
protectedinherited

Compare aText against search criteria in aSearchData.

This is a helper function for simplify derived class logic.

Parameters
aTextA reference to a wxString object containing the string to test.
aSearchDataThe criteria to search against.
Returns
True if aText matches the search criteria in aSearchData.

Definition at line 118 of file eda_item.cpp.

119 {
120  wxString text = aText;
121  int flags = aSearchData.GetFlags();
122  wxString searchText = aSearchData.GetFindString();
123 
124  // Don't match if searching for replaceable item and the item doesn't support text replace.
125  if( ( flags & FR_SEARCH_REPLACE ) && !IsReplaceable() )
126  return false;
127 
128  if( !( flags & wxFR_MATCHCASE ) )
129  {
130  text.MakeUpper();
131  searchText.MakeUpper();
132  }
133 
134  if( flags & wxFR_WHOLEWORD )
135  {
136  int ii = 0;
137 
138  while( ii < (int) text.length() )
139  {
140  int next = text.find( searchText, ii );
141 
142  if( next == wxNOT_FOUND )
143  return false;
144 
145  ii = next;
146  next += searchText.length();
147 
148  bool startOK = ( ii == 0 || !wxIsalnum( text.GetChar( ii - 1 ) ) );
149  bool endOK = ( next == (int) text.length() || !wxIsalnum( text.GetChar( next ) ) );
150 
151  if( startOK && endOK )
152  return true;
153  else
154  ii++;
155  }
156 
157  return false;
158  }
159  else if( flags & FR_MATCH_WILDCARD )
160  {
161  return text.Matches( searchText );
162  }
163  else
164  {
165  return text.Find( searchText ) != wxNOT_FOUND;
166  }
167 }
CITER next(CITER it)
Definition: ptree.cpp:126
virtual bool IsReplaceable() const
Override this method in any derived object that supports test find and replace.
Definition: eda_item.h:402

References FR_MATCH_WILDCARD, FR_SEARCH_REPLACE, EDA_ITEM::IsReplaceable(), next(), and text.

◆ Mirror()

void FP_SHAPE::Mirror ( const wxPoint &  aCentre,
bool  aMirrorAroundXAxis 
)

Mirror an edge of the footprint.

Do not change the layer This is a footprint shape modification. (should be only called by a footprint editing function)

Definition at line 290 of file fp_shape.cpp.

291 {
292  // Mirror an edge of the footprint. the layer is not modified
293  // This is a footprint shape modification.
294 
295  switch( GetShape() )
296  {
297  case SHAPE_T::ARC:
298  case SHAPE_T::SEGMENT:
299  case SHAPE_T::RECT:
300  case SHAPE_T::CIRCLE:
301  case SHAPE_T::BEZIER:
302  if( aMirrorAroundXAxis )
303  {
304  MIRROR( m_start0.y, aCentre.y );
305  MIRROR( m_end0.y, aCentre.y );
306  MIRROR( m_arcCenter0.y, aCentre.y );
307  MIRROR( m_bezierC1_0.y, aCentre.y );
308  MIRROR( m_bezierC2_0.y, aCentre.y );
309  }
310  else
311  {
312  MIRROR( m_start0.x, aCentre.x );
313  MIRROR( m_end0.x, aCentre.x );
314  MIRROR( m_arcCenter0.x, aCentre.x );
315  MIRROR( m_bezierC1_0.x, aCentre.x );
316  MIRROR( m_bezierC2_0.x, aCentre.x );
317  }
318 
319  if( GetShape() == SHAPE_T::ARC )
320  {
321  std::swap( m_start, m_end );
322  std::swap( m_start0, m_end0 );
323  }
324 
325  if( GetShape() == SHAPE_T::BEZIER )
327 
328  break;
329 
330  case SHAPE_T::POLY:
331  // polygon corners coordinates are always relative to the
332  // footprint position, orientation 0
333  m_poly.Mirror( !aMirrorAroundXAxis, aMirrorAroundXAxis );
334  break;
335 
336  default:
338  }
339 
340  SetDrawCoord();
341 }
wxPoint m_arcCenter0
Center of arc, relative to footprint origin, orient 0.
Definition: fp_shape.h:165
wxPoint m_end
Definition: eda_shape.h:323
void Mirror(bool aX=true, bool aY=false, const VECTOR2I &aRef={ 0, 0 })
Mirror the line points about y or x (or both)
wxPoint m_end0
End point or circle edge, relative to footprint origin, orient 0.
Definition: fp_shape.h:164
void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
Definition: mirror.h:40
wxPoint m_bezierC2_0
Bezier Control Point 2, relative to footprint origin, orient 0.
Definition: fp_shape.h:167
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
void SetDrawCoord()
Set draw coordinates (absolute values ) from relative coordinates.
Definition: fp_shape.cpp:81
wxPoint m_start
Definition: eda_shape.h:322
void RebuildBezierToSegmentsPointsList(int aMinSegLen)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
Definition: eda_shape.cpp:366
SHAPE_T GetShape() const
Definition: eda_shape.h:101
wxPoint m_start0
Start point or circle center, relative to footprint origin, orient 0.
Definition: fp_shape.h:163
int m_width
Definition: eda_shape.h:320
wxPoint m_bezierC1_0
Bezier Control Point 1, relative to footprint origin, orient 0.
Definition: fp_shape.h:166

References ARC, BEZIER, CIRCLE, EDA_SHAPE::GetShape(), m_arcCenter0, m_bezierC1_0, m_bezierC2_0, EDA_SHAPE::m_end, m_end0, EDA_SHAPE::m_poly, EDA_SHAPE::m_start, m_start0, EDA_SHAPE::m_width, MIRROR(), SHAPE_POLY_SET::Mirror(), POLY, EDA_SHAPE::RebuildBezierToSegmentsPointsList(), RECT, SEGMENT, SetDrawCoord(), EDA_SHAPE::SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by EDIT_TOOL::Mirror().

◆ Move() [1/2]

void FP_SHAPE::Move ( const wxPoint &  aMoveVector)
overridevirtual

Move an edge of the footprint.

This is a footprint shape modification. (should be only called by a footprint editing function)

Reimplemented from PCB_SHAPE.

Definition at line 355 of file fp_shape.cpp.

356 {
357  // Move an edge of the footprint.
358  // This is a footprint shape modification.
359 
360  switch( GetShape() )
361  {
362  case SHAPE_T::ARC:
363  case SHAPE_T::SEGMENT:
364  case SHAPE_T::RECT:
365  case SHAPE_T::CIRCLE:
366  case SHAPE_T::BEZIER:
367  m_start0 += aMoveVector;
368  m_end0 += aMoveVector;
369  m_arcCenter0 += aMoveVector;
370  m_bezierC1_0 += aMoveVector;
371  m_bezierC2_0 += aMoveVector;
372  break;
373 
374  case SHAPE_T::POLY:
375  // polygon corners coordinates are always relative to the
376  // footprint position, orientation 0
377  m_poly.Move( VECTOR2I( aMoveVector ) );
378 
379  break;
380 
381  default:
383  }
384 
385  SetDrawCoord();
386 }
wxPoint m_arcCenter0
Center of arc, relative to footprint origin, orient 0.
Definition: fp_shape.h:165
VECTOR2< int > VECTOR2I
Definition: vector2d.h:622
wxPoint m_end0
End point or circle edge, relative to footprint origin, orient 0.
Definition: fp_shape.h:164
void Move(const VECTOR2I &aVector) override
wxPoint m_bezierC2_0
Bezier Control Point 2, relative to footprint origin, orient 0.
Definition: fp_shape.h:167
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
void SetDrawCoord()
Set draw coordinates (absolute values ) from relative coordinates.
Definition: fp_shape.cpp:81
SHAPE_T GetShape() const
Definition: eda_shape.h:101
wxPoint m_start0
Start point or circle center, relative to footprint origin, orient 0.
Definition: fp_shape.h:163
wxPoint m_bezierC1_0
Bezier Control Point 1, relative to footprint origin, orient 0.
Definition: fp_shape.h:166

References ARC, BEZIER, CIRCLE, EDA_SHAPE::GetShape(), m_arcCenter0, m_bezierC1_0, m_bezierC2_0, m_end0, EDA_SHAPE::m_poly, m_start0, SHAPE_POLY_SET::Move(), POLY, RECT, SEGMENT, SetDrawCoord(), EDA_SHAPE::SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by PAD_TOOL::explodePad(), and FOOTPRINT::MoveAnchorPosition().

◆ Move() [2/2]

void BOARD_ITEM::Move ( const VECTOR2I aMoveVector)
inlineinherited

Definition at line 238 of file board_item.h.

239  {
240  Move( wxPoint( aMoveVector.x, aMoveVector.y ) );
241  }
virtual void Move(const wxPoint &aMoveVector)
Move this object.
Definition: board_item.h:233

References BOARD_ITEM::Move(), VECTOR2< T >::x, and VECTOR2< T >::y.

◆ move()

void EDA_SHAPE::move ( const wxPoint &  aMoveVector)
protectedinherited

Definition at line 137 of file eda_shape.cpp.

138 {
139  switch ( m_shape )
140  {
141  case SHAPE_T::ARC:
142  case SHAPE_T::SEGMENT:
143  case SHAPE_T::RECT:
144  case SHAPE_T::CIRCLE:
145  m_start += aMoveVector;
146  m_end += aMoveVector;
147  m_arcCenter += aMoveVector;
148  break;
149 
150  case SHAPE_T::POLY:
151  m_poly.Move( VECTOR2I( aMoveVector ) );
152  break;
153 
154  case SHAPE_T::BEZIER:
155  m_start += aMoveVector;
156  m_end += aMoveVector;
157  m_bezierC1 += aMoveVector;
158  m_bezierC2 += aMoveVector;
159 
160  for( wxPoint& pt : m_bezierPoints)
161  pt += aMoveVector;
162 
163  break;
164 
165  default:
167  break;
168  }
169 }
SHAPE_T m_shape
Definition: eda_shape.h:319
wxPoint m_bezierC1
Definition: eda_shape.h:328
VECTOR2< int > VECTOR2I
Definition: vector2d.h:622
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_arcCenter
Definition: eda_shape.h:325
wxPoint m_bezierC2
Definition: eda_shape.h:329
void Move(const VECTOR2I &aVector) override
std::vector< wxPoint > m_bezierPoints
Definition: eda_shape.h:331
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
wxPoint m_start
Definition: eda_shape.h:322

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

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

◆ operator<()

bool EDA_ITEM::operator< ( const EDA_ITEM aItem) const
inherited

Test if another item is less than this object.

Parameters
aItem- Item to compare against.
Returns
- True if aItem is less than the item.

Definition at line 234 of file eda_item.cpp.

235 {
236  wxFAIL_MSG( wxString::Format( wxT( "Less than operator not defined for item type %s." ),
237  GetClass() ) );
238 
239  return false;
240 }
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
virtual wxString GetClass() const =0
Return the class name.

References Format(), and EDA_ITEM::GetClass().

◆ RebuildBezierToSegmentsPointsList()

void EDA_SHAPE::RebuildBezierToSegmentsPointsList ( int  aMinSegLen)
inherited

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

367 {
368  // Has meaning only for S_CURVE DRAW_SEGMENT shape
369  if( m_shape != SHAPE_T::BEZIER )
370  {
371  m_bezierPoints.clear();
372  return;
373  }
374 
375  // Rebuild the m_BezierPoints vertex list that approximate the Bezier curve
377 }
SHAPE_T m_shape
Definition: eda_shape.h:319
std::vector< wxPoint > m_bezierPoints
Definition: eda_shape.h:331
const std::vector< wxPoint > buildBezierToSegmentsPointsList(int aMinSegLen) const
Definition: eda_shape.cpp:380

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

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

◆ Replace() [1/2]

bool EDA_ITEM::Replace ( const wxFindReplaceData &  aSearchData,
wxString &  aText 
)
staticinherited

Perform a text replace on aText using the find and replace criteria in aSearchData on items that support text find and replace.

Parameters
aSearchDataA reference to a wxFindReplaceData object containing the search and replace criteria.
aTextA reference to a wxString object containing the text to be replaced.
Returns
True if aText was modified, otherwise false.

Definition at line 170 of file eda_item.cpp.

171 {
172  wxString text = aText;
173  int flags = aSearchData.GetFlags();
174  wxString searchText = aSearchData.GetFindString();
175  wxString result;
176  bool replaced = false;
177 
178  if( flags & wxFR_MATCHCASE )
179  {
180  text = text.Upper();
181  searchText = searchText.Upper();
182  }
183 
184  int ii = 0;
185 
186  while( ii < (int) text.length() )
187  {
188  int next = text.find( searchText, ii );
189 
190  if( next == wxNOT_FOUND )
191  {
192  result += aText.Mid( ii, wxString::npos );
193  break;
194  }
195 
196  if( next > ii )
197  result += aText.Mid( ii, next - ii );
198 
199  ii = next;
200  next += searchText.length();
201 
202  bool startOK;
203  bool endOK;
204 
205  if( flags & wxFR_WHOLEWORD )
206  {
207  startOK = ( ii == 0 || !wxIsalnum( text.GetChar( ii - 1 ) ) );
208  endOK = ( next == (int) text.length() || !wxIsalnum( text.GetChar( next ) ) );
209  }
210  else
211  {
212  startOK = true;
213  endOK = true;
214  }
215 
216  if( startOK && endOK )
217  {
218  result += aSearchData.GetReplaceString();
219  replaced = true;
220  ii = next;
221  }
222  else
223  {
224  result += aText.GetChar( ii );
225  ii++;
226  }
227  }
228 
229  aText = result;
230  return replaced;
231 }
CITER next(CITER it)
Definition: ptree.cpp:126

References next(), and text.

Referenced by SCH_FIELD::Replace(), EDA_TEXT::Replace(), SCH_EDITOR_CONTROL::ReplaceAll(), and SCH_EDITOR_CONTROL::ReplaceAndFindNext().

◆ Replace() [2/2]

virtual bool EDA_ITEM::Replace ( const wxFindReplaceData &  aSearchData,
void *  aAuxData = nullptr 
)
inlinevirtualinherited

Perform a text replace using the find and replace criteria in aSearchData on items that support text find and replace.

This function must be overridden for items that support text replace.

Parameters
aSearchDataA reference to a wxFindReplaceData object containing the search and replace criteria.
aAuxDataA pointer to optional data required for the search or NULL if not used.
Returns
True if the item text was modified, otherwise false.

Reimplemented in SCH_TEXT, SCH_FIELD, SCH_SHEET_PIN, and SCH_PIN.

Definition at line 391 of file eda_item.h.

392  {
393  return false;
394  }

◆ Rotate() [1/2]

void FP_SHAPE::Rotate ( const wxPoint &  aRotCentre,
double  aAngle 
)
overridevirtual

Rotate an edge of the footprint.

This is a footprint shape modification. (should be only called by a footprint editing function )

Reimplemented from PCB_SHAPE.

Definition at line 343 of file fp_shape.cpp.

344 {
345  // We should rotate the relative coordinates, but to avoid duplicate code do the base class
346  // rotation of draw coordinates, which is acceptable because in the footprint editor
347  // m_Pos0 = m_Pos
348  PCB_SHAPE::Rotate( aRotCentre, aAngle );
349 
350  // and now update the relative coordinates, which are the reference in most transforms.
351  SetLocalCoord();
352 }
virtual void Rotate(const wxPoint &aRotCentre, double aAngle) override
Rotate this object.
Definition: pcb_shape.cpp:109
void SetLocalCoord()
Set relative coordinates from draw coordinates.
Definition: fp_shape.cpp:52

References PCB_SHAPE::Rotate(), and SetLocalCoord().

Referenced by PAD_TOOL::explodePad(), and EAGLE_PLUGIN::packageRectangle().

◆ Rotate() [2/2]

void BOARD_ITEM::Rotate ( const VECTOR2I aRotCentre,
double  aAngle 
)
inlineinherited

Definition at line 251 of file board_item.h.

252  {
253  Rotate( wxPoint( aRotCentre.x, aRotCentre.y ), aAngle );
254  }
virtual void Rotate(const wxPoint &aRotCentre, double aAngle)
Rotate this object.
Definition: board_item.cpp:202

References BOARD_ITEM::Rotate(), VECTOR2< T >::x, and VECTOR2< T >::y.

◆ rotate()

void EDA_SHAPE::rotate ( const wxPoint &  aRotCentre,
double  aAngle 
)
protectedinherited

Definition at line 224 of file eda_shape.cpp.

225 {
226  switch( m_shape )
227  {
228  case SHAPE_T::SEGMENT:
229  case SHAPE_T::CIRCLE:
230  RotatePoint( &m_start, aRotCentre, aAngle );
231  RotatePoint( &m_end, aRotCentre, aAngle );
232  break;
233 
234  case SHAPE_T::ARC:
235  RotatePoint( &m_start, aRotCentre, aAngle );
236  RotatePoint( &m_end, aRotCentre, aAngle );
237  RotatePoint( &m_arcCenter, aRotCentre, aAngle );
238  break;
239 
240  case SHAPE_T::RECT:
241  if( KiROUND( aAngle ) % 900 == 0 )
242  {
243  RotatePoint( &m_start, aRotCentre, aAngle );
244  RotatePoint( &m_end, aRotCentre, aAngle );
245  break;
246  }
247 
248  // Convert non-cartesian-rotated rect to a diamond
251  m_poly.NewOutline();
252  m_poly.Append( m_start );
253  m_poly.Append( m_end.x, m_start.y );
254  m_poly.Append( m_end );
255  m_poly.Append( m_start.x, m_end.y );
256 
258 
259  case SHAPE_T::POLY:
260  m_poly.Rotate( -DECIDEG2RAD( aAngle ), VECTOR2I( aRotCentre ) );
261  break;
262 
263  case SHAPE_T::BEZIER:
264  RotatePoint( &m_start, aRotCentre, aAngle);
265  RotatePoint( &m_end, aRotCentre, aAngle);
266  RotatePoint( &m_bezierC1, aRotCentre, aAngle);
267  RotatePoint( &m_bezierC2, aRotCentre, aAngle);
268 
269  for( wxPoint& pt : m_bezierPoints )
270  RotatePoint( &pt, aRotCentre, aAngle);
271 
272  break;
273 
274  default:
276  break;
277  }
278 }
SHAPE_T m_shape
Definition: eda_shape.h:319
wxPoint m_bezierC1
Definition: eda_shape.h:328
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
Definition: macros.h:83
void Rotate(double aAngle, const VECTOR2I &aCenter={ 0, 0 }) override
Rotate all vertices by a given angle.
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:229
VECTOR2< int > VECTOR2I
Definition: vector2d.h:622
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_arcCenter
Definition: eda_shape.h:325
wxPoint m_bezierC2
Definition: eda_shape.h:329
std::vector< wxPoint > m_bezierPoints
Definition: eda_shape.h:331
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
int NewOutline()
Creates a new hole in a given outline.
wxPoint m_start
Definition: eda_shape.h:322
double DECIDEG2RAD(double deg)
Definition: trigo.h:233
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:73
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...

References SHAPE_POLY_SET::Append(), ARC, BEZIER, CIRCLE, DECIDEG2RAD(), KI_FALLTHROUGH, KiROUND(), EDA_SHAPE::m_arcCenter, EDA_SHAPE::m_bezierC1, EDA_SHAPE::m_bezierC2, EDA_SHAPE::m_bezierPoints, EDA_SHAPE::m_end, EDA_SHAPE::m_poly, EDA_SHAPE::m_shape, EDA_SHAPE::m_start, SHAPE_POLY_SET::NewOutline(), POLY, RECT, SHAPE_POLY_SET::RemoveAllContours(), SHAPE_POLY_SET::Rotate(), RotatePoint(), SEGMENT, EDA_SHAPE::SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

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

◆ Scale()

void PCB_SHAPE::Scale ( double  aScale)
inherited

Definition at line 103 of file pcb_shape.cpp.

104 {
105  scale( aScale );
106 }
void scale(double aScale)
Definition: eda_shape.cpp:172

References EDA_SHAPE::scale().

Referenced by CADSTAR_PCB_ARCHIVE_LOADER::getShapeFromVertex().

◆ scale()

void EDA_SHAPE::scale ( double  aScale)
protectedinherited

Definition at line 172 of file eda_shape.cpp.

173 {
174  auto scalePt = [&]( wxPoint& pt )
175  {
176  pt.x = KiROUND( pt.x * aScale );
177  pt.y = KiROUND( pt.y * aScale );
178  };
179 
180  switch( m_shape )
181  {
182  case SHAPE_T::ARC:
183  case SHAPE_T::SEGMENT:
184  case SHAPE_T::RECT:
185  scalePt( m_start );
186  scalePt( m_end );
187  scalePt( m_arcCenter );
188  break;
189 
190  case SHAPE_T::CIRCLE: // ring or circle
191  scalePt( m_start );
192  m_end.x = m_start.x + KiROUND( GetRadius() * aScale );
193  m_end.y = m_start.y;
194  break;
195 
196  case SHAPE_T::POLY: // polygon
197  {
198  std::vector<wxPoint> pts;
199 
200  for( const VECTOR2I& pt : m_poly.Outline( 0 ).CPoints() )
201  {
202  pts.emplace_back( pt );
203  scalePt( pts.back() );
204  }
205 
206  SetPolyPoints( pts );
207  }
208  break;
209 
210  case SHAPE_T::BEZIER:
211  scalePt( m_start );
212  scalePt( m_end );
213  scalePt( m_bezierC1 );
214  scalePt( m_bezierC2 );
215  break;
216 
217  default:
219  break;
220  }
221 }
SHAPE_T m_shape
Definition: eda_shape.h:319
wxPoint m_bezierC1
Definition: eda_shape.h:328
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_arcCenter
Definition: eda_shape.h:325
wxPoint m_bezierC2
Definition: eda_shape.h:329
const std::vector< VECTOR2I > & CPoints() const
SHAPE_LINE_CHAIN & Outline(int aIndex)
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:332
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:71
wxPoint m_start
Definition: eda_shape.h:322
void SetPolyPoints(const std::vector< wxPoint > &aPoints)
Definition: eda_shape.cpp:1085
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:73
int GetRadius() const
Definition: eda_shape.cpp:472

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

Referenced by PCB_SHAPE::Scale().

◆ Set() [1/3]

bool INSPECTABLE::Set ( PROPERTY_BASE aProperty,
wxAny &  aValue 
)
inlineinherited

Definition at line 42 of file inspectable.h.

43  {
45  TYPE_ID thisType = TYPE_HASH( *this );
46  void* object = propMgr.TypeCast( this, thisType, aProperty->OwnerHash() );
47 
48  if( object )
49  aProperty->setter( object, aValue );
50 
51  return object != nullptr;
52  }
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:65
#define TYPE_HASH(x)
Definition: property.h:59
size_t TYPE_ID
Unique type identifier.
Definition: property_mgr.h:42
const void * TypeCast(const void *aSource, TYPE_ID aBase, TYPE_ID aTarget) const
Cast a type to another type.
virtual void setter(void *aObject, wxAny &aValue)=0
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:62
virtual size_t OwnerHash() const =0
Return type-id of the Owner class.

References PROPERTY_MANAGER::Instance(), PROPERTY_BASE::OwnerHash(), PROPERTY_BASE::setter(), TYPE_HASH, and PROPERTY_MANAGER::TypeCast().

◆ Set() [2/3]

template<typename T >
bool INSPECTABLE::Set ( PROPERTY_BASE aProperty,
aValue 
)
inlineinherited

Definition at line 55 of file inspectable.h.

56  {
58  TYPE_ID thisType = TYPE_HASH( *this );
59  void* object = propMgr.TypeCast( this, thisType, aProperty->OwnerHash() );
60 
61  if( object )
62  aProperty->set<T>( object, aValue );
63 
64  return object != nullptr;
65  }
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:65
#define TYPE_HASH(x)
Definition: property.h:59
size_t TYPE_ID
Unique type identifier.
Definition: property_mgr.h:42
const void * TypeCast(const void *aSource, TYPE_ID aBase, TYPE_ID aTarget) const
Cast a type to another type.
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:62
void set(void *aObject, T aValue)
Definition: property.h:261
virtual size_t OwnerHash() const =0
Return type-id of the Owner class.

References PROPERTY_MANAGER::Instance(), PROPERTY_BASE::OwnerHash(), PROPERTY_BASE::set(), TYPE_HASH, and PROPERTY_MANAGER::TypeCast().

◆ Set() [3/3]

template<typename T >
bool INSPECTABLE::Set ( const wxString &  aProperty,
aValue 
)
inlineinherited

Definition at line 68 of file inspectable.h.

69  {
71  TYPE_ID thisType = TYPE_HASH( *this );
72  PROPERTY_BASE* prop = propMgr.GetProperty( thisType, aProperty );
73  void* object = nullptr;
74 
75  if( prop )
76  {
77  object = propMgr.TypeCast( this, thisType, prop->OwnerHash() );
78 
79  if( object )
80  prop->set<T>( object, aValue );
81  }
82 
83  return object != nullptr;
84  }
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:65
#define TYPE_HASH(x)
Definition: property.h:59
size_t TYPE_ID
Unique type identifier.
Definition: property_mgr.h:42
const void * TypeCast(const void *aSource, TYPE_ID aBase, TYPE_ID aTarget) const
Cast a type to another type.
PROPERTY_BASE * GetProperty(TYPE_ID aType, const wxString &aProperty) const
Return a property for a specific type.
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:62
void set(void *aObject, T aValue)
Definition: property.h:261
virtual size_t OwnerHash() const =0
Return type-id of the Owner class.

References PROPERTY_MANAGER::GetProperty(), PROPERTY_MANAGER::Instance(), PROPERTY_BASE::OwnerHash(), PROPERTY_BASE::set(), TYPE_HASH, and PROPERTY_MANAGER::TypeCast().

◆ SetArcAngleAndEnd()

void EDA_SHAPE::SetArcAngleAndEnd ( double  aAngle,
bool  aCheckNegativeAngle = false 
)
inherited

Set the end point from the angle center and start.

Parameters
aAngleis tenths of degrees.

Definition at line 547 of file eda_shape.cpp.

548 {
549  m_end = m_start;
551 
552  if( aCheckNegativeAngle && aAngle < 0 )
553  {
554  std::swap( m_start, m_end );
555  m_endsSwapped = true;
556  }
557 }
T NormalizeAngle360Max(T Angle)
Normalize angle to be >=-360.0 and <= 360.0 Angle can be equal to -360 or +360.
Definition: trigo.h:241
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:229
wxPoint m_end
Definition: eda_shape.h:323
wxPoint m_arcCenter
Definition: eda_shape.h:325