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 ) );
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() /
124 double max_scale = std::max( scale_factor /
boundingBox.GetSize().x,
126 aImporter.
ReportMsg( wxString::Format(
_(
"Imported graphic is too large. Maximum scale is %f" ),
136 if(
boundingBox.GetRight() * iuFactor > std::numeric_limits<int>::max()
137 ||
boundingBox.GetBottom() * iuFactor > std::numeric_limits<int>::max()
138 ||
boundingBox.GetLeft() * iuFactor < std::numeric_limits<int>::min()
139 ||
boundingBox.GetTop() * iuFactor < std::numeric_limits<int>::min() )
156 bool needsAdjustment =
false;
158 if( max_offset_x >= std::numeric_limits<int>::max() )
160 newOffset.
x -= ( max_offset_x - std::numeric_limits<int>::max() + 100.0 ) / total_scale_x;
161 needsAdjustment =
true;
163 else if( min_offset_x <= std::numeric_limits<int>::min() )
165 newOffset.
x -= ( min_offset_x - std::numeric_limits<int>::min() - 100 ) / total_scale_x;
166 needsAdjustment =
true;
169 if( max_offset_y >= std::numeric_limits<int>::max() )
171 newOffset.
y -= ( max_offset_y - std::numeric_limits<int>::max() + 100 ) / total_scale_y;
172 needsAdjustment =
true;
174 else if( min_offset_y <= std::numeric_limits<int>::min() )
176 newOffset.
y -= ( min_offset_y - std::numeric_limits<int>::min() - 100 ) / total_scale_y;
177 needsAdjustment =
true;
180 if( needsAdjustment )
182 aImporter.
ReportMsg( wxString::Format(
_(
"Import offset adjusted to (%f, %f) to fit "
183 "within numeric limits" ),
184 newOffset.
x, newOffset.
y ) );
189 for( std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
190 shape->ImportTo( aImporter );
196 std::vector<IMPORTED_POLYGON*>& aPaths,
201 double minX = std::numeric_limits<double>::max();
203 double maxX = std::numeric_limits<double>::min();
208 const double convert_scale = 1000000000.0;
214 minX = std::min( minX, v.x );
215 minY = std::min( minY, v.y );
216 maxX = std::max( maxX, v.x );
217 maxY = std::max( maxY, v.y );
221 double origW = ( maxX - minX );
222 double origH = ( maxY - minY );
223 double upscaledW, upscaledH;
225 wxCHECK( origH && origW, );
229 upscaledW = convert_scale;
230 upscaledH = ( origH == 0.0f ? 0.0 : origH * convert_scale / origW );
234 upscaledH = convert_scale;
235 upscaledW = ( origW == 0.0f ? 0.0 : origW * convert_scale / origH );
238 std::vector<IMPORTED_POLYGON*> openPaths;
239 std::vector<SHAPE_LINE_CHAIN> upscaledPaths;
243 if(
path->Vertices().size() < 3 )
245 openPaths.push_back(
path );
253 int xp =
KiROUND( ( v.x - minX ) * ( upscaledW / origW ) );
254 int yp =
KiROUND( ( v.y - minY ) * ( upscaledH / origH ) );
259 upscaledPaths.push_back( lc );
263 result.BuildPolysetFromOrientedPaths( upscaledPaths,
267 for(
int outl = 0; outl <
result.OutlineCount(); outl++ )
270 std::vector<VECTOR2D> pts;
274 double xp = (double) ro.
CPoint( i ).
x * ( origW / upscaledW ) + minX;
275 double yp = (double) ro.
CPoint( i ).
y * ( origH / upscaledH ) + minY;
276 pts.emplace_back(
VECTOR2D( xp, yp ) );
279 aShapes.push_back( std::make_unique<IMPORTED_POLYGON>( pts, aStroke, aFilled, aFillColor ) );
283 aShapes.push_back( std::make_unique<IMPORTED_POLYGON>( *openPath ) );
289 int curShapeIdx = -1;
291 bool lastFilled =
false;
294 std::list<std::unique_ptr<IMPORTED_SHAPE>> newShapes;
295 std::vector<IMPORTED_POLYGON*> polypaths;
297 for( std::unique_ptr<IMPORTED_SHAPE>& shape :
m_shapes )
303 newShapes.push_back( shape->clone() );
309 if(
index != curShapeIdx && curShapeIdx >= 0 )
312 lastFilled, lastFillColor );
321 polypaths.push_back( poly );
324 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 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.
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