KiCad PCB EDA Suite
SHAPE_COMPOUND Class Reference

#include <shape_compound.h>

Inheritance diagram for SHAPE_COMPOUND:
SHAPE SHAPE_BASE

Public Member Functions

 SHAPE_COMPOUND ()
 
 SHAPE_COMPOUND (const std::vector< SHAPE * > &aShapes)
 
 SHAPE_COMPOUND (const SHAPE_COMPOUND &aOther)
 
 ~SHAPE_COMPOUND ()
 
SHAPE_COMPOUNDClone () const override
 Function Clone() More...
 
const std::string Format () const override
 
bool Collide (const SEG &aSeg, int aClearance=0, int *aActual=nullptr) const override
 Function Collide() More...
 
bool Collide (const SHAPE *aShape, int aClearance, VECTOR2I *aMTV) const override
 Function Collide() More...
 
bool Collide (const SHAPE *aShape, int aClearance=0, int *aActual=nullptr) const override
 
const std::vector< SHAPE * > & Shapes () const
 
const BOX2I BBox (int aClearance=0) const override
 Function BBox() More...
 
int Distance (const SEG &aSeg) const
 
void Move (const VECTOR2I &aVector) override
 
void AddShape (SHAPE *aShape)
 
bool Empty () const
 
int Size () const
 
void Rotate (double aAngle, const VECTOR2I &aCenter={ 0, 0 }) override
 Function Rotate. More...
 
bool IsSolid () const override
 
SHAPEUniqueSubshape () const
 
bool IsNull () const
 Function IsNull() More...
 
virtual bool Collide (const VECTOR2I &aP, int aClearance=0, int *aActual=nullptr) const
 Function Collide() More...
 
virtual VECTOR2I Centre () const
 Function Centre() More...
 
virtual bool Parse (std::stringstream &aStream)
 
FACETNewFacet ()
 
SGNODECalcShape (SGNODE *aParent, SGNODE *aColor, WRL1_ORDER aVertexOrder, float aCreaseLimit=0.74317, bool isVRML2=false)
 
SHAPE_TYPE Type () const
 Function Type() More...
 
virtual bool HasIndexableSubshapes () const
 
virtual size_t GetIndexableSubshapeCount ()
 
virtual void GetIndexableSubshape (SHAPE_BASE &aSubshape) const
 

Protected Types

typedef VECTOR2I::extended_type ecoord
 

Protected Attributes

SHAPE_TYPE m_type
 

type of our shape

More...
 

Private Attributes

BOX2I m_cachedBBox
 
bool m_dirty
 
std::vector< SHAPE * > m_shapes
 

Detailed Description

Definition at line 33 of file shape_compound.h.

Member Typedef Documentation

◆ ecoord

typedef VECTOR2I::extended_type SHAPE::ecoord
protectedinherited

Definition at line 123 of file shape.h.

Constructor & Destructor Documentation

◆ SHAPE_COMPOUND() [1/3]

SHAPE_COMPOUND::SHAPE_COMPOUND ( )
inline

Definition at line 36 of file shape_compound.h.

36  :
37  SHAPE( SH_COMPOUND ),
38  m_dirty( true )
39  {}
set of polygons (with holes, etc.)
Definition: shape.h:48
SHAPE(SHAPE_TYPE aType)
Constructor.
Definition: shape.h:132

Referenced by Clone().

◆ SHAPE_COMPOUND() [2/3]

SHAPE_COMPOUND::SHAPE_COMPOUND ( const std::vector< SHAPE * > &  aShapes)

Definition at line 41 of file shape_compound.cpp.

41  :
42  SHAPE( SH_COMPOUND ),
43  m_dirty( true ),
44  m_shapes( aShapes )
45 {
46 
47 }
set of polygons (with holes, etc.)
Definition: shape.h:48
SHAPE(SHAPE_TYPE aType)
Constructor.
Definition: shape.h:132
std::vector< SHAPE * > m_shapes

◆ SHAPE_COMPOUND() [3/3]

SHAPE_COMPOUND::SHAPE_COMPOUND ( const SHAPE_COMPOUND aOther)

Definition at line 50 of file shape_compound.cpp.

51  : SHAPE( SH_COMPOUND )
52 {
53  for ( auto shape : aOther.Shapes() )
54  m_shapes.push_back( shape->Clone() );
55 
56  m_dirty = true;
57 }
set of polygons (with holes, etc.)
Definition: shape.h:48
SHAPE(SHAPE_TYPE aType)
Constructor.
Definition: shape.h:132
const std::vector< SHAPE * > & Shapes() const
std::vector< SHAPE * > m_shapes

