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" ),
 
  134        if( 
boundingBox.GetRight() > std::numeric_limits<int>::max()
 
  135            || 
boundingBox.GetBottom() > std::numeric_limits<int>::max()
 
  136            || 
boundingBox.GetLeft() < std::numeric_limits<int>::min()
 
  137            || 
boundingBox.GetTop() < std::numeric_limits<int>::min() )
 
  154        bool needsAdjustment = 
false;
 
  156        if( max_offset_x >= std::numeric_limits<int>::max() )
 
  158            newOffset.
x -= ( max_offset_x - std::numeric_limits<int>::max() + 100.0 ) / total_scale_x;
 
  159            needsAdjustment = 
true;
 
  161        else if( min_offset_x <= std::numeric_limits<int>::min() )
 
  163            newOffset.
x -= ( min_offset_x - std::numeric_limits<int>::min() - 100 ) / total_scale_x;
 
  164            needsAdjustment = 
true;
 
  167        if( max_offset_y >= std::numeric_limits<int>::max() )
 
  169            newOffset.
y -= ( max_offset_y - std::numeric_limits<int>::max() + 100 ) / total_scale_y;
 
  170            needsAdjustment = 
true;
 
  172        else if( min_offset_y <= std::numeric_limits<int>::min() )
 
  174            newOffset.
y -= ( min_offset_y - std::numeric_limits<int>::min() - 100 ) / total_scale_y;
 
  175            needsAdjustment = 
true;
 
  178        if( needsAdjustment )
 
  180            aImporter.
ReportMsg( wxString::Format( 
_( 
"Import offset adjusted to (%f, %f) to fit " 
  181                                                      "within numeric limits" ),
 
  182                                                   newOffset.
x, newOffset.
y ) );
 
  187    for( std::unique_ptr<IMPORTED_SHAPE>& shape : 
m_shapes )
 
  188        shape->ImportTo( aImporter );
 
 
  194                            std::vector<IMPORTED_POLYGON*>&             aPaths,
 
  199    double minX = std::numeric_limits<double>::max();
 
  201    double maxX = std::numeric_limits<double>::min();
 
  206    const double convert_scale = 1000000000.0;
 
  212            minX = std::min( minX, v.x );
 
  213            minY = std::min( minY, v.y );
 
  214            maxX = std::max( maxX, v.x );
 
  215            maxY = std::max( maxY, v.y );
 
  219    double origW = ( maxX - minX );
 
  220    double origH = ( maxY - minY );
 
  221    double upscaledW, upscaledH;
 
  223    wxCHECK( origH && origW,  );
 
  227        upscaledW = convert_scale;
 
  228        upscaledH = ( origH == 0.0f ? 0.0 : origH * convert_scale / origW );
 
  232        upscaledH = convert_scale;
 
  233        upscaledW = ( origW == 0.0f ? 0.0 : origW * convert_scale / origH );
 
  236    std::vector<IMPORTED_POLYGON*> openPaths;
 
  237    std::vector<SHAPE_LINE_CHAIN>  upscaledPaths;
 
  241        if( 
path->Vertices().size() < 3 )
 
  243            openPaths.push_back( 
path );
 
  251            int xp = 
KiROUND( ( v.x - minX ) * ( upscaledW / origW ) );
 
  252            int yp = 
KiROUND( ( v.y - minY ) * ( upscaledH / origH ) );
 
  257        upscaledPaths.push_back( lc );
 
  261    result.BuildPolysetFromOrientedPaths( upscaledPaths,
 
  265    for( 
int outl = 0; outl < 
result.OutlineCount(); outl++ )
 
  268        std::vector<VECTOR2D>   pts;
 
  272            double xp = (double) ro.
CPoint( i ).
x * ( origW / upscaledW ) + minX;
 
  273            double yp = (double) ro.
CPoint( i ).
y * ( origH / upscaledH ) + minY;
 
  274            pts.emplace_back( 
VECTOR2D( xp, yp ) );
 
  277        aShapes.push_back( std::make_unique<IMPORTED_POLYGON>( pts, aStroke, aFilled, aFillColor ) );
 
  281        aShapes.push_back( std::make_unique<IMPORTED_POLYGON>( *openPath ) );
 
 
  287    int             curShapeIdx = -1;
 
  289    bool            lastFilled = 
false;
 
  292    std::list<std::unique_ptr<IMPORTED_SHAPE>> newShapes;
 
  293    std::vector<IMPORTED_POLYGON*>             polypaths;
 
  295    for( std::unique_ptr<IMPORTED_SHAPE>& shape : 
m_shapes )
 
  301            newShapes.push_back( shape->clone() );
 
  307        if( index != curShapeIdx && curShapeIdx >= 0 )
 
  310                            lastFilled, lastFillColor );
 
  319        polypaths.push_back( poly );
 
  322    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