KiCad PCB EDA Suite
SHAPE_POLY_SET Class Reference

Class SHAPE_POLY_SET. More...

#include <shape_poly_set.h>

Inheritance diagram for SHAPE_POLY_SET:
SHAPE

Classes

class  ITERATOR_TEMPLATE
 Class ITERATOR_TEMPLATE. More...
 
class  SEGMENT_ITERATOR_TEMPLATE
 Class SEGMENT_ITERATOR_TEMPLATE. More...
 
class  TRIANGULATED_POLYGON
 
class  TRIANGULATION_CONTEXT
 
struct  VERTEX_INDEX
 Struct VERTEX_INDEX. More...
 

Public Types

enum  POLYGON_MODE { PM_FAST = true, PM_STRICTLY_SIMPLE = false }
 operations on polygons use a aFastMode param if aFastMode is PM_FAST (true) the result can be a weak polygon if aFastMode is PM_STRICTLY_SIMPLE (false) (default) the result is (theorically) a strictly simple polygon, but calculations can be really significantly time consuming Most of time PM_FAST is preferable. More...
 
typedef std::vector< SHAPE_LINE_CHAINPOLYGON
 

represents a single polygon outline with holes.

More...
 
typedef struct SHAPE_POLY_SET::VERTEX_INDEX VERTEX_INDEX
 Struct VERTEX_INDEX. More...
 
typedef ITERATOR_TEMPLATE< VECTOR2IITERATOR
 
typedef ITERATOR_TEMPLATE< const VECTOR2ICONST_ITERATOR
 
typedef SEGMENT_ITERATOR_TEMPLATE< SEGSEGMENT_ITERATOR
 
typedef SEGMENT_ITERATOR_TEMPLATE< const SEGCONST_SEGMENT_ITERATOR
 

Public Member Functions

 SHAPE_POLY_SET ()
 
 SHAPE_POLY_SET (const SHAPE_POLY_SET &aOther)
 Copy constructor SHAPE_POLY_SET Performs a deep copy of aOther into this. More...
 
 ~SHAPE_POLY_SET ()
 
bool GetRelativeIndices (int aGlobalIdx, VERTEX_INDEX *aRelativeIndices) const
 Function GetRelativeIndices. More...
 
bool GetGlobalIndex (VERTEX_INDEX aRelativeIndices, int &aGlobalIdx)
 Function GetGlobalIndex computes the global index of a vertex from the relative indices of polygon, contour and vertex. More...
 
SHAPEClone () const override
 Function Clone() More...
 
int NewOutline ()
 

Creates a new empty polygon in the set and returns its index

More...
 
int NewHole (int aOutline=-1)
 

Creates a new hole in a given outline

More...
 
int AddOutline (const SHAPE_LINE_CHAIN &aOutline)
 

Adds a new outline to the set and returns its index

More...
 
int AddHole (const SHAPE_LINE_CHAIN &aHole, int aOutline=-1)
 

Adds a new hole to the given outline (default: last) and returns its index

More...
 