References m_dirty, m_shapes, and Shapes().

◆ ~SHAPE_COMPOUND()

SHAPE_COMPOUND::~SHAPE_COMPOUND ( )

Definition at line 62 of file shape_compound.cpp.

63 {
64  for( auto shape : m_shapes )
65  delete shape;
66 }
std::vector< SHAPE * > m_shapes

References m_shapes.

Member Function Documentation

◆ AddShape()

void SHAPE_COMPOUND::AddShape ( SHAPE aShape)
inline

Definition at line 74 of file shape_compound.h.

75  {
76  m_shapes.push_back( aShape );
77  m_dirty = true;
78  }
std::vector< SHAPE * > m_shapes

References m_dirty, and m_shapes.

◆ BBox()

const BOX2I SHAPE_COMPOUND::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 75 of file shape_compound.cpp.

76 {
77  BOX2I bb;
78 
79  if ( m_shapes.size() < 1 )
80  return bb;
81 
82  bb = m_shapes[0]->BBox();
83 
84  for( int i = 1; i < m_shapes.size(); i++ )
85  bb.Merge( m_shapes[i]->BBox() );
86 
87  return bb;
88 }
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:386
std::vector< SHAPE * > m_shapes

References m_shapes, and BOX2< Vec >::Merge().

◆ CalcShape()

SGNODE * SHAPE::CalcShape ( SGNODE aParent,
SGNODE aColor,
WRL1_ORDER  aVertexOrder,
float  aCreaseLimit = 0.74317,
bool  isVRML2 = false 
)
inherited

Definition at line 713 of file wrlfacet.cpp.

715 {
716  if( facets.empty() || !facets.front()->HasMinPoints() )
717  return NULL;
718 
719  std::vector< std::list< FACET* > > flist;
720 
721  // determine the max. index and size flist as appropriate
722  std::list< FACET* >::iterator sF = facets.begin();
723  std::list< FACET* >::iterator eF = facets.end();
724 
725  int maxIdx = 0;
726  int tmi;
727  float maxV = 0.0;
728  float tV = 0.0;
729 
730  while( sF != eF )
731  {
732  tV = (*sF)->CalcFaceNormal();
733  tmi = (*sF)->GetMaxIndex();
734 
735  if( tmi > maxIdx )
736  maxIdx = tmi;
737 
738  if( tV > maxV )
739  maxV = tV;
740 
741  ++sF;
742  }
743 
744  ++maxIdx;
745 
746  if( maxIdx < 3 )
747  return NULL;
748 
749  flist.resize( maxIdx );
750 
751  // create the lists of facets common to indices
752  sF = facets.begin();
753 
754  while( sF != eF )
755  {
756  (*sF)->Renormalize( tV );
757  (*sF)->CollectVertices( flist );
758  ++sF;
759  }
760 
761  // calculate the normals
762  size_t vs = flist.size();
763 
764  for( size_t i = 0; i < vs; ++i )
765  {
766  sF = flist[i].begin();
767  eF = flist[i].end();
768 
769  while( sF != eF )
770  {
771  (*sF)->CalcVertexNormal( i, flist[i], aCreaseLimit );
772  ++sF;
773  }
774  }
775 
776  std::vector< WRLVEC3F > vertices;
777  std::vector< WRLVEC3F > normals;
778  std::vector< SGCOLOR > colors;
779 
780  // push the facet data to the final output list
781  sF = facets.begin();
782  eF = facets.end();
783 
784  while( sF != eF )
785  {
786  (*sF)->GetData( vertices, normals, colors, aVertexOrder );
787  ++sF;
788  }
789 
790  flist.clear();
791 
792  if( vertices.size() < 3 )
793  return NULL;
794 
795  IFSG_SHAPE shapeNode( false );
796 
797  if( !isVRML2 )
798  {
799  shapeNode.NewNode( aParent );
800 
801  if( aColor )
802  {
803  if( NULL == S3D::GetSGNodeParent( aColor ) )
804  shapeNode.AddChildNode( aColor );
805  else
806  shapeNode.AddRefNode( aColor );
807  }
808  }
809 
810  std::vector< SGPOINT > lCPts; // vertex points in SGPOINT (double) format
811  std::vector< SGVECTOR > lCNorm; // per-vertex normals
812  vs = vertices.size();
813 
814  for( size_t i = 0; i < vs; ++i )
815  {
816  SGPOINT pt;
817  pt.x = vertices[i].x;
818  pt.y = vertices[i].y;
819  pt.z = vertices[i].z;
820  lCPts.push_back( pt );
821  lCNorm.emplace_back( normals[i].x, normals[i].y, normals[i].z );
822  }
823 
824  vertices.clear();
825  normals.clear();
826 
827  IFSG_FACESET fsNode( false );
828 
829  if( !isVRML2 )
830  fsNode.NewNode( shapeNode );
831  else
832  fsNode.NewNode( aParent );
833 
834  IFSG_COORDS cpNode( fsNode );
835  cpNode.SetCoordsList( lCPts.size(), &lCPts[0] );
836  IFSG_COORDINDEX ciNode( fsNode );
837 
838  for( int i = 0; i < (int)lCPts.size(); ++i )
839  ciNode.AddIndex( i );
840 
841  IFSG_NORMALS nmNode( fsNode );
842  nmNode.SetNormalList( lCNorm.size(), &lCNorm[0] );
843 
844  if( !colors.empty() )
845  {
846  IFSG_COLORS nmColor( fsNode );
847  nmColor.SetColorList( colors.size(), &colors[0] );
848  colors.clear();
849  }
850 
851  if( !isVRML2 )
852  return shapeNode.GetRawPtr();
853 
854  return fsNode.GetRawPtr();
855 }
double x
Definition: sg_base.h:70
IFSG_COORDS is the wrapper for SGCOORDS.
Definition: ifsg_coords.h:40
IFSG_COORDINDEX is the wrapper for SGCOORDINDEX.
IFSG_COLORS is the wrapper for SGCOLORS.
Definition: ifsg_colors.h:41
SGLIB_API SGNODE * GetSGNodeParent(SGNODE *aNode)
Definition: ifsg_api.cpp:636
double y
Definition: sg_base.h:71
IFSG_NORMALS is the wrapper for the SGNORMALS class.
Definition: ifsg_normals.h:40
#define NULL
std::list< FACET * > facets
Definition: wrlfacet.h:143
IFSG_FACESET is the wrapper for the SGFACESET class.
Definition: ifsg_faceset.h:40
double z
Definition: sg_base.h:72
static VRML_COLOR colors[VRML_COLOR_LAST]
IFSG_SHAPE is the wrapper for the SGSHAPE class.
Definition: ifsg_shape.h:40

