#include "stdafx.h" #include "ImpHvacReducer.h" #include "AecDbObjXDataMap.h" #include "AuxTools.h" #include "math.h" #include "dbxutil.h" #include "dbsymutl.h" using namespace AecEqui; extern double MayAsMUnit(double dVal); ImpHvacReducer::ImpHvacReducer() { m_pXDataMap = NULL; m_pOwnerEnt = NULL; } ImpHvacReducer::~ImpHvacReducer() { } void ImpHvacReducer::list() const { if (NULL == m_pXDataMap) return; // 管件类型 acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 暖通:变径")); // 截面类型 ESection eStartSectType = eRect; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType); switch (eStartSectType) { case eRect: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 始端截面:矩形")); break; case eCircle: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 始端截面:圆形")); break; case eOblate: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 始端截面:扁圆形")); break; } ESection eEndSectType = eRect; m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); switch (eEndSectType) { case eRect: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 末端截面:矩形")); break; case eCircle: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 末端截面:圆形")); break; case eOblate: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 末端截面:扁圆形")); break; } // 圆型截面显示直径 if (eCircle == eStartSectType) { double dDiameter = 0.0; m_pXDataMap->GetAt(HRED_StartDiameter, dDiameter); acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t始端直径:%.2f"), dDiameter); } // 非圆型截面显示宽度和厚度 else { double dWidth = 0.0, dThick = 0.0; m_pXDataMap->GetAt(HRED_StartWidth, dWidth); m_pXDataMap->GetAt(HRED_StartThick, dThick); acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t始端宽度:%.2f 始端厚度:%.2f"), dWidth, dThick); } // 圆型截面显示直径 if (eCircle == eEndSectType) { double dDiameter = 0.0; m_pXDataMap->GetAt(HRED_EndDiameter, dDiameter); acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t末端直径:%.2f"), dDiameter); } // 非圆型截面显示宽度和厚度 else { double dWidth = 0.0, dThick = 0.0; m_pXDataMap->GetAt(HRED_EndWidth, dWidth); m_pXDataMap->GetAt(HRED_EndThick, dThick); acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t末端宽度:%.2f 末端厚度:%.2f"), dWidth, dThick); } // 起点 AcGePoint3d pt; m_pXDataMap->GetAt(HRED_StartPoint, pt); acutPrintf(_T("\n\t\t\t\t\t\t\t\t自 点,X=%.4f\t Y=%.4f\t Z=%.4f"), pt.x, pt.y, pt.z); // 终点 m_pXDataMap->GetAt(HRED_EndPoint, pt); acutPrintf(_T("\n\t\t\t\t\t\t\t\t到 点,X=%.4f\t Y=%.4f\t Z=%.4f"), pt.x, pt.y, pt.z); } BOOL ImpHvacReducer::IsHorzAlignment() const { // 获得法向量 AcGeVector3d vtSect; m_pXDataMap->GetAt(HRED_StartDir, vtSect); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); return vtSect.isPerpendicularTo(vtZAxis); } BOOL ImpHvacReducer::IsVertAlignment() const { // 获得法向量 AcGeVector3d vtSect; m_pXDataMap->GetAt(HRED_StartDir, vtSect); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); return vtSect.isParallelTo(vtZAxis); } BOOL ImpHvacReducer::IsInclineAlignment() const { // 获得法向量 AcGeVector3d vtSect; m_pXDataMap->GetAt(HRED_StartDir, vtSect); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); return !vtSect.isPerpendicularTo(vtZAxis) && !vtSect.isParallelTo(vtZAxis); } BOOL ImpHvacReducer::IsSingleLine() const { ASSERT(NULL != m_pXDataMap); BOOL bSingleLine = FALSE; m_pXDataMap->GetAt(HVAC_IsSingleLine, (int&)bSingleLine); return bSingleLine; } AcGeVector3d ImpHvacReducer::GetSectNormal() const { ASSERT(NULL != m_pXDataMap); AcGeVector3d vtSta; m_pXDataMap->GetAt(HRED_StartDir, vtSta); if (!vtSta.isParallelTo(TAuxTools::GetUcsZvt())) { if (!vtSta.isPerpendicularTo(TAuxTools::GetUcsZvt())) return vtSta; else vtSta = vtSta.orthoProject(TAuxTools::GetUcsZvt()); } return vtSta; } Acad::ErrorStatus ImpHvacReducer::Draw3d(AcGiDraw& mode) const { if (NULL == m_pXDataMap) return Acad::eOk; // 变径类型 ESection eStartSectType = eRect; ESection eEndSectType = eRect; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); AcDbObjectId idLayBk = mode.GetLayerId(); mode.SetLayer(m_idDoubleLayer); // 始端截面 switch (eStartSectType) { case eRect: // 矩形 // 末端截面 switch (eEndSectType) { case eRect: // 矩形 ExplodeRect2Rect3d(mode); break; case eCircle: // 园形 ExplodeRect2Cir3d(mode); break; case eOblate: // 扁圆形 break; } break; case eCircle: // 园形 // 末端截面 switch (eEndSectType) { case eRect: // 矩形 ExplodeCir2Rect3d(mode); break; case eCircle: // 园形 ExplodeCir2Cir3d(mode); break; case eOblate: // 扁圆形 break; } break; case eOblate: // 扁圆形 // 末端截面 switch (eEndSectType) { case eRect: // 矩形 break; case eCircle: // 园形 break; case eOblate: // 扁圆形 break; } break; } mode.SetLayer(idLayBk); return Acad::eOk; } BOOL ImpHvacReducer::DrawMesh(AcGiDraw &mode,const Adesk::UInt32 rows,const Adesk::UInt32 columns,const AcGePoint3d* pVertexList) const { AcGePoint3dArray vertexArray; AcArray faceArray; int nV0 = 0,nV1 = 0,nV2 = 0; int nV3= 0; int nFaceIndex = 0; AcGePoint3d ptFace[4]; for (int i = 0;i < rows - 1;i++) { for (int j = 0;j < columns - 1;j++) { nV0 = i * columns + j; nV1 = nV0 + 1; //第二行,第一个 nV2 = (i + 1) * columns + j; nV3 = nV2 + 1; //三角:nV0-nV1-nV2 faceArray.append(3); faceArray.append(nV0);//v0 faceArray.append(nV1);//v1 faceArray.append(nV2);//v2 ptFace[0] = pVertexList[nV0]; ptFace[1] = pVertexList[nV1]; ptFace[2] = pVertexList[nV2]; ptFace[3] = ptFace[0]; //mode.DrawFace(ptFace); //三角:nV2-nV1-nV3 faceArray.append(3); faceArray.append(nV2);//v2 faceArray.append(nV1);//v1 faceArray.append(nV3);//v3 ptFace[0] = pVertexList[nV2]; ptFace[1] = pVertexList[nV1]; ptFace[2] = pVertexList[nV3]; ptFace[3] = ptFace[0]; //mode.DrawFace(ptFace); } } if (!faceArray.isEmpty()) { int nIndex = 0; for (int i = 0;i < rows;i++) { for (int j = 0;j < columns;j++) { nIndex = i * columns + j; vertexArray.append(pVertexList[nIndex]); } } AcDbSubDMesh* pSubMesh = new AcDbSubDMesh; if ( Acad::eOk == pSubMesh->setSubDMesh(vertexArray,faceArray,0) ) { mode.DrawEntity(pSubMesh); m_ar3DDrableBufPtrs_.append(pSubMesh); //有时候失败? /*Acad::ErrorStatus es; AcDb3dSolid* pSolid = new AcDb3dSolid; if ( Acad::eOk == (es = pSubMesh->convertToSolid(false,false,pSolid) ) ) { mode.DrawEntity(pSolid); } delete pSubMesh; */ return TRUE; } delete pSubMesh; } mode.DrawMeshS (rows,columns,pVertexList,false); return FALSE; } BOOL ImpHvacReducer::DrawShell(AcGiDraw &mode,const Adesk::UInt32 nbVertex,const AcGePoint3d* pVertexList,const Adesk::UInt32 faceListSize,const Adesk::Int32* pFaceList) const { AcGePoint3dArray vertexArray; AcArray faceArray; for(int i = 0;i < nbVertex;i++) { vertexArray.append(pVertexList[i]); } for (int j = 0;j < faceListSize;j++) { faceArray.append(pFaceList[j]); } AcDbSubDMesh* pSubMesh = new AcDbSubDMesh; if ( Acad::eOk == pSubMesh->setSubDMesh(vertexArray,faceArray,0) ) { mode.DrawEntity(pSubMesh); m_ar3DDrableBufPtrs_.append(pSubMesh); //有时候失败? /*Acad::ErrorStatus es; AcDb3dSolid* pSolid = new AcDb3dSolid; if ( Acad::eOk == (es = pSubMesh->convertToSolid(false,false,pSolid) ) ) { mode.DrawEntity(pSolid); } delete pSubMesh; */ return TRUE; } delete pSubMesh; mode.DrawShell (nbVertex,pVertexList,faceListSize,pFaceList); return FALSE; } void ImpHvacReducer::Move3DBuffer(AcDbVoidPtrArray& ar3DBuffer) const { if (!m_ar3DDrableBufPtrs_.isEmpty()) { ar3DBuffer.append(m_ar3DDrableBufPtrs_); m_ar3DDrableBufPtrs_.removeAll(); } } bool ImpHvacReducer::Has3DBuffer() const { return !m_ar3DDrableBufPtrs_.isEmpty(); } Acad::ErrorStatus ImpHvacReducer::Draw2d(AcGiDraw& mode) const { if (m_pXDataMap == NULL) { return Acad::eNotImplementedYet; } AecComplexCurve cplCurve; MakeCurves(cplCurve); AecComplexCurveDraw edage; edage.SetEdage(cplCurve); BOOL bWeight = FALSE; AcDbObjectId idReal = m_idDoubleLayer; AcDbObjectId idDash = m_idDashLayer; AcDbObjectId idCent = m_idCenterLayer; edage.Draw2d(mode,idReal,idDash,idCent,NULL,bWeight,FALSE); AecComplexCurve cplCen; GetCurvesInSide(cplCen); edage.SetEdage(cplCen); edage.Draw2d(mode,idReal,idDash,idCent,NULL,bWeight,FALSE); return Acad::eOk; } BOOL ImpHvacReducer::MakeCurves(AecComplexCurve& cplCurve) const { if (NULL == m_pXDataMap) return FALSE; // 变径类型 ESection eStartSectType = eRect; ESection eEndSectType = eRect; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); int nType = 0; if (IsHorzAlignment()) // 水平 { switch (eStartSectType) { case eRect: // 矩形 switch (eEndSectType) { case eRect: // 矩形 return MakeRect2Rect2DCurves(cplCurve,nType); break; case eCircle: // 圆形 return MakeRect2Cir2DCurves(cplCurve,nType); break; case eOblate: // 扁圆形 break; } break; case eCircle: // 圆形 switch (eEndSectType) { case eRect: // 矩形 return MakeCir2Rect2DCurves(cplCurve,nType); break; case eCircle: // 圆形 return MakeCir2Cir2DCurves(cplCurve,nType); break; case eOblate: // 扁圆形 break; } break; case eOblate: // 扁圆形 switch (eEndSectType) { case eRect: // 矩形 break; case eCircle: // 园形 break; case eOblate: // 扁圆形 break; } break; } } else if(IsVertAlignment()) // 立管 { switch (eStartSectType) { case eRect: // 矩形 switch (eEndSectType) { case eRect: // 矩形 return MakeRect2Rect2DCurvesVer(cplCurve,nType); break; case eCircle: // 圆形 return MakeRect2Cir2DCurvesVer(cplCurve,nType); break; case eOblate: // 扁圆形 break; } break; case eCircle: // 圆形 switch (eEndSectType) { case eRect: // 矩形 return MakeCir2Rect2DCurvesVer(cplCurve,nType); break; case eCircle: // 圆形 return MakeCir2Cir2DCurvesVer(cplCurve,nType); break; case eOblate: // 扁圆形 break; } break; case eOblate: // 扁圆形 switch (eEndSectType) { case eRect: // 矩形 break; case eCircle: // 圆形 break; case eOblate: // 扁圆形 break; } break; } } else if (IsInclineAlignment()) //倾斜变径二维Lixl { switch (eStartSectType) { case eRect: // 矩形 switch (eEndSectType) { case eRect: // 矩形 return MakeRect2Rect2DCurves(cplCurve,nType); break; case eCircle: // 圆形 return MakeRect2Cir2DCurves(cplCurve,nType); break; case eOblate: // 扁圆形 break; } break; case eCircle: // 圆形 switch (eEndSectType) { case eRect: // 矩形 return MakeCir2Rect2DCurves(cplCurve,nType); break; case eCircle: // 圆形 return MakeIncCir2Cir2DCurves(cplCurve,nType); break; case eOblate: // 扁圆形 break; } break; } } return FALSE; } BOOL ImpHvacReducer::GetCurvesInSide(AecComplexCurve& compCurve) const { if (NULL == m_pXDataMap) return FALSE; // 变径类型 ESection eStartSectType = eRect; ESection eEndSectType = eRect; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); int nType = 1; if (IsHorzAlignment()) // 水平 { switch (eStartSectType) { case eRect: // 矩形 switch (eEndSectType) { case eRect: // 矩形 return MakeRect2Rect2DCurves(compCurve, nType); break; case eCircle: // 园形 return MakeRect2Cir2DCurves(compCurve, nType); break; case eEllispe: // 扁圆形 break; } break; case eCircle: // 园形 switch (eEndSectType) { case eRect: // 矩形 return MakeCir2Rect2DCurves(compCurve, nType); break; case eCircle: // 园形 return MakeCir2Cir2DCurves(compCurve, nType); break; case eEllispe: // 扁圆形 break; } break; case eEllispe: // 扁圆形 switch (eEndSectType) { case eRect: // 矩形 break; case eCircle: // 园形 break; case eEllispe: // 扁圆形 break; } break; } } else if(IsVertAlignment()) // 立管 { switch (eStartSectType) { case eRect: // 矩形 switch (eEndSectType) { case eRect: // 矩形 return MakeRect2Rect2DCurvesVer(compCurve, nType); break; case eCircle: // 园形 return MakeRect2Cir2DCurvesVer(compCurve, nType); break; case eEllispe: // 扁圆形 break; } break; case eCircle: // 园形 switch (eEndSectType) { case eRect: // 矩形 return MakeCir2Rect2DCurvesVer(compCurve, nType); break; case eCircle: // 园形 return MakeCir2Cir2DCurvesVer(compCurve, nType); break; case eEllispe: // 扁圆形 break; } break; case eEllispe: // 扁圆形 switch (eEndSectType) { case eRect: // 矩形 break; case eCircle: // 园形 break; case eEllispe: // 扁圆形 break; } break; } } else if (IsInclineAlignment()) { switch (eStartSectType) { case eRect: // 矩形 switch (eEndSectType) { case eRect: // 矩形 return MakeRect2Rect2DCurves(compCurve,nType); break; case eCircle: // 圆形 return MakeRect2Cir2DCurves(compCurve,nType); break; case eEllispe: // 扁圆形 break; } break; case eCircle: // 圆形 switch (eEndSectType) { case eRect: // 矩形 return MakeCir2Rect2DCurves(compCurve,nType); break; case eCircle: // 圆形 return MakeIncCir2Cir2DCurves(compCurve,nType); break; case eEllispe: // 扁圆形 break; } break; } } return FALSE; } Acad::ErrorStatus ImpHvacReducer::transformBy(const AcGeMatrix3d& xform) { if (NULL == m_pXDataMap) return Acad::eNotApplicable; // 取得位置点和法向 AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal, vtSta; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); m_pXDataMap->GetAt(HRED_StartDir, vtSta); // 变换位置 ptStart.transformBy(xform); ptEnd.transformBy(xform); vtNormal.transformBy(xform); vtSta.transformBy(xform); vtNormal.normalize(); vtSta.normalize(); // 更新点和法向 m_pXDataMap->SetAt(HRED_StartPoint, ptStart); m_pXDataMap->SetAt(HRED_EndPoint, ptEnd); m_pXDataMap->SetAt(KEY_NORMAL, vtNormal); m_pXDataMap->SetAt(HRED_StartDir, vtSta); // 设置尺寸 double dScale = xform.scale(); double dStaWidth(0.0), dEndWidth(0.), dStaThick(0.0), dEndThick(0.0); m_pXDataMap->GetAt(HRED_StartWidth, dStaWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_StartThick, dStaThick); m_pXDataMap->GetAt(HRED_EndThick, dEndThick); dStaWidth *= dScale; dEndWidth *= dScale; dStaThick *= dScale; dEndThick *= dScale; m_pXDataMap->SetAt(HRED_StartWidth, dStaWidth); m_pXDataMap->SetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->SetAt(HRED_StartThick, dStaThick); m_pXDataMap->SetAt(HRED_EndThick, dEndThick); return Acad::eOk; } AecEqui::Position ImpHvacReducer::ExplainGripIndex(int nIndex) const { AecEqui::Position ePos = AecEqui::eStart; switch(nIndex) { case 0: ePos = AecEqui::eStart; break; case 1: ePos = AecEqui::eEnd; break; case 2: ePos = AecEqui::eCommand0; break; case 3: ePos = AecEqui::eCommand1; break; } return ePos; } // 绘制三维图形(方对方) void ImpHvacReducer::ExplodeRect2Rect3d(AcGiDraw& mode) const { ASSERT(NULL != m_pXDataMap); double dStartWidth = MayAsMUnit(200.0), dStartThick = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dEndThick = MayAsMUnit(400.0), dPlusEdge(GetPlusEdge()); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_StartThick, dStartThick); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndThick); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); // 计算8顶点 AcGeVector3d vtSect = GetSectNormal(); AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3dArray arPtS, arPtE; arPtS.append(ptStart + dStartWidth * vt / 2.0 + dStartThick * vtNormal / 2.0); arPtS.append(arPtS.at(0) - dStartWidth * vt); arPtS.append(arPtS.at(1) - dStartThick * vtNormal); arPtS.append(arPtS.at(0) - dStartThick * vtNormal); arPtS.append(arPtS.at(0)); arPtE.append(ptEnd + dEndWidth * vt / 2.0 + dEndThick * vtNormal / 2.0); arPtE.append(arPtE.at(0) - dEndWidth * vt); arPtE.append(arPtE.at(1) - dEndThick * vtNormal); arPtE.append(arPtE.at(0) - dEndThick * vtNormal); arPtE.append(arPtE.at(0)); // 考虑法兰余量添加5行4列点 AcGePoint3dArray arPoint; for(int i = 0; i < 5; i++) { arPoint.append(arPtS.at(i)); arPoint.append(arPtS.at(i) - dPlusEdge * vtSect); arPoint.append(arPtE.at(i) + dPlusEdge * vtSect); arPoint.append(arPtE.at(i)); } DrawMesh(mode,5, 4, arPoint.asArrayPtr()); } // 构建二维图形(方对方) BOOL ImpHvacReducer::MakeRect2Rect2DCurves(AecComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); double dStartWidth = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dPlusEdge = GetPlusEdge(); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); ESection eSectType = eRect; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSectType); m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); if ((eSectType == eRect) && !vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 取厚 { m_pXDataMap->GetAt(HRED_StartThick, dStartWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndWidth); } m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); AcDbObjectId idEndLayer, idBaseLayer; m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer); BOOL bHasBaseLine = FALSE; m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLine); AecCurveElement curEle; curEle.bHided = FALSE; curEle.dWidth = 0.0; curEle.gsMark = 0; curEle.idSubLay = m_idDoubleLayer; AcGeVector3d vtSect = GetSectNormal(); // 2D下绘制,截面方向向XY平面投影,后计算图形在XY平面上的关键点Lixl vtSect = vtSect.orthoProject(TAuxTools::GetUcsZvt()); // 绘单线 if (IsSingleLine()) { AcGeVector3d vtDir = ptStart - ptEnd; AcGePoint3d ptS, ptM, ptE; vtDir.normalize(); ptM = ptEnd + vtDir * ptStart.distanceTo(ptEnd) / 2.0; if (ptStart.distanceTo(ptEnd) > MayAsMUnit(120.0)) { ptS = ptM + vtDir * 60.0; ptE = ptM - vtDir * 60.0; curEle.ptGe[0] = ptStart; curEle.ptGe[1] = ptS; curEle.ptGe[2] = ptS; cplCurve.append(curEle); curEle.ptGe[0] = ptEnd; curEle.ptGe[1] = ptE; curEle.ptGe[2] = ptE; cplCurve.append(curEle); } else { ptS = ptStart; ptE = ptEnd; } vtDir.rotateBy(PI/2, TAuxTools::GetUcsZvt()); double dS = MayAsMUnit(20.0), dE = MayAsMUnit(50.0); if (dStartWidth > dEndWidth) { dS = MayAsMUnit(50.0); dE = MayAsMUnit(20.0); } curEle.ptGe[0] = ptS + (dS + MayAsMUnit(10.0)) * vtDir; curEle.ptGe[1] = ptS - (dS + MayAsMUnit(10.0)) * vtDir; curEle.ptGe[2] = ptS - (dS + MayAsMUnit(10.0)) * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptE + (dE + MayAsMUnit(10.0)) * vtDir; curEle.ptGe[1] = ptE - (dE + MayAsMUnit(10.0)) * vtDir; curEle.ptGe[2] = ptE - (dE + MayAsMUnit(10.0)) * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptS + dS * vtDir; curEle.ptGe[1] = ptE + dE * vtDir; curEle.ptGe[2] = ptE + dE * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptS - dS * vtDir; curEle.ptGe[1] = ptE - dE * vtDir; curEle.ptGe[2] = ptE - dE * vtDir; cplCurve.append(curEle); return TRUE; } if (0 == nType) { AcGeVector3d vt = vtSect; //vt.rotateBy(PI / 2.0, vtNormal); vt.rotateBy(PI / 2.0, TAuxTools::GetUcsZvt()); vt.normalize(); AcGePoint3d arPoint[4], arPointIn[4]; arPoint[0] = ptStart - dStartWidth * vt / 2.0; arPoint[1] = ptStart + dStartWidth * vt / 2.0; arPoint[2] = ptEnd + dEndWidth * vt / 2.0; arPoint[3] = ptEnd - dEndWidth * vt / 2.0; arPointIn[0] = arPoint[0] - dPlusEdge * vtSect; arPointIn[1] = arPoint[1] - dPlusEdge * vtSect; arPointIn[2] = arPoint[2] + dPlusEdge * vtSect; arPointIn[3] = arPoint[3] + dPlusEdge * vtSect; curEle.dWidth = GetEdgeLineWidth(); curEle.ptGe[0] = arPoint[1]; curEle.ptGe[1] = arPointIn[1]; curEle.ptGe[2] = arPointIn[1]; cplCurve.append(curEle); curEle.ptGe[0] = arPoint[0]; curEle.ptGe[1] = arPointIn[0]; curEle.ptGe[2] = arPointIn[0]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[1]; curEle.ptGe[1] = arPointIn[2]; curEle.ptGe[2] = arPointIn[2]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[0]; curEle.ptGe[1] = arPointIn[3]; curEle.ptGe[2] = arPointIn[3]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[2]; curEle.ptGe[1] = arPoint[2]; curEle.ptGe[2] = arPoint[2]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[3]; curEle.ptGe[1] = arPoint[3]; curEle.ptGe[2] = arPoint[3]; cplCurve.append(curEle); curEle.idSubLay = idEndLayer; // 两端图层 curEle.dWidth = GetEndLineWidth(); curEle.ptGe[0] = arPoint[0]; curEle.ptGe[1] = arPoint[1]; curEle.ptGe[2] = arPoint[1]; cplCurve.append(curEle); curEle.ptGe[0] = arPoint[2]; curEle.ptGe[1] = arPoint[3]; curEle.ptGe[2] = arPoint[3]; cplCurve.append(curEle); } else if (1 == nType) { if (bHasBaseLine) { curEle.idSubLay = m_idCenterLayer; // 基线图层 curEle.dWidth = GetCentLineWidth(); curEle.ptGe[0] = ptStart; curEle.ptGe[1] = ptStart - dPlusEdge * vtSect; curEle.ptGe[2] = ptStart - dPlusEdge * vtSect; cplCurve.append(curEle); curEle.ptGe[0] = ptStart - dPlusEdge * vtSect; curEle.ptGe[1] = ptEnd + dPlusEdge * vtSect; curEle.ptGe[2] = ptEnd + dPlusEdge * vtSect; cplCurve.append(curEle); curEle.ptGe[0] = ptEnd + dPlusEdge * vtSect; curEle.ptGe[1] = ptEnd; curEle.ptGe[2] = ptEnd; cplCurve.append(curEle); } } return TRUE; } // 倾斜变径: 圆对圆 BOOL ImpHvacReducer::MakeIncCir2Cir2DCurves(AecComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); double dStartWidth = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dPlusEdge = 0.0; AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; ESection eStaSectType = eRect; ESection eEndSectType = eRect; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStaSectType); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); if ((eStaSectType == eRect) && !vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 取厚 { m_pXDataMap->GetAt(HRED_StartThick, dStartWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndWidth); } m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); AcDbObjectId idEndLayer, idBaseLayer; m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer); // 中心线图层 BOOL bHasBaseLine = FALSE; m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLine); AecCurveElement curEle; curEle.bHided = FALSE; curEle.dWidth = 0.0; curEle.gsMark = 0; curEle.idSubLay = m_idDoubleLayer; AcGeVector3d vtSect = GetSectNormal(); int i(0), nRet(0); AcDbPolyline* pLine = new AcDbPolyline; if (NULL == pLine) return FALSE; AcGePoint3dArray arPtsCir; AcGeVector3d vt = vtSect.crossProduct(vtNormal); vt.normalize(); // 绘单线 if (IsSingleLine()) { AcGeVector3d vtDir = ptStart - ptEnd; vtDir.orthoProject(TAuxTools::GetUcsZvt()); vtDir.normalize(); AcGePoint3d ptS, ptM, ptE; ptM = ptEnd + vtDir * ptStart.distanceTo(ptEnd) / 2.0; if (ptStart.distanceTo(ptEnd) > MayAsMUnit(120.0)) { ptS = ptM + vtDir * MayAsMUnit(60.0); ptE = ptM - vtDir * MayAsMUnit(60.0); curEle.ptGe[0] = ptStart; curEle.ptGe[1] = ptS; curEle.ptGe[2] = ptS; cplCurve.append(curEle); curEle.ptGe[0] = ptEnd; curEle.ptGe[1] = ptE; curEle.ptGe[2] = ptE; cplCurve.append(curEle); } else { ptS = ptStart; ptE = ptEnd; } vtDir.rotateBy(PI/2, TAuxTools::GetUcsZvt()); double dS = MayAsMUnit(20.0), dE = MayAsMUnit(50.0); if (dStartWidth > dEndWidth) { dS = MayAsMUnit(50.0); dE = MayAsMUnit(20.0); } curEle.ptGe[0] = ptS + (dS + MayAsMUnit(10.0)) * vtDir; curEle.ptGe[1] = ptS - (dS + MayAsMUnit(10.0))* vtDir; curEle.ptGe[2] = ptS - (dS + MayAsMUnit(10.0)) * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptE + (dE + MayAsMUnit(10.0)) * vtDir; curEle.ptGe[1] = ptE - (dE + MayAsMUnit(10.0)) * vtDir; curEle.ptGe[2] = ptE - (dE + MayAsMUnit(10.0)) * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptS + dS * vtDir; curEle.ptGe[1] = ptE + dE * vtDir; curEle.ptGe[2] = ptE + dE * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptS - dS * vtDir; curEle.ptGe[1] = ptE - dE * vtDir; curEle.ptGe[2] = ptE - dE * vtDir; cplCurve.append(curEle); return TRUE; } if (0 == nType) { AcGePoint3d arPoint[4]; arPoint[0] = ptStart - dStartWidth * vt / 2.0; arPoint[1] = ptStart + dStartWidth * vt / 2.0; arPoint[2] = ptEnd + dEndWidth * vt / 2.0; arPoint[3] = ptEnd - dEndWidth * vt / 2.0; curEle.idSubLay = idEndLayer; // 两端图层 curEle.dWidth = GetEndLineWidth(); // 末端半个椭圆 vt = -vtSect;//起点指向终点 if (eEndSectType == eCircle) { nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptEnd, dEndWidth, vt, TAuxTools::GetUcsZvt(), *pLine, vt); if (-1 != nRet) { for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23 { curEle.ptGe[0] = arPtsCir[i]; curEle.ptGe[1] = arPtsCir[i+1]; curEle.ptGe[2] = arPtsCir[i+1]; cplCurve.append(curEle); } arPoint[2] = arPtsCir.first(); arPoint[3] = arPtsCir.last(); } } else { } arPtsCir.setLogicalLength(0); pLine->reset(Adesk::kFalse, i); if (eStaSectType == eCircle) { nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptStart, dStartWidth, -vt, TAuxTools::GetUcsZvt(), *pLine, -vt); if (-1 != nRet) { for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23 { curEle.ptGe[0] = arPtsCir[i]; curEle.ptGe[1] = arPtsCir[i+1]; curEle.ptGe[2] = arPtsCir[i+1]; cplCurve.append(curEle); } arPoint[0] = arPtsCir.first(); arPoint[1] = arPtsCir.last(); } } else { } vt = -vtSect.crossProduct(vtNormal); AcGePoint3d ptJudge = ptStart + vt * MayAsMUnit(10000); ptJudge.z = (ptStart.z + ptEnd.z) * 0.5; arPoint[0].z = ptJudge.z; arPoint[1].z = ptJudge.z; arPoint[2].z = ptJudge.z; arPoint[3].z = ptJudge.z; AcGePoint3d ptTmp; // 0,3点在上, 1,2点在下 if (arPoint[0].distanceTo(ptJudge) < arPoint[1].distanceTo(ptJudge)) { ptTmp = arPoint[0]; arPoint[0] = arPoint[1]; arPoint[1] = ptTmp; } if (arPoint[3].distanceTo(ptJudge) < arPoint[2].distanceTo(ptJudge)) { ptTmp = arPoint[3]; arPoint[3] = arPoint[2]; arPoint[2] = ptTmp; } // 变径边线 curEle.idSubLay = AcDbObjectId::kNull; curEle.dWidth = GetEdgeLineWidth(); curEle.ptGe[0] = arPoint[0]; curEle.ptGe[1] = arPoint[3]; curEle.ptGe[2] = arPoint[3]; cplCurve.append(curEle); curEle.ptGe[0] = arPoint[1]; curEle.ptGe[1] = arPoint[2]; curEle.ptGe[2] = arPoint[2]; cplCurve.append(curEle); } else if (1 == nType) { if (bHasBaseLine) { curEle.idSubLay = m_idCenterLayer; // 基线图层 curEle.dWidth = GetCentLineWidth(); curEle.ptGe[0] = ptStart; curEle.ptGe[1] = ptEnd; curEle.ptGe[2] = ptEnd; cplCurve.append(curEle); } // 内部端线 curEle.idSubLay = idEndLayer; curEle.dWidth = GetEndLineWidth(); vt = -vtSect; // 起点高,画起点内半个椭圆 if (ptStart.z > ptEnd.z) { nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptStart, dStartWidth, vt, TAuxTools::GetUcsZvt(), *pLine, vt); if (-1 != nRet) { for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23 { curEle.ptGe[0] = arPtsCir[i]; curEle.ptGe[1] = arPtsCir[i+1]; curEle.ptGe[2] = arPtsCir[i+1]; cplCurve.append(curEle); } } } else // 终点高,画终点内部半个椭圆 { nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptEnd, dEndWidth, vt, TAuxTools::GetUcsZvt(), *pLine, -vt); if (-1 != nRet) { for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23 { curEle.ptGe[0] = arPtsCir[i]; curEle.ptGe[1] = arPtsCir[i+1]; curEle.ptGe[2] = arPtsCir[i+1]; cplCurve.append(curEle); } } } } if (NULL != pLine) delete pLine; return TRUE; } // 绘制三维图形(方对圆) void ImpHvacReducer::ExplodeRect2Cir3d(AcGiDraw& mode, BOOL bStartIsRound) const { ASSERT(NULL != m_pXDataMap); double dStartWidth = MayAsMUnit(200.0), dStartThick = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dEndThick = MayAsMUnit(400.0), dPlusEdge = GetPlusEdge(); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; AcGeVector3d vtSect = GetSectNormal(); if (bStartIsRound) { m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_StartThick, dStartThick); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndThick); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); } else { m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth); m_pXDataMap->GetAt(HRED_StartThick, dEndThick); m_pXDataMap->GetAt(HRED_EndWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndThick, dStartThick); m_pXDataMap->GetAt(HRED_StartPoint, ptEnd); m_pXDataMap->GetAt(HRED_EndPoint, ptStart); vtSect = -vtSect; } m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); double dMinDiffAng = PI / 12.0; // 圆弧分割的角度 //GetGlobalContext()->GetAt(KEY_MINDIFFANG, dMinDiffAng); m_pXDataMap->GetAt(KEY_MINDIFFANG, dMinDiffAng); int nSect = int(PI / (2.0 * dMinDiffAng)) + 1; // 每PI/2圆弧分成的段数 dMinDiffAng = PI / (2.0 * nSect); // 起始端圆分割点 AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3dArray arCirPt; AcGePoint3d ptCir; ptCir = ptStart + vt * dStartWidth / 2.0; arCirPt.append(ptCir); for (int i = 1; i < 4 * nSect; i++) { ptCir.rotateBy(dMinDiffAng, vtSect, ptStart); arCirPt.append(ptCir); } arCirPt.append(ptStart + vt * dStartWidth / 2.0); // 最后一个封闭,可消除计算误差 // 终止端矩形顶点 AcGePoint3dArray arRectPt; arRectPt.append(ptEnd + dEndWidth * vt / 2.0 - dEndThick * vtNormal / 2.0); arRectPt.append(arRectPt.at(0) + dEndThick * vtNormal); arRectPt.append(arRectPt.at(1) - dEndWidth * vt); arRectPt.append(arRectPt.at(0) - dEndWidth * vt); arRectPt.append(arRectPt.at(0)); // 4*(nSect+1)+1行4列网格点 AcGePoint3dArray arPoint; for (i = 0; i < 4; i++) { // 圆上点和矩形边 arPoint.append(arCirPt.at(i * nSect)); arPoint.append(arCirPt.at(i * nSect) - dPlusEdge * vtSect); arPoint.append(arRectPt.at(i) + dPlusEdge * vtSect); arPoint.append(arRectPt.at(i)); // 圆上边和矩形顶点 for (int j = 0; j < nSect; j++) { arPoint.append(arCirPt.at(i * nSect + j)); arPoint.append(arCirPt.at(i * nSect + j) - dPlusEdge * vtSect); arPoint.append(arRectPt.at(i + 1) + dPlusEdge * vtSect); arPoint.append(arRectPt.at(i + 1)); } } arPoint.append(arCirPt.at(0)); arPoint.append(arCirPt.at(0) - dPlusEdge * vtSect); arPoint.append(arRectPt.at(0) + dPlusEdge * vtSect); arPoint.append(arRectPt.at(0)); DrawMesh(mode,4 * (nSect + 1) + 1, 4, arPoint.asArrayPtr()); } // 构建二维图形(方对圆) BOOL ImpHvacReducer::MakeRect2Cir2DCurves(AecComplexCurve& cplCurve, int &nType, BOOL bStartIsRound) const { ASSERT(NULL != m_pXDataMap); double dStartWidth = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dPlusEdge = GetPlusEdge(); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcGeVector3d vtSect = GetSectNormal(); if (bStartIsRound) { m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); if (vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 宽厚颠倒 { m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); } // LixlModify支持倾斜管上的变径 else if (!vtNormal.isPerpendicularTo(TAuxTools::GetUcsZvt())) { m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); } else { m_pXDataMap->GetAt(HRED_EndThick, dEndWidth); } m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); } else { vtSect = -vtSect; if (vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) { m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth); } // LixlModify支持倾斜管上的变径 else if (!vtNormal.isPerpendicularTo(TAuxTools::GetUcsZvt())) { m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth); } else { m_pXDataMap->GetAt(HRED_StartThick, dEndWidth); } m_pXDataMap->GetAt(HRED_EndWidth, dStartWidth); m_pXDataMap->GetAt(HRED_StartPoint, ptEnd); m_pXDataMap->GetAt(HRED_EndPoint, ptStart); } AcDbObjectId idEndLayer, idBaseLayer; m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer); //TDbFittingBase* pFit = TDbFittingBase::cast(m_pOwnerEnt); //if (NULL != pFit) // idBaseLayer = pFit->CenterLayer(); BOOL bHasBaseLine = FALSE; m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLine); AecCurveElement curEle; curEle.bHided = FALSE; curEle.dWidth = 0.0; curEle.gsMark = 0; curEle.idSubLay = m_idDoubleLayer; // 绘单线 if (IsSingleLine()) { AcGeVector3d vtDir = ptStart - ptEnd; AcGePoint3d ptS, ptM, ptE; vtDir.normalize(); ptM = ptEnd + vtDir * ptStart.distanceTo(ptEnd) / 2.0; if (ptStart.distanceTo(ptEnd) > MayAsMUnit(120.0)) { ptS = ptM + vtDir * MayAsMUnit(60.0); ptE = ptM - vtDir * MayAsMUnit(60.0); curEle.ptGe[0] = ptStart; curEle.ptGe[1] = ptS; curEle.ptGe[2] = ptS; cplCurve.append(curEle); curEle.ptGe[0] = ptEnd; curEle.ptGe[1] = ptE; curEle.ptGe[2] = ptE; cplCurve.append(curEle); } else { ptS = ptStart; ptE = ptEnd; } vtDir.rotateBy(PI / 2.0, TAuxTools::GetUcsZvt()); curEle.ptGe[0] = ptS + MayAsMUnit(10.0) * vtDir; // ptS是圆断面 curEle.ptGe[1] = ptS - MayAsMUnit(10.0) * vtDir; curEle.ptGe[2] = ptS - MayAsMUnit(10.0) * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptE + MayAsMUnit(60.0) * vtDir; curEle.ptGe[1] = ptE - MayAsMUnit(60.0) * vtDir; curEle.ptGe[2] = ptE - MayAsMUnit(60.0) * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptE + MayAsMUnit(50.0) * vtDir; curEle.ptGe[1] = ptS; curEle.ptGe[2] = ptS; cplCurve.append(curEle); curEle.ptGe[0] = ptE - MayAsMUnit(50.0) * vtDir; curEle.ptGe[1] = ptS; curEle.ptGe[2] = ptS; cplCurve.append(curEle); return TRUE; } AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3d arPoint[4], arPointIn[4]; arPoint[0] = ptStart - dStartWidth * vt / 2.0; arPoint[1] = ptStart + dStartWidth * vt / 2.0; arPoint[2] = ptEnd + dEndWidth * vt / 2.0; arPoint[3] = ptEnd - dEndWidth * vt / 2.0; arPointIn[0] = arPoint[0] - dPlusEdge * vtSect; arPointIn[1] = arPoint[1] - dPlusEdge * vtSect; arPointIn[2] = arPoint[2] + dPlusEdge * vtSect; arPointIn[3] = arPoint[3] + dPlusEdge * vtSect; if (1 == nType) // 内部线 { curEle.ptGe[0] = ptStart - dPlusEdge * vtSect; curEle.ptGe[1] = arPointIn[2]; curEle.ptGe[2] = arPointIn[2]; cplCurve.append(curEle); curEle.ptGe[0] = ptStart - dPlusEdge * vtSect; curEle.ptGe[1] = arPointIn[3]; curEle.ptGe[2] = arPointIn[3]; cplCurve.append(curEle); if (bHasBaseLine) { curEle.idSubLay = m_idCenterLayer; // 基线图层 curEle.dWidth = GetCentLineWidth(); curEle.ptGe[0] = ptStart; curEle.ptGe[1] = ptStart - dPlusEdge * vtSect; curEle.ptGe[2] = ptStart - dPlusEdge * vtSect; cplCurve.append(curEle); curEle.ptGe[0] = ptStart - dPlusEdge * vtSect; curEle.ptGe[1] = ptEnd + dPlusEdge * vtSect; curEle.ptGe[2] = ptEnd + dPlusEdge * vtSect; cplCurve.append(curEle); curEle.ptGe[0] = ptEnd + dPlusEdge * vtSect; curEle.ptGe[1] = ptEnd; curEle.ptGe[2] = ptEnd; cplCurve.append(curEle); } } else if (0 == nType) // 外边线 { curEle.dWidth = GetEdgeLineWidth(); curEle.ptGe[0] = arPoint[1]; curEle.ptGe[1] = arPointIn[1]; curEle.ptGe[2] = arPointIn[1]; cplCurve.append(curEle); curEle.ptGe[0] = arPoint[0]; curEle.ptGe[1] = arPointIn[0]; curEle.ptGe[2] = arPointIn[0]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[1]; curEle.ptGe[1] = arPointIn[2]; curEle.ptGe[2] = arPointIn[2]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[0]; curEle.ptGe[1] = arPointIn[3]; curEle.ptGe[2] = arPointIn[3]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[2]; curEle.ptGe[1] = arPoint[2]; curEle.ptGe[2] = arPoint[2]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[3]; curEle.ptGe[1] = arPoint[3]; curEle.ptGe[2] = arPoint[3]; cplCurve.append(curEle); curEle.idSubLay = idEndLayer; // 两端图层 curEle.dWidth = GetEndLineWidth(); curEle.ptGe[0] = arPoint[0]; curEle.ptGe[1] = arPoint[1]; curEle.ptGe[2] = arPoint[1]; cplCurve.append(curEle); curEle.ptGe[0] = arPoint[2]; curEle.ptGe[1] = arPoint[3]; curEle.ptGe[2] = arPoint[3]; cplCurve.append(curEle); } return TRUE; } // 绘制三维图形(圆对方) void ImpHvacReducer::ExplodeCir2Rect3d(AcGiDraw& mode) const { ExplodeRect2Cir3d(mode, TRUE); } // 构建二维图形(圆对方) BOOL ImpHvacReducer::MakeCir2Rect2DCurves(AecComplexCurve& cplCurve, int &nType) const { return MakeRect2Cir2DCurves(cplCurve, nType, TRUE); } // 绘制三维图形(圆对圆) void ImpHvacReducer::ExplodeCir2Cir3d(AcGiDraw& mode) const { ASSERT(NULL != m_pXDataMap); double dStartWidth = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dPlusEdge = GetPlusEdge(); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcGeVector3d vtSect = GetSectNormal(); double dMinDiffAng = PI / 12.0; // 圆弧分割的角度 //GetGlobalContext()->GetAt(KEY_MINDIFFANG, dMinDiffAng); m_pXDataMap->GetAt(KEY_MINDIFFANG, dMinDiffAng); int nSect = int(2.0 * PI / dMinDiffAng) + 1; dMinDiffAng = 2.0 * PI / nSect; // 起始端圆分割点 AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3dArray arCirPtStart; AcGePoint3d ptCir; ptCir = ptStart + vt * dStartWidth / 2.0; arCirPtStart.append(ptCir); for (int i = 1; i < nSect; i++) { ptCir.rotateBy(dMinDiffAng, vtSect, ptStart); arCirPtStart.append(ptCir); } arCirPtStart.append(ptStart + vt * dStartWidth / 2.0); // 最后一个封闭,可消除计算误差 // 终止端端圆分割点 AcGePoint3dArray arCirPtEnd; ptCir = ptEnd + vt * dEndWidth / 2.0; arCirPtEnd.append(ptCir); for (i = 1; i < nSect; i++) { ptCir.rotateBy(dMinDiffAng, vtSect, ptEnd); arCirPtEnd.append(ptCir); } arCirPtEnd.append(ptEnd + vt * dEndWidth / 2.0); // nSect+1行2列网格点 AcGePoint3dArray arPoint; for (i = 0; i < nSect + 1; i++) { arPoint.append(arCirPtStart.at(i)); arPoint.append(arCirPtStart.at(i) - dPlusEdge * vtSect); arPoint.append(arCirPtEnd.at(i) + dPlusEdge * vtSect); arPoint.append(arCirPtEnd.at(i)); } DrawMesh(mode,nSect + 1, 4, arPoint.asArrayPtr()); } // 构建二维图形(圆对圆) BOOL ImpHvacReducer::MakeCir2Cir2DCurves(AecComplexCurve& cplCurve, int &nType) const { return MakeRect2Rect2DCurves(cplCurve, nType); } // 获得外轮廓点 void ImpHvacReducer::GetOutVertex(AcGePoint3dArray& arPoint, ESection eStart, ESection eEnd) const { double dStartWidth = MayAsMUnit(200.0), dStartThick = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dEndThick = MayAsMUnit(400.0); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); if (eStart == eRect) m_pXDataMap->GetAt(HRED_StartThick, dStartThick); else dStartThick = dStartWidth; // 圆形取厚度为宽 m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); if (eStart == eRect) m_pXDataMap->GetAt(HRED_EndThick, dEndThick); else dEndThick = dEndWidth; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); // 计算8顶点(圆形近似为方形计算) AcGeVector3d vtSect = AcGeVector3d::kZAxis; AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3dArray arStartPt; arStartPt.append(ptStart + dStartWidth * vt / 2.0 + dStartThick * vtNormal / 2.0); arStartPt.append(arStartPt.at(0) - dStartWidth * vt); arStartPt.append(arStartPt.at(1) - dStartThick * vtNormal); arStartPt.append(arStartPt.at(0) - dStartThick * vtNormal); AcGePoint3dArray arEndPt; arEndPt.append(ptEnd + dEndWidth * vt / 2.0 + dEndThick * vtNormal / 2.0); arEndPt.append(arEndPt.at(0) - dEndWidth * vt); arEndPt.append(arEndPt.at(1) - dEndThick * vtNormal); arEndPt.append(arEndPt.at(0) - dEndThick * vtNormal); // 边旋转到与x,y轴平行 double dAngle = vtNormal.angleTo(AcGeVector3d::kXAxis); for (int i = 0; i < 4; i++) { arStartPt.at(i).rotateBy(dAngle, vtSect, ptStart); arEndPt.at(i).rotateBy(dAngle, vtSect, ptStart); } // 寻找外轮廓点 if (arStartPt.at(0).x < arEndPt.at(0).x) { arPoint.append(arEndPt.at(0)); arPoint.append(arEndPt.at(1)); if (arStartPt.at(1).y < arEndPt.at(1).y) { arPoint.append(arEndPt.at(2)); if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏 { arPoint.append(arStartPt.at(2)); arPoint.append(arStartPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 左,下偏出 { arPoint.append(arStartPt.at(0)); } else // 左偏出 { arPoint.append(arEndPt.at(3)); } } else { arPoint.append(arEndPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 下偏出 { arPoint.append(arStartPt.at(3)); arPoint.append(arStartPt.at(0)); } else // 全在里面 { } } } else // 上偏 { arPoint.append(arStartPt.at(1)); arPoint.append(arStartPt.at(2)); if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏 { arPoint.append(arStartPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 上,左,下偏出 { arPoint.append(arStartPt.at(0)); } else // 上,左偏出 { arPoint.append(arEndPt.at(3)); } } else { arPoint.append(arEndPt.at(2)); arPoint.append(arEndPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 上,下偏出 { arPoint.append(arStartPt.at(3)); arPoint.append(arStartPt.at(0)); } else // 上偏出 { } } } } else // 右偏 { arPoint.append(arStartPt.at(0)); arPoint.append(arStartPt.at(1)); if (arStartPt.at(1).y < arEndPt.at(1).y) { arPoint.append(arEndPt.at(1)); arPoint.append(arEndPt.at(2)); if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏 { arPoint.append(arStartPt.at(2)); arPoint.append(arStartPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,左,下偏出 { } else // 右,左偏出 { arPoint.append(arEndPt.at(3)); arPoint.append(arEndPt.at(0)); } } else { arPoint.append(arEndPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,下偏出 { arPoint.append(arStartPt.at(3)); } else // 右偏出 { arPoint.append(arEndPt.at(0)); } } } else // 上偏 { arPoint.append(arStartPt.at(2)); if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏 { arPoint.append(arStartPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,上,左,下偏出 { } else // 右,上,左偏出 { arPoint.append(arEndPt.at(3)); arPoint.append(arEndPt.at(0)); } } else { arPoint.append(arEndPt.at(2)); arPoint.append(arEndPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,上,下偏出 { arPoint.append(arStartPt.at(3)); } else // 右,上偏出 { arPoint.append(arEndPt.at(0)); } } } } // 恢复点的原位置 for (i = 0; i < arPoint.length(); i++) { arPoint.at(i).rotateBy(-dAngle, vtSect, ptStart); } } /* 2______________________1 | | | 0 | | | 3______________________4| */ // bGetStartVertex 真:取起点截面周围顶点,假:取终点截面周围顶点 // 矩形截面,执行此函数后6个点,圆形界面26个点,顺序,中心点,逆时针24个点,逆时针起点终点重复一个点 void ImpHvacReducer::GetOutVertex2(AcGePoint3dArray& arPoint, bool bGetStartVertex) const { ASSERT(NULL != m_pXDataMap); // 竖直放置时的外轮廓 if (IsVertAlignment()) { AcGeVector3d vtSect, vtNor; m_pXDataMap->GetAt(HRED_StartDir, vtSect); m_pXDataMap->GetAt(HVAC_Normal, vtNor); AcGePoint3d ptCenter, ptTmp; double dWidth(0.0), dThick(0.0); ESection eSect(eRect); if (bGetStartVertex) { m_pXDataMap->GetAt(HRED_StartPoint, ptCenter); m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSect); m_pXDataMap->GetAt(HRED_StartWidth, dWidth); m_pXDataMap->GetAt(HRED_StartThick, dThick); } else { m_pXDataMap->GetAt(HRED_EndPoint, ptCenter); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eSect); m_pXDataMap->GetAt(HRED_EndWidth, dWidth); m_pXDataMap->GetAt(HRED_EndThick, dThick); } AcGeVector3d vtDir = vtNor.crossProduct(vtSect); AcGeVector3d vtDirV = vtDir.normalize(); vtDirV.rotateBy(PI*0.5, vtSect); // 0 arPoint.append(ptCenter); if (eRect == eSect) { ptTmp = ptCenter + vtDir * dWidth * 0.5; ptTmp = ptTmp + vtDirV * dThick * 0.5; arPoint.append(ptTmp);//1 ptTmp = arPoint[1] - vtDir * dWidth; arPoint.append(ptTmp);//2 ptTmp = arPoint[2] - vtDirV * dThick; arPoint.append(ptTmp);//3 ptTmp = arPoint[1] - vtDirV * dThick; arPoint.append(ptTmp);//4 // 为闭合,增加1点为重复点 arPoint.append(arPoint[1]); } else if (eCircle == eSect) { // 把圆按照最小分度角,分成几部分,取圆上点 double dMixAngle = TAuxTools::GetMinDiffAngle(); int nPart = 24; dMixAngle = PI*2.0 / nPart; ptTmp = ptCenter + vtDir * dWidth * 0.5; arPoint.append(ptTmp); for (int i = 0; i < nPart; i++) { ptTmp.rotateBy(dMixAngle, vtSect, ptCenter); arPoint.append(ptTmp); } } } } BOOL ImpHvacReducer::MakeRect2Rect2DCurvesVer(AecComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); AcGePoint3dArray arSta, arEnd; GetOutVertex2(arSta, true); GetOutVertex2(arEnd, false); if (arSta.length() != arEnd.length() || arSta.length() != 6) return FALSE; double dEndWidht = GetEndLineWidth(); double dEdgeWidth = GetEdgeLineWidth(); AcDbObjectId idEndLayer; m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer); AecCurveElement curEle; curEle.bHided = FALSE; curEle.dWidth = 0.0; curEle.gsMark = 0; curEle.idSubLay = m_idDoubleLayer; { curEle.idSubLay = idEndLayer; curEle.dWidth = dEndWidht; // 起点截面边线 int i = 0; for (i = 1; i < arSta.length()-1; i++) { curEle.ptGe[0] = arSta[i]; curEle.ptGe[1] = arSta[i+1]; curEle.ptGe[2] = arSta[i+1]; cplCurve.append(curEle); } // 终点截面边线 for (i = 1; i < arSta.length()-1; i++) { curEle.ptGe[0] = arEnd[i]; curEle.ptGe[1] = arEnd[i+1]; curEle.ptGe[2] = arEnd[i+1]; cplCurve.append(curEle); } // 绘制两个截面顶点之间的连线 curEle.idSubLay.setNull(); curEle.dWidth = dEdgeWidth; for (i = 1; i <= 4; i++) { curEle.ptGe[0] = arSta[i]; curEle.ptGe[1] = arEnd[i]; curEle.ptGe[2] = arEnd[i]; cplCurve.append(curEle); } } return TRUE; } // 垂直构建二维图形(方对圆) BOOL ImpHvacReducer::MakeRect2Cir2DCurvesVer(AecComplexCurve& cplCurve, int &nType, BOOL bStartIsRound) const { ASSERT(NULL != m_pXDataMap); double dStartDia = MayAsMUnit(200.0), dEndWidth = MayAsMUnit(400.0), dEndThick = MayAsMUnit(400.0); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; if (bStartIsRound) { m_pXDataMap->GetAt(HRED_StartDiameter, dStartDia); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndThick); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); } else { m_pXDataMap->GetAt(HRED_EndDiameter, dStartDia); m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth); m_pXDataMap->GetAt(HRED_StartThick, dEndThick); m_pXDataMap->GetAt(HRED_EndPoint, ptStart); m_pXDataMap->GetAt(HRED_StartPoint, ptEnd); } m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcDbObjectId idEndLayer; m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer); // 计算顶点 AcGeVector3d vtSect = GetSectNormal(); AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3dArray arStartPt; AcGePoint3d ptCir = ptStart + dStartDia * vt / 2.0; arStartPt.append(ptCir); for (int i = 1; i < 8; i++) { ptCir.rotateBy(PI / 4.0, vtSect, ptStart); arStartPt.append(ptCir); } arStartPt.append(ptStart + dStartDia * vt / 2.0); AcGePoint3dArray arEndPt; arEndPt.append(ptEnd + dEndWidth * vt / 2.0 - dEndThick * vtNormal / 2.0); arEndPt.append(arEndPt.at(0) + dEndThick * vtNormal); arEndPt.append(arEndPt.at(1) - dEndWidth * vt); arEndPt.append(arEndPt.at(0) - dEndWidth * vt); arEndPt.append(arEndPt.at(0)); AecCurveElement curEle; curEle.bHided = FALSE; curEle.dWidth = 0.0; curEle.gsMark = 0; curEle.idSubLay = m_idDoubleLayer; // if (0 == nType) { curEle.dWidth = GetEdgeLineWidth(); for (i = 0; i < 4; i++) { curEle.ptGe[0] = arStartPt.at(2 * i); curEle.ptGe[1] = arEndPt.at(i); curEle.ptGe[2] = arEndPt.at(i); cplCurve.append(curEle); curEle.ptGe[0] = arStartPt.at(2 * i); curEle.ptGe[1] = arEndPt.at(i + 1); curEle.ptGe[2] = arEndPt.at(i + 1); cplCurve.append(curEle); } curEle.idSubLay = idEndLayer; // 两端图层 curEle.dWidth = GetEndLineWidth(); for (i = 0; i < 4; i++) { curEle.ptGe[0] = arStartPt.at(2 * i); curEle.ptGe[1] = arStartPt.at(2 * i + 1); curEle.ptGe[2] = arStartPt.at(2 * i + 2); cplCurve.append(curEle); curEle.ptGe[0] = arEndPt.at(i); curEle.ptGe[1] = arEndPt.at(i + 1); curEle.ptGe[2] = arEndPt.at(i + 1); cplCurve.append(curEle); } } return TRUE; } // 垂直构建二维图形(圆对方) BOOL ImpHvacReducer::MakeCir2Rect2DCurvesVer(AecComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); MakeRect2Cir2DCurvesVer(cplCurve, nType, TRUE); return TRUE; } // 垂直构建二维图形(圆对圆) BOOL ImpHvacReducer::MakeCir2Cir2DCurvesVer(AecComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); double dStartDia = MayAsMUnit(200.0), dEndDia = MayAsMUnit(400.0); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(HRED_StartDiameter, dStartDia); m_pXDataMap->GetAt(HRED_EndDiameter, dEndDia); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcDbObjectId idEndLayer; m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer); // 计算顶点 AcGeVector3d vtSect = GetSectNormal(); AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3dArray arStartPt; AcGePoint3d ptCir = ptStart + dStartDia * vt / 2.0; arStartPt.append(ptCir); for (int i = 1; i < 8; i++) { ptCir.rotateBy(PI / 4.0, vtSect, ptStart); arStartPt.append(ptCir); } arStartPt.append(ptStart + dStartDia * vt / 2.0); AcGePoint3dArray arEndPt; ptCir = ptEnd + dEndDia * vt / 2.0; arEndPt.append(ptCir); for (i = 1; i < 8; i++) { ptCir.rotateBy(PI / 4.0, vtSect, ptEnd); arEndPt.append(ptCir); } arEndPt.append(ptEnd + dEndDia * vt / 2.0); AecCurveElement curEle; curEle.bHided = FALSE; curEle.dWidth = 0.0; curEle.gsMark = 0; curEle.idSubLay = m_idDoubleLayer; if (0 == nType) { curEle.idSubLay = idEndLayer; // 两端图层 curEle.dWidth = GetEndLineWidth(); for (i = 0; i < 4; i++) { curEle.ptGe[0] = arStartPt.at(2 * i); curEle.ptGe[1] = arStartPt.at(2 * i + 1); curEle.ptGe[2] = arStartPt.at(2 * i + 2); cplCurve.append(curEle); curEle.ptGe[0] = arEndPt.at(2 * i); curEle.ptGe[1] = arEndPt.at(2 * i + 1); curEle.ptGe[2] = arEndPt.at(2 * i + 2); cplCurve.append(curEle); } } return TRUE; } double ImpHvacReducer::GetEdgeLineWidth() const { ASSERT(NULL != m_pXDataMap); double dWidth(0.0); m_pXDataMap->GetAt(HVAC_EdgeWidth, dWidth); return dWidth; } double ImpHvacReducer::GetCentLineWidth() const { ASSERT(NULL != m_pXDataMap); double dWidth(0.0); m_pXDataMap->GetAt(HVAC_CentWidth, dWidth); return dWidth; } double ImpHvacReducer::GetEndLineWidth() const { ASSERT(NULL != m_pXDataMap); double dWidth(0.0); m_pXDataMap->GetAt(HVAC_EndWidth, dWidth); return dWidth; } double ImpHvacReducer::GetPlusEdge() const { return 0.0; } AcGePoint3d ImpHvacReducer::GetEndPtAuto() { ASSERT(NULL != m_pXDataMap); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtEnd, vtOffset; double dPlus(0.0); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_StartDir, vtEnd); m_pXDataMap->GetAt(HRED_Offset, vtOffset); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlus); vtEnd *= -1; double dSizeSub = GetMaxSizeSub(); double dHoriLen = dSizeSub * 1.5 + MayAsMUnit(100); if (dHoriLen < MayAsMUnit(200.0)) dHoriLen = MayAsMUnit(200.0); ptEnd = ptStart + (dHoriLen + dPlus * 2) * vtEnd; ptEnd += vtOffset; return ptEnd; } // 不支持既不同心又没有一边对其情况心情况 AcGePoint3d ImpHvacReducer::GetEndPtByangle() { ASSERT(NULL != m_pXDataMap); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtEnd, vtOffset; double dSizeSub(0.0), dPlus(0.0), dAngle(0.0); m_pXDataMap->GetAt(HRED_Angle, dAngle); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_StartDir, vtEnd); m_pXDataMap->GetAt(HRED_Offset, vtOffset); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlus); dSizeSub = GetMaxSizeSub(); vtEnd *= -1; double dHoriLen(0.0); if (vtOffset.length() < 1e-3) // 同心 dHoriLen = dSizeSub * 0.5 / tan(dAngle*0.5); else dHoriLen = dSizeSub / tan(dAngle); double dAllDist = dHoriLen + dPlus * 2; if (dAllDist < MayAsMUnit(200)) // 避免天圆地方是看不出来 dAllDist = MayAsMUnit(200); ptEnd = ptStart + dAllDist * vtEnd; ptEnd += vtOffset; return ptEnd; } AcGePoint3d ImpHvacReducer::GetEndPtByLen() { ASSERT(NULL != m_pXDataMap); double dLen(0.0); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtEnd, vtOffset; m_pXDataMap->GetAt(HRED_Length, dLen); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(HRED_StartDir, vtEnd); vtEnd *= -1; if (dLen < MayAsMUnit(200)) dLen = MayAsMUnit(200); vtOffset = ptEnd - ptStart; vtOffset = vtOffset.orthoProject(vtEnd); ptEnd = ptStart + dLen * vtEnd; ptEnd += vtOffset; return ptEnd; } double ImpHvacReducer::GetMaxSizeSub() { ESection eStartSect = eRect; ESection eEndSect = eRect; double dStartWidth(0.0), dEndWidth(0.0), dStartThick(0.0), dEndThick(0.0), dMaxSizeSub(0.0); m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSect); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSect); m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_StartThick, dStartThick); m_pXDataMap->GetAt(HRED_EndThick, dEndThick); if (eStartSect == eEndSect) { double dWidthSub = fabs(dStartWidth - dEndWidth); if (eStartSect == eRect) { double dThickSub = fabs(dStartThick - dEndThick); dMaxSizeSub = dWidthSub > dThickSub ? dWidthSub:dThickSub; } else { dMaxSizeSub = dWidthSub; } } else { if (eStartSect == eRect) { double dWidthSub = fabs(dStartWidth - dEndWidth); double dThickSub = fabs(dStartThick - dEndWidth); dMaxSizeSub = dWidthSub > dThickSub ? dWidthSub:dThickSub; } else { double dWidthSub = fabs(dStartWidth - dEndWidth); double dThickSub = fabs(dStartWidth - dEndThick); dMaxSizeSub = dWidthSub > dThickSub ? dWidthSub:dThickSub; } } return dMaxSizeSub; } AcGeVector3d ImpHvacReducer::normal() const { return AcGeVector3d::kZAxis; } BOOL ImpHvacReducer::GetInterfaceSizeData(int nIndex, AecInterface& inf) const { if(NULL == m_pXDataMap) return FALSE; // 获取截面类型 ESection eSectType = eRect; // 获取接口截面、宽度、厚度数据key值 LPCTSTR pszWidthKey, pszThickKey; switch (nIndex) { case 0: m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSectType); pszWidthKey = ((eCircle == eSectType) ? HRED_StartDiameter : HRED_StartWidth); pszThickKey = HRED_StartThick; break; case 1: m_pXDataMap->GetAt(HRED_EndSectType, (int&)eSectType); pszWidthKey = ((eCircle == eSectType) ? HRED_EndDiameter : HRED_EndWidth); pszThickKey = HRED_EndThick; break; default: return FALSE; } // 获取尺寸 double dWidth = 0.0, dThick = 0.0; m_pXDataMap->GetAt(pszWidthKey, dWidth); m_pXDataMap->GetAt(pszThickKey, dThick); // 设置接口数据 inf.nSectType = eSectType; inf.dSize1 = dWidth; inf.dSize2 = dThick; return TRUE; } bool ImpHvacReducer::GetInterface(AcArray& arInfs) const { if (NULL == m_pXDataMap) return false; // 获取变径各点位置 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // 求两端方向 AcGeVector3d vtStart = GetSectNormal(); AcGeVector3d vtEnd = -vtStart; AecInterface inf; inf.idOwner = m_pOwnerEnt->objectId(); for (int nIndex = 0;nIndex < 2;nIndex++) { switch(nIndex) { case 0: { inf.vtDir = vtStart; inf.ptPos = ptStart; GetInterfaceSizeData(nIndex, inf); break; } case 1: { inf.vtDir = vtEnd; inf.ptPos = ptEnd; GetInterfaceSizeData(nIndex, inf); break; } default: break; } arInfs.append(inf); } return true; }