936 lines
20 KiB
C++
936 lines
20 KiB
C++
#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
|