35template <
typename T,
typename... Args>
36static std::unique_ptr<T>
make_shape(
const Args&... aArguments )
38 return std::make_unique<T>( aArguments... );
75 double aHeight,
double aWidth,
double aThickness,
80 aOrientation, aHJustify, aVJustify, aColor ) );
107 aEndAngle, aStroke ) );
113 m_shapes.push_back( std::move( aShape ) );
121 for( std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
123 BOX2D box = shape->GetBoundingBox();
136 > std::numeric_limits<int>::max()
138 > std::numeric_limits<int>::max() )
140 double scale_factor = std::numeric_limits<int>::max() /
142 double max_scale = std::max( scale_factor /
boundingBox.GetSize().x,
144 aImporter.
ReportMsg( wxString::Format(
_(
"Imported graphic is too large. Maximum scale is %f" ),
154 if(
boundingBox.GetRight() * iuFactor > std::numeric_limits<int>::max()
155 ||
boundingBox.GetBottom() * iuFactor > std::numeric_limits<int>::max()
156 ||
boundingBox.GetLeft() * iuFactor < std::numeric_limits<int>::min()
157 ||
boundingBox.GetTop() * iuFactor < std::numeric_limits<int>::min() )
174 bool needsAdjustment =
false;
176 if( max_offset_x >= std::numeric_limits<int>::max() )
178 newOffset.
x -= ( max_offset_x - std::numeric_limits<int>::max() + 100.0 ) / total_scale_x;
179 needsAdjustment =
true;
181 else if( min_offset_x <= std::numeric_limits<int>::min() )
183 newOffset.
x -= ( min_offset_x - std::numeric_limits<int>::min() - 100 ) / total_scale_x;
184 needsAdjustment =
true;
187 if( max_offset_y >= std::numeric_limits<int>::max() )
189 newOffset.
y -= ( max_offset_y - std::numeric_limits<int>::max() + 100 ) / total_scale_y;
190 needsAdjustment =
true;
192 else if( min_offset_y <= std::numeric_limits<int>::min() )
194 newOffset.
y -= ( min_offset_y - std::numeric_limits<int>::min() - 100 ) / total_scale_y;
195 needsAdjustment =
true;
198 if( needsAdjustment )
200 aImporter.
ReportMsg( wxString::Format(
_(
"Import offset adjusted to (%f, %f) to fit "
201 "within numeric limits" ),
202 newOffset.
x, newOffset.
y ) );
207 for( std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
208 shape->ImportTo( aImporter );
214 std::vector<IMPORTED_POLYGON*>& aPaths,
219 double minX = std::numeric_limits<double>::max();
221 double maxX = std::numeric_limits<double>::min();
226 const double convert_scale = 1000000000.0;
232 minX = std::min( minX, v.x );
233 minY = std::min( minY, v.y );
234 maxX = std::max( maxX, v.x );
235 maxY = std::max( maxY, v.y );
239 double origW = ( maxX - minX );
240 double origH = ( maxY - minY );
241 double upscaledW, upscaledH;
243 wxCHECK( origH && origW, );
247 upscaledW = convert_scale;
248 upscaledH = ( origH == 0.0f ? 0.0 : origH * convert_scale / origW );
252 upscaledH = convert_scale;
253 upscaledW = ( origW == 0.0f ? 0.0 : origW * convert_scale / origH );
256 std::vector<IMPORTED_POLYGON*> openPaths;
257 std::vector<SHAPE_LINE_CHAIN> upscaledPaths;
261 if(
path->Vertices().size() < 3 )
263 openPaths.push_back(
path );
271 int xp =
KiROUND( ( v.x - minX ) * ( upscaledW / origW ) );
272 int yp =
KiROUND( ( v.y - minY ) * ( upscaledH / origH ) );
277 upscaledPaths.push_back( lc );
281 result.BuildPolysetFromOrientedPaths( upscaledPaths,
285 for(
int outl = 0; outl <
result.OutlineCount(); outl++ )
288 std::vector<VECTOR2D> pts;
292 double xp = (double) ro.
CPoint( i ).
x * ( origW / upscaledW ) + minX;
293 double yp = (double) ro.
CPoint( i ).
y * ( origH / upscaledH ) + minY;
294 pts.emplace_back(
VECTOR2D( xp, yp ) );
297 aShapes.push_back( std::make_unique<IMPORTED_POLYGON>( pts, aStroke, aFilled, aFillColor ) );
301 aShapes.push_back( std::make_unique<IMPORTED_POLYGON>( *openPath ) );
307 int curShapeIdx = -1;
309 bool lastFilled =
false;
312 std::list<std::unique_ptr<IMPORTED_SHAPE>> newShapes;
313 std::vector<IMPORTED_POLYGON*> polypaths;
315 for( std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
321 newShapes.push_back( shape->clone() );
327 if(
index != curShapeIdx && curShapeIdx >= 0 )
330 lastFilled, lastFillColor );
339 polypaths.push_back( poly );
342 if( curShapeIdx >= 0 )
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
constexpr bool IsValid() const
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
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 AddEllipse(const VECTOR2D &aCenter, double aMajorRadius, double aMinorRadius, const EDA_ANGLE &aRotation, const IMPORTED_STROKE &aStroke, bool aFilled, const COLOR4D &aFillColor=COLOR4D::UNSPECIFIED) override
Create an object representing a closed ellipse.
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.
void AddEllipseArc(const VECTOR2D &aCenter, double aMajorRadius, double aMinorRadius, const EDA_ANGLE &aRotation, const EDA_ANGLE &aStartAngle, const EDA_ANGLE &aEndAngle, const IMPORTED_STROKE &aStroke) override
Create an object representing an elliptical arc.
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.
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.
wxString result
Test unit parsing edge cases and error handling.
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