35template <
typename T,
typename... Args>
36static std::unique_ptr<T>
make_shape(
const Args&... aArguments )
38 return std::make_unique<T>( aArguments... );
44 m_shapes.push_back( make_shape<IMPORTED_LINE>( aStart, aEnd, aStroke ) );
53 make_shape<IMPORTED_CIRCLE>( aCenter, aRadius, aStroke, aFilled, aFillColor ) );
60 m_shapes.push_back( make_shape<IMPORTED_ARC>( aCenter, aStart, aAngle, aStroke ) );
68 m_shapes.push_back( make_shape<IMPORTED_POLYGON>( aVertices, aStroke, aFilled, aFillColor ) );
75 double aHeight,
double aWidth,
double aThickness,
79 m_shapes.push_back( make_shape<IMPORTED_TEXT>( aOrigin, aText, aHeight, aWidth, aThickness,
80 aOrientation, aHJustify, aVJustify, aColor ) );
88 m_shapes.push_back( make_shape<IMPORTED_SPLINE>( aStart, aBezierControl1, aBezierControl2, aEnd,
95 m_shapes.push_back( std::move( aShape ) );
103 for( std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
105 BOX2D box = shape->GetBoundingBox();
118 > std::numeric_limits<int>::max()
120 > std::numeric_limits<int>::max() )
122 double scale_factor = std::numeric_limits<int>::max() /
126 aImporter.
ReportMsg( wxString::Format(
_(
"Imported graphic is too large. Maximum scale "
149 double max_offset_x =
151 double max_offset_y =
153 double min_offset_x =
155 double min_offset_y =
159 bool needsAdjustment =
false;
161 if( max_offset_x >= std::numeric_limits<int>::max() )
163 newOffset.
x -= ( max_offset_x - std::numeric_limits<int>::max() + 100.0 ) /
165 needsAdjustment =
true;
167 else if( min_offset_x <= std::numeric_limits<int>::min() )
169 newOffset.
x -= ( min_offset_x - std::numeric_limits<int>::min() - 100 ) / total_scale_x;
170 needsAdjustment =
true;
173 if( max_offset_y >= std::numeric_limits<int>::max() )
175 newOffset.
y -= ( max_offset_y - std::numeric_limits<int>::max() + 100 ) / total_scale_y;
176 needsAdjustment =
true;
178 else if( min_offset_y <= std::numeric_limits<int>::min() )
180 newOffset.
y -= ( min_offset_y - std::numeric_limits<int>::min() - 100 ) / total_scale_y;
181 needsAdjustment =
true;
184 if( needsAdjustment )
186 aImporter.
ReportMsg( wxString::Format(
_(
"Import offset adjusted to (%f, %f) to fit "
187 "within numeric limits" ),
188 newOffset.
x, newOffset.
y ) );
193 for( std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
194 shape->ImportTo( aImporter );
200 std::vector<IMPORTED_POLYGON*>& aPaths,
205 double minX = std::numeric_limits<double>::max();
207 double maxX = std::numeric_limits<double>::min();
212 const double convert_scale = 1000000000.0;
218 minX = std::min( minX, v.x );
219 minY = std::min( minY, v.y );
220 maxX = std::max( maxX, v.x );
221 maxY = std::max( maxY, v.y );
225 double origW = ( maxX - minX );
226 double origH = ( maxY - minY );
227 double upscaledW, upscaledH;
231 upscaledW = convert_scale;
232 upscaledH = ( origH == 0.0f ? 0.0 : origH * convert_scale / origW );
236 upscaledH = convert_scale;
237 upscaledW = ( origW == 0.0f ? 0.0 : origW * convert_scale / origH );
240 std::vector<IMPORTED_POLYGON*> openPaths;
241 std::vector<SHAPE_LINE_CHAIN> upscaledPaths;
245 if(
path->Vertices().size() < 3 )
247 openPaths.push_back(
path );
255 int xp =
KiROUND( ( v.x - minX ) * ( upscaledW / origW ) );
256 int yp =
KiROUND( ( v.y - minY ) * ( upscaledH / origH ) );
260 upscaledPaths.push_back( lc );
268 for(
int outl = 0; outl < result.
OutlineCount(); outl++ )
271 std::vector<VECTOR2D> pts;
275 double xp = (double) ro.
CPoint( i ).
x * ( origW / upscaledW ) + minX;
276 double yp = (double) ro.
CPoint( i ).
y * ( origH / upscaledH ) + minY;
277 pts.emplace_back(
VECTOR2D( xp, yp ) );
281 std::make_unique<IMPORTED_POLYGON>( pts, aStroke, aFilled, aFillColor ) );
285 aShapes.push_back( std::make_unique<IMPORTED_POLYGON>( *openPath ) );
291 int curShapeIdx = -1;
293 bool lastFilled =
false;
294 COLOR4D lastFillColor = COLOR4D::UNSPECIFIED;
296 std::list<std::unique_ptr<IMPORTED_SHAPE>> newShapes;
297 std::vector<IMPORTED_POLYGON*> polypaths;
299 for( std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
305 newShapes.push_back( shape->clone() );
311 if( index != curShapeIdx && curShapeIdx >= 0 )
314 lastFilled, lastFillColor );
323 polypaths.push_back( poly );
326 if( curShapeIdx >= 0 )
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
constexpr const Vec & GetPosition() const
constexpr void SetOrigin(const Vec &pos)
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr void SetSize(const SizeVec &size)
constexpr coord_type GetLeft() const
constexpr const Vec & GetOrigin() const
constexpr bool IsValid() const
constexpr coord_type GetRight() const
constexpr const SizeVec & GetSize() const
constexpr coord_type GetTop() const
constexpr coord_type GetBottom() const
void AddCircle(const VECTOR2D &aCenter, double aRadius, const IMPORTED_STROKE &aStroke, bool aFilled, const COLOR4D &aFillColor=COLOR4D::UNSPECIFIED) override
Create an object representing a circle.
void AddSpline(const VECTOR2D &aStart, const VECTOR2D &aBezierControl1, const VECTOR2D &aBezierControl2, const VECTOR2D &aEnd, const IMPORTED_STROKE &aStroke) override
Create an object representing an arc.
void AddLine(const VECTOR2D &aStart, const VECTOR2D &aEnd, const IMPORTED_STROKE &aStroke) override
Create an object representing a line segment.
void PostprocessNestedPolygons()
void ImportTo(GRAPHICS_IMPORTER &aImporter)
void AddArc(const VECTOR2D &aCenter, const VECTOR2D &aStart, const EDA_ANGLE &aAngle, const IMPORTED_STROKE &aStroke) override
Create an object representing an arc.
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, const COLOR4D &aColor=COLOR4D::UNSPECIFIED) override
Create an object representing a text.
std::list< std::unique_ptr< IMPORTED_SHAPE > > m_shapes
List of imported shapes.
void AddShape(std::unique_ptr< IMPORTED_SHAPE > &aShape)
void AddPolygon(const std::vector< VECTOR2D > &aVertices, const IMPORTED_STROKE &aStroke, bool aFilled, const COLOR4D &aFillColor=COLOR4D::UNSPECIFIED) override
Create an object representing a polygon.
Interface that creates objects representing shapes for a given data model.
std::vector< POLY_FILL_RULE > m_shapeFillRules
void ReportMsg(const wxString &aMessage)
VECTOR2D GetScale() const
double GetMillimeterToIuFactor()
void SetImportOffsetMM(const VECTOR2D &aOffset)
Set the offset in millimeters to add to coordinates when importing graphic items.
const VECTOR2D & GetImportOffsetMM() const
const IMPORTED_STROKE & GetStroke() const
const COLOR4D & GetFillColor() const
int GetParentShapeIndex() const
A clone of IMPORTED_STROKE, but with floating-point width.
A color representation with 4 components: red, green, blue, alpha.
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.
void Fracture()
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
void BuildPolysetFromOrientedPaths(const std::vector< SHAPE_LINE_CHAIN > &aPaths, bool aEvenOdd=false)
Build a SHAPE_POLY_SET from a bunch of outlines in provided in random order.
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, const IMPORTED_STROKE &aStroke, bool aFilled, const COLOR4D &aFillColor)
BOX2I boundingBox(T aObject, int aLayer)
Used by SHAPE_INDEX to get the bounding box of a generic T object.
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
GR_TEXT_V_ALIGN_T
This is API surface mapped to common.types.VertialAlignment.
VECTOR2< double > VECTOR2D