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) 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 contained within or on the bounding box of an item. More...
 
bool HitTest (const EDA_RECT &aRect, bool aContained, int aAccuracy=0) const override
 Test if aRect intersects or is contained within the bounding box of an 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...
 
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 SetBezierPoints (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...
 
void SetPolyPoints (const std::vector< wxPoint > &aPoints)
 
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 ()
 
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...
 
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
 
wxPoint m_bezierC1
 
wxPoint m_bezierC2
 
std::vector< wxPoint > m_bezierPoints
 
SHAPE_POLY_SET m_poly
 
int m_editState
 

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:316

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

1170 {
1171  switch( GetShape() )
1172  {
1173  case SHAPE_T::SEGMENT:
1174  case SHAPE_T::CIRCLE:
1175  case SHAPE_T::RECT:
1176  SetStart( aPosition );
1177  SetEnd( aPosition );
1178  break;
1179 
1180  case SHAPE_T::ARC:
1181  SetArcGeometry( aPosition, aPosition, aPosition );
1182  m_editState = 1;
1183  break;
1184 
1185  case SHAPE_T::POLY:
1186  m_poly.NewOutline();
1187  m_poly.Outline( 0 ).SetClosed( false );
1188 
1189  // Start and end of the first segment (co-located for now)
1190  m_poly.Outline( 0 ).Append( aPosition );
1191  m_poly.Outline( 0 ).Append( aPosition, true );
1192  break;
1193 
1194  default:
1196  }
1197 }
void SetEnd(const wxPoint &aEnd)
Definition: eda_shape.h:126
void SetArcGeometry(const wxPoint &aStart, const wxPoint &aMid, const wxPoint &aEnd)
Set the three controlling points for an arc.
Definition: eda_shape.cpp:486
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:101
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:308
int m_editState
Definition: eda_shape.h:310
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
int NewOutline()
Creates a new hole in a given outline.
SHAPE_T GetShape() const
Definition: eda_shape.h:92

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

378 {
379  std::vector<wxPoint> bezierPoints;
380 
381  // Rebuild the m_BezierPoints vertex list that approximate the Bezier curve
382  std::vector<wxPoint> ctrlPoints = { m_start, m_bezierC1, m_bezierC2, m_end };
383  BEZIER_POLY converter( ctrlPoints );
384  converter.GetPoly( bezierPoints, aMinSegLen );
385 
386  return bezierPoints;
387 }
wxPoint m_bezierC1
Definition: eda_shape.h:304
wxPoint m_end
Definition: eda_shape.h:300
wxPoint m_bezierC2
Definition: eda_shape.h:305
wxPoint m_start
Definition: eda_shape.h:299
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 442 of file eda_shape.cpp.

443 {
444  VECTOR2D startRadial( GetStart() - getCenter() );
445  VECTOR2D endRadial( GetEnd() - getCenter() );
446 
447  aStartAngle = 180.0 / M_PI * atan2( startRadial.y, startRadial.x );
448  aEndAngle = 180.0 / M_PI * atan2( endRadial.y, endRadial.x );
449 
450  if( aEndAngle == aStartAngle )
451  aEndAngle = aStartAngle + 360.0; // ring, not null
452 
453  if( aStartAngle > aEndAngle )
454  {
455  if( aEndAngle < 0 )
456  aEndAngle = NormalizeAngleDegrees( aEndAngle, 0.0, 360.0 );
457  else
458  aStartAngle = NormalizeAngleDegrees( aStartAngle, -360.0, 0.0 );
459  }
460 }
wxPoint getCenter() const
Definition: eda_shape.cpp:390
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:97
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:122
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 KIGFX::PCB_PAINTER::draw(), and EDA_SHAPE::hitTest().

◆ calcEdit()

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

Definition at line 1227 of file eda_shape.cpp.

1228 {
1229 #define sq( x ) pow( x, 2 )
1230 
1231  switch( GetShape() )
1232  {
1233  case SHAPE_T::SEGMENT:
1234  case SHAPE_T::CIRCLE:
1235  case SHAPE_T::RECT:
1236  SetEnd( aPosition );
1237  break;
1238 
1239  case SHAPE_T::ARC:
1240  {
1241  int radius = GetRadius();
1242 
1243  // Edit state 0: drawing: place start
1244  // Edit state 1: drawing: place end (center calculated for 90-degree subtended angle)
1245  // Edit state 2: point edit: move start (center calculated for invariant subtended angle)
1246  // Edit state 3: point edit: move end (center calculated for invariant subtended angle)
1247  // Edit state 4: point edit: move center
1248  // Edit state 5: point edit: move arc-mid-point
1249 
1250  switch( m_editState )
1251  {
1252  case 0:
1253  SetArcGeometry( aPosition, aPosition, aPosition );
1254  return;
1255 
1256  case 1:
1257  m_end = aPosition;
1258  radius = KiROUND( sqrt( sq( GetLineLength( m_start, m_end ) ) / 2.0 ) );
1259  break;
1260 
1261  case 2:
1262  case 3:
1263  {
1264  wxPoint v = m_start - m_end;
1265  double chordBefore = sq( v.x ) + sq( v.y );
1266 
1267  if( m_editState == 2 )
1268  m_start = aPosition;
1269  else
1270  m_end = aPosition;
1271 
1272  v = m_start - m_end;
1273  double chordAfter = sq( v.x ) + sq( v.y );
1274  double ratio = chordAfter / chordBefore;
1275 
1276  if( ratio != 0 )
1277  {
1278  radius = std::max( int( sqrt( sq( radius ) * ratio ) ) + 1,
1279  int( sqrt( chordAfter ) / 2 ) + 1 );
1280  }
1281  }
1282  break;
1283 
1284  case 4:
1285  {
1286  double chordA = GetLineLength( m_start, aPosition );
1287  double chordB = GetLineLength( m_end, aPosition );
1288  radius = int( ( chordA + chordB ) / 2.0 ) + 1;
1289  }
1290  break;
1291 
1292  case 5:
1293  SetArcGeometry( GetStart(), aPosition, GetEnd() );
1294  return;
1295  }
1296 
1297  // Calculate center based on start, end, and radius
1298  //
1299  // Let 'l' be the length of the chord and 'm' the middle point of the chord
1300  double l = GetLineLength( m_start, m_end );
1301  wxPoint m = ( m_start + m_end ) / 2;
1302 
1303  // Calculate 'd', the vector from the chord midpoint to the center
1304  wxPoint d;
1305  d.x = KiROUND( sqrt( sq( radius ) - sq( l/2 ) ) * ( m_start.y - m_end.y ) / l );
1306  d.y = KiROUND( sqrt( sq( radius ) - sq( l/2 ) ) * ( m_end.x - m_start.x ) / l );
1307 
1308  wxPoint c1 = m + d;
1309  wxPoint c2 = m - d;
1310 
1311  // Solution gives us 2 centers; we need to pick one:
1312  switch( m_editState )
1313  {
1314  case 1:
1315  {
1316  // Keep center clockwise from chord while drawing
1317  wxPoint chordVector = m_end - m_start;
1318  double chordAngle = ArcTangente( chordVector.y, chordVector.x );
1319  NORMALIZE_ANGLE_POS( chordAngle );
1320 
1321  wxPoint c1Test = c1;
1322  RotatePoint( &c1Test, m_start, -chordAngle );
1323 
1324  m_arcCenter = c1Test.x > 0 ? c2 : c1;
1325  }
1326  break;
1327 
1328  case 2:
1329  case 3:
1330  // Pick the one closer to the old center
1331  m_arcCenter = GetLineLength( c1, m_arcCenter ) < GetLineLength( c2, m_arcCenter ) ? c1 : c2;
1332  break;
1333 
1334  case 4:
1335  // Pick the one closer to the mouse position
1336  m_arcCenter = GetLineLength( c1, aPosition ) < GetLineLength( c2, aPosition ) ? c1 : c2;
1337  break;
1338  }
1339  }
1340  break;
1341 
1342  case SHAPE_T::POLY:
1343  m_poly.Outline( 0 ).SetPoint( m_poly.Outline( 0 ).GetPointCount() - 1, aPosition );
1344  break;
1345 
1346  default:
1348  }
1349 }
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:126
void SetArcGeometry(const wxPoint &aStart, const wxPoint &aMid, const wxPoint &aEnd)
Set the three controlling points for an arc.
Definition: eda_shape.cpp:486
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:97
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:300
wxPoint m_arcCenter
Definition: eda_shape.h:302
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:122
SHAPE_LINE_CHAIN & Outline(int aIndex)
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:308
int m_editState
Definition: eda_shape.h:310
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
wxPoint m_start
Definition: eda_shape.h:299
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:92
double ArcTangente(int dy, int dx)
Definition: trigo.cpp:183
int GetRadius() const
Definition: eda_shape.cpp:463

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:113

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 154 of file eda_item.h.

154 { m_flags &= ~aMask; }
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:481

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(), 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 166 of file eda_item.h.

167  {
169  DO_NOT_DRAW );
170  }
#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:154
#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 135 of file fp_shape.cpp.

