Merge pull request '重构: AecDbObjXDataMap 解耦 UI,并统一 SetAt/数组实现' (#7) from company-desktop-computer/company-ai-dev into main
Reviewed-on: #7
This commit was merged in pull request #7.
This commit is contained in:
commit
4961b696ff
3 files changed
+617
-366
No files matched your search
File diff suppressed because it is too large.
Load diff
@@ -1,6 +1,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "CCKSXDlg.h"
|
||||
#include "AecDbObjXDataMap.h"
|
||||
#include <vector>
|
||||
|
||||
IMPLEMENT_DYNAMIC(CCKSXDlg, CDialog)
|
||||
|
||||
@@ -77,10 +78,19 @@ BOOL CCKSXDlg::OnInitDialog()
|
||||
|
||||
void CCKSXDlg::ListXDataMap(AecDbObjXDataMap *pXDataMap)
|
||||
{
|
||||
if (pXDataMap != NULL)
|
||||
if (pXDataMap == NULL)
|
||||
return;
|
||||
|
||||
m_wndListXData.DeleteAllItems();
|
||||
|
||||
std::vector<CString> vecItems;
|
||||
pXDataMap->List(vecItems);
|
||||
|
||||
// List() 每个元素输出两项:先 key(名称列),后 value(数据列)。
|
||||
for (size_t i = 0; i + 1 < vecItems.size(); i += 2)
|
||||
{
|
||||
m_wndListXData.DeleteAllItems();
|
||||
pXDataMap->List(&m_wndListXData, 0);
|
||||
int nItem = m_wndListXData.InsertItem(m_wndListXData.GetItemCount(), vecItems[i]);
|
||||
m_wndListXData.SetItemText(nItem, 1, vecItems[i + 1]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,9 @@
|
||||
typedef std::pair<CString, CString> SH_BIM_REC;
|
||||
typedef std::vector<SH_BIM_REC> SH_BIM_BLOCK;
|
||||
|
||||
typedef struct AecXData
|
||||
// AecXData 会被其它模块(CoreLibrary / 各 Cmd)直接构造使用,必须随 AecRxBase 一起导出,
|
||||
// 否则成员函数定义在 .cpp 里时其它模块会 LNK2019(unresolved external symbol)。
|
||||
typedef struct AECDLLIMPEXP AecXData
|
||||
{
|
||||
// 数据类型标签(nVt)。直接用 wtypes.h 的 VARENUM(VT_*) 组合来表达,直观且与
|
||||
// 原实现逐位一致;nVt 会写入 DWG/DXF/XData,改数值会破坏旧图兼容,务必保持不变。
|
||||
@@ -53,7 +55,7 @@ typedef struct AecXData
|
||||
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串)
|
||||
kTypeMatrix = (VT_BYREF | VT_R8) + 4, // 矩阵(16个double,二进制块,128字节)
|
||||
kTypeBinary = (VT_BYREF | VT_R8) + 5, // 二进制块
|
||||
};
|
||||
|
||||
@@ -70,44 +72,11 @@ typedef struct AecXData
|
||||
};
|
||||
|
||||
// 1. 默认构造函数,替代原有代码中散落的 memset(&xdata, 0, sizeof(xdata));
|
||||
// 注意:struct AecXData 未 dllexport,这两个函数必须 inline 在头文件里,
|
||||
// 否则其它模块(CoreLibrary / 各 Cmd)构造 AecXData 时会链接不到。
|
||||
AecXData()
|
||||
{
|
||||
nVt = 0;
|
||||
npszLen = 0;
|
||||
nVal = 0; // 清零 union,防止野指针
|
||||
}
|
||||
// 实现见 AecDbObjXDataMap.cpp(随本 DLL 导出,其它模块可直接构造)。
|
||||
AecXData();
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
void Free();
|
||||
|
||||
// 3. 深拷贝:先释放自身已持有的资源,再从 src 深拷贝。
|
||||
// 字符串/矩阵/二进制会重新分配内存,不与 src 共享缓冲;
|
||||
@@ -126,6 +95,9 @@ public:
|
||||
AecDbObjXDataMap(const AecDbObjXDataMap& datamap);
|
||||
virtual ~AecDbObjXDataMap();
|
||||
|
||||
// 把 kTypeMatrix 的 16 个 double 二进制块格式化为逗号分隔文本(供显示/比较使用)
|
||||
static CString MatrixToString(const AecXData& xdata);
|
||||
|
||||
public:
|
||||
BOOL SetAt(LPCTSTR pszKey, const int &nVal);
|
||||
BOOL SetAt(LPCTSTR pszKey, const DWORD &dw);
|
||||
@@ -150,6 +122,11 @@ public:
|
||||
BOOL SetAt(LPCTSTR pszKey,const AcGeMatrix3d& xform);
|
||||
|
||||
BOOL SetAt(LPCTSTR pszKey,void* pData,int nSize);
|
||||
|
||||
BOOL SetAt(LPCTSTR pszKey, const AecDbObjXDataMap& xDataMap);
|
||||
|
||||
BOOL GetAt(LPCTSTR pszKey, AecDbObjXDataMap& xDataMap);
|
||||
|
||||
BOOL GetAt(LPCTSTR pszKey,void*& pData,int& nSize) const;
|
||||
|
||||
BOOL GetAt(LPCTSTR pszKey,int& nVal) const;
|
||||
@@ -244,7 +221,8 @@ public:
|
||||
|
||||
//prinf输出
|
||||
void List() const;
|
||||
void List(CListCtrl *pList, int nImage) const;
|
||||
// 输出到字符串数组:每个元素占两项(先 key,后 value),供界面按两列展示。
|
||||
void List(std::vector<CString> &pList) const;
|
||||
|
||||
int ComparedTo(const AecDbObjXDataMap* pXDataMap) const;
|
||||
|
||||
@@ -297,6 +275,9 @@ private:
|
||||
|
||||
void SecondAsKey(CString& sTemp,AecXData& xData);
|
||||
|
||||
// 把 xdata 以 pszKey 存入(已存在则覆盖)。接管 xdata 的所有权(内部把源置空)。
|
||||
void SetXData(LPCTSTR pszKey, AecXData &xdata);
|
||||
|
||||
|
||||
private:
|
||||
mutable SHJson::WValue m_json;//临时,不序列化
|
||||
|
||||
Reference in new issue
Block a user