Graphics import improvements/fixes:
- add support for color - support non-uniform scale - add GetImageBBox() - fix SVG GetImageWidth/Height not being in mm - fix import offset not being in mm - add graphics importer for LIB_SYMBOL
This commit is contained in:
parent
4e43d4e0db
commit
5131dae568
|
@ -178,6 +178,16 @@ double DXF_IMPORT_PLUGIN::GetImageHeight() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOX2D DXF_IMPORT_PLUGIN::GetImageBBox() const
|
||||||
|
{
|
||||||
|
BOX2D bbox;
|
||||||
|
bbox.SetOrigin( m_minX, m_minY );
|
||||||
|
bbox.SetEnd( m_maxX, m_maxY );
|
||||||
|
|
||||||
|
return bbox;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void DXF_IMPORT_PLUGIN::SetImporter( GRAPHICS_IMPORTER* aImporter )
|
void DXF_IMPORT_PLUGIN::SetImporter( GRAPHICS_IMPORTER* aImporter )
|
||||||
{
|
{
|
||||||
GRAPHICS_IMPORT_PLUGIN::SetImporter( aImporter );
|
GRAPHICS_IMPORT_PLUGIN::SetImporter( aImporter );
|
||||||
|
|
|
@ -236,6 +236,7 @@ public:
|
||||||
|
|
||||||
double GetImageWidth() const override;
|
double GetImageWidth() const override;
|
||||||
double GetImageHeight() const override;
|
double GetImageHeight() const override;
|
||||||
|
BOX2D GetImageBBox() const override;
|
||||||
|
|
||||||
void updateImageLimits( const VECTOR2D& aPoint );
|
void updateImageLimits( const VECTOR2D& aPoint );
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#ifndef GRAPHICS_IMPORT_PLUGIN_H
|
#ifndef GRAPHICS_IMPORT_PLUGIN_H
|
||||||
#define GRAPHICS_IMPORT_PLUGIN_H
|
#define GRAPHICS_IMPORT_PLUGIN_H
|
||||||
|
|
||||||
|
#include <math/box2.h>
|
||||||
#include <wildcards_and_files_ext.h>
|
#include <wildcards_and_files_ext.h>
|
||||||
#include <wx/arrstr.h>
|
#include <wx/arrstr.h>
|
||||||
|
|
||||||
|
@ -112,6 +113,13 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual double GetImageWidth() const = 0;
|
virtual double GetImageWidth() const = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return image bounding box from original imported file.
|
||||||
|
*
|
||||||
|
* @return Image bounding box.
|
||||||
|
*/
|
||||||
|
virtual BOX2D GetImageBBox() const = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Actually imports the file.
|
* Actually imports the file.
|
||||||
*
|
*
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
* This program source code file is part of KICAD, a free EDA CAD application.
|
* This program source code file is part of KICAD, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016 CERN
|
* Copyright (C) 2016 CERN
|
||||||
|
* Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
|
*
|
||||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
@ -30,13 +32,13 @@ GRAPHICS_IMPORTER::GRAPHICS_IMPORTER()
|
||||||
{
|
{
|
||||||
m_millimeterToIu = 1.0;
|
m_millimeterToIu = 1.0;
|
||||||
m_lineWidth = DEFAULT_LINE_WIDTH_DFX;
|
m_lineWidth = DEFAULT_LINE_WIDTH_DFX;
|
||||||
m_scale = 1.0;
|
m_scale = VECTOR2D( 1.0, 1.0 );
|
||||||
m_originalWidth = 0.0;
|
m_originalWidth = 0.0;
|
||||||
m_originalHeight = 0.0;
|
m_originalHeight = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool GRAPHICS_IMPORTER::Load( const wxString &aFileName )
|
bool GRAPHICS_IMPORTER::Load( const wxString& aFileName )
|
||||||
{
|
{
|
||||||
m_items.clear();
|
m_items.clear();
|
||||||
|
|
||||||
|
@ -48,10 +50,19 @@ bool GRAPHICS_IMPORTER::Load( const wxString &aFileName )
|
||||||
|
|
||||||
m_plugin->SetImporter( this );
|
m_plugin->SetImporter( this );
|
||||||
|
|
||||||
return m_plugin->Load( aFileName );
|
bool ret = m_plugin->Load( aFileName );
|
||||||
|
|
||||||
|
if( ret )
|
||||||
|
{
|
||||||
|
m_originalWidth = m_plugin->GetImageWidth();
|
||||||
|
m_originalHeight = m_plugin->GetImageHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GRAPHICS_IMPORTER::Import( double aScale )
|
|
||||||
|
bool GRAPHICS_IMPORTER::Import( const VECTOR2D& aScale )
|
||||||
{
|
{
|
||||||
if( !m_plugin )
|
if( !m_plugin )
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KICAD, a free EDA CAD application.
|
* This program source code file is part of KICAD, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016 CERN
|
* Copyright (C) 2016 CERN
|
||||||
* Copyright (C) 2019-2022 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2019-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||||
*
|
*
|
||||||
|
@ -32,6 +32,7 @@
|
||||||
|
|
||||||
#include <eda_text.h>
|
#include <eda_text.h>
|
||||||
#include <math/vector2d.h>
|
#include <math/vector2d.h>
|
||||||
|
#include <gal/color4d.h>
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
@ -81,9 +82,9 @@ public:
|
||||||
* It is important to have the file loaded before importing.
|
* It is important to have the file loaded before importing.
|
||||||
*
|
*
|
||||||
* @param aScale allow import graphic items with a non 1:1 import ratio
|
* @param aScale allow import graphic items with a non 1:1 import ratio
|
||||||
* aScale = 1.0 to import graphics with their actual size.
|
* VECTOR2D( 1.0, 1.0 ) to import graphics with their actual size.
|
||||||
*/
|
*/
|
||||||
bool Import( double aScale = 1.0 );
|
bool Import( const VECTOR2D& aScale = VECTOR2D( 1.0, 1.0 ) );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Collect warning and error messages after loading/importing.
|
* Collect warning and error messages after loading/importing.
|
||||||
|
@ -134,7 +135,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* @return the scale factor affecting the imported shapes.
|
* @return the scale factor affecting the imported shapes.
|
||||||
*/
|
*/
|
||||||
double GetScale() const
|
VECTOR2D GetScale() const
|
||||||
{
|
{
|
||||||
return m_scale;
|
return m_scale;
|
||||||
}
|
}
|
||||||
|
@ -160,7 +161,7 @@ public:
|
||||||
*
|
*
|
||||||
* This allows conversion between imported shapes units and millimeters.
|
* This allows conversion between imported shapes units and millimeters.
|
||||||
*/
|
*/
|
||||||
void SetScale( double aScale )
|
void SetScale( const VECTOR2D& aScale )
|
||||||
{
|
{
|
||||||
m_scale = aScale;
|
m_scale = aScale;
|
||||||
}
|
}
|
||||||
|
@ -176,7 +177,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* @return the overall scale factor to convert the imported shapes dimension to mm.
|
* @return the overall scale factor to convert the imported shapes dimension to mm.
|
||||||
*/
|
*/
|
||||||
double ImportScalingFactor() const
|
VECTOR2D ImportScalingFactor() const
|
||||||
{
|
{
|
||||||
return m_scale * m_millimeterToIu;
|
return m_scale * m_millimeterToIu;
|
||||||
}
|
}
|
||||||
|
@ -208,8 +209,10 @@ public:
|
||||||
* @param aOrigin is the segment origin point expressed in mm.
|
* @param aOrigin is the segment origin point expressed in mm.
|
||||||
* @param aEnd is the segment end point expressed in mm.
|
* @param aEnd is the segment end point expressed in mm.
|
||||||
* @param aWidth is the segment thickness in mm. Use -1 for default line thickness
|
* @param aWidth is the segment thickness in mm. Use -1 for default line thickness
|
||||||
|
* @param aColor is the shape color
|
||||||
*/
|
*/
|
||||||
virtual void AddLine( const VECTOR2D& aOrigin, const VECTOR2D& aEnd, double aWidth ) = 0;
|
virtual void AddLine( const VECTOR2D& aOrigin, const VECTOR2D& aEnd, double aWidth,
|
||||||
|
const COLOR4D& aColor ) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an object representing a circle.
|
* Create an object representing a circle.
|
||||||
|
@ -217,9 +220,10 @@ public:
|
||||||
* @param aCenter is the circle center point expressed in mm.
|
* @param aCenter is the circle center point expressed in mm.
|
||||||
* @param aRadius is the circle radius expressed in mm.
|
* @param aRadius is the circle radius expressed in mm.
|
||||||
* @param aWidth is the segment thickness in mm. Use -1 for default line thickness
|
* @param aWidth is the segment thickness in mm. Use -1 for default line thickness
|
||||||
|
* @param aColor is the shape color
|
||||||
*/
|
*/
|
||||||
virtual void AddCircle( const VECTOR2D& aCenter, double aRadius, double aWidth,
|
virtual void AddCircle( const VECTOR2D& aCenter, double aRadius, double aWidth, bool aFilled,
|
||||||
bool aFilled ) = 0;
|
const COLOR4D& aColor ) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an object representing an arc.
|
* Create an object representing an arc.
|
||||||
|
@ -229,11 +233,13 @@ public:
|
||||||
* Its length is the arc radius.
|
* Its length is the arc radius.
|
||||||
* @param aAngle is the arc angle.
|
* @param aAngle is the arc angle.
|
||||||
* @param aWidth is the segment thickness in mm. Use -1 for default line thickness
|
* @param aWidth is the segment thickness in mm. Use -1 for default line thickness
|
||||||
|
* @param aColor is the shape color
|
||||||
*/
|
*/
|
||||||
virtual void AddArc( const VECTOR2D& aCenter, const VECTOR2D& aStart, const EDA_ANGLE& aAngle,
|
virtual void AddArc( const VECTOR2D& aCenter, const VECTOR2D& aStart, const EDA_ANGLE& aAngle,
|
||||||
double aWidth ) = 0;
|
double aWidth, const COLOR4D& aColor ) = 0;
|
||||||
|
|
||||||
virtual void AddPolygon( const std::vector< VECTOR2D >& aVertices, double aWidth ) = 0;
|
virtual void AddPolygon( const std::vector<VECTOR2D>& aVertices, double aWidth,
|
||||||
|
const COLOR4D& aColor ) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an object representing a text.
|
* Create an object representing a text.
|
||||||
|
@ -246,10 +252,12 @@ public:
|
||||||
* @param aHJustify is the text horizontal justification.
|
* @param aHJustify is the text horizontal justification.
|
||||||
* @param aVJustify is the text vertical justification.
|
* @param aVJustify is the text vertical justification.
|
||||||
* @param aWidth is the segment thickness in mm. Use -1 for default line thickness
|
* @param aWidth is the segment thickness in mm. Use -1 for default line thickness
|
||||||
|
* @param aColor is the shape color
|
||||||
*/
|
*/
|
||||||
virtual void AddText( const VECTOR2D& aOrigin, const wxString& aText, double aHeight,
|
virtual void AddText( const VECTOR2D& aOrigin, const wxString& aText, double aHeight,
|
||||||
double aWidth, double aThickness, double aOrientation,
|
double aWidth, double aThickness, double aOrientation,
|
||||||
GR_TEXT_H_ALIGN_T aHJustify, GR_TEXT_V_ALIGN_T aVJustify ) = 0;
|
GR_TEXT_H_ALIGN_T aHJustify, GR_TEXT_V_ALIGN_T aVJustify,
|
||||||
|
const COLOR4D& aColor ) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an object representing an arc.
|
* Create an object representing an arc.
|
||||||
|
@ -259,10 +267,11 @@ public:
|
||||||
* @param aBezierControl2 is the second Bezier control point expressed in mm.
|
* @param aBezierControl2 is the second Bezier control point expressed in mm.
|
||||||
* @param aEnd is the curve end point expressed in mm.
|
* @param aEnd is the curve end point expressed in mm.
|
||||||
* @param aWidth is the segment thickness in mm. Use -1 for default line thickness
|
* @param aWidth is the segment thickness in mm. Use -1 for default line thickness
|
||||||
|
* @param aColor is the shape color
|
||||||
*/
|
*/
|
||||||
virtual void AddSpline( const VECTOR2D& aStart, const VECTOR2D& aBezierControl1,
|
virtual void AddSpline( const VECTOR2D& aStart, const VECTOR2D& aBezierControl1,
|
||||||
const VECTOR2D& aBezierControl2, const VECTOR2D& aEnd,
|
const VECTOR2D& aBezierControl2, const VECTOR2D& aEnd, double aWidth,
|
||||||
double aWidth ) = 0;
|
const COLOR4D& aColor ) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
///< Add an item to the imported shapes list.
|
///< Add an item to the imported shapes list.
|
||||||
|
@ -297,7 +306,7 @@ private:
|
||||||
* 1.0 does not change the size of imported items
|
* 1.0 does not change the size of imported items
|
||||||
* scale < 1.0 reduce the size of imported items
|
* scale < 1.0 reduce the size of imported items
|
||||||
*/
|
*/
|
||||||
double m_scale;
|
VECTOR2D m_scale;
|
||||||
|
|
||||||
///< Default line thickness for the imported graphics
|
///< Default line thickness for the imported graphics
|
||||||
double m_lineWidth;
|
double m_lineWidth;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KICAD, a free EDA CAD application.
|
* This program source code file is part of KICAD, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2017 CERN
|
* Copyright (C) 2017 CERN
|
||||||
* Copyright (C) 2021-2022 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2021-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
* @author Janito Vaqueiro Ferreira Filho <janito.vff@gmail.com>
|
* @author Janito Vaqueiro Ferreira Filho <janito.vff@gmail.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
@ -38,28 +38,32 @@ static std::unique_ptr<T> make_shape( const Args&... aArguments )
|
||||||
return std::make_unique<T>( aArguments... );
|
return std::make_unique<T>( aArguments... );
|
||||||
}
|
}
|
||||||
|
|
||||||
void GRAPHICS_IMPORTER_BUFFER::AddLine( const VECTOR2D& aStart, const VECTOR2D& aEnd, double aWidth )
|
void GRAPHICS_IMPORTER_BUFFER::AddLine( const VECTOR2D& aStart, const VECTOR2D& aEnd, double aWidth,
|
||||||
|
const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
m_shapes.push_back( make_shape< IMPORTED_LINE >( aStart, aEnd, aWidth ) );
|
m_shapes.push_back( make_shape< IMPORTED_LINE >( aStart, aEnd, aWidth, aColor ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GRAPHICS_IMPORTER_BUFFER::AddCircle( const VECTOR2D& aCenter, double aRadius, double aWidth, bool aFilled )
|
void GRAPHICS_IMPORTER_BUFFER::AddCircle( const VECTOR2D& aCenter, double aRadius, double aWidth,
|
||||||
|
bool aFilled, const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
m_shapes.push_back( make_shape<IMPORTED_CIRCLE>( aCenter, aRadius, aWidth, aFilled ) );
|
m_shapes.push_back( make_shape<IMPORTED_CIRCLE>( aCenter, aRadius, aWidth, aFilled, aColor ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GRAPHICS_IMPORTER_BUFFER::AddArc( const VECTOR2D& aCenter, const VECTOR2D& aStart,
|
void GRAPHICS_IMPORTER_BUFFER::AddArc( const VECTOR2D& aCenter, const VECTOR2D& aStart,
|
||||||
const EDA_ANGLE& aAngle, double aWidth )
|
const EDA_ANGLE& aAngle, double aWidth,
|
||||||
|
const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
m_shapes.push_back( make_shape<IMPORTED_ARC>( aCenter, aStart, aAngle, aWidth ) );
|
m_shapes.push_back( make_shape<IMPORTED_ARC>( aCenter, aStart, aAngle, aWidth, aColor ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GRAPHICS_IMPORTER_BUFFER::AddPolygon( const std::vector< VECTOR2D >& aVertices, double aWidth )
|
void GRAPHICS_IMPORTER_BUFFER::AddPolygon( const std::vector<VECTOR2D>& aVertices, double aWidth,
|
||||||
|
const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
m_shapes.push_back( make_shape<IMPORTED_POLYGON>( aVertices, aWidth ) );
|
m_shapes.push_back( make_shape<IMPORTED_POLYGON>( aVertices, aWidth, aColor ) );
|
||||||
m_shapes.back()->SetParentShapeIndex( m_shapeFillRules.size() - 1 );
|
m_shapes.back()->SetParentShapeIndex( m_shapeFillRules.size() - 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,17 +71,18 @@ void GRAPHICS_IMPORTER_BUFFER::AddPolygon( const std::vector< VECTOR2D >& aVerti
|
||||||
void GRAPHICS_IMPORTER_BUFFER::AddText( const VECTOR2D& aOrigin, const wxString& aText,
|
void GRAPHICS_IMPORTER_BUFFER::AddText( const VECTOR2D& aOrigin, const wxString& aText,
|
||||||
double aHeight, double aWidth, double aThickness,
|
double aHeight, double aWidth, double aThickness,
|
||||||
double aOrientation, GR_TEXT_H_ALIGN_T aHJustify,
|
double aOrientation, GR_TEXT_H_ALIGN_T aHJustify,
|
||||||
GR_TEXT_V_ALIGN_T aVJustify )
|
GR_TEXT_V_ALIGN_T aVJustify, const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
m_shapes.push_back( make_shape< IMPORTED_TEXT >( aOrigin, aText, aHeight, aWidth,
|
m_shapes.push_back( make_shape< IMPORTED_TEXT >( aOrigin, aText, aHeight, aWidth,
|
||||||
aThickness, aOrientation, aHJustify, aVJustify ) );
|
aThickness, aOrientation, aHJustify, aVJustify, aColor ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GRAPHICS_IMPORTER_BUFFER::AddSpline( const VECTOR2D& aStart, const VECTOR2D& aBezierControl1,
|
void GRAPHICS_IMPORTER_BUFFER::AddSpline( const VECTOR2D& aStart, const VECTOR2D& aBezierControl1,
|
||||||
const VECTOR2D& aBezierControl2, const VECTOR2D& aEnd , double aWidth )
|
const VECTOR2D& aBezierControl2, const VECTOR2D& aEnd,
|
||||||
|
double aWidth, const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
m_shapes.push_back( make_shape<IMPORTED_SPLINE>( aStart, aBezierControl1, aBezierControl2, aEnd, aWidth ) );
|
m_shapes.push_back( make_shape<IMPORTED_SPLINE>( aStart, aBezierControl1, aBezierControl2, aEnd, aWidth, aColor ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -96,8 +101,8 @@ void GRAPHICS_IMPORTER_BUFFER::ImportTo( GRAPHICS_IMPORTER& aImporter )
|
||||||
// converts a single SVG-style polygon (multiple outlines, hole detection based on orientation, custom fill rule) to a format that can be digested by KiCad (single outline, fractured)
|
// converts a single SVG-style polygon (multiple outlines, hole detection based on orientation, custom fill rule) to a format that can be digested by KiCad (single outline, fractured)
|
||||||
static void convertPolygon( std::list<std::unique_ptr<IMPORTED_SHAPE>>& aShapes,
|
static void convertPolygon( std::list<std::unique_ptr<IMPORTED_SHAPE>>& aShapes,
|
||||||
std::vector<IMPORTED_POLYGON*>& aPaths,
|
std::vector<IMPORTED_POLYGON*>& aPaths,
|
||||||
GRAPHICS_IMPORTER::POLY_FILL_RULE aFillRule,
|
GRAPHICS_IMPORTER::POLY_FILL_RULE aFillRule, double aWidth,
|
||||||
double aWidth )
|
const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
double minX = std::numeric_limits<double>::max();
|
double minX = std::numeric_limits<double>::max();
|
||||||
double minY = minX;
|
double minY = minX;
|
||||||
|
@ -165,15 +170,16 @@ static void convertPolygon( std::list<std::unique_ptr<IMPORTED_SHAPE>>& aShapes,
|
||||||
pts.emplace_back( VECTOR2D( xp, yp ) );
|
pts.emplace_back( VECTOR2D( xp, yp ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
aShapes.push_back( std::make_unique<IMPORTED_POLYGON>( pts, aWidth ) );
|
aShapes.push_back( std::make_unique<IMPORTED_POLYGON>( pts, aWidth, aColor ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GRAPHICS_IMPORTER_BUFFER::PostprocessNestedPolygons()
|
void GRAPHICS_IMPORTER_BUFFER::PostprocessNestedPolygons()
|
||||||
{
|
{
|
||||||
int curShapeIdx = -1;
|
int curShapeIdx = -1;
|
||||||
double lastWidth = 0;
|
double lastWidth = 0;
|
||||||
|
COLOR4D lastColor = COLOR4D::UNSPECIFIED;
|
||||||
|
|
||||||
std::list<std::unique_ptr<IMPORTED_SHAPE>> newShapes;
|
std::list<std::unique_ptr<IMPORTED_SHAPE>> newShapes;
|
||||||
std::vector<IMPORTED_POLYGON*> polypaths;
|
std::vector<IMPORTED_POLYGON*> polypaths;
|
||||||
|
@ -192,17 +198,19 @@ void GRAPHICS_IMPORTER_BUFFER::PostprocessNestedPolygons()
|
||||||
|
|
||||||
if( index != curShapeIdx && curShapeIdx >= 0 )
|
if( index != curShapeIdx && curShapeIdx >= 0 )
|
||||||
{
|
{
|
||||||
convertPolygon( newShapes, polypaths, m_shapeFillRules[curShapeIdx], lastWidth );
|
convertPolygon( newShapes, polypaths, m_shapeFillRules[curShapeIdx], lastWidth,
|
||||||
|
lastColor );
|
||||||
polypaths.clear();
|
polypaths.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
curShapeIdx = index;
|
curShapeIdx = index;
|
||||||
lastWidth = poly->GetWidth();
|
lastWidth = poly->GetWidth();
|
||||||
|
lastColor = poly->GetColor();
|
||||||
polypaths.push_back( poly );
|
polypaths.push_back( poly );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( curShapeIdx >= 0 )
|
if( curShapeIdx >= 0 )
|
||||||
convertPolygon( newShapes, polypaths, m_shapeFillRules[curShapeIdx], lastWidth );
|
convertPolygon( newShapes, polypaths, m_shapeFillRules[curShapeIdx], lastWidth, lastColor );
|
||||||
|
|
||||||
m_shapes.swap( newShapes );
|
m_shapes.swap( newShapes );
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KICAD, a free EDA CAD application.
|
* This program source code file is part of KICAD, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2017 CERN
|
* Copyright (C) 2017 CERN
|
||||||
* Copyright (C) 2018-2022 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2018-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* @author Janito Vaqueiro Ferreira Filho <janito.vff@gmail.com>
|
* @author Janito Vaqueiro Ferreira Filho <janito.vff@gmail.com>
|
||||||
*
|
*
|
||||||
|
@ -53,16 +53,16 @@ protected:
|
||||||
class IMPORTED_LINE : public IMPORTED_SHAPE
|
class IMPORTED_LINE : public IMPORTED_SHAPE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
IMPORTED_LINE( const VECTOR2D& aStart, const VECTOR2D& aEnd, double aWidth ) :
|
IMPORTED_LINE( const VECTOR2D& aStart, const VECTOR2D& aEnd, double aWidth,
|
||||||
|
const COLOR4D& aColor ) :
|
||||||
m_start( aStart ),
|
m_start( aStart ),
|
||||||
m_end( aEnd ),
|
m_end( aEnd ), m_width( aWidth ), m_color( aColor )
|
||||||
m_width( aWidth )
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
|
void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
|
||||||
{
|
{
|
||||||
aImporter.AddLine( m_start, m_end, m_width );
|
aImporter.AddLine( m_start, m_end, m_width, m_color );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
|
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
|
||||||
|
@ -80,23 +80,23 @@ private:
|
||||||
VECTOR2D m_start;
|
VECTOR2D m_start;
|
||||||
VECTOR2D m_end;
|
VECTOR2D m_end;
|
||||||
double m_width;
|
double m_width;
|
||||||
|
COLOR4D m_color;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class IMPORTED_CIRCLE : public IMPORTED_SHAPE
|
class IMPORTED_CIRCLE : public IMPORTED_SHAPE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
IMPORTED_CIRCLE( const VECTOR2D& aCenter, double aRadius, double aWidth, bool aFilled ) :
|
IMPORTED_CIRCLE( const VECTOR2D& aCenter, double aRadius, double aWidth, bool aFilled,
|
||||||
|
const COLOR4D& aColor ) :
|
||||||
m_center( aCenter ),
|
m_center( aCenter ),
|
||||||
m_radius( aRadius ),
|
m_radius( aRadius ), m_width( aWidth ), m_filled( aFilled ), m_color( aColor )
|
||||||
m_width( aWidth ),
|
|
||||||
m_filled( aFilled )
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
|
void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
|
||||||
{
|
{
|
||||||
aImporter.AddCircle( m_center, m_radius, m_width, m_filled );
|
aImporter.AddCircle( m_center, m_radius, m_width, m_filled, m_color );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
|
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
|
||||||
|
@ -120,6 +120,7 @@ private:
|
||||||
double m_radius;
|
double m_radius;
|
||||||
double m_width;
|
double m_width;
|
||||||
bool m_filled;
|
bool m_filled;
|
||||||
|
COLOR4D m_color;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -127,17 +128,15 @@ class IMPORTED_ARC : public IMPORTED_SHAPE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
IMPORTED_ARC( const VECTOR2D& aCenter, const VECTOR2D& aStart, const EDA_ANGLE& aAngle,
|
IMPORTED_ARC( const VECTOR2D& aCenter, const VECTOR2D& aStart, const EDA_ANGLE& aAngle,
|
||||||
double aWidth ) :
|
double aWidth, const COLOR4D& aColor ) :
|
||||||
m_center( aCenter ),
|
m_center( aCenter ),
|
||||||
m_start( aStart ),
|
m_start( aStart ), m_angle( aAngle ), m_width( aWidth ), m_color( aColor )
|
||||||
m_angle( aAngle ),
|
|
||||||
m_width( aWidth )
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
|
void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
|
||||||
{
|
{
|
||||||
aImporter.AddArc( m_center, m_start, m_angle, m_width );
|
aImporter.AddArc( m_center, m_start, m_angle, m_width, m_color );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
|
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
|
||||||
|
@ -156,21 +155,23 @@ private:
|
||||||
VECTOR2D m_start;
|
VECTOR2D m_start;
|
||||||
EDA_ANGLE m_angle;
|
EDA_ANGLE m_angle;
|
||||||
double m_width;
|
double m_width;
|
||||||
|
COLOR4D m_color;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class IMPORTED_POLYGON : public IMPORTED_SHAPE
|
class IMPORTED_POLYGON : public IMPORTED_SHAPE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
IMPORTED_POLYGON( const std::vector< VECTOR2D >& aVertices, double aWidth ) :
|
IMPORTED_POLYGON( const std::vector<VECTOR2D>& aVertices, double aWidth,
|
||||||
|
const COLOR4D& aColor ) :
|
||||||
m_vertices( aVertices ),
|
m_vertices( aVertices ),
|
||||||
m_width( aWidth )
|
m_width( aWidth ), m_color( aColor )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
|
void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
|
||||||
{
|
{
|
||||||
aImporter.AddPolygon( m_vertices, m_width );
|
aImporter.AddPolygon( m_vertices, m_width, m_color );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
|
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
|
||||||
|
@ -190,9 +191,12 @@ public:
|
||||||
|
|
||||||
double GetWidth() const { return m_width; }
|
double GetWidth() const { return m_width; }
|
||||||
|
|
||||||
|
const COLOR4D& GetColor() const { return m_color; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<VECTOR2D> m_vertices;
|
std::vector<VECTOR2D> m_vertices;
|
||||||
double m_width;
|
double m_width;
|
||||||
|
COLOR4D m_color;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -201,22 +205,18 @@ class IMPORTED_TEXT : public IMPORTED_SHAPE
|
||||||
public:
|
public:
|
||||||
IMPORTED_TEXT( const VECTOR2D& aOrigin, const wxString& aText, double aHeight, double aWidth,
|
IMPORTED_TEXT( const VECTOR2D& aOrigin, const wxString& aText, double aHeight, double aWidth,
|
||||||
double aThickness, double aOrientation, GR_TEXT_H_ALIGN_T aHJustify,
|
double aThickness, double aOrientation, GR_TEXT_H_ALIGN_T aHJustify,
|
||||||
GR_TEXT_V_ALIGN_T aVJustify ) :
|
GR_TEXT_V_ALIGN_T aVJustify, const COLOR4D& aColor ) :
|
||||||
m_origin( aOrigin ),
|
m_origin( aOrigin ),
|
||||||
m_text( aText ),
|
m_text( aText ), m_height( aHeight ), m_width( aWidth ), m_thickness( aThickness ),
|
||||||
m_height( aHeight ),
|
m_orientation( aOrientation ), m_hJustify( aHJustify ), m_vJustify( aVJustify ),
|
||||||
m_width( aWidth ),
|
m_color( aColor )
|
||||||
m_thickness( aThickness ),
|
|
||||||
m_orientation( aOrientation ),
|
|
||||||
m_hJustify( aHJustify ),
|
|
||||||
m_vJustify( aVJustify )
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
|
void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
|
||||||
{
|
{
|
||||||
aImporter.AddText( m_origin, m_text, m_height, m_width,
|
aImporter.AddText( m_origin, m_text, m_height, m_width, m_thickness, m_orientation,
|
||||||
m_thickness, m_orientation, m_hJustify, m_vJustify );
|
m_hJustify, m_vJustify, m_color );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
|
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
|
||||||
|
@ -238,6 +238,7 @@ private:
|
||||||
double m_orientation;
|
double m_orientation;
|
||||||
GR_TEXT_H_ALIGN_T m_hJustify;
|
GR_TEXT_H_ALIGN_T m_hJustify;
|
||||||
GR_TEXT_V_ALIGN_T m_vJustify;
|
GR_TEXT_V_ALIGN_T m_vJustify;
|
||||||
|
COLOR4D m_color;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -245,18 +246,17 @@ class IMPORTED_SPLINE : public IMPORTED_SHAPE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
IMPORTED_SPLINE( const VECTOR2D& aStart, const VECTOR2D& aBezierControl1,
|
IMPORTED_SPLINE( const VECTOR2D& aStart, const VECTOR2D& aBezierControl1,
|
||||||
const VECTOR2D& aBezierControl2, const VECTOR2D& aEnd, double aWidth ) :
|
const VECTOR2D& aBezierControl2, const VECTOR2D& aEnd, double aWidth,
|
||||||
m_start( aStart ),
|
const COLOR4D& aColor ) :
|
||||||
m_bezierControl1( aBezierControl1 ),
|
m_start( aStart ),
|
||||||
m_bezierControl2( aBezierControl2 ),
|
m_bezierControl1( aBezierControl1 ), m_bezierControl2( aBezierControl2 ), m_end( aEnd ),
|
||||||
m_end( aEnd ),
|
m_width( aWidth ), m_color( aColor )
|
||||||
m_width( aWidth )
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
|
void ImportTo( GRAPHICS_IMPORTER& aImporter ) const override
|
||||||
{
|
{
|
||||||
aImporter.AddSpline( m_start, m_bezierControl1, m_bezierControl2, m_end, m_width );
|
aImporter.AddSpline( m_start, m_bezierControl1, m_bezierControl2, m_end, m_width, m_color );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
|
virtual std::unique_ptr<IMPORTED_SHAPE> clone() const override
|
||||||
|
@ -278,27 +278,33 @@ private:
|
||||||
VECTOR2D m_bezierControl2;
|
VECTOR2D m_bezierControl2;
|
||||||
VECTOR2D m_end;
|
VECTOR2D m_end;
|
||||||
double m_width;
|
double m_width;
|
||||||
|
COLOR4D m_color;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class GRAPHICS_IMPORTER_BUFFER : public GRAPHICS_IMPORTER
|
class GRAPHICS_IMPORTER_BUFFER : public GRAPHICS_IMPORTER
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void AddLine( const VECTOR2D& aStart, const VECTOR2D& aEnd, double aWidth ) override;
|
void AddLine( const VECTOR2D& aStart, const VECTOR2D& aEnd, double aWidth,
|
||||||
|
const COLOR4D& aColor = COLOR4D::UNSPECIFIED ) override;
|
||||||
|
|
||||||
void AddCircle( const VECTOR2D& aCenter, double aRadius, double aWidth, bool aFilled ) override;
|
void AddCircle( const VECTOR2D& aCenter, double aRadius, double aWidth, bool aFilled,
|
||||||
|
const COLOR4D& aColor = COLOR4D::UNSPECIFIED ) override;
|
||||||
|
|
||||||
void AddArc( const VECTOR2D& aCenter, const VECTOR2D& aStart, const EDA_ANGLE& aAngle,
|
void AddArc( const VECTOR2D& aCenter, const VECTOR2D& aStart, const EDA_ANGLE& aAngle,
|
||||||
double aWidth ) override;
|
double aWidth, const COLOR4D& aColor = COLOR4D::UNSPECIFIED ) override;
|
||||||
|
|
||||||
void AddPolygon( const std::vector< VECTOR2D >& aVertices, double aWidth ) override;
|
void AddPolygon( const std::vector<VECTOR2D>& aVertices, double aWidth,
|
||||||
|
const COLOR4D& aColor = COLOR4D::UNSPECIFIED ) override;
|
||||||
|
|
||||||
void AddText( const VECTOR2D& aOrigin, const wxString& aText, double aHeight, double aWidth,
|
void AddText( const VECTOR2D& aOrigin, const wxString& aText, double aHeight, double aWidth,
|
||||||
double aThickness, double aOrientation, GR_TEXT_H_ALIGN_T aHJustify,
|
double aThickness, double aOrientation, GR_TEXT_H_ALIGN_T aHJustify,
|
||||||
GR_TEXT_V_ALIGN_T aVJustify ) override;
|
GR_TEXT_V_ALIGN_T aVJustify,
|
||||||
|
const COLOR4D& aColor = COLOR4D::UNSPECIFIED ) override;
|
||||||
|
|
||||||
void AddSpline( const VECTOR2D& aStart, const VECTOR2D& BezierControl1,
|
void AddSpline( const VECTOR2D& aStart, const VECTOR2D& BezierControl1,
|
||||||
const VECTOR2D& BezierControl2, const VECTOR2D& aEnd , double aWidth ) override;
|
const VECTOR2D& BezierControl2, const VECTOR2D& aEnd, double aWidth,
|
||||||
|
const COLOR4D& aColor = COLOR4D::UNSPECIFIED ) override;
|
||||||
|
|
||||||
void ImportTo( GRAPHICS_IMPORTER& aImporter );
|
void ImportTo( GRAPHICS_IMPORTER& aImporter );
|
||||||
void AddShape( std::unique_ptr<IMPORTED_SHAPE>& aShape );
|
void AddShape( std::unique_ptr<IMPORTED_SHAPE>& aShape );
|
||||||
|
|
|
@ -29,8 +29,6 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
#include <math/vector2d.h>
|
|
||||||
|
|
||||||
#include <eda_item.h>
|
#include <eda_item.h>
|
||||||
#include "graphics_importer.h"
|
#include "graphics_importer.h"
|
||||||
|
|
||||||
|
@ -101,9 +99,24 @@ bool SVG_IMPORT_PLUGIN::Import()
|
||||||
|
|
||||||
for( NSVGshape* shape = m_parsedImage->shapes; shape != nullptr; shape = shape->next )
|
for( NSVGshape* shape = m_parsedImage->shapes; shape != nullptr; shape = shape->next )
|
||||||
{
|
{
|
||||||
double lineWidth = shape->strokeWidth;
|
double lineWidth = shape->stroke.type != NSVG_PAINT_NONE ? shape->strokeWidth : -1;
|
||||||
bool filled = shape->fill.type != NSVG_PAINT_NONE && alpha( shape->fill.color ) > 0;
|
bool filled = shape->fill.type != NSVG_PAINT_NONE && alpha( shape->fill.color ) > 0;
|
||||||
|
|
||||||
|
COLOR4D color = COLOR4D::UNSPECIFIED;
|
||||||
|
|
||||||
|
if( shape->fill.type == NSVG_PAINT_COLOR )
|
||||||
|
{
|
||||||
|
unsigned int icolor = shape->fill.color;
|
||||||
|
|
||||||
|
color.r = std::clamp( ( icolor >> 0 ) & 0xFF, 0u, 255u ) / 255.0;
|
||||||
|
color.g = std::clamp( ( icolor >> 8 ) & 0xFF, 0u, 255u ) / 255.0;
|
||||||
|
color.b = std::clamp( ( icolor >> 16 ) & 0xFF, 0u, 255u ) / 255.0;
|
||||||
|
color.a = std::clamp( ( icolor >> 24 ) & 0xFF, 0u, 255u ) / 255.0;
|
||||||
|
|
||||||
|
if( color == COLOR4D::BLACK ) // nanosvg probably didn't read it properly, use default
|
||||||
|
color = COLOR4D::UNSPECIFIED;
|
||||||
|
}
|
||||||
|
|
||||||
GRAPHICS_IMPORTER::POLY_FILL_RULE rule = GRAPHICS_IMPORTER::PF_NONZERO;
|
GRAPHICS_IMPORTER::POLY_FILL_RULE rule = GRAPHICS_IMPORTER::PF_NONZERO;
|
||||||
|
|
||||||
switch( shape->fillRule )
|
switch( shape->fillRule )
|
||||||
|
@ -119,7 +132,7 @@ bool SVG_IMPORT_PLUGIN::Import()
|
||||||
{
|
{
|
||||||
bool closed = path->closed || filled || rule == GRAPHICS_IMPORTER::PF_EVEN_ODD;
|
bool closed = path->closed || filled || rule == GRAPHICS_IMPORTER::PF_EVEN_ODD;
|
||||||
|
|
||||||
DrawPath( path->pts, path->npts, closed, filled, lineWidth );
|
DrawPath( path->pts, path->npts, closed, filled, lineWidth, color );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,7 +152,7 @@ double SVG_IMPORT_PLUGIN::GetImageHeight() const
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_parsedImage->height;
|
return m_parsedImage->height / SVG_DPI * inches2mm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -151,12 +164,37 @@ double SVG_IMPORT_PLUGIN::GetImageWidth() const
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_parsedImage->width;
|
return m_parsedImage->width / SVG_DPI * inches2mm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOX2D SVG_IMPORT_PLUGIN::GetImageBBox() const
|
||||||
|
{
|
||||||
|
BOX2D bbox;
|
||||||
|
|
||||||
|
if( !m_parsedImage || !m_parsedImage->shapes )
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( false, wxT( "Image must have been loaded before getting bbox" ) );
|
||||||
|
return bbox;
|
||||||
|
}
|
||||||
|
|
||||||
|
for( NSVGshape* shape = m_parsedImage->shapes; shape != nullptr; shape = shape->next )
|
||||||
|
{
|
||||||
|
BOX2D shapeBbox;
|
||||||
|
float( &bounds )[4] = shape->bounds;
|
||||||
|
|
||||||
|
shapeBbox.SetOrigin( bounds[0], bounds[1] );
|
||||||
|
shapeBbox.SetEnd( bounds[2], bounds[3] );
|
||||||
|
|
||||||
|
bbox.Merge( shapeBbox );
|
||||||
|
}
|
||||||
|
|
||||||
|
return bbox;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SVG_IMPORT_PLUGIN::DrawPath( const float* aPoints, int aNumPoints, bool aPoly, bool aFilled,
|
void SVG_IMPORT_PLUGIN::DrawPath( const float* aPoints, int aNumPoints, bool aPoly, bool aFilled,
|
||||||
double aLineWidth )
|
double aLineWidth, const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
std::vector< VECTOR2D > collectedPathPoints;
|
std::vector< VECTOR2D > collectedPathPoints;
|
||||||
|
|
||||||
|
@ -164,9 +202,9 @@ void SVG_IMPORT_PLUGIN::DrawPath( const float* aPoints, int aNumPoints, bool aPo
|
||||||
DrawCubicBezierPath( aPoints, aNumPoints, collectedPathPoints );
|
DrawCubicBezierPath( aPoints, aNumPoints, collectedPathPoints );
|
||||||
|
|
||||||
if( aPoly && aFilled )
|
if( aPoly && aFilled )
|
||||||
DrawPolygon( collectedPathPoints, aLineWidth );
|
DrawPolygon( collectedPathPoints, aLineWidth, aColor );
|
||||||
else
|
else
|
||||||
DrawLineSegments( collectedPathPoints, aLineWidth );
|
DrawLineSegments( collectedPathPoints, aLineWidth, aColor );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -201,18 +239,20 @@ void SVG_IMPORT_PLUGIN::DrawCubicBezierCurve( const float* aPoints,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SVG_IMPORT_PLUGIN::DrawPolygon( const std::vector< VECTOR2D >& aPoints, double aWidth )
|
void SVG_IMPORT_PLUGIN::DrawPolygon( const std::vector<VECTOR2D>& aPoints, double aWidth,
|
||||||
|
const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
m_internalImporter.AddPolygon( aPoints, aWidth );
|
m_internalImporter.AddPolygon( aPoints, aWidth, aColor );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SVG_IMPORT_PLUGIN::DrawLineSegments( const std::vector< VECTOR2D >& aPoints, double aWidth )
|
void SVG_IMPORT_PLUGIN::DrawLineSegments( const std::vector<VECTOR2D>& aPoints, double aWidth,
|
||||||
|
const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
unsigned int numLineStartPoints = aPoints.size() - 1;
|
unsigned int numLineStartPoints = aPoints.size() - 1;
|
||||||
|
|
||||||
for( unsigned int pointIndex = 0; pointIndex < numLineStartPoints; ++pointIndex )
|
for( unsigned int pointIndex = 0; pointIndex < numLineStartPoints; ++pointIndex )
|
||||||
m_internalImporter.AddLine( aPoints[ pointIndex ], aPoints[ pointIndex + 1 ], aWidth );
|
m_internalImporter.AddLine( aPoints[ pointIndex ], aPoints[ pointIndex + 1 ], aWidth, aColor );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
|
|
||||||
#include "graphics_import_plugin.h"
|
#include "graphics_import_plugin.h"
|
||||||
#include "graphics_importer_buffer.h"
|
#include "graphics_importer_buffer.h"
|
||||||
#include <math/vector2d.h>
|
|
||||||
#include <wildcards_and_files_ext.h>
|
#include <wildcards_and_files_ext.h>
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -68,18 +67,21 @@ public:
|
||||||
|
|
||||||
virtual double GetImageHeight() const override;
|
virtual double GetImageHeight() const override;
|
||||||
virtual double GetImageWidth() const override;
|
virtual double GetImageWidth() const override;
|
||||||
|
virtual BOX2D GetImageBBox() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void DrawPath( const float* aPoints, int aNumPoints, bool aClosedPath, bool aFilled, double aLineWidth );
|
void DrawPath( const float* aPoints, int aNumPoints, bool aClosedPath, bool aFilled,
|
||||||
|
double aLineWidth, const COLOR4D& aColor );
|
||||||
|
|
||||||
void DrawCubicBezierPath( const float* aPoints, int aNumPoints,
|
void DrawCubicBezierPath( const float* aPoints, int aNumPoints,
|
||||||
std::vector< VECTOR2D >& aGeneratedPoints );
|
std::vector<VECTOR2D>& aGeneratedPoints );
|
||||||
|
|
||||||
void DrawCubicBezierCurve( const float* aPoints,
|
void DrawCubicBezierCurve( const float* aPoints, std::vector<VECTOR2D>& aGeneratedPoints );
|
||||||
std::vector< VECTOR2D >& aGeneratedPoints );
|
|
||||||
|
|
||||||
void DrawPolygon( const std::vector< VECTOR2D >& aPoints, double aWidth );
|
void DrawPolygon( const std::vector<VECTOR2D>& aPoints, double aWidth, const COLOR4D& aColor );
|
||||||
void DrawLineSegments( const std::vector< VECTOR2D >& aPoints, double aWidth );
|
|
||||||
|
void DrawLineSegments( const std::vector<VECTOR2D>& aPoints, double aWidth,
|
||||||
|
const COLOR4D& aColor );
|
||||||
|
|
||||||
struct NSVGimage* m_parsedImage;
|
struct NSVGimage* m_parsedImage;
|
||||||
|
|
||||||
|
|
|
@ -268,6 +268,10 @@ set ( EESCHEMA_LIBEDIT_SRCS
|
||||||
symbol_editor/toolbars_symbol_editor.cpp
|
symbol_editor/toolbars_symbol_editor.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
set( EESCHEMA_IMPORT_GFX
|
||||||
|
import_gfx/graphics_importer_lib_symbol.cpp
|
||||||
|
)
|
||||||
|
|
||||||
set( EESCHEMA_SRCS
|
set( EESCHEMA_SRCS
|
||||||
${EESCHEMA_DLGS}
|
${EESCHEMA_DLGS}
|
||||||
${EESCHEMA_LIBEDIT_SRCS}
|
${EESCHEMA_LIBEDIT_SRCS}
|
||||||
|
@ -276,6 +280,7 @@ set( EESCHEMA_SRCS
|
||||||
${EESCHEMA_SCH_PLUGINS_LTSPICE}
|
${EESCHEMA_SCH_PLUGINS_LTSPICE}
|
||||||
${EESCHEMA_SIM_SRCS}
|
${EESCHEMA_SIM_SRCS}
|
||||||
${EESCHEMA_WIDGETS}
|
${EESCHEMA_WIDGETS}
|
||||||
|
${EESCHEMA_IMPORT_GFX}
|
||||||
annotate.cpp
|
annotate.cpp
|
||||||
autoplace_fields.cpp
|
autoplace_fields.cpp
|
||||||
bom_plugins.cpp
|
bom_plugins.cpp
|
||||||
|
|
|
@ -0,0 +1,217 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KICAD, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 CERN
|
||||||
|
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||||
|
* Copyright (C) 2018-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, you may find one here:
|
||||||
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||||
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||||
|
* or you may write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "graphics_importer_lib_symbol.h"
|
||||||
|
|
||||||
|
#include <lib_symbol.h>
|
||||||
|
#include <lib_shape.h>
|
||||||
|
#include <lib_text.h>
|
||||||
|
#include <memory>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
|
||||||
|
GRAPHICS_IMPORTER_LIB_SYMBOL::GRAPHICS_IMPORTER_LIB_SYMBOL( LIB_SYMBOL* aSymbol, int aUnit ) :
|
||||||
|
m_symbol( aSymbol ), m_unit( aUnit )
|
||||||
|
{
|
||||||
|
m_millimeterToIu = schIUScale.mmToIU( 1.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VECTOR2I GRAPHICS_IMPORTER_LIB_SYMBOL::MapCoordinate( const VECTOR2D& aCoordinate )
|
||||||
|
{
|
||||||
|
VECTOR2D coord = aCoordinate;
|
||||||
|
coord *= GetScale();
|
||||||
|
coord += GetImportOffsetMM();
|
||||||
|
coord *= GetMillimeterToIuFactor();
|
||||||
|
|
||||||
|
return VECTOR2I( KiROUND( coord.x ), KiROUND( coord.y ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int GRAPHICS_IMPORTER_LIB_SYMBOL::MapLineWidth( double aLineWidth )
|
||||||
|
{
|
||||||
|
VECTOR2D factor = ImportScalingFactor();
|
||||||
|
double scale = ( factor.x + factor.y ) * 0.5;
|
||||||
|
|
||||||
|
if( aLineWidth <= 0.0 )
|
||||||
|
return int( GetLineWidthMM() * scale );
|
||||||
|
|
||||||
|
// aLineWidth is in mm:
|
||||||
|
return int( aLineWidth * scale );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GRAPHICS_IMPORTER_LIB_SYMBOL::AddLine( const VECTOR2D& aOrigin, const VECTOR2D& aEnd,
|
||||||
|
double aWidth, const COLOR4D& aColor )
|
||||||
|
{
|
||||||
|
std::unique_ptr<LIB_SHAPE> line = std::make_unique<LIB_SHAPE>( m_symbol, SHAPE_T::SEGMENT );
|
||||||
|
line->SetUnit( m_unit );
|
||||||
|
line->SetFillColor( aColor );
|
||||||
|
line->SetStroke( STROKE_PARAMS( MapLineWidth( aWidth ), PLOT_DASH_TYPE::SOLID ) );
|
||||||
|
line->SetStart( MapCoordinate( aOrigin ) );
|
||||||
|
line->SetEnd( MapCoordinate( aEnd ) );
|
||||||
|
|
||||||
|
// Skip 0 len lines:
|
||||||
|
if( line->GetStart() == line->GetEnd() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
addItem( std::move( line ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GRAPHICS_IMPORTER_LIB_SYMBOL::AddCircle( const VECTOR2D& aCenter, double aRadius, double aWidth,
|
||||||
|
bool aFilled, const COLOR4D& aColor )
|
||||||
|
{
|
||||||
|
std::unique_ptr<LIB_SHAPE> circle = std::make_unique<LIB_SHAPE>( m_symbol, SHAPE_T::CIRCLE );
|
||||||
|
circle->SetUnit( m_unit );
|
||||||
|
circle->SetFillColor( aColor );
|
||||||
|
circle->SetFilled( aFilled );
|
||||||
|
circle->SetStroke( STROKE_PARAMS( MapLineWidth( aWidth ), PLOT_DASH_TYPE::SOLID ) );
|
||||||
|
circle->SetStart( MapCoordinate( aCenter ));
|
||||||
|
circle->SetEnd( MapCoordinate( VECTOR2D( aCenter.x + aRadius, aCenter.y ) ) );
|
||||||
|
|
||||||
|
addItem( std::move( circle ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GRAPHICS_IMPORTER_LIB_SYMBOL::AddArc( const VECTOR2D& aCenter, const VECTOR2D& aStart,
|
||||||
|
const EDA_ANGLE& aAngle, double aWidth,
|
||||||
|
const COLOR4D& aColor )
|
||||||
|
{
|
||||||
|
std::unique_ptr<LIB_SHAPE> arc = std::make_unique<LIB_SHAPE>( m_symbol, SHAPE_T::ARC );
|
||||||
|
arc->SetUnit( m_unit );
|
||||||
|
arc->SetFillColor( aColor );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We need to perform the rotation/conversion here while still using floating point values
|
||||||
|
* to avoid rounding errors when operating in integer space in KiCad
|
||||||
|
*/
|
||||||
|
VECTOR2D end = aStart;
|
||||||
|
VECTOR2D mid = aStart;
|
||||||
|
|
||||||
|
RotatePoint( end, aCenter, -aAngle );
|
||||||
|
RotatePoint( mid, aCenter, -aAngle / 2.0 );
|
||||||
|
|
||||||
|
arc->SetArcGeometry( MapCoordinate( aStart ), MapCoordinate( mid ), MapCoordinate( end ) );
|
||||||
|
|
||||||
|
// Ensure the arc can be handled by KiCad. Arcs with a too big radius cannot.
|
||||||
|
// The criteria used here is radius < MAX_INT / 2.
|
||||||
|
// this is not perfect, but we do not know the exact final position of the arc, so
|
||||||
|
// we cannot test the coordinate values, because the arc can be moved before being placed.
|
||||||
|
VECTOR2D center = CalcArcCenter( arc->GetStart(), arc->GetEnd(), aAngle );
|
||||||
|
double radius = ( center - arc->GetStart() ).EuclideanNorm();
|
||||||
|
constexpr double rd_max_value = std::numeric_limits<VECTOR2I::coord_type>::max() / 2.0;
|
||||||
|
|
||||||
|
if( radius >= rd_max_value )
|
||||||
|
{
|
||||||
|
// Arc cannot be handled: convert it to a segment
|
||||||
|
AddLine( aStart, end, aWidth, aColor );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
arc->SetStroke( STROKE_PARAMS( MapLineWidth( aWidth ), PLOT_DASH_TYPE::SOLID ) );
|
||||||
|
|
||||||
|
addItem( std::move( arc ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GRAPHICS_IMPORTER_LIB_SYMBOL::AddPolygon( const std::vector<VECTOR2D>& aVertices, double aWidth,
|
||||||
|
const COLOR4D& aColor )
|
||||||
|
{
|
||||||
|
std::vector<VECTOR2I> convertedPoints;
|
||||||
|
convertedPoints.reserve( aVertices.size() );
|
||||||
|
|
||||||
|
for( const VECTOR2D& precisePoint : aVertices )
|
||||||
|
convertedPoints.emplace_back( MapCoordinate( precisePoint ) );
|
||||||
|
|
||||||
|
if( convertedPoints.empty() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::unique_ptr<LIB_SHAPE> polygon = std::make_unique<LIB_SHAPE>( m_symbol, SHAPE_T::POLY );
|
||||||
|
polygon->SetUnit( m_unit );
|
||||||
|
polygon->SetFilled( true );
|
||||||
|
polygon->SetFillMode( aColor != COLOR4D::UNSPECIFIED ? FILL_T::FILLED_WITH_COLOR
|
||||||
|
: FILL_T::FILLED_SHAPE );
|
||||||
|
polygon->SetFillColor( aColor );
|
||||||
|
polygon->SetPolyPoints( convertedPoints );
|
||||||
|
polygon->AddPoint( convertedPoints[0] ); // Need to close last point for libedit
|
||||||
|
|
||||||
|
polygon->SetStroke(
|
||||||
|
STROKE_PARAMS( aWidth != -1 ? MapLineWidth( aWidth ) : -1, PLOT_DASH_TYPE::SOLID ) );
|
||||||
|
|
||||||
|
addItem( std::move( polygon ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GRAPHICS_IMPORTER_LIB_SYMBOL::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 )
|
||||||
|
{
|
||||||
|
std::unique_ptr<LIB_TEXT> textItem = std::make_unique<LIB_TEXT>( m_symbol );
|
||||||
|
textItem->SetUnit( m_unit );
|
||||||
|
textItem->SetTextColor( aColor );
|
||||||
|
textItem->SetTextThickness( MapLineWidth( aThickness ) );
|
||||||
|
textItem->SetTextPos( MapCoordinate( aOrigin ) );
|
||||||
|
textItem->SetTextAngle( EDA_ANGLE( aOrientation, DEGREES_T ) );
|
||||||
|
textItem->SetTextWidth( aWidth * ImportScalingFactor().x );
|
||||||
|
textItem->SetTextHeight( aHeight * ImportScalingFactor().y );
|
||||||
|
textItem->SetVertJustify( aVJustify );
|
||||||
|
textItem->SetHorizJustify( aHJustify );
|
||||||
|
textItem->SetText( aText );
|
||||||
|
|
||||||
|
addItem( std::move( textItem ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GRAPHICS_IMPORTER_LIB_SYMBOL::AddSpline( const VECTOR2D& aStart, const VECTOR2D& BezierControl1,
|
||||||
|
const VECTOR2D& BezierControl2, const VECTOR2D& aEnd,
|
||||||
|
double aWidth, const COLOR4D& aColor )
|
||||||
|
{
|
||||||
|
std::unique_ptr<LIB_SHAPE> spline = std::make_unique<LIB_SHAPE>( m_symbol, SHAPE_T::BEZIER );
|
||||||
|
spline->SetUnit( m_unit );
|
||||||
|
spline->SetFillColor( aColor );
|
||||||
|
spline->SetStroke( STROKE_PARAMS( MapLineWidth( aWidth ), PLOT_DASH_TYPE::SOLID ) );
|
||||||
|
spline->SetStart( MapCoordinate( aStart ) );
|
||||||
|
spline->SetBezierC1( MapCoordinate( BezierControl1 ));
|
||||||
|
spline->SetBezierC2( MapCoordinate( BezierControl2 ));
|
||||||
|
spline->SetEnd( MapCoordinate( aEnd ) );
|
||||||
|
spline->RebuildBezierToSegmentsPointsList( aWidth );
|
||||||
|
|
||||||
|
// If the spline is degenerated (i.e. a segment) add it as segment or discard it if
|
||||||
|
// null (i.e. very small) length
|
||||||
|
if( spline->GetBezierPoints().size() <= 2 )
|
||||||
|
{
|
||||||
|
spline->SetShape( SHAPE_T::SEGMENT );
|
||||||
|
int dist = VECTOR2I(spline->GetStart()- spline->GetEnd()).EuclideanNorm();
|
||||||
|
|
||||||
|
// segment smaller than MIN_SEG_LEN_ACCEPTABLE_NM nanometers are skipped.
|
||||||
|
#define MIN_SEG_LEN_ACCEPTABLE_NM 20
|
||||||
|
if( dist < MIN_SEG_LEN_ACCEPTABLE_NM )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
addItem( std::move( spline ) );
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KICAD, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 CERN
|
||||||
|
* Copyright (C) 2018-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
|
*
|
||||||
|
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, you may find one here:
|
||||||
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||||
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||||
|
* or you may write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRAPHICS_IMPORTER_EESCHEMA_H
|
||||||
|
#define GRAPHICS_IMPORTER_EESCHEMA_H
|
||||||
|
|
||||||
|
#include <import_gfx/graphics_importer.h>
|
||||||
|
|
||||||
|
#include <layer_ids.h>
|
||||||
|
|
||||||
|
class LIB_SYMBOL;
|
||||||
|
class LIB_SHAPE;
|
||||||
|
class LIB_TEXT;
|
||||||
|
|
||||||
|
class GRAPHICS_IMPORTER_LIB_SYMBOL : public GRAPHICS_IMPORTER
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GRAPHICS_IMPORTER_LIB_SYMBOL( LIB_SYMBOL* aSymbol, int aUnit );
|
||||||
|
|
||||||
|
void AddLine( const VECTOR2D& aOrigin, const VECTOR2D& aEnd, double aWidth,
|
||||||
|
const COLOR4D& aColor ) override;
|
||||||
|
|
||||||
|
void AddCircle( const VECTOR2D& aOrigin, double aRadius, double aWidth, bool aFilled,
|
||||||
|
const COLOR4D& aColor ) override;
|
||||||
|
|
||||||
|
void AddArc( const VECTOR2D& aCenter, const VECTOR2D& aStart, const EDA_ANGLE& aAngle,
|
||||||
|
double aWidth, const COLOR4D& aColor ) override;
|
||||||
|
|
||||||
|
void AddPolygon( const std::vector<VECTOR2D>& aVertices, double aWidth,
|
||||||
|
const COLOR4D& aColor ) override;
|
||||||
|
|
||||||
|
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 ) override;
|
||||||
|
|
||||||
|
void AddSpline( const VECTOR2D& aStart, const VECTOR2D& aBezierControl1,
|
||||||
|
const VECTOR2D& aBezierControl2, const VECTOR2D& aEnd, double aWidth,
|
||||||
|
const COLOR4D& aColor ) override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert an imported coordinate to a board coordinate, according to the internal units,
|
||||||
|
* user scale and offset
|
||||||
|
*
|
||||||
|
* @param aCoordinate is the imported coordinate in mm.
|
||||||
|
*/
|
||||||
|
VECTOR2I MapCoordinate( const VECTOR2D& aCoordinate );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If aLineWidth < 0, the default line thickness value is returned.
|
||||||
|
*
|
||||||
|
* @param aLineWidth is the line thickness in mm to convert.
|
||||||
|
* @return a line thickness in a board Iu value, according to the internal units.
|
||||||
|
*/
|
||||||
|
int MapLineWidth( double aLineWidth );
|
||||||
|
|
||||||
|
LIB_SYMBOL* m_symbol;
|
||||||
|
int m_unit;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* GRAPHICS_IMPORTER_EESCHEMA */
|
|
@ -259,7 +259,7 @@ bool DIALOG_IMPORT_GFX::TransferDataFromWindow()
|
||||||
LOCALE_IO dummy; // Ensure floats can be read.
|
LOCALE_IO dummy; // Ensure floats can be read.
|
||||||
|
|
||||||
if( m_importer->Load( m_textCtrlFileName->GetValue() ) )
|
if( m_importer->Load( m_textCtrlFileName->GetValue() ) )
|
||||||
m_importer->Import( scale );
|
m_importer->Import( VECTOR2D( scale, scale ) );
|
||||||
|
|
||||||
// Get warning messages:
|
// Get warning messages:
|
||||||
wxString warnings = m_importer->GetMessages();
|
wxString warnings = m_importer->GetMessages();
|
||||||
|
|
|
@ -42,23 +42,30 @@ GRAPHICS_IMPORTER_PCBNEW::GRAPHICS_IMPORTER_PCBNEW()
|
||||||
|
|
||||||
VECTOR2I GRAPHICS_IMPORTER_PCBNEW::MapCoordinate( const VECTOR2D& aCoordinate )
|
VECTOR2I GRAPHICS_IMPORTER_PCBNEW::MapCoordinate( const VECTOR2D& aCoordinate )
|
||||||
{
|
{
|
||||||
VECTOR2D coord = ( aCoordinate + GetImportOffsetMM() ) * ImportScalingFactor();
|
VECTOR2D coord = aCoordinate;
|
||||||
|
coord *= GetScale();
|
||||||
|
coord += GetImportOffsetMM();
|
||||||
|
coord *= GetMillimeterToIuFactor();
|
||||||
|
|
||||||
return VECTOR2I( KiROUND( coord.x ), KiROUND( coord.y ) );
|
return VECTOR2I( KiROUND( coord.x ), KiROUND( coord.y ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int GRAPHICS_IMPORTER_PCBNEW::MapLineWidth( double aLineWidth )
|
int GRAPHICS_IMPORTER_PCBNEW::MapLineWidth( double aLineWidth )
|
||||||
{
|
{
|
||||||
|
VECTOR2D factor = ImportScalingFactor();
|
||||||
|
double scale = ( factor.x + factor.y ) * 0.5;
|
||||||
|
|
||||||
if( aLineWidth <= 0.0 )
|
if( aLineWidth <= 0.0 )
|
||||||
return int( GetLineWidthMM() * ImportScalingFactor() );
|
return int( GetLineWidthMM() * scale );
|
||||||
|
|
||||||
// aLineWidth is in mm:
|
// aLineWidth is in mm:
|
||||||
return int( aLineWidth * ImportScalingFactor() );
|
return int( aLineWidth * scale );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GRAPHICS_IMPORTER_PCBNEW::AddLine( const VECTOR2D& aOrigin, const VECTOR2D& aEnd,
|
void GRAPHICS_IMPORTER_PCBNEW::AddLine( const VECTOR2D& aOrigin, const VECTOR2D& aEnd,
|
||||||
double aWidth )
|
double aWidth, const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
std::unique_ptr<PCB_SHAPE> line( createDrawing() );
|
std::unique_ptr<PCB_SHAPE> line( createDrawing() );
|
||||||
line->SetShape( SHAPE_T::SEGMENT );
|
line->SetShape( SHAPE_T::SEGMENT );
|
||||||
|
@ -76,7 +83,7 @@ void GRAPHICS_IMPORTER_PCBNEW::AddLine( const VECTOR2D& aOrigin, const VECTOR2D&
|
||||||
|
|
||||||
|
|
||||||
void GRAPHICS_IMPORTER_PCBNEW::AddCircle( const VECTOR2D& aCenter, double aRadius, double aWidth,
|
void GRAPHICS_IMPORTER_PCBNEW::AddCircle( const VECTOR2D& aCenter, double aRadius, double aWidth,
|
||||||
bool aFilled )
|
bool aFilled, const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
std::unique_ptr<PCB_SHAPE> circle( createDrawing() );
|
std::unique_ptr<PCB_SHAPE> circle( createDrawing() );
|
||||||
circle->SetShape( SHAPE_T::CIRCLE );
|
circle->SetShape( SHAPE_T::CIRCLE );
|
||||||
|
@ -91,7 +98,8 @@ void GRAPHICS_IMPORTER_PCBNEW::AddCircle( const VECTOR2D& aCenter, double aRadiu
|
||||||
|
|
||||||
|
|
||||||
void GRAPHICS_IMPORTER_PCBNEW::AddArc( const VECTOR2D& aCenter, const VECTOR2D& aStart,
|
void GRAPHICS_IMPORTER_PCBNEW::AddArc( const VECTOR2D& aCenter, const VECTOR2D& aStart,
|
||||||
const EDA_ANGLE& aAngle, double aWidth )
|
const EDA_ANGLE& aAngle, double aWidth,
|
||||||
|
const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
std::unique_ptr<PCB_SHAPE> arc( createDrawing() );
|
std::unique_ptr<PCB_SHAPE> arc( createDrawing() );
|
||||||
arc->SetShape( SHAPE_T::ARC );
|
arc->SetShape( SHAPE_T::ARC );
|
||||||
|
@ -120,7 +128,7 @@ void GRAPHICS_IMPORTER_PCBNEW::AddArc( const VECTOR2D& aCenter, const VECTOR2D&
|
||||||
if( radius >= rd_max_value )
|
if( radius >= rd_max_value )
|
||||||
{
|
{
|
||||||
// Arc cannot be handled: convert it to a segment
|
// Arc cannot be handled: convert it to a segment
|
||||||
AddLine( aStart, end, aWidth );
|
AddLine( aStart, end, aWidth, aColor );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,7 +138,8 @@ void GRAPHICS_IMPORTER_PCBNEW::AddArc( const VECTOR2D& aCenter, const VECTOR2D&
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GRAPHICS_IMPORTER_PCBNEW::AddPolygon( const std::vector<VECTOR2D>& aVertices, double aWidth )
|
void GRAPHICS_IMPORTER_PCBNEW::AddPolygon( const std::vector<VECTOR2D>& aVertices, double aWidth,
|
||||||
|
const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
std::vector<VECTOR2I> convertedPoints;
|
std::vector<VECTOR2I> convertedPoints;
|
||||||
convertedPoints.reserve( aVertices.size() );
|
convertedPoints.reserve( aVertices.size() );
|
||||||
|
@ -158,15 +167,15 @@ void GRAPHICS_IMPORTER_PCBNEW::AddPolygon( const std::vector<VECTOR2D>& aVertice
|
||||||
void GRAPHICS_IMPORTER_PCBNEW::AddText( const VECTOR2D& aOrigin, const wxString& aText,
|
void GRAPHICS_IMPORTER_PCBNEW::AddText( const VECTOR2D& aOrigin, const wxString& aText,
|
||||||
double aHeight, double aWidth, double aThickness,
|
double aHeight, double aWidth, double aThickness,
|
||||||
double aOrientation, GR_TEXT_H_ALIGN_T aHJustify,
|
double aOrientation, GR_TEXT_H_ALIGN_T aHJustify,
|
||||||
GR_TEXT_V_ALIGN_T aVJustify )
|
GR_TEXT_V_ALIGN_T aVJustify, const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
std::unique_ptr<PCB_TEXT> textItem = createText();
|
std::unique_ptr<PCB_TEXT> textItem = createText();
|
||||||
textItem->SetLayer( GetLayer() );
|
textItem->SetLayer( GetLayer() );
|
||||||
textItem->SetTextThickness( MapLineWidth( aThickness ) );
|
textItem->SetTextThickness( MapLineWidth( aThickness ) );
|
||||||
textItem->SetTextPos( MapCoordinate( aOrigin ) );
|
textItem->SetTextPos( MapCoordinate( aOrigin ) );
|
||||||
textItem->SetTextAngle( EDA_ANGLE( aOrientation, DEGREES_T ) );
|
textItem->SetTextAngle( EDA_ANGLE( aOrientation, DEGREES_T ) );
|
||||||
textItem->SetTextWidth( aWidth * ImportScalingFactor() );
|
textItem->SetTextWidth( aWidth * ImportScalingFactor().x );
|
||||||
textItem->SetTextHeight( aHeight * ImportScalingFactor() );
|
textItem->SetTextHeight( aHeight * ImportScalingFactor().y );
|
||||||
textItem->SetVertJustify( aVJustify );
|
textItem->SetVertJustify( aVJustify );
|
||||||
textItem->SetHorizJustify( aHJustify );
|
textItem->SetHorizJustify( aHJustify );
|
||||||
textItem->SetText( aText );
|
textItem->SetText( aText );
|
||||||
|
@ -177,7 +186,7 @@ void GRAPHICS_IMPORTER_PCBNEW::AddText( const VECTOR2D& aOrigin, const wxString&
|
||||||
|
|
||||||
void GRAPHICS_IMPORTER_PCBNEW::AddSpline( const VECTOR2D& aStart, const VECTOR2D& BezierControl1,
|
void GRAPHICS_IMPORTER_PCBNEW::AddSpline( const VECTOR2D& aStart, const VECTOR2D& BezierControl1,
|
||||||
const VECTOR2D& BezierControl2, const VECTOR2D& aEnd,
|
const VECTOR2D& BezierControl2, const VECTOR2D& aEnd,
|
||||||
double aWidth )
|
double aWidth, const COLOR4D& aColor )
|
||||||
{
|
{
|
||||||
std::unique_ptr<PCB_SHAPE> spline( createDrawing() );
|
std::unique_ptr<PCB_SHAPE> spline( createDrawing() );
|
||||||
spline->SetShape( SHAPE_T::BEZIER );
|
spline->SetShape( SHAPE_T::BEZIER );
|
||||||
|
|
|
@ -59,22 +59,25 @@ public:
|
||||||
return m_layer;
|
return m_layer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddLine( const VECTOR2D& aOrigin, const VECTOR2D& aEnd, double aWidth ) override;
|
void AddLine( const VECTOR2D& aOrigin, const VECTOR2D& aEnd, double aWidth,
|
||||||
|
const COLOR4D& aColor ) override;
|
||||||
|
|
||||||
void AddCircle( const VECTOR2D& aOrigin, double aRadius, double aWidth, bool aFilled ) override;
|
void AddCircle( const VECTOR2D& aOrigin, double aRadius, double aWidth, bool aFilled,
|
||||||
|
const COLOR4D& aColor ) override;
|
||||||
|
|
||||||
void AddArc( const VECTOR2D& aCenter, const VECTOR2D& aStart, const EDA_ANGLE& aAngle,
|
void AddArc( const VECTOR2D& aCenter, const VECTOR2D& aStart, const EDA_ANGLE& aAngle,
|
||||||
double aWidth ) override;
|
double aWidth, const COLOR4D& aColor ) override;
|
||||||
|
|
||||||
void AddPolygon( const std::vector< VECTOR2D >& aVertices, double aWidth ) override;
|
void AddPolygon( const std::vector<VECTOR2D>& aVertices, double aWidth,
|
||||||
|
const COLOR4D& aColor ) override;
|
||||||
|
|
||||||
void AddText( const VECTOR2D& aOrigin, const wxString& aText, double aHeight, double aWidth,
|
void AddText( const VECTOR2D& aOrigin, const wxString& aText, double aHeight, double aWidth,
|
||||||
double aThickness, double aOrientation, GR_TEXT_H_ALIGN_T aHJustify,
|
double aThickness, double aOrientation, GR_TEXT_H_ALIGN_T aHJustify,
|
||||||
GR_TEXT_V_ALIGN_T aVJustify ) override;
|
GR_TEXT_V_ALIGN_T aVJustify, const COLOR4D& aColor ) override;
|
||||||
|
|
||||||
void AddSpline( const VECTOR2D& aStart, const VECTOR2D& aBezierControl1,
|
void AddSpline( const VECTOR2D& aStart, const VECTOR2D& aBezierControl1,
|
||||||
const VECTOR2D& aBezierControl2, const VECTOR2D& aEnd,
|
const VECTOR2D& aBezierControl2, const VECTOR2D& aEnd, double aWidth,
|
||||||
double aWidth ) override;
|
const COLOR4D& aColor ) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert an imported coordinate to a board coordinate, according to the internal units,
|
* Convert an imported coordinate to a board coordinate, according to the internal units,
|
||||||
|
|
Loading…
Reference in New Issue