int Append (int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
 

Appends a vertex at the end of the given outline/hole (default: the last outline)

More...
 
void Append (const SHAPE_POLY_SET &aSet)
 

Merges polygons from two sets.

More...
 
void Append (const VECTOR2I &aP, int aOutline=-1, int aHole=-1)
 

Appends a vertex at the end of the given outline/hole (default: the last outline)

More...
 
void InsertVertex (int aGlobalIndex, VECTOR2I aNewVertex)
 Function InsertVertex Adds a vertex in the globally indexed position aGlobalIndex. More...
 
VECTOR2IVertex (int aIndex, int aOutline, int aHole)
 

Returns the index-th vertex in a given hole outline within a given outline

More...
 
const VECTOR2ICVertex (int aIndex, int aOutline, int aHole) const
 

Returns the index-th vertex in a given hole outline within a given outline

More...
 
VECTOR2IVertex (int aGlobalIndex)
 

Returns the aGlobalIndex-th vertex in the poly set

More...
 
const VECTOR2ICVertex (int aGlobalIndex) const
 

Returns the aGlobalIndex-th vertex in the poly set

More...
 
VECTOR2IVertex (VERTEX_INDEX aIndex)
 

Returns the index-th vertex in a given hole outline within a given outline

More...
 
const VECTOR2ICVertex (VERTEX_INDEX aIndex) const
 

Returns the index-th vertex in a given hole outline within a given outline

More...
 
bool GetNeighbourIndexes (int aGlobalIndex, int *aPrevious, int *aNext)
 Returns the global indexes of the previous and the next corner of the aGlobalIndex-th corner of a contour in the polygon set. More...
 
bool IsPolygonSelfIntersecting (int aPolygonIndex)
 Function IsPolygonSelfIntersecting. More...
 
bool IsSelfIntersecting ()
 Function IsSelfIntersecting Checks whether any of the polygons in the set is self intersecting. More...
 
unsigned int TriangulatedPolyCount () const
 

Returns the number of triangulated polygons

More...
 
int OutlineCount () const
 

Returns the number of outlines in the set

More...
 
int VertexCount (int aOutline=-1, int aHole=-1) const
 

Returns the number of vertices in a given outline/hole

More...
 
int HoleCount (int aOutline) const
 

Returns the number of holes in a given outline

More...
 
SHAPE_LINE_CHAINOutline (int aIndex)
 

Returns the reference to aIndex-th outline in the set

More...
 
SHAPE_POLY_SET Subset (int aFirstPolygon, int aLastPolygon)
 Function Subset returns a subset of the polygons in this set, the ones between aFirstPolygon and aLastPolygon. More...
 
SHAPE_POLY_SET UnitSet (int aPolygonIndex)
 
SHAPE_LINE_CHAINHole (int aOutline, int aHole)
 

Returns the reference to aHole-th hole in the aIndex-th outline

More...
 
POLYGONPolygon (int aIndex)
 

Returns the aIndex-th subpolygon in the set

More...
 
const POLYGONPolygon (int aIndex) const
 
const TRIANGULATED_POLYGONTriangulatedPolygon (int aIndex) const
 
const SHAPE_LINE_CHAINCOutline (int aIndex) const
 
const SHAPE_LINE_CHAINCHole (int aOutline, int aHole) const
 
const POLYGONCPolygon (int aIndex) const
 
ITERATOR Iterate (int aFirst, int aLast, bool aIterateHoles=false)
 Function Iterate returns an object to iterate through the points of the polygons between aFirst and aLast. More...
 
ITERATOR Iterate (int aOutline)
 Function Iterate. More...
 
ITERATOR IterateWithHoles (int aOutline)
 Function IterateWithHoles. More...
 
ITERATOR Iterate ()
 Function Iterate. More...
 
ITERATOR IterateWithHoles ()
 Function IterateWithHoles. More...
 
CONST_ITERATOR CIterate (int aFirst, int aLast, bool aIterateHoles=false) const
 
CONST_ITERATOR CIterate (int aOutline) const
 
CONST_ITERATOR CIterateWithHoles (int aOutline) const
 
CONST_ITERATOR CIterate () const
 
CONST_ITERATOR CIterateWithHoles () const
 
ITERATOR IterateFromVertexWithHoles (int aGlobalIdx)
 
SEGMENT_ITERATOR IterateSegments (int aFirst, int aLast, bool aIterateHoles=false)
 

Returns an iterator object, for iterating between aFirst and aLast outline, with or

without holes (default: without) More...

 
SEGMENT_ITERATOR IterateSegments (int aPolygonIdx)
 

Returns an iterator object, for iterating aPolygonIdx-th polygon edges

More...
 
SEGMENT_ITERATOR IterateSegments ()
 

Returns an iterator object, for all outlines in the set (no holes)

More...
 
SEGMENT_ITERATOR IterateSegmentsWithHoles ()
 

Returns an iterator object, for all outlines in the set (with holes)

More...
 
SEGMENT_ITERATOR IterateSegmentsWithHoles (int aOutline)
 

Returns an iterator object, for the aOutline-th outline in the set (with holes)

More...
 
void BooleanAdd (const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
 

Performs boolean polyset union For aFastMode meaning, see function booleanOp

More...
 
void BooleanSubtract (const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
 

Performs boolean polyset difference For aFastMode meaning, see function booleanOp

More...
 
void BooleanIntersection (const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
 

Performs boolean polyset intersection For aFastMode meaning, see function booleanOp

More...
 
void BooleanAdd (const SHAPE_POLY_SET &a, const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
 

Performs boolean polyset union between a and b, store the result in it self For aFastMode meaning, see function booleanOp

More...
 
void BooleanSubtract (const SHAPE_POLY_SET &a, const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
 

Performs boolean polyset difference between a and b, store the result in it self For aFastMode meaning, see function booleanOp

More...
 
void BooleanIntersection (const SHAPE_POLY_SET &a, const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
 

Performs boolean polyset intersection between a and b, store the result in it self For aFastMode meaning, see function booleanOp

More...
 
void Inflate (int aFactor, int aCircleSegmentsCount)
 

Performs outline inflation/deflation, using round corners.

More...
 
void Fracture (POLYGON_MODE aFastMode)
 

Converts a set of polygons with holes to a singe outline with "slits"/"fractures" connecting the outer ring to the inner holes For aFastMode meaning, see function booleanOp

More...
 
void Unfracture (POLYGON_MODE aFastMode)
 

Converts a single outline slitted ("fractured") polygon into a set ouf outlines with holes.

More...
 
bool HasHoles () const
 

Returns true if the polygon set has any holes.

More...
 
bool HasTouchingHoles () const
 

Returns true if the polygon set has any holes tha share a vertex.

More...
 
void Simplify (POLYGON_MODE aFastMode)
 

Simplifies the polyset (merges overlapping polys, eliminates degeneracy/self-intersections) For aFastMode meaning, see function booleanOp

More...
 
int NormalizeAreaOutlines ()
 Function NormalizeAreaOutlines Convert a self-intersecting polygon to one (or more) non self-intersecting polygon(s) Removes null segments. More...
 
const std::string Format () const override
 
bool Parse (std::stringstream &aStream) override
 
void Move (const VECTOR2I &aVector) override
 
void Rotate (double aAngle, const VECTOR2I &aCenter)
 Function Rotate rotates all vertices by a given angle. More...
 
bool IsSolid () const override
 
const BOX2I BBox (int aClearance=0) const override
 Function BBox() More...
 
bool PointOnEdge (const VECTOR2I &aP) const
 Function PointOnEdge() More...
 
bool Collide (const VECTOR2I &aP, int aClearance=0) const override
 Function Collide Checks whether the point aP collides with the inside of the polygon set; if the point lies on an edge or on a corner of any of the polygons, there is no collision: the edges does not belong to the polygon itself. More...
 
bool Collide (const SEG &aSeg, int aClearance=0) const override
 Function Collide Checks whether the segment aSeg collides with the inside of the polygon set; if the segment touches an edge or a corner of any of the polygons, there is no collision: the edges do not belong to the polygon itself. More...
 
bool CollideVertex (const VECTOR2I &aPoint, VERTEX_INDEX &aClosestVertex, int aClearance=0)
 Function CollideVertex Checks whether aPoint collides with any vertex of any of the contours of the polygon. More...
 
bool CollideEdge (const VECTOR2I &aPoint, VERTEX_INDEX &aClosestVertex, int aClearance=0)
 Function CollideEdge Checks whether aPoint collides with any edge of any of the contours of the polygon. More...
 
bool Contains (const VECTOR2I &aP, int aSubpolyIndex=-1, bool aIgnoreHoles=false) const
 Returns true if a given subpolygon contains the point aP. More...
 
bool IsEmpty () const
 

Returns true if the set is empty (no polygons at all)

More...
 
void RemoveVertex (int aGlobalIndex)
 Function RemoveVertex deletes the aGlobalIndex-th vertex. More...
 
void RemoveVertex (VERTEX_INDEX aRelativeIndices)
 Function RemoveVertex deletes the vertex indexed by aIndex (index of polygon, contour and vertex). More...
 
void RemoveAllContours ()
 

Removes all outlines & holes (clears) the polygon set.

More...
 
void RemoveContour (int aContourIdx, int aPolygonIdx=-1)
 Function RemoveContour deletes the aContourIdx-th contour of the aPolygonIdx-th polygon in the set. More...
 
int RemoveNullSegments ()
 Function RemoveNullSegments looks for null segments; ie, segments whose ends are exactly the same and deletes them. More...
 
int TotalVertices () const
 

Returns total number of vertices stored in the set.

More...
 
void DeletePolygon (int aIdx)
 

Deletes aIdx-th polygon from the set

More...
 
POLYGON ChamferPolygon (unsigned int aDistance, int aIndex=0)
 Function Chamfer returns a chamfered version of the aIndex-th polygon. More...
 
POLYGON FilletPolygon (unsigned int aRadius, int aErrorMax, int aIndex=0)
 Function Fillet returns a filleted version of the aIndex-th polygon. More...
 
SHAPE_POLY_SET Chamfer (int aDistance)
 Function Chamfer returns a chamfered version of the polygon set. More...
 
SHAPE_POLY_SET Fillet (int aRadius, int aErrorMax)
 Function Fillet returns a filleted version of the polygon set. More...
 
int DistanceToPolygon (VECTOR2I aPoint, int aIndex)
 Function DistanceToPolygon computes the minimum distance between the aIndex-th polygon and aPoint. More...
 
int DistanceToPolygon (SEG aSegment, int aIndex, int aSegmentWidth=0)
 Function DistanceToPolygon computes the minimum distance between the aIndex-th polygon and aSegment with a possible width. More...
 
int Distance (VECTOR2I aPoint)
 Function DistanceToPolygon computes the minimum distance between aPoint and all the polygons in the set. More...
 
int Distance (const SEG &aSegment, int aSegmentWidth=0)
 Function DistanceToPolygon computes the minimum distance between aSegment and all the polygons in the set. More...
 
bool IsVertexInHole (int aGlobalIdx)
 Function IsVertexInHole. More...
 
SHAPE_POLY_SEToperator= (const SHAPE_POLY_SET &)
 
void CacheTriangulation ()
 
bool IsTriangulationUpToDate () const
 
MD5_HASH GetHash () const
 
SHAPE_TYPE Type () const
 Function Type() More...
 
virtual bool Collide (const SHAPE *aShape, int aClearance, VECTOR2I &aMTV) const
 Function Collide() More...
 
virtual bool Collide (const SHAPE *aShape, int aClearance=0) const
 
virtual VECTOR2I Centre () const
 Function Centre() More...
 

Protected Types

typedef VECTOR2I::extended_type ecoord
 

Protected Attributes

SHAPE_TYPE m_type
 

type of our shape

More...
 

Private Types

enum  CORNER_MODE { CHAMFERED, FILLETED }
 Operations ChamferPolygon and FilletPolygon are computed under the private chamferFillet method; this enum is defined to make the necessary distinction when calling this method from the public ChamferPolygon and FilletPolygon methods. More...
 
typedef std::vector< POLYGONPOLYSET
 

Private Member Functions

SHAPE_LINE_CHAINgetContourForCorner (int aCornerId, int &aIndexWithinContour)
 
VECTOR2Ivertex (int aCornerId)
 
const VECTOR2Icvertex (int aCornerId) const
 
void fractureSingle (POLYGON &paths)
 
void unfractureSingle (POLYGON &path)
 
void importTree (ClipperLib::PolyTree *tree)
 
void booleanOp (ClipperLib::ClipType aType, const SHAPE_POLY_SET &aOtherShape, POLYGON_MODE aFastMode)
 Function booleanOp this is the engine to execute all polygon boolean transforms (AND, OR, ... More...
 
void booleanOp (ClipperLib::ClipType aType, const SHAPE_POLY_SET &aShape, const SHAPE_POLY_SET &aOtherShape, POLYGON_MODE aFastMode)
 
bool pointInPolygon (const VECTOR2I &aP, const SHAPE_LINE_CHAIN &aPath) const
 
const ClipperLib::Path convertToClipper (const SHAPE_LINE_CHAIN &aPath, bool aRequiredOrientation)
 
const SHAPE_LINE_CHAIN convertFromClipper (const ClipperLib::Path &aPath)
 
bool containsSingle (const VECTOR2I &aP, int aSubpolyIndex, bool aIgnoreHoles=false) const
 containsSingle function Checks whether the point aP is inside the aSubpolyIndex-th polygon of the polyset. More...
 
POLYGON chamferFilletPolygon (CORNER_MODE aMode, unsigned int aDistance, int aIndex, int aErrorMax=-1)
 Function chamferFilletPolygon Returns the camfered or filleted version of the aIndex-th polygon in the set, depending on the aMode selected. More...
 
bool hasTouchingHoles (const POLYGON &aPoly) const
 

Returns true if the polygon set has any holes that touch share a vertex.

More...
 
void triangulateSingle (const POLYGON &aPoly, SHAPE_POLY_SET::TRIANGULATED_POLYGON &aResult)
 
MD5_HASH checksum () const
 

Private Attributes

POLYSET m_polys
 
std::vector< std::unique_ptr< TRIANGULATED_POLYGON > > m_triangulatedPolys
 
bool m_triangulationValid = false
 
MD5_HASH m_hash
 

Detailed Description

Class SHAPE_POLY_SET.

Represents a set of closed polygons. Polygons may be nonconvex, self-intersecting and have holes. Provides boolean operations (using Clipper library as the backend).

Let us define the terms used on this class to clarify methods names and comments:

  • Polygon: each polygon in the set.
  • Outline: first polyline in each polygon; represents its outer contour.
  • Hole: second and following polylines in the polygon.
  • Contour: each polyline of each polygon in the set, whether or not it is an outline or a hole.
  • Vertex (or corner): each one of the points that define a contour.

TODO: add convex partitioning & spatial index

Definition at line 56 of file shape_poly_set.h.

Member Typedef Documentation

typedef VECTOR2I::extended_type SHAPE::ecoord
protectedinherited

Definition at line 61 of file shape.h.

represents a single polygon outline with holes.

The first entry is the outline,

the remaining (if any), are the holes

Definition at line 61 of file shape_poly_set.h.

typedef std::vector<POLYGON> SHAPE_POLY_SET::POLYSET
private

Definition at line 1173 of file shape_poly_set.h.

Struct VERTEX_INDEX.

Structure to hold the necessary information in order to index a vertex on a SHAPE_POLY_SET object: the polygon index, the contour index relative to the polygon and the vertex index relative the contour.

Member Enumeration Documentation

Operations ChamferPolygon and FilletPolygon are computed under the private chamferFillet method; this enum is defined to make the necessary distinction when calling this method from the public ChamferPolygon and FilletPolygon methods.

Enumerator
CHAMFERED 
FILLETED 

Definition at line 1145 of file shape_poly_set.h.

operations on polygons use a aFastMode param if aFastMode is PM_FAST (true) the result can be a weak polygon if aFastMode is PM_STRICTLY_SIMPLE (false) (default) the result is (theorically) a strictly simple polygon, but calculations can be really significantly time consuming Most of time PM_FAST is preferable.

PM_STRICTLY_SIMPLE can be used in critical cases (Gerber output for instance)

Enumerator
PM_FAST 
PM_STRICTLY_SIMPLE 

Definition at line 797 of file shape_poly_set.h.

Constructor & Destructor Documentation

SHAPE_POLY_SET::SHAPE_POLY_SET ( )

Definition at line 50 of file shape_poly_set.cpp.

Referenced by Clone(), and Collide().

50  :
52 {
53 }
SHAPE(SHAPE_TYPE aType)
Constructor.
Definition: shape.h:70
simple polygon
Definition: shape.h:48
SHAPE_POLY_SET::SHAPE_POLY_SET ( const SHAPE_POLY_SET aOther)

Copy constructor SHAPE_POLY_SET Performs a deep copy of aOther into this.

Parameters
aOtheris the SHAPE_POLY_SET object that will be copied.

Definition at line 56 of file shape_poly_set.cpp.

56  :
57  SHAPE( SH_POLY_SET ), m_polys( aOther.m_polys )
58 {
59 }
SHAPE(SHAPE_TYPE aType)
Constructor.
Definition: shape.h:70
simple polygon
Definition: shape.h:48
SHAPE_POLY_SET::~SHAPE_POLY_SET ( )

Definition at line 62 of file shape_poly_set.cpp.

63 {
64 }

Member Function Documentation

int SHAPE_POLY_SET::AddHole ( const SHAPE_LINE_CHAIN aHole,
int  aOutline = -1 
)

Adds a new hole to the given outline (default: last) and returns its index

Definition at line 442 of file shape_poly_set.cpp.

References m_polys.

Referenced by ZONE_CONTAINER::AddPolygon(), and PCB_EDIT_FRAME::End_Zone().

443 {
444  assert( m_polys.size() );
445 
446  if( aOutline < 0 )
447  aOutline += m_polys.size();
448 
449  POLYGON& poly = m_polys[aOutline];
450 
451  assert( poly.size() );
452 
453  poly.push_back( aHole );
454 
455  return poly.size() - 1;
456 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
int SHAPE_POLY_SET::AddOutline ( const SHAPE_LINE_CHAIN aOutline)

Adds a new outline to the set and returns its index

Definition at line 428 of file shape_poly_set.cpp.

References SHAPE_LINE_CHAIN::IsClosed(), and m_polys.

Referenced by ZONE_CONTAINER::AddPolygon(), CINFO3D_VISU::buildPadShapePolygon(), Convert_path_polygon_to_polygon_blocks_and_dummy_blocks(), D_PAD::MergePrimitivesAsPolygon(), CPolyLine::NormalizeAreaOutlines(), and NormalizeAreaOutlines().

429 {
430  assert( aOutline.IsClosed() );
431 
432  POLYGON poly;
433 
434  poly.push_back( aOutline );
435 
436  m_polys.push_back( poly );
437 
438  return m_polys.size() - 1;
439 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
bool IsClosed() const
Function IsClosed()
int SHAPE_POLY_SET::Append ( int  x,
int  y,
int  aOutline = -1,
int  aHole = -1,
bool  aAllowDuplication = false 
)

Appends a vertex at the end of the given outline/hole (default: the last outline)

Function Append adds a new vertex to the contour indexed by aOutline and aHole (defaults to the outline of the last polygon).

Parameters
xis the x coordinate of the new vertex.
yis the y coordinate of the new vertex.
aOutlineis the index of the polygon.
aHoleis the index of the hole (-1 for the main outline),
aAllowDuplicationis a flag to indicate whether it is allowed to add this corner even if it is duplicated.
Returns
int - the number of corners of the selected contour after the addition.

Definition at line 185 of file shape_poly_set.cpp.

References m_polys.

Referenced by addHoleToPolygon(), addRect(), Append(), ZONE_CONTAINER::AppendCorner(), BuildBoardPolygonOutlines(), D_PAD::buildCustomPadPolygon(), CINFO3D_VISU::buildPadShapePolygon(), D_PAD::BuildPadShapePolygon(), ZONE_FILLER::buildUnconnectedThermalStubsPolygonList(), ZONE_FILLER::buildZoneFeatureHoleList(), DRC::checkClearancePadToPad(), DRC::checkClearanceSegmToPad(), ConvertOutlineToPolygon(), ConvertPolyListToPolySet(), GERBER_DRAW_ITEM::ConvertSegmentToPolygon(), D_CODE::ConvertShapeToPolygon(), CINFO3D_VISU::createNewPadWithClearance(), CreateThermalReliefPadPolygon(), DRC::doFootprintOverlappingDrc(), KIGFX::PCB_PAINTER::draw(), D_PAD::DrawShape(), GERBER_FILE_IMAGE::Execute_DCODE_Command(), GERBER_FILE_IMAGE::Execute_G_Command(), fillArcPOLY(), MODULE::GetBoundingPoly(), getRectangleAlongCentreLine(), InsertVertex(), LEGACY_PLUGIN::loadZONE_CONTAINER(), ZONE_CONTAINER::operator=(), PCB_PARSER::parseZONE_CONTAINER(), ZONE_CREATE_HELPER::performZoneCutout(), DXF_PLOTTER::PlotPoly(), KIGFX::PREVIEW::POLYGON_ITEM::SetPoints(), DRAWSEGMENT::SetPolyPoints(), PNS_KICAD_IFACE::syncPad(), TEXTE_PCB::TransformBoundingBoxWithClearanceToPolygon(), TransformCircleToPolygon(), ZONE_CONTAINER::TransformOutlinesShapeWithClearanceToPolygon(), TransformOvalClearanceToPolygon(), TransformRingToPolygon(), TransformRoundedEndsSegmentToPolygon(), TransformRoundRectToPolygon(), DRAWSEGMENT::TransformShapeWithClearanceToPolygon(), D_PAD::TransformShapeWithClearanceToPolygon(), ZONE_CONTAINER::TransformSolidAreasShapesToPolygonSet(), and ZONE_CONTAINER::ZONE_CONTAINER().

186 {
187  if( aOutline < 0 )
188  aOutline += m_polys.size();
189 
190  int idx;
191 
192  if( aHole < 0 )
193  idx = 0;
194  else
195  idx = aHole + 1;
196 
197  assert( aOutline < (int) m_polys.size() );
198  assert( idx < (int) m_polys[aOutline].size() );
199 
200  m_polys[aOutline][idx].Append( x, y, aAllowDuplication );
201 
202  return m_polys[aOutline][idx].PointCount();
203 }
void SHAPE_POLY_SET::Append ( const SHAPE_POLY_SET aSet)

Merges polygons from two sets.

Definition at line 1354 of file shape_poly_set.cpp.

References m_polys.

1355 {
1356  m_polys.insert( m_polys.end(), aSet.m_polys.begin(), aSet.m_polys.end() );
1357 }
void SHAPE_POLY_SET::Append ( const VECTOR2I aP,
int  aOutline = -1,
int  aHole = -1 
)

Appends a vertex at the end of the given outline/hole (default: the last outline)

Definition at line 1360 of file shape_poly_set.cpp.

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

1361 {
1362  Append( aP.x, aP.y, aOutline, aHole );
1363 }
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline) ...
const BOX2I SHAPE_POLY_SET::BBox ( int  aClearance = 0) const
overridevirtual

Function BBox()

Computes a bounding box of the shape, with a margin of aClearance a collision.

Parameters
aClearancehow much the bounding box is expanded wrs to the minimum enclosing rectangle for the shape.
Returns
the bounding box.

Implements SHAPE.

Definition at line 1198 of file shape_poly_set.cpp.

References i, BOX2< Vec >::Inflate(), m_polys, and BOX2< Vec >::Merge().

Referenced by ZONE_FILLER::buildUnconnectedThermalStubsPolygonList(), BOARD::CombineAllAreasInNet(), Convert_path_polygon_to_polygon_blocks_and_dummy_blocks(), D_PAD::GetBestAnchorPosition(), GERBER_DRAW_ITEM::GetBoundingBox(), IsSolid(), BOARD::TestAreaIntersection(), KIGFX::PREVIEW::POLYGON_ITEM::ViewBBox(), and KIGFX::PREVIEW::CENTRELINE_RECT_ITEM::ViewBBox().

1199 {
1200  BOX2I bb;
1201 
1202  for( unsigned i = 0; i < m_polys.size(); i++ )
1203  {
1204  if( i == 0 )
1205  bb = m_polys[i][0].BBox();
1206  else
1207  bb.Merge( m_polys[i][0].BBox() );
1208  }
1209 
1210  bb.Inflate( aClearance );
1211  return bb;
1212 }
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Function Merge modifies the position and size of the rectangle in order to contain aRect...
Definition: box2.h:350
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:266
size_t i
Definition: json11.cpp:597
const BOX2I BBox(int aClearance=0) const override
Function BBox()
void SHAPE_POLY_SET::BooleanAdd ( const SHAPE_POLY_SET b,
POLYGON_MODE  aFastMode 
)

Performs boolean polyset union For aFastMode meaning, see function booleanOp

Definition at line 548 of file shape_poly_set.cpp.

References booleanOp().

Referenced by D_PAD::buildCustomPadPolygon(), BOARD::CombineAreas(), DXF_PLOTTER::PlotPoly(), PlotSolderMaskLayer(), and C3D_RENDER_OGL_LEGACY::reload().

549 {
550  booleanOp( ctUnion, b, aFastMode );
551 }
void booleanOp(ClipperLib::ClipType aType, const SHAPE_POLY_SET &aOtherShape, POLYGON_MODE aFastMode)
Function booleanOp this is the engine to execute all polygon boolean transforms (AND, OR, ...
void SHAPE_POLY_SET::BooleanAdd ( const SHAPE_POLY_SET a,
const SHAPE_POLY_SET b,
POLYGON_MODE  aFastMode 
)

Performs boolean polyset union between a and b, store the result in it self For aFastMode meaning, see function booleanOp

Definition at line 566 of file shape_poly_set.cpp.

References booleanOp().

569 {
570  booleanOp( ctUnion, a, b, aFastMode );
571 }
void booleanOp(ClipperLib::ClipType aType, const SHAPE_POLY_SET &aOtherShape, POLYGON_MODE aFastMode)
Function booleanOp this is the engine to execute all polygon boolean transforms (AND, OR, ...
void SHAPE_POLY_SET::BooleanIntersection ( const SHAPE_POLY_SET b,
POLYGON_MODE  aFastMode 
)

Performs boolean polyset intersection For aFastMode meaning, see function booleanOp

Definition at line 560 of file shape_poly_set.cpp.

References booleanOp().

Referenced by Convert_path_polygon_to_polygon_blocks_and_dummy_blocks(), DRC::doFootprintOverlappingDrc(), and TransformOvalClearanceToPolygon().

561 {
562  booleanOp( ctIntersection, b, aFastMode );
563 }
void booleanOp(ClipperLib::ClipType aType, const SHAPE_POLY_SET &aOtherShape, POLYGON_MODE aFastMode)
Function booleanOp this is the engine to execute all polygon boolean transforms (AND, OR, ...
void SHAPE_POLY_SET::BooleanIntersection ( const SHAPE_POLY_SET a,
const SHAPE_POLY_SET b,
POLYGON_MODE  aFastMode 
)

Performs boolean polyset intersection between a and b, store the result in it self For aFastMode meaning, see function booleanOp

Definition at line 582 of file shape_poly_set.cpp.

References booleanOp().

585 {
586  booleanOp( ctIntersection, a, b, aFastMode );
587 }
void booleanOp(ClipperLib::ClipType aType, const SHAPE_POLY_SET &aOtherShape, POLYGON_MODE aFastMode)
Function booleanOp this is the engine to execute all polygon boolean transforms (AND, OR, ...
void SHAPE_POLY_SET::booleanOp ( ClipperLib::ClipType  aType,
const SHAPE_POLY_SET aOtherShape,
POLYGON_MODE  aFastMode 
)
private

Function booleanOp this is the engine to execute all polygon boolean transforms (AND, OR, ...

and polygon simplification (merging overlaping polygons)

Parameters
aTypeis the transform type ( see ClipperLib::ClipType )
aOtherShapeis the SHAPE_LINE_CHAIN to combine with me.
aFastModeis an option to choose if the result can be a weak polygon or a stricty simple polygon. if aFastMode is PM_FAST the result can be a weak polygon if aFastMode is PM_STRICTLY_SIMPLE (default) the result is (theorically) a strictly simple polygon, but calculations can be really significantly time consuming

Definition at line 490 of file shape_poly_set.cpp.

References convertToClipper(), i, importTree(), m_polys, and PM_STRICTLY_SIMPLE.

Referenced by BooleanAdd(), BooleanIntersection(), BooleanSubtract(), IsEmpty(), and Simplify().

492 {
493  Clipper c;
494 
495  if( aFastMode == PM_STRICTLY_SIMPLE )
496  c.StrictlySimple( true );
497 
498  for( const POLYGON& poly : m_polys )
499  {
500  for( unsigned int i = 0; i < poly.size(); i++ )
501  c.AddPath( convertToClipper( poly[i], i > 0 ? false : true ), ptSubject, true );
502  }
503 
504  for( const POLYGON& poly : aOtherShape.m_polys )
505  {
506  for( unsigned int i = 0; i < poly.size(); i++ )
507  c.AddPath( convertToClipper( poly[i], i > 0 ? false : true ), ptClip, true );
508  }
509 
510  PolyTree solution;
511 
512  c.Execute( aType, solution, pftNonZero, pftNonZero );
513 
514  importTree( &solution );
515 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
const ClipperLib::Path convertToClipper(const SHAPE_LINE_CHAIN &aPath, bool aRequiredOrientation)
size_t i
Definition: json11.cpp:597
void importTree(ClipperLib::PolyTree *tree)
void SHAPE_POLY_SET::booleanOp ( ClipperLib::ClipType  aType,
const SHAPE_POLY_SET aShape,
const SHAPE_POLY_SET aOtherShape,
POLYGON_MODE  aFastMode 
)
private

Definition at line 518 of file shape_poly_set.cpp.

References convertToClipper(), i, importTree(), m_polys, and PM_STRICTLY_SIMPLE.

522 {
523  Clipper c;
524 
525  if( aFastMode == PM_STRICTLY_SIMPLE )
526  c.StrictlySimple( true );
527 
528  for( const POLYGON& poly : aShape.m_polys )
529  {
530  for( unsigned int i = 0; i < poly.size(); i++ )
531  c.AddPath( convertToClipper( poly[i], i > 0 ? false : true ), ptSubject, true );
532  }
533 
534  for( const POLYGON& poly : aOtherShape.m_polys )
535  {
536  for( unsigned int i = 0; i < poly.size(); i++ )
537  c.AddPath( convertToClipper( poly[i], i > 0 ? false : true ), ptClip, true );
538  }
539 
540  PolyTree solution;
541 
542  c.Execute( aType, solution, pftNonZero, pftNonZero );
543 
544  importTree( &solution );
545 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
const ClipperLib::Path convertToClipper(const SHAPE_LINE_CHAIN &aPath, bool aRequiredOrientation)
size_t i
Definition: json11.cpp:597
void importTree(ClipperLib::PolyTree *tree)
void SHAPE_POLY_SET::BooleanSubtract ( const SHAPE_POLY_SET b,
POLYGON_MODE  aFastMode 
)

Performs boolean polyset difference For aFastMode meaning, see function booleanOp

Definition at line 554 of file shape_poly_set.cpp.

References booleanOp().

Referenced by addHoleToPolygon(), ZONE_FILLER::computeRawFilledAreas(), MODULE::CoverageRatio(), CreateThermalReliefPadPolygon(), C3D_RENDER_OGL_LEGACY::generate_3D_Vias_and_Pads(), CPolyLine::NormalizeAreaOutlines(), and NormalizeAreaOutlines().

555 {
556  booleanOp( ctDifference, b, aFastMode );
557 }
void booleanOp(ClipperLib::ClipType aType, const SHAPE_POLY_SET &aOtherShape, POLYGON_MODE aFastMode)
Function booleanOp this is the engine to execute all polygon boolean transforms (AND, OR, ...
void SHAPE_POLY_SET::BooleanSubtract ( const SHAPE_POLY_SET a,
const SHAPE_POLY_SET b,
POLYGON_MODE  aFastMode 
)

Performs boolean polyset difference between a and b, store the result in it self For aFastMode meaning, see function booleanOp

Definition at line 574 of file shape_poly_set.cpp.

References booleanOp().

577 {
578  booleanOp( ctDifference, a, b, aFastMode );
579 }
void booleanOp(ClipperLib::ClipType aType, const SHAPE_POLY_SET &aOtherShape, POLYGON_MODE aFastMode)
Function booleanOp this is the engine to execute all polygon boolean transforms (AND, OR, ...
void SHAPE_POLY_SET::CacheTriangulation ( )

Definition at line 2046 of file shape_poly_set.cpp.

References checksum(), HasHoles(), HasTouchingHoles(), i, MD5_HASH::IsValid(), m_hash, m_triangulatedPolys, m_triangulationValid, OutlineCount(), PM_FAST, Polygon(), triangulateSingle(), and Unfracture().

Referenced by ZONE_CONTAINER::CacheTriangulation(), and PNS_KICAD_IFACE::syncZone().

2047 {
2048  bool recalculate = !m_hash.IsValid();
2049  MD5_HASH hash;
2050 
2051  if( !m_triangulationValid )
2052  recalculate = true;
2053 
2054  if( !recalculate )
2055  {
2056  hash = checksum();
2057 
2058  if( m_hash != hash )
2059  {
2060  m_hash = hash;
2061  recalculate = true;
2062  }
2063  }
2064 
2065  if( !recalculate )
2066  return;
2067 
2068  SHAPE_POLY_SET tmpSet = *this;
2069 
2070  if( !tmpSet.HasHoles() )
2071  tmpSet.Unfracture( PM_FAST );
2072 
2073  m_triangulatedPolys.clear();
2074 
2075  if( tmpSet.HasTouchingHoles() )
2076  {
2077  // temporary workaround for overlapping hole vertices that poly2tri doesn't handle
2078  m_triangulationValid = false;
2079  return;
2080  }
2081 
2082  for( int i = 0; i < tmpSet.OutlineCount(); i++ )
2083  {
2084  m_triangulatedPolys.push_back( std::make_unique<TRIANGULATED_POLYGON>() );
2085  triangulateSingle( tmpSet.Polygon( i ), *m_triangulatedPolys.back() );
2086  }
2087 
2088  m_triangulationValid = true;
2089  m_hash = checksum();
2090 }
bool HasHoles() const
Returns true if the polygon set has any holes.
MD5_HASH checksum() const
int OutlineCount() const
Returns the number of outlines in the set
std::vector< std::unique_ptr< TRIANGULATED_POLYGON > > m_triangulatedPolys
bool HasTouchingHoles() const
Returns true if the polygon set has any holes tha share a vertex.
Class SHAPE_POLY_SET.
void triangulateSingle(const POLYGON &aPoly, SHAPE_POLY_SET::TRIANGULATED_POLYGON &aResult)
bool IsValid() const
Definition: md5_hash.h:23
size_t i
Definition: json11.cpp:597
POLYGON & Polygon(int aIndex)
Returns the aIndex-th subpolygon in the set
void Unfracture(POLYGON_MODE aFastMode)
Converts a single outline slitted ("fractured") polygon into a set ouf outlines with holes...
virtual VECTOR2I SHAPE::Centre ( ) const
inlinevirtualinherited

Function Centre()

Computes a center-of-mass of the shape

Returns
the center-of-mass point

Definition at line 151 of file shape.h.

References SHAPE::BBox(), BOX2< Vec >::Centre(), SHAPE::Format(), SHAPE::IsSolid(), SHAPE::Move(), and SHAPE::Parse().

152  {
153  return BBox( 0 ).Centre(); // if nothing better is available....
154  }
virtual const BOX2I BBox(int aClearance=0) const =0
Function BBox()
Vec Centre() const
Definition: box2.h:67
SHAPE_POLY_SET SHAPE_POLY_SET::Chamfer ( int  aDistance)

Function Chamfer returns a chamfered version of the polygon set.

Parameters
aDistanceis the chamfering distance.
Returns
SHAPE_POLY_SET - A set containing the chamfered version of this set.

Definition at line 1668 of file shape_poly_set.cpp.

References ChamferPolygon(), and m_polys.

Referenced by ZONE_CONTAINER::BuildSmoothedPoly(), and IsEmpty().

1669 {
1670  SHAPE_POLY_SET chamfered;
1671 
1672  for( unsigned int polygonIdx = 0; polygonIdx < m_polys.size(); polygonIdx++ )
1673  chamfered.m_polys.push_back( ChamferPolygon( aDistance, polygonIdx ) );
1674 
1675  return chamfered;
1676 }
POLYGON ChamferPolygon(unsigned int aDistance, int aIndex=0)
Function Chamfer returns a chamfered version of the aIndex-th polygon.
Class SHAPE_POLY_SET.
SHAPE_POLY_SET::POLYGON SHAPE_POLY_SET::chamferFilletPolygon ( CORNER_MODE  aMode,
unsigned int  aDistance,
int  aIndex,
int  aErrorMax = -1 
)
private

Function chamferFilletPolygon Returns the camfered or filleted version of the aIndex-th polygon in the set, depending on the aMode selected.

Parameters
aModerepresent which action will be taken: CORNER_MODE::CHAMFERED will return a chamfered version of the polygon, CORNER_MODE::FILLETED will return a filleted version of the polygon.
aDistanceis the chamfering distance if aMode = CHAMFERED; if aMode = FILLETED, is the filleting radius.
aIndexis the index of the polygon that will be chamfered/filleted.
aErrorMaxis the maximum allowable deviation of the polygon from the circle if aMode = FILLETED. If aMode = CHAMFERED, it is unused.
Returns
POLYGON - the chamfered/filleted version of the polygon.

Definition at line 1690 of file shape_poly_set.cpp.

References SHAPE_LINE_CHAIN::Append(), GetArcToSegmentCount(), KiROUND(), SHAPE_LINE_CHAIN::Point(), Polygon(), RemoveNullSegments(), SHAPE_LINE_CHAIN::SetClosed(), and VECTOR2< T >::x.

Referenced by ChamferPolygon(), and FilletPolygon().

1694 {
1695  // Null segments create serious issues in calculations. Remove them:
1697 
1698  SHAPE_POLY_SET::POLYGON currentPoly = Polygon( aIndex );
1699  SHAPE_POLY_SET::POLYGON newPoly;
1700 
1701  // If the chamfering distance is zero, then the polygon remain intact.
1702  if( aDistance == 0 )
1703  {
1704  return currentPoly;
1705  }
1706 
1707  // Iterate through all the contours (outline and holes) of the polygon.
1708  for( SHAPE_LINE_CHAIN& currContour : currentPoly )
1709  {
1710  // Generate a new contour in the new polygon
1711  SHAPE_LINE_CHAIN newContour;
1712 
1713  // Iterate through the vertices of the contour
1714  for( int currVertex = 0; currVertex < currContour.PointCount(); currVertex++ )
1715  {
1716  // Current vertex
1717  int x1 = currContour.Point( currVertex ).x;
1718  int y1 = currContour.Point( currVertex ).y;
1719 
1720  // Indices for previous and next vertices.
1721  int prevVertex;
1722  int nextVertex;
1723 
1724  // Previous and next vertices indices computation. Necessary to manage the edge cases.
1725 
1726  // Previous vertex is the last one if the current vertex is the first one
1727  prevVertex = currVertex == 0 ? currContour.PointCount() - 1 : currVertex - 1;
1728 
1729  // next vertex is the first one if the current vertex is the last one.
1730  nextVertex = currVertex == currContour.PointCount() - 1 ? 0 : currVertex + 1;
1731 
1732  // Previous vertex computation
1733  double xa = currContour.Point( prevVertex ).x - x1;
1734  double ya = currContour.Point( prevVertex ).y - y1;
1735 
1736  // Next vertex computation
1737  double xb = currContour.Point( nextVertex ).x - x1;
1738  double yb = currContour.Point( nextVertex ).y - y1;
1739 
1740  // Compute the new distances
1741  double lena = hypot( xa, ya );
1742  double lenb = hypot( xb, yb );
1743 
1744  // Make the final computations depending on the mode selected, chamfered or filleted.
1745  if( aMode == CORNER_MODE::CHAMFERED )
1746  {
1747  double distance = aDistance;
1748 
1749  // Chamfer one half of an edge at most
1750  if( 0.5 * lena < distance )
1751  distance = 0.5 * lena;
1752 
1753  if( 0.5 * lenb < distance )
1754  distance = 0.5 * lenb;
1755 
1756  int nx1 = KiROUND( distance * xa / lena );
1757  int ny1 = KiROUND( distance * ya / lena );
1758 
1759  newContour.Append( x1 + nx1, y1 + ny1 );
1760 
1761  int nx2 = KiROUND( distance * xb / lenb );
1762  int ny2 = KiROUND( distance * yb / lenb );
1763 
1764  newContour.Append( x1 + nx2, y1 + ny2 );
1765  }
1766  else // CORNER_MODE = FILLETED
1767  {
1768  double cosine = ( xa * xb + ya * yb ) / ( lena * lenb );
1769 
1770  double radius = aDistance;
1771  double denom = sqrt( 2.0 / ( 1 + cosine ) - 1 );
1772 
1773  // Do nothing in case of parallel edges
1774  if( std::isinf( denom ) )
1775  continue;
1776 
1777  // Limit rounding distance to one half of an edge
1778  if( 0.5 * lena * denom < radius )
1779  radius = 0.5 * lena * denom;
1780 
1781  if( 0.5 * lenb * denom < radius )
1782  radius = 0.5 * lenb * denom;
1783 
1784  // Calculate fillet arc absolute center point (xc, yx)
1785  double k = radius / sqrt( .5 * ( 1 - cosine ) );
1786  double lenab = sqrt( ( xa / lena + xb / lenb ) * ( xa / lena + xb / lenb ) +
1787  ( ya / lena + yb / lenb ) * ( ya / lena + yb / lenb ) );
1788  double xc = x1 + k * ( xa / lena + xb / lenb ) / lenab;
1789  double yc = y1 + k * ( ya / lena + yb / lenb ) / lenab;
1790 
1791  // Calculate arc start and end vectors
1792  k = radius / sqrt( 2 / ( 1 + cosine ) - 1 );
1793  double xs = x1 + k * xa / lena - xc;
1794  double ys = y1 + k * ya / lena - yc;
1795  double xe = x1 + k * xb / lenb - xc;
1796  double ye = y1 + k * yb / lenb - yc;
1797 
1798  // Cosine of arc angle
1799  double argument = ( xs * xe + ys * ye ) / ( radius * radius );
1800 
1801  // Make sure the argument is in [-1,1], interval in which the acos function is
1802  // defined
1803  if( argument < -1 )
1804  argument = -1;
1805  else if( argument > 1 )
1806  argument = 1;
1807 
1808  double arcAngle = acos( argument );
1809  double arcAngleDegrees = arcAngle * 180.0 / M_PI;
1810  int segments = GetArcToSegmentCount( radius, aErrorMax, arcAngleDegrees );
1811 
1812  double deltaAngle = arcAngle / segments;
1813  double startAngle = atan2( -ys, xs );
1814 
1815  // Flip arc for inner corners
1816  if( xa * yb - ya * xb <= 0 )
1817  deltaAngle *= -1;
1818 
1819  double nx = xc + xs;
1820  double ny = yc + ys;
1821 
1822  newContour.Append( KiROUND( nx ), KiROUND( ny ) );
1823 
1824  // Store the previous added corner to make a sanity check
1825  int prevX = KiROUND( nx );
1826  int prevY = KiROUND( ny );
1827 
1828  for( int j = 0; j < segments; j++ )
1829  {
1830  nx = xc + cos( startAngle + ( j + 1 ) * deltaAngle ) * radius;
1831  ny = yc - sin( startAngle + ( j + 1 ) * deltaAngle ) * radius;
1832 
1833  // Sanity check: the rounding can produce repeated corners; do not add them.
1834  if( KiROUND( nx ) != prevX || KiROUND( ny ) != prevY )
1835  {
1836  newContour.Append( KiROUND( nx ), KiROUND( ny ) );
1837  prevX = KiROUND( nx );
1838  prevY = KiROUND( ny );
1839  }
1840  }
1841  }
1842  }
1843 
1844  // Close the current contour and add it the new polygon
1845  newContour.SetClosed( true );
1846  newPoly.push_back( newContour );
1847  }
1848 
1849  return newPoly;
1850 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
int GetArcToSegmentCount(int aRadius, int aErrorMax, double aArcAngleDegree)
static int KiROUND(double v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: common.h:106
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
void SetClosed(bool aClosed)
Function SetClosed()
int RemoveNullSegments()
Function RemoveNullSegments looks for null segments; ie, segments whose ends are exactly the same and...
Class SHAPE_LINE_CHAIN.
VECTOR2I & Point(int aIndex)
Function Point()
POLYGON & Polygon(int aIndex)
Returns the aIndex-th subpolygon in the set
SHAPE_POLY_SET::POLYGON SHAPE_POLY_SET::ChamferPolygon ( unsigned int  aDistance,
int  aIndex = 0 
)

Function Chamfer returns a chamfered version of the aIndex-th polygon.

Parameters
aDistanceis the chamfering distance.
aIndexis the index of the polygon to be chamfered.
Returns
POLYGON - A polygon containing the chamfered version of the aIndex-th polygon.

Definition at line 1544 of file shape_poly_set.cpp.

References chamferFilletPolygon().

Referenced by Chamfer(), and IsEmpty().

1545 {
1546  return chamferFilletPolygon( CORNER_MODE::CHAMFERED, aDistance, aIndex );
1547 }
POLYGON chamferFilletPolygon(CORNER_MODE aMode, unsigned int aDistance, int aIndex, int aErrorMax=-1)
Function chamferFilletPolygon Returns the camfered or filleted version of the aIndex-th polygon in th...
MD5_HASH SHAPE_POLY_SET::checksum ( ) const
private

Definition at line 2093 of file shape_poly_set.cpp.

References MD5_HASH::Finalize(), MD5_HASH::Hash(), i, and m_polys.

Referenced by CacheTriangulation(), GetHash(), and IsTriangulationUpToDate().

2094 {
2095  MD5_HASH hash;
2096 
2097  hash.Hash( m_polys.size() );
2098 
2099  for( const auto& outline : m_polys )
2100  {
2101  hash.Hash( outline.size() );
2102 
2103  for( const auto& lc : outline )
2104  {
2105  hash.Hash( lc.PointCount() );
2106 
2107  for( int i = 0; i < lc.PointCount(); i++ )
2108  {
2109  hash.Hash( lc.CPoint( i ).x );
2110  hash.Hash( lc.CPoint( i ).y );
2111  }
2112  }
2113  }
2114 
2115  hash.Finalize();
2116 
2117  return hash;
2118 }
void Hash(uint8_t *data, uint32_t length)
Definition: md5_hash.cpp:66
size_t i
Definition: json11.cpp:597
void Finalize()
Definition: md5_hash.cpp:76
const SHAPE_LINE_CHAIN& SHAPE_POLY_SET::CHole ( int  aOutline,
int  aHole 
) const
inline
CONST_ITERATOR SHAPE_POLY_SET::CIterate ( int  aFirst,
int  aLast,
bool  aIterateHoles = false 
) const
inline

Definition at line 697 of file shape_poly_set.h.

References SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_currentContour, SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_currentPolygon, SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_currentVertex, SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_iterateHoles, SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_lastPolygon, SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_poly, and OutlineCount().

Referenced by D_PAD::AddPrimitive(), DRAWSEGMENT::BuildPolyPointsList(), EDGE_MODULE::Draw(), PCB_IO::format(), DRAWSEGMENT::GetBoundingBox(), BRDITEMS_PLOTTER::PlotFilledAreas(), and PNS_KICAD_IFACE::syncPad().

698  {
699  CONST_ITERATOR iter;
700 
701  iter.m_poly = const_cast<SHAPE_POLY_SET*>( this );
702  iter.m_currentPolygon = aFirst;
703  iter.m_lastPolygon = aLast < 0 ? OutlineCount() - 1 : aLast;
704  iter.m_currentContour = 0;
705  iter.m_currentVertex = 0;
706  iter.m_iterateHoles = aIterateHoles;
707 
708  return iter;
709  }
int OutlineCount() const
Returns the number of outlines in the set
Class SHAPE_POLY_SET.
ITERATOR_TEMPLATE< const VECTOR2I > CONST_ITERATOR
CONST_ITERATOR SHAPE_POLY_SET::CIterate ( int  aOutline) const
inline

Definition at line 711 of file shape_poly_set.h.

References CIterate().

712  {
713  return CIterate( aOutline, aOutline );
714  }
CONST_ITERATOR CIterate() const
CONST_ITERATOR SHAPE_POLY_SET::CIterate ( ) const
inline

Definition at line 721 of file shape_poly_set.h.

References OutlineCount().

Referenced by CIterate(), and CIterateWithHoles().

722  {
723  return CIterate( 0, OutlineCount() - 1 );
724  }
CONST_ITERATOR CIterate() const
int OutlineCount() const
Returns the number of outlines in the set
CONST_ITERATOR SHAPE_POLY_SET::CIterateWithHoles ( int  aOutline) const
inline

Definition at line 716 of file shape_poly_set.h.

References CIterate().

Referenced by EDIT_POINTS_FACTORY::buildForPolyOutline(), ZONE_CONTAINER::CIterateWithHoles(), and GRID_HELPER::computeAnchors().

717  {
718  return CIterate( aOutline, aOutline, true );
719  }
CONST_ITERATOR CIterate() const
CONST_ITERATOR SHAPE_POLY_SET::CIterateWithHoles ( ) const
inline

Definition at line 726 of file shape_poly_set.h.

References CIterate(), and OutlineCount().

727  {
728  return CIterate( 0, OutlineCount() - 1, true );
729  }
CONST_ITERATOR CIterate() const
int OutlineCount() const
Returns the number of outlines in the set
SHAPE * SHAPE_POLY_SET::Clone ( ) const
overridevirtual

Function Clone()

Returns a dynamically allocated copy of the shape

Return values
copyof the shape

Reimplemented from SHAPE.

Definition at line 67 of file shape_poly_set.cpp.

References SHAPE_POLY_SET().

68 {
69  return new SHAPE_POLY_SET( *this );
70 }
bool SHAPE::Collide ( const SHAPE aShape,
int  aClearance,
VECTOR2I aMTV 
) const
virtualinherited

Function Collide()

Checks if the boundary of shape (this) lies closer to the shape aShape than aClearance, indicating a collision.

Parameters
aShapeshape to check collision against
aClearanceminimum clearance
aMTVminimum translation vector
Returns
true, if there is a collision.

Definition at line 456 of file shape_collisions.cpp.

References CollideShapes().

457 {
458  return CollideShapes( this, aShape, aClerance, true, aMTV );
459 }
bool CollideShapes(const SHAPE *aA, const SHAPE *aB, int aClearance, bool aNeedMTV, VECTOR2I &aMTV)
bool SHAPE::Collide ( const SHAPE aShape,
int  aClearance = 0 
) const
virtualinherited

Definition at line 462 of file shape_collisions.cpp.

References CollideShapes(), and dummy().

463 {
464  VECTOR2I dummy;
465 
466  return CollideShapes( this, aShape, aClerance, false, dummy );
467 }
static LIB_PART * dummy()
Used when a LIB_PART is not found in library to draw a dummy shape This component is a 400 mils squar...
bool CollideShapes(const SHAPE *aA, const SHAPE *aB, int aClearance, bool aNeedMTV, VECTOR2I &aMTV)
bool SHAPE_POLY_SET::Collide ( const VECTOR2I aP,
int  aClearance = 0 
) const
overridevirtual

Function Collide Checks whether the point aP collides with the inside of the polygon set; if the point lies on an edge or on a corner of any of the polygons, there is no collision: the edges does not belong to the polygon itself.

Parameters
aPis the VECTOR2I point whose collision with respect to the poly set will be tested.
aClearanceis the security distance; if the point lies closer to the polygon than aClearance distance, then there is a collision.
Returns
bool - true if the point aP collides with the polygon; false in any other case.

Reimplemented from SHAPE.

Definition at line 1263 of file shape_poly_set.cpp.

References Contains(), Inflate(), and SHAPE_POLY_SET().

Referenced by IsSolid().

1264 {
1265  SHAPE_POLY_SET polySet = SHAPE_POLY_SET( *this );
1266 
1267  // Inflate the polygon if necessary.
1268  if( aClearance > 0 )
1269  {
1270  // fixme: the number of arc segments should not be hardcoded
1271  polySet.Inflate( aClearance, 8 );
1272  }
1273 
1274  // There is a collision if and only if the point is inside of the polygon.
1275  return polySet.Contains( aP );
1276 }
bool Contains(const VECTOR2I &aP, int aSubpolyIndex=-1, bool aIgnoreHoles=false) const
Returns true if a given subpolygon contains the point aP.
void Inflate(int aFactor, int aCircleSegmentsCount)
Performs outline inflation/deflation, using round corners.
Class SHAPE_POLY_SET.
bool SHAPE_POLY_SET::Collide ( const SEG aSeg,
int  aClearance = 0 
) const
overridevirtual

Function Collide Checks whether the segment aSeg collides with the inside of the polygon set; if the segment touches an edge or a corner of any of the polygons, there is no collision: the edges do not belong to the polygon itself.

Parameters
aSegis the SEG segment whose collision with respect to the poly set will be tested.
aClearanceis the security distance; if the segment passes closer to the polygon than aClearance distance, then there is a collision.
Returns
bool - true if the segment aSeg collides with the polygon; false in any other case.

Implements SHAPE.

Definition at line 1232 of file shape_poly_set.cpp.

References SEG::A, Contains(), Inflate(), SEG::Intersect(), IterateSegmentsWithHoles(), and SHAPE_POLY_SET().

1233 {
1234 
1235  SHAPE_POLY_SET polySet = SHAPE_POLY_SET( *this );
1236 
1237  // Inflate the polygon if necessary.
1238  if( aClearance > 0 )
1239  {
1240  // fixme: the number of arc segments should not be hardcoded
1241  polySet.Inflate( aClearance, 8 );
1242  }
1243 
1244  // We are going to check to see if the segment crosses an external
1245  // boundary. However, if the full segment is inside the polyset, this
1246  // will not be true. So we first test to see if one of the points is
1247  // inside. If true, then we collide
1248  if( polySet.Contains( aSeg.A ) )
1249  return true;
1250 
1251  for( SEGMENT_ITERATOR iterator = polySet.IterateSegmentsWithHoles(); iterator; iterator++ )
1252  {
1253  SEG polygonEdge = *iterator;
1254 
1255  if( polygonEdge.Intersect( aSeg, true ) )
1256  return true;
1257  }
1258 
1259  return false;
1260 }
SEGMENT_ITERATOR IterateSegmentsWithHoles()
Returns an iterator object, for all outlines in the set (with holes)
SEGMENT_ITERATOR_TEMPLATE< SEG > SEGMENT_ITERATOR
bool Contains(const VECTOR2I &aP, int aSubpolyIndex=-1, bool aIgnoreHoles=false) const
Returns true if a given subpolygon contains the point aP.
OPT_VECTOR2I Intersect(const SEG &aSeg, bool aIgnoreEndpoints=false, bool aLines=false) const
Function Intersect()
Definition: seg.cpp:99
void Inflate(int aFactor, int aCircleSegmentsCount)
Performs outline inflation/deflation, using round corners.
Class SHAPE_POLY_SET.
Definition: seg.h:36
VECTOR2I A
Definition: seg.h:46
bool SHAPE_POLY_SET::CollideEdge ( const VECTOR2I aPoint,
SHAPE_POLY_SET::VERTEX_INDEX aClosestVertex,
int  aClearance = 0 
)

Function CollideEdge Checks whether aPoint collides with any edge of any of the contours of the polygon.

Parameters
aPointis the VECTOR2I point whose collision with respect to the polygon will be tested.
aClearanceis the security distance; if aPoint lies closer to a vertex than aClearance distance, then there is a collision.
aClosestVertexis the index of the closes vertex to aPoint.
Returns
bool - true if there is a collision, false in any other case.

Definition at line 1404 of file shape_poly_set.cpp.

References SEG::Distance(), SHAPE_POLY_SET::SEGMENT_ITERATOR_TEMPLATE< T >::GetIndex(), and IterateSegmentsWithHoles().

Referenced by ZONE_CONTAINER::HitTestForEdge(), and IsSolid().

1406 {
1407  // Shows whether there was a collision
1408  bool collision = false;
1409 
1410  SEGMENT_ITERATOR iterator;
1411 
1412  for( iterator = IterateSegmentsWithHoles(); iterator; iterator++ )
1413  {
1414  SEG currentSegment = *iterator;
1415  int distance = currentSegment.Distance( aPoint );
1416 
1417  // Check for collisions
1418  if( distance <= aClearance )
1419  {
1420  collision = true;
1421 
1422  // Update aClearance to look for closer edges
1423  aClearance = distance;
1424 
1425  // Store the indices that identify the vertex
1426  aClosestVertex = iterator.GetIndex();
1427  }
1428  }
1429 
1430  return collision;
1431 }
SEGMENT_ITERATOR IterateSegmentsWithHoles()
Returns an iterator object, for all outlines in the set (with holes)
SEGMENT_ITERATOR_TEMPLATE< SEG > SEGMENT_ITERATOR
Definition: seg.h:36
int Distance(const SEG &aSeg) const
Function Distance()
Definition: seg.h:195
bool SHAPE_POLY_SET::CollideVertex ( const VECTOR2I aPoint,
SHAPE_POLY_SET::VERTEX_INDEX aClosestVertex,
int  aClearance = 0 
)

Function CollideVertex Checks whether aPoint collides with any vertex of any of the contours of the polygon.

Parameters
aPointis the VECTOR2I point whose collision with respect to the polygon will be tested.
aClearanceis the security distance; if aPoint lies closer to a vertex than aClearance distance, then there is a collision.
aClosestVertexis the index of the closes vertex to aPoint.
Returns
bool - true if there is a collision, false in any other case.

Definition at line 1366 of file shape_poly_set.cpp.

References delta, VECTOR2< T >::EuclideanNorm(), and IterateWithHoles().

Referenced by ZONE_CONTAINER::HitTestForCorner(), and IsSolid().

1368 {
1369  // Shows whether there was a collision
1370  bool collision = false;
1371 
1372  // Difference vector between each vertex and aPoint.
1373  VECTOR2D delta;
1374  double distance, clearance;
1375 
1376  // Convert clearance to double for precission when comparing distances
1377  clearance = aClearance;
1378 
1379  for( ITERATOR iterator = IterateWithHoles(); iterator; iterator++ )
1380  {
1381  // Get the difference vector between current vertex and aPoint
1382  delta = *iterator - aPoint;
1383 
1384  // Compute distance
1385  distance = delta.EuclideanNorm();
1386 
1387  // Check for collisions
1388  if( distance <= clearance )
1389  {
1390  collision = true;
1391 
1392  // Update aClearance to look for closer vertices
1393  clearance = distance;
1394 
1395  // Store the indices that identify the vertex
1396  aClosestVertex = iterator.GetIndex();
1397  }
1398  }
1399 
1400  return collision;
1401 }
static const int delta[8][2]
Definition: solve.cpp:112
T EuclideanNorm() const
Destructor.
Definition: vector2d.h:294
ITERATOR_TEMPLATE< VECTOR2I > ITERATOR
ITERATOR IterateWithHoles()
Function IterateWithHoles.
bool SHAPE_POLY_SET::Contains ( const VECTOR2I aP,
int  aSubpolyIndex = -1,
bool  aIgnoreHoles = false 
) const

Returns true if a given subpolygon contains the point aP.

Parameters
aPis the point to check
aSubpolyIndexis the subpolygon to check, or -1 to check all
aIgnoreHolescontrols whether or not internal holes are considered
Returns
true if the polygon contains the point

Definition at line 1434 of file shape_poly_set.cpp.

References containsSingle(), m_polys, and OutlineCount().

Referenced by ZONE_FILLER::buildUnconnectedThermalStubsPolygonList(), Collide(), DRC::doEdgeZoneDrc(), D_PAD::GetBestAnchorPosition(), GERBER_DRAW_ITEM::HitTest(), ZONE_CONTAINER::HitTestFilledArea(), ZONE_CONTAINER::HitTestInsideZone(), IsSolid(), BOARD::TestAreaIntersection(), and DRC::TestZoneToZoneOutline().

1435 {
1436  if( m_polys.size() == 0 ) // empty set?
1437  return false;
1438 
1439  // If there is a polygon specified, check the condition against that polygon
1440  if( aSubpolyIndex >= 0 )
1441  return containsSingle( aP, aSubpolyIndex, aIgnoreHoles );
1442 
1443  // In any other case, check it against all polygons in the set
1444  for( int polygonIdx = 0; polygonIdx < OutlineCount(); polygonIdx++ )
1445  {
1446  if( containsSingle( aP, polygonIdx, aIgnoreHoles ) )
1447  return true;
1448  }
1449 
1450  return false;
1451 }
int OutlineCount() const
Returns the number of outlines in the set
bool containsSingle(const VECTOR2I &aP, int aSubpolyIndex, bool aIgnoreHoles=false) const
containsSingle function Checks whether the point aP is inside the aSubpolyIndex-th polygon of the pol...
bool SHAPE_POLY_SET::containsSingle ( const VECTOR2I aP,
int  aSubpolyIndex,
bool  aIgnoreHoles = false 
) const
private

containsSingle function Checks whether the point aP is inside the aSubpolyIndex-th polygon of the polyset.

If the points lies on an edge, the polygon is considered to contain it.

Parameters
aPis the VECTOR2I point whose position with respect to the inside of the aSubpolyIndex-th polygon will be tested.
aSubpolyIndexis an integer specifying which polygon in the set has to be checked.
aIgnoreHolescan be set to true to ignore internal holes in the polygon
Returns
bool - true if aP is inside aSubpolyIndex-th polygon; false in any other case.

Definition at line 1472 of file shape_poly_set.cpp.

References CHole(), HoleCount(), m_polys, pointInPolygon(), and SHAPE_LINE_CHAIN::PointOnEdge().

Referenced by Contains(), DistanceToPolygon(), and IsEmpty().

1473 {
1474  // Check that the point is inside the outline
1475  if( pointInPolygon( aP, m_polys[aSubpolyIndex][0] ) )
1476  {
1477  if( !aIgnoreHoles )
1478  {
1479  // Check that the point is not in any of the holes
1480  for( int holeIdx = 0; holeIdx < HoleCount( aSubpolyIndex ); holeIdx++ )
1481  {
1482  const SHAPE_LINE_CHAIN hole = CHole( aSubpolyIndex, holeIdx );
1483 
1484  // If the point is inside a hole (and not on its edge),
1485  // it is outside of the polygon
1486  if( pointInPolygon( aP, hole ) && !hole.PointOnEdge( aP ) )
1487  return false;
1488  }
1489  }
1490 
1491  return true;
1492  }
1493 
1494  return false;
1495 }
bool PointOnEdge(const VECTOR2I &aP) const
Function PointOnEdge()
int HoleCount(int aOutline) const
Returns the number of holes in a given outline
const SHAPE_LINE_CHAIN & CHole(int aOutline, int aHole) const
bool pointInPolygon(const VECTOR2I &aP, const SHAPE_LINE_CHAIN &aPath) const
Class SHAPE_LINE_CHAIN.
const SHAPE_LINE_CHAIN SHAPE_POLY_SET::convertFromClipper ( const ClipperLib::Path &  aPath)
private

Definition at line 477 of file shape_poly_set.cpp.

References SHAPE_LINE_CHAIN::Append(), i, and SHAPE_LINE_CHAIN::SetClosed().

Referenced by importTree(), and IsEmpty().

478 {
479  SHAPE_LINE_CHAIN lc;
480 
481  for( unsigned int i = 0; i < aPath.size(); i++ )
482  lc.Append( aPath[i].X, aPath[i].Y );
483 
484  lc.SetClosed( true );
485 
486  return lc;
487 }
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
void SetClosed(bool aClosed)
Function SetClosed()
Class SHAPE_LINE_CHAIN.
size_t i
Definition: json11.cpp:597
const Path SHAPE_POLY_SET::convertToClipper ( const SHAPE_LINE_CHAIN aPath,
bool  aRequiredOrientation 
)
private

Definition at line 459 of file shape_poly_set.cpp.

References SHAPE_LINE_CHAIN::CPoint(), i, SHAPE_LINE_CHAIN::PointCount(), vertex(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by booleanOp(), Inflate(), and IsEmpty().

461 {
462  Path c_path;
463 
464  for( int i = 0; i < aPath.PointCount(); i++ )
465  {
466  const VECTOR2I& vertex = aPath.CPoint( i );
467  c_path.push_back( IntPoint( vertex.x, vertex.y ) );
468  }
469 
470  if( Orientation( c_path ) != aRequiredOrientation )
471  ReversePath( c_path );
472 
473  return c_path;
474 }
int PointCount() const
Function PointCount()
VECTOR2I & vertex(int aCornerId)
size_t i
Definition: json11.cpp:597
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
const POLYGON& SHAPE_POLY_SET::CPolygon ( int  aIndex) const
inline
const VECTOR2I & SHAPE_POLY_SET::CVertex ( int  aIndex,
int  aOutline,
int  aHole 
) const

Returns the index-th vertex in a given hole outline within a given outline

Definition at line 287 of file shape_poly_set.cpp.

References m_polys.

Referenced by CVertex(), ZONE_CONTAINER::GetCornerPosition(), DRAWSEGMENT::GetPosition(), DRAWSEGMENT::HitTest(), and POINT_EDITOR::updatePoints().

288 {
289  if( aOutline < 0 )
290  aOutline += m_polys.size();
291 
292  int idx;
293 
294  if( aHole < 0 )
295  idx = 0;
296  else
297  idx = aHole + 1;
298 
299  assert( aOutline < (int) m_polys.size() );
300  assert( idx < (int) m_polys[aOutline].size() );
301 
302  return m_polys[aOutline][idx].CPoint( aIndex );
303 }
const VECTOR2I & SHAPE_POLY_SET::CVertex ( int  aGlobalIndex) const

Returns the aGlobalIndex-th vertex in the poly set

Definition at line 318 of file shape_poly_set.cpp.

References GetRelativeIndices(), SHAPE_POLY_SET::VERTEX_INDEX::m_contour, SHAPE_POLY_SET::VERTEX_INDEX::m_polygon, m_polys, and SHAPE_POLY_SET::VERTEX_INDEX::m_vertex.

319 {
321 
322  // Assure the passed index references a legal position; abort otherwise
323  if( !GetRelativeIndices( aGlobalIndex, &index ) )
324  throw( std::out_of_range( "aGlobalIndex-th vertex does not exist" ) );
325 
326  return m_polys[index.m_polygon][index.m_contour].CPoint( index.m_vertex );
327 }
Struct VERTEX_INDEX.
bool GetRelativeIndices(int aGlobalIdx, VERTEX_INDEX *aRelativeIndices) const
Function GetRelativeIndices.
const VECTOR2I & SHAPE_POLY_SET::CVertex ( SHAPE_POLY_SET::VERTEX_INDEX  index) const

Returns the index-th vertex in a given hole outline within a given outline

Definition at line 336 of file shape_poly_set.cpp.

References CVertex(), SHAPE_POLY_SET::VERTEX_INDEX::m_contour, SHAPE_POLY_SET::VERTEX_INDEX::m_polygon, and SHAPE_POLY_SET::VERTEX_INDEX::m_vertex.

337 {
338  return CVertex( index.m_vertex, index.m_polygon, index.m_contour - 1 );
339 }
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Returns the index-th vertex in a given hole outline within a given outline
const VECTOR2I& SHAPE_POLY_SET::cvertex ( int  aCornerId) const
private

Referenced by IsEmpty().

void SHAPE_POLY_SET::DeletePolygon ( int  aIdx)

Deletes aIdx-th polygon from the set

Definition at line 1348 of file shape_poly_set.cpp.

References m_polys.

Referenced by ZONE_FILLER::Fill(), and IsEmpty().

1349 {
1350  m_polys.erase( m_polys.begin() + aIdx );
1351 }
int SHAPE_POLY_SET::Distance ( VECTOR2I  aPoint)

Function DistanceToPolygon computes the minimum distance between aPoint and all the polygons in the set.

Parameters
aPointis the point whose distance to the set has to be measured.
Returns
int - The minimum distance between aPoint and all the polygons in the set. If the point is contained in any of the polygons, the distance is zero.

Definition at line 1619 of file shape_poly_set.cpp.

References DistanceToPolygon(), and m_polys.

Referenced by DRC::doTrackKeepoutDrc(), IsEmpty(), and DRC::testKeepoutAreas().

1620 {
1621  int currentDistance;
1622  int minDistance = DistanceToPolygon( aPoint, 0 );
1623 
1624  // Iterate through all the polygons and get the minimum distance.
1625  for( unsigned int polygonIdx = 1; polygonIdx < m_polys.size(); polygonIdx++ )
1626  {
1627  currentDistance = DistanceToPolygon( aPoint, polygonIdx );
1628 
1629  if( currentDistance < minDistance )
1630  minDistance = currentDistance;
1631  }
1632 
1633  return minDistance;
1634 }
int DistanceToPolygon(VECTOR2I aPoint, int aIndex)
Function DistanceToPolygon computes the minimum distance between the aIndex-th polygon and aPoint...
int SHAPE_POLY_SET::Distance ( const SEG aSegment,
int  aSegmentWidth = 0 
)

Function DistanceToPolygon computes the minimum distance between aSegment and all the polygons in the set.

Parameters
aSegmentis the segment whose distance to the polygon set has to be measured.
aSegmentWidthis the width of the segment; defaults to zero.
Returns
int - The minimum distance between aSegment and all the polygons in the set. If the point is contained in the polygon, the distance is zero.

Definition at line 1637 of file shape_poly_set.cpp.

References DistanceToPolygon(), and m_polys.

1638 {
1639  int currentDistance;
1640  int minDistance = DistanceToPolygon( aSegment, 0 );
1641 
1642  // Iterate through all the polygons and get the minimum distance.
1643  for( unsigned int polygonIdx = 1; polygonIdx < m_polys.size(); polygonIdx++ )
1644  {
1645  currentDistance = DistanceToPolygon( aSegment, polygonIdx, aSegmentWidth );
1646 
1647  if( currentDistance < minDistance )
1648  minDistance = currentDistance;
1649  }
1650 
1651  return minDistance;
1652 }
int DistanceToPolygon(VECTOR2I aPoint, int aIndex)
Function DistanceToPolygon computes the minimum distance between the aIndex-th polygon and aPoint...
int SHAPE_POLY_SET::DistanceToPolygon ( VECTOR2I  aPoint,
int  aIndex 
)

Function DistanceToPolygon computes the minimum distance between the aIndex-th polygon and aPoint.

Parameters
aPointis the point whose distance to the aIndex-th polygon has to be measured.
aIndexis the index of the polygon whose distace to aPoint has to be measured.
Returns
int - The minimum distance between aPoint and all the segments of the aIndex-th polygon. If the point is contained in the polygon, the distance is zero.

Definition at line 1558 of file shape_poly_set.cpp.

References containsSingle(), SEG::Distance(), and IterateSegmentsWithHoles().

Referenced by Distance(), and IsEmpty().

1559 {
1560  // We calculate the min dist between the segment and each outline segment
1561  // However, if the segment to test is inside the outline, and does not cross
1562  // any edge, it can be seen outside the polygon.
1563  // Therefore test if a segment end is inside ( testing only one end is enough )
1564  if( containsSingle( aPoint, aPolygonIndex ) )
1565  return 0;
1566 
1567  SEGMENT_ITERATOR iterator = IterateSegmentsWithHoles( aPolygonIndex );
1568 
1569  SEG polygonEdge = *iterator;
1570  int minDistance = polygonEdge.Distance( aPoint );
1571 
1572  for( iterator++; iterator && minDistance > 0; iterator++ )
1573  {
1574  polygonEdge = *iterator;
1575 
1576  int currentDistance = polygonEdge.Distance( aPoint );
1577 
1578  if( currentDistance < minDistance )
1579  minDistance = currentDistance;
1580  }
1581 
1582  return minDistance;
1583 }
SEGMENT_ITERATOR IterateSegmentsWithHoles()
Returns an iterator object, for all outlines in the set (with holes)
SEGMENT_ITERATOR_TEMPLATE< SEG > SEGMENT_ITERATOR
Definition: seg.h:36
bool containsSingle(const VECTOR2I &aP, int aSubpolyIndex, bool aIgnoreHoles=false) const
containsSingle function Checks whether the point aP is inside the aSubpolyIndex-th polygon of the pol...
int Distance(const SEG &aSeg) const
Function Distance()
Definition: seg.h:195
int SHAPE_POLY_SET::DistanceToPolygon ( SEG  aSegment,
int  aIndex,
int  aSegmentWidth = 0 
)

Function DistanceToPolygon computes the minimum distance between the aIndex-th polygon and aSegment with a possible width.

Parameters
aSegmentis the segment whose distance to the aIndex-th polygon has to be measured.
aIndexis the index of the polygon whose distace to aPoint has to be measured.
aSegmentWidthis the width of the segment; defaults to zero.
Returns
int - The minimum distance between aSegment and all the segments of the aIndex-th polygon. If the point is contained in the polygon, the distance is zero.

Definition at line 1586 of file shape_poly_set.cpp.

References SEG::A, containsSingle(), SEG::Distance(), and IterateSegmentsWithHoles().

1587 {
1588  // We calculate the min dist between the segment and each outline segment
1589  // However, if the segment to test is inside the outline, and does not cross
1590  // any edge, it can be seen outside the polygon.
1591  // Therefore test if a segment end is inside ( testing only one end is enough )
1592  if( containsSingle( aSegment.A, aPolygonIndex ) )
1593  return 0;
1594 
1595  SEGMENT_ITERATOR iterator = IterateSegmentsWithHoles( aPolygonIndex );
1596 
1597  SEG polygonEdge = *iterator;
1598  int minDistance = polygonEdge.Distance( aSegment );
1599 
1600  for( iterator++; iterator && minDistance > 0; iterator++ )
1601  {
1602  polygonEdge = *iterator;
1603 
1604  int currentDistance = polygonEdge.Distance( aSegment );
1605 
1606  if( currentDistance < minDistance )
1607  minDistance = currentDistance;
1608  }
1609 
1610  // Take into account the width of the segment
1611  if( aSegmentWidth > 0 )
1612  minDistance -= aSegmentWidth / 2;
1613 
1614  // Return the maximum of minDistance and zero
1615  return minDistance < 0 ? 0 : minDistance;
1616 }
SEGMENT_ITERATOR IterateSegmentsWithHoles()
Returns an iterator object, for all outlines in the set (with holes)
SEGMENT_ITERATOR_TEMPLATE< SEG > SEGMENT_ITERATOR
Definition: seg.h:36
VECTOR2I A
Definition: seg.h:46
bool containsSingle(const VECTOR2I &aP, int aSubpolyIndex, bool aIgnoreHoles=false) const
containsSingle function Checks whether the point aP is inside the aSubpolyIndex-th polygon of the pol...
int Distance(const SEG &aSeg) const
Function Distance()
Definition: seg.h:195
SHAPE_POLY_SET SHAPE_POLY_SET::Fillet ( int  aRadius,
int  aErrorMax 
)

Function Fillet returns a filleted version of the polygon set.

Parameters
aRadiusis the fillet radius.
aErrorMaxis the maximum allowable deviation of the polygon from the circle
Returns
SHAPE_POLY_SET - A set containing the filleted version of this set.

Definition at line 1679 of file shape_poly_set.cpp.

References FilletPolygon(), and m_polys.

Referenced by ZONE_CONTAINER::BuildSmoothedPoly(), and IsEmpty().

1680 {
1681  SHAPE_POLY_SET filleted;
1682 
1683  for( size_t polygonIdx = 0; polygonIdx < m_polys.size(); polygonIdx++ )
1684  filleted.m_polys.push_back( FilletPolygon( aRadius, aErrorMax, polygonIdx ) );
1685 
1686  return filleted;
1687 }
POLYGON FilletPolygon(unsigned int aRadius, int aErrorMax, int aIndex=0)
Function Fillet returns a filleted version of the aIndex-th polygon.
Class SHAPE_POLY_SET.
SHAPE_POLY_SET::POLYGON SHAPE_POLY_SET::FilletPolygon ( unsigned int  aRadius,
int  aErrorMax,
int  aIndex = 0 
)

Function Fillet returns a filleted version of the aIndex-th polygon.

Parameters
aRadiusis the fillet radius.
aErrorMaxis the maximum allowable deviation of the polygon from the circle
aIndexis the index of the polygon to be filleted
Returns
POLYGON - A polygon containing the filleted version of the aIndex-th polygon.

Definition at line 1550 of file shape_poly_set.cpp.

References chamferFilletPolygon().

Referenced by Fillet(), and IsEmpty().

1553 {
1554  return chamferFilletPolygon( CORNER_MODE::FILLETED, aRadius, aIndex, aErrorMax );
1555 }
POLYGON chamferFilletPolygon(CORNER_MODE aMode, unsigned int aDistance, int aIndex, int aErrorMax=-1)
Function chamferFilletPolygon Returns the camfered or filleted version of the aIndex-th polygon in th...
const std::string SHAPE_POLY_SET::Format ( ) const
overridevirtual

Reimplemented from SHAPE.

Definition at line 1114 of file shape_poly_set.cpp.

References i, and m_polys.

1115 {
1116  std::stringstream ss;
1117 
1118  ss << "polyset " << m_polys.size() << "\n";
1119 
1120  for( unsigned i = 0; i < m_polys.size(); i++ )
1121  {
1122  ss << "poly " << m_polys[i].size() << "\n";
1123 
1124  for( unsigned j = 0; j < m_polys[i].size(); j++ )
1125  {
1126  ss << m_polys[i][j].PointCount() << "\n";
1127 
1128  for( int v = 0; v < m_polys[i][j].PointCount(); v++ )
1129  ss << m_polys[i][j].CPoint( v ).x << " " << m_polys[i][j].CPoint( v ).y << "\n";
1130  }
1131 
1132  ss << "\n";
1133  }
1134 
1135  return ss.str();
1136 }
size_t i
Definition: json11.cpp:597
void SHAPE_POLY_SET::Fracture ( POLYGON_MODE  aFastMode)

Converts a set of polygons with holes to a singe outline with "slits"/"fractures" connecting the outer ring to the inner holes For aFastMode meaning, see function booleanOp

Definition at line 875 of file shape_poly_set.cpp.

References fractureSingle(), m_polys, and Simplify().

Referenced by addHoleToPolygon(), D_PAD::buildCustomPadPolygon(), ZONE_FILLER::computeRawFilledAreas(), MODULE::CoverageRatio(), export_vrml_polygon(), ZONE_FILLER::fillSingleZone(), DXF_PLOTTER::PlotPoly(), PlotSolderMaskLayer(), C3D_RENDER_RAYTRACING::reload(), and ZONE_CONTAINER::TransformOutlinesShapeWithClearanceToPolygon().

876 {
877  Simplify( aFastMode ); // remove overlapping holes/degeneracy
878 
879  for( POLYGON& paths : m_polys )
880  {
881  fractureSingle( paths );
882  }
883 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
void fractureSingle(POLYGON &paths)
void Simplify(POLYGON_MODE aFastMode)
Simplifies the polyset (merges overlapping polys, eliminates degeneracy/self-intersections) For aFast...
void SHAPE_POLY_SET::fractureSingle ( POLYGON paths)
private

Definition at line 773 of file shape_poly_set.cpp.

References SHAPE_LINE_CHAIN::Append(), i, FractureEdge::m_connected, FractureEdge::m_next, FractureEdge::m_p1, max, processEdge(), SHAPE_LINE_CHAIN::SetClosed(), and VECTOR2< T >::x.

Referenced by Fracture(), and IsEmpty().

774 {
775  FractureEdgeSet edges;
776  FractureEdgeSet border_edges;
777  FractureEdge* root = NULL;
778 
779  bool first = true;
780 
781  if( paths.size() == 1 )
782  return;
783 
784  int num_unconnected = 0;
785 
786  for( SHAPE_LINE_CHAIN& path : paths )
787  {
788  int index = 0;
789 
790  FractureEdge* prev = NULL, * first_edge = NULL;
791 
792  int x_min = std::numeric_limits<int>::max();
793 
794  for( int i = 0; i < path.PointCount(); i++ )
795  {
796  const VECTOR2I& p = path.CPoint( i );
797 
798  if( p.x < x_min )
799  x_min = p.x;
800  }
801 
802  for( int i = 0; i < path.PointCount(); i++ )
803  {
804  FractureEdge* fe = new FractureEdge( first, &path, index++ );
805 
806  if( !root )
807  root = fe;
808 
809  if( !first_edge )
810  first_edge = fe;
811 
812  if( prev )
813  prev->m_next = fe;
814 
815  if( i == path.PointCount() - 1 )
816  fe->m_next = first_edge;
817 
818  prev = fe;
819  edges.push_back( fe );
820 
821  if( !first )
822  {
823  if( fe->m_p1.x == x_min )
824  border_edges.push_back( fe );
825  }
826 
827  if( !fe->m_connected )
828  num_unconnected++;
829  }
830 
831  first = false; // first path is always the outline
832  }
833 
834  // keep connecting holes to the main outline, until there's no holes left...
835  while( num_unconnected > 0 )
836  {
837  int x_min = std::numeric_limits<int>::max();
838 
839  FractureEdge* smallestX = NULL;
840 
841  // find the left-most hole edge and merge with the outline
842  for( FractureEdgeSet::iterator i = border_edges.begin(); i != border_edges.end(); ++i )
843  {
844  int xt = (*i)->m_p1.x;
845 
846  if( ( xt < x_min ) && !(*i)->m_connected )
847  {
848  x_min = xt;
849  smallestX = *i;
850  }
851  }
852 
853  num_unconnected -= processEdge( edges, smallestX );
854  }
855 
856  paths.clear();
857  SHAPE_LINE_CHAIN newPath;
858 
859  newPath.SetClosed( true );
860 
861  FractureEdge* e;
862 
863  for( e = root; e->m_next != root; e = e->m_next )
864  newPath.Append( e->m_p1 );
865 
866  newPath.Append( e->m_p1 );
867 
868  for( FractureEdgeSet::iterator i = edges.begin(); i != edges.end(); ++i )
869  delete *i;
870 
871  paths.push_back( newPath );
872 }
static int processEdge(FractureEdgeSet &edges, FractureEdge *edge)
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
void SetClosed(bool aClosed)
Function SetClosed()
#define max(a, b)
Definition: auxiliary.h:86
Class SHAPE_LINE_CHAIN.
FractureEdge * m_next
size_t i
Definition: json11.cpp:597
std::vector< FractureEdge * > FractureEdgeSet
SHAPE_LINE_CHAIN& SHAPE_POLY_SET::getContourForCorner ( int  aCornerId,
int &  aIndexWithinContour 
)
private

Referenced by IsEmpty().

bool SHAPE_POLY_SET::GetGlobalIndex ( SHAPE_POLY_SET::VERTEX_INDEX  aRelativeIndices,
int &  aGlobalIdx 
)

Function GetGlobalIndex computes the global index of a vertex from the relative indices of polygon, contour and vertex.

Parameters
aRelativeIndicesis the set of relative indices.
aGlobalIdx[out] is the computed global index.
Returns
bool - true if the relative indices are correct; false otherwise. The computed global index is returned in the aGlobalIdx reference.

Definition at line 113 of file shape_poly_set.cpp.

References SHAPE_POLY_SET::VERTEX_INDEX::m_contour, SHAPE_POLY_SET::VERTEX_INDEX::m_polygon, m_polys, SHAPE_POLY_SET::VERTEX_INDEX::m_vertex, and Polygon().

Referenced by GetNeighbourIndexes(), and ZONE_CONTAINER::GetSelectedCorner().

115 {
116  int selectedVertex = aRelativeIndices.m_vertex;
117  unsigned int selectedContour = aRelativeIndices.m_contour;
118  unsigned int selectedPolygon = aRelativeIndices.m_polygon;
119 
120  // Check whether the vertex indices make sense in this poly set
121  if( selectedPolygon < m_polys.size() && selectedContour < m_polys[selectedPolygon].size()
122  && selectedVertex < m_polys[selectedPolygon][selectedContour].PointCount() )
123  {
124  POLYGON currentPolygon;
125 
126  aGlobalIdx = 0;
127 
128  for( unsigned int polygonIdx = 0; polygonIdx < selectedPolygon; polygonIdx++ )
129  {
130  currentPolygon = Polygon( polygonIdx );
131 
132  for( unsigned int contourIdx = 0; contourIdx < currentPolygon.size(); contourIdx++ )
133  {
134  aGlobalIdx += currentPolygon[contourIdx].PointCount();
135  }
136  }
137 
138  currentPolygon = Polygon( selectedPolygon );
139 
140  for( unsigned int contourIdx = 0; contourIdx < selectedContour; contourIdx++ )
141  {
142  aGlobalIdx += currentPolygon[contourIdx].PointCount();
143  }
144 
145  aGlobalIdx += selectedVertex;
146 
147  return true;
148  }
149  else
150  {
151  return false;
152  }
153 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
POLYGON & Polygon(int aIndex)
Returns the aIndex-th subpolygon in the set
MD5_HASH SHAPE_POLY_SET::GetHash ( ) const

Definition at line 2023 of file shape_poly_set.cpp.

References checksum(), MD5_HASH::IsValid(), and m_hash.

Referenced by ZONE_FILLER::Fill().

2024 {
2025  if( !m_hash.IsValid() )
2026  return checksum();
2027 
2028  return m_hash;
2029 }
MD5_HASH checksum() const
bool IsValid() const
Definition: md5_hash.h:23
bool SHAPE_POLY_SET::GetNeighbourIndexes ( int  aGlobalIndex,
int *  aPrevious,
int *  aNext 
)

Returns the global indexes of the previous and the next corner of the aGlobalIndex-th corner of a contour in the polygon set.

they are often aGlobalIndex-1 and aGlobalIndex+1, but not for the first and last corner of the contour.

Parameters
aGlobalIndexis index of the corner, globally indexed between all edges in all contours
aPrevious- the globalIndex of the previous corner of the same contour.
aNext- the globalIndex of the next corner of the same contour.
Returns
true if OK, false if aGlobalIndex is out of range

Definition at line 342 of file shape_poly_set.cpp.

References GetGlobalIndex(), GetRelativeIndices(), SHAPE_POLY_SET::VERTEX_INDEX::m_contour, SHAPE_POLY_SET::VERTEX_INDEX::m_polygon, m_polys, SHAPE_POLY_SET::VERTEX_INDEX::m_vertex, and next().

Referenced by ZONE_CONTAINER::MoveEdge().

343 {
345 
346  // If the edge does not exist, throw an exception, it is an illegal access memory error
347  if( !GetRelativeIndices( aGlobalIndex, &index ) )
348  return false;
349 
350  // Calculate the previous and next index of aGlobalIndex, corresponding to
351  // the same contour;
352  VERTEX_INDEX inext = index;
353  int lastpoint = m_polys[index.m_polygon][index.m_contour].SegmentCount();
354 
355  if( index.m_vertex == 0 )
356  {
357  index.m_vertex = lastpoint;
358  inext.m_vertex = 1;
359  }
360  else if( index.m_vertex == lastpoint )
361  {
362  index.m_vertex--;
363  inext.m_vertex = 0;
364  }
365  else
366  {
367  inext.m_vertex++;
368  index.m_vertex--;
369  }
370 
371  if( aPrevious )
372  {
373  int previous;
374  GetGlobalIndex( index, previous );
375  *aPrevious = previous;
376  }
377 
378  if( aNext )
379  {
380  int next;
381  GetGlobalIndex( inext, next );
382  *aNext = next;
383  }
384 
385  return true;
386 }
CITER next(CITER it)
Definition: ptree.cpp:130
Struct VERTEX_INDEX.
struct SHAPE_POLY_SET::VERTEX_INDEX VERTEX_INDEX
Struct VERTEX_INDEX.
bool GetRelativeIndices(int aGlobalIdx, VERTEX_INDEX *aRelativeIndices) const
Function GetRelativeIndices.
bool GetGlobalIndex(VERTEX_INDEX aRelativeIndices, int &aGlobalIdx)
Function GetGlobalIndex computes the global index of a vertex from the relative indices of polygon...
bool SHAPE_POLY_SET::GetRelativeIndices ( int  aGlobalIdx,
SHAPE_POLY_SET::VERTEX_INDEX aRelativeIndices 
) const

Function GetRelativeIndices.

Converts a global vertex index —i.e., a number that globally identifies a vertex in a concatenated list of all vertices in all contours— and get the index of the vertex relative to the contour relative to the polygon in which it is.

Parameters
aGlobalIdxis the global index of the corner whose structured index wants to be found
aRelativeIndicesis a pointer to the set of relative indices to store.
Returns
bool - true if the global index is correct and the information in aRelativeIndices is valid; false otherwise.

Definition at line 73 of file shape_poly_set.cpp.

References CPolygon(), SHAPE_POLY_SET::VERTEX_INDEX::m_contour, SHAPE_POLY_SET::VERTEX_INDEX::m_polygon, SHAPE_POLY_SET::VERTEX_INDEX::m_vertex, OutlineCount(), and SHAPE_LINE_CHAIN::PointCount().

Referenced by CVertex(), PCB_EDIT_FRAME::Delete_Zone_Contour(), DRC::doEdgeZoneDrc(), ZONE_CONTAINER::GetCornerPosition(), GetNeighbourIndexes(), InsertVertex(), IsVertexInHole(), IterateFromVertexWithHoles(), RemoveVertex(), ZONE_CONTAINER::SetCornerPosition(), ZONE_CONTAINER::SetSelectedCorner(), and Vertex().

75 {
76  int polygonIdx = 0;
77  unsigned int contourIdx = 0;
78  int vertexIdx = 0;
79 
80  int currentGlobalIdx = 0;
81 
82  for( polygonIdx = 0; polygonIdx < OutlineCount(); polygonIdx++ )
83  {
84  const POLYGON currentPolygon = CPolygon( polygonIdx );
85 
86  for( contourIdx = 0; contourIdx < currentPolygon.size(); contourIdx++ )
87  {
88  SHAPE_LINE_CHAIN currentContour = currentPolygon[contourIdx];
89  int totalPoints = currentContour.PointCount();
90 
91  for( vertexIdx = 0; vertexIdx < totalPoints; vertexIdx++ )
92  {
93  // Check if the current vertex is the globally indexed as aGlobalIdx
94  if( currentGlobalIdx == aGlobalIdx )
95  {
96  aRelativeIndices->m_polygon = polygonIdx;
97  aRelativeIndices->m_contour = contourIdx;
98  aRelativeIndices->m_vertex = vertexIdx;
99 
100  return true;
101  }
102 
103  // Advance
104  currentGlobalIdx++;
105  }
106  }
107  }
108 
109  return false;
110 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
int PointCount() const
Function PointCount()
int OutlineCount() const
Returns the number of outlines in the set
Class SHAPE_LINE_CHAIN.
const POLYGON & CPolygon(int aIndex) const
bool SHAPE_POLY_SET::HasHoles ( ) const

Returns true if the polygon set has any holes.

Definition at line 1047 of file shape_poly_set.cpp.

References m_polys.

Referenced by CacheTriangulation().

1048 {
1049  // Iterate through all the polygons on the set
1050  for( const POLYGON& paths : m_polys )
1051  {
1052  // If any of them has more than one contour, it is a hole.
1053  if( paths.size() > 1 )
1054  return true;
1055  }
1056 
1057  // Return false if and only if every polygon has just one outline, without holes.
1058  return false;
1059 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
bool SHAPE_POLY_SET::HasTouchingHoles ( ) const

Returns true if the polygon set has any holes tha share a vertex.

Definition at line 2121 of file shape_poly_set.cpp.

References CPolygon(), hasTouchingHoles(), i, and OutlineCount().

Referenced by CacheTriangulation().

2122 {
2123  for( int i = 0; i < OutlineCount(); i++ )
2124  {
2125  if( hasTouchingHoles( CPolygon( i ) ) )
2126  {
2127  return true;
2128  }
2129  }
2130 
2131  return false;
2132 }
int OutlineCount() const
Returns the number of outlines in the set
bool hasTouchingHoles(const POLYGON &aPoly) const
Returns true if the polygon set has any holes that touch share a vertex.
size_t i
Definition: json11.cpp:597
const POLYGON & CPolygon(int aIndex) const
bool SHAPE_POLY_SET::hasTouchingHoles ( const POLYGON aPoly) const
private

Returns true if the polygon set has any holes that touch share a vertex.

Definition at line 2135 of file shape_poly_set.cpp.

References i.

Referenced by HasTouchingHoles().

2136 {
2137  std::vector< VECTOR2I > pts;
2138 
2139  for( const auto& lc : aPoly )
2140  {
2141  for( int i = 0; i < lc.PointCount(); i++ )
2142  {
2143  const auto p = lc.CPoint( i );
2144 
2145  if( std::find( pts.begin(), pts.end(), p ) != pts.end() )
2146  {
2147  return true;
2148  }
2149 
2150  pts.push_back( p );
2151  }
2152  }
2153 
2154  return false;
2155 }
size_t i
Definition: json11.cpp:597
SHAPE_LINE_CHAIN& SHAPE_POLY_SET::Hole ( int  aOutline,
int  aHole 
)
inline

Returns the reference to aHole-th hole in the aIndex-th outline

Definition at line 594 of file shape_poly_set.h.

References m_polys.

Referenced by Convert_path_polygon_to_polygon_blocks_and_dummy_blocks(), export_vrml_board(), DSN::SPECCTRA_DB::fillBOUNDARY(), and ZONE_CREATE_HELPER::performZoneCutout().

595  {
596  return m_polys[aOutline][aHole + 1];
597  }
int SHAPE_POLY_SET::HoleCount ( int  aOutline) const
inline

Returns the number of holes in a given outline

Definition at line 561 of file shape_poly_set.h.

References m_polys.

Referenced by CINFO3D_VISU::AddSolidAreasShapesToContainer(), CLAYER_TRIANGLES::AddToMiddleContourns(), ZONE_CONTAINER::AppendCorner(), containsSingle(), Convert_path_polygon_to_polygon_blocks_and_dummy_blocks(), Convert_shape_line_polygon_to_triangles(), KIGFX::PCB_PAINTER::draw(), export_vrml_board(), DSN::SPECCTRA_DB::fillBOUNDARY(), and PlotLayerOutlines().

562  {
563  if( ( aOutline < 0 ) || (aOutline >= (int)m_polys.size()) || (m_polys[aOutline].size() < 2) )
564  return 0;
565 
566  // the first polygon in m_polys[aOutline] is the main contour,
567  // only others are holes:
568  return m_polys[aOutline].size() - 1;
569  }
void SHAPE_POLY_SET::importTree ( ClipperLib::PolyTree *  tree)
private

Definition at line 637 of file shape_poly_set.cpp.

References convertFromClipper(), i, and m_polys.

Referenced by booleanOp(), Inflate(), and IsEmpty().

638 {
639  m_polys.clear();
640 
641  for( PolyNode* n = tree->GetFirst(); n; n = n->GetNext() )
642  {
643  if( !n->IsHole() )
644  {
645  POLYGON paths;
646  paths.reserve( n->Childs.size() + 1 );
647  paths.push_back( convertFromClipper( n->Contour ) );
648 
649  for( unsigned int i = 0; i < n->Childs.size(); i++ )
650  paths.push_back( convertFromClipper( n->Childs[i]->Contour ) );
651 
652  m_polys.push_back( paths );
653  }
654  }
655 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
const SHAPE_LINE_CHAIN convertFromClipper(const ClipperLib::Path &aPath)
size_t i
Definition: json11.cpp:597
void SHAPE_POLY_SET::Inflate ( int  aFactor,
int  aCircleSegmentsCount 
)

Performs outline inflation/deflation, using round corners.

Definition at line 590 of file shape_poly_set.cpp.

References abs, convertToClipper(), i, importTree(), m_polys, and SEG_CNT_MAX.

Referenced by D_PAD::buildCustomPadPolygon(), ZONE_FILLER::buildZoneFeatureHoleList(), Collide(), ZONE_FILLER::computeRawFilledAreas(), CINFO3D_VISU::createNewPadWithClearance(), KIGFX::PCB_PAINTER::draw(), D_PAD::DrawShape(), export_vrml_polygon(), ZONE_FILLER::fillSingleZone(), GERBER_PLOTTER::FlashPadCustom(), GERBER_PLOTTER::FlashPadRoundRect(), MODULE::GetBoundingPoly(), PlotSolderMaskLayer(), PlotStandardLayer(), ZONE_CONTAINER::TransformOutlinesShapeWithClearanceToPolygon(), TransformRoundRectToPolygon(), and D_PAD::TransformShapeWithClearanceToPolygon().

591 {
592  // A static table to avoid repetitive calculations of the coefficient
593  // 1.0 - cos( M_PI/aCircleSegmentsCount)
594  // aCircleSegmentsCount is most of time <= 64 and usually 8, 12, 16, 32
595  #define SEG_CNT_MAX 64
596  static double arc_tolerance_factor[SEG_CNT_MAX + 1];
597 
598  ClipperOffset c;
599 
600  for( const POLYGON& poly : m_polys )
601  {
602  for( unsigned int i = 0; i < poly.size(); i++ )
603  c.AddPath( convertToClipper( poly[i], i > 0 ? false : true ), jtRound,
604  etClosedPolygon );
605  }
606 
607  PolyTree solution;
608 
609  // Calculate the arc tolerance (arc error) from the seg count by circle.
610  // the seg count is nn = M_PI / acos(1.0 - c.ArcTolerance / abs(aFactor))
611  // see:
612  // www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/ArcTolerance.htm
613 
614  if( aCircleSegmentsCount < 6 ) // avoid incorrect aCircleSegmentsCount values
615  aCircleSegmentsCount = 6;
616 
617  double coeff;
618 
619  if( aCircleSegmentsCount > SEG_CNT_MAX || arc_tolerance_factor[aCircleSegmentsCount] == 0 )
620  {
621  coeff = 1.0 - cos( M_PI / aCircleSegmentsCount );
622 
623  if( aCircleSegmentsCount <= SEG_CNT_MAX )
624  arc_tolerance_factor[aCircleSegmentsCount] = coeff;
625  }
626  else
627  coeff = arc_tolerance_factor[aCircleSegmentsCount];
628 
629  c.ArcTolerance = std::abs( aFactor ) * coeff;
630 
631  c.Execute( solution, aFactor );
632 
633  importTree( &solution );
634 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
const ClipperLib::Path convertToClipper(const SHAPE_LINE_CHAIN &aPath, bool aRequiredOrientation)
#define abs(a)
Definition: auxiliary.h:84
#define SEG_CNT_MAX
size_t i
Definition: json11.cpp:597
void importTree(ClipperLib::PolyTree *tree)
void SHAPE_POLY_SET::InsertVertex ( int  aGlobalIndex,
VECTOR2I  aNewVertex 
)

Function InsertVertex Adds a vertex in the globally indexed position aGlobalIndex.

Parameters
aGlobalIndexis the global index of the position in which teh new vertex will be inserted.
aNewVertexis the new inserted vertex.

Definition at line 206 of file shape_poly_set.cpp.

References Append(), GetRelativeIndices(), SHAPE_POLY_SET::VERTEX_INDEX::m_contour, SHAPE_POLY_SET::VERTEX_INDEX::m_polygon, m_polys, SHAPE_POLY_SET::VERTEX_INDEX::m_vertex, and TotalVertices().

Referenced by POINT_EDITOR::addCorner(), PCB_EDIT_FRAME::Process_Special_Functions(), and PCB_EDIT_FRAME::Start_Move_Zone_Corner().

207 {
208  VERTEX_INDEX index;
209 
210  if( aGlobalIndex < 0 )
211  aGlobalIndex = 0;
212 
213  if( aGlobalIndex >= TotalVertices() )
214  {
215  Append( aNewVertex );
216  }
217  else
218  {
219  // Assure the position to be inserted exists; throw an exception otherwise
220  if( GetRelativeIndices( aGlobalIndex, &index ) )
221  m_polys[index.m_polygon][index.m_contour].Insert( index.m_vertex, aNewVertex );
222  else
223  throw( std::out_of_range( "aGlobalIndex-th vertex does not exist" ) );
224  }
225 }
int TotalVertices() const
Returns total number of vertices stored in the set.
struct SHAPE_POLY_SET::VERTEX_INDEX VERTEX_INDEX
Struct VERTEX_INDEX.
bool GetRelativeIndices(int aGlobalIdx, VERTEX_INDEX *aRelativeIndices) const
Function GetRelativeIndices.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline) ...
bool SHAPE_POLY_SET::IsPolygonSelfIntersecting ( int  aPolygonIndex)

Function IsPolygonSelfIntersecting.

Checks whether the aPolygonIndex-th polygon in the set is self intersecting.

Parameters
aPolygonIndexindex of the polygon that wants to be checked.
Returns
bool - true if the aPolygonIndex-th polygon is self intersecting, false otherwise.

Definition at line 389 of file shape_poly_set.cpp.

References SEG::Collide(), SHAPE_POLY_SET::SEGMENT_ITERATOR_TEMPLATE< T >::IsAdjacent(), and IterateSegmentsWithHoles().

Referenced by IsSelfIntersecting().

390 {
391  SEGMENT_ITERATOR iterator = IterateSegmentsWithHoles( aPolygonIndex );
392  SEGMENT_ITERATOR innerIterator;
393 
394  for( iterator = IterateSegmentsWithHoles( aPolygonIndex ); iterator; iterator++ )
395  {
396  SEG firstSegment = *iterator;
397 
398  // Iterate through all remaining segments.
399  innerIterator = iterator;
400 
401  // Start in the next segment, we don't want to check collision between a segment and itself
402  for( innerIterator++; innerIterator; innerIterator++ )
403  {
404  SEG secondSegment = *innerIterator;
405 
406  // Check whether the two segments built collide, only when they are not adjacent.
407  if( !iterator.IsAdjacent( innerIterator ) && firstSegment.Collide( secondSegment, 0 ) )
408  return true;
409  }
410  }
411 
412  return false;
413 }
SEGMENT_ITERATOR IterateSegmentsWithHoles()
Returns an iterator object, for all outlines in the set (with holes)
SEGMENT_ITERATOR_TEMPLATE< SEG > SEGMENT_ITERATOR
Definition: seg.h:36
bool Collide(const SEG &aSeg, int aClearance) const
Definition: seg.cpp:134
bool SHAPE_POLY_SET::IsSelfIntersecting ( )

Function IsSelfIntersecting Checks whether any of the polygons in the set is self intersecting.

Returns
bool - true if any of the polygons is self intersecting, false otherwise.

Definition at line 416 of file shape_poly_set.cpp.

References IsPolygonSelfIntersecting(), and m_polys.

Referenced by BOARD::NormalizeAreaPolygon(), and POINT_EDITOR::validatePolygon().

417 {
418  for( unsigned int polygon = 0; polygon < m_polys.size(); polygon++ )
419  {
420  if( IsPolygonSelfIntersecting( polygon ) )
421  return true;
422  }
423 
424  return false;
425 }
bool IsPolygonSelfIntersecting(int aPolygonIndex)
Function IsPolygonSelfIntersecting.
bool SHAPE_POLY_SET::IsSolid ( ) const
inlineoverridevirtual

Implements SHAPE.

Definition at line 880 of file shape_poly_set.h.

References BBox(), Collide(), CollideEdge(), CollideVertex(), Contains(), and PointOnEdge().

881  {
882  return true;
883  }
bool SHAPE_POLY_SET::IsTriangulationUpToDate ( ) const

Definition at line 2032 of file shape_poly_set.cpp.

References checksum(), MD5_HASH::IsValid(), m_hash, and m_triangulationValid.

Referenced by KIGFX::OPENGL_GAL::DrawPolygon(), and PNS_KICAD_IFACE::syncZone().

2033 {
2034  if( !m_triangulationValid )
2035  return false;
2036 
2037  if( !m_hash.IsValid() )
2038  return false;
2039 
2040  auto hash = checksum();
2041 
2042  return hash == m_hash;
2043 }
MD5_HASH checksum() const
bool IsValid() const
Definition: md5_hash.h:23
bool SHAPE_POLY_SET::IsVertexInHole ( int  aGlobalIdx)

Function IsVertexInHole.

checks whether the aGlobalIndex-th vertex belongs to a hole.

Parameters
aGlobalIdxis the index of the vertex.
Returns
bool - true if the globally indexed aGlobalIdx-th vertex belongs to a hole.

Definition at line 1655 of file shape_poly_set.cpp.

References GetRelativeIndices(), and SHAPE_POLY_SET::VERTEX_INDEX::m_contour.

Referenced by PCB_EDIT_FRAME::createPopUpMenuForZones(), and IsEmpty().

1656 {
1657  VERTEX_INDEX index;
1658 
1659  // Get the polygon and contour where the vertex is. If the vertex does not exist, return false
1660  if( !GetRelativeIndices( aGlobalIdx, &index ) )
1661  return false;
1662 
1663  // The contour is a hole if its index is greater than zero
1664  return index.m_contour > 0;
1665 }
struct SHAPE_POLY_SET::VERTEX_INDEX VERTEX_INDEX
Struct VERTEX_INDEX.
bool GetRelativeIndices(int aGlobalIdx, VERTEX_INDEX *aRelativeIndices) const
Function GetRelativeIndices.
ITERATOR SHAPE_POLY_SET::Iterate ( int  aFirst,
int  aLast,
bool  aIterateHoles = false 
)
inline

Function Iterate returns an object to iterate through the points of the polygons between aFirst and aLast.

Parameters
aFirstis the first polygon whose points will be iterated.
aLastis the last polygon whose points will be iterated.
aIterateHolesis a flag to indicate whether the points of the holes should be iterated.
Returns
ITERATOR - the iterator object.

Definition at line 640 of file shape_poly_set.h.

References SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_currentContour, SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_currentPolygon, SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_currentVertex, SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_iterateHoles, SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_lastPolygon, SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_poly, and OutlineCount().

Referenced by POINT_EDITOR::addCorner(), GERBER_DRAW_ITEM::ConvertSegmentToPolygon(), D_CODE::ConvertShapeToPolygon(), KIGFX::GERBVIEW_PAINTER::draw(), KIGFX::GERBVIEW_PAINTER::drawPolygon(), ZONE_CONTAINER::DrawWhileCreateOutline(), EDGE_MODULE::Flip(), DRAWSEGMENT::Flip(), ZONE_CONTAINER::Iterate(), EDGE_MODULE::Mirror(), ZONE_CONTAINER::Mirror(), EDGE_MODULE::Move(), DRAWSEGMENT::Move(), GERBER_DRAW_ITEM::MoveAB(), MODULE::MoveAnchorPosition(), GERBER_DRAW_ITEM::MoveXY(), DRAWSEGMENT::Rotate(), and ZONE_CONTAINER::Rotate().

641  {
642  ITERATOR iter;
643 
644  iter.m_poly = this;
645  iter.m_currentPolygon = aFirst;
646  iter.m_lastPolygon = aLast < 0 ? OutlineCount() - 1 : aLast;
647  iter.m_currentContour = 0;
648  iter.m_currentVertex = 0;
649  iter.m_iterateHoles = aIterateHoles;
650 
651  return iter;
652  }
int OutlineCount() const
Returns the number of outlines in the set
ITERATOR_TEMPLATE< VECTOR2I > ITERATOR
ITERATOR SHAPE_POLY_SET::Iterate ( int  aOutline)
inline

Function Iterate.

Parameters
aOutlinethe index of the polygon to be iterated.
Returns
ITERATOR - an iterator object to visit all points in the main outline of the aOutline-th polygon, without visiting the points in the holes.

Definition at line 660 of file shape_poly_set.h.

References Iterate().

661  {
662  return Iterate( aOutline, aOutline );
663  }
ITERATOR Iterate()
Function Iterate.
ITERATOR SHAPE_POLY_SET::Iterate ( )
inline

Function Iterate.

Returns
ITERATOR - an iterator object to visit all points in all outlines of the set, without visiting the points in the holes.

Definition at line 681 of file shape_poly_set.h.

References OutlineCount().

Referenced by Iterate(), and IterateWithHoles().

682  {
683  return Iterate( 0, OutlineCount() - 1 );
684  }
ITERATOR Iterate()
Function Iterate.
int OutlineCount() const
Returns the number of outlines in the set
ITERATOR SHAPE_POLY_SET::IterateFromVertexWithHoles ( int  aGlobalIdx)
inline

Definition at line 731 of file shape_poly_set.h.

References GetRelativeIndices(), IterateWithHoles(), SHAPE_POLY_SET::VERTEX_INDEX::m_contour, SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_currentContour, SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_currentPolygon, SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::m_currentVertex, SHAPE_POLY_SET::VERTEX_INDEX::m_polygon, and SHAPE_POLY_SET::VERTEX_INDEX::m_vertex.

732  {
733  // Build iterator
734  ITERATOR iter = IterateWithHoles();
735 
736  // Get the relative indices of the globally indexed vertex
737  VERTEX_INDEX indices;
738 
739  if( !GetRelativeIndices( aGlobalIdx, &indices ) )
740  throw( std::out_of_range( "aGlobalIndex-th vertex does not exist" ) );
741 
742  // Adjust where the iterator is pointing
743  iter.m_currentPolygon = indices.m_polygon;
744  iter.m_currentContour = indices.m_contour;
745  iter.m_currentVertex = indices.m_vertex;
746 
747  return iter;
748  }
struct SHAPE_POLY_SET::VERTEX_INDEX VERTEX_INDEX
Struct VERTEX_INDEX.
bool GetRelativeIndices(int aGlobalIdx, VERTEX_INDEX *aRelativeIndices) const
Function GetRelativeIndices.
ITERATOR_TEMPLATE< VECTOR2I > ITERATOR
ITERATOR IterateWithHoles()
Function IterateWithHoles.
SEGMENT_ITERATOR SHAPE_POLY_SET::IterateSegments ( int  aFirst,
int  aLast,
bool  aIterateHoles = false 
)
inline

Returns an iterator object, for iterating between aFirst and aLast outline, with or

without holes (default: without)

Definition at line 752 of file shape_poly_set.h.

References SHAPE_POLY_SET::SEGMENT_ITERATOR_TEMPLATE< T >::m_currentContour, SHAPE_POLY_SET::SEGMENT_ITERATOR_TEMPLATE< T >::m_currentPolygon, SHAPE_POLY_SET::SEGMENT_ITERATOR_TEMPLATE< T >::m_currentSegment, SHAPE_POLY_SET::SEGMENT_ITERATOR_TEMPLATE< T >::m_iterateHoles, SHAPE_POLY_SET::SEGMENT_ITERATOR_TEMPLATE< T >::m_lastPolygon, SHAPE_POLY_SET::SEGMENT_ITERATOR_TEMPLATE< T >::m_poly, and OutlineCount().

753  {
754  SEGMENT_ITERATOR iter;
755 
756  iter.m_poly = this;
757  iter.m_currentPolygon = aFirst;
758  iter.m_lastPolygon = aLast < 0 ? OutlineCount() - 1 : aLast;
759  iter.m_currentContour = 0;
760  iter.m_currentSegment = 0;
761  iter.m_iterateHoles = aIterateHoles;
762 
763  return iter;
764  }
SEGMENT_ITERATOR_TEMPLATE< SEG > SEGMENT_ITERATOR
int OutlineCount() const
Returns the number of outlines in the set
SEGMENT_ITERATOR SHAPE_POLY_SET::IterateSegments ( int  aPolygonIdx)
inline

Returns an iterator object, for iterating aPolygonIdx-th polygon edges

Definition at line 767 of file shape_poly_set.h.

References IterateSegments().

768  {
769  return IterateSegments( aPolygonIdx, aPolygonIdx );
770  }
SEGMENT_ITERATOR IterateSegments()
Returns an iterator object, for all outlines in the set (no holes)
SEGMENT_ITERATOR SHAPE_POLY_SET::IterateSegments ( )
inline

Returns an iterator object, for all outlines in the set (no holes)

Definition at line 773 of file shape_poly_set.h.

References OutlineCount().

Referenced by IterateSegments(), and IterateSegmentsWithHoles().

774  {
775  return IterateSegments( 0, OutlineCount() - 1 );
776  }
int OutlineCount() const
Returns the number of outlines in the set
SEGMENT_ITERATOR IterateSegments()
Returns an iterator object, for all outlines in the set (no holes)
SEGMENT_ITERATOR SHAPE_POLY_SET::IterateSegmentsWithHoles ( )
inline

Returns an iterator object, for all outlines in the set (with holes)

Definition at line 779 of file shape_poly_set.h.

References IterateSegments(), and OutlineCount().

Referenced by Collide(), CollideEdge(), DistanceToPolygon(), DRC::doEdgeZoneDrc(), ZONE_CONTAINER::Draw(), ZONE_CONTAINER::Hatch(), IsPolygonSelfIntersecting(), BOARD::TestAreaIntersection(), and DRC::TestZoneToZoneOutline().

780  {
781  return IterateSegments( 0, OutlineCount() - 1, true );
782  }
int OutlineCount() const
Returns the number of outlines in the set
SEGMENT_ITERATOR IterateSegments()
Returns an iterator object, for all outlines in the set (no holes)
SEGMENT_ITERATOR SHAPE_POLY_SET::IterateSegmentsWithHoles ( int  aOutline)
inline

Returns an iterator object, for the aOutline-th outline in the set (with holes)

Definition at line 785 of file shape_poly_set.h.

References IterateSegments().

786  {
787  return IterateSegments( aOutline, aOutline, true );
788  }
SEGMENT_ITERATOR IterateSegments()
Returns an iterator object, for all outlines in the set (no holes)
ITERATOR SHAPE_POLY_SET::IterateWithHoles ( int  aOutline)
inline

Function IterateWithHoles.

Parameters
aOutlinethe index of the polygon to be iterated.
Returns
ITERATOR - an iterator object to visit all points in the main outline of the aOutline-th polygon, visiting also the points in the holes.

Definition at line 671 of file shape_poly_set.h.

References Iterate().

Referenced by findVertex(), ZONE_CONTAINER::Hatch(), ZONE_CONTAINER::IterateWithHoles(), ZONE_CONTAINER::Mirror(), ZONE_CONTAINER::Rotate(), BOARD::TestAreaIntersection(), and DRC::TestZoneToZoneOutline().

672  {
673  return Iterate( aOutline, aOutline, true );
674  }
ITERATOR Iterate()
Function Iterate.
ITERATOR SHAPE_POLY_SET::IterateWithHoles ( )
inline

Function IterateWithHoles.

Returns
ITERATOR - an iterator object to visit all points in all outlines of the set, visiting also the points in the holes.

Definition at line 691 of file shape_poly_set.h.

References Iterate(), and OutlineCount().

Referenced by CollideVertex(), IterateFromVertexWithHoles(), and RemoveNullSegments().

692  {
693  return Iterate( 0, OutlineCount() - 1, true );
694  }
ITERATOR Iterate()
Function Iterate.
int OutlineCount() const
Returns the number of outlines in the set
void SHAPE_POLY_SET::Move ( const VECTOR2I aVector)
overridevirtual

Implements SHAPE.

Definition at line 1504 of file shape_poly_set.cpp.

References m_polys.

Referenced by KIGFX::GERBVIEW_PAINTER::drawFlashedShape(), export_vrml_polygon(), GERBER_DRAW_ITEM::HitTest(), ZONE_CONTAINER::Move(), and TransformOvalClearanceToPolygon().

1505 {
1506  for( POLYGON& poly : m_polys )
1507  {
1508  for( SHAPE_LINE_CHAIN& path : poly )
1509  {
1510  path.Move( aVector );
1511  }
1512  }
1513 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
Class SHAPE_LINE_CHAIN.
int SHAPE_POLY_SET::NewHole ( int  aOutline = -1)

Creates a new hole in a given outline

Definition at line 168 of file shape_poly_set.cpp.

References m_polys, and SHAPE_LINE_CHAIN::SetClosed().

Referenced by ConvertOutlineToPolygon(), ConvertPolyListToPolySet(), ZONE_CONTAINER::NewHole(), and ZONE_CREATE_HELPER::performZoneCutout().

169 {
170  SHAPE_LINE_CHAIN empty_path;
171 
172  empty_path.SetClosed( true );
173 
174  // Default outline is the last one
175  if( aOutline < 0 )
176  aOutline += m_polys.size();
177 
178  // Add hole to the selected outline
179  m_polys[aOutline].push_back( empty_path );
180 
181  return m_polys.back().size() - 2;
182 }
void SetClosed(bool aClosed)
Function SetClosed()
Class SHAPE_LINE_CHAIN.
int SHAPE_POLY_SET::NewOutline ( )

Creates a new empty polygon in the set and returns its index

Definition at line 156 of file shape_poly_set.cpp.

References m_polys, and SHAPE_LINE_CHAIN::SetClosed().

Referenced by addHoleToPolygon(), addRect(), ZONE_CONTAINER::AppendCorner(), BuildBoardPolygonOutlines(), D_PAD::buildCustomPadPolygon(), D_PAD::BuildPadShapePolygon(), ZONE_FILLER::buildUnconnectedThermalStubsPolygonList(), ZONE_FILLER::buildZoneFeatureHoleList(), ConvertOutlineToPolygon(), ConvertPolyListToPolySet(), GERBER_DRAW_ITEM::ConvertSegmentToPolygon(), D_CODE::ConvertShapeToPolygon(), CreateThermalReliefPadPolygon(), KIGFX::PCB_PAINTER::draw(), GERBER_FILE_IMAGE::Execute_DCODE_Command(), fillArcPOLY(), MODULE::GetBoundingPoly(), getRectangleAlongCentreLine(), LEGACY_PLUGIN::loadZONE_CONTAINER(), CPolyLine::NormalizeAreaOutlines(), PCB_PARSER::parseZONE_CONTAINER(), DXF_PLOTTER::PlotPoly(), KIGFX::PREVIEW::POLYGON_ITEM::SetPoints(), DRAWSEGMENT::SetPolyPoints(), TEXTE_PCB::TransformBoundingBoxWithClearanceToPolygon(), TransformCircleToPolygon(), TransformOvalClearanceToPolygon(), TransformRingToPolygon(), TransformRoundedEndsSegmentToPolygon(), TransformRoundRectToPolygon(), DRAWSEGMENT::TransformShapeWithClearanceToPolygon(), and D_PAD::TransformShapeWithClearanceToPolygon().

157 {
158  SHAPE_LINE_CHAIN empty_path;
159  POLYGON poly;
160 
161  empty_path.SetClosed( true );
162  poly.push_back( empty_path );
163  m_polys.push_back( poly );
164  return m_polys.size() - 1;
165 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
void SetClosed(bool aClosed)
Function SetClosed()
Class SHAPE_LINE_CHAIN.
int SHAPE_POLY_SET::NormalizeAreaOutlines ( )

Function NormalizeAreaOutlines Convert a self-intersecting polygon to one (or more) non self-intersecting polygon(s) Removes null segments.

Returns
int - the polygon count (always >= 1, because there is at least one polygon) There are new polygons only if the polygon count is > 1.

Definition at line 1081 of file shape_poly_set.cpp.

References AddOutline(), BooleanSubtract(), OutlineCount(), PM_FAST, PM_STRICTLY_SIMPLE, Polygon(), RemoveNullSegments(), and Simplify().

Referenced by BOARD::NormalizeAreaPolygon().

1082 {
1083  // We are expecting only one main outline, but this main outline can have holes
1084  // if holes: combine holes and remove them from the main outline.
1085  // Note also we are using SHAPE_POLY_SET::PM_STRICTLY_SIMPLE in polygon
1086  // calculations, but it is not mandatory. It is used mainly
1087  // because there is usually only very few vertices in area outlines
1088  SHAPE_POLY_SET::POLYGON& outline = Polygon( 0 );
1089  SHAPE_POLY_SET holesBuffer;
1090 
1091  // Move holes stored in outline to holesBuffer:
1092  // The first SHAPE_LINE_CHAIN is the main outline, others are holes
1093  while( outline.size() > 1 )
1094  {
1095  holesBuffer.AddOutline( outline.back() );
1096  outline.pop_back();
1097  }
1098 
1100 
1101  // If any hole, substract it to main outline
1102  if( holesBuffer.OutlineCount() )
1103  {
1104  holesBuffer.Simplify( SHAPE_POLY_SET::PM_FAST );
1106  }
1107 
1109 
1110  return OutlineCount();
1111 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
int OutlineCount() const
Returns the number of outlines in the set
Class SHAPE_POLY_SET.
void Simplify(POLYGON_MODE aFastMode)
Simplifies the polyset (merges overlapping polys, eliminates degeneracy/self-intersections) For aFast...
int RemoveNullSegments()
Function RemoveNullSegments looks for null segments; ie, segments whose ends are exactly the same and...
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index
void BooleanSubtract(const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
Performs boolean polyset difference For aFastMode meaning, see function booleanOp ...
POLYGON & Polygon(int aIndex)
Returns the aIndex-th subpolygon in the set
SHAPE_POLY_SET & SHAPE_POLY_SET::operator= ( const SHAPE_POLY_SET aOther)

Definition at line 1853 of file shape_poly_set.cpp.

References m_hash, m_polys, m_triangulatedPolys, and m_triangulationValid.

1854 {
1855  static_cast<SHAPE&>(*this) = aOther;
1856  m_polys = aOther.m_polys;
1857 
1858  // reset poly cache:
1859  m_hash = MD5_HASH{};
1860  m_triangulationValid = false;
1861  m_triangulatedPolys.clear();
1862  return *this;
1863 }
std::vector< std::unique_ptr< TRIANGULATED_POLYGON > > m_triangulatedPolys
Class SHAPE.
Definition: shape.h:58
int SHAPE_POLY_SET::OutlineCount ( ) const
inline

Returns the number of outlines in the set

Definition at line 555 of file shape_poly_set.h.

References m_polys, and VertexCount().

Referenced by POINT_EDITOR::addCorner(), ZONE_CONTAINER::AddPolygon(), CINFO3D_VISU::AddSolidAreasShapesToContainer(), CLAYER_TRIANGLES::AddToMiddleContourns(), ZONE_CONTAINER::AppendCorner(), D_PAD::boundingRadius(), BuildBoardPolygonOutlines(), BuildConvexHull(), D_PAD::buildCustomPadPolygon(), DRAWSEGMENT::BuildPolyPointsList(), CacheTriangulation(), DRC::checkClearancePadToPad(), CIterate(), CIterateWithHoles(), BOARD::CombineAreas(), Contains(), Convert_path_polygon_to_polygon_blocks_and_dummy_blocks(), Convert_shape_line_polygon_to_triangles(), D_PAD::CustomShapeAsPolygonToBoardPosition(), DRC::doFootprintOverlappingDrc(), KIGFX::GERBVIEW_PAINTER::draw(), DRAWSEGMENT::Draw(), KIGFX::PCB_PAINTER::draw(), GERBER_DRAW_ITEM::Draw(), KIGFX::GERBVIEW_PAINTER::drawApertureMacro(), APERTURE_MACRO::DrawApertureMacroShape(), ZONE_CONTAINER::DrawFilledArea(), D_CODE::DrawFlashedPolygon(), D_CODE::DrawFlashedShape(), KIGFX::GERBVIEW_PAINTER::drawFlashedShape(), KIGFX::CAIRO_GAL::DrawPolygon(), KIGFX::OPENGL_GAL::DrawPolygon(), KIGFX::GERBVIEW_PAINTER::drawPolygon(), D_PAD::DrawShape(), KIGFX::OPENGL_GAL::drawTriangulatedPolyset(), GERBER_FILE_IMAGE::Execute_DCODE_Command(), export_vrml_board(), export_vrml_padshape(), export_vrml_zones(), fillArcPOLY(), DSN::SPECCTRA_DB::fillBOUNDARY(), ZONE_FILLER::fillZoneWithSegments(), HPGL_PLOTTER::FlashPadCustom(), PSLIKE_PLOTTER::FlashPadCustom(), GERBER_PLOTTER::FlashPadCustom(), DXF_PLOTTER::FlashPadCustom(), D_PAD::FlipPrimitives(), C3D_RENDER_OGL_LEGACY::generate_3D_Vias_and_Pads(), C3D_RENDER_OGL_LEGACY::generate_holes_display_list(), APERTURE_MACRO::GetApertureMacroShape(), GERBER_DRAW_ITEM::GetBoundingBox(), D_PAD::GetBoundingBox(), GetRelativeIndices(), HasTouchingHoles(), D_PAD::HitTest(), Iterate(), IterateSegments(), IterateSegmentsWithHoles(), IterateWithHoles(), D_PAD::MergePrimitivesAsPolygon(), GERBER_DRAW_ITEM::MoveAB(), GERBER_DRAW_ITEM::MoveXY(), CPolyLine::NormalizeAreaOutlines(), NormalizeAreaOutlines(), BRDITEMS_PLOTTER::PlotDrawSegment(), PlotLayerOutlines(), BRDITEMS_PLOTTER::PlotPad(), DXF_PLOTTER::PlotPoly(), Polygon_Calc_BBox_3DU(), polygonArea(), C3D_RENDER_OGL_LEGACY::reload(), Subset(), and PNS_KICAD_IFACE::syncZone().

555 { return m_polys.size(); }
bool SHAPE_POLY_SET::Parse ( std::stringstream &  aStream)
overridevirtual

Reimplemented from SHAPE.

Definition at line 1139 of file shape_poly_set.cpp.

References SHAPE_LINE_CHAIN::Append(), i, m_polys, SHAPE_LINE_CHAIN::SetClosed(), VECTOR2< T >::x, and VECTOR2< T >::y.

1140 {
1141  std::string tmp;
1142 
1143  aStream >> tmp;
1144 
1145  if( tmp != "polyset" )
1146  return false;
1147 
1148  aStream >> tmp;
1149 
1150  int n_polys = atoi( tmp.c_str() );
1151 
1152  if( n_polys < 0 )
1153  return false;
1154 
1155  for( int i = 0; i < n_polys; i++ )
1156  {
1157  POLYGON paths;
1158 
1159  aStream >> tmp;
1160 
1161  if( tmp != "poly" )
1162  return false;
1163 
1164  aStream >> tmp;
1165  int n_outlines = atoi( tmp.c_str() );
1166 
1167  if( n_outlines < 0 )
1168  return false;
1169 
1170  for( int j = 0; j < n_outlines; j++ )
1171  {
1172  SHAPE_LINE_CHAIN outline;
1173 
1174  outline.SetClosed( true );
1175 
1176  aStream >> tmp;
1177  int n_vertices = atoi( tmp.c_str() );
1178 
1179  for( int v = 0; v < n_vertices; v++ )
1180  {
1181  VECTOR2I p;
1182 
1183  aStream >> tmp; p.x = atoi( tmp.c_str() );
1184  aStream >> tmp; p.y = atoi( tmp.c_str() );
1185  outline.Append( p );
1186  }
1187 
1188  paths.push_back( outline );
1189  }
1190 
1191  m_polys.push_back( paths );
1192  }
1193 
1194  return true;
1195 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
void SetClosed(bool aClosed)
Function SetClosed()
Class SHAPE_LINE_CHAIN.
size_t i
Definition: json11.cpp:597
bool SHAPE_POLY_SET::pointInPolygon ( const VECTOR2I aP,
const SHAPE_LINE_CHAIN aPath 
) const
private

Definition at line 1498 of file shape_poly_set.cpp.

References SHAPE_LINE_CHAIN::PointInside().

Referenced by containsSingle(), and IsEmpty().

1499 {
1500  return aPath.PointInside( aP );
1501 }
bool PointInside(const VECTOR2I &aP) const
Function PointInside()
bool SHAPE_POLY_SET::PointOnEdge ( const VECTOR2I aP) const

Function PointOnEdge()

Checks if point aP lies on an edge or vertex of some of the outlines or holes.

Parameters
aPis the point to check.
Returns
bool - true if the point lies on the edge of any polygon.

Definition at line 1215 of file shape_poly_set.cpp.

References m_polys.

Referenced by IsSolid().

1216 {
1217  // Iterate through all the polygons in the set
1218  for( const POLYGON& polygon : m_polys )
1219  {
1220  // Iterate through all the line chains in the polygon
1221  for( const SHAPE_LINE_CHAIN& lineChain : polygon )
1222  {
1223  if( lineChain.PointOnEdge( aP ) )
1224  return true;
1225  }
1226  }
1227 
1228  return false;
1229 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
Class SHAPE_LINE_CHAIN.
POLYGON& SHAPE_POLY_SET::Polygon ( int  aIndex)
inline
const POLYGON& SHAPE_POLY_SET::Polygon ( int  aIndex) const
inline

Definition at line 605 of file shape_poly_set.h.

References m_polys.

606  {
607  return m_polys[aIndex];
608  }
void SHAPE_POLY_SET::RemoveContour ( int  aContourIdx,
int  aPolygonIdx = -1 
)

Function RemoveContour deletes the aContourIdx-th contour of the aPolygonIdx-th polygon in the set.

Parameters
aContourIdxis the index of the contour in the aPolygonIdx-th polygon to be removed.
aPolygonIdxis the index of the polygon in which the to-be-removed contour is. Defaults to the last polygon in the set.

Definition at line 1285 of file shape_poly_set.cpp.

References m_polys.

Referenced by PCB_EDIT_FRAME::Delete_Zone_Contour(), IsEmpty(), and POINT_EDITOR::removeCorner().

1286 {
1287  // Default polygon is the last one
1288  if( aPolygonIdx < 0 )
1289  aPolygonIdx += m_polys.size();
1290 
1291  m_polys[aPolygonIdx].erase( m_polys[aPolygonIdx].begin() + aContourIdx );
1292 }
int SHAPE_POLY_SET::RemoveNullSegments ( )

Function RemoveNullSegments looks for null segments; ie, segments whose ends are exactly the same and deletes them.

Returns
int - the number of deleted segments.

Definition at line 1295 of file shape_poly_set.cpp.

References SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::GetIndex(), SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::IsEndContour(), IterateWithHoles(), and RemoveVertex().

Referenced by chamferFilletPolygon(), PCB_EDIT_FRAME::End_Zone(), IsEmpty(), and NormalizeAreaOutlines().

1296 {
1297  int removed = 0;
1298 
1299  ITERATOR iterator = IterateWithHoles();
1300 
1301  VECTOR2I contourStart = *iterator;
1302  VECTOR2I segmentStart, segmentEnd;
1303 
1304  VERTEX_INDEX indexStart;
1305 
1306  while( iterator )
1307  {
1308  // Obtain first point and its index
1309  segmentStart = *iterator;
1310  indexStart = iterator.GetIndex();
1311 
1312  // Obtain last point
1313  if( iterator.IsEndContour() )
1314  {
1315  segmentEnd = contourStart;
1316 
1317  // Advance
1318  iterator++;
1319 
1320  if( iterator )
1321  contourStart = *iterator;
1322  }
1323  else
1324  {
1325  // Advance
1326  iterator++;
1327 
1328  if( iterator )
1329  segmentEnd = *iterator;
1330  }
1331 
1332  // Remove segment start if both points are equal
1333  if( segmentStart == segmentEnd )
1334  {
1335  RemoveVertex( indexStart );
1336  removed++;
1337 
1338  // Advance the iterator one position, as there is one vertex less.
1339  if( iterator )
1340  iterator++;
1341  }
1342  }
1343 
1344  return removed;
1345 }
struct SHAPE_POLY_SET::VERTEX_INDEX VERTEX_INDEX
Struct VERTEX_INDEX.
ITERATOR_TEMPLATE< VECTOR2I > ITERATOR
ITERATOR IterateWithHoles()
Function IterateWithHoles.
void RemoveVertex(int aGlobalIndex)
Function RemoveVertex deletes the aGlobalIndex-th vertex.
void SHAPE_POLY_SET::RemoveVertex ( int  aGlobalIndex)

Function RemoveVertex deletes the aGlobalIndex-th vertex.

Parameters
aGlobalIndexis the global index of the to-be-removed vertex.

Definition at line 1454 of file shape_poly_set.cpp.

References GetRelativeIndices().

Referenced by Abort_Zone_Move_Corner_Or_Outlines(), PCB_EDIT_FRAME::Delete_LastCreatedCorner(), IsEmpty(), PCB_EDIT_FRAME::Remove_Zone_Corner(), POINT_EDITOR::removeCorner(), RemoveNullSegments(), and PCB_EDIT_FRAME::Start_Move_Zone_Corner().

1455 {
1456  VERTEX_INDEX index;
1457 
1458  // Assure the to be removed vertex exists, abort otherwise
1459  if( GetRelativeIndices( aGlobalIndex, &index ) )
1460  RemoveVertex( index );
1461  else
1462  throw( std::out_of_range( "aGlobalIndex-th vertex does not exist" ) );
1463 }
struct SHAPE_POLY_SET::VERTEX_INDEX VERTEX_INDEX
Struct VERTEX_INDEX.
bool GetRelativeIndices(int aGlobalIdx, VERTEX_INDEX *aRelativeIndices) const
Function GetRelativeIndices.
void RemoveVertex(int aGlobalIndex)
Function RemoveVertex deletes the aGlobalIndex-th vertex.
void SHAPE_POLY_SET::RemoveVertex ( VERTEX_INDEX  aRelativeIndices)

Function RemoveVertex deletes the vertex indexed by aIndex (index of polygon, contour and vertex).

Parameters
aRelativeIndicesis the set of relative indices of the to-be-removed vertex.

Definition at line 1466 of file shape_poly_set.cpp.

References SHAPE_POLY_SET::VERTEX_INDEX::m_contour, SHAPE_POLY_SET::VERTEX_INDEX::m_polygon, m_polys, and SHAPE_POLY_SET::VERTEX_INDEX::m_vertex.

1467 {
1468  m_polys[aIndex.m_polygon][aIndex.m_contour].Remove( aIndex.m_vertex );
1469 }
void SHAPE_POLY_SET::Rotate ( double  aAngle,
const VECTOR2I aCenter 
)

Function Rotate rotates all vertices by a given angle.

Parameters
aCenteris the rotation center
aAnglerotation angle in radians

Definition at line 1516 of file shape_poly_set.cpp.

References m_polys.

Referenced by D_CODE::ConvertShapeToPolygon(), export_vrml_polygon(), MODULE::GetBoundingPoly(), and TransformOvalClearanceToPolygon().

1517 {
1518  for( POLYGON& poly : m_polys )
1519  {
1520  for( SHAPE_LINE_CHAIN& path : poly )
1521  {
1522  path.Rotate( aAngle, aCenter );
1523  }
1524  }
1525 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
Class SHAPE_LINE_CHAIN.
void SHAPE_POLY_SET::Simplify ( POLYGON_MODE  aFastMode)

Simplifies the polyset (merges overlapping polys, eliminates degeneracy/self-intersections) For aFastMode meaning, see function booleanOp

Definition at line 1073 of file shape_poly_set.cpp.

References booleanOp(), and empty().

Referenced by CINFO3D_VISU::AddShapeWithClearanceToContainer(), CINFO3D_VISU::AddSolidAreasShapesToContainer(), D_PAD::buildCustomPadPolygon(), BOARD::CombineAreas(), ZONE_FILLER::computeRawFilledAreas(), MODULE::CoverageRatio(), CINFO3D_VISU::createBoardPolygon(), CINFO3D_VISU::createLayers(), CINFO3D_VISU::createNewPadWithClearance(), CreateThermalReliefPadPolygon(), Fracture(), BOARD::GetBoardPolygonOutlines(), CPolyLine::NormalizeAreaOutlines(), NormalizeAreaOutlines(), PlotLayerOutlines(), ZONE_CONTAINER::TransformShapeWithClearanceToPolygon(), and Unfracture().

1074 {
1076 
1077  booleanOp( ctUnion, empty, aFastMode );
1078 }
void booleanOp(ClipperLib::ClipType aType, const SHAPE_POLY_SET &aOtherShape, POLYGON_MODE aFastMode)
Function booleanOp this is the engine to execute all polygon boolean transforms (AND, OR, ...
Class SHAPE_POLY_SET.
static bool empty(const wxTextEntryBase *aCtrl)
SHAPE_POLY_SET SHAPE_POLY_SET::Subset ( int  aFirstPolygon,
int  aLastPolygon 
)

Function Subset returns a subset of the polygons in this set, the ones between aFirstPolygon and aLastPolygon.

Parameters
aFirstPolygonis the first polygon to be included in the returned set.
aLastPolygonis the first polygon to be excluded of the returned set.
Returns
SHAPE_POLY_SET - a set containing the polygons between aFirstPolygon (included) and aLastPolygon (excluded).

Definition at line 253 of file shape_poly_set.cpp.

References m_polys, OutlineCount(), and Polygon().

Referenced by Outline(), and UnitSet().

254 {
255  assert( aFirstPolygon >= 0 && aLastPolygon <= OutlineCount() );
256 
257  SHAPE_POLY_SET newPolySet;
258 
259  for( int index = aFirstPolygon; index < aLastPolygon; index++ )
260  {
261  newPolySet.m_polys.push_back( Polygon( index ) );
262  }
263 
264  return newPolySet;
265 }
int OutlineCount() const
Returns the number of outlines in the set
Class SHAPE_POLY_SET.
POLYGON & Polygon(int aIndex)
Returns the aIndex-th subpolygon in the set
int SHAPE_POLY_SET::TotalVertices ( ) const

Returns total number of vertices stored in the set.

Definition at line 1528 of file shape_poly_set.cpp.

References m_polys.

Referenced by EDIT_POINTS_FACTORY::buildForPolyOutline(), ZONE_CONTAINER::GetMsgPanelInfo(), ZONE_CONTAINER::GetNumCorners(), DRAWSEGMENT::HitTest(), ZONE_CONTAINER::HitTest(), InsertVertex(), IsEmpty(), PCB_EDIT_FRAME::Remove_Zone_Corner(), POINT_EDITOR::updateItem(), and POINT_EDITOR::updatePoints().

1529 {
1530  int c = 0;
1531 
1532  for( const POLYGON& poly : m_polys )
1533  {
1534  for( const SHAPE_LINE_CHAIN& path : poly )
1535  {
1536  c += path.PointCount();
1537  }
1538  }
1539 
1540  return c;
1541 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
Class SHAPE_LINE_CHAIN.
unsigned int SHAPE_POLY_SET::TriangulatedPolyCount ( ) const
inline

Returns the number of triangulated polygons

Definition at line 552 of file shape_poly_set.h.

References m_triangulatedPolys.

Referenced by KIGFX::OPENGL_GAL::drawTriangulatedPolyset().

552 { return m_triangulatedPolys.size(); }
std::vector< std::unique_ptr< TRIANGULATED_POLYGON > > m_triangulatedPolys
const TRIANGULATED_POLYGON* SHAPE_POLY_SET::TriangulatedPolygon ( int  aIndex) const
inline

Definition at line 610 of file shape_poly_set.h.

References m_triangulatedPolys.

Referenced by KIGFX::OPENGL_GAL::drawTriangulatedPolyset(), and PNS_KICAD_IFACE::syncZone().

611  {
612  return m_triangulatedPolys[aIndex].get();
613  }
std::vector< std::unique_ptr< TRIANGULATED_POLYGON > > m_triangulatedPolys
void SHAPE_POLY_SET::triangulateSingle ( const POLYGON aPoly,
SHAPE_POLY_SET::TRIANGULATED_POLYGON aResult 
)
private

Definition at line 2003 of file shape_poly_set.cpp.

References SHAPE_POLY_SET::TRIANGULATION_CONTEXT::AddOutline(), SHAPE_POLY_SET::TRIANGULATED_POLYGON::AllocateVertices(), i, totalVertexCount(), and SHAPE_POLY_SET::TRIANGULATION_CONTEXT::Triangulate().

Referenced by CacheTriangulation().

2005 {
2006  if( aPoly.size() == 0 )
2007  return;
2008 
2009  TRIANGULATION_CONTEXT ctx ( &aResult );
2010 
2011  aResult.AllocateVertices( totalVertexCount( aPoly ) );
2012  ctx.AddOutline( aPoly[0], false );
2013 
2014  for( unsigned i = 1; i < aPoly.size(); i++ )
2015  {
2016  ctx.AddOutline( aPoly[i], true ); // add holes
2017  }
2018 
2019  ctx.Triangulate();
2020 }
static int totalVertexCount(const SHAPE_POLY_SET::POLYGON &aPoly)
size_t i
Definition: json11.cpp:597
SHAPE_TYPE SHAPE::Type ( ) const
inlineinherited

Function Type()

Returns the type of the shape.

Return values
thetype

Definition at line 83 of file shape.h.

References SHAPE::m_type.

Referenced by PNS::DP_GATEWAYS::BuildFromPrimitivePair(), CollideShapes(), PNS::OPTIMIZER::computeBreakouts(), PNS::LOGGER::dumpShape(), PNS::SOLID::Hull(), ROUTER_PREVIEW_ITEM::ViewDraw(), and SHAPE_FILE_IO::Write().

84  {
85  return m_type;
86  }
SHAPE_TYPE m_type
type of our shape
Definition: shape.h:166
void SHAPE_POLY_SET::Unfracture ( POLYGON_MODE  aFastMode)

Converts a single outline slitted ("fractured") polygon into a set ouf outlines with holes.

Definition at line 1062 of file shape_poly_set.cpp.

References m_polys, Simplify(), and unfractureSingle().

Referenced by CacheTriangulation().

1063 {
1064  for( POLYGON& path : m_polys )
1065  {
1066  unfractureSingle( path );
1067  }
1068 
1069  Simplify( aFastMode ); // remove overlapping holes/degeneracy
1070 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
void unfractureSingle(POLYGON &path)
void Simplify(POLYGON_MODE aFastMode)
Simplifies the polyset (merges overlapping polys, eliminates degeneracy/self-intersections) For aFast...
void SHAPE_POLY_SET::unfractureSingle ( SHAPE_POLY_SET::POLYGON aPoly)
private

Definition at line 886 of file shape_poly_set.cpp.

References SEG::A, SHAPE_LINE_CHAIN::Append(), SHAPE_LINE_CHAIN::Area(), SEG::B, SHAPE_LINE_CHAIN::CPoint(), SHAPE_LINE_CHAIN::CSegment(), i, next(), operator!=(), operator==(), and SHAPE_LINE_CHAIN::SetClosed().

Referenced by IsEmpty(), and Unfracture().

887 {
888  assert( aPoly.size() == 1 );
889 
890  struct EDGE
891  {
892  int m_index = 0;
893  SHAPE_LINE_CHAIN* m_poly = nullptr;
894  bool m_duplicate = false;
895 
896  EDGE( SHAPE_LINE_CHAIN* aPolygon, int aIndex ) :
897  m_index( aIndex ),
898  m_poly( aPolygon )
899  {}
900 
901  bool compareSegs( const SEG& s1, const SEG& s2 ) const
902  {
903  return (s1.A == s2.B && s1.B == s2.A);
904  }
905 
906  bool operator==( const EDGE& aOther ) const
907  {
908  return compareSegs( m_poly->CSegment( m_index ),
909  aOther.m_poly->CSegment( aOther.m_index ) );
910  }
911 
912  bool operator!=( const EDGE& aOther ) const
913  {
914  return !compareSegs( m_poly->CSegment( m_index ),
915  aOther.m_poly->CSegment( aOther.m_index ) );
916  }
917 
918  struct HASH
919  {
920  std::size_t operator()( const EDGE& aEdge ) const
921  {
922  const auto& a = aEdge.m_poly->CSegment( aEdge.m_index );
923 
924  return (std::size_t) ( a.A.x + a.B.x + a.A.y + a.B.y );
925  }
926  };
927  };
928 
929  struct EDGE_LIST_ENTRY
930  {
931  int index;
932  EDGE_LIST_ENTRY* next;
933  };
934 
935  std::unordered_set<EDGE, EDGE::HASH> uniqueEdges;
936 
937  auto lc = aPoly[0];
938  lc.Simplify();
939 
940  auto edgeList = std::make_unique<EDGE_LIST_ENTRY []>( lc.SegmentCount() );
941 
942  for( int i = 0; i < lc.SegmentCount(); i++ )
943  {
944  edgeList[i].index = i;
945  edgeList[i].next = &edgeList[ (i != lc.SegmentCount() - 1) ? i + 1 : 0 ];
946  }
947 
948  std::unordered_set<EDGE_LIST_ENTRY*> queue;
949 
950  for( int i = 0; i < lc.SegmentCount(); i++ )
951  {
952  EDGE e( &lc, i );
953  uniqueEdges.insert( e );
954  }
955 
956  for( int i = 0; i < lc.SegmentCount(); i++ )
957  {
958  EDGE e( &lc, i );
959  auto it = uniqueEdges.find( e );
960 
961  if( it != uniqueEdges.end() && it->m_index != i )
962  {
963  int e1 = it->m_index;
964  int e2 = i;
965 
966  if( e1 > e2 )
967  std::swap( e1, e2 );
968 
969  int e1_prev = e1 - 1;
970 
971  if( e1_prev < 0 )
972  e1_prev = lc.SegmentCount() - 1;
973 
974  int e2_prev = e2 - 1;
975 
976  if( e2_prev < 0 )
977  e2_prev = lc.SegmentCount() - 1;
978 
979  int e1_next = e1 + 1;
980 
981  if( e1_next == lc.SegmentCount() )
982  e1_next = 0;
983 
984  int e2_next = e2 + 1;
985 
986  if( e2_next == lc.SegmentCount() )
987  e2_next = 0;
988 
989  edgeList[e1_prev].next = &edgeList[ e2_next ];
990  edgeList[e2_prev].next = &edgeList[ e1_next ];
991  edgeList[i].next = nullptr;
992  edgeList[it->m_index].next = nullptr;
993  }
994  }
995 
996  for( int i = 0; i < lc.SegmentCount(); i++ )
997  {
998  if( edgeList[i].next )
999  queue.insert( &edgeList[i] );
1000  }
1001 
1002  auto edgeBuf = std::make_unique<EDGE_LIST_ENTRY* []>( lc.SegmentCount() );
1003 
1004  int n = 0;
1005  int outline = -1;
1006 
1007  POLYGON result;
1008 
1009  while( queue.size() )
1010  {
1011  auto e_first = (*queue.begin() );
1012  auto e = e_first;
1013  int cnt = 0;
1014 
1015  do {
1016  edgeBuf[cnt++] = e;
1017  e = e->next;
1018  } while( e && e != e_first );
1019 
1020  SHAPE_LINE_CHAIN outl;
1021 
1022  for( int i = 0; i < cnt; i++ )
1023  {
1024  auto p = lc.CPoint( edgeBuf[i]->index );
1025  outl.Append( p );
1026  queue.erase( edgeBuf[i] );
1027  }
1028 
1029  outl.SetClosed( true );
1030 
1031  bool cw = outl.Area() > 0.0;
1032 
1033  if( cw )
1034  outline = n;
1035 
1036  result.push_back( outl );
1037  n++;
1038  }
1039 
1040  if( outline > 0 )
1041  std::swap( result[0], result[outline] );
1042 
1043  aPoly = result;
1044 }
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
CITER next(CITER it)
Definition: ptree.cpp:130
bool operator==(const PART_LIB &aLibrary, const wxString &aName)
Case insensitive library name comparison.
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
const SEG CSegment(int aIndex) const
Function CSegment()
void SetClosed(bool aClosed)
Function SetClosed()
Definition: seg.h:36
Class SHAPE_LINE_CHAIN.
double Area() const
size_t i
Definition: json11.cpp:597
VECTOR2I A
Definition: seg.h:46
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
bool operator!=(const PART_LIB &aLibrary, const wxString &aName)
VECTOR2I B
Definition: seg.h:47
SHAPE_POLY_SET SHAPE_POLY_SET::UnitSet ( int  aPolygonIndex)
inline

Definition at line 588 of file shape_poly_set.h.

References Subset().

Referenced by BOARD::NormalizeAreaPolygon().

589  {
590  return Subset( aPolygonIndex, aPolygonIndex + 1 );
591  }
SHAPE_POLY_SET Subset(int aFirstPolygon, int aLastPolygon)
Function Subset returns a subset of the polygons in this set, the ones between aFirstPolygon and aLas...
VECTOR2I & SHAPE_POLY_SET::Vertex ( int  aIndex,
int  aOutline,
int  aHole 
)

Returns the index-th vertex in a given hole outline within a given outline

Definition at line 268 of file shape_poly_set.cpp.

References m_polys.

Referenced by Abort_Zone_Move_Corner_Or_Outlines(), POINT_EDITOR::addCorner(), DRC::doFootprintOverlappingDrc(), D_CODE::DrawFlashedPolygon(), GERBER_FILE_IMAGE::Execute_DCODE_Command(), GERBER_FILE_IMAGE::Execute_G_Command(), findVertex(), ZONE_CONTAINER::Hatch(), ZONE_CONTAINER::HitTest(), ZONE_CONTAINER::MoveEdge(), ZONE_CONTAINER::SetCornerPosition(), Show_Zone_Corner_Or_Outline_While_Move_Mouse(), PCB_EDIT_FRAME::Start_Move_Zone_Corner(), POINT_EDITOR::updateItem(), and Vertex().

269 {
270  if( aOutline < 0 )
271  aOutline += m_polys.size();
272 
273  int idx;
274 
275  if( aHole < 0 )
276  idx = 0;
277  else
278  idx = aHole + 1;
279 
280  assert( aOutline < (int) m_polys.size() );
281  assert( idx < (int) m_polys[aOutline].size() );
282 
283  return m_polys[aOutline][idx].Point( aIndex );
284 }
VECTOR2I & SHAPE_POLY_SET::Vertex ( int  aGlobalIndex)

Returns the aGlobalIndex-th vertex in the poly set

Definition at line 306 of file shape_poly_set.cpp.

References GetRelativeIndices(), SHAPE_POLY_SET::VERTEX_INDEX::m_contour, SHAPE_POLY_SET::VERTEX_INDEX::m_polygon, m_polys, and SHAPE_POLY_SET::VERTEX_INDEX::m_vertex.

307 {
309 
310  // Assure the passed index references a legal position; abort otherwise
311  if( !GetRelativeIndices( aGlobalIndex, &index ) )
312  throw( std::out_of_range( "aGlobalIndex-th vertex does not exist" ) );
313 
314  return m_polys[index.m_polygon][index.m_contour].Point( index.m_vertex );
315 }
Struct VERTEX_INDEX.
bool GetRelativeIndices(int aGlobalIdx, VERTEX_INDEX *aRelativeIndices) const
Function GetRelativeIndices.
VECTOR2I & SHAPE_POLY_SET::Vertex ( SHAPE_POLY_SET::VERTEX_INDEX  index)

Returns the index-th vertex in a given hole outline within a given outline

Definition at line 330 of file shape_poly_set.cpp.

References SHAPE_POLY_SET::VERTEX_INDEX::m_contour, SHAPE_POLY_SET::VERTEX_INDEX::m_polygon, SHAPE_POLY_SET::VERTEX_INDEX::m_vertex, and Vertex().

331 {
332  return Vertex( index.m_vertex, index.m_polygon, index.m_contour - 1 );
333 }
VECTOR2I & Vertex(int aIndex, int aOutline, int aHole)
Returns the index-th vertex in a given hole outline within a given outline
VECTOR2I& SHAPE_POLY_SET::vertex ( int  aCornerId)
private

Referenced by convertToClipper(), and IsEmpty().

int SHAPE_POLY_SET::VertexCount ( int  aOutline = -1,
int  aHole = -1 
) const

Returns the number of vertices in a given outline/hole

Definition at line 228 of file shape_poly_set.cpp.

References m_polys.

Referenced by D_CODE::DrawFlashedPolygon(), DRAWSEGMENT::GetPointCount(), and OutlineCount().

229 {
230  if( m_polys.size() == 0 ) // Empty poly set
231  return 0;
232 
233  if( aOutline < 0 ) // Use last outline
234  aOutline += m_polys.size();
235 
236  int idx;
237 
238  if( aHole < 0 )
239  idx = 0;
240  else
241  idx = aHole + 1;
242 
243  if( aOutline >= (int) m_polys.size() ) // not existing outline
244  return 0;
245 
246  if( idx >= (int) m_polys[aOutline].size() ) // not existing hole
247  return 0;
248 
249  return m_polys[aOutline][idx].PointCount();
250 }

Member Data Documentation

MD5_HASH SHAPE_POLY_SET::m_hash
private

Definition at line 1193 of file shape_poly_set.h.

Referenced by CacheTriangulation(), GetHash(), IsTriangulationUpToDate(), and operator=().

std::vector<std::unique_ptr<TRIANGULATED_POLYGON> > SHAPE_POLY_SET::m_triangulatedPolys
private
bool SHAPE_POLY_SET::m_triangulationValid = false
private

Definition at line 1192 of file shape_poly_set.h.

Referenced by CacheTriangulation(), IsTriangulationUpToDate(), and operator=().

SHAPE_TYPE SHAPE::m_type
protectedinherited

type of our shape

Definition at line 166 of file shape.h.

Referenced by SHAPE::Type().


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