KiCad PCB EDA Suite
Loading...
Searching...
No Matches
dxf_import_plugin.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2019 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
21#ifndef DXF2BRD_ITEMS_H
22#define DXF2BRD_ITEMS_H
23
26#include "wx/translation.h"
27#include <wx/arrstr.h>
28
29#include <dl_creationadapter.h>
30#include <dl_dxf.h>
31#include <math/vector3.h>
32#include <math/matrix3x3.h>
34
35#include <list>
36
37class BOARD;
38class BOARD_ITEM;
39
44{
45 double m_x;
46 double m_y;
47 double m_weight;
48
49 SPLINE_CTRL_POINT( double a_x, double a_y, double a_weight )
50 : m_x( a_x ), m_y( a_y ), m_weight( a_weight )
51 {}
52};
53
58{
59public:
61
62 // Reset the entity parameters
63 void Clear()
64 {
65 m_EntityType = DL_UNKNOWN;
67 m_EntityFlag = 0;
68 m_LayerName.clear();
77 m_BulgeVertex = 0.0;
78 m_SplineKnotsList.clear();
81 }
82
83 int m_EntityType; // the DXF type of entity
84 int m_EntityParseStatus; // Inside a entity: status of parsing:
85 // 0 = no entity
86 // 1 = first item of entity
87 // 2 = entity in progress
88 int m_EntityFlag; // a info flag to parse entities
89 //
90 wxString m_LayerName; // the source DXF layer for the current entity
91
92 VECTOR2D m_LastCoordinate; // the last vertex coordinate read (unit = mm)
93 VECTOR2D m_PolylineStart; // The first point of the polyline entity, when reading a
94 // polyline (unit = mm)
95 double m_BulgeVertex; // the last vertex bulge value read
96
97 // for spline parsing: parameters
98 unsigned int m_SplineDegree;
99 unsigned int m_SplineKnotsCount;
101 unsigned int m_SplineFitCount;
102 double m_SplineTangentStartX; // tangent dir X for the start point
103 double m_SplineTangentStartY; // tangent dir Y for the start point
104 double m_SplineTangentEndX; // tangent dir X for the end point
105 double m_SplineTangentEndY; // tangent dir Y for the end point
106
107 // for spline parsing: buffers to store control points, fit points and knot
108 std::vector<double> m_SplineKnotsList; // knots list, code 40
109 // control points list coordinates, code 10, 20 & 30 (only X and Y cood and Weight)
110 std::vector<SPLINE_CTRL_POINT> m_SplineControlPointList;
111 // fit points list, code 11, 21 & 31 (only X and Y cood)
112 std::vector<VECTOR2D> m_SplineFitPointList;
113};
114
115// Magic constants as defined by dxf specification for line weight
116#define DXF_IMPORT_LINEWEIGHT_BY_LAYER -1
117#define DXF_IMPORT_LINEWEIGHT_BY_BLOCK -2
118#define DXF_IMPORT_LINEWEIGHT_BY_LW_DEFAULT -3
119
124{
125public:
126 wxString m_layerName;
128
129 DXF_IMPORT_LAYER( const wxString& aName, int aLineWeight )
130 {
131 m_layerName = aName;
132 m_lineWeight = aLineWeight;
133 }
134};
135
140{
141public:
142 wxString m_name;
144
146
147 DXF_IMPORT_BLOCK( const wxString& aName, double aX, double aY )
148 {
149 m_name = aName;
150 m_baseX = aX;
151 m_baseY = aY;
152 }
153};
154
159{
160public:
161 wxString m_name;
164 bool m_bold;
166
167 DXF_IMPORT_STYLE( const wxString& aName, double aTextHeight, double aWidthFactor, bool aBold,
168 bool aItalic )
169 {
170 m_name = aName;
171 m_textHeight = aTextHeight;
172 m_widthFactor = aWidthFactor;
173 m_bold = aBold;
174 m_italic = aItalic;
175 }
176};
177
178
204
205
210wxArrayString GetDxfImportUnitChoices();
211
217
218
223#define ON_UNSUPPORTED( error_msg ) reportMessage( wxString::Format( _( "%s is not supported." ), \
224 error_msg ) )
225
226class DXF_IMPORT_PLUGIN : public GRAPHICS_IMPORT_PLUGIN, public DL_CreationAdapter
227{
228public:
231
232 const wxString GetName() const override
233 {
234 return "AutoCAD DXF";
235 }
236
237 const std::vector<std::string> GetFileExtensions() const override
238 {
239 static std::vector<std::string> exts = { "dxf" };
240 return exts;
241 }
242
243 bool Load( const wxString& aFileName ) override;
244 bool LoadFromMemory( const wxMemoryBuffer& aMemBuffer ) override;
245 bool Import() override;
246
247 double GetImageWidth() const override;
248 double GetImageHeight() const override;
249 BOX2D GetImageBBox() const override;
250
251 std::vector<wxString> GetSourceLayers() const { return m_internalImporter.GetSourceLayers(); }
252
253 void updateImageLimits( const VECTOR2D& aPoint );
254
255 virtual void SetImporter( GRAPHICS_IMPORTER* aImporter ) override;
256
263 void ImportAsFootprintGraphic( bool aImportAsFootprintGraphic )
264 {
265 m_importAsFPShapes = aImportAsFootprintGraphic;
266 }
267
276 {
277 m_currentUnit = aUnit;
278 }
279
288 void SetDefaultLineWidthMM( double aWidth )
289 {
290 m_defaultThickness = aWidth;
291 }
292
293 void SetLineWidthMM( double aWidth ) override { SetDefaultLineWidthMM( aWidth ); }
294
304 void SetOffset( double aOffsetX, double aOffsetY )
305 {
306 m_xOffset = aOffsetX;
307 m_yOffset = aOffsetY;
308 }
309
315 void SetBrdLayer( int aBrdLayer ) { m_brdLayer = aBrdLayer; }
316
322 bool ImportDxfFile( const wxString& aFile );
323
329 bool ImportDxfFile( const wxMemoryBuffer& aMemBuffer );
330
334 const wxString& GetMessages() const override
335 {
336 return m_messages;
337 }
338
339 // report message to keep trace of not supported dxf entities:
340 void ReportMsg( const wxString& aMessage ) override;
341
342private:
343
344 // coordinate conversions from dxf file to mm
345 double mapX( double aDxfCoordX );
346 double mapY( double aDxfCoordY );
347 double mapDim( double aDxfValue );
348 double lineWeightToWidth( int lw, DXF_IMPORT_LAYER* aLayer );
349 double getCurrentUnitScale();
350 wxString getDxfLayerName( const std::string& aLayerName ) const;
351
352 MATRIX3x3D getArbitraryAxis( DL_Extrusion* aData );
353
358 VECTOR3D wcsToOcs( const MATRIX3x3D& arbitraryAxis, VECTOR3D point );
359
364 VECTOR3D ocsToWcs( const MATRIX3x3D& arbitraryAxis, VECTOR3D point );
365
372 DXF_IMPORT_LAYER* getImportLayer( const std::string& aLayerName );
373
380 DXF_IMPORT_BLOCK* getImportBlock( const std::string& aBlockName );
381
388 DXF_IMPORT_STYLE* getImportStyle( const std::string& aStyleName );
389
390 // Functions to aid in the creation of a Polyline.
391 void insertLine( const VECTOR2D& aSegStart, const VECTOR2D& aSegEnd, double aWidth );
392 void insertArc( const VECTOR2D& aSegStart, const VECTOR2D& aSegEnd,
393 double aBulge, double aWidth );
394
395 // Add a dxf spline (stored in m_curr_entity) to the board, after conversion to segments.
396 void insertSpline( double aWidth );
397
398 // Methods from DL_CreationAdapter:
399 // They are something like"call back" functions,
400 // called when the corresponding object is read in dxf file
401
405 virtual void setVariableString( const std::string& key, const std::string& value,
406 int code ) override;
407
411 virtual void setVariableInt( const std::string& key, int value, int code ) override;
412
416 virtual void setVariableDouble( const std::string& key, double value, int code ) override {}
417
418 virtual void addLayer( const DL_LayerData& aData ) override;
419 virtual void addLine( const DL_LineData& aData ) override;
420 virtual void addLinetype( const DL_LinetypeData& data ) override;
421
429 virtual void addBlock( const DL_BlockData& ) override;
430 virtual void endBlock() override;
431 virtual void addTextStyle( const DL_StyleData& aData ) override;
432 virtual void addPoint( const DL_PointData& aData ) override;
433
434 virtual void addCircle( const DL_CircleData& aData ) override;
435 virtual void addArc( const DL_ArcData& aData ) override;
436 void addEllipse( const DL_EllipseData& aData ) override;
437 //virtual void addLWPolyline( const DRW_LWPolyline& aData ) override;
438 virtual void addText( const DL_TextData& aData ) override;
439 virtual void addPolyline( const DL_PolylineData& aData ) override;
440
441 /* Inserts blocks where specified by insert data */
442 virtual void addInsert( const DL_InsertData& aData ) override;
443
447 virtual void addVertex( const DL_VertexData& aData ) override;
448
449 virtual void addMTextChunk( const std::string& text ) override;
450 virtual void addMText( const DL_MTextData& aData ) override;
451
452 virtual void endEntity() override;
453
457 virtual void addSpline( const DL_SplineData& aData ) override;
458
462 virtual void addControlPoint( const DL_ControlPointData& aData ) override;
463
467 virtual void addFitPoint( const DL_FitPointData& aData ) override;
468
472 virtual void addKnot( const DL_KnotData& aData ) override;
473
474 // Not yet handled DXF entities:
475 virtual void addXLine( const DL_XLineData& ) override
476 {
477 ReportMsg( _( "DXF construction lines not currently supported." ) );
478 }
479
480 virtual void addRay( const DL_RayData& ) override
481 {
482 ReportMsg( _( "DXF construction lines not currently supported." ) );
483 }
484
485 virtual void addArcAlignedText( const DL_ArcAlignedTextData& ) override
486 {
487 ReportMsg( _( "DXF arc-aligned text not currently supported." ) );
488 }
489
490 virtual void addDimAlign( const DL_DimensionData&, const DL_DimAlignedData& ) override
491 {
492 ReportMsg( _( "DXF dimensions not currently supported." ) );
493 }
494
495 virtual void addDimLinear( const DL_DimensionData&, const DL_DimLinearData& ) override
496 {
497 ReportMsg( _( "DXF dimensions not currently supported." ) );
498 }
499
500 virtual void addDimRadial( const DL_DimensionData&, const DL_DimRadialData& ) override
501 {
502 ReportMsg( _( "DXF dimensions not currently supported." ) );
503 }
504
505 virtual void addDimDiametric( const DL_DimensionData&, const DL_DimDiametricData& ) override
506 {
507 ReportMsg( _( "DXF dimensions not currently supported." ) );
508 }
509
510 virtual void addDimAngular( const DL_DimensionData&, const DL_DimAngular2LData& ) override
511 {
512 ReportMsg( _( "DXF dimensions not currently supported." ) );
513 }
514
515 virtual void addDimAngular3P( const DL_DimensionData&, const DL_DimAngular3PData& ) override
516 {
517 ReportMsg( _( "DXF dimensions not currently supported." ) );
518 }
519
520 virtual void addDimOrdinate( const DL_DimensionData&, const DL_DimOrdinateData& ) override
521 {
522 ReportMsg( _( "DXF dimensions not currently supported." ) );
523 }
524
525 virtual void addLeader( const DL_LeaderData& ) override
526 {
527 ReportMsg( _( "DXF dimensions not currently supported." ) );
528 }
529 virtual void addLeaderVertex( const DL_LeaderVertexData& ) override { }
530
531 virtual void addHatch( const DL_HatchData& ) override
532 {
533 ReportMsg( _( "DXF hatches not currently supported." ) );
534 }
535
536 virtual void addHatchLoop( const DL_HatchLoopData& ) override { }
537 virtual void addHatchEdge( const DL_HatchEdgeData& ) override { }
538
539 virtual void addTrace( const DL_TraceData& ) override
540 {
541 ReportMsg( _( "DXF traces not currently supported." ) );
542 }
543
544 virtual void add3dFace( const DL_3dFaceData& ) override
545 {
546 ReportMsg( _( "DXF 3dfaces not currently supported." ) );
547 }
548
549 virtual void addSolid( const DL_SolidData& ) override
550 {
551 ReportMsg( _( "DXF solids not currently supported." ) );
552 }
553
554 virtual void addImage( const DL_ImageData& ) override
555 {
556 ReportMsg( _( "DXF images not currently supported." ) );
557 }
558 virtual void linkImage( const DL_ImageDefData& ) override {}
559
560 // Eat these silently
561 virtual void addAttribute( const DL_AttributeData& ) override { }
562 virtual void addXRecord( const std::string& ) override { }
563 virtual void addXRecordString( int, const std::string& ) override { }
564 virtual void addXRecordReal( int, double ) override { }
565 virtual void addXRecordInt( int, int ) override { }
566 virtual void addXRecordBool( int, bool ) override { }
567 virtual void addXDataApp( const std::string& ) override { }
568 virtual void addXDataString( int, const std::string& ) override { }
569 virtual void addXDataReal( int, double ) override { }
570 virtual void addXDataInt( int, int ) override { }
571
580 static wxString toDxfString( const wxString& aStr );
581
585 static wxString toNativeString( const wxString& aData );
586
587 void writeLine();
589
590private:
591 double m_xOffset; // X coord offset for conversion (in mm)
592 double m_yOffset; // Y coord offset for conversion (in mm)
593 double m_defaultThickness; // default line thickness for conversion (in mm)
594 int m_brdLayer; // The board layer to place imported DXF items
595 int m_version; // the dxf version, not used here
596 std::string m_codePage; // The code page, not used here
597 bool m_importAsFPShapes; // Use footprint items instead of board items when true.
598 // true when the items are imported in the footprint editor
599 wxString m_messages; // messages generated during dxf file parsing.
600 // Each message ends by '\n'
601 DXF2BRD_ENTITY_DATA m_curr_entity; // the current entity parameters when parsing a DXF entity
602
603 std::string m_mtextContent; // Contents of MText.
604
605 double m_minX, m_maxX; // handles image size in mm
606 double m_minY, m_maxY; // handles image size in mm
607
608 DXF_IMPORT_UNITS m_currentUnit; // current unit during import
609 int m_importCoordinatePrecision; // current precision for linear units (points)
610 int m_importAnglePrecision; // current precision for angles
611
613
614 // List of layers as we import, used just to grab props for objects.
615 std::vector<std::unique_ptr<DXF_IMPORT_LAYER>> m_layers;
616 std::vector<std::unique_ptr<DXF_IMPORT_BLOCK>> m_blocks; // List of blocks as we import
617 std::vector<std::unique_ptr<DXF_IMPORT_STYLE>> m_styles; // List of blocks as we import
619};
620
621#endif // DXF2BRD_ITEMS_H
BOX2< VECTOR2D > BOX2D
Definition box2.h:915
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:84
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:410
A helper class to parse a DXF entity (polyline and spline)
unsigned int m_SplineDegree
std::vector< VECTOR2D > m_SplineFitPointList
unsigned int m_SplineFitCount
std::vector< SPLINE_CTRL_POINT > m_SplineControlPointList
unsigned int m_SplineKnotsCount
unsigned int m_SplineControlCount
std::vector< double > m_SplineKnotsList
A helper class to hold layer settings temporarily during import.
GRAPHICS_IMPORTER_BUFFER m_buffer
DXF_IMPORT_BLOCK(const wxString &aName, double aX, double aY)
A helper class to hold layer settings temporarily during import.
DXF_IMPORT_LAYER(const wxString &aName, int aLineWeight)
DXF_IMPORT_UNITS m_currentUnit
virtual void addXDataApp(const std::string &) override
virtual void addPolyline(const DL_PolylineData &aData) override
double mapY(double aDxfCoordY)
virtual void addImage(const DL_ImageData &) override
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 addDimAngular(const DL_DimensionData &, const DL_DimAngular2LData &) override
virtual void addDimAngular3P(const DL_DimensionData &, const DL_DimAngular3PData &) override
virtual void addAttribute(const DL_AttributeData &) override
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 linkImage(const DL_ImageDefData &) override
virtual void addLine(const DL_LineData &aData) override
virtual void addLeader(const DL_LeaderData &) 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)
virtual void addXDataReal(int, double) override
DXF_IMPORT_BLOCK * getImportBlock(const std::string &aBlockName)
Return the import layer block.
virtual void addBlock(const DL_BlockData &) override
Called for each BLOCK in the DXF file.
virtual void addDimAlign(const DL_DimensionData &, const DL_DimAlignedData &) override
virtual void addRay(const DL_RayData &) override
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.
virtual void addArcAlignedText(const DL_ArcAlignedTextData &) override
virtual void setVariableDouble(const std::string &key, double value, int code) override
Called for every double variable in the DXF file (e.g.
virtual void addTrace(const DL_TraceData &) override
virtual void addSolid(const DL_SolidData &) override
DXF_IMPORT_STYLE * getImportStyle(const std::string &aStyleName)
Return the import style.
virtual void addInsert(const DL_InsertData &aData) override
BOX2D GetImageBBox() const override
Return image bounding box from original imported file.
const wxString GetName() const override
Return the plugin name.
virtual void addLeaderVertex(const DL_LeaderVertexData &) override
virtual void addXRecordString(int, const std::string &) override
MATRIX3x3D getArbitraryAxis(DL_Extrusion *aData)
double GetImageWidth() const override
Return image width from original imported file.
virtual void addDimLinear(const DL_DimensionData &, const DL_DimLinearData &) override
double GetImageHeight() const override
Return image height from original imported file.
virtual void addXDataString(int, const std::string &) override
virtual void add3dFace(const DL_3dFaceData &) override
virtual void addHatch(const DL_HatchData &) override
void updateImageLimits(const VECTOR2D &aPoint)
virtual void addTextStyle(const DL_StyleData &aData) override
virtual void addXDataInt(int, int) 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.
virtual void addXRecordInt(int, int) override
bool ImportDxfFile(const wxString &aFile)
Implementation of the method used for communicate with this filter.
virtual void addArc(const DL_ArcData &aData) override
virtual void addXRecordReal(int, double) override
void SetLineWidthMM(double aWidth) 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
void SetBrdLayer(int aBrdLayer)
Set the layer number to import dxf items.
double mapDim(double aDxfValue)
virtual void addDimOrdinate(const DL_DimensionData &, const DL_DimOrdinateData &) override
virtual void addDimDiametric(const DL_DimensionData &, const DL_DimDiametricData &) override
void ReportMsg(const wxString &aMessage) override
virtual void addXRecord(const std::string &) override
virtual void addHatchEdge(const DL_HatchEdgeData &) override
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
virtual void addHatchLoop(const DL_HatchLoopData &) override
bool Import() override
Actually imports the file.
virtual void addMTextChunk(const std::string &text) override
virtual void endEntity() override
virtual void addControlPoint(const DL_ControlPointData &aData) override
Called for every spline control point.
std::vector< wxString > GetSourceLayers() const
GRAPHICS_IMPORTER_BUFFER m_internalImporter
virtual void addXRecordBool(int, bool) override
std::vector< std::unique_ptr< DXF_IMPORT_STYLE > > m_styles
bool Load(const wxString &aFileName) override
Load file for import.
const wxString & GetMessages() const override
virtual void addDimRadial(const DL_DimensionData &, const DL_DimRadialData &) override
void SetUnit(DXF_IMPORT_UNITS aUnit)
Set the default units when importing DXFs.
virtual void addXLine(const DL_XLineData &) override
DXF_IMPORT_BLOCK * m_currentBlock
DXF2BRD_ENTITY_DATA m_curr_entity
void ImportAsFootprintGraphic(bool aImportAsFootprintGraphic)
Allow the import DXF items converted to board graphic items or footprint graphic items.
wxString getDxfLayerName(const std::string &aLayerName) const
const std::vector< std::string > GetFileExtensions() const override
Return a vector of the file extensions handled by this plugin.
virtual void SetImporter(GRAPHICS_IMPORTER *aImporter) override
Set the receiver of the imported shapes.
void SetOffset(double aOffsetX, double aOffsetY)
Set the coordinate offset between the imported dxf items and Pcbnew.
virtual void addLinetype(const DL_LinetypeData &data) override
A helper class to hold style settings temporarily during import.
DXF_IMPORT_STYLE(const wxString &aName, double aTextHeight, double aWidthFactor, bool aBold, bool aItalic)
Interface that creates objects representing shapes for a given data model.
Interface for vector graphics import plugins.
wxArrayString GetDxfImportUnitChoices()
DXF_IMPORT_UNITS DxfImportUnitFromChoice(int aSelection)
DXF_IMPORT_UNITS
DXF Units enum with values as specified in DXF 2012 Specification.
#define _(s)
MATRIX3x3< double > MATRIX3x3D
Definition matrix3x3.h:469
@ INCH
Definition rs274x.cpp:61
SPLINE_CTRL_POINT(double a_x, double a_y, double a_weight)
static const long long MM
VECTOR2< double > VECTOR2D
Definition vector2d.h:707
VECTOR3< double > VECTOR3D
Definition vector3.h:230
Definition of file extensions used in Kicad.