Files
envi-code/SourceCode/Code2026/PipelineCmd/EquipmentMakeDlg.cpp
T
2026-09-28 15:28:50 +08:00

4480 lines
109 KiB
C++
Raw 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 "KTCadUtility.h"
#include "EquipmentMakeDlg.h"
#include "AecDbEwEquipment.h"
#include "KTSetting.h"
#include "PipelineTools.h"
#include "BoxDlg.h"
#include "CylinderDlg.h"
#include "ConeDLg.h"
#include "PyrmDlg.h"
#include "SpereDlg.h"
#include "DishDlg.h"
#include "CirtorDlg.h"
#include "RecttorDlg.h"
#include "TydfDlg.h"
#include "NozzDlg.h"
#include "coretools.h"
#include "UserDataDlg.h"
#include "EquipSelDlg.h"
#include "EquToDbDlg.h"
#include "EquBand2D.h"
#include "parseFamilyForRevit.h"
#include "equipmentlibrarydlg.h"
#include "BrepOper.h"
#include "EQU_MODIFY.h"
#pragma region define
#define IMPEQUP_TYPE 1000
#define SUB_BTN_BOX 0
#define SUB_BTN_CLN 1
#define SUB_BTN_CON 2
#define SUB_BTN_PRM 3
#define SUB_BTN_SPE 4
#define SUB_BTN_DIS 5
#define SUB_BTN_LOFT 6
#define SUB_BTN_SWEEP 7
#define SUB_BTN_EXTRU 8
#define SUB_BTN_REVOL 9
#define SUB_BTN_CIT 10
#define SUB_BTN_RCT 11
#define SUB_BTN_TYDF 12
#define SUB_BTN_RVT 13
#define SUB_BTN_EQU 14
#define SUB_TREE_BOX 0
#define SUB_TREE_CLN 1
#define SUB_TREE_CON 2
#define SUB_TREE_PRM 3
#define SUB_TREE_CIT 4
#define SUB_TREE_RCT 5
#define SUB_TREE_DIS 6
#define SUB_TREE_SPE 7
#define SUB_TREE_EXTRU 8
#define SUB_TREE_REVOL 9
#define SUB_TREE_TYDF 10
#define SUB_TREE_NOZZ 11
#define SUB_TREE_LOFT 12
#define SUB_TREE_SWEEP 13
#define SUB_TREE_RVT_COMBIN 14
#define SUB_TREE_EQU_COMBIN 15
#define EQP_TREE_ROOT 16
#define SUB_TREE_X 17
#define SUB_TREE_Y 18
#define SUB_TREE_Z 19
#define SUB_SUBDMESH 0
#define SUB_NAMEBOX CString(_T("长方体"))
#define SUB_NAMECLN CString(_T("圆柱"))
#define SUB_NAMECON CString(_T("圆台"))
#define SUB_NAMEPRM CString(_T("四方台"))
#define SUB_NAMECIT CString(_T("圆截面环"))
#define SUB_NAMERCT CString(_T("矩形截面环"))
#define SUB_NAMEDIS CString(_T("椭圆封头"))
#define SUB_NAMESPE CString(_T("球"))
#define SUB_NAMEEXT CString(_T("拉伸体"))
#define SUB_NAMEREV CString(_T("旋转体"))
#define SUB_NAMETYDF CString(_T("天圆地方"))
#define SUB_NAMENOZZ CString(_T("管觜"))
#define SUB_NAMESUBDMESH CString(_T("revit对象"))
#define SUB_NAME_NEWEXT CString(_T("拉伸体"))
#define SUB_NAME_NEWREV CString(_T("旋转体"))
#define SUB_NAME_NEWSWEEP CString(_T("扫掠体"))
#define SUB_NAME_SWEEP_R CString(_T("扫掠体R"))
#define SUB_NAME_COMBIN_R CString(_T("组合体R"))
#define SUB_NAME_NEWLOFT CString(_T("放样体"))
#define SUB_NAME_EQU CString(_T("组合设备"))
#define EQU_COMPANY "Beijing shanghua equipment design file"
#pragma endregion define
namespace
{
Adesk::Int32 getItemID(std::set<int> &idBuffer)
{
long id = _time32(NULL);
std::pair<std::set<int>::iterator, bool> pr = idBuffer.insert(id);
if (!pr.second) // 存在重复
{
id = *idBuffer.rbegin() + 1;
idBuffer.insert(id);
}
return id;
}
void CheckChildItem(CTreeCtrl &tree, HTREEITEM hParent, BOOL bCheck)
{
HTREEITEM hChild = tree.GetChildItem(hParent);
while (hChild != NULL)
{
tree.SetCheck(hChild, bCheck);
CheckChildItem(tree, hChild, bCheck);
hChild = tree.GetNextSiblingItem(hChild);
}
}
void getSelectItems(CTreeCtrl &tree, HTREEITEM hParent, std::vector<HTREEITEM> &items)
{
BOOL bCheck(false);
HTREEITEM hChild = tree.GetChildItem(hParent);
while (hChild != NULL)
{
if (tree.GetCheck(hChild)) items.push_back(hChild);
getSelectItems(tree, hChild, items);
hChild = tree.GetNextSiblingItem(hChild);
}
}
CString getTreeItemSuffix(bool bSub)
{
CString sSuffix(_T("(+)"));
if (bSub)
sSuffix = _T("(-)");
return sSuffix;
}
HTREEITEM refreshTree(AecDbEwEquipment *pEqu, CTreeCtrl &ctrl)
{
if (!pEqu) return NULL;
ctrl.DeleteAllItems();
CString sName(_T("设备"));
AecDbObjXDataMap *pXDataMap = pEqu->GetSpecialtyData();
if (pXDataMap)
pXDataMap->GetAt(KEY_NAME, sName);
HTREEITEM hRoot = ctrl.InsertItem(sName, EQP_TREE_ROOT, EQP_TREE_ROOT);
AcDbObjectId id = pEqu->objectId();
ctrl.SetItemData(hRoot, (DWORD_PTR)id.asOldId());
AecEqui::Primitive ePrim;
AecEqui::XPrimData* p3dsolid = NULL;
HTREEITEM hItem = NULL;
std::set<int> ss;
std::pair<std::set<int>::iterator, bool> pr;
CString sSuffix(_T(""));
for (int i = 0; i < pEqu->GetSubPrimObjCount(); i++)
{
p3dsolid = pEqu->GetSubPrimObj(i);
if (!p3dsolid) continue;
sSuffix = getTreeItemSuffix(p3dsolid->m_bBoolSubtract);
ePrim = (AecEqui::Primitive)p3dsolid->m_eType;
switch (ePrim)
{
case AecEqui::kBox:
hItem = ctrl.InsertItem(SUB_NAMEBOX + sSuffix
, SUB_TREE_BOX
, SUB_TREE_BOX
, hRoot);
break;
case AecEqui::kCylinder:
hItem = ctrl.InsertItem(SUB_NAMECLN + sSuffix
, SUB_TREE_CLN
, SUB_TREE_CLN
, hRoot);
break;
case AecEqui::kCone:
hItem = ctrl.InsertItem(SUB_NAMECON + sSuffix
, SUB_TREE_CON
, SUB_TREE_CON
, hRoot);
break;
case AecEqui::kPyramid:
hItem = ctrl.InsertItem(SUB_NAMEPRM + sSuffix
, SUB_TREE_PRM
, SUB_TREE_PRM
, hRoot);
break;
case AecEqui::kCirTorus:
hItem = ctrl.InsertItem(SUB_NAMECIT + sSuffix
, SUB_TREE_CIT
, SUB_TREE_CIT
, hRoot);
break;
case AecEqui::kRectTorus:
hItem = ctrl.InsertItem(SUB_NAMERCT + sSuffix
, SUB_TREE_RCT
, SUB_TREE_RCT
, hRoot);
break;
case AecEqui::kDish:
hItem = ctrl.InsertItem(SUB_NAMEDIS + sSuffix
, SUB_TREE_DIS
, SUB_TREE_DIS
, hRoot);
break;
case AecEqui::kSphere:
hItem = ctrl.InsertItem(SUB_NAMESPE + sSuffix
, SUB_TREE_SPE
, SUB_TREE_SPE
, hRoot);
break;
case AecEqui::kExtrude:
hItem = ctrl.InsertItem(SUB_NAMEEXT + sSuffix
, SUB_TREE_EXTRU
, SUB_TREE_EXTRU
, hRoot);
break;
case AecEqui::kRevolve:
hItem = ctrl.InsertItem(SUB_NAMEREV + sSuffix
, SUB_TREE_REVOL
, SUB_TREE_REVOL
, hRoot);
break;
case AecEqui::kTydf:
hItem = ctrl.InsertItem(SUB_NAMETYDF + sSuffix
, SUB_TREE_TYDF
, SUB_TREE_TYDF
, hRoot);
break;
case AecEqui::kNozz:
hItem = ctrl.InsertItem(SUB_NAMENOZZ + sSuffix
, SUB_TREE_NOZZ
, SUB_TREE_NOZZ
, hRoot);
break;
case AecEqui::kNewExtrude:
hItem = ctrl.InsertItem(SUB_NAME_NEWEXT + sSuffix
, SUB_TREE_EXTRU
, SUB_TREE_EXTRU
, hRoot);
break;
case AecEqui::kNewRevolve:
hItem = ctrl.InsertItem(SUB_NAME_NEWREV + sSuffix
, SUB_TREE_REVOL
, SUB_TREE_REVOL
, hRoot);
break;
case AecEqui::kRevitSweep:
hItem = ctrl.InsertItem(SUB_NAME_SWEEP_R + sSuffix
, SUB_TREE_SWEEP
, SUB_TREE_SWEEP
, hRoot);
break;
case AecEqui::kNewSweep:
hItem = ctrl.InsertItem(SUB_NAME_NEWSWEEP + sSuffix
, SUB_TREE_SWEEP
, SUB_TREE_SWEEP
, hRoot);
break;
case AecEqui::kNewLoft:
hItem = ctrl.InsertItem(SUB_NAME_NEWLOFT + sSuffix
, SUB_TREE_LOFT
, SUB_TREE_LOFT
, hRoot);
break;
case AecEqui::kRevitCombination:
hItem = ctrl.InsertItem(SUB_NAME_COMBIN_R + sSuffix
, SUB_TREE_RVT_COMBIN
, SUB_TREE_RVT_COMBIN
, hRoot);
break;
case AecEqui::kCombination:
hItem = ctrl.InsertItem(SUB_NAME_EQU + sSuffix
, SUB_TREE_EQU_COMBIN
, SUB_TREE_EQU_COMBIN
, hRoot);
break;
default:
break;
}
if (!p3dsolid->m_sName.IsEmpty())
ctrl.SetItemText(hItem, p3dsolid->m_sName + sSuffix);
ctrl.SetItemData(hItem, (DWORD_PTR)p3dsolid->m_nID);
pr = ss.insert(p3dsolid->m_nID);
if (!pr.second)
acutPrintf(_T("\n%d"), p3dsolid->m_nID);
}
return hRoot;
}
template <typename T>
void setData(AecEqui::XPrimData *pXPData, void *pData, std::set<int> &idBuffer)
{
pXPData->m_nID = getItemID(idBuffer);
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 T;
::memcpy(pXPData->m_pData, pData, sizeof(T));
pXPData->m_nSize = sizeof(T);
break;
}
}
void deleteEntity(AcDbObjectId id, bool bUnRecord = false)
{
AcAxDocLock lock;
if (!id.isValid()) return;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbEntity, pEnt)
{
if (pEnt)
{
if (bUnRecord)
{
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
pDb->disableUndoRecording(true);
pEnt->erase();
pEnt->close();
pDb->disableUndoRecording(false);
}
else
{
pEnt->erase();
pEnt->close();
}
}
}
OPENOBJ_END()
}
bool setFaceClr(AcDbObjectId solidID
, std::map<AcDbSubentId, int, CEquipmentMakeDlg::compare_subent> &subIds
, const int &idx
, int clr)
{
AcCmColor cm;
cm.setColorIndex(256);
OPENOBJ_BEGIN(solidID, AcDb::kForWrite, AcDb3dSolid, pSolid)
if (!pSolid) return false;
std::map<AcDbSubentId, int, CEquipmentMakeDlg::compare_subent>::iterator it(subIds.begin());
for (; it != subIds.end(); ++it)
{
const AcDbSubentId &subId(it->first);
if (clr == it->second)
{
pSolid->setSubentColor(BrepOper::Acad2Zcad(subId), cm);
it->second = 256;
break;
}
}
it = subIds.begin();
std::advance(it, idx);
cm.setColorIndex(clr);
pSolid->setSubentColor(BrepOper::Acad2Zcad(it->first), cm);
it->second = clr;
OPENOBJ_END()
acedPostCommand(_T("regen "));
return true;
}
int getColorByUser(int idx)
{
AcCmColor clr;
#if ARX < 24
clr.setColorMethod(AcCmEntityColor::kByACI);
#endif
clr.setColorIndex(idx);
acedSetColorDialogTrueColor(clr
, Adesk::kTrue
, clr
, AcCm::kACITab);
return clr.colorIndex();
}
void selectPolyline(AcGePoint3d &pickPnt, AcArray<AcDbRegion*> &regs)
{
#ifdef ZWCAD
acedPostCommand(_T("_SHADEMODE _2D "));
#else
acedPostCommand(_T("_vscurrent 2 "));
#endif
ads_name ent, ss;
struct resbuf *pRb = acutBuildList(RTDXF0, _T("LWPOLYLINE,CIRCLE"), 0);
int nRes = CKTCadUtility::SelectEntities(_T("\n请选择多条闭合多段线或面域:"), ss, pRb);
acutRelRb(pRb);
if (nRes == RTNORM)
{
AcDbObjectId id;
Adesk::Int32 nLen = 0;
acedSSLength(ss, &nLen);
for (long i = 0; i < nLen; i++)
{
acedSSName(ss, i, ent);
acdbGetObjectId(id, ent);
OPENOBJ_BEGIN(id, AcDb::kForRead, AcDbEntity, pEnt)
if (pEnt)
{
AcDbRegion *pReg = AcDbRegion::cast(pEnt);
AcDbPolyline *pPoly = AcDbPolyline::cast(pEnt);
AcDbCircle *pCir = AcDbCircle::cast(pEnt);
if (pReg)
{
regs.append((AcDbRegion*)pReg->clone());
continue;
}
if (pPoly)
{
AcDbPolyline *p = (AcDbPolyline*)pPoly->clone();
if (p->isClosed())
p->setClosed(true);
AcDbRegion *pR = CoreTools::createRegion(p);
DELETE_PTR(p);
if (pR)
regs.append(pR);
}
if (pCir)
{
AcDbCircle *p = (AcDbCircle*)pCir->clone();
AcDbRegion *pR = CoreTools::createRegion(p);
DELETE_PTR(p);
if (pR)
regs.append(pR);
}
}
OPENOBJ_END()
}
pickPnt = acdbCurDwg()->ucsorg();
CoreTools::UCS2WCS(pickPnt, pickPnt);
}
acedSSFree(ss);
}
bool isSubtract()
{
bool bSub = false;
TCHAR szKey[131] = {};
acedInitGet(RSG_OTHER, _T("Y N"));
acedGetKword(_T("\n是否是挖掘操作[是(Y)/否(N)]<否(N)>:"), szKey);
if (CString(szKey).CompareNoCase(_T("Y")) == 0)
bSub = true;
return bSub;
}
AcDbPolyline* curve2Polyline(AcDbCurve *pCurve)
{
AcDbPolyline *pPoly(AcDbPolyline::cast(pCurve));
if (pPoly) return (AcDbPolyline*)pPoly->clone();
return CoreTools::MakePolyline(pCurve);
}
AcDbPolyline* selectPath(AcGePoint3d &pickPnt)
{
AcDbPolyline *pPoly(NULL);
ads_name ent;
struct resbuf *pRb = acutBuildList(RTDXF0, _T("LWPOLYLINE,LINE,ARC,CIRCLE"), 0);
int nRes = CKTCadUtility::SelectEntity(_T("\n选择一条曲线(直线,弧线,圆,多段线)做为路径:"), ent, pRb);
acutRelRb(pRb);
if (nRes != RTNORM) return NULL;
AcDbObjectId id;
if (acdbGetObjectId(id, ent) != Acad::eOk) return NULL;
OPENOBJ_BEGIN(id, AcDb::kForRead, AcDbCurve, p)
if (p) pPoly = curve2Polyline(p);
OPENOBJ_END()
return pPoly;
}
AcDbRegion* selectPolyline(AcGePoint3d &pickPnt, LPCTSTR pszMsg, bool bVscurrent)
{
if (bVscurrent)
#ifdef ZWCAD
acedPostCommand(_T("_SHADEMODE _2D "));
#else
acedPostCommand(_T("_vscurrent 2 "));
#endif
ads_name ent;
ads_point adsPt;
struct resbuf *pRb = acutBuildList(RTDXF0, _T("LWPOLYLINE,CIRCLE"), 0);
int nRes = CKTCadUtility::SelectEntity(pszMsg, ent, pRb, adsPt);
acutRelRb(pRb);
if (nRes != RTNORM) return NULL;
pickPnt = asPnt3d(adsPt);
CoreTools::UCS2WCS(pickPnt, pickPnt);
AcDbObjectId id;
acdbGetObjectId(id, ent);
OPENOBJ_BEGIN(id, AcDb::kForRead, AcDbEntity, pEnt)
if (pEnt)
{
AcDbRegion *pReg = AcDbRegion::cast(pEnt);
AcDbPolyline *pPoly = AcDbPolyline::cast(pEnt);
AcDbCircle *pCir = AcDbCircle::cast(pEnt);
if (pReg)
{
return (AcDbRegion*)pReg->clone();
}
if (pPoly)
{
AcDbPolyline *p = (AcDbPolyline*)pPoly->clone();
if (p->isClosed())
p->setClosed(true);
AcDbRegion *pR = CoreTools::createRegion(p);
DELETE_PTR(p);
return pR;
}
if (pCir)
{
AcDbCircle *p = (AcDbCircle*)pCir->clone();
AcDbRegion *pR = CoreTools::createRegion(p);
DELETE_PTR(p);
return pR;
}
}
OPENOBJ_END()
return NULL;
}
AcDbEntity* selectEntity(LPCTSTR filter, LPCTSTR pszMsg, const AcGePoint3d &ptOrg, const bool &bMove = true)
{
if (!filter || !pszMsg) return NULL;
ads_name ent;
struct resbuf *pRb = acutBuildList(RTDXF0, filter, 0);
int nRes = CKTCadUtility::SelectEntity2(pszMsg, ent, pRb);
acutRelRb(pRb);
if (nRes != RTNORM) return NULL;
AcDbObjectId id;
acdbGetObjectId(id, ent);
if (!id.isValid()) return NULL;
AcDbEntity *pResult(NULL);
OPENOBJ_BEGIN(id, AcDb::kForRead, AcDbEntity, pEnt)
{
if (!pEnt) return NULL;
pResult = (AcDbEntity*)pEnt->clone();
}
OPENOBJ_END()
if (!bMove) return pResult;
// 移动到ptOrg
AcDbExtents ext;
pResult->getGeomExtents(ext);
AcGePoint3d ptCen(CoreTools::MidPt(ext.maxPoint(), ext.minPoint()));
AcGeVector3d vt(ptOrg - ptCen);
AcGeMatrix3d mat;
mat.setToTranslation(vt);
pResult->transformBy(mat);
return pResult;
}
bool getInsertPt(CWnd *pWnd, AcGePoint3d &pt)
{
if (pWnd->IsWindowVisible())
pWnd->ShowWindow(SW_HIDE);
ads_point adsPt = {.0,.0,.0};
int nRes = acedGetPoint(NULL, _T("\n请选择放置点<0,0,0>:"), adsPt);
if (nRes == RTCAN)
{
if (!pWnd->IsWindowVisible())
pWnd->ShowWindow(SW_SHOW);
return false;
}
if (nRes == RTNONE)
{
adsPt[0] = adsPt[1] = adsPt[2] = .0;
}
pt = asPnt3d(adsPt);
CoreTools::UCS2WCS(pt, pt);
if (!pWnd->IsWindowVisible())
pWnd->ShowWindow(SW_SHOW);
return true;
}
void CreateExtrude(std::vector<AecEqui::XPrimData> &solids, std::set<int> &idBuffer)
{
AcArray<AcDbRegion*> regs(0);
AcGePoint3d pickPnt(AcGePoint3d::kOrigin);
selectPolyline(pickPnt, regs);
if (regs.isEmpty()) return;
AcGeVector3d vtNormal;
regs[0]->getNormal(vtNormal);
vtNormal.normalize();
double dH(.0);
if (acedGetReal(_T("\n输入拉伸高度:"), &dH) != RTNORM) return;
bool bSub = isSubtract();
int clr = getColorByUser(256);
AcGePoint3d pt;
long tid = getItemID(idBuffer);
for (int i = 0; i < regs.length(); ++i)
{
NewExtrude ne(!bSub, regs[i], dH);
AecEqui::XPrimData data;
data.m_nID = tid++;
data.m_eType = AecEqui::kNewExtrude;
data.m_bBoolSubtract = bSub;
data.m_iClr = clr;
ne.toData(data.m_pData, data.m_nSize);
solids.push_back(data);
}
deleteContainerOfArx<AcDbRegion>(regs);
}
void CreateSweep(std::vector<AecEqui::XPrimData> &solids, std::set<int> &idBuffer)
{
AcArray<AcDbRegion*> regs(0);
AcDbPolyline *pPoly(NULL);
do
{
AcGePoint3d pickPnt(AcGePoint3d::kOrigin);
selectPolyline(pickPnt, regs);
if (regs.isEmpty()) break;
pPoly = selectPath(pickPnt);
if (!pPoly) break;
bool bSub = isSubtract();
int clr = getColorByUser(256);
long tid = getItemID(idBuffer);
for (int i = 0; i < regs.length(); ++i)
{
NewSweep ns(!bSub, regs[i], pPoly);
AecEqui::XPrimData data;
data.m_nID = tid++;
data.m_eType = AecEqui::kNewSweep;
data.m_bBoolSubtract = bSub;
data.m_iClr = clr;
ns.toData(data.m_pData, data.m_nSize);
solids.push_back(data);
}
} while (false);
deleteContainerOfArx<AcDbRegion>(regs);
DELETE_PTR(pPoly);
}
void CreateLoft(AecEqui::XPrimData &solid, std::set<int> &idBuffer)
{
AcGePoint3d ptOrg = acdbCurDwg()->ucsorg();
int idx(0);
CString sMsg(_T(""));
AcGePoint3d pickPnt(AcGePoint3d::kOrigin);
AcArray<AcDbRegion*> regs;
AcDbRegion *pBot(NULL);
AcGeVector3d vtNormal, vt;
AcGeMatrix3d mat;
AcGePlane botPlan, plan;
double dH(.0), dAll(.0);
int iSign = 1;
while (true)
{
if (!idx)
sMsg = _T("\n请选择第一级底面(闭合多段线或面域):");
else
sMsg.Format(_T("\n请选择第%d级顶面"), idx);
AcDbRegion *pReg = selectPolyline(pickPnt, sMsg, !idx);
if (!pReg) break;
if (!idx)
{
pReg->getNormal(vtNormal);
vtNormal.normalize();
pReg->getPlane(botPlan);
regs.append(pReg);
}
else
{
pReg->getPlane(plan);
if (!botPlan.isCoplanarTo(plan))
{
acutPrintf(_T("\n此面不与底层共面,请重新选择:"));
continue;
}
if (acedGetReal(_T("\n请输入层高(毫米):"), &dH) != RTNORM) break;
if (idx == 1)
iSign = dH > 0 ? 1 : -1;
else
dH = abs(dH) * iSign;
dAll += dH;
mat.setToIdentity();
mat.setToTranslation(vtNormal * dAll);
pReg->transformBy(mat);
regs.append(pReg);
}
++idx;
}
if (regs.length() < 2)
{
deleteContainerOfArx<AcDbRegion>(regs);
return;
}
bool bSub = isSubtract();
int clr = getColorByUser(256);
NewLoft nl(!bSub, regs, NULL);
solid.m_nID = getItemID(idBuffer);
solid.m_eType = AecEqui::kNewLoft;
solid.m_bBoolSubtract = bSub;
solid.m_iClr = clr;
nl.toData(solid.m_pData, solid.m_nSize);
deleteContainerOfArx<AcDbRegion>(regs);
}
void CreateRevolve(std::vector<AecEqui::XPrimData> &solids, std::set<int> &idBuffer)
{
AcArray<AcDbRegion*> regs(0);
AcGePoint3d pickPnt(AcGePoint3d::kOrigin);
selectPolyline(pickPnt, regs);
if (regs.isEmpty()) return;
AcDbLine *pLine = (AcDbLine*)selectEntity(_T("LINE")
, _T("\n请选择一条直段做为旋转轴:")
, AcGePoint3d::kOrigin
, false);
if (!pLine)
{
acutPrintf(_T("请选择一条直线做为旋转轴!"));
return;
}
bool bSub = isSubtract();
int clr = getColorByUser(256);
long tid = getItemID(idBuffer);
for (int i = 0; i < regs.length(); ++i)
{
NewRevolve nr(!bSub, regs[i]
, pLine->startPoint()
, pLine->endPoint() - pLine->startPoint()
, 2 * PI
, 0.);
AecEqui::XPrimData data;
data.m_nID = tid++;
data.m_eType = AecEqui::kNewRevolve;
data.m_bBoolSubtract = bSub;
data.m_iClr = clr;
nr.toData(data.m_pData, data.m_nSize);
solids.push_back(data);
}
DELETE_PTR(pLine);
deleteContainerOfArx<AcDbRegion>(regs);
}
}
IMPLEMENT_DYNAMIC(CEquipmentMakeDlg, CDialog)
CEquipmentMakeDlg::CEquipmentMakeDlg(AcDbObjectId id, CWnd* pParent /*=NULL*/)
: CDialog(CEquipmentMakeDlg::IDD, pParent)
, m_dXMove(0)
, m_dYMove(0)
, m_dZMove(0)
, m_dXRot(0)
, m_dYRot(0)
, m_dZRot(0)
, m_dIMove(0)
, m_dIRot(0)
, m_MainID(id)
, m_sName(_T(""))
, m_dwIDSel(0)
, m_dwIDAgn(0)
{
Create(IDD_EQUIPMAKEDLG, pParent);
m_pDb = NULL;
}
CEquipmentMakeDlg::~CEquipmentMakeDlg()
{
AcAxDocLock lock;
deleteEntity(m_HligthtID, true);
}
void CEquipmentMakeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREEEQUIP, m_wndEquipPrmTree);
DDX_Text(pDX, IDC_EDITXMOVE, m_dXMove);
DDX_Text(pDX, IDC_EDITYMOVE, m_dYMove);
DDX_Text(pDX, IDC_EDITZMOVE, m_dZMove);
DDX_Text(pDX, IDC_EDITXROT, m_dXRot);
DDX_Text(pDX, IDC_EDITYROT, m_dYRot);
DDX_Text(pDX, IDC_EDITZROT, m_dZRot);
DDX_Text(pDX, IDC_EDITIMOVE, m_dIMove);
DDX_Text(pDX, IDC_EDITIROT, m_dIRot);
DDX_Control(pDX, IDC_BUTTONBOX, m_wndBtBox);
DDX_Control(pDX, IDC_BUTTONCLN, m_wndBtCln);
DDX_Control(pDX, IDC_BUTTONCONE, m_wndBtCone);
DDX_Control(pDX, IDC_BUTTONPYRM, m_wndBtPyrm);
DDX_Control(pDX, IDC_BUTTONSPERE, m_wndBtSpere);
DDX_Control(pDX, IDC_BUTTONDISH, m_wndBtDish);
DDX_Control(pDX, IDC_BUTTONCIRTOR, m_wndBtCirtor);
DDX_Control(pDX, IDC_BUTTONRECTOR, m_wndBtRector);
DDX_Control(pDX, IDC_BUTTONTYDF, m_wndBtTydf);
DDX_Control(pDX, IDC_BUTTONEXTRU, m_wndBtExtru);
DDX_Control(pDX, IDC_BUTTONREVO, m_wndBtRevo);
DDX_Control(pDX, IDC_BUTTONSWEEP, m_wndBtSweep);
DDX_Control(pDX, IDC_BUTTONLOFT, m_wndBtLoft);
DDX_Control(pDX, IDC_BUTTONRVT, m_wndBtRvt);
DDX_Control(pDX, IDC_BUTTONEQU, m_wndBtEqu);
DDX_Control(pDX, IDC_BTSHOWX, m_wndBtShowX);
DDX_Control(pDX, IDC_BTSHOWY, m_wndBtShowY);
DDX_Control(pDX, IDC_BTSHOWZ, m_wndBtShowZ);
DDX_Control(pDX, IDC_BTSHOWX2, m_wndBtShowX2);
DDX_Control(pDX, IDC_BTSHOWY2, m_wndBtShowY2);
DDX_Control(pDX, IDC_BTSHOWZ2, m_wndBtShowZ2);
}
BEGIN_MESSAGE_MAP(CEquipmentMakeDlg, CDialog)
ON_BN_CLICKED(IDOK, &CEquipmentMakeDlg::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &CEquipmentMakeDlg::OnBnClickedCancle)
ON_BN_CLICKED(IDC_BTNEWEQP, &CEquipmentMakeDlg::OnBnClickedBtneweqp)
ON_BN_CLICKED(IDC_BUTTONBOX, &CEquipmentMakeDlg::OnBnClickedButtonbox)
ON_BN_CLICKED(IDC_BUTTONCLN, &CEquipmentMakeDlg::OnBnClickedButtoncln)
ON_BN_CLICKED(IDC_BUTTONCONE, &CEquipmentMakeDlg::OnBnClickedButtoncone)
ON_BN_CLICKED(IDC_BUTTONPYRM, &CEquipmentMakeDlg::OnBnClickedButtonpyrm)
ON_BN_CLICKED(IDC_BUTTONSPERE, &CEquipmentMakeDlg::OnBnClickedButtonspere)
ON_BN_CLICKED(IDC_BUTTONDISH, &CEquipmentMakeDlg::OnBnClickedButtondish)
ON_BN_CLICKED(IDC_BUTTONCIRTOR, &CEquipmentMakeDlg::OnBnClickedButtoncirtor)
ON_BN_CLICKED(IDC_BUTTONRECTOR, &CEquipmentMakeDlg::OnBnClickedButtonrector)
ON_MESSAGE( WM_ACAD_KEEPFOCUS, &CEquipmentMakeDlg::onAcadKeepFocus )
ON_BN_CLICKED(IDC_BTACTIVEINF, &CEquipmentMakeDlg::OnBnClickedBtactiveinf)
ON_BN_CLICKED(IDC_BTLOCATE, &CEquipmentMakeDlg::OnBnClickedBtlocate)
ON_BN_CLICKED(IDC_BTRESET, &CEquipmentMakeDlg::OnBnClickedBtreset)
ON_BN_CLICKED(IDC_BTAPPLY, &CEquipmentMakeDlg::OnBnClickedBtapply)
ON_BN_CLICKED(IDC_BTMODIPRM, &CEquipmentMakeDlg::OnBnClickedBtmodiprm)
ON_BN_CLICKED(IDC_BTDELPRM, &CEquipmentMakeDlg::OnBnClickedBtdelprm)
ON_BN_CLICKED(IDC_BTAPPLY2, &CEquipmentMakeDlg::OnBnClickedBtapply2)
ON_BN_CLICKED(IDC_BTRESET2, &CEquipmentMakeDlg::OnBnClickedBtreset2)
ON_WM_DESTROY()
ON_NOTIFY(TVN_SELCHANGED, IDC_TREEEQUIP, &CEquipmentMakeDlg::OnTvnSelchangedTreeequip)
ON_BN_CLICKED(IDC_BUTTONEXTRU, &CEquipmentMakeDlg::OnBnClickedButtonextru)
ON_BN_CLICKED(IDC_BUTTONREVO, &CEquipmentMakeDlg::OnBnClickedButtonrevo)
ON_BN_CLICKED(IDC_BTUNDOLOCATE, &CEquipmentMakeDlg::OnBnClickedBtundolocate)
ON_BN_CLICKED(IDC_BUTTONRELOAD, &CEquipmentMakeDlg::OnBnClickedButtonreload)
ON_BN_CLICKED(IDC_BTSELASMOVE, &CEquipmentMakeDlg::OnBnClickedBtselasmove)
ON_BN_CLICKED(IDC_BTSELASALIGN, &CEquipmentMakeDlg::OnBnClickedBtselasalign)
ON_STN_CLICKED(IDC_STATICSEL, &CEquipmentMakeDlg::OnStnClickedStaticsel)
ON_STN_CLICKED(IDC_STATICAGN, &CEquipmentMakeDlg::OnStnClickedStaticagn)
ON_BN_CLICKED(IDC_BUTTONTYDF, &CEquipmentMakeDlg::OnBnClickedButtontydf)
ON_BN_CLICKED(IDC_BUTTONHIDEARO, &CEquipmentMakeDlg::OnBnClickedButtonhidearo)
ON_BN_CLICKED(IDC_BUTTONADDNOZ, &CEquipmentMakeDlg::OnBnClickedButtonaddnoz)
ON_WM_MOUSEACTIVATE()
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_WM_MOUSEWHEEL()
ON_WM_SIZE()
ON_BN_CLICKED(IDC_BUTTONMOVEX, &CEquipmentMakeDlg::OnBnClickedButtonmovex)
ON_BN_CLICKED(IDC_BUTTONMOVEY, &CEquipmentMakeDlg::OnBnClickedButtonmovey)
ON_BN_CLICKED(IDC_BUTTONMOVEZ, &CEquipmentMakeDlg::OnBnClickedButtonmovez)
ON_BN_CLICKED(IDC_BUTTONMOVEA, &CEquipmentMakeDlg::OnBnClickedButtonmovea)
ON_BN_CLICKED(IDC_BUTTONROTX, &CEquipmentMakeDlg::OnBnClickedButtonrotx)
ON_BN_CLICKED(IDC_BUTTONROTY, &CEquipmentMakeDlg::OnBnClickedButtonroty)
ON_BN_CLICKED(IDC_BUTTONROTZ, &CEquipmentMakeDlg::OnBnClickedButtonrotz)
ON_BN_CLICKED(IDC_BUTTONROTA, &CEquipmentMakeDlg::OnBnClickedButtonrota)
ON_BN_CLICKED(IDC_BUTTONSAVEFILE, &CEquipmentMakeDlg::OnBnClickedButtonsavefile)
ON_BN_CLICKED(IDC_BUTTONUSERDATA, &CEquipmentMakeDlg::OnBnClickedButtonuserdata)
ON_BN_CLICKED(IDC_BUTTONOPEN, &CEquipmentMakeDlg::OnBnClickedButtonopen)
ON_BN_CLICKED(IDC_BUTTONPUBLIC, &CEquipmentMakeDlg::OnBnClickedButtonpublic)
ON_NOTIFY(NM_RCLICK, IDC_TREEEQUIP, &CEquipmentMakeDlg::OnNMRclickTreeequip)
ON_BN_CLICKED(IDC_BTSHOWX, &CEquipmentMakeDlg::OnBnClickedBtshowx)
ON_BN_CLICKED(IDC_BTSHOWY, &CEquipmentMakeDlg::OnBnClickedBtshowy)
ON_BN_CLICKED(IDC_BTSHOWZ, &CEquipmentMakeDlg::OnBnClickedBtshowz)
ON_NOTIFY(NM_DBLCLK, IDC_TREEEQUIP, &CEquipmentMakeDlg::OnNMDblclkTreeequip)
ON_BN_CLICKED(IDC_SAVETODB, &CEquipmentMakeDlg::OnBnClickedSavetodb)
ON_BN_CLICKED(IDC_BTSHOWX2, &CEquipmentMakeDlg::OnBnClickedBtshowx2)
ON_BN_CLICKED(IDC_BTSHOWY2, &CEquipmentMakeDlg::OnBnClickedBtshowy2)
ON_BN_CLICKED(IDC_BTSHOWZ2, &CEquipmentMakeDlg::OnBnClickedBtshowz2)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BUTTONMOVEPOINT, &CEquipmentMakeDlg::OnBnClickedButtonMovePoint)
ON_BN_CLICKED(IDC_BUTTONRVT, &CEquipmentMakeDlg::OnBnClickedButtonRvt)
ON_BN_CLICKED(IDC_BUTTONSWEEP, &CEquipmentMakeDlg::OnBnClickedButtonSweep)
ON_BN_CLICKED(IDC_BUTTONLOFT, &CEquipmentMakeDlg::OnBnClickedButtonLoft)
ON_WM_SHOWWINDOW()
ON_BN_CLICKED(IDC_BUTTON_START, &CEquipmentMakeDlg::OnBnClickedButtonStart)
ON_BN_CLICKED(IDC_BUTTON_NEXT, &CEquipmentMakeDlg::OnBnClickedButtonNext)
ON_BN_CLICKED(IDC_BUTTON_PREV, &CEquipmentMakeDlg::OnBnClickedButtonPrev)
ON_BN_CLICKED(IDC_BUTTON_END, &CEquipmentMakeDlg::OnBnClickedButtonEnd)
ON_BN_CLICKED(IDC_BUTTONSAVE, &CEquipmentMakeDlg::OnBnClickedButtonsave)
ON_MESSAGE(WM_REFRESH_HLIGHT_ENTITY_MESSAGE, &CEquipmentMakeDlg::OnRefreshHlightEntityMsg)
ON_NOTIFY(NM_CLICK, IDC_TREEEQUIP, &CEquipmentMakeDlg::OnNMClickTreeequip)
ON_BN_CLICKED(IDC_BUTTONCOPY, &CEquipmentMakeDlg::OnBnClickedButtoncopy)
ON_BN_CLICKED(IDC_BUTTONMIRR, &CEquipmentMakeDlg::OnBnClickedButtonmirr)
ON_BN_CLICKED(IDC_BUTTONEQU, &CEquipmentMakeDlg::OnBnClickedButtonins)
ON_BN_CLICKED(IDC_BUTTONNAME, &CEquipmentMakeDlg::OnBnClickedButtonname)
ON_BN_CLICKED(IDC_BUTTONCLOSE, &CEquipmentMakeDlg::OnBnClickedButtonClose)
ON_BN_CLICKED(IDC_BUTTONLOADDWG, &CEquipmentMakeDlg::OnBnClickedButtonLoadDWG)
END_MESSAGE_MAP()
LONG_PTR CEquipmentMakeDlg::onAcadKeepFocus( UINT_PTR, LONG_PTR)
{
POINT pt;
::GetCursorPos(&pt);
CRect rect;
GetWindowRect(&rect);
if(!(rect.PtInRect(pt)))
{
return FALSE;
}
//如果当前有命令在执行中,提示
struct resbuf rb;
acedGetVar(_T("CMDNAMES"),&rb);
if (rb.restype == RTSTR && rb.resval.rstring != NULL)
{
if (_tcslen(rb.resval.rstring) > 0)
{
#if ARX > 19
CoreTools::sendKeyToCADView(VK_ESCAPE);
#else
acedPostCommand(_T("\x03"));
#endif
}
}
return TRUE;
}
void CEquipmentMakeDlg::SetAdoDb(CUIISQLiteServer *pDb)
{
m_pDb = pDb;
}
BOOL CEquipmentMakeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CBitmap bmpBtn, bmpTree;
if (!bmpBtn.LoadBitmap (IDB_EQU_MAKE))
{
AfxMessageBox(_T ("Can't load bitmap: %x\n"), IDB_EQU_MAKE);
ASSERT (FALSE);
return FALSE;
}
if (!bmpTree.LoadBitmap (IDB_BITMAPPRIV ))
{
AfxMessageBox(_T ("Can't load bitmap: %x\n"), IDB_BITMAPPRIV);
ASSERT (FALSE);
return FALSE;
}
BITMAP bmpObjBtn, bmpObjTree;
bmpBtn.GetBitmap (&bmpObjBtn);
bmpTree.GetBitmap (&bmpObjTree);
UINT nFlags = ILC_COLOR24 | ILC_MASK;
m_ImageTreelist.Create (16, bmpObjTree.bmHeight, nFlags, 0, 0);
m_ImageTreelist.Add (&bmpTree, RGB (255, 0, 0));
m_wndEquipPrmTree.SetImageList(&m_ImageTreelist,TVSIL_NORMAL);
m_ImageBtnlist.Create(32, bmpObjBtn.bmHeight, nFlags, 0, 0);
m_ImageBtnlist.Add (&bmpBtn, RGB (255, 0, 0));
m_wndBtBox.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_BOX));
m_wndBtCln.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_CLN));
m_wndBtCone.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_CON));
m_wndBtPyrm.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_PRM));
m_wndBtSpere.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_SPE));
m_wndBtDish.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_DIS));
m_wndBtCirtor.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_CIT));
m_wndBtRector.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_RCT));
m_wndBtTydf.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_TYDF));
m_wndBtExtru.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_EXTRU));
m_wndBtRevo.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_REVOL));
m_wndBtSweep.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_SWEEP));
m_wndBtLoft.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_LOFT));
m_wndBtRvt.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_RVT));
m_wndBtEqu.SetIcon(m_ImageBtnlist.ExtractIcon(SUB_BTN_EQU));
m_wndBtShowX.SetIcon(m_ImageTreelist.ExtractIcon(SUB_TREE_X));
m_wndBtShowY.SetIcon(m_ImageTreelist.ExtractIcon(SUB_TREE_Y));
m_wndBtShowZ.SetIcon(m_ImageTreelist.ExtractIcon(SUB_TREE_Z));
m_wndBtShowX2.SetIcon(m_ImageTreelist.ExtractIcon(SUB_TREE_X));
m_wndBtShowY2.SetIcon(m_ImageTreelist.ExtractIcon(SUB_TREE_Y));
m_wndBtShowZ2.SetIcon(m_ImageTreelist.ExtractIcon(SUB_TREE_Z));
std::set<int> exp;
exp.insert(IDC_BUTTON_NEXT);
exp.insert(IDC_BUTTON_PREV);
exp.insert(IDC_BUTTON_END);
enableWindows(true, exp);
//搜AecDbEwEquipmentImp
ShowWEquipmentOnTree();
return TRUE;
}
int CEquipmentMakeDlg::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
int status = CDialog::OnMouseActivate(pDesktopWnd, nHitTest, message);
SetFocus();
return status;
}
void CEquipmentMakeDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
//m_scrollHelper->OnHScroll(nSBCode, nPos, pScrollBar);
}
void CEquipmentMakeDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
//m_scrollHelper->OnVScroll(nSBCode, nPos, pScrollBar);
}
BOOL CEquipmentMakeDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
//BOOL wasScrolled = m_scrollHelper->OnMouseWheel(nFlags, zDelta, pt);
//return wasScrolled;
return TRUE;
}
void CEquipmentMakeDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
//m_scrollHelper->OnSize(nType, cx, cy);
}
void CEquipmentMakeDlg::OnBnClickedOk()
{
AcAxDocLock lock;
deleteEntity(m_HligthtID, true);
}
void CEquipmentMakeDlg::OnBnClickedCancle()
{
AcAxDocLock lock;
deleteEntity(m_HligthtID, true);
CDialog::OnCancel();
}
void CEquipmentMakeDlg::ShowWEquipmentOnTree()
{
AcDbDatabase* pDb = acdbCurDwg();
if (!pDb)
{
AfxMessageBox(_T("当前文档无效。"));
return;
}
AcAxDocLock lock;
m_wndEquipPrmTree.DeleteAllItems();
m_idBuffer.clear();
HTREEITEM hRoot = NULL;
OPENOBJ_BEGIN(m_MainID, AcDb::kForWrite, AecDbEwEquipment, pWEquip)
if (pWEquip)
{
// 在这里缓存一下设备里面几何体的ID
std::vector<AecEqui::XPrimData*> arRepeats;
for (int i(0); i < pWEquip->GetSubPrimObjCount(); ++i)
{
AecEqui::XPrimData *p = pWEquip->GetSubPrimObj(i);
if (p)
{
std::pair<std::set<int>::iterator, bool> pr = m_idBuffer.insert(p->m_nID);
if (!pr.second) // 说明存在重复的
{ // 把重复的指针记录下来,一起修改
arRepeats.push_back(p);
}
}
}
// 修改重复id的几何体,让他们的id唯一
if (!arRepeats.empty())
{
for (size_t i(0); i < arRepeats.size(); ++i)
{
AecEqui::XPrimData *p(arRepeats[i]);
p->m_nID = *m_idBuffer.rbegin() + 1;
m_idBuffer.insert(p->m_nID);
}
}
hRoot = refreshTree(pWEquip, m_wndEquipPrmTree);
}
OPENOBJ_END()
if (hRoot != NULL) m_wndEquipPrmTree.Expand(hRoot, TVE_EXPAND);
}
void CEquipmentMakeDlg::OnBnClickedBtneweqp()
{
AcDbDatabase* pDb = acdbCurDwg();
if (!pDb)
{
AfxMessageBox(_T("当前文档无效。"));
return;
}
AcAxDocLock lock;
CString sName(_T("设备元件1"));
AcDbObjectId id(GetEquIDByTree());
if (!id.isValid())
{
m_wndEquipPrmTree.DeleteAllItems();
}
else
{
int nRes = 0;
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount > 0)
{
nRes = AfxMessageBox(_T("当前发现设备元件!是否在当前设备元件上重新设计?"), MB_YESNO);
if (nRes == IDNO)
{
return;
}
else
{
sName = m_sName;
m_wndEquipPrmTree.DeleteAllItems();
AcDbEntity *pEnt(NULL);
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite))
{
pEnt->erase();
pEnt->close();
}
}
}
}
//弹出名称
if (!CoreTools::getNameByDialog(_T("请输入名称"), _T("名称:"), sName)) return;
m_sName = sName;
if (!CoreTools::checkFileName(m_sName))
{
AfxMessageBox(_T("请检查设备名称,不能出现“ \\/:*?\"<>| ”。"));
return;
}
AecDbEwEquipment* pWEquip = new AecDbEwEquipment;
AecDbObjXDataMap* pXDataMap = pWEquip->GetSpecialtyData();
pXDataMap->SetAt(KEY_NAME, m_sName);
pXDataMap->SetAt(KEY_FITSRV, KEY_FITWPIPE);
pXDataMap->SetAt(KEY_RUNTIME, eEquipment);
//pWEquip->ReCreateByXDataMap();
//设置图层
CString sSys;
pXDataMap->GetAt(PIPE_SYS,sSys);
AcDbObjectId idLayer = CoreTools::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));
//pWEquip->setColorIndex();
id = CoreTools::AddToModelSpace(pWEquip);
HTREEITEM hRoot = m_wndEquipPrmTree.InsertItem(m_sName, EQP_TREE_ROOT, EQP_TREE_ROOT);
m_wndEquipPrmTree.SetItemData(hRoot, (DWORD_PTR)id.asOldId());
m_MainID = id;
}
void CEquipmentMakeDlg::Test()
{
}
//添加3d图元体
void CEquipmentMakeDlg::OnBnClickedButtonbox()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
CAcModuleResourceOverride myResources;
CBoxDlg boxDlg;
int nRes = boxDlg.DoModal();
if (nRes == IDOK)
{
AcGePoint3d ptIns(AcGePoint3d::kOrigin);
if (!getInsertPt(this, ptIns)) return;
AecEqui::XBox box;
box.dL = boxDlg.m_dX;
box.dW = boxDlg.m_dY;
box.dH = boxDlg.m_dZ;
// AecDb3dSolid* pSolid = new AecDb3dSolid;
// pSolid->SetData(AecEqui::kBox,&box);
AecEqui::XPrimData data;
data.m_eType = AecEqui::kBox;
data.m_iClr = boxDlg.m_clr;
data.m_bBoolSubtract = boxDlg.m_bSub == FALSE ? false : true;
data.m_vtMove = ptIns.asVector();
setData<AecEqui::XBOX>(&data, &box, m_idBuffer);
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id = GetEquIDByTree();
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
pWEqu->AddSubPrimObj(&data);
data.releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAMEBOX + getTreeItemSuffix(data.m_bBoolSubtract)
,SUB_TREE_BOX
,SUB_TREE_BOX
,hRoot);
m_wndEquipPrmTree.SetItemData(hItem,(DWORD_PTR)data.m_nID);
m_wndEquipPrmTree.Expand(hRoot,TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hItem);
}
pEnt->close();
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtoncln()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
CAcModuleResourceOverride myResources;
CCylinderDlg clnDlg;
int nRes = clnDlg.DoModal();
if (nRes == IDOK)
{
AcGePoint3d ptIns(AcGePoint3d::kOrigin);
if (!getInsertPt(this, ptIns)) return;
AecEqui::XCylinder cln;
cln.dr = clnDlg.m_dR;
cln.dH = clnDlg.m_dH;
// AecDb3dSolid* pSolid = new AecDb3dSolid;
// pSolid->SetData(AecEqui::kCylinder,&cln);
AecEqui::XPrimData data;
data.m_eType = AecEqui::kCylinder;
data.m_iClr = clnDlg.m_clr;
data.m_bBoolSubtract = clnDlg.m_bSub == FALSE ? false : true;
data.m_vtMove = ptIns.asVector();
setData<AecEqui::XCYLINDER>(&data, &cln, m_idBuffer);
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id = GetEquIDByTree();
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
pWEqu->AddSubPrimObj(&data);
data.releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAMECLN + getTreeItemSuffix(data.m_bBoolSubtract)
,SUB_TREE_CLN
,SUB_TREE_CLN
,hRoot);
m_wndEquipPrmTree.SetItemData(hItem,(DWORD_PTR)data.m_nID);
m_wndEquipPrmTree.Expand(hRoot,TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hItem);
}
pEnt->close();
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtoncone()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
CAcModuleResourceOverride myResources;
CConeDLg coneDlg;
int nRes = coneDlg.DoModal();
if (nRes == IDOK)
{
AcGePoint3d ptIns(AcGePoint3d::kOrigin);
if (!getInsertPt(this, ptIns)) return;
AecEqui::XCone cone;
memset(&cone,0,sizeof(AecEqui::XCone));
cone.dr = coneDlg.m_dr;
cone.dR = coneDlg.m_dR;
cone.dH = coneDlg.m_dH;
cone.dXOffset = coneDlg.m_dXOffset;
// AecDb3dSolid* pSolid = new AecDb3dSolid;
// pSolid->SetData(AecEqui::kCone,&cone);
AecEqui::XPrimData data;
data.m_eType = AecEqui::kCone;
data.m_iClr = coneDlg.m_clr;
data.m_bBoolSubtract = coneDlg.m_bSub == FALSE ? false : true;
data.m_vtMove = ptIns.asVector();
setData<AecEqui::XCone>(&data, &cone, m_idBuffer);
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
pWEqu->AddSubPrimObj(&data);
data.releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAMECON + getTreeItemSuffix(data.m_bBoolSubtract)
,SUB_TREE_CON
,SUB_TREE_CON
,hRoot);
m_wndEquipPrmTree.SetItemData(hItem,(DWORD_PTR)data.m_nID);
m_wndEquipPrmTree.Expand(hRoot,TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hItem);
}
pEnt->close();
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtonpyrm()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
return;
CAcModuleResourceOverride myResources;
CPyrmDlg coneDlg;
int nRes = coneDlg.DoModal();
if (nRes == IDOK)
{
AcGePoint3d ptIns(AcGePoint3d::kOrigin);
if (!getInsertPt(this, ptIns)) return;
AecEqui::XPyramid cone;
memset(&cone,0,sizeof(AecEqui::XPyramid));
cone.dTX = coneDlg.m_dTx;
cone.dTY = coneDlg.m_dTy;
cone.dBX = coneDlg.m_dBx;
cone.dBY = coneDlg.m_dBy;
cone.dH = coneDlg.m_dTH;
cone.dXOffset = coneDlg.m_dXOffset;
// AecDb3dSolid* pSolid = new AecDb3dSolid;
// pSolid->SetData(AecEqui::kPyramid,&cone);
AecEqui::XPrimData data;
data.m_eType = AecEqui::kPyramid;
data.m_iClr = coneDlg.m_clr;
data.m_bBoolSubtract = coneDlg.m_bSub == FALSE ? false : true;
data.m_vtMove = ptIns.asVector();
setData<AecEqui::XPyramid>(&data, &cone, m_idBuffer);
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
pWEqu->AddSubPrimObj(&data);
data.releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAMEPRM + getTreeItemSuffix(data.m_bBoolSubtract)
,SUB_TREE_PRM
,SUB_TREE_PRM
,hRoot);
m_wndEquipPrmTree.SetItemData(hItem,(DWORD_PTR)data.m_nID);
m_wndEquipPrmTree.Expand(hRoot,TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hItem);
}
pEnt->close();
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtonspere()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
CAcModuleResourceOverride myResources;
CSpereDlg spereDlg;
int nRes = spereDlg.DoModal();
if (nRes == IDOK)
{
AcGePoint3d ptIns(AcGePoint3d::kOrigin);
if (!getInsertPt(this, ptIns)) return;
AecEqui::XSphere sp;
memset(&sp,0,sizeof(AecEqui::XSphere));
sp.dr = spereDlg.m_dR;
// AecDb3dSolid* pSolid = new AecDb3dSolid;
// pSolid->SetData(AecEqui::kSphere,&sp);
AecEqui::XPrimData data;
data.m_eType = AecEqui::kSphere;
data.m_iClr = spereDlg.m_clr;
data.m_bBoolSubtract = spereDlg.m_bSub == FALSE ? false : true;
data.m_vtMove = ptIns.asVector();
setData<AecEqui::XSphere>(&data, &sp, m_idBuffer);
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
pWEqu->AddSubPrimObj(&data);
data.releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAMESPE + getTreeItemSuffix(data.m_bBoolSubtract)
,SUB_TREE_SPE
,SUB_TREE_SPE
,hRoot);
m_wndEquipPrmTree.SetItemData(hItem,(DWORD_PTR)data.m_nID);
m_wndEquipPrmTree.Expand(hRoot,TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hItem);
}
pEnt->close();
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtondish()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
CAcModuleResourceOverride myResources;
CDishDlg dishDlg;
int nRes = dishDlg.DoModal();
if (nRes == IDOK)
{
AcGePoint3d ptIns(AcGePoint3d::kOrigin);
if (!getInsertPt(this, ptIns)) return;
AecEqui::XDish dish;
memset(&dish,0,sizeof(AecEqui::XDish));
dish.dD = dishDlg.m_dD;
dish.dH = dishDlg.m_dH;
// AecDb3dSolid* pSolid = new AecDb3dSolid;
// pSolid->SetData(AecEqui::kDish,&dish);
AecEqui::XPrimData data;
data.m_eType = AecEqui::kDish;
data.m_iClr = dishDlg.m_clr;
data.m_bBoolSubtract = dishDlg.m_bSub == FALSE ? false : true;
data.m_vtMove = ptIns.asVector();
setData<AecEqui::XDish>(&data, &dish, m_idBuffer);
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
pWEqu->AddSubPrimObj(&data);
data.releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAMEDIS + getTreeItemSuffix(data.m_bBoolSubtract)
,SUB_TREE_DIS
,SUB_TREE_DIS
,hRoot);
m_wndEquipPrmTree.SetItemData(hItem,(DWORD_PTR)data.m_nID);
m_wndEquipPrmTree.Expand(hRoot,TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hItem);
}
pEnt->close();
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtoncirtor()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
CAcModuleResourceOverride myResources;
CCirtorDlg cirtorDlg;
int nRes = cirtorDlg.DoModal();
if (nRes == IDOK)
{
AcGePoint3d ptIns(AcGePoint3d::kOrigin);
if (!getInsertPt(this, ptIns)) return;
AecEqui::XCirtorus cirtor;
memset(&cirtor,0,sizeof(AecEqui::XCirtorus));
cirtor.dInr = cirtorDlg.m_dR1;
cirtor.dOutR = cirtorDlg.m_dR2;
cirtor.dStaAngle = cirtorDlg.m_dSAngle * PI / 180.0;
cirtor.dEndAngle = cirtorDlg.m_dEAngle * PI / 180.0;
// AecDb3dSolid* pSolid = new AecDb3dSolid;
// pSolid->SetData(AecEqui::kCirTorus,&cirtor);
AecEqui::XPrimData data;
data.m_eType = AecEqui::kCirTorus;
data.m_iClr = cirtorDlg.m_clr;
data.m_bBoolSubtract = cirtorDlg.m_bSub == FALSE ? false : true;
data.m_vtMove = ptIns.asVector();
setData<AecEqui::XCIRTORUS>(&data, &cirtor, m_idBuffer);
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
pWEqu->AddSubPrimObj(&data);
data.releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAMECIT + getTreeItemSuffix(data.m_bBoolSubtract)
,SUB_TREE_CIT
,SUB_TREE_CIT
,hRoot);
m_wndEquipPrmTree.SetItemData(hItem,(DWORD_PTR)data.m_nID);
m_wndEquipPrmTree.Expand(hRoot,TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hItem);
}
pEnt->close();
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtonrector()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
CAcModuleResourceOverride myResources;
CRecttorDlg rctorDlg;
int nRes = rctorDlg.DoModal();
if (nRes == IDOK)
{
AcGePoint3d ptIns(AcGePoint3d::kOrigin);
if (!getInsertPt(this, ptIns)) return;
AecEqui::XRecttorus rctor;
memset(&rctor,0,sizeof(AecEqui::XRecttorus));
rctor.dInr = rctorDlg.m_dR1;
rctor.dOutR = rctorDlg.m_dR2;
rctor.dStaAngle = rctorDlg.m_dSAngle * PI / 180.0;
rctor.dEndAngle = rctorDlg.m_dEAngle * PI / 180.0;
rctor.dH = rctorDlg.m_dH;
// AecDb3dSolid* pSolid = new AecDb3dSolid;
// pSolid->SetData(AecEqui::kRectTorus,&rctor);
AecEqui::XPrimData data;
data.m_eType = AecEqui::kRectTorus;
data.m_iClr = rctorDlg.m_clr;
data.m_bBoolSubtract = rctorDlg.m_bSub == FALSE ? false : true;
data.m_vtMove = ptIns.asVector();
setData<AecEqui::XRecttorus>(&data, &rctor, m_idBuffer);
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
pWEqu->AddSubPrimObj(&data);
data.releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAMERCT + getTreeItemSuffix(data.m_bBoolSubtract)
,SUB_TREE_RCT
,SUB_TREE_RCT
,hRoot);
m_wndEquipPrmTree.SetItemData(hItem,(DWORD_PTR)data.m_nID);
m_wndEquipPrmTree.Expand(hRoot,TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hItem);
}
pEnt->close();
}
}
}
//接口面
void CEquipmentMakeDlg::OnBnClickedBtactiveinf()
{
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty())
{
HTREEITEM h = m_wndEquipPrmTree.GetSelectedItem();
if (h)
items.push_back(h);
else
return;
}
if (items.size() != 1) return;
HTREEITEM hItem = items[0];
if (hItem != NULL)
{
int nImage = 0,nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem,nImage,nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
AcDbEntity* pEnt = NULL;
AecDbEwEquipment* pWEqt = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
{
pWEqt = AecDbEwEquipment::cast(pEnt);
if (pWEqt != NULL)
{
AecEqui::XPrimData data;
data.m_nActiveInf = 1;
pWEqt->ModifyPrimData(dwSubID,data,1,FALSE);
}
pEnt->close();
}
acedUpdateDisplay();
}
}
}
void CEquipmentMakeDlg::OnBnClickedBtlocate()
{
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
HTREEITEM hCheck = NULL;
HTREEITEM hSel = NULL;
HTREEITEM hChild = m_wndEquipPrmTree.GetChildItem(hRoot);
while(hChild != NULL)
{
DWORD dwSel = m_wndEquipPrmTree.GetItemData(hChild);
if (dwSel == m_dwIDAgn)
{
hCheck = hChild;
}
if (dwSel == m_dwIDSel)
{
hSel = hChild;
}
hChild = m_wndEquipPrmTree.GetNextSiblingItem(hChild);
}
if (hSel == NULL || hCheck == NULL)
{
AfxMessageBox(_T("没有找到要移动的元素和对齐元素!请确认选择正确!"));
return;
}
if (hSel == hCheck )
{
AfxMessageBox(_T("要移动的元素和对齐元素为同一元素!请重新选择!"));
return;
}
if (hSel == hRoot || hCheck == hRoot)
{
AfxMessageBox(_T("没有找到要移动的元素和对齐元素!请确认选择正确!"));
return;
}
DWORD_PTR dwSelSubID = m_wndEquipPrmTree.GetItemData(hSel);
DWORD_PTR dwChkSubID = m_wndEquipPrmTree.GetItemData(hCheck);
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
AcDbEntity* pEnt = NULL;
AecDbEwEquipment* pWEqt = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
{
pWEqt = AecDbEwEquipment::cast(pEnt);
if (pWEqt != NULL)
{
AecEqui::XPrimData* pData = NULL;
pData = pWEqt->GetSUbPrimObjByID(dwChkSubID);
pWEqt->ModifyPrimData(dwSelSubID,*pData,5,TRUE);
}
pEnt->close();
}
acedUpdateDisplay();
}
//数据更新
void CEquipmentMakeDlg::OnBnClickedBtreset()
{
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty()) return;
AcAxDocLock lock;
AcDbObjectId id(GetEquIDByTree());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pWEqt)
if (pWEqt != NULL)
{
for (size_t i(0); i < items.size(); ++i)
{
HTREEITEM hItem = items[i];
if (!hItem) continue;
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AecEqui::XPrimData data;
data.m_vtMove.set(0.0, 0.0, 0.0);
pWEqt->ModifyPrimData(dwSubID, data, 2, TRUE);
}
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CEquipmentMakeDlg::OnBnClickedBtapply()
{
UpdateData();
HTREEITEM hItem = m_wndEquipPrmTree.GetSelectedItem();
if (hItem != NULL)
{
int nImage = 0,nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem,nImage,nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
AcDbEntity* pEnt = NULL;
AecDbEwEquipment* pWEqt = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
{
pWEqt = AecDbEwEquipment::cast(pEnt);
if (pWEqt != NULL)
{
AecEqui::XPrimData data;
data.m_vtMove.set(m_dXMove,m_dYMove,m_dZMove);
pWEqt->ModifyPrimData(dwSubID,data,2);
if ( fabs(m_dIMove) > 1.e-3)
{
data.m_vtMove.set(m_dIMove,0,0);
pWEqt->ModifyPrimData(dwSubID,data,6);
}
}
pEnt->close();
}
acedUpdateDisplay();
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtonmovex()
{
UpdateData();
Impmove(m_dXMove,X,m_dIMove);
}
void CEquipmentMakeDlg::Impmove(double dMove,int nPos,double dIMove)
{
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty()) return;
AcAxDocLock lock;
AcDbObjectId id(GetEquIDByTree());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pWEqt)
if (pWEqt != NULL)
{
for (size_t i(0); i < items.size(); ++i)
{
HTREEITEM hItem = items[i];
if (!hItem) continue;
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AecEqui::XPrimData data;
data.m_vtMove.set(0.0, 0.0, 0.0);
data.m_vtMove[nPos] = dMove;
pWEqt->ModifyPrimData(dwSubID, data, 2);
if (fabs(dIMove) > 1.e-3)
{
data.m_vtMove.set(dIMove, 0, 0);
pWEqt->ModifyPrimData(dwSubID, data, 6);
}
}
}
}
OPENOBJ_END()
refreshHlightEntity();
}
AcDbObjectId CEquipmentMakeDlg::GetEquIDByTree()
{
AcDbObjectId id(AcDbObjectId::kNull);
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
if (!hRoot) return id;
DWORD_PTR dwXData = m_wndEquipPrmTree.GetItemData(hRoot);
id.setFromOldId((LONG_PTR)dwXData);
if (!id.isValid())
{
return AcDbObjectId::kNull;
}
return id;
}
void CEquipmentMakeDlg::OnBnClickedButtonmovey()
{
UpdateData();
Impmove(m_dYMove,Y,m_dIMove);
}
void CEquipmentMakeDlg::OnBnClickedButtonmovez()
{
UpdateData();
Impmove(m_dZMove,Z,m_dIMove);
}
void CEquipmentMakeDlg::OnBnClickedButtonmovea()
{
UpdateData();
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty()) return;
AcAxDocLock lock;
AcDbObjectId id(GetEquIDByTree());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pWEqt)
if (pWEqt != NULL)
{
for (size_t i(0); i < items.size(); ++i)
{
HTREEITEM hItem = items[i];
if (!hItem) continue;
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AecEqui::XPrimData data;
if (fabs(m_dIMove) > 1.e-3)
{
data.m_vtMove.set(m_dIMove, 0, 0);
pWEqt->ModifyPrimData(dwSubID, data, 6);
}
}
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CEquipmentMakeDlg::OnBnClickedBtapply2()
{
UpdateData();
HTREEITEM hItem = m_wndEquipPrmTree.GetSelectedItem();
if (hItem != NULL)
{
int nImage = 0,nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem,nImage,nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
AcDbEntity* pEnt = NULL;
AecDbEwEquipment* pWEqt = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
{
pWEqt = AecDbEwEquipment::cast(pEnt);
if (pWEqt != NULL)
{
m_dXRot *= PI / 180.0;
m_dYRot *= PI / 180.0;
m_dZRot *= PI / 180.0;
m_dIRot *= PI / 180.0;
AecEqui::XPrimData data;
data.m_ptRotation.set(m_dXRot,m_dYRot,m_dZRot);
pWEqt->ModifyPrimData(dwSubID,data,3);
if ( fabs(m_dIRot) > 1.e-3)
{
data.m_ptRotation.set(m_dIRot,0.0,0.0);
pWEqt->ModifyPrimData(dwSubID,data,7);
}
}
pEnt->close();
}
acedUpdateDisplay();
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtonrotx()
{
UpdateData();
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty()) return;
AcAxDocLock lock;
AcDbObjectId id(GetEquIDByTree());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pWEqt)
if (pWEqt != NULL)
{
m_dXRot *= PI / 180.0;
for (size_t i(0); i < items.size(); ++i)
{
HTREEITEM hItem = items[i];
if (!hItem) continue;
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AecEqui::XPrimData data;
data.m_ptRotation.set(m_dXRot, 0.0, 0.0);
pWEqt->ModifyPrimData(dwSubID, data, 3);
}
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CEquipmentMakeDlg::OnBnClickedBtshowx()
{
AcAxDocLock lock;
HTREEITEM hItem = m_wndEquipPrmTree.GetSelectedItem();
if (hItem != NULL)
{
int nImage = 0,nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem,nImage,nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AcDbObjectId id(GetEquIDByTree());
AcDbEntity* pEnt = NULL;
AecDbEwEquipment* pWEqt = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
{
pWEqt = AecDbEwEquipment::cast(pEnt);
if (pWEqt != NULL)
{
AecEqui::XPrimData data;
pWEqt->ModifyPrimData(dwSubID,data,10);
}
pEnt->close();
}
acedUpdateDisplay();
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtonroty()
{
UpdateData();
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty()) return;
AcAxDocLock lock;
AcDbObjectId id(GetEquIDByTree());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pWEqt)
if (pWEqt != NULL)
{
m_dYRot *= PI / 180.0;
for (size_t i(0); i < items.size(); ++i)
{
HTREEITEM hItem = items[i];
if (!hItem) continue;
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AecEqui::XPrimData data;
data.m_ptRotation.set(0.0, m_dYRot, 0.0);
pWEqt->ModifyPrimData(dwSubID, data, 3);
}
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CEquipmentMakeDlg::OnBnClickedBtshowy()
{
AcAxDocLock lock;
HTREEITEM hItem = m_wndEquipPrmTree.GetSelectedItem();
if (hItem != NULL)
{
int nImage = 0,nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem,nImage,nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AcDbObjectId id(GetEquIDByTree());
AcDbEntity* pEnt = NULL;
AecDbEwEquipment* pWEqt = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
{
pWEqt = AecDbEwEquipment::cast(pEnt);
if (pWEqt != NULL)
{
AecEqui::XPrimData data;
pWEqt->ModifyPrimData(dwSubID,data,11);
}
pEnt->close();
}
acedUpdateDisplay();
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtonrotz()
{
UpdateData();
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty()) return;
AcAxDocLock lock;
AcDbObjectId id(GetEquIDByTree());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pWEqt)
if (pWEqt != NULL)
{
m_dZRot *= PI / 180.0;
for (size_t i(0); i < items.size(); ++i)
{
HTREEITEM hItem = items[i];
if (!hItem) continue;
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AecEqui::XPrimData data;
data.m_ptRotation.set(0.0, 0.0, m_dZRot);
pWEqt->ModifyPrimData(dwSubID, data, 3);
}
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CEquipmentMakeDlg::OnBnClickedBtshowz()
{
AcAxDocLock lock;
HTREEITEM hItem = m_wndEquipPrmTree.GetSelectedItem();
if (hItem != NULL)
{
int nImage = 0,nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem,nImage,nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AcDbObjectId id(GetEquIDByTree());
AcDbEntity* pEnt = NULL;
AecDbEwEquipment* pWEqt = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite))
{
pWEqt = AecDbEwEquipment::cast(pEnt);
if (pWEqt != NULL)
{
AecEqui::XPrimData data;
pWEqt->ModifyPrimData(dwSubID,data,12);
}
pEnt->close();
}
acedUpdateDisplay();
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtonrota()
{
UpdateData();
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty()) return;
AcAxDocLock lock;
AcDbObjectId id(GetEquIDByTree());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pWEqt)
if (pWEqt != NULL)
{
for (size_t i(0); i < items.size(); ++i)
{
HTREEITEM hItem = items[i];
if (!hItem) continue;
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
m_dIRot *= PI / 180.0;
AecEqui::XPrimData data;
if (fabs(m_dIRot) > 1.e-3)
{
data.m_ptRotation.set(m_dIRot, 0.0, 0.0);
pWEqt->ModifyPrimData(dwSubID, data, 7);
}
}
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CEquipmentMakeDlg::OnBnClickedBtreset2()
{
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty()) return;
AcAxDocLock lock;
AcDbObjectId id(GetEquIDByTree());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pWEqt)
if (pWEqt != NULL)
{
for (size_t i(0); i < items.size(); ++i)
{
HTREEITEM hItem = items[i];
if (!hItem) continue;
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AecEqui::XPrimData data;
data.m_ptRotation.set(0.0, 0.0, 0.0);
pWEqt->ModifyPrimData(dwSubID, data, 3, TRUE);
}
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CEquipmentMakeDlg::OnBnClickedBtmodiprm()
{
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty())
{
HTREEITEM h(m_wndEquipPrmTree.GetSelectedItem());
if (h)
items.push_back(h);
else
return;
}
if (items.size() != 1) return;
HTREEITEM hItem = items[0];
if (hItem != NULL)
{
int nImage = 0,nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem,nImage,nSelImg);
CString sItem = m_wndEquipPrmTree.GetItemText(hItem);
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
AecEqui::XPrimData* pPrimData = NULL;
AcDbEntity* pEnt = NULL;
AecDbEwEquipment* pWEqt = NULL;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pWEqt)
{
if (!pWEqt) return;
AecDbObjXDataMap* pXDataMap = pWEqt->GetSpecialtyData();
pPrimData = pWEqt->GetSUbPrimObjByID(dwSubID);
AcGePoint3d ptIns(AcGePoint3d::kOrigin);
AcGeVector3d vtDir(AcGeVector3d::kIdentity);
bool bVert(false);
pWEqt->GetInsert(ptIns, vtDir);
bVert = pWEqt->IsVert();
CAcModuleResourceOverride myResources;
switch (nImage)
{
case SUB_TREE_BOX:
{
CBoxDlg boxDlg;
boxDlg.m_clr = pPrimData->m_iClr;
boxDlg.m_pData = pPrimData->m_pData;
if (boxDlg.DoModal() == IDOK)
{
pPrimData->m_iClr = boxDlg.m_clr;
pPrimData->m_bBoolSubtract = boxDlg.m_bSub == FALSE ? false : true;
pWEqt->clearGeoBuffer();
}
break;
}
case SUB_TREE_CIT:
{
CCirtorDlg cirtorDlg;
cirtorDlg.m_clr = pPrimData->m_iClr;
cirtorDlg.m_pData = pPrimData->m_pData;
if (cirtorDlg.DoModal() == IDOK)
{
pPrimData->m_iClr = cirtorDlg.m_clr;
pPrimData->m_bBoolSubtract = cirtorDlg.m_bSub == FALSE ? false : true;
pWEqt->clearGeoBuffer();
}
break;
}
case SUB_TREE_RCT:
{
CRecttorDlg rctorDlg;
rctorDlg.m_clr = pPrimData->m_iClr;
rctorDlg.m_pData = pPrimData->m_pData;
if (rctorDlg.DoModal() == IDOK)
{
pPrimData->m_iClr = rctorDlg.m_clr;
pPrimData->m_bBoolSubtract = rctorDlg.m_bSub == FALSE ? false : true;
pWEqt->clearGeoBuffer();
}
break;
}
case SUB_TREE_DIS:
{
CDishDlg dishDlg;
dishDlg.m_clr = pPrimData->m_iClr;
dishDlg.m_pData = pPrimData->m_pData;
if (dishDlg.DoModal() == IDOK)
{
pPrimData->m_iClr = dishDlg.m_clr;
pPrimData->m_bBoolSubtract = dishDlg.m_bSub == FALSE ? false : true;
pWEqt->clearGeoBuffer();
}
break;
}
case SUB_TREE_SPE:
{
CSpereDlg spereDlg;
spereDlg.m_clr = pPrimData->m_iClr;
spereDlg.m_pData = pPrimData->m_pData;
if (spereDlg.DoModal() == IDOK)
{
pPrimData->m_iClr = spereDlg.m_clr;
pPrimData->m_bBoolSubtract = spereDlg.m_bSub == FALSE ? false : true;
pWEqt->clearGeoBuffer();
}
break;
}
case SUB_TREE_NOZZ:
{
CNozzDlg nozDlg;
nozDlg.m_clr = pPrimData->m_iClr;
nozDlg.m_pData = pPrimData->m_pData;
if (nozDlg.DoModal() == IDOK)
{
pPrimData->m_iClr = nozDlg.m_clr;
pPrimData->m_bBoolSubtract = false;
pWEqt->clearGeoBuffer();
}
break;
}
case SUB_TREE_TYDF:
{
CTydfDlg tydfDlg;
tydfDlg.m_clr = pPrimData->m_iClr;
tydfDlg.m_pData = pPrimData->m_pData;
if (tydfDlg.DoModal() == IDOK)
{
pPrimData->m_iClr = tydfDlg.m_clr;
pPrimData->m_bBoolSubtract = tydfDlg.m_bSub == FALSE ? false : true;
pWEqt->clearGeoBuffer();
}
break;
}
case SUB_TREE_CLN:
{
CCylinderDlg clnDlg;
clnDlg.m_clr = pPrimData->m_iClr;
clnDlg.m_pData = pPrimData->m_pData;
if (clnDlg.DoModal() == IDOK)
{
pPrimData->m_iClr = clnDlg.m_clr;
pPrimData->m_bBoolSubtract = clnDlg.m_bSub == FALSE ? false : true;
pWEqt->clearGeoBuffer();
}
break;
}
case SUB_TREE_CON:
{
CConeDLg coneDlg;
coneDlg.m_clr = pPrimData->m_iClr;
coneDlg.m_pData = pPrimData->m_pData;
if (coneDlg.DoModal() == IDOK)
{
pPrimData->m_iClr = coneDlg.m_clr;
pPrimData->m_bBoolSubtract = coneDlg.m_bSub == FALSE ? false : true;
pWEqt->clearGeoBuffer();
}
break;
}
case SUB_TREE_PRM:
{
CPyrmDlg coneDlg;
coneDlg.m_clr = pPrimData->m_iClr;
coneDlg.m_pData = pPrimData->m_pData;
if (coneDlg.DoModal() == IDOK)
{
pPrimData->m_iClr = coneDlg.m_clr;
pPrimData->m_bBoolSubtract = coneDlg.m_bSub == FALSE ? false : true;
pWEqt->clearGeoBuffer();
}
break;
}
case SUB_TREE_EXTRU:
{
if (!::IsWindow(g_equXGExtrud::instance().GetSafeHwnd()))
g_equXGExtrud::instance().Create(IDD_DTYG_MODIFY_EXTRUD, this);
if (!g_equXGExtrud::instance().init(pPrimData
, pWEqt->objectId()
, m_HligthtID
, ptIns
, vtDir
, bVert ))
{
g_equXGExtrud::instance().ShowWindow(SW_HIDE);
return;
}
g_equXGExtrud::instance().CenterWindow();
g_equXGExtrud::instance().ShowWindow(SW_SHOW);
break;
}
case SUB_TREE_REVOL:
{
if (!::IsWindow(g_equXGRevolve::instance().GetSafeHwnd()))
g_equXGRevolve::instance().Create(IDD_DTYG_MODIFY_DEF, this);
if (!g_equXGRevolve::instance().init(pPrimData
, pWEqt->objectId()
, m_HligthtID
, ptIns
, vtDir
, bVert ))
{
g_equXGRevolve::instance().ShowWindow(SW_HIDE);
return;
}
g_equXGRevolve::instance().CenterWindow();
g_equXGRevolve::instance().ShowWindow(SW_SHOW);
break;
}
case SUB_TREE_SWEEP:
{
if (sItem.Find(SUB_NAME_SWEEP_R) != -1)
{
AfxMessageBox(_T("从revit导入的扫掠体不能修改!"));
break;
}
if (!::IsWindow(g_equXGSweep::instance().GetSafeHwnd()))
g_equXGSweep::instance().Create(IDD_DTYG_MODIFY_DEF, this);
if (!g_equXGSweep::instance().init(pPrimData
, pWEqt->objectId()
, m_HligthtID
, ptIns
, vtDir
, bVert ))
{
g_equXGSweep::instance().ShowWindow(SW_HIDE);
return;
}
g_equXGSweep::instance().CenterWindow();
g_equXGSweep::instance().ShowWindow(SW_SHOW);
break;
}
case SUB_TREE_LOFT:
{
if (!::IsWindow(g_equXGLoft::instance().GetSafeHwnd()))
g_equXGLoft::instance().Create(IDD_DTYG_MODIFY_LOFT, this);
if (!g_equXGLoft::instance().init(pPrimData
, pWEqt->objectId()
, m_HligthtID
, ptIns
, vtDir
, bVert ))
{
g_equXGLoft::instance().ShowWindow(SW_HIDE);
return;
}
g_equXGLoft::instance().CenterWindow();
g_equXGLoft::instance().ShowWindow(SW_SHOW);
break;
}
case EQP_TREE_ROOT:
{
CString sName = m_wndEquipPrmTree.GetItemText(hRoot);
if (CoreTools::getNameByDialog(_T("请输入名称"), _T("名称:"), sName))
{
pXDataMap->SetAt(KEY_NAME, sName);
m_wndEquipPrmTree.SetItemText(hRoot, sName);
}
break;
}
case SUB_TREE_RVT_COMBIN:
{
AfxMessageBox(_T("从revit导入的组合体不能修改!"));
break;
}
default:
break;
}
}
OPENOBJ_END()
acedUpdateDisplay();
}
}
void CEquipmentMakeDlg::OnBnClickedBtdelprm()
{
if (!m_MainID.isValid()) // 文档已无效
{
AfxMessageBox(_T("当前设备无效!请新建或载入一个新设备。"));
m_wndEquipPrmTree.DeleteAllItems();
}
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty())
{
HTREEITEM h = m_wndEquipPrmTree.GetSelectedItem();
if (h)
items.push_back(h);
else
return;
}
if (AfxMessageBox(_T("此操作不可恢复,确定删除?"), MB_YESNO) != IDYES)
{
return;
}
AcAxDocLock lock;
deleteEntity(m_HligthtID, true);
AcDbObjectId id(GetEquIDByTree());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pWEqt)
if (pWEqt)
{
for (size_t i(0); i < items.size(); ++i)
{
HTREEITEM hItem = items[i];
if (!hItem) continue;
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
pWEqt->RemoveSubPrimObjByID(dwSubID);
m_wndEquipPrmTree.DeleteItem(hItem);
}
}
}
OPENOBJ_END()
acedUpdateDisplay();
}
void CEquipmentMakeDlg::OnDestroy()
{
AcAxDocLock lock;
deleteEntity(m_HligthtID, true);
CDialog::OnDestroy();
}
void CEquipmentMakeDlg::OnTvnSelchangedTreeequip(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
enableMoveRotateUI();
refreshHlightEntity();
acedUpdateDisplay();
*pResult = 0;
}
void CEquipmentMakeDlg::OnBnClickedButtonextru()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
AcAxDocLock lock;
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
if (!id.isValid()) return;
std::vector<AecEqui::XPrimData> datas;
CreateExtrude(datas, m_idBuffer);
if (datas.empty()) return;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pEw)
if (pEw)
{
for (size_t i(0); i < datas.size(); ++i)
{
AecEqui::XPrimData &data(datas[i]);
pEw->AddSubPrimObj(&data);
data.releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAMEEXT + getTreeItemSuffix(data.m_bBoolSubtract)
, SUB_TREE_EXTRU
, SUB_TREE_EXTRU
, hRoot);
m_wndEquipPrmTree.SetItemData(hItem, (DWORD_PTR)data.m_nID);
}
}
OPENOBJ_END()
m_wndEquipPrmTree.Expand(hRoot, TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hRoot);
}
void CEquipmentMakeDlg::OnBnClickedButtonrevo()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
AcAxDocLock lock;
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
if (!id.isValid()) return;
std::vector<AecEqui::XPrimData> datas;
CreateRevolve(datas, m_idBuffer);
if (datas.empty()) return;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pEw)
if (pEw)
{
for (size_t i(0); i < datas.size(); ++i)
{
AecEqui::XPrimData &data(datas[i]);
pEw->AddSubPrimObj(&data);
data.releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAMEREV + getTreeItemSuffix(data.m_bBoolSubtract)
, SUB_TREE_REVOL
, SUB_TREE_REVOL
, hRoot);
m_wndEquipPrmTree.SetItemData(hItem, (DWORD_PTR)data.m_nID);
}
}
OPENOBJ_END()
m_wndEquipPrmTree.Expand(hRoot, TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hRoot);
}
void CEquipmentMakeDlg::OnBnClickedBtundolocate()
{
AcAxDocLock lock;
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
if (hRoot != NULL)
{
AcDbObjectId id(GetEquIDByTree());
Acad::ErrorStatus es;
AcDbEntity* pEntT = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEntT,id,AcDb::kForWrite) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEntT);
if (pWEqu != NULL)
{
AecEqui::XPrimData data;
HTREEITEM hChild = m_wndEquipPrmTree.GetSelectedItem();
if (hChild != NULL)
{
int nImage = 0,nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hChild,nImage,nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hChild);
pWEqu->ModifyPrimData(dwSubID,data,9,FALSE);
}
}
}
pEntT->close();
}
}
acedUpdateDisplay();
}
void CEquipmentMakeDlg::OnBnClickedButtonreload()
{
AcDbDatabase* pDb = acdbCurDwg();
if (!pDb)
{
AfxMessageBox(_T("当前文档无效。"));
return;
}
CAcModuleResourceOverride myResources;
CEquipmentLibraryDlg dlg(CEquipmentLibraryDlg::eMana);
if (dlg.DoModal() != IDOK) return;
AcAxDocLock lock;
if (m_MainID.isValid())
deleteEntity(m_MainID);
if (m_HligthtID.isValid())
deleteEntity(m_HligthtID);
m_wndEquipPrmTree.DeleteAllItems();
if (dlg.m_iSelectFileID == -1)
{
AfxMessageBox(_T("未选中任何设备!"));
return;
}
AecDbEwEquipment *pEqu = dlg.getEquipment(dlg.m_iSelectFileID);
if (!pEqu)
{
AfxMessageBox(_T("生成设备失败!"));
return;
}
pEqu->SetInsert(AcGePoint3d::kOrigin, AcGeVector3d::kXAxis);
m_MainID = CoreTools::AddToModelSpace(pEqu);
ShowWEquipmentOnTree();
}
void CEquipmentMakeDlg::OnBnClickedBtselasmove()
{
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty())
{
HTREEITEM h = m_wndEquipPrmTree.GetSelectedItem();
if (h)
items.push_back(h);
else
return;
}
if (items.size() != 1) return;
HTREEITEM hItem = items[0];
if (hItem != NULL)
{
int nImage = 0,nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem,nImage,nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
m_dwIDSel = m_wndEquipPrmTree.GetItemData(hItem);
CString sText;
sText = m_wndEquipPrmTree.GetItemText(hItem);
GetDlgItem(IDC_STATICSEL)->SetWindowText(sText);
}
}
}
void CEquipmentMakeDlg::OnBnClickedBtselasalign()
{
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty())
{
HTREEITEM h = m_wndEquipPrmTree.GetSelectedItem();
if (h)
items.push_back(h);
else
return;
}
if (items.empty()) return;
HTREEITEM hItem = items[0];
if (hItem != NULL)
{
int nImage = 0,nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem,nImage,nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
m_dwIDAgn = m_wndEquipPrmTree.GetItemData(hItem);
CString sText;
sText = m_wndEquipPrmTree.GetItemText(hItem);
GetDlgItem(IDC_STATICAGN)->SetWindowText(sText);
}
}
}
void CEquipmentMakeDlg::OnStnClickedStaticsel()
{
if (m_dwIDSel != NULL)
{
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
HTREEITEM hChild = m_wndEquipPrmTree.GetChildItem(hRoot);
while(hChild != NULL)
{
DWORD dwSel = m_wndEquipPrmTree.GetItemData(hChild);
if (dwSel == m_dwIDSel)
{
m_wndEquipPrmTree.SelectItem(hChild);
break;
}
hChild = m_wndEquipPrmTree.GetNextSiblingItem(hChild);
}
}
}
void CEquipmentMakeDlg::OnStnClickedStaticagn()
{
if (m_dwIDAgn != NULL)
{
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
HTREEITEM hChild = m_wndEquipPrmTree.GetChildItem(hRoot);
while(hChild != NULL)
{
DWORD dwSel = m_wndEquipPrmTree.GetItemData(hChild);
if (dwSel == m_dwIDAgn)
{
m_wndEquipPrmTree.SelectItem(hChild);
break;
}
hChild = m_wndEquipPrmTree.GetNextSiblingItem(hChild);
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtontydf()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
CAcModuleResourceOverride myResources;
CTydfDlg tydfDlg;
int nRes = tydfDlg.DoModal();
if (nRes == IDOK)
{
AcGePoint3d ptIns(AcGePoint3d::kOrigin);
if (!getInsertPt(this, ptIns)) return;
AecEqui::XTydf tydef;
tydef.dTR = tydfDlg.m_dR;
tydef.dTL = tydfDlg.m_dL;
tydef.dH = tydfDlg.m_dH;
tydef.dTW = tydfDlg.m_dW;
tydef.dXOffset = tydfDlg.m_dXOffset;
// AecDb3dSolid* pSolid = new AecDb3dSolid;
// pSolid->SetData(AecEqui::kTydf,&tydef);
AecEqui::XPrimData data;
data.m_eType = AecEqui::kTydf;
data.m_iClr = tydfDlg.m_clr;
data.m_bBoolSubtract = tydfDlg.m_bSub == FALSE ? false : true;
data.m_vtMove = ptIns.asVector();
setData<AecEqui::XTydf>(&data, &tydef, m_idBuffer);
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
pWEqu->AddSubPrimObj(&data);
data.releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAMETYDF + getTreeItemSuffix(data.m_bBoolSubtract)
,SUB_TREE_TYDF
,SUB_TREE_TYDF
,hRoot);
m_wndEquipPrmTree.SetItemData(hItem,(DWORD_PTR)data.m_nID);
m_wndEquipPrmTree.Expand(hRoot,TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hItem);
}
pEnt->close();
}
}
}
void CEquipmentMakeDlg::OnBnClickedButtonhidearo()
{
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
AecEqui::XPrimData data;
pWEqu->ModifyPrimData(0,data,10);
}
pEnt->recordGraphicsModified();
pEnt->close();
}
acedUpdateDisplay();
}
bool CEquipmentMakeDlg::PickHitPoint(DWORD dwSubiD,AcGeVector3d& vtMove,AcGeVector3d& vtDir)
{
bool bGet = false;
ads_point pt,pt2,pt3;
int nRes = acedGetPoint(NULL, _T("\n请在设备需要加管嘴的地方选一点:"), pt);
if (nRes == RTNORM)
{
acdbUcs2Wcs(pt, pt2, false);
vtMove = asVec3d(pt2);
bGet = true;
acedInitGet(RSG_OTHER, _T("X Y Z A B C"));
nRes = acedGetPoint(pt, _T("\n请选择管嘴方向(X/Y/Z/-X:A/-Y:B/-Z:C):"), pt3);
switch (nRes)
{
case RTNORM:
{
vtDir = asPnt3d(pt3) - asPnt3d(pt);
vtDir.normalize();
break;
}
case RTKWORD:
{
TCHAR szKey[6];
szKey[0] = '0';
acedGetInput(szKey);
switch (szKey[0])
{
case _T('X'):
{
vtDir.set(1, 0, 0);
break;
}
case _T('Y'):
{
vtDir.set(0, 1, 0);
break;
}
case _T('Z'):
{
vtDir.set(0, 0, 1);
break;
}
case _T('A'):
{
vtDir.set(-1, 0, 0);
break;
}
case _T('B'):
{
vtDir.set(0, -1, 0);
break;
}
case _T('C'):
{
vtDir.set(0, 0, -1);
break;
}
default:
break;
}
}
default:
break;
}
//精确的做法 每个单元创建为body,然后使用body::closestPointOnBody 定位
}
return bGet;
}
void CEquipmentMakeDlg::OnBnClickedButtonaddnoz()
{
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.size() != 1) return;
HTREEITEM hItem = items[0];
if (hItem != NULL)
{
int nImage = 0,nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem,nImage,nSelImg);
DWORD dwSubiD = m_wndEquipPrmTree.GetItemData(hItem);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
AcGeVector3d vtDir(0,0,0);
AcGePoint3d ptGe(0,0,0);
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
AecEqui::XPrimData* pPrimData = pWEqu->GetSUbPrimObjByID(dwSubiD);
if (pPrimData->m_nActiveInf == -1)
{
pEnt->close();
//AfxMessageBox(_T("选择的元素的接口面方向没有激活!请拾取点加gui'z!"));
}
//得到当前的接口位置和方向
pWEqu->GetInfFaceInf(pPrimData,vtDir,ptGe);
}
pEnt->close();
}
AcGeVector3d vtMove;
if (vtDir.isZeroLength())
{
if (!PickHitPoint(dwSubiD,vtMove,vtDir))
{
return;
}
vtDir.negate();
ptGe.set(vtMove.x, vtMove.y, vtMove.z);
}
//方口,圆口
CAcModuleResourceOverride myResources;
CNozzDlg dlg;
int nRes = dlg.DoModal();
if (nRes == IDOK)
{
AecEqui::XNozz* pNozzData = dlg.GetNozzData();
AddNozz(dwSubiD, vtDir,ptGe,pNozzData, dlg.m_clr);
}
}
}
}
void CEquipmentMakeDlg::AddNozz(DWORD dwSubiD, AcGeVector3d& vtDir, AcGePoint3d& ptGe, AecEqui::XNozz* pNozzData, const int &clr)
{
AecEqui::XPrimData data;
data.m_eType = AecEqui::kNozz;
data.m_iClr = clr;
setData<AecEqui::XNozz>(&data, pNozzData, m_idBuffer);
data.m_nActiveInf = 0;
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
CoreTools::addNozzForEqu(pWEqu, vtDir, ptGe, data);
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAMENOZZ + getTreeItemSuffix(data.m_bBoolSubtract)
,SUB_TREE_NOZZ
,SUB_TREE_NOZZ
,hRoot);
m_wndEquipPrmTree.SetItemData(hItem,(DWORD_PTR)data.m_nID);
m_wndEquipPrmTree.Expand(hRoot,TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hItem);
}
pEnt->close();
}
}
void CEquipmentMakeDlg::OnBnClickedButtonsavefile()
{
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
if (hRoot == NULL)
{
AfxMessageBox(_T("当前没有设备元件设计数据保存!"));
return;
}
//先关闭箭头
OnBnClickedButtonhidearo();
if (!acDocManager->curDocument()) return;
AcAxDocLock lock;
const TCHAR *pszDwgFile = acDocManager->curDocument()->fileName();
CString sEquFile = pszDwgFile;
CString sFaceDwg = pszDwgFile;
sEquFile.MakeLower();
sEquFile.Replace(_T(".dwg"), _T(".equ"));
CFileDialog dlg(FALSE, NULL, (LPCTSTR)sEquFile, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("通用设备元件设计文件(*.equ)|*.equ|All Files (*.*)|*.*||"));
int nRes = dlg.DoModal();
if (nRes == IDOK)
{
sEquFile = dlg.GetPathName();
//保存
SaveEquipFile(sEquFile);
AfxMessageBox(_T("成功保存设备元件定义数据到本地文件!"));
}
}
BOOL CEquipmentMakeDlg::SaveEquipFile(LPCTSTR pszFile)
{
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
if (hRoot == NULL)
{
AfxMessageBox(_T("当前没有设备元件设计数据保存!"));
return FALSE;
}
AcDbObjectId id(GetEquIDByTree());
DWORD_PTR dwXData = m_wndEquipPrmTree.GetItemData(hRoot);
if (dwXData == 0)
{
AfxMessageBox(_T("当前没有设备元件设计数据保存!"));
return FALSE;
}
CString sText = m_wndEquipPrmTree.GetItemText(hRoot);
return CoreTools::equipment2File(id, pszFile, sText) ? TRUE : FALSE;
}
void CEquipmentMakeDlg::OnBnClickedButtonopen()
{
AcDbDatabase* pDb = acdbCurDwg();
if (!pDb)
{
AfxMessageBox(_T("当前文档无效。"));
return;
}
CFileDialog dlg( TRUE, NULL,NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("通用设备元件设计文件(*.equ)|*.equ|All Files (*.*)|*.*||"));
if (dlg.DoModal() != IDOK) return;
AcAxDocLock lock;
if (m_MainID.isValid())
deleteEntity(m_MainID);
if (m_HligthtID.isValid())
deleteEntity(m_HligthtID);
m_wndEquipPrmTree.DeleteAllItems();
AecDbEwEquipment *pEw = new AecDbEwEquipment();
if (!CoreTools::file2Equipment(pEw, dlg.GetPathName(), &m_sName)) return;
m_MainID = CoreTools::AddToModelSpace(pEw);
ShowWEquipmentOnTree();
}
void CEquipmentMakeDlg::OnBnClickedButtonLoadDWG()
{
ShowWindow(SW_HIDE);
//选择
struct resbuf* pRb = acutBuildList(RTDXF0, _T("AEC_DBWEQUIPMENT"), 0);
ads_name ssSet,adsEnt;
int nRes = acedSSGet(_T(":S"),NULL,NULL,pRb, ssSet);
acutRelRb(pRb);
if (nRes == RTNORM)
{
Adesk::Int32 lLen = 0;
acedSSLength(ssSet, &lLen);
if (lLen == 0)
{
acedAlert(_T("没有选择到设备!"));
ShowWindow(SW_SHOW);
return;
}
acedSSName(ssSet, 0, adsEnt);
acedSSFree(ssSet);
AcDbObjectId id;
acdbGetObjectId(id,adsEnt);
if (m_MainID.isValid())
deleteEntity(m_MainID);
if (m_HligthtID.isValid())
deleteEntity(m_HligthtID);
m_wndEquipPrmTree.DeleteAllItems();
m_HligthtID.setNull();
m_MainID = id;
ShowWEquipmentOnTree();
}
ShowWindow(SW_SHOW);
}
void CEquipmentMakeDlg::OnBnClickedButtonuserdata()
{
CAcModuleResourceOverride myResources;
CMapStringToString mapData;
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
if (hRoot == NULL)
{
AfxMessageBox(_T("当前没有设备元件设计数据!"));
return;
}
AcDbObjectId id(GetEquIDByTree());
DWORD_PTR dwXData = m_wndEquipPrmTree.GetItemData(hRoot);
if (dwXData == 0)
{
AfxMessageBox(_T("当前没有设备元件设计数据!"));
return;
}
AcAxDocLock lock;
SH_BIM_BLOCK bims;
Acad::ErrorStatus es;
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
CoreTools::getBimDatas(pWEqu, bims);
}
pEnt->close();
}
CUserDataDlg userDlg(1);
userDlg.SetUserData(bims);
int nRes = userDlg.DoModal();
if (nRes == IDOK)
{
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) ) )
{
AecDbEwEquipment* pWEqu = AecDbEwEquipment::cast(pEnt);
if (pWEqu != NULL)
{
userDlg.GetUserData(bims);
CoreTools::setBimDatas(pWEqu, bims);
}
pEnt->close();
}
}
}
void CEquipmentMakeDlg::OnNMRclickTreeequip(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint point,ptcursor;
::GetCursorPos(&point);
ptcursor = point;
m_wndEquipPrmTree.ScreenToClient(&point);
UINT uFlags;
HTREEITEM hItem = m_wndEquipPrmTree.HitTest(point,&uFlags);
if(hItem != NULL)
{
m_wndEquipPrmTree.SelectItem(hItem);
DoPopularMenu(hItem,ptcursor);
}
*pResult = 0;
}
void CEquipmentMakeDlg::DoPopularMenu(HTREEITEM hItem,CPoint point)
{
CAcModuleResourceOverride myResources;
CMenu menu;
menu.CreatePopupMenu();
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_MODIFY, _T("修改(&M)"));
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_COLOR, _T("颜色(&C)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_DELETE, _T("删除(&D)"));
menu.AppendMenu(MF_SEPARATOR);
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_SELINFFACE,_T("选择当前接口面(&I)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_SHOWHIDEAR,_T("关闭接口面箭头(&H)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_ADDNOZZ, _T("添加管觜(&N)"));
menu.AppendMenu(MF_SEPARATOR);
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_SELASMOVE, _T("选为移动元素(&S)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_SELASALGN, _T("选为对齐元素(&A)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_ELPOSTOINF,_T("元素定位到接口面(&T)"));
menu.AppendMenu(MF_SEPARATOR);
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_SAVELOCAL, _T("保存本地(&L)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_SAVETODB, _T("入库(&Q)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_MODIFY_NAME, _T("改名(&E)"));
int nID = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, point.x, point.y,this);
switch (nID)
{
case ID_COLOR:
{
modifyColor();
break;
}
case ID_MODIFY:
{
OnBnClickedBtmodiprm();
break;
}
case ID_DELETE:
{
OnBnClickedBtdelprm();
break;
}
case ID_SELINFFACE:
{
OnBnClickedBtactiveinf();
break;
}
case ID_SHOWHIDEAR:
{
OnBnClickedButtonhidearo();
break;
}
case ID_ADDNOZZ:
{
OnBnClickedButtonaddnoz();
break;
}
case ID_SELASMOVE:
{
OnBnClickedBtselasmove();
break;
}
case ID_SELASALGN:
{
OnBnClickedBtselasalign();
break;
}
case ID_ELPOSTOINF:
{
OnBnClickedBtlocate();
break;
}
case ID_SAVELOCAL:
{
OnBnClickedButtonsavefile();
break;
}
case ID_SAVETODB:
{
OnBnClickedOk();
break;
}
case ID_MODIFY_NAME:
{
OnBnClickedButtonname();
break;
}
default:
break;
}
}
BOOL CEquipmentMakeDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
#if ARX > 19
struct resbuf rb;
acedGetVar(_T("CMDNAMES"), &rb);
if (rb.restype == RTSTR && rb.resval.rstring != NULL)
{
if (_tcslen(rb.resval.rstring) > 0)
{
CString sCmd(rb.resval.rstring);
sCmd.MakeLower();
if (sCmd.Find(_T("3dforbit")) != -1)
{
CoreTools::sendKeyToCADView(VK_ESCAPE);
return TRUE;
}
}
}
#endif
switch (LOWORD(wParam))
{
case IDOK:
return TRUE;
default:
break;
}
return CDialog::OnCommand(wParam, lParam);
}
void CEquipmentMakeDlg::OnNMDblclkTreeequip(NMHDR *pNMHDR, LRESULT *pResult)
{
OnBnClickedBtmodiprm();
*pResult = 0;
}
//发布
void CEquipmentMakeDlg::OnBnClickedButtonpublic()
{
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
if (hRoot == NULL)
{
AfxMessageBox(_T("当前没有设备元件设计数据保存!"));
return;
}
}
void CEquipmentMakeDlg::OnBnClickedSavetodb()
{
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
if (hRoot == NULL)
{
AfxMessageBox(_T("当前没有设备元件设计数据保存!"));
return;
}
DWORD_PTR dwXData = m_wndEquipPrmTree.GetItemData(hRoot);
if (dwXData == 0)
{
AfxMessageBox(_T("当前没有设备元件设计数据保存!"));
return;
}
int nRes = AfxMessageBox(_T("确认设备安装对称点是原点吗?"),MB_YESNO);
if (nRes == IDNO)
{
return;
}
CString sEquName = m_wndEquipPrmTree.GetItemText(hRoot);
if (CEquipmentLibraryDlg::saveEquToDb(GetEquIDByTree(), sEquName))
AfxMessageBox(_T("设备入库成功!"));
else
AfxMessageBox(_T("设备入库失败!"));
}
void CEquipmentMakeDlg::OnBnClickedButtonRvt()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
CAcModuleResourceOverride myResources;
CFileDialog dlg(TRUE
, _T("r2p")
, NULL
, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
, _T("r2p (*.r2p)|*.r2p||"));
if (dlg.DoModal() != IDOK) return;
std::wstring json;
ParseRevitFamily::parseFile2String(dlg.GetPathName(), json);
if (json.empty()) return;
SH_BIM_BLOCK bims;
ParseRevitFamily::parseBimDatas(json, bims);
CPtrArray ar;
ParseRevitFamily::parseJson(json, ar);
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pEw)
if (pEw)
{
CString sKeyName(_T("未知"));
for (int i(0); i < ar.GetCount(); ++i)
{
AecEqui::XPrimData *pX((AecEqui::XPrimData*)ar[i]);
pEw->AddSubPrimObj(pX);
pX->releaseData();
int ico(0);
switch (pX->m_eType)
{
case AecEqui::kNewExtrude:
{
sKeyName = _T("拉伸体");
ico = SUB_TREE_EXTRU;
break;
}
case AecEqui::kNewRevolve:
{
sKeyName = _T("旋转体");
ico = SUB_TREE_REVOL;
break;
}
case AecEqui::kRevitSweep:
{
sKeyName = _T("扫掠体R");
ico = SUB_TREE_SWEEP;
break;
}
case AecEqui::kNewLoft:
{
sKeyName = _T("放样体");
ico = SUB_TREE_LOFT;
break;
}
case AecEqui::kRevitCombination:
{
sKeyName = _T("组合体R");
ico = SUB_TREE_RVT_COMBIN;
break;
}
case AecEqui::kNozz:
{
sKeyName = _T("管嘴");
ico = SUB_TREE_NOZZ;
break;
}
default:
sKeyName = _T("未知实体");
break;
}
if (pX->m_bBoolSubtract)
sKeyName += _T("(-)");
else
sKeyName += _T("(+)");
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(sKeyName, ico, ico, hRoot);
if (hItem)
m_wndEquipPrmTree.SetItemData(hItem, (DWORD_PTR)pX->m_nID);
DELETE_PTR(pX);
}
ar.RemoveAll();
CoreTools::setBimDatas(pEw, bims);
m_wndEquipPrmTree.Expand(hRoot, TVE_EXPAND);
}
OPENOBJ_END()
}
void CEquipmentMakeDlg::OnBnClickedButtonSweep()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
AcAxDocLock lock;
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
if (!id.isValid()) return;
std::vector<AecEqui::XPrimData> datas;
CreateSweep(datas, m_idBuffer);
if (datas.empty()) return;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pEw)
if (pEw)
{
for (size_t i(0); i < datas.size(); ++i)
{
AecEqui::XPrimData &data(datas[i]);
pEw->AddSubPrimObj(&data);
data.releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAME_NEWSWEEP + getTreeItemSuffix(data.m_bBoolSubtract)
, SUB_TREE_SWEEP
, SUB_TREE_SWEEP
, hRoot);
m_wndEquipPrmTree.SetItemData(hItem, (DWORD_PTR)data.m_nID);
}
}
OPENOBJ_END()
m_wndEquipPrmTree.Expand(hRoot, TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hRoot);
}
void CEquipmentMakeDlg::OnBnClickedButtonLoft()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
AcAxDocLock lock;
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
if (!id.isValid()) return;
AecEqui::XPrimData data;
data.m_eType = AecEqui::kUnknownPrim;
CreateLoft(data, m_idBuffer);
if (data.m_eType == AecEqui::kUnknownPrim)
return;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pEw)
if (pEw)
{
pEw->AddSubPrimObj(&data);
data.releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(SUB_NAME_NEWLOFT + getTreeItemSuffix(data.m_bBoolSubtract)
, SUB_TREE_LOFT
, SUB_TREE_LOFT
, hRoot);
m_wndEquipPrmTree.SetItemData(hItem, (DWORD_PTR)data.m_nID);
}
OPENOBJ_END()
m_wndEquipPrmTree.Expand(hRoot, TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hRoot);
}
void CEquipmentMakeDlg::OnBnClickedBtshowx2()
{
OnBnClickedBtshowx();
}
void CEquipmentMakeDlg::OnBnClickedBtshowy2()
{
OnBnClickedBtshowy();
}
void CEquipmentMakeDlg::OnBnClickedBtshowz2()
{
OnBnClickedBtshowz();
}
void CEquipmentMakeDlg::OnClose()
{
// 如果 m_idSolidTemp 有效,则说明在 选择平面状态
if (m_idSolidTemp.isValid()) return;
AcAxDocLock lock;
deleteEntity(m_HligthtID, true);
m_MainID = AcDbObjectId::kNull;
m_wndEquipPrmTree.DeleteAllItems();
this->ShowWindow(SW_HIDE);
}
void CEquipmentMakeDlg::OnBnClickedButtonMovePoint()
{
ads_point pt1,pt2;
int nRes = acedGetPoint(NULL,_T("\n请选择基点:"),pt1);
if (nRes == RTNORM)
{
acutPrintf(_T("\n基点(%.3f, %.3f, %.3f)"), pt1[0], pt1[1], pt1[2]);
nRes = acedGetPoint(pt1,_T("\n请选择目标点:"),pt2);
if (nRes == RTNORM)
{
acutPrintf(_T("\n目标点(%.3f, %.3f, %.3f)"), pt2[0], pt2[1], pt2[2]);
//注造族没有用户坐标系
AcGeVector3d vtMove = asPnt3d(pt2) - asPnt3d(pt1);
Impmove(vtMove.x,X,0.0);
Impmove(vtMove.y,Y,0.0);
Impmove(vtMove.z,Z,0.0);
}
}
}
void CEquipmentMakeDlg::enableWindows(bool bEnble, const std::set<int> &exceptions)
{
CWnd *pWnd(this);
int nCtrlID(-1);
CWnd *pChildWnd = pWnd->GetWindow(GW_CHILD);
while (pChildWnd != NULL)
{
nCtrlID = pChildWnd->GetDlgCtrlID();
if (exceptions.find(nCtrlID) == exceptions.end())
{
pChildWnd->EnableWindow(bEnble);
}
else
{
pChildWnd->EnableWindow(!bEnble);
}
pChildWnd = pChildWnd->GetWindow(GW_HWNDNEXT);
}
enableMoveRotateUI();
}
void CEquipmentMakeDlg::enableMoveRotateUI()
{
return;
HTREEITEM hItem = m_wndEquipPrmTree.GetSelectedItem();
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
bool bEnable(true);
if (nImage == SUB_TREE_EXTRU
|| nImage == SUB_TREE_REVOL
|| nImage == SUB_TREE_SWEEP
|| nImage == SUB_TREE_LOFT)
bEnable = false;
CWnd *pWnd(NULL);
pWnd = GetDlgItem(IDC_EDITXMOVE);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_EDITYMOVE);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_EDITZMOVE);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_EDITIMOVE);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BUTTONMOVEX);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BUTTONMOVEY);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BUTTONMOVEZ);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BUTTONMOVEA);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BUTTONMOVEPOINT);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BTSHOWX2);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BTSHOWY2);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BTSHOWZ2);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BTRESET);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_EDITXROT);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_EDITYROT);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_EDITZROT);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_EDITIROT);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BUTTONROTX);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BUTTONROTY);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BUTTONROTZ);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BUTTONROTA);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BTSHOWX);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BTSHOWY);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BTSHOWZ);
if (pWnd) pWnd->EnableWindow(bEnable);
pWnd = GetDlgItem(IDC_BTRESET2);
if (pWnd) pWnd->EnableWindow(bEnable);
}
void CEquipmentMakeDlg::showEntity(bool bShow)
{
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id(GetEquIDByTree());
if (!id.isValid()) return;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pEw)
if (pEw) pEw->setVisibility(bShow ? AcDb::kVisible : AcDb::kInvisible);
OPENOBJ_END()
}
void CEquipmentMakeDlg::refreshHlightEntity()
{
HTREEITEM hItem = m_wndEquipPrmTree.GetSelectedItem();
if (!hItem) return;
if (m_HligthtID.isValid())
{
deleteEntity(m_HligthtID, true);
}
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
if (nImage >= SUB_TREE_BOX && nImage < EQP_TREE_ROOT)
{
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AcDbObjectId id(GetEquIDByTree());
AcAxDocLock lock;
AcDbEntity* pEnt = NULL;
AecDbEwEquipment* pWEqt = NULL;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pWEqt)
if (pWEqt != NULL)
{
AecEqui::XPrimData *pData = pWEqt->GetSUbPrimObjByID(dwSubID);
AcGePoint3d ptIns;
AcGeVector3d vtDir;
pWEqt->GetInsert(ptIns, vtDir);
if (pData)
{
AcDb3dSolid *pSolid = pWEqt->Draw3dSolid(pData, ptIns, vtDir);
if (pSolid)
{
double v;
AcGePoint3d ptC(AcGePoint3d::kOrigin);
double ds[3];
AcGeVector3d vts[3];
AcDbExtents ext;
pSolid->getMassProp(v, ptC, ds, ds, ds, vts, ds, ext);
AcGeMatrix3d mat;
mat.setToScaling(1.01, ptC);
pSolid->transformBy(mat);
pSolid->setColorIndex(6);
CoreTools::AddToModelSpace(pSolid, NULL, true, &m_HligthtID);
acedUpdateDisplay();
}
}
}
OPENOBJ_END()
}
}
bool CEquipmentMakeDlg::getSelectItems(std::vector<HTREEITEM>& items)
{
::getSelectItems(m_wndEquipPrmTree, m_wndEquipPrmTree.GetRootItem(), items);
return !items.empty();
}
void CEquipmentMakeDlg::OnBnClickedButtonStart()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
CheckChildItem(m_wndEquipPrmTree, hRoot, false);
AcDbObjectId id(GetEquIDByTree());
if (!id.isValid()) return;
AcAxDocLock lock;
std::set<int> exp;
exp.insert(IDC_BUTTON_NEXT);
exp.insert(IDC_BUTTON_PREV);
exp.insert(IDC_BUTTON_END);
enableWindows(false, exp);
#ifdef ZWCAD
acedPostCommand(_T("_SHADEMODE _2D "));
#else
acedPostCommand(_T("_vscurrent 2 "));
#endif
do
{
AcDb3dSolid *pSolid = BrepOper::get3DSolidBySH(id);
if (!pSolid) break;
pSolid->setTransparency(.7);
CoreTools::AddToModelSpace(pSolid, NULL, true, &m_idSolidTemp);
if (!m_idSolidTemp.isValid())
{
DELETE_PTR(pSolid);
break;
}
m_SolidSubentIds.clear();
m_SolidGeFaces.removeAll();
AcArray<AcDbSubentId> subids;
BrepOper::getSubPathBySolid(m_idSolidTemp, subids, m_SolidGeFaces);
for (int i(0); i < subids.length(); ++i)
{
m_SolidSubentIds.insert(std::make_pair(subids[i], 256));
}
if (m_SolidSubentIds.empty() || m_SolidGeFaces.isEmpty()) break;
m_iFaceIdx = 0;
showEntity(false);
if (!setFaceClr(m_idSolidTemp, m_SolidSubentIds, m_iFaceIdx, 1)) break;
return;
} while (true);
OPENOBJ_BEGIN(m_idSolidTemp, AcDb::kForWrite, AcDb3dSolid, pSolid)
if (pSolid)
pSolid->erase();
OPENOBJ_END()
showEntity(true);
m_idSolidTemp = AcDbObjectId::kNull;
m_iFaceIdx = 0;
m_SolidSubentIds.clear();
m_SolidGeFaces.removeAll();
AfxMessageBox(_T("提取3dSolid失败!"));
exp.clear();
exp.insert(IDC_BUTTON_NEXT);
exp.insert(IDC_BUTTON_PREV);
exp.insert(IDC_BUTTON_END);
enableWindows(true, exp);
}
void CEquipmentMakeDlg::OnBnClickedButtonNext()
{
// TODO: Add your control notification handler code here
AcAxDocLock lock;
if (++m_iFaceIdx >= m_SolidSubentIds.size()) m_iFaceIdx = 0;
setFaceClr(m_idSolidTemp, m_SolidSubentIds, m_iFaceIdx, 1);
}
void CEquipmentMakeDlg::OnBnClickedButtonPrev()
{
// TODO: Add your control notification handler code here
AcAxDocLock lock;
if (--m_iFaceIdx < 0) m_iFaceIdx = m_SolidSubentIds.size() - 1;
setFaceClr(m_idSolidTemp, m_SolidSubentIds, m_iFaceIdx, 1);
}
void CEquipmentMakeDlg::OnBnClickedButtonEnd()
{
AcAxDocLock lock;
std::set<int> exp;
exp.insert(IDC_BUTTON_NEXT);
exp.insert(IDC_BUTTON_PREV);
exp.insert(IDC_BUTTON_END);
enableWindows(true, exp);
OPENOBJ_BEGIN(m_idSolidTemp, AcDb::kForWrite, AcDb3dSolid, pSolid)
if (pSolid) pSolid->erase();
OPENOBJ_END()
showEntity(true);
if (m_iFaceIdx < m_SolidGeFaces.length())
{
BrepOper::setUCS(m_SolidGeFaces[m_iFaceIdx], false);
//acedPostCommand(_T("plan c "));
}
m_idSolidTemp = AcDbObjectId::kNull;
m_SolidSubentIds.clear();
m_SolidGeFaces.removeAll();
m_iFaceIdx = 0;
}
void CEquipmentMakeDlg::OnBnClickedButtonsave()
{
// TODO: Add your control notification handler code here
}
LRESULT CEquipmentMakeDlg::OnRefreshHlightEntityMsg(WPARAM, LPARAM)
{
refreshHlightEntity();
return 0;
}
void CEquipmentMakeDlg::OnNMClickTreeequip(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint point;
::GetCursorPos(&point);
m_wndEquipPrmTree.ScreenToClient(&point);
UINT uFlags;
HTREEITEM hItem = m_wndEquipPrmTree.HitTest(point, &uFlags), hP(NULL);
if (hItem == NULL) return;
// 判断 uFlags
if (uFlags == TVHT_ONITEMSTATEICON) // check框
{
CheckChildItem(m_wndEquipPrmTree, hItem, !m_wndEquipPrmTree.GetCheck(hItem));
}
m_wndEquipPrmTree.SelectItem(hItem);
*pResult = 0;
}
#define ENABLE_BUTTON(id, empty) pWnd = GetDlgItem(id);\
if (pWnd) pWnd->EnableWindow(empty ? FALSE : TRUE)
LRESULT CEquipmentMakeDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_IDLEUPDATECMDUI)
{
std::vector<HTREEITEM> items;
::getSelectItems(m_wndEquipPrmTree, m_wndEquipPrmTree.GetRootItem(), items);
bool empty(items.empty());
CWnd *pWnd(NULL);
if (items.size() == 1)
{
ENABLE_BUTTON(IDC_BTMODIPRM, false);
ENABLE_BUTTON(IDC_BTSELASMOVE, false);
ENABLE_BUTTON(IDC_BTSELASALIGN, false);
ENABLE_BUTTON(IDC_BTACTIVEINF, false);
ENABLE_BUTTON(IDC_BUTTONADDNOZ, false);
ENABLE_BUTTON(IDC_BTSHOWX2, false);
ENABLE_BUTTON(IDC_BTSHOWY2, false);
ENABLE_BUTTON(IDC_BTSHOWZ2, false);
ENABLE_BUTTON(IDC_BTSHOWX, false);
ENABLE_BUTTON(IDC_BTSHOWY, false);
ENABLE_BUTTON(IDC_BTSHOWZ, false);
}
else
{
ENABLE_BUTTON(IDC_BTMODIPRM, true);
ENABLE_BUTTON(IDC_BTSELASMOVE, true);
ENABLE_BUTTON(IDC_BTSELASALIGN, true);
ENABLE_BUTTON(IDC_BTACTIVEINF, true);
ENABLE_BUTTON(IDC_BUTTONADDNOZ, true);
ENABLE_BUTTON(IDC_BTSHOWX2, true);
ENABLE_BUTTON(IDC_BTSHOWY2, true);
ENABLE_BUTTON(IDC_BTSHOWZ2, true);
ENABLE_BUTTON(IDC_BTSHOWX, true);
ENABLE_BUTTON(IDC_BTSHOWY, true);
ENABLE_BUTTON(IDC_BTSHOWZ, true);
}
ENABLE_BUTTON(IDC_BUTTONMIRR, empty);
ENABLE_BUTTON(IDC_BUTTONCOPY, empty);
ENABLE_BUTTON(IDC_BTDELPRM, empty);
ENABLE_BUTTON(IDC_EDITXMOVE, empty);
ENABLE_BUTTON(IDC_EDITYMOVE, empty);
ENABLE_BUTTON(IDC_EDITZMOVE, empty);
ENABLE_BUTTON(IDC_EDITIMOVE, empty);
ENABLE_BUTTON(IDC_BUTTONMOVEX, empty);
ENABLE_BUTTON(IDC_BUTTONMOVEY, empty);
ENABLE_BUTTON(IDC_BUTTONMOVEZ, empty);
ENABLE_BUTTON(IDC_BUTTONMOVEA, empty);
ENABLE_BUTTON(IDC_BUTTONMOVEPOINT, empty);
ENABLE_BUTTON(IDC_BTRESET, empty);
ENABLE_BUTTON(IDC_EDITXROT, empty);
ENABLE_BUTTON(IDC_EDITYROT, empty);
ENABLE_BUTTON(IDC_EDITZROT, empty);
ENABLE_BUTTON(IDC_EDITIROT, empty);
ENABLE_BUTTON(IDC_BUTTONROTX, empty);
ENABLE_BUTTON(IDC_BUTTONROTY, empty);
ENABLE_BUTTON(IDC_BUTTONROTZ, empty);
ENABLE_BUTTON(IDC_BUTTONROTA, empty);
ENABLE_BUTTON(IDC_BTRESET2, empty);
ENABLE_BUTTON(IDC_BUTTONNAME, empty);
}
return CDialog::WindowProc(message, wParam, lParam);
}
void CEquipmentMakeDlg::OnBnClickedButtoncopy()
{
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty()) return;
AcGePoint3d ptIns(AcGePoint3d::kOrigin);
if (!getInsertPt(this, ptIns)) return;
AcAxDocLock lock;
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
Adesk::Int32 _id = getItemID(m_idBuffer);
AcDbObjectId id(GetEquIDByTree());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pEnt)
if (pEnt != NULL)
{
for (size_t i(0); i < items.size(); ++i)
{
HTREEITEM hItem = items[i];
if (!hItem) continue;
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
CString sText = m_wndEquipPrmTree.GetItemText(hItem);
if (nImage < SUB_TREE_BOX || nImage >= EQP_TREE_ROOT) continue;
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AecEqui::XPrimData *pData = pEnt->GetSUbPrimObjByID(dwSubID);
if (!pData) continue;
AecEqui::XPrimData *pNewData = AecDbEwEquipment::copyFromXPrimData(pData);
if (pNewData)
{
pNewData->m_nID = _id++;
pNewData->m_vtMove.normalize();
pNewData->m_vtMove.x += ptIns.asVector().x;
pNewData->m_vtMove.y += ptIns.asVector().y;
pNewData->m_vtMove.z += ptIns.asVector().z;
pEnt->AddSubPrimObj(pNewData);
pNewData->releaseData();
hItem = m_wndEquipPrmTree.InsertItem(sText, nImage, nImage, hRoot);
m_wndEquipPrmTree.SetItemData(hItem, (DWORD_PTR)pNewData->m_nID);
DELETE_PTR(pNewData);
}
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CEquipmentMakeDlg::OnBnClickedButtonmirr()
{
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty()) return;
if (this->IsWindowVisible()) this->ShowWindow(SW_HIDE);
ads_name ent;
struct resbuf *pRb = acutBuildList(RTDXF0, _T("LINE"), 0);
int nRes = CKTCadUtility::SelectEntity2(_T("\n请选择一段直线做为对称轴:"), ent, pRb);
acutRelRb(pRb);
if (nRes != RTNORM)
{
if (!this->IsWindowVisible()) this->ShowWindow(SW_SHOW);
return;
}
AcDbObjectId id;
acdbGetObjectId(id, ent);
if (!id.isValid())
{
if (!this->IsWindowVisible()) this->ShowWindow(SW_SHOW);
return;
}
AcGePoint3d pts, pte;
OPENOBJ_BEGIN(id, AcDb::kForRead, AcDbLine, pLine)
{
if (!pLine)
{
if (!this->IsWindowVisible()) this->ShowWindow(SW_SHOW);
return;
}
pts = pLine->startPoint();
pte = pLine->endPoint();
}
OPENOBJ_END()
if (!this->IsWindowVisible())
this->ShowWindow(SW_SHOW);
AcGeVector3d vt(pte - pts);
vt.rotateBy(.5 * PI, AcGeVector3d::kZAxis);
AcGeMatrix3d mat;
mat.setToMirroring(AcGePlane(pts, vt));
AcAxDocLock lock;
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
Adesk::Int32 _id = getItemID(m_idBuffer);
OPENOBJ_BEGIN(GetEquIDByTree(), AcDb::kForWrite, AecDbEwEquipment, pEnt)
if (pEnt != NULL)
{
for (size_t i(0); i < items.size(); ++i)
{
HTREEITEM hItem = items[i];
if (!hItem) continue;
int nImage = 0, nSelImg = 0;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
CString sText = m_wndEquipPrmTree.GetItemText(hItem);
if (nImage < SUB_TREE_BOX || nImage >= EQP_TREE_ROOT) continue;
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AecEqui::XPrimData *pData = pEnt->GetSUbPrimObjByID(dwSubID);
if (!pData) continue;
AecEqui::XPrimData *pNewData = AecDbEwEquipment::copyFromXPrimData(pData);
if (pNewData)
{
pNewData->m_nID = _id++;
pNewData->m_arMatrix.append(mat);
pEnt->AddSubPrimObj(pNewData);
pNewData->releaseData();
hItem = m_wndEquipPrmTree.InsertItem(sText, nImage, nImage, hRoot);
m_wndEquipPrmTree.SetItemData(hItem, (DWORD_PTR)pNewData->m_nID);
DELETE_PTR(pNewData);
}
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CEquipmentMakeDlg::OnBnClickedButtonins()
{
int nCount = m_wndEquipPrmTree.GetCount();
if (nCount == 0)
{
AfxMessageBox(_T("请新建设备元件放置元素!"));
return;
}
HTREEITEM hRoot = m_wndEquipPrmTree.GetRootItem();
AcDbObjectId id = GetEquIDByTree();
bool bTemp(false);
AecDbEwEquipment *pNewEqu = CEquipmentLibraryDlg::selectSingleEqu((LPCTSTR)NULL, (LPCTSTR)NULL, false, false, bTemp, bTemp);
if (!pNewEqu) return;
CString sName(_T(""));
pNewEqu->GetSpecialtyData()->GetAt(KEY_NAME, sName);
AcGePoint3d ptIns(AcGePoint3d::kOrigin);
if (!getInsertPt(this, ptIns))
{
DELETE_PTR(pNewEqu);
return;
}
AcAxDocLock lock;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pEqu)
if (pEqu)
{
AecEqui::XPrimData *pNewData = new AecEqui::XPrimData();
for (int i(0); i < pNewEqu->GetSubPrimObjCount(); ++i)
{
AecEqui::XPrimData *p = pNewEqu->GetSubPrimObj(i);
if (p)
pNewData->m_Combins.push_back(p);
}
pNewData->m_nID = ::getItemID(m_idBuffer);
pNewData->m_eType = AecEqui::kCombination;
pNewData->m_bBoolSubtract = false;
pNewData->m_vtMove = ptIns.asVector();
pNewData->m_sName = sName;
pEqu->AddSubPrimObj(pNewData);
pNewData->releaseData();
HTREEITEM hItem = m_wndEquipPrmTree.InsertItem(sName.IsEmpty() ? SUB_NAME_EQU : sName + getTreeItemSuffix(false)
, SUB_TREE_EQU_COMBIN
, SUB_TREE_EQU_COMBIN
, hRoot);
m_wndEquipPrmTree.SetItemData(hItem, (DWORD_PTR)pNewData->m_nID);
m_wndEquipPrmTree.Expand(hRoot, TVE_EXPAND);
m_wndEquipPrmTree.SelectItem(hItem);
}
OPENOBJ_END()
DELETE_PTR(pNewEqu);
}
void CEquipmentMakeDlg::modifyColor()
{
if (!m_MainID.isValid()) // 文档已无效
{
AfxMessageBox(_T("当前设备无效!请新建或载入一个新设备。"));
m_wndEquipPrmTree.DeleteAllItems();
}
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty())
{
HTREEITEM h(m_wndEquipPrmTree.GetSelectedItem());
if (h)
items.push_back(h);
else
return;
}
Adesk::UInt16 iClr = getColorByUser(256);
AcAxDocLock lock;
AcDbObjectId id(GetEquIDByTree());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pWEqt)
if (pWEqt != NULL)
{
int nImage = 0, nSelImg = 0;
for (size_t i(0); i < items.size(); ++i)
{
HTREEITEM hItem = items[i];
if (!hItem) continue;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
if (nImage < SUB_TREE_BOX || nImage >= EQP_TREE_ROOT) continue;
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AecEqui::XPrimData *p = pWEqt->GetSUbPrimObjByID(dwSubID);
if (!p) continue;
p->m_iClr = iClr;
}
pWEqt->clearGeoBuffer();
}
OPENOBJ_END()
}
void CEquipmentMakeDlg::OnBnClickedButtonname()
{
if (!m_MainID.isValid()) // 文档已无效
{
AfxMessageBox(_T("当前设备无效!请新建或载入一个新设备。"));
m_wndEquipPrmTree.DeleteAllItems();
}
std::vector<HTREEITEM> items;
getSelectItems(items);
if (items.empty())
{
HTREEITEM h(m_wndEquipPrmTree.GetSelectedItem());
if (h)
items.push_back(h);
else
return;
}
CString sName(_T(""));
if (!CoreTools::getNameByDialog(_T("重命名"), _T("名称:"), sName))
return;
if (sName.IsEmpty()) return;
AcAxDocLock lock;
AcDbObjectId id(GetEquIDByTree());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbEwEquipment, pWEqt)
if (pWEqt != NULL)
{
int nImage = 0, nSelImg = 0;
for (size_t i(0); i < items.size(); ++i)
{
HTREEITEM hItem = items[i];
if (!hItem) continue;
m_wndEquipPrmTree.GetItemImage(hItem, nImage, nSelImg);
if (nImage < SUB_TREE_BOX || nImage >= EQP_TREE_ROOT) continue;
DWORD_PTR dwSubID = m_wndEquipPrmTree.GetItemData(hItem);
AecEqui::XPrimData *p = pWEqt->GetSUbPrimObjByID(dwSubID);
if (!p) continue;
p->m_sName = sName;
m_wndEquipPrmTree.SetItemText(hItem, sName);
}
}
OPENOBJ_END()
}
void CEquipmentMakeDlg::OnBnClickedButtonClose()
{
OnClose();
}