重构: AecXData 类型标签改用枚举 AecXData::EType
- 在 AecXData 内新增 enum EType,取值直接采用 wtypes.h 的 VARENUM(VT_*), 与原实现逐位一致(nVt 会序列化进 DWG/DXF/XData,数值必须保持不变)。 - 各模块共 303 处 nVt 判断由裸 VT_* 改为 AecXData::kTypeXxx,涉及 18 个文件; 仅调试打印用的字符串字面量保持原样。 - AecDbObjXDataMap.h 增加 #include <wtypes.h>(EType 引用 VT_*)。
This commit is contained in:
1 parent
9d9077a03e
commit
0467086e65
18 files changed
+602
-723
No files matched your search
@@ -7,6 +7,7 @@
|
||||
#include <map>
|
||||
#include "dbfiler.h"
|
||||
#include "shJson.h"
|
||||
#include <wtypes.h> // VARENUM / VT_* ,供 AecXData::EType 使用
|
||||
|
||||
#ifdef AECRXBASE_EXPORT
|
||||
#define AECDLLIMPEXP __declspec(dllexport)
|
||||
@@ -37,19 +38,25 @@ typedef std::vector<SH_BIM_REC> SH_BIM_BLOCK;
|
||||
|
||||
typedef struct AecXData
|
||||
{
|
||||
/*
|
||||
VT_I4 : int
|
||||
VT_BSTR : psz
|
||||
VT_R8 : double
|
||||
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
|
||||
VT_BYREF | VT_R8 + 5 : binary data
|
||||
// 数据类型标签(nVt)。直接用 wtypes.h 的 VARENUM(VT_*) 组合来表达,直观且与
|
||||
// 原实现逐位一致;nVt 会写入 DWG/DXF/XData,改数值会破坏旧图兼容,务必保持不变。
|
||||
enum EType
|
||||
{
|
||||
kTypeShort = VT_I2, // short
|
||||
kTypeInt = VT_I4, // int
|
||||
kTypeDouble = VT_R8, // double
|
||||
kTypeString = VT_BSTR, // TCHAR* 字符串
|
||||
kTypeSoftId = VT_UI4, // AcDbObjectId 软指针
|
||||
kTypeInt64 = VT_I8, // 历史遗留(仅读)
|
||||
kTypeHardId = VT_UI8, // AcDbObjectId 硬指针
|
||||
kTypePoint = (VT_BYREF | VT_R8), // 点,不随实体变换
|
||||
kTypePointWorld = (VT_BYREF | VT_R8) + 1, // 点,随实体变换
|
||||
kTypeVector = (VT_BYREF | VT_R8) + 2, // 向量,不随实体变换
|
||||
kTypeVectorWorld = (VT_BYREF | VT_R8) + 3, // 向量,随实体变换
|
||||
kTypeMatrix = (VT_BYREF | VT_R8) + 4, // 矩阵(16个double串)
|
||||
kTypeBinary = (VT_BYREF | VT_R8) + 5, // 二进制块
|
||||
};
|
||||
|
||||
*/
|
||||
int nVt;
|
||||
LONG_PTR npszLen; //对应字符数据长度
|
||||
|
||||
@@ -61,10 +68,58 @@ typedef struct AecXData
|
||||
TCHAR* pszVal; // 字符数据
|
||||
void* pData; // binary data
|
||||
};
|
||||
|
||||
// 1. 默认构造函数,替代原有代码中散落的 memset(&xdata, 0, sizeof(xdata));
|
||||
// 注意:struct AecXData 未 dllexport,这两个函数必须 inline 在头文件里,
|
||||
// 否则其它模块(CoreLibrary / 各 Cmd)构造 AecXData 时会链接不到。
|
||||
AecXData()
|
||||
{
|
||||
nVt = 0;
|
||||
npszLen = 0;
|
||||
nVal = 0; // 清零 union,防止野指针
|
||||
}
|
||||
|
||||
// 2. 核心清理函数
|
||||
void Free()
|
||||
{
|
||||
// 字符串和矩阵类型(两者都用 pszVal 保存)
|
||||
if (nVt == kTypeString || nVt == kTypeMatrix)
|
||||
{
|
||||
if (pszVal != NULL && npszLen > 0)
|
||||
{
|
||||
delete[] pszVal;
|
||||
pszVal = NULL;
|
||||
}
|
||||
}
|
||||
// 二进制数据块类型
|
||||
else if (nVt == kTypeBinary)
|
||||
{
|
||||
if (pData != NULL && npszLen > 0)
|
||||
{
|
||||
// 必须强制转换 void* 为 byte* 才能触发 C++ 正确的数组析构逻辑
|
||||
delete[] (byte*)pData;
|
||||
pData = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// 重置状态
|
||||
npszLen = 0;
|
||||
nVt = 0;
|
||||
nVal = 0;
|
||||
}
|
||||
|
||||
|
||||
// 3. 深拷贝:先释放自身已持有的资源,再从 src 深拷贝。
|
||||
// 字符串/矩阵/二进制会重新分配内存,不与 src 共享缓冲;
|
||||
// 支持类型变化(nVt 不同也照常覆盖)。this == &src 时直接返回。
|
||||
bool CopyFrom(const AecXData &src);
|
||||
|
||||
}AECXDATA;
|
||||
|
||||
class AECDLLIMPEXP AecDbObjXDataMap
|
||||
{
|
||||
private:
|
||||
static const int g_nVersion;
|
||||
|
||||
public:
|
||||
AecDbObjXDataMap();
|
||||
@@ -72,12 +127,12 @@ public:
|
||||
virtual ~AecDbObjXDataMap();
|
||||
|
||||
public:
|
||||
BOOL SetAt(LPCTSTR pszKey,int nVal);
|
||||
BOOL SetAt(LPCTSTR pszKey, DWORD dw);
|
||||
BOOL SetAt(LPCTSTR pszKey, const int &nVal);
|
||||
BOOL SetAt(LPCTSTR pszKey, const DWORD &dw);
|
||||
|
||||
BOOL SetAt(LPCTSTR pszKey, Adesk::Int16 nVal);
|
||||
BOOL SetAt(LPCTSTR pszKey, const Adesk::Int16 &nVal);
|
||||
|
||||
BOOL SetAt(LPCTSTR pszKey,double dVal);
|
||||
BOOL SetAt(LPCTSTR pszKey, const double &dVal);
|
||||
|
||||
BOOL SetAt(LPCTSTR pszKey,const AcGeDoubleArray& arVal);
|
||||
BOOL SetAt(LPCTSTR pszKey,const AcGeVector3d& vt,BOOL bTransformBy = FALSE);
|
||||
@@ -242,8 +297,10 @@ private:
|
||||
|
||||
void SecondAsKey(CString& sTemp,AecXData& xData);
|
||||
|
||||
|
||||
private:
|
||||
mutable SHJson::WValue m_json;//临时,不序列化
|
||||
std::map<CString,AecXData> m_xData;//序列化
|
||||
|
||||
};
|
||||
#endif //_AecDbObjXDataMap_H__
|
||||
Reference in new issue
Block a user