summaryrefslogtreecommitdiff
path: root/lib_dxf/drw_entities.h
diff options
context:
space:
mode:
authorsaurabhb172020-02-26 16:20:48 +0530
committerGitHub2020-02-26 16:20:48 +0530
commitb77f5d9d8097c38159c6f60917995d6af13bbe1c (patch)
tree1392c90227aeea231c1d86371131e04c40382918 /lib_dxf/drw_entities.h
parentdadc4d490966a24efe15b5cc533ef8695986048a (diff)
parent003d02608917e7a69d1a98438837e94ccf68352a (diff)
downloadKiCad-eSim-b77f5d9d8097c38159c6f60917995d6af13bbe1c.tar.gz
KiCad-eSim-b77f5d9d8097c38159c6f60917995d6af13bbe1c.tar.bz2
KiCad-eSim-b77f5d9d8097c38159c6f60917995d6af13bbe1c.zip
Merge pull request #4 from FOSSEE/develop
merging dev into master
Diffstat (limited to 'lib_dxf/drw_entities.h')
-rw-r--r--lib_dxf/drw_entities.h1342
1 files changed, 1342 insertions, 0 deletions
diff --git a/lib_dxf/drw_entities.h b/lib_dxf/drw_entities.h
new file mode 100644
index 0000000..7f7b085
--- /dev/null
+++ b/lib_dxf/drw_entities.h
@@ -0,0 +1,1342 @@
+/******************************************************************************
+** libDXFrw - Library to read/write DXF files (ascii & binary) **
+** **
+** Copyright (C) 2011 Rallaz, rallazz@gmail.com **
+** **
+** This library is free software, licensed 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. **
+** You should have received a copy of the GNU General Public License **
+** along with this program. If not, see <http://www.gnu.org/licenses/>. **
+******************************************************************************/
+
+#ifndef DRW_ENTITIES_H
+#define DRW_ENTITIES_H
+
+
+#include <string>
+#include <vector>
+#include "drw_base.h"
+
+class dxfReader;
+class DRW_Polyline;
+
+namespace DRW {
+// ! Entity's type.
+enum ETYPE
+{
+ POINT,
+ LINE,
+ CIRCLE,
+ ARC,
+ ELLIPSE,
+ TRACE,
+ SOLID,
+ BLOCK,
+ INSERT,
+ LWPOLYLINE,
+ POLYLINE,
+ VERTEX,
+ SPLINE,
+ HATCH,
+ TEXT,
+ MTEXT,
+ E3DFACE,
+ IMAGE,
+ LEADER,
+ DIMENSION,
+ DIMALIGNED,
+ DIMLINEAR,
+ DIMRADIAL,
+ DIMDIAMETRIC,
+ DIMANGULAR,
+ DIMANGULAR3P,
+ DIMORDINATE,
+
+// OVERLAYBOX,
+// CONSTRUCTIONLINE,
+ RAY,
+ XLINE,
+ VIEWPORT,
+ UNKNOWN
+};
+}
+
+// ! Base class for entities
+/*!
+ * Base class for entities
+ * @author Rallaz
+ */
+class DRW_Entity
+{
+public:
+ // initializes default values
+ DRW_Entity()
+ {
+ eType = DRW::UNKNOWN;
+ lineType = "BYLAYER";
+ color = 256; // default BYLAYER (256)
+ ltypeScale = 1.0;
+ visible = true;
+ layer = "0";
+ lWeight = DRW_LW_Conv::widthByLayer; // default BYLAYER (dxf -1, dwg 29)
+ handleBlock = space = 0; // default ModelSpace (0) & handleBlock = no handle (0)
+ haveExtrusion = false;
+ color24 = -1; // default -1 not set
+ handle = 0;
+ curr = NULL;
+ }
+
+ virtual ~DRW_Entity()
+ {
+ for( std::vector<DRW_Variant*>::iterator it = extData.begin(); it!=extData.end(); ++it )
+ delete *it;
+
+ extData.clear();
+ }
+
+ DRW_Entity( const DRW_Entity& d )
+ {
+ eType = d.eType;
+ handle = d.handle;
+ handleBlock = d.handleBlock;
+ layer = d.layer;
+ lineType = d.lineType;
+ color = d.color;
+ color24 = d.color24;
+ colorName = d.colorName;
+ ltypeScale = d.ltypeScale;
+ visible = d.visible;
+ lWeight = d.lWeight;
+ space = d.space;
+ haveExtrusion = d.haveExtrusion;
+ curr = NULL;
+ }
+
+ virtual void applyExtrusion() = 0;
+
+protected:
+ void parseCode( int code, dxfReader* reader );
+ void calculateAxis( DRW_Coord extPoint );
+ void extrudePoint( DRW_Coord extPoint, DRW_Coord* point );
+
+public:
+ enum DRW::ETYPE eType; /*!< enum: entity type, code 0 */
+ int handle; /*!< entity identifier, code 5 */
+ int handleBlock; /*!< Soft-pointer ID/handle to owner BLOCK_RECORD object, code 330 */
+ UTF8STRING layer; /*!< layer name, code 8 */
+ UTF8STRING lineType; /*!< line type, code 6 */
+ int color; /*!< entity color, code 62 */
+ enum DRW_LW_Conv::lineWidth lWeight; /*!< entity lineweight, code 370 */
+ double ltypeScale; /*!< linetype scale, code 48 */
+ bool visible; /*!< entity visibility, code 60 */
+ int color24; /*!< 24-bit color, code 420 */
+ std::string colorName; /*!< color name, code 430 */
+ int space; /*!< space indicator 0 = model, 1 paper, code 67*/
+ bool haveExtrusion; /*!< set to true if the entity have extrusion*/
+ std::vector<DRW_Variant*> extData; /*!< FIFO list of extended data, codes 1000 to 1071*/
+
+private:
+ DRW_Coord extAxisX;
+ DRW_Coord extAxisY;
+ DRW_Variant* curr;
+};
+
+
+// ! Class to handle point entity
+/*!
+ * Class to handle point entity
+ * @author Rallaz
+ */
+class DRW_Point : public DRW_Entity
+{
+public:
+ DRW_Point()
+ {
+ eType = DRW::POINT;
+ basePoint.z = extPoint.x = extPoint.y = 0;
+ extPoint.z = 1;
+ thickness = 0;
+ }
+
+ virtual void applyExtrusion() {}
+
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ DRW_Coord basePoint; /*!< base point, code 10, 20 & 30 */
+ double thickness; /*!< thickness, code 39 */
+ DRW_Coord extPoint; /*!< Dir extrusion normal vector, code 210, 220 & 230 */
+};
+
+// ! Class to handle line entity
+/*!
+ * Class to handle line entity
+ * @author Rallaz
+ */
+class DRW_Line : public DRW_Point
+{
+public:
+ DRW_Line()
+ {
+ eType = DRW::LINE;
+ secPoint.z = 0;
+ }
+
+ virtual void applyExtrusion() {}
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ DRW_Coord secPoint; /*!< second point, code 11, 21 & 31 */
+};
+
+// ! Class to handle ray entity
+/*!
+ * Class to handle ray entity
+ * @author Rallaz
+ */
+class DRW_Ray : public DRW_Line
+{
+public:
+ DRW_Ray()
+ {
+ eType = DRW::RAY;
+ }
+};
+
+// ! Class to handle xline entity
+/*!
+ * Class to handle xline entity
+ * @author Rallaz
+ */
+class DRW_Xline : public DRW_Line
+{
+public:
+ DRW_Xline()
+ {
+ eType = DRW::XLINE;
+ }
+};
+
+// ! Class to handle circle entity
+/*!
+ * Class to handle circle entity
+ * @author Rallaz
+ */
+class DRW_Circle : public DRW_Point
+{
+public:
+ DRW_Circle()
+ {
+ eType = DRW::CIRCLE;
+ radious = 0.0;
+ }
+
+ virtual void applyExtrusion();
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ double radious; /*!< radius, code 40 */
+};
+
+// ! Class to handle arc entity
+/*!
+ * Class to handle arc entity
+ * @author Rallaz
+ */
+class DRW_Arc : public DRW_Circle
+{
+public:
+ DRW_Arc()
+ {
+ eType = DRW::ARC;
+ isccw = 1;
+ staangle = 0.0;
+ endangle = 0.0;
+ }
+
+ virtual void applyExtrusion();
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ double staangle; /*!< start angle, code 50 in radians*/
+ double endangle; /*!< end angle, code 51 in radians */
+ int isccw; /*!< is counter clockwise arc?, only used in hatch, code 73 */
+};
+
+// ! Class to handle ellipse entity
+/*!
+ * Class to handle ellipse and elliptic arc entity
+ * Note: start/end parameter are in radians for ellipse entity but
+ * for hatch boundary are in degrees
+ * @author Rallaz
+ */
+class DRW_Ellipse : public DRW_Line
+{
+public:
+ DRW_Ellipse()
+ {
+ eType = DRW::ELLIPSE;
+ isccw = 1;
+ ratio = 1.0;
+ staparam = endparam = 0;
+ }
+
+ void parseCode( int code, dxfReader* reader );
+ void toPolyline( DRW_Polyline* pol, int parts = 128 );
+ virtual void applyExtrusion();
+ void correctAxis();
+
+public:
+ double ratio; /*!< ratio, code 40 */
+ double staparam; /*!< start parameter, code 41, 0.0 for full ellipse*/
+ double endparam; /*!< end parameter, code 42, 2*PI for full ellipse */
+ int isccw; /*!< is counter clockwise arc?, only used in hatch, code 73 */
+};
+
+// ! Class to handle trace entity
+/*!
+ * Class to handle trace entity
+ * @author Rallaz
+ */
+class DRW_Trace : public DRW_Line
+{
+public:
+ DRW_Trace()
+ {
+ eType = DRW::TRACE;
+ thirdPoint.z = 0;
+ fourPoint.z = 0;
+ }
+
+ virtual void applyExtrusion();
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ DRW_Coord thirdPoint; /*!< third point, code 12, 22 & 32 */
+ DRW_Coord fourPoint; /*!< four point, code 13, 23 & 33 */
+};
+
+// ! Class to handle solid entity
+/*!
+ * Class to handle solid entity
+ * @author Rallaz
+ */
+class DRW_Solid : public DRW_Trace
+{
+public:
+ DRW_Solid()
+ {
+ eType = DRW::SOLID;
+ }
+
+ void parseCode( int code, dxfReader* reader );
+};
+
+// ! Class to handle 3dface entity
+/*!
+ * Class to handle 3dface entity
+ * @author Rallaz
+ */
+class DRW_3Dface : public DRW_Trace
+{
+public:
+ DRW_3Dface()
+ {
+ eType = DRW::E3DFACE;
+ invisibleflag = 0;
+ }
+
+ virtual void applyExtrusion() {}
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ int invisibleflag; /*!< invisible edge flag, code 70 */
+};
+
+// ! Class to handle block entries
+/*!
+ * Class to handle block entries
+ * @author Rallaz
+ */
+class DRW_Block : public DRW_Point
+{
+public:
+ DRW_Block()
+ {
+ eType = DRW::BLOCK;
+ layer = "0";
+ flags = 0;
+ name = "*U0";
+ }
+
+ virtual void applyExtrusion() {}
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ UTF8STRING name; /*!< block name, code 2 */
+ int flags; /*!< block type, code 70 */
+};
+
+
+// ! Class to handle insert entries
+/*!
+ * Class to handle insert entries
+ * @author Rallaz
+ */
+class DRW_Insert : public DRW_Point
+{
+public:
+ DRW_Insert()
+ {
+ eType = DRW::INSERT;
+ xscale = 1;
+ yscale = 1;
+ zscale = 1;
+ angle = 0;
+ colcount = 1;
+ rowcount = 1;
+ colspace = 0;
+ rowspace = 0;
+ }
+
+ virtual void applyExtrusion() { DRW_Point::applyExtrusion(); }
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ UTF8STRING name; /*!< block name, code 2 */
+ double xscale; /*!< x scale factor, code 41 */
+ double yscale; /*!< y scale factor, code 42 */
+ double zscale; /*!< z scale factor, code 43 */
+ double angle; /*!< rotation angle, code 50 */
+ int colcount; /*!< column count, code 70 */
+ int rowcount; /*!< row count, code 71 */
+ double colspace; /*!< column space, code 44 */
+ double rowspace; /*!< row space, code 45 */
+};
+
+// ! Class to handle lwpolyline entity
+/*!
+ * Class to handle lwpolyline entity
+ * @author Rallaz
+ */
+class DRW_LWPolyline : public DRW_Entity
+{
+public:
+ DRW_LWPolyline()
+ {
+ eType = DRW::LWPOLYLINE;
+ elevation = thickness = width = 0.0;
+ flags = 0;
+ extPoint.x = extPoint.y = 0;
+ extPoint.z = 1;
+ vertex = NULL;
+ vertexnum = 0;
+ }
+
+ ~DRW_LWPolyline()
+ {
+ while( !vertlist.empty() )
+ {
+ vertlist.pop_back();
+ }
+ }
+
+ virtual void applyExtrusion();
+
+ void addVertex( DRW_Vertex2D v )
+ {
+ DRW_Vertex2D* vert = new DRW_Vertex2D();
+
+ vert->x = v.x;
+ vert->y = v.y;
+ vert->stawidth = v.stawidth;
+ vert->endwidth = v.endwidth;
+ vert->bulge = v.bulge;
+ vertlist.push_back( vert );
+ }
+
+ DRW_Vertex2D* addVertex()
+ {
+ DRW_Vertex2D* vert = new DRW_Vertex2D();
+
+ vert->stawidth = 0;
+ vert->endwidth = 0;
+ vert->bulge = 0;
+ vertlist.push_back( vert );
+ return vert;
+ }
+
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ int vertexnum; /*!< number of vertex, code 90 */
+ int flags; /*!< polyline flag, code 70, default 0 */
+ double width; /*!< constant width, code 43 */
+ double elevation; /*!< elevation, code 38 */
+ double thickness; /*!< thickness, code 39 */
+ DRW_Coord extPoint; /*!< Dir extrusion normal vector, code 210, 220 & 230 */
+ DRW_Vertex2D* vertex; /*!< current vertex to add data */
+ std::vector<DRW_Vertex2D*> vertlist; /*!< vertex list */
+};
+
+// ! Class to handle insert entries
+/*!
+ * Class to handle insert entries
+ * @author Rallaz
+ */
+class DRW_Text : public DRW_Line
+{
+public:
+ // ! Vertical alignments.
+ enum VAlign
+ {
+ VBaseLine = 0, /*!< Top = 0 */
+ VBottom, /*!< Bottom = 1 */
+ VMiddle, /*!< Middle = 2 */
+ VTop /*!< Top = 3 */
+ };
+
+ // ! Horizontal alignments.
+ enum HAlign
+ {
+ HLeft = 0, /*!< Left = 0 */
+ HCenter, /*!< Centered = 1 */
+ HRight, /*!< Right = 2 */
+ HAligned, /*!< Aligned = 3 (if VAlign==0) */
+ HMiddle, /*!< middle = 4 (if VAlign==0) */
+ HFit /*!< fit into point = 5 (if VAlign==0) */
+ };
+
+ DRW_Text()
+ {
+ eType = DRW::TEXT;
+ angle = 0;
+ widthscale = 1;
+ oblique = 0;
+ style = "STANDARD";
+ textgen = 0;
+ alignH = HLeft;
+ alignV = VBaseLine;
+ height = 0.0;
+ }
+
+ virtual void applyExtrusion() {} // RLZ TODO
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ double height; /*!< height text, code 40 */
+ UTF8STRING text; /*!< text string, code 1 */
+ double angle; /*!< rotation angle in degrees (360), code 50 */
+ double widthscale; /*!< width factor, code 41 */
+ double oblique; /*!< oblique angle, code 51 */
+ UTF8STRING style; /*!< style name, code 7 */
+ int textgen; /*!< text generation, code 71 */
+ enum HAlign alignH; /*!< horizontal align, code 72 */
+ enum VAlign alignV; /*!< vertical align, code 73 */
+};
+
+// ! Class to handle insert entries
+/*!
+ * Class to handle insert entries
+ * @author Rallaz
+ */
+class DRW_MText : public DRW_Text
+{
+public:
+ // ! Attachments.
+ enum Attach
+ {
+ TopLeft = 1,
+ TopCenter,
+ TopRight,
+ MiddleLeft,
+ MiddleCenter,
+ MiddleRight,
+ BottomLeft,
+ BottomCenter,
+ BottomRight
+ };
+
+ DRW_MText()
+ {
+ eType = DRW::MTEXT;
+ interlin = 1;
+ alignV = (VAlign) TopLeft;
+ textgen = 1;
+ haveXAxis = false; // if true needed to recalculate angle
+ }
+
+ void parseCode( int code, dxfReader* reader );
+ void updateAngle(); // recalculate angle if 'haveXAxis' is true
+
+public:
+ double interlin; /*!< width factor, code 44 */
+
+private:
+ bool haveXAxis;
+};
+
+// ! Class to handle vertex
+/*!
+ * Class to handle vertex for polyline entity
+ * @author Rallaz
+ */
+class DRW_Vertex : public DRW_Point
+{
+public:
+ DRW_Vertex()
+ {
+ eType = DRW::VERTEX;
+ stawidth = endwidth = bulge = 0;
+ vindex1 = vindex2 = vindex3 = vindex4 = 0;
+ flags = identifier = 0;
+ tgdir = 0.0;
+ }
+
+ DRW_Vertex( double sx, double sy, double sz, double b )
+ {
+ stawidth = endwidth = 0;
+ vindex1 = vindex2 = vindex3 = vindex4 = 0;
+ flags = identifier = 0;
+ basePoint.x = sx;
+ basePoint.y = sy;
+ basePoint.z = sz;
+ bulge = b;
+ tgdir = 0.0;
+ }
+
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ double stawidth; /*!< Start width, code 40 */
+ double endwidth; /*!< End width, code 41 */
+ double bulge; /*!< bulge, code 42 */
+
+ int flags; /*!< vertex flag, code 70, default 0 */
+ double tgdir; /*!< curve fit tangent direction, code 50 */
+ int vindex1; /*!< polyface mesh vertex index, code 71, default 0 */
+ int vindex2; /*!< polyface mesh vertex index, code 72, default 0 */
+ int vindex3; /*!< polyface mesh vertex index, code 73, default 0 */
+ int vindex4; /*!< polyface mesh vertex index, code 74, default 0 */
+ int identifier; /*!< vertex identifier, code 91, default 0 */
+};
+
+// ! Class to handle polyline entity
+/*!
+ * Class to handle polyline entity
+ * @author Rallaz
+ */
+class DRW_Polyline : public DRW_Point
+{
+public:
+ DRW_Polyline()
+ {
+ eType = DRW::POLYLINE;
+ defstawidth = defendwidth = 0.0;
+ basePoint.x = basePoint.y = 0.0;
+ flags = vertexcount = facecount = 0;
+ smoothM = smoothN = curvetype = 0;
+ }
+
+ ~DRW_Polyline()
+ {
+ while( !vertlist.empty() )
+ {
+ vertlist.pop_back();
+ }
+ }
+
+ void addVertex( DRW_Vertex v )
+ {
+ DRW_Vertex* vert = new DRW_Vertex();
+
+ vert->basePoint.x = v.basePoint.x;
+ vert->basePoint.y = v.basePoint.y;
+ vert->basePoint.z = v.basePoint.z;
+ vert->stawidth = v.stawidth;
+ vert->endwidth = v.endwidth;
+ vert->bulge = v.bulge;
+ vertlist.push_back( vert );
+ }
+
+ void appendVertex( DRW_Vertex* v )
+ {
+ vertlist.push_back( v );
+ }
+
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ int flags; /*!< polyline flag, code 70, default 0 */
+ double defstawidth; /*!< Start width, code 40, default 0 */
+ double defendwidth; /*!< End width, code 41, default 0 */
+ int vertexcount; /*!< polygon mesh M vertex or polyface vertex num, code 71, default 0 */
+ int facecount; /*!< polygon mesh N vertex or polyface face num, code 72, default 0 */
+ int smoothM; /*!< smooth surface M density, code 73, default 0 */
+ int smoothN; /*!< smooth surface M density, code 74, default 0 */
+ int curvetype; /*!< curves & smooth surface type, code 75, default 0 */
+
+ std::vector<DRW_Vertex*> vertlist; /*!< vertex list */
+};
+
+
+// ! Class to handle spline entity
+/*!
+ * Class to handle spline entity
+ * @author Rallaz
+ */
+class DRW_Spline : public DRW_Entity
+{
+public:
+ DRW_Spline()
+ {
+ eType = DRW::SPLINE;
+ flags = nknots = ncontrol = nfit = 0;
+ ex = ey = 0.0;
+ ez = 1.0;
+ tolknot = tolcontrol = tolfit = 0.0000001;
+ tgsx = tgsy = tgsz = tgex = tgey = tgez = 0.0;
+ degree = 0;
+ controlpoint = 0;
+ fitpoint = 0;
+ }
+
+ ~DRW_Spline()
+ {
+ while( !controllist.empty() )
+ {
+ controllist.pop_back();
+ }
+
+ while( !fitlist.empty() )
+ {
+ fitlist.pop_back();
+ }
+ }
+
+ virtual void applyExtrusion() {}
+
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ double ex; /*!< normal vector x coordinate, code 210 */
+ double ey; /*!< normal vector y coordinate, code 220 */
+ double ez; /*!< normal vector z coordinate, code 230 */
+ double tgsx; /*!< start tangent x coordinate, code 12 */
+ double tgsy; /*!< start tangent y coordinate, code 22 */
+ double tgsz; /*!< start tangent z coordinate, code 32 */
+ double tgex; /*!< end tangent x coordinate, code 13 */
+ double tgey; /*!< end tangent y coordinate, code 23 */
+ double tgez; /*!< end tangent z coordinate, code 33 */
+ int flags; /*!< spline flag, code 70 */
+ int degree; /*!< degree of the spline, code 71 */
+ int nknots; /*!< number of knots, code 72, default 0 */
+ int ncontrol; /*!< number of control points, code 73, default 0 */
+ int nfit; /*!< number of fit points, code 74, default 0 */
+ double tolknot; /*!< knot tolerance, code 42, default 0.0000001 */
+ double tolcontrol; /*!< control point tolerance, code 43, default 0.0000001 */
+ double tolfit; /*!< fit point tolerance, code 44, default 0.0000001 */
+
+ std::vector<double> knotslist; /*!< knots list, code 40 */
+ std::vector<DRW_Coord*> controllist; /*!< control points list, code 10, 20 & 30 */
+ std::vector<DRW_Coord*> fitlist; /*!< fit points list, code 11, 21 & 31 */
+
+private:
+ DRW_Coord* controlpoint; /*!< current control point to add data */
+ DRW_Coord* fitpoint; /*!< current fit point to add data */
+};
+
+// ! Class to handle hatch loop
+/*!
+ * Class to handle hatch loop
+ * @author Rallaz
+ */
+class DRW_HatchLoop
+{
+public:
+ DRW_HatchLoop( int t )
+ {
+ type = t;
+ numedges = 0;
+ }
+
+ ~DRW_HatchLoop()
+ {
+/* while (!pollist.empty()) {
+ * pollist.pop_back();
+ * }*/
+ while( !objlist.empty() )
+ {
+ objlist.pop_back();
+ }
+ }
+
+ void update()
+ {
+ numedges = objlist.size();
+ }
+
+public:
+ int type; /*!< boundary path type, code 92, polyline=2, default=0 */
+ int numedges; /*!< number of edges (if not a polyline), code 93 */
+// TODO: store lwpolylines as entities
+// std::vector<DRW_LWPolyline *> pollist; /*!< polyline list */
+ std::vector<DRW_Entity*> objlist; /*!< entities list */
+};
+
+// ! Class to handle hatch entity
+/*!
+ * Class to handle hatch entity
+ * @author Rallaz
+ */
+// TODO: handle lwpolylines, splines and ellipses
+class DRW_Hatch : public DRW_Point
+{
+public:
+ DRW_Hatch()
+ {
+ eType = DRW::HATCH;
+ angle = scale = 0.0;
+ basePoint.x = basePoint.y = basePoint.z = 0.0;
+ loopsnum = hstyle = associative = 0;
+ solid = hpattern = 1;
+ deflines = doubleflag = 0;
+ loop = NULL;
+ clearEntities();
+ ispol = false;
+ }
+
+ ~DRW_Hatch()
+ {
+ while( !looplist.empty() )
+ {
+ looplist.pop_back();
+ }
+ }
+
+ void appendLoop( DRW_HatchLoop* v )
+ {
+ looplist.push_back( v );
+ }
+
+ virtual void applyExtrusion() {}
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ UTF8STRING name; /*!< hatch pattern name, code 2 */
+ int solid; /*!< solid fill flag, code 70, solid=1, pattern=0 */
+ int associative; /*!< associativity, code 71, associatve=1, non-assoc.=0 */
+ int hstyle; /*!< hatch style, code 75 */
+ int hpattern; /*!< hatch pattern type, code 76 */
+ int doubleflag; /*!< hatch pattern double flag, code 77, double=1, single=0 */
+ int loopsnum; /*!< namber of boundary paths (loops), code 91 */
+ double angle; /*!< hatch pattern angle, code 52 */
+ double scale; /*!< hatch pattern scale, code 41 */
+ int deflines; /*!< number of pattern definition lines, code 78 */
+
+ std::vector<DRW_HatchLoop*> looplist; /*!< polyline list */
+
+private:
+ void clearEntities()
+ {
+ pt = line = NULL;
+ pline = NULL;
+ arc = NULL;
+ ellipse = NULL;
+ spline = NULL;
+ plvert = NULL;
+ }
+
+ void addLine()
+ {
+ clearEntities();
+
+ if( loop )
+ {
+ pt = line = new DRW_Line;
+ loop->objlist.push_back( line );
+ }
+ }
+
+ void addArc()
+ {
+ clearEntities();
+
+ if( loop )
+ {
+ pt = arc = new DRW_Arc;
+ loop->objlist.push_back( arc );
+ }
+ }
+
+ void addEllipse()
+ {
+ clearEntities();
+
+ if( loop )
+ {
+ pt = ellipse = new DRW_Ellipse;
+ loop->objlist.push_back( ellipse );
+ }
+ }
+
+ void addSpline()
+ {
+ clearEntities();
+
+ if( loop )
+ {
+ pt = NULL;
+ spline = new DRW_Spline;
+ loop->objlist.push_back( spline );
+ }
+ }
+
+ DRW_HatchLoop* loop; /*!< current loop to add data */
+ DRW_Line* line;
+ DRW_Arc* arc;
+ DRW_Ellipse* ellipse;
+ DRW_Spline* spline;
+ DRW_LWPolyline* pline;
+ DRW_Point* pt;
+ DRW_Vertex2D* plvert;
+ bool ispol;
+};
+
+// ! Class to handle image entity
+/*!
+ * Class to handle image entity
+ * @author Rallaz
+ */
+class DRW_Image : public DRW_Line
+{
+public:
+ DRW_Image()
+ {
+ eType = DRW::IMAGE;
+ vz = fade = clip = 0;
+ brightness = contrast = 50;
+ vx = vy = sizeu = sizev = dz = 0.0;
+ }
+
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ std::string ref; /*!< Hard reference to imagedef object, code 340 */
+ double vx; /*!< V-vector of single pixel, x coordinate, code 12 */
+ double vy; /*!< V-vector of single pixel, y coordinate, code 22 */
+ double vz; /*!< V-vector of single pixel, z coordinate, code 32 */
+ double sizeu; /*!< image size in pixels, U value, code 13 */
+ double sizev; /*!< image size in pixels, V value, code 23 */
+ double dz; /*!< z coordinate, code 33 */
+ int clip; /*!< Clipping state, code 280, 0=off 1=on */
+ int brightness; /*!< Brightness value, code 281, (0-100) default 50 */
+ int contrast; /*!< Brightness value, code 282, (0-100) default 50 */
+ int fade; /*!< Brightness value, code 283, (0-100) default 0 */
+};
+
+
+// ! Base class for dimension entity
+/*!
+ * Base class for dimension entity
+ * @author Rallaz
+ */
+class DRW_Dimension : public DRW_Entity
+{
+public:
+ DRW_Dimension()
+ {
+ eType = DRW::DIMENSION;
+ linesty = 1;
+ linefactor = extPoint.z = 1.0;
+ angle = oblique = rot = 0.0;
+ align = 5;
+ style = "STANDARD";
+ defPoint.z = extPoint.x = extPoint.y = 0;
+ textPoint.z = rot = 0;
+ clonePoint.x = clonePoint.y = clonePoint.z = 0;
+ type = 0;
+ length = 0.0;
+ }
+
+ DRW_Dimension( const DRW_Dimension& d ) : DRW_Entity( d )
+ {
+ eType = DRW::DIMENSION;
+ type = d.type;
+ name = d.name;
+ defPoint = d.defPoint;
+ textPoint = d.textPoint;
+ text = d.text;
+ style = d.style;
+ align = d.align;
+ linesty = d.linesty;
+ linefactor = d.linefactor;
+ rot = d.rot;
+ extPoint = d.extPoint;
+ clonePoint = d.clonePoint;
+ def1 = d.def1;
+ def2 = d.def2;
+ angle = d.angle;
+ oblique = d.oblique;
+ arcPoint = d.arcPoint;
+ circlePoint = d.circlePoint;
+ length = d.length;
+ }
+
+ virtual ~DRW_Dimension() {}
+
+ void parseCode( int code, dxfReader* reader );
+
+ virtual void applyExtrusion() {}
+
+ DRW_Coord getDefPoint() const { return defPoint; } /*!< Definition point, code 10, 20 & 30 */
+ void setDefPoint( const DRW_Coord& p ) { defPoint = p; }
+ DRW_Coord getTextPoint() const { return textPoint; } /*!< Middle point of text, code 11, 21 & 31 */
+ void setTextPoint( const DRW_Coord& p ) { textPoint = p; }
+ std::string getStyle() const { return style; } /*!< Dimension style, code 3 */
+ void setStyle( const std::string& s ) { style = s; }
+ int getAlign() const { return align; } /*!< attachment point, code 71 */
+ void setAlign( const int a ) { align = a; }
+ int getTextLineStyle() const { return linesty; } /*!< Dimension text line spacing style, code 72, default 1 */
+ void setTextLineStyle( const int l ) { linesty = l; }
+ std::string getText() const { return text; } /*!< Dimension text explicitly entered by the user, code 1 */
+ void setText( const std::string& t ) { text = t; }
+ double getTextLineFactor() const { return linefactor; } /*!< Dimension text line spacing factor, code 41, default 1? */
+ void setTextLineFactor( const double l ) { linefactor = l; }
+ double getDir() const { return rot; } /*!< rotation angle of the dimension text, code 53 (optional) default 0 */
+ void setDir( const double d ) { rot = d; }
+
+ DRW_Coord getExtrusion() { return extPoint; } /*!< extrusion, code 210, 220 & 230 */
+ void setExtrusion( const DRW_Coord& p ) { extPoint = p; }
+ std::string getName() { return name; } /*!< Name of the block that contains the entities, code 2 */
+ void setName( const std::string& s ) { name = s; }
+// int getType(){ return type;} /*!< Dimension type, code 70 */
+
+protected:
+ DRW_Coord getPt2() const { return clonePoint; }
+ void setPt2( const DRW_Coord& p ) { clonePoint = p; }
+ DRW_Coord getPt3() const { return def1; }
+ void setPt3( const DRW_Coord& p ) { def1 = p; }
+ DRW_Coord getPt4() const { return def2; }
+ void setPt4( const DRW_Coord& p ) { def2 = p; }
+ DRW_Coord getPt5() const { return circlePoint; }
+ void setPt5( const DRW_Coord& p ) { circlePoint = p; }
+ DRW_Coord getPt6() const { return arcPoint; }
+ void setPt6( const DRW_Coord& p ) { arcPoint = p; }
+ double getAn50() const { return angle; } /*!< Angle of rotated, horizontal, or vertical dimensions, code 50 */
+ void setAn50( const double d ) { angle = d; }
+ double getOb52() const { return oblique; } /*!< oblique angle, code 52 */
+ void setOb52( const double d ) { oblique = d; }
+ double getRa40() const { return length; } /*!< Leader length, code 40 */
+ void setRa40( const double d ) { length = d; }
+
+public:
+ int type; /*!< Dimension type, code 70 */
+
+private:
+ std::string name; /*!< Name of the block that contains the entities, code 2 */
+ DRW_Coord defPoint; /*!< definition point, code 10, 20 & 30 (WCS) */
+ DRW_Coord textPoint; /*!< Middle point of text, code 11, 21 & 31 (OCS) */
+ UTF8STRING text; /*!< Dimension text explicitly entered by the user, code 1 */
+ UTF8STRING style; /*!< Dimension style, code 3 */
+ int align; /*!< attachment point, code 71 */
+ int linesty; /*!< Dimension text line spacing style, code 72, default 1 */
+ double linefactor; /*!< Dimension text line spacing factor, code 41, default 1? (value range 0.25 to 4.00*/
+ double rot; /*!< rotation angle of the dimension text, code 53 */
+ DRW_Coord extPoint; /*!< extrusion normal vector, code 210, 220 & 230 */
+
+ // double hdir; /*!< horizontal direction for the dimension, code 51, default ? */
+ DRW_Coord clonePoint; /*!< Insertion point for clones (Baseline & Continue), code 12, 22 & 32 (OCS) */
+ DRW_Coord def1; /*!< Definition point 1for linear & angular, code 13, 23 & 33 (WCS) */
+ DRW_Coord def2; /*!< Definition point 2, code 14, 24 & 34 (WCS) */
+ double angle; /*!< Angle of rotated, horizontal, or vertical dimensions, code 50 */
+ double oblique; /*!< oblique angle, code 52 */
+
+ DRW_Coord circlePoint; /*!< Definition point for diameter, radius & angular dims code 15, 25 & 35 (WCS) */
+ DRW_Coord arcPoint; /*!< Point defining dimension arc, x coordinate, code 16, 26 & 36 (OCS) */
+ double length; /*!< Leader length, code 40 */
+};
+
+
+// ! Class to handle aligned dimension entity
+/*!
+ * Class to handle aligned dimension entity
+ * @author Rallaz
+ */
+class DRW_DimAligned : public DRW_Dimension
+{
+public:
+ DRW_DimAligned()
+ {
+ eType = DRW::DIMALIGNED;
+ }
+
+ DRW_DimAligned( const DRW_Dimension& d ) : DRW_Dimension( d )
+ {
+ eType = DRW::DIMALIGNED;
+ }
+
+ DRW_Coord getClonepoint() const { return getPt2(); } /*!< Insertion for clones (Baseline & Continue), 12, 22 & 32 */
+ void setClonePoint( DRW_Coord& c ) { setPt2( c ); }
+
+ DRW_Coord getDimPoint() const { return getDefPoint(); } /*!< dim line location point, code 10, 20 & 30 */
+ void setDimPoint( const DRW_Coord& p ) { setDefPoint( p ); }
+ DRW_Coord getDef1Point() const { return getPt3(); } /*!< Definition point 1, code 13, 23 & 33 */
+ void setDef1Point( const DRW_Coord& p ) { setPt3( p ); }
+ DRW_Coord getDef2Point() const { return getPt4(); } /*!< Definition point 2, code 14, 24 & 34 */
+ void setDef2Point( const DRW_Coord& p ) { setPt4( p ); }
+};
+
+// ! Class to handle linear or rotated dimension entity
+/*!
+ * Class to handle linear or rotated dimension entity
+ * @author Rallaz
+ */
+class DRW_DimLinear : public DRW_DimAligned
+{
+public:
+ DRW_DimLinear()
+ {
+ eType = DRW::DIMLINEAR;
+ }
+
+ DRW_DimLinear( const DRW_Dimension& d ) : DRW_DimAligned( d )
+ {
+ eType = DRW::DIMLINEAR;
+ }
+
+ double getAngle() const { return getAn50(); } /*!< Angle of rotated, horizontal, or vertical dimensions, code 50 */
+ void setAngle( const double d ) { setAn50( d ); }
+ double getOblique() const { return getOb52(); } /*!< oblique angle, code 52 */
+ void setOblique( const double d ) { setOb52( d ); }
+};
+
+// ! Class to handle radial dimension entity
+/*!
+ * Class to handle aligned, linear or rotated dimension entity
+ * @author Rallaz
+ */
+class DRW_DimRadial : public DRW_Dimension
+{
+public:
+ DRW_DimRadial()
+ {
+ eType = DRW::DIMRADIAL;
+ }
+
+ DRW_DimRadial( const DRW_Dimension& d ) : DRW_Dimension( d )
+ {
+ eType = DRW::DIMRADIAL;
+ }
+
+ DRW_Coord getCenterPoint() const { return getDefPoint(); } /*!< center point, code 10, 20 & 30 */
+ void setCenterPoint( const DRW_Coord& p ) { setDefPoint( p ); }
+ DRW_Coord getDiameterPoint() const { return getPt5(); } /*!< Definition point for radius, code 15, 25 & 35 */
+ void setDiameterPoint( const DRW_Coord& p ) { setPt5( p ); }
+ double getLeaderLength() const { return getRa40(); } /*!< Leader length, code 40 */
+ void setLeaderLength( const double d ) { setRa40( d ); }
+};
+
+// ! Class to handle radial dimension entity
+/*!
+ * Class to handle aligned, linear or rotated dimension entity
+ * @author Rallaz
+ */
+class DRW_DimDiametric : public DRW_Dimension
+{
+public:
+ DRW_DimDiametric()
+ {
+ eType = DRW::DIMDIAMETRIC;
+ }
+
+ DRW_DimDiametric( const DRW_Dimension& d ) : DRW_Dimension( d )
+ {
+ eType = DRW::DIMDIAMETRIC;
+ }
+
+ DRW_Coord getDiameter1Point() const { return getPt5(); } /*!< First definition point for diameter, code 15, 25 & 35 */
+ void setDiameter1Point( const DRW_Coord& p ) { setPt5( p ); }
+ DRW_Coord getDiameter2Point() const { return getDefPoint(); } /*!< Oposite point for diameter, code 10, 20 & 30 */
+ void setDiameter2Point( const DRW_Coord& p ) { setDefPoint( p ); }
+ double getLeaderLength() const { return getRa40(); } /*!< Leader length, code 40 */
+ void setLeaderLength( const double d ) { setRa40( d ); }
+};
+
+// ! Class to handle angular dimension entity
+/*!
+ * Class to handle angular dimension entity
+ * @author Rallaz
+ */
+class DRW_DimAngular : public DRW_Dimension
+{
+public:
+ DRW_DimAngular()
+ {
+ eType = DRW::DIMANGULAR;
+ }
+
+ DRW_DimAngular( const DRW_Dimension& d ) : DRW_Dimension( d )
+ {
+ eType = DRW::DIMANGULAR;
+ }
+
+ DRW_Coord getFirstLine1() const { return getPt3(); } /*!< Definition point line 1-1, code 13, 23 & 33 */
+ void setFirstLine1( const DRW_Coord& p ) { setPt3( p ); }
+ DRW_Coord getFirstLine2() const { return getPt4(); } /*!< Definition point line 1-2, code 14, 24 & 34 */
+ void setFirstLine2( const DRW_Coord& p ) { setPt4( p ); }
+ DRW_Coord getSecondLine1() const { return getPt5(); } /*!< Definition point line 2-1, code 15, 25 & 35 */
+ void setSecondLine1( const DRW_Coord& p ) { setPt5( p ); }
+ DRW_Coord getSecondLine2() const { return getDefPoint(); } /*!< Definition point line 2-2, code 10, 20 & 30 */
+ void setSecondLine2( const DRW_Coord& p ) { setDefPoint( p ); }
+ DRW_Coord getDimPoint() const { return getPt6(); } /*!< Dimension definition point, code 16, 26 & 36 */
+ void setDimPoint( const DRW_Coord& p ) { setPt6( p ); }
+};
+
+
+// ! Class to handle angular 3p dimension entity
+/*!
+ * Class to handle angular 3p dimension entity
+ * @author Rallaz
+ */
+class DRW_DimAngular3p : public DRW_Dimension
+{
+public:
+ DRW_DimAngular3p()
+ {
+ eType = DRW::DIMANGULAR3P;
+ }
+
+ DRW_DimAngular3p( const DRW_Dimension& d ) : DRW_Dimension( d )
+ {
+ eType = DRW::DIMANGULAR3P;
+ }
+
+ DRW_Coord getFirstLine() const { return getPt3(); } /*!< Definition point line 1, code 13, 23 & 33 */
+ void setFirstLine( const DRW_Coord& p ) { setPt3( p ); }
+ DRW_Coord getSecondLine() const { return getPt4(); } /*!< Definition point line 2, code 14, 24 & 34 */
+ void setSecondLine( const DRW_Coord& p ) { setPt4( p ); }
+ DRW_Coord getVertexPoint() const { return getPt5(); } /*!< Vertex point, code 15, 25 & 35 */
+ void SetVertexPoint( const DRW_Coord& p ) { setPt5( p ); }
+ DRW_Coord getDimPoint() const { return getDefPoint(); } /*!< Dimension definition point, code 10, 20 & 30 */
+ void setDimPoint( const DRW_Coord& p ) { setDefPoint( p ); }
+};
+
+// ! Class to handle ordinate dimension entity
+/*!
+ * Class to handle ordinate dimension entity
+ * @author Rallaz
+ */
+class DRW_DimOrdinate : public DRW_Dimension
+{
+public:
+ DRW_DimOrdinate()
+ {
+ eType = DRW::DIMORDINATE;
+ }
+
+ DRW_DimOrdinate( const DRW_Dimension& d ) : DRW_Dimension( d )
+ {
+ eType = DRW::DIMORDINATE;
+ }
+
+ DRW_Coord getOriginPoint() const { return getDefPoint(); } /*!< Origin definition point, code 10, 20 & 30 */
+ void setOriginPoint( const DRW_Coord& p ) { setDefPoint( p ); }
+ DRW_Coord getFirstLine() const { return getPt3(); } /*!< Feature location point, code 13, 23 & 33 */
+ void setFirstLine( const DRW_Coord& p ) { setPt3( p ); }
+ DRW_Coord getSecondLine() const { return getPt4(); } /*!< Leader end point, code 14, 24 & 34 */
+ void setSecondLine( const DRW_Coord& p ) { setPt4( p ); }
+};
+
+
+// ! Class to handle leader entity
+/*!
+ * Class to handle leader entity
+ * @author Rallaz
+ */
+class DRW_Leader : public DRW_Entity
+{
+public:
+ DRW_Leader()
+ {
+ eType = DRW::LEADER;
+ flag = 3;
+ hookflag = vertnum = leadertype = 0;
+ extrusionPoint.x = extrusionPoint.y = 0.0;
+ arrow = 1;
+ extrusionPoint.z = 1.0;
+ hookline = 0;
+ textheight = textwidth = 0.0;
+ coloruse = 0;
+ vertexpoint = NULL;
+ }
+
+ ~DRW_Leader()
+ {
+ while( !vertexlist.empty() )
+ {
+ vertexlist.pop_back();
+ }
+ }
+
+ virtual void applyExtrusion() {}
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ UTF8STRING style; /*!< Dimension style name, code 3 */
+ int arrow; /*!< Arrowhead flag, code 71, 0=Disabled; 1=Enabled */
+ int leadertype; /*!< Leader path type, code 72, 0=Straight line segments; 1=Spline */
+ int flag; /*!< Leader creation flag, code 73, default 3 */
+ int hookline; /*!< Hook line direction flag, code 74, default 1 */
+ int hookflag; /*!< Hook line flag, code 75 */
+ double textheight; /*!< Text annotation height, code 40 */
+ double textwidth; /*!< Text annotation width, code 41 */
+ int vertnum; /*!< Number of vertices, code 76 */
+ int coloruse; /*!< Color to use if leader's DIMCLRD = BYBLOCK, code 77 */
+ std::string handle; /*!< Hard reference to associated annotation, code 340 */
+ DRW_Coord extrusionPoint; /*!< Normal vector, code 210, 220 & 230 */
+ DRW_Coord horizdir; /*!< "Horizontal" direction for leader, code 211, 221 & 231 */
+ DRW_Coord offsetblock; /*!< Offset of last leader vertex from block, code 212, 222 & 232 */
+ DRW_Coord offsettext; /*!< Offset of last leader vertex from annotation, code 213, 223 & 233 */
+
+ std::vector<DRW_Coord*> vertexlist; /*!< vertex points list, code 10, 20 & 30 */
+
+private:
+ DRW_Coord* vertexpoint; /*!< current control point to add data */
+};
+
+// ! Class to handle viewport entity
+/*!
+ * Class to handle viewport entity
+ * @author Rallaz
+ */
+class DRW_Viewport : public DRW_Point
+{
+public:
+ DRW_Viewport()
+ {
+ eType = DRW::VIEWPORT;
+ vpID = vpstatus = 0;
+ pswidth = 205;
+ psheight = 156;
+ centerPX = 128.5;
+ centerPY = 97.5;
+ }
+
+ virtual void applyExtrusion() {}
+ void parseCode( int code, dxfReader* reader );
+
+public:
+ double pswidth; /*!< Width in paper space units, code 40 */
+ double psheight; /*!< Height in paper space units, code 41 */
+ int vpstatus; /*!< Viewport status, code 68 */
+ int vpID; /*!< Viewport ID, code 69 */
+ double centerPX; /*!< view center piont X, code 12 */
+ double centerPY; /*!< view center piont Y, code 22 */
+};
+
+
+#endif
+
+// EOF