#include "stdafx.h" #include #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 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 &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 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 ss; ss.insert(dx); ss.insert(dy); ss.insert(dz); return *ss.rbegin(); } return .0; } bool setFaceClr(AcDbObjectId solidID , std::map &subIds , const int &idx , int clr) { AcCmColor cm; cm.setColorIndex(256); OPENOBJ_BEGIN(solidID, AcDb::kForWrite, AcDb3dSolid, pSolid) if (!pSolid) return false; std::map::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 ®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 &solids) { AcArray 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(regs); } void CreateSweep(bool &bSub, AcArray &solids) { AcArray 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(regs); DELETE_PTR(pPoly); } void CreateLoft(bool &bSub, AcArray &solids) { AcGePoint3d ptOrg = acdbCurDwg()->ucsorg(); int idx(0); CString sMsg(_T("")); AcGePoint3d pickPnt(AcGePoint3d::kOrigin); AcArray 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(regs); return; } bSub = isSubtract(); AcDbX3dSolid *pSolid = new AcDbX3dSolid(); if (!pSolid->CreateLoft(regs)) DELETE_PTR(pSolid); else solids.append(pSolid); deleteContainerOfArx(regs); } void CreateCut(AcArray &solids, const double &maxLen) { AcArray 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(regs); } void CreateRevolve(bool &bSub, AcArray &solids) { AcArray 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(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 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 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 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 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 &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 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 &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 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 list; GetAllLayers(list); std::map::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 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 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 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::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(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 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 &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& 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 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 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 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 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 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 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 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 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 items; if (!getSelectItems(items)) return; KTCADSysVar 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 items; if (!getSelectItems(items)) return; KTCADSysVar 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 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 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 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 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& 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 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