Alphabetical Class Index  Class Hierarchy   File Members   Compound Members   File List  

MrDwgReader.h
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();
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 };