136 {
137  return new FP_SHAPE( *this );
138 }
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 1401 of file eda_shape.cpp.

1402 {
1403 #define TEST( a, b ) { if( a != b ) return a - b; }
1404 #define TEST_PT( a, b ) { TEST( a.x, b.x ); TEST( a.y, b.y ); }
1405 
1406  TEST_PT( m_start, aOther->m_start );
1407  TEST_PT( m_end, aOther->m_end );
1408 
1409  TEST( (int) m_shape, (int) aOther->m_shape );
1410 
1411  if( m_shape == SHAPE_T::ARC )
1412  {
1413  TEST_PT( m_arcCenter, aOther->m_arcCenter );
1414  }
1415  else if( m_shape == SHAPE_T::BEZIER )
1416  {
1417  TEST_PT( m_bezierC1, aOther->m_bezierC1 );
1418  TEST_PT( m_bezierC2, aOther->m_bezierC2 );
1419  }
1420  else if( m_shape == SHAPE_T::POLY )
1421  {
1422  TEST( m_poly.TotalVertices(), aOther->m_poly.TotalVertices() );
1423 
1424  for( int ii = 0; ii < m_poly.TotalVertices(); ++ii )
1425  TEST_PT( m_poly.CVertex( ii ), aOther->m_poly.CVertex( ii ) );
1426  }
1427 
1428  TEST( m_width, aOther->m_width );
1429  TEST( (int) m_fill, (int) aOther->m_fill );
1430 
1431  return 0;
1432 }
int TotalVertices() const
Delete aIdx-th polygon from the set.
SHAPE_T m_shape
Definition: eda_shape.h:296
wxPoint m_bezierC1
Definition: eda_shape.h:304
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:300
wxPoint m_arcCenter
Definition: eda_shape.h:302
wxPoint m_bezierC2
Definition: eda_shape.h:305
#define TEST(a, b)
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:308
FILL_T m_fill
Definition: eda_shape.h:298
wxPoint m_start
Definition: eda_shape.h:299
#define TEST_PT(a, b)
int m_width
Definition: eda_shape.h:297

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

969 {
970  // Do not include the center, which is not necessarily
971  // inside the BB of a arc with a small angle
972  aBBox.SetOrigin( m_start );
973  aBBox.Merge( m_end );
974 
975  // Determine the starting quarter
976  // 0 right-bottom
977  // 1 left-bottom
978  // 2 left-top
979  // 3 right-top
980  unsigned int quarter = 0; // assume right-bottom
981 
982  if( m_start.x < m_arcCenter.x )
983  {
984  if( m_start.y <= m_arcCenter.y )
985  quarter = 2;
986  else // ( m_start.y > m_arcCenter.y )
987  quarter = 1;
988  }
989  else if( m_start.x >= m_arcCenter.x )
990  {
991  if( m_start.y < m_arcCenter.y )
992  quarter = 3;
993  else if( m_start.x == m_arcCenter.x )
994  quarter = 1;
995  }
996 
997  int radius = GetRadius();
998  VECTOR2I startRadial = GetStart() - getCenter();
999  VECTOR2I endRadial = GetEnd() - getCenter();
1000  double angleStart = ArcTangente( startRadial.y, startRadial.x );
1001  double arcAngle = RAD2DECIDEG( endRadial.Angle() - startRadial.Angle() );
1002  int angle = (int) NormalizeAnglePos( angleStart ) % 900 + NormalizeAnglePos( arcAngle );
1003 
1004  while( angle > 900 )
1005  {
1006  switch( quarter )
1007  {
1008  case 0: aBBox.Merge( wxPoint( m_arcCenter.x, m_arcCenter.y + radius ) ); break; // down
1009  case 1: aBBox.Merge( wxPoint( m_arcCenter.x - radius, m_arcCenter.y ) ); break; // left
1010  case 2: aBBox.Merge( wxPoint( m_arcCenter.x, m_arcCenter.y - radius ) ); break; // up
1011  case 3: aBBox.Merge( wxPoint( m_arcCenter.x + radius, m_arcCenter.y ) ); break; // right
1012  }
1013 
1014  ++quarter %= 4;
1015  angle -= 900;
1016  }
1017 
1018  aBBox.Inflate( GetWidth() ); // Technically m_width / 2, but it doesn't hurt to have the
1019  // bounding box a bit large to account for drawing clearances,
1020  // etc.
1021 }
int GetWidth() const
Definition: eda_shape.h:89
void Merge(const EDA_RECT &aRect)
Modify the position and size of the rectangle in order to contain aRect.
Definition: eda_rect.cpp:432
wxPoint getCenter() const
Definition: eda_shape.cpp:390
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:97
double RAD2DECIDEG(double rad)
Definition: trigo.h:234
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:121
wxPoint m_end
Definition: eda_shape.h:300
wxPoint m_arcCenter
Definition: eda_shape.h:302
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:122
double Angle() const
Compute the angle of the vector.
Definition: vector2d.h:307
wxPoint m_start
Definition: eda_shape.h:299
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 ArcTangente(int dy, int dx)
Definition: trigo.cpp:183
int GetRadius() const
Definition: eda_shape.cpp:463
EDA_RECT & Inflate(wxCoord dx, wxCoord dy)
Inflate the rectangle horizontally by dx and vertically by dy.
Definition: eda_rect.cpp:364

