Files
envi-code/SourceCode/Code2026/PipelineCmd/EQU_MODIFY.cpp
T

935 lines
20 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#include "stdafx.h"
#include "KTCADUtilityEx.h"
#include "CoreTools.h"
#include "Equ_MODIFY.h"
#include "DBReactorOfEquMke.h"
#include "aecdbewequipment.h"
namespace
{
AcGePoint3d getCenterOfReg(AcDbRegion *pReg)
{
if (!pReg) return AcGePoint3d::kOrigin;
AcDbExtents ext;
pReg->getGeomExtents(ext);
return CoreTools::MidPt(ext.maxPoint(), ext.minPoint());
}
bool getRegionData(AcDbObjectId idPoly, CString &sReg, AcGePoint3d &ptCenter, const AcGeMatrix3d &mat)
{
OPENOBJ_BEGIN(idPoly, AcDb::kForWrite, AcDbCurve, pCurve)
{
if (!pCurve) return false;
AcDbPolyline *pPoly(AcDbPolyline::cast(pCurve));
if (pPoly && !pPoly->isClosed())
pPoly->setClosed(true);
AcDbCurve *pNew = (AcDbCurve*)pCurve->clone();
AcDbRegion *pReg = CoreTools::createRegion(pNew);
DELETE_PTR(pNew);
if (!pReg) return false;
pReg->transformBy(mat);
CoreTools::RegionToString(pReg, sReg);
ptCenter = getCenterOfReg(pReg);
DELETE_PTR(pReg);
}
OPENOBJ_END()
return true;
}
bool getRegionData(AcDbObjectId idPoly, AcDbRegion *&pReg, AcGePoint3d &ptCenter)
{
OPENOBJ_BEGIN(idPoly, AcDb::kForWrite, AcDbCurve, pCurve)
{
if (!pCurve) return false;
AcDbPolyline *pPoly(AcDbPolyline::cast(pCurve));
if (pPoly && !pPoly->isClosed())
pPoly->setClosed(true);
AcDbCurve *pNew = (AcDbCurve*)pCurve->clone();
pReg = CoreTools::createRegion(pNew);
DELETE_PTR(pNew);
if (pReg) ptCenter = getCenterOfReg(pReg);
}
OPENOBJ_END()
return pReg == NULL ? false: true;
}
bool initLayers(const bool &bInit)
{
std::set<CString> layers;
if (bInit)
{
LayerTools::getAllLayers(layers);
if (layers.empty())
{
acutPrintf(_T("\n获取所有图层失败!"));
return false;
}
LayerTools::lockLayers(layers, true);
if (!LayerTools::createNewLayer(LayerTools::g_sLayerName))
{
acutPrintf(_T("\n新建图层失败!"));
LayerTools::lockLayers(layers, true);
return false;
}
LayerTools::setCLayer(LayerTools::g_sLayerName);
return true;
}
else
{
LayerTools::setCLayer(_T("0"));
LayerTools::deleteLayer(LayerTools::g_sLayerName);
LayerTools::getAllLayers(layers);
if (layers.empty())
{
acutPrintf(_T("\n获取所有图层失败!"));
return false;
}
LayerTools::lockLayers(layers, false);
}
return true;
}
void deleteEntity(AcDbObjectId id)
{
OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbEntity, pEnt)
{
if (pEnt)
{
pEnt->erase();
}
}
OPENOBJ_END()
}
AcDbCurve* String2Polyline(LPCTSTR sReg)
{
if (!sReg) return NULL;
AcDbRegion *pReg = CoreTools::StringToRegion(sReg);
if (!pReg)
{
acutPrintf(_T("\n新region失败!"));
return NULL;
}
AcDbVoidPtrArray ar;
pReg->explode(ar);
DELETE_PTR(pReg);
if (ar.length() == 1)
{
AcDbEntity *pEnt((AcDbEntity*)ar[0]);
AcDbCircle *pCir = AcDbCircle::cast(pEnt);
if (pCir) return (AcDbCurve*)pCir->clone();
}
AcDbPolyline *pPoly(NULL);
std::vector<AcDbPolyline*> polys;
if (CoreTools::MakePolyline(ar, polys))
pPoly = polys[0];
deleteArrayVoidPtrs< AcDbEntity>(ar);
return pPoly;
}
void hideEntity(AcDbObjectId &id, const bool &bHide)
{
OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbEntity, pEnt)
if (pEnt)
{
pEnt->setVisibility(bHide ? AcDb::kInvisible : AcDb::kVisible);
}
OPENOBJ_END()
}
}
#pragma region base
IMPLEMENT_DYNAMIC(CDTYG_XG, CDialog)
BEGIN_MESSAGE_MAP(CDTYG_XG, CDialog)
END_MESSAGE_MAP()
CDTYG_XG::CDTYG_XG(UINT idd, CWnd * pParent)
: CDialog(idd, pParent)
, m_idReg(AcDbObjectId::kNull)
, m_idPath(AcDbObjectId::kNull)
, m_pPrim(NULL)
, m_sReg(_T(""))
, m_idEqu(AcDbObjectId::kNull)
{ }
CDTYG_XG::~CDTYG_XG() { }
bool CDTYG_XG::init(AecEqui::XPrimData *pData
, AcDbObjectId idEqu
, AcDbObjectId &hlid
, const AcGePoint3d &ptIns
, const AcGeVector3d &vtDir
, const bool &bVert )
{
AcAxDocLock lock;
#ifdef ZWCAD
acedPostCommand(_T("_SHADEMODE _2D "));
#else
acedPostCommand(_T("_vscurrent 2 "));
#endif
resetLayersAndOverrules();
DelIntermediaryObj();
m_interObjs.clear();
m_idReg = m_idPath = AcDbObjectId::kNull;
m_sReg = _T("");
m_idHlight = hlid;
hideEntity(m_idHlight, true);
m_pPrim = pData;
m_idEqu = idEqu;
m_ptIns = ptIns;
m_vtDir = vtDir;
m_bVert = bVert;
return true;
}
void CDTYG_XG::resetLayersAndOverrules()
{
CEntityOverrule::delOverrule();
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
pDb->disableUndoRecording(true);
initLayers(false);
pDb->disableUndoRecording(false);
}
void CDTYG_XG::AddOverrules()
{
std::set<AcDbObjectId> _ids;
_ids.insert(m_interObjs.begin(), m_interObjs.end());
CEntityOverrule::addOverrule(_ids);
}
void CDTYG_XG::DelIntermediaryObj()
{
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
pDb->disableUndoRecording(true);
for (size_t i = 0; i < m_interObjs.size(); ++i)
{
deleteEntity(m_interObjs[i]);
}
LayerTools::deleteLayer(LayerTools::g_sLayerName);
pDb->disableUndoRecording(false);
}
bool CDTYG_XG::getRegionData(AcDbObjectId &idReg, CString & sReg, AcGePoint3d & ptC)
{
AcDbRegion *pReg(NULL);
bool bRel = getRegionData(idReg, pReg, ptC);
if (pReg)
bRel = CoreTools::RegionToString(pReg, sReg);
DELETE_PTR(pReg);
return bRel;
}
void CDTYG_XG::TransformEntity(AcDbEntity * pEnt)
{
return AecDbEwEquipment::TransformEntity(pEnt, m_ptIns, m_vtDir, m_pPrim, m_bVert);
}
void CDTYG_XG::UnTransformEntity(AcDbEntity * pEnt)
{
return AecDbEwEquipment::UnTransformEntity(pEnt, m_ptIns, m_vtDir, m_pPrim, m_bVert);
}
bool CDTYG_XG::getRegionData(AcDbObjectId &idReg, AcDbRegion *&pReg, AcGePoint3d &ptC)
{
OPENOBJ_BEGIN(idReg, AcDb::kForWrite, AcDbCurve, pCurve)
{
if (!pCurve) return false;
AcDbPolyline *pPoly(AcDbPolyline::cast(pCurve));
if (pPoly && !pPoly->isClosed())
pPoly->setClosed(true);
AcDbCurve *pNew = (AcDbCurve*)pCurve->clone();
pReg = CoreTools::createRegion(pNew);
DELETE_PTR(pNew);
if (pReg)
{
UnTransformEntity(pReg);
ptC = getCenterOfReg(pReg);
}
}
OPENOBJ_END()
return pReg == NULL ? false : true;
}
void CDTYG_XG::OnOK()
{
AcAxDocLock lock;
resetLayersAndOverrules();
DelIntermediaryObj();
//hideEntity(m_idHlight, false);
//acedPostCommand(_T("r "));
CDialog::OnOK();
if (GetParent()) GetParent()->ShowWindow(SW_SHOW);
if (GetParent()) GetParent()->PostMessage(WM_REFRESH_HLIGHT_ENTITY_MESSAGE);
OPENOBJ_BEGIN(m_idEqu, AcDb::kForWrite, AecDbEwEquipment, pEqu)
if (pEqu)
{
pEqu->clearGeoBuffer();
}
OPENOBJ_END()
}
void CDTYG_XG::OnCancel()
{
AcAxDocLock lock;
resetLayersAndOverrules();
DelIntermediaryObj();
hideEntity(m_idHlight, false);
acedPostCommand(_T("r "));
CDialog::OnCancel();
if (GetParent()) GetParent()->ShowWindow(SW_SHOW);
}
#pragma endregion
#pragma region EXTRUD
IMPLEMENT_DYNAMIC(CDTYG_XG_EXTRUD, CDTYG_XG)
BEGIN_MESSAGE_MAP(CDTYG_XG_EXTRUD, CDTYG_XG)
ON_BN_CLICKED(IDOK, &CDTYG_XG_EXTRUD::OnBnClickedOk)
END_MESSAGE_MAP()
CDTYG_XG_EXTRUD::CDTYG_XG_EXTRUD(CWnd* pParent)
: CDTYG_XG(IDD, pParent)
{ }
CDTYG_XG_EXTRUD::~CDTYG_XG_EXTRUD() { }
bool CDTYG_XG_EXTRUD::init(AecEqui::XPrimData *pData
, AcDbObjectId idEqu
, AcDbObjectId &hlid
, const AcGePoint3d &ptIns
, const AcGeVector3d &vtDir
, const bool &bVert )
{
if (!CDTYG_XG::init(pData, idEqu, hlid, ptIns, vtDir, bVert)) return false;
NewExtrude ne;
if (!ne.fromData((byte*)m_pPrim->m_pData, m_pPrim->m_nSize))
return false;
m_sReg = ne.m_sRegion;
m_dHeight = ne.m_dH;
if(GetParent()) GetParent()->ShowWindow(SW_HIDE);
UpdateData(FALSE);
drawRegion();
return true;
}
void CDTYG_XG_EXTRUD::DoDataExchange(CDataExchange* pDX)
{
CDTYG_XG::DoDataExchange(pDX);
DDX_Text(pDX, IDC_MODIFY_HEIGHT, m_dHeight);
}
void CDTYG_XG_EXTRUD::drawRegion()
{
AcAxDocLock lock;
AcDbCurve *pPoly(String2Polyline(m_sReg));
if (!pPoly)
{
acutPrintf(_T("\npolyline生成失败!"));
return;
}
TransformEntity(pPoly);
initLayers(true);
pPoly->setLayer(LayerTools::g_sLayerName);
CoreTools::AddToModelSpace(pPoly, NULL, true, &m_idReg);
if (!m_idReg.isValid())
{
acutPrintf(_T("\n截面曲线插入失败!"));
initLayers(false);
return;
}
acedPostCommand(_T("r "));
// 锁定实体不允许删除
m_interObjs.push_back(m_idReg);
AddOverrules();
}
void CDTYG_XG_EXTRUD::OnBnClickedOk()
{
AcAxDocLock lock;
UpdateData(TRUE);
AcGePoint3d pt;
AcDbRegion *pReg;
if (getRegionData(m_idReg, pReg, pt))
{
NewExtrude ne(!m_pPrim->m_bBoolSubtract, pReg, m_dHeight);
DELETE_ARR_(m_pPrim->m_pData);
m_pPrim->m_nSize = 0;
ne.toData(m_pPrim->m_pData, m_pPrim->m_nSize);
DELETE_PTR(pReg);
}
// 还原环境
resetLayersAndOverrules();
CDTYG_XG::OnOK();
}
#pragma endregion
#pragma region REVOLVE
IMPLEMENT_DYNAMIC(CDTYG_XG_REVOLVE, CDTYG_XG)
BEGIN_MESSAGE_MAP(CDTYG_XG_REVOLVE, CDTYG_XG)
ON_BN_CLICKED(IDOK, &CDTYG_XG_REVOLVE::OnBnClickedOk)
END_MESSAGE_MAP()
CDTYG_XG_REVOLVE::CDTYG_XG_REVOLVE(CWnd* pParent)
: CDTYG_XG(IDD, pParent)
, m_ptOrg(AcGePoint3d::kOrigin)
, m_vt(AcGeVector3d::kIdentity)
, m_dSweepAngle(.0)
, m_dStartAngle(.0) { }
CDTYG_XG_REVOLVE::~CDTYG_XG_REVOLVE() { }
bool CDTYG_XG_REVOLVE::init(AecEqui::XPrimData *pData
, AcDbObjectId idEqu
, AcDbObjectId &hlid
, const AcGePoint3d &ptIns
, const AcGeVector3d &vtDir
, const bool &bVert)
{
if (!CDTYG_XG::init(pData, idEqu, hlid, ptIns, vtDir, bVert)) return false;
NewRevolve nr;
if (!nr.fromData((byte*)m_pPrim->m_pData, m_pPrim->m_nSize))
return false;
m_ptOrg = nr.m_ptOrg;
m_vt = nr.m_vtDir;
m_dSweepAngle = nr.m_dSweepAngle;
m_dStartAngle = nr.m_dStartAngle;
m_sReg = nr.m_sRegion;
SetWindowText(_T("单体异构-修改旋转体"));
if (GetDlgItem(IDC_STATIC_TIP))
{
GetDlgItem(IDC_STATIC_TIP)->SetWindowText(_T("请直接修改红色截面和黄色旋转轴。"));
}
drawRegion();
if(GetParent()) GetParent()->ShowWindow(SW_HIDE);
return true;
}
void CDTYG_XG_REVOLVE::drawRegion()
{
AcAxDocLock lock;
AcDbCurve *pPoly(String2Polyline(m_sReg));
if (!pPoly)
{
acutPrintf(_T("\npolyline生成失败!"));
return;
}
initLayers(true);
pPoly->setLayer(LayerTools::g_sLayerName);
TransformEntity(pPoly);
CoreTools::AddToModelSpace(pPoly, NULL, true, &m_idReg);
if (!m_idReg.isValid())
{
acutPrintf(_T("\n截面曲线插入失败!"));
initLayers(false);
return;
}
AcDbRay *pRay = new AcDbRay();
pRay->setBasePoint(m_ptOrg);
pRay->setUnitDir(m_vt);
pRay->setColorIndex(2);
TransformEntity(pRay);
CoreTools::AddToModelSpace(pRay, NULL, true, &m_idPath);
if (!m_idPath.isValid())
{
acutPrintf(_T("\n旋转轴插入失败!"));
initLayers(false);
return;
}
acedPostCommand(_T("r "));
// 锁定实体不允许删除
m_interObjs.push_back(m_idReg);
m_interObjs.push_back(m_idPath);
AddOverrules();
}
void CDTYG_XG_REVOLVE::OnBnClickedOk()
{
AcAxDocLock lock;
AcGePoint3d pt;
AcDbRegion *pReg(NULL);
if (getRegionData(m_idReg, pReg, pt))
{
OPENOBJ_BEGIN(m_idPath, AcDb::kForWrite, AcDbRay, pRay)
if (pRay)
{
UnTransformEntity(pRay);
m_ptOrg = pRay->basePoint();
m_vt = pRay->unitDir();
NewRevolve nr(!m_pPrim->m_bBoolSubtract, pReg, m_ptOrg, m_vt, m_dSweepAngle, m_dStartAngle);
DELETE_ARR_(m_pPrim->m_pData);
m_pPrim->m_nSize = 0;
nr.toData(m_pPrim->m_pData, m_pPrim->m_nSize);
}
OPENOBJ_END()
DELETE_PTR(pReg);
}
// 还原环境
resetLayersAndOverrules();
CDTYG_XG::OnOK();
}
#pragma endregion
#pragma region SWEEP
IMPLEMENT_DYNAMIC(CDTYG_XG_SWEEP, CDTYG_XG)
BEGIN_MESSAGE_MAP(CDTYG_XG_SWEEP, CDTYG_XG)
ON_BN_CLICKED(IDOK, &CDTYG_XG_SWEEP::OnBnClickedOk)
END_MESSAGE_MAP()
CDTYG_XG_SWEEP::CDTYG_XG_SWEEP(CWnd* pParent)
: CDTYG_XG(IDD, pParent)
, m_pCurve(NULL)
{ }
CDTYG_XG_SWEEP::~CDTYG_XG_SWEEP()
{
DELETE_PTR(m_pCurve);
}
bool CDTYG_XG_SWEEP::init(AecEqui::XPrimData *pData
, AcDbObjectId idEqu
, AcDbObjectId &hlid
, const AcGePoint3d &ptIns
, const AcGeVector3d &vtDir
, const bool &bVert)
{
DELETE_PTR(m_pCurve);
if (!CDTYG_XG::init(pData, idEqu, hlid, ptIns, vtDir, bVert)) return false;
NewSweep ns;
if (!ns.fromData((byte*)m_pPrim->m_pData, m_pPrim->m_nSize))
return false;
m_sReg = ns.m_sRegion;
m_pCurve = CoreTools::StringToPolyline(ns.m_sPath);
if (!m_pCurve)
return false;
SetWindowText(_T("单体异构-修改扫掠体"));
if (GetDlgItem(IDC_STATIC_TIP))
{
GetDlgItem(IDC_STATIC_TIP)->SetWindowText(_T("请直接修改红色截面和黄色路径。\n\n请注意:\n\n如要修改扫掠体位置,请修改红色截面位置。\n\n路径只决定扫掠体走向。"));
}
drawRegion();
if(GetParent()) GetParent()->ShowWindow(SW_HIDE);
return true;
}
void CDTYG_XG_SWEEP::drawRegion()
{
AcAxDocLock lock;
AcDbCurve *pPoly(String2Polyline(m_sReg));
if (!pPoly)
{
acutPrintf(_T("\npolyline生成失败!"));
return;
}
initLayers(true);
pPoly->setLayer(LayerTools::g_sLayerName);
TransformEntity(pPoly);
CoreTools::AddToModelSpace(pPoly, NULL, true, &m_idReg);
if (!m_idReg.isValid())
{
acutPrintf(_T("\n截面曲线插入失败!"));
initLayers(false);
return;
}
AcDbPolyline *pPath = (AcDbPolyline*)m_pCurve->clone();
DELETE_PTR(m_pCurve);
pPath->setColorIndex(2);
pPath->setLayer(LayerTools::g_sLayerName);
TransformEntity(pPath);
CoreTools::AddToModelSpace(pPath, NULL, true, &m_idPath);
if (!m_idPath.isValid())
{
acutPrintf(_T("\n旋转轴插入失败!"));
initLayers(false);
return;
}
acedPostCommand(_T("r "));
// 锁定实体不允许删除
m_interObjs.push_back(m_idReg);
m_interObjs.push_back(m_idPath);
AddOverrules();
}
void CDTYG_XG_SWEEP::OnBnClickedOk()
{
AcAxDocLock lock;
AcGePoint3d pt;
AcDbRegion *pReg(NULL);
if (getRegionData(m_idReg, pReg, pt))
{
OPENOBJ_BEGIN(m_idPath, AcDb::kForWrite, AcDbPolyline, pPoly)
if (pPoly)
{
UnTransformEntity(pPoly);
NewSweep ns(!m_pPrim->m_bBoolSubtract, pReg, pPoly);
DELETE_ARR_(m_pPrim->m_pData);
m_pPrim->m_nSize = 0;
ns.toData(m_pPrim->m_pData, m_pPrim->m_nSize);
}
OPENOBJ_END()
DELETE_PTR(pReg);
}
resetLayersAndOverrules();
CDTYG_XG::OnOK();
}
#pragma endregion
#pragma region LOFT
IMPLEMENT_DYNAMIC(CDTYG_XG_LOFT, CDTYG_XG)
BEGIN_MESSAGE_MAP(CDTYG_XG_LOFT, CDTYG_XG)
ON_BN_CLICKED(IDOK, &CDTYG_XG_LOFT::OnBnClickedOk)
ON_REGISTERED_MESSAGE(WM_XLISTCTRL_EDIT_END, &CDTYG_XG_LOFT::OnEditEnd)
ON_BN_CLICKED(IDC_CHECK1, &CDTYG_XG_LOFT::OnBnClickedCheck1)
ON_NOTIFY(NM_CLICK, IDC_LIST, &CDTYG_XG_LOFT::OnNMClickList)
END_MESSAGE_MAP()
CDTYG_XG_LOFT::CDTYG_XG_LOFT(CWnd* pParent)
: CDTYG_XG(IDD, pParent)
, m_heights(0)
, m_regs(0)
, m_bUseTbl(TRUE)
{ }
CDTYG_XG_LOFT::~CDTYG_XG_LOFT() { }
void CDTYG_XG_LOFT::DoDataExchange(CDataExchange * pDX)
{
CDTYG_XG::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST, m_lstCtrl);
DDX_Check(pDX, IDC_CHECK1, m_bUseTbl);
}
BOOL CDTYG_XG_LOFT::OnInitDialog()
{
CDTYG_XG::OnInitDialog();
m_lstCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_SINGLEROW);
m_lstCtrl.InsertColumn(0, _T("层号"), LVCFMT_LEFT, 125);
m_lstCtrl.InsertColumn(1, _T("层高"), LVCFMT_LEFT, 125);
UpdateData(FALSE);
return TRUE;
}
bool CDTYG_XG_LOFT::init(AecEqui::XPrimData *pData
, AcDbObjectId idEqu
, AcDbObjectId &hlid
, const AcGePoint3d &ptIns
, const AcGeVector3d &vtDir
, const bool &bVert)
{
m_regs.clear();
m_heights.clear();
m_bUseTbl = TRUE;
if (!CDTYG_XG::init(pData, idEqu, hlid, ptIns, vtDir, bVert)) return false;
NewLoft nl;
if (!nl.fromData((byte*)m_pPrim->m_pData, m_pPrim->m_nSize))
return false;
m_regs = nl.m_regs;
// 分析截面找到层高
if (m_regs.size() < 2)
{
acutPrintf(_T("\nloft截面小于2!"));
return false;
}
std::vector<AcDbRegion*> regs;
AcGePlane plan;
AcGeVector3d vt, vtN;
double dH(.0);
AcGePoint3d ptM(AcGePoint3d::kOrigin), ptNear(AcGePoint3d::kOrigin);
for (size_t i = 0; i < m_regs.size() - 1; ++i)
{
AcDbRegion *pReg1 = CoreTools::StringToRegion(m_regs[i]);
AcDbRegion *pReg2 = CoreTools::StringToRegion(m_regs[i+1]);
if (!pReg1 || !pReg2) continue;
regs.push_back(pReg1);
regs.push_back(pReg2);
pReg1->getPlane(plan);
vtN = plan.normal();
ptM = getCenterOfReg(pReg2);
ptNear = plan.closestPointTo(ptM);
dH = ptNear.distanceTo(ptM);
vt = ptM - ptNear;
if (!vt.isCodirectionalTo(vtN))
dH *= -1;
m_heights.push_back(dH);
}
deleteContainerOfStd(regs);
m_lstCtrl.DeleteAllItems();
CString s(_T(""));
for (size_t i = 0; i < m_heights.size(); ++i)
{
s.Format(_T("%d层"), i + 1);
m_lstCtrl.InsertItem(i, s);
s.Format(_T("%.1f"), m_heights[i]);
m_lstCtrl.SetItemText(i, 1, s);
m_lstCtrl.SetEdit(i, 1);
}
// 直接显示各截面
drawRegion();
UpdateData(FALSE);
if (GetParent()) GetParent()->ShowWindow(SW_HIDE);
return true;
}
void CDTYG_XG_LOFT::drawRegion()
{
AcAxDocLock lock;
AcDbObjectId id;
initLayers(true);
for (size_t i = 0; i < m_regs.size(); ++i)
{
AcDbCurve *pPoly(String2Polyline(m_regs[i]));
if (!pPoly) continue;
pPoly->setLayer(LayerTools::g_sLayerName);
TransformEntity(pPoly);
CoreTools::AddToModelSpace(pPoly, NULL, true, &id);
if (id.isValid())
{
m_interObjs.push_back(id);
}
}
acedPostCommand(_T("r "));
// 锁定实体不允许删除
AddOverrules();
}
void CDTYG_XG_LOFT::OnBnClickedOk()
{
AcAxDocLock lock;
UpdateData(TRUE);
resetLayersAndOverrules();
AcGePoint3d ptM(AcGePoint3d::kOrigin);
std::vector<std::pair<AcDbRegion*, AcGePoint3d>> mp;
for (size_t i = 0; i < m_interObjs.size(); ++i)
{
AcDbRegion *pReg(NULL);
if (!getRegionData(m_interObjs[i], pReg, ptM)) continue;
mp.push_back(std::make_pair(pReg, ptM));
}
if (mp.empty()) return;
if (m_bUseTbl) // 根据数据调整截面
{
m_heights.clear();
CString sV(_T(""));
for (int i = 0; i < m_lstCtrl.GetItemCount(); i++)
{
sV = m_lstCtrl.GetItemText(i, 1);
m_heights.push_back(TypeConvert::s2f(sV));
}
if (m_heights.size() == mp.size() - 1)
{
AcGeVector3d vtN;
AcGePlane plan;
AcGeMatrix3d mat;
AcGePoint3d ptM1, ptM2;
mp[0].first->getPlane(plan);
vtN = plan.normal();
ptM1 = mp[0].second;
double dH(0.);
for (size_t i(1); i < mp.size(); ++i)
{
dH += m_heights[i - 1];
vtN = plan.normal();
mat.setToIdentity();
// 先把所有平面都放到第一层
AcDbRegion *pReg = mp[i].first;
ptM2 = mp[i].second;
double deltaZ(ptM1.z - ptM2.z);
vtN *= deltaZ;
mat.setToTranslation(vtN);
pReg->transformBy(mat);
vtN = plan.normal();
vtN *= dH;
mat.setToIdentity();
mat.setToTranslation(vtN);
pReg->transformBy(mat);
}
}
}
m_regs.clear();
AcArray<AcDbRegion*> regs;
for (size_t i = 0; i < mp.size(); ++i)
{
regs.append(mp[i].first);
}
NewLoft nl(!m_pPrim->m_bBoolSubtract, regs, NULL);
DELETE_ARR_(m_pPrim->m_pData);
m_pPrim->m_nSize = 0;
nl.toData(m_pPrim->m_pData, m_pPrim->m_nSize);
CDTYG_XG::OnOK();
}
LRESULT CDTYG_XG_LOFT::OnEditEnd(WPARAM nItem, LPARAM nSubItem)
{
CString sValue = m_lstCtrl.GetItemText(nItem, nSubItem);
if (!CoreTools::isDigitString<double>(sValue) && !CoreTools::isDigitString<int>(sValue))
{
m_lstCtrl.SetItemText(nItem, nSubItem, _T("100.0"));
AfxMessageBox(_T("请输入数字!"));
return 0;
}
return 0;
}
void CDTYG_XG_LOFT::OnBnClickedCheck1()
{
UpdateData(TRUE);
//m_bUseTbl = !m_bUseTbl;
if (m_bUseTbl)
{
m_lstCtrl.EnableWindow(true);
}
else
{
m_lstCtrl.EnableWindow(false);
}
}
void CDTYG_XG_LOFT::OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
AcAxDocLock lock;
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
*pResult = 0;
// 先全部还原颜色
for (size_t i = 0; i < m_interObjs.size(); ++i)
{
OPENOBJ_BEGIN(m_interObjs[i], AcDb::kForWrite, AcDbEntity, pEnt)
{
if (!pEnt) return;
pEnt->setColorIndex(256);
}
OPENOBJ_END()
}
int nItem = pNMItemActivate->iItem;
if (nItem < m_heights.size() || nItem >= 0)
{
if (m_interObjs.empty()) return;
int nFr(nItem), nEd(nItem + 1);
if ((nFr < 0 || nFr >= m_interObjs.size())
|| (nEd < 0 || nEd >= m_interObjs.size()))
return;
AcDbObjectId idFr(m_interObjs[nFr]), idEd(m_interObjs[nEd]);
OPENOBJ_BEGIN(idFr, AcDb::kForWrite, AcDbEntity, pEnt1)
{
OPENOBJ_BEGIN(idEd, AcDb::kForWrite, AcDbEntity, pEnt2)
{
if (!pEnt1 || !pEnt2) return;
pEnt1->setColorIndex(2);
pEnt2->setColorIndex(2);
}
OPENOBJ_END()
}
OPENOBJ_END()
}
acedPostCommand(_T("r "));
}
#pragma endregion