87#define MIN_BULGE 0.0218 
   89#define SCALE_FACTOR(x) (x) 
  101    m_maxX             = 
m_maxY = std::numeric_limits<double>::lowest();
 
  109    m_layers.push_back( std::move( layer0 ) );
 
 
  126    catch( 
const std::bad_alloc& )
 
  134        ReportMsg( 
_( 
"Memory was exhausted trying to load the DXF, it may be too large." ) );
 
 
  146    catch( 
const std::bad_alloc& )
 
  154        ReportMsg( 
_( 
"Memory was exhausted trying to load the DXF, it may be too large." ) );
 
 
  223    FILE* fp = wxFopen( aFile, wxT( 
"rt" ) );
 
  230    bool success = dxf_reader.in( fp, 
this );
 
 
  240    std::string str( 
reinterpret_cast<char*
>( aMemBuffer.GetData() ), aMemBuffer.GetDataLen() );
 
  244    bool success = dxf_reader.in( str, 
this );
 
 
  279    m_curr_entity.m_SplineControlPointList.emplace_back( aData.x , aData.y, aData.w );
 
 
  287    m_curr_entity.m_SplineFitPointList.emplace_back( aData.x, aData.y );
 
 
  300    wxString 
name = wxString::FromUTF8( aData.name.c_str() );
 
  302    int lw = attributes.getWidth();
 
  307    std::unique_ptr<DXF_IMPORT_LAYER> layer = std::make_unique<DXF_IMPORT_LAYER>( 
name, lw );
 
  309    m_layers.push_back( std::move( layer ) );
 
 
  317    wxString description = 
From_UTF8( data.description.c_str() );
 
 
  340    wxString          layerName = wxString::FromUTF8( aLayerName.c_str() );
 
  342    if( !layerName.IsEmpty() )
 
  345                [layerName]( 
const auto& it )
 
  347                    return it->m_layerName == layerName;
 
  351            layer = resultIt->get();
 
 
  361    wxString          blockName = wxString::FromUTF8( aBlockName.c_str() );
 
  363    if( !blockName.IsEmpty() )
 
  366                [blockName]( 
const auto& it )
 
  368                    return it->m_name == blockName;
 
  372            block = resultIt->get();
 
 
  382    wxString          styleName = wxString::FromUTF8( aStyleName.c_str() );
 
  384    if( !styleName.IsEmpty() )
 
  387                [styleName]( 
const auto& it )
 
  389                    return it->m_name == styleName;
 
  393            style = resultIt->get();
 
 
  410    bufferToUse->
AddLine( start, 
end, lineWidth );
 
 
  442    if( aData.startWidth > 0.0 )
 
  443        lineWidth = aData.startWidth / 100.0;
 
  444    else if ( aData.endWidth > 0.0 )
 
  445        lineWidth = aData.endWidth / 100.0;
 
  447    const DL_VertexData* vertex = &aData;
 
 
  508    wxString 
name = wxString::FromUTF8( aData.name.c_str() );
 
  510    std::unique_ptr<DXF_IMPORT_BLOCK> block = std::make_unique<DXF_IMPORT_BLOCK>( 
name, aData.bpx,
 
  513    m_blocks.push_back( std::move( block ) );
 
 
  528    if( block == 
nullptr )
 
  545    for( 
const std::unique_ptr<IMPORTED_SHAPE>& shape : block->
m_buffer.
GetShapes() )
 
  547        std::unique_ptr<IMPORTED_SHAPE> newShape = shape->clone();
 
  549        newShape->Transform( trans, translation );
 
 
  592        std::swap( startangle, endangle );
 
  596    VECTOR2D startPoint( aData.radius, 0.0 );
 
  599                       mapY( startPoint.
y + centerCoords.
y ) );
 
  602    EDA_ANGLE angle = -( endangle - startangle );
 
  612    bufferToUse->
AddArc( 
center, arcStart, angle, lineWidth );
 
 
  643    if( startAngle > endAngle )
 
  646    if( aData.ratio == 1.0 )
 
  650        if( startAngle == endAngle )
 
  652            DL_CircleData 
