#include "stdafx.h" #include "KTJigTrapezia.h" #include "KTJigSkirt.h" #include "EquVessleDlg.h" #include "KTComponentsDlg.h" #include "dimfactory.h" #include "BGGXDlg.h" #include "ElevationInfoDlg.h" #include "AecDbEwPipeDim.h" #include "UIHistory.h" #include "coretools.h" #define LAYER_VESSEL _T("LAY_EQUMENT") // Vessel #define LAYER_VSLDIM _T("LAY_EQUMENTDIM") // Vessel #define TSTYLE_VESSEL _T("EQUMENT_DIM") // Vessel namespace { enum ECapType { eCapNone = 0, eCapHemi = 1, eCapEllip = 2, eCapDish = 3, }; enum EEdgeType { eEdgeThis = 0x01, eEdgeOther = 0x02, eEdgeBoth = (eEdgeThis | eEdgeOther), }; void CreateEllipseCap(const AcDbPolyline* pEdge, ECapType eCapType, LPCTSTR pszEdgeFlag, AcDbVoidPtrArray& arpEnts) { if (NULL == pEdge || NULL == pszEdgeFlag || pEdge->numVerts() < 2) return; double dRatio; switch (eCapType) { case eCapHemi: dRatio = 1.0; break; case eCapEllip: dRatio = 0.5; break; case eCapDish: default: dRatio = 0.25; break; } AcGePoint3d pt1, pt2, ptCenter; int iLen = pEdge->numVerts() - 1; pEdge->getPointAt(0, ptCenter); pEdge->getPointAt(1, pt2); pEdge->getPointAt(iLen, pt1); AcGeVector3d vtNormal(pEdge->normal()); AcGeVector3d vtEdge((pt1 - ptCenter).crossProduct(pt2 - ptCenter)); double dDirect = (vtNormal.isCodirectionalTo(vtEdge) ? 1.0 : -1.0); for (int i = 0; i <= iLen && _T('\0') != pszEdgeFlag[0]; i++, pszEdgeFlag++) { pEdge->getPointAt(i, pt2); if (pt1 == pt2) continue; ptCenter = CKTCadUtility::GetMiddlePoint(pt1, pt2); pt1 = pt2; if (_T('1') != pszEdgeFlag[0]) continue; AcDbEllipse* pEll = new AcDbEllipse(ptCenter, vtNormal, (pt1 - ptCenter) * dDirect, dRatio, 0.0, PI); if (NULL == pEll) continue; pEll->setPropertiesFrom(pEdge); arpEnts.append(pEll); } } AcDbEllipse* CreateEllipseCap(const AcGePoint3d& pt1, const AcGePoint3d& pt2, const AcGeVector3d& vtNormal, ECapType eCapType) { double dRatio; switch (eCapType) { case eCapHemi: dRatio = 1.0; break; case eCapEllip: dRatio = 0.5; break; case eCapDish: default: dRatio = 0.25; break; } AcGePoint3d ptCenter = CKTCadUtility::GetMiddlePoint(pt1, pt2); AcDbEllipse* pEll = new AcDbEllipse(ptCenter, vtNormal, pt1 - ptCenter, dRatio, 0.0, PI); return pEll; } void CreateInfoPoint(const AcGePoint3d& pt, const AcDbObjectId& idLayer, AcDbPoint*& pPoint, AcDbVoidPtrArray& arpEnts, CString sTag, CString sName, CString sType, CString sDes) { pPoint = new AcDbPoint(pt); if (NULL == pPoint) return; pPoint->setLayer(idLayer); AcGePoint3d ptPos; AcDbObjectId idText = KTSetting::InitTextStyle(TSTYLE_VESSEL); AcDbObjectId idDimLayer = KTSetting::InitLayer(LAYER_VSLDIM); double dTextSize = 0.0; AcDbTextStyleTableRecord* pTextStyleRec = NULL; acdbOpenObject(pTextStyleRec, idText, AcDb::kForRead); if (NULL != pTextStyleRec) { dTextSize = pTextStyleRec->textSize(); pTextStyleRec->close(); } else { CKTCadUtility::GetSystemVar(_T("TEXTSIZE"), dTextSize); } AcGeVector3d vtOffset(UcsYAxis * dTextSize); double dAngle = CKTCadUtility::GetAngle(UcsXAxis); CKTEntityDragMgr drag; drag.SetDragPoint(ptPos); drag.EnableRotate(FALSE); drag.EnableScale(FALSE); AcDbText* pText = new AcDbText(ptPos, sTag, idText, 0, dAngle); ASSERT(NULL != pText); pText->setLayer(idDimLayer); drag.Add(pText); ptPos -= vtOffset; pText = new AcDbText(ptPos, sName, idText, 0, dAngle); ASSERT(NULL != pText); pText->setLayer(idDimLayer); drag.Add(pText); ptPos -= vtOffset; pText = new AcDbText(ptPos, sType, idText, 0, dAngle); ASSERT(NULL != pText); pText->setLayer(idDimLayer); drag.Add(pText); ptPos -= vtOffset; pText = new AcDbText(ptPos, sDes, idText, 0, dAngle); ASSERT(NULL != pText); pText->setLayer(idDimLayer); drag.Add(pText); if (drag.DoDrag()) { arpEnts.append(*drag.GetAll()); drag.Remove(); } resbuf* pRb = acutBuildList(AcDb::kDxfRegAppName, _T("KTParamPart"), AcDb::kDxfXdAsciiString, _T("点类型"), AcDb::kDxfXdAsciiString, _T("材料点"), AcDb::kDxfXdAsciiString, _T("名称"), AcDb::kDxfXdAsciiString, _T("设备"), AcDb::kDxfXdAsciiString, _T("设备类型"), AcDb::kDxfXdAsciiString, _T("容器设备"), AcDb::kDxfXdAsciiString, _T("设备位号"), AcDb::kDxfXdAsciiString, sTag, AcDb::kDxfXdAsciiString, _T("设备名称"), AcDb::kDxfXdAsciiString, sName, AcDb::kDxfXdAsciiString, _T("设备规格"), AcDb::kDxfXdAsciiString, sType, AcDb::kDxfXdAsciiString, _T("设备描述"), AcDb::kDxfXdAsciiString, sDes, 0); ASSERT(NULL != pRb); acdbRegApp(pRb->resval.rstring); pPoint->setXData(pRb); acutRelRb(pRb); } int OnVertBase(CEquVessleDlg &dlg) { CAcModuleResourceOverride theResource; ECapType eCapType; dlg.iType = 1; if (IDOK == dlg.DoModal()) { switch (dlg.m_iRadio) { case 0: eCapType = eCapEllip; break; case 1: eCapType = eCapHemi; break; case 2: eCapType = eCapDish; break; case 3: eCapType = eCapNone; break; } } else { return 1; } ads_point ptAds; int iRet = acedGetPoint(NULL, _T("\n选择第一个角点:"), ptAds); if (RTNORM != iRet) return iRet; AcGePoint3d pt; acdbUcs2Wcs(ptAds, asDblArray(pt), false); KTJigTrapezia jigTrap; AcDbPolyline* pPline = jigTrap.DragCreate(pt, UcsXAxis, UcsZAxis, _T("\n选择第二个角点:"), TRUE, KTJigTrapezia::eSkirtNone); if (NULL == pPline) return RTERROR; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pPline->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pPline); AcGePoint3d pt1, pt2; pPline->getPointAt(2, pt1); pPline->getPointAt(3, pt2); if (eCapType != eCapNone) { AcDbVoidPtrArray arpEnt; CreateEllipseCap(pPline, eCapType, _T("0101"), arpEnt); entMgr.Add(arpEnt); } AcDbObjectIdArray arid; entMgr.AddToBlockTableRecord(arid); acTransactionManagerPtr()->flushGraphics(); acedUpdateDisplay(); // AcDbPoint* pPoint = NULL; AcDbVoidPtrArray arpEnt; CreateInfoPoint(CKTCadUtility::GetMiddlePoint(pt1, pt2), idLayer, pPoint, arpEnt, dlg.m_sTag, dlg.m_sName, dlg.m_sType, dlg.m_sDes); entMgr.Add(pPoint); entMgr.AddToBlockTableRecord(arid); entMgr.Add(arpEnt); entMgr.AddToBlockTableRecord(); CKTCadUtility::CreateAcDbGroup(arid); return RTNORM; } int OnVertSkirt(CEquVessleDlg &dlg) { CAcModuleResourceOverride theResource; ECapType eCapType; dlg.iType = 2; if (IDOK == dlg.DoModal()) { switch (dlg.m_iRadio) { case 0: eCapType = eCapEllip; break; case 1: eCapType = eCapHemi; break; case 2: eCapType = eCapDish; break; case 3: eCapType = eCapNone; break; } } else { return 1; } ads_point ptAds; int iRet = acedGetPoint(NULL, _T("\n选择第一个角点:"), ptAds); if (RTNORM != iRet) return iRet; AcGePoint3d pt; acdbUcs2Wcs(ptAds, asDblArray(pt), false); KTJigTrapezia jigTrap; AcDbPolyline* pPline = jigTrap.DragCreate(pt, UcsXAxis, UcsZAxis, _T("\n选择第二个角点:"), TRUE, KTJigTrapezia::eSkirtNone); if (NULL == pPline) return RTERROR; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pPline->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pPline); AcGePoint3d pt1, pt2; pPline->getPointAt(3, pt1); pPline->getPointAt(2, pt2); if (eCapType != eCapNone) { AcDbVoidPtrArray arpEnt; CreateEllipseCap(pPline, eCapType, _T("0101"), arpEnt); entMgr.Add(arpEnt); } AcDbObjectIdArray arid; entMgr.AddToBlockTableRecord(arid); CKTObjLifeMgr entGroupMgr; entGroupMgr.Add(arid); KTJigSkirt jigSkirt; AcDbVoidPtrArray arpEnt; if (!jigSkirt.DragCreate(pt1, pt2 - pt1, UcsZAxis, _T("\n选择基座位置点:"), idLayer, arpEnt)) return RTERROR; entMgr.Add(arpEnt); entMgr.AddToBlockTableRecord(arid); entGroupMgr.Add(arid); acTransactionManagerPtr()->flushGraphics(); acedUpdateDisplay(); // AcDbPoint* pPoint = NULL; arpEnt.setLogicalLength(0); CreateInfoPoint(CKTCadUtility::GetMiddlePoint(pt1, pt2), idLayer, pPoint, arpEnt, dlg.m_sTag, dlg.m_sName, dlg.m_sType, dlg.m_sDes); entMgr.Add(pPoint); entMgr.AddToBlockTableRecord(arid); entMgr.Add(arpEnt); entMgr.AddToBlockTableRecord(); entGroupMgr.Release(); CKTCadUtility::CreateAcDbGroup(arid); return RTNORM; } int OnVertCone(CEquVessleDlg &dlg) { CAcModuleResourceOverride theResource; ECapType eCapType; dlg.iType = 3; if (IDOK == dlg.DoModal()) { switch (dlg.m_iRadio) { case 0: eCapType = eCapEllip; break; case 1: eCapType = eCapHemi; break; case 2: eCapType = eCapDish; break; case 3: eCapType = eCapNone; break; } } else { return 1; } ads_point ptAds; int iRet = acedGetPoint(NULL, _T("\n选择第一个角点:"), ptAds); if (RTNORM != iRet) return iRet; AcGePoint3d pt; acdbUcs2Wcs(ptAds, asDblArray(pt), false); KTJigTrapezia jigTrap; AcDbPolyline* pPline = jigTrap.DragCreate(pt, UcsXAxis, UcsZAxis, _T("\n选择第二个角点:"), TRUE, KTJigTrapezia::eSkirtNone); if (NULL == pPline) return RTERROR; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pPline->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pPline); AcGePoint3d pt1, pt2; pPline->getPointAt(3, pt1); pPline->getPointAt(2, pt2); if (eCapType != eCapNone) { AcDbVoidPtrArray arpEnt; CreateEllipseCap(pPline, eCapType, _T("01"), arpEnt); entMgr.Add(arpEnt); } AcDbObjectIdArray arid; entMgr.AddToBlockTableRecord(arid); CKTObjLifeMgr entGroupMgr; entGroupMgr.Add(arid); pPline = jigTrap.DragCreate(pt1, pt2 - pt1, UcsZAxis, _T("\n选择大小头位置:"), FALSE, KTJigTrapezia::eSkirtBoth); if (NULL == pPline) return RTERROR; pPline->setLayer(idLayer); entMgr.Add(pPline); pPline->getPointAt(3, pt1); pPline->getPointAt(2, pt2); entMgr.AddToBlockTableRecord(arid); entGroupMgr.Add(arid); pPline = jigTrap.DragCreate(pt1, pt2 - pt1, UcsZAxis, _T("\n选择高度位置:"), FALSE, KTJigTrapezia::eSkirtNone); if (NULL == pPline) return RTERROR; pPline->setLayer(idLayer); entMgr.Add(pPline); if (eCapType != eCapNone) { AcDbVoidPtrArray arpEnt; CreateEllipseCap(pPline, eCapType, _T("0001"), arpEnt); entMgr.Add(arpEnt); } entMgr.AddToBlockTableRecord(arid); entGroupMgr.Add(arid); acTransactionManagerPtr()->flushGraphics(); acedUpdateDisplay(); // AcDbPoint* pPoint = NULL; AcDbVoidPtrArray arpEnt; CreateInfoPoint(CKTCadUtility::GetMiddlePoint(pt1, pt2), idLayer, pPoint, arpEnt, dlg.m_sTag, dlg.m_sName, dlg.m_sType, dlg.m_sDes); entMgr.Add(pPoint); entMgr.AddToBlockTableRecord(arid); entMgr.Add(arpEnt); entMgr.AddToBlockTableRecord(); entGroupMgr.Release(); CKTCadUtility::CreateAcDbGroup(arid); return RTNORM; } int OnVertSkirtCone(CEquVessleDlg &dlg) { CAcModuleResourceOverride theResource; ECapType eCapType; dlg.iType = 4; if (IDOK == dlg.DoModal()) { switch (dlg.m_iRadio) { case 0: eCapType = eCapEllip; break; case 1: eCapType = eCapHemi; break; case 2: eCapType = eCapDish; break; case 3: eCapType = eCapNone; break; } } else { return 1; } ads_point ptAds; int iRet = acedGetPoint(NULL, _T("\n选择第一个角点:"), ptAds); if (RTNORM != iRet) return iRet; AcGePoint3d pt; acdbUcs2Wcs(ptAds, asDblArray(pt), false); KTJigTrapezia jigTrap; AcDbPolyline* pPline = jigTrap.DragCreate(pt, UcsXAxis, UcsZAxis, _T("\n选择第二个角点:"), TRUE, KTJigTrapezia::eSkirtNone); if (NULL == pPline) return RTERROR; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pPline->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pPline); AcGePoint3d pt1, pt2; pPline->getPointAt(3, pt1); pPline->getPointAt(2, pt2); if (eCapType != eCapNone) { AcDbVoidPtrArray arpEnt; CreateEllipseCap(pPline, eCapType, _T("01"), arpEnt); entMgr.Add(arpEnt); } AcDbObjectIdArray arid; entMgr.AddToBlockTableRecord(arid); CKTObjLifeMgr entGroupMgr; entGroupMgr.Add(arid); pPline = jigTrap.DragCreate(pt1, pt2 - pt1, UcsZAxis, _T("\n选择大小头位置:"), FALSE, KTJigTrapezia::eSkirtBoth); if (NULL == pPline) return RTERROR; pPline->setLayer(idLayer); entMgr.Add(pPline); pPline->getPointAt(3, pt1); pPline->getPointAt(2, pt2); entMgr.AddToBlockTableRecord(arid); entGroupMgr.Add(arid); pPline = jigTrap.DragCreate(pt1, pt2 - pt1, UcsZAxis, _T("\n选择高度位置:"), FALSE, KTJigTrapezia::eSkirtNone); if (NULL == pPline) return RTERROR; pPline->setLayer(idLayer); entMgr.Add(pPline); pPline->getPointAt(3, pt1); pPline->getPointAt(2, pt2); if (eCapType != eCapNone) { AcDbVoidPtrArray arpEnt; CreateEllipseCap(pPline, eCapType, _T("0001"), arpEnt); entMgr.Add(arpEnt); } entMgr.AddToBlockTableRecord(arid); entGroupMgr.Add(arid); KTJigSkirt jigSkirt; AcDbVoidPtrArray arpEnt; if (!jigSkirt.DragCreate(pt1, pt2 - pt1, UcsZAxis, _T("\n选择基座位置点:"), idLayer, arpEnt)) return RTERROR; entMgr.Add(arpEnt); entMgr.AddToBlockTableRecord(arid); entGroupMgr.Add(arid); acTransactionManagerPtr()->flushGraphics(); acedUpdateDisplay(); // AcDbPoint* pPoint = NULL; arpEnt.setLogicalLength(0); CreateInfoPoint(CKTCadUtility::GetMiddlePoint(pt1, pt2), idLayer, pPoint, arpEnt, dlg.m_sTag, dlg.m_sName, dlg.m_sType, dlg.m_sDes); entMgr.Add(pPoint); entMgr.AddToBlockTableRecord(arid); entMgr.Add(arpEnt); entMgr.AddToBlockTableRecord(); entGroupMgr.Release(); CKTCadUtility::CreateAcDbGroup(arid); return RTNORM; } int OnVertFlat(CEquVessleDlg &dlg) { CAcModuleResourceOverride theResource; ECapType eCapType; dlg.iType = 5; if (IDOK == dlg.DoModal()) { switch (dlg.m_iRadio) { case 0: eCapType = eCapEllip; break; case 1: eCapType = eCapHemi; break; case 2: eCapType = eCapDish; break; case 3: eCapType = eCapNone; break; } } else { return 1; } ads_point ptAds; int iRet = acedGetPoint(NULL, _T("\n选择第一个角点:"), ptAds); if (RTNORM != iRet) return iRet; AcGePoint3d pt; acdbUcs2Wcs(ptAds, asDblArray(pt), false); KTJigTrapezia jigTrap; AcDbPolyline* pPline = jigTrap.DragCreate(pt, UcsXAxis, UcsZAxis, _T("\n选择第二个角点:"), TRUE, KTJigTrapezia::eSkirtNone); if (NULL == pPline) return RTERROR; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pPline->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pPline); AcGePoint3d pt1, pt2; pPline->getPointAt(0, pt1); pPline->getPointAt(1, pt2); if (eCapType != eCapNone) { AcDbVoidPtrArray arpEnt; CreateEllipseCap(pPline, eCapType, _T("01"), arpEnt); entMgr.Add(arpEnt); } AcDbObjectIdArray arid; entMgr.AddToBlockTableRecord(arid); acTransactionManagerPtr()->flushGraphics(); acedUpdateDisplay(); // AcDbPoint* pPoint = NULL; AcDbVoidPtrArray arpEnt; CreateInfoPoint(CKTCadUtility::GetMiddlePoint(pt1, pt2), idLayer, pPoint, arpEnt, dlg.m_sTag, dlg.m_sName, dlg.m_sType, dlg.m_sDes); entMgr.Add(pPoint); entMgr.AddToBlockTableRecord(arid); entMgr.Add(arpEnt); entMgr.AddToBlockTableRecord(); CKTCadUtility::CreateAcDbGroup(arid); return RTNORM; } int OnHorzBase(CEquVessleDlg &dlg) { CAcModuleResourceOverride theResource; ECapType eCapType; dlg.iType = 6; if (IDOK == dlg.DoModal()) { switch (dlg.m_iRadio) { case 0: eCapType = eCapEllip; break; case 1: eCapType = eCapHemi; break; case 2: eCapType = eCapDish; break; case 3: eCapType = eCapNone; break; } } else { return 1; } ads_point ptAds; int iRet = acedGetPoint(NULL, _T("\n选择第一个角点:"), ptAds); if (RTNORM != iRet) return iRet; AcGePoint3d pt; acdbUcs2Wcs(ptAds, asDblArray(pt), false); KTJigTrapezia jigTrap; AcDbPolyline* pPline = jigTrap.DragCreate(pt, -UcsYAxis, UcsZAxis, _T("\n选择第二个角点:"), TRUE, KTJigTrapezia::eSkirtNone); if (NULL == pPline) return RTERROR; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pPline->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pPline); AcGePoint3d pt1, pt2; pPline->getPointAt(0, pt1); pPline->getPointAt(1, pt2); if (eCapType != eCapNone) { AcDbVoidPtrArray arpEnt; CreateEllipseCap(pPline, eCapType, _T("0101"), arpEnt); entMgr.Add(arpEnt); } AcDbObjectIdArray arid; entMgr.AddToBlockTableRecord(arid); acTransactionManagerPtr()->flushGraphics(); acedUpdateDisplay(); // AcDbPoint* pPoint = NULL; AcDbVoidPtrArray arpEnt; CreateInfoPoint(CKTCadUtility::GetMiddlePoint(pt1, pt2), idLayer, pPoint, arpEnt, dlg.m_sTag, dlg.m_sName, dlg.m_sType, dlg.m_sDes); entMgr.Add(pPoint); entMgr.AddToBlockTableRecord(arid); entMgr.Add(arpEnt); entMgr.AddToBlockTableRecord(); CKTCadUtility::CreateAcDbGroup(arid); return RTNORM; } int OnHorzEcc(CEquVessleDlg &dlg) { CAcModuleResourceOverride theResource; ECapType eCapType; dlg.iType = 7; if (IDOK == dlg.DoModal()) { switch (dlg.m_iRadio) { case 0: eCapType = eCapEllip; break; case 1: eCapType = eCapHemi; break; case 2: eCapType = eCapDish; break; case 3: eCapType = eCapNone; break; } } else { return 1; } ads_point ptAds; int iRet = acedGetPoint(NULL, _T("\n选择第一个角点:"), ptAds); if (RTNORM != iRet) return iRet; AcGePoint3d pt; acdbUcs2Wcs(ptAds, asDblArray(pt), false); KTJigTrapezia jigTrap; AcDbPolyline* pPline = jigTrap.DragCreate(pt, -UcsYAxis, UcsZAxis, _T("\n选择第二个角点:"), TRUE, KTJigTrapezia::eSkirtNone); if (NULL == pPline) return RTERROR; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pPline->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pPline); AcGePoint3d pt1, pt2; pPline->getPointAt(3, pt1); pPline->getPointAt(2, pt2); if (eCapType != eCapNone) { AcDbVoidPtrArray arpEnt; CreateEllipseCap(pPline, eCapType, _T("01"), arpEnt); entMgr.Add(arpEnt); } AcDbObjectIdArray arid; entMgr.AddToBlockTableRecord(arid); CKTObjLifeMgr entGroupMgr; entGroupMgr.Add(arid); pPline = jigTrap.DragCreate(pt1, pt2 - pt1, UcsZAxis, _T("\n选择大小头位置:"), FALSE, KTJigTrapezia::eSkirtReDir); if (NULL == pPline) return RTERROR; pPline->setLayer(idLayer); entMgr.Add(pPline); pPline->getPointAt(3, pt1); pPline->getPointAt(2, pt2); entMgr.AddToBlockTableRecord(arid); entGroupMgr.Add(arid); pPline = jigTrap.DragCreate(pt1, pt2 - pt1, UcsZAxis, _T("\n选择长度位置:"), FALSE, KTJigTrapezia::eSkirtNone); if (NULL == pPline) return RTERROR; pPline->setLayer(idLayer); entMgr.Add(pPline); if (eCapType != eCapNone) { AcDbVoidPtrArray arpEnt; CreateEllipseCap(pPline, eCapType, _T("0001"), arpEnt); entMgr.Add(arpEnt); } entMgr.AddToBlockTableRecord(arid); entGroupMgr.Add(arid); acTransactionManagerPtr()->flushGraphics(); acedUpdateDisplay(); // AcDbPoint* pPoint = NULL; AcDbVoidPtrArray arpEnt; CreateInfoPoint(CKTCadUtility::GetMiddlePoint(pt1, pt2), idLayer, pPoint, arpEnt, dlg.m_sTag, dlg.m_sName, dlg.m_sType, dlg.m_sDes); entMgr.Add(pPoint); entMgr.AddToBlockTableRecord(arid); entMgr.Add(arpEnt); entMgr.AddToBlockTableRecord(); entGroupMgr.Release(); CKTCadUtility::CreateAcDbGroup(arid); return RTNORM; } } // Vert Vessel void PL_KTVslVert() { CEquVessleDlg dlg; GET_CACHE(%s%s%s%s%d, &dlg.m_sDes, &dlg.m_sName, &dlg.m_sTag, &dlg.m_sType, &dlg.m_iRadio); OnVertBase(dlg); SET_CACHE(%s%s%s%s%d, dlg.m_sDes, dlg.m_sName, dlg.m_sTag, dlg.m_sType, dlg.m_iRadio); } // Vert Vessel w/Skirt void PL_KTVslVertSkirt() { CEquVessleDlg dlg; GET_CACHE(%s%s%s%s%d, &dlg.m_sDes, &dlg.m_sName, &dlg.m_sTag, &dlg.m_sType, &dlg.m_iRadio); OnVertSkirt(dlg); SET_CACHE(%s%s%s%s%d, dlg.m_sDes, dlg.m_sName, dlg.m_sTag, dlg.m_sType, dlg.m_iRadio); } // Vert Vessel w/Cone void PL_KTVslVertCone() { CEquVessleDlg dlg; GET_CACHE(%s%s%s%s%d, &dlg.m_sDes, &dlg.m_sName, &dlg.m_sTag, &dlg.m_sType, &dlg.m_iRadio); OnVertCone(dlg); } // Vert Vessel w/Skirt & Cone void PL_KTVslVertSkirtCone() { CEquVessleDlg dlg; GET_CACHE(%s%s%s%s%d, &dlg.m_sDes, &dlg.m_sName, &dlg.m_sTag, &dlg.m_sType, &dlg.m_iRadio); OnVertSkirtCone(dlg); SET_CACHE(%s%s%s%s%d, dlg.m_sDes, dlg.m_sName, dlg.m_sTag, dlg.m_sType, dlg.m_iRadio); } // Vert Flat Bottom Vessel Ellip void PL_KTVslVertFlat() { CEquVessleDlg dlg; GET_CACHE(%s%s%s%s%d, &dlg.m_sDes, &dlg.m_sName, &dlg.m_sTag, &dlg.m_sType, &dlg.m_iRadio); OnVertFlat(dlg); SET_CACHE(%s%s%s%s%d, dlg.m_sDes, dlg.m_sName, dlg.m_sTag, dlg.m_sType, dlg.m_iRadio); } // Horz Vessel void PL_KTVslHorz() { CEquVessleDlg dlg; GET_CACHE(%s%s%s%s%d, &dlg.m_sDes, &dlg.m_sName, &dlg.m_sTag, &dlg.m_sType, &dlg.m_iRadio); OnHorzBase(dlg); SET_CACHE(%s%s%s%s%d, dlg.m_sDes, dlg.m_sName, dlg.m_sTag, dlg.m_sType, dlg.m_iRadio); } // Horz Vessel w/Ecc void PL_KTVslHorzEcc() { CEquVessleDlg dlg; GET_CACHE(%s%s%s%s%d, &dlg.m_sDes, &dlg.m_sName, &dlg.m_sTag, &dlg.m_sType, &dlg.m_iRadio); OnHorzEcc(dlg); SET_CACHE(%s%s%s%s%d, dlg.m_sDes, dlg.m_sName, dlg.m_sTag, dlg.m_sType, dlg.m_iRadio); } void PL_KTVslTanks() { CAcModuleResourceOverride theResource; CEquVessleDlg dlg; dlg.iType=8; if (IDOK == dlg.DoModal()) { ads_point ptAds; int iRet = acedGetPoint(NULL, _T("\n选择第一个角点:"), ptAds); if (RTNORM != iRet) return; AcGePoint3d pt; acdbUcs2Wcs(ptAds, asDblArray(pt), false); KTJigTrapezia jigTrap; AcDbPolyline* pPline = jigTrap.DragCreate(pt, UcsXAxis, UcsZAxis, _T("\n选择第二个角点:"), TRUE, KTJigTrapezia::eSkirtNone); if (NULL == pPline) return; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pPline->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pPline); AcGePoint3d pt1, pt2, pt3; pPline->getPointAt(0, pt1); pPline->getPointAt(1, pt2); pPline->getPointAt(2, pt3); AcGePoint3d ptMid = CKTCadUtility::GetMiddlePoint(pt1, pt2); AcGeVector3d vtDir((pt2 - pt3).normal() * pt3.distanceTo(pt2) / 10.0); AcDbLine* pLine; switch(dlg.m_iRadio) { case 0: break; case 1: pLine = new AcDbLine(pt1, ptMid + vtDir); ASSERT(NULL != pLine); pLine->setLayer(idLayer); entMgr.Add(pLine); pLine = new AcDbLine(pt2, ptMid + vtDir); ASSERT(NULL != pLine); pLine->setLayer(idLayer); entMgr.Add(pLine); break; case 2: pLine = new AcDbLine(pt1 - vtDir, pt2 - vtDir); ASSERT(NULL != pLine); pLine->setLayer(idLayer); entMgr.Add(pLine); break; } AcDbObjectIdArray arid; entMgr.AddToBlockTableRecord(arid); acTransactionManagerPtr()->flushGraphics(); acedUpdateDisplay(); // AcDbPoint* pPoint = NULL; AcDbVoidPtrArray arpEnt; CreateInfoPoint(ptMid, idLayer, pPoint, arpEnt,dlg.m_sTag,dlg.m_sName,dlg.m_sType,dlg.m_sDes); entMgr.Add(pPoint); entMgr.AddToBlockTableRecord(arid); entMgr.Add(arpEnt); entMgr.AddToBlockTableRecord(); CKTCadUtility::CreateAcDbGroup(arid); } else { return; } return; } void PL_KTVslComponents() { CAcModuleResourceOverride myResources; KTComponentsDlg dlg; if (IDOK != dlg.DoModal()) return; ads_point pt1, pt2; int iRet = acedGetPoint(NULL, _T("\n选择第一点:"), pt1); if (RTNORM != iRet) return; iRet = acedGetPoint(pt1, _T("\n选择第二点:"), pt2); if (RTNORM != iRet) return; AcGePoint3d ptBase1, ptBase2; acdbUcs2Wcs(pt1, asDblArray(ptBase1), false); acdbUcs2Wcs(pt2, asDblArray(ptBase2), false); switch (dlg.m_iCurType) { case 0: // Generic { KTJigTrapezia jig; AcDbPolyline* pPline = jig.DragCreate(ptBase1, ptBase2 - ptBase1, UcsZAxis, _T("\n拾取放置位置:"), FALSE, KTJigTrapezia::eSkirtBoth); if (NULL == pPline) return; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pPline->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pPline); entMgr.AddToBlockTableRecord(); } break; case 1: // Cylinder { KTJigTrapezia jig; AcDbPolyline* pPline = jig.DragCreate(ptBase1, ptBase2 - ptBase1, UcsZAxis, _T("\n拾取放置位置:"), FALSE, KTJigTrapezia::eSkirtNone); if (NULL == pPline) return; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pPline->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pPline); entMgr.AddToBlockTableRecord(); } break; case 2: // Concentric { KTJigTrapezia jig; AcDbPolyline* pPline = jig.DragCreate(ptBase1, ptBase2 - ptBase1, UcsZAxis, _T("\n拾取放置位置:"), FALSE, KTJigTrapezia::eSkirtBoth); if (NULL == pPline) return; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pPline->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pPline); entMgr.AddToBlockTableRecord(); } break; case 3: // Ecccentric { KTJigTrapezia jig; AcDbPolyline* pPline = jig.DragCreate(ptBase1, ptBase2 - ptBase1, UcsZAxis, _T("\n拾取放置位置:"), FALSE, KTJigTrapezia::eSkirtCoDir); if (NULL == pPline) return; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pPline->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pPline); entMgr.AddToBlockTableRecord(); } break; case 4: // Skirt { AcDbVoidPtrArray arpEnts;; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); KTJigSkirt jig; if (!jig.DragCreate(ptBase1, ptBase2 - ptBase1, UcsZAxis, _T("\n拾取放置位置:"), idLayer, arpEnts)) return; CKTObjLifeMgr entMgr; entMgr.Add(arpEnts); entMgr.AddToBlockTableRecord(); } break; case 5: // Hemispherical Head { acedGrDraw(pt1, pt2, 7, 0); AcGePoint3d ptCenter = CKTCadUtility::GetMiddlePoint(ptBase1, ptBase2); acdbWcs2Ucs(asDblArray(ptCenter), pt1, false); iRet = acedGetPoint(pt1, _T("\n请选择方向:"), pt2); if (RTNORM != iRet) return; AcGePoint3d ptDir; acdbUcs2Wcs(pt2, asDblArray(ptDir), false); acedRedraw(NULL, 1); AcGeVector3d vtNormal((ptBase2 - ptBase1).crossProduct(ptDir - ptCenter)); vtNormal.normalize(); AcDbEllipse* pEllips = CreateEllipseCap(ptBase1, ptBase2, vtNormal, eCapHemi); if (NULL == pEllips) return; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pEllips->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pEllips); entMgr.AddToBlockTableRecord(); } break; case 6: // Elliptical Head { acedGrDraw(pt1, pt2, 7, 0); AcGePoint3d ptCenter = CKTCadUtility::GetMiddlePoint(ptBase1, ptBase2); acdbWcs2Ucs(asDblArray(ptCenter), pt1, false); iRet = acedGetPoint(pt1, _T("\n请选择方向:"), pt2); if (RTNORM != iRet) return; AcGePoint3d ptDir; acdbUcs2Wcs(pt2, asDblArray(ptDir), false); acedRedraw(NULL, 1); AcGeVector3d vtNormal((ptBase2 - ptBase1).crossProduct(ptDir - ptCenter)); vtNormal.normalize(); AcDbEllipse* pEllips = CreateEllipseCap(ptBase1, ptBase2, vtNormal, eCapEllip); if (NULL == pEllips) return; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pEllips->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pEllips); entMgr.AddToBlockTableRecord(); } break; case 7: // Dished Head { acedGrDraw(pt1, pt2, 7, 0); AcGePoint3d ptCenter = CKTCadUtility::GetMiddlePoint(ptBase1, ptBase2); acdbWcs2Ucs(asDblArray(ptCenter), pt1, false); iRet = acedGetPoint(pt1, _T("\n请选择方向:"), pt2); if (RTNORM != iRet) return; AcGePoint3d ptDir; acdbUcs2Wcs(pt2, asDblArray(ptDir), false); acedRedraw(NULL, 1); AcGeVector3d vtNormal((ptBase2 - ptBase1).crossProduct(ptDir - ptCenter)); vtNormal.normalize(); AcDbEllipse* pEllips = CreateEllipseCap(ptBase1, ptBase2, vtNormal, eCapDish); if (NULL == pEllips) return; AcDbObjectId idLayer = KTSetting::InitLayer(LAYER_VESSEL); pEllips->setLayer(idLayer); CKTObjLifeMgr entMgr; entMgr.Add(pEllips); entMgr.AddToBlockTableRecord(); } break; } return; } // 插水位线 void PI_CSWX() { // 先选一根水平线做Y值参考 ads_point adsPt; ads_name ent; if (acedEntSel(_T("\n请选择由上华软件绘制的“地平线”对象:"), ent, adsPt) != RTNORM) return; AcDbObjectId id(AcDbObjectId::kNull); acdbGetObjectId(id, ent); if (!id.isValid()) return; double dYDelta(.0), dElev(.0), dElevOrig(.0); AcGePoint3d ptS(AcGePoint3d::kOrigin), ptE(AcGePoint3d::kOrigin); OPENOBJ_BEGIN(id, AcDb::kForRead, AcDbEntity, p) { if (!p) { acutPrintf(_T("\n请选择由上华软件绘制的“地平线”对象!")); return; } AecDbObjXDataMap mmp; if (!mmp.Read(p, _T("ELEV"))) { acutPrintf(_T("\n请选择由上华软件绘制的“地平线”对象。")); return; } mmp.GetAt(_T("elev"), dElev); mmp.GetAt(_T("elevOrig"), dElevOrig); } OPENOBJ_END() if (acedGetReal(_T("\n请输入距\"地平线\"的垂直高度(毫米单位):"), &dYDelta) != RTNORM) return; if (acedGetPoint(NULL, _T("\n请选择起始点:"), adsPt) != RTNORM) return; KTCADSysVar varTemp(_T("ORTHOMODE"), 1); acdbUcs2Wcs(adsPt, adsPt, false); ptS = asPnt3d(adsPt); ptS.y = dElevOrig + dYDelta; acdbWcs2Ucs(asDblArray(ptS), adsPt, false); if (acedGetPoint(adsPt, _T("\n请选择终点:"), adsPt) != RTNORM) return; acdbUcs2Wcs(adsPt, adsPt, false); ptE = asPnt3d(adsPt); ptE.y = dElevOrig + dYDelta; AcDbObjectIdArray ids(0); struct resbuf rb; acedGetVar(_T("INSUNITS"), &rb); bool bMeters(rb.resval.rint == AcDb::kUnitsMeters); // 先画一根 double dXLen(500), dYLen(60); if (bMeters) { dXLen *= .001; dYLen *= .001; } AcDbLine *pL = new AcDbLine(ptS, ptE); ids.append(CoreTools::AddToModelSpace(pL)); // 生成一个标高标注 CElevationInfoDlg dlg; if (dlg.DoModal() != IDOK) return; dElev += dYDelta; AcGePoint3d ptEle(AcGePoint3d::kOrigin); Midpoint(ptS, ptE, ptEle); CString strEle(_T("")); strEle.Format(_T("%.2f"), dElev * .001); #ifndef ZWCAD AcDbEntity *p = DimFactory(FilePath::GetArxDir() + _T("\\dimension.arx")).makeSymbElevation1(ptEle #else AcDbEntity *p = DimFactory(FilePath::GetArxDir() + _T("\\dimension.zrx")).makeSymbElevation1(ptEle #endif , strEle , dlg.m_sTextStyle , dlg.m_dTextHeight , false , .0 , false , .0 , dlg.m_bPrec2 ); if (p) CoreTools::AddToModelSpace(p); AcGePoint3d pt(AcGePoint3d::kOrigin); Midpoint(ptS, ptE, pt); ptS.x = pt.x - dXLen * .5; ptE.x = pt.x + dXLen * .5; ptS.y -= dYLen; ptE.y -= dYLen; double dL(dXLen/6); // 间距60mm画三条线 for (size_t i = 0; i < 3; ++i) { pL = new AcDbLine(ptS, ptE); ids.append(CoreTools::AddToModelSpace(pL)); ptS.y -= dYLen; ptE.y -= dYLen; ptS.x += dL; ptE.x -= dL; } AcDbObjectId idGrp(AcDbObjectId::kNull); PIDLineTools::generateGroup(_T("U*"), ids, idGrp); } // 插地平线 void PI_CDPX() { KTCADSysVar varTemp(_T("ORTHOMODE"), 1); // 选起点 AcGePoint3d ptS(AcGePoint3d::kOrigin), ptE(AcGePoint3d::kOrigin); ads_point adsPt; if (acedGetPoint(NULL, _T("\n请选择起始点:"), adsPt) != RTNORM) return; acdbUcs2Wcs(adsPt, adsPt, false); ptS = asPnt3d(adsPt); acdbWcs2Ucs(asDblArray(ptS), adsPt, false); if (acedGetPoint(adsPt, _T("\n请选择终点:"), adsPt) != RTNORM) return; acdbUcs2Wcs(adsPt, adsPt, false); ptE = asPnt3d(adsPt); struct resbuf rb; acedGetVar(_T("INSUNITS"), &rb); bool bMeters(rb.resval.rint == AcDb::kUnitsMeters); double dH(180.), dLineW(25), dDelta(120.), dEle(.0); if (bMeters) { dH *= .001; dLineW *= .001; dDelta *= .001; dEle *= .001; } if (acedGetReal(_T("\n请输入地平线标高(毫米单位):"), &dEle) != RTNORM) return; AcDbObjectIdArray ids(0); // 先画PLine线 AcDbPolyline *pPL = new AcDbPolyline; pPL->addVertexAt(0, ptS.convert2d(AcGePlane::kXYPlane), .0, dLineW, dLineW); pPL->addVertexAt(1, ptE.convert2d(AcGePlane::kXYPlane), .0, dLineW, dLineW); ids.append(CoreTools::AddToModelSpace(pPL)); double dOrigY = ptS.y; double dY = ptS.y; // 从起点画向终点 int dir(ptS.x - ptE.x < 0 ? 1 :-1); double dMax(ptS.distanceTo(ptE)); double dMaxX(ptS.x + ptS.distanceTo(ptE) * dir); double dMinX(ptS.x); double dLen(2 * dH + 4 * dDelta); ptS.y = dY; ptE.y = dY - dH; int count = (int)(dMax/dLen); dLen *= dir; dH *= dir; dDelta *= dir; /* |dH | dDelta*4 | dH | _____________________________________________ / / /\ \ \ / / / \ \ \ 为一组 */ for (size_t i = 0; i < count ; i++) { ptS.x = dMinX + dH; ptE.x = dMinX; ids.append(CoreTools::AddToModelSpace(new AcDbLine(ptS, ptE))); ptS.x += dDelta; ptE.x += dDelta; ids.append(CoreTools::AddToModelSpace(new AcDbLine(ptS, ptE))); ptS.x += dDelta; ptE.x += dDelta; ids.append(CoreTools::AddToModelSpace(new AcDbLine(ptS, ptE))); ptE.x = ptS.x + dH; ids.append(CoreTools::AddToModelSpace(new AcDbLine(ptS, ptE))); ptS.x += dDelta; ptE.x += dDelta; ids.append(CoreTools::AddToModelSpace(new AcDbLine(ptS, ptE))); ptS.x += dDelta; ptE.x += dDelta; ids.append(CoreTools::AddToModelSpace(new AcDbLine(ptS, ptE))); dMinX += dLen; } AcDbObjectId idGrp(AcDbObjectId::kNull); PIDLineTools::generateGroup(_T("U*"), ids, idGrp); AecDbObjXDataMap mmp; mmp.SetAt(_T("elev"), dEle); mmp.SetAt(_T("elevOrig"), dOrigY); for (int i = 0; i < ids.length(); ++i) { mmp.Write(ids[i], _T("ELEV")); } } // 标高标注 void PI_CRBG() { // 先选一根水平线做Y值参考 ads_point adsPt; ads_name ent; if (acedEntSel(_T("\n请选择一根水平线做为\"地平线\":"), ent, adsPt) != RTNORM) return; AcDbObjectId id(AcDbObjectId::kNull); acdbGetObjectId(id, ent); if (!id.isValid()) return; double dElev(.0), dElevOrig(.0); AcGePoint3d ptS(AcGePoint3d::kOrigin), ptE(AcGePoint3d::kOrigin); OPENOBJ_BEGIN(id, AcDb::kForRead, AcDbEntity, p) { if (!p) { acutPrintf(_T("\n请选择一段直线或多段线!")); return; } AecDbObjXDataMap mmp; if (!mmp.Read(p, _T("ELEV"))) { acutPrintf(_T("\n请选择由上华软件绘制的“地平线”对象。")); return; } mmp.GetAt(_T("elev"), dElev); mmp.GetAt(_T("elevOrig"), dElevOrig); } OPENOBJ_END() CElevationInfoDlg dlg; if (dlg.DoModal() != IDOK) return; // 选插入点 AcGePoint3d ptEle(AcGePoint3d::kOrigin); CString str(_T("")); while (true) { if (acedGetPoint(NULL, _T("\n请选择插入点:"), adsPt) != RTNORM) break; acdbUcs2Wcs(adsPt, adsPt, false); str.Format(_T("%.2f"), (adsPt[Y] - dElevOrig) * .001 + dElev * .001); #ifndef ZWCAD AcDbEntity *p = DimFactory(FilePath::GetArxDir() + _T("\\dimension.arx")).makeSymbElevation1(asPnt3d(adsPt) #else AcDbEntity *p = DimFactory(FilePath::GetArxDir() + _T("\\dimension.zrx")).makeSymbElevation1(asPnt3d(adsPt) #endif , str , dlg.m_sTextStyle , dlg.m_dTextHeight , false , .0 , false , .0 , dlg.m_bPrec2 ); if (p) CoreTools::AddToModelSpace(p); } } static void FreeBuffer(AcDbVoidPtrArray& arSubEnts) { AcDbEntity* pSubEnt = NULL; for (int j = 0;j < arSubEnts.length();j++) { pSubEnt = (AcDbEntity*)arSubEnts.at(j); if (pSubEnt != NULL) delete pSubEnt; } } void UpdateATSEl(AcDbEntity* pEnt,double dElNew) { CString ss; ss.Format(_T("%.3f"), dElNew); #ifndef ZWCAD DimFactory(FilePath::GetArxDir() + _T("\\dimension.arx")).modifyElevation(pEnt, ss); #else DimFactory(FilePath::GetArxDir() + _T("\\dimension.zrx")).modifyElevation(pEnt, ss); #endif } void ModifyATSEl(AcDbEntity*pEnt,double dElAdd) { #ifndef ZWCAD double dE = DimFactory(FilePath::GetArxDir() + _T("\\dimension.arx")).getElevation(pEnt); #else double dE = DimFactory(FilePath::GetArxDir() + _T("\\dimension.zrx")).getElevation(pEnt); #endif dE += dElAdd; CString ss; ss.Format(_T("%.3f"), dE); #ifndef ZWCAD DimFactory(FilePath::GetArxDir() + _T("\\dimension.arx")).modifyElevation(pEnt, ss); #else DimFactory(FilePath::GetArxDir() + _T("\\dimension.zrx")).modifyElevation(pEnt, ss); #endif } double GetATSEl(AcDbEntity*pEnt) { #ifndef ZWCAD return DimFactory(FilePath::GetArxDir() + _T("\\dimension.arx")).getElevation(pEnt); #else return DimFactory(FilePath::GetArxDir() + _T("\\dimension.zrx")).getElevation(pEnt); #endif } //标高更新 void PI_BGGXCmdFnc() { ads_name ent; resbuf* pRb = acutBuildList(RTDXF0, _T("AEC_BIAOGAOBIAOZHU,TEXT,AEC_EWPIPEDIM"), 0); int nRes = CKTCadUtility::SelectEntity(_T("\n请选择要修改的基准标高实体:"), ent, pRb); if (nRes != RTNORM) return; ads_name ss; nRes = CKTCadUtility::SelectEntities(_T("\n请选择要调整的标高实体:"), ss, pRb); if (nRes != RTNORM) return; acutRelRb(pRb); AcDbObjectId id; acdbGetObjectId(id,ent); double dBaseOldEl = 0.0; AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead)) { AcDbText* pText = AcDbText::cast(pEnt); AecDbEwPipeDim *pPipeDim = AecDbEwPipeDim::cast(pEnt); if (pText != NULL) { dBaseOldEl = _ttof(pText->textStringConst()); } else if (pPipeDim && pPipeDim->HasElevation()) { pPipeDim->GetElevation(dBaseOldEl); // 转成 M dBaseOldEl *= .001; } else { dBaseOldEl = GetATSEl(pEnt); } pEnt->close(); } //弹出界面 CAcModuleResourceOverride theResource; CBGGXDlg dlg; dlg.m_dElOld = dBaseOldEl; dlg.m_dElNew = dBaseOldEl; if (IDOK == dlg.DoModal() ) { double dElAdd = dlg.m_dElNew - dlg.m_dElOld; CString sText; sText.Format(_T("%.2f"),dlg.m_dElNew); //先修改基准标高 if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)) { AcDbText* pText = AcDbText::cast(pEnt); if (pText != NULL) { pText->setTextString(sText); } else { UpdateATSEl(pEnt,dlg.m_dElNew); } pEnt->close(); } //在更新相关标高 Adesk::Int32 nLen = 0; acedSSLength(ss, &nLen); for (int i = 0;i < nLen;i++) { acedSSName(ss,i,ent); acdbGetObjectId(id,ent); double dVal = 0.0; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)) { AcDbText* pText = AcDbText::cast(pEnt); AecDbEwPipeDim *pPipeDim = AecDbEwPipeDim::cast(pEnt); if (pText != NULL) { dVal = _ttof(pText->textStringConst()); dVal += dElAdd; sText.Format(_T("%.2f"),dVal); pText->setTextString(sText); } else if (pPipeDim) { pPipeDim->ModifyElevation(dElAdd); } else { ModifyATSEl(pEnt, dElAdd); } pEnt->close(); } } acedSSFree(ss); } } #include "KTExpressCalc.h" void PI_TESTCmdFnc() { KTExpressCalc cal; cal.SetVariableData(_T("t"), 300); //cal.SetVariableData(_T("H"), 100); CString sExp = _T("t"); double dRes = 0.0; if (!cal.Calculate(sExp, dRes)) { KTExpressCalc::EErrorCode eE = cal.GetErrorCode(); acutPrintf(_T("\nEErorCode:%d"), eE); } acutPrintf(_T("\nExp:%g"), dRes); }