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:
gjm committed 2026-10-13 15:29:26 +08:00
commit 4961b696ff
3 files changed
+617 -366

No files matched your search

File diff suppressed because it is too large. Load diff
+13 -3
View File
@@ -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]);
}
}
+20 -39
View File
@@ -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;//临时,不序列化