circle( aData.cx, aData.cy, aData.cz, 
radius );
 
  662            DL_ArcData arc( aData.cx, aData.cy, aData.cz, 
radius, startAngle.
AsDegrees(),
 
  671    std::vector<BEZIER<double>> splines;
 
  683        bufferToUse->
AddSpline( b.Start, b.C1, b.C2, b.End, lineWidth );
 
 
  697                                         std::isnan( aData.apy ) ? 0 : aData.apy,
 
  698                                         std::isnan( aData.apz ) ? 0 : aData.apz ) );
 
  703    if( aData.vJustification != 0 || aData.hJustification != 0 || aData.hJustification == 4 )
 
  705        if( aData.hJustification != 3 && aData.hJustification != 5 )
 
  717    double textHeight = 
mapDim( aData.height );
 
  720    double charWidth = textHeight * 0.9;
 
  722    if( style != 
nullptr )
 
  725    double textWidth = charWidth * 
text.length();   
 
  726    double textThickness = textHeight / 8.0;        
 
  736    switch( aData.vJustification )
 
  742        topLeft.
y = textHeight;
 
  743        topRight.
y = textHeight;
 
  749        bottomRight.
y = -textHeight / 2.0;
 
  750        bottomLeft.
y = -textHeight / 2.0;
 
  751        topLeft.
y = textHeight / 2.0;
 
  752        topRight.
y = textHeight / 2.0;
 
  758        bottomLeft.
y = -textHeight;
 
  759        bottomRight.
y = -textHeight;
 
  763    switch( aData.hJustification )
 
  770        bottomRight.
x = textWidth;
 
  771        topRight.
x = textWidth;
 
  778        bottomLeft.
x = -textWidth / 2.0;
 
  779        topLeft.
x = -textWidth / 2.0;
 
  780        bottomRight.
x = textWidth / 2.0;
 
  781        topRight.
x = textWidth / 2.0;
 
  787        bottomLeft.
x = -textWidth;
 
  788        topLeft.
x = -textWidth;
 
  793    wxString sty = wxString::FromUTF8( aData.style.c_str() );
 
  796    if( aData.textgen == 2 )
 
  799    } 
else if( aData.textgen == 4 )
 
  809    double angle_degree = aData.angle * 180 / 
M_PI;
 
  813    double angleInRads = angle_degree * 
M_PI / 180.0;
 
  814    double cosine = cos(angleInRads);
 
  815    double sine = sin(angleInRads);
 
  819    bufferToUse->
AddText( refPoint, 
text, textHeight, charWidth, textThickness, angle_degree,
 
  820                          hJustify, vJustify );
 
  823    bottomLeft.
x = bottomLeft.
x * cosine - bottomLeft.
y * sine;
 
  824    bottomLeft.
y = bottomLeft.
x * sine + bottomLeft.
y * cosine;
 
  826    bottomRight.
x = bottomRight.
x * cosine - bottomRight.
y * sine;
 
  827    bottomRight.
y = bottomRight.
x * sine + bottomRight.
y * cosine;
 
  829    topLeft.
x = topLeft.
x * cosine - topLeft.
y * sine;
 
  830    topLeft.
y = topLeft.
x * sine + topLeft.
y * cosine;
 
  832    topRight.
x = topRight.
x * cosine - topRight.
y * sine;
 
  833    topRight.
y = topRight.
x * sine + topRight.
y * cosine;
 
  835    bottomLeft += refPoint;
 
  836    bottomRight += refPoint;
 
  838    topRight += refPoint;
 
 
  865    double            textHeight = 
mapDim( aData.height );
 
  868    double charWidth = textHeight * 0.9;
 
  870    if( style != 
nullptr )
 
  873    double textWidth = charWidth * 
text.length();   
 
  874    double textThickness = textHeight/8.0;          
 
  889    if( aData.attachmentPoint <= 3 )
 
  893        bottomLeft.
y = -textHeight;
 
  894        bottomRight.
y = -textHeight;
 
  896    else if( aData.attachmentPoint <= 6 )
 
  900        bottomRight.
y = -textHeight / 2.0;
 
  901        bottomLeft.
y = -textHeight / 2.0;
 
  902        topLeft.
y = textHeight / 2.0;
 
  903        topRight.
y = textHeight / 2.0;
 
  909        topLeft.
