Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

936 lines
20 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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