Line data Source code
1 : /*******************************************************************************
2 : * Project: libopencad
3 : * Purpose: OpenSource CAD formats support library
4 : * Author: Alexandr Borzykh, mush3d at gmail.com
5 : * Author: Dmitry Baryshnikov, bishop.dev@gmail.com
6 : * Language: C++
7 : *******************************************************************************
8 : * The MIT License (MIT)
9 : *
10 : * Copyright (c) 2016 Alexandr Borzykh
11 : * Copyright (c) 2016-2018 NextGIS, <info@nextgis.com>
12 : *
13 : * SPDX-License-Identifier: MIT
14 : *******************************************************************************/
15 :
16 : #ifndef CADOBJECTS_H
17 : #define CADOBJECTS_H
18 :
19 : #include "cadheader.h"
20 :
21 : #ifndef CPL_NON_FINAL
22 : #define CPL_NON_FINAL
23 : #endif
24 :
25 : /*
26 : * @brief Class which basically implements implements 3D vertex
27 : */
28 : class OCAD_EXTERN CADVector
29 : {
30 : public:
31 : CADVector();
32 : CADVector( double dx, double dy );
33 : CADVector( double dx, double dy, double dz );
34 : CADVector( const CADVector& other );
35 : friend bool operator==( const CADVector& first, const CADVector& second );
36 : CADVector& operator=( const CADVector& second );
37 : double getX() const;
38 : void setX( double value );
39 :
40 : double getY() const;
41 : void setY( double value );
42 :
43 : double getZ() const;
44 : void setZ( double value );
45 :
46 : bool getBHasZ() const;
47 : void setBHasZ( bool value );
48 :
49 : protected:
50 : inline static bool fcmp( double x, double y );
51 : protected:
52 : double X;
53 : double Y;
54 : double Z;
55 : bool bHasZ;
56 : };
57 :
58 : typedef struct _Eed
59 : {
60 : short dLength = 0;
61 : CADHandle hApplication;
62 : std::vector<unsigned char> acData;
63 : } CADEed;
64 :
65 : typedef std::vector<CADHandle> CADHandleArray;
66 : typedef std::vector<CADEed> CADEedArray;
67 :
68 : /**
69 : * @brief The base CAD object class
70 : */
71 : class OCAD_EXTERN CADObject
72 : {
73 : public:
74 : enum ObjectType
75 : {
76 : UNUSED = 0x0, // 0
77 : TEXT = 0x1, // 1
78 : ATTRIB = 0x2, // 2
79 : ATTDEF = 0x3, // 3
80 : BLOCK = 0x4, // 4
81 : ENDBLK = 0x5, // 5
82 : SEQEND = 0x6, // 6
83 : INSERT = 0x7, // 7
84 : MINSERT1 = 0x8, // 8
85 : MINSERT2 = 0x9, // 9
86 : VERTEX2D = 0x0A, // 10
87 : VERTEX3D = 0x0B, // 11
88 : VERTEX_MESH = 0x0C, // 12
89 : VERTEX_PFACE = 0x0D, // 13
90 : VERTEX_PFACE_FACE = 0x0E, // 14
91 : POLYLINE2D = 0x0F, // 15
92 : POLYLINE3D = 0x10, // 16
93 : ARC = 0x11, // 17
94 : CIRCLE = 0x12, // 18
95 : LINE = 0x13, // 19
96 : DIMENSION_ORDINATE = 0x14, // 20
97 : DIMENSION_LINEAR = 0x15, // 21
98 : DIMENSION_ALIGNED = 0x16, // 22
99 : DIMENSION_ANG_3PT = 0x17, // 23
100 : DIMENSION_ANG_2LN = 0x18, // 24
101 : DIMENSION_RADIUS = 0x19, // 25
102 : DIMENSION_DIAMETER = 0x1A, // 26
103 : POINT = 0x1B, // 27
104 : FACE3D = 0x1C, // 28
105 : POLYLINE_PFACE = 0x1D, // 29
106 : POLYLINE_MESH = 0x1E, // 30
107 : SOLID = 0x1F, // 31
108 : TRACE = 0x20, // 32
109 : SHAPE = 0x21, // 33
110 : VIEWPORT = 0x22, // 34
111 : ELLIPSE = 0x23, // 35
112 : SPLINE = 0x24, // 36
113 : REGION = 0x25, // 37
114 : SOLID3D = 0x26, // 38
115 : BODY = 0x27, // 39
116 : RAY = 0x28, // 40
117 : XLINE = 0x29, // 41
118 : DICTIONARY = 0x2A, // 42
119 : OLEFRAME = 0x2B, // 43
120 : MTEXT = 0x2C, // 44
121 : LEADER = 0x2D, // 45
122 : TOLERANCE = 0x2E, // 46
123 : MLINE = 0x2F, // 47
124 : BLOCK_CONTROL_OBJ = 0x30, // 48
125 : BLOCK_HEADER = 0x31, // 49
126 : LAYER_CONTROL_OBJ = 0x32, // 50
127 : LAYER = 0x33, // 51
128 : STYLE_CONTROL_OBJ = 0x34, // 52
129 : STYLE1 = 0x35, // 53
130 : STYLE2 = 0x36, // 54
131 : STYLE3 = 0x37, // 55
132 : LTYPE_CONTROL_OBJ = 0x38, // 56
133 : LTYPE1 = 0x39, // 57
134 : LTYPE2 = 0x3A, // 58
135 : LTYPE3 = 0x3B, // 59
136 : VIEW_CONTROL_OBJ = 0x3C, // 60
137 : VIEW = 0x3D, // 61
138 : UCS_CONTROL_OBJ = 0x3E, // 62
139 : UCS = 0x3F, // 63
140 : VPORT_CONTROL_OBJ = 0x40, // 64
141 : VPORT = 0x41, // 65
142 : APPID_CONTROL_OBJ = 0x42, // 66
143 : APPID = 0x43, // 67
144 : DIMSTYLE_CONTROL_OBJ = 0x44, // 68
145 : DIMSTYLE = 0x45, // 69
146 : VP_ENT_HDR_CTRL_OBJ = 0x46, // 70
147 : VP_ENT_HDR = 0x47, // 71
148 : GROUP = 0x48, // 72
149 : MLINESTYLE = 0x49, // 73
150 : OLE2FRAME = 0x4A, // 74
151 : DUMMY = 0x4B, // 75
152 : LONG_TRANSACTION = 0x4C, // 76
153 : LWPOLYLINE = 0x4D, // 77
154 : HATCH = 0x4E, // 78
155 : XRECORD = 0x4F, // 79
156 : ACDBPLACEHOLDER = 0x50, // 80
157 : VBA_PROJECT = 0x51, // 81
158 : LAYOUT = 0x52, // 82
159 : // Codes below aren't fixed, libopencad uses it for reading, in writing it will be different!
160 : CELLSTYLEMAP = 0x53, // 83
161 : DBCOLOR = 0x54, // 84
162 : DICTIONARYVAR = 0x55, // 85
163 : DICTIONARYWDFLT = 0x56, // 86
164 : FIELD = 0x57, // 87
165 : GROUP_UNFIXED = 0x58, // 88
166 : HATCH_UNFIXED = 0x59, // 89
167 : IDBUFFER = 0x5A, // 90
168 : IMAGE = 0x5B, // 91
169 : IMAGEDEF = 0x5C, // 92
170 : IMAGEDEFREACTOR = 0x5D, // 93
171 : LAYER_INDEX = 0x5E, // 94
172 : LAYOUT_UNFIXED = 0x5F, // 95
173 : LWPOLYLINE_UNFIXED = 0x60, // 96
174 : MATERIAL = 0x61, // 97
175 : MLEADER = 0x62, // 98
176 : MLEADERSTYLE = 0x63, // 99
177 : OLE2FRAME_UNFIXED = 0x64, // 100
178 : PLACEHOLDER = 0x65, // 101
179 : PLOTSETTINGS = 0x66, // 102
180 : RASTERVARIABLES = 0x67, // 103
181 : SCALE = 0x68, // 104
182 : SORTENTSTABLE = 0x69, // 105
183 : SPATIAL_FILTER = 0x6A, // 106
184 : SPATIAL_INDEX = 0x6B, // 107
185 : TABLEGEOMETRY = 0x6C, // 108
186 : TABLESTYLES = 0x6D, // 109
187 : VBA_PROJECT_UNFIXED = 0x6E, // 110
188 : VISUALSTYLE = 0x6F, // 111
189 : WIPEOUTVARIABLE = 0x70, // 112
190 : XRECORD_UNFIXED = 0x71, // 113
191 : WIPEOUT = 0x72 // 114
192 : };
193 :
194 205 : virtual ~CADObject(){}
195 :
196 : ObjectType getType() const;
197 : long getSize() const;
198 :
199 : void setSize( long value );
200 :
201 : short getCRC() const;
202 : void setCRC(unsigned short value );
203 :
204 : protected:
205 : long size;
206 : ObjectType type;
207 : unsigned short CRC;
208 :
209 205 : explicit CADObject(ObjectType typeIn) : size(0), type(typeIn), CRC(0) {}
210 : };
211 :
212 : std::string getNameByType( CADObject::ObjectType eType );
213 : bool isCommonEntityType( short nType );
214 : bool isSupportedGeometryType( short nType );
215 :
216 : /**
217 : * @brief The CADCommonED struct
218 : */
219 : struct CADCommonED
220 : {
221 : long nObjectSizeInBits;
222 : CADHandle hObjectHandle;
223 : CADEedArray aEED;
224 :
225 : bool bGraphicsPresented;
226 : std::vector<char> abyGraphicsData;
227 :
228 : unsigned char bbEntMode;
229 : long nNumReactors;
230 :
231 : bool bNoXDictionaryHandlePresent;
232 : bool bBinaryDataPresent;
233 :
234 : bool bIsByLayerLT; // R13-14 only
235 :
236 : bool bNoLinks;
237 : short nCMColor;
238 :
239 : double dfLTypeScale;
240 : unsigned char bbLTypeFlags;
241 : unsigned char bbPlotStyleFlags;
242 : char bbMaterialFlags;
243 : char nShadowFlags;
244 :
245 : short nInvisibility;
246 : unsigned char nLineWeight;
247 :
248 70 : CADCommonED() :
249 : nObjectSizeInBits(0),
250 : bGraphicsPresented(false),
251 : bbEntMode(0),
252 : nNumReactors(0),
253 : bNoXDictionaryHandlePresent(false),
254 : bBinaryDataPresent(false),
255 : bIsByLayerLT(false),
256 : bNoLinks(false),
257 : nCMColor(0),
258 : dfLTypeScale(0.0),
259 : bbLTypeFlags(0),
260 : bbPlotStyleFlags(0),
261 : bbMaterialFlags(0),
262 : nShadowFlags(0),
263 : nInvisibility(0),
264 70 : nLineWeight(0)
265 : {
266 70 : }
267 : };
268 :
269 : /**
270 : * @brief The CADCommonEHD struct
271 : */
272 : struct CADCommonEHD
273 : {
274 : CADHandle hOwner; // depends on entmode.
275 : CADHandleArray hReactors;
276 : CADHandle hXDictionary;
277 : CADHandle hLayer;
278 : CADHandle hLType;
279 :
280 : CADHandle hPrevEntity;
281 : CADHandle hNextEntity;
282 :
283 : CADHandle hColorBookHandle;
284 :
285 : CADHandle hMaterial;
286 : CADHandle hPlotStyle;
287 :
288 : CADHandle hFullVisualStyle;
289 : CADHandle hFaceVisualStyle;
290 : CADHandle hEdgeVisualStyle;
291 : };
292 :
293 : /*
294 : * @brief The abstract class, which contains data common to all entities
295 : */
296 : class CADEntityObject CPL_NON_FINAL: public CADObject
297 : {
298 : public:
299 35 : explicit CADEntityObject(ObjectType typeIn): CADObject(typeIn) {}
300 :
301 53 : virtual ~CADEntityObject(){}
302 : struct CADCommonED stCed;
303 : struct CADCommonEHD stChed;
304 : };
305 :
306 : /**
307 : * @brief The CAD Text Object class
308 : */
309 : class CADTextObject final: public CADEntityObject
310 : {
311 : public:
312 : CADTextObject();
313 8 : virtual ~CADTextObject(){}
314 : unsigned char DataFlags;
315 : double dfElevation;
316 : CADVector vertInsetionPoint;
317 : CADVector vertAlignmentPoint;
318 : CADVector vectExtrusion;
319 : double dfThickness;
320 : double dfObliqueAng;
321 : double dfRotationAng;
322 : double dfHeight;
323 : double dfWidthFactor;
324 : std::string sTextValue;
325 : short dGeneration;
326 : short dHorizAlign;
327 : short dVertAlign;
328 :
329 : CADHandle hStyle;
330 : };
331 :
332 : /**
333 : * @brief The CAD Attribute Object class
334 : */
335 : class CADAttribObject CPL_NON_FINAL: public CADEntityObject
336 : {
337 : public:
338 : explicit CADAttribObject( ObjectType typeIn = ATTRIB );
339 5 : virtual ~CADAttribObject(){}
340 : unsigned char DataFlags;
341 : double dfElevation;
342 : CADVector vertInsetionPoint;
343 : CADVector vertAlignmentPoint;
344 : CADVector vectExtrusion;
345 : double dfThickness;
346 : double dfObliqueAng;
347 : double dfRotationAng;
348 : double dfHeight;
349 : double dfWidthFactor;
350 : std::string sTextValue;
351 : short dGeneration;
352 : short dHorizAlign;
353 : short dVertAlign;
354 : char dVersion; // R2010+
355 : std::string sTag;
356 : short nFieldLength;
357 : unsigned char nFlags;
358 : bool bLockPosition;
359 :
360 : CADHandle hStyle;
361 : };
362 :
363 : /**
364 : * @brief The CAD Attribute definition Object class
365 : */
366 : class CADAttdefObject final: public CADAttribObject
367 : {
368 : public:
369 : CADAttdefObject();
370 10 : virtual ~CADAttdefObject(){}
371 : std::string sPrompt;
372 : };
373 :
374 : /**
375 : * @brief The CAD Block Object class
376 : */
377 : class CADBlockObject final: public CADEntityObject
378 : {
379 : public:
380 : CADBlockObject();
381 0 : virtual ~CADBlockObject(){}
382 : std::string sBlockName;
383 : };
384 :
385 : /**
386 : * @brief The CAD End block Object class
387 : */
388 : //TODO: do we need this class? Maybe CADEntityObject is enough?
389 : class CADEndblkObject final: public CADEntityObject
390 : {
391 : public:
392 : CADEndblkObject();
393 0 : virtual ~CADEndblkObject(){}
394 : // it actually has nothing more than CED and CEHD.
395 : };
396 :
397 : /**
398 : * @brief The CADSeqendObject class
399 : */
400 : //TODO: do we need this class? Maybe CADEntityObject is enough?
401 : class CADSeqendObject final: public CADEntityObject
402 : {
403 : public:
404 : CADSeqendObject();
405 0 : virtual ~CADSeqendObject(){}
406 : // it actually has nothing more than CED and CEHD.
407 : };
408 :
409 : /**
410 : * @brief The CADInsertObject class
411 : */
412 : class CADInsertObject final: public CADEntityObject
413 : {
414 : public:
415 : explicit CADInsertObject( ObjectType typeIn = INSERT );
416 0 : virtual ~CADInsertObject(){}
417 : CADVector vertInsertionPoint;
418 : CADVector vertScales;
419 : double dfRotation;
420 : CADVector vectExtrusion;
421 : bool bHasAttribs;
422 : long nObjectsOwned;
423 :
424 : CADHandle hBlockHeader;
425 : CADHandleArray hAttribs;
426 : CADHandle hSeqend; // if bHasAttribs == true
427 : };
428 :
429 : /**
430 : * @brief The CADMInsertObject class
431 : */
432 : class CADMInsertObject final: public CADEntityObject
433 : {
434 : public:
435 : CADMInsertObject();
436 0 : virtual ~CADMInsertObject(){}
437 : CADVector vertInsertionPoint;
438 : CADVector vertScales;
439 : double dfRotation;
440 : CADVector vectExtrusion;
441 : bool bHasAttribs;
442 : long nObjectsOwned;
443 :
444 : short nNumCols;
445 : short nNumRows;
446 : short nColSpacing;
447 : short nRowSpacing;
448 :
449 : CADHandle hBlockHeader;
450 : CADHandleArray hAtrribs;
451 : CADHandle hSeqend; // if bHasAttribs == true
452 : };
453 :
454 : /**
455 : * @brief The CADVertex2DObject class
456 : */
457 : class CADVertex2DObject final: public CADEntityObject
458 : {
459 : public:
460 : CADVertex2DObject();
461 0 : virtual ~CADVertex2DObject(){}
462 : CADVector vertPosition; // Z must be taken from 2d polyline elevation.
463 : double dfStartWidth;
464 : double dfEndWidth;
465 : double dfBulge;
466 : long nVertexID;
467 : double dfTangentDir;
468 :
469 : /* NOTES: Neither elevation nor thickness are present in the 2D VERTEX data.
470 : * Both should be taken from the 2D POLYLINE entity (15)
471 : */
472 : };
473 :
474 : /**
475 : * @brief The CADVertex3DObject class
476 : */
477 : // TODO: do we need so many identical classes. Maybe CADVector(enum ObjectType eType)
478 : // for all cases?
479 : class CADVertex3DObject final: public CADEntityObject
480 : {
481 : public:
482 : CADVertex3DObject();
483 0 : virtual ~CADVertex3DObject(){}
484 : CADVector vertPosition;
485 : };
486 :
487 : /**
488 : * @brief The CADVertexMesh class
489 : */
490 : class CADVertexMeshObject final: public CADEntityObject
491 : {
492 : public:
493 : CADVertexMeshObject();
494 0 : virtual ~CADVertexMeshObject(){}
495 : CADVector vertPosition;
496 : };
497 :
498 : /**
499 : * @brief The CADVertexPFaceObject class
500 : */
501 : class CADVertexPFaceObject final: public CADEntityObject
502 : {
503 : public:
504 : CADVertexPFaceObject();
505 0 : virtual ~CADVertexPFaceObject(){}
506 : CADVector vertPosition;
507 : };
508 :
509 : /**
510 : * @brief The CADVertexPFaceFaceObject class
511 : */
512 : class CADVertexPFaceFaceObject final: public CADEntityObject
513 : {
514 : public:
515 : CADVertexPFaceFaceObject();
516 0 : virtual ~CADVertexPFaceFaceObject(){}
517 : // TODO: check DXF ref to get info what does it mean.
518 : short iVertexIndex1;
519 : short iVertexIndex2;
520 : short iVertexIndex3;
521 : short iVertexIndex4;
522 : };
523 :
524 : /**
525 : * @brief The CADPolyline2DObject class
526 : */
527 : class CADPolyline2DObject final: public CADEntityObject
528 : {
529 : public:
530 : CADPolyline2DObject();
531 0 : virtual ~CADPolyline2DObject(){}
532 : short dFlags;
533 : short dCurveNSmoothSurfType;
534 : double dfStartWidth;
535 : double dfEndWidth;
536 : double dfThickness;
537 : double dfElevation;
538 : CADVector vectExtrusion;
539 :
540 : long nObjectsOwned;
541 :
542 : CADHandleArray hVertices; // content really depends on DWG version.
543 :
544 : CADHandle hSeqend;
545 : };
546 :
547 : /**
548 : * @brief The CADPolyline3DObject class
549 : */
550 : class CADPolyline3DObject final: public CADEntityObject
551 : {
552 : public:
553 : CADPolyline3DObject();
554 0 : virtual ~CADPolyline3DObject(){}
555 : unsigned char SplinedFlags;
556 : unsigned char ClosedFlags;
557 :
558 : long nObjectsOwned;
559 :
560 : CADHandleArray hVertices; // content really depends on DWG version.
561 :
562 : CADHandle hSeqend;
563 : };
564 :
565 : /**
566 : * @brief The CADArc class
567 : */
568 : class CADArcObject final: public CADEntityObject
569 : {
570 : public:
571 : CADArcObject();
572 0 : virtual ~CADArcObject(){}
573 : CADVector vertPosition;
574 : double dfRadius;
575 : double dfThickness;
576 : CADVector vectExtrusion;
577 : double dfStartAngle;
578 : double dfEndAngle;
579 : };
580 :
581 : /**
582 : * @brief The CADCircleObject class
583 : */
584 : class CADCircleObject final: public CADEntityObject
585 : {
586 : public:
587 : CADCircleObject();
588 6 : virtual ~CADCircleObject(){}
589 : CADVector vertPosition;
590 : double dfRadius;
591 : double dfThickness;
592 : CADVector vectExtrusion;
593 : };
594 :
595 : /**
596 : * @brief The CADLineObject class
597 : */
598 : class CADLineObject final: public CADEntityObject
599 : {
600 : public:
601 : CADLineObject();
602 2 : virtual ~CADLineObject(){}
603 : CADVector vertStart;
604 : CADVector vertEnd;
605 : double dfThickness;
606 : CADVector vectExtrusion;
607 : };
608 :
609 : /**
610 : * @brief The CADBaseControlObject class
611 : */
612 : class CADBaseControlObject CPL_NON_FINAL: public CADObject
613 : {
614 : public:
615 170 : virtual ~CADBaseControlObject(){}
616 : long nObjectSizeInBits;
617 : CADHandle hObjectHandle;
618 : CADEedArray aEED;
619 : long nNumReactors;
620 : bool bNoXDictionaryPresent;
621 :
622 : protected:
623 : explicit CADBaseControlObject(ObjectType typeIn);
624 : };
625 :
626 : /**
627 : * @brief The CADBlockControlObject class
628 : */
629 : class CADBlockControlObject final: public CADBaseControlObject
630 : {
631 : public:
632 : CADBlockControlObject();
633 0 : virtual ~CADBlockControlObject(){}
634 : long nNumEntries; // doesn't count MODELSPACE and PAPERSPACE
635 : CADHandle hNull;
636 : CADHandle hXDictionary;
637 : CADHandleArray hBlocks; // ends with modelspace and paperspace handles.
638 : };
639 :
640 : /**
641 : * @brief The CADBlockHeaderObject class
642 : */
643 : class CADBlockHeaderObject final: public CADBaseControlObject
644 : {
645 : public:
646 : CADBlockHeaderObject();
647 16 : virtual ~CADBlockHeaderObject(){}
648 : std::string sEntryName;
649 : bool b64Flag;
650 : short dXRefIndex;
651 : bool bXDep;
652 : bool bAnonymous;
653 : bool bHasAtts;
654 : bool bBlkisXRef;
655 : bool bXRefOverlaid;
656 : bool bLoadedBit;
657 : long nOwnedObjectsCount;
658 : CADVector vertBasePoint;
659 : std::string sXRefPName;
660 : std::vector<unsigned char> adInsertCount; // TODO: ???
661 : std::string sBlockDescription;
662 : long nSizeOfPreviewData;
663 : std::vector<unsigned char> abyBinaryPreviewData;
664 : short nInsertUnits;
665 : bool bExplodable;
666 : char dBlockScaling;
667 : CADHandle hBlockControl;
668 : std::vector<CADHandle> hReactors;
669 : CADHandle hXDictionary;
670 : CADHandle hNull;
671 : CADHandle hBlockEntity;
672 : CADHandleArray hEntities;
673 : CADHandle hEndBlk;
674 : CADHandleArray hInsertHandles;
675 : CADHandle hLayout;
676 : };
677 :
678 : /**
679 : * @brief The CADLayerControlObject class
680 : */
681 : class CADLayerControlObject final: public CADBaseControlObject
682 : {
683 : public:
684 : CADLayerControlObject();
685 16 : virtual ~CADLayerControlObject(){}
686 :
687 : long nNumEntries; // counts layer "0"
688 : CADHandle hNull;
689 : CADHandle hXDictionary;
690 : CADHandleArray hLayers;
691 : };
692 :
693 : /**
694 : * @brief The CADLayerObject class
695 : */
696 : class CADLayerObject final: public CADBaseControlObject
697 : {
698 : public:
699 : CADLayerObject();
700 20 : virtual ~CADLayerObject(){}
701 :
702 : std::string sLayerName;
703 : bool b64Flag;
704 : short dXRefIndex;
705 : bool bXDep;
706 : bool bFrozen;
707 : bool bOn;
708 : bool bFrozenInNewVPORT;
709 : bool bLocked;
710 : bool bPlottingFlag;
711 : short dLineWeight;
712 : short dCMColor;
713 :
714 : CADHandle hLayerControl;
715 : CADHandleArray hReactors;
716 : CADHandle hXDictionary;
717 : CADHandle hExternalRefBlockHandle;
718 : CADHandle hPlotStyle;
719 : CADHandle hMaterial;
720 : CADHandle hLType;
721 : CADHandle hUnknownHandle;
722 : };
723 :
724 : /**
725 : * @brief The CADLineTypeControlObject class
726 : */
727 : class CADLineTypeControlObject final: public CADBaseControlObject
728 : {
729 : public:
730 : CADLineTypeControlObject();
731 0 : virtual ~CADLineTypeControlObject(){}
732 :
733 : long nNumEntries; // doesn't count BYBLOCK / BYLAYER.
734 : CADHandle hNull;
735 : CADHandle hXDictionary;
736 : CADHandleArray hLTypes;
737 : };
738 :
739 : typedef struct _dash
740 : {
741 : double dfLength;
742 : short dComplexShapecode;
743 : double dfXOffset;
744 : double dfYOffset;
745 : double dfScale;
746 : double dfRotation;
747 : short dShapeflag;
748 : } CADDash;
749 :
750 : /**
751 : * @brief The CADLineTypeObject class
752 : */
753 : class CADLineTypeObject final: public CADBaseControlObject
754 : {
755 : public:
756 : CADLineTypeObject();
757 0 : virtual ~CADLineTypeObject(){}
758 :
759 : std::string sEntryName;
760 : bool b64Flag;
761 : short dXRefIndex;
762 : bool bXDep;
763 : std::string sDescription;
764 : double dfPatternLen;
765 : unsigned char dAlignment;
766 : unsigned char nNumDashes;
767 : std::vector<CADDash> astDashes;
768 : std::vector<unsigned char> abyTextArea; // TODO: what is it?
769 : CADHandle hLTControl;
770 : CADHandleArray hReactors;
771 : CADHandle hXDictionary;
772 : CADHandle hXRefBlock;
773 : CADHandleArray hShapefiles; // TODO: one for each dash?
774 : };
775 :
776 : /**
777 : * @brief The CADPointObject class
778 : */
779 : class CADPointObject final: public CADEntityObject
780 : {
781 : public:
782 : CADPointObject();
783 2 : virtual ~CADPointObject(){}
784 :
785 : CADVector vertPosition;
786 : double dfThickness;
787 : CADVector vectExtrusion;
788 : double dfXAxisAng;
789 : };
790 :
791 : /**
792 : * @brief The CADSolidObject class
793 : */
794 : class CADSolidObject final: public CADEntityObject
795 : {
796 : public:
797 : CADSolidObject();
798 0 : virtual ~CADSolidObject(){}
799 :
800 : double dfThickness;
801 : double dfElevation;
802 : std::vector<CADVector> avertCorners;
803 : CADVector vectExtrusion;
804 : };
805 :
806 : /**
807 : * @brief The CADEllipseObject class
808 : */
809 : class CADEllipseObject final: public CADEntityObject
810 : {
811 : public:
812 : CADEllipseObject();
813 2 : virtual ~CADEllipseObject(){}
814 :
815 : CADVector vertPosition;
816 : CADVector vectSMAxis;
817 : CADVector vectExtrusion;
818 : double dfAxisRatio;
819 : double dfBegAngle;
820 : double dfEndAngle;
821 : };
822 :
823 : /**
824 : * @brief The CADRayObject class
825 : */
826 : class CADRayObject final: public CADEntityObject
827 : {
828 : public:
829 : CADRayObject();
830 0 : virtual ~CADRayObject(){}
831 :
832 : CADVector vertPosition;
833 : CADVector vectVector;
834 : };
835 :
836 : /**
837 : * @brief The CADXLineObject class
838 : */
839 : class CADXLineObject final: public CADEntityObject
840 : {
841 : public:
842 : CADXLineObject();
843 0 : virtual ~CADXLineObject(){}
844 :
845 : CADVector vertPosition;
846 : CADVector vectVector;
847 : };
848 :
849 : /**
850 : * @brief The CADDictionaryObject class
851 : */
852 : class CADDictionaryObject final: public CADBaseControlObject
853 : {
854 : public:
855 : CADDictionaryObject();
856 240 : virtual ~CADDictionaryObject(){}
857 :
858 : long nNumItems;
859 : short dCloningFlag;
860 : unsigned char dHardOwnerFlag;
861 :
862 : std::vector<std::string> sItemNames;
863 :
864 : CADHandle hParentHandle;
865 : CADHandleArray hReactors;
866 : CADHandle hXDictionary;
867 : CADHandleArray hItemHandles;
868 : };
869 :
870 : /**
871 : * @brief The CADLWPolylineObject class
872 : */
873 : class CADLWPolylineObject final: public CADEntityObject
874 : {
875 : public:
876 : CADLWPolylineObject();
877 0 : virtual ~CADLWPolylineObject(){}
878 :
879 : bool bClosed;
880 : double dfConstWidth;
881 : double dfElevation;
882 : double dfThickness;
883 : CADVector vectExtrusion;
884 : std::vector<CADVector> avertVertices;
885 : std::vector<double> adfBulges;
886 : std::vector<short> adVerticesID;
887 : std::vector<std::pair<double, double>> astWidths; // start, end.
888 : };
889 :
890 : /**
891 : * @brief The CADSplineObject class
892 : */
893 : class CADSplineObject final: public CADEntityObject
894 : {
895 : public:
896 : CADSplineObject();
897 0 : virtual ~CADSplineObject(){}
898 :
899 : long dScenario;
900 : long dSplineFlags; // 2013+
901 : long dKnotParameter; // 2013+
902 :
903 : long dDegree;
904 : double dfFitTol;
905 : CADVector vectBegTangDir;
906 : CADVector vectEndTangDir;
907 : long nNumFitPts;
908 :
909 : bool bRational;
910 : bool bClosed;
911 : bool bPeriodic;
912 : double dfKnotTol;
913 : double dfCtrlTol;
914 : long nNumKnots;
915 : long nNumCtrlPts;
916 : bool bWeight;
917 :
918 : std::vector<double> adfKnots;
919 : std::vector<double> adfCtrlPointsWeight;
920 : std::vector<CADVector> avertCtrlPoints;
921 : std::vector<CADVector> averFitPoints;
922 : };
923 :
924 : /**
925 : * @brief Common Dimensional Data structure
926 : */
927 : struct CADCommonDimensionData
928 : {
929 : char dVersion;
930 : CADVector vectExtrusion;
931 : CADVector vertTextMidPt;
932 : double dfElevation;
933 : unsigned char dFlags;
934 : std::string sUserText;
935 : double dfTextRotation;
936 : double dfHorizDir;
937 : double dfInsXScale;
938 : double dfInsYScale;
939 : double dfInsZScale;
940 : double dfInsRotation;
941 :
942 : short dAttachmentPoint;
943 : short dLineSpacingStyle;
944 : double dfLineSpacingFactor;
945 : double dfActualMeasurement;
946 :
947 : bool bUnknown;
948 : bool bFlipArrow1;
949 : bool bFlipArrow2;
950 :
951 : CADVector vert12Pt;
952 :
953 0 : CADCommonDimensionData() :
954 : dVersion(0),
955 : dfElevation(0.0),
956 : dFlags(0),
957 : dfTextRotation(0.0),
958 : dfHorizDir(0.0),
959 : dfInsXScale(0.0),
960 : dfInsYScale(0.0),
961 : dfInsZScale(0.0),
962 : dfInsRotation(0.0),
963 : dAttachmentPoint(0),
964 : dLineSpacingStyle(0),
965 : dfLineSpacingFactor(0.0),
966 : dfActualMeasurement(0.0),
967 : bUnknown(false),
968 : bFlipArrow1(false),
969 0 : bFlipArrow2(false)
970 : {
971 0 : }
972 : };
973 :
974 : /**
975 : * @brief The CADDimensionObject class
976 : */
977 : class CADDimensionObject CPL_NON_FINAL: public CADEntityObject
978 : {
979 : public:
980 0 : explicit CADDimensionObject( ObjectType typeIn ) : CADEntityObject(typeIn) {}
981 0 : virtual ~CADDimensionObject(){}
982 : CADCommonDimensionData cdd;
983 : CADVector vert10pt;
984 : CADHandle hDimstyle;
985 : CADHandle hAnonymousBlock;
986 : };
987 :
988 : /**
989 : * @brief The CADDimensionOrdinateObject class
990 : */
991 : class CADDimensionOrdinateObject final: public CADDimensionObject
992 : {
993 : public:
994 : CADDimensionOrdinateObject();
995 0 : virtual ~CADDimensionOrdinateObject(){}
996 : CADVector vert13pt, vert14pt;
997 : unsigned char Flags2;
998 : };
999 :
1000 : /**
1001 : * @brief The CADDimensionLinearObject class
1002 : */
1003 : class CADDimensionLinearObject final: public CADDimensionObject
1004 : {
1005 : public:
1006 : CADDimensionLinearObject();
1007 0 : virtual ~CADDimensionLinearObject(){}
1008 : CADVector vert13pt, vert14pt;
1009 :
1010 : double dfExtLnRot;
1011 : double dfDimRot;
1012 : };
1013 :
1014 : /**
1015 : * @brief The CADDimensionAlignedObject class
1016 : */
1017 : class CADDimensionAlignedObject final: public CADDimensionObject
1018 : {
1019 : public:
1020 : CADDimensionAlignedObject();
1021 0 : virtual ~CADDimensionAlignedObject(){}
1022 : CADVector vert13pt, vert14pt;
1023 :
1024 : double dfExtLnRot;
1025 : };
1026 :
1027 : /**
1028 : * @brief The CADDimensionAngular3PtObject class
1029 : */
1030 : class CADDimensionAngular3PtObject CPL_NON_FINAL: public CADDimensionObject
1031 : {
1032 : public:
1033 : explicit CADDimensionAngular3PtObject(ObjectType typeIn = DIMENSION_ANG_3PT);
1034 0 : virtual ~CADDimensionAngular3PtObject(){}
1035 : CADVector vert13pt, vert14pt;
1036 : CADVector vert15pt;
1037 : };
1038 :
1039 : /**
1040 : * @brief The CADDimensionAngular2LnObject class
1041 : */
1042 : class CADDimensionAngular2LnObject final: public CADDimensionAngular3PtObject
1043 : {
1044 : public:
1045 : CADDimensionAngular2LnObject();
1046 0 : virtual ~CADDimensionAngular2LnObject(){}
1047 :
1048 : CADVector vert16pt;
1049 : };
1050 :
1051 : /**
1052 : * @brief The CADDimensionRadiusObject class
1053 : */
1054 : class CADDimensionRadiusObject CPL_NON_FINAL: public CADDimensionObject
1055 : {
1056 : public:
1057 : explicit CADDimensionRadiusObject(ObjectType typeIn = DIMENSION_RADIUS);
1058 0 : virtual ~CADDimensionRadiusObject(){}
1059 :
1060 : CADVector vert15pt;
1061 : double dfLeaderLen;
1062 : };
1063 :
1064 : /**
1065 : * @brief The CADDimensionDiameterObject class
1066 : */
1067 : class CADDimensionDiameterObject final: public CADDimensionRadiusObject
1068 : {
1069 : public:
1070 : CADDimensionDiameterObject();
1071 0 : virtual ~CADDimensionDiameterObject(){}
1072 : };
1073 :
1074 : /**
1075 : * @brief The CADImageObject class
1076 : */
1077 : class CADImageObject final: public CADEntityObject
1078 : {
1079 : public:
1080 : CADImageObject();
1081 0 : virtual ~CADImageObject(){}
1082 :
1083 : long dClassVersion;
1084 : CADVector vertInsertion;
1085 : CADVector vectUDirection;
1086 : CADVector vectVDirection;
1087 : double dfSizeX;
1088 : double dfSizeY;
1089 : /* display properties (bit coded), 1==show image,
1090 : 2==show image when not aligned with screen, 4==use
1091 : clipping boundary, 8==transparency on */
1092 : short dDisplayProps;
1093 :
1094 : bool bClipping;
1095 : unsigned char dBrightness;
1096 : unsigned char dContrast;
1097 : unsigned char dFade;
1098 : bool bClipMode; // R2010+
1099 :
1100 : short dClipBoundaryType;
1101 :
1102 : long nNumberVerticesInClipPolygon;
1103 : std::vector<CADVector> avertClippingPolygonVertices;
1104 :
1105 : CADHandle hImageDef;
1106 : CADHandle hImageDefReactor;
1107 : };
1108 :
1109 : /**
1110 : * @brief The CADImageDefReactorObject class
1111 : */
1112 : class CADImageDefReactorObject CPL_NON_FINAL: public CADBaseControlObject
1113 : {
1114 : public:
1115 : explicit CADImageDefReactorObject(ObjectType typeIn = IMAGEDEFREACTOR);
1116 0 : virtual ~CADImageDefReactorObject(){}
1117 :
1118 : long dClassVersion;
1119 : CADHandle hParentHandle;
1120 : std::vector<CADHandle> hReactors;
1121 : CADHandle hXDictionary;
1122 : };
1123 :
1124 : /**
1125 : * @brief The CADImageDefObject class
1126 : */
1127 : class CADImageDefObject final: public CADImageDefReactorObject
1128 : {
1129 : public:
1130 : CADImageDefObject();
1131 0 : virtual ~CADImageDefObject(){}
1132 :
1133 : double dfXImageSizeInPx;
1134 : double dfYImageSizeInPx;
1135 : std::string sFilePath;
1136 : bool bIsLoaded;
1137 : unsigned char dResUnits; // 0 == none, 2 == centimeters, 5 == inches
1138 : double dfXPixelSize; // size of 1 pixel in autocad units
1139 : double dfYPixelSize;
1140 : };
1141 :
1142 : /**
1143 : * @brief The CADMTextObject class
1144 : */
1145 : class CADMTextObject final: public CADEntityObject
1146 : {
1147 : public:
1148 : CADMTextObject();
1149 4 : virtual ~CADMTextObject(){}
1150 :
1151 : CADVector vertInsertionPoint;
1152 : CADVector vectExtrusion;
1153 : CADVector vectXAxisDir;
1154 : double dfRectWidth;
1155 : double dfTextHeight;
1156 : short dAttachment; // TODO: meaning unknown
1157 : short dDrawingDir;
1158 : double dfExtents; // TODO: meaning unknown
1159 : double dfExtentsWidth; // TODO: meaning unknown
1160 : std::string sTextValue;
1161 : short dLineSpacingStyle;
1162 : double dLineSpacingFactor;
1163 : bool bUnknownBit;
1164 : long dBackgroundFlags;
1165 : long dBackgroundScaleFactor;
1166 : short dBackgroundColor;
1167 : long dBackgroundTransparency;
1168 : CADHandle hStyle;
1169 : };
1170 :
1171 : /**
1172 : * @brief Linestyle data structure
1173 : */
1174 : typedef struct _linestyle
1175 : {
1176 : short nNumSegParams;
1177 : std::vector<double> adfSegparms;
1178 : short nAreaFillParams;
1179 : std::vector<double> adfAreaFillParameters;
1180 : } CADLineStyle;
1181 :
1182 : /**
1183 : * @brief MLine vertex data structure
1184 : */
1185 : typedef struct _mlinevertex
1186 : {
1187 : CADVector vertPosition;
1188 : CADVector vectDirection;
1189 : CADVector vectMIterDirection;
1190 : std::vector<CADLineStyle> astLStyles;
1191 : } CADMLineVertex;
1192 :
1193 : /**
1194 : * @brief The CADMLineObject class
1195 : */
1196 : class CADMLineObject final: public CADEntityObject
1197 : {
1198 : public:
1199 : CADMLineObject();
1200 0 : virtual ~CADMLineObject(){}
1201 :
1202 : double dfScale;
1203 : unsigned char dJust;
1204 : CADVector vertBasePoint;
1205 : CADVector vectExtrusion;
1206 : short dOpenClosed; // 1 open, 3 closed
1207 : unsigned char nLinesInStyle;
1208 : short nNumVertices;
1209 :
1210 : std::vector<CADMLineVertex> avertVertices;
1211 :
1212 : CADHandle hMLineStyle;
1213 : };
1214 :
1215 : /**
1216 : * @brief The CAD3DFaceObject class
1217 : */
1218 : class CAD3DFaceObject final: public CADEntityObject
1219 : {
1220 : public:
1221 : CAD3DFaceObject();
1222 0 : virtual ~CAD3DFaceObject(){}
1223 :
1224 : bool bHasNoFlagInd; // 2000+
1225 : bool bZZero;
1226 : std::vector<CADVector> avertCorners;
1227 : short dInvisFlags;
1228 : };
1229 :
1230 : /**
1231 : * @brief The CADPolylinePFaceObject class
1232 : */
1233 : class CADPolylinePFaceObject final: public CADEntityObject
1234 : {
1235 : public:
1236 : CADPolylinePFaceObject();
1237 0 : virtual ~CADPolylinePFaceObject(){}
1238 :
1239 : short nNumVertices;
1240 : short nNumFaces;
1241 : long nObjectsOwned;
1242 : std::vector<CADHandle> hVertices; // content really depends on DWG version.
1243 : CADHandle hSeqend;
1244 : };
1245 :
1246 : #ifdef TODO
1247 : /**
1248 : * @brief The CADHatchObject class TODO: not completed
1249 : */
1250 : class CADHatchObject final: public CADEntityObject
1251 : {
1252 : public:
1253 : typedef struct
1254 : {
1255 : double dfUnknowndouble;
1256 : short dUnknownshort;
1257 : long dRGBColor;
1258 : char dIgnoredColorByte;
1259 : } _gradient_color;
1260 :
1261 : CADHatchObject();
1262 : virtual ~CADHatchObject(){}
1263 :
1264 : long dIsGradientFill; // 2004+
1265 : long dReserved;
1266 : double dfGradientAngle;
1267 : double dfGradientShift;
1268 : long dSingleColorGrad;
1269 : double dfGradientTint;
1270 : long nGradientColors;
1271 : std::vector<_gradient_color> astGradientColors;
1272 :
1273 : std::string sGradientName;
1274 :
1275 : double dfZCoord; // always X = Y = 0.0
1276 : CADVector vectExtrusion;
1277 : std::string sHatchName;
1278 : bool bSolidFill;
1279 : bool bAssociative;
1280 : long nNumPaths;
1281 :
1282 : typedef struct
1283 : {
1284 : char dPathTypeStatus;
1285 : CADVector vectPt0;
1286 : CADVector vectPt1;
1287 : } _path_segment;
1288 : };
1289 : #endif
1290 :
1291 : /**
1292 : * @brief The CADXRecordObject class
1293 : */
1294 : class CADXRecordObject final: public CADBaseControlObject
1295 : {
1296 : public:
1297 : CADXRecordObject();
1298 48 : virtual ~CADXRecordObject(){}
1299 :
1300 : long nNumDataBytes;
1301 : std::vector<char> abyDataBytes;
1302 : short dCloningFlag;
1303 : std::vector<std::pair<short, std::vector<char> > > astXRecordData;
1304 : CADHandle hParentHandle;
1305 : std::vector<CADHandle> hReactors;
1306 : CADHandle hXDictionary;
1307 : std::vector<CADHandle> hObjIdHandles;
1308 : };
1309 :
1310 : #endif //CADOBJECTS_H
|