00001 // Copyright (c) 1998-2014 by Tech Soft 3D, Inc. 00002 // 00003 // The information contained herein is confidential and proprietary to Tech Soft 3D, Inc., 00004 // and considered a trade secret as defined under civil and criminal statutes. 00005 // Tech Soft 3D, Inc. shall pursue its civil and criminal remedies in the event of 00006 // unauthorized use or misappropriation of its trade secrets. Use of this information 00007 // by anyone other than authorized employees of Tech Soft 3D, Inc. is granted only under 00008 // a written non-disclosure agreement, expressly prescribing the scope and manner of such use. 00009 00010 #pragma once 00011 00012 #pragma warning (disable: 4996) // standard string functions considered unsafe 00013 00014 #include "MrDwgWorldDraw.h" 00015 #include "MrDwgViewportDraw.h" 00016 #include "misc.h" 00017 00018 #include <hc.h> 00019 00020 #include <map> 00021 #include <set> 00022 #include <sstream> 00023 00024 #include <dbmain.h> 00025 #include <dbsymtb.h> 00026 #include <dbdim.h> 00027 00028 #define MTEXT_EXPLODE_FRAGMENTS 1 00029 00030 #ifdef MTEXT_EXPLODE_FRAGMENTS 00031 struct AcDbMTextFragment; 00032 #endif 00033 00034 class MrDwgReader 00035 { 00036 public: 00037 MrDwgReader(bool skip_unreferenced_blocks); 00038 ~MrDwgReader(); 00039 00040 virtual void importDatabase(AcDbDatabase *pDatabase); 00041 00042 /* Map used to convert non-latin font names */ 00043 std::map<std::wstring, std::string> m_fontmap; 00044 /* Segment in which the current entity will be inserted (up to importEntity level) */ 00045 HC_KEY entityInsertionSegment; 00046 /* Information about multi line text which needs to be restyled before being broken into fragments */ 00047 mTextData m_multiline_text_info; 00048 protected: 00049 /* m_blockCount is used to track progress */ 00050 int m_blockCount; 00051 int m_3dSolids; 00052 00053 /* m_xrefList includes the root model filename and is used 00054 * to compute an overall hash for the DWG model. The hash 00055 * is used to load cached HSF files. */ 00056 std::set<std::wstring> m_xrefList; 00057 00058 /* These two maps are for resolving block references. A block 00059 * may be referenced before it's loaded. While we handle block 00060 * references, just save the key to the current segment and the 00061 * ID to the referenced block. After loading the whole block 00062 * table, resolve these references then. */ 00063 std::map<AcDbHandle, HC_KEY> m_recordKeyMap; 00064 std::multimap<HC_KEY, AcDbHandle> m_referenceKeyMap; 00065 00066 /* The autocad model needs to me included under each of these segments. */ 00067 std::vector<HC_KEY> m_clips; 00068 00069 HC_KEY m_modelKey; 00070 HC_KEY m_modelRoot; 00071 00072 /* This, m_layerKeyMap, is just simpler (for now). It's associates the layerID's with 00073 * the layer segment's key. This is used for entities which are colored by layer. */ 00074 std::map<AcDbHandle, HC_KEY> m_layerKeyMap; 00075 00076 /* m_viewportMap is used to associate a layer ID with all of its viewports*/ 00077 struct viewportData 00078 { 00079 HC_KEY viewportSegmentKey; // Key to the segment where the viewport will be inserted 00080 bool isMatrixID; // True if the viewport's modelling matrix is I 00081 }; 00082 std::map<AcDbHandle, std::vector<viewportData> > m_viewportMap; 00083 00084 std::stringstream m_main_color_map; //main color map 00085 00086 /* dimensionData and m_dimensions are used to regenerate missing dimensions at runtime */ 00087 struct dimensionData 00088 { 00089 dimensionData(HC_KEY dKey, HC_KEY sKey, AcDbHandle h, AcDbBlockTableRecord * btr) 00090 { 00091 destinationKey = dKey; 00092 sourceKey = sKey; 00093 dimensionHandle = h; 00094 dimensionBTR = btr; 00095 } 00096 00097 HC_KEY destinationKey; // key to the segment where the dimension will be inserted 00098 HC_KEY sourceKey; // key to the segment containing the recomputed dimension BTR 00099 AcDbHandle dimensionHandle; // handle of the dimension object 00100 AcDbBlockTableRecord * dimensionBTR; // recomputed dimension BTR 00101 }; 00102 std::vector<dimensionData> m_dimensions; 00103 void importOneBlockTableRecord(dimensionData * dimensions); 00104 void recomputeAndImportDimensions(std::vector<dimensionData> * dimensionVector); 00105 void restyleAndImportMText(mTextData * mtext_info); 00106 void populate_fontmap(); 00107 00108 /* importUnknownEntity is used to import entities that are not on the entity list, 00109 * such as object enablers. In order for object enablers to be imported successfully 00110 * all required DLLs and DBX files need to be in the bin directory */ 00111 void importUnknownEntity(AcDbEntity * pEnt); 00112 00113 virtual void progress(double percentComplete) const; 00114 virtual void importDwfInfo(AcDbDatabase *pDatabase); 00115 00116 friend void importAcDb2LineAngularDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00117 friend void importAcDb2dVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00118 friend void importAcDb3PointAngularDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00119 friend void importAcDb2dPolyline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00120 friend void importAcDb3dPolyline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00121 friend void importAcDb3dPolylineVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00122 friend void importAcDb3dSolid(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00123 friend void importAcDbAlignedDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00124 friend void importAcDbArc(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00125 friend void importAcDbAttribute(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00126 friend void importAcDbAttributeDefinition(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00127 friend void importAcDbBlockBegin(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00128 friend void importAcDbBlockEnd(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00129 friend void importAcDbBlockReference(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00130 friend void importAcDbBody(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00131 friend void importAcDbCircle(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00132 friend void importAcDbCurve(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00133 friend void importAcDbDiametricDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00134 friend void importAcDbDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00135 friend void importAcDbEllipse(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00136 friend void importAcDbFace(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00137 friend void importAcDbFaceRecord(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00138 friend void importAcDbFcf(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00139 friend void importAcDbFrame(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00140 friend void importAcDbHatch(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00141 friend void importAcDbLeader(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00142 friend void importAcDbLine(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00143 friend void importAcDbMInsertBlock(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00144 friend void importAcDbMText(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00145 #ifdef MTEXT_EXPLODE_FRAGMENTS 00146 friend static int callback_AcDbMTextFragments(AcDbMTextFragment *frag, void *param); 00147 #endif 00148 friend void importAcDbMline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00149 friend void importAcDbOle2Frame(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00150 friend void importAcDbOleFrame(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00151 friend void importAcDbOrdinateDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00152 friend void importAcDbPoint(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00153 friend void importAcDbPolyFaceMesh(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00154 friend void importAcDbPolyFaceMeshVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00155 friend void importAcDbPolygonMesh(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00156 friend void importAcDbPolygonMeshVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00157 friend void importAcDbPolyline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00158 friend void importAcDbProxyEntity(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00159 friend void importAcDbRadialDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00160 friend void importAcDbRasterImage(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00161 friend void importAcDbRay(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00162 friend void importAcDbRegion(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00163 friend void importAcDbRotatedDimension(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00164 friend void importAcDbSequenceEnd(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00165 friend void importAcDbShape(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00166 friend void importAcDbSolid(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00167 friend void importAcDbSpline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00168 friend void importAcDbTable(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00169 friend void importAcDbText(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00170 friend void importAcDbTrace(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00171 friend void importAcDbVertex(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00172 friend void importAcDbViewport(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00173 friend void importAcDbWipeout(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00174 friend void importAcDbXline(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00175 friend void importAcDbZombieEntity(MrDwgReader * mrDwgReader, AcDbEntity *pEnt); 00176 00177 00178 virtual void importAcDb2LineAngularDimension(AcDbEntity *pEnt); 00179 virtual void importAcDb2dVertex(AcDbEntity *pEnt); 00180 virtual void importAcDb3PointAngularDimension(AcDbEntity *pEnt); 00181 virtual void importAcDb2dPolyline(AcDbEntity *pEnt); 00182 virtual void importAcDb3dPolyline(AcDbEntity *pEnt); 00183 virtual void importAcDb3dPolylineVertex(AcDbEntity *pEnt); 00184 virtual void importAcDb3dSolid(AcDbEntity *pEnt); 00185 virtual void importAcDbAlignedDimension(AcDbEntity *pEnt); 00186 virtual void importAcDbArc(AcDbEntity *pEnt); 00187 virtual void importAcDbAttribute(AcDbEntity *pEnt); 00188 virtual void importAcDbAttributeDefinition(AcDbEntity *pEnt); 00189 virtual void importAcDbBlockBegin(AcDbEntity *pEnt); 00190 virtual void importAcDbBlockEnd(AcDbEntity *pEnt); 00191 virtual void importAcDbBlockReference(AcDbEntity *pEnt); 00192 virtual void importAcDbBody(AcDbEntity *pEnt); 00193 virtual void importAcDbCircle(AcDbEntity *pEnt); 00194 virtual void importAcDbCurve(AcDbEntity *pEnt); 00195 virtual void importAcDbDiametricDimension(AcDbEntity *pEnt); 00196 virtual void importAcDbDimension(AcDbEntity *pEnt); 00197 virtual void importAcDbEllipse(AcDbEntity *pEnt); 00198 virtual void importAcDbFace(AcDbEntity *pEnt); 00199 virtual void importAcDbFaceRecord(AcDbEntity *pEnt); 00200 virtual void importAcDbFcf(AcDbEntity *pEnt); 00201 virtual void importAcDbFrame(AcDbEntity *pEnt); 00202 virtual void importAcDbHatch(AcDbEntity *pEnt); 00203 virtual void importAcDbLeader(AcDbEntity *pEnt); 00204 virtual void importAcDbLine(AcDbEntity *pEnt); 00205 virtual void importAcDbMInsertBlock(AcDbEntity *pEnt); 00206 virtual void importAcDbMText(AcDbEntity *pEnt); 00207 #ifdef MTEXT_EXPLODE_FRAGMENTS 00208 virtual void importAcDbMTextFragment(AcDbMTextFragment* pAcDbMTextFragment, AcDbEntity* pEnt); 00209 #endif 00210 virtual void importAcDbMline(AcDbEntity *pEnt); 00211 virtual void importAcDbOle2Frame(AcDbEntity *pEnt); 00212 virtual void importAcDbOleFrame(AcDbEntity *pEnt); 00213 virtual void importAcDbOrdinateDimension(AcDbEntity *pEnt); 00214 virtual void importAcDbPoint(AcDbEntity *pEnt); 00215 virtual void importAcDbPolyFaceMesh(AcDbEntity *pEnt); 00216 virtual void importAcDbPolyFaceMeshVertex(AcDbEntity *pEnt); 00217 virtual void importAcDbPolygonMesh(AcDbEntity *pEnt); 00218 virtual void importAcDbPolygonMeshVertex(AcDbEntity *pEnt); 00219 virtual void importAcDbPolyline(AcDbEntity *pEnt); 00220 virtual void importAcDbProxyEntity(AcDbEntity *pEnt); 00221 virtual void importAcDbRadialDimension(AcDbEntity *pEnt); 00222 virtual void importAcDbRasterImage(AcDbEntity *pEnt); 00223 virtual void importAcDbRay(AcDbEntity *pEnt); 00224 virtual void importAcDbRegion(AcDbEntity *pEnt); 00225 virtual void importAcDbRotatedDimension(AcDbEntity *pEnt); 00226 virtual void importAcDbSequenceEnd(AcDbEntity *pEnt); 00227 virtual void importAcDbShape(AcDbEntity *pEnt); 00228 virtual void importAcDbSolid(AcDbEntity *pEnt); 00229 virtual void importAcDbSpline(AcDbEntity *pEnt); 00230 virtual void importAcDbTable(AcDbEntity *pEnt); 00231 virtual void importAcDbText(AcDbEntity *pEnt); 00232 virtual void importAcDbTrace(AcDbEntity *pEnt); 00233 virtual void importAcDbVertex(AcDbEntity *pEnt); 00234 virtual void importAcDbViewport(AcDbEntity *pEnt); 00235 virtual void importAcDbWipeout(AcDbEntity *pEnt); 00236 virtual void importAcDbXline(AcDbEntity *pEnt); 00237 virtual void importAcDbZombieEntity(AcDbEntity *pEnt); 00238 00239 virtual void linkDimension(AcDbDimension * pDim); 00240 00241 virtual void DrawEntity(AcDbEntity *pEnt, AcGiRegenType regenType); 00242 00243 virtual HC_KEY GetBlockTableRecordSegKey(AcDbBlockTableRecord *pRecord); 00244 virtual HC_KEY GetAttrStateSegKey(AcDbEntity *pEnt); 00245 virtual HC_KEY GetLayoutSegKey(ACHAR *layoutName); 00246 virtual HC_KEY GetLayerSegKey(ACHAR *layoutName); 00247 00248 virtual void importXdata(AcDbEntity *pEnt); 00249 virtual bool importEntity(AcDbEntity *pEnt); 00250 void importEntityFromHandle(AcDbHandle handle); 00251 virtual void importBlockTable(AcDbBlockTable *pBlockTable); 00252 virtual void importViewportTable(AcDbViewportTable *pViewportTable); 00253 00254 virtual void importLayerTable(AcDbLayerTable *pLayerTable); 00255 virtual bool applyEntityLinetype(AcDbEntity *pEnt); 00256 virtual bool importLinetypeAndApply(AcDbLinetypeTableRecord *pLinetypeRecord, double scale); 00257 00258 struct mLineStyleDefComponent 00259 { 00260 double offset; 00261 AcCmColor color; 00262 AcDbObjectId linetypeId; 00263 }; 00264 00265 typedef std::vector<mLineStyleDefComponent> mLineStyleDef; 00266 std::map<AcDbHandle, mLineStyleDef> m_MlineStyles; 00267 00268 virtual void importMlineStyleDictionary(AcDbDictionary *pDictionary); 00269 00270 bool m_skip_unreferenced_blocks; 00271 };