y = textHeight;
 
  910        topRight.
y = textHeight;
 
  913    if( aData.attachmentPoint % 3 == 1 )
 
  917        bottomRight.
x = textWidth;
 
  918        topRight.
x = textWidth;
 
  920    else if( aData.attachmentPoint % 3 == 2 )
 
  924        bottomLeft.
x = -textWidth / 2.0;
 
  925        topLeft.
x = -textWidth / 2.0;
 
  926        bottomRight.
x = textWidth / 2.0;
 
  927        topRight.
x = textWidth / 2.0;
 
  933        bottomLeft.
x = -textWidth;
 
  934        topLeft.
x = -textWidth;
 
  938    if( data.alignH == 1 )
 
  942    else if( data.alignH == 3 )
 
  951    if( aData.alignV == 1 )
 
  963    double angle_degree = aData.angle * 180/
M_PI;
 
  967    double angleInRads = angle_degree * 
M_PI / 180.0;
 
  968    double cosine = cos(angleInRads);
 
  969    double sine = sin(angleInRads);
 
  974    bufferToUse->
AddText( textpos, 
text, textHeight, charWidth, textThickness, angle_degree,
 
  975                          hJustify, vJustify );
 
  977    bottomLeft.
x = bottomLeft.
x * cosine - bottomLeft.
y * sine;
 
  978    bottomLeft.
y = bottomLeft.
x * sine + bottomLeft.
y * cosine;
 
  980    bottomRight.
x = bottomRight.
x * cosine - bottomRight.
y * sine;
 
  981    bottomRight.
y = bottomRight.
x * sine + bottomRight.
y * cosine;
 
  983    topLeft.
x = topLeft.
x * cosine - topLeft.
y * sine;
 
  984    topLeft.
y = topLeft.
x * sine + topLeft.
y * cosine;
 
  986    topRight.
x = topRight.
x * cosine - topRight.
y * sine;
 
  987    topRight.
y = topRight.
x * sine + topRight.
y * cosine;
 
  989    bottomLeft += textpos;
 
  990    bottomRight += textpos;
 
 
 1044    if( key == 
"$DWGCODEPAGE" )
 
 1050    if( key == 
"$AUPREC" )
 
 1056    if( key == 
"$LUPREC" )
 
 1062    if( key == 
"$INSUNITS" )    
 
 
 1112    for( 
unsigned i = 0; i<aStr.length(); ++i )
 
 1116        if( c > 175 || c < 11 )
 
 1118            res.append( aStr.Mid( j, i - j ) );
 
 1124                res += wxT( 
"\\P" );
 
 1134                res += wxT( 
"%%C" );
 
 1139                res += wxT( 
"%%D" );
 
 1144                res += wxT( 
"%%P" );
 
 1156    res.append( aStr.Mid( j ) );
 
 
 1166    int      overbarLevel = -1;
 
 1172    for( i = 0; i < aData.length(); i++ )
 
 1174        switch( (
wchar_t) aData[i] )
 
 1181            if( overbarLevel == braces )
 
 1190            if( ++i >= aData.length() )
 
 1193            switch( (
wchar_t) aData[i] )
 
 1195            case 'I': 
res << 
'\t'; 
break;
 
 1196            case 'J': 
res << 
'\b'; 
break;
 
 1197            case ' ': 
res << 
'^'; 
break;
 
 1204            if( ++i >= aData.length() )
 
 1207            switch( (
wchar_t) aData[i] )
 
 1223                for( ; codeHex.length() < 4 && i < aData.length(); i++ )
 
 1224                    codeHex << aData[i];
 
 1226                unsigned long codeVal = 0;
 
 1228                if( codeHex.ToCULong( &codeVal, 16 ) && codeVal != 0 )
 
 1229                    res << wxUniChar( codeVal );
 
 1240                for( ; i < aData.length(); i++ )
 
 1242                    if( aData[i] == 
';' )
 
 1245                        stacked << aData[i];
 
 1248                if( stacked.Contains( wxS( 
"#" ) ) )
 
 1251                    res << stacked.BeforeFirst( 
'#' );
 
 1252                    res << 
