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