33template <
typename T,
typename... Args>
34static std::unique_ptr<T>
make_shape(
const Args&... aArguments )
36 return std::make_unique<T>( aArguments... );
77 double aHeight,
double aWidth,
double aThickness,
82 aOrientation, aHJustify, aVJustify, aColor ) );
112 aEndAngle, aStroke ) );
119 if( aShape && aShape->GetSourceLayer().IsEmpty() )
122 m_shapes.push_back( std::move( aShape ) );
128 std::vector<wxString> sourceLayers;
130 for(
const std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
132 const wxString& sourceLayer = shape->GetSourceLayer();
134 if( sourceLayer.IsEmpty() )
137 if( std::find( sourceLayers.begin(), sourceLayers.end(), sourceLayer ) == sourceLayers.end() )
138 sourceLayers.push_back( sourceLayer );
149 for( std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
154 BOX2D box = shape->GetBoundingBox();
170 > std::numeric_limits<int>::max()
172 > std::numeric_limits<int>::max() )
174 double scale_factor = std::numeric_limits<int>::max() /
176 double max_scale = std::max( scale_factor /
boundingBox.GetSize().x,
178 aImporter.
ReportMsg( wxString::Format(
_(
"Imported graphic is too large. Maximum scale is %f" ),
188 if(
boundingBox.GetRight() * iuFactor > std::numeric_limits<int>::max()
189 ||
boundingBox.GetBottom() * iuFactor > std::numeric_limits<int>::max()
190 ||
boundingBox.GetLeft() * iuFactor < std::numeric_limits<int>::min()
191 ||
boundingBox.GetTop() * iuFactor < std::numeric_limits<int>::min() )
208 bool needsAdjustment =
false;
210 if( max_offset_x >= std::numeric_limits<int>::max() )
212 newOffset.
x -= ( max_offset_x - std::numeric_limits<int>::max() + 100.0 ) / total_scale_x;
213 needsAdjustment =
true;
215 else if( min_offset_x <= std::numeric_limits<int>::min() )
217 newOffset.
x -= ( min_offset_x - std::numeric_limits<int>::min() - 100 ) / total_scale_x;
218 needsAdjustment =
true;
221 if( max_offset_y >= std::numeric_limits<int>::max() )
223 newOffset.
y -= ( max_offset_y - std::numeric_limits<int>::max() + 100 ) / total_scale_y;
224 needsAdjustment =
true;
226 else if( min_offset_y <= std::numeric_limits<int>::min() )
228 newOffset.
y -= ( min_offset_y - std::numeric_limits<int>::min() - 100 ) / total_scale_y;
229 needsAdjustment =
true;
232 if( needsAdjustment )
234 aImporter.
ReportMsg( wxString::Format(
_(
"Import offset adjusted to (%f, %f) to fit "
235 "within numeric limits" ),
236 newOffset.
x, newOffset.
y ) );
241 for( std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
247 shape->ImportTo( aImporter );
256 std::vector<IMPORTED_POLYGON*>& aPaths,
261 double minX = std::numeric_limits<double>::max();
263 double maxX = std::numeric_limits<double>::min();
268 const double convert_scale = 1000000000.0;
274 minX = std::min( minX, v.x );
275 minY = std::min( minY, v.y );
276 maxX = std::max( maxX, v.x );
277 maxY = std::max( maxY, v.y );
281 double origW = ( maxX - minX );
282 double origH = ( maxY - minY );
283 double upscaledW, upscaledH;
285 wxCHECK( origH && origW, );
289 upscaledW = convert_scale;
290 upscaledH = ( origH == 0.0f ? 0.0 : origH * convert_scale / origW );
294 upscaledH = convert_scale;
295 upscaledW = ( origW == 0.0f ? 0.0 : origW * convert_scale / origH );
298 std::vector<IMPORTED_POLYGON*> openPaths;
299 std::vector<SHAPE_LINE_CHAIN> upscaledPaths;
303 if(
path->Vertices().size() < 3 )
305 openPaths.push_back(
path );
313 int xp =
KiROUND( ( v.x - minX ) * ( upscaledW / origW ) );
314 int yp =
KiROUND( ( v.y - minY ) * ( upscaledH / origH ) );
319 upscaledPaths.push_back( lc );
323 result.BuildPolysetFromOrientedPaths( upscaledPaths,
327 for(
int outl = 0; outl <
result.OutlineCount(); outl++ )
330 std::vector<VECTOR2D> pts;
334 double xp = (double) ro.
CPoint( i ).
x * ( origW / upscaledW ) + minX;
335 double yp = (double) ro.
CPoint( i ).
y * ( origH / upscaledH ) + minY;
336 pts.emplace_back(
VECTOR2D( xp, yp ) );
339 aShapes.push_back( std::make_unique<IMPORTED_POLYGON>( pts, aStroke, aFilled, aFillColor ) );
343 aShapes.push_back( std::make_unique<IMPORTED_POLYGON>( *openPath ) );
349 int curShapeIdx = -1;
351 bool lastFilled =
false;
354 std::list<std::unique_ptr<IMPORTED_SHAPE>> newShapes;
355 std::vector<IMPORTED_POLYGON*> polypaths;
357 for( std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
363 newShapes.push_back( shape->clone() );
369 if(
index != curShapeIdx && curShapeIdx >= 0 )
372 lastFilled, lastFillColor );
381 polypaths.push_back( poly );
384 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)
std::vector< wxString > GetSourceLayers() const
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)
wxString m_currentSourceLayer
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
virtual void SetCurrentSourceLayer(const wxString &)
Set the source layer for the next buffered shape to be imported.
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.
virtual bool CanImportSourceLayer(const wxString &) const
Return true if shapes from a given source layer should be imported.
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