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

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;
}