References PNS::angle(), VECTOR2< T >::Angle(), ArcTangente(), EDA_SHAPE::getCenter(), EDA_SHAPE::GetEnd(), EDA_SHAPE::GetRadius(), EDA_SHAPE::GetStart(), EDA_SHAPE::GetWidth(), EDA_RECT::Inflate(), EDA_SHAPE::m_arcCenter, EDA_SHAPE::m_end, EDA_SHAPE::m_start, EDA_RECT::Merge(), NormalizeAnglePos(), RAD2DECIDEG(), EDA_RECT::SetOrigin(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by EDA_SHAPE::getBoundingBox(), and PCB_SHAPE::ViewBBox().

◆ continueEdit()

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

Definition at line 1200 of file eda_shape.cpp.

1201 {
1202  switch( GetShape() )
1203  {
1204  case SHAPE_T::ARC:
1205  case SHAPE_T::SEGMENT:
1206  case SHAPE_T::CIRCLE:
1207  case SHAPE_T::RECT:
1208  return false;
1209 
1210  case SHAPE_T::POLY:
1211  {
1212  SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
1213 
1214  // do not add zero-length segments
1215  if( poly.CPoint( poly.GetPointCount() - 2 ) != poly.CLastPoint() )
1216  poly.Append( aPosition, true );
1217  }
1218  return true;
1219 
1220  default:
1222  return false;
1223  }
1224 }
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:308
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
Represent a polyline (an zero-thickness chain of connected line segments).
const VECTOR2I & CLastPoint() const
Return the last point in the line chain.
SHAPE_T GetShape() const
Definition: eda_shape.h:92

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 126 of file board_item.cpp.

127 {
128  BOARD_ITEM_CONTAINER* parent = GetParent();
129 
130  if( parent )
131  parent->Remove( this );
132 
133  delete this;
134 }
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:135

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

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

◆ Duplicate()

virtual BOARD_ITEM* BOARD_ITEM::Duplicate ( ) const
inlinevirtualinherited

Create a copy of this BOARD_ITEM.

Reimplemented in FOOTPRINT.

Definition at line 169 of file board_item.h.

170  {
171  EDA_ITEM* dupe = Clone();
172  const_cast<KIID&>( dupe->m_Uuid ) = KIID();
173 
174  return static_cast<BOARD_ITEM*>( dupe );
175  }
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:475
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:100

References EDA_ITEM::Clone(), and EDA_ITEM::m_Uuid.

Referenced by CADSTAR_PCB_ARCHIVE_LOADER::addAttribute(), PCB_GROUP::DeepDuplicate(), KIGFX::PCB_PAINTER::draw(), DRAWING_TOOL::DrawBoardCharacteristics(), CADSTAR_PCB_ARCHIVE_LOADER::drawCadstarText(), DRAWING_TOOL::DrawSpecificationStackup(), EDIT_TOOL::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 1129 of file eda_shape.cpp.

1130 {
1131  if( m_poly.OutlineCount() )
1132  {
1133  int pointCount = m_poly.COutline( 0 ).PointCount();
1134 
1135  if( pointCount )
1136  {
1137  aBuffer.reserve( pointCount );
1138 
1139  for ( auto iter = m_poly.CIterate(); iter; iter++ )
1140  aBuffer.emplace_back( iter->x, iter->y );
1141  }
1142  }
1143 }
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:308
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 ( )
protectedinherited

Definition at line 1352 of file eda_shape.cpp.

1353 {
1354  switch( GetShape() )
1355  {
1356  case SHAPE_T::ARC:
1357  case SHAPE_T::SEGMENT:
1358  case SHAPE_T::CIRCLE:
1359  case SHAPE_T::RECT:
1360  break;
1361 
1362  case SHAPE_T::POLY:
1363  {
1364  SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
1365 
1366  // do not include last point twice
1367  if( poly.GetPointCount() > 2 )
1368  {
1369  if( poly.CPoint( poly.GetPointCount() - 2 ) == poly.CLastPoint() )
1370  {
1371  poly.SetClosed( true );
1372  poly.Remove( poly.GetPointCount() - 1 );
1373  }
1374  }
1375  }
1376  break;
1377 
1378  default:
1380  }
1381 }
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:308
#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:68
Represent a polyline (an zero-thickness chain of connected line segments).
const VECTOR2I & CLastPoint() const
Return the last point in the line chain.
SHAPE_T GetShape() const
Definition: eda_shape.h:92

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

166 { return m_endsSwapped; }
bool m_endsSwapped
Definition: eda_shape.h:295

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 202 of file fp_shape.cpp.

203 {
204  wxPoint pt( 0, 0 );
205 
206  switch( GetShape() )
207  {
208  case SHAPE_T::ARC:
209  case SHAPE_T::SEGMENT:
210  case SHAPE_T::RECT:
211  case SHAPE_T::CIRCLE:
212  case SHAPE_T::BEZIER:
213  // If Start0 and Start are equal (ie: Footprint Editor), then flip both sets around the
214  // centre point.
215  if( m_start == m_start0 )
216  pt = aCentre;
217 
218  if( aFlipLeftRight )
219  {
220  MIRROR( m_start.x, aCentre.x );
221  MIRROR( m_end.x, aCentre.x );
222  MIRROR( m_arcCenter.x, aCentre.x );
223  MIRROR( m_bezierC1.x, aCentre.x );
224  MIRROR( m_bezierC2.x, aCentre.x );
225  MIRROR( m_start0.x, pt.x );
226  MIRROR( m_end0.x, pt.x );
227  MIRROR( m_arcCenter0.x, pt.x );
228  MIRROR( m_bezierC1_0.x, pt.x );
229  MIRROR( m_bezierC2_0.x, pt.x );
230  }
231  else
232  {
233  MIRROR( m_start.y, aCentre.y );
234  MIRROR( m_end.y, aCentre.y );
235  MIRROR( m_arcCenter.y, aCentre.y );
236  MIRROR( m_bezierC1.y, aCentre.y );
237  MIRROR( m_bezierC2.y, aCentre.y );
238  MIRROR( m_start0.y, pt.y );
239  MIRROR( m_end0.y, pt.y );
240  MIRROR( m_arcCenter0.y, pt.y );
241  MIRROR( m_bezierC1_0.y, pt.y );
242  MIRROR( m_bezierC2_0.y, pt.y );
243  }
244 
245  if( GetShape() == SHAPE_T::BEZIER )
247 
248  break;
249 
250  case SHAPE_T::POLY:
251  // polygon corners coordinates are relative to the footprint position, orientation 0
252  m_poly.Mirror( aFlipLeftRight, !aFlipLeftRight );
253  break;
254 
255  default:
257  }
258 
259  SetLayer( FlipLayer( GetLayer(), GetBoard()->GetCopperLayerCount() ) );
260 }
wxPoint m_bezierC1
Definition: eda_shape.h:304
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:161
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayerId, int aCopperLayersCount)
Definition: lset.cpp:521
wxPoint m_arcCenter0
Center of arc, relative to footprint origin, orient 0.
Definition: fp_shape.h:165
wxPoint m_end
Definition: eda_shape.h:300
wxPoint m_arcCenter
Definition: eda_shape.h:302
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:305
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:308
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
wxPoint m_start
Definition: eda_shape.h:299
void RebuildBezierToSegmentsPointsList(int aMinSegLen)
Rebuild the m_BezierPoints vertex list that approximate the Bezier curve by a list of segments.
Definition: eda_shape.cpp:363
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:92
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:297
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:140
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 267 of file board_item.h.

268  {
269  Flip( wxPoint( aCentre.x, aCentre.y ), aFlipLeftRight );
270  }
virtual void Flip(const wxPoint &aCentre, bool aFlipLeftRight)
Flip this object, i.e.
Definition: board_item.cpp:183

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

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

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()

◆ GetArcMid()

wxPoint EDA_SHAPE::GetArcMid ( ) const
inherited

◆ GetArcMid0()

wxPoint FP_SHAPE::GetArcMid0 ( ) const

Definition at line 176 of file fp_shape.cpp.

177 {
178  wxPoint mid0 = m_start0;
179  RotatePoint( &mid0, m_arcCenter0, -GetArcAngle() / 2.0 );
180  return mid0;
181 }
double GetArcAngle() const
Definition: eda_shape.cpp:495
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_start0
Start point or circle center, relative to footprint origin, orient 0.
Definition: fp_shape.h:163

References EDA_SHAPE::GetArcAngle(), m_arcCenter0, m_start0, and RotatePoint().

Referenced by PCB_IO::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_IO::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_IO::format().

◆ GetBezierPoints()

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

Definition at line 190 of file eda_shape.h.

190 { return m_bezierPoints; }
std::vector< wxPoint > m_bezierPoints
Definition: eda_shape.h:307

References EDA_SHAPE::m_bezierPoints.

Referenced by GRAPHICS_CLEANER::areEquivalent(), ConvertOutlineToPolygon(), and GRAPHICS_CLEANER::isNullShape().

◆ 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:135
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:113

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(), 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(), PCB_TRACK::GetWidthConstraints(), inDiffPair(), insideArea(), insideBackCourtyard(), insideCourtyard(), insideFrontCourtyard(), isInsideArea(), isInsideCourtyard(), 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:135
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:113

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 101 of file pcb_shape.h.

101 { return getBoundingBox(); }
const EDA_RECT getBoundingBox() const
Definition: eda_shape.cpp:596

References EDA_SHAPE::getBoundingBox().

Referenced by BOARD_ADAPTER::addShapeWithClearance().

◆ getBoundingBox()

const EDA_RECT EDA_SHAPE::getBoundingBox ( ) const
protectedinherited

Definition at line 596 of file eda_shape.cpp.

597 {
598  EDA_RECT bbox;
599 
600  switch( m_shape )
601  {
602  case SHAPE_T::RECT:
603  for( wxPoint& pt : GetRectCorners() )
604  bbox.Merge( pt );
605 
606  break;
607 
608  case SHAPE_T::SEGMENT:
609  bbox.SetOrigin( GetStart() );
610  bbox.SetEnd( GetEnd() );
611  break;
612 
613  case SHAPE_T::CIRCLE:
614  bbox.SetOrigin( GetStart() );
615  bbox.Inflate( GetRadius() );
616  break;
617 
618  case SHAPE_T::ARC:
619  computeArcBBox( bbox );
620  break;
621 
622  case SHAPE_T::POLY:
623  if( m_poly.IsEmpty() )
624  break;
625 
626  for( auto iter = m_poly.CIterate(); iter; iter++ )
627  {
628  wxPoint pt( iter->x, iter->y );
629 
631  pt += getParentPosition();
632 
633  bbox.Merge( pt );
634  }
635 
636  break;
637 
638  case SHAPE_T::BEZIER:
639  bbox.SetOrigin( GetStart() );
640  bbox.Merge( GetBezierC1() );
641  bbox.Merge( GetBezierC2() );
642  bbox.Merge( GetEnd() );
643  break;
644 
645  default:
647  break;
648  }
649 
650  bbox.Inflate( m_width / 2 );
651  bbox.Normalize();
652 
653  return bbox;
654 }
SHAPE_T m_shape
Definition: eda_shape.h:296
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:97
bool IsEmpty() const
void computeArcBBox(EDA_RECT &aBBox) const
Definition: eda_shape.cpp:968
virtual wxPoint getParentPosition() const =0
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:121
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:229
const wxPoint & GetBezierC1() const
Definition: eda_shape.h:145
std::vector< wxPoint > GetRectCorners() const
Definition: eda_shape.cpp:932
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:122
void SetEnd(int x, int y)
Definition: eda_rect.h:182
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:308
const wxPoint & GetBezierC2() const
Definition: eda_shape.h:148
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
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:297
int GetRadius() const
Definition: eda_shape.cpp:463
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 390 of file eda_shape.cpp.