References IFSG_NODE::AddChildNode(), IFSG_INDEX::AddIndex(), IFSG_NODE::AddRefNode(), colors, SHAPE::facets, IFSG_NODE::GetRawPtr(), S3D::GetSGNodeParent(), IFSG_FACESET::NewNode(), IFSG_SHAPE::NewNode(), NULL, IFSG_COLORS::SetColorList(), IFSG_COORDS::SetCoordsList(), IFSG_NORMALS::SetNormalList(), SGPOINT::x, SGPOINT::y, and SGPOINT::z.

Referenced by WRL1FACESET::TranslateToSG(), X3DIFACESET::TranslateToSG(), and WRL2FACESET::TranslateToSG().

◆ Centre()

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 220 of file shape.h.

221  {
222  return BBox( 0 ).Centre(); // if nothing better is available....
223  }
virtual const BOX2I BBox(int aClearance=0) const =0
Function BBox()
Vec Centre() const
Definition: box2.h:79

References SHAPE::BBox(), and BOX2< Vec >::Centre().

Referenced by PNS_PCBNEW_RULE_RESOLVER::CollideHoles().

◆ Clone()

SHAPE_COMPOUND * SHAPE_COMPOUND::Clone ( ) const
overridevirtual

Function Clone()

Returns a dynamically allocated copy of the shape

Return values
copyof the shape

Reimplemented from SHAPE.

Definition at line 69 of file shape_compound.cpp.

70 {
71  return new SHAPE_COMPOUND( *this );
72 }

References SHAPE_COMPOUND().

◆ Collide() [1/4]

bool SHAPE_COMPOUND::Collide ( const SEG aSeg,
int  aClearance = 0,
int *  aActual = nullptr 
) const
overridevirtual

Function Collide()

Checks if the boundary of shape (this) lies closer to the segment aSeg than aClearance, indicating a collision. @aActual an optional pointer to an int to be updated with the actual distance in the case of collision.

Returns
true, if there is a collision.

Implements SHAPE.

