Files
envi-code/SourceCode/Code2026/PlumbingCmd/CSXHDlg.cpp
T
company-desktop-computer 41397130e2 refactor: 统一 XPrimData::m_pData 为字节数组,releaseData 只保留 delete[]
releaseData() 原来按 m_eType 分两路(8 种 delete[],其余 delete),但同一类型
在内存里可能是对象也可能是字节数组:开图、JSON 导入、深拷贝都分配 new byte[],
而对话框里 setData<T> 的 default 分支和几处直接 new 分配的是对象。按类型判断
必然有一半场景不匹配。

- 13 处对象形式分配统一改成 new unsigned char[sizeof(T)],后续 (T*)m_pData
  的用法不变
- releaseData() 去掉 switch,只保留 delete[];~XPrimData() 改为先调 releaseData(),
  顺带修掉 m_Combins 子单元的 m_pData 泄漏
- AecDbEwEquipment::FreeSubPrimData() 取代 FreeBuffer(CPtrArray&),改成成员函数,
  不再需要参数
- 另外三个文件作用域的 FreeBuffer/FreeBuffer2/FreeBuffer3 改名为 FreeEntityArray/
  FreeComplexCurveArray/FreeFaceplanArray,并加 static 收回内部链接
- 删除 ReleaseXPrimData,直接 releaseData() + DELETE_PTR
2026-10-23 10:29:31 +08:00

243 lines
5.3 KiB
C++