391 {
392  switch( m_shape )
393  {
394  case SHAPE_T::ARC:
395  return m_arcCenter;
396 
397  case SHAPE_T::CIRCLE:
398  return m_start;
399 
400  case SHAPE_T::SEGMENT:
401  // Midpoint of the line
402  return ( m_start + m_end ) / 2;
403 
404  case SHAPE_T::POLY:
405  case SHAPE_T::RECT:
406  case SHAPE_T::BEZIER:
407  return getBoundingBox().Centre();
408 
409  default:
411  return wxPoint();
412  }
413 }
SHAPE_T m_shape
Definition: eda_shape.h:296
wxPoint m_end
Definition: eda_shape.h:300
wxPoint m_arcCenter
Definition: eda_shape.h:302
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
wxPoint m_start
Definition: eda_shape.h:299
const EDA_RECT getBoundingBox() const
Definition: eda_shape.cpp:596
wxPoint Centre() const
Definition: eda_rect.h:55

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(), EDA_SHAPE::computeArcBBox(), 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 141 of file fp_shape.cpp.

142 {
143  switch( m_shape )
144  {
145  case SHAPE_T::ARC:
146  return m_arcCenter0;
147 
148  case SHAPE_T::CIRCLE:
149  return m_start0;
150 
151  default:
153  return wxPoint();
154  }
155 }
SHAPE_T m_shape
Definition: eda_shape.h:296
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:68
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 158 of file eda_item.h.

159  {
160  constexpr int mask = ( IS_NEW | IS_PASTED | IS_MOVING | IS_RESIZING | IS_DRAGGING
162 
163  return m_flags & mask;
164  }
#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:481
#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) const
overridevirtualinherited

Make a set of SHAPE objects representing the PCB_SHAPE.

Caller owns the objects.

Reimplemented from BOARD_ITEM.

Definition at line 200 of file pcb_shape.cpp.

201 {
202  return std::make_shared<SHAPE_COMPOUND>( MakeEffectiveShapes() );
203 }
std::vector< SHAPE * > MakeEffectiveShapes() const
Make a set of SHAPE objects representing the EDA_SHAPE.
Definition: eda_shape.cpp:1034

References EDA_SHAPE::MakeEffectiveShapes().

◆ GetEnd()

const wxPoint& EDA_SHAPE::GetEnd ( ) const
inlineinherited

Return the ending point of the graphic.

Definition at line 122 of file eda_shape.h.

122 { return m_end; }
wxPoint m_end
Definition: eda_shape.h:300

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(), EDA_SHAPE::computeArcBBox(), ConvertOutlineToPolygon(), CreateBoardSection(), CONVERT_TOOL::CreateLines(), MICROWAVE_TOOL::createMicrowaveInductor(), KIGFX::SCH_PAINTER::draw(), KIGFX::PCB_PAINTER::draw(), PCB_POINT_EDITOR::editArcEndpointKeepTangent(), PCB_IO::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(), 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(), 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_IO::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 124 of file eda_shape.h.

124 { return m_end.x; }
wxPoint m_end
Definition: eda_shape.h:300

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

123 { return m_end.y; }
wxPoint m_end
Definition: eda_shape.h:300

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:296
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:97
bool IsFilled() const
Definition: eda_shape.h:81
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:207
wxPoint GetArcMid() const
Definition: eda_shape.cpp:434
int GetRadius() const
Definition: eda_shape.cpp:463

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 140 of file board_item.h.

140 { return m_layer; }
PCB_LAYER_ID m_layer
Definition: board_item.h:316

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(), PCB_BASE_FRAME::FocusOnItem(), FOOTPRINT_DESC::FOOTPRINT_DESC(), PCB_IO::FootprintSave(), FootprintWriteShape(), PCB_IO::format(), PCB_IO::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_TRACK::GetWidthConstraints(), 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(), 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 73 of file board_item.cpp.

74 {
75  const BOARD* board = GetBoard();
76 
77  if( board )
78  return board->GetLayerName( m_layer );
79 
80  // If no parent, return standard name
82 }
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:190
PCB_LAYER_ID m_layer
Definition: board_item.h:316
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:605

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

Referenced by PCB_TARGET::GetMsgPanelInfo(), PCB_TEXT::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 103 of file eda_shape.cpp.

104 {
105  double length = 0.0;
106 
107  switch( m_shape )
108  {
109  case SHAPE_T::BEZIER:
110  for( size_t ii = 1; ii < m_bezierPoints.size(); ++ii )
111  length += GetLineLength( m_bezierPoints[ ii - 1], m_bezierPoints[ii] );
112 
113  return length;
114 
115  case SHAPE_T::SEGMENT:
116  return GetLineLength( GetStart(), GetEnd() );
117 
118  case SHAPE_T::POLY:
119  for( int ii = 0; ii < m_poly.COutline( 0 ).SegmentCount(); ii++ )
120  length += m_poly.COutline( 0 ).CSegment( ii ).Length();
121 
122  return length;
123 
124  case SHAPE_T::ARC:
125  return 2 * M_PI * GetRadius() * ( GetArcAngle() / 3600.0 );
126 
127  default:
129  return 0.0;
130  }
131 }
int Length() const
Return the length (this).
Definition: seg.h:350
SHAPE_T m_shape
Definition: eda_shape.h:296
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:97
double GetArcAngle() const
Definition: eda_shape.cpp:495
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:122
std::vector< wxPoint > m_bezierPoints
Definition: eda_shape.h:307
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:308
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
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:463

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 129 of file fp_shape.cpp.

130 {
131  return BITMAPS::show_mod_edge;
132 }

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  FOOTPRINT* fp = static_cast<FOOTPRINT*>( m_parent );
113 
114  aList.emplace_back( _( "Footprint" ), fp ? fp->GetReference() : _( "<invalid>" ) );
115 
116  // append the features shared with the base class
117  PCB_SHAPE::GetMsgPanelInfo( aFrame, aList );
118 }
EDA_ITEM * m_parent
Linked list: Link (parent struct)
Definition: eda_item.h:479
const wxString & GetReference() const
Definition: footprint.h:449
#define _(s)
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(), and EDA_ITEM::m_parent.

◆ GetParent()

BOARD_ITEM_CONTAINER* BOARD_ITEM::GetParent ( void  ) const
inlineinherited

Definition at line 135 of file board_item.h.

135 { return (BOARD_ITEM_CONTAINER*) m_parent; }
EDA_ITEM * m_parent
Linked list: Link (parent struct)
Definition: eda_item.h:479
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::doMoveSelection(), EDIT_TOOL::Drag(), EDIT_TOOL::DragArcTrack(), KIGFX::PCB_PAINTER::draw(), EDIT_TOOL::Duplicate(), PCB_SELECTION_TOOL::FilterCollectorForHierarchy(), PCB_IO::format(), FormatProbeItem(), BOARD_ITEM::GetBoard(), PCB_MARKER::GetColorLayer(), 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:479
wxString AsString() const
Definition: kiid.cpp:218
const KIID m_Uuid
Definition: eda_item.h:475

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:479
class FOOTPRINT, a footprint
Definition: typeinfo.h:88
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:113

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:190
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:186

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

1159 {
1160  // return the number of corners of the polygonal shape
1161  // this shape is expected to be only one polygon without hole
1162  if( GetPolyShape().OutlineCount() )
1163  return GetPolyShape().VertexCount( 0 );
1164 
1165  return 0;
1166 }
int VertexCount(int aOutline=-1, int aHole=-1) const
Returns the number of holes in a given outline.
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:207

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

208 { return m_poly; }
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:308

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:92

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

93 {
94  if( m_shape == SHAPE_T::ARC )
95  return getCenter();
96  else if( m_shape == SHAPE_T::POLY )
97  return (wxPoint) m_poly.CVertex( 0 );
98  else
99  return m_start;
100 }
SHAPE_T m_shape
Definition: eda_shape.h:296
wxPoint getCenter() const
Definition: eda_shape.cpp:390
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:308
wxPoint m_start
Definition: eda_shape.h:299

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

464 {
465  double radius = 0.0;
466 
467  switch( m_shape )
468  {
469  case SHAPE_T::ARC:
470  radius = GetLineLength( m_arcCenter, m_start );
471  break;
472 
473  case SHAPE_T::CIRCLE:
474  radius = GetLineLength( m_start, m_end );
475  break;
476 
477  default:
479  }
480 
481  // don't allow degenerate circles/arcs
482  return std::max( 1, KiROUND( radius ) );
483 }
SHAPE_T m_shape
Definition: eda_shape.h:296
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:300
wxPoint m_arcCenter
Definition: eda_shape.h:302
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
wxPoint m_start
Definition: eda_shape.h:299
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(), 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 932 of file eda_shape.cpp.