Definition at line 116 of file shape_compound.cpp.

117 {
118  int dist = std::numeric_limits<int>::max();
119 
120  for( auto& item : m_shapes )
121  {
122  if( item->Collide( aSeg, aClearance, aActual ) )
123  {
124  if( !aActual || *aActual == 0 )
125  return true;
126 
127  dist = std::min( dist, *aActual );
128  }
129  }
130 
131  if( aActual )
132  *aActual = dist;
133 
134  return dist != std::numeric_limits<int>::max();
135 }
std::vector< SHAPE * > m_shapes

References m_shapes.

◆ Collide() [2/4]

bool SHAPE_COMPOUND::Collide ( const SHAPE aShape,
int  aClearance,
VECTOR2I aMTV 
) const
inlineoverridevirtual

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
aActualan optional pointer to an int to store the actual distance in the event of a collision.
Returns
true, if there is a collision.

Reimplemented from SHAPE.

Definition at line 52 of file shape_compound.h.

53  {
54  return SHAPE::Collide( aShape, aClearance, aMTV );
55  }
virtual bool Collide(const VECTOR2I &aP, int aClearance=0, int *aActual=nullptr) const
Function Collide()
Definition: shape.h:172

References SHAPE::Collide().

◆ Collide() [3/4]

bool SHAPE_COMPOUND::Collide ( const SHAPE aShape,
int  aClearance = 0,
int *  aActual = nullptr 
) const
inlineoverridevirtual

Reimplemented from SHAPE.

Definition at line 57 of file shape_compound.h.

58  {
59  return SHAPE::Collide( aShape, aClearance, aActual );
60  }
virtual bool Collide(const VECTOR2I &aP, int aClearance=0, int *aActual=nullptr) const
Function Collide()
Definition: shape.h:172

References SHAPE::Collide().

◆ Collide() [4/4]

virtual bool SHAPE::Collide ( const VECTOR2I aP,
int  aClearance = 0,
int *  aActual = nullptr 
) const
inlinevirtualinherited

Function Collide()

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

Parameters
aActualan optional pointer to an int to store the actual distance in the event of a collision.
Returns
true, if there is a collision.

Reimplemented in SHAPE_POLY_SET, SHAPE_LINE_CHAIN_BASE, SHAPE_SEGMENT, and SHAPE_ARC.

Definition at line 172 of file shape.h.

173  {
174  return Collide( SEG( aP, aP ), aClearance, aActual );
175  }
Definition: seg.h:39
virtual bool Collide(const VECTOR2I &aP, int aClearance=0, int *aActual=nullptr) const
Function Collide()
Definition: shape.h:172

Referenced by Collide(), SHAPE_SEGMENT::Collide(), collide(), SHAPE_RECT::Collide(), PNS::ITEM::collideSimple(), PNS::SHOVE::onCollidingVia(), PNS::HIT_VISITOR::operator()(), and PNS::OPTIMIZER::smartPadsSingle().

◆ Distance()

int SHAPE_COMPOUND::Distance ( const SEG aSeg) const

Definition at line 97 of file shape_compound.cpp.

98 {
99  assert(false);
100  return 0; // Make compiler happy
101 }

◆ Empty()

bool SHAPE_COMPOUND::Empty ( ) const
inline

Definition at line 80 of file shape_compound.h.

81  {
82  return m_shapes.empty();
83  }
std::vector< SHAPE * > m_shapes

References m_shapes.

◆ Format()

const std::string SHAPE_COMPOUND::Format ( ) const
overridevirtual

Reimplemented from SHAPE.

Definition at line 30 of file shape_compound.cpp.

31 {
32  std::stringstream ss;
33 
34  ss << "compound";
35 
36  // fixme: implement
37 
38  return ss.str();
39 }

◆ GetIndexableSubshape()

virtual void SHAPE_BASE::GetIndexableSubshape ( SHAPE_BASE aSubshape) const
inlinevirtualinherited

Definition at line 108 of file shape.h.

108 {};

◆ GetIndexableSubshapeCount()

virtual size_t SHAPE_BASE::GetIndexableSubshapeCount ( )
inlinevirtualinherited

Definition at line 106 of file shape.h.

106 { return 0; }

◆ HasIndexableSubshapes()

virtual bool SHAPE_BASE::HasIndexableSubshapes ( ) const
inlinevirtualinherited

Definition at line 101 of file shape.h.

102  {
103  return false;
104  }

◆ IsNull()

bool SHAPE::IsNull ( ) const
inlineinherited

