1493 lines
43 KiB
C++
1493 lines
43 KiB
C++
#include "stdafx.h"
|
|
#include "DbDoubleLinePipeReducer.h"
|
|
#include "DbDoubleLinePipe.h"
|
|
#include "aced.h"
|
|
#include "actrans.h"
|
|
#include "TGripImp.h"
|
|
|
|
namespace
|
|
{
|
|
// cet 2018.2.2 add 获得大小喷头在接口的外径
|
|
double GetPipeOutDByDn(const DList<TPipeInterface> &lstInterface, const XPoint &pt, double dDn)
|
|
{
|
|
double dRet = dDn;
|
|
for (int i = 0; i < lstInterface.Length(); ++i)
|
|
{
|
|
const TPipeInterface &face = lstInterface.GetAt(i);
|
|
if (!face.m_idPipe.isValid() || face.m_idPipe.isErased() || pt.Distance2d(face.m_ptLocation) > 0.001)
|
|
{
|
|
continue;
|
|
}
|
|
OPENOBJ_BEGIN(face.m_idPipe, AcDb::kForRead, TDbDoubleLinePipe, pPipe);
|
|
if (pPipe != NULL)
|
|
{
|
|
dRet = pPipe->OuterDn();
|
|
}
|
|
OPENOBJ_END();
|
|
break;
|
|
}
|
|
return dRet;
|
|
}
|
|
}
|
|
|
|
Adesk::Boolean acedPostCommand(const TCHAR * );
|
|
|
|
TWT_GRIPAPPDATA TDbDoubleLinePipeReducer::s_gripAppData[GRIP_MAXNUM_DBPIPE_REDUCER]; // cet 2012.11.6 add
|
|
|
|
ACRX_DXF_DEFINE_MEMBERS(ATSDoubleLinePipeReducer, ATSEquipment, AcDb::kDHL_CURRENT,
|
|
AcDb::kMReleaseCurrent, 1, ATS_DOUBLELINEPIPEREDUCER,
|
|
"ATS_DOUBLELINEPIPEREDUCER图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com");
|
|
IMPLEMENT_TENTBASE(TDbDoubleLinePipeReducer);
|
|
|
|
const Adesk::UInt8 TDbDoubleLinePipeReducer::g_nVersion = 1;
|
|
|
|
|
|
TDbDoubleLinePipeReducer::TDbDoubleLinePipeReducer()
|
|
{
|
|
m_visibility=TPipeSys::kVisible;
|
|
m_nType = 0;
|
|
m_dAngle = 0.0;
|
|
m_nLinkType = eJointing;
|
|
m_dSPipeFlangeDist = 0.0;
|
|
m_dSPipeDiameter = 0.0;
|
|
m_dEPipeDiameter = 0.0;
|
|
m_dLength = 0.0;
|
|
m_dSFlangeDiameter = 0.0;
|
|
m_dSFlangeThick = 0.0;
|
|
m_dEFlangeThick = 0.0;
|
|
m_dEFlangeDiameter = 0.0;
|
|
m_dEPipeFlangeDist = 0.0;
|
|
m_nSpare = 0;
|
|
m_dSpare = 0.0;
|
|
m_strSpare = _T("");
|
|
}
|
|
|
|
TDbDoubleLinePipeReducer::~TDbDoubleLinePipeReducer()
|
|
{
|
|
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::subGetClassID(CLSID* pClsid) const
|
|
{
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus
|
|
TDbDoubleLinePipeReducer::subGetOsnapPoints(AcDb::OsnapMode osnapMode,
|
|
INT_PTR gsSelectionMark,
|
|
const AcGePoint3d& ptPick,
|
|
const AcGePoint3d& lastPoint,
|
|
const AcGeMatrix3d& viewXform,
|
|
AcGePoint3dArray& snapPoints,
|
|
AcDbIntArray& geomIds) const
|
|
{
|
|
Acad::ErrorStatus es=Acad::eOk;
|
|
if (osnapMode == AcDb::kOsModeEnd)
|
|
{
|
|
AcGePoint3d ptStart = m_ptStart, ptEnd;
|
|
AcGeVector3d vt = AcGeVector3d::kXAxis;
|
|
vt.rotateBy(m_dAngle, AcGeVector3d::kZAxis);
|
|
AcGeVector3d vtNor = vt;
|
|
double dAngle = Wcs2Ucs(m_dAngle);
|
|
if (dAngle > PI / 2 && dAngle <= PI * 3 / 2)
|
|
{
|
|
vtNor.rotateBy(-PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
else
|
|
{
|
|
vtNor.rotateBy(PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
|
|
if (m_nLinkType == eJointing) //焊接
|
|
{
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * m_dLength;
|
|
}
|
|
else if (m_nType == eDown)//偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * m_dLength + vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptEnd = m_ptStart + vt * m_dLength - vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2;
|
|
}
|
|
}
|
|
else //法兰链接
|
|
{
|
|
ptStart += -vt * m_dSFlangeThick;
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist + m_dEFlangeThick);
|
|
}
|
|
else if (m_nType == eDown) //偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist + m_dEFlangeThick) + vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist + m_dEFlangeThick) - vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2;
|
|
}
|
|
}
|
|
|
|
snapPoints.append(ptStart);
|
|
snapPoints.append(ptEnd);
|
|
}
|
|
return es;
|
|
}
|
|
|
|
// 从DWG读入数据:
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::dwgInFields(AcDbDwgFiler* pFiler)
|
|
{
|
|
assertWriteEnabled();
|
|
Acad::ErrorStatus es = TDbEquipment::dwgInFields(pFiler);
|
|
if(es != Acad::eOk) return es;
|
|
Adesk::UInt8 nVer;
|
|
pFiler->readItem(&nVer);
|
|
pFiler->readItem(&m_dLength);
|
|
pFiler->readItem(&m_dSPipeDiameter);
|
|
pFiler->readItem(&m_dEPipeDiameter);
|
|
pFiler->readItem(&m_dSPipeFlangeDist);
|
|
pFiler->readItem(&m_dEPipeFlangeDist);
|
|
pFiler->readItem(&m_dEFlangeDiameter);
|
|
pFiler->readItem(&m_dSFlangeDiameter);
|
|
pFiler->readItem(&m_dEFlangeThick);
|
|
pFiler->readItem(&m_dSFlangeThick);
|
|
pFiler->readItem(&m_nType);
|
|
pFiler->readItem(&m_nLinkType);
|
|
pFiler->readItem(&m_dAngle);
|
|
pFiler->readItem(&m_ptStart);
|
|
pFiler->readItem(&m_nSpare);
|
|
pFiler->readItem(&m_dSpare);
|
|
|
|
ReadString(pFiler,m_strSpare);
|
|
|
|
return pFiler->filerStatus();
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::dwgOutFields(AcDbDwgFiler* pFiler) const
|
|
{
|
|
assertReadEnabled();
|
|
Acad::ErrorStatus es = TDbEquipment::dwgOutFields(pFiler);
|
|
if(es != Acad::eOk) return es;
|
|
pFiler->writeItem(g_nVersion);
|
|
pFiler->writeItem(m_dLength);
|
|
pFiler->writeItem(m_dSPipeDiameter);
|
|
pFiler->writeItem(m_dEPipeDiameter);
|
|
pFiler->writeItem(m_dSPipeFlangeDist);
|
|
pFiler->writeItem(m_dEPipeFlangeDist);
|
|
pFiler->writeItem(m_dEFlangeDiameter);
|
|
pFiler->writeItem(m_dSFlangeDiameter);
|
|
pFiler->writeItem(m_dEFlangeThick);
|
|
pFiler->writeItem(m_dSFlangeThick);
|
|
pFiler->writeItem(m_nType);
|
|
pFiler->writeItem(m_nLinkType);
|
|
pFiler->writeItem(m_dAngle);
|
|
pFiler->writeItem(m_ptStart);
|
|
pFiler->writeItem(m_nSpare);
|
|
pFiler->writeItem(m_dSpare);
|
|
|
|
pFiler->writeString((const TCHAR *)m_strSpare);
|
|
|
|
return pFiler->filerStatus();
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::dxfInFields(AcDbDxfFiler* pFiler)
|
|
{
|
|
assertWriteEnabled();
|
|
Acad::ErrorStatus es=Acad::eOk;
|
|
es=TDbEquipment::dxfInFields(pFiler);
|
|
|
|
if (!pFiler->atSubclassData(_T("TDbDoubleLinePipeReducer"))) {
|
|
return Acad::eBadDxfSequence;
|
|
}
|
|
|
|
return es;
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::dxfOutFields(AcDbDxfFiler* pFiler) const
|
|
{
|
|
Acad::ErrorStatus es=Acad::eOk;
|
|
es=TDbEquipment::dxfOutFields(pFiler);
|
|
assert(es==Acad::eOk);
|
|
es=pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbDoubleLinePipeReducer"));
|
|
assert(es==Acad::eOk);
|
|
|
|
return es;
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::subGetGripPoints(AcGePoint3dArray& gripPoints,
|
|
AcDbIntArray& osnapModes,
|
|
AcDbIntArray& geomIds) const
|
|
{
|
|
assertReadEnabled();
|
|
Acad::ErrorStatus es = Acad::eOk;
|
|
es = TDbPipeNode::subGetGripPoints(gripPoints, osnapModes, geomIds);
|
|
if(es != Acad::eOk)
|
|
{
|
|
return es;
|
|
}
|
|
|
|
XPoint pt1 = gripPoints.at(0);
|
|
XPoint pt2 = gripPoints.at(1);
|
|
|
|
// cet 2012.11.6 modify 添加两个命令点
|
|
double dMeter = 1;
|
|
if (DocGetCurMeterUnitDraw())
|
|
{
|
|
dMeter = 0.001;
|
|
}
|
|
AcGeVector3d vt = AcGeVector3d::kXAxis;
|
|
vt.rotateBy(m_dAngle, AcGeVector3d::kZAxis);
|
|
AcGePoint3d ptS, ptE, ptMid;
|
|
GetPoints(ptS, ptMid, ptE);
|
|
if (m_nLinkType == eFlangeLink)
|
|
{
|
|
ptS -= vt * m_dSFlangeThick * 2 * dMeter;
|
|
ptE += vt * m_dEFlangeThick * 2 * dMeter;
|
|
}
|
|
else
|
|
{
|
|
double dLen = PixelToWcs(30);
|
|
ptS -= vt * dLen;
|
|
ptE += vt * dLen;
|
|
}
|
|
gripPoints.append(ptMid);
|
|
gripPoints.append(ptS);
|
|
s_gripAppData[3].id = objectId();
|
|
gripPoints.append(ptE);
|
|
s_gripAppData[4].id = objectId();
|
|
return Acad::eOk;
|
|
}
|
|
|
|
#if ADS > 15
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::subGetGripPoints( AcDbGripDataPtrArray& grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d& curViewDir, const int bitflags ) const
|
|
{
|
|
assertReadEnabled();
|
|
AcDbIntArray osnapModes;
|
|
AcDbIntArray geomIds;
|
|
AcGePoint3dArray gripPoints;
|
|
Acad::ErrorStatus eSta = subGetGripPoints(gripPoints,osnapModes,geomIds);
|
|
CString sGripTip;
|
|
for (int i = 0;i < gripPoints.length() && i < GRIP_MAXNUM_DBPIPE_REDUCER; i++)
|
|
{
|
|
bool bCmd = false;
|
|
ExplainGripIndex(i, bCmd, sGripTip);
|
|
s_gripAppData[i].nIndex = i;
|
|
s_gripAppData[i].sGripTip = sGripTip;
|
|
AcDbGripData *pGripData = new AcDbGripData;
|
|
pGripData->setAppData((void*)&s_gripAppData[i]);
|
|
pGripData->setGripPoint(gripPoints.at(i));
|
|
// 命令夹点重绘夹点样式
|
|
if (bCmd)
|
|
{
|
|
pGripData->setWorldDraw(GripCback::WorldDrawfunc);
|
|
}
|
|
pGripData->setToolTipFunc(GripCback::GripToolTipFunc);
|
|
grips.append(pGripData);
|
|
}
|
|
return eSta;
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::subMoveGripPointsAt(const AcDbVoidPtrArray& appData,
|
|
const AcGeVector3d& offset,
|
|
const int bitflags)
|
|
{
|
|
assertWriteEnabled();
|
|
AcDbIntArray arIndex;
|
|
int nSize = appData.length();
|
|
for (int i = 0;i < nSize; i++)
|
|
{
|
|
TWT_GRIPAPPDATA *pAppData = (TWT_GRIPAPPDATA*)appData.at(i);
|
|
if (pAppData != NULL)
|
|
{
|
|
arIndex.append(pAppData->nIndex);
|
|
}
|
|
}
|
|
Acad::ErrorStatus eSta = subMoveGripPointsAt(arIndex, offset);
|
|
return eSta;
|
|
}
|
|
#endif
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::subMoveGripPointsAt(const AcDbIntArray& indices,
|
|
const AcGeVector3d& offset)
|
|
{
|
|
assertWriteEnabled();
|
|
Acad::ErrorStatus es = Acad::eOk;
|
|
|
|
int nIndex = -1;
|
|
if (indices.length() > 0)
|
|
{
|
|
nIndex = indices.first();
|
|
if (nIndex == eMove - 5 || nIndex == eStart - 5 || nIndex == eEnd - 5)
|
|
{
|
|
AcGeMatrix3d mat;
|
|
mat.setToTranslation(offset);
|
|
m_ptStart.transformBy(mat);
|
|
|
|
for (int i = 0; i < m_lstInterface.Length(); ++i)
|
|
{
|
|
m_lstInterface[i]->m_ptLocation.TransformBy(mat);
|
|
}
|
|
}
|
|
}
|
|
|
|
// 启动绘制 cet 2012.11.7 add
|
|
if (indices.length() == 1 && (indices.at(0) == 3 || indices.at(0) == 4))
|
|
{
|
|
AcGePoint3d ptS, ptMid, ptE;
|
|
GetPoints(ptS, ptMid, ptE);
|
|
if (indices.at(0) == 3)
|
|
{
|
|
SetGripCmdData(ptS, s_gripAppData[3].id);
|
|
}
|
|
else
|
|
{
|
|
SetGripCmdData(ptE, s_gripAppData[4].id);
|
|
}
|
|
acedPostCommand(_T("\3hsxg\n"));
|
|
}
|
|
|
|
return es;
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::GetGripText(int idx, CString &cs) const
|
|
{
|
|
Acad::ErrorStatus es = Acad::eOk;
|
|
CString sDes;
|
|
if(idx >= 0 && idx < m_lstInterface.Length())
|
|
{
|
|
const TPipeInterface& iFace = m_lstInterface[idx];
|
|
CString csLabel = TString(iFace.m_sSysLabel).cs();
|
|
cs = _T("接口") + csLabel;
|
|
|
|
if (iFace.m_idPipe.isValid() && !iFace.m_idPipe.isErased())
|
|
sDes = _T("(已连接管线)");
|
|
else
|
|
sDes = _T("(无管连接)");
|
|
|
|
cs += sDes;
|
|
}
|
|
else if (idx == 3 || idx == 4) // cet 2012.11.7 add
|
|
{
|
|
cs = _T("启动绘制");
|
|
}
|
|
else
|
|
{
|
|
cs = _T("移动设备");
|
|
}
|
|
|
|
return es;
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::MoveGSPointsAt(const AcDbIntArray& indices,
|
|
const AcGeVector3d& offset)
|
|
{
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::ExplodeOrDraw3d(XExplodeDraw &dc) const
|
|
{
|
|
// cet 2012.11.7 moidfy 支持米单位
|
|
double dMeter = 1;
|
|
if (DocGetCurMeterUnitDraw())
|
|
{
|
|
dMeter = 0.001;
|
|
}
|
|
//绘制焊接
|
|
DrawJointing3d(dc);
|
|
if (m_nLinkType == eFlangeLink)
|
|
{
|
|
//绘制起点法兰
|
|
AcGeVector3d vt = AcGeVector3d::kXAxis;
|
|
vt.rotateBy(m_dAngle, AcGeVector3d::kZAxis);
|
|
AcGeVector3d vtNor = vt;
|
|
double dAngle = Wcs2Ucs(m_dAngle);
|
|
if (dAngle > PI / 2 && dAngle <= PI * 3 / 2)
|
|
{
|
|
vtNor.rotateBy(-PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
else
|
|
{
|
|
vtNor.rotateBy(PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
|
|
AcGePoint3d ptS = m_ptStart;
|
|
AcGePoint3d ptE = ptS + vt * m_dSFlangeThick * dMeter;
|
|
DrawPolyMesh(ptS, ptE, m_dSFlangeDiameter / 2 * dMeter, dc);
|
|
DrawPolyMesh(ptS - vt * m_dSFlangeThick * dMeter, ptE- vt * m_dSFlangeThick * dMeter, m_dSFlangeDiameter / 2 * dMeter, dc);
|
|
//绘制起点管线
|
|
ptS = m_ptStart + vt * m_dSFlangeThick * dMeter;
|
|
ptE = ptS + vt * (m_dSPipeFlangeDist - m_dSFlangeThick) * dMeter;
|
|
// cet 2018.2.2 modify 通过文件查询外径,对实体绘制效率影响较大
|
|
// double dSPipeThick = GetPipeOutDByDn(0, m_dSPipeDiameter) - m_dSPipeDiameter;
|
|
double dSPipeThick = GetPipeOutDByDn(m_lstInterface, m_ptStart, m_dSPipeDiameter) - m_dSPipeDiameter;
|
|
DrawPolyMesh(ptS, ptE, (m_dSPipeDiameter + dSPipeThick) / 2 * dMeter, dc);
|
|
|
|
//绘制终点法兰,管线
|
|
AcGePoint3d ptEnd;
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist) * dMeter;
|
|
}
|
|
else if (m_nType == eDown) //偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist) * dMeter + vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist) * dMeter - vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
|
|
ptS = ptEnd;
|
|
ptE = ptS - vt * m_dEFlangeThick * dMeter;
|
|
DrawPolyMesh(ptS, ptE, m_dEFlangeDiameter / 2 * dMeter, dc);
|
|
DrawPolyMesh(ptS + vt * m_dEFlangeThick * dMeter, ptE + vt * m_dEFlangeThick * dMeter, m_dEFlangeDiameter / 2 * dMeter, dc);
|
|
|
|
ptS = ptEnd - vt * m_dEFlangeThick * dMeter;
|
|
ptE = ptS - vt * (m_dEPipeFlangeDist - m_dEFlangeThick) * dMeter;
|
|
// cet 2018.2.2 modify 通过文件查询外径,对实体绘制效率影响较大
|
|
// double dEPipeThick = GetPipeOutDByDn(0, m_dEPipeDiameter) - m_dEPipeDiameter;
|
|
double dEPipeThick = GetPipeOutDByDn(m_lstInterface, ptE, m_dEPipeDiameter) - m_dEPipeDiameter;
|
|
DrawPolyMesh(ptS, ptE, (m_dEPipeDiameter + dEPipeThick ) / 2 * dMeter, dc);
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::ExplodeOrDraw2d(XExplodeDraw &dc) const
|
|
{
|
|
// cet 2016.10.17 add 图层关闭时,实体不显示,不进行绘制(打印时,也不会绘制)
|
|
AcDbLayerTableRecordPointer player(this->layerId(), AcDb::kForRead);
|
|
if (player.openStatus() == Acad::eOk && player->isOff())
|
|
{
|
|
return Acad::eOk;
|
|
}
|
|
// cet 2012.11.7 moidfy 支持米单位
|
|
double dMeter = 1;
|
|
if (DocGetCurMeterUnitDraw())
|
|
{
|
|
dMeter = 0.001;
|
|
}
|
|
|
|
//绘制管件
|
|
AcGeVector3d vt = AcGeVector3d::kXAxis;
|
|
vt.rotateBy(m_dAngle, AcGeVector3d::kZAxis);
|
|
AcGeVector3d vtNor = vt;
|
|
double dAngle = Wcs2Ucs(m_dAngle);
|
|
if (dAngle > PI / 2 && dAngle <= PI * 3 / 2)
|
|
{
|
|
vtNor.rotateBy(-PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
else
|
|
{
|
|
vtNor.rotateBy(PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
|
|
AcGePoint3d ptS1, ptS2, ptE1, ptE2;
|
|
if (m_nLinkType == eJointing) //焊接
|
|
{
|
|
ptS1 = m_ptStart - vtNor * m_dSPipeDiameter / 2 * dMeter;
|
|
ptE1 = ptS1 + vtNor * m_dSPipeDiameter * dMeter;
|
|
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptS2 = m_ptStart + vt * m_dLength * dMeter - vtNor * m_dEPipeDiameter / 2 * dMeter;
|
|
ptE2 = ptS2 + vtNor * m_dEPipeDiameter * dMeter;
|
|
}
|
|
else if (m_nType == eDown) //偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptS2 = ptS1 + vt * m_dLength * dMeter;
|
|
ptE2 = ptS2 + vtNor * m_dEPipeDiameter * dMeter;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptE2 = ptE1 + vt * m_dLength * dMeter;
|
|
ptS2 = ptE2 - vtNor * m_dEPipeDiameter * dMeter;
|
|
}
|
|
}
|
|
else //法兰链接
|
|
{
|
|
ptS1 = m_ptStart + vt * m_dSPipeFlangeDist * dMeter - vtNor * m_dSPipeDiameter / 2 * dMeter;
|
|
ptE1 = ptS1 + vtNor * m_dSPipeDiameter * dMeter;
|
|
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptS2 = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength) * dMeter - vtNor * m_dEPipeDiameter / 2 * dMeter;
|
|
ptE2 = ptS2 + vtNor * m_dEPipeDiameter * dMeter;
|
|
}
|
|
else if (m_nType == eDown) //偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptS2 = ptS1 + vt * m_dLength * dMeter;
|
|
ptE2 = ptS2 + vtNor * m_dEPipeDiameter * dMeter;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptE2 = ptE1 + vt * m_dLength * dMeter;
|
|
ptS2 = ptE2 - vtNor * m_dEPipeDiameter * dMeter;
|
|
}
|
|
}
|
|
|
|
XLine l;
|
|
l.SetPoints(ptS1, ptE1);
|
|
dc.DrawLine(l);
|
|
l.SetPoints(ptS2, ptE2);
|
|
dc.DrawLine(l);
|
|
l.SetPoints(ptS1, ptS2);
|
|
dc.DrawLine(l);
|
|
l.SetPoints(ptE1, ptE2);
|
|
dc.DrawLine(l);
|
|
|
|
if (m_nLinkType == eFlangeLink) //法栏连接
|
|
{
|
|
//绘制起点法兰
|
|
DrawSFlange(dc, m_ptStart);
|
|
DrawSFlange(dc, m_ptStart - vt * m_dSFlangeThick * dMeter);
|
|
|
|
ptS1 = m_ptStart + vt * m_dSFlangeThick * dMeter - vtNor * m_dSPipeDiameter / 2 * dMeter;
|
|
ptE1 = ptS1 + vtNor * m_dSPipeDiameter * dMeter;
|
|
ptS2 = ptS1 + vt * (m_dSPipeFlangeDist - m_dSFlangeThick) * dMeter;
|
|
ptE2 = ptE1 + vt * (m_dSPipeFlangeDist - m_dSFlangeThick) * dMeter;
|
|
l.SetPoints(ptS1, ptS2);
|
|
dc.DrawLine(l);
|
|
l.SetPoints(ptE1, ptE2);
|
|
dc.DrawLine(l);
|
|
|
|
//绘制终点法兰
|
|
DrawEFlange(dc, m_ptStart);
|
|
DrawEFlange(dc, m_ptStart + vt * m_dEFlangeThick * dMeter);
|
|
AcGePoint3d ptEnd;
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist) * dMeter;
|
|
}
|
|
else if (m_nType == eDown) //偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist) * dMeter + vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist) * dMeter - vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
|
|
ptS1 = ptEnd - vt * m_dEFlangeThick * dMeter - vtNor * m_dEPipeDiameter / 2 * dMeter;
|
|
ptE1 = ptS1 + vtNor * m_dEPipeDiameter * dMeter;
|
|
ptS2 = ptS1 - vt * fabs(m_dEPipeFlangeDist - m_dEFlangeThick) * dMeter;
|
|
ptE2 = ptE1 - vt * fabs(m_dEPipeFlangeDist - m_dEFlangeThick) * dMeter;
|
|
l.SetPoints(ptS1, ptS2);
|
|
dc.DrawLine(l);
|
|
l.SetPoints(ptE1, ptE2);
|
|
dc.DrawLine(l);
|
|
}
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
void TDbDoubleLinePipeReducer::GetTips(DList<TObjInfoUnit> &info) const
|
|
{
|
|
info.Append(new TObjInfoUnit(_T("对象类型"), _T("大小接头")));
|
|
}
|
|
// 判断节点是否可以连接管段. nPos: 0--start; 1--end
|
|
BOOL TDbDoubleLinePipeReducer::CanLinkSide(const AcDbObjectId &idPipe, int nPos) const
|
|
{
|
|
BOOL bRet=FALSE;
|
|
TDbDoubleLinePipe *pDLpipe = NULL;
|
|
acdbOpenObject(pDLpipe, idPipe, AcDb::kForRead);
|
|
if (pDLpipe != NULL)
|
|
{
|
|
double dPipeDia = pDLpipe->GetWidth();
|
|
double dFlangeDia = pDLpipe->GetFlangeDn();
|
|
double dFlangeThick = pDLpipe->GetFlangeThick();
|
|
AcGePoint3d ptS, ptE;
|
|
ptS = pDLpipe->StartPoint();
|
|
ptE = pDLpipe->EndPoint();
|
|
XPoint pt;
|
|
AcGeVector3d vtPipe;
|
|
if (nPos == 0)
|
|
{
|
|
pt = pDLpipe->StartPoint();
|
|
vtPipe = ptE - ptS;
|
|
}
|
|
else
|
|
{
|
|
pt = pDLpipe->EndPoint();
|
|
vtPipe = ptS - ptE;
|
|
}
|
|
|
|
AcGeVector3d vtReducer = AcGeVector3d::kXAxis;
|
|
vtReducer.rotateBy(m_dAngle, AcGeVector3d:: kZAxis);
|
|
|
|
XPoint ptFit;
|
|
for (int i = 0; i < m_lstInterface.Length(); ++i)
|
|
{
|
|
ptFit = GetILocation(i);
|
|
if (pt.Distance(ptFit) < PS_SNAP)
|
|
{
|
|
if (i ==0) // 起点处接口
|
|
{
|
|
if (vtPipe.isCodirectionalTo(vtReducer))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (m_nLinkType == eFlangeLink)
|
|
{
|
|
if (fabs(m_dSPipeDiameter - dPipeDia) < PS_SNAP
|
|
&& fabs(m_dSFlangeThick -dFlangeThick) < PS_SNAP
|
|
&& fabs(m_dSFlangeDiameter - dFlangeDia) < PS_SNAP)
|
|
{
|
|
bRet = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (fabs(m_dSPipeDiameter - dPipeDia) < PS_SNAP)
|
|
{
|
|
bRet = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if (i == 1) //终点处接口
|
|
{
|
|
if (!vtPipe.isCodirectionalTo(vtReducer))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (m_nLinkType == eFlangeLink)
|
|
{
|
|
if (fabs(m_dEPipeDiameter - dPipeDia) < PS_SNAP
|
|
&& fabs(m_dEFlangeThick -dFlangeThick) < PS_SNAP
|
|
&& fabs(m_dEFlangeDiameter - dFlangeDia) < PS_SNAP)
|
|
{
|
|
bRet = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (fabs(m_dEPipeDiameter - dPipeDia) < PS_SNAP)
|
|
{
|
|
bRet = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
pDLpipe->Close();
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
// 对st类型的接口进行重新连接
|
|
void TDbDoubleLinePipeReducer::UpdateLinkage(const XPoint &ptAt,
|
|
TPipeSys::SysType st,
|
|
const DList<AcDbObjectId> &idPipes)
|
|
{
|
|
assertWriteEnabled();
|
|
// 移动大小接头或双线水管时,重新判断接口连接
|
|
if (idPipes.Length() == 0)
|
|
{
|
|
for (int i = 0; i < m_lstInterface.Length(); ++i)
|
|
{
|
|
if (m_lstInterface[i]->m_idPipe.isValid() && !m_lstInterface[i]->m_idPipe.isErased())
|
|
{
|
|
if (!CanLinkSide(m_lstInterface[i]->m_idPipe, 0) && !CanLinkSide(m_lstInterface[i]->m_idPipe, 1))
|
|
{
|
|
m_lstInterface[i]->m_idPipe.setNull();
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
for (int j = 0; j < idPipes.Length(); ++j)
|
|
{
|
|
// 判断大小接头与管子是否满足连接条件
|
|
TDbDoubleLinePipe *pDLpipe = NULL;
|
|
acdbOpenObject(pDLpipe, idPipes[j], AcDb::kForRead);
|
|
if (pDLpipe != NULL)
|
|
{
|
|
double dPipeDia = pDLpipe->GetWidth();
|
|
double dFlangeDia = pDLpipe->GetFlangeDn();
|
|
double dFlangeThick = pDLpipe->GetFlangeThick();
|
|
AcGePoint3d ptS, ptE;
|
|
ptS = pDLpipe->StartPoint();
|
|
ptE = pDLpipe->EndPoint();
|
|
|
|
XPoint ptFit;
|
|
AcGeVector3d vtPipe;
|
|
AcGeVector3d vtReducer = AcGeVector3d::kXAxis;
|
|
vtReducer.rotateBy(m_dAngle, AcGeVector3d::kZAxis);
|
|
for (int i = 0; i < m_lstInterface.Length(); ++i)
|
|
{
|
|
ptFit = GetILocation(i);
|
|
if (ptFit.Distance(pDLpipe->StartPoint()) < PS_SNAP) // 与双线水管起点重合
|
|
{
|
|
vtPipe = ptE - ptS;
|
|
if (i == 0) // 起点处接口
|
|
{
|
|
if (fabs(m_dSPipeDiameter - dPipeDia) < PS_SNAP // 水管直径是否相同
|
|
&& !vtPipe.isCodirectionalTo(vtReducer))
|
|
{
|
|
if (m_nLinkType == eFlangeLink) // 法兰连接
|
|
{
|
|
if (fabs(m_dSFlangeDiameter - dFlangeDia) < PS_SNAP
|
|
&& fabs(m_dSFlangeThick - dFlangeThick) < PS_SNAP)
|
|
{
|
|
if (!m_lstInterface[i]->m_idPipe.isValid() || m_lstInterface[i]->m_idPipe.isErased())
|
|
{
|
|
m_lstInterface[i]->m_idPipe = idPipes[j];
|
|
m_lstInterface[i]->m_sysType = pDLpipe->GetSysType();
|
|
m_lstInterface[i]->m_faceType = TPipeInterface::kNodeLocation;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else //焊接
|
|
{
|
|
if (!m_lstInterface[i]->m_idPipe.isValid() || m_lstInterface[i]->m_idPipe.isErased())
|
|
{
|
|
m_lstInterface[i]->m_idPipe = idPipes[j];
|
|
m_lstInterface[i]->m_sysType = pDLpipe->GetSysType();
|
|
m_lstInterface[i]->m_faceType = TPipeInterface::kNodeLocation;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if(i == 1) // 终点处接口
|
|
{
|
|
if (fabs(m_dEPipeDiameter - dPipeDia) < PS_SNAP // 水管直径是否相同
|
|
&& vtPipe.isCodirectionalTo(vtReducer))
|
|
{
|
|
if (m_nLinkType == eFlangeLink) // 法兰连接
|
|
{
|
|
if (fabs(m_dEFlangeDiameter - dFlangeDia) < PS_SNAP
|
|
&& fabs(m_dEFlangeThick - dFlangeThick) < PS_SNAP)
|
|
{
|
|
if (!m_lstInterface[i]->m_idPipe.isValid() || m_lstInterface[i]->m_idPipe.isErased())
|
|
{
|
|
m_lstInterface[i]->m_idPipe = idPipes[j];
|
|
m_lstInterface[i]->m_sysType = pDLpipe->GetSysType();
|
|
m_lstInterface[i]->m_faceType = TPipeInterface::kNodeLocation;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else //焊接
|
|
{
|
|
if (!m_lstInterface[i]->m_idPipe.isValid() || m_lstInterface[i]->m_idPipe.isErased())
|
|
{
|
|
m_lstInterface[i]->m_idPipe = idPipes[j];
|
|
m_lstInterface[i]->m_sysType = pDLpipe->GetSysType();
|
|
m_lstInterface[i]->m_faceType = TPipeInterface::kNodeLocation;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
else if (ptFit.Distance(pDLpipe->EndPoint()) < PS_SNAP) // 与双线水管终点重合
|
|
{
|
|
vtPipe = ptS - ptE;
|
|
if (i == 0) // 起点处接口
|
|
{
|
|
if (fabs(m_dSPipeDiameter - dPipeDia) < PS_SNAP // 水管直径是否相同
|
|
&& !vtPipe.isCodirectionalTo(vtReducer))
|
|
{
|
|
if (m_nLinkType == eFlangeLink) // 法兰连接
|
|
{
|
|
if (fabs(m_dSFlangeDiameter - dFlangeDia) < PS_SNAP
|
|
&& fabs(m_dSFlangeThick - dFlangeThick) < PS_SNAP)
|
|
{
|
|
if (!m_lstInterface[i]->m_idPipe.isValid() || m_lstInterface[i]->m_idPipe.isErased())
|
|
{
|
|
m_lstInterface[i]->m_idPipe = idPipes[j];
|
|
m_lstInterface[i]->m_sysType = pDLpipe->GetSysType();
|
|
m_lstInterface[i]->m_faceType = TPipeInterface::kNodeLocation;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else //焊接
|
|
{
|
|
if (!m_lstInterface[i]->m_idPipe.isValid() || m_lstInterface[i]->m_idPipe.isErased())
|
|
{
|
|
m_lstInterface[i]->m_idPipe = idPipes[j];
|
|
m_lstInterface[i]->m_sysType = pDLpipe->GetSysType();
|
|
m_lstInterface[i]->m_faceType = TPipeInterface::kNodeLocation;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if(i == 1) // 终点处接口
|
|
{
|
|
if (fabs(m_dEPipeDiameter - dPipeDia) < PS_SNAP // 水管直径是否相同
|
|
&& vtPipe.isCodirectionalTo(vtReducer))
|
|
{
|
|
if (m_nLinkType == eFlangeLink) // 法兰连接
|
|
{
|
|
if (fabs(m_dEFlangeDiameter - dFlangeDia) < PS_SNAP
|
|
&& fabs(m_dEFlangeThick - dFlangeThick) < PS_SNAP)
|
|
{
|
|
if (!m_lstInterface[i]->m_idPipe.isValid() || m_lstInterface[i]->m_idPipe.isErased())
|
|
{
|
|
m_lstInterface[i]->m_idPipe = idPipes[j];
|
|
m_lstInterface[i]->m_sysType = pDLpipe->GetSysType();
|
|
m_lstInterface[i]->m_faceType = TPipeInterface::kNodeLocation;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else //焊接
|
|
{
|
|
if (!m_lstInterface[i]->m_idPipe.isValid() || m_lstInterface[i]->m_idPipe.isErased())
|
|
{
|
|
m_lstInterface[i]->m_idPipe = idPipes[j];
|
|
m_lstInterface[i]->m_sysType = pDLpipe->GetSysType();
|
|
m_lstInterface[i]->m_faceType = TPipeInterface::kNodeLocation;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
pDLpipe->Close();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void InitDbDoubleLinePipeReducer(BOOL bTrue)
|
|
{
|
|
if(bTrue) {
|
|
TDbDoubleLinePipeReducer::rxInit();
|
|
TDbDoubleLinePipeReducer::InitMatchProtocol(TRUE);
|
|
} else {
|
|
TDbDoubleLinePipeReducer::InitMatchProtocol(FALSE);
|
|
deleteAcRxClass(TDbDoubleLinePipeReducer::desc());
|
|
}
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::DrawJointing3d(XExplodeDraw &dc) const
|
|
{
|
|
//求起点圆心,终点圆心
|
|
AcGeVector3d vt = AcGeVector3d::kXAxis;
|
|
vt.rotateBy(m_dAngle, AcGeVector3d::kZAxis);
|
|
AcGeVector3d vtNor = vt;
|
|
double dAngle = Wcs2Ucs(m_dAngle);
|
|
if (dAngle > PI / 2 && dAngle <= PI * 3 / 2)
|
|
{
|
|
vtNor.rotateBy(-PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
else
|
|
{
|
|
vtNor.rotateBy(PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
|
|
AcGePoint3d ptS;
|
|
AcGePoint3d ptE;
|
|
// cet 2012.11.7 moidfy 支持米单位
|
|
double dMeter = 1;
|
|
if (DocGetCurMeterUnitDraw())
|
|
{
|
|
dMeter = 0.001;
|
|
}
|
|
|
|
if (m_nLinkType == eJointing) //焊接
|
|
{
|
|
ptS = m_ptStart;
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptE = m_ptStart + vt * m_dLength * dMeter;
|
|
}
|
|
else if (m_nType == eDown)//偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptE = m_ptStart + vt * m_dLength * dMeter - vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptE = m_ptStart + vt * m_dLength * dMeter + vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
}
|
|
else //法兰链接
|
|
{
|
|
ptS = m_ptStart + vt * m_dSPipeFlangeDist * dMeter;
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptE = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength) * dMeter;
|
|
}
|
|
else if (m_nType == eDown) //偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptE = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength) * dMeter + vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptE = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength) * dMeter - vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
}
|
|
|
|
AcGeVector3d vtDirect = vt;
|
|
AcGeVector3d vtNormal = vtDirect.perpVector();
|
|
vtDirect.normalize();
|
|
|
|
double dMinAngle = PI / 15.0;
|
|
int nPartNum = int(PI * 2 / dMinAngle) + 1;
|
|
dMinAngle = PI * 2.0 / nPartNum;
|
|
// cet 2018.2.2 modify 通过文件查询外径,对实体绘制效率影响较大
|
|
// double dSDiaMet = GetPipeOutDByDn(0, m_dSPipeDiameter) * dMeter;
|
|
// double dEDiaMet = GetPipeOutDByDn(0, m_dEPipeDiameter) * dMeter;
|
|
double dSDiaMet = GetPipeOutDByDn(m_lstInterface, ptS, m_dSPipeDiameter) * dMeter;
|
|
double dEDiaMet = GetPipeOutDByDn(m_lstInterface, ptE, m_dEPipeDiameter) * dMeter;
|
|
|
|
AcGePoint3dArray ptArr,ptArrT,ptArrD;
|
|
AcGeVector3d vtNow = vtNormal * -1; // 每组顶点法向
|
|
int i(0);
|
|
for (i = 0; i < nPartNum * 2; i += 2)
|
|
{
|
|
ptArr.append(ptS + dSDiaMet * 0.5 * vtNow);
|
|
ptArr.append(ptE + dEDiaMet * 0.5 * vtNow);
|
|
|
|
ptArrT.append(ptS + dSDiaMet * 0.5 * vtNow);
|
|
ptArrT.append(ptS);
|
|
|
|
ptArrD.append(ptE + dEDiaMet * 0.5 * vtNow);
|
|
ptArrD.append(ptE);
|
|
|
|
vtNow.rotateBy(dMinAngle, vtDirect);
|
|
}
|
|
|
|
// 单独设置末点,防止误差
|
|
ptArr.append(ptArr.at(0));
|
|
ptArr.append(ptArr.at(1));
|
|
|
|
ptArrT.append(ptArrT.at(0));
|
|
ptArrT.append(ptArrT.at(1));
|
|
|
|
ptArrD.append(ptArrD.at(0));
|
|
ptArrD.append(ptArrD.at(1));
|
|
|
|
// 圆柱体
|
|
dc.DrawMesh(nPartNum + 1, 2, ptArr.asArrayPtr());
|
|
// 上面
|
|
dc.DrawMesh(nPartNum + 1, 2, ptArrT.asArrayPtr());
|
|
// 下面
|
|
dc.DrawMesh(nPartNum + 1, 2, ptArrD.asArrayPtr());
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::DrawPolyMesh(const XPoint &ptS, const XPoint &ptE, double nRadius, XExplodeDraw &dc) const
|
|
{
|
|
AcGeVector3d vt = AcGeVector3d::kXAxis;
|
|
vt.rotateBy(m_dAngle, AcGeVector3d::kZAxis);
|
|
|
|
AcGeVector3d vtDirect = vt;
|
|
AcGeVector3d vtNormal = vtDirect.perpVector();
|
|
vtDirect.normalize();
|
|
|
|
double dMinAngle = PI / 15.0;
|
|
int nPartNum = int(PI * 2 / dMinAngle) + 1;
|
|
dMinAngle = PI * 2.0 / nPartNum;
|
|
|
|
double dDiaMet = nRadius * 2;
|
|
|
|
AcGePoint3dArray ptArr,ptArrT,ptArrD;
|
|
AcGeVector3d vtNow = vtNormal * -1; // 每组顶点法向
|
|
int i(0);
|
|
for (i = 0; i < nPartNum * 2; i += 2)
|
|
{
|
|
ptArr.append(ptS + dDiaMet * 0.5 * vtNow);
|
|
ptArr.append(ptE + dDiaMet * 0.5 * vtNow);
|
|
|
|
ptArrT.append(ptS + dDiaMet * 0.5 * vtNow);
|
|
ptArrT.append(ptS);
|
|
|
|
ptArrD.append(ptE + dDiaMet * 0.5 * vtNow);
|
|
ptArrD.append(ptE);
|
|
|
|
vtNow.rotateBy(dMinAngle, vtDirect);
|
|
}
|
|
|
|
// 单独设置末点,防止误差
|
|
ptArr.append(ptArr.at(0));
|
|
ptArr.append(ptArr.at(1));
|
|
|
|
ptArrT.append(ptArrT.at(0));
|
|
ptArrT.append(ptArrT.at(1));
|
|
|
|
ptArrD.append(ptArrD.at(0));
|
|
ptArrD.append(ptArrD.at(1));
|
|
|
|
// 圆柱体
|
|
dc.DrawMesh(nPartNum + 1, 2, ptArr.asArrayPtr());
|
|
// 上面
|
|
dc.DrawMesh(nPartNum + 1, 2, ptArrT.asArrayPtr());
|
|
// 下面
|
|
dc.DrawMesh(nPartNum + 1, 2, ptArrD.asArrayPtr());
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
void TDbDoubleLinePipeReducer::AddPipeReducerInterface()
|
|
{
|
|
assertWriteEnabled();
|
|
// cet 2012.11.7 moidfy 支持米单位
|
|
double dMeter = 1;
|
|
if (DocGetCurMeterUnitDraw())
|
|
{
|
|
dMeter = 0.001;
|
|
}
|
|
AcGePoint3d ptStart = m_ptStart, ptEnd;
|
|
AcGeVector3d vt = AcGeVector3d::kXAxis;
|
|
vt.rotateBy(m_dAngle, AcGeVector3d::kZAxis);
|
|
AcGeVector3d vtNor = vt;
|
|
double dAngle = Wcs2Ucs(m_dAngle);
|
|
if (dAngle > PI / 2 && dAngle <= PI * 3 / 2)
|
|
{
|
|
vtNor.rotateBy(-PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
else
|
|
{
|
|
vtNor.rotateBy(PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
|
|
if (m_nLinkType == eJointing) //焊接
|
|
{
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * m_dLength * dMeter;
|
|
}
|
|
else if (m_nType == eDown)//偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * m_dLength * dMeter + vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptEnd = m_ptStart + vt * m_dLength * dMeter - vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
}
|
|
else //法兰链接
|
|
{
|
|
ptStart += -vt * m_dSFlangeThick * dMeter;
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist + m_dEFlangeThick) * dMeter;
|
|
}
|
|
else if (m_nType == eDown) //偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist + m_dEFlangeThick) * dMeter + vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist + m_dEFlangeThick) * dMeter - vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
}
|
|
|
|
//添加两个接口
|
|
AcGeVector3d vtDir = AcGeVector3d::kXAxis;
|
|
TPipeInterface iFace;
|
|
iFace.m_faceType = TPipeInterface::kBoundry;
|
|
iFace.m_vtLocation = XVector3D(vtDir);
|
|
iFace.m_sSysLabel = _T("1");
|
|
iFace.m_ptLocation = ptStart;
|
|
AddInterface(iFace);
|
|
|
|
iFace.m_sSysLabel = _T("2");
|
|
iFace.m_ptLocation = ptEnd;
|
|
AddInterface(iFace);
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::subGetGeomExtents( AcDbExtents& extents) const
|
|
{
|
|
Acad::ErrorStatus st = Acad::eOk;
|
|
AcGePoint3d min, max, ptCenter;
|
|
double dWidth = 0.0, dLen = 0.0;
|
|
AcGeVector3d vt = AcGeVector3d::kXAxis;
|
|
vt.rotateBy(m_dAngle, AcGeVector3d::kZAxis);
|
|
AcGeVector3d vtNor = vt;
|
|
double dAngle = Wcs2Ucs(m_dAngle);
|
|
if (dAngle > PI / 2 && dAngle <= PI * 3 / 2)
|
|
{
|
|
vtNor.rotateBy(-PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
else
|
|
{
|
|
vtNor.rotateBy(PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
|
|
if (m_nLinkType == eJointing) // 焊接
|
|
{
|
|
ptCenter = m_ptStart + vt * m_dLength / 2;
|
|
dLen = m_dLength;
|
|
dWidth = m_dSPipeDiameter > m_dEPipeDiameter ? m_dSPipeDiameter : m_dEPipeDiameter;
|
|
}
|
|
else // 法兰链接
|
|
{
|
|
ptCenter = m_ptStart + vt * (m_dSFlangeThick + m_dSPipeFlangeDist + m_dLength / 2);
|
|
dLen = m_dSFlangeThick + m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist + m_dEFlangeThick;
|
|
dWidth = m_dSFlangeDiameter > m_dEFlangeDiameter ? m_dSFlangeDiameter : m_dEFlangeDiameter;
|
|
}
|
|
|
|
min = ptCenter;
|
|
min.x -= dLen / 2;
|
|
min.y -= dWidth / 2;
|
|
max = ptCenter;
|
|
max.x += dLen / 2;
|
|
max.y += dWidth / 2;
|
|
extents.set(min, max);
|
|
|
|
return st;
|
|
}
|
|
|
|
// 绘制起点法兰
|
|
void TDbDoubleLinePipeReducer::DrawSFlange(XExplodeDraw &dc, const AcGePoint3d &ptStart) const
|
|
{
|
|
// cet 2012.11.7 moidfy 支持米单位
|
|
double dMeter = 1;
|
|
if (DocGetCurMeterUnitDraw())
|
|
{
|
|
dMeter = 0.001;
|
|
}
|
|
|
|
AcGeVector3d vt = AcGeVector3d::kXAxis;
|
|
vt.rotateBy(m_dAngle, AcGeVector3d::kZAxis);
|
|
AcGeVector3d vtNor = vt;
|
|
double dAngle = Wcs2Ucs(m_dAngle);
|
|
if (dAngle > PI / 2 && dAngle <= PI * 3 / 2)
|
|
{
|
|
vtNor.rotateBy(-PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
else
|
|
{
|
|
vtNor.rotateBy(PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
|
|
AcGePoint3d ptS1, ptS2, ptE1, ptE2;
|
|
ptS1 = ptStart - vtNor * m_dSFlangeDiameter / 2 * dMeter;
|
|
ptE1 = ptStart + vtNor * m_dSFlangeDiameter / 2 * dMeter;
|
|
ptS2 = ptS1 + vt * m_dSFlangeThick * dMeter;
|
|
ptE2 = ptE1 + vt * m_dSFlangeThick * dMeter;
|
|
XLine l;
|
|
l.SetPoints(ptS1, ptE1);
|
|
dc.DrawLine(l);
|
|
l.SetPoints(ptS2, ptE2);
|
|
dc.DrawLine(l);
|
|
l.SetPoints(ptS1, ptS2);
|
|
dc.DrawLine(l);
|
|
l.SetPoints(ptE1, ptE2);
|
|
dc.DrawLine(l);
|
|
}
|
|
|
|
// 绘制终点法兰
|
|
void TDbDoubleLinePipeReducer::DrawEFlange(XExplodeDraw &dc, const AcGePoint3d &ptStart) const
|
|
{
|
|
// cet 2012.11.7 moidfy 支持米单位
|
|
double dMeter = 1;
|
|
if (DocGetCurMeterUnitDraw())
|
|
{
|
|
dMeter = 0.001;
|
|
}
|
|
|
|
AcGeVector3d vt = AcGeVector3d::kXAxis;
|
|
vt.rotateBy(m_dAngle, AcGeVector3d::kZAxis);
|
|
AcGeVector3d vtNor = vt;
|
|
double dAngle = Wcs2Ucs(m_dAngle);
|
|
if (dAngle > PI / 2 && dAngle <= PI * 3 / 2)
|
|
{
|
|
vtNor.rotateBy(-PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
else
|
|
{
|
|
vtNor.rotateBy(PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
|
|
AcGePoint3d ptEnd;
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptEnd = ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist) * dMeter;
|
|
}
|
|
else if (m_nType == eDown) //偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptEnd = ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist) * dMeter + vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptEnd = ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist) * dMeter - vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
|
|
AcGePoint3d ptS1, ptS2, ptE1, ptE2;
|
|
ptS1 = ptEnd - vtNor * m_dEFlangeDiameter / 2 * dMeter;
|
|
ptE1 = ptEnd + vtNor * m_dEFlangeDiameter / 2 * dMeter;
|
|
ptS2 = ptS1 - vt * m_dEFlangeThick * dMeter;
|
|
ptE2 = ptE1 - vt * m_dEFlangeThick * dMeter;
|
|
XLine l;
|
|
l.SetPoints(ptS1, ptE1);
|
|
dc.DrawLine(l);
|
|
l.SetPoints(ptS2, ptE2);
|
|
dc.DrawLine(l);
|
|
l.SetPoints(ptS1, ptS2);
|
|
dc.DrawLine(l);
|
|
l.SetPoints(ptE1, ptE2);
|
|
dc.DrawLine(l);
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::subTransformBy(const AcGeMatrix3d& xform)
|
|
{
|
|
assertWriteEnabled();
|
|
Acad::ErrorStatus stus = Acad::eOk;
|
|
// TDbEquipment::transformBy(xform); // cet 2010.5.17 del
|
|
TDbEquipment::subTransformBy(xform); // cet 2010.5.17 add
|
|
m_ptStart.transformBy(xform);
|
|
AcGeVector3d vt = m_ptLocation - m_ptStart;
|
|
m_dAngle = vt.angleOnPlane(AcGePlane::kXYPlane);
|
|
ModifyInterfacePt();
|
|
return stus;
|
|
}
|
|
|
|
void TDbDoubleLinePipeReducer::ModifyInterfacePt()
|
|
{
|
|
assertWriteEnabled();
|
|
// cet 2012.11.7 moidfy 支持米单位
|
|
double dMeter = 1;
|
|
if (DocGetCurMeterUnitDraw())
|
|
{
|
|
dMeter = 0.001;
|
|
}
|
|
AcGePoint3d ptStart = m_ptStart;
|
|
AcGeVector3d vt = AcGeVector3d::kXAxis;
|
|
vt.rotateBy(m_dAngle, AcGeVector3d::kZAxis);
|
|
if (m_nLinkType == eFlangeLink)
|
|
{
|
|
m_ptLocation = ptStart + (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist) / 2 * dMeter * vt;
|
|
}
|
|
else if (m_nLinkType == eJointing)
|
|
{
|
|
m_ptLocation = ptStart + m_dLength / 2 * dMeter * vt;
|
|
}
|
|
|
|
if (m_lstInterface.Length() == 2)
|
|
{
|
|
AcGePoint3d ptEnd;
|
|
AcGeVector3d vtNor = vt;
|
|
double dAngle = Wcs2Ucs(m_dAngle);
|
|
if (dAngle > PI / 2 && dAngle <= PI * 3 / 2)
|
|
{
|
|
vtNor.rotateBy(-PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
else
|
|
{
|
|
vtNor.rotateBy(PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
|
|
if (m_nLinkType == eJointing) //焊接
|
|
{
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * m_dLength * dMeter;
|
|
}
|
|
else if (m_nType == eDown)//偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * m_dLength * dMeter + vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptEnd = m_ptStart + vt * m_dLength * dMeter - vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
}
|
|
else //法兰链接
|
|
{
|
|
ptStart += -vt * m_dSFlangeThick * dMeter;
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist + m_dEFlangeThick) * dMeter;
|
|
}
|
|
else if (m_nType == eDown) //偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist + m_dEFlangeThick) * dMeter + vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptEnd = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist + m_dEFlangeThick) * dMeter - vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
}
|
|
|
|
m_lstInterface[0]->m_ptLocation = ptStart;
|
|
m_lstInterface[1]->m_ptLocation = ptEnd;
|
|
}
|
|
}
|
|
|
|
void TDbDoubleLinePipeReducer::CopyPropertiesFrom(AcDbEntity *pSrc, unsigned gMatchFlag)
|
|
{
|
|
assertWriteEnabled();
|
|
TDbEquipment::CopyPropertiesFrom(pSrc, gMatchFlag);
|
|
TDbDoubleLinePipeReducer *pReducer = TDbDoubleLinePipeReducer::cast(pSrc);
|
|
if(pReducer != NULL)
|
|
{
|
|
m_nType = pReducer->GetType();
|
|
m_dAngle = pReducer->GetAngle();
|
|
m_nLinkType = pReducer->GetLinkType();
|
|
m_dSPipeFlangeDist = pReducer->GetSPipeFlangeDist();
|
|
m_dSPipeDiameter = pReducer->GetSPipeDiameter();
|
|
m_dEPipeDiameter = pReducer->GetEPipeDiameter();
|
|
m_dLength = pReducer->GetLenght();
|
|
m_dSFlangeDiameter = pReducer->GetSFlangeDiameter();
|
|
m_dSFlangeThick = pReducer->GetSFlangeThick();
|
|
m_dEFlangeThick = pReducer->GetEFlangeThick();
|
|
m_dEFlangeDiameter = pReducer->GetEFlangeDiameter();
|
|
m_dEPipeFlangeDist = pReducer->GetEPipeFlangeDist();
|
|
m_nSpare = pReducer->GetNSpare();
|
|
m_dSpare = pReducer->GetDSpare();
|
|
m_strSpare = pReducer->GetStrSpare();
|
|
}
|
|
}
|
|
|
|
Acad::ErrorStatus TDbDoubleLinePipeReducer::subDeepClone(AcDbObject *pOwner, AcDbObject *&pClonedObject,
|
|
AcDbIdMapping &idMap,
|
|
Adesk::Boolean isPrimary) const
|
|
{
|
|
Acad::ErrorStatus es = TDbEquipment::subDeepClone(pOwner, pClonedObject, idMap, isPrimary);
|
|
if (es != Acad::eOk)
|
|
{
|
|
return es;
|
|
}
|
|
|
|
TDbDoubleLinePipeReducer *pReducer = TDbDoubleLinePipeReducer::cast(pClonedObject);
|
|
if(pReducer != NULL)
|
|
{
|
|
pReducer->SetType(m_nType);
|
|
pReducer->SetAngle(m_dAngle);
|
|
pReducer->SetLinkType(m_nLinkType);
|
|
pReducer->SetSPipeFlangeDist(m_dSPipeFlangeDist);
|
|
pReducer->SetSPipeDiameter(m_dSPipeDiameter);
|
|
pReducer->SetEPipeDiameter(m_dEPipeDiameter);
|
|
pReducer->SetLenght(m_dLength);
|
|
pReducer->SetSFlangeDiameter(m_dSFlangeDiameter);
|
|
pReducer->SetSFlangeThick(m_dSFlangeThick);
|
|
pReducer->SetEFlangeThick(m_dEFlangeThick);
|
|
pReducer->SetEFlangeDiameter(m_dEFlangeDiameter);
|
|
pReducer->SetEPipeFlangeDist(m_dEPipeFlangeDist);
|
|
pReducer->SetNSpare(m_nSpare);
|
|
pReducer->SetDSpare(m_dSpare);
|
|
pReducer->SetStrSpare(m_strSpare);
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
void TDbDoubleLinePipeReducer::ExplainGripIndex( int nIndex, bool &bCmd, CString &sTip ) const
|
|
{
|
|
bCmd = false;
|
|
sTip.Empty();
|
|
switch(nIndex)
|
|
{
|
|
case 0:
|
|
case 1: // 管线接口
|
|
{
|
|
if(nIndex >= 0 && nIndex < m_lstInterface.Length())
|
|
{
|
|
const TPipeInterface& iFace = m_lstInterface[nIndex];
|
|
CString sLabel = TString(iFace.m_sSysLabel).cs();
|
|
sTip = _T("接口") + sLabel;
|
|
|
|
if (iFace.m_idPipe.isValid() && !iFace.m_idPipe.isErased())
|
|
{
|
|
sTip += _T("(已连接管线)");
|
|
}
|
|
else
|
|
{
|
|
sTip += _T("(无管连接)");
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case 2: // 移动点
|
|
{
|
|
bCmd = false;
|
|
sTip = _T("移动设备");
|
|
break;
|
|
}
|
|
case 3:
|
|
case 4: // 命令点
|
|
{
|
|
bCmd = true;
|
|
sTip = _T("启动绘制");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void TDbDoubleLinePipeReducer::GetPoints( AcGePoint3d &ptS, AcGePoint3d &ptMid, AcGePoint3d &ptE ) const
|
|
{
|
|
double dMeter = 1;
|
|
if (DocGetCurMeterUnitDraw())
|
|
{
|
|
dMeter = 0.001;
|
|
}
|
|
AcGeVector3d vt = AcGeVector3d::kXAxis;
|
|
vt.rotateBy(m_dAngle, AcGeVector3d::kZAxis);
|
|
AcGeVector3d vtNor = vt;
|
|
double dAngle = Wcs2Ucs(m_dAngle);
|
|
if (dAngle > PI / 2 && dAngle <= PI * 3 / 2)
|
|
{
|
|
vtNor.rotateBy(-PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
else
|
|
{
|
|
vtNor.rotateBy(PI / 2, AcGeVector3d::kZAxis);
|
|
}
|
|
|
|
if (m_nLinkType == eJointing) //焊接
|
|
{
|
|
ptMid = m_ptStart + vt * m_dLength / 2 * dMeter ;
|
|
}
|
|
else //法兰链接
|
|
{
|
|
ptMid = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength / 2) * dMeter;
|
|
|
|
}
|
|
|
|
ptS = m_ptStart;
|
|
if (m_nLinkType == eJointing) //焊接
|
|
{
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptE = m_ptStart + vt * (m_dLength + m_dEFlangeThick * 2) * dMeter;
|
|
}
|
|
else if (m_nType == eDown) //偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptE = m_ptStart + vt * (m_dLength + m_dEFlangeThick * 2) * dMeter + vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptE = m_ptStart - vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter + vt * (m_dLength + m_dEFlangeThick * 2) * dMeter;
|
|
}
|
|
}
|
|
else //法兰链接
|
|
{
|
|
//终点
|
|
if (m_nType == eCenter) //异径管(俗称:同心大小头)
|
|
{
|
|
ptE = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist) * dMeter;
|
|
}
|
|
else if (m_nType == eDown) //偏心异径管(俗称:偏心大小头)
|
|
{
|
|
ptE = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist) * dMeter + vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
else if (m_nType == eUp)
|
|
{
|
|
ptE = m_ptStart + vt * (m_dSPipeFlangeDist + m_dLength + m_dEPipeFlangeDist) * dMeter - vtNor * (m_dEPipeDiameter - m_dSPipeDiameter) / 2 * dMeter;
|
|
}
|
|
}
|
|
|
|
ptS -= vt * m_dSFlangeThick * dMeter;
|
|
ptE += vt * m_dEFlangeThick * dMeter;
|
|
}
|