933 {
934  std::vector<wxPoint> pts;
935  wxPoint topLeft = GetStart();
936  wxPoint botRight = GetEnd();
937 
938  // Un-rotate rect topLeft and botRight
939  if( KiROUND( getParentOrientation() ) % 900 != 0 )
940  {
941  topLeft -= getParentPosition();
942  RotatePoint( &topLeft, -getParentOrientation() );
943 
944  botRight -= getParentPosition();
945  RotatePoint( &botRight, -getParentOrientation() );
946  }
947 
948  // Set up the un-rotated 4 corners
949  pts.emplace_back( topLeft );
950  pts.emplace_back( botRight.x, topLeft.y );
951  pts.emplace_back( botRight );
952  pts.emplace_back( topLeft.x, botRight.y );
953 
954  // Now re-rotate the 4 corners to get a diamond
955  if( KiROUND( getParentOrientation() ) % 900 != 0 )
956  {
957  for( wxPoint& pt : pts )
958  {
960  pt += getParentPosition();
961  }
962  }
963 
964  return pts;
965 }
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:97
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:122
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 121 of file fp_shape.cpp.

122 {
123  return wxString::Format( _( "%s on %s" ),
124  ShowShape(),
125  GetLayerName() );
126 }
wxString ShowShape() const
Definition: eda_shape.cpp:53
#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:73

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

◆ GetShape()

SHAPE_T EDA_SHAPE::GetShape ( ) const
inlineinherited

Definition at line 92 of file eda_shape.h.

92 { return m_shape; }
SHAPE_T m_shape
Definition: eda_shape.h:296

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(), GRAPHICS_CLEANER::cleanupSegments(), PCB_GRID_HELPER::computeAnchors(), EDA_SHAPE::continueEdit(), ConvertOutlineToPolygon(), CONVERT_TOOL::CreateLines(), 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_IO::format(), FOOTPRINT::GetCoverageArea(), LIB_SHAPE::GetMenuImage(), CADSTAR_SCH_ARCHIVE_LOADER::getScaledLibPart(), LIB_SHAPE::GetSelectMenuText(), 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_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(), DIALOG_GRAPHIC_ITEM_PROPERTIES::Validate(), and PCB_SHAPE::ViewBBox().

◆ GetStart()

const wxPoint& EDA_SHAPE::GetStart ( ) const
inlineinherited

Return the starting point of the graphic.

Definition at line 97 of file eda_shape.h.

97 { return m_start; }
wxPoint m_start
Definition: eda_shape.h:299

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(), EDA_SHAPE::computeArcBBox(), ConvertOutlineToPolygon(), CreateBoardSection(), CONVERT_TOOL::CreateLines(), MICROWAVE_TOOL::createMicrowaveInductor(), KIGFX::PCB_PAINTER::draw(), PCB_POINT_EDITOR::editArcEndpointKeepCenter(), PCB_POINT_EDITOR::editArcEndpointKeepTangent(), PCB_IO::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(), 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_IO::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 99 of file eda_shape.h.

99 { return m_start.x; }
wxPoint m_start
Definition: eda_shape.h:299

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

98 { return m_start.y; }
wxPoint m_start
Definition: eda_shape.h:299

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 137 of file eda_item.h.

138  {
139  return m_status & type;
140  }
EDA_ITEM_FLAGS m_status
Definition: eda_item.h:478

References EDA_ITEM::m_status.

Referenced by BOARD_ITEM::IsLocked().

◆ GetStatus()

EDA_ITEM_FLAGS EDA_ITEM::GetStatus ( ) const
inlineinherited

Definition at line 150 of file eda_item.h.

150 { return m_status; }
EDA_ITEM_FLAGS m_status
Definition: eda_item.h:478

References EDA_ITEM::m_status.

◆ GetWidth()

◆ 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 contained within or on the bounding box of an 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 103 of file pcb_shape.h.

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

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 or is contained within the bounding box of an 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 108 of file pcb_shape.h.

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

References EDA_SHAPE::hitTest().

◆ hitTest() [1/2]

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

Definition at line 657 of file eda_shape.cpp.

658 {
659  int maxdist = aAccuracy;
660 
661  if( m_width > 0 )
662  maxdist += m_width / 2;
663 
664  switch( m_shape )
665  {
666  case SHAPE_T::CIRCLE:
667  {
668  int radius = GetRadius();
669  int dist = KiROUND( EuclideanNorm( aPosition - getCenter() ) );
670 
671  if( IsFilled() )
672  return dist <= radius + maxdist; // Filled circle hit-test
673  else
674  return abs( radius - dist ) <= maxdist; // Ring hit-test
675  }
676 
677  case SHAPE_T::ARC:
678  {
679  wxPoint relPos = aPosition - getCenter();
680  int radius = GetRadius();
681  int dist = KiROUND( EuclideanNorm( relPos ) );
682 
683  if( abs( radius - dist ) <= maxdist )
684  {
685  double startAngle;
686  double endAngle;
687  CalcArcAngles( startAngle, endAngle );
688 
689  double relPosAngle = 180.0 / M_PI * atan2( relPos.y, relPos.x );
690 
691  if( relPosAngle >= startAngle && relPosAngle <= endAngle )
692  return true;
693 
694  relPosAngle = NormalizeAngleDegrees( relPosAngle, 0.0, 360.0 );
695 
696  if( relPosAngle >= startAngle && relPosAngle <= endAngle )
697  return true;
698 
699  }
700 
701  return false;
702  }
703 
704  case SHAPE_T::BEZIER:
705  const_cast<EDA_SHAPE*>( this )->RebuildBezierToSegmentsPointsList( m_width );
706 
707  for( unsigned int i= 1; i < m_bezierPoints.size(); i++)
708  {
709  if( TestSegmentHit( aPosition, m_bezierPoints[ i - 1], m_bezierPoints[i], maxdist ) )
710  return true;
711  }
712 
713  return false;
714 
715  case SHAPE_T::SEGMENT:
716  return TestSegmentHit( aPosition, GetStart(), GetEnd(), maxdist );
717 
718  case SHAPE_T::RECT:
719  if( IsFilled() ) // Filled rect hit-test
720  {
721  SHAPE_POLY_SET poly;
722  poly.NewOutline();
723 
724  for( const wxPoint& pt : GetRectCorners() )
725  poly.Append( pt );
726 
727  return poly.Collide( VECTOR2I( aPosition ), maxdist );
728  }
729  else // Open rect hit-test
730  {
731  std::vector<wxPoint> pts = GetRectCorners();
732 
733  return TestSegmentHit( aPosition, pts[0], pts[1], maxdist )
734  || TestSegmentHit( aPosition, pts[1], pts[2], maxdist )
735  || TestSegmentHit( aPosition, pts[2], pts[3], maxdist )
736  || TestSegmentHit( aPosition, pts[3], pts[0], maxdist );
737  }
738 
739  case SHAPE_T::POLY:
740  if( IsFilled() )
741  {
742  return m_poly.Collide( VECTOR2I( aPosition ), maxdist );
743  }
744  else
745  {
747  return m_poly.CollideEdge( VECTOR2I( aPosition ), dummy, maxdist );
748  }
749 
750  default:
752  return false;
753  }
754 }
double EuclideanNorm(const wxPoint &vector)
Euclidean norm of a 2D vector.
Definition: trigo.h:146
SHAPE_T m_shape
Definition: eda_shape.h:296
wxPoint getCenter() const
Definition: eda_shape.cpp:390
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:97
void CalcArcAngles(double &aStartAngle, double &aEndAngle) const
Calc arc start and end angles such that aStartAngle < aEndAngle.
Definition: eda_shape.cpp:442
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:623
bool IsFilled() const
Definition: eda_shape.h:81
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:932
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:122
Represent a set of closed polygons.
std::vector< wxPoint > m_bezierPoints
Definition: eda_shape.h:307
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:308
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:68
int NewOutline()
Creates a new hole in a given outline.
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.
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:297
int GetRadius() const
Definition: eda_shape.cpp:463
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_poly, EDA_SHAPE::m_shape, 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 757 of file eda_shape.cpp.

