Introduction

Getting Started

Programming Guides

API Reference

Additional Resources

MrDwgReader.h
1 // Copyright (c) Tech Soft 3D, Inc.
2 //
3 // The information contained herein is confidential and proprietary to Tech Soft 3D, Inc.,
4 // and considered a trade secret as defined under civil and criminal statutes.
5 // Tech Soft 3D, Inc. shall pursue its civil and criminal remedies in the event of
6 // unauthorized use or misappropriation of its trade secrets. Use of this information
7 // by anyone other than authorized employees of Tech Soft 3D, Inc. is granted only under
8 // a written non-disclosure agreement, expressly prescribing the scope and manner of such use.
9 
10 #pragma once
11 
12 #pragma warning (disable: 4996) // standard string functions considered unsafe
13 
14 #include "MrDwgWorldDraw.h"
15 #include "MrDwgViewportDraw.h"
16 #include "misc.h"
17 
18 #include <hc.h>
19 
20 #include <map>
21 #include <set>
22 #include <sstream>
23 
24 #include <dbmain.h>
25 #include <dbsymtb.h>
26 #include <dbdim.h>
27 #include <dbproxy.h>
28 
29 #define MTEXT_EXPLODE_FRAGMENTS 1
30 
31 #ifdef MTEXT_EXPLODE_FRAGMENTS
32 struct AcDbMTextFragment;
33 #endif
34 
36 {
37 public:
38  MrDwgReader(bool skip_unreferenced_blocks, int attribute_precision_mode);
39  ~MrDwgReader();
40 
41  virtual void importDatabase(AcDbDatabase *pDatabase);
42 
43  /* Map used to convert non-latin font names */
44  std::map<std::wstring, std::string> m_fontmap;
45  /* Segment in which the current entity will be inserted (up to importEntity level) */
46  HC_KEY entityInsertionSegment;
47  /* Information about multi line text which needs to be restyled before being broken into fragments */
48  mTextData m_multiline_text_info;
49 
50  /* How to handle double precision matrices handed to us from RealDWG. */
51  int m_attributePrecisionMode;
52 
53  /* Whether the importer generated double precision data. */
54  bool m_generatedDouble;
55 
56 protected:
57  /* m_blockCount is used to track progress */
58  int m_blockCount;
59  int m_3dSolids;
60 
61  /* m_xrefList includes the root model filename and is used
62  * to compute an overall hash for the DWG model. The hash
63  * is used to load cached HSF files. */
64  std::set<std::wstring> m_xrefList;
65 
66  /* These two maps are for resolving block references. A block
67  * may be referenced before it's loaded. While we handle block
68  * references, just save the key to the current segment and the
69  * ID to the referenced block. After loading the whole block
70  * table, resolve these references then. */
71  std::map<AcDbHandle, HC_KEY> m_recordKeyMap;
72  std::multimap<HC_KEY, AcDbHandle> m_referenceKeyMap;
73 
74  /* The autocad model needs to me included under each of these segments. */
75  std::vector<HC_KEY> m_clips;
76 
77  HC_KEY m_modelKey;
78  HC_KEY m_modelRoot;
79 
80  /* This, m_layerKeyMap, is just simpler (for now). It's associates the layerID's with
81  * the layer segment's key. This is used for entities which are colored by layer. */
82  std::map<AcDbHandle, HC_KEY> m_layerKeyMap;
83 
84  /* m_viewportMap is used to associate a layer ID with all of its viewports*/
85  struct viewportData
86  {
87  HC_KEY viewportSegmentKey; // Key to the segment where the viewport will be inserted
88  bool isMatrixID; // True if the viewport's modelling matrix is I
89  };
90  std::map<AcDbHandle, std::vector<viewportData> > m_viewportMap;
91 
92  std::stringstream m_main_color_map; //main color map
93 
94  /* dimensionData and m_dimensions are used to regenerate missing dimensions at runtime */
96  {
97  dimensionData(HC_KEY dKey, HC_KEY sKey, AcDbHandle h, AcDbBlockTableRecord * btr)
98  {
99  destinationKey = dKey;
100  sourceKey = sKey;
101  dimensionHandle = h;
102  dimensionBTR = btr;
103  }
104 
105  HC_KEY destinationKey; // key to the segment where the dimension will be inserted
106  HC_KEY sourceKey; // key to the segment containing the recomputed dimension BTR
107  AcDbHandle dimensionHandle; // handle of the dimension object
108  AcDbBlockTableRecord * dimensionBTR; // recomputed dimension BTR
109  };
110  std::vector<dimensionData> m_dimensions;
111  void importOneBlockTableRecord(dimensionData * dimensions);
112  void recomputeAndImportDimensions(std::vector<dimensionData> * dimensionVector);
113  void restyleAndImportMText(mTextData * mtext_info);
114  void populate_fontmap();
115 
116  /* importUnknownEntity is used to import entities that are not on the entity list,
117  * such as object enablers. In order for object enablers to be imported successfully
118  * all required DLLs and DBX files need to be in the bin directory */
119  void importUnknownEntity(AcDbEntity * pEnt);
120 
121  virtual void progress(double percentComplete) const;
122  virtual void importDwfInfo(AcDbDatabase *pDatabase);
123 
124  friend void importAcDb2LineAngularDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
125  friend void importAcDb2dVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
126  friend void importAcDb3PointAngularDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
127  friend void importAcDb2dPolyline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
128  friend void importAcDb3dPolyline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
129  friend void importAcDb3dPolylineVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
130  friend void importAcDb3dSolid(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
131  friend void importAcDbAlignedDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
132  friend void importAcDbArc(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
133  friend void importAcDbAttribute(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
134  friend void importAcDbAttributeDefinition(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
135  friend void importAcDbBlockBegin(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
136  friend void importAcDbBlockEnd(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
137  friend void importAcDbBlockReference(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
138  friend void importAcDbBody(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
139  friend void importAcDbCircle(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
140  friend void importAcDbCurve(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
141  friend void importAcDbDiametricDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
142  friend void importAcDbDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
143  friend void importAcDbEllipse(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
144  friend void importAcDbFace(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
145  friend void importAcDbFaceRecord(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
146  friend void importAcDbFcf(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
147  friend void importAcDbFrame(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
148  friend void importAcDbHatch(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
149  friend void importAcDbLeader(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
150  friend void importAcDbLine(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
151  friend void importAcDbMInsertBlock(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
152  friend void importAcDbMText(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
153 #ifdef MTEXT_EXPLODE_FRAGMENTS
154  friend static int callback_AcDbMTextFragments(AcDbMTextFragment *frag, void *param);
155 #endif
156  friend void importAcDbMline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
157  friend void importAcDbOle2Frame(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
158  friend void importAcDbOleFrame(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
159  friend void importAcDbOrdinateDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
160  friend void importAcDbPoint(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
161  friend void importAcDbPolyFaceMesh(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
162  friend void importAcDbPolyFaceMeshVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
163  friend void importAcDbPolygonMesh(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
164  friend void importAcDbPolygonMeshVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
165  friend void importAcDbPolyline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
166  friend void importAcDbProxyEntity(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
167  friend void importAcDbRadialDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
168  friend void importAcDbRasterImage(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
169  friend void importAcDbRay(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
170  friend void importAcDbRegion(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
171  friend void importAcDbRotatedDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
172  friend void importAcDbSequenceEnd(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
173  friend void importAcDbShape(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
174  friend void importAcDbSolid(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
175  friend void importAcDbSpline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
176  friend void importAcDbTable(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
177  friend void importAcDbText(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
178  friend void importAcDbTrace(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
179  friend void importAcDbVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
180  friend void importAcDbViewport(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
181  friend void importAcDbWipeout(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
182  friend void importAcDbXline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
183  friend void importAcDbZombieEntity(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
184 
185 
186  virtual void importAcDb2LineAngularDimension(AcDbEntity *pEnt);
187  virtual void importAcDb2dVertex(AcDbEntity *pEnt);
188  virtual void importAcDb3PointAngularDimension(AcDbEntity *pEnt);
189  virtual void importAcDb2dPolyline(AcDbEntity *pEnt);
190  virtual void importAcDb3dPolyline(AcDbEntity *pEnt);
191  virtual void importAcDb3dPolylineVertex(AcDbEntity *pEnt);
192  virtual void importAcDb3dSolid(AcDbEntity *pEnt);
193  virtual void importAcDbAlignedDimension(AcDbEntity *pEnt);
194  virtual void importAcDbArc(AcDbEntity *pEnt);
195  virtual void importAcDbAttribute(AcDbEntity *pEnt);
196  virtual void importAcDbAttributeDefinition(AcDbEntity *pEnt);
197  virtual void importAcDbBlockBegin(AcDbEntity *pEnt);
198  virtual void importAcDbBlockEnd(AcDbEntity *pEnt);
199  virtual void importAcDbBlockReference(AcDbEntity *pEnt);
200  virtual void importAcDbBody(AcDbEntity *pEnt);
201  virtual void importAcDbCircle(AcDbEntity *pEnt);
202  virtual void importAcDbCurve(AcDbEntity *pEnt);
203  virtual void importAcDbDiametricDimension(AcDbEntity *pEnt);
204  virtual void importAcDbDimension(AcDbEntity *pEnt);
205  virtual void importAcDbEllipse(AcDbEntity *pEnt);
206  virtual void importAcDbFace(AcDbEntity *pEnt);
207  virtual void importAcDbFaceRecord(AcDbEntity *pEnt);
208  virtual void importAcDbFcf(AcDbEntity *pEnt);
209  virtual void importAcDbFrame(AcDbEntity *pEnt);
210  virtual void importAcDbHatch(AcDbEntity *pEnt);
211  virtual void importAcDbLeader(AcDbEntity *pEnt);
212  virtual void importAcDbLine(AcDbEntity *pEnt);
213  virtual void importAcDbMInsertBlock(AcDbEntity *pEnt);
214  virtual void importAcDbMText(AcDbEntity *pEnt);
215 #ifdef MTEXT_EXPLODE_FRAGMENTS
216  virtual void importAcDbMTextFragment(AcDbMTextFragment* pAcDbMTextFragment, AcDbEntity* pEnt);
217 #endif
218  virtual void importAcDbMline(AcDbEntity *pEnt);
219  virtual void importAcDbOle2Frame(AcDbEntity *pEnt);
220  virtual void importAcDbOleFrame(AcDbEntity *pEnt);
221  virtual void importAcDbOrdinateDimension(AcDbEntity *pEnt);
222  virtual void importAcDbPoint(AcDbEntity *pEnt);
223  virtual void importAcDbPolyFaceMesh(AcDbEntity *pEnt);
224  virtual void importAcDbPolyFaceMeshVertex(AcDbEntity *pEnt);
225  virtual void importAcDbPolygonMesh(AcDbEntity *pEnt);
226  virtual void importAcDbPolygonMeshVertex(AcDbEntity *pEnt);
227  virtual void importAcDbPolyline(AcDbEntity *pEnt);
228  virtual void importAcDbProxyEntity(AcDbEntity *pEnt);
229  virtual void importAcDbRadialDimension(AcDbEntity *pEnt);
230  virtual void importAcDbRasterImage(AcDbEntity *pEnt);
231  virtual void importAcDbRay(AcDbEntity *pEnt);
232  virtual void importAcDbRegion(AcDbEntity *pEnt);
233  virtual void importAcDbRotatedDimension(AcDbEntity *pEnt);
234  virtual void importAcDbSequenceEnd(AcDbEntity *pEnt);
235  virtual void importAcDbShape(AcDbEntity *pEnt);
236  virtual void importAcDbSolid(AcDbEntity *pEnt);
237  virtual void importAcDbSpline(AcDbEntity *pEnt);
238  virtual void importAcDbTable(AcDbEntity *pEnt);
239  virtual void importAcDbText(AcDbEntity *pEnt);
240  virtual void importAcDbTrace(AcDbEntity *pEnt);
241  virtual void importAcDbVertex(AcDbEntity *pEnt);
242  virtual void importAcDbViewport(AcDbEntity *pEnt);
243  virtual void importAcDbWipeout(AcDbEntity *pEnt);
244  virtual void importAcDbXline(AcDbEntity *pEnt);
245  virtual void importAcDbZombieEntity(AcDbEntity *pEnt);
246 
247  virtual void linkDimension(AcDbDimension * pDim);
248 
249  virtual void DrawEntity(AcDbEntity *pEnt, AcGiRegenType regenType);
250 
251  virtual HC_KEY GetBlockTableRecordSegKey(AcDbBlockTableRecord *pRecord);
252  virtual HC_KEY GetAttrStateSegKey(AcDbEntity *pEnt, bool is_zombie_entity = false);
253  virtual HC_KEY GetLayoutSegKey(ACHAR *layoutName);
254  virtual HC_KEY GetLayerSegKey(ACHAR *layoutName);
255 
256  virtual void importXdata(AcDbEntity *pEnt);
257  virtual bool importEntity(AcDbEntity *pEnt);
258  void importEntityFromHandle(AcDbHandle handle);
259  virtual void importBlockTable(AcDbBlockTable *pBlockTable);
260  virtual void importViewportTable(AcDbViewportTable *pViewportTable);
261 
262  virtual void importLayerTable(AcDbLayerTable *pLayerTable);
263  virtual bool applyEntityLinetype(AcDbEntity *pEnt);
264  virtual bool importLinetypeAndApply(AcDbLinetypeTableRecord *pLinetypeRecord, double scale);
265 
267  {
268  double offset;
269  AcCmColor color;
270  AcDbObjectId linetypeId;
271  };
272 
273  typedef std::vector<mLineStyleDefComponent> mLineStyleDef;
274  std::map<AcDbHandle, mLineStyleDef> m_MlineStyles;
275 
276  virtual void importMlineStyleDictionary(AcDbDictionary *pDictionary);
277 
278  bool m_skip_unreferenced_blocks;
279 };
Definition: MrDwgReader.h:266
#define HC_KEY
Definition: MrDwgReader.h:35
Definition: MrDwgReader.h:95
Definition: MrDwgReader.h:85
Definition: misc.h:30