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
108 lines
2.7 KiB
C++
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;
|
|
}
|
|
}
|
|
} |