#ifndef _TDBXDATAMAP_H__ #define _TDBXDATAMAP_H__ #if _MSC_VER > 1000 #pragma once #endif #include #include "dbfiler.h" typedef struct TXData { int nVt; //VT_I4,VT_BSTR,VT_R8,VT_BYREF | VT_R8,VT_BYREF | VT_R8 + 1 pt //VT_BYREF | VT_R8 + 2,VT_BYREF | VT_R8 + 3 vect //VT_UI4 : id VT_BYREF | VT_R8 + 4 : matrix3d LONG_PTR npszLen; //对应字符数据长度 union { LONG_PTR nVal; // 整型数据 double dVal[3]; // 浮点数据 TCHAR* pszVal; // 字符数据 }; }TXData; class GEOAPI TDbXDataMap { public: TDbXDataMap(); TDbXDataMap(const TDbXDataMap& datamap); virtual ~TDbXDataMap(); public: BOOL SetAt(LPCTSTR pszKey,int nVal); BOOL SetAt(LPCTSTR pszKey,double dVal); BOOL SetAt(LPCTSTR pszKey,const AcGeDoubleArray& arVal); BOOL SetAt(LPCTSTR pszKey,const AcGeVector3d& vt,BOOL bTransformBy = FALSE); BOOL SetAt(LPCTSTR pszKey,const AcGePoint3d& ptGe,BOOL bTransformBy = FALSE); BOOL SetAt(LPCTSTR pszKey,const AcGePoint3dArray& arPt,BOOL bTransformBy = FALSE); BOOL SetAt(LPCTSTR pszKey,LPCTSTR pszValue); BOOL SetAt(LPCTSTR pszKey,const AcDbObjectId& id,BOOL bIsSoft = TRUE); BOOL SetAt(LPCTSTR pszKey,const AcGeMatrix3d& xform); BOOL GetAt(LPCTSTR pszKey,int& nVal) const; BOOL GetAt(LPCTSTR pszKey,double& dVal) const; BOOL GetAt(LPCTSTR pszKey,AcGeDoubleArray& arVal) const; BOOL GetAt(LPCTSTR pszKey,AcGeVector3d& vt) const; BOOL GetAt(LPCTSTR pszKey,AcGePoint3d& ptGe) const; BOOL GetAt(LPCTSTR pszKey,AcGePoint3dArray& arPt) const; BOOL GetAt(LPCTSTR pszKey,AcGeMatrix3d& xform) const; BOOL GetAt(LPCTSTR pszKey,CString &sValue) const; BOOL GetAt(LPCTSTR pszKey,AcDbObjectId& id) const; BOOL SetAt(LPCTSTR pszKey,int iIndex,LPCTSTR pszValue); BOOL GetAt(LPCTSTR pszKey,int iIndex,CString &sValue); BOOL SetAt(LPCTSTR pszKey,int iIndex,const TDbXDataMap& xDataMap); BOOL GetAt(LPCTSTR pszKey,int iIndex,TDbXDataMap& xDataMap); BOOL SetAt(LPCTSTR pszKey,const TXData& XData); BOOL GetAt(LPCTSTR pszKey,TXData& XData); BOOL HasKey(LPCTSTR pszKey,int& nVt); void Empty(); BOOL RemoveAt(LPCTSTR pszKey); BOOL RemoveAt(LPCTSTR pszKey,int nIndex); //支持扩展数据的4个方法 bXRecord = fase 操作扩展数据 bXRecord = true 操作扩展词典 BOOL Write(AcDbObject* pEnt,LPCTSTR pszApp,BOOL bXRecord = FALSE); BOOL Write(const AcDbObjectId& id,LPCTSTR pszApp,BOOL bXRecord = FALSE); BOOL Read(AcDbObject* pEnt,LPCTSTR pszApp,BOOL bXRecord = FALSE); BOOL Read(const AcDbObjectId& id,LPCTSTR pszApp,BOOL bXRecord = FALSE); TDbXDataMap& operator = (const TDbXDataMap& srcMap); BOOL CopyFrom(const TDbXDataMap* pSrc); virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* pFiler) const; virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler* pFiler); virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const; virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler); typedef std::map::iterator It; typedef std::map::const_iterator ItC; It Begin(); ItC Begin() const; BOOL GetNext(It& it,TXData& xData); BOOL GetNext(ItC& it,TXData& xData) const; It End(); ItC End() const; // 增加 clone 的 xdatamap 的关系复制维护lfy 2011-12-6 void BeginCloneXlation(TDbXDataMap* pMapClone,AcDbIdMapping& idMap) const; public: BOOL XDMap2Resbuf(LPCTSTR pszApp,struct resbuf*& pRb,BOOL bXRecord = FALSE); BOOL Resbuf2XDMap(struct resbuf* pRb,BOOL bXRecord = FALSE,AcDbDatabase* pDb = NULL); private: BOOL ParseToRecords(CString& sText,CStringArray& arRecords); BOOL ExtractRecord(CString& sRecord,CString& sKey,CString& sType,CString& sInfo); BOOL StringToAcGePoint3d(CString& sText,AcGePoint3d& ptGe); BOOL StringToAcGeVector3d(CString& sText,AcGeVector3d& ptGe); private: std::map m_xData; }; #endif //X_TDBXDATAMAP_H__