758 {
759  EDA_RECT arect = aRect;
760  arect.Normalize();
761  arect.Inflate( aAccuracy );
762 
763  EDA_RECT arcRect;
764  EDA_RECT bb = getBoundingBox();
765 
766  switch( m_shape )
767  {
768  case SHAPE_T::CIRCLE:
769  // Test if area intersects or contains the circle:
770  if( aContained )
771  return arect.Contains( bb );
772  else
773  {
774  // If the rectangle does not intersect the bounding box, this is a much quicker test
775  if( !aRect.Intersects( bb ) )
776  {
777  return false;
778  }
779  else
780  {
781  return arect.IntersectsCircleEdge( getCenter(), GetRadius(), GetWidth() );
782  }
783  }
784 
785  case SHAPE_T::ARC:
786  // Test for full containment of this arc in the rect
787  if( aContained )
788  {
789  return arect.Contains( bb );
790  }
791  // Test if the rect crosses the arc
792  else
793  {
794  arcRect = bb.Common( arect );
795 
796  /* All following tests must pass:
797  * 1. Rectangle must intersect arc BoundingBox
798  * 2. Rectangle must cross the outside of the arc
799  */
800  return arcRect.Intersects( arect ) &&
802  }
803 
804  case SHAPE_T::RECT:
805  if( aContained )
806  {
807  return arect.Contains( bb );
808  }
809  else
810  {
811  std::vector<wxPoint> pts = GetRectCorners();
812 
813  // Account for the width of the lines
814  arect.Inflate( GetWidth() / 2 );
815  return ( arect.Intersects( pts[0], pts[1] )
816  || arect.Intersects( pts[1], pts[2] )
817  || arect.Intersects( pts[2], pts[3] )
818  || arect.Intersects( pts[3], pts[0] ) );
819  }
820 
821  case SHAPE_T::SEGMENT:
822  if( aContained )
823  {
824  return arect.Contains( GetStart() ) && aRect.Contains( GetEnd() );
825  }
826  else
827  {
828  // Account for the width of the line
829  arect.Inflate( GetWidth() / 2 );
830  return arect.Intersects( GetStart(), GetEnd() );
831  }
832 
833  case SHAPE_T::POLY:
834  if( aContained )
835  {
836  return arect.Contains( bb );
837  }
838  else
839  {
840  // Fast test: if aRect is outside the polygon bounding box,
841  // rectangles cannot intersect
842  if( !arect.Intersects( bb ) )
843  return false;
844 
845  // Account for the width of the line
846  arect.Inflate( GetWidth() / 2 );
847 
848  // Polygons in footprints use coordinates relative to the footprint.
849  // Therefore, instead of using m_poly, we make a copy which is translated
850  // to the actual location in the board.
851  double orientation = 0.0;
852  wxPoint offset = getParentPosition();
853 
854  if( getParentOrientation() )
855  orientation = -DECIDEG2RAD( getParentOrientation() );
856 
857  SHAPE_LINE_CHAIN poly = m_poly.Outline( 0 );
858  poly.Rotate( orientation );
859  poly.Move( offset );
860 
861  int count = poly.GetPointCount();
862 
863  for( int ii = 0; ii < count; ii++ )
864  {
865  VECTOR2I vertex = poly.GetPoint( ii );
866 
867  // Test if the point is within aRect
868  if( arect.Contains( ( wxPoint ) vertex ) )
869  return true;
870 
871  if( ii + 1 < count )
872  {
873  VECTOR2I vertexNext = poly.GetPoint( ii + 1 );
874 
875  // Test if this edge intersects aRect
876  if( arect.Intersects( ( wxPoint ) vertex, ( wxPoint ) vertexNext ) )
877  return true;
878  }
879  else if( poly.IsClosed() )
880  {
881  VECTOR2I vertexNext = poly.GetPoint( 0 );
882 
883  // Test if this edge intersects aRect
884  if( arect.Intersects( ( wxPoint ) vertex, ( wxPoint ) vertexNext ) )
885  return true;
886  }
887  }
888 
889  return false;
890  }
891 
892  case SHAPE_T::BEZIER:
893  if( aContained )
894  {
895  return arect.Contains( bb );
896  }
897  else
898  {
899  // Fast test: if aRect is outside the polygon bounding box,
900  // rectangles cannot intersect
901  if( !arect.Intersects( bb ) )
902  return false;
903 
904  // Account for the width of the line
905  arect.Inflate( GetWidth() / 2 );
906  unsigned count = m_bezierPoints.size();
907 
908  for( unsigned ii = 1; ii < count; ii++ )
909  {
910  wxPoint vertex = m_bezierPoints[ ii - 1];
911  wxPoint vertexNext = m_bezierPoints[ii];
912 
913  // Test if the point is within aRect
914  if( arect.Contains( ( wxPoint ) vertex ) )
915  return true;
916 
917  // Test if this edge intersects aRect
918  if( arect.Intersects( vertex, vertexNext ) )
919  return true;
920  }
921 
922  return false;
923  }
924 
925  default:
927  return false;
928  }
929 }
SHAPE_T m_shape
Definition: eda_shape.h:296
int GetWidth() const
Definition: eda_shape.h:89
virtual size_t GetPointCount() const override
wxPoint getCenter() const
Definition: eda_shape.cpp:390
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:97
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:932
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:122
bool IsClosed() const override
SHAPE_LINE_CHAIN & Outline(int aIndex)
std::vector< wxPoint > m_bezierPoints
Definition: eda_shape.h:307
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:308
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
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:596
virtual double getParentOrientation() const =0
Represent a polyline (an zero-thickness chain of connected line segments).
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:463
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 121 of file eda_item.h.

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

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 124 of file eda_item.h.

124 { return m_flags & ENTERED; }
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:481
#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 206 of file eda_item.h.

206 { return m_forceVisible; }
bool m_forceVisible
Definition: eda_item.h:480

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  return GetState( LOCKED );
70 }
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:137

References 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::doMoveSelection(), EDIT_TOOL::DragArcTrack(), EDIT_TOOL::FilletTracks(), PCB_IO::format(), 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 118 of file eda_item.h.

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

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:796
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:140

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 198 of file board_item.h.

199  {
200  return m_layer == aLayer;
201  }
PCB_LAYER_ID m_layer
Definition: board_item.h:316

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 262 of file fp_shape.cpp.

263 {
264  if( GetParent() && GetParent()->GetLayer() == B_Cu )
265  return true;
266  return false;
267 }
BOARD_ITEM_CONTAINER * GetParent() const
Definition: board_item.h:135
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:140

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

1147 {
1148  // return true if the polygonal shape is valid (has more than 2 points)
1149  if( GetPolyShape().OutlineCount() == 0 )
1150  return false;
1151 
1152  const SHAPE_LINE_CHAIN& outline = ( (SHAPE_POLY_SET&)GetPolyShape() ).Outline( 0 );
1153 
1154  return outline.PointCount() > 2;
1155 }
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:207
Represent a polyline (an zero-thickness chain of connected line segments).

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

Referenced by PCB_IO::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 403 of file eda_item.h.

403 { return false; }

Referenced by EDA_ITEM::Matches().

◆ IsResized()

bool EDA_ITEM::IsResized ( ) const
inlineinherited

Definition at line 125 of file eda_item.h.

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

References IS_RESIZING, and EDA_ITEM::m_flags.

◆ IsSelected()

bool EDA_ITEM::IsSelected ( ) const
inlineinherited

Definition at line 123 of file eda_item.h.

123 { return m_flags & SELECTED; }
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:481
#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_LEGACY::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(), EE_SELECTION_TOOL::selectMultiple(), 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 208 of file board_item.h.

209  {
210  return ( Type() == PCB_TRACE_T ) || ( Type() == PCB_VIA_T );
211  }
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:113

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:183
PCB_LAYER_ID m_layer
Definition: board_item.h:316

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 122 of file eda_item.h.

122 { return m_flags & IS_WIRE_IMAGE; }
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:481
#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 295 of file eda_item.h.

