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