Files
envi-code/SourceCode/Code2026/PIDLineCmd/pid_Vessel.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

1655 lines
38 KiB
C++

#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<int> 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<int> 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);
}