1 /****************************************************************************
2 **
3 ** This file is part of the LibreCAD project, a 2D CAD program
4 **
5 ** Copyright (C) 2010 R. van Twisk (librecad@rvt.dds.nl)
6 ** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
7 **
8 **
9 ** This file may be distributed and/or modified under the terms of the
10 ** GNU General Public License version 2 as published by the Free Software
11 ** Foundation and appearing in the file gpl-2.0.txt included in the
12 ** packaging of this file.
13 **
14 ** This program is distributed in the hope that it will be useful,
15 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 ** GNU General Public License for more details.
18 **
19 ** You should have received a copy of the GNU General Public License
20 ** along with this program; if not, write to the Free Software
21 ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22 **
23 ** This copyright notice MUST APPEAR in all copies of the script!
24 **
25 **********************************************************************/
26 
27 #ifndef DL_CREATIONINTERFACE_H
28 #define DL_CREATIONINTERFACE_H
29 
30 #include <cstring>
31 
32 #include "dl_attributes.h"
33 #include "dl_codes.h"
34 #include "dl_entities.h"
35 #include "dl_extrusion.h"
36 
37 /**
38  * Abstract class (interface) for the creation of new entities.
39  * Inherit your class which takes care of the entities in the
40  * processed DXF file from this interface.
41  *
42  * Double arrays passed to your implementation contain 3 double
43  * values for x, y, z coordinates unless stated differently.
44  *
45  * @author Andrew Mustun
46  */
47 class DL_CreationInterface {
48 public:
DL_CreationInterface()49     DL_CreationInterface() {
50         extrusion = new DL_Extrusion;
51     }
~DL_CreationInterface()52     virtual ~DL_CreationInterface() {
53         delete extrusion;
54     }
55 
56     /**
57      * Called for every layer.
58      */
59     virtual void addLayer(const DL_LayerData& data) = 0;
60 
61     /**
62      * Called for every block. Note: all entities added after this
63      * command go into this block until endBlock() is called.
64     *
65      * @see endBlock()
66      */
67     virtual void addBlock(const DL_BlockData& data) = 0;
68 
69     /** Called to end the current block */
70     virtual void endBlock() = 0;
71 
72     /** Called for every point */
73     virtual void addPoint(const DL_PointData& data) = 0;
74 
75     /** Called for every line */
76     virtual void addLine(const DL_LineData& data) = 0;
77 
78     /** Called for every arc */
79     virtual void addArc(const DL_ArcData& data) = 0;
80 
81     /** Called for every circle */
82     virtual void addCircle(const DL_CircleData& data) = 0;
83 
84     /** Called for every ellipse */
85     virtual void addEllipse(const DL_EllipseData& data) = 0;
86 
87     /** Called for every polyline start */
88     virtual void addPolyline(const DL_PolylineData& data) = 0;
89 
90     /** Called for every polyline vertex */
91     virtual void addVertex(const DL_VertexData& data) = 0;
92 
93 	/** Called for every spline */
94     virtual void addSpline(const DL_SplineData& data) = 0;
95 
96 	/** Called for every spline control point */
97     virtual void addControlPoint(const DL_ControlPointData& data) = 0;
98 
99 	/** Called for every spline knot value */
100     virtual void addKnot(const DL_KnotData& data) = 0;
101 
102     /** Called for every insert. */
103     virtual void addInsert(const DL_InsertData& data) = 0;
104 
105     /** Called for every trace start */
106     virtual void addTrace(const DL_TraceData& data) = 0;
107 
108     /** Called for every 3dface start */
109     virtual void add3dFace(const DL_3dFaceData& data) = 0;
110 
111     /** Called for every solid start */
112     virtual void addSolid(const DL_SolidData& data) = 0;
113 
114 
115     /** Called for every Multi Text entity. */
116     virtual void addMText(const DL_MTextData& data) = 0;
117 
118     /**
119      * Called for additional text chunks for MTEXT entities.
120      * The chunks come at 250 character in size each. Note that
121      * those chunks come <b>before</b> the actual MTEXT entity.
122      */
123     virtual void addMTextChunk(const char* text) = 0;
124 
125     /** Called for every Text entity. */
126     virtual void addText(const DL_TextData& data) = 0;
127 
128     /**
129      * Called for every aligned dimension entity.
130      */
131     virtual void addDimAlign(const DL_DimensionData& data,
132                              const DL_DimAlignedData& edata) = 0;
133     /**
134      * Called for every linear or rotated dimension entity.
135      */
136     virtual void addDimLinear(const DL_DimensionData& data,
137                               const DL_DimLinearData& edata) = 0;
138 
139 	/**
140      * Called for every radial dimension entity.
141      */
142     virtual void addDimRadial(const DL_DimensionData& data,
143                               const DL_DimRadialData& edata) = 0;
144 
145 	/**
146      * Called for every diametric dimension entity.
147      */
148     virtual void addDimDiametric(const DL_DimensionData& data,
149                               const DL_DimDiametricData& edata) = 0;
150 
151 	/**
152      * Called for every angular dimension (2 lines version) entity.
153      */
154     virtual void addDimAngular(const DL_DimensionData& data,
155                               const DL_DimAngularData& edata) = 0;
156 
157 	/**
158      * Called for every angular dimension (3 points version) entity.
159      */
160     virtual void addDimAngular3P(const DL_DimensionData& data,
161                               const DL_DimAngular3PData& edata) = 0;
162 
163     /**
164      * Called for every ordinate dimension entity.
165      */
166     virtual void addDimOrdinate(const DL_DimensionData& data,
167                              const DL_DimOrdinateData& edata) = 0;
168 
169     /**
170 	 * Called for every leader start.
171 	 */
172     virtual void addLeader(const DL_LeaderData& data) = 0;
173 
174 	/**
175 	 * Called for every leader vertex
176 	 */
177     virtual void addLeaderVertex(const DL_LeaderVertexData& data) = 0;
178 
179 	/**
180 	 * Called for every hatch entity.
181 	 */
182     virtual void addHatch(const DL_HatchData& data) = 0;
183 
184 	/**
185 	 * Called for every image entity.
186 	 */
187     virtual void addImage(const DL_ImageData& data) = 0;
188 
189 	/**
190 	 * Called for every image definition.
191 	 */
192 	virtual void linkImage(const DL_ImageDefData& data) = 0;
193 
194 	/**
195 	 * Called for every hatch loop.
196 	 */
197     virtual void addHatchLoop(const DL_HatchLoopData& data) = 0;
198 
199 	/**
200 	 * Called for every hatch edge entity.
201 	 */
202     virtual void addHatchEdge(const DL_HatchEdgeData& data) = 0;
203 
204 	/**
205 	 * Called after an entity has been completed.
206 	 */
207     virtual void endEntity() = 0;
208 
209     /**
210      * Called for every comment in the DXF file (code 999).
211      */
212     virtual void addComment(const char* comment) = 0;
213 
214     /**
215      * Called for every vector variable in the DXF file (e.g. "$EXTMIN").
216      */
217     virtual void setVariableVector(const char* key,
218 	               double v1, double v2, double v3, int code) = 0;
219 
220     /**
221      * Called for every string variable in the DXF file (e.g. "$ACADVER").
222      */
223     virtual void setVariableString(const char* key, const char* value, int code) = 0;
224 
225     /**
226      * Called for every int variable in the DXF file (e.g. "$ACADMAINTVER").
227      */
228     virtual void setVariableInt(const char* key, int value, int code) = 0;
229 
230     /**
231      * Called for every double variable in the DXF file (e.g. "$DIMEXO").
232      */
233     virtual void setVariableDouble(const char* key, double value, int code) = 0;
234 
235      /**
236       * Called when a SEQEND occurs (when a POLYLINE or ATTRIB is done)
237       */
238      virtual void endSequence() = 0;
239 
240     /** Sets the current attributes for entities. */
setAttributes(const DL_Attributes & attrib)241     void setAttributes(const DL_Attributes& attrib) {
242         attributes = attrib;
243     }
244 
245     /** @return the current attributes used for new entities. */
getAttributes()246     DL_Attributes getAttributes() {
247         return attributes;
248     }
249 
250     /** Sets the current attributes for entities. */
setExtrusion(double dx,double dy,double dz,double elevation)251     void setExtrusion(double dx, double dy, double dz, double elevation) {
252         extrusion->setDirection(dx, dy, dz);
253 		extrusion->setElevation(elevation);
254     }
255 
256     /** @return the current attributes used for new entities. */
getExtrusion()257     DL_Extrusion* getExtrusion() {
258         return extrusion;
259     }
260 
261 protected:
262     DL_Attributes attributes;
263     DL_Extrusion *extrusion;
264 };
265 
266 #endif
267