#include "stdafx.h"
#include "CSXHDlg.h"
#include "CoreTools.h"
#include "CXSHSIZEDlg.h"
#include "AecDbEwEquipment.h"
#include "AcGiViewDraw.h"
#include "dbobjptr.h"
#include "AecDbEwEquipment.h"
#include <AecDbEarthWorm.h>
namespace
{
template <typename T>
void setData(AecEqui::XPrimData* pXPData, void* pData)
{
::Sleep(30);
pXPData->m_nID = ::GetTickCount();
switch (pXPData->m_eType)
{
case AecEqui::kExtrude:
case AecEqui::kRevolve:
pXPData->m_nSize = ((AecEqui::XBuffer*)pData)->nSize;
if (pXPData->m_nSize > 0)
{
pXPData->m_pData = new byte[pXPData->m_nSize];
::memcpy(pXPData->m_pData, ((AecEqui::XBuffer*)pData)->pData, pXPData->m_nSize);
}
break;
default:
pXPData->m_pData = new unsigned char[sizeof(T)];
::memcpy(pXPData->m_pData, pData, sizeof(T));
pXPData->m_nSize = sizeof(T);
break;
}
}
void clearData(AecEqui::XPrimData& data)
{
switch (data.m_eType)
{
case AecEqui::kExtrude:
case AecEqui::kRevolve:
DELETE_ARR_(data.m_pData);
break;
default:
DELETE_PTR(data.m_pData);
break;
}
return;
}
}
IMPLEMENT_DYNAMIC(CSXHDlg, CDialog)
CSXHDlg::CSXHDlg(CWnd* pParent)
: CDialog(IDD_DLG_XSH, pParent)
, m_iType(0)
, m_iLayout(0)
, m_dDist(1)
, m_dWallDist(670)
, m_dProtectR(3)
, m_Sizes(0)
, m_s2DSel(_T(""))
{
}
CSXHDlg::~CSXHDlg()
{
}
void CSXHDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_SIZE, m_ListBoxSize);
DDX_Radio(pDX, IDC_RADIO_UP, m_iType);
DDX_Radio(pDX, IDC_RADIO_LAYOUT_LINE, m_iLayout);
DDX_Text(pDX, IDC_EDIT_DIST, m_dDist);
DDX_Text(pDX, IDC_EDIT_WALLDIST, m_dWallDist);
DDX_Text(pDX, IDC_EDIT_RADIUS, m_dProtectR);
}
BOOL CSXHDlg::OnInitDialog()
{
UpdateData(FALSE);
CDialog::OnInitDialog();
if (!m_wndViewCtrl2d.SubclassDlgItem(IDC_PREVIEW_2D, this))
{
return FALSE;
}
initListData();
initLayoutDist();
return TRUE;
}
BEGIN_MESSAGE_MAP(CSXHDlg, CDialog)
ON_BN_CLICKED(IDOK, &CSXHDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_BTN_Size, &CSXHDlg::OnBnClickedSize)
ON_BN_CLICKED(IDC_BTN_SEL_2D, &CSXHDlg::OnBnClickedBtnSel2d)
ON_BN_CLICKED(IDC_RADIO_UP, &CSXHDlg::OnBnClickedRadioXHSSize)
ON_BN_CLICKED(IDC_RADIO_LEVEL, &CSXHDlg::OnBnClickedRadioXHSSize)
ON_BN_CLICKED(IDC_RADIO_LAYOUT_LINE, &CSXHDlg::OnBnClickedRadioXHSLayoutStyle)
ON_BN_CLICKED(IDC_RADIO_LAYOUT_FREE, &CSXHDlg::OnBnClickedRadioXHSLayoutStyle)
ON_BN_CLICKED(IDC_RADIO_LAYOUT_DIST, &CSXHDlg::OnBnClickedRadioXHSLayoutStyle)
END_MESSAGE_MAP()
void CSXHDlg::OnBnClickedOk()
{
if (!UpdateData(TRUE)) return;
int idx = m_ListBoxSize.GetCurSel();
if (idx == -1) return;
CString str;
int nLen = m_ListBoxSize.GetTextLen(idx);
m_ListBoxSize.GetText(idx, str.GetBuffer(nLen));
str.ReleaseBuffer();
m_sListBoxValue = str;
CDialog::OnOK();
}
void CSXHDlg::OnBnClickedBtnSel2d()
{
UpdateData(TRUE);
CString sFile(FilePath::GetRootDir());
sFile += _T("\\TK\\Customer\\图库中心\\图块库\\给排水图库\\消火栓.dwg");
m_s2DSel = CoreTools::selectBlockByDWG(sFile, _T(""), m_s2DSel);
AcDbDatabase* _pDb = new AcDbDatabase(false);
std::shared_ptr<AcDbDatabase> pDb(_pDb);
if (pDb->readDwgFile(sFile, AcDbDatabase::kForReadAndAllShare) != Acad::eOk) return;
AcDbBlockTable* _pBT = NULL;
pDb->getSymbolTable(_pBT, AcDb::kForRead);
if (!_pBT) return;
AcDbObjectId idBT(_pBT->objectId());
_pBT->close();
AcDbBlockTablePointer pBT(idBT, AcDb::kForRead);
if (pBT.openStatus() != Acad::eOk) return;
std::vector<CString> vec;
CoreTools::SplitString(m_s2DSel, _T('|'), vec);
if (vec.size() < 1) return;
AcDbObjectId idBlock;
pBT->getAt(vec.at(1), idBlock);
pBT->close();
AcDbBlockReference* pRef = new AcDbBlockReference();
pRef->setBlockTableRecord(idBlock);
pRef->setPosition(AcGePoint3d::kOrigin);
pRef->setRotation(0.0);
int idx = m_ListBoxSize.GetCurSel();
if (idx == -1) return;
CString ss;
int nLen = m_ListBoxSize.GetTextLen(idx);
m_ListBoxSize.GetText(idx, ss.GetBuffer(nLen));
ss.ReleaseBuffer();
vec.clear();
CoreTools::SplitString(ss, _T('*'), vec);
if (vec.size() < 1) return;
AcGeScale3d scale(TypeConvert::s2d(vec[0]), TypeConvert::s2d(vec[1]), 1.);
scale *= .8;
pRef->setScaleFactors(scale);
AcDbExtents ext;
pRef->getGeomExtents(ext);
m_wndViewCtrl2d.clearAll();
m_wndViewCtrl2d.init(true);
m_wndViewCtrl2d.SetOrbitFlag(OBF_ZOOM);
m_wndViewCtrl2d.InitFromCurrentView2D(ext, true);
m_wndViewCtrl2d.Add(pRef);
m_wndViewCtrl2d.view()->invalidate();
m_wndViewCtrl2d.Invalidate();
m_wndViewCtrl2d.RedrawWindow();
}
void CSXHDlg::OnBnClickedSize()
{
CXSHSIZEDlg dlg(m_Sizes);
dlg.DoModal();
m_ListBoxSize.ResetContent();
for (size_t i(0); i < m_Sizes.size(); ++i)
m_ListBoxSize.AddString(m_Sizes[i]);
}
void CSXHDlg::OnBnClickedRadioXHSSize()
{
return;
}
void CSXHDlg::OnBnClickedRadioXHSLayoutStyle()
{
UpdateData(TRUE);
initLayoutDist();
return;
}
void CSXHDlg::initListData()
{
m_ListBoxSize.ResetContent();
m_ListBoxSize.AddString(_T("650*200"));
m_ListBoxSize.AddString(_T("650*320"));
m_ListBoxSize.AddString(_T("750*240"));
m_ListBoxSize.SetCurSel(0);
}
void CSXHDlg::initLayoutDist()
{
CWnd* pWnd(NULL);
if (m_iLayout == 0 || m_iLayout == 1)
{
pWnd = GetDlgItem(IDC_EDIT_DIST);
if (pWnd) pWnd->EnableWindow(FALSE);
}
else
{
pWnd = GetDlgItem(IDC_EDIT_DIST);
if (pWnd) pWnd->EnableWindow(TRUE);
}
}