'}' << 
'/' << 
'_' << 
'{';
 
 1253                    res << stacked.AfterFirst( 
'#' );
 
 1258                    stacked.Replace( wxS( 
"^ " ), wxS( 
"/" ) );
 
 1265                if( overbarLevel == -1 )
 
 1268                    overbarLevel = braces;
 
 1272                if( overbarLevel == braces )
 
 1298                for( ; i < aData.length(); i++ )
 
 1300                    if( aData[i] == 
';' )
 
 1306                if( ++i >= aData.length() )
 
 1315        default: 
res << aData[i];
 
 1319    if( overbarLevel != -1 )
 
 1329    regexp.Compile( wxT( 
"%%[cC]" ) );
 
 1332    regexp.Replace( &
res, wxChar( 0xD8 ) );
 
 1335    regexp.Replace( &
res, wxChar( 0x2205 ) );
 
 1339    regexp.Compile( wxT( 
"%%[dD]" ) );
 
 1340    regexp.Replace( &
res, wxChar( 0x00B0 ) );
 
 1343    regexp.Compile( wxT( 
"%%[pP]" ) );
 
 1344    regexp.Replace( &
res, wxChar( 0x00B1 ) );
 
 
 1353    wxString 
name = wxString::FromUTF8( aData.name.c_str() );
 
 1355    auto style = std::make_unique<DXF_IMPORT_STYLE>( 
name, aData.fixedTextHeight, aData.widthFactor,
 
 1356                                                     aData.bold, aData.italic );
 
 1358    m_styles.push_back( std::move( style ) );
 
 
 1372    double lineWidth = 0.0001;
 
 1373    double thickness = 
mapDim( std::max( aData.thickness, 0.01 ) );
 
 
 1387                                    const VECTOR2D& aSegEnd, 
double aWidth )
 
 
 1402                                   double aBulge, 
double aWidth )
 
 1408    if( aBulge < -2000.0 )
 
 1410    else if( aBulge > 2000.0 )
 
 1413    double ang = 4.0 * atan( aBulge );
 
 1420    double offAng = atan2( ep.
y - sp.
y, ep.
x - sp.
x );
 
 1423    double d = 0.5 * sqrt( ( sp.
x - ep.
x ) * ( sp.
x - ep.
x ) + ( sp.
y - ep.
y ) * ( sp.
y - ep.
y ) );
 
 1426    double xm   = ( sp.
x + ep.
x ) * 0.5;
 
 1427    double ym   = ( sp.
y + ep.
y ) * 0.5;
 
 1428    double radius = d / sin( ang * 0.5 );
 
 1440    double h = sqrt( dh2 );
 
 1452    else if( ang > 
M_PI )
 
 1456    double cx = h * cos( offAng ) + xm;
 
 1457    double cy = h * sin( offAng ) + ym;
 
 1474    bufferToUse->
