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

4736 lines
226 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 <set>
#include "KTSetting.h"
#include "CoreTools.h"
#include "DTYGDlg.h"
#include "AcDbX3dSolid.h"
#include "aecdbx3dpart.h"
#include "KTCadUtilityEx.h"
#include "KTCadUtility.h"
#include "AecDbBDPipeBase.h"
#include "AecDbWall.h"
#include "AecDbSlab.h"
#include "AecDbColumn.h"
#include "AecDbBeam.h"
#include "AecDbMultiPartEntity.h"
#include "KTCADSysVar.h"
#include "BrepOper.h"
#include "DtygNameDlg.h"
#include "DTYG_MODIFY.h"
#include "aecdbxequipment.h"
#include "AecDbExtendedEntity.h"
#include "AecDbWeir.h"
#include "AecDbWell.h"
#include "dbobjptr.h"
#ifndef ITEM_ROOT
#define ITEM_ROOT 0
#endif
#ifndef ITEM_ITEM
#define ITEM_ITEM 1
#endif
#ifndef ITEM_ITEMSEL
#define ITEM_ITEMSEL 2
#endif
#define ID_SAVETIMER 1024
#ifndef WM_ITEMSELECT
#define WM_ITEMSELECT (WM_USER+0x107)
#endif
#ifndef WM_ITEMMODIFY
#define WM_ITEMMODIFY (WM_USER+0x108)
#endif
#ifndef WM_ITEMCLICK
#define WM_ITEMCLICK (WM_USER+0x109)
#endif
#ifndef WM_SELFINISH
#define WM_SELFINISH (WM_USER+0x111)
#endif
namespace
{
CString GetLayerNameById(AcDbObjectId layerId)
{
// 自动打开对象,作用域结束时自动关闭
AcDbObjectPointer<AcDbLayerTableRecord> pLayerRec(layerId, AcDb::kForRead);
// openStatus() 检查打开是否成功
if (pLayerRec.openStatus() != Acad::eOk) {
return _T("");
}
ACHAR *pName = nullptr;
CString strLayerName;
if (pLayerRec->getName(pName) == Acad::eOk) {
strLayerName = pName;
acutDelString(pName); // 依然需要手动释放字符串内存
}
// 不需要调用 pLayerRec->close(),析构函数会自动处理
return strLayerName;
}
void GetAllLayers(std::map<CString, AcDbObjectId> &layerInfoList)
{
// 1. 清空传入的容器,防止追加数据
layerInfoList.clear();
// 2. 获取当前工作的数据库指针
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
if (pDb == nullptr) {
acutPrintf(_T("\n错误: 无法获取当前数据库。"));
return;
}
// 3. 打开图层表 (Layer Table) 用于读取
AcDbLayerTable *pLayerTbl = nullptr;
Acad::ErrorStatus es = pDb->getSymbolTable(pLayerTbl, AcDb::kForRead);
if (es != Acad::eOk) {
acutPrintf(_T("\n错误: 无法打开图层表, 错误码: %s"), acadErrorStatusText(es));
return;
}
// 4. 创建迭代器遍历图层表
AcDbLayerTableIterator *pIter = nullptr;
es = pLayerTbl->newIterator(pIter);
if (es != Acad::eOk) {
pLayerTbl->close(); // 失败时别忘了关闭图层表
acutPrintf(_T("\n错误: 无法创建图层迭代器。"));
return;
}
// 5. 开始循环遍历
for (; !pIter->done(); pIter->step()) {
AcDbLayerTableRecord *pLayerRec = nullptr;
//以此获取记录,打开模式为只读
es = pIter->getRecord(pLayerRec, AcDb::kForRead);
if (es == Acad::eOk) {
ACHAR *pName = nullptr;
// 获取图层名称
if (pLayerRec->getName(pName) == Acad::eOk) {
// 将 ACHAR* 转换为 CString
CString strLayerName(pName);
// 获取图层 ID
AcDbObjectId layerId = pLayerRec->objectId();
// 存入 vector
layerInfoList.insert(std::make_pair(strLayerName, layerId));
// 重要:getName 分配了内存,必须释放
acutDelString(pName);
}
// 关闭图层记录
pLayerRec->close();
}
}
// 6. 清理资源
delete pIter; // 删除迭代器
pLayerTbl->close(); // 关闭图层表
}
AcGePoint3d getCenterOfReg(AcDbRegion *pReg)
{
if (!pReg) return AcGePoint3d::kOrigin;
AcDbExtents ext;
pReg->getGeomExtents(ext);
return CoreTools::MidPt(ext.maxPoint(), ext.minPoint());
}
AcDbPolyline* curve2Polyline(AcDbCurve *pCurve)
{
AcDbPolyline *pPoly(AcDbPolyline::cast(pCurve));
if (pPoly) return (AcDbPolyline*)pPoly->clone();
return CoreTools::MakePolyline(pCurve);
}
int numOfLockData() { return 3; }
int getClrIdxByString(LPCTSTR psz)
{
if (!psz) return 256;
if (CString(psz) == _T("ByLayer")) return 256;
if (CString(psz) == _T("ByBlock")) return 256;
return TypeConvert::s2i(psz);
}
CString getClrString(int idx, bool hasHead = true)
{
CString sClr(_T("")), s(_T(""));
if (idx == 0)
sClr = _T("ByBlock");
else if (idx == 256)
sClr = _T("ByLayer");
else
sClr.Format(_T("%d"), idx);
s.Format(_T("%s:%s"), _T("颜色"), sClr);
if (hasHead)
return s;
return sClr;
}
DWORD getClrRGB(int idx)
{
if (idx == 0) return RGB(255,255,255);
if (idx == 256) return RGB(255,255,255);
#ifndef ZWCAD
#if ARX > 23
AcCmEntityColor clr;
DWORD dw = clr.makeRGB(idx).getRGB();
#else
DWORD dw = AcCmEntityColor::lookUpRGB(idx);
#endif
#else
DWORD dw = AcCmEntityColor::lookUpRGB(idx);
#endif
DWORD b = GetRValue(dw);
DWORD g = GetGValue(dw);
DWORD r = GetBValue(dw);
return RGB(r, g, b);
}
DWORD getClrRGB(LPCTSTR psz)
{
if (!psz) return RGB(255,255,255);
if (CString(psz) == _T("ByLayer")) return RGB(255,255,255);
if (CString(psz) == _T("ByBlock")) return RGB(255,255,255);
#ifndef ZWCAD
#if ARX > 23
AcCmEntityColor clr;
DWORD dw = clr.makeRGB(TypeConvert::s2i(psz)).getRGB();
#else
DWORD dw = AcCmEntityColor::lookUpRGB(TypeConvert::s2i(psz));
#endif
#else
DWORD dw = AcCmEntityColor::lookUpRGB(TypeConvert::s2i(psz));
#endif
DWORD b = GetRValue(dw);
DWORD g = GetGValue(dw);
DWORD r = GetBValue(dw);
return RGB(r, g, b);
}
DWORD getClrRGBByBIMData(LPCTSTR psz)
{
if (!psz) return RGB(255,255,255);
std::vector<CString> vec;
CoreTools::SplitString(psz, _T('|'), vec);
if (vec.size() != 2) return RGB(255,255,255);
if (vec[0] != _T("颜色")) return RGB(255,255,255);
return getClrRGB(vec[1]);
}
void setInitBIMDataForSubEntity(SH_BIM_BLOCK &bims, LPCTSTR pszName, int clr)
{
if (pszName)
bims.push_back(std::make_pair(_T("名称"), pszName));
bims.push_back(std::make_pair(_T("颜色"), getClrString(clr, false)));
bims.push_back(std::make_pair(_T("统计类型"), _T("其它")));
}
void setInitBIMDataForSubEntity(AecDbObjXDataMap *pMap, LPCTSTR pszName, int clr)
{
CString s(_T(""));
SH_BIM_BLOCK bims;
setInitBIMDataForSubEntity(bims, pszName, clr);
CoreTools::setBimDatas(*pMap, bims);
}
double getMaxLength(AecDbBDPipeBase *pEw)
{
AcDbExtents ext;
if (pEw)
{
pEw->getGeomExtents(ext);
double dx = ext.maxPoint().x - ext.minPoint().x;
double dy = ext.maxPoint().y - ext.minPoint().y;
double dz = ext.maxPoint().z - ext.minPoint().z;
std::set<double> ss;
ss.insert(dx);
ss.insert(dy);
ss.insert(dz);
return *ss.rbegin();
}
return .0;
}
bool setFaceClr(AcDbObjectId solidID
, std::map<AcDbSubentId, int, CDTYGDlg::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, CDTYGDlg::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 SelectPoint(LPCTSTR pszTip,const AcGePoint3d* pptFr,AcGePoint3d& ptTo)
{
//注意 : 节点造族没有ucs坐标系!!!!
ads_point pt;
if (pptFr != NULL)
{
ads_point_set(asDblArray(*pptFr),pt);
}
ads_point pt1;
int nRes = acedGetPoint(pptFr == NULL ? NULL : pt,pszTip,pt1);
if (nRes == RTNORM)
{
ptTo = asPnt3d(pt1);
}
return nRes;
}
AcGeVector3d getDir(int iMod)
{
if (iMod == 0) return AcGeVector3d::kXAxis;
if (iMod == 1) return AcGeVector3d::kYAxis;
return AcGeVector3d::kZAxis;
}
void* makeBuffer(const CString &str)
{
if (str.IsEmpty()) return NULL;
int len = str.GetLength() + 1;
TCHAR *psz = new TCHAR[len];
::memset(psz, 0, sizeof(TCHAR) * len);
_tcscpy(psz, str);
return psz;
}
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;
}
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* selectPathForSweep(AcGePoint3d &pickPnt)
{
AcDbPolyline *pPoly(NULL);
ads_name ent;
struct resbuf *pRb = acutBuildList(RTDXF0, _T("LWPOLYLINE,LINE,ARC,CIRCLE,SPLINE"), 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);
if (p) pPoly = (AcDbPolyline*)p->clone();
OPENOBJ_END()
return pPoly;
}
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;
}
void moveRegion(AcDbRegion *pReg, const AcGeMatrix3d &ucs, const double &dl, const double &dL)
{
if (!pReg) return;
AcGePoint3d ptOrg;
AcGeVector3d vtX, vtY, vtZ;
ucs.getCoordSystem(ptOrg, vtX, vtY, vtZ);
AcDbExtents ext;
pReg->getGeomExtents(ext);
AcGePoint3d ptMin(ext.minPoint());
AcGePoint3d ptMax(ext.maxPoint());
AcGePoint3d ptCen(CoreTools::MidPt(ptMax, ptMin));
AcGeVector3d vtMove(AcGeVector3d::kIdentity);
AcGeMatrix3d mat;
// 先将 region 移动到原点
AcGePoint3d ptO = AcGePoint3d::kOrigin;
vtMove = AcGePoint3d::kOrigin - ptCen;
mat.setToTranslation(vtMove);
pReg->transformBy(mat);
pReg->getGeomExtents(ext);
ptMin = ext.minPoint();
ptMax = ext.maxPoint();
// 最小点移动到距原点dl的位置
AcGePoint3d pt1 = AcGePoint3d(ptMin.x, (ptMax.y + ptMin.y) * .5, ptMin.z);
AcGePoint3d pt2 = AcGePoint3d::kOrigin + AcGeVector3d::kXAxis * dl;
vtMove = pt2 - pt1;
mat.setToTranslation(vtMove);
pReg->transformBy(mat);
// 再立起来
mat.setToIdentity();
mat.setToAlignCoordSys( AcGePoint3d::kOrigin
, AcGeVector3d::kXAxis
, AcGeVector3d::kYAxis
, AcGeVector3d::kZAxis
, AcGePoint3d::kOrigin
, AcGeVector3d::kXAxis
, AcGeVector3d::kZAxis
, AcGeVector3d::kYAxis );
pReg->transformBy(mat);
}
void CreateExtrude(bool &bSub, AcArray<AcDbX3dSolid*> &solids)
{
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;
bSub = isSubtract();
AcGePoint3d pt;
for (int i = 0; i < regs.length(); ++i)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
pt = getCenterOfReg(regs[i]);
if (pSolid->CreateExtrude(regs[i], AcDbLine(pt, pt + vtNormal * dH)))
solids.append(pSolid);
else
DELETE_PTR(pSolid);
}
deleteContainerOfArx<AcDbRegion>(regs);
}
void CreateSweep(bool &bSub, AcArray<AcDbX3dSolid*> &solids)
{
AcArray<AcDbRegion*> regs(0);
AcDbPolyline *pPoly(NULL);
do
{
AcGePoint3d pickPnt(AcGePoint3d::kOrigin);
selectPolyline(pickPnt, regs);
if (regs.isEmpty()) break;
pPoly = selectPathForSweep(pickPnt);
if (!pPoly) break;
bSub = isSubtract();
for (int i = 0; i < regs.length(); ++i)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->CreateSweep(regs[i], pPoly))
solids.append(pSolid);
else
DELETE_PTR(pSolid);
}
} while (false);
deleteContainerOfArx<AcDbRegion>(regs);
DELETE_PTR(pPoly);
}
void CreateLoft(bool &bSub, AcArray<AcDbX3dSolid*> &solids)
{
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;
}
bSub = isSubtract();
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (!pSolid->CreateLoft(regs))
DELETE_PTR(pSolid);
else
solids.append(pSolid);
deleteContainerOfArx<AcDbRegion>(regs);
}
void CreateCut(AcArray<AcDbX3dSolid*> &solids, const double &maxLen)
{
AcArray<AcDbRegion*> regs(0);
AcGePoint3d pickPnt(AcGePoint3d::kOrigin);
selectPolyline(pickPnt, regs);
if (regs.isEmpty()) return;
AcGeVector3d vtX(acdbCurDwg()->ucsxdir());
AcGeVector3d vtY(acdbCurDwg()->ucsydir());
AcGeVector3d vtZ(vtX.crossProduct(vtY));
vtZ *= -1;
for (int i = 0; i < regs.length(); ++i)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->CreateExtrude(regs[i], AcDbLine(pickPnt, pickPnt + vtZ * maxLen)))
solids.append(pSolid);
else
DELETE_PTR(pSolid);
}
deleteContainerOfArx<AcDbRegion>(regs);
}
void CreateRevolve(bool &bSub, AcArray<AcDbX3dSolid*> &solids)
{
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;
}
bSub = isSubtract();
for (int i = 0; i < regs.length(); ++i)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->CreateRevolve2(regs[i]
, pLine->startPoint()
, pLine->endPoint() - pLine->startPoint()
, 2 * PI
, 0.))
{
solids.append(pSolid);
}
else
DELETE_PTR(pSolid);
}
DELETE_PTR(pLine);
deleteContainerOfArx<AcDbRegion>(regs);
}
AcDbRegion* createTorusRegion(const int &mode
, const AcGePoint3d ptOrg
, const double &dl
, const double &dL
, const double &dH = .0)
{
AcDbRegion *pReg(NULL);
if (mode == 1)
{
double dR((dL - dl) * .5);
AcDbCircle cir(AcGePoint3d::kOrigin + AcGeVector3d::kXAxis * (dl + dR), AcGeVector3d::kZAxis, dR);
pReg = CoreTools::createRegion(&cir);
}
else if (mode == 0)
{
double dW(dL - dl);
AcGeVector2d vtX(AcGeVector2d::kXAxis);
AcGeVector2d vtY(AcGeVector2d::kYAxis);
AcGePoint2d pt1(AcGePoint3d::kOrigin.convert2d(AcGePlane::kXYPlane));
pt1 -= vtX * dW * .5;
pt1 += vtY * dH * .5;
AcGePoint2d pt2 = pt1 + vtX * dW;
AcGePoint2d pt3 = pt2 - vtY * dH;
AcGePoint2d pt4 = pt3 - vtX * dW;
AcDbPolyline poly;
poly.addVertexAt(0, pt1);
poly.addVertexAt(1, pt2);
poly.addVertexAt(2, pt3);
poly.addVertexAt(3, pt4);
poly.setClosed(1);
pReg = CoreTools::createRegion(&poly);
}
return pReg;
}
bool getSolidByTorus(CTorusDlg &dlg, AcDbX3dSolid *pSolid)
{
AcArray<double> ar;
if (!pSolid->GetSolidData(AcDbX3dSolid::kRevolve2, ar)) return false;
if (ar.length() < 2) return false;
void *pBuffer(NULL);
int len = pSolid->GetSatBuffer(&pBuffer);
if (len != sizeof(double) * 3 + sizeof(int)) return false;
double *pDouble((double*)pBuffer);
dlg.m_dInnerR = pDouble[0];
dlg.m_dOuterR = pDouble[1];
dlg.m_dRectH = pDouble[2];
dlg.m_dStartA = CoreTools::R2A(ar[1]);
dlg.m_dEndA = CoreTools::R2A(ar[1] + ar[0]);
dlg.m_iMode = *((int*)((byte*)pBuffer + sizeof(double) * 3));
DELETE_ARR_(pBuffer);
return false;
}
CString getName(const CDTYGDlg::TYPE &type)
{
switch (type)
{
case CDTYGDlg::kBox:
return _T("立方体");
case CDTYGDlg::kCylinder:
return _T("圆柱");
case CDTYGDlg::kCone:
return _T("圆台");
case CDTYGDlg::kPyramid:
return _T("四方台");
case CDTYGDlg::kCircleTorus:
return _T("环-圆形截面");
case CDTYGDlg::kRectTorus:
return _T("环-方形截面");
case CDTYGDlg::kXTorus:
return _T("环-异形截面");
case CDTYGDlg::kWedge:
return _T("楔形体");
case CDTYGDlg::kDrums:
return _T("球台");
case CDTYGDlg::kExtrude:
return _T("拉伸体");
case CDTYGDlg::kRevolve:
return _T("旋转体");
case CDTYGDlg::kLoft:
return _T("放样体");
case CDTYGDlg::kSweep:
return _T("扫掠体");
case CDTYGDlg::kCut:
return _T("切割");
case CDTYGDlg::kSpere:
return _T("球体");
case CDTYGDlg::kWeir:
return _T("异形堰");
case CDTYGDlg::kErr:
return _T("unknow");
default:
return _T("unknow");
}
return _T("unknow");
}
CDTYGDlg::TYPE getType(LPCTSTR psz)
{
if (!psz) return CDTYGDlg::kErr;
CString ss(psz);
if (ss == getName(CDTYGDlg::kBox)) return CDTYGDlg::kBox;
if (ss == getName(CDTYGDlg::kCylinder)) return CDTYGDlg::kCylinder;
if (ss == getName(CDTYGDlg::kCone)) return CDTYGDlg::kCone;
if (ss == getName(CDTYGDlg::kPyramid)) return CDTYGDlg::kPyramid;
if (ss == getName(CDTYGDlg::kCircleTorus)) return CDTYGDlg::kCircleTorus;
if (ss == getName(CDTYGDlg::kRectTorus)) return CDTYGDlg::kRectTorus;
if (ss == getName(CDTYGDlg::kXTorus)) return CDTYGDlg::kXTorus;
if (ss == getName(CDTYGDlg::kWedge)) return CDTYGDlg::kWedge;
if (ss == getName(CDTYGDlg::kDrums)) return CDTYGDlg::kDrums;
if (ss == getName(CDTYGDlg::kExtrude)) return CDTYGDlg::kExtrude;
if (ss == getName(CDTYGDlg::kRevolve)) return CDTYGDlg::kRevolve;
if (ss == getName(CDTYGDlg::kSpere)) return CDTYGDlg::kSpere;
if (ss == getName(CDTYGDlg::kLoft)) return CDTYGDlg::kLoft;
if (ss == getName(CDTYGDlg::kSweep)) return CDTYGDlg::kSweep;
if (ss == getName(CDTYGDlg::kCut)) return CDTYGDlg::kCut;
if (ss == getName(CDTYGDlg::kWeir)) return CDTYGDlg::kWeir;
return CDTYGDlg::kErr;
}
bool isItem(LPCTSTR psz)
{
if (!psz) return false;
CDTYGDlg::TYPE type = getType(psz);
if (type == CDTYGDlg::kErr) return false;
return true;
}
void addItem(AecDbX3dPart *pPart, CTreeCtrl &tree, LPCTSTR name)
{
if (!pPart) return;
//CString sName(_T(""));
//pPart->GetName(sName);
HTREEITEM root = tree.GetRootItem();
if (root)
{
HTREEITEM item = tree.InsertItem(name,ITEM_ITEM,ITEM_ITEMSEL,root);
if (item)
{
void *pBuffer = makeBuffer(pPart->GetGUID());
if (pBuffer)
tree.SetItemData(item, (DWORD_PTR)pBuffer);
tree.Expand(root, TVE_EXPAND);
}
}
}
bool getInsertPt(AcGePoint3d &pt)
{
if (g_DtygDlg::instance().IsWindowVisible())
g_DtygDlg::instance().ShowWindow(SW_HIDE);
ads_point adsPt;
if (acedGetPoint(NULL, _T("\n请选择放置点:"), adsPt) != RTNORM)
{
if (!g_DtygDlg::instance().IsWindowVisible())
g_DtygDlg::instance().ShowWindow(SW_SHOW);
return false;
}
pt = asPnt3d(adsPt);
CoreTools::UCS2WCS(pt, pt);
if (!g_DtygDlg::instance().IsWindowVisible())
g_DtygDlg::instance().ShowWindow(SW_SHOW);
return true;
}
bool addX3dPartAndTreeItem(AcDbObjectId id
, CTreeCtrl &tree
, const CDTYGDlg::TYPE &type)
//, const AcGeMatrix3d &ucs )
{
CAcModuleResourceOverride myResources;
AcAxDocLock lock;
AcGePoint3d ptOrg;
AcGeVector3d vtX, vtY, vtZ;
ptOrg = acdbCurDwg()->ucsorg();
vtX = acdbCurDwg()->ucsxdir();
vtY = acdbCurDwg()->ucsydir();
vtZ = vtX.crossProduct(vtY);
CString itemName(getName(type));
//CDtygNameDlg nameDlg;
//if (nameDlg.DoModal() != IDOK) return false;
//itemName = nameDlg.m_sName;
AcDbX3dSolid *pSolid(NULL);
bool bSub(false);
AcArray<AcDbX3dSolid *> solids;
int clr(256);
switch (type)
{
case CDTYGDlg::kBox://BOX LxWxH
{
CBoxDlg dlg;
if (dlg.DoModal() != IDOK) return false;
if (!getInsertPt(ptOrg)) return false;
pSolid = dlg.makeSolid(ptOrg, vtZ);
bSub = dlg.m_iSub == 0 ? false : true;
if (pSolid)
solids.append(pSolid);
clr = dlg.m_clr;
break;
}
case CDTYGDlg::kCylinder://CYL RxH
{
CCylinderDlg dlg;
if (dlg.DoModal() != IDOK) return false;
if (!getInsertPt(ptOrg)) return false;
pSolid = dlg.makeSolid(ptOrg, vtZ);
bSub = dlg.m_iSub == 0 ? false : true;
if (pSolid)
solids.append(pSolid);
clr = dlg.m_clr;
break;
}
case CDTYGDlg::kCone://CON R1xR2xH
{
CConeDLg dlg;
if (dlg.DoModal() != IDOK) return false;
if (!getInsertPt(ptOrg)) return false;
pSolid = dlg.makeSolid(ptOrg, vtZ);
bSub = dlg.m_iSub == 0 ? false : true;
if (pSolid)
solids.append(pSolid);
clr = dlg.m_clr;
break;
}
case CDTYGDlg::kPyramid://四方台 LxWxHxAng
{
CPyrmDlg dlg;
if (dlg.DoModal() != IDOK) return false;
if (!getInsertPt(ptOrg)) return false;
pSolid = dlg.makeSolid(ptOrg, vtZ);
bSub = dlg.m_iSub == 0 ? false : true;
if (pSolid)
solids.append(pSolid);
clr = dlg.m_clr;
break;
}
case CDTYGDlg::kWedge://楔形
{
CWedgeDlg dlg;
if (dlg.DoModal() != IDOK) return false;
if (!getInsertPt(ptOrg)) return false;
pSolid = dlg.makeSolid(ptOrg, vtZ);
bSub = dlg.m_iSub == 0 ? false : true;
if (pSolid)
solids.append(pSolid);
clr = dlg.m_clr;
break;
}
case CDTYGDlg::kDrums://鼓
{
CDrumsDlg dlg;
if (dlg.DoModal() != IDOK) return false;
if (!getInsertPt(ptOrg)) return false;
pSolid = dlg.makeSolid(ptOrg, vtZ);
bSub = dlg.m_iSub == 0 ? false : true;
if (pSolid)
solids.append(pSolid);
clr = dlg.m_clr;
break;
}
case CDTYGDlg::kSpere:
{
CSpereDlg dlg;
if (dlg.DoModal() != IDOK) return false;
if (!getInsertPt(ptOrg)) return false;
pSolid = dlg.makeSolid(ptOrg, vtZ);
bSub = dlg.m_iSub == 0 ? false : true;
if (pSolid)
solids.append(pSolid);
clr = dlg.m_clr;
break;
}
case CDTYGDlg::kExtrude://标准拉伸体,region+path
CreateExtrude(bSub, solids);
break;
case CDTYGDlg::kRevolve://旋转体
{
CreateRevolve(bSub, solids);
break;
}
case CDTYGDlg::kLoft:
CreateLoft(bSub, solids);
break;
case CDTYGDlg::kSweep:
CreateSweep(bSub, solids);
break;
case CDTYGDlg::kCut:
{
bSub = true;
OPENOBJ_BEGIN(id, AcDb::kForRead, AecDbBDPipeBase, pEnt)
if (pEnt)
CreateCut(solids, getMaxLength(pEnt));
OPENOBJ_END()
}
break;
case CDTYGDlg::kWeir:
{
bSub = true;
// 选择基准线 line, circle, arc, ellipse, polyline
ads_name ent;
struct resbuf *pRb = acutBuildList(RTDXF0, _T("CIRCLE,ARC"), 0);
int nRes = CKTCadUtility::SelectEntity2(_T("\n请选择外侧池壁的一条轮廓线做为基准线,将要生成的堰会以此线定位:"), ent, pRb);
acutRelRb(pRb);
if (nRes != RTNORM) return false;
AcDbObjectId id;
acdbGetObjectId(id, ent);
OPENOBJ_BEGIN(id, AcDb::kForRead, AcDbCurve, pCurve)
{
if (!pCurve) return false;
double dLen(0.), dEParam;
pCurve->getEndParam(dEParam);
pCurve->getDistAtParam(dEParam, dLen);
CYiXingYanDlg dlg(dLen);
if (dlg.DoModal() != IDOK) return false;
dlg.getXSolids(pCurve, solids);
}
OPENOBJ_END()
}
break;
default:
break;
}
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
if (!pEnt) return false;
CString itemString(_T(""));
for (int i = 0; i < solids.length(); ++i)
{
AcDbX3dSolid *pSolid(solids[i]);
if (!pSolid) continue;
AecDbX3dPart *pPart = new AecDbX3dPart();
pPart->GetSpecialtyData()->SetAt(_T("DTYG_TYPE"), getName(type));
setInitBIMDataForSubEntity(pPart->GetSpecialtyData(), itemName, clr);
pPart->SetName(itemName);
pPart->AddX3dSolid(pSolid);
ptOrg = pSolid->GetCentoridPoint();
pPart->SetOrgPoint(ptOrg);
pPart->SetAxis(0, vtX);
pPart->SetAxis(1, vtY);
pPart->SetAxis(2, vtZ);
pEnt->AddX3dPart(pPart, bSub ? AcDb::kBoolSubtract : AcDb::kBoolUnite);
itemString.Format(_T("%s(%s)(%s)"), itemName, getName(type), bSub ? _T("-") : _T("+"));
addItem(pPart, tree, itemString);
}
OPENOBJ_END()
acedPostCommand(_T("regen "));
return true;
}
bool delItem(AcDbObjectId id, CTreeCtrl &tree, HTREEITEM item)
{
AcAxDocLock lock;
TCHAR *psz = (TCHAR*)tree.GetItemData(item);
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
if (!pEnt) return false;
if (pEnt->RemoveX3dPart(psz))
{
tree.DeleteItem(item);
DELETE_ARR_(psz);
}
}
OPENOBJ_END()
acedPostCommand(_T("regen "));
return true;
}
bool delItem(AcDbObjectId id, CTreeCtrl &tree, std::vector<HTREEITEM> items)
{
AcAxDocLock lock;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
if (!pEnt) return false;
for (size_t i = 0; i < items.size(); ++i)
{
TCHAR *psz = (TCHAR*)tree.GetItemData(items[i]);
if (pEnt->RemoveX3dPart(psz))
{
tree.DeleteItem(items[i]);
DELETE_ARR_(psz);
}
}
OPENOBJ_END()
acedPostCommand(_T("regen "));
return true;
}
bool modifyItem(AcDbObjectId id, LPCTSTR guid)
{
AcAxDocLock lock;
CAcModuleResourceOverride myResources;
if (!guid) return false;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
if (!pEnt) return false;
pEnt->AssertWriteEnabled();
AecDbX3dPart *pPart(pEnt->GetX3dPart(guid));
if (!pPart) return false;
CString sName;
if (!pPart->GetSpecialtyData()->GetAt(_T("DTYG_TYPE"), sName))
return false;
if (pPart->GetX3dSolidCount() != 1) return false;
AcDbX3dSolid *pSolid(pPart->GetX3dSolid(0)), *pNewSolid(NULL);
if (!pSolid) return false;
AcGePoint3d ptOrg = pSolid->GetOrgPoint();
AcGeVector3d vtZ = pSolid->GetvtZ();
bool bSub(false);
AcArray<double> ar;
if (CDTYGDlg::kBox == getType(sName))
{
if (!pSolid->GetSolidData(AcDbX3dSolid::kBox, ar)) return false;
if (ar.length() < 3) return false;
CBoxDlg dlg;
dlg.m_dX = ar[0];
dlg.m_dY = ar[1];
dlg.m_dZ = ar[2];
if (dlg.DoModal() != IDOK) return false;
pNewSolid = dlg.makeSolid(ptOrg, vtZ);
}
else if (CDTYGDlg::kCylinder == getType(sName))
{
if (!pSolid->GetSolidData(AcDbX3dSolid::kCylinder, ar)) return false;
if (ar.length() < 2) return false;
CCylinderDlg dlg;
dlg.m_dR = ar[0];
dlg.m_dH = ar[1];
if (dlg.DoModal() != IDOK) return false;
pNewSolid = dlg.makeSolid(ptOrg, vtZ);
}
else if (CDTYGDlg::kCone == getType(sName))
{
if (!pSolid->GetSolidData(AcDbX3dSolid::kCone, ar)) return false;
if (ar.length() < 3) return false;
CConeDLg dlg;
dlg.m_dR = ar[0];
dlg.m_dr = ar[1];
dlg.m_dH = ar[2];
if (dlg.DoModal() != IDOK) return false;
pNewSolid = dlg.makeSolid(ptOrg, vtZ);
}
else if (CDTYGDlg::kPyramid == getType(sName))
{
if (!pSolid->GetSolidData(AcDbX3dSolid::kPyramid, ar)) return false;
if (ar.length() < 6) return false;
CPyrmDlg dlg;
dlg.m_dTx = ar[0];
dlg.m_dTy = ar[1];
dlg.m_dBx = ar[2];
dlg.m_dBy = ar[3];
dlg.m_dTH = ar[4];
dlg.m_dXOffset = ar[5];
if (dlg.DoModal() != IDOK) return false;
pNewSolid = dlg.makeSolid(ptOrg, vtZ);
}
//else if (CDTYGDlg::kRectTorus == getType(sName)
// || CDTYGDlg::kCircleTorus == getType(sName)
// || CDTYGDlg::kXTorus == getType(sName) )
//{
// CTorusDlg dlg;
// getSolidByTorus(dlg, pSolid);
// if (dlg.DoModal() != IDOK) return false;
// pNewSolid = dlg.makeSolid(ucs);
//}
else if (CDTYGDlg::kWedge == getType(sName))
{
if (!pSolid->GetSolidData(AcDbX3dSolid::kWedge, ar)) return false;
if (ar.length() < 3) return false;
CWedgeDlg dlg;
dlg.m_dA = ar[0];
dlg.m_dB = ar[1];
dlg.m_dT = ar[2];
if (dlg.DoModal() != IDOK) return false;
pNewSolid = dlg.makeSolid(ptOrg, vtZ);
}
else if (CDTYGDlg::kDrums == getType(sName))
{
if (!pSolid->GetSolidData(AcDbX3dSolid::kDrum, ar)) return false;
if (ar.length() < 5) return false;
CDrumsDlg dlg;
dlg.m_dL1 = ar[1];
dlg.m_dL2 = ar[2];
dlg.m_dR = ar[0];
dlg.m_dSAngle = CoreTools::R2A(ar[3]);
dlg.m_dEAngle = CoreTools::R2A(ar[4]);
if (dlg.DoModal() != IDOK) return false;
pNewSolid = dlg.makeSolid(ptOrg, vtZ);
}
else if (CDTYGDlg::kSpere == getType(sName))
{
if (!pSolid->GetSolidData(AcDbX3dSolid::kSpere, ar)) return false;
if (ar.length() < 1) return false;
CSpereDlg dlg;
dlg.m_dR = ar[0];
if (dlg.DoModal() != IDOK) return false;
pNewSolid = dlg.makeSolid(ptOrg, vtZ);
}
else if (CDTYGDlg::kExtrude == getType(sName))
{ }
else if (CDTYGDlg::kRevolve == getType(sName))
{ }
else if (CDTYGDlg::kLoft == getType(sName))
{ }
else if (CDTYGDlg::kSweep == getType(sName))
{ }
else
return false;
if (pNewSolid)
{
pPart->RemoveAt(0);
pPart->AddX3dSolid(pNewSolid);
}
}
OPENOBJ_END()
acedPostCommand(_T("regen "));
return true;
}
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);
}
}
void deleteEntity(AcDbObjectId id, bool bUnRecord = false)
{
if (!id.isValid()) return;
OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbEntity, pEnt)
{
if (pEnt)
{
if (bUnRecord)
{
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
pDb->disableUndoRecording(true);
pEnt->erase();
pDb->disableUndoRecording(false);
}
else
pEnt->erase();
}
}
OPENOBJ_END()
}
CString getEntityDefaultName(const AcDbEntity *pEnt)
{
CString sObjName(_T("未知"));
if (pEnt->isA() == AecDbXWall::desc())
sObjName = _T("墙");
else if (pEnt->isA() == AecDbBeam::desc())
sObjName = _T("梁");
else if (pEnt->isA() == AecDbXSlab::desc())
sObjName = _T("板");
else if (pEnt->isA() == AecDbColumn::desc())
sObjName = _T("柱");
else if (pEnt->isA() == AecDbMultiPartEntity::desc())
{
sObjName = _T("异形构筑物");
}
else if (pEnt->isA() == AecDbXEquipment::desc())
{
sObjName = _T("参数体设备");
const AecDbXEquipment *pX(AecDbXEquipment::cast(pEnt));
if (pX)
{
const AecDbObjXDataMap *pXData = pX->GetSpecialtyData();
if (pXData)
pXData->GetAt(KEY_NAME, sObjName);
}
}
else if (pEnt->isA() == AecDbExtendedEntity::desc())
sObjName = _T("槽壁");
else if (pEnt->isA() == AecDbWeir::desc())
sObjName = _T("堰");
else if (pEnt->isA() == AecDbWell::desc())
sObjName = _T("井");
else
sObjName = _T("未知");
return sObjName;
}
CString getEntityDefaultName(const AcDbObjectId &id)
{
AcDbEntityPointer ent(id, AcDb::kForRead);
if (ent.openStatus() != Acad::eOk) return _T("未知");
return getEntityDefaultName(ent);
}
bool isMultiPartEntity(const AcDbEntity *pEnt)
{
if (!pEnt) return false;
if (pEnt->isA() == AecDbMultiPartEntity::desc())
return true;
return false;
}
bool isMultiPartEntity(const AcDbObjectId &id)
{
AcDbEntityPointer ent(id, AcDb::kForRead);
if (ent.openStatus() != Acad::eOk) return false;
return isMultiPartEntity(ent);
}
CString getObjectNameFromBIMData(const AecDbObjXDataMap *pXData)
{
CString newName(_T(""));
if (pXData)
{
if (pXData->GetAt(_T("user0"), newName))
{
std::vector<CString> vec;
CoreTools::SplitString(newName, _T(':'), vec);
if (vec.size() == 2 && vec[0] == _T("名称"))
newName = vec[1];
}
}
return newName;
}
CString getObjectName(const AecDbBDPipeBase *pEnt)
{
if (!isMultiPartEntity(pEnt))
return getEntityDefaultName(pEnt);
CString newName(getObjectNameFromBIMData(pEnt->GetSpecialtyData()));
if (!newName.IsEmpty())
return newName;
return getEntityDefaultName(pEnt);
}
}
#pragma region CDtygProperty
IMPLEMENT_DYNAMIC(CDtygProperty, CDialog)
CDtygProperty::CDtygProperty(AecDbX3dPart *pPart, CWnd* pParent /*=nullptr*/)
: CDialog(IDD_PROPERTY, pParent)
, m_pPart(pPart)
, m_pMultiEnt(NULL){ }
CDtygProperty::CDtygProperty(AecDbBDPipeBase *pEnt, CWnd * pParent)
: CDialog(IDD_PROPERTY, pParent)
, m_pPart(NULL)
, m_pMultiEnt(pEnt){ }
CDtygProperty::~CDtygProperty() { }
void CDtygProperty::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_wndListCtrl);
DDX_Control(pDX, IDC_BUTTON2, m_btnAdd);
DDX_Control(pDX, IDC_BUTTON3, m_btnModify);
DDX_Control(pDX, IDC_BUTTON4, m_btnDel);
DDX_Control(pDX, IDC_BUTTON5, m_btnExport);
DDX_Control(pDX, IDC_BUTTON8, m_btnImport);
}
BOOL CDtygProperty::OnInitDialog()
{
CDialog::OnInitDialog();
m_wndListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_SINGLEROW);
m_wndListCtrl.InsertColumn(0, _T("属性名称"), LVCFMT_LEFT, 185);
m_wndListCtrl.InsertColumn(1, _T("属性值"), LVCFMT_LEFT, 185);
LOGFONT lf;
::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);
CClientDC dc(this);
_tcscpy(lf.lfFaceName, _T("Arial Unicode Ms"));
lf.lfHeight = -MulDiv(13, GetDeviceCaps(dc.m_hDC, LOGPIXELSY), 72);
m_font.CreateFontIndirect(&lf);
m_btnAdd.SetFont(&m_font);
m_btnModify.SetFont(&m_font);
m_btnDel.SetFont(&m_font);
m_btnImport.SetFont(&m_font);
m_btnExport.SetFont(&m_font);
m_btnAdd.SetWindowText(_T("✙"));
m_btnModify.SetWindowText(_T("✎"));
m_btnDel.SetWindowText(_T("✖"));
m_btnImport.SetWindowText(_T("➘"));
m_btnExport.SetWindowText(_T("➚"));
const AecDbObjXDataMap *pXData(NULL);
if (m_pPart)
pXData = m_pPart->GetSpecialtyData();
else if (m_pMultiEnt)
pXData = m_pMultiEnt->GetSpecialtyData();
if (pXData)
{
SH_BIM_BLOCK bims;
CoreTools::getBimDatas(*pXData, bims);
bool bNewEntity(bims.empty());
if (bims.empty())
{
CString name(_T("素砼"));
if (m_pMultiEnt)
{
name = getEntityDefaultName(m_pMultiEnt);
if (!isMultiPartEntity(m_pMultiEnt))
{ // 除异构单体之外的实体,没有属性,属性根据实体类型走
}
else
{ // 异构单体 包含名称,材料,统计类型
bims.push_back(std::make_pair(_T("名称"), name));
bims.push_back(std::make_pair(_T("材料"), _T("混凝土")));
bims.push_back(std::make_pair(_T("统计类型"), _T("其它")));
// 注意:“统计类型”和“图层”顺序不能错,不然下面会出问题。
bims.push_back(std::make_pair(_T("图层"), _T("0")));
}
}
}
CString sStatisticsType(_T(""));
int idx(0), clr(0);
for (size_t i = 0; i < bims.size(); ++i)
{
std::pair<CString, CString> &pr(bims[i]);
m_wndListCtrl.InsertItem(idx, pr.first);
m_wndListCtrl.SetItemText(idx, 1, pr.second);
if (pr.first == _T("颜色"))
{
m_wndListCtrl.SetItemColors(idx, 1, 0, getClrRGB(pr.second));
}
if (pr.first == _T("统计类型"))
{
std::vector<CString> list;
if (m_pPart)
{ // 子实体,统计只有两种,“其他”、“洞口”
list.push_back(_T("其它"));
list.push_back(_T("洞口"));
}
else if (m_pMultiEnt && isMultiPartEntity(m_pMultiEnt))
{ // 异构单体,统计类型有很多
CoreTools::getInnerTypeList(list);
}
if (!list.empty())
{
CStringArray *pAr = new CStringArray;
for (size_t i = 0; i < list.size(); ++i)
pAr->Add(list[i]);
int pos = CoreTools::getIdxForInnerTypeList(pr.second);
if (pos == -1) pos = list.size() - 1;
m_wndListCtrl.SetComboBox(idx, 1, TRUE, pAr, pAr->GetCount(), pos, FALSE);
}
sStatisticsType = pr.second;
}
else if (pr.first == _T("图层"))
{
// 生成默认图层
KTSetting::InitLayer(_T("LAY_YGDT"));
KTSetting::InitLayer(_T("LAY_WALL"));
KTSetting::InitLayer(_T("LAY_BEAM"));
KTSetting::InitLayer(_T("LAY_SLAB_DIBAN"));
KTSetting::InitLayer(_T("LAY_COLU"));
KTSetting::InitLayer(_T("LAY_PART"));
CStringArray *pAr = new CStringArray;
std::map<CString, AcDbObjectId> list;
GetAllLayers(list);
std::map<CString, AcDbObjectId>::const_iterator it(list.begin());
for (; it != list.end(); ++it)
pAr->Add(it->first);
m_wndListCtrl.SetComboBox(idx, 1, TRUE, pAr, pAr->GetCount(), 0, FALSE);
// 设置默认图层
if (bNewEntity)
{
AcDbObjectId idLayer = getLayerByStatisticsType(sStatisticsType);
m_wndListCtrl.SetItemText(idx, 1, GetLayerNameById(idLayer));
}
else
{
if (m_pMultiEnt)
m_wndListCtrl.SetItemText(idx, 1, GetLayerNameById(m_pMultiEnt->layerId()));
}
}
++idx;
}
}
return TRUE;
}
void CDtygProperty::OnBnClickedButton2() // 添加
{
CString name(_T("")), value(_T(""));
std::set<CString> names;
for (int i = 0; i < m_wndListCtrl.GetItemCount(); ++i)
names.insert(m_wndListCtrl.GetItemText(i, 0));
while (CoreTools::getBimDataByDlg(true, name, value))
{
if (names.find(name) != names.end())
{
AfxMessageBox(_T("属性已存在,请重新输入!"));
continue;
}
int idx = m_wndListCtrl.InsertItem(m_wndListCtrl.GetItemCount(), name);
m_wndListCtrl.SetItemText(idx, 1, value);
m_wndListCtrl.Invalidate();
names.insert(name);
}
}
void CDtygProperty::OnBnClickedButton3() // 修改
{
int idx = m_wndListCtrl.GetSelectionMark();
if (idx < 0)
{
AfxMessageBox(_T("请选中一条数据!"));
return;
}
CString name = m_wndListCtrl.GetItemText(idx, 0);
CString value = m_wndListCtrl.GetItemText(idx, 1);
if (idx < numOfLockData())
{
if (name == _T("颜色"))
{
int clridx = getClrIdxByString(value);
AcCmColor clr, clrLayer;
clr.setColorIndex(clridx);
if (!acedSetColorDialogTrueColor(clr, Adesk::kTrue, clr, AcCm::kACITab)) return;
value = getClrString(clr.colorIndex(), false);
m_wndListCtrl.SetItemColors(idx, 1, RGB(255, 255, 255), getClrRGB(clr.colorIndex()));
}
else if (name == _T("名称") || name == _T("材料"))
{
if (!CoreTools::getNameByDialog(_T("输入属性值"), _T("属性值"), value)) return;
}
}
else
{
if (!CoreTools::getBimDataByDlg(false, name, value)) return;
}
m_wndListCtrl.SetItemText(idx, 0, name);
m_wndListCtrl.SetItemText(idx, 1, value);
m_wndListCtrl.Invalidate();
}
void CDtygProperty::OnBnClickedButton4() // 删除
{
int idx = m_wndListCtrl.GetSelectionMark();
if (idx < 0)
{
AfxMessageBox(_T("请选中一条数据!"));
return;
}
if (idx < numOfLockData()) // 0 - 名称 1 - 颜色 2 - 材料
{
AfxMessageBox(_T("默认数据不能删除!"));
return;
}
m_wndListCtrl.DeleteItem(idx);
m_wndListCtrl.Invalidate();
}
void CDtygProperty::OnBnClickedButton5() // 导出
{
CFileDialog dlg(FALSE, _T("*.ini"), NULL, OFN_HIDEREADONLY, _T("bim导出数据 (*.ini)|*.ini||"), acedGetAcadFrame());
if (dlg.DoModal() != IDOK) return;
std::map<CString, CString> datas;
CString name, value;
for (int i = 0; i < m_wndListCtrl.GetItemCount(); ++i)
{
name = m_wndListCtrl.GetItemText(i, 0);
value = m_wndListCtrl.GetItemText(i, 1);
datas.insert(std::make_pair(name, value));
}
CoreTools::bimData2IniFile(dlg.GetPathName(), datas);
}
void CDtygProperty::OnBnClickedButton8() // 导入
{
CFileDialog dlg(TRUE, _T("*.ini"), NULL, OFN_HIDEREADONLY, _T("bim导入数据 (*.ini)|*.ini||"), acedGetAcadFrame());
if (dlg.DoModal() != IDOK) return;
std::map<CString, CString> datas1, datas2;
CString name, value;
for (int i = 0; i < m_wndListCtrl.GetItemCount(); ++i)
{
name = m_wndListCtrl.GetItemText(i, 0);
value = m_wndListCtrl.GetItemText(i, 1);
datas1.insert(std::make_pair(name, value));
}
CoreTools::iniFile2BimData(dlg.GetPathName(), datas2);
datas1.insert(datas2.begin(), datas2.end());
m_wndListCtrl.DeleteAllItems();
int idx(0);
std::map<CString, CString>::iterator it(datas1.begin());
for (; it != datas1.end(); ++it)
{
if ((idx == 0 && it->first.Compare(_T("名称")))
|| (idx == 0 && it->first.Compare(_T("颜色")))
|| (idx == 0 && it->first.Compare(_T("材料"))) )
{
AfxMessageBox(_T("文件格式不正确,请保证前三行数据分别为‘名称’‘颜色’‘材料’!"));
break;
}
m_wndListCtrl.InsertItem(idx, it->first);
m_wndListCtrl.SetItemText(idx, 1, it->second);
++idx;
}
}
void CDtygProperty::OnBnClickedOk()
{
AecDbObjXDataMap *pXData(NULL);
if (m_pPart)
pXData = m_pPart->GetSpecialtyData();
else if (m_pMultiEnt)
pXData = m_pMultiEnt->GetSpecialtyData();
if (!pXData) return;
CString sLayer(_T(""));
SH_BIM_BLOCK bims;
CString name(_T("")), value(_T(""));
for (int i = 0; i < m_wndListCtrl.GetItemCount(); ++i)
{
name = m_wndListCtrl.GetItemText(i, 0);
value = m_wndListCtrl.GetItemText(i, 1);
if (name == _T("图层"))
{
sLayer = value;
// 图层不记录在bim属性里面,后面维护麻烦,直接在特性表修改最好
//continue;
}
bims.push_back(std::make_pair(name, value));
}
CoreTools::setBimDatas(*pXData, bims);
CoreTools::getBimData(*pXData, _T("名称"), name);
if (m_pMultiEnt)
{
if (!name.IsEmpty())
pXData->SetAt(_T("NAME"), name);
else
pXData->SetAt(_T("NAME"), _T("异形构筑物(自定义)"));
if (!sLayer.IsEmpty())
m_pMultiEnt->setLayer(sLayer);
}
OnOK();
}
void CDtygProperty::OnNMDblClkList1(NMHDR * pNMHDR, LRESULT * pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
*pResult = 0;
if (pNMItemActivate->hdr.code != NM_DBLCLK) return;
OnBnClickedButton3();
}
BEGIN_MESSAGE_MAP(CDtygProperty, CDialog)
ON_BN_CLICKED(IDC_BUTTON2, &CDtygProperty::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CDtygProperty::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CDtygProperty::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON5, &CDtygProperty::OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON8, &CDtygProperty::OnBnClickedButton8)
ON_BN_CLICKED(IDOK, &CDtygProperty::OnBnClickedOk)
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CDtygProperty::OnNMDblClkList1)
ON_REGISTERED_MESSAGE(WM_XLISTCTRL_COMBO_SELECTION, &CDtygProperty::OnComboSelection)
END_MESSAGE_MAP()
AcDbObjectId CDtygProperty::getLayerByStatisticsType(LPCTSTR sType)
{
CString sTypeStr(sType);
if (sTypeStr == _T("墙"))
{
return KTSetting::InitLayer(_T("LAY_WALL"));
}
else if (sTypeStr == _T("梁"))
{
return KTSetting::InitLayer(_T("LAY_BEAM"));
}
else if (sTypeStr == _T("板"))
{
return KTSetting::InitLayer(_T("LAY_SLAB_DIBAN"));
}
else if (sTypeStr == _T("柱"))
{
return KTSetting::InitLayer(_T("LAY_COLU"));
}
else if (sTypeStr == _T("洞"))
{
return KTSetting::InitLayer(_T("LAY_PART"));
}
else
{
return KTSetting::InitLayer(_T("LAY_YGDT"));
}
return AcDbObjectId();
}
LRESULT CDtygProperty::OnComboSelection(WPARAM nItem, LPARAM nSubItem)
{
if (nItem == 2) // 统计类型
{
CString sItem = m_wndListCtrl.GetItemText(nItem, nSubItem);
AcDbObjectId idLayer = getLayerByStatisticsType(sItem);
CString sLayer(GetLayerNameById(idLayer));
m_wndListCtrl.SetItemText(3, nSubItem, sLayer);
}
return 0L;
}
#pragma endregion
#pragma region CDTYGDlg
IMPLEMENT_DYNAMIC(CDTYGDlg, CDialog)
BEGIN_MESSAGE_MAP(CDTYGDlg, CDialog)
ON_MESSAGE(WM_REFRESH_HLIGHT_ENTITY_MESSAGE, &CDTYGDlg::OnRefreshHlightEntityMsg)
ON_BN_CLICKED(IDOK , &CDTYGDlg::Ok)
ON_BN_CLICKED(IDCANCEL , &CDTYGDlg::Cancel)
ON_MESSAGE(WM_ACAD_KEEPFOCUS, &CDTYGDlg::onAcadKeepFocus)
ON_BN_CLICKED(IDC_BUTTON1, &CDTYGDlg::OnBnClicked1) // 长方体
ON_BN_CLICKED(IDC_BUTTON2, &CDTYGDlg::OnBnClicked2) // 圆住体
ON_BN_CLICKED(IDC_BUTTON3, &CDTYGDlg::OnBnClicked3) // 圆台体
ON_BN_CLICKED(IDC_BUTTON4, &CDTYGDlg::OnBnClicked4) // 棱锥体
ON_BN_CLICKED(IDC_BUTTON7, &CDTYGDlg::OnBnClicked7) // 球体
ON_BN_CLICKED(IDC_BUTTON8, &CDTYGDlg::OnBnClicked8) // 拉伸体
ON_BN_CLICKED(IDC_BUTTON9, &CDTYGDlg::OnBnClicked9) // 旋转体
ON_BN_CLICKED(IDC_BUTTON10, &CDTYGDlg::OnBnClicked10) // 球台体
ON_BN_CLICKED(IDC_BUTTON11, &CDTYGDlg::OnBnClicked11) // 楔体
ON_BN_CLICKED(IDC_BUTTON12, &CDTYGDlg::OnBnClicked12) // 环体
ON_BN_CLICKED(IDC_BUTTON31, &CDTYGDlg::OnBnClicked31) // 位移-移动
ON_BN_CLICKED(IDC_BUTTON36, &CDTYGDlg::OnBnClicked36) // 位移-捕捉点移动
ON_BN_CLICKED(IDC_BUTTON34, &CDTYGDlg::OnBnClicked34) // 位移-复位
ON_BN_CLICKED(IDC_BUTTON27, &CDTYGDlg::OnBnClicked27) // 角度-旋转
ON_BN_CLICKED(IDC_BUTTON28, &CDTYGDlg::OnBnClicked28) // 角度-复位
ON_BN_CLICKED(IDC_BUTTON75, &CDTYGDlg::OnBnClicked75) // 复制
ON_BN_CLICKED(IDC_BUTTON77, &CDTYGDlg::OnBnClicked77) // 镜像
ON_BN_CLICKED(IDC_BUTTON33, &CDTYGDlg::OnBnClicked33) // 修改
ON_BN_CLICKED(IDC_BUTTON32, &CDTYGDlg::OnBnClicked32) // 修改
ON_BN_CLICKED(IDC_BUTTON76, &CDTYGDlg::OnBnClicked76) // 删除
ON_BN_CLICKED(IDC_BUTTON20, &CDTYGDlg::OnBnClicked20) // 隐藏
ON_BN_CLICKED(IDC_BUTTON30, &CDTYGDlg::OnBnClicked30) // 显示
ON_BN_CLICKED(IDC_BUTTON5, &CDTYGDlg::OnBnClicked5) // 保存本地
ON_BN_CLICKED(IDC_BUTTON14, &CDTYGDlg::OnBnClicked14) // 本地载入
ON_BN_CLICKED(IDC_BUTTON6, &CDTYGDlg::OnBnClickedButton6) // 异形堰
ON_BN_CLICKED(IDC_BUTTON15, &CDTYGDlg::OnBnClicked15) // 切割
ON_BN_CLICKED(IDC_BUTTON78, &CDTYGDlg::OnBnClicked78) // 下一个
ON_BN_CLICKED(IDC_BUTTON79, &CDTYGDlg::OnBnClicked79) // 上一个
ON_BN_CLICKED(IDC_BUTTON80, &CDTYGDlg::OnBnClicked80) // 应用
ON_BN_CLICKED(IDC_BUTTON81, &CDTYGDlg::OnBnClicked81) // 开始
ON_NOTIFY(NM_CLICK, IDC_TREE1, &CDTYGDlg::OnNMClickTree1)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CDTYGDlg::OnTvnSelchangedTree1)
ON_NOTIFY(NM_RCLICK, IDC_TREE1, &CDTYGDlg::OnNMRclickTree1)
ON_NOTIFY(NM_DBLCLK, IDC_TREE1, &CDTYGDlg::OnNMDblclkTree1)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BTN_FILL, &CDTYGDlg::OnBnClickedBtnFill)
ON_WM_SHOWWINDOW()
ON_BN_CLICKED(IDC_CHECK_HATCH, &CDTYGDlg::OnBnClickedCheckHatch)
END_MESSAGE_MAP()
CDTYGDlg::CDTYGDlg(CWnd* pParent)
: CDialog(CDTYGDlg::IDD, pParent)
, m_id(AcDbObjectId::kNull)
, m_iMove(0)
, m_iRotate(0)
, m_dMove(.0)
, m_dRotate(.0)
, m_hCurSelItem(NULL)
, m_idSolidTemp(AcDbObjectId::kNull)
, m_iFaceIdx(0)
, m_SolidGeFaces(0)
, m_sHatch(HATCH_DEFAULT)
, m_bAddHatch(TRUE)
{ }
CDTYGDlg::~CDTYGDlg()
{
deleteEntity(m_HligthtID, true);
}
void CDTYGDlg::SetObjectID(AcDbObjectId id)
{
m_id = id;
refreshTree(m_id);
OPENOBJ_BEGIN(m_id, AcDb::kForRead, AecDbMultiPartEntity, pEnt)
{
if (pEnt)
{
m_sHatch = HATCH_DEFAULT;
pEnt->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_SECTION_HATCH, m_sHatch);
CWnd *pWnd = GetDlgItem(IDC_STATIC_HATCH);
if (pWnd) pWnd->ShowWindow(SW_SHOW);
m_wndBtHatch.ShowWindow(SW_SHOW);
m_wndBtHatch.SetWindowText(m_sHatch);
m_wndBtnHatchCheck.ShowWindow(SW_SHOW);
}
else
{
CWnd *pWnd = GetDlgItem(IDC_STATIC_HATCH);
if (pWnd) pWnd->ShowWindow(SW_HIDE);
m_wndBtHatch.ShowWindow(SW_HIDE);
m_wndBtnHatchCheck.ShowWindow(SW_HIDE);
}
}
OPENOBJ_END()
UpdateData(TRUE);
}
void CDTYGDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BUTTON1, m_btn1); // 长方体
DDX_Control(pDX, IDC_BUTTON2, m_btn2); // 圆住体
DDX_Control(pDX, IDC_BUTTON3, m_btn3); // 圆台体
DDX_Control(pDX, IDC_BUTTON4, m_btn4); // 棱锥体
DDX_Control(pDX, IDC_BUTTON7, m_btn7); // 球体
DDX_Control(pDX, IDC_BUTTON8, m_btn8); // 拉伸体
DDX_Control(pDX, IDC_BUTTON9, m_btn9); // 旋转体
DDX_Control(pDX, IDC_BUTTON10, m_btn10); // 球台体
DDX_Control(pDX, IDC_BUTTON11, m_btn11); // 楔体
DDX_Control(pDX, IDC_BUTTON12, m_btn12); // 环体
DDX_Control(pDX, IDC_BUTTON15, m_btn15); // 切割
DDX_Control(pDX, IDC_BUTTON80, m_btnFaceEnd); // 开始选择平面
DDX_Control(pDX, IDC_BUTTON81, m_btnFaceBegin); // 应用选择平面
DDX_Control(pDX, IDC_BUTTON78, m_btnNext); // 上一个面
DDX_Control(pDX, IDC_BUTTON79, m_btnPrev); // 下一个面
DDX_Radio(pDX, IDC_RADIO1, m_iMove);
DDX_Radio(pDX, IDC_RADIO4, m_iRotate);
DDX_Text(pDX, IDC_EDIT1, m_dMove);
DDX_Text(pDX, IDC_EDIT4, m_dRotate);
DDX_Control(pDX, IDC_TREE1, m_wndTree);
DDX_Control(pDX, IDC_BTN_FILL, m_wndBtHatch);// 剖切填充
DDX_Check(pDX, IDC_CHECK_HATCH, m_bAddHatch);
DDX_Text(pDX, IDC_BTN_FILL, m_sHatch);
DDX_Control(pDX, IDC_CHECK_HATCH, m_wndBtnHatchCheck);
}
BOOL CDTYGDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CBitmap bmp;
if (!bmp.LoadBitmap (IDB_BITMAPPRIV))
{
AfxMessageBox(_T ("Can't load bitmap: %x\n"), IDB_BITMAPPRIV);
ASSERT (FALSE);
return FALSE;
}
BITMAP bmpObj;
bmp.GetBitmap (&bmpObj);
UINT nFlags = ILC_COLOR24 | ILC_MASK;
m_Imagelist.Create (16, bmpObj.bmHeight, nFlags, 0, 0);
m_Imagelist.Add (&bmp, RGB (255, 0, 0));
m_wndTree.SetImageList(&m_Imagelist,TVSIL_NORMAL);
//IDB_BITMAP17
CBitmap bmp32;
if (!bmp32.LoadBitmap (IDB_BITMAP17))
{
AfxMessageBox(_T ("Can't load bitmap: IDB_BITMAP17"));
ASSERT (FALSE);
return FALSE;
}
BITMAP bmpObj32;
bmp32.GetBitmap (&bmpObj32);
m_Imagelist32.Create (32, bmpObj32.bmHeight, nFlags, 0, 0);
m_Imagelist32.Add (&bmp32, RGB (255, 0, 0));
m_btn1.SetIcon(m_Imagelist32.ExtractIcon(0));// 长方体
m_btn2.SetIcon(m_Imagelist32.ExtractIcon(1));// 圆住体
m_btn3.SetIcon(m_Imagelist32.ExtractIcon(2));// 圆台体
m_btn4.SetIcon(m_Imagelist32.ExtractIcon(3));// 棱锥体
m_btn7.SetIcon(m_Imagelist32.ExtractIcon(4));// 球体
m_btn10.SetIcon(m_Imagelist32.ExtractIcon(5));// 球台体;
m_btn11.SetIcon(m_Imagelist32.ExtractIcon(6));// 楔体;
m_btn12.SetIcon(m_Imagelist32.ExtractIcon(7));// 环体;
m_btn8.SetIcon(m_Imagelist32.ExtractIcon(8));// 拉伸体
m_btn9.SetIcon(m_Imagelist32.ExtractIcon(9));// 旋转体
m_btn15.SetIcon(m_Imagelist32.ExtractIcon(10));// 旋转体
m_btnFaceBegin.EnableWindow(true);
m_btnFaceEnd.EnableWindow(false);
m_btnNext.EnableWindow(false);
m_btnPrev.EnableWindow(false);
#if NDEBUG
GetDlgItem(IDC_BUTTON6)->EnableWindow(FALSE);
#endif
return TRUE;
}
BOOL CDTYGDlg::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
return CDialog::OnCommand(wParam, lParam);
}
#define ENABLE_BUTTON(id, empty) pWnd = GetDlgItem(id);\
if (pWnd) pWnd->EnableWindow(empty ? FALSE : TRUE)
LRESULT CDTYGDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message == WM_IDLEUPDATECMDUI)
{
std::vector<HTREEITEM> items;
::getSelectItems(m_wndTree, m_wndTree.GetRootItem(), items);
bool empty(items.empty());
CWnd *pWnd(NULL);
ENABLE_BUTTON(IDC_BUTTON76, empty);
ENABLE_BUTTON(IDC_BUTTON20, empty);
ENABLE_BUTTON(IDC_BUTTON30, empty);
ENABLE_BUTTON(IDC_BUTTON31, empty);
ENABLE_BUTTON(IDC_BUTTON36, empty);
ENABLE_BUTTON(IDC_BUTTON34, empty);
ENABLE_BUTTON(IDC_BUTTON27, empty);
ENABLE_BUTTON(IDC_BUTTON28, empty);
ENABLE_BUTTON(IDC_BUTTON75, empty);
ENABLE_BUTTON(IDC_BUTTON77, empty);
// 只要 m_wndTree.GetSelectedItem() 不为空 属性按钮就可用
ENABLE_BUTTON(IDC_BUTTON32, m_wndTree.GetSelectedItem() == NULL);
}
return CDialog::WindowProc(message, wParam, lParam);
}
void CDTYGDlg::OnOK()
{
AcAxDocLock lock;
deleteEntity(m_HligthtID, true);
CDialog::OnOK();
}
void CDTYGDlg::OnCancel()
{
AcAxDocLock lock;
deleteEntity(m_HligthtID, true);
if (m_idSolidTemp.isValid())
{
OnBnClicked80();
}
CDialog::OnCancel();
}
void CDTYGDlg::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);
}
}
void CDTYGDlg::showEntity(bool bShow)
{
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEw)
if (pEw) pEw->setVisibility(bShow ? AcDb::kVisible : AcDb::kInvisible);
OPENOBJ_END()
}
bool CDTYGDlg::HasSelectItem()
{
if (!m_hCurSelItem)
{
AfxMessageBox(_T("请选择一个有效的节点。"));
return false;
}
return true;
}
bool CDTYGDlg::PropertyDlg(HTREEITEM hItem)
{
if (!hItem) return false;
CAcModuleResourceOverride myResources;
TCHAR *psz = (TCHAR*)m_wndTree.GetItemData(hItem);
AcAxDocLock lock;
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
AecDbObjXDataMap *pXData(NULL);
if (!pEnt) return false;
// 判断一下是根节点还是子节点
if (hItem != m_wndTree.GetRootItem())
{
AecDbX3dPart *pPart = pEnt->GetX3dPart(psz);
if (!pPart) return false;
CDtygProperty dlg(pPart);
if (dlg.DoModal() != IDOK) return false;
pEnt->AssertWriteEnabled();
pPart->Create();
pXData = pPart->GetSpecialtyData();
}
else
{
// 非异构单体实体不允许修改属性
if (!isMultiPartEntity(pEnt)) return false;
CDtygProperty dlg(pEnt);
if (dlg.DoModal() != IDOK) return false;
pXData = pEnt->GetSpecialtyData();
}
CString newName = getObjectNameFromBIMData(pXData);
if (!newName.IsEmpty())
m_wndTree.SetItemText(hItem, newName);
}
OPENOBJ_END()
return true;
}
CDTYGDlg::TYPE CDTYGDlg::getType(HTREEITEM hItem)
{
CDTYGDlg::TYPE type(CDTYGDlg::kErr);
TCHAR *psz = (TCHAR*)m_wndTree.GetItemData(hItem);
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
if (!pEnt) return type;
AecDbX3dPart *pPart = pEnt->GetX3dPart(psz);
if (!pPart) return type;
CString sType;
if (!pPart->GetSpecialtyData()->GetAt(_T("DTYG_TYPE"), sType)) return type;
type = ::getType(sType);
OPENOBJ_END()
return type;
}
bool CDTYGDlg::getSelectItems(std::vector<HTREEITEM>& items, bool bTip)
{
::getSelectItems(m_wndTree, m_wndTree.GetRootItem(), items);
if (items.empty() && !m_hCurSelItem && bTip)
{
AfxMessageBox(_T("请选择一个异构体进行操作!"));
return false;
}
if (items.empty() && m_hCurSelItem) items.push_back(m_hCurSelItem);
return !items.empty();
}
void CDTYGDlg::refreshTree(AcDbObjectId & id)
{
OPENOBJ_BEGIN(id, AcDb::kForRead, AecDbBDPipeBase, pEnt)
{
if (!pEnt) return;
m_sObjectName = getObjectName(pEnt);
// 删除所有项
HTREEITEM hRoot = m_wndTree.GetRootItem();
if (hRoot)
{
HTREEITEM hChild = m_wndTree.GetChildItem(hRoot);
DWORD_PTR dw;
while (hChild)
{
dw = m_wndTree.GetItemData(hChild);
if (dw)
{
TCHAR *psz = (TCHAR*)dw;
DELETE_ARR_(psz);
}
hChild = m_wndTree.GetNextItem(hChild, TVGN_NEXT);
}
}
m_wndTree.DeleteAllItems();
hRoot = m_wndTree.InsertItem(m_sObjectName, ITEM_ITEM, ITEM_ITEMSEL, TVI_ROOT, TVI_LAST);
int num = pEnt->GetX3dPartCount();
CString sName(_T("")), guid(_T("")), sType(_T("")), sItem(_T("")), sBoolType(_T(""));
int boolType(0);
for (int i = 0; i < num; ++i)
{
AecDbX3dPart *pPart = pEnt->GetX3dPart(i);
if (!pPart) break;
if (pPart->GetX3dSolidCount() != 1) break;
pPart->GetName(sName);
pPart->GetSpecialtyData()->GetAt(_T("DTYG_TYPE"), sType);
boolType = pPart->GetBoolOperFor();
if (boolType == AcDb::kBoolUnite)
sBoolType = _T("+");
else if (boolType == AcDb::kBoolSubtract)
sBoolType = _T("-");
sItem.Format(_T("%s(%s)(%s)"), sName, sType, sBoolType);
void *pBuffer = makeBuffer(pPart->GetGUID());
HTREEITEM hItem = m_wndTree.InsertItem(sItem, ITEM_ITEM, ITEM_ITEMSEL, hRoot);
m_wndTree.SetItemData(hItem, (DWORD_PTR)pBuffer);
}
m_wndTree.Expand(hRoot, TVE_EXPAND);
}
OPENOBJ_END()
}
void CDTYGDlg::modifyDTYG()
{
if (!HasSelectItem()) return;
if (!m_hCurSelItem) return;
TCHAR *psz = (TCHAR*)m_wndTree.GetItemData(m_hCurSelItem);
if (!psz) return;
CAcModuleResourceOverride myResources;
TYPE t(getType(m_hCurSelItem));
switch (t)
{
case CDTYGDlg::kErr:
acutPrintf(_T("\n错误的选择类型!"));
break;
case CDTYGDlg::kBox:
case CDTYGDlg::kCylinder:
case CDTYGDlg::kCone:
case CDTYGDlg::kPyramid:
case CDTYGDlg::kCircleTorus:
case CDTYGDlg::kRectTorus:
case CDTYGDlg::kXTorus:
case CDTYGDlg::kWedge:
case CDTYGDlg::kDrums:
case CDTYGDlg::kSpere:
{
modifyItem(m_id, psz);
}
break;
case CDTYGDlg::kExtrude:
{
if (!::IsWindow(g_XGExtrud::instance().GetSafeHwnd()))
g_XGExtrud::instance().Create(IDD_DTYG_MODIFY_EXTRUD, this);
if (!g_XGExtrud::instance().init(m_id, psz, m_HligthtID))
{
g_XGExtrud::instance().ShowWindow(SW_HIDE);
return;
}
g_XGExtrud::instance().CenterWindow();
g_XGExtrud::instance().ShowWindow(SW_SHOW);
}
break;
case CDTYGDlg::kRevolve:
{
if (!::IsWindow(g_XGRevolve::instance().GetSafeHwnd()))
g_XGRevolve::instance().Create(IDD_DTYG_MODIFY_DEF, this);
if (!g_XGRevolve::instance().init(m_id, psz, m_HligthtID))
{
g_XGRevolve::instance().ShowWindow(SW_HIDE);
return;
}
g_XGRevolve::instance().CenterWindow();
g_XGRevolve::instance().ShowWindow(SW_SHOW);
}
break;
case CDTYGDlg::kLoft:
{
if (!::IsWindow(g_XGLoft::instance().GetSafeHwnd()))
g_XGLoft::instance().Create(IDD_DTYG_MODIFY_LOFT, this);
if (!g_XGLoft::instance().init(m_id, psz, m_HligthtID))
{
g_XGLoft::instance().ShowWindow(SW_HIDE);
return;
}
g_XGLoft::instance().CenterWindow();
g_XGLoft::instance().ShowWindow(SW_SHOW);
}
break;
case CDTYGDlg::kSweep:
{
if (!::IsWindow(g_XGSweep::instance().GetSafeHwnd()))
g_XGSweep::instance().Create(IDD_DTYG_MODIFY_DEF, this);
if (!g_XGSweep::instance().init(m_id, psz, m_HligthtID))
{
g_XGSweep::instance().ShowWindow(SW_HIDE);
return;
}
g_XGSweep::instance().CenterWindow();
g_XGSweep::instance().ShowWindow(SW_SHOW);
}
break;
case CDTYGDlg::kCut:
{
if (!::IsWindow(g_XGCut::instance().GetSafeHwnd()))
g_XGCut::instance().Create(IDD_DTYG_MODIFY_DEF, this);
if (!g_XGCut::instance().init(m_id, psz, m_HligthtID))
{
g_XGCut::instance().ShowWindow(SW_HIDE);
return;
}
g_XGCut::instance().CenterWindow();
g_XGCut::instance().ShowWindow(SW_SHOW);
}
break;
default:
break;
}
}
void CDTYGDlg::refreshHlightEntity()
{
if (m_hCurSelItem == NULL) return;
AcAxDocLock lock;
bool bCut(false);
CString sType(_T(""));
AcDbEntity *pEnt(NULL);
AecDbX3dPart *pPart(NULL);
AcDbX3dSolid *pXSolid(NULL);
TCHAR *psz = (TCHAR*)m_wndTree.GetItemData(m_hCurSelItem);
OPENOBJ_BEGIN(m_id, AcDb::kForRead, AecDbBDPipeBase, pBase)
{
if (!pBase) return;
pPart = pBase->GetX3dPart(psz);
if (!pPart) return;
if (pPart->GetX3dSolidCount() > 0)
pXSolid = pPart->GetX3dSolid(0);
if (!pXSolid) return;
if (!pPart->GetSpecialtyData()->GetAt(_T("DTYG_TYPE"), sType)) return;
if (::getType(sType) == kCut)
{
AcGePoint3d pt;
CString sReg(_T(""));
pXSolid->GetExturd2Data(sReg, pt, pt);
AcDbRegion *pReg(CoreTools::StringToRegion(sReg));
if (!pReg) return;
pEnt = pReg;
}
else
{
AcDb3dSolid *pSolid = pXSolid->GetDraw3dSolid();
if (!pSolid) return;
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);
pEnt = pSolid;
}
}
OPENOBJ_END();
if (m_HligthtID.isValid()) deleteEntity(m_HligthtID, true);
AcGeMatrix3d mat;
if (getTransfromOf3DPart(mat));
{
pEnt->transformBy(mat);
}
pEnt->setColorIndex(6);
CoreTools::AddToModelSpace(pEnt, NULL, true, &m_HligthtID);
/*if (acdbCurDwg())
{
Acad::ErrorStatus es;
if (acdbCurDwg()->addAcDbObject(pEnt) == Acad::eOk)
{
m_HligthtID = pEnt->objectId();
AcDbBlockTable* pTbl = NULL;
if (Acad::eOk == (es = acdbCurDwg()->getBlockTable(pTbl, AcDb::kForRead)))
{
AcDbBlockTableRecord* pBTR = NULL;
if (Acad::eOk == (es = pTbl->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForWrite)))
{
pEnt->setOwnerId(pBTR->objectId());
pBTR->close();
}
pTbl->close();
}
pEnt->close();
}
}*/
if (!m_HligthtID.isValid())
DELETE_PTR(pEnt);
acedPostCommand(_T("regen "));
}
bool CDTYGDlg::getTransfromOf3DPart(AcGeMatrix3d & mat)
{
if (m_hCurSelItem == NULL) return false;
AcGePoint3d ptOrg;
AcGeVector3d vtMove, vtX, vtY, vtZ;
double dXRo(.0), dYRo(.0), dZRo(.0);
bool bCut(false);
AecDbX3dPart *pPart(NULL);
AcDbX3dSolid *pXSolid(NULL);
TCHAR *psz = (TCHAR*)m_wndTree.GetItemData(m_hCurSelItem);
OPENOBJ_BEGIN(m_id, AcDb::kForRead, AecDbBDPipeBase, pEnt)
{
if (!pEnt) return false;
pPart = pEnt->GetX3dPart(psz);
if (!pPart) return false;
if (pPart->GetX3dSolidCount() > 0)
pXSolid = pPart->GetX3dSolid(0);
if (!pXSolid) return false;
vtMove = pPart->GetMove();
dXRo = pPart->GetRotate(0);
dYRo = pPart->GetRotate(1);
dZRo = pPart->GetRotate(2);
pPart->GetAxis(0, vtX);
pPart->GetAxis(1, vtY);
pPart->GetAxis(2, vtZ);
ptOrg = pPart->GetOrgPoint();
}
OPENOBJ_END();
AcGeMatrix3d _mat;
_mat.setToIdentity();
if (!vtMove.isZeroLength())
{
_mat.setToTranslation(vtMove);
ptOrg.transformBy(_mat);
}
if (!EQUAL_ZERO(dXRo))
{
_mat.setToIdentity();
_mat.setToRotation(dXRo, vtX, ptOrg);
mat *= _mat;
}
if (!EQUAL_ZERO(dYRo))
{
_mat.setToIdentity();
_mat.setToRotation(dYRo, vtY, ptOrg);
mat *= _mat;
}
if (!EQUAL_ZERO(dZRo))
{
_mat.setToIdentity();
_mat.setToRotation(dZRo, vtZ, ptOrg);
mat *= _mat;
}
if (!vtMove.isZeroLength())
{
_mat.setToTranslation(vtMove);
mat *= _mat;
}
return true;
}
LONG_PTR CDTYGDlg::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;
}
LRESULT CDTYGDlg::OnRefreshHlightEntityMsg(WPARAM, LPARAM)
{
refreshHlightEntity();
return 0;
}
void CDTYGDlg::OnBnClickedButton6() // 异形堰
{
addX3dPartAndTreeItem(m_id, m_wndTree, CDTYGDlg::kWeir);
}
void CDTYGDlg::OnBnClicked1() // 长方体
{
addX3dPartAndTreeItem(m_id, m_wndTree, CDTYGDlg::kBox);
}
void CDTYGDlg::OnBnClicked2() // 圆住体
{
addX3dPartAndTreeItem(m_id, m_wndTree, CDTYGDlg::kCylinder);
}
void CDTYGDlg::OnBnClicked3() //圆台体
{
addX3dPartAndTreeItem(m_id, m_wndTree, CDTYGDlg::kCone);
}
void CDTYGDlg::OnBnClicked4() // 棱锥体
{
addX3dPartAndTreeItem(m_id, m_wndTree, CDTYGDlg::kPyramid);
}
void CDTYGDlg::OnBnClicked7() // 球体
{
addX3dPartAndTreeItem(m_id, m_wndTree, CDTYGDlg::kSpere);
}
void CDTYGDlg::OnBnClicked8() // 拉伸体
{
addX3dPartAndTreeItem(m_id, m_wndTree, CDTYGDlg::kExtrude);
}
void CDTYGDlg::OnBnClicked9() // 旋转体
{
addX3dPartAndTreeItem(m_id, m_wndTree, CDTYGDlg::kRevolve);
}
void CDTYGDlg::OnBnClicked10() // 球台体
{
addX3dPartAndTreeItem(m_id, m_wndTree, CDTYGDlg::kDrums);
}
void CDTYGDlg::OnBnClicked11() // 放样体
{
addX3dPartAndTreeItem(m_id, m_wndTree, CDTYGDlg::kLoft);
}
void CDTYGDlg::OnBnClicked12() // 扫掠体
{
addX3dPartAndTreeItem(m_id, m_wndTree, CDTYGDlg::kSweep);
}
void CDTYGDlg::OnBnClicked15() // 切割
{
addX3dPartAndTreeItem(m_id, m_wndTree, CDTYGDlg::kCut);
}
void CDTYGDlg::OnBnClicked78() // 下一个面
{
AcAxDocLock lock;
if (++m_iFaceIdx >= m_SolidSubentIds.size()) m_iFaceIdx = 0;
setFaceClr(m_idSolidTemp, m_SolidSubentIds, m_iFaceIdx , 1);
}
void CDTYGDlg::OnBnClicked79() // 上一个面
{
AcAxDocLock lock;
if (--m_iFaceIdx < 0) m_iFaceIdx = m_SolidSubentIds.size() - 1;
setFaceClr(m_idSolidTemp, m_SolidSubentIds, m_iFaceIdx , 1);
}
void CDTYGDlg::OnBnClicked80() // 应用
{
AcAxDocLock lock;
std::set<int> exp;
exp.insert(IDC_BUTTON78);
exp.insert(IDC_BUTTON79);
exp.insert(IDC_BUTTON80);
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 CDTYGDlg::OnBnClicked81() // 开始
{
OPENOBJ_BEGIN(m_id, AcDb::kForRead, AecDbMultiPartEntity, pEnt)
if (pEnt)
{
if (pEnt->GetX3dPartCount() < 1)
{
AfxMessageBox(_T("请先创建一个几何体!"));
return;
}
}
OPENOBJ_END()
AcAxDocLock lock;
std::set<int> exp;
exp.insert(IDC_BUTTON78);
exp.insert(IDC_BUTTON79);
exp.insert(IDC_BUTTON80);
enableWindows(false, exp);
#ifdef ZWCAD
acedPostCommand(_T("_SHADEMODE _2D "));
#else
acedPostCommand(_T("_vscurrent 2 "));
#endif
do
{
AcDb3dSolid *pSolid = BrepOper::get3DSolidBySH(m_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_BUTTON78);
exp.insert(IDC_BUTTON79);
exp.insert(IDC_BUTTON80);
enableWindows(true, exp);
}
void CDTYGDlg::OnBnClicked31() // 位移-移动
{
UpdateData(TRUE);
AcAxDocLock lock;
std::vector<HTREEITEM> items;
if (!getSelectItems(items)) return;
AcGeVector3d vtDir(getDir(m_iMove));
vtDir *= m_dMove;
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
if (!pEnt) return;
for (size_t i = 0; i < items.size(); ++i)
{
HTREEITEM &item(items[i]);
TCHAR *guid = (TCHAR*)m_wndTree.GetItemData(item);
if (!guid) continue;
pEnt->AddMove(guid, vtDir);
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CDTYGDlg::OnBnClicked36() // 位移-捕捉点移动
{
AcAxDocLock lock;
UpdateData(TRUE);
std::vector<HTREEITEM> items;
if (!getSelectItems(items)) return;
ads_point pt1,pt2;
if (acedGetPoint(NULL, _T("\n请选择基点:"), pt1) != RTNORM) return;
acutPrintf(_T("\n基点(%.3f, %.3f, %.3f)"), pt1[0], pt1[1], pt1[2]);
if (acedGetPoint(pt1, _T("\n请选择目标点:"), pt2) != RTNORM) return;
acutPrintf(_T("\n目标点(%.3f, %.3f, %.3f)"), pt2[0], pt2[1], pt2[2]);
ads_point pt11, pt22;
acdbUcs2Wcs(pt1, pt11, false);
acdbUcs2Wcs(pt2, pt22, false);
AcGeVector3d vtMove = asPnt3d(pt22) - asPnt3d(pt11);
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
if (!pEnt) return;
for (size_t i = 0; i < items.size(); ++i)
{
HTREEITEM &item(items[i]);
TCHAR *guid = (TCHAR*)m_wndTree.GetItemData(item);
if (!guid) continue;
pEnt->AddMove(guid, vtMove);
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CDTYGDlg::OnBnClicked34() // 位移-复位
{
AcAxDocLock lock;
std::vector<HTREEITEM> items;
if (!getSelectItems(items)) return;
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
if (!pEnt) return;
for (size_t i = 0; i < items.size(); ++i)
{
HTREEITEM &item(items[i]);
TCHAR *guid = (TCHAR*)m_wndTree.GetItemData(item);
if (!guid) continue;
pEnt->ResetMove(guid);
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CDTYGDlg::OnBnClicked27() // 角度-旋转
{
AcAxDocLock lock;
UpdateData(TRUE);
std::vector<HTREEITEM> items;
if (!getSelectItems(items)) return;
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
if (!pEnt) return;
for (size_t i = 0; i < items.size(); ++i)
{
HTREEITEM &item(items[i]);
TCHAR *guid = (TCHAR*)m_wndTree.GetItemData(item);
if (!guid) continue;
pEnt->SetRotation(guid, m_iRotate, CoreTools::A2R(m_dRotate));
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CDTYGDlg::OnBnClicked28() // 角度-复位
{
AcAxDocLock lock;
UpdateData(TRUE);
std::vector<HTREEITEM> items;
if (!getSelectItems(items)) return;
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
if (!pEnt) return;
for (size_t i = 0; i < items.size(); ++i)
{
HTREEITEM &item(items[i]);
TCHAR *guid = (TCHAR*)m_wndTree.GetItemData(item);
if (!guid) continue;
pEnt->ResetRotation(guid, -1);
}
}
OPENOBJ_END()
refreshHlightEntity();
}
void CDTYGDlg::OnBnClicked75() // 复制
{
UpdateData(TRUE);
std::vector<HTREEITEM> items;
if (!getSelectItems(items)) return;
KTCADSysVar<int> var1(_T("ORTHOMODE"), 1);
AcGePoint3d ptFr,ptTo;
//选择起点,选择终点
CString sTip = _T("\n请指定基点:");
int nRes = SelectPoint(sTip, NULL, ptFr);
if (nRes != RTNORM) return;
sTip = _T("\n指定第二个点:");
nRes = SelectPoint(sTip, &ptFr, ptTo);
if (nRes != RTNORM) return;
AcAxDocLock lock;
AcGeVector3d vtMove;
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
if (!pEnt) return;
for (size_t i = 0; i < items.size(); ++i)
{
HTREEITEM &item(items[i]);
TCHAR *guid = (TCHAR*)m_wndTree.GetItemData(item);
if (!guid) continue;
AecDbX3dPart *pPart = pEnt->GetX3dPart(guid);
if (!pPart) continue;
vtMove = ptTo - ptFr;
AecDbX3dPart *pNew = new AecDbX3dPart(*pPart);
pNew->ReCreateGUID();
pNew->AddMove(vtMove);
pEnt->AddX3dPart(pNew, pPart->GetBoolOperFor());
CString newName(_T("new"));
pPart->GetName(newName);
newName += _T("_1");
addItem(pNew, m_wndTree, newName);
}
}
OPENOBJ_END()
acedPostCommand(_T("regen "));
}
void CDTYGDlg::OnBnClicked77() // 镜像
{
UpdateData(TRUE);
std::vector<HTREEITEM> items;
if (!getSelectItems(items)) return;
KTCADSysVar<int> var1(_T("ORTHOMODE"), 1);
AcGePoint3d ptFr,ptTo;
//选择起点,选择终点
CString sTip = _T("\n请指定基点:");
int nRes = SelectPoint(sTip, NULL, ptFr);
if (nRes != RTNORM) return;
sTip = _T("\n指定第二个点:");
nRes = SelectPoint(sTip, &ptFr, ptTo);
if (nRes != RTNORM) return ;
ads_point pt;
struct resbuf rb;
acedGetVar(_T("VIEWDIR"), &rb);
ads_point_set(rb.resval.rpoint, pt);
ads_point viewDir;
acdbUcs2Wcs(pt, viewDir, false);
AcGeVector3d vtView = asVec3d(viewDir);
AcGePlane planView;
planView.set(AcGePoint3d::kOrigin, vtView);
ptFr = ptFr.orthoProject(planView);
ptTo = ptTo.orthoProject(planView);
AcAxDocLock lock;
AcGeVector3d vtMir;
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
if (!pEnt) return;
for (size_t i = 0; i < items.size(); ++i)
{
HTREEITEM &item(items[i]);
TCHAR *guid = (TCHAR*)m_wndTree.GetItemData(item);
if (!guid) continue;
AecDbX3dPart *pPart = pEnt->GetX3dPart(guid);
if (!pPart) continue;
vtMir = ptTo - ptFr;
AcGeMatrix3d mat;
mat.setToMirroring(AcGeLine3d(ptFr, ptTo));
AecDbX3dPart *pNew = new AecDbX3dPart(*pPart);
CString newName(_T("new"));
pPart->GetName(newName);
newName += _T("_1");
pNew->ReCreateGUID();
pNew->AddMove(mat);
pEnt->AddX3dPart(pNew, pPart->GetBoolOperFor());
addItem(pNew, m_wndTree, newName);
}
}
OPENOBJ_END()
}
void CDTYGDlg::OnBnClicked33() // 刷新
{
refreshTree(m_id);
}
void CDTYGDlg::OnBnClicked32() // 修改
{
PropertyDlg(m_wndTree.GetSelectedItem());
}
void CDTYGDlg::OnBnClicked76() // 删除
{
std::vector<HTREEITEM> items;
if (!getSelectItems(items)) return;
int nRes = AfxMessageBox(_T("删除为永久性删除,是否删除?"), MB_YESNO);
if (nRes == IDNO) return;
delItem(m_id, m_wndTree, items);
//for (size_t i = 0; i < items.size(); ++i)
//{
// delItem(m_id, m_wndTree, items[i]);
//}
deleteEntity(m_HligthtID);
acedPostCommand(_T("regen "));
}
void CDTYGDlg::OnBnClicked20() // 隐藏、显示
{
AcAxDocLock lock;
std::vector<HTREEITEM> items;
if (!getSelectItems(items)) return;
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
if (!pEnt) return;
pEnt->AssertWriteEnabled();
for (size_t i = 0; i < items.size(); ++i)
{
TCHAR *guid = (TCHAR*)m_wndTree.GetItemData(items[i]);
if (!guid) continue;
AecDbX3dPart *pPart = pEnt->GetX3dPart(guid);
if (!pPart) continue;
pPart->SetHide(true);
pPart->Create();
}
}
OPENOBJ_END()
deleteEntity(m_HligthtID);
acedPostCommand(_T("regen "));
}
void CDTYGDlg::OnBnClicked30()
{
AcAxDocLock lock;
std::vector<HTREEITEM> items;
if (!getSelectItems(items)) return;
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
if (!pEnt) return;
pEnt->AssertWriteEnabled();
for (size_t i = 0; i < items.size(); ++i)
{
TCHAR *guid = (TCHAR*)m_wndTree.GetItemData(items[i]);
if (!guid) continue;
AecDbX3dPart *pPart = pEnt->GetX3dPart(guid);
if (!pPart) continue;
pPart->SetHide(false);
pPart->Create();
}
}
OPENOBJ_END()
acedPostCommand(_T("regen "));
}
void CDTYGDlg::OnBnClicked5() // 保存本地
{
}
void CDTYGDlg::OnBnClicked14() // 本地载入
{
AcAxDocLock lock;
}
void CDTYGDlg::OnNMClickTree1(NMHDR * pNMHDR, LRESULT * pResult)
{
CPoint point;
::GetCursorPos(&point);
m_wndTree.ScreenToClient(&point);
UINT uFlags;
HTREEITEM hItem = m_wndTree.HitTest(point, &uFlags), hP(NULL);
if (hItem == NULL) return;
// 判断 uFlags
if (uFlags == TVHT_ONITEMSTATEICON) // check框
{
CheckChildItem(m_wndTree, hItem, !m_wndTree.GetCheck(hItem));
}
m_wndTree.SelectItem(hItem);
*pResult = 0;
}
void CDTYGDlg::OnNMRclickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;
CPoint point,ptcursor;
::GetCursorPos(&point);
ptcursor = point;
m_wndTree.ScreenToClient(&point);
UINT uFlags;
HTREEITEM hItem = m_wndTree.HitTest(point,&uFlags);
if (!hItem) return;
m_wndTree.SelectItem(hItem);
CDTYGDlg::TYPE type(getType(hItem));
if (type == kErr) return;
CMenu menu;
menu.CreatePopupMenu();
std::vector<HTREEITEM> items;
bool bMulti = getSelectItems(items, false);
if (items.size() > 1)
{
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_COLOR, _T("颜色(&Y)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_NAME, _T("改名(&G)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_MOVE, _T("移动(&I)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_HIDE, _T("隐藏(&H)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_SHOW, _T("显示(&V)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_MIRROR, _T("镜像(&R)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_COPY, _T("复制(&C)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_DELETE, _T("删除(&D)"));
}
else
{
//m_wndTree.SetCheck(hItem, TRUE);
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_COLOR, _T("颜色(&Y)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_NAME, _T("改名(&G)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_MOVE, _T("移动(&I)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_HIDE, _T("隐藏(&H)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_SHOW, _T("显示(&V)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_MIRROR, _T("镜像(&R)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_COPY, _T("复制(&C)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_DELETE, _T("删除(&D)"));
//menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_PROPERTY,_T("属性(&P)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_DTYG_MODIFY, _T("修改(&M)"));
}
int nID = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, ptcursor.x, ptcursor.y, &m_wndTree);
switch(nID)
{
case ID_DTYG_COPY:
{
OnBnClicked75();
break;
}
case ID_DTYG_MIRROR:
{
OnBnClicked77();
break;
}
case ID_DTYG_MOVE:
{
OnBnClicked36();
break;
}
case ID_DTYG_MODIFY:
{
modifyDTYG();
break;
}
case ID_DTYG_HIDE:
{
OnBnClicked20();
break;
}
case ID_DTYG_SHOW:
{
OnBnClicked30();
break;
}
case ID_DTYG_PROPERTY:
{
if (!PropertyDlg(hItem)) return;
break;
}
case ID_DTYG_DELETE:
{
OnBnClicked76();
break;
}
case ID_DTYG_NAME:
{
CString sName = m_wndTree.GetItemText(hItem);
if (!CoreTools::getNameByDialog(_T("输入新名称"), _T("新名称"), sName)) return;
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
if (!pEnt) break;
for (size_t i = 0; i < items.size(); ++i)
{
TCHAR *guid = (TCHAR*)m_wndTree.GetItemData(items[i]);
if (!guid) continue;
AecDbX3dPart *pPart = pEnt->GetX3dPart(guid);
if (!pPart) continue;
if (pPart->GetSpecialtyData()->SetAt(_T("user0"), CString(_T("名称:")) + sName))
{
pPart->SetName(sName);
m_wndTree.SetItemText(items[i], sName);
}
}
}
OPENOBJ_END()
break;
}
case ID_DTYG_COLOR:
{
AcAxDocLock lock;
AcCmColor clr;
#if ARX < 24
clr.setColorMethod(AcCmEntityColor::kByACI);
#endif
if (!acedSetColorDialogTrueColor(clr, Adesk::kTrue, clr, AcCm::kACITab)) return;
OPENOBJ_BEGIN(m_id, AcDb::kForWrite, AecDbBDPipeBase, pEnt)
{
if (!pEnt) break;
pEnt->AssertWriteEnabled();
for (size_t i = 0; i < items.size(); ++i)
{
TCHAR *guid = (TCHAR*)m_wndTree.GetItemData(items[i]);
if (!guid) continue;
AecDbX3dPart *pPart = pEnt->GetX3dPart(guid);
if (!pPart) continue;
pPart->GetSpecialtyData()->SetAt(_T("user1"), getClrString(clr.colorIndex()));
pPart->Create();
}
}
OPENOBJ_END()
acedPostCommand(_T("regen "));
break;
}
default:
break;
}
}
void CDTYGDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult) //
{
HTREEITEM hRoot = m_wndTree.GetRootItem();
m_hCurSelItem = m_wndTree.GetSelectedItem();
if (hRoot == m_hCurSelItem)
{
m_hCurSelItem = NULL;
return;
}
refreshHlightEntity();
}
void CDTYGDlg::OnNMDblclkTree1(NMHDR *pNMHDR, LRESULT *pResult) // 双击修改
{
HTREEITEM hDblItem = m_wndTree.GetSelectedItem();
if (hDblItem != m_wndTree.GetRootItem())
{
// 子实体不需要修改属性了
return;
//if (!HasSelectItem()) return;
//TYPE type(getType(m_hCurSelItem));
//if (type == kRevolve || type == kExtrude || type == kLoft || type == kSweep)
// PropertyDlg(m_hCurSelItem);
//else
// OnBnClicked32();
}
else
{
PropertyDlg(hDblItem);
}
}
extern bool __cdecl acedHatchPalletteDialog(wchar_t const* , bool , wchar_t *&);
void CDTYGDlg::OnBnClickedBtnFill()
{
UpdateData();
TCHAR *psz = new TCHAR[1024];
::memset(psz, 0, sizeof(TCHAR) * 1024);
CString sHatch;
if (!m_sHatch.IsEmpty())
sHatch = m_sHatch;
if (acedHatchPalletteDialog(sHatch, false, psz))
{
m_sHatch = psz;
m_wndBtHatch.SetWindowText(m_sHatch);
}
delete[] psz;
OPENOBJ_BEGIN(m_id, AcDb::kForRead, AecDbMultiPartEntity, pEnt)
{
if (pEnt)
{
if (!m_sHatch.IsEmpty())
pEnt->GetSpecialtyData(AcDb::kForRead)->SetAt(KEY_SECTION_HATCH, m_sHatch);
}
}
OPENOBJ_END()
}
void CDTYGDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
// TODO: Add your message handler code here
}
void CDTYGDlg::OnBnClickedCheckHatch()
{
UpdateData();
m_wndBtHatch.EnableWindow(m_bAddHatch);
if (!m_bAddHatch)
m_sHatch = HATCH_NO_NEED;
else
m_sHatch = HATCH_DEFAULT;
UpdateData(FALSE);
}
#pragma endregion
static AcCm::DialogTabs g_acdt = (AcCm::DialogTabs)(AcCm::kACITab);
#pragma region CBoxDlg
IMPLEMENT_DYNAMIC(CBoxDlg, CDialog)
CBoxDlg::CBoxDlg(CWnd* pParent /*=NULL*/)
: CDialog(CBoxDlg::IDD, pParent)
, m_dX(100)
, m_dY(100)
, m_dZ(100)
, m_pData(NULL)
, m_iSub(0)
, m_clr(256)
{
GET_CACHE(CBoxDlg, %f%f%f%d%d, &m_dX, &m_dY, &m_dZ, &m_clr, &m_iSub);
}
CBoxDlg::~CBoxDlg()
{
}
void CBoxDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDITX, m_dX);
DDX_Text(pDX, IDC_EDITY, m_dY);
DDX_Text(pDX, IDC_EDITZ, m_dZ);
DDX_Check(pDX, IDC_CHK_SUB, m_iSub);
}
BEGIN_MESSAGE_MAP(CBoxDlg, CDialog)
ON_BN_CLICKED(IDOK, &CBoxDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_STATIC_COLOR, OnStaticColor)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
BOOL CBoxDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if (m_pData != NULL)
{
AecEqui::XBox* pBox = (AecEqui::XBox*)m_pData;
m_dX = pBox->dL;
m_dY = pBox->dW;
m_dZ = pBox->dH;
}
UpdateData(FALSE);
return TRUE;
}
void CBoxDlg::OnBnClickedOk()
{
UpdateData();
if ( fabs(m_dX) < 1.e-3 ||
fabs(m_dY) < 1.e-3 ||
fabs(m_dZ) < 1.e-3 )
{
AfxMessageBox(_T("长宽高不能为0,请输入长宽高的数值!"));
return;
}
if (m_pData != NULL)
{
AecEqui::XBox* pBox = (AecEqui::XBox*)m_pData;
pBox->dL = m_dX;
pBox->dW = m_dY;
pBox->dH = m_dZ;
}
SET_CACHE(CBoxDlg, %f%f%f%d%d, m_dX, m_dY, m_dZ, m_clr, m_iSub);
OnOK();
}
void CBoxDlg::OnStaticColor()
{
AcCmColor clr;
#if ARX < 24
clr.setColorMethod(AcCmEntityColor::kByACI);
#endif
clr.setColorIndex(256);
if (acedSetColorDialogTrueColor(clr, Adesk::kTrue, clr, g_acdt) == Adesk::kFalse) return;
m_clr = clr.colorIndex();
Invalidate();
}
HBRUSH CBoxDlg::OnCtlColor(CDC * pDC, CWnd * pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_STATIC)
{
if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_COLOR)
{
CRect rc;
pWnd->GetClientRect(rc);
pDC->FillSolidRect(rc, acedGetRGB(m_clr));
}
}
return hbr;
}
AcDbX3dSolid * CBoxDlg::makeSolid(const AcGePoint3d &ptOrg, const AcGeVector3d &vtZ)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->Create(AcDbX3dSolid::kBox, ptOrg + vtZ * m_dZ * .5, vtZ, 3, m_dX, m_dY, m_dZ))
return pSolid;
DELETE_PTR(pSolid);
return NULL;
}
#pragma endregion
#pragma region CCylinderDlg
IMPLEMENT_DYNAMIC(CCylinderDlg, CDialog)
CCylinderDlg::CCylinderDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCylinderDlg::IDD, pParent)
, m_dR(100)
, m_dH(300)
, m_pData(NULL)
, m_iSub(0)
, m_clr(256)
{
GET_CACHE(CCylinderDlg, %f%f%d%d, &m_dR, &m_dH, &m_clr, &m_iSub);
}
CCylinderDlg::~CCylinderDlg()
{
}
void CCylinderDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDITR, m_dR);
DDX_Text(pDX, IDC_EDITH, m_dH);
DDX_Check(pDX, IDC_CHK_SUB, m_iSub);
}
BEGIN_MESSAGE_MAP(CCylinderDlg, CDialog)
ON_BN_CLICKED(IDOK, &CCylinderDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_STATIC_COLOR, OnStaticColor)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
BOOL CCylinderDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if (m_pData != NULL)
{
AecEqui::XCylinder* pCyln = (AecEqui::XCylinder*)m_pData;
m_dR = pCyln->dr;
m_dH = pCyln->dH;
UpdateData(FALSE);
}
return TRUE;
}
void CCylinderDlg::OnBnClickedOk()
{
UpdateData();
if (m_dR < 1.e-3 || m_dH < 1.e-3)
{
AfxMessageBox(_T("圆柱的半径和高度尺寸不能为0!请重新输入数据!"));
return;
}
if (m_pData != NULL)
{
AecEqui::XCylinder* pCyln = (AecEqui::XCylinder*)m_pData;
pCyln->dr = m_dR;
pCyln->dH = m_dH;
}
SET_CACHE(CCylinderDlg, %f%f%d%d, m_dR, m_dH, m_clr, m_iSub);
OnOK();
}
void CCylinderDlg::OnStaticColor()
{
AcCmColor clr;
#if ARX < 24
clr.setColorMethod(AcCmEntityColor::kByACI);
#endif
clr.setColorIndex(256);
if (acedSetColorDialogTrueColor(clr, Adesk::kTrue, clr, g_acdt) == Adesk::kFalse) return;
m_clr = clr.colorIndex();
Invalidate();
}
HBRUSH CCylinderDlg::OnCtlColor(CDC * pDC, CWnd * pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_STATIC)
{
if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_COLOR)
{
CRect rc;
pWnd->GetClientRect(rc);
pDC->FillSolidRect(rc, acedGetRGB(m_clr));
}
}
return hbr;
}
AcDbX3dSolid * CCylinderDlg::makeSolid(const AcGePoint3d &ptOrg, const AcGeVector3d &vtZ)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->Create(AcDbX3dSolid::kCylinder, ptOrg + vtZ * m_dH * .5, vtZ, 2, m_dR, m_dH))
return pSolid;
DELETE_PTR(pSolid);
return NULL;
}
#pragma endregion
#pragma region CConeDLg
IMPLEMENT_DYNAMIC(CConeDLg, CDialog)
CConeDLg::CConeDLg(CWnd* pParent /*=NULL*/)
: CDialog(CConeDLg::IDD, pParent)
, m_dr(100)
, m_dR(300)
, m_dH(400)
, m_dXOffset(0)
, m_bIs90Tr(FALSE)
, m_pData(NULL)
, m_iSub(0)
, m_clr(256)
{
GET_CACHE(CConeDLg, %f%f%f%f%d%d%d, &m_dr, &m_dR, &m_dH, &m_dXOffset, &m_bIs90Tr, &m_clr, &m_iSub);
return;
}
CConeDLg::~CConeDLg()
{
}
AcDbX3dSolid * CConeDLg::makeSolid(const AcGePoint3d &ptOrg, const AcGeVector3d &vtZ)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->Create(AcDbX3dSolid::kCone, ptOrg + vtZ * m_dH * .5, vtZ, 3, m_dR, m_dr, m_dH))
return pSolid;
DELETE_PTR(pSolid);
return NULL;
}
void CConeDLg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDITR1, m_dr);
DDX_Text(pDX, IDC_EDITR2, m_dR);
DDX_Text(pDX, IDC_EDITH, m_dH);
DDX_Text(pDX, IDC_EDITXOFFSET, m_dXOffset);
DDX_Check(pDX, IDC_CHECK90, m_bIs90Tr);
DDX_Check(pDX, IDC_CHK_SUB, m_iSub);
}
BEGIN_MESSAGE_MAP(CConeDLg, CDialog)
ON_BN_CLICKED(IDOK, &CConeDLg::OnBnClickedOk)
ON_BN_CLICKED(IDC_CHECK90, &CConeDLg::OnBnClickedCheck90)
ON_BN_CLICKED(IDC_STATIC_COLOR, OnStaticColor)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
BOOL CConeDLg::OnInitDialog()
{
CDialog::OnInitDialog();
if (m_pData != NULL)
{
AecEqui::XCone* pCone = (AecEqui::XCone*)m_pData;
m_dr = pCone->dr;
m_dR = pCone->dR;
m_dH = pCone->dH;
m_dXOffset = pCone->dXOffset;
}
UpdateData(FALSE);
return TRUE;
}
void CConeDLg::OnBnClickedOk()
{
UpdateData();
if (m_dr < 1.e-3 && m_dR < 1.e-3 )
{
AfxMessageBox(_T("圆台的顶半径和底半径至少其一大于0,请重新输入数据!"));
return;
}
if (m_dH < 1.e-3)
{
AfxMessageBox(_T("圆台的高度尺寸数据必须大于0,请重新输入数据!"));
return;
}
if (m_pData != NULL)
{
AecEqui::XCone* pCone = (AecEqui::XCone*)m_pData;
pCone->dr = m_dr;
pCone->dR = m_dR;
pCone->dH = m_dH;
pCone->dXOffset = m_dXOffset;
}
SET_CACHE(CConeDLg, %f%f%f%f%d%d%d, m_dr, m_dR, m_dH, m_dXOffset, m_bIs90Tr, m_clr, m_iSub);
OnOK();
}
void CConeDLg::OnBnClickedCheck90()
{
UpdateData();
if (m_bIs90Tr)
{
m_dXOffset = m_dr - m_dR;
UpdateData(FALSE);
}
}
void CConeDLg::OnStaticColor()
{
AcCmColor clr;
#if ARX < 24
clr.setColorMethod(AcCmEntityColor::kByACI);
#endif
clr.setColorIndex(256);
if (acedSetColorDialogTrueColor(clr, Adesk::kTrue, clr, g_acdt) == Adesk::kFalse) return;
m_clr = clr.colorIndex();
Invalidate();
}
HBRUSH CConeDLg::OnCtlColor(CDC * pDC, CWnd * pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_STATIC)
{
if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_COLOR)
{
CRect rc;
pWnd->GetClientRect(rc);
pDC->FillSolidRect(rc, acedGetRGB(m_clr));
}
}
return hbr;
}
#pragma endregion
#pragma region CPyrmDlg
IMPLEMENT_DYNAMIC(CPyrmDlg, CDialog)
CPyrmDlg::CPyrmDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPyrmDlg::IDD, pParent)
, m_dTH(500)
, m_dTx(200)
, m_dTy(300)
, m_dBx(400)
, m_dBy(500)
, m_dXOffset(0)
, m_bIs90Tr(FALSE)
, m_pData(NULL)
, m_iSub(0)
, m_clr(256)
{
GET_CACHE(CPyrmDlg
, %f%f%f%f%f%f%d%d%d
, &m_dTH
, &m_dTx
, &m_dTy
, &m_dBx
, &m_dBy
, &m_dXOffset
, &m_bIs90Tr
, &m_clr
, &m_iSub);
}
CPyrmDlg::~CPyrmDlg()
{
}
AcDbX3dSolid * CPyrmDlg::makeSolid(const AcGePoint3d &ptOrg, const AcGeVector3d &vtZ)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->Create(AcDbX3dSolid::kPyramid, ptOrg, vtZ, 6, m_dTx, m_dTy, m_dBx, m_dBy, m_dTH, m_dXOffset))
return pSolid;
DELETE_PTR(pSolid);
return NULL;
}
void CPyrmDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDITH, m_dTH);
DDX_Text(pDX, IDC_EDITTX, m_dTx);
DDX_Text(pDX, IDC_EDITTY, m_dTy);
DDX_Text(pDX, IDC_EDITBX, m_dBx);
DDX_Text(pDX, IDC_EDITBY, m_dBy);
DDX_Text(pDX, IDC_EDITHXOFF, m_dXOffset);
DDX_Check(pDX, IDC_CHECK90, m_bIs90Tr);
DDX_Check(pDX, IDC_CHK_SUB, m_iSub);
}
BEGIN_MESSAGE_MAP(CPyrmDlg, CDialog)
ON_BN_CLICKED(IDOK, &CPyrmDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_CHECK90, &CPyrmDlg::OnBnClickedCheck90)
ON_BN_CLICKED(IDC_STATIC_COLOR, OnStaticColor)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
BOOL CPyrmDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if (m_pData != NULL)
{
AecEqui::XPyramid* pPyr = (AecEqui::XPyramid*)m_pData;
m_dTx = pPyr->dTX;
m_dTy = pPyr->dTY;
m_dBx = pPyr->dBX;
m_dBy = pPyr->dBY;
m_dTH = pPyr->dH;
m_dXOffset = pPyr->dXOffset;
}
UpdateData(FALSE);
return TRUE;
}
void CPyrmDlg::OnBnClickedOk()
{
UpdateData();
if ( (m_dBx + m_dBy) < 1.e-3 || (m_dBx * m_dBy )> 1.e-3 )
{
}
else
{
AfxMessageBox(_T("方台的底边尺寸必须都大于0 或都为0,请重新输入数据!"));
return;
}
if ( (m_dTx + m_dTy ) < 1.e-3 || (m_dTx * m_dTy ) > 1.e-3)
{
}
else
{
AfxMessageBox(_T("方台的顶边尺寸必须都大于0 或都为0,请重新输入数据!"));
return;
}
if (m_dTx + m_dBx < 1.e-3)
{
AfxMessageBox(_T("方台的顶底边尺寸不能都为0,请重新输入数据!"));
return;
}
if (m_dTH < 1.e-3)
{
AfxMessageBox(_T("方台的高度尺寸数据必须大于0,请重新输入数据!"));
return;
}
if (m_pData != NULL)
{
AecEqui::XPyramid* pPyr = (AecEqui::XPyramid*)m_pData;
pPyr->dTX = m_dTx;
pPyr->dTY = m_dTy;
pPyr->dBX = m_dBx;
pPyr->dBY = m_dBy;
pPyr->dH = m_dTH;
pPyr->dXOffset = m_dXOffset;
}
SET_CACHE(CPyrmDlg
, %f%f%f%f%f%f%d%d%d
, m_dTH
, m_dTx
, m_dTy
, m_dBx
, m_dBy
, m_dXOffset
, m_bIs90Tr
, m_clr
, m_iSub );
OnOK();
}
void CPyrmDlg::OnBnClickedCheck90()
{
UpdateData();
if (m_bIs90Tr)
{
m_dXOffset = (m_dBx - m_dTx) / 2.0;
UpdateData(FALSE);
}
}
void CPyrmDlg::OnStaticColor()
{
AcCmColor clr;
#if ARX < 24
clr.setColorMethod(AcCmEntityColor::kByACI);
#endif
clr.setColorIndex(256);
if (acedSetColorDialogTrueColor(clr, Adesk::kTrue, clr, g_acdt) == Adesk::kFalse) return;
m_clr = clr.colorIndex();
Invalidate();
}
HBRUSH CPyrmDlg::OnCtlColor(CDC * pDC, CWnd * pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_STATIC)
{
if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_COLOR)
{
CRect rc;
pWnd->GetClientRect(rc);
pDC->FillSolidRect(rc, acedGetRGB(m_clr));
}
}
return hbr;
}
#pragma endregion
#pragma region CSpereDlg
IMPLEMENT_DYNAMIC(CSpereDlg, CDialog)
//ar[0] = dlg.m_dR;
CSpereDlg::CSpereDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSpereDlg::IDD, pParent)
, m_dR(100)
, m_pData(NULL)
, m_iSub(0)
, m_clr(256)
{
GET_CACHE(CSpereDlg, %f%d%d, &m_dR, &m_clr, &m_iSub);
}
CSpereDlg::~CSpereDlg()
{
}
AcDbX3dSolid * CSpereDlg::makeSolid(const AcGePoint3d &ptOrg, const AcGeVector3d &vtZ)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->Create(AcDbX3dSolid::kSpere, ptOrg + vtZ * m_dR, vtZ, 2, m_dR))
return pSolid;
DELETE_PTR(pSolid);
return NULL;
}
void CSpereDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDITR, m_dR);
DDX_Check(pDX, IDC_CHK_SUB, m_iSub);
}
BEGIN_MESSAGE_MAP(CSpereDlg, CDialog)
ON_BN_CLICKED(IDOK, &CSpereDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_STATIC_COLOR, OnStaticColor)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
void CSpereDlg::OnBnClickedOk()
{
UpdateData();
if (m_dR < 1.e-3)
{
AfxMessageBox(_T("球的半径必须大于0!请重新输入数据!"));
return;
}
if (m_pData != NULL)
{
AecEqui::XSphere* pSphe = (AecEqui::XSphere*)m_pData;
pSphe->dr = m_dR;
}
SET_CACHE(CSpereDlg, %f%d%d, m_dR, m_clr, m_iSub);
OnOK();
}
BOOL CSpereDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if (m_pData != NULL)
{
AecEqui::XSphere* pShere = (AecEqui::XSphere*)m_pData;
m_dR = pShere->dr;
UpdateData(FALSE);
}
return TRUE;
}
void CSpereDlg::OnStaticColor()
{
AcCmColor clr;
#if ARX < 24
clr.setColorMethod(AcCmEntityColor::kByACI);
#endif
clr.setColorIndex(256);
if (acedSetColorDialogTrueColor(clr, Adesk::kTrue, clr, g_acdt) == Adesk::kFalse) return;
m_clr = clr.colorIndex();
Invalidate();
}
HBRUSH CSpereDlg::OnCtlColor(CDC * pDC, CWnd * pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_STATIC)
{
if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_COLOR)
{
CRect rc;
pWnd->GetClientRect(rc);
pDC->FillSolidRect(rc, acedGetRGB(m_clr));
}
}
return hbr;
}
#pragma endregion
#pragma region CDrumsDlg
IMPLEMENT_DYNAMIC(CDrumsDlg, CDialog)
BEGIN_MESSAGE_MAP(CDrumsDlg, CDialog)
ON_BN_CLICKED(IDOK, &CDrumsDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_STATIC_COLOR, OnStaticColor)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
CDrumsDlg::CDrumsDlg(CWnd *pParent)
:CDialog(CDrumsDlg::IDD, pParent)
, m_dR(100.)
, m_dL1(10.)
, m_dL2(10.)
, m_dSAngle(0.)
, m_dEAngle(360.)
, m_pData(NULL)
, m_iSub(0)
, m_clr(256)
{
GET_CACHE(CBoxDlg, %f%f%f%d%d%f%f, &m_dR, &m_dL1, &m_dL2, &m_clr, &m_iSub, &m_dSAngle, &m_dEAngle);
}
CDrumsDlg::~CDrumsDlg() { }
AcDbX3dSolid * CDrumsDlg::makeSolid(const AcGePoint3d &ptOrg, const AcGeVector3d &vtZ)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->Create(AcDbX3dSolid::kDrum, ptOrg + vtZ * m_dL2, vtZ, 5, m_dR, m_dL1, m_dL2, CoreTools::A2R(m_dSAngle), CoreTools::A2R(m_dEAngle)))
return pSolid;
DELETE_PTR(pSolid);
return NULL;
}
void CDrumsDlg::DoDataExchange(CDataExchange *pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_dR);
DDV_MinMaxDouble(pDX, m_dR, .1, 1e9);
DDX_Text(pDX, IDC_EDIT2, m_dL1);
DDV_MinMaxDouble(pDX, m_dL1, .1, 1e9);
DDX_Text(pDX, IDC_EDIT3, m_dL2);
DDV_MinMaxDouble(pDX, m_dL2, .1, 1e9);
DDX_Check(pDX, IDC_CHK_SUB, m_iSub);
DDX_Text(pDX, IDC_EDITRSA, m_dSAngle);
DDX_Text(pDX, IDC_EDITREA, m_dEAngle);
if (pDX->m_bSaveAndValidate)
{
if (m_dSAngle < 0 || m_dEAngle < 0 || m_dEAngle <= m_dSAngle)
{
AfxMessageBox(_T("请保证 起始/结束 角度为正,并且结束角度大于起始角度!"));
pDX->Fail();
}
if (m_dL1 + m_dL2 > m_dR)
{
AfxMessageBox(_T("请保证 L + l <= R!"));
pDX->Fail();
}
}
}
BOOL CDrumsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
UpdateData(FALSE);
return TRUE;
}
void CDrumsDlg::OnStaticColor()
{
AcCmColor clr;
#if ARX < 24
clr.setColorMethod(AcCmEntityColor::kByACI);
#endif
clr.setColorIndex(256);
if (acedSetColorDialogTrueColor(clr, Adesk::kTrue, clr, g_acdt) == Adesk::kFalse) return;
m_clr = clr.colorIndex();
Invalidate();
}
HBRUSH CDrumsDlg::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_STATIC)
{
if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_COLOR)
{
CRect rc;
pWnd->GetClientRect(rc);
pDC->FillSolidRect(rc, acedGetRGB(m_clr));
}
}
return hbr;
}
void CDrumsDlg::OnBnClickedOk()
{
if (!UpdateData(TRUE)) return;
SET_CACHE(CDrumsDlg, %f%f%f%d%d%f%f, m_dR, m_dL1, m_dL2, m_clr, m_iSub, m_dSAngle, m_dEAngle);
OnOK();
}
#pragma endregion
#pragma region CWedgeDlg
IMPLEMENT_DYNAMIC(CWedgeDlg, CDialog)
BEGIN_MESSAGE_MAP(CWedgeDlg, CDialog)
ON_BN_CLICKED(IDOK, &CWedgeDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_STATIC_COLOR, OnStaticColor)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
CWedgeDlg::CWedgeDlg(CWnd *pParent): CDialog(CWedgeDlg::IDD, pParent)
, m_dA(100.)
, m_dB(100.)
, m_dT(100.)
, m_iSub(0)
, m_pData(NULL)
, m_clr(256)
{
GET_CACHE(CWedgeDlg, %f%f%f%d%d, &m_dA, &m_dB, &m_dT, &m_clr, &m_iSub);
}
CWedgeDlg::~CWedgeDlg()
{
}
AcDbX3dSolid * CWedgeDlg::makeSolid(const AcGePoint3d &ptOrg, const AcGeVector3d &vtZ)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->Create(AcDbX3dSolid::kWedge, ptOrg, vtZ, 3, m_dA, m_dB, m_dT))
return pSolid;
DELETE_PTR(pSolid);
return NULL;
}
void CWedgeDlg::DoDataExchange(CDataExchange *pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Check(pDX, IDC_CHK_SUB, m_iSub);
DDX_Text(pDX, IDC_EDIT1, m_dA);
DDV_MinMaxDouble(pDX, m_dA, .1, 1e9);
DDX_Text(pDX, IDC_EDIT2, m_dB);
DDV_MinMaxDouble(pDX, m_dB, .1, 1e9);
DDX_Text(pDX, IDC_EDIT3, m_dT);
DDV_MinMaxDouble(pDX, m_dT, .1, 1e9);
}
BOOL CWedgeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
UpdateData(FALSE);
return TRUE;
}
void CWedgeDlg::OnStaticColor()
{
AcCmColor clr;
#if ARX < 24
clr.setColorMethod(AcCmEntityColor::kByACI);
#endif
clr.setColorIndex(256);
if (acedSetColorDialogTrueColor(clr, Adesk::kTrue, clr, g_acdt) == Adesk::kFalse) return;
m_clr = clr.colorIndex();
Invalidate();
}
HBRUSH CWedgeDlg::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_STATIC)
{
if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_COLOR)
{
CRect rc;
pWnd->GetClientRect(rc);
pDC->FillSolidRect(rc, acedGetRGB(m_clr));
}
}
return hbr;
}
void CWedgeDlg::OnBnClickedOk()
{
UpdateData(TRUE);
SET_CACHE(CWedgeDlg, %f%f%f%d%d, m_dA, m_dB, m_dT, m_clr, m_iSub);
OnOK();
}
#pragma endregion
#pragma region CTorusDlg
IMPLEMENT_DYNAMIC(CTorusDlg, CDialog)
BEGIN_MESSAGE_MAP(CTorusDlg, CDialog)
ON_BN_CLICKED(IDOK, &CTorusDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_STATIC_COLOR, OnStaticColor)
ON_BN_CLICKED(IDC_RADIO1, &CTorusDlg::OnBnClickRadio)
ON_BN_CLICKED(IDC_RADIO2, &CTorusDlg::OnBnClickRadio)
ON_BN_CLICKED(IDC_RADIO3, &CTorusDlg::OnBnClickRadio)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
CTorusDlg::CTorusDlg(CWnd *pParent)
: CDialog(CTorusDlg::IDD, pParent)
, m_pData(NULL)
, m_iSub(0)
, m_iMode(0)
, m_dInnerR(.0)
, m_dOuterR(.0)
, m_dStartA(.0)
, m_dEndA(.0)
, m_dRectH(.0)
, m_bDonotSelectX(false)
, m_clr(256)
{
GET_CACHE(CTorusDlg
, %f%f%f%f%f%d%d
, &m_dInnerR
, &m_dOuterR
, &m_dStartA
, &m_dEndA
, &m_dRectH
, &m_clr
, &m_iSub);
}
CTorusDlg::~CTorusDlg() { }
void CTorusDlg::DoDataExchange(CDataExchange *pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Check(pDX, IDC_CHK_SUB, m_iSub);
DDX_Text(pDX, IDC_EDITR1, m_dInnerR);
DDV_MinMaxDouble(pDX, m_dInnerR, .1, 1e9);
DDX_Text(pDX, IDC_EDITR2, m_dOuterR);
DDV_MinMaxDouble(pDX, m_dOuterR, .1, 1e9);
DDX_Text(pDX, IDC_EDITRSA, m_dStartA);
DDX_Text(pDX, IDC_EDITREA, m_dEndA);
DDX_Text(pDX, IDC_EDITRH, m_dRectH);
DDX_Radio(pDX, IDC_RADIO1, m_iMode);
if (pDX->m_bSaveAndValidate)
{
if (m_dStartA < 0 || m_dEndA < 0 || m_dEndA <= m_dStartA)
{
AfxMessageBox(_T("请保证 起始/结束 角度为正,并且结束角度大于起始角度!"));
pDX->Fail();
}
}
}
BOOL CTorusDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CWnd *pWnd(NULL);
if (m_iMode == 0)
{
pWnd = GetDlgItem(IDC_EDITRH);
if (pWnd) pWnd->EnableWindow(1);
}
if (m_bDonotSelectX)
{
pWnd = GetDlgItem(IDC_RADIO1);
if (pWnd) pWnd->EnableWindow(0);
pWnd = GetDlgItem(IDC_RADIO2);
if (pWnd) pWnd->EnableWindow(0);
pWnd = GetDlgItem(IDC_RADIO3);
if (pWnd) pWnd->EnableWindow(0);
}
UpdateData(FALSE);
return TRUE;
}
void CTorusDlg::OnStaticColor()
{
AcCmColor clr;
#if ARX < 24
clr.setColorMethod(AcCmEntityColor::kByACI);
#endif
clr.setColorIndex(256);
if (acedSetColorDialogTrueColor(clr, Adesk::kTrue, clr, g_acdt) == Adesk::kFalse) return;
m_clr = clr.colorIndex();
Invalidate();
}
HBRUSH CTorusDlg::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_STATIC)
{
if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_COLOR)
{
CRect rc;
pWnd->GetClientRect(rc);
pDC->FillSolidRect(rc, acedGetRGB(m_clr));
}
}
return hbr;
}
void CTorusDlg::OnBnClickedOk()
{
UpdateData(TRUE);
SET_CACHE(CTorusDlg
, %f%f%f%f%f%d%d
, m_dInnerR
, m_dOuterR
, m_dStartA
, m_dEndA
, m_dRectH
, m_clr
, m_iSub);
OnOK();
}
void CTorusDlg::OnBnClickRadio()
{
UpdateData(TRUE);
CWnd *pWndRH = GetDlgItem(IDC_EDITRH);
CWnd *pWndYX = GetDlgItem(IDC_EDITR2);
CStatic *pWndPic = (CStatic*)GetDlgItem(IDC_BMP_STA);
if (pWndYX) pWndYX->EnableWindow(1);
if (pWndRH) pWndRH->EnableWindow(1);
CBitmap bitmap;
switch (m_iMode)
{
case 0:
bitmap.LoadBitmap(IDB_BITMAP_RCTOR);
if (pWndRH) pWndRH->EnableWindow(1);
if (pWndYX) pWndYX->EnableWindow(1);
break;
case 1:
bitmap.LoadBitmap(IDB_BITMAP_CIRT);
if (pWndRH) pWndRH->EnableWindow(0);
if (pWndYX) pWndYX->EnableWindow(1);
break;
case 2:
bitmap.LoadBitmap(IDB_BITMAP13);
if (pWndRH) pWndRH->EnableWindow(0);
if (pWndYX) pWndYX->EnableWindow(0);
break;
default:
break;
}
if (pWndPic) pWndPic->SetBitmap((HBITMAP)bitmap.GetSafeHandle());
}
AcDbX3dSolid * CTorusDlg::makeSolid(const AcGeMatrix3d &ucs)
{
AcGePoint3d ptOrg;
AcGeVector3d vtX, vtY, vtZ;
ucs.getCoordSystem(ptOrg, vtX, vtY, vtZ);
AcDbRegion *pReg(NULL);
if (m_iMode != 2)
{
pReg = createTorusRegion(m_iMode, ptOrg, m_dInnerR, m_dOuterR, m_dRectH);
}
else
{
AcDbPolyline *pPoly = (AcDbPolyline*)selectEntity(_T("POLYLINE"), _T("\n请选择一个闭合多段线:"), ptOrg, false);
if (!pPoly) return NULL;
if (!pPoly->isClosed()) pPoly->setClosed(1);
pReg = CoreTools::createRegion(pPoly);
}
moveRegion(pReg, ucs, m_dInnerR, m_dOuterR);
if (!pReg) return NULL;
AcGeMatrix3d mat;
mat.setToAlignCoordSys(AcGePoint3d::kOrigin
, AcGeVector3d::kXAxis
, AcGeVector3d::kXAxis
, AcGeVector3d::kXAxis
, ptOrg
, vtX
, vtY
, vtZ );
pReg->transformBy(mat);
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->CreateRevolve2(pReg, ptOrg, vtZ, CoreTools::A2R(m_dEndA - m_dStartA), CoreTools::A2R(m_dStartA)))
{
int len = sizeof(double) * 3 + sizeof(int);
byte *pBuffer = new byte[len];
::memset(pBuffer, 0, len);
double ar[3] = { m_dInnerR, m_dOuterR, m_dRectH };
::memcpy(pBuffer, ar, sizeof(double) * 3);
::memcpy(pBuffer + sizeof(double) * 3, &m_iMode, sizeof(int) * 1);
pSolid->SetSatBuffer(len, pBuffer);
}
else
DELETE_PTR(pSolid);
DELETE_PTR(pReg);
return pSolid;
}
#pragma endregion
#pragma region CYiXingYanDlg
namespace
{
AcDbArc* createArcBy3Point(const AcGePoint3d &pt1, const AcGePoint3d &pt2, const AcGePoint3d &pt3)
{
AcGeCircArc3d geArc(pt1, pt2, pt3);
AcDbArc *pArc = KTCADUtilityEx::FormatArc(pt1, pt2, pt3);
return pArc;
}
void makeXSolid4Arc()
{
}
}
IMPLEMENT_DYNAMIC(CYiXingYanDlg, CDialog)
CYiXingYanDlg::CYiXingYanDlg(double dLen, CWnd* pParent /*=nullptr*/)
: CDialog(IDD_YIXINGYAN_DLG, pParent)
, m_dAllLen(dLen)
, m_nType(0)
, m_dHa(100.)
, m_dSp(100.)
, m_dL(100.)
, m_dH1(50.)
, m_dH2(50.)
, m_dT(100.)
{
GET_CACHE(CYiXingYanDlg
, %d%f%f%f%f%f%f
, &m_nType
, &m_dHa
, &m_dSp
, &m_dL
, &m_dH1
, &m_dH2
, &m_dT );
}
CYiXingYanDlg::~CYiXingYanDlg() { }
void CYiXingYanDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Radio(pDX, IDC_RADIO_TYPE, m_nType);
DDX_Text(pDX, IDC_EDIT_HA, m_dHa);
DDX_Text(pDX, IDC_EDIT_SP, m_dSp);
DDX_Text(pDX, IDC_EDIT_L, m_dL);
DDX_Text(pDX, IDC_EDIT_H1, m_dH1);
DDX_Text(pDX, IDC_EDIT_H2, m_dH2);
DDX_Text(pDX, IDC_EDIT_T, m_dT);
DDX_Control(pDX, IDC_BMP, m_wndPic);
if (pDX->m_bSaveAndValidate)
{
if (EQUAL_ZERO(m_dL))
{
AfxMessageBox(_T("L不能为0mm。"));
pDX->Fail();
}
if (EQUAL_ZERO(m_dT))
{
AfxMessageBox(_T("壁厚不能为0mm。"));
pDX->Fail();
}
if (m_nType == 0 || m_nType == 1)
{
if (EQUAL_ZERO(m_dH2))
{
AfxMessageBox(_T("H2不能为0mm。"));
pDX->Fail();
}
}
// 验证长度
if (m_dAllLen < (m_dHa + m_dL))
{
AfxMessageBox(_T("Ha + L 不能小于定位线长度。"));
pDX->Fail();
}
if (!UPEQUAL(m_dSp, m_dL))
{
AfxMessageBox(_T("Sp不能小于L的长度。"));
pDX->Fail();
}
}
}
BEGIN_MESSAGE_MAP(CYiXingYanDlg, CDialog)
ON_BN_CLICKED(IDOK, &CYiXingYanDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_RADIO_TYPE, &CYiXingYanDlg::OnBnClickedRadioType)
ON_BN_CLICKED(IDC_RADIO2, &CYiXingYanDlg::OnBnClickedRadio2)
ON_BN_CLICKED(IDC_RADIO3, &CYiXingYanDlg::OnBnClickedRadio3)
END_MESSAGE_MAP()
void CYiXingYanDlg::OnBnClickedOk()
{
if (!UpdateData(TRUE)) return;
SET_CACHE(CYiXingYanDlg
, %d%f%f%f%f%f%f
, m_nType
, m_dHa
, m_dSp
, m_dL
, m_dH1
, m_dH2
, m_dT);
CDialog::OnOK();
}
void CYiXingYanDlg::OnBnClickedRadioType() { changeType(); }
void CYiXingYanDlg::OnBnClickedRadio2() { changeType(); }
void CYiXingYanDlg::OnBnClickedRadio3() { changeType(); }
void CYiXingYanDlg::changeType()
{
UpdateData(TRUE);
UINT id(0);
if (m_nType == 0) // 三角
{
id = IDB_SANJIAOYAN;
}
else if (m_nType == 1) // 矩形
{
id = IDB_JUXINGYAN;
}
else // 溢流孔
{
id = IDB_YILIUKONG;
}
CBitmap bitmap;
if (bitmap.LoadBitmap(id))
{
m_wndPic.SetBitmap(bitmap);
}
}
void CYiXingYanDlg::getXSolids(AcDbCurve *pCurve, AcArray<AcDbX3dSolid*>& solids)
{
if (!pCurve) return;
AcGePoint3d ptE(AcGePoint3d::kOrigin);
pCurve->getEndPoint(ptE);
double dLen(.0);
pCurve->getDistAtPoint(ptE, dLen);
AcDbPolyline *pPoly = AcDbPolyline::cast(pCurve);
AcDbLine *pLine = AcDbLine::cast(pCurve);
AcDbCircle *pCir = AcDbCircle::cast(pCurve);
AcDbArc *pArc = AcDbArc::cast(pCurve);
if (pArc || pCir)
{
if (pArc)
{
dLen = 0;
double dSweep = pArc->endAngle() - pArc->startAngle();
dLen = dSweep * pArc->radius();
}
if (pCir)
{
dLen = 2 * PI * pCir->radius();
}
double dist(dLen - m_dHa), dSp(m_dSp - m_dL);
while (UPEQUAL_ZERO(dist - m_dL - dSp))
{
AcDbX3dSolid *pSolid = makeXSolid4Arc(dist, pCurve);
if (pSolid)
solids.append(pSolid);
dist -= (m_dL + m_dSp);
}
}
}
AcDbX3dSolid* CYiXingYanDlg::makeXSolid4Arc(const double &dStart, AcDbCurve *pCurve)
{
if (!pCurve) return NULL;
AcDbRegion *pReg1(NULL), *pReg2(NULL);
AcGeMatrix3d mat;
// 三角、方形
if (m_nType == 0 || m_nType == 1)
{
// 上截面
pReg1 = makeRegion4Arc(dStart, pCurve, m_dL, m_dT);
if (!pReg1) return NULL;
mat.setToTranslation(-AcGeVector3d::kZAxis * m_dH1);
pReg1->transformBy(mat);
}
if (m_nType == 1)
{
pReg2 = (AcDbRegion*)pReg1->clone();
mat.setToIdentity();
mat.setToTranslation(-AcGeVector3d::kZAxis * (m_dH1 + m_dH2));
pReg2->transformBy(mat);
}
else if (m_nType == 0)
{
// 下截面,长 0.1mm 宽 m_dT
AcDbArc *pArc = AcDbArc::cast(pCurve);
AcDbCircle *pCir = AcDbCircle::cast(pCurve);
double R(.0);
AcGePoint3d ptCen(AcGePoint3d::kOrigin);
if (pArc)
{
R = pArc->radius();
ptCen = pArc->center();
}
if (pCir)
{
R = pCir->radius();
ptCen = pCir->center();
}
double dL1 = m_dL;
double a1 = asin((dL1 * .5) / R);
double dArcLen1 = a1 * R;
double dL2 = 10;
double a2 = asin(dL2 * .5 / R);
double dArcLen2 = a2 * R;
double dStart2 = dStart + (dArcLen1 - dArcLen2);
pReg2 = makeRegion4Arc(dStart2, pCurve, dL2, m_dT);
if (!pReg2)
{
DELETE_PTR(pReg1);
return NULL;
}
mat.setToIdentity();
mat.setToTranslation(-AcGeVector3d::kZAxis * (m_dH1 + m_dH2));
pReg2->transformBy(mat);
}
// 生成Solid
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
AcArray<AcDbRegion*> ar;
ar.append(pReg1);
ar.append(pReg2);
bool bSuccess = pSolid->CreateLoft(ar);
DELETE_PTR(pReg1);
DELETE_PTR(pReg2);
if (bSuccess)
{
return pSolid;
}
else
{
DELETE_PTR(pSolid);
}
return NULL;
}
AcDbRegion* CYiXingYanDlg::makeRegion4Arc(const double &dStart, AcDbCurve *pCurve, const double &dL, const double &dT)
{
if (!pCurve) return NULL;
AcDbArc *pArc = AcDbArc::cast(pCurve);
AcDbCircle *pCir = AcDbCircle::cast(pCurve);
double R(.0);
AcGePoint3d ptCen(AcGePoint3d::kOrigin);
if (pArc)
{
R = pArc->radius();
ptCen = pArc->center();
}
if (pCir)
{
R = pCir->radius();
ptCen = pCir->center();
}
double dEnd(.0);
double alpha = asin((dL * .5) / R);
double l = dT / cos(alpha);
dEnd = dStart + (R * alpha * 2);
AcGePoint3d ptMid1(AcGePoint3d::kOrigin)
, ptMid2(AcGePoint3d::kOrigin)
, ptStart1(AcGePoint3d::kOrigin)
, ptEnd1(AcGePoint3d::kOrigin)
, ptStart2(AcGePoint3d::kOrigin)
, ptEnd2(AcGePoint3d::kOrigin);
pCurve->getPointAtDist(dStart, ptStart1);
pCurve->getPointAtDist((dEnd + dStart) * .5, ptMid1);
pCurve->getPointAtDist(dEnd, ptEnd1);
AcGeVector3d vt = ptCen - ptMid1;
vt.normalize();
ptMid2 = ptMid1 + vt * dT;
ptStart2 = ptStart1 + vt * l;
ptEnd2 = ptEnd1 + vt * l;
double dScale(.1);
ptStart1 -= vt * dScale;
ptMid1 -= vt * dScale;
ptEnd1 -= vt * dScale;
AcDbArc *pArc1 = createArcBy3Point(ptStart1, ptMid1, ptEnd1);
ptStart2 += vt * dScale;
ptMid2 += vt * dScale;
ptEnd2 += vt * dScale;
AcDbArc *pArc2 = createArcBy3Point(ptStart2, ptMid2, ptEnd2);
AcDbLine *pLine1 = new AcDbLine(ptStart1, ptStart2);
AcDbLine *pLine2 = new AcDbLine(ptEnd1, ptEnd2);
AcDbVoidPtrArray ptrs;
ptrs.append(pArc1);
ptrs.append(pArc2);
ptrs.append(pLine1);
ptrs.append(pLine2);
AcDbRegion *pReg = CoreTools::createRegion(ptrs);
if (!pReg)
{
CoreTools::CloneAndAddToModelSpace(pArc1);
CoreTools::CloneAndAddToModelSpace(pArc2);
CoreTools::CloneAndAddToModelSpace(pLine1);
CoreTools::CloneAndAddToModelSpace(pLine2);
}
DELETE_PTR(pArc2);
DELETE_PTR(pArc1);
DELETE_PTR(pLine2);
DELETE_PTR(pLine1);
return pReg;
}
#pragma endregion