35template <
typename T,
typename... Args>
36static std::unique_ptr<T>
make_shape(
const Args&... aArguments )
38 return std::make_unique<T>( aArguments... );
43 m_shapes.push_back( make_shape< IMPORTED_LINE >( aStart, aEnd, aWidth ) );
49 m_shapes.push_back( make_shape<IMPORTED_CIRCLE>( aCenter, aRadius, aWidth, aFilled ) );
56 m_shapes.push_back( make_shape<IMPORTED_ARC>( aCenter, aStart, aAngle, aWidth ) );
62 m_shapes.push_back( make_shape<IMPORTED_POLYGON>( aVertices, aWidth ) );
68 double aHeight,
double aWidth,
double aThickness,
72 m_shapes.push_back( make_shape< IMPORTED_TEXT >( aOrigin, aText, aHeight, aWidth,
73 aThickness, aOrientation, aHJustify, aVJustify ) );
80 m_shapes.push_back( make_shape<IMPORTED_SPLINE>( aStart, aBezierControl1, aBezierControl2, aEnd, aWidth ) );
86 m_shapes.push_back( std::move( aShape ) );
92 for( std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
93 shape->ImportTo( aImporter );
97static void convertPolygon( std::list<std::unique_ptr<IMPORTED_SHAPE>>& aShapes,
98 std::vector<IMPORTED_POLYGON*>& aPaths,
102 double minX = std::numeric_limits<double>::max();
104 double maxX = std::numeric_limits<double>::min();
109 const double convert_scale = 1000000000.0;
115 minX = std::min( minX, v.x );
116 minY = std::min( minY, v.y );
117 maxX = std::max( maxX, v.x );
118 maxY = std::max( maxY, v.y );
122 double origW = ( maxX - minX );
123 double origH = ( maxY - minY );
124 double upscaledW, upscaledH;
128 upscaledW = convert_scale;
129 upscaledH = ( origH == 0.0f ? 0.0 : origH * convert_scale / origW );
133 upscaledH = convert_scale;
134 upscaledW = ( origW == 0.0f ? 0.0 : origW * convert_scale / origH );
137 std::vector<SHAPE_LINE_CHAIN> upscaledPaths;
145 int xp =
KiROUND( ( v.x - minX ) * ( upscaledW / origW ) );
146 int yp =
KiROUND( ( v.y - minY ) * ( upscaledH / origH ) );
150 upscaledPaths.push_back( lc );
157 for(
int outl = 0; outl < result.
OutlineCount(); outl++ )
160 std::vector<VECTOR2D> pts;
163 double xp = (double) ro.
CPoint( i ).
x * ( origW / upscaledW ) + minX;
164 double yp = (double) ro.
CPoint( i ).
y * ( origH / upscaledH ) + minY;
165 pts.emplace_back(
VECTOR2D( xp, yp ) );
168 aShapes.push_back( std::make_unique<IMPORTED_POLYGON>( pts, aWidth ) );
175 int curShapeIdx = -1;
176 double lastWidth = 0;
178 std::list<std::unique_ptr<IMPORTED_SHAPE>> newShapes;
179 std::vector<IMPORTED_POLYGON*> polypaths;
181 for( std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
187 newShapes.push_back( shape->clone() );
193 if( index != curShapeIdx && curShapeIdx >= 0 )
201 polypaths.push_back( poly );
204 if( curShapeIdx >= 0 )
void AddCircle(const VECTOR2D &aCenter, double aRadius, double aWidth, bool aFilled) override
Create an object representing a circle.
void PostprocessNestedPolygons()
void AddSpline(const VECTOR2D &aStart, const VECTOR2D &BezierControl1, const VECTOR2D &BezierControl2, const VECTOR2D &aEnd, double aWidth) override
Create an object representing an arc.
void ImportTo(GRAPHICS_IMPORTER &aImporter)
void AddArc(const VECTOR2D &aCenter, const VECTOR2D &aStart, const EDA_ANGLE &aAngle, double aWidth) override
Create an object representing an arc.
void AddPolygon(const std::vector< VECTOR2D > &aVertices, double aWidth) override
std::list< std::unique_ptr< IMPORTED_SHAPE > > m_shapes
< List of imported shapes
void AddText(const VECTOR2D &aOrigin, const wxString &aText, double aHeight, double aWidth, double aThickness, double aOrientation, GR_TEXT_H_ALIGN_T aHJustify, GR_TEXT_V_ALIGN_T aVJustify) override
Create an object representing a text.
void AddShape(std::unique_ptr< IMPORTED_SHAPE > &aShape)
void AddLine(const VECTOR2D &aStart, const VECTOR2D &aEnd, double aWidth) override
Create an object representing a line segment.
Interface that creates objects representing shapes for a given data model.
std::vector< POLY_FILL_RULE > m_shapeFillRules
int GetParentShapeIndex() const
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
int PointCount() const
Return the number of points (vertices) in this line chain.
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
Represent a set of closed polygons.
static const SHAPE_POLY_SET BuildPolysetFromOrientedPaths(const std::vector< SHAPE_LINE_CHAIN > &aPaths, bool aReverseOrientation=false, bool aEvenOdd=false)
Build a SHAPE_POLY_SET from a bunch of outlines in provided in random order.
void Fracture(POLYGON_MODE aFastMode)
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
int OutlineCount() const
Return the number of outlines in the set.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
static std::unique_ptr< T > make_shape(const Args &... aArguments)
static void convertPolygon(std::list< std::unique_ptr< IMPORTED_SHAPE > > &aShapes, std::vector< IMPORTED_POLYGON * > &aPaths, GRAPHICS_IMPORTER::POLY_FILL_RULE aFillRule, double aWidth)
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
VECTOR2< double > VECTOR2D