Files
envi-code/SourceCode/Code2026/Pool3dCmd/makefengji.cpp
T
company-desktop 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

108 lines
2.7 KiB
C++

#include "StdAfx.h"
#include "uiiado.h"
#include "ktsetting.h"
#include "AecDbEwEquipment.h"
#include "CoreTools.h"
#include "EarThwormDef.h"
#define LAY_PIPE_CENTER _T("PIPE_CEN")
#define LAY_PIPE_OUTSIDE _T("PIPE_OUT")
#define LAY_FITN_CENTER LAY_PIPE_CENTER
#define LAY_FITN_DASH _T("FITN_DSH")
namespace FENGJI
{
namespace
{
AcDbObjectId AecInitLayerEx(LPCTSTR pszLayer, LPCTSTR pszSys, int nColorIndex, LPCTSTR pszLineType, AcDbDatabase* pDb)
{
return CoreTools::AecInitLayerEx(pszLayer, pszSys, nColorIndex, pszLineType, pDb);
}
AecDbEwEquipment* makeBaseEquiment(LPCTSTR name, bool bHvac = false)
{
if (!name) return NULL;
AecDbEwEquipment* pWEquip = new AecDbEwEquipment;
AecDbObjXDataMap* pXDataMap = pWEquip->GetSpecialtyData();
pXDataMap->SetAt(KEY_NAME, name);
pXDataMap->SetAt(KEY_FITSRV, KEY_FITWPIPE);
pXDataMap->SetAt(KEY_RUNTIME, eEquipment);
//设置图层
CString sSys;
pXDataMap->GetAt(PIPE_SYS, sSys);
AcDbObjectId idLayer = AecInitLayerEx(LAY_PIPE_OUTSIDE, sSys, 7, _T("Continuous"), NULL);
pWEquip->setLayer(idLayer);
pWEquip->SetDashLayer(KTSetting::InitLayer(LAY_FITN_DASH));
pWEquip->SetCenterLayer(KTSetting::InitLayer(LAY_FITN_CENTER));
return pWEquip;
}
AcDbRegion* makeRectRegion(const AcGePoint3d& ptOrg
, const double& dL
, const double& dW)
{
AcGePoint3d pt0(-dL * .5, dW * .5, .0)
, pt1(dL * .5, dW * .5, .0)
, pt2(dL * .5, -dW * .5, .0)
, pt3(-dL * .5, -dW * .5, .0);
AcDbVoidPtrArray ar;
ar.append(new AcDbLine(pt0, pt1));
ar.append(new AcDbLine(pt1, pt2));
ar.append(new AcDbLine(pt2, pt3));
ar.append(new AcDbLine(pt3, pt0));
AcDbRegion* pReg = CoreTools::createRegion(ar);
if (pReg)
{
AcGeMatrix3d mat;
mat.setToTranslation(ptOrg.asVector());
pReg->transformBy(mat);
}
deleteArrayVoidPtrs< AcDbLine>(ar);
return pReg;
}
template <typename T>
void setData(AecEqui::XPrimData* pXPData, void* pData)
{
pXPData->m_nID = ::_time32(NULL);
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;
}
}
}