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);
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 protected:
50  /* m_blockCount is used to track progress */
51  int m_blockCount;
52  int m_3dSolids;
53 
54  /* m_xrefList includes the root model filename and is used
55  * to compute an overall hash for the DWG model. The hash
56  * is used to load cached HSF files. */
57  std::set<std::wstring> m_xrefList;
58 
59  /* These two maps are for resolving block references. A block
60  * may be referenced before it's loaded. While we handle block
61  * references, just save the key to the current segment and the
62  * ID to the referenced block. After loading the whole block
63  * table, resolve these references then. */
64  std::map<AcDbHandle, HC_KEY> m_recordKeyMap;
65  std::multimap<HC_KEY, AcDbHandle> m_referenceKeyMap;
66 
67  /* The autocad model needs to me included under each of these segments. */
68  std::vector<HC_KEY> m_clips;
69 
70  HC_KEY m_modelKey;
71  HC_KEY m_modelRoot;
72 
73  /* This, m_layerKeyMap, is just simpler (for now). It's associates the layerID's with
74  * the layer segment's key. This is used for entities which are colored by layer. */
75  std::map<AcDbHandle, HC_KEY> m_layerKeyMap;
76 
77  /* m_viewportMap is used to associate a layer ID with all of its viewports*/
78  struct viewportData
79  {
80  HC_KEY viewportSegmentKey; // Key to the segment where the viewport will be inserted
81  bool isMatrixID; // True if the viewport's modelling matrix is I
82  };
83  std::map<AcDbHandle, std::vector<viewportData> > m_viewportMap;
84 
85  std::stringstream m_main_color_map; //main color map
86 
87  /* dimensionData and m_dimensions are used to regenerate missing dimensions at runtime */
89  {
90  dimensionData(HC_KEY dKey, HC_KEY sKey, AcDbHandle h, AcDbBlockTableRecord * btr)
91  {
92  destinationKey = dKey;
93  sourceKey = sKey;
94  dimensionHandle = h;
95  dimensionBTR = btr;
96  }
97 
98  HC_KEY destinationKey; // key to the segment where the dimension will be inserted
99  HC_KEY sourceKey; // key to the segment containing the recomputed dimension BTR
100  AcDbHandle dimensionHandle; // handle of the dimension object
101  AcDbBlockTableRecord * dimensionBTR; // recomputed dimension BTR
102  };
103  std::vector<dimensionData> m_dimensions;
104  void importOneBlockTableRecord(dimensionData * dimensions);
105  void recomputeAndImportDimensions(std::vector<dimensionData> * dimensionVector);
106  void restyleAndImportMText(mTextData * mtext_info);
107  void populate_fontmap();
108 
109  /* importUnknownEntity is used to import entities that are not on the entity list,
110  * such as object enablers. In order for object enablers to be imported successfully
111  * all required DLLs and DBX files need to be in the bin directory */
112  void importUnknownEntity(AcDbEntity * pEnt);
113 
114  virtual void progress(double percentComplete) const;
115  virtual void importDwfInfo(AcDbDatabase *pDatabase);
116 
117  friend void importAcDb2LineAngularDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
118  friend void importAcDb2dVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
119  friend void importAcDb3PointAngularDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
120  friend void importAcDb2dPolyline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
121  friend void importAcDb3dPolyline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
122  friend void importAcDb3dPolylineVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
123  friend void importAcDb3dSolid(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
124  friend void importAcDbAlignedDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
125  friend void importAcDbArc(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
126  friend void importAcDbAttribute(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
127  friend void importAcDbAttributeDefinition(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
128  friend void importAcDbBlockBegin(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
129  friend void importAcDbBlockEnd(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
130  friend void importAcDbBlockReference(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
131  friend void importAcDbBody(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
132  friend void importAcDbCircle(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
133  friend void importAcDbCurve(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
134  friend void importAcDbDiametricDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
135  friend void importAcDbDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
136  friend void importAcDbEllipse(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
137  friend void importAcDbFace(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
138  friend void importAcDbFaceRecord(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
139  friend void importAcDbFcf(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
140  friend void importAcDbFrame(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
141  friend void importAcDbHatch(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
142  friend void importAcDbLeader(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
143  friend void importAcDbLine(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
144  friend void importAcDbMInsertBlock(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
145  friend void importAcDbMText(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
146 #ifdef MTEXT_EXPLODE_FRAGMENTS
147  friend static int callback_AcDbMTextFragments(AcDbMTextFragment *frag, void *param);
148 #endif
149  friend void importAcDbMline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
150  friend void importAcDbOle2Frame(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
151  friend void importAcDbOleFrame(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
152  friend void importAcDbOrdinateDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
153  friend void importAcDbPoint(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
154  friend void importAcDbPolyFaceMesh(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
155  friend void importAcDbPolyFaceMeshVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
156  friend void importAcDbPolygonMesh(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
157  friend void importAcDbPolygonMeshVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
158  friend void importAcDbPolyline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
159  friend void importAcDbProxyEntity(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
160  friend void importAcDbRadialDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
161  friend void importAcDbRasterImage(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
162  friend void importAcDbRay(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
163  friend void importAcDbRegion(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
164  friend void importAcDbRotatedDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
165  friend void importAcDbSequenceEnd(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
166  friend void importAcDbShape(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
167  friend void importAcDbSolid(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
168  friend void importAcDbSpline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
169  friend void importAcDbTable(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
170  friend void importAcDbText(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
171  friend void importAcDbTrace(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
172  friend void importAcDbVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
173  friend void importAcDbViewport(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
174  friend void importAcDbWipeout(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
175  friend void importAcDbXline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
176  friend void importAcDbZombieEntity(MrDwgReader * mrDwgReader, AcDbEntity *pEnt);
177 
178 
179  virtual void importAcDb2LineAngularDimension(AcDbEntity *pEnt);
180  virtual void importAcDb2dVertex(AcDbEntity *pEnt);
181  virtual void importAcDb3PointAngularDimension(AcDbEntity *pEnt);
182  virtual void importAcDb2dPolyline(AcDbEntity *pEnt);
183  virtual void importAcDb3dPolyline(AcDbEntity *pEnt);
184  virtual void importAcDb3dPolylineVertex(AcDbEntity *pEnt);
185  virtual void importAcDb3dSolid(AcDbEntity *pEnt);
186  virtual void importAcDbAlignedDimension(AcDbEntity *pEnt);
187  virtual void importAcDbArc(AcDbEntity *pEnt);
188  virtual void importAcDbAttribute(AcDbEntity *pEnt);
189  virtual void importAcDbAttributeDefinition(AcDbEntity *pEnt);
190  virtual void importAcDbBlockBegin(AcDbEntity *pEnt);
191  virtual void importAcDbBlockEnd(AcDbEntity *pEnt);
192  virtual void importAcDbBlockReference(AcDbEntity *pEnt);
193  virtual void importAcDbBody(AcDbEntity *pEnt);
194  virtual void importAcDbCircle(AcDbEntity *pEnt);
195  virtual void importAcDbCurve(AcDbEntity *pEnt);
196  virtual void importAcDbDiametricDimension(AcDbEntity *pEnt);
197  virtual void importAcDbDimension(AcDbEntity *pEnt);
198  virtual void importAcDbEllipse(AcDbEntity *pEnt);
199  virtual void importAcDbFace(AcDbEntity *pEnt);
200  virtual void importAcDbFaceRecord(AcDbEntity *pEnt);
201  virtual void importAcDbFcf(AcDbEntity *pEnt);
202  virtual void importAcDbFrame(AcDbEntity *pEnt);
203  virtual void importAcDbHatch(AcDbEntity *pEnt);
204  virtual void importAcDbLeader(AcDbEntity *pEnt);
205  virtual void importAcDbLine(AcDbEntity *pEnt);
206  virtual void importAcDbMInsertBlock(AcDbEntity *pEnt);
207  virtual void importAcDbMText(AcDbEntity *pEnt);
208 #ifdef MTEXT_EXPLODE_FRAGMENTS
209  virtual void importAcDbMTextFragment(AcDbMTextFragment* pAcDbMTextFragment, AcDbEntity* pEnt);
210 #endif
211  virtual void importAcDbMline(AcDbEntity *pEnt);
212  virtual void importAcDbOle2Frame(AcDbEntity *pEnt);
213  virtual void importAcDbOleFrame(AcDbEntity *pEnt);
214  virtual void importAcDbOrdinateDimension(AcDbEntity *pEnt);
215  virtual void importAcDbPoint(AcDbEntity *pEnt);
216  virtual void importAcDbPolyFaceMesh(AcDbEntity *pEnt);
217  virtual void importAcDbPolyFaceMeshVertex(AcDbEntity *pEnt);
218  virtual void importAcDbPolygonMesh(AcDbEntity *pEnt);
219  virtual void importAcDbPolygonMeshVertex(AcDbEntity *pEnt);
220  virtual void importAcDbPolyline(AcDbEntity *pEnt);
221  virtual void importAcDbProxyEntity(AcDbEntity *pEnt);
222  virtual void importAcDbRadialDimension(AcDbEntity *pEnt);
223  virtual void importAcDbRasterImage(AcDbEntity *pEnt);
224  virtual void importAcDbRay(AcDbEntity *pEnt);
225  virtual void importAcDbRegion(AcDbEntity *pEnt);
226  virtual void importAcDbRotatedDimension(AcDbEntity *pEnt);
227  virtual void importAcDbSequenceEnd(AcDbEntity *pEnt);
228  virtual void importAcDbShape(AcDbEntity *pEnt);
229  virtual void importAcDbSolid(AcDbEntity *pEnt);
230  virtual void importAcDbSpline(AcDbEntity *pEnt);
231  virtual void importAcDbTable(AcDbEntity *pEnt);
232  virtual void importAcDbText(AcDbEntity *pEnt);
233  virtual void importAcDbTrace(AcDbEntity *pEnt);
234  virtual void importAcDbVertex(AcDbEntity *pEnt);
235  virtual void importAcDbViewport(AcDbEntity *pEnt);
236  virtual void importAcDbWipeout(AcDbEntity *pEnt);
237  virtual void importAcDbXline(AcDbEntity *pEnt);
238  virtual void importAcDbZombieEntity(AcDbEntity *pEnt);
239 
240  virtual void linkDimension(AcDbDimension * pDim);
241 
242  virtual void DrawEntity(AcDbEntity *pEnt, AcGiRegenType regenType);
243 
244  virtual HC_KEY GetBlockTableRecordSegKey(AcDbBlockTableRecord *pRecord);
245  virtual HC_KEY GetAttrStateSegKey(AcDbEntity *pEnt, bool is_zombie_entity = false);
246  virtual HC_KEY GetLayoutSegKey(ACHAR *layoutName);
247  virtual HC_KEY GetLayerSegKey(ACHAR *layoutName);
248 
249  virtual void importXdata(AcDbEntity *pEnt);
250  virtual bool importEntity(AcDbEntity *pEnt);
251  void importEntityFromHandle(AcDbHandle handle);
252  virtual void importBlockTable(AcDbBlockTable *pBlockTable);
253  virtual void importViewportTable(AcDbViewportTable *pViewportTable);
254 
255  virtual void importLayerTable(AcDbLayerTable *pLayerTable);
256  virtual bool applyEntityLinetype(AcDbEntity *pEnt);
257  virtual bool importLinetypeAndApply(AcDbLinetypeTableRecord *pLinetypeRecord, double scale);
258 
260  {
261  double offset;
262  AcCmColor color;
263  AcDbObjectId linetypeId;
264  };
265 
266  typedef std::vector<mLineStyleDefComponent> mLineStyleDef;
267  std::map<AcDbHandle, mLineStyleDef> m_MlineStyles;
268 
269  virtual void importMlineStyleDictionary(AcDbDictionary *pDictionary);
270 
271  bool m_skip_unreferenced_blocks;
272 };
Definition: MrDwgReader.h:259
#define HC_KEY
Definition: MrDwgReader.h:35
Definition: MrDwgReader.h:88
Definition: MrDwgReader.h:78
Definition: misc.h:29