xref: /AOO42X/main/filter/source/graphicfilter/idxf/dxfentrd.cxx (revision b1c5455db1639c48e26c568e4fa7ee78ca5d60ee)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_filter.hxx"
26 
27 #include <string.h>
28 #include <dxfentrd.hxx>
29 
30 //--------------------------DXFBasicEntity--------------------------------------
31 
DXFBasicEntity(DXFEntityType eThisType)32 DXFBasicEntity::DXFBasicEntity(DXFEntityType eThisType)
33 {
34     eType=eThisType;
35     pSucc=NULL;
36     strncpy(sLayer,"0", 2 );
37     strncpy(sLineType,"BYLAYER", 8 );
38     fElevation=0;
39     fThickness=0;
40     nColor=256;
41     nSpace=0;
42     aExtrusion.fx=0.0;
43     aExtrusion.fy=0.0;
44     aExtrusion.fz=1.0;
45 }
46 
Read(DXFGroupReader & rDGR)47 void DXFBasicEntity::Read(DXFGroupReader & rDGR)
48 {
49     while (rDGR.Read()!=0) EvaluateGroup(rDGR);
50 }
51 
EvaluateGroup(DXFGroupReader & rDGR)52 void DXFBasicEntity::EvaluateGroup(DXFGroupReader & rDGR)
53 {
54     switch (rDGR.GetG())
55     {
56         case   8: strncpy( sLayer, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
57         case   6: strncpy( sLineType, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
58         case  38: fElevation=rDGR.GetF(); break;
59         case  39: fThickness=rDGR.GetF(); break;
60         case  62: nColor=rDGR.GetI(); break;
61         case  67: nSpace=rDGR.GetI(); break;
62         case 210: aExtrusion.fx=rDGR.GetF(); break;
63         case 220: aExtrusion.fy=rDGR.GetF(); break;
64         case 230: aExtrusion.fz=rDGR.GetF(); break;
65     }
66 }
67 
~DXFBasicEntity()68 DXFBasicEntity::~DXFBasicEntity()
69 {
70 }
71 
72 //--------------------------DXFLineEntity---------------------------------------
73 
DXFLineEntity()74 DXFLineEntity::DXFLineEntity() : DXFBasicEntity(DXF_LINE)
75 {
76 }
77 
EvaluateGroup(DXFGroupReader & rDGR)78 void DXFLineEntity::EvaluateGroup(DXFGroupReader & rDGR)
79 {
80     switch (rDGR.GetG()) {
81         case 10: aP0.fx=rDGR.GetF(); break;
82         case 20: aP0.fy=rDGR.GetF(); break;
83         case 30: aP0.fz=rDGR.GetF(); break;
84         case 11: aP1.fx=rDGR.GetF(); break;
85         case 21: aP1.fy=rDGR.GetF(); break;
86         case 31: aP1.fz=rDGR.GetF(); break;
87         default: DXFBasicEntity::EvaluateGroup(rDGR);
88     }
89 }
90 
91 //--------------------------DXFPointEntity--------------------------------------
92 
DXFPointEntity()93 DXFPointEntity::DXFPointEntity() : DXFBasicEntity(DXF_POINT)
94 {
95 }
96 
EvaluateGroup(DXFGroupReader & rDGR)97 void DXFPointEntity::EvaluateGroup(DXFGroupReader & rDGR)
98 {
99     switch (rDGR.GetG()) {
100         case 10: aP0.fx=rDGR.GetF(); break;
101         case 20: aP0.fy=rDGR.GetF(); break;
102         case 30: aP0.fz=rDGR.GetF(); break;
103         default: DXFBasicEntity::EvaluateGroup(rDGR);
104     }
105 }
106 
107 //--------------------------DXFCircleEntity-------------------------------------
108 
DXFCircleEntity()109 DXFCircleEntity::DXFCircleEntity() : DXFBasicEntity(DXF_CIRCLE)
110 {
111     fRadius=1.0;
112 }
113 
EvaluateGroup(DXFGroupReader & rDGR)114 void DXFCircleEntity::EvaluateGroup(DXFGroupReader & rDGR)
115 {
116     switch (rDGR.GetG()) {
117         case 10: aP0.fx=rDGR.GetF(); break;
118         case 20: aP0.fy=rDGR.GetF(); break;
119         case 30: aP0.fz=rDGR.GetF(); break;
120         case 40: fRadius=rDGR.GetF(); break;
121         default: DXFBasicEntity::EvaluateGroup(rDGR);
122     }
123 }
124 
125 //--------------------------DXFArcEntity----------------------------------------
126 
DXFArcEntity()127 DXFArcEntity::DXFArcEntity() : DXFBasicEntity(DXF_ARC)
128 {
129     fRadius=1.0;
130     fStart=0;
131     fEnd=360.0;
132 }
133 
EvaluateGroup(DXFGroupReader & rDGR)134 void DXFArcEntity::EvaluateGroup(DXFGroupReader & rDGR)
135 {
136     switch (rDGR.GetG()) {
137         case 10: aP0.fx=rDGR.GetF(); break;
138         case 20: aP0.fy=rDGR.GetF(); break;
139         case 30: aP0.fz=rDGR.GetF(); break;
140         case 40: fRadius=rDGR.GetF(); break;
141         case 50: fStart=rDGR.GetF(); break;
142         case 51: fEnd=rDGR.GetF(); break;
143         default: DXFBasicEntity::EvaluateGroup(rDGR);
144     }
145 }
146 
147 //--------------------------DXFTraceEntity--------------------------------------
148 
DXFTraceEntity()149 DXFTraceEntity::DXFTraceEntity() : DXFBasicEntity(DXF_TRACE)
150 {
151 }
152 
EvaluateGroup(DXFGroupReader & rDGR)153 void DXFTraceEntity::EvaluateGroup(DXFGroupReader & rDGR)
154 {
155     switch (rDGR.GetG()) {
156         case 10: aP0.fx=rDGR.GetF(); break;
157         case 20: aP0.fy=rDGR.GetF(); break;
158         case 30: aP0.fz=rDGR.GetF(); break;
159         case 11: aP1.fx=rDGR.GetF(); break;
160         case 21: aP1.fy=rDGR.GetF(); break;
161         case 31: aP1.fz=rDGR.GetF(); break;
162         case 12: aP2.fx=rDGR.GetF(); break;
163         case 22: aP2.fy=rDGR.GetF(); break;
164         case 32: aP2.fz=rDGR.GetF(); break;
165         case 13: aP3.fx=rDGR.GetF(); break;
166         case 23: aP3.fy=rDGR.GetF(); break;
167         case 33: aP3.fz=rDGR.GetF(); break;
168         default: DXFBasicEntity::EvaluateGroup(rDGR);
169     }
170 }
171 
172 //--------------------------DXFSolidEntity--------------------------------------
173 
DXFSolidEntity()174 DXFSolidEntity::DXFSolidEntity() : DXFBasicEntity(DXF_SOLID)
175 {
176 }
177 
EvaluateGroup(DXFGroupReader & rDGR)178 void DXFSolidEntity::EvaluateGroup(DXFGroupReader & rDGR)
179 {
180     switch (rDGR.GetG()) {
181         case 10: aP0.fx=rDGR.GetF(); break;
182         case 20: aP0.fy=rDGR.GetF(); break;
183         case 30: aP0.fz=rDGR.GetF(); break;
184         case 11: aP1.fx=rDGR.GetF(); break;
185         case 21: aP1.fy=rDGR.GetF(); break;
186         case 31: aP1.fz=rDGR.GetF(); break;
187         case 12: aP2.fx=rDGR.GetF(); break;
188         case 22: aP2.fy=rDGR.GetF(); break;
189         case 32: aP2.fz=rDGR.GetF(); break;
190         case 13: aP3.fx=rDGR.GetF(); break;
191         case 23: aP3.fy=rDGR.GetF(); break;
192         case 33: aP3.fz=rDGR.GetF(); break;
193         default: DXFBasicEntity::EvaluateGroup(rDGR);
194     }
195 }
196 
197 //--------------------------DXFTextEntity---------------------------------------
198 
DXFTextEntity()199 DXFTextEntity::DXFTextEntity() : DXFBasicEntity(DXF_TEXT)
200 {
201     fHeight=1.0;
202     sText[0]=0;
203     fRotAngle=0.0;
204     fXScale=1.0;
205     fOblAngle=0.0;
206     strncpy( sStyle, "STANDARD", 9 );
207     nGenFlags=0;
208     nHorzJust=0;
209     nVertJust=0;
210 }
211 
EvaluateGroup(DXFGroupReader & rDGR)212 void DXFTextEntity::EvaluateGroup(DXFGroupReader & rDGR)
213 {
214     switch (rDGR.GetG()) {
215         case 10: aP0.fx=rDGR.GetF(); break;
216         case 20: aP0.fy=rDGR.GetF(); break;
217         case 30: aP0.fz=rDGR.GetF(); break;
218         case 40: fHeight=rDGR.GetF(); break;
219         case  1: strncpy( sText, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
220         case 50: fRotAngle=rDGR.GetF(); break;
221         case 41: fXScale=rDGR.GetF(); break;
222         case 42: fOblAngle=rDGR.GetF(); break;
223         case  7: strncpy( sStyle, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
224         case 71: nGenFlags=rDGR.GetI(); break;
225         case 72: nHorzJust=rDGR.GetI(); break;
226         case 73: nVertJust=rDGR.GetI(); break;
227         case 11: aAlign.fx=rDGR.GetF(); break;
228         case 21: aAlign.fy=rDGR.GetF(); break;
229         case 31: aAlign.fz=rDGR.GetF(); break;
230         default: DXFBasicEntity::EvaluateGroup(rDGR);
231     }
232 }
233 
234 //--------------------------DXFShapeEntity--------------------------------------
235 
DXFShapeEntity()236 DXFShapeEntity::DXFShapeEntity() : DXFBasicEntity(DXF_SHAPE)
237 {
238     fSize=1.0;
239     sName[0]=0;
240     fRotAngle=0;
241     fXScale=1.0;
242     fOblAngle=0;
243 }
244 
EvaluateGroup(DXFGroupReader & rDGR)245 void DXFShapeEntity::EvaluateGroup(DXFGroupReader & rDGR)
246 {
247     switch (rDGR.GetG()) {
248         case 10: aP0.fx=rDGR.GetF(); break;
249         case 20: aP0.fy=rDGR.GetF(); break;
250         case 30: aP0.fz=rDGR.GetF(); break;
251         case 40: fSize=rDGR.GetF(); break;
252         case  2: strncpy( sName, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
253         case 50: fRotAngle=rDGR.GetF(); break;
254         case 41: fXScale=rDGR.GetF(); break;
255         case 51: fOblAngle=rDGR.GetF(); break;
256         default: DXFBasicEntity::EvaluateGroup(rDGR);
257     }
258 }
259 
260 //--------------------------DXFInsertEntity-------------------------------------
261 
DXFInsertEntity()262 DXFInsertEntity::DXFInsertEntity() : DXFBasicEntity(DXF_INSERT)
263 {
264     nAttrFlag=0;
265     sName[0]=0;
266     fXScale=1.0;
267     fYScale=1.0;
268     fZScale=1.0;
269     fRotAngle=0.0;
270     nColCount=1;
271     nRowCount=1;
272     fColSpace=0.0;
273     fRowSpace=0.0;
274 }
275 
EvaluateGroup(DXFGroupReader & rDGR)276 void DXFInsertEntity::EvaluateGroup(DXFGroupReader & rDGR)
277 {
278     switch (rDGR.GetG()) {
279         case 66: nAttrFlag=rDGR.GetI(); break;
280         case  2: strncpy( sName, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
281         case 10: aP0.fx=rDGR.GetF(); break;
282         case 20: aP0.fy=rDGR.GetF(); break;
283         case 30: aP0.fz=rDGR.GetF(); break;
284         case 41: fXScale=rDGR.GetF(); break;
285         case 42: fYScale=rDGR.GetF(); break;
286         case 43: fZScale=rDGR.GetF(); break;
287         case 50: fRotAngle=rDGR.GetF(); break;
288         case 70: nColCount=rDGR.GetI(); break;
289         case 71: nRowCount=rDGR.GetI(); break;
290         case 44: fColSpace=rDGR.GetF(); break;
291         case 45: fRowSpace=rDGR.GetF(); break;
292         default: DXFBasicEntity::EvaluateGroup(rDGR);
293     }
294 }
295 
296 //--------------------------DXFAttDefEntity-------------------------------------
297 
DXFAttDefEntity()298 DXFAttDefEntity::DXFAttDefEntity() : DXFBasicEntity(DXF_ATTDEF)
299 {
300     fHeight=1.0;
301     sDefVal[0]=0;
302     sPrompt[0]=0;
303     sTagStr[0]=0;
304     nAttrFlags=0;
305     nFieldLen=0;
306     fRotAngle=0.0;
307     fXScale=1.0;
308     fOblAngle=0.0;
309     strncpy( sStyle, "STANDARD", 9 );
310     nGenFlags=0;
311     nHorzJust=0;
312     nVertJust=0;
313 }
314 
EvaluateGroup(DXFGroupReader & rDGR)315 void DXFAttDefEntity::EvaluateGroup(DXFGroupReader & rDGR)
316 {
317     switch (rDGR.GetG()) {
318         case 10: aP0.fx=rDGR.GetF(); break;
319         case 20: aP0.fy=rDGR.GetF(); break;
320         case 30: aP0.fz=rDGR.GetF(); break;
321         case 40: fHeight=rDGR.GetF(); break;
322         case  1: strncpy( sDefVal, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
323         case  3: strncpy( sPrompt, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
324         case  2: strncpy( sTagStr, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
325         case 70: nAttrFlags=rDGR.GetI(); break;
326         case 73: nFieldLen=rDGR.GetI(); break;
327         case 50: fRotAngle=rDGR.GetF(); break;
328         case 41: fXScale=rDGR.GetF(); break;
329         case 51: fOblAngle=rDGR.GetF(); break;
330         case  7: strncpy( sStyle, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
331         case 71: nGenFlags=rDGR.GetI(); break;
332         case 72: nHorzJust=rDGR.GetI(); break;
333         case 74: nVertJust=rDGR.GetI(); break;
334         case 11: aAlign.fx=rDGR.GetF(); break;
335         case 21: aAlign.fy=rDGR.GetF(); break;
336         case 31: aAlign.fz=rDGR.GetF(); break;
337         default: DXFBasicEntity::EvaluateGroup(rDGR);
338     }
339 }
340 
341 //--------------------------DXFAttribEntity-------------------------------------
342 
DXFAttribEntity()343 DXFAttribEntity::DXFAttribEntity() : DXFBasicEntity(DXF_ATTRIB)
344 {
345     fHeight=1.0;
346     sText[0]=0;
347     sTagStr[0]=0;
348     nAttrFlags=0;
349     nFieldLen=0;
350     fRotAngle=0.0;
351     fXScale=1.0;
352     fOblAngle=0.0;
353     strncpy( sStyle, "STANDARD", 9 );
354     nGenFlags=0;
355     nHorzJust=0;
356     nVertJust=0;
357 }
358 
EvaluateGroup(DXFGroupReader & rDGR)359 void DXFAttribEntity::EvaluateGroup(DXFGroupReader & rDGR)
360 {
361     switch (rDGR.GetG()) {
362         case 10: aP0.fx=rDGR.GetF(); break;
363         case 20: aP0.fy=rDGR.GetF(); break;
364         case 30: aP0.fz=rDGR.GetF(); break;
365         case 40: fHeight=rDGR.GetF(); break;
366         case  1: strncpy( sText, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
367         case  2: strncpy( sTagStr, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
368         case 70: nAttrFlags=rDGR.GetI(); break;
369         case 73: nFieldLen=rDGR.GetI(); break;
370         case 50: fRotAngle=rDGR.GetF(); break;
371         case 41: fXScale=rDGR.GetF(); break;
372         case 51: fOblAngle=rDGR.GetF(); break;
373         case  7: strncpy( sStyle, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
374         case 71: nGenFlags=rDGR.GetI(); break;
375         case 72: nHorzJust=rDGR.GetI(); break;
376         case 74: nVertJust=rDGR.GetI(); break;
377         case 11: aAlign.fx=rDGR.GetF(); break;
378         case 21: aAlign.fy=rDGR.GetF(); break;
379         case 31: aAlign.fz=rDGR.GetF(); break;
380         default: DXFBasicEntity::EvaluateGroup(rDGR);
381     }
382 }
383 
384 //--------------------------DXFPolyLine-----------------------------------------
385 
DXFPolyLineEntity()386 DXFPolyLineEntity::DXFPolyLineEntity() : DXFBasicEntity(DXF_POLYLINE)
387 {
388     fElevation=0.0;
389     nFlags=0;
390     fSWidth=0.0;
391     fEWidth=0.0;
392     nMeshMCount=0;
393     nMeshNCount=0;
394     nMDensity=0;
395     nNDensity=0;
396     nCSSType=0;
397 }
398 
EvaluateGroup(DXFGroupReader & rDGR)399 void DXFPolyLineEntity::EvaluateGroup(DXFGroupReader & rDGR)
400 {
401     switch (rDGR.GetG()) {
402         case 30: fElevation=rDGR.GetF(); break;
403         case 70: nFlags=rDGR.GetI(); break;
404         case 40: fSWidth=rDGR.GetF(); break;
405         case 41: fEWidth=rDGR.GetF(); break;
406         case 71: nMeshMCount=rDGR.GetI(); break;
407         case 72: nMeshNCount=rDGR.GetI(); break;
408         case 73: nMDensity=rDGR.GetI(); break;
409         case 74: nNDensity=rDGR.GetI(); break;
410         case 75: nCSSType=rDGR.GetI(); break;
411         default: DXFBasicEntity::EvaluateGroup(rDGR);
412     }
413 }
414 
415 //--------------------------DXFLWPolyLine---------------------------------------
416 
DXFLWPolyLineEntity()417 DXFLWPolyLineEntity::DXFLWPolyLineEntity() :
418     DXFBasicEntity( DXF_LWPOLYLINE ),
419     nIndex( 0 ),
420     nCount( 0 ),
421     nFlags( 0 ),
422     fConstantWidth( 0.0 ),
423     fStartWidth( 0.0 ),
424     fEndWidth( 0.0 ),
425     pP( NULL )
426 {
427 }
428 
EvaluateGroup(DXFGroupReader & rDGR)429 void DXFLWPolyLineEntity::EvaluateGroup( DXFGroupReader & rDGR )
430 {
431     switch ( rDGR.GetG() )
432     {
433         case 90 :
434         {
435             nCount = rDGR.GetI();
436             if ( rDGR.GetStatus() && nCount >= 0 )
437             {
438                 try
439                 {
440                     pP = new DXFVector[ nCount ];
441                 }
442                 catch (::std::bad_alloc)
443                 {
444                     rDGR.SetError();
445                 }
446             }
447             else
448                 rDGR.SetError();
449         }
450         break;
451         case 70: nFlags = rDGR.GetI(); break;
452         case 43: fConstantWidth = rDGR.GetF(); break;
453         case 40: fStartWidth = rDGR.GetF(); break;
454         case 41: fEndWidth = rDGR.GetF(); break;
455         case 10:
456         {
457             if ( pP && ( nIndex < nCount ) )
458                 pP[ nIndex ].fx = rDGR.GetF();
459         }
460         break;
461         case 20:
462         {
463             if ( pP && ( nIndex < nCount ) )
464                 pP[ nIndex++ ].fy = rDGR.GetF();
465         }
466         break;
467         default: DXFBasicEntity::EvaluateGroup(rDGR);
468     }
469 }
470 
~DXFLWPolyLineEntity()471 DXFLWPolyLineEntity::~DXFLWPolyLineEntity()
472 {
473     delete[] pP;
474 }
475 
476 //--------------------------DXFHatchEntity-------------------------------------
477 
DXFEdgeTypeLine()478 DXFEdgeTypeLine::DXFEdgeTypeLine() :
479     DXFEdgeType( 1 )
480 {
481 
482 }
~DXFEdgeTypeLine()483 DXFEdgeTypeLine::~DXFEdgeTypeLine()
484 {
485 
486 }
EvaluateGroup(DXFGroupReader & rDGR)487 sal_Bool DXFEdgeTypeLine::EvaluateGroup( DXFGroupReader & rDGR )
488 {
489     sal_Bool bExecutingGroupCode = sal_True;
490     switch ( rDGR.GetG() )
491     {
492         case 10 : aStartPoint.fx = rDGR.GetF(); break;
493         case 20 : aStartPoint.fy = rDGR.GetF(); break;
494         case 11 : aEndPoint.fx = rDGR.GetF(); break;
495         case 21 : aEndPoint.fy = rDGR.GetF(); break;
496         default : bExecutingGroupCode = sal_False; break;
497     }
498     return  bExecutingGroupCode;
499 }
500 
DXFEdgeTypeCircularArc()501 DXFEdgeTypeCircularArc::DXFEdgeTypeCircularArc() :
502     DXFEdgeType( 2 ),
503     fRadius( 0.0 ),
504     fStartAngle( 0.0 ),
505     fEndAngle( 0.0 ),
506     nIsCounterClockwiseFlag( 0 )
507 {
508 }
~DXFEdgeTypeCircularArc()509 DXFEdgeTypeCircularArc::~DXFEdgeTypeCircularArc()
510 {
511 }
EvaluateGroup(DXFGroupReader & rDGR)512 sal_Bool DXFEdgeTypeCircularArc::EvaluateGroup( DXFGroupReader & rDGR )
513 {
514     sal_Bool bExecutingGroupCode = sal_True;
515     switch ( rDGR.GetG() )
516     {
517         case 10 : aCenter.fx = rDGR.GetF(); break;
518         case 20 : aCenter.fy = rDGR.GetF(); break;
519         case 40 : fRadius = rDGR.GetF(); break;
520         case 50 : fStartAngle = rDGR.GetF(); break;
521         case 51 : fEndAngle = rDGR.GetF(); break;
522         case 73 : nIsCounterClockwiseFlag = rDGR.GetI(); break;
523         default : bExecutingGroupCode = sal_False; break;
524     }
525     return  bExecutingGroupCode;
526 }
527 
DXFEdgeTypeEllipticalArc()528 DXFEdgeTypeEllipticalArc::DXFEdgeTypeEllipticalArc() :
529     DXFEdgeType( 3 ),
530     fLength( 0.0 ),
531     fStartAngle( 0.0 ),
532     fEndAngle( 0.0 ),
533     nIsCounterClockwiseFlag( 0 )
534 {
535 }
~DXFEdgeTypeEllipticalArc()536 DXFEdgeTypeEllipticalArc::~DXFEdgeTypeEllipticalArc()
537 {
538 
539 }
EvaluateGroup(DXFGroupReader & rDGR)540 sal_Bool DXFEdgeTypeEllipticalArc::EvaluateGroup( DXFGroupReader & rDGR )
541 {
542     sal_Bool bExecutingGroupCode = sal_True;
543     switch( rDGR.GetG() )
544     {
545         case 10 : aCenter.fx = rDGR.GetF(); break;
546         case 20 : aCenter.fy = rDGR.GetF(); break;
547         case 11 : aEndPoint.fx = rDGR.GetF(); break;
548         case 21 : aEndPoint.fy = rDGR.GetF(); break;
549         case 40 : fLength = rDGR.GetF(); break;
550         case 50 : fStartAngle = rDGR.GetF(); break;
551         case 51 : fEndAngle = rDGR.GetF(); break;
552         case 73 : nIsCounterClockwiseFlag = rDGR.GetI(); break;
553         default : bExecutingGroupCode = sal_False; break;
554     }
555     return  bExecutingGroupCode;
556 }
557 
DXFEdgeTypeSpline()558 DXFEdgeTypeSpline::DXFEdgeTypeSpline() :
559     DXFEdgeType( 4 ),
560     nDegree( 0 ),
561     nRational( 0 ),
562     nPeriodic( 0 ),
563     nKnotCount( 0 ),
564     nControlCount( 0 )
565 {
566 }
~DXFEdgeTypeSpline()567 DXFEdgeTypeSpline::~DXFEdgeTypeSpline()
568 {
569 
570 }
EvaluateGroup(DXFGroupReader & rDGR)571 sal_Bool DXFEdgeTypeSpline::EvaluateGroup( DXFGroupReader & rDGR )
572 {
573     sal_Bool bExecutingGroupCode = sal_True;
574     switch ( rDGR.GetG() )
575     {
576         case 94 : nDegree = rDGR.GetI(); break;
577         case 73 : nRational = rDGR.GetI(); break;
578         case 74 : nPeriodic = rDGR.GetI(); break;
579         case 95 : nKnotCount = rDGR.GetI(); break;
580         case 96 : nControlCount = rDGR.GetI(); break;
581         default : bExecutingGroupCode = sal_False; break;
582     }
583     return  bExecutingGroupCode;
584 }
585 
DXFBoundaryPathData()586 DXFBoundaryPathData::DXFBoundaryPathData() :
587     nFlags( 0 ),
588     nHasBulgeFlag( 0 ),
589     nIsClosedFlag( 0 ),
590     nPointCount( 0 ),
591     fBulge( 0.0 ),
592     nSourceBoundaryObjects( 0 ),
593     nEdgeCount( 0 ),
594     bIsPolyLine( sal_True ),
595     nPointIndex( 0 ),
596     pP( NULL )
597 {
598 }
599 
~DXFBoundaryPathData()600 DXFBoundaryPathData::~DXFBoundaryPathData()
601 {
602     sal_uInt32 i = 0;
603     for ( i = 0; i < aEdges.size(); i++ )
604         delete aEdges[ i ];
605     delete[] pP;
606 }
607 
EvaluateGroup(DXFGroupReader & rDGR)608 sal_Bool DXFBoundaryPathData::EvaluateGroup( DXFGroupReader & rDGR )
609 {
610     sal_Bool bExecutingGroupCode = sal_True;
611     if ( bIsPolyLine )
612     {
613         switch( rDGR.GetG() )
614         {
615             case 92 :
616             {
617                 nFlags = rDGR.GetI();
618                 if ( ( nFlags & 2 ) == 0 )
619                     bIsPolyLine = sal_False;
620             }
621             break;
622             case 93 :
623             {
624                 nPointCount = rDGR.GetI();
625                 if ( rDGR.GetStatus() && nPointCount >= 0 )
626                 {
627                     try
628                     {
629                         pP = new DXFVector[ nPointCount ];
630                     }
631                     catch (::std::bad_alloc)
632                     {
633                         rDGR.SetError();
634                     }
635                 }
636                 else
637                     rDGR.SetError();
638             }
639             break;
640             case 72 : nHasBulgeFlag = rDGR.GetI(); break;
641             case 73 : nIsClosedFlag = rDGR.GetI(); break;
642             case 97 : nSourceBoundaryObjects = rDGR.GetI(); break;
643             case 42 : fBulge = rDGR.GetF(); break;
644             case 10:
645             {
646                 if ( pP && ( nPointIndex < nPointCount ) )
647                     pP[ nPointIndex ].fx = rDGR.GetF();
648             }
649             break;
650             case 20:
651             {
652                 if ( pP && ( nPointIndex < nPointCount ) )
653                     pP[ nPointIndex++ ].fy = rDGR.GetF();
654             }
655             break;
656 
657             default : bExecutingGroupCode = sal_False; break;
658         }
659     }
660     else
661     {
662         if ( rDGR.GetG() == 93 )
663             nEdgeCount = rDGR.GetI();
664         else if ( rDGR.GetG() == 72 )
665         {
666             sal_Int32 nEdgeType = rDGR.GetI();
667             switch( nEdgeType )
668             {
669                 case 1 : aEdges.push_back( new DXFEdgeTypeLine() ); break;
670                 case 2 : aEdges.push_back( new DXFEdgeTypeCircularArc() ); break;
671                 case 3 : aEdges.push_back( new DXFEdgeTypeEllipticalArc() ); break;
672                 case 4 : aEdges.push_back( new DXFEdgeTypeSpline() ); break;
673             }
674         }
675         else if ( aEdges.size() )
676             aEdges[ aEdges.size() - 1 ]->EvaluateGroup( rDGR );
677         else
678             bExecutingGroupCode = sal_False;
679     }
680     return bExecutingGroupCode;
681 }
682 
DXFHatchEntity()683 DXFHatchEntity::DXFHatchEntity() :
684     DXFBasicEntity( DXF_HATCH ),
685     bIsInBoundaryPathContext( sal_False ),
686     nCurrentBoundaryPathIndex( -1 ),
687     nFlags( 0 ),
688     nAssociativityFlag( 0 ),
689     nBoundaryPathCount( 0 ),
690     nHatchStyle( 0 ),
691     nHatchPatternType( 0 ),
692     fHatchPatternAngle( 0.0 ),
693     fHatchPatternScale( 1.0 ),
694     nHatchDoubleFlag( 0 ),
695     nHatchPatternDefinitionLines( 0 ),
696     fPixelSize( 1.0 ),
697     nNumberOfSeedPoints( 0 ),
698     pBoundaryPathData( NULL )
699 {
700 }
701 
EvaluateGroup(DXFGroupReader & rDGR)702 void DXFHatchEntity::EvaluateGroup( DXFGroupReader & rDGR )
703 {
704     switch ( rDGR.GetG() )
705     {
706 //      case 10 : aElevationPoint.fx = rDGR.GetF(); break;
707 //      case 20 : aElevationPoint.fy = rDGR.GetF(); break;
708 //      case 30 : aElevationPoint.fz = rDGR.GetF(); break;
709         case 70 : nFlags = rDGR.GetI(); break;
710         case 71 : nAssociativityFlag = rDGR.GetI(); break;
711         case 91 :
712         {
713             bIsInBoundaryPathContext = sal_True;
714             nBoundaryPathCount = rDGR.GetI();
715             if ( rDGR.GetStatus() && nBoundaryPathCount >= 0 )
716             {
717                 try
718                 {
719                     pBoundaryPathData = new DXFBoundaryPathData[ nBoundaryPathCount ];
720                 }
721                 catch (::std::bad_alloc)
722                 {
723                     rDGR.SetError();
724                 }
725             }
726             else
727                 rDGR.SetError();
728         }
729         break;
730         case 75 :
731         {
732             nHatchStyle = rDGR.GetI();
733             bIsInBoundaryPathContext = sal_False;
734         }
735         break;
736         case 76 : nHatchPatternType = rDGR.GetI(); break;
737         case 52 : fHatchPatternAngle = rDGR.GetF(); break;
738         case 41 : fHatchPatternScale = rDGR.GetF(); break;
739         case 77 : nHatchDoubleFlag = rDGR.GetI(); break;
740         case 78 : nHatchPatternDefinitionLines = rDGR.GetI(); break;
741         case 47 : fPixelSize = rDGR.GetF(); break;
742         case 98 : nNumberOfSeedPoints = rDGR.GetI(); break;
743 
744         //!! passthrough !!
745         case 92 : nCurrentBoundaryPathIndex++;
746         default:
747         {
748             sal_Bool bExecutingGroupCode = sal_False;
749             if ( bIsInBoundaryPathContext )
750             {
751                 if ( ( nCurrentBoundaryPathIndex >= 0 ) &&
752                     ( nCurrentBoundaryPathIndex < nBoundaryPathCount ) )
753                     bExecutingGroupCode = pBoundaryPathData[ nCurrentBoundaryPathIndex ].EvaluateGroup( rDGR );
754             }
755             if ( bExecutingGroupCode == sal_False )
756                 DXFBasicEntity::EvaluateGroup(rDGR);
757         }
758         break;
759     }
760 }
761 
~DXFHatchEntity()762 DXFHatchEntity::~DXFHatchEntity()
763 {
764     delete[] pBoundaryPathData;
765 }
766 
767 //--------------------------DXFVertexEntity-------------------------------------
768 
DXFVertexEntity()769 DXFVertexEntity::DXFVertexEntity() : DXFBasicEntity(DXF_VERTEX)
770 {
771     fSWidth=-1.0;
772     fEWidth=-1.0;
773     fBulge=0.0;
774     nFlags=0;
775     fCFTDir=0.0;
776 
777 }
778 
EvaluateGroup(DXFGroupReader & rDGR)779 void DXFVertexEntity::EvaluateGroup(DXFGroupReader & rDGR)
780 {
781     switch (rDGR.GetG()) {
782         case 10: aP0.fx=rDGR.GetF(); break;
783         case 20: aP0.fy=rDGR.GetF(); break;
784         case 30: aP0.fz=rDGR.GetF(); break;
785         case 40: fSWidth=rDGR.GetF(); break;
786         case 41: fEWidth=rDGR.GetF(); break;
787         case 42: fBulge=rDGR.GetF(); break;
788         case 70: nFlags=rDGR.GetI(); break;
789         case 50: fCFTDir=rDGR.GetF(); break;
790         default: DXFBasicEntity::EvaluateGroup(rDGR);
791     }
792 }
793 
794 //--------------------------DXFSeqEndEntity-------------------------------------
795 
DXFSeqEndEntity()796 DXFSeqEndEntity::DXFSeqEndEntity() : DXFBasicEntity(DXF_SEQEND)
797 {
798 }
799 
800 //--------------------------DXF3DFace-------------------------------------------
801 
DXF3DFaceEntity()802 DXF3DFaceEntity::DXF3DFaceEntity() : DXFBasicEntity(DXF_3DFACE)
803 {
804     nIEFlags=0;
805 }
806 
EvaluateGroup(DXFGroupReader & rDGR)807 void DXF3DFaceEntity::EvaluateGroup(DXFGroupReader & rDGR)
808 {
809     switch (rDGR.GetG()) {
810         case 10: aP0.fx=rDGR.GetF(); break;
811         case 20: aP0.fy=rDGR.GetF(); break;
812         case 30: aP0.fz=rDGR.GetF(); break;
813         case 11: aP1.fx=rDGR.GetF(); break;
814         case 21: aP1.fy=rDGR.GetF(); break;
815         case 31: aP1.fz=rDGR.GetF(); break;
816         case 12: aP2.fx=rDGR.GetF(); break;
817         case 22: aP2.fy=rDGR.GetF(); break;
818         case 32: aP2.fz=rDGR.GetF(); break;
819         case 13: aP3.fx=rDGR.GetF(); break;
820         case 23: aP3.fy=rDGR.GetF(); break;
821         case 33: aP3.fz=rDGR.GetF(); break;
822         case 70: nIEFlags=rDGR.GetI(); break;
823         default: DXFBasicEntity::EvaluateGroup(rDGR);
824     }
825 }
826 
827 
828 //--------------------------DXFDimensionEntity----------------------------------
829 
DXFDimensionEntity()830 DXFDimensionEntity::DXFDimensionEntity() : DXFBasicEntity(DXF_DIMENSION)
831 {
832     sPseudoBlock[0]=0;
833 }
834 
EvaluateGroup(DXFGroupReader & rDGR)835 void DXFDimensionEntity::EvaluateGroup(DXFGroupReader & rDGR)
836 {
837     switch (rDGR.GetG()) {
838         case  2: strncpy( sPseudoBlock, rDGR.GetS(), DXF_MAX_STRING_LEN + 1 ); break;
839         default: DXFBasicEntity::EvaluateGroup(rDGR);
840     }
841 }
842 
843 //---------------------------- DXFEntites --------------------------------------
844 
Read(DXFGroupReader & rDGR)845 void DXFEntities::Read(DXFGroupReader & rDGR)
846 {
847     DXFBasicEntity * pE, * * ppSucc;
848 
849     ppSucc=&pFirst;
850     while (*ppSucc!=NULL) ppSucc=&((*ppSucc)->pSucc);
851 
852     while (rDGR.GetG()!=0) rDGR.Read();
853 
854     while (strcmp(rDGR.GetS(),"ENDBLK")!=0 &&
855            strcmp(rDGR.GetS(),"ENDSEC")!=0 &&
856            strcmp(rDGR.GetS(),"EOF")!=0 )
857     {
858 
859         if      (strcmp(rDGR.GetS(),"LINE"      )==0) pE=new DXFLineEntity;
860         else if (strcmp(rDGR.GetS(),"POINT"     )==0) pE=new DXFPointEntity;
861         else if (strcmp(rDGR.GetS(),"CIRCLE"    )==0) pE=new DXFCircleEntity;
862         else if (strcmp(rDGR.GetS(),"ARC"       )==0) pE=new DXFArcEntity;
863         else if (strcmp(rDGR.GetS(),"TRACE"     )==0) pE=new DXFTraceEntity;
864         else if (strcmp(rDGR.GetS(),"SOLID"     )==0) pE=new DXFSolidEntity;
865         else if (strcmp(rDGR.GetS(),"TEXT"      )==0) pE=new DXFTextEntity;
866         else if (strcmp(rDGR.GetS(),"SHAPE"     )==0) pE=new DXFShapeEntity;
867         else if (strcmp(rDGR.GetS(),"INSERT"    )==0) pE=new DXFInsertEntity;
868         else if (strcmp(rDGR.GetS(),"ATTDEF"    )==0) pE=new DXFAttDefEntity;
869         else if (strcmp(rDGR.GetS(),"ATTRIB"    )==0) pE=new DXFAttribEntity;
870         else if (strcmp(rDGR.GetS(),"POLYLINE"  )==0) pE=new DXFPolyLineEntity;
871         else if (strcmp(rDGR.GetS(),"LWPOLYLINE")==0) pE=new DXFLWPolyLineEntity;
872         else if (strcmp(rDGR.GetS(),"VERTEX"    )==0) pE=new DXFVertexEntity;
873         else if (strcmp(rDGR.GetS(),"SEQEND"    )==0) pE=new DXFSeqEndEntity;
874         else if (strcmp(rDGR.GetS(),"3DFACE"    )==0) pE=new DXF3DFaceEntity;
875         else if (strcmp(rDGR.GetS(),"DIMENSION" )==0) pE=new DXFDimensionEntity;
876         else if (strcmp(rDGR.GetS(),"HATCH"     )==0) pE=new DXFHatchEntity;
877         else
878         {
879             do {
880                 rDGR.Read();
881             } while (rDGR.GetG()!=0);
882             continue;
883         }
884         *ppSucc=pE;
885         ppSucc=&(pE->pSucc);
886         pE->Read(rDGR);
887     }
888 }
889 
Clear()890 void DXFEntities::Clear()
891 {
892     DXFBasicEntity * ptmp;
893 
894     while (pFirst!=NULL) {
895         ptmp=pFirst;
896         pFirst=ptmp->pSucc;
897         delete ptmp;
898     }
899 }
900