4736 lines
226 KiB
C++
4736 lines
226 KiB
C++
#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*> ®s)
|
||
{
|
||
#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
|
||
|