299  {
300  for( auto it : aList )
301  {
302  if( static_cast<EDA_ITEM*>( it )->Visit( inspector, testData, scanTypes )
304  return SEARCH_RESULT::QUIT;
305  }
306 
308  }
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 314 of file eda_item.h.

316  {
317  for( auto it : aList )
318  {
319  if( static_cast<EDA_ITEM*>( it )->Visit( inspector, testData, scanTypes )
321  return SEARCH_RESULT::QUIT;
322  }
323 
325  }
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 85 of file board_item.cpp.

86 {
87  const BOARD* board = GetBoard();
88  LSET layers = GetLayerSet();
89 
90  // Try to be smart and useful. Check all copper first.
91  if( layers[F_Cu] && layers[B_Cu] )
92  return _( "all copper layers" );
93 
94  LSET copperLayers = layers & board->GetEnabledLayers().AllCuMask();
95  LSET techLayers = layers & board->GetEnabledLayers().AllTechMask();
96 
97  for( LSET testLayers : { copperLayers, techLayers, layers } )
98  {
99  for( int bit = PCBNEW_LAYER_ID_START; bit < PCB_LAYER_ID_COUNT; ++bit )
100  {
101  if( testLayers[ bit ] )
102  {
103  wxString layerInfo = board->GetLayerName( static_cast<PCB_LAYER_ID>( bit ) );
104 
105  if( testLayers.count() > 1 )
106  layerInfo << wxS( " " ) + _( "and others" );
107 
108  return layerInfo;
109  }
110  }
111  }
112 
113  // No copper, no technicals: no layer
114  return _( "no layers" );
115 }
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:750
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:820
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:504
#define _(s)
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:190
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:145

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

1035 {
1036  std::vector<SHAPE*> effectiveShapes;
1037 
1038  switch( m_shape )
1039  {
1040  case SHAPE_T::ARC:
1041  effectiveShapes.emplace_back( new SHAPE_ARC( m_arcCenter, m_start, GetArcAngle() / 10.0,
1042  m_width ) );
1043  break;
1044 
1045  case SHAPE_T::SEGMENT:
1046  effectiveShapes.emplace_back( new SHAPE_SEGMENT( m_start, m_end, m_width ) );
1047  break;
1048 
1049  case SHAPE_T::RECT:
1050  {
1051  std::vector<wxPoint> pts = GetRectCorners();
1052 
1053  if( IsFilled() )
1054  effectiveShapes.emplace_back( new SHAPE_SIMPLE( pts ) );
1055 
1056  if( m_width > 0 || !IsFilled() )
1057  {
1058  effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[0], pts[1], m_width ) );
1059  effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[1], pts[2], m_width ) );
1060  effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[2], pts[3], m_width ) );
1061  effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[3], pts[0], m_width ) );
1062  }
1063  }
1064  break;
1065 
1066  case SHAPE_T::CIRCLE:
1067  {
1068  if( IsFilled() )
1069  effectiveShapes.emplace_back( new SHAPE_CIRCLE( getCenter(), GetRadius() ) );
1070 
1071  if( m_width > 0 || !IsFilled() )
1072  {
1073  // SHAPE_CIRCLE has no ConvertToPolyline() method, so use a 360.0 SHAPE_ARC
1074  SHAPE_ARC circle( getCenter(), GetEnd(), 360.0 );
1075  SHAPE_LINE_CHAIN l = circle.ConvertToPolyline();
1076 
1077  for( int i = 0; i < l.SegmentCount(); i++ )
1078  {
1079  effectiveShapes.emplace_back( new SHAPE_SEGMENT( l.Segment( i ).A, l.Segment( i ).B,
1080  m_width ) );
1081  }
1082  }
1083 
1084  break;
1085  }
1086 
1087  case SHAPE_T::BEZIER:
1088  {
1089  auto bezierPoints = buildBezierToSegmentsPointsList( GetWidth() );
1090  wxPoint start_pt = bezierPoints[0];
1091 
1092  for( unsigned int jj = 1; jj < bezierPoints.size(); jj++ )
1093  {
1094  wxPoint end_pt = bezierPoints[jj];
1095  effectiveShapes.emplace_back( new SHAPE_SEGMENT( start_pt, end_pt, m_width ) );
1096  start_pt = end_pt;
1097  }
1098 
1099  break;
1100  }
1101 
1102  case SHAPE_T::POLY:
1103  {
1105 
1107  l.Move( getParentPosition() );
1108 
1109  if( IsFilled() )
1110  effectiveShapes.emplace_back( new SHAPE_SIMPLE( l ) );
1111 
1112  if( m_width > 0 || !IsFilled() )
1113  {
1114  for( int i = 0; i < l.SegmentCount(); i++ )
1115  effectiveShapes.emplace_back( new SHAPE_SEGMENT( l.Segment( i ), m_width ) );
1116  }
1117  }
1118  break;
1119 
1120  default:
1122  break;
1123  }
1124 
1125  return effectiveShapes;
1126 }
SHAPE_T m_shape
Definition: eda_shape.h:296
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:89
wxPoint getCenter() const
Definition: eda_shape.cpp:390
void Move(const VECTOR2I &aVector) override
double GetArcAngle() const
Definition: eda_shape.cpp:495
virtual wxPoint getParentPosition() const =0
wxPoint m_end
Definition: eda_shape.h:300
wxPoint m_arcCenter
Definition: eda_shape.h:302
bool IsFilled() const
Definition: eda_shape.h:81
std::vector< wxPoint > GetRectCorners() const
Definition: eda_shape.cpp:932
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:122
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
const std::vector< wxPoint > buildBezierToSegmentsPointsList(int aMinSegLen) const
Definition: eda_shape.cpp:377
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
int SegmentCount() const
Return the number of segments in this line chain.
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:207
wxPoint m_start
Definition: eda_shape.h:299
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 (an zero-thickness chain of connected line segments).
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:297
int GetRadius() const
Definition: eda_shape.cpp:463
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, SCH_MARKER, PCB_MARKER, FP_TEXT, and PCB_TEXT.

Definition at line 365 of file eda_item.h.

366  {
367  return false;
368  }

Referenced by SCH_EDITOR_CONTROL::HasMatch(), inDiffPair(), PCB_TEXT::Matches(), FP_TEXT::Matches(), PCB_MARKER::Matches(), SCH_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  wxString searchText = aSearchData.GetFindString();
122 
123  // Don't match if searching for replaceable item and the item doesn't support text replace.
124  if( (aSearchData.GetFlags() & FR_SEARCH_REPLACE) && !IsReplaceable() )
125  return false;
126 
127  if( aSearchData.GetFlags() & wxFR_WHOLEWORD )
128  return aText.IsSameAs( searchText, aSearchData.GetFlags() & wxFR_MATCHCASE );
129 
130  if( aSearchData.GetFlags() & FR_MATCH_WILDCARD )
131  {
132  if( aSearchData.GetFlags() & wxFR_MATCHCASE )
133  return text.Matches( searchText );
134 
135  return text.MakeUpper().Matches( searchText.MakeUpper() );
136  }
137 
138  if( aSearchData.GetFlags() & wxFR_MATCHCASE )
139  return aText.Find( searchText ) != wxNOT_FOUND;
140 
141  return text.MakeUpper().Find( searchText.MakeUpper() ) != wxNOT_FOUND;
142 }
virtual bool IsReplaceable() const
Override this method in any derived object that supports test find and replace.
Definition: eda_item.h:403

References FR_MATCH_WILDCARD, FR_SEARCH_REPLACE, EDA_ITEM::IsReplaceable(), 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 269 of file fp_shape.cpp.

270 {
271  // Mirror an edge of the footprint. the layer is not modified
272  // This is a footprint shape modification.
273 
274  switch( GetShape() )
275  {
276  case SHAPE_T::ARC:
277  case SHAPE_T::SEGMENT:
278  case SHAPE_T::RECT:
279  case SHAPE_T::CIRCLE:
280  case SHAPE_T::BEZIER:
281  if( aMirrorAroundXAxis )
282  {
283  MIRROR( m_start0.y, aCentre.y );
284  MIRROR( m_end0.y, aCentre.y );
285  MIRROR( m_arcCenter0.y, aCentre.y );
286  MIRROR( m_bezierC1_0.y, aCentre.y );
287  MIRROR( m_bezierC2_0.y, aCentre.y );
288  }
289  else
290  {
291  MIRROR( m_start0.x, aCentre.x );
292  MIRROR( m_end0.x, aCentre.x );
293  MIRROR( m_arcCenter0.x, aCentre.x );
294  MIRROR( m_bezierC1_0.x, aCentre.x );
295  MIRROR( m_bezierC2_0.x, aCentre.x );
296  }
297 
298  if( GetShape() == SHAPE_T::BEZIER )
300 
301  break;
302 
303  case SHAPE_T::POLY:
304  // polygon corners coordinates are always relative to the
305  // footprint position, orientation 0
306  m_poly.Mirror( !aMirrorAroundXAxis, aMirrorAroundXAxis );
307  break;
308 
309  default:
311  }
312 
313  SetDrawCoord();
314 }
wxPoint m_arcCenter0
Center of arc, relative to footprint origin, orient 0.
Definition: fp_shape.h:165
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:308
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
void SetDrawCoord()
Set draw coordinates (absolute values ) from relative coordinates.
Definition: fp_shape.cpp:81
void RebuildBezierToSegmentsPointsList(int aMinSegLen)
Rebuild the m_BezierPoints vertex list that approximate the Bezier curve by a list of segments.
Definition: eda_shape.cpp:363
SHAPE_T GetShape() const
Definition: eda_shape.h:92
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:297
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, 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 328 of file fp_shape.cpp.

329 {
330  // Move an edge of the footprint.
331  // This is a footprint shape modification.
332 
333  switch( GetShape() )
334  {
335  case SHAPE_T::ARC:
336  case SHAPE_T::SEGMENT:
337  case SHAPE_T::RECT:
338  case SHAPE_T::CIRCLE:
339  case SHAPE_T::BEZIER:
340  m_start0 += aMoveVector;
341  m_end0 += aMoveVector;
342  m_arcCenter0 += aMoveVector;
343  m_bezierC1_0 += aMoveVector;
344  m_bezierC2_0 += aMoveVector;
345  break;
346 
347  case SHAPE_T::POLY:
348  // polygon corners coordinates are always relative to the
349  // footprint position, orientation 0
350  m_poly.Move( VECTOR2I( aMoveVector ) );
351 
352  break;
353 
354  default:
356  }
357 
358  SetDrawCoord();
359 }
wxPoint m_arcCenter0
Center of arc, relative to footprint origin, orient 0.
Definition: fp_shape.h:165
VECTOR2< int > VECTOR2I
Definition: vector2d.h:623
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:308
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
void SetDrawCoord()
Set draw coordinates (absolute values ) from relative coordinates.
Definition: fp_shape.cpp:81
SHAPE_T GetShape() const
Definition: eda_shape.h:92
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 241 of file board_item.h.