Function IsNull()

Returns true if the shape is a null shape.

Return values
trueif null :-)

Definition at line 158 of file shape.h.

159  {
160  return m_type == SH_NULL;
161  }
SHAPE_TYPE m_type
type of our shape
Definition: shape.h:108
circular arc
Definition: shape.h:50

References SHAPE_BASE::m_type, and SH_NULL.

◆ IsSolid()

bool SHAPE_COMPOUND::IsSolid ( ) const
overridevirtual

Implements SHAPE.

Definition at line 110 of file shape_compound.cpp.

111 {
112  return true;
113 }

◆ Move()

void SHAPE_COMPOUND::Move ( const VECTOR2I aVector)
overridevirtual

Implements SHAPE.

Definition at line 90 of file shape_compound.cpp.

91 {
92  for( auto& item : m_shapes )
93  item->Move( aVector );
94 }
std::vector< SHAPE * > m_shapes

References m_shapes.

◆ NewFacet()

FACET * SHAPE::NewFacet ( )
inherited

Definition at line 705 of file wrlfacet.cpp.

706 {
707  FACET* fp = new FACET;
708  facets.push_back( fp );
709  return fp;
710 }
Definition: wrlfacet.h:41
std::list< FACET * > facets
Definition: wrlfacet.h:143

References SHAPE::facets.

Referenced by WRL1FACESET::TranslateToSG(), X3DIFACESET::TranslateToSG(), and WRL2FACESET::TranslateToSG().

◆ Parse()

bool SHAPE::Parse ( std::stringstream &  aStream)
virtualinherited

Reimplemented in SHAPE_POLY_SET, and SHAPE_LINE_CHAIN.

Definition at line 28 of file shape.cpp.

29 {
30  assert( false );
31  return false;
32 }

◆ Rotate()

void SHAPE_COMPOUND::Rotate ( double  aAngle,
const VECTOR2I aCenter = { 0, 0 } 
)
overridevirtual

Function Rotate.

Parameters
aCenteris the rotation center
aAnglerotation angle in radians

Implements SHAPE.

Definition at line 104 of file shape_compound.cpp.

105 {
106  assert( false );
107 }

◆ Shapes()

const std::vector<SHAPE*>& SHAPE_COMPOUND::Shapes ( ) const
inline

Definition at line 63 of file shape_compound.h.

64  {
65  return m_shapes;
66  }
std::vector< SHAPE * > m_shapes

References m_shapes.

Referenced by SHAPE_COMPOUND().

◆ Size()

int SHAPE_COMPOUND::Size ( ) const
inline

Definition at line 85 of file shape_compound.h.

86  {
87  return m_shapes.size();
88  }
std::vector< SHAPE * > m_shapes

References m_shapes.

◆ Type()

SHAPE_TYPE SHAPE_BASE::Type ( ) const
inlineinherited

Function Type()

Returns the type of the shape.

Return values
thetype

Definition at line 96 of file shape.h.

97  {
98  return m_type;
99  }
SHAPE_TYPE m_type
type of our shape
Definition: shape.h:108

References SHAPE_BASE::m_type.

Referenced by PNS::DP_GATEWAYS::BuildFromPrimitivePair(), collideShapes(), collideSingleShapes(), PNS::OPTIMIZER::computeBreakouts(), ROUTER_PREVIEW_ITEM::ViewDraw(), and SHAPE_FILE_IO::Write().

◆ UniqueSubshape()

SHAPE* SHAPE_COMPOUND::UniqueSubshape ( ) const
inline

Definition at line 94 of file shape_compound.h.

95  {
96  return m_shapes.size() != 1 ? nullptr : m_shapes[0];
97  }
std::vector< SHAPE * > m_shapes

References m_shapes.

Member Data Documentation

◆ m_cachedBBox

BOX2I SHAPE_COMPOUND::m_cachedBBox
private

Definition at line 101 of file shape_compound.h.

◆ m_dirty

bool SHAPE_COMPOUND::m_dirty
private

Definition at line 102 of file shape_compound.h.

Referenced by AddShape(), and SHAPE_COMPOUND().

◆ m_shapes

std::vector<SHAPE*> SHAPE_COMPOUND::m_shapes
private

◆ m_type

SHAPE_TYPE SHAPE_BASE::m_type
protectedinherited

type of our shape

Definition at line 108 of file shape.h.

Referenced by SHAPE::IsNull(), and SHAPE_BASE::Type().


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