重构: 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:
company-desktop-computer committed 2026-10-13 09:55:42 +08:00
1 parent 9d9077a03e
commit 0467086e65
18 files changed
+602 -723

No files matched your search

@@ -800,7 +800,7 @@ Acad::ErrorStatus AecDbCurveBase::subDeepClone( AcDbObject* pOwner,
for (; it != end; )
{
if (!pXDataMap->GetNext(it, sKey, cVal)) break;
if (cVal.nVt == VT_UI4 || cVal.nVt == VT_UI8)//soft,hard
if (cVal.nVt == AecXData::kTypeSoftId || cVal.nVt == AecXData::kTypeHardId)//soft,hard
{
idSrc.setFromOldId(cVal.nVal);
@@ -820,7 +820,7 @@ Acad::ErrorStatus AecDbCurveBase::subDeepClone( AcDbObject* pOwner,
if (pXDataMapCloned != NULL)
{
pXDataMapCloned->RemoveAt(sKey);
pXDataMapCloned->SetAt(sKey,idPair2.value(),cVal.nVt == VT_UI4 ? TRUE : FALSE);
pXDataMapCloned->SetAt(sKey,idPair2.value(),cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE);
}
continue;
}
@@ -880,7 +880,7 @@ Acad::ErrorStatus AecDbCurveBase::subDeepClone( AcDbObject* pOwner,
if (idCloned.isValid())
{
pXDataMapCloned->RemoveAt(sKey);
pXDataMapCloned->SetAt(sKey, idCloned, cVal.nVt == VT_UI4 ? TRUE : FALSE);
pXDataMapCloned->SetAt(sKey, idCloned, cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE);
}
else
{
@@ -888,7 +888,7 @@ Acad::ErrorStatus AecDbCurveBase::subDeepClone( AcDbObject* pOwner,
}
}
}
else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
{
arHandKeys.Add(sKey);
}
@@ -1253,7 +1253,7 @@ Acad::ErrorStatus AecDbCurveBase::subWblockClone(AcRxObject* pOwner,
for (; it != end;)
{
if (!pXDataMap->GetNext(it, sKey, cVal)) break;
if (cVal.nVt == VT_UI4 || cVal.nVt == VT_UI8)//soft,hard
if (cVal.nVt == AecXData::kTypeSoftId || cVal.nVt == AecXData::kTypeHardId)//soft,hard
{
idSrc.setFromOldId(cVal.nVal);
@@ -1272,7 +1272,7 @@ Acad::ErrorStatus AecDbCurveBase::subWblockClone(AcRxObject* pOwner,
{
if (pXDataMapCloned != NULL)
{
pXDataMapCloned->SetAt(sKey,idPair2.value(),cVal.nVt == VT_UI4 ? TRUE : FALSE);
pXDataMapCloned->SetAt(sKey,idPair2.value(),cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE);
}
continue;
}
@@ -1321,10 +1321,10 @@ Acad::ErrorStatus AecDbCurveBase::subWblockClone(AcRxObject* pOwner,
if (pXDataMapCloned != NULL)
{
pXDataMapCloned->RemoveAt(sKey);
pXDataMapCloned->SetAt(sKey,idCloned,cVal.nVt == VT_UI4 ? TRUE : FALSE);
pXDataMapCloned->SetAt(sKey,idCloned,cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE);
}
}
else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
{
arHandKeys.Add(sKey);
}
@@ -752,7 +752,7 @@ Acad::ErrorStatus AecDbEntityBase::subDeepClone( AcDbObject* pOwner,
for (; it != end; )
{
if (!pXDataMap->GetNext(it, sKey, cVal)) break;
if (cVal.nVt == VT_UI4 || cVal.nVt == VT_UI8)//soft,hard
if (cVal.nVt == AecXData::kTypeSoftId || cVal.nVt == AecXData::kTypeHardId)//soft,hard
{
idSrc.setFromOldId(cVal.nVal);
@@ -772,7 +772,7 @@ Acad::ErrorStatus AecDbEntityBase::subDeepClone( AcDbObject* pOwner,
if (pXDataMapCloned != NULL)
{
pXDataMapCloned->RemoveAt(sKey);
pXDataMapCloned->SetAt(sKey, idPair2.value(), cVal.nVt == VT_UI4 ? TRUE : FALSE);
pXDataMapCloned->SetAt(sKey, idPair2.value(), cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE);
}
continue;
}
@@ -832,7 +832,7 @@ Acad::ErrorStatus AecDbEntityBase::subDeepClone( AcDbObject* pOwner,
if (idCloned.isValid())
{
pXDataMapCloned->RemoveAt(sKey);
pXDataMapCloned->SetAt(sKey, idCloned, cVal.nVt == VT_UI4 ? TRUE : FALSE);
pXDataMapCloned->SetAt(sKey, idCloned, cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE);
}
else
{
@@ -840,7 +840,7 @@ Acad::ErrorStatus AecDbEntityBase::subDeepClone( AcDbObject* pOwner,
}
}
}
else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
{
arHandKeys.Add(sKey);
}
@@ -1207,7 +1207,7 @@ Acad::ErrorStatus AecDbEntityBase::subWblockClone(AcRxObject* pOwner,
for (; it != end;)
{
if (!pXDataMap->GetNext(it, sKey, cVal)) break;
if (cVal.nVt == VT_UI4 || cVal.nVt == VT_UI8)//soft,hard
if (cVal.nVt == AecXData::kTypeSoftId || cVal.nVt == AecXData::kTypeHardId)//soft,hard
{
idSrc.setFromOldId(cVal.nVal);
@@ -1226,7 +1226,7 @@ Acad::ErrorStatus AecDbEntityBase::subWblockClone(AcRxObject* pOwner,
{
if (pXDataMapCloned != NULL)
{
pXDataMapCloned->SetAt(sKey, idPair2.value(), cVal.nVt == VT_UI4 ? TRUE : FALSE);
pXDataMapCloned->SetAt(sKey, idPair2.value(), cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE);
}
continue;
}
@@ -1276,10 +1276,10 @@ Acad::ErrorStatus AecDbEntityBase::subWblockClone(AcRxObject* pOwner,
if (pXDataMapCloned != NULL)
{
pXDataMapCloned->RemoveAt(sKey);
pXDataMapCloned->SetAt(sKey, idCloned, cVal.nVt == VT_UI4 ? TRUE : FALSE);
pXDataMapCloned->SetAt(sKey, idCloned, cVal.nVt == AecXData::kTypeSoftId ? TRUE : FALSE);
}
}
else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
else if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
{
arHandKeys.Add(sKey);
}
File diff suppressed because it is too large. Load diff
+11 -11
View File
@@ -2668,11 +2668,11 @@ void CJSTZDlg::ShowToCompareList(LPCTSTR pszName,AecDbObjXDataMap& map1,AecDbObj
nVt = xdata1.nVt;
switch (nVt)
{
case VT_I4: // 整型
case AecXData::kTypeInt: // 整型
sVal1.Format(_T("%d"),(int)xdata1.nVal);
sVal2.Format(_T("%d"),(int)xdata2.nVal);
break;
case VT_UI4: //s id
case AecXData::kTypeSoftId: //s id
#ifndef _WIN64
sVal1.Format(_T("%ld"),xdata1.nVal);
sVal2.Format(_T("%ld"),xdata2.nVal);
@@ -2681,7 +2681,7 @@ void CJSTZDlg::ShowToCompareList(LPCTSTR pszName,AecDbObjXDataMap& map1,AecDbObj
sVal2.Format(_T("%d"),xdata2.nVal);
#endif
break;
case VT_UI8: //h id
case AecXData::kTypeHardId: //h id
#ifndef _WIN64
sVal1.Format(_T("%ld"),xdata1.nVal);
sVal2.Format(_T("%ld"),xdata2.nVal);
@@ -2690,33 +2690,33 @@ void CJSTZDlg::ShowToCompareList(LPCTSTR pszName,AecDbObjXDataMap& map1,AecDbObj
sVal2.Format(_T("%d"),xdata2.nVal);
#endif
break;
case VT_R8: // 浮点
case AecXData::kTypeDouble: // 浮点
sVal1.Format(_T("%.3f"),xdata1.dVal[0]);
sVal2.Format(_T("%.3f"),xdata2.dVal[0]);
break;
case (VT_BYREF | VT_R8): // 点
case AecXData::kTypePoint: // 点
sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]);
sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]);
break;
case (VT_BYREF | VT_R8 + 1): // cad变化点
case AecXData::kTypePointWorld: // cad变化点
sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]);
sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]);
break;
case (VT_BYREF | VT_R8 + 2): // 向量
case AecXData::kTypeVector: // 向量
sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]);
sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]);
break;
case (VT_BYREF | VT_R8 + 3): // 变化向量
case AecXData::kTypeVectorWorld: // 变化向量
sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]);
sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]);
break;
case (VT_BYREF | VT_R8 + 4): // 矩阵
case AecXData::kTypeMatrix: // 矩阵
sVal1.Format(_T("%s"),xdata1.pszVal);
sVal2.Format(_T("%s"),xdata2.pszVal);
break;
case (VT_BYREF | VT_R8 + 5): // binarydata
case AecXData::kTypeBinary: // binarydata
break;
case VT_BSTR: // 字符串
case AecXData::kTypeString: // 字符串
sVal1.Format(_T("%s"),xdata1.pszVal);
sVal2.Format(_T("%s"),xdata2.pszVal);
break;
+1 -1
View File
@@ -261,7 +261,7 @@ namespace
for (AecDbObjXDataMap::It it = pMap->Begin(); it != pMap->End(); ++it)
{
const AecXData &xd = it->second;
if (xd.nVt == VT_BSTR && xd.pszVal)
if (xd.nVt == AecXData::kTypeString && xd.pszVal)
{
CString s(xd.pszVal);
s.Trim();
@@ -937,12 +937,12 @@ BOOL AecDbAssembleWell::CalValue(const CString &sExp,double& dRes) const
break;
//替换
if (cVal.nVt == VT_I4)
if (cVal.nVt == AecXData::kTypeInt)
{
cal.SetVariableData(sKey, 1.0 * cVal.nVal);
}
if (cVal.nVt == VT_R8)
if (cVal.nVt == AecXData::kTypeDouble)
{
cal.SetVariableData(sKey, cVal.dVal[0]);
}
@@ -1756,7 +1756,7 @@ Acad::ErrorStatus AecDbEwPipe::TransformHole(const AcGeMatrix3d& xform)
for (; it != end;)
{
if (!m_mapSpecXData.GetNext(it, sKey, cVal)) break;
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
{
AcDbHandle handle(cVal.pszVal);
@@ -1661,7 +1661,7 @@ void AecDbEwPipeBase::GetAssocHandleObjs(AcDbObjectIdArray& arIds)
for (; it != end;)
{
if (!m_mapSpecXData.GetNext(it, sKey,cVal)) break;
if ( sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR )//可能的实体句柄
if ( sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString )//可能的实体句柄
{
AcDbHandle handle(cVal.pszVal);
@@ -1826,7 +1826,7 @@ Acad::ErrorStatus AecDbEwPipeBase::subTransformBy(const AcGeMatrix3d& xform)
for (; it != end;)
{
if (!m_mapSpecXData.GetNext(it, sKey, cVal)) break;
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
{
AcDbHandle handle(cVal.pszVal);
@@ -240,7 +240,7 @@ void HlrCutOption::ProcessHlrResult(const AcDbEntity *pE
std::vector<CString> strs;
for (AecDbObjXDataMap::It it = testData.Begin(); it != testData.End(); ++it)
{
if (it->second.nVt == (VT_BYREF | VT_R8 + 5))
if (it->second.nVt == AecXData::kTypeBinary)
strs.push_back(it->first);
}
for (size_t i(0); i < strs.size(); ++i)
@@ -875,12 +875,12 @@ BOOL AecDbPipeHanger::CLC(CString &sTxt)
for (; it != end; )
{
m_mapSpecXData.GetNext(it, sKey, xData);
if (xData.nVt == VT_UI4 ||
xData.nVt == VT_I4)
if (xData.nVt == AecXData::kTypeSoftId ||
xData.nVt == AecXData::kTypeInt)
{
cal.SetVariableData(sKey, 1.0 * xData.nVal);
}
else if (xData.nVt == VT_R8)
else if (xData.nVt == AecXData::kTypeDouble)
{
cal.SetVariableData(sKey, xData.dVal[0]);
}
@@ -2318,7 +2318,7 @@ void AecDbECableLine::RemoveHolePipe(AecDbECableTray* pWPipe)
for (; it != end;)
{
if (!pXDatMap->GetNext(it, sKey, cVal)) break;
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
{
AcDbHandle handle(cVal.pszVal);
@@ -2888,7 +2888,7 @@ void AecDbDuctLine::RemoveHolePipe(AecDbHvacDuct* pWPipe)
for (; it != end;)
{
if (!pXDatMap->GetNext(it, sKey, cVal)) break;
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
{
AcDbHandle handle(cVal.pszVal);
@@ -62,13 +62,13 @@ BOOL CDLGArribtEdit::OnInitDialog()
{
iIndex = m_wndLstAttrib.InsertItem(0, sKey);
if (cVal.nVt == VT_BSTR)
if (cVal.nVt == AecXData::kTypeString)
sKey.Format(_T("%s"), cVal.pszVal);
else if (cVal.nVt == VT_I4)
else if (cVal.nVt == AecXData::kTypeInt)
sKey.Format(_T("%d"), cVal.nVal);
else if (cVal.nVt == VT_R8)
else if (cVal.nVt == AecXData::kTypeDouble)
sKey.Format(_T("%g"), cVal.dVal[0]);
else if (cVal.nVt == (VT_BYREF | VT_R8))
else if (cVal.nVt == AecXData::kTypePoint)
sKey.Format(_T("%g,%g,%g"), cVal.dVal[0], cVal.dVal[1], cVal.dVal[2]);
m_wndLstAttrib.SetItemText(iIndex, 1, sKey);
@@ -203,13 +203,13 @@ void CDLGArribtEdit::OnOK()
sValue = m_wndLstAttrib.GetItemText(iPos, 1);
iVt = m_wndLstAttrib.GetItemData(iPos);
if (iVt == VT_BSTR)
if (iVt == AecXData::kTypeString)
m_pmapXData->SetAt(sKey, sValue);
else if (iVt == VT_I4)
else if (iVt == AecXData::kTypeInt)
m_pmapXData->SetAt(sKey, (int)_ttol(sValue));
else if (iVt == VT_R8)
else if (iVt == AecXData::kTypeDouble)
m_pmapXData->SetAt(sKey, _tcstod(sValue, NULL));
else if (iVt == (VT_BYREF | VT_R8))
else if (iVt == AecXData::kTypePoint)
{
pt.x = pt.y = pt.z = 0.0;
_stscanf(sValue, _T("%lf,%lf,%lf"), &(pt.x), &(pt.y), &(pt.z));
@@ -4334,7 +4334,7 @@ void TDbPipeLine::RemoveHolePipe(AecDbEwPipe* pWPipe)
for (; it != end;)
{
if (!pXDatMap->GetNext(it, sKey, cVal)) break;
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
{
AcDbHandle handle(cVal.pszVal);
@@ -4082,7 +4082,7 @@ void TDbPipeLine::RemoveHolePipe(AecDbEwPipe* pWPipe)
for (; it != end;)
{
if (!pXDatMap->GetNext(it, sKey, cVal)) break;
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
{
AcDbHandle handle(cVal.pszVal);
+1 -1
View File
@@ -752,7 +752,7 @@ void CGJFCDlg::CreateChildItem(AecDbObjXDataMap* pXData)
for (; it != end; )
{
if (!pXData->GetNext(it, sKey, cVal)) break;
if (cVal.nVt == VT_BSTR)
if (cVal.nVt == AecXData::kTypeString)
{
sHandle = cVal.pszVal;
}
+3 -3
View File
@@ -393,7 +393,7 @@ void CGJFCNewDlg::OnBnClickedButton10()
{
memset(&cVal,0,sizeof(AecXData));
if (!xData.GetNext(it, sKey, cVal)) break;
if (cVal.nVt == VT_BSTR)
if (cVal.nVt == AecXData::kTypeString)
{
sHandle = cVal.pszVal;
}
@@ -456,7 +456,7 @@ void CGJFCNewDlg::OnBnClickedButton10()
{
memset(&cVal,0,sizeof(AecXData));
if (!xData.GetNext(it, sKey, cVal)) break;
if (cVal.nVt == VT_BSTR)
if (cVal.nVt == AecXData::kTypeString)
{
sHandle = cVal.pszVal;
}
@@ -984,7 +984,7 @@ void CGJFCNewDlg::CreateChildItem(AecDbObjXDataMap* pXData)
if (!pXData->GetNext(it, sKey, cVal))
break;
if (cVal.nVt == VT_BSTR)
if (cVal.nVt == AecXData::kTypeString)
{
sHandle = cVal.pszVal;
}
+73 -16
View File
@@ -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__