1655 lines
38 KiB
C++
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);
|
|
} |