AddArc( 
center, arc_start, angle, aWidth );
 
 
 1483#include "tinysplinecxx.h" 
 1488    wxLogMessage( 
"spl deg %d kn %d ctr %d fit %d",
 
 1495    unsigned imax = 
m_curr_entity.m_SplineControlPointList.size();
 
 1504    for( 
unsigned int ii = 1; ii < imax; ++ii )
 
 1509        if( startpoint != endpoint )
 
 1516            startpoint = endpoint;
 
 1520    std::vector<double> ctrlp;
 
 1522    for( 
unsigned ii = 0; ii < imax; ++ii )
 
 1524        ctrlp.push_back( 
m_curr_entity.m_SplineControlPointList[ii].m_x );
 
 1525        ctrlp.push_back( 
m_curr_entity.m_SplineControlPointList[ii].m_y );
 
 1528    tinyspline::BSpline beziers;
 
 1529    std::vector<double> coords;
 
 1533        tinyspline::BSpline dxfspline( 
m_curr_entity.m_SplineControlPointList.size(),
 
 1536        dxfspline.setControlPoints( ctrlp );
 
 1539        if( dxfspline.degree() < 3 )
 
 1540            dxfspline = dxfspline.elevateDegree( 3 - dxfspline.degree() );
 
 1542        beziers = dxfspline.toBeziers();
 
 1543        coords = beziers.controlPoints();
 
 1545    catch( 
const std::runtime_error& )  
 
 1549        ReportMsg( 
_( 
"Invalid spline definition encountered" ) );
 
 1553    size_t order = beziers.order();
 
 1554    size_t dim = beziers.dimension();
 
 1555    size_t numBeziers = ( coords.size() / dim ) / order;
 
 1557    for( 
size_t i = 0; i < numBeziers; i++ )
 
 1559        size_t ii = i * dim * order;
 
 1566        if( ii + 5 >= coords.size() )
 
 1567            bezierControl2 = bezierControl1;
 
 1569            bezierControl2 = 
VECTOR2D( 
mapX( coords[ii + 4] ), 
mapY( coords[ii + 5] ) );
 
 1573        if( ii + 7 >= coords.size() )
 
 1574            end = bezierControl2;
 
 1580        bufferToUse->
AddSpline( start, bezierControl1, bezierControl2, 
end, aWidth );
 
 
 1600    double direction[3];
 
 1601    aData->getDirection( direction );
 
 1605    if( ( abs( arbZ.
x ) < ( 1.0 / 64.0 ) ) && ( abs( arbZ.
y ) < ( 1.0 / 64.0 ) ) )
 
 
 1618    return arbitraryAxis * point;
 
 
 1628    MATRIX3x3 world( worldX, worldY, worldZ );
 
 1630    return world * point;
 
 
void TransformEllipseToBeziers(const ELLIPSE< T > &aEllipse, std::vector< BEZIER< T > > &aBeziers)
Transforms an ellipse or elliptical arc into a set of quadratic Bezier curves that approximate it.
 
Generic cubic Bezier representation.
 
constexpr void SetOrigin(const Vec &pos)
 
constexpr void SetEnd(coord_type x, coord_type y)
 
A helper class to hold layer settings temporarily during import.
 
GRAPHICS_IMPORTER_BUFFER m_buffer
 
A helper class to hold layer settings temporarily during import.
 
DXF_IMPORT_UNITS m_currentUnit
 
virtual void addPolyline(const DL_PolylineData &aData) override
 
double mapY(double aDxfCoordY)
 
std::vector< std::unique_ptr< DXF_IMPORT_LAYER > > m_layers
 
void addEllipse(const DL_EllipseData &aData) override
 
static wxString toNativeString(const wxString &aData)
Convert a DXF encoded string into a native Unicode string.
 
virtual void setVariableInt(const std::string &key, int value, int code) override
Called for every int variable in the DXF file (e.g.
 
bool LoadFromMemory(const wxMemoryBuffer &aMemBuffer) override
Set memory buffer with content for import.
 
void insertSpline(double aWidth)
 
virtual void addLine(const DL_LineData &aData) override
 
VECTOR3D ocsToWcs(const MATRIX3x3D &arbitraryAxis, VECTOR3D point)
Convert a given object coordinate point to world coordinate using the given arbitrary axis vectors.
 
void insertLine(const VECTOR2D &aSegStart, const VECTOR2D &aSegEnd, double aWidth)
 
DXF_IMPORT_BLOCK * getImportBlock(const std::string &aBlockName)
Return the import layer block.
 
double getCurrentUnitScale()
 
virtual void addBlock(const DL_BlockData &) override
Called for each BLOCK in the DXF file.
 
virtual void addLayer(const DL_LayerData &aData) override
 
virtual void addCircle(const DL_CircleData &aData) override
 
virtual void addMText(const DL_MTextData &aData) override
 
DXF_IMPORT_LAYER * getImportLayer(const std::string &aLayerName)
Return the import layer data.
 
static wxString toDxfString(const wxString &aStr)
Convert a native Unicode string into a DXF encoded string.
 
DXF_IMPORT_STYLE * getImportStyle(const std::string &aStyleName)
Return the import style.
 
virtual void addInsert(const DL_InsertData &aData) override
 
std::string m_mtextContent
 
BOX2D GetImageBBox() const override
Return image bounding box from original imported file.
 
MATRIX3x3D getArbitraryAxis(DL_Extrusion *aData)
 
double GetImageWidth() const override
Return image width from original imported file.
 
double GetImageHeight() const override
Return image height from original imported file.
 
void updateImageLimits(const VECTOR2D &aPoint)
 
virtual void addTextStyle(const DL_StyleData &aData) override
 
virtual void addVertex(const DL_VertexData &aData) override
Called for every polyline vertex.
 
VECTOR3D wcsToOcs(const MATRIX3x3D &arbitraryAxis, VECTOR3D point)
Convert a given world coordinate point to object coordinate using the given arbitrary axis vectors.
 
virtual void addSpline(const DL_SplineData &aData) override
Called for every spline.
 
virtual void addText(const DL_TextData &aData) override
 
virtual void endBlock() override
 
virtual void setVariableString(const std::string &key, const std::string &value, int code) override
Called for every string variable in the DXF file (e.g.
 
virtual void addKnot(const DL_KnotData &aData) override
Called for every spline knot value.
 
bool ImportDxfFile(const wxString &aFile)
Implementation of the method used for communicate with this filter.
 
virtual void addArc(const DL_ArcData &aData) override
 
void SetDefaultLineWidthMM(double aWidth)
Set the default line width when importing dxf items like lines to Pcbnew.
 
virtual void addFitPoint(const DL_FitPointData &aData) override
Called for every spline fit point.
 
virtual void addPoint(const DL_PointData &aData) override
 
double mapDim(double aDxfValue)
 
void ReportMsg(const wxString &aMessage) override
 
int m_importCoordinatePrecision
 
double mapX(double aDxfCoordX)
 
double lineWeightToWidth(int lw, DXF_IMPORT_LAYER *aLayer)
 
void insertArc(const VECTOR2D &aSegStart, const VECTOR2D &aSegEnd, double aBulge, double aWidth)
 
std::vector< std::unique_ptr< DXF_IMPORT_BLOCK > > m_blocks
 
bool Import() override
Actually imports the file.
 
virtual void addMTextChunk(const std::string &text) override
 
int m_importAnglePrecision
 
virtual void endEntity() override
 
virtual void addControlPoint(const DL_ControlPointData &aData) override
Called for every spline control point.
 
double m_defaultThickness
 
GRAPHICS_IMPORTER_BUFFER m_internalImporter
 
std::vector< std::unique_ptr< DXF_IMPORT_STYLE > > m_styles
 
bool Load(const wxString &aFileName) override
Load file for import.
 
DXF_IMPORT_BLOCK * m_currentBlock
 
DXF2BRD_ENTITY_DATA m_curr_entity
 
virtual void SetImporter(GRAPHICS_IMPORTER *aImporter) override
Set the receiver of the imported shapes.
 
virtual void addLinetype(const DL_LinetypeData &data) override
 
A helper class to hold style settings temporarily during import.
 
This class was created to handle importing ellipses from other file formats that support them nativel...
 
std::list< std::unique_ptr< IMPORTED_SHAPE > > & GetShapes()
 
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 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.
 
Interface that creates objects representing shapes for a given data model.
 
GRAPHICS_IMPORTER * m_importer
Importer used to create objects representing the imported shapes.
 
virtual void SetImporter(GRAPHICS_IMPORTER *aImporter)
Set the receiver of the imported shapes.
 
MATRIX3x3 describes a general 3x3 matrix.
 
void SetRotation(T aAngle)
Set the rotation components of the matrix.
 
VECTOR2< T > GetScale() const
Get the scale components of the matrix.
 
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
 
VECTOR3< T > Normalize()
Compute the normalized vector.
 
VECTOR3< T > Cross(const VECTOR3< T > &aVector) const
Compute cross product of self with aVector.
 
#define DXF_IMPORT_LINEWEIGHT_BY_LW_DEFAULT
 
#define DXF_IMPORT_LINEWEIGHT_BY_LAYER
 
static constexpr EDA_ANGLE ANGLE_0
 
static constexpr EDA_ANGLE ANGLE_360
 
static constexpr EDA_ANGLE ANGLE_180
 
This file contains miscellaneous commonly used macros and functions.
 
MATRIX3x3< double > MATRIX3x3D
 
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
 
wxString From_UTF8(const char *cstring)
 
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
 
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.
 
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
 
double DEG2RAD(double deg)
 
VECTOR2< double > VECTOR2D
 
VECTOR3< double > VECTOR3D