242  {
243  Move( wxPoint( aMoveVector.x, aMoveVector.y ) );
244  }
virtual void Move(const wxPoint &aMoveVector)
Move this object.
Definition: board_item.h:236

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

◆ move()

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

Definition at line 134 of file eda_shape.cpp.

135 {
136  switch ( m_shape )
137  {
138  case SHAPE_T::ARC:
139  case SHAPE_T::SEGMENT:
140  case SHAPE_T::RECT:
141  case SHAPE_T::CIRCLE:
142  m_start += aMoveVector;
143  m_end += aMoveVector;
144  m_arcCenter += aMoveVector;
145  break;
146 
147  case SHAPE_T::POLY:
148  m_poly.Move( VECTOR2I( aMoveVector ) );
149  break;
150 
151  case SHAPE_T::BEZIER:
152  m_start += aMoveVector;
153  m_end += aMoveVector;
154  m_bezierC1 += aMoveVector;
155  m_bezierC2 += aMoveVector;
156 
157  for( wxPoint& pt : m_bezierPoints)
158  pt += aMoveVector;
159 
160  break;
161 
162  default:
164  break;
165  }
166 }
SHAPE_T m_shape
Definition: eda_shape.h:296
wxPoint m_bezierC1
Definition: eda_shape.h:304
VECTOR2< int > VECTOR2I
Definition: vector2d.h:623
wxPoint m_end
Definition: eda_shape.h:300
wxPoint m_arcCenter
Definition: eda_shape.h:302
wxPoint m_bezierC2
Definition: eda_shape.h:305
void Move(const VECTOR2I &aVector) override
std::vector< wxPoint > m_bezierPoints
Definition: eda_shape.h:307
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:308
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
wxPoint m_start
Definition: eda_shape.h:299

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 171 of file eda_item.cpp.

172 {
173  wxFAIL_MSG( wxString::Format( wxT( "Less than operator not defined for item type %s." ),
174  GetClass() ) );
175 
176  return false;
177 }
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 363 of file eda_shape.cpp.

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

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 145 of file eda_item.cpp.

146 {
147  wxString searchString = (aSearchData.GetFlags() & wxFR_MATCHCASE) ? aText : aText.Upper();
148 
149  int result = searchString.Find( ( aSearchData.GetFlags() & wxFR_MATCHCASE ) ?
150  aSearchData.GetFindString() :
151  aSearchData.GetFindString().Upper() );
152 
153  if( result == wxNOT_FOUND )
154  return false;
155 
156  wxString prefix = aText.Left( result );
157  wxString suffix;
158 
159  if( aSearchData.GetFindString().length() + result < aText.length() )
160  suffix = aText.Right( aText.length() - ( aSearchData.GetFindString().length() + result ) );
161 
162  wxLogTrace( traceFindReplace, wxT( "Replacing '%s', prefix '%s', replace '%s', suffix '%s'." ),
163  aText, prefix, aSearchData.GetReplaceString(), suffix );
164 
165  aText = prefix + aSearchData.GetReplaceString() + suffix;
166 
167  return true;
168 }
const wxChar *const traceFindReplace
Flag to enable find and replace debug tracing.

References traceFindReplace.

Referenced by SCH_FIELD::Replace(), EDA_TEXT::Replace(), 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 392 of file eda_item.h.

393  {
394  return false;
395  }

◆ 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 316 of file fp_shape.cpp.

317 {
318  // We should rotate the relative coordinates, but to avoid duplicate code do the base class
319  // rotation of draw coordinates, which is acceptable because in the footprint editor
320  // m_Pos0 = m_Pos
321  PCB_SHAPE::Rotate( aRotCentre, aAngle );
322 
323  // and now update the relative coordinates, which are the reference in most transforms.
324  SetLocalCoord();
325 }
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 254 of file board_item.h.

255  {
256  Rotate( wxPoint( aRotCentre.x, aRotCentre.y ), aAngle );
257  }
virtual void Rotate(const wxPoint &aRotCentre, double aAngle)
Rotate this object.
Definition: board_item.cpp:177

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

222 {
223  switch( m_shape )
224  {
225  case SHAPE_T::SEGMENT:
226  case SHAPE_T::CIRCLE:
227  RotatePoint( &m_start, aRotCentre, aAngle );
228  RotatePoint( &m_end, aRotCentre, aAngle );
229  break;
230 
231  case SHAPE_T::ARC:
232  RotatePoint( &m_start, aRotCentre, aAngle );
233  RotatePoint( &m_end, aRotCentre, aAngle );
234  RotatePoint( &m_arcCenter, aRotCentre, aAngle );
235  break;
236 
237  case SHAPE_T::RECT:
238  if( KiROUND( aAngle ) % 900 == 0 )
239  {
240  RotatePoint( &m_start, aRotCentre, aAngle );
241  RotatePoint( &m_end, aRotCentre, aAngle );
242  break;
243  }
244 
245  // Convert non-cartesian-rotated rect to a diamond
248  m_poly.NewOutline();
249  m_poly.Append( m_start );
250  m_poly.Append( m_end.x, m_start.y );
251  m_poly.Append( m_end );
252  m_poly.Append( m_start.x, m_end.y );
253 
255 
256  case SHAPE_T::POLY:
257  m_poly.Rotate( -DECIDEG2RAD( aAngle ), VECTOR2I( aRotCentre ) );
258  break;
259 
260  case SHAPE_T::BEZIER:
261  RotatePoint( &m_start, aRotCentre, aAngle);
262  RotatePoint( &m_end, aRotCentre, aAngle);
263  RotatePoint( &m_bezierC1, aRotCentre, aAngle);
264  RotatePoint( &m_bezierC2, aRotCentre, aAngle);
265 
266  for( wxPoint& pt : m_bezierPoints )
267  RotatePoint( &pt, aRotCentre, aAngle);
268 
269  break;
270 
271  default:
273  break;
274  }
275 }
SHAPE_T m_shape
Definition: eda_shape.h:296
wxPoint m_bezierC1
Definition: eda_shape.h:304
#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:623
wxPoint m_end
Definition: eda_shape.h:300
wxPoint m_arcCenter
Definition: eda_shape.h:302
wxPoint m_bezierC2
Definition: eda_shape.h:305
std::vector< wxPoint > m_bezierPoints
Definition: eda_shape.h:307
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:308
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:68
int NewOutline()
Creates a new hole in a given outline.
wxPoint m_start
Definition: eda_shape.h:299
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:169

References EDA_SHAPE::scale().

Referenced by CADSTAR_PCB_ARCHIVE_LOADER::getShapeFromVertex().

◆ scale()

void EDA_SHAPE::scale ( double  aScale)
protectedinherited

Definition at line 169 of file eda_shape.cpp.

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

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

510 {
511  m_end = m_start;
513 
514  if( aCheckNegativeAngle && aAngle < 0 )
515  {
516  std::swap( m_start, m_end );
517  m_endsSwapped = true;
518  }
519 }
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:300
wxPoint m_arcCenter
Definition: eda_shape.h:302
bool m_endsSwapped
Definition: eda_shape.h:295
wxPoint m_start
Definition: eda_shape.h:299

References EDA_SHAPE::m_arcCenter, EDA_SHAPE::m_end, EDA_SHAPE::m_endsSwapped, EDA_SHAPE::m_start, NormalizeAngle360Max(), and RotatePoint().

Referenced by PAD::AddPrimitiveArc(), PCAD2KICAD::PCB_ARC::AddToBoard(), DRAWING_TOOL::drawArc(), CADSTAR_PCB_ARCHIVE_LOADER::getShapeFromVertex(), ALTIUM_PCB::HelperCreateBoardOutline(), EAGLE_PLUGIN::loadPlain(), ALTIUM_PCB::ParseArcs6Data(), and DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataFromWindow().

◆ SetArcAngleAndEnd0()

void FP_SHAPE::SetArcAngleAndEnd0 ( double  aAngle,
bool  aCheckNegativeAngle = false 
)

Sets the angle for arcs, and normalizes it within the range 0 - 360 degrees.

Parameters
aAngleis tenths of degrees, but will soon be degrees.

Definition at line 184 of file fp_shape.cpp.

185 {
186  m_end0 = m_start0;
188 
189  if( aCheckNegativeAngle && aAngle < 0 )
190  std::swap( m_start0, m_end0 );
191 }
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
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_end0
End point or circle edge, relative to footprint origin, orient 0.
Definition: fp_shape.h:164
<