#include "stdafx.h" #include "ImpHvacCross.h" #include "AecDbObjXDataMap.h" #include "AuxTools.h" #include "math.h" #include "AecDbEntityBase.h" static const Adesk::UInt16 kColorByLayer = 256; extern double MayAsMUnit(double dVal); double g_dCmdOff = 100; ImpHvacCross::ImpHvacCross() { m_pXDataMap = NULL; m_pOwnerEnt = NULL; } ImpHvacCross::~ImpHvacCross() { } AcGeVector3d ImpHvacCross::normal() const { ASSERT(NULL != m_pXDataMap); AcGeVector3d vtStart, vtBr1; m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); return vtStart.crossProduct(vtBr1); } double ImpHvacCross::GetEdgeLineWidth() const { ASSERT(NULL != m_pXDataMap); double dWidth(0.0); m_pXDataMap->GetAt(HVAC_EdgeWidth, dWidth); return dWidth; } double ImpHvacCross::GetCentLineWidth() const { ASSERT(NULL != m_pXDataMap); double dWidth(0.0); m_pXDataMap->GetAt(HVAC_CentWidth, dWidth); return dWidth; } double ImpHvacCross::GetEndLineWidth() const { ASSERT(NULL != m_pXDataMap); double dWidth(0.0); m_pXDataMap->GetAt(HVAC_EndWidth, dWidth); return dWidth; } BOOL ImpHvacCross::SetSingleDashWidth(double& dSta,double& dEnd,double& dBr1,double& dBr2) const { ASSERT(NULL != m_pXDataMap); if (!IsSingleLine()) { return FALSE; } double dSingleWidth(0.0); m_pXDataMap->GetAt(KEY_HIDEWIDTH, dSingleWidth); if (dSingleWidth > 0) { dSta = dEnd = dBr1 = dBr2 = dSingleWidth; return TRUE; } return FALSE; } void ImpHvacCross::list() const { ASSERT(NULL != m_pXDataMap); // 管件类型 acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 暖通:四通")); // 截面类型 ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); switch (eSectType) { case eRect: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 截面:矩形")); break; case eCircle:acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 截面:圆形")); break; case eOblate:acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 截面:扁圆形")); break; } double dRadRatio = 0.0; m_pXDataMap->GetAt(HCRS_RadRatio, dRadRatio); acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t曲率值:%.2f"), dRadRatio); // 圆型截面显示直径 if (eCircle == eSectType) { double dStartDiameter = 0.0, dEndDiameter = 0.0; m_pXDataMap->GetAt(HCRS_StartDiameter, dStartDiameter); m_pXDataMap->GetAt(HCRS_EndDiameter, dEndDiameter); acutPrintf(_T("\n\t\t\t\t\t\t\t\t始端直径:%.2f 末端直径:%.2f"), dStartDiameter, dEndDiameter); double dBranch1Diameter = 0.0, dBranch2Diameter = 0.0; m_pXDataMap->GetAt(HCRS_Branch1Diameter, dBranch1Diameter); m_pXDataMap->GetAt(HCRS_Branch2Diameter, dBranch2Diameter); acutPrintf(_T("\n\t\t\t\t\t\t\t\t支管1直径:%.2f 支管2直径:%.2f"), dBranch1Diameter, dBranch2Diameter); } // 非圆型截面显示宽度和厚度 else { double dStartWidth = 0.0, dEndWidth = 0.0, dThick = 0.0; m_pXDataMap->GetAt(HCRS_StartWidth, dStartWidth); m_pXDataMap->GetAt(HCRS_EndWidth, dEndWidth); m_pXDataMap->GetAt(HCRS_Thick, dThick); acutPrintf(_T("\n\t\t\t\t\t\t\t\t始端宽度:%.2f 末端宽度:%.2f 厚度:%.2f"), dStartWidth, dEndWidth, dThick); double dBranchWidth = 0.0, dBranchThick = 0.0; m_pXDataMap->GetAt(HCRS_Branch1Width, dBranchWidth); m_pXDataMap->GetAt(HCRS_Branch1Thick, dBranchThick); acutPrintf(_T("\n\t\t\t\t\t\t\t\t支管1宽度:%.2f 支管1厚度:%.2f"), dBranchWidth, dBranchThick); m_pXDataMap->GetAt(HCRS_Branch2Width, dBranchWidth); m_pXDataMap->GetAt(HCRS_Branch2Thick, dBranchThick); acutPrintf(_T("\n\t\t\t\t\t\t\t\t支管2宽度:%.2f 支管2厚度:%.2f"), dBranchWidth, dBranchThick); } // 起点 AcGePoint3d pt; m_pXDataMap->GetAt(HCRS_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(HCRS_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); // 支管1 m_pXDataMap->GetAt(HCRS_BranchPoint1, pt); acutPrintf(_T("\n\t\t\t\t\t\t\t\t支管1,X=%.4f\t Y=%.4f\t Z=%.4f"), pt.x, pt.y, pt.z); // 支管2 m_pXDataMap->GetAt(HCRS_BranchPoint2, pt); acutPrintf(_T("\n\t\t\t\t\t\t\t\t支管2,X=%.4f\t Y=%.4f\t Z=%.4f"), pt.x, pt.y, pt.z); } BOOL ImpHvacCross::IsHorzAlignment() const { // 获得法向量 AcGeVector3d vtStart, vtBr1; m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); AcGeVector3d vtNormal = AcGeVector3d::kZAxis; vtNormal = vtStart.crossProduct(vtBr1); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); AcGeTol tolTmp; tolTmp.setEqualVector(1); tolTmp.setEqualPoint(1); return vtNormal.isParallelTo(vtZAxis, tolTmp); } BOOL ImpHvacCross::IsVertAlignment() const { // 获得法向量 AcGeVector3d vtStart, vtBr1; m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); AcGeVector3d vtNormal = AcGeVector3d::kZAxis; vtNormal = vtStart.crossProduct(vtBr1); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); return vtNormal.isPerpendicularTo(vtZAxis); } BOOL ImpHvacCross::IsStartVertAlignment() const { // 获得法向量 AcGeVector3d vtStart, vtBr1; m_pXDataMap->GetAt(HCRS_StartDir, vtStart); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); return vtStart.isPerpendicularTo(vtZAxis); } BOOL ImpHvacCross::IsBr1VertAlignment() const { // 获得法向量 AcGeVector3d vtStart, vtBr1; m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); return vtStart.isParallelTo(vtZAxis); } BOOL ImpHvacCross::IsSingleLine() const { ASSERT(NULL != m_pXDataMap); BOOL bSingleLine = FALSE; m_pXDataMap->GetAt(HVAC_IsSingleLine, (int&)bSingleLine); return bSingleLine; } BOOL ImpHvacCross::HasBaseLine() const { ASSERT(NULL != m_pXDataMap); BOOL bHasBaseLIne = FALSE; m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLIne); return bHasBaseLIne; } AcGeVector3d ImpHvacCross::GetSectNormal() const { ASSERT(NULL != m_pXDataMap); // 获取四通各点位置 double dOffset = 0.0; AcGeVector3d vtStart, vtBr1; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); AcGeVector3d vtTmp = vtStart.crossProduct(vtBr1); vtTmp.normalize(); return vtTmp; } int ImpHvacCross::AbleConnect(AcGeLine3d line1, AcGeLine3d line2,double dTick1, double dThick2) const { double dMaxDis = fabs(dTick1 - dThick2) / 2.0; AcGePoint3d ptInLine1, ptInLine2; line1.projIntersectWith(line2, normal(), ptInLine1, ptInLine2); double dDis = ptInLine1.distanceTo(ptInLine2); if (dDis > dMaxDis) return 0; // 不能生成四通 else if (dDis > 0.0) return 1; // 中心线不等高,但可以生成四通 else if (dDis == 0.0) return 2; // 中心线等高 else return -1; // 失败 } BOOL ImpHvacCross::IsValidConst() const { if (NULL == m_pXDataMap) return FALSE; AcGePoint3d ptStart, ptEnd, ptBr1, ptBr2; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); AcGeVector3d vtNornal = normal(); AcGeVector3d vtStart, vtEnd, vtBr1, vtBr2; m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); double dSThick = 0, dEThick = 0, dBThick1 = 0, dBThick2 = 0; m_pXDataMap->GetAt(HCRS_Thick, dSThick); m_pXDataMap->GetAt(HCRS_EndThick, dEThick); m_pXDataMap->GetAt(HCRS_Branch1Thick, dBThick1); m_pXDataMap->GetAt(HCRS_Branch2Thick, dBThick2); AecHvac::HvacCrossType eTeeType(AecHvac::eOrthoCross); AecHvac::HvacSectType eSectType(AecHvac::eRectangular); m_pXDataMap->GetAt(HCRS_Type, (int &)eTeeType); m_pXDataMap->GetAt(HVAC_SectType, (int &)eSectType); BOOL bIsIntubCross = (eTeeType == AecHvac::eInsertCross || eTeeType == AecHvac::eInsertIntubCross || eTeeType == AecHvac::eArcuateIntubCross); // 构造与四通接口方向一致的四条线 AcGePoint3d ptStartStart = ptStart - vtStart * 500; AcGePoint3d ptStartEnd = ptStart + vtStart * 500; AcGePoint3d ptEndStart = ptEnd - vtEnd * 500; AcGePoint3d ptEndEnd = ptEnd + vtEnd * 500; AcGePoint3d ptBr1Start = ptBr1 - vtBr1 * 500; AcGePoint3d ptBr1End = ptBr1 + vtBr1 * 500; AcGePoint3d ptBr2Start = ptBr2 - vtBr2 * 500; AcGePoint3d ptBr2End = ptBr2 + vtBr2 * 500; AcGeLine3d lineStart(ptStartStart, ptStartEnd); AcGeLine3d lineEnd(ptEndStart, ptEndEnd); AcGeLine3d lineBr1(ptBr1Start, ptBr1End); AcGeLine3d lineBr2(ptBr2Start, ptBr2End); AcGePlane planSta(ptStart, normal()); AcGePlane planEnd(ptEnd, normal()); AcGePoint3d ptInt; if (!bIsIntubCross && (1e-6 < fabs(dSThick + dEThick - dBThick1 - dBThick2) || 1e-6 < fabs(dSThick + dBThick1 - dEThick - dBThick2))) { return FALSE; } if (!lineBr1.intersectWith(lineStart, ptInt)) { if (eSectType == eRect && bIsIntubCross && 1 == AbleConnect(lineStart, lineBr1, dSThick, dBThick1)) { ptBr1Start = ptBr1Start.orthoProject(planSta); ptBr1End = ptBr1End.orthoProject(planSta); lineBr1.set(ptBr1Start, ptBr1End); if (!lineStart.intersectWith(lineBr1, ptInt)) { return FALSE; } } else { return FALSE; } } if (!lineBr1.intersectWith(lineEnd, ptInt)) { if (eSectType == eRect && bIsIntubCross) { AcGePoint3d ptStartThirdCom = ptBr1Start; AcGePoint3d ptEndThirdCom = ptBr1End; ptStartThirdCom = ptStartThirdCom.orthoProject(planEnd); ptEndThirdCom = ptEndThirdCom.orthoProject(planEnd); AcGeLine3d lineThirdCom; lineThirdCom.set(ptStartThirdCom, ptEndThirdCom); if (!lineEnd.intersectWith(lineThirdCom, ptInt)) { return FALSE; } } else { return FALSE; } } if (!lineBr2.intersectWith(lineStart, ptInt)) { if (eSectType == eRect && bIsIntubCross && 1 == AbleConnect(lineStart, lineBr2, dSThick, dBThick2)) { ptBr2Start = ptBr2Start.orthoProject(planSta); ptBr2End = ptBr2End.orthoProject(planSta); lineBr2.set(ptBr2Start, ptBr2End); if (!lineStart.intersectWith(lineBr2, ptInt)) { return FALSE; } } else { return FALSE; } } if (!lineBr2.intersectWith(lineEnd, ptInt)) { if (eSectType == eRect && bIsIntubCross) { AcGePoint3d ptStartFourthCom = ptBr2Start; AcGePoint3d ptEndFourthCom = ptBr2End; ptStartFourthCom = ptStartFourthCom.orthoProject(planEnd); ptEndFourthCom = ptEndFourthCom.orthoProject(planEnd); AcGeLine3d lineThirdCom; lineThirdCom.set(ptStartFourthCom, ptEndFourthCom); if (!lineEnd.intersectWith(lineThirdCom, ptInt)) { return FALSE; } } else { return FALSE; } } return TRUE; } Acad::ErrorStatus ImpHvacCross::Draw3d(AcGiDraw &mode) const { if (NULL == m_pXDataMap) return Acad::eNotImplementedYet; int nColorIndexOld = mode.GetColor(); // 四通类型 AecHvac::HvacCrossType eCrossType = AecHvac::eOrthoCross; m_pXDataMap->GetAt(HCRS_Type, (int&)eCrossType); ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); if (!IsValidConst() && eRect == eSectType) { DrawSpecial3d(mode); return Acad::eOk; } switch(eCrossType) { // 普通 case AecHvac::eOrthoCross: DrawOrthoCross3d(mode); break; // 承插 case AecHvac::eInsertCross: case AecHvac::eInsertIntubCross: DrawInsertCross3d(mode); break; // 斜接 case AecHvac::eInclineCross: DrawInclineCross3d(mode); break; // 圆角 case AecHvac::eArcuateCross: case AecHvac::eArcuateIntubCross: DrawArcuateCross3d(mode); break; // 直角 case AecHvac::eLinearCross: DrawLinearCross3d(mode); break; // 交叉 case AecHvac::eInterCross: DrawInterCross3d(mode); break; } mode.SetColor(nColorIndexOld); return Acad::eOk; } BOOL ImpHvacCross::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 ImpHvacCross::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 ImpHvacCross::Move3DBuffer(AcDbVoidPtrArray& ar3DBuffer) const { if (!m_ar3DDrableBufPtrs_.isEmpty()) { ar3DBuffer.append(m_ar3DDrableBufPtrs_); m_ar3DDrableBufPtrs_.removeAll(); } } bool ImpHvacCross::Has3DBuffer() const { return !m_ar3DDrableBufPtrs_.isEmpty(); } Acad::ErrorStatus ImpHvacCross::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 ImpHvacCross::MakeCurves(AecComplexCurve& cplCurve) const { if (NULL == m_pXDataMap) return FALSE; // 四通类型 AecHvac::HvacCrossType eCrossType = AecHvac::eOrthoCross; m_pXDataMap->GetAt(HCRS_Type, (int&)eCrossType); int nIsSingleLine = 0; m_pXDataMap->GetAt(HVAC_IsSingleLine, nIsSingleLine); int nType = 0; //单线形式直接return if (1 == nIsSingleLine) { return FALSE; } switch(eCrossType) { // 普通 case AecHvac::eOrthoCross: MakeOrthoCross2dCurves(cplCurve,nType); break; // 承插 case AecHvac::eInsertCross: MakeInsertCross2dCurves(cplCurve,nType); break; // 承插(插管式) case AecHvac::eInsertIntubCross: MakeInsertCross2dCurves(cplCurve,nType, TRUE); break; // 斜接 case AecHvac::eInclineCross: MakeInclineCross2dCurves(cplCurve,nType); break; // 圆角 case AecHvac::eArcuateCross: MakeArcuateCross2dCurves(cplCurve,nType); break; // 圆角(插管) case AecHvac::eArcuateIntubCross: MakeArcuateCross2dCurves(cplCurve,nType, TRUE); break; // 直角 case AecHvac::eLinearCross: MakeLinearCross2dCurves(cplCurve,nType); break; // 交叉 case AecHvac::eInterCross: MakeInterCross2dCurves(cplCurve,nType); break; } return cplCurve.length() > 0; } BOOL ImpHvacCross::GetCurvesInSide(AecComplexCurve& compCurve) const { if (NULL == m_pXDataMap) return FALSE; // 四通类型 AecHvac::HvacCrossType eCrossType = AecHvac::eOrthoCross; m_pXDataMap->GetAt(HCRS_Type, (int&)eCrossType); int nType = 1; switch(eCrossType) { // 普通 case AecHvac::eOrthoCross: MakeOrthoCross2dCurves(compCurve,nType); break; // 承插 case AecHvac::eInsertCross: case AecHvac::eInsertIntubCross: MakeInsertCross2dCurves(compCurve,nType); break; // 斜接 case AecHvac::eInclineCross: MakeInclineCross2dCurves(compCurve,nType); break; // 圆角 case AecHvac::eArcuateCross: case AecHvac::eArcuateIntubCross: MakeArcuateCross2dCurves(compCurve,nType); break; // 直角 case AecHvac::eLinearCross: MakeLinearCross2dCurves(compCurve,nType); break; // 交叉 case AecHvac::eInterCross: MakeInterCross2dCurves(compCurve,nType); break; } return compCurve.length() > 0; } AecEqui::Position ImpHvacCross::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::eBr1; break; case 3: ePos = AecEqui::eBr2; break; case 4: ePos = AecEqui::eCommand0; break; case 5: ePos = AecEqui::eCommand1; break; case 6: ePos = AecEqui::eCommand2; break; case 7: ePos = AecEqui::eCommand3; } return ePos; } Acad::ErrorStatus ImpHvacCross::transformBy(const AcGeMatrix3d& xform) { if (NULL == m_pXDataMap) return Acad::eNotApplicable; // 获取四通各点位置 AcGePoint3d ptStart,ptEnd,ptBr1,ptBr2; AcGeVector3d vtStart,vtEnd,vtBr1,vtBr2; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); // 变换位置 ptStart.transformBy(xform); ptEnd.transformBy(xform); ptBr1.transformBy(xform); ptBr2.transformBy(xform); vtStart.transformBy(xform); vtEnd.transformBy(xform); vtBr1.transformBy(xform); vtBr2.transformBy(xform); vtStart.normalize(); vtEnd.normalize(); vtBr1.normalize(); vtBr2.normalize(); // 设置尺寸 double dScale = xform.scale(); double dStaWidth(0.0), dEndWidth(0.), dThick(0.0), dBran1Width(0.0), dBran2Width(0.0), dBran1Thick(0.0), dBran2Thick(0.0); m_pXDataMap->GetAt(HCRS_StartWidth, dStaWidth); m_pXDataMap->GetAt(HCRS_EndWidth, dEndWidth); m_pXDataMap->GetAt(HCRS_Branch1Width, dBran1Width); m_pXDataMap->GetAt(HCRS_Branch2Width, dBran2Width); m_pXDataMap->GetAt(HCRS_Thick, dThick); m_pXDataMap->GetAt(HCRS_Branch1Thick, dBran1Thick); m_pXDataMap->GetAt(HCRS_Branch2Thick, dBran1Thick); dStaWidth *= dScale; dEndWidth *= dScale; dBran1Width *= dScale; dBran2Width *= dScale; dThick *= dScale; dBran1Thick *= dScale; dBran2Thick *= dScale; m_pXDataMap->SetAt(HCRS_StartWidth, dStaWidth); m_pXDataMap->SetAt(HCRS_EndWidth, dEndWidth); m_pXDataMap->SetAt(HCRS_Branch1Width, dBran1Width); m_pXDataMap->SetAt(HCRS_Branch2Width, dBran2Width); m_pXDataMap->SetAt(HCRS_Thick, dThick); m_pXDataMap->SetAt(HCRS_Branch1Thick, dBran1Thick); m_pXDataMap->SetAt(HCRS_Branch2Thick, dBran1Thick); // 更新点 m_pXDataMap->SetAt(HCRS_StartPoint, ptStart); m_pXDataMap->SetAt(HCRS_StartDir, vtStart); m_pXDataMap->SetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->SetAt(HCRS_EndDir, vtEnd); m_pXDataMap->SetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->SetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->SetAt(HCRS_BranchPoint2, ptBr2); m_pXDataMap->SetAt(HCRS_BranchDir2, vtBr2); return Acad::eOk; } Acad::ErrorStatus ImpHvacCross::getStretchPoints(AcGePoint3dArray& stretchPoints) const { if (NULL == m_pXDataMap) return Acad::eNotApplicable; // 取得位置点 AcGePoint3d ptStart, ptEnd, ptBr1, ptBr2; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); stretchPoints.append(ptStart); stretchPoints.append(ptEnd); stretchPoints.append(ptBr1); stretchPoints.append(ptBr2); return Acad::eOk; } Acad::ErrorStatus ImpHvacCross::getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { if (NULL == m_pXDataMap) return Acad::eNotApplicable; // 获取四通各点位置 AcGePoint3d ptStart,ptEnd,ptBr1,ptBr2; AcGeVector3d vtStart,vtEnd,vtBr1,vtBr2; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); //夹点 gripPoints.append(ptStart); gripPoints.append(ptEnd); gripPoints.append(ptBr1); gripPoints.append(ptBr2); //增加4个命令夹点 vtStart.normalize(); vtEnd.normalize(); vtBr1.normalize(); vtBr2.normalize(); gripPoints.append(ptStart + vtStart * g_dCmdOff); //cmd0 gripPoints.append(ptEnd + vtEnd * g_dCmdOff); //cmd1 gripPoints.append(ptBr1 + vtBr1 * g_dCmdOff); //cmd2 gripPoints.append(ptBr2 + vtBr2 * g_dCmdOff); //cmd3 return Acad::eOk; } Acad::ErrorStatus ImpHvacCross::getOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const { if (NULL == m_pXDataMap) return Acad::eNotApplicable; // 获取四通各点位置 AcGePoint3d ptStart,ptEnd,ptBr1,ptBr2; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); // 根据捕捉模式处理 switch(osnapMode) { case AcDb::kOsModeEnd: snapPoints.append(ptStart); snapPoints.append(ptEnd); snapPoints.append(ptBr1); snapPoints.append(ptBr2); break; case AcDb::kOsModeMid: break; case AcDb::kOsModeCen: break; case AcDb::kOsModePerp: break; case AcDb::kOsModeNear: break; } return Acad::eOk; } // 7━━━━━6 // ┃ ┃ ┃ // ┃ ┃ ┃ // ┃ ┃ ┃ // ┃ ┃ ┃ // 0━━━━┛ ┃ ┗━━━━5 // ┃ ┃ ┃ // ┃ ┃ ┃ // ━━━━━━━━━━━━━━━━ // ┃ ┃ ┃ // ┃ ┃ ┃ // 1━━━━┓ ┃ ┏━━━━4 // ┃ ┃ ┃ // ┃ ┃ ┃ // ┃ ┃ ┃ // ┃ ┃ ┃ // 2━━━━━3 BOOL ImpHvacCross::DrawSpecial3d(AcGiDraw &mode) const { ASSERT(NULL != m_pXDataMap); AcGePoint3dArray arptUp, arptDown; if (!GetInterfaceKeyPt(arptUp, arptDown)) { return FALSE; } // 上面 AcGePoint3d ptArUpPoly[4] = {arptUp[0], arptUp[1], arptUp[5], arptUp[4]}; // 下面 AcGePoint3d ptArDownPoly[4] = {arptDown[0], arptDown[1], arptDown[5], arptDown[4]}; // 支管1左侧 AcGePoint3d ptArBranLeft1[4] = {arptUp[1], arptDown[1], arptUp[2], arptDown[2]}; // 支管1右侧 AcGePoint3d ptArBranRight1[4] = {arptUp[3], arptDown[3], arptUp[4], arptDown[4]}; // 支管1上 AcGePoint3d ptArBranUp1[4] = {arptUp[1], arptUp[2], arptUp[4], arptUp[3]}; // 支管1下 AcGePoint3d ptArBranDown1[4] = {arptDown[1], arptDown[2], arptDown[4], arptDown[3]}; // 支管2左侧 AcGePoint3d ptArBranLeft2[4] = {arptUp[5], arptDown[5], arptUp[6], arptDown[6]}; // 支管2右侧 AcGePoint3d ptArBranRight2[4] = {arptUp[7], arptDown[7], arptUp[0], arptDown[0]}; // 支管2上 AcGePoint3d ptArBranUp2[4] = {arptUp[5], arptUp[6], arptUp[0], arptUp[7]}; // 支管2下 AcGePoint3d ptArBranDown2[4] = {arptDown[5], arptDown[6], arptDown[0], arptDown[7]}; DrawMesh(mode,2, 2, ptArUpPoly); DrawMesh(mode,2, 2, ptArDownPoly); DrawMesh(mode,2, 2, ptArBranLeft1); DrawMesh(mode,2, 2, ptArBranRight1); DrawMesh(mode,2, 2, ptArBranUp1); DrawMesh(mode,2, 2, ptArBranDown1); DrawMesh(mode,2, 2, ptArBranLeft2); DrawMesh(mode,2, 2, ptArBranRight2); DrawMesh(mode,2, 2, ptArBranUp2); DrawMesh(mode,2, 2, ptArBranDown2); return TRUE; } //3维模型 void ImpHvacCross::DrawOrthoCross3d(AcGiDraw &mode) const { ASSERT(NULL != m_pXDataMap); ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType,(int&)eSectType); //方截面 if (eSectType == eRect) { double dThick = 200.0; m_pXDataMap->GetAt(HCRS_Thick, dThick); AcGeVector3d vtNor = GetSectNormal(); AcGePoint3dArray arPts,arPtsU,arPtsD,arptSides; GetCrossPts(arPts,FALSE,TRUE); AcGeMatrix3d mat; vtNor.normalize(); vtNor *= dThick * 0.5; mat.setToTranslation(vtNor); //从第8个点开始把所有点向下偏移半个厚度 for (int i = 8; i < arPts.length(); i++) { arPtsU.append(arPts[i].transformBy(mat)); } vtNor.normalize(); vtNor *= -dThick; mat.setToTranslation(vtNor); //从第8个点开始把所有点向上偏移半个厚度 for (i = 8; i < arPts.length(); i++) { arPtsD.append(arPts[i].transformBy(mat)); } //开始面 arptSides.append(arPtsU[0]); arptSides.append(arPtsU[11]); arptSides.append(arPtsD[11]); arptSides.append(arPtsD[0]); arptSides.append(arPtsU[0]); //交点面S arptSides.append(arPtsU[1]); arptSides.append(arPtsU[10]); arptSides.append(arPtsD[10]); arptSides.append(arPtsD[1]); arptSides.append(arPtsU[1]); //交点面E arptSides.append(arPtsU[4]); arptSides.append(arPtsU[7]); arptSides.append(arPtsD[7]); arptSides.append(arPtsD[4]); arptSides.append(arPtsU[4]); //末点面 arptSides.append(arPtsU[5]); arptSides.append(arPtsU[6]); arptSides.append(arPtsD[6]); arptSides.append(arPtsD[5]); arptSides.append(arPtsU[5]); DrawMesh(mode,4, 5, arptSides.asArrayPtr()); arptSides.setLogicalLength(0); //Br1面 arptSides.append(arPtsU[2]); arptSides.append(arPtsU[3]); arptSides.append(arPtsD[3]); arptSides.append(arPtsD[2]); arptSides.append(arPtsU[2]); //交点面Br1 arptSides.append(arPtsU[1]); arptSides.append(arPtsU[4]); arptSides.append(arPtsD[4]); arptSides.append(arPtsD[1]); arptSides.append(arPtsU[1]); DrawMesh(mode,2, 5, arptSides.asArrayPtr()); arptSides.setLogicalLength(0); //Br2面 arptSides.append(arPtsU[8]); arptSides.append(arPtsU[9]); arptSides.append(arPtsD[9]); arptSides.append(arPtsD[8]); arptSides.append(arPtsU[8]); //交点面Br2 arptSides.append(arPtsU[7]); arptSides.append(arPtsU[10]); arptSides.append(arPtsD[10]); arptSides.append(arPtsD[7]); arptSides.append(arPtsU[7]); DrawMesh(mode,2, 5, arptSides.asArrayPtr()); } //圆截面 else if (eSectType == eCircle) { AcGePoint3dArray arPts,arPtsU,arPtsD,arptSides; AcGePoint3d ptStart,ptEnd,ptBr1,ptBr2; AcGeVector3d vtStart,vtEnd,vtBr1,vtBr2; double dSWidth = 300.0, dEWidth = 300.0, dThick = 200.0, dBr1Width = 300.0, dBr2Width = 300.0; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); m_pXDataMap->GetAt(HCRS_StartWidth, dSWidth); m_pXDataMap->GetAt(HCRS_Thick, dThick); m_pXDataMap->GetAt(HCRS_EndWidth, dEWidth); m_pXDataMap->GetAt(HCRS_Branch1Width, dBr1Width); m_pXDataMap->GetAt(HCRS_Branch2Width, dBr2Width); double dMinDiffAng = TAuxTools::GetMinDiffAngle(); //按照90°弯头分成nSect1个圆截面,每个圆截面分成nSect个点 int nSect = int(PI * 2 / dMinDiffAng); AcGeVector3d vtNor; vtNor = vtStart.crossProduct(vtBr1); vtNor.normalize(); //Start到End点 AcGePoint3d pt, ptInter; pt = ptStart + vtNor * dSWidth * 0.5; for (int i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtStart,ptStart)); } pt = ptEnd + vtNor * dEWidth * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtStart,ptEnd)); } DrawMesh(mode,2, nSect + 1 , arptSides.asArrayPtr()); //Br1 arptSides.setLogicalLength(0); pt = ptBr1 + vtNor * dBr1Width * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtBr1,ptBr1)); } GetIntersectWith(ptStart, ptBr1, vtStart, vtBr1, ptInter); pt = ptInter + vtNor * dBr1Width * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtBr1,ptInter)); } DrawMesh(mode,2, nSect + 1 , arptSides.asArrayPtr()); //Br2 arptSides.setLogicalLength(0); pt = ptBr2 + vtNor * dBr2Width * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtBr2,ptBr2)); } GetIntersectWith(ptStart, ptBr2, vtStart, vtBr2, ptInter); pt = ptInter + vtNor * dBr2Width * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtBr2,ptInter)); } DrawMesh(mode,2, nSect + 1 , arptSides.asArrayPtr()); } } // 承插 void ImpHvacCross::DrawInsertCross3d(AcGiDraw &mode) const { ASSERT(NULL != m_pXDataMap); ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType,(int&)eSectType); AcGeVector3d vtStart = AcGeVector3d::kIdentity; AcGeVector3d vtBr1 = AcGeVector3d::kIdentity; AcGeVector3d vtBr2 = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); AcGeVector3d vtEnd = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); // 矩形口 if (eSectType == eRect) { double dThick = 200.0; m_pXDataMap->GetAt(HCRS_Thick, dThick); double dThickSub = 200.0; if (!m_pXDataMap->GetAt(KEY_EndThick, dThickSub)) { dThickSub = dThick; } double dBrThick1 = 0.0; double dBrThick2 = 0.0; m_pXDataMap->GetAt(HCRS_Branch1Thick, dBrThick1); m_pXDataMap->GetAt(HCRS_Branch2Thick, dBrThick2); AcGePoint3d ptSta, ptBran1, ptBran2; m_pXDataMap->GetAt(HCRS_StartPoint, ptSta); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBran1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBran2); AcGeVector3d vtNor = GetSectNormal(); AcGePlane planSta(ptSta, vtNor); AcGePoint3d ptEnd; m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); AcGePlane planEnd(ptEnd, vtNor); AcGePlane planBr1(ptBran1, vtNor); AcGePlane planBr2(ptBran2, vtNor); AcGePoint3dArray arPts,arPtsU,arPtsD,arptSides; GetCrossPts(arPts,FALSE,TRUE); // ?÷ì?μ? AcGePoint3dArray arPtsMajor, arPtsBr; arPtsMajor.append(arPts[8]); AcGePoint3d ptTmp = AcGePoint3d::kOrigin; ptTmp = arPts[8] - vtStart * 50.0; arPtsMajor.append(ptTmp); ptTmp = arPts[12]; ptTmp = ptTmp.orthoProject(planSta); arPtsMajor.append(ptTmp); arPtsMajor.append(arPts[13]); arPtsMajor.append(arPts[14]); ptTmp = arPts[15]; ptTmp = ptTmp.orthoProject(planSta); arPtsMajor.append(ptTmp); ptTmp = arPts[19] - vtStart * 50.0; arPtsMajor.append(ptTmp); arPtsMajor.append(arPts[19]); // ·??§μ? arPtsBr.append(arPts[11]); ptTmp = arPts[11] - vtBr1 * 50.0; arPtsBr.append(ptTmp); arPtsBr.append(arPts[12]); ptTmp = arPts[8] - vtStart * 50.0; ptTmp = ptTmp.orthoProject(planBr1); arPtsBr.append(ptTmp); ptTmp = arPts[10] - vtBr1 * 50.0; arPtsBr.append(ptTmp); arPtsBr.append(arPts[10]); arPtsBr.append(arPts[17]); ptTmp = arPts[17] - vtBr2 * 50.0; arPtsBr.append(ptTmp); ptTmp = arPts[19] - vtStart * 50.0; ptTmp = ptTmp.orthoProject(planBr2); arPtsBr.append(ptTmp); arPtsBr.append(arPts[15]); ptTmp = arPts[16] - vtBr2 * 50.0; arPtsBr.append(ptTmp); arPtsBr.append(arPts[16]); AcGeMatrix3d mat; vtNor.normalize(); vtNor *= dThick * 0.5; mat.setToTranslation(vtNor); AcGeMatrix3d matSub; vtNor.normalize(); vtNor *= dThickSub * 0.5; matSub.setToTranslation(vtNor); int i = 0; AcGePoint3dArray arPtsMajorU, arPtsMajorD; for (i = 0; i < arPtsMajor.length(); i++) { if (2 == i || 5 == i || 3 == i || 4 == i) { arPtsMajor[i] = arPtsMajor[i].orthoProject(planEnd); arPtsMajorU.append(arPtsMajor[i].transformBy(matSub)); } else { arPtsMajorU.append(arPtsMajor[i].transformBy(mat)); } } vtNor.normalize(); vtNor *= -dThick; mat.setToTranslation(vtNor); vtNor.normalize(); vtNor *= dThickSub; matSub.setToTranslation(vtNor); for (i = 0; i < arPtsMajor.length(); i++) { if (2 == i || 5 == i || 3 == i || 4 == i) { arPtsMajorD.append(arPtsMajor[i].transformBy(matSub)); } else { arPtsMajorD.append(arPtsMajor[i].transformBy(mat)); } } arptSides.append(arPtsMajorU[0]); arptSides.append(arPtsMajorU[7]); arptSides.append(arPtsMajorD[7]); arptSides.append(arPtsMajorD[0]); arptSides.append(arPtsMajorU[0]); arptSides.append(arPtsMajorU[1]); arptSides.append(arPtsMajorU[6]); arptSides.append(arPtsMajorD[6]); arptSides.append(arPtsMajorD[1]); arptSides.append(arPtsMajorU[1]); arptSides.append(arPtsMajorU[2]); arptSides.append(arPtsMajorU[5]); arptSides.append(arPtsMajorD[5]); arptSides.append(arPtsMajorD[2]); arptSides.append(arPtsMajorU[2]); arptSides.append(arPtsMajorU[3]); arptSides.append(arPtsMajorU[4]); arptSides.append(arPtsMajorD[4]); arptSides.append(arPtsMajorD[3]); arptSides.append(arPtsMajorU[3]); DrawMesh(mode,4, 5, arptSides.asArrayPtr()); arptSides.setLogicalLength(0); AcGePoint3dArray arPtBrU, arPtBrD; vtNor.normalize(); vtNor *= dBrThick1 * 0.5; mat.setToTranslation(vtNor); for (i = 0; i < 6; i++) { arPtBrU.append(arPtsBr[i].transformBy(mat)); } vtNor.normalize(); vtNor *= -dBrThick1; mat.setToTranslation(vtNor); for (i = 0; i < 6; i++) { arPtBrD.append(arPtsBr[i].transformBy(mat)); } vtNor.normalize(); vtNor *= dBrThick2 * 0.5; mat.setToTranslation(vtNor); for (i = 6; i < 12; i++) { arPtBrU.append(arPtsBr[i].transformBy(mat)); } vtNor.normalize(); vtNor *= -dBrThick2; mat.setToTranslation(vtNor); for (i = 6; i < 12; i++) { arPtBrD.append(arPtsBr[i].transformBy(mat)); } arptSides.append(arPtBrU[0]); arptSides.append(arPtBrU[5]); arptSides.append(arPtBrD[5]); arptSides.append(arPtBrD[0]); arptSides.append(arPtBrU[0]); arptSides.append(arPtBrU[1]); arptSides.append(arPtBrU[4]); arptSides.append(arPtBrD[4]); arptSides.append(arPtBrD[1]); arptSides.append(arPtBrU[1]); arptSides.append(arPtBrU[2]); arptSides.append(arPtBrU[3]); arptSides.append(arPtBrD[3]); arptSides.append(arPtBrD[2]); arptSides.append(arPtBrU[2]); DrawMesh(mode,3, 5, arptSides.asArrayPtr()); arptSides.setLogicalLength(0); arptSides.append(arPtBrU[6]); arptSides.append(arPtBrU[11]); arptSides.append(arPtBrD[11]); arptSides.append(arPtBrD[6]); arptSides.append(arPtBrU[6]); arptSides.append(arPtBrU[7]); arptSides.append(arPtBrU[10]); arptSides.append(arPtBrD[10]); arptSides.append(arPtBrD[7]); arptSides.append(arPtBrU[7]); arptSides.append(arPtBrU[8]); arptSides.append(arPtBrU[9]); arptSides.append(arPtBrD[9]); arptSides.append(arPtBrD[8]); arptSides.append(arPtBrU[8]); DrawMesh(mode,3, 5, arptSides.asArrayPtr()); } if (eSectType == eCircle) { DrawOrthoCross3d(mode); } } // 斜接 void ImpHvacCross::DrawInclineCross3d(AcGiDraw &mode) const { ASSERT(NULL != m_pXDataMap); ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); if (eSectType == eRect) { // 矩形口三维画法与圆角类型类似, // 稍作修改后直接调用圆角类型的三维绘制函数 DrawArcuateCross3d(mode); } else if (eSectType == eCircle) { AcGePoint3dArray arPts; if (!GetInclineCirPts(arPts)) return; AcGePoint3dArray arPtsU,arPtsD,arptSides; AcGePoint3d ptStart,ptEnd,ptBr1,ptBr2; AcGeVector3d vtStart,vtEnd,vtBr1,vtBr2; double dSWidth = 300.0, dEWidth = 300.0, dThick = 200.0, dBr1Width = 300.0, dBr2Width = 300.0; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); m_pXDataMap->GetAt(HCRS_StartWidth, dSWidth); m_pXDataMap->GetAt(HCRS_Thick, dThick); m_pXDataMap->GetAt(HCRS_EndWidth, dEWidth); m_pXDataMap->GetAt(HCRS_Branch1Width, dBr1Width); m_pXDataMap->GetAt(HCRS_Branch2Width, dBr2Width); double dMinDiffAng = TAuxTools::GetMinDiffAngle(); //按照90°弯头分成nSect1个圆截面,每个圆截面分成nSect个点 int nSect = int(PI * 2 / dMinDiffAng); AcGeVector3d vtNor; vtNor = vtStart.crossProduct(vtBr1); vtNor.normalize(); // 主管 AcGeVector3d vtM = arPts[12] - arPts[15]; vtM.normalize(); AcGePoint3d pt = arPts[12] + vtNor * dSWidth * 0.5; for (int i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtM,arPts[12])); } pt = arPts[15] + vtNor * dEWidth * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtM,arPts[15])); } DrawMesh(mode,2, nSect + 1 , arptSides.asArrayPtr()); // 主管直边 arptSides.setLogicalLength(0); pt = arPts[0] + vtNor * dSWidth * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtStart,arPts[0])); } pt = arPts[12] + vtNor * dSWidth * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtStart,arPts[12])); } DrawMesh(mode,2, nSect + 1 , arptSides.asArrayPtr()); arptSides.setLogicalLength(0); pt = arPts[3] + vtNor * dEWidth * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtEnd,arPts[3])); } pt = arPts[15] + vtNor * dEWidth * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtEnd,arPts[15])); } DrawMesh(mode,2, nSect + 1 , arptSides.asArrayPtr()); // 支管2 arptSides.setLogicalLength(0); pt = arPts[21] + vtNor * dBr2Width * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtBr2,arPts[21])); } AcGeVector3d vtD = arPts[25] - arPts[23]; vtD.normalize(); AcGePoint3d ptTmp = arPts[23] + vtD * arPts[14].distanceTo(arPts[22]); AcGeVector3d vtTmp = arPts[14] - ptTmp; vtTmp.normalize(); ptTmp = ptTmp + vtTmp * arPts[14].distanceTo(ptTmp) / 2.0; pt = ptTmp + vtNor * arPts[14].distanceTo(ptTmp); for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng, vtBr2, ptTmp)); } DrawMesh(mode,2, nSect + 1, arptSides.asArrayPtr()); // 支管2直边 arptSides.setLogicalLength(0); pt = arPts[9] + vtNor * dBr2Width * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtBr2,arPts[9])); } pt = arPts[21] + vtNor * dBr2Width * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtBr2,arPts[21])); } DrawMesh(mode,2, nSect + 1, arptSides.asArrayPtr()); // 支管1 arptSides.setLogicalLength(0); pt = arPts[18] + vtNor * dBr1Width * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtBr1,arPts[18])); } vtD = arPts[24] - arPts[19]; vtD.normalize(); ptTmp = arPts[19] + vtD * arPts[13].distanceTo(arPts[20]); vtTmp = arPts[13] - ptTmp; vtTmp.normalize(); ptTmp = ptTmp + vtTmp * arPts[13].distanceTo(ptTmp) / 2.0; pt = ptTmp + vtNor * arPts[13].distanceTo(ptTmp); for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng, vtBr1, ptTmp)); } DrawMesh(mode,2, nSect + 1 , arptSides.asArrayPtr()); // 支管1直边 arptSides.setLogicalLength(0); pt = arPts[6] + vtNor * dBr1Width * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtBr1,arPts[6])); } pt = arPts[18] + vtNor * dBr1Width * 0.5; for (i = 0; i <= nSect; i++) { arptSides.append(pt.rotateBy(dMinDiffAng,vtBr1,arPts[18])); } DrawMesh(mode,2, nSect + 1 , arptSides.asArrayPtr()); } } // 圆角 void ImpHvacCross::DrawArcuateCross3d(AcGiDraw &mode) const { ASSERT(NULL != m_pXDataMap); double dThick = 200.0; m_pXDataMap->GetAt(HCRS_Thick, dThick); double dThickSub = 200.0; if (!m_pXDataMap->GetAt(KEY_EndThick, dThickSub)) { dThickSub = dThick; } double dBran1Thick = 200.0, dBran2Thick = 200.0; m_pXDataMap->GetAt(HCRS_Branch1Thick, dBran1Thick); m_pXDataMap->GetAt(HCRS_Branch2Thick, dBran2Thick); AcGeVector3d vtNor = GetSectNormal(); AcGePoint3dArray arPts, arPts1, arPts2, arPts3, arPts4, arPtsU, arPtsD, arptSides; GetArcuateCrossPts(arPts); AecHvac::HvacCrossType eType = AecHvac::eArcuateCross; m_pXDataMap->GetAt(HCRS_Type, (int&)eType); double dMinDiffAng = TAuxTools::GetMinDiffAngle(); if (eType == AecHvac::eArcuateIntubCross) // 插管圆角 { AcGePoint3d ptSta, ptBr1, ptBr2; m_pXDataMap->GetAt(HCRS_StartPoint, ptSta); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); AcGePlane planSta(ptSta, vtNor); AcGePoint3d ptEnd; m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); AcGePlane planEnd(ptEnd, vtNor); AcGePlane planBr1(ptBr1, vtNor); AcGePlane planBr2(ptBr2, vtNor); arPts1.append(arPts[3]); AcGeCircArc3d circArc(arPts[3], arPts[28], arPts[11]); AcGeVector3d vts, vte; vts = circArc.center() - arPts[3]; vte = circArc.center() - arPts[11]; double dAngle = vts.angleTo(vte,circArc.normal()); if (dAngle > PI) { dAngle = 2 * PI - dAngle; } int nSect = int(dAngle / dMinDiffAng); AcGePoint3d pt; pt = arPts[3]; int i = 0; for (i = 0; i < nSect; i++) { arPts1.append(pt.rotateBy(dMinDiffAng, circArc.normal(), circArc.center())); } arPts1.append(arPts[11]); arPts1.append(arPts[8]); arPts2.append(arPts[7]); arPts2.append(arPts[9]); circArc.set(arPts[9], arPts[30], arPts[29]); vts = circArc.center() - arPts[9]; vte = circArc.center() - arPts[29]; dAngle = vts.angleTo(vte,circArc.normal()); if (dAngle > PI) { dAngle = 2 * PI - dAngle ; } nSect = int(dAngle / dMinDiffAng); pt = arPts[9]; for (i = 0; i < nSect; i++) { arPts2.append(pt.rotateBy(dMinDiffAng, circArc.normal(), circArc.center())); } arPts2.append(arPts[29]); arptSides.append(arPts1); arptSides.append(arPts2); int nSize = arptSides.length(); AcGeMatrix3d mat1,mat2; AcArray arlFaceList; arlFaceList.append(nSize); vtNor.normalize(); vtNor *= dBran1Thick * 0.5; mat1.setToTranslation(vtNor); vtNor.normalize(); vtNor *= -dBran1Thick; mat2.setToTranslation(vtNor); //所有点向上偏移半个厚度 for (i = 0; i < nSize; i++) { arPtsU.append(arptSides[i].transformBy(mat1)); arPtsD.append(arptSides[i].transformBy(mat2)); arlFaceList.append(i); } DrawShell(mode,nSize, arPtsU.asArrayPtr(), nSize + 1, arlFaceList.asArrayPtr()); DrawShell(mode,nSize, arPtsD.asArrayPtr(), nSize + 1, arlFaceList.asArrayPtr()); //侧面的面 for (int j = 0; j < 2; j++) { arptSides.setLogicalLength(0); arPtsU.setLogicalLength(0); arPtsD.setLogicalLength(0); AcGePoint3dArray arPtsKK; switch(j) { case 0: arPtsKK.append(arPts1); break; case 1: arPtsKK.append(arPts2); break; case 2: arPtsKK.append(arPts3); break; case 3: arPtsKK.append(arPts4); break; } for (i = 0; i < arPtsKK.length(); i++) { arPtsU.append(arPtsKK[i].transformBy(mat1)); arPtsD.append(arPtsKK[i].transformBy(mat2)); } arptSides.append(arPtsU); arptSides.append(arPtsD); DrawMesh(mode,2, arPtsU.length(), arptSides.asArrayPtr()); } //右下角的各个点 arPts3.append(arPts[32]); circArc.set(arPts[32], arPts[33], arPts[23]); vts = circArc.center() - arPts[32]; vte = circArc.center() - arPts[23]; dAngle = vts.angleTo(vte,circArc.normal()); if (dAngle > PI) { dAngle = 2 * PI - dAngle ; } nSect = int(dAngle / dMinDiffAng); pt = arPts[32]; for (i = 0; i < nSect; i++) { arPts3.append(pt.rotateBy(dMinDiffAng, circArc.normal(), circArc.center())); } arPts3.append(arPts[23]); arPts3.append(arPts[20]); //左下下角的各个点 arPts4.append(arPts[19]); arPts4.append(arPts[21]); if (eType == AecHvac::eArcuateCross || eType == AecHvac::eArcuateIntubCross) { circArc.set(arPts[21], arPts[31], arPts[5]); vts = circArc.center() - arPts[21]; vte = circArc.center() - arPts[5]; dAngle = vts.angleTo(vte,circArc.normal()); if (dAngle > PI) { dAngle = 2 * PI - dAngle ; } nSect = int(dAngle / dMinDiffAng); pt = arPts[21]; for (i = 0; i < nSect; i++) { arPts4.append(pt.rotateBy(dMinDiffAng, circArc.normal(), circArc.center())); } } arPts4.append(arPts[5]); arptSides.setLogicalLength(0); arptSides.append(arPts3); arptSides.append(arPts4); nSize = arptSides.length(); arlFaceList.setLogicalLength(0); arlFaceList.append(nSize); vtNor.normalize(); vtNor *= dBran2Thick * 0.5; mat1.setToTranslation(vtNor); vtNor.normalize(); vtNor *= -dBran2Thick; mat2.setToTranslation(vtNor); arPtsU.setLogicalLength(0); arPtsD.setLogicalLength(0); //所有点向上偏移半个厚度 for (i = 0; i < nSize; i++) { arPtsU.append(arptSides[i].transformBy(mat1)); arPtsD.append(arptSides[i].transformBy(mat2)); arlFaceList.append(i); } DrawShell(mode,nSize, arPtsU.asArrayPtr(), nSize + 1, arlFaceList.asArrayPtr()); DrawShell(mode,nSize, arPtsD.asArrayPtr(), nSize + 1, arlFaceList.asArrayPtr()); //侧面的面 for (j = 2; j < 4; j++) { arptSides.setLogicalLength(0); arPtsU.setLogicalLength(0); arPtsD.setLogicalLength(0); AcGePoint3dArray arPtsKK; switch(j) { case 0: arPtsKK.append(arPts1); break; case 1: arPtsKK.append(arPts2); break; case 2: arPtsKK.append(arPts3); break; case 3: arPtsKK.append(arPts4); break; } for (i = 0; i < arPtsKK.length(); i++) { arPtsU.append(arPtsKK[i].transformBy(mat1)); arPtsD.append(arPtsKK[i].transformBy(mat2)); } arptSides.append(arPtsU); arptSides.append(arPtsD); DrawMesh(mode,2, arPtsU.length(), arptSides.asArrayPtr()); } arptSides.setLogicalLength(0); arptSides.append(arPts[1]); AcGePoint3d ptProj = arPts[3]; ptProj = ptProj.orthoProject(planSta); arptSides.append(ptProj); ptProj = arPts[29]; ptProj = ptProj.orthoProject(planEnd); arptSides.append(ptProj); ptProj = arPts[14]; ptProj = ptProj.orthoProject(planEnd); arptSides.append(ptProj); ptProj = arPts[13]; ptProj = ptProj.orthoProject(planEnd); arptSides.append(ptProj); ptProj = arPts[32]; ptProj = ptProj.orthoProject(planEnd); arptSides.append(ptProj); ptProj = arPts[5]; ptProj = ptProj.orthoProject(planSta); arptSides.append(ptProj); arptSides.append(arPts[2]); vtNor.normalize(); vtNor *= dThick * 0.5; mat1.setToTranslation(vtNor); vtNor.normalize(); vtNor *= dThickSub * 0.5; AcGeMatrix3d mat3; mat3.setToTranslation(vtNor); vtNor.normalize(); vtNor *= -dThick; mat2.setToTranslation(vtNor); vtNor.normalize(); vtNor *= dThickSub; AcGeMatrix3d mat4; mat4.setToTranslation(vtNor); arPtsU.setLogicalLength(0); arPtsD.setLogicalLength(0); for (i = 0; i < arptSides.length(); i++) { if (2 == i || 3 == i || 4 == i || 5 == i)//尾管端四个点 { arPtsU.append(arptSides[i].transformBy(mat3)); arPtsD.append(arptSides[i].transformBy(mat4)); } else//主管端四个点 { arPtsU.append(arptSides[i].transformBy(mat1)); arPtsD.append(arptSides[i].transformBy(mat2)); } } arptSides.setLogicalLength(0); arptSides.append(arPtsU[0]); arptSides.append(arPtsU[7]); arptSides.append(arPtsD[7]); arptSides.append(arPtsD[0]); arptSides.append(arPtsU[0]); arptSides.append(arPtsU[1]); arptSides.append(arPtsU[6]); arptSides.append(arPtsD[6]); arptSides.append(arPtsD[1]); arptSides.append(arPtsU[1]); arptSides.append(arPtsU[2]); arptSides.append(arPtsU[5]); arptSides.append(arPtsD[5]); arptSides.append(arPtsD[2]); arptSides.append(arPtsU[2]); arptSides.append(arPtsU[3]); arptSides.append(arPtsU[4]); arptSides.append(arPtsD[4]); arptSides.append(arPtsD[3]); arptSides.append(arPtsU[3]); DrawMesh(mode,4, 5, arptSides.asArrayPtr()); } else // 普通圆角 { //左上角的各个点 arPts1.append(arPts[1]); arPts1.append(arPts[3]); AcGeCircArc3d circArc(arPts[3], arPts[28], arPts[11]); AcGeVector3d vts, vte; vts = circArc.center() - arPts[3]; vte = circArc.center() - arPts[11]; double dAngle = vts.angleTo(vte,circArc.normal()); if (dAngle > PI) { dAngle = 2 * PI - dAngle; } int nSect = int(dAngle / dMinDiffAng); AcGePoint3d pt; pt = arPts[3]; int i = 0; if (eType == AecHvac::eArcuateCross || eType == AecHvac::eArcuateIntubCross) { for (i = 0; i < nSect; i++) { arPts1.append(pt.rotateBy(dMinDiffAng, circArc.normal(), circArc.center())); } } arPts1.append(arPts[11]); arPts1.append(arPts[8]); //右上角的各个点 arPts2.append(arPts[7]); arPts2.append(arPts[9]); circArc.set(arPts[9], arPts[30], arPts[29]); vts = circArc.center() - arPts[9]; vte = circArc.center() - arPts[29]; dAngle = vts.angleTo(vte,circArc.normal()); if (dAngle > PI) { dAngle = 2 * PI - dAngle ; } nSect = int(dAngle / dMinDiffAng); pt = arPts[9]; for (i = 0; i < nSect; i++) { arPts2.append(pt.rotateBy(dMinDiffAng, circArc.normal(), circArc.center())); } arPts2.append(arPts[29]); arPts2.append(arPts[17]); arPts2.append(arPts[14]); //右下角的各个点 arPts3.append(arPts[13]); arPts3.append(arPts[15]); arPts3.append(arPts[32]); circArc.set(arPts[32], arPts[33], arPts[23]); vts = circArc.center() - arPts[32]; vte = circArc.center() - arPts[23]; dAngle = vts.angleTo(vte,circArc.normal()); if (dAngle > PI) { dAngle = 2 * PI - dAngle ; } nSect = int(dAngle / dMinDiffAng); pt = arPts[32]; for (i = 0; i < nSect; i++) { arPts3.append(pt.rotateBy(dMinDiffAng, circArc.normal(), circArc.center())); } arPts3.append(arPts[23]); arPts3.append(arPts[20]); //左下下角的各个点 arPts4.append(arPts[19]); arPts4.append(arPts[21]); if (eType == AecHvac::eArcuateCross || eType == AecHvac::eArcuateIntubCross) { circArc.set(arPts[21], arPts[31], arPts[5]); vts = circArc.center() - arPts[21]; vte = circArc.center() - arPts[5]; dAngle = vts.angleTo(vte,circArc.normal()); if (dAngle > PI) { dAngle = 2 * PI - dAngle ; } nSect = int(dAngle / dMinDiffAng); pt = arPts[21]; for (i = 0; i < nSect; i++) { arPts4.append(pt.rotateBy(dMinDiffAng, circArc.normal(), circArc.center())); } } arPts4.append(arPts[5]); arPts4.append(arPts[2]); arptSides.append(arPts1); arptSides.append(arPts2); arptSides.append(arPts3); arptSides.append(arPts4); int nSize = arptSides.length(); AcGeMatrix3d mat1,mat2; AcArray arlFaceList; arlFaceList.append(nSize); vtNor.normalize(); vtNor *= dThick * 0.5; mat1.setToTranslation(vtNor); vtNor.normalize(); vtNor *= -dThick; mat2.setToTranslation(vtNor); //所有点向上偏移半个厚度 for (i = 0; i < nSize; i++) { arPtsU.append(arptSides[i].transformBy(mat1)); arPtsD.append(arptSides[i].transformBy(mat2)); arlFaceList.append(i); } DrawShell(mode,nSize, arPtsU.asArrayPtr(), nSize + 1, arlFaceList.asArrayPtr()); DrawShell(mode,nSize, arPtsD.asArrayPtr(), nSize + 1, arlFaceList.asArrayPtr()); //侧面的面 for (int j = 0; j < 4; j++) { arptSides.setLogicalLength(0); arPtsU.setLogicalLength(0); arPtsD.setLogicalLength(0); arPts.setLogicalLength(0); switch(j) { case 0: arPts.append(arPts1); break; case 1: arPts.append(arPts2); break; case 2: arPts.append(arPts3); break; case 3: arPts.append(arPts4); break; } for (i = 0; i < arPts.length(); i++) { arPtsU.append(arPts[i].transformBy(mat1)); arPtsD.append(arPts[i].transformBy(mat2)); } arptSides.append(arPtsU); arptSides.append(arPtsD); DrawMesh(mode,2, arPtsU.length(), arptSides.asArrayPtr()); } } } // 直角 void ImpHvacCross::DrawLinearCross3d(AcGiDraw &mode) const { DrawInterCross3d(mode); } // 交叉 void ImpHvacCross::DrawInterCross3d(AcGiDraw &mode) const { ASSERT(NULL != m_pXDataMap); double dThick = 200.0; m_pXDataMap->GetAt(HCRS_Thick, dThick); AcGeVector3d vtNor = GetSectNormal(); AcGePoint3dArray arPts,arPtsU,arPtsD,arptSides; GetIntersectCrossPts(arPts); AcGeMatrix3d mat; vtNor.normalize(); vtNor *= dThick * 0.5; mat.setToTranslation(vtNor); //去掉四个中心线点,把所有点向上偏移半个厚度 for (int i = 0; i < arPts.length() - 4; i++) { arPtsU.append(arPts[i].transformBy(mat)); } vtNor.normalize(); vtNor *= -dThick; mat.setToTranslation(vtNor); //去掉四个中心线点,把所有点向下偏移半个厚度 for (i = 0; i < arPts.length() - 4; i++) { arPtsD.append(arPts[i].transformBy(mat)); } //开始面 arptSides.append(arPtsU[1]); arptSides.append(arPtsU[2]); arptSides.append(arPtsD[2]); arptSides.append(arPtsD[1]); arptSides.append(arPtsU[1]); //开始直边段 arptSides.append(arPtsU[3]); arptSides.append(arPtsU[5]); arptSides.append(arPtsD[5]); arptSides.append(arPtsD[3]); arptSides.append(arPtsU[3]); // arptSides.append(arPtsU[11]); arptSides.append(arPtsU[21]); arptSides.append(arPtsD[21]); arptSides.append(arPtsD[11]); arptSides.append(arPtsU[11]); // 如果是直角四通,修改9,15点为交点 AecHvac::HvacCrossType eCrossType = AecHvac::eOrthoCross; m_pXDataMap->GetAt(HCRS_Type, (int&)eCrossType); if(eCrossType == AecHvac::eLinearCross) { arptSides.append(arPtsU[9]); arptSides.append(arPtsU[23]); arptSides.append(arPtsD[23]); arptSides.append(arPtsD[9]); arptSides.append(arPtsU[9]); //末点面 arptSides.append(arPtsU[14]); arptSides.append(arPtsU[13]); arptSides.append(arPtsD[13]); arptSides.append(arPtsD[14]); arptSides.append(arPtsU[14]); DrawMesh(mode,5, 5, arptSides.asArrayPtr()); } else if (eCrossType == AecHvac::eInterCross) { // arptSides.append(arPtsU[9]); arptSides.append(arPtsU[23]); arptSides.append(arPtsD[23]); arptSides.append(arPtsD[9]); arptSides.append(arPtsU[9]); //末点直边段 arptSides.append(arPtsU[17]); arptSides.append(arPtsU[15]); arptSides.append(arPtsD[15]); arptSides.append(arPtsD[17]); arptSides.append(arPtsU[17]); //末点面 arptSides.append(arPtsU[14]); arptSides.append(arPtsU[13]); arptSides.append(arPtsD[13]); arptSides.append(arPtsD[14]); arptSides.append(arPtsU[14]); DrawMesh(mode,6, 5, arptSides.asArrayPtr()); } //支管BR1 arptSides.setLogicalLength(0); arptSides.append(arPtsU[20]); arptSides.append(arPtsU[19]); arptSides.append(arPtsD[19]); arptSides.append(arPtsD[20]); arptSides.append(arPtsU[20]); arptSides.append(arPtsU[23]); arptSides.append(arPtsU[21]); arptSides.append(arPtsD[21]); arptSides.append(arPtsD[23]); arptSides.append(arPtsU[23]); DrawMesh(mode,2, 5, arptSides.asArrayPtr()); //支管BR2 arptSides.setLogicalLength(0); arptSides.append(arPtsU[7]); arptSides.append(arPtsU[8]); arptSides.append(arPtsD[8]); arptSides.append(arPtsD[7]); arptSides.append(arPtsU[7]); //末点面 arptSides.append(arPtsU[9]); arptSides.append(arPtsU[11]); arptSides.append(arPtsD[11]); arptSides.append(arPtsD[9]); arptSides.append(arPtsU[9]); DrawMesh(mode,2, 5, arptSides.asArrayPtr()); } //二维曲线 BOOL ImpHvacCross::MakeOrthoCross2dCurves(AecComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); AcGePoint3dArray arPts; GetCrossPts(arPts,FALSE,TRUE); ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType,(int&)eSectType); AecEqui::AecCurveElement el; memset(&el,0,sizeof(AecEqui::AecCurveElement)); AcDbObjectId idBaseLayer(NULL), idSideLayer(NULL); m_pXDataMap->GetAt(HVAC_EndLayer, idSideLayer); double dEdgeWidth = GetEdgeLineWidth(); double dCenWidth = GetCentLineWidth(); double dEndLineWidth = GetEndLineWidth(); //水平放置 if (IsHorzAlignment()) { //方口 if (arPts.length() == 20) { //外轮廓 if (0 == nType) { el.dWidth = dEdgeWidth; el.ptGe[0] = arPts[8]; el.ptGe[1] = arPts[9]; el.ptGe[2] = arPts[9]; cplCurve.append(el); el.ptGe[0] = arPts[9]; el.ptGe[1] = arPts[10]; el.ptGe[2] = arPts[10]; cplCurve.append(el); el.ptGe[0] = arPts[11]; el.ptGe[1] = arPts[12]; el.ptGe[2] = arPts[12]; cplCurve.append(el); el.ptGe[0] = arPts[12]; el.ptGe[1] = arPts[13]; el.ptGe[2] = arPts[13]; cplCurve.append(el); el.ptGe[0] = arPts[14]; el.ptGe[1] = arPts[15]; el.ptGe[2] = arPts[15]; cplCurve.append(el); el.ptGe[0] = arPts[15]; el.ptGe[1] = arPts[16]; el.ptGe[2] = arPts[16]; cplCurve.append(el); el.ptGe[0] = arPts[17]; el.ptGe[1] = arPts[18]; el.ptGe[2] = arPts[18]; cplCurve.append(el); el.ptGe[0] = arPts[18]; el.ptGe[1] = arPts[19]; el.ptGe[2] = arPts[19]; cplCurve.append(el); el.idSubLay = idSideLayer; el.dWidth = dEndLineWidth; el.ptGe[0] = arPts[10]; el.ptGe[1] = arPts[11]; el.ptGe[2] = arPts[11]; cplCurve.append(el); el.ptGe[0] = arPts[13]; el.ptGe[1] = arPts[14]; el.ptGe[2] = arPts[14]; cplCurve.append(el); el.ptGe[0] = arPts[16]; el.ptGe[1] = arPts[17]; el.ptGe[2] = arPts[17]; cplCurve.append(el); el.ptGe[0] = arPts[19]; el.ptGe[1] = arPts[8]; el.ptGe[2] = arPts[8]; cplCurve.append(el); } //中心线 if (1 == nType && (HasBaseLine() || IsSingleLine())) { el.gsMark = -1; el.idSubLay = idBaseLayer; if (IsSingleLine()) el.dWidth = dEdgeWidth; else el.dWidth = dCenWidth; AcGePoint3d ptCen = arPts[7]; if (arPts[0].distanceTo(arPts[1]) < arPts[0].distanceTo(arPts[7])) { ptCen = arPts[1]; } AcGePoint3d ptPlusEdgeS = GetPlusEdgeStartPt(); AcGePoint3d ptPlusEdgeE = GetPlusEdgeEndPt(); AcGePoint3d ptPlusEdgeB1 = GetPlusEdgeBra1Pt(); AcGePoint3d ptPlusEdgeB2 = GetPlusEdgeBra2Pt(); el.ptGe[0] = arPts[0]; el.ptGe[1] = ptPlusEdgeS; el.ptGe[2] = ptPlusEdgeS; cplCurve.append(el); el.ptGe[0] = arPts[2]; el.ptGe[1] = ptPlusEdgeE; el.ptGe[2] = ptPlusEdgeE; cplCurve.append(el); el.ptGe[0] = arPts[4]; el.ptGe[1] = ptPlusEdgeB1; el.ptGe[2] = ptPlusEdgeB1; cplCurve.append(el); el.ptGe[0] = arPts[6]; el.ptGe[1] = ptPlusEdgeB2; el.ptGe[2] = ptPlusEdgeB2; cplCurve.append(el); el.ptGe[0] = ptPlusEdgeS; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = ptPlusEdgeE; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = ptPlusEdgeB1; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = ptPlusEdgeB2; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); } } //圆口 if (arPts.length() == 34) { //外轮廓 if (0 == nType) { el.dWidth = dEdgeWidth; //直边段 for (int i = 0; i <= 18; i+=6) { el.ptGe[0] = arPts[i + 1]; el.ptGe[1] = arPts[i + 3]; el.ptGe[2] = arPts[i + 3]; cplCurve.append(el); el.ptGe[0] = arPts[i + 2]; el.ptGe[1] = arPts[i + 5]; el.ptGe[2] = arPts[i + 5]; cplCurve.append(el); } el.ptGe[0] = arPts[3]; el.ptGe[1] = arPts[24]; el.ptGe[2] = arPts[24]; cplCurve.append(el); el.ptGe[0] = arPts[24]; el.ptGe[1] = arPts[11]; el.ptGe[2] = arPts[11]; cplCurve.append(el); el.ptGe[0] = arPts[9]; el.ptGe[1] = arPts[25]; el.ptGe[2] = arPts[25]; cplCurve.append(el); el.ptGe[0] = arPts[25]; el.ptGe[1] = arPts[17]; el.ptGe[2] = arPts[17]; cplCurve.append(el); el.ptGe[0] = arPts[15]; el.ptGe[1] = arPts[26]; el.ptGe[2] = arPts[26]; cplCurve.append(el); el.ptGe[0] = arPts[26]; el.ptGe[1] = arPts[23]; el.ptGe[2] = arPts[23]; cplCurve.append(el); el.ptGe[0] = arPts[21]; el.ptGe[1] = arPts[27]; el.ptGe[2] = arPts[27]; cplCurve.append(el); el.ptGe[0] = arPts[27]; el.ptGe[1] = arPts[5]; el.ptGe[2] = arPts[5]; cplCurve.append(el); //上下弧 el.ptGe[0] = arPts[24]; el.ptGe[1] = arPts[32]; el.ptGe[2] = arPts[25]; cplCurve.append(el); el.ptGe[0] = arPts[27]; el.ptGe[1] = arPts[33]; el.ptGe[2] = arPts[26]; cplCurve.append(el); el.idSubLay = idSideLayer; el.dWidth = dEndLineWidth; for (i = 0; i <= 18; i+=6) { el.ptGe[0] = arPts[i + 1]; el.ptGe[1] = arPts[i + 2]; el.ptGe[2] = arPts[i + 2]; cplCurve.append(el); } } if (1 == nType && (HasBaseLine() || IsSingleLine())) { //中心线 el.gsMark = -1; el.idSubLay = idBaseLayer; if (IsSingleLine()) el.dWidth = dEdgeWidth; else el.dWidth = dCenWidth; //直边段 for (int i = 0; i <= 18; i+=6) { el.ptGe[0] = arPts[i]; el.ptGe[1] = arPts[i + 4]; el.ptGe[2] = arPts[i + 4]; cplCurve.append(el); } AcGePoint3d ptCen = arPts[31]; if (arPts[0].distanceTo(arPts[28]) < arPts[0].distanceTo(arPts[31])) { ptCen = arPts[28]; } el.ptGe[0] = arPts[4]; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = arPts[10]; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = arPts[16]; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = arPts[22]; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); } } } //垂直放置(立管) else if (IsVertAlignment()) { //方口 if (eSectType == eRect) { double dThick = 300.0; m_pXDataMap->GetAt(HCRS_Thick, dThick); AcGePoint3d pt, ptTemp; AcGePoint3dArray arPtsV; //开始矢量和Z轴垂直(前视) if (IsStartVertAlignment()) { pt = arPts[8]; pt.z = arPts[0].z; arPtsV.append(pt); pt = arPts[10]; pt.z = arPts[0].z; arPtsV.append(pt); pt = arPts[11]; pt.z = arPts[0].z; arPtsV.append(pt); pt = arPts[13]; pt.z = arPts[0].z; arPtsV.append(pt); } //br1矢量和Z轴垂直(左视) else if (IsBr1VertAlignment()) { pt = arPts[10]; pt.z = arPts[0].z; ptTemp = arPts[11]; ptTemp.z = arPts[0].z; if (arPts[0].distanceTo(pt) < arPts[0].distanceTo(ptTemp)) { pt = ptTemp; } arPtsV.append(pt); pt = arPts[8]; pt.z = arPts[0].z; arPtsV.append(pt); pt = arPts[19]; pt.z = arPts[0].z; arPtsV.append(pt); pt = arPts[17]; pt.z = arPts[0].z; ptTemp = arPts[16]; ptTemp.z = arPts[0].z; if (arPts[0].distanceTo(pt) < arPts[0].distanceTo(ptTemp)) { pt = ptTemp; } arPtsV.append(pt); } else return FALSE; AcGeMatrix3d mat; AcGeVector3d vtNor = GetSectNormal(); vtNor.normalize(); vtNor *= dThick * 0.5; mat.setToTranslation(vtNor); for (int i = 0; i < 4; i++) { arPtsV.append(arPtsV[i].transformBy(mat)); } vtNor.normalize(); vtNor *= -dThick; mat.setToTranslation(vtNor); for (i = 0; i < 4; i++) { arPtsV.append(arPtsV[i].transformBy(mat)); } //外轮廓 if (0 == nType) { el.dWidth = dEdgeWidth; el.idSubLay = NULL; el.ptGe[0] = arPtsV[4]; el.ptGe[1] = arPtsV[7]; el.ptGe[2] = arPtsV[7]; cplCurve.append(el); el.ptGe[0] = arPtsV[8]; el.ptGe[1] = arPtsV[11]; el.ptGe[2] = arPtsV[11]; cplCurve.append(el); el.dWidth = dEndLineWidth; el.idSubLay = idSideLayer; el.ptGe[0] = arPtsV[4]; el.ptGe[1] = arPtsV[8]; el.ptGe[2] = arPtsV[8]; cplCurve.append(el); el.ptGe[0] = arPtsV[7]; el.ptGe[1] = arPtsV[11]; el.ptGe[2] = arPtsV[11]; cplCurve.append(el); } if (1 == nType && (HasBaseLine() || IsSingleLine())) { el.dWidth = dCenWidth; el.idSubLay = idBaseLayer; el.ptGe[0] = arPtsV[5]; el.ptGe[1] = arPtsV[9]; el.ptGe[2] = arPtsV[9]; cplCurve.append(el); el.ptGe[0] = arPtsV[6]; el.ptGe[1] = arPtsV[10]; el.ptGe[2] = arPtsV[10]; cplCurve.append(el); } } //圆口 else if (eSectType == eCircle) { AcGeVector3d vtStar, vtBr1, vtNor; m_pXDataMap->GetAt(HCRS_StartDir, vtStar); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); double dAngle = vtStar.angleTo(vtBr1); //支管垂直 if (fabs(dAngle - PI / 2) < 1e-3) { arPts.setLogicalLength(0); GetCrossPtsVerCir(arPts); //BR管径大,有交点 if (arPts.length() == 15) { //外轮廓 if (0 == nType) { el.dWidth = dEdgeWidth; el.ptGe[0] = arPts[3]; el.ptGe[1] = arPts[11]; el.ptGe[2] = arPts[11]; cplCurve.append(el); el.ptGe[0] = arPts[11]; el.ptGe[1] = arPts[8]; el.ptGe[2] = arPts[12]; cplCurve.append(el); el.ptGe[0] = arPts[12]; el.ptGe[1] = arPts[4]; el.ptGe[2] = arPts[4]; cplCurve.append(el); el.ptGe[0] = arPts[5]; el.ptGe[1] = arPts[13]; el.ptGe[2] = arPts[13]; cplCurve.append(el); el.ptGe[0] = arPts[13]; el.ptGe[1] = arPts[10]; el.ptGe[2] = arPts[14]; cplCurve.append(el); el.ptGe[0] = arPts[14]; el.ptGe[1] = arPts[6]; el.ptGe[2] = arPts[6]; cplCurve.append(el); el.dWidth = dEndLineWidth; el.idSubLay = idSideLayer; el.ptGe[0] = arPts[4]; el.ptGe[1] = arPts[5]; el.ptGe[2] = arPts[5]; cplCurve.append(el); el.ptGe[0] = arPts[3]; el.ptGe[1] = arPts[6]; el.ptGe[2] = arPts[6]; cplCurve.append(el); } //内部线 if (1 == nType && (HasBaseLine() || IsSingleLine())) { el.dWidth = dCenWidth; el.ptGe[0] = arPts[11]; el.ptGe[1] = arPts[7]; el.ptGe[2] = arPts[14]; cplCurve.append(el); el.ptGe[0] = arPts[12]; el.ptGe[1] = arPts[9]; el.ptGe[2] = arPts[13]; cplCurve.append(el); } } //Br管径小,没有交点 else if (arPts.length() == 11) { if (0 == nType) { el.dWidth = dEdgeWidth; el.ptGe[0] = arPts[3]; el.ptGe[1] = arPts[4]; el.ptGe[2] = arPts[4]; cplCurve.append(el); el.ptGe[0] = arPts[5]; el.ptGe[1] = arPts[6]; el.ptGe[2] = arPts[6]; cplCurve.append(el); el.dWidth = dEndLineWidth; el.idSubLay = idSideLayer; el.ptGe[0] = arPts[4]; el.ptGe[1] = arPts[5]; el.ptGe[2] = arPts[5]; cplCurve.append(el); el.ptGe[0] = arPts[6]; el.ptGe[1] = arPts[3]; el.ptGe[2] = arPts[3]; cplCurve.append(el); } if (1 == nType && (HasBaseLine() || IsSingleLine())) { el.dWidth = dCenWidth; el.ptGe[0] = arPts[7]; el.ptGe[1] = arPts[8]; el.ptGe[2] = arPts[9]; cplCurve.append(el); el.ptGe[0] = arPts[7]; el.ptGe[1] = arPts[10]; el.ptGe[2] = arPts[9]; cplCurve.append(el); } } } //非支管90° else { double dSWidth, dEWidth, dBr1Width, dBr2Width; m_pXDataMap->GetAt(HCRS_StartWidth, dSWidth); m_pXDataMap->GetAt(HCRS_EndWidth, dEWidth); m_pXDataMap->GetAt(HCRS_Branch1Width, dBr1Width); m_pXDataMap->GetAt(HCRS_Branch2Width, dBr2Width); vtNor = GetSectNormal(); vtNor.normal(); dSWidth *= 0.5; dEWidth *= 0.5; dBr1Width *=0.5; dBr2Width *=0.5; AcGePoint3d pts, pte, ptm, ptlineStaU, ptlineStaD, ptlineEndU, ptlineEndD; //开始矢量和Z轴垂直(前视) el.dWidth = dEdgeWidth; if (IsStartVertAlignment()) { //主管4点 pts = arPts[0]; pte = arPts[12]; pte.z = pts.z; el.ptGe[0] = pts + vtNor * dSWidth; el.ptGe[1] = pte + vtNor * dEWidth; el.ptGe[2] = pte + vtNor * dEWidth; cplCurve.append(el); el.ptGe[0] = pte + vtNor * dEWidth; el.ptGe[1] = pte - vtNor * dEWidth; el.ptGe[2] = pte - vtNor * dEWidth; cplCurve.append(el); el.ptGe[0] = pte - vtNor * dEWidth; el.ptGe[1] = pts - vtNor * dSWidth; el.ptGe[2] = pts - vtNor * dSWidth; cplCurve.append(el); el.ptGe[0] = pts + vtNor * dSWidth; el.ptGe[1] = pts - vtNor * dSWidth; el.ptGe[2] = pts - vtNor * dSWidth; cplCurve.append(el); //Br1投影椭圆1 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); AcDbPolyline pPolyLine, pPolyLine1, pPolyLine2; AcGePoint3dArray arPtsEll; pte = arPts[6]; pte.z = pts.z; int iRes = TAuxTools::GetEllipseFromCircle(pte, dBr1Width * 2, vtBr1, vtZAxis, pPolyLine,vtStar); if (iRes == 2) { arPtsEll.setLogicalLength(0); TAuxTools::GetArcPoint(pPolyLine, arPtsEll);//Lixl add 2011-11-23 for(int i = 0; i < arPtsEll.length()-1; i++) { el.ptGe[0] = arPtsEll[i]; el.ptGe[1] = arPtsEll[i+1]; el.ptGe[2] = arPtsEll[i+1]; cplCurve.append(el); } } //椭圆2 iRes = TAuxTools::GetEllipseFromCircle(pte, dBr1Width * 2, vtBr1, vtZAxis, pPolyLine1, -vtStar); if (iRes == 2) { arPtsEll.setLogicalLength(0); TAuxTools::GetArcPoint(pPolyLine1, arPtsEll);//Lixl add 2011-11-23 for(int i = 0; i < arPtsEll.length()-1; i++) { el.ptGe[0] = arPtsEll[i]; el.ptGe[1] = arPtsEll[i+1]; el.ptGe[2] = arPtsEll[i+1]; cplCurve.append(el); } ptlineStaU = arPtsEll.first(); ptlineStaD = arPtsEll.last(); } //椭圆3 pte = arPts[28]; pte.z = pts.z; iRes = TAuxTools::GetEllipseFromCircle(pte, dBr1Width * 2, vtBr1, vtZAxis, pPolyLine2, vtStar); if (iRes == 2) { arPtsEll.setLogicalLength(0); TAuxTools::GetArcPoint(pPolyLine2, arPtsEll);//Lixl add 2011-11-23 for(int i = 0; i < arPtsEll.length()-1; i++) { el.ptGe[0] = arPtsEll[i]; el.ptGe[1] = arPtsEll[i+1]; el.ptGe[2] = arPtsEll[i+1]; cplCurve.append(el); } ptlineEndU = arPtsEll.last(); ptlineEndD = arPtsEll.first(); } //椭圆的两根直线 el.ptGe[0] = ptlineStaU; el.ptGe[1] = ptlineEndU; el.ptGe[2] = ptlineEndU; cplCurve.append(el); el.ptGe[0] = ptlineStaD; el.ptGe[1] = ptlineEndD; el.ptGe[2] = ptlineEndD; cplCurve.append(el); } else if (IsBr1VertAlignment()) { AcGeVector3d vtTemp = vtNor; vtTemp.rotateBy(PI / 2, vtStar); vtTemp.normalize(); //主管4点 pts = arPts[0]; el.ptGe[0] = pts + vtNor * dSWidth; el.ptGe[1] = pts + vtTemp * dSWidth; el.ptGe[2] = pts - vtNor * dSWidth; cplCurve.append(el); el.ptGe[0] = pts + vtNor * dSWidth; el.ptGe[1] = pts - vtTemp * dSWidth; el.ptGe[2] = pts - vtNor * dSWidth; cplCurve.append(el); //Br1投影椭圆1 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); AcDbPolyline pPolyLine, pPolyLine1, pPolyLine2; AcGeVector3d vtBr1toBr2; AcGePoint3dArray arPtsEll; pte = arPts[6]; pte.z = pts.z; ptm = arPts[18]; ptm.z = pts.z; vtBr1toBr2 = pte - ptm; int iRes = TAuxTools::GetEllipseFromCircle(pte, dBr1Width * 2, vtBr1, vtZAxis, pPolyLine, vtBr1toBr2); if (iRes == 2) { arPtsEll.setLogicalLength(0); TAuxTools::GetArcPoint(pPolyLine, arPtsEll); for(int i = 0; i < arPtsEll.length()-1; i++) { el.ptGe[0] = arPtsEll[i]; el.ptGe[1] = arPtsEll[i+1]; el.ptGe[2] = arPtsEll[i+1]; cplCurve.append(el); } ptlineEndU = arPtsEll.first(); ptlineEndD = arPtsEll.last(); } //椭圆2 iRes = TAuxTools::GetEllipseFromCircle(ptm, dBr2Width * 2, vtBr1, vtZAxis, pPolyLine2, -vtBr1toBr2); if (iRes == 2) { arPtsEll.setLogicalLength(0); TAuxTools::GetArcPoint(pPolyLine2, arPtsEll); for(int i = 0; i < arPtsEll.length()-1; i++) { el.ptGe[0] = arPtsEll[i]; el.ptGe[1] = arPtsEll[i+1]; el.ptGe[2] = arPtsEll[i+1]; cplCurve.append(el); } ptlineEndU = arPtsEll.last(); ptlineEndD = arPtsEll.first(); } AcGePoint3d ptIntersect1, ptIntersect2, ptIntersect3, ptIntersect4; AcGeCircArc3d cirarc(arPts[0], vtStar, dSWidth); AcGeLine3d pline1(ptlineStaU, ptlineStaU + vtBr1toBr2 * 100); AcGeLine3d pline2(ptlineStaD, ptlineStaD + vtBr1toBr2 * 100); AcGeLine3d pline3(ptlineEndU, ptlineEndU + vtBr1toBr2 * 100); AcGeLine3d pline4(ptlineEndD, ptlineEndD + vtBr1toBr2 * 100); int nNum = 0, nNum2 = 0; cirarc.intersectWith((AcGeLinearEnt3d&)pline1, nNum, ptIntersect1, ptIntersect2); if (2 == nNum) { if (ptlineStaU.distanceTo(ptIntersect1) > ptlineStaU.distanceTo(ptIntersect2)) { ptIntersect1 = ptIntersect2; } } el.ptGe[0] = ptlineStaU; el.ptGe[1] = ptIntersect1; el.ptGe[2] = ptIntersect1; cplCurve.append(el); cirarc.intersectWith((AcGeLinearEnt3d&)pline2, nNum, ptIntersect1, ptIntersect2); if (2 == nNum) { if (ptlineStaD.distanceTo(ptIntersect1) > ptlineStaD.distanceTo(ptIntersect2)) { ptIntersect1 = ptIntersect2; } } el.ptGe[0] = ptlineStaD; el.ptGe[1] = ptIntersect1; el.ptGe[2] = ptIntersect1; cplCurve.append(el); cirarc.intersectWith((AcGeLinearEnt3d&)pline3, nNum, ptIntersect1, ptIntersect2); if (2 == nNum) { if (ptlineEndU.distanceTo(ptIntersect1) > ptlineEndU.distanceTo(ptIntersect2)) { ptIntersect1 = ptIntersect2; } } el.ptGe[0] = ptlineEndU; el.ptGe[1] = ptIntersect1; el.ptGe[2] = ptIntersect1; cplCurve.append(el); cirarc.intersectWith((AcGeLinearEnt3d&)pline4, nNum, ptIntersect1, ptIntersect2); if (2 == nNum) { if (ptlineEndD.distanceTo(ptIntersect1) > ptlineEndD.distanceTo(ptIntersect2)) { ptIntersect1 = ptIntersect2; } } el.ptGe[0] = ptlineEndD; el.ptGe[1] = ptIntersect1; el.ptGe[2] = ptIntersect1; cplCurve.append(el); } } } } return cplCurve.length() > 0; } // 承插 BOOL ImpHvacCross::MakeInsertCross2dCurves( AecComplexCurve& cplCurve, int &nType, BOOL bIntub /*= FALSE*/ ) const { ASSERT(NULL != m_pXDataMap); AcGePoint3dArray arPts; GetCrossPts(arPts,FALSE,TRUE); ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType,(int&)eSectType); AecEqui::AecCurveElement el; memset(&el,0,sizeof(AecEqui::AecCurveElement)); AcDbObjectId idBaseLayer(NULL), idSideLayer(NULL); m_pXDataMap->GetAt(HVAC_EndLayer, idSideLayer); AcGeVector3d vtStart = AcGeVector3d::kIdentity; AcGeVector3d vtBr1 = AcGeVector3d::kIdentity; AcGeVector3d vtBr2 = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); double dThick = 0.0; double dBrThick1 = 0.0; double dBrThick2 = 0.0; double dPlusEdge = MayAsMUnit(50.0); m_pXDataMap->GetAt(HCRS_Thick, dThick); m_pXDataMap->GetAt(HCRS_Branch1Thick, dBrThick1); m_pXDataMap->GetAt(HCRS_Branch2Thick, dBrThick2); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); vtStart.normalize(); vtBr1.normalize(); vtBr2.normalize(); double dEdgeWidth = GetEdgeLineWidth(); double dCenWidth = GetCentLineWidth(); double dEndLineWidth = GetEndLineWidth(); if (eSectType == eRect) { if (IsHorzAlignment()) { // 俯视矩形口 if (0 == nType) { el.dWidth = dEdgeWidth; AcGePoint3d ptTmp1 = AcGePoint3d::kOrigin; AcGePoint3d ptTmp2 = AcGePoint3d::kOrigin; ptTmp1 = arPts[8] - vtStart * dPlusEdge; ptTmp2 = arPts[10] - vtBr1 * dPlusEdge; el.ptGe[0] = arPts[8]; el.ptGe[1] = ptTmp1; el.ptGe[2] = ptTmp1; cplCurve.append(el); el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); el.ptGe[0] = ptTmp2; el.ptGe[1] = arPts[10]; el.ptGe[2] = arPts[10]; cplCurve.append(el); el.ptGe[0] = ptTmp1; el.ptGe[1] = arPts[12]; el.ptGe[2] = arPts[12]; cplCurve.append(el); el.ptGe[0] = arPts[11]; el.ptGe[1] = arPts[12]; el.ptGe[2] = arPts[12]; cplCurve.append(el); el.ptGe[0] = arPts[12]; el.ptGe[1] = arPts[13]; el.ptGe[2] = arPts[13]; cplCurve.append(el); el.ptGe[0] = arPts[14]; el.ptGe[1] = arPts[15]; el.ptGe[2] = arPts[15]; cplCurve.append(el); el.ptGe[0] = arPts[15]; el.ptGe[1] = arPts[16]; el.ptGe[2] = arPts[16]; cplCurve.append(el); ptTmp1 = arPts[17] - vtBr2 * dPlusEdge; ptTmp2 = arPts[19] - vtStart * dPlusEdge; el.ptGe[0] = arPts[17]; el.ptGe[1] = ptTmp1; el.ptGe[2] = ptTmp1; cplCurve.append(el); el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); el.ptGe[0] = ptTmp2; el.ptGe[1] = arPts[19]; el.ptGe[2] = arPts[19]; cplCurve.append(el); el.ptGe[0] = arPts[15]; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); el.idSubLay = idSideLayer; el.dWidth = dEndLineWidth; el.ptGe[0] = arPts[10]; el.ptGe[1] = arPts[11]; el.ptGe[2] = arPts[11]; cplCurve.append(el); el.ptGe[0] = arPts[16]; el.ptGe[1] = arPts[17]; el.ptGe[2] = arPts[17]; cplCurve.append(el); if (!bIntub) { el.ptGe[0] = arPts[13]; el.ptGe[1] = arPts[14]; el.ptGe[2] = arPts[14]; cplCurve.append(el); el.ptGe[0] = arPts[19]; el.ptGe[1] = arPts[8]; el.ptGe[2] = arPts[8]; cplCurve.append(el); } } if (1 == nType && (HasBaseLine() || IsSingleLine())) { el.gsMark = -1; el.idSubLay = idBaseLayer; if (IsSingleLine()) el.dWidth = dEdgeWidth; else el.dWidth = dCenWidth; AcGePoint3d ptCen = arPts[7]; if (arPts[0].distanceTo(arPts[1]) < arPts[0].distanceTo(arPts[7])) { ptCen = arPts[1]; } AcGePoint3d ptPlusEdgeS = GetPlusEdgeStartPt(); AcGePoint3d ptPlusEdgeE = GetPlusEdgeEndPt(); AcGePoint3d ptPlusEdgeB1 = GetPlusEdgeBra1Pt(); AcGePoint3d ptPlusEdgeB2 = GetPlusEdgeBra2Pt(); el.ptGe[0] = arPts[0]; el.ptGe[1] = ptPlusEdgeS; el.ptGe[2] = ptPlusEdgeS; cplCurve.append(el); el.ptGe[0] = arPts[2]; el.ptGe[1] = ptPlusEdgeE; el.ptGe[2] = ptPlusEdgeE; cplCurve.append(el); el.ptGe[0] = arPts[4]; el.ptGe[1] = ptPlusEdgeB1; el.ptGe[2] = ptPlusEdgeB1; cplCurve.append(el); el.ptGe[0] = arPts[6]; el.ptGe[1] = ptPlusEdgeB2; el.ptGe[2] = ptPlusEdgeB2; cplCurve.append(el); el.ptGe[0] = ptPlusEdgeS; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = ptPlusEdgeE; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = ptPlusEdgeB1; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = ptPlusEdgeB2; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); } } else if (IsVertAlignment()) { AcGePoint3d ptTmp = AcGePoint3d::kOrigin; AcGePoint3dArray arPtsV; if (IsStartVertAlignment()) { ptTmp = arPts[13]; ptTmp.z = arPts[4].z; arPtsV.append(ptTmp); ptTmp = arPts[11]; ptTmp.z = arPts[4].z; arPtsV.append(ptTmp); ptTmp = arPts[10]; ptTmp.z = arPts[4].z; arPtsV.append(ptTmp); ptTmp = arPts[8]; ptTmp.z = arPts[4].z; arPtsV.append(ptTmp); AcGeVector3d vtNor = GetSectNormal(); vtNor.normalize(); AcGePoint3d ptTmp1 = AcGePoint3d::kOrigin; AcGePoint3d ptTmp2 = AcGePoint3d::kOrigin; ptTmp1 = arPtsV[0] + vtNor * dThick / 2.0; ptTmp2 = arPtsV[0] - vtNor * dThick / 2.0; el.dWidth = dEdgeWidth; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[1] + vtNor * dBrThick1 / 2.0; ptTmp2 = arPtsV[1] - vtNor * dBrThick1 / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[2] + vtNor * dBrThick1 / 2.0; ptTmp2 = arPtsV[2] - vtNor * dBrThick1 / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[3] + vtNor * dThick / 2.0; ptTmp2 = arPtsV[3] - vtNor * dThick / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[0] + vtNor * dThick / 2.0; ptTmp2 = arPtsV[3] + vtNor * dThick / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[0] - vtNor * dThick / 2.0; ptTmp2 = arPtsV[3] - vtNor * dThick / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[1] + vtNor * dBrThick1 / 2.0; ptTmp2 = arPtsV[2] + vtNor * dBrThick1 / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[1] - vtNor * dBrThick1 / 2.0; ptTmp2 = arPtsV[2] - vtNor * dBrThick1 / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); } else if (IsBr1VertAlignment()) { ptTmp = arPts[10]; ptTmp.z = arPts[4].z; arPtsV.append(ptTmp); ptTmp = arPts[8]; ptTmp.z = arPts[4].z; arPtsV.append(ptTmp); ptTmp = arPts[19]; ptTmp.z = arPts[4].z; arPtsV.append(ptTmp); ptTmp = arPts[17]; ptTmp.z = arPts[4].z; arPtsV.append(ptTmp); AcGeVector3d vtNor = GetSectNormal(); vtNor.normalize(); AcGePoint3d ptTmp1 = AcGePoint3d::kOrigin; AcGePoint3d ptTmp2 = AcGePoint3d::kOrigin; ptTmp1 = arPtsV[0] + vtNor * dBrThick1 / 2.0; ptTmp2 = arPtsV[0] - vtNor * dBrThick2 / 2.0; el.dWidth = dEdgeWidth; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[1] + vtNor * dThick / 2.0; ptTmp2 = arPtsV[1] - vtNor * dThick / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[2] + vtNor * dThick / 2.0; ptTmp2 = arPtsV[2] - vtNor * dThick / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[3] + vtNor * dBrThick2 / 2.0; ptTmp2 = arPtsV[3] - vtNor * dBrThick2 / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[0] + vtNor * dBrThick1 / 2.0; ptTmp2 = arPtsV[1] + vtNor * dBrThick1 / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[0] - vtNor * dBrThick1 / 2.0; ptTmp2 = arPtsV[1] - vtNor * dBrThick1 / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[1] + vtNor * dThick / 2.0; ptTmp2 = arPtsV[2] + vtNor * dThick / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[1] - vtNor * dThick / 2.0; ptTmp2 = arPtsV[2] - vtNor * dThick / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[2] + vtNor * dBrThick2 / 2.0; ptTmp2 = arPtsV[3] + vtNor * dBrThick2 / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); ptTmp1 = arPtsV[2] - vtNor * dBrThick2 / 2.0; ptTmp2 = arPtsV[3] - vtNor * dBrThick2 / 2.0; el.ptGe[0] = ptTmp1; el.ptGe[1] = ptTmp2; el.ptGe[2] = ptTmp2; cplCurve.append(el); } } } // 圆形口 if (eSectType == eCircle) { arPts.setLogicalLength(0); if (!GetInsertCirPts(arPts)) return FALSE; if (IsHorzAlignment()) { // 俯视 if (0 == nType) { el.dWidth = dEdgeWidth; el.ptGe[0] = arPts[1]; el.ptGe[1] = arPts[13]; el.ptGe[2] = arPts[13]; cplCurve.append(el); el.ptGe[0] = arPts[13]; el.ptGe[1] = arPts[18]; el.ptGe[2] = arPts[18]; cplCurve.append(el); el.ptGe[0] = arPts[18]; el.ptGe[1] = arPts[8]; el.ptGe[2] = arPts[8]; cplCurve.append(el); el.ptGe[0] = arPts[7]; el.ptGe[1] = arPts[19]; el.ptGe[2] = arPts[19]; cplCurve.append(el); el.ptGe[0] = arPts[19]; el.ptGe[1] = arPts[17]; el.ptGe[2] = arPts[17]; cplCurve.append(el); el.ptGe[0] = arPts[17]; el.ptGe[1] = arPts[5]; el.ptGe[2] = arPts[5]; cplCurve.append(el); el.ptGe[0] = arPts[4]; el.ptGe[1] = arPts[16]; el.ptGe[2] = arPts[16]; cplCurve.append(el); el.ptGe[0] = arPts[16]; el.ptGe[1] = arPts[21]; el.ptGe[2] = arPts[21]; cplCurve.append(el); el.ptGe[0] = arPts[21]; el.ptGe[1] = arPts[11]; el.ptGe[2] = arPts[11]; cplCurve.append(el); el.ptGe[0] = arPts[10]; el.ptGe[1] = arPts[20]; el.ptGe[2] = arPts[20]; cplCurve.append(el); el.ptGe[0] = arPts[20]; el.ptGe[1] = arPts[14]; el.ptGe[2] = arPts[14]; cplCurve.append(el); el.ptGe[0] = arPts[14]; el.ptGe[1] = arPts[2]; el.ptGe[2] = arPts[2]; cplCurve.append(el); el.ptGe[0] = arPts[18]; el.ptGe[1] = arPts[22]; el.ptGe[2] = arPts[19]; cplCurve.append(el); el.ptGe[0] = arPts[20]; el.ptGe[1] = arPts[23]; el.ptGe[2] = arPts[21]; cplCurve.append(el); el.dWidth = dEndLineWidth; el.idSubLay = idSideLayer; el.ptGe[0] = arPts[5]; el.ptGe[1] = arPts[4]; el.ptGe[2] = arPts[4]; cplCurve.append(el); el.ptGe[0] = arPts[8]; el.ptGe[1] = arPts[7]; el.ptGe[2] = arPts[7]; cplCurve.append(el); el.ptGe[0] = arPts[2]; el.ptGe[1] = arPts[1]; el.ptGe[2] = arPts[1]; cplCurve.append(el); el.ptGe[0] = arPts[11]; el.ptGe[1] = arPts[10]; el.ptGe[2] = arPts[10]; cplCurve.append(el); } if (1 == nType && (HasBaseLine() || IsSingleLine())) { el.gsMark = -1; el.idSubLay = idBaseLayer; if (IsSingleLine()) el.dWidth = dEdgeWidth; else el.dWidth = dCenWidth; el.ptGe[0] = arPts[0]; el.ptGe[1] = arPts[12]; el.ptGe[2] = arPts[12]; cplCurve.append(el); el.ptGe[0] = arPts[12]; el.ptGe[1] = arPts[15]; el.ptGe[2] = arPts[15]; cplCurve.append(el); el.ptGe[0] = arPts[3]; el.ptGe[1] = arPts[15]; el.ptGe[2] = arPts[15]; cplCurve.append(el); el.ptGe[0] = arPts[6]; el.ptGe[1] = arPts[12]; el.ptGe[2] = arPts[12]; cplCurve.append(el); el.ptGe[0] = arPts[9]; el.ptGe[1] = arPts[12]; el.ptGe[2] = arPts[12]; cplCurve.append(el); } } else if (IsVertAlignment()) { MakeOrthoCross2dCurves(cplCurve, nType); } } return cplCurve.length() > 0; } // 斜接 BOOL ImpHvacCross::MakeInclineCross2dCurves(AecComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType,(int&)eSectType); AcDbObjectId idBaseLayer(NULL), idSideLayer(NULL); m_pXDataMap->GetAt(HVAC_EndLayer, idSideLayer); idBaseLayer = layerId(); double dEdgeWidth = GetEdgeLineWidth(); double dCenWidth = GetCentLineWidth(); double dEndLineWidth = GetEndLineWidth(); if (eSectType == eRect) { MakeArcuateCross2dCurves(cplCurve, nType); } else if (eSectType == eCircle) { AcGePoint3dArray arPts; if(!GetInclineCirPts(arPts)) return FALSE; AecEqui::AecCurveElement el; memset(&el,0,sizeof(AecEqui::AecCurveElement)); if (IsHorzAlignment()) { if (0 == nType) { el.dWidth = dEdgeWidth; el.ptGe[0] = arPts[1]; el.ptGe[1] = arPts[13]; el.ptGe[2] = arPts[13]; cplCurve.append(el); el.ptGe[0] = arPts[13]; el.ptGe[1] = arPts[20]; el.ptGe[2] = arPts[20]; cplCurve.append(el); el.ptGe[0] = arPts[20]; el.ptGe[1] = arPts[8]; el.ptGe[2] = arPts[8]; cplCurve.append(el); el.ptGe[0] = arPts[7]; el.ptGe[1] = arPts[19]; el.ptGe[2] = arPts[19]; cplCurve.append(el); el.ptGe[0] = arPts[19]; el.ptGe[1] = arPts[24]; el.ptGe[2] = arPts[24]; cplCurve.append(el); el.ptGe[0] = arPts[24]; el.ptGe[1] = arPts[17]; el.ptGe[2] = arPts[17]; cplCurve.append(el); el.ptGe[0] = arPts[17]; el.ptGe[1] = arPts[5]; el.ptGe[2] = arPts[5]; cplCurve.append(el); el.ptGe[0] = arPts[4]; el.ptGe[1] = arPts[16]; el.ptGe[2] = arPts[16]; cplCurve.append(el); el.ptGe[0] = arPts[16]; el.ptGe[1] = arPts[25]; el.ptGe[2] = arPts[25]; cplCurve.append(el); el.ptGe[0] = arPts[25]; el.ptGe[1] = arPts[23]; el.ptGe[2] = arPts[23]; cplCurve.append(el); el.ptGe[0] = arPts[23]; el.ptGe[1] = arPts[11]; el.ptGe[2] = arPts[11]; cplCurve.append(el); el.ptGe[0] = arPts[10]; el.ptGe[1] = arPts[22]; el.ptGe[2] = arPts[22]; cplCurve.append(el); el.ptGe[0] = arPts[22]; el.ptGe[1] = arPts[14]; el.ptGe[2] = arPts[14]; cplCurve.append(el); el.ptGe[0] = arPts[14]; el.ptGe[1] = arPts[2]; el.ptGe[2] = arPts[2]; cplCurve.append(el); el.ptGe[0] = arPts[0]; el.ptGe[1] = arPts[12]; el.ptGe[2] = arPts[12]; cplCurve.append(el); el.ptGe[0] = arPts[12]; el.ptGe[1] = arPts[24]; el.ptGe[2] = arPts[24]; cplCurve.append(el); el.ptGe[0] = arPts[12]; el.ptGe[1] = arPts[25]; el.ptGe[2] = arPts[25]; cplCurve.append(el); el.dWidth = dEndLineWidth; el.idSubLay = idSideLayer; el.ptGe[0] = arPts[8]; el.ptGe[1] = arPts[7]; el.ptGe[2] = arPts[7]; cplCurve.append(el); el.ptGe[0] = arPts[2]; el.ptGe[1] = arPts[1]; el.ptGe[2] = arPts[1]; cplCurve.append(el); el.ptGe[0] = arPts[5]; el.ptGe[1] = arPts[4]; el.ptGe[2] = arPts[4]; cplCurve.append(el); el.ptGe[0] = arPts[11]; el.ptGe[1] = arPts[10]; el.ptGe[2] = arPts[10]; cplCurve.append(el); } if (1 == nType && (HasBaseLine() || IsSingleLine())) { el.gsMark = -1; if (IsSingleLine()) el.dWidth = dEdgeWidth; else el.dWidth = dCenWidth; el.ptGe[0] = arPts[12]; el.ptGe[1] = arPts[0]; el.ptGe[2] = arPts[0]; cplCurve.append(el); el.ptGe[0] = arPts[6]; el.ptGe[1] = arPts[18]; el.ptGe[2] = arPts[18]; cplCurve.append(el); el.ptGe[0] = arPts[9]; el.ptGe[1] = arPts[21]; el.ptGe[2] = arPts[21]; cplCurve.append(el); el.ptGe[0] = arPts[3]; el.ptGe[1] = arPts[15]; el.ptGe[2] = arPts[15]; cplCurve.append(el); el.ptGe[0] = arPts[12]; el.ptGe[1] = arPts[18]; el.ptGe[2] = arPts[18]; cplCurve.append(el); el.ptGe[0] = arPts[12]; el.ptGe[1] = arPts[15]; el.ptGe[2] = arPts[15]; cplCurve.append(el); el.ptGe[0] = arPts[12]; el.ptGe[1] = arPts[21]; el.ptGe[2] = arPts[21]; cplCurve.append(el); } } else if (IsVertAlignment()) { if (IsBr1VertAlignment()) // 侧视 { AcGePoint3d ptTmp = AcGePoint3d::kOrigin; AcGePoint3dArray arPtsV; ptTmp = arPts[8]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); ptTmp = arPts[6]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); ptTmp = arPts[1]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); ptTmp = arPts[0]; arPtsV.append(ptTmp); ptTmp = arPts[2]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); ptTmp = arPts[9]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); ptTmp = arPts[10]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); ptTmp = arPts[18]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); ptTmp = arPts[21]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); double dBr1Width = 0.0; double dBr2Width = 0.0; double dSWidth = 0.0; AcGeVector3d vtBr1 = AcGeVector3d::kIdentity; AcGeVector3d vtBr2 = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(HCRS_StartDiameter, dSWidth); m_pXDataMap->GetAt(HCRS_Branch1Diameter, dBr1Width); m_pXDataMap->GetAt(HCRS_Branch2Diameter, dBr2Width); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); AcGeVector3d vtNor = GetSectNormal(); AcDbPolyline pPolyLine; int iRes = TAuxTools::GetEllipseFromCircle(arPtsV[1], dBr1Width, vtBr1, vtZAxis, pPolyLine, arPtsV[0] - arPtsV[6]); el.dWidth = dEdgeWidth; if (iRes == 2 || iRes == 0) { AcGePoint3dArray arPtsEll; TAuxTools::GetArcPoint(pPolyLine, arPtsEll); for(int i = 0; i < arPtsEll.length()-1; i++) { el.ptGe[0] = arPtsEll[i]; el.ptGe[1] = arPtsEll[i+1]; el.ptGe[2] = arPtsEll[i+1]; cplCurve.append(el); } } else { el.ptGe[0] = arPtsV[1] - vtNor * dBr1Width / 2.0; el.ptGe[1] = arPtsV[1] + vtNor * dBr1Width / 2.0; el.ptGe[2] = arPtsV[1] + vtNor * dBr1Width / 2.0; cplCurve.append(el); } el.ptGe[0] = arPtsV[1] - vtNor * dBr1Width / 2.0; el.ptGe[1] = arPtsV[7] - vtNor * dBr1Width / 2.0; el.ptGe[2] = arPtsV[7] - vtNor * dBr1Width / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[1] + vtNor * dBr1Width / 2.0; el.ptGe[1] = arPtsV[7] + vtNor * dBr1Width / 2.0; el.ptGe[2] = arPtsV[7] + vtNor * dBr1Width / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[3] - vtNor * dSWidth / 2.0; el.ptGe[1] = arPtsV[2]; el.ptGe[2] = arPtsV[3] + vtNor * dSWidth / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[3] - vtNor * dSWidth / 2.0; el.ptGe[1] = arPtsV[4]; el.ptGe[2] = arPtsV[3] + vtNor * dSWidth / 2.0; cplCurve.append(el); AcDbPolyline pPolyLine1; iRes = TAuxTools::GetEllipseFromCircle(arPtsV[5], dBr2Width, vtBr2, vtZAxis, pPolyLine1, arPtsV[6] - arPtsV[0]); if (iRes == 2 || iRes == 0) { AcGePoint3dArray arPtsEll; TAuxTools::GetArcPoint(pPolyLine1, arPtsEll); for(int i = 0; i < arPtsEll.length()-1; i++) { el.ptGe[0] = arPtsEll[i]; el.ptGe[1] = arPtsEll[i+1]; el.ptGe[2] = arPtsEll[i+1]; cplCurve.append(el); } } else { el.ptGe[0] = arPtsV[5] - vtNor * dBr2Width / 2.0; el.ptGe[1] = arPtsV[5] + vtNor * dBr2Width / 2.0; el.ptGe[2] = arPtsV[5] + vtNor * dBr2Width / 2.0; cplCurve.append(el); } el.ptGe[0] = arPtsV[5] - vtNor * dBr2Width / 2.0; el.ptGe[1] = arPtsV[8] - vtNor * dBr2Width / 2.0; el.ptGe[2] = arPtsV[8] - vtNor * dBr2Width / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[5] + vtNor * dBr2Width / 2.0; el.ptGe[1] = arPtsV[8] + vtNor * dBr2Width / 2.0; el.ptGe[2] = arPtsV[8] + vtNor * dBr2Width / 2.0; cplCurve.append(el); if (dBr1Width < dSWidth) { AcGePoint3d ptIntersect1,ptIntersect2; //求出直线于圆弧的交点 AcGeCircArc3d circArc(arPtsV[3] - vtNor * dSWidth / 2.0, arPtsV[2], arPtsV[3] + vtNor * dSWidth / 2.0); //定义求交直线 AcGeLine3d *pLine = new AcGeLine3d(arPtsV[7] - vtNor * dBr1Width / 2.0, arPtsV[3] - vtNor * dSWidth / 2.0); int nNum=0;//交点数 circArc.intersectWith(*pLine, nNum, ptIntersect1, ptIntersect2); delete pLine; if (2 == nNum) { AcGePoint3d ptTmp = arPtsV[7] - vtNor * dBr1Width / 2.0; if (ptTmp.distanceTo(ptIntersect1) < ptTmp.distanceTo(ptIntersect2)) { el.ptGe[0] = ptTmp; el.ptGe[1] = ptIntersect1; el.ptGe[2] = ptIntersect1; cplCurve.append(el); } else { el.ptGe[0] = ptTmp; el.ptGe[1] = ptIntersect2; el.ptGe[2] = ptIntersect2; cplCurve.append(el); } } pLine = new AcGeLine3d(arPtsV[7] + vtNor * dBr1Width / 2.0, arPtsV[3] + vtNor * dSWidth / 2.0); nNum = 0; circArc.intersectWith(*pLine, nNum, ptIntersect1, ptIntersect2); delete pLine; if (2 == nNum) { AcGePoint3d ptTmp = arPtsV[7] + vtNor * dBr1Width / 2.0; if (ptTmp.distanceTo(ptIntersect1) < ptTmp.distanceTo(ptIntersect2)) { el.ptGe[0] = ptTmp; el.ptGe[1] = ptIntersect1; el.ptGe[2] = ptIntersect1; cplCurve.append(el); } else { el.ptGe[0] = ptTmp; el.ptGe[1] = ptIntersect2; el.ptGe[2] = ptIntersect2; cplCurve.append(el); } } } else { el.ptGe[0] = arPtsV[7] - vtNor * dBr1Width / 2.0; el.ptGe[1] = arPtsV[3] - vtNor * dSWidth / 2.0; el.ptGe[2] = arPtsV[3] - vtNor * dSWidth / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[7] + vtNor * dBr1Width / 2.0; el.ptGe[1] = arPtsV[3] + vtNor * dSWidth / 2.0; el.ptGe[2] = arPtsV[3] + vtNor * dSWidth / 2.0; cplCurve.append(el); } if (dBr2Width < dSWidth) { AcGePoint3d ptIntersect1,ptIntersect2; //求出直线于圆弧的交点 AcGeCircArc3d circArc(arPtsV[3] - vtNor * dSWidth / 2.0, arPtsV[4], arPtsV[3] + vtNor * dSWidth / 2.0); //定义求交直线 AcGeLine3d *pLine = new AcGeLine3d(arPtsV[8] - vtNor * dBr2Width / 2.0, arPtsV[3] - vtNor * dSWidth / 2.0); int nNum=0;//交点数 circArc.intersectWith(*pLine, nNum, ptIntersect1, ptIntersect2); delete pLine; if (2 == nNum) { AcGePoint3d ptTmp = arPtsV[8] - vtNor * dBr2Width / 2.0; if (ptTmp.distanceTo(ptIntersect1) < ptTmp.distanceTo(ptIntersect2)) { el.ptGe[0] = ptTmp; el.ptGe[1] = ptIntersect1; el.ptGe[2] = ptIntersect1; cplCurve.append(el); } else { el.ptGe[0] = ptTmp; el.ptGe[1] = ptIntersect2; el.ptGe[2] = ptIntersect2; cplCurve.append(el); } } pLine = new AcGeLine3d(arPtsV[8] + vtNor * dBr2Width / 2.0, arPtsV[3] + vtNor * dSWidth / 2.0); nNum = 0; circArc.intersectWith(*pLine, nNum, ptIntersect1, ptIntersect2); delete pLine; if (2 == nNum) { AcGePoint3d ptTmp = arPtsV[8] + vtNor * dBr2Width / 2.0; if (ptTmp.distanceTo(ptIntersect1) < ptTmp.distanceTo(ptIntersect2)) { el.ptGe[0] = ptTmp; el.ptGe[1] = ptIntersect1; el.ptGe[2] = ptIntersect1; cplCurve.append(el); } else { el.ptGe[0] = ptTmp; el.ptGe[1] = ptIntersect2; el.ptGe[2] = ptIntersect2; cplCurve.append(el); } } } else { el.ptGe[0] = arPtsV[8] - vtNor * dBr2Width / 2.0; el.ptGe[1] = arPtsV[3] - vtNor * dSWidth / 2.0; el.ptGe[2] = arPtsV[3] - vtNor * dSWidth / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[8] + vtNor * dBr2Width / 2.0; el.ptGe[1] = arPtsV[3] + vtNor * dSWidth / 2.0; el.ptGe[2] = arPtsV[3] + vtNor * dSWidth / 2.0; cplCurve.append(el); } } if (IsStartVertAlignment()) // 主视 { AcGePoint3d ptTmp = AcGePoint3d::kOrigin; AcGePoint3dArray arPtsV; ptTmp = arPts[1]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); ptTmp = arPts[5]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); ptTmp = arPts[8]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); ptTmp = arPts[6]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); ptTmp = arPts[7]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); ptTmp = arPts[13]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); ptTmp = arPts[17]; ptTmp.z = arPts[0].z; arPtsV.append(ptTmp); double dSWidth = 0.0; double dEWidth = 0.0; double dBr1Width = 0.0; AcGeVector3d vtBr1 = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(HCRS_StartDiameter, dSWidth); m_pXDataMap->GetAt(HCRS_EndDiameter, dEWidth); m_pXDataMap->GetAt(HCRS_Branch1Diameter, dBr1Width); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); AcGeVector3d vtNor = GetSectNormal(); vtNor.normalize(); el.dWidth = dEdgeWidth; el.ptGe[0] = arPtsV[0] - vtNor * dSWidth / 2.0; el.ptGe[1] = arPtsV[0] + vtNor * dSWidth / 2.0; el.ptGe[2] = arPtsV[0] + vtNor * dSWidth / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[1] - vtNor * dEWidth / 2.0; el.ptGe[1] = arPtsV[1] + vtNor * dEWidth / 2.0; el.ptGe[2] = arPtsV[1] + vtNor * dEWidth / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[0] - vtNor * dSWidth / 2.0; el.ptGe[1] = arPtsV[5] - vtNor * dSWidth / 2.0; el.ptGe[2] = arPtsV[5] - vtNor * dSWidth / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[6] - vtNor * dEWidth / 2.0; el.ptGe[1] = arPtsV[5] - vtNor * dSWidth / 2.0; el.ptGe[2] = arPtsV[5] - vtNor * dSWidth / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[1] - vtNor * dEWidth / 2.0; el.ptGe[1] = arPtsV[6] - vtNor * dEWidth / 2.0; el.ptGe[2] = arPtsV[6] - vtNor * dEWidth / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[0] + vtNor * dSWidth / 2.0; el.ptGe[1] = arPtsV[5] + vtNor * dSWidth / 2.0; el.ptGe[2] = arPtsV[5] + vtNor * dSWidth / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[6] + vtNor * dEWidth / 2.0; el.ptGe[1] = arPtsV[5] + vtNor * dSWidth / 2.0; el.ptGe[2] = arPtsV[5] + vtNor * dSWidth / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[6] + vtNor * dEWidth / 2.0; el.ptGe[1] = arPtsV[1] + vtNor * dEWidth / 2.0; el.ptGe[2] = arPtsV[1] + vtNor * dEWidth / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[5] - vtNor * dSWidth / 2.0; el.ptGe[1] = arPtsV[3] - vtNor * dBr1Width / 2.0; el.ptGe[2] = arPtsV[3] - vtNor * dBr1Width / 2.0; cplCurve.append(el); el.ptGe[0] = arPtsV[5] + vtNor * dSWidth / 2.0; el.ptGe[1] = arPtsV[3] + vtNor * dBr1Width / 2.0; el.ptGe[2] = arPtsV[3] + vtNor * dBr1Width / 2.0; cplCurve.append(el); AcGeVector3d vtTmp1, vtTmp2; vtTmp1 = GetSectNormal(); vtTmp2 = arPtsV[1] - arPtsV[0]; AcGeVector3d vtTmp = AcGeVector3d::kZAxis;//vtTmp1.crossProduct(vtTmp2) AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); AcDbPolyline pPolyLine; int iRes = TAuxTools::GetEllipseFromCircle(arPtsV[3], dBr1Width, vtBr1, vtZAxis, pPolyLine, vtTmp2); if (iRes == 2 || iRes == 0) { AcGePoint3dArray arEllpts; TAuxTools::GetArcPoint(pPolyLine, arEllpts);// Lixl add 2011-11-23 el.ptGe[0] = arPtsV[3] - vtNor * dBr1Width * 0.5; el.ptGe[1] = arEllpts[3]; el.ptGe[2] = arPtsV[3] + vtNor * dBr1Width * 0.5; cplCurve.append(el); AcDbPolyline pPolyLine1; TAuxTools::GetEllipseFromCircle(arPtsV[3], dBr1Width, vtBr1, vtZAxis, pPolyLine1, -vtTmp2); AcGePoint3dArray arEllpts1; TAuxTools::GetArcPoint(pPolyLine1, arEllpts1);// Lixl add 2011-11-23 el.ptGe[0] = arPtsV[3] - vtNor * dBr1Width * 0.5; el.ptGe[1] = arEllpts1[3]; el.ptGe[2] = arPtsV[3] + vtNor * dBr1Width * 0.5; cplCurve.append(el); } if (iRes == 1) { el.ptGe[0] = arPtsV[3] - vtNor * dBr1Width / 2.0; el.ptGe[1] = arPtsV[3] + vtNor * dBr1Width / 2.0; el.ptGe[2] = arPtsV[3] + vtNor * dBr1Width / 2.0; cplCurve.append(el); } } } } return cplCurve.length() > 0; } // 圆角 BOOL ImpHvacCross::MakeArcuateCross2dCurves( AecComplexCurve& cplCurve, int &nType, BOOL bIntub /*= FALSE*/ ) const { ASSERT(NULL != m_pXDataMap); AcGePoint3dArray arPts; GetArcuateCrossPts(arPts); ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType,(int&)eSectType); AecHvac::HvacCrossType eType = AecHvac::eArcuateCross; AecEqui::AecCurveElement el; memset(&el,0,sizeof(AecEqui::AecCurveElement)); AcDbObjectId idBaseLayer(NULL), idSideLayer(NULL); //m_pXDataMap->GetAt(HVAC_BaseLayer, idBaseLayer); m_pXDataMap->GetAt(HVAC_EndLayer, idSideLayer); m_pXDataMap->GetAt(HCRS_Type, (int&)eType); double dEdgeWidth = GetEdgeLineWidth(); double dCenWidth = GetCentLineWidth(); double dEndLineWidth = GetEndLineWidth(); //水平放置 if (IsHorzAlignment()) { if (arPts.length() == 34) { //外轮廓 if (0 == nType) { el.dWidth = dEdgeWidth; el.ptGe[0] = arPts[1]; el.ptGe[1] = arPts[3]; el.ptGe[2] = arPts[3]; cplCurve.append(el); if (eType == AecHvac::eArcuateCross || eType == AecHvac::eArcuateIntubCross) { el.ptGe[0] = arPts[3]; el.ptGe[1] = arPts[28]; el.ptGe[2] = arPts[11]; cplCurve.append(el); } else if (eType == AecHvac::eInclineCross) { el.ptGe[0] = arPts[3]; el.ptGe[1] = arPts[11]; el.ptGe[2] = arPts[11]; cplCurve.append(el); } el.ptGe[0] = arPts[11]; el.ptGe[1] = arPts[8]; el.ptGe[2] = arPts[8]; cplCurve.append(el); el.ptGe[0] = arPts[7]; el.ptGe[1] = arPts[9]; el.ptGe[2] = arPts[9]; cplCurve.append(el); el.ptGe[0] = arPts[9]; el.ptGe[1] = arPts[30]; el.ptGe[2] = arPts[29]; cplCurve.append(el); el.ptGe[0] = arPts[29]; el.ptGe[1] = arPts[17]; el.ptGe[2] = arPts[17]; cplCurve.append(el); el.ptGe[0] = arPts[17]; el.ptGe[1] = arPts[14]; el.ptGe[2] = arPts[14]; cplCurve.append(el); el.ptGe[0] = arPts[13]; el.ptGe[1] = arPts[15]; el.ptGe[2] = arPts[15]; cplCurve.append(el); el.ptGe[0] = arPts[15]; el.ptGe[1] = arPts[32]; el.ptGe[2] = arPts[32]; cplCurve.append(el); el.ptGe[0] = arPts[32]; el.ptGe[1] = arPts[33]; el.ptGe[2] = arPts[23]; cplCurve.append(el); el.ptGe[0] = arPts[23]; el.ptGe[1] = arPts[20]; el.ptGe[2] = arPts[20]; cplCurve.append(el); el.ptGe[0] = arPts[19]; el.ptGe[1] = arPts[21]; el.ptGe[2] = arPts[21]; cplCurve.append(el); if (eType == AecHvac::eArcuateCross || eType == AecHvac::eArcuateIntubCross) { el.ptGe[0] = arPts[21]; el.ptGe[1] = arPts[31]; el.ptGe[2] = arPts[5]; cplCurve.append(el); } else if (eType == AecHvac::eInclineCross) { el.ptGe[0] = arPts[21]; el.ptGe[1] = arPts[5]; el.ptGe[2] = arPts[5]; cplCurve.append(el); } el.ptGe[0] = arPts[5]; el.ptGe[1] = arPts[2]; el.ptGe[2] = arPts[2]; cplCurve.append(el); el.idSubLay = idSideLayer; el.dWidth = dEndLineWidth; el.ptGe[0] = arPts[8]; el.ptGe[1] = arPts[7]; el.ptGe[2] = arPts[7]; cplCurve.append(el); el.ptGe[0] = arPts[20]; el.ptGe[1] = arPts[19]; el.ptGe[2] = arPts[19]; cplCurve.append(el); // 插管式,添加管壁线及不绘制两端线 if (bIntub) { el.idSubLay.setNull(); el.dWidth = dEdgeWidth; el.ptGe[0] = arPts[3]; el.ptGe[1] = arPts[29]; el.ptGe[2] = arPts[29]; cplCurve.append(el); el.ptGe[0] = arPts[5]; el.ptGe[1] = arPts[32]; el.ptGe[2] = arPts[32]; cplCurve.append(el); } else { el.ptGe[0] = arPts[2]; el.ptGe[1] = arPts[1]; el.ptGe[2] = arPts[1]; cplCurve.append(el); el.ptGe[0] = arPts[13]; el.ptGe[1] = arPts[14]; el.ptGe[2] = arPts[14]; cplCurve.append(el); } } //中心线 if (1 == nType && (HasBaseLine() || IsSingleLine())) { el.gsMark = -1; el.idSubLay = idBaseLayer; if (IsSingleLine()) el.dWidth = dEdgeWidth; else el.dWidth = dCenWidth; AcGePoint3d ptCen,ptInter1,ptInter2; GetIntersectWith(arPts[0],arPts[4],arPts[6],arPts[10],ptInter1); GetIntersectWith(arPts[0],arPts[4],arPts[18],arPts[22],ptInter2); ptCen = ptInter2; if (arPts[0].distanceTo(ptInter1) < arPts[0].distanceTo(ptInter2)) { ptCen = ptInter1; } el.ptGe[0] = arPts[0]; el.ptGe[1] = arPts[4]; el.ptGe[2] = arPts[4]; cplCurve.append(el); el.ptGe[0] = arPts[4]; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = arPts[6]; el.ptGe[1] = arPts[10]; el.ptGe[2] = arPts[10]; cplCurve.append(el); el.ptGe[0] = arPts[10]; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = arPts[12]; el.ptGe[1] = arPts[16]; el.ptGe[2] = arPts[16]; cplCurve.append(el); el.ptGe[0] = arPts[16]; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = arPts[18]; el.ptGe[1] = arPts[22]; el.ptGe[2] = arPts[22]; cplCurve.append(el); el.ptGe[0] = arPts[22]; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); } } } //垂直放置(立管) else if (IsVertAlignment()) { double dThick = 300.0; double dBran1Thick = 300.0, dBran2Thick = 300.0; m_pXDataMap->GetAt(HCRS_Thick, dThick); m_pXDataMap->GetAt(HCRS_Branch1Thick, dBran1Thick); m_pXDataMap->GetAt(HCRS_Branch2Thick, dBran2Thick); AcGePoint3d pt; AcGePoint3dArray arPtsV; //开始矢量和Z轴垂直(前视) if (IsStartVertAlignment()) { //标高与开始点相同 pt = arPts[1]; pt.z = arPts[0].z; arPtsV.append(pt); pt = arPts[8]; pt.z = arPts[0].z; arPtsV.append(pt); pt = arPts[7]; pt.z = arPts[0].z; arPtsV.append(pt); pt = arPts[14]; pt.z = arPts[0].z; arPtsV.append(pt); } //br1矢量和Z轴垂直(左视) else if (IsBr1VertAlignment()) { //标高与Br1点相同 pt = arPts[8]; pt.z = arPts[6].z; arPtsV.append(pt); pt = arPts[1]; pt.z = arPts[6].z; arPtsV.append(pt); pt = arPts[2]; pt.z = arPts[6].z; arPtsV.append(pt); pt = arPts[19]; pt.z = arPts[6].z; arPtsV.append(pt); pt = arPts[3]; pt.z = arPts[6].z; arPtsV.append(pt); pt = arPts[5]; pt.z = arPts[6].z; arPtsV.append(pt); } else return FALSE; if (eType == AecHvac::eArcuateIntubCross) // 圆角(插管) { AcGeVector3d vtNor = GetSectNormal(); { if (IsStartVertAlignment()) { AcGePoint3d pt1, pt2, pt3, pt4; pt1 = arPtsV[0] + vtNor * dThick * 0.5; pt2 = arPtsV[0] - vtNor * dThick * 0.5; pt3 = arPtsV[3] + vtNor * dThick * 0.5; pt4 = arPtsV[3] - vtNor * dThick * 0.5; if (0 == nType) { el.dWidth = dEdgeWidth; el.ptGe[0] = pt1; el.ptGe[1] = pt3; el.ptGe[2] = pt3; cplCurve.append(el); el.ptGe[0] = pt2; el.ptGe[1] = pt4; el.ptGe[2] = pt4; cplCurve.append(el); el.idSubLay = idSideLayer; el.dWidth = dEndLineWidth; el.ptGe[0] = pt2; el.ptGe[1] = pt1; el.ptGe[2] = pt1; cplCurve.append(el); el.ptGe[0] = pt3; el.ptGe[1] = pt4; el.ptGe[2] = pt4; cplCurve.append(el); } pt1 = arPtsV[1] + vtNor * dBran1Thick * 0.5; pt2 = arPtsV[1] - vtNor * dBran1Thick * 0.5; pt3 = arPtsV[2] + vtNor * dBran1Thick * 0.5; pt4 = arPtsV[2] - vtNor * dBran1Thick * 0.5; //if (1 == nType && (HasBaseLine() || IsSingleLine())) //{ el.idSubLay = idSideLayer; el.dWidth = dCenWidth; el.ptGe[0] = pt3; el.ptGe[1] = pt4; el.ptGe[2] = pt4; cplCurve.append(el); el.ptGe[0] = pt1; el.ptGe[1] = pt2; el.ptGe[2] = pt2; cplCurve.append(el); if (dBran1Thick < dThick) { el.ptGe[0] = pt3; el.ptGe[1] = pt1; el.ptGe[2] = pt1; cplCurve.append(el); el.ptGe[0] = pt2; el.ptGe[1] = pt4; el.ptGe[2] = pt4; cplCurve.append(el); } //} } else if (IsBr1VertAlignment()) { AcGePoint3d pt1, pt2, pt3, pt4; pt1 = arPtsV[0] + vtNor * dBran1Thick * 0.5; pt2 = arPtsV[0] - vtNor * dBran1Thick * 0.5; pt3 = arPtsV[4] + vtNor * dBran1Thick * 0.5; pt4 = arPtsV[4] - vtNor * dBran1Thick * 0.5; el.dWidth = dEdgeWidth; el.ptGe[0] = pt1; el.ptGe[1] = pt3; el.ptGe[2] = pt3; cplCurve.append(el); el.ptGe[0] = pt2; el.ptGe[1] = pt4; el.ptGe[2] = pt4; cplCurve.append(el); pt1 = arPtsV[1] + vtNor * dThick * 0.5; pt2 = arPtsV[1] - vtNor * dThick * 0.5; pt3 = arPtsV[2] + vtNor * dThick * 0.5; pt4 = arPtsV[2] - vtNor * dThick * 0.5; el.ptGe[0] = pt1; el.ptGe[1] = pt3; el.ptGe[2] = pt3; cplCurve.append(el); el.ptGe[0] = pt2; el.ptGe[1] = pt4; el.ptGe[2] = pt4; cplCurve.append(el); el.ptGe[0] = pt1; el.ptGe[1] = pt2; el.ptGe[2] = pt2; cplCurve.append(el); el.ptGe[0] = pt4; el.ptGe[1] = pt3; el.ptGe[2] = pt3; cplCurve.append(el); pt1 = arPtsV[3] + vtNor * dBran2Thick * 0.5; pt2 = arPtsV[3] - vtNor * dBran2Thick * 0.5; pt3 = arPtsV[5] + vtNor * dBran2Thick * 0.5; pt4 = arPtsV[5] - vtNor * dBran2Thick * 0.5; el.ptGe[0] = pt1; el.ptGe[1] = pt3; el.ptGe[2] = pt3; cplCurve.append(el); el.ptGe[0] = pt2; el.ptGe[1] = pt4; el.ptGe[2] = pt4; cplCurve.append(el); pt1 = arPtsV[0] + vtNor * dBran1Thick * 0.5; pt2 = arPtsV[0] - vtNor * dBran1Thick * 0.5; pt3 = arPtsV[3] + vtNor * dBran2Thick * 0.5; pt4 = arPtsV[3] - vtNor * dBran2Thick * 0.5; el.idSubLay = idSideLayer; el.dWidth = dEndLineWidth; el.ptGe[0] = pt1; el.ptGe[1] = pt2; el.ptGe[2] = pt2; cplCurve.append(el); el.ptGe[0] = pt3; el.ptGe[1] = pt4; el.ptGe[2] = pt4; cplCurve.append(el); } } } else { AcGeMatrix3d mat; AcGeVector3d vtNor = GetSectNormal(); vtNor.normalize(); vtNor *= dThick * 0.5; mat.setToTranslation(vtNor); for (int i = 0; i < 4; i++) { arPtsV.append(arPtsV[i].transformBy(mat)); } vtNor.normalize(); vtNor *= -dThick; mat.setToTranslation(vtNor); for (i = 0; i < 4; i++) { arPtsV.append(arPtsV[i].transformBy(mat)); } //外轮廓 if (IsStartVertAlignment()) { if (0 == nType) { el.dWidth = dEdgeWidth; el.ptGe[0] = arPtsV[4]; el.ptGe[1] = arPtsV[7]; el.ptGe[2] = arPtsV[7]; cplCurve.append(el); el.ptGe[0] = arPtsV[8]; el.ptGe[1] = arPtsV[11]; el.ptGe[2] = arPtsV[11]; cplCurve.append(el); el.idSubLay = idSideLayer; el.dWidth = dEndLineWidth; el.ptGe[0] = arPtsV[4]; el.ptGe[1] = arPtsV[8]; el.ptGe[2] = arPtsV[8]; cplCurve.append(el); el.ptGe[0] = arPtsV[7]; el.ptGe[1] = arPtsV[11]; el.ptGe[2] = arPtsV[11]; cplCurve.append(el); } else { el.idSubLay = idSideLayer; el.dWidth = dCenWidth; el.ptGe[0] = arPtsV[5]; el.ptGe[1] = arPtsV[9]; el.ptGe[2] = arPtsV[9]; cplCurve.append(el); el.ptGe[0] = arPtsV[6]; el.ptGe[1] = arPtsV[10]; el.ptGe[2] = arPtsV[10]; cplCurve.append(el); el.ptGe[0] = arPtsV[5]; el.ptGe[1] = arPtsV[6]; el.ptGe[2] = arPtsV[6]; cplCurve.append(el); el.ptGe[0] = arPtsV[9]; el.ptGe[1] = arPtsV[10]; el.ptGe[2] = arPtsV[10]; cplCurve.append(el); } } else if (IsBr1VertAlignment()) { if (0 == nType) { el.dWidth = dEdgeWidth; el.idSubLay = idSideLayer; el.dWidth = dEndLineWidth; el.ptGe[0] = arPtsV[6]; el.ptGe[1] = arPtsV[10]; el.ptGe[2] = arPtsV[10]; cplCurve.append(el); el.ptGe[0] = arPtsV[9]; el.ptGe[1] = arPtsV[13]; el.ptGe[2] = arPtsV[13]; cplCurve.append(el); el.ptGe[0] = arPtsV[7]; el.ptGe[1] = arPtsV[11]; el.ptGe[2] = arPtsV[11]; cplCurve.append(el); el.ptGe[0] = arPtsV[8]; el.ptGe[1] = arPtsV[12]; el.ptGe[2] = arPtsV[12]; cplCurve.append(el); } else { el.ptGe[0] = arPtsV[6]; el.ptGe[1] = arPtsV[9]; el.ptGe[2] = arPtsV[9]; cplCurve.append(el); el.ptGe[0] = arPtsV[13]; el.ptGe[1] = arPtsV[10]; el.ptGe[2] = arPtsV[10]; cplCurve.append(el); el.idSubLay = idSideLayer; el.dWidth = dCenWidth; el.ptGe[0] = arPtsV[7]; el.ptGe[1] = arPtsV[8]; el.ptGe[2] = arPtsV[8]; cplCurve.append(el); el.ptGe[0] = arPtsV[11]; el.ptGe[1] = arPtsV[12]; el.ptGe[2] = arPtsV[12]; cplCurve.append(el); } } } } return cplCurve.length() > 0; } // 直角 BOOL ImpHvacCross::MakeLinearCross2dCurves(AecComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); MakeInterCross2dCurves(cplCurve, nType); return FALSE; } // 交叉 BOOL ImpHvacCross::MakeInterCross2dCurves(AecComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); AcGePoint3dArray arPts; GetIntersectCrossPts(arPts); ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType,(int&)eSectType); AecEqui::AecCurveElement el; memset(&el,0,sizeof(AecEqui::AecCurveElement)); AcDbObjectId idBaseLayer(NULL), idSideLayer(NULL); m_pXDataMap->GetAt(HVAC_EndLayer, idSideLayer); double dEdgeWidth = GetEdgeLineWidth(); double dCenWidth = GetCentLineWidth(); double dEndLineWidth = GetEndLineWidth(); //水平放置 if (IsHorzAlignment()) { //方口 if (arPts.length() == 29) { //外轮廓 if (0 == nType) { el.dWidth = dEdgeWidth; el.ptGe[0] = arPts[1]; el.ptGe[1] = arPts[3]; el.ptGe[2] = arPts[3]; cplCurve.append(el); el.ptGe[0] = arPts[3]; el.ptGe[1] = arPts[11]; el.ptGe[2] = arPts[11]; cplCurve.append(el); el.ptGe[0] = arPts[11]; el.ptGe[1] = arPts[8]; el.ptGe[2] = arPts[8]; cplCurve.append(el); el.ptGe[0] = arPts[7]; el.ptGe[1] = arPts[9]; el.ptGe[2] = arPts[9]; cplCurve.append(el); el.ptGe[0] = arPts[9]; el.ptGe[1] = arPts[17]; el.ptGe[2] = arPts[17]; cplCurve.append(el); el.ptGe[0] = arPts[17]; el.ptGe[1] = arPts[14]; el.ptGe[2] = arPts[14]; cplCurve.append(el); el.ptGe[0] = arPts[13]; el.ptGe[1] = arPts[15]; el.ptGe[2] = arPts[15]; cplCurve.append(el); el.ptGe[0] = arPts[15]; el.ptGe[1] = arPts[23]; el.ptGe[2] = arPts[23]; cplCurve.append(el); el.ptGe[0] = arPts[23]; el.ptGe[1] = arPts[20]; el.ptGe[2] = arPts[20]; cplCurve.append(el); el.ptGe[0] = arPts[21]; el.ptGe[1] = arPts[5]; el.ptGe[2] = arPts[5]; cplCurve.append(el); el.ptGe[0] = arPts[5]; el.ptGe[1] = arPts[2]; el.ptGe[2] = arPts[2]; cplCurve.append(el); el.ptGe[0] = arPts[19]; el.ptGe[1] = arPts[21]; el.ptGe[2] = arPts[21]; cplCurve.append(el); el.idSubLay = idSideLayer; el.dWidth = dEndLineWidth; el.ptGe[0] = arPts[8]; el.ptGe[1] = arPts[7]; el.ptGe[2] = arPts[7]; cplCurve.append(el); el.ptGe[0] = arPts[14]; el.ptGe[1] = arPts[13]; el.ptGe[2] = arPts[13]; cplCurve.append(el); el.ptGe[0] = arPts[20]; el.ptGe[1] = arPts[19]; el.ptGe[2] = arPts[19]; cplCurve.append(el); el.ptGe[0] = arPts[2]; el.ptGe[1] = arPts[1]; el.ptGe[2] = arPts[1]; cplCurve.append(el); } //中心线 if (1 == nType && (HasBaseLine() || IsSingleLine())) { AcGePoint3d ptCen = arPts[24]; if (arPts[0].distanceTo(arPts[27]) < arPts[0].distanceTo(arPts[24])) { ptCen = arPts[27]; } el.gsMark = -1; el.idSubLay = idBaseLayer; if (IsSingleLine()) el.dWidth = dEdgeWidth; else el.dWidth = dCenWidth; el.ptGe[0] = arPts[0]; el.ptGe[1] = arPts[4]; el.ptGe[2] = arPts[4]; cplCurve.append(el); el.ptGe[0] = arPts[4]; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = arPts[6]; el.ptGe[1] = arPts[10]; el.ptGe[2] = arPts[10]; cplCurve.append(el); el.ptGe[0] = arPts[10]; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = arPts[12]; el.ptGe[1] = arPts[16]; el.ptGe[2] = arPts[16]; cplCurve.append(el); el.ptGe[0] = arPts[16]; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); el.ptGe[0] = arPts[18]; el.ptGe[1] = arPts[22]; el.ptGe[2] = arPts[22]; cplCurve.append(el); el.ptGe[0] = arPts[22]; el.ptGe[1] = ptCen; el.ptGe[2] = ptCen; cplCurve.append(el); } } } //垂直放置(立管) else if (IsVertAlignment()) { double dThick = 300.0; m_pXDataMap->GetAt(HCRS_Thick, dThick); AcGePoint3d pt; AcGePoint3dArray arPtsV; //开始矢量和Z轴垂直(前视) if (IsStartVertAlignment()) { //标高与开始点相同 pt = arPts[1]; pt.z = arPts[0].z; arPtsV.append(pt); pt = arPts[8]; pt.z = arPts[0].z; arPtsV.append(pt); pt = arPts[7]; pt.z = arPts[0].z; arPtsV.append(pt); pt = arPts[14]; pt.z = arPts[0].z; arPtsV.append(pt); } //br1矢量和Z轴垂直(左视) else if (IsBr1VertAlignment()) { //标高与Br1点相同 pt = arPts[8]; pt.z = arPts[6].z; arPtsV.append(pt); pt = arPts[1]; pt.z = arPts[6].z; arPtsV.append(pt); pt = arPts[2]; pt.z = arPts[6].z; arPtsV.append(pt); pt = arPts[19]; pt.z = arPts[6].z; arPtsV.append(pt); } else return FALSE; AcGeMatrix3d mat; AcGeVector3d vtNor = GetSectNormal(); vtNor.normalize(); vtNor *= dThick * 0.5; mat.setToTranslation(vtNor); for (int i = 0; i < 4; i++) { arPtsV.append(arPtsV[i].transformBy(mat)); } vtNor.normalize(); vtNor *= -dThick; mat.setToTranslation(vtNor); for (i = 0; i < 4; i++) { arPtsV.append(arPtsV[i].transformBy(mat)); } //外轮廓 if (0 == nType) { el.dWidth = dEdgeWidth; el.ptGe[0] = arPtsV[4]; el.ptGe[1] = arPtsV[7]; el.ptGe[2] = arPtsV[7]; cplCurve.append(el); el.ptGe[0] = arPtsV[8]; el.ptGe[1] = arPtsV[11]; el.ptGe[2] = arPtsV[11]; cplCurve.append(el); el.idSubLay = idSideLayer; el.dWidth = dEndLineWidth; el.ptGe[0] = arPtsV[4]; el.ptGe[1] = arPtsV[8]; el.ptGe[2] = arPtsV[8]; cplCurve.append(el); el.ptGe[0] = arPtsV[7]; el.ptGe[1] = arPtsV[11]; el.ptGe[2] = arPtsV[11]; cplCurve.append(el); } else { el.dWidth = dCenWidth; el.idSubLay = idSideLayer; el.ptGe[0] = arPtsV[5]; el.ptGe[1] = arPtsV[9]; el.ptGe[2] = arPtsV[9]; cplCurve.append(el); el.ptGe[0] = arPtsV[6]; el.ptGe[1] = arPtsV[10]; el.ptGe[2] = arPtsV[10]; cplCurve.append(el); el.ptGe[0] = arPtsV[5]; el.ptGe[1] = arPtsV[6]; el.ptGe[2] = arPtsV[6]; cplCurve.append(el); el.ptGe[0] = arPtsV[9]; el.ptGe[1] = arPtsV[10]; el.ptGe[2] = arPtsV[10]; cplCurve.append(el); } } return cplCurve.length() > 0; } //斜接俯视顶点 // 8 6 7 // ╱╲ // ╱ ╱ // 1 ╱ ╱12 // │ └──┐5 // 0│ │3 // │ ┌──┘4 // 2 ╲ ╲13 // ╲ ╲ // ╲╱ // 10 9 11 // BOOL ImpHvacCross::GetInclineCirPts(AcGePoint3dArray& arPts, BOOL nDefault) const { AcGePoint3d ptStart,ptEnd,ptBr1,ptBr2; AcGeVector3d vtStart,vtEnd,vtBr1,vtBr2; double dSWidth = MayAsMUnit(300.0), dEWidth = MayAsMUnit(300.0), dThick = MayAsMUnit(200.0); double dBr1Width = MayAsMUnit(300.0), dBr2Width = MayAsMUnit(300.0), dPlusEdge = MayAsMUnit(50.0); m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); m_pXDataMap->GetAt(HCRS_StartDiameter, dSWidth); m_pXDataMap->GetAt(HCRS_EndDiameter, dEWidth); m_pXDataMap->GetAt(HCRS_Branch1Diameter, dBr1Width); m_pXDataMap->GetAt(HCRS_Branch2Diameter, dBr2Width); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); AcGeVector3d vtNor = AcGeVector3d::kZAxis; vtNor = GetSectNormal(); dSWidth *= 0.5; dEWidth *= 0.5; dBr1Width *= 0.5; dBr2Width *= 0.5; AcGePoint3d ptTemp1,ptTemp2,ptInter; AcGeVector3d vtStartv, vtEndv, vtBr1v, vtBr2v; vtStartv = vtStart; vtEndv = vtEnd; vtBr1v = vtBr1; vtBr2v = vtBr2; vtStartv.rotateBy(PI * 0.5,vtNor); vtEndv.rotateBy(PI * 0.5,vtNor); vtBr1v.rotateBy(PI * 0.5,vtNor); vtBr2v.rotateBy(PI * 0.5,vtNor); vtStart.normalize(); vtEnd.normalize(); vtBr1.normalize(); vtBr2.normalize(); vtStartv.normalize(); vtEndv.normalize(); vtBr1v.normalize(); vtBr2v.normalize(); // 0-23点 arPts.append(ptStart); arPts.append(ptStart + vtStartv * dSWidth); arPts.append(ptStart - vtStartv * dSWidth); arPts.append(ptEnd); arPts.append(ptEnd + vtEndv * dEWidth); arPts.append(ptEnd - vtEndv * dEWidth); arPts.append(ptBr1); arPts.append(ptBr1 + vtBr1v * dBr1Width); arPts.append(ptBr1 - vtBr1v * dBr1Width); arPts.append(ptBr2); arPts.append(ptBr2 + vtBr2v * dBr2Width); arPts.append(ptBr2 - vtBr2v * dBr2Width); arPts.append(arPts[0] - vtStart * dPlusEdge); arPts.append(arPts[1] - vtStart * dPlusEdge); arPts.append(arPts[2] - vtStart * dPlusEdge); arPts.append(arPts[3] - vtEnd * dPlusEdge); arPts.append(arPts[4] - vtEnd * dPlusEdge); arPts.append(arPts[5] - vtEnd * dPlusEdge); arPts.append(arPts[6] - vtBr1 * dPlusEdge); arPts.append(arPts[7] - vtBr1 * dPlusEdge); arPts.append(arPts[8] - vtBr1 * dPlusEdge); arPts.append(arPts[9] - vtBr2 * dPlusEdge); arPts.append(arPts[10] - vtBr2 * dPlusEdge); arPts.append(arPts[11] - vtBr2 * dPlusEdge); // 24-25 关键点 AcGePoint3d ptTmp = AcGePoint3d::kOrigin; AcGePoint3d ptInt = AcGePoint3d::kOrigin; if (GetIntersectWith(arPts[13], arPts[20], arPts[12], arPts[18], ptTmp)) { if (GetIntersectWith(ptTmp, arPts[19], arPts[17], arPts[13], ptInt)) { arPts.append(ptInt); } } else { AcGeVector3d vt1 = AcGeVector3d::kIdentity; AcGeVector3d vt2 = AcGeVector3d::kIdentity; vt1 = arPts[12] - arPts[18]; vt1.normalize(); vt2 = arPts[13] - arPts[17]; vt2.normalize(); if (GetIntersectWith(arPts[19], arPts[17], vt1, vt2, ptInt)) { arPts.append(ptInt); } } if (GetIntersectWith(arPts[14], arPts[22], arPts[12], arPts[21], ptTmp)) { if (GetIntersectWith(ptTmp, arPts[23], arPts[16], arPts[14], ptInt)) { arPts.append(ptInt); } } else { AcGeVector3d vt1 = AcGeVector3d::kIdentity; AcGeVector3d vt2 = AcGeVector3d::kIdentity; vt1 = arPts[12] - arPts[21]; vt1.normalize(); vt2 = arPts[14] - arPts[16]; vt2.normalize(); if (GetIntersectWith(arPts[23], arPts[16], vt1, vt2, ptInt)) { arPts.append(ptInt); } } return arPts.length() == 26; } BOOL ImpHvacCross::GetInsertCirPts(AcGePoint3dArray& arPts) const { AcGePoint3d ptStart,ptEnd,ptBr1,ptBr2; AcGeVector3d vtStart,vtEnd,vtBr1,vtBr2; double dSWidth = 300.0, dEWidth = 300.0, dBr1Width = 300.0, dBr2Width = 300.0, dPlus = 25.0; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); m_pXDataMap->GetAt(HCRS_StartWidth, dSWidth); m_pXDataMap->GetAt(HCRS_EndWidth, dEWidth); m_pXDataMap->GetAt(HCRS_Branch1Width, dBr1Width); m_pXDataMap->GetAt(HCRS_Branch2Width, dBr2Width); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlus); AcGePoint3d ptInter; AcGeVector3d vtNor = AcGeVector3d::kZAxis; vtNor = GetSectNormal(); AcGeVector3d vtStartv, vtEndv, vtBr1v, vtBr2v; vtStartv = vtStart; vtEndv = vtEnd; vtBr1v = vtBr1; vtBr2v = vtBr2; vtStartv.rotateBy(PI * 0.5,vtNor); vtEndv.rotateBy(PI * 0.5,vtNor); vtBr1v.rotateBy(PI * 0.5,vtNor); vtBr2v.rotateBy(PI * 0.5,vtNor); vtStart.normalize(); vtEnd.normalize(); vtBr1.normalize(); vtBr2.normalize(); vtStartv.normalize(); vtEndv.normalize(); vtBr1v.normalize(); vtBr2v.normalize(); // 0 - 17 arPts.append(ptStart); arPts.append(ptStart + vtStartv * dSWidth * 0.5); arPts.append(ptStart - vtStartv * dSWidth * 0.5); arPts.append(ptEnd); arPts.append(ptEnd + vtEndv * dEWidth * 0.5); arPts.append(ptEnd - vtEndv * dEWidth * 0.5); arPts.append(ptBr1); arPts.append(ptBr1 + vtBr1v * dBr1Width * 0.5); arPts.append(ptBr1 - vtBr1v * dBr1Width * 0.5); arPts.append(ptBr2); arPts.append(ptBr2 + vtBr2v * dBr2Width * 0.5); arPts.append(ptBr2 - vtBr2v * dBr2Width * 0.5); arPts.append(arPts[0] + vtEnd * dPlus); arPts.append(arPts[1] + vtEnd * dPlus); arPts.append(arPts[2] + vtEnd * dPlus); arPts.append(arPts[3] + vtStart * dPlus); arPts.append(arPts[4] + vtStart * dPlus); arPts.append(arPts[5] + vtStart * dPlus); // 18 - 21 AcGeVector3d vtGeTmp = arPts[13] - arPts[17]; vtGeTmp.normalize(); if (GetIntersectWith(arPts[13], arPts[8], vtGeTmp, vtBr1, ptInter)) { arPts.append(ptInter); } else { return FALSE; } if (GetIntersectWith(arPts[17], arPts[7], vtGeTmp, vtBr1, ptInter)) { arPts.append(ptInter); } else { return FALSE; } vtGeTmp = arPts[14] - arPts[16]; vtGeTmp.normalize(); if (GetIntersectWith(arPts[14], arPts[10], vtGeTmp, vtBr2, ptInter)) { arPts.append(ptInter); } else { return FALSE; } if (GetIntersectWith(arPts[16], arPts[11], vtGeTmp, vtBr2, ptInter)) { arPts.append(ptInter); } else { return FALSE; } // 22 - 23 AcGePoint3d ptArc; double dDis1 = arPts[8].distanceTo(arPts[18]); double dDis2 = arPts[7].distanceTo(arPts[19]); ptArc = arPts[6] - vtBr1 * ((dDis1 + dDis2) * 0.5 + dBr1Width * 0.3); arPts.append(ptArc); dDis1 = arPts[10].distanceTo(arPts[20]); dDis2 = arPts[11].distanceTo(arPts[21]); ptArc = arPts[9] - vtBr2 * ((dDis1 + dDis2) * 0.5 + dBr2Width * 0.3); arPts.append(ptArc); return arPts.length() == 24; } // 4 6 // 方口 10┏━━-━━┓11 圆口有50直边 8 ┏━━-━━┓7 // ┃ ┆ ┃ ┃ ┆ ┃ // 9┃ ┆ ┃ 24┃11 10 9 ┃ // 8 ┏━━━-━┛ ┆ ┃12 1 ┏━━━-━┛ 32 ┃25 // ┃ 7 ┆ ┗━━━━┓13 ┃ 3 31 ┆ ┗━━━━┓14 // 0 ┃--------------┆1 ┃ 0 ┃--4-----------┆ 28 17 ┃ // ┃ 3┆-----------------┃2 ┃ 30 ┆-------------16--┃12 // ┃ ┆ 5 ┃ ┃ 5 33 29 15 ┃ // 19 ┗━━━┓ ┆ ┏━━━━━━┛14 2 ┗━━━┓ ┆ ┏━━━━━━┛13 // 18┃ ┆ ┃15 27┃21 22 23┃26 // ┃ ┆ ┃ ┃ ┆ ┃ // 17┗━━━━┛16 19┗━━━━┛20 // 6 18 BOOL ImpHvacCross::GetCrossPts(AcGePoint3dArray& arPts, BOOL bDefault, BOOL bIs3D) const { AcGePoint3d ptStart,ptEnd,ptBr1,ptBr2; AcGeVector3d vtStart,vtEnd,vtBr1,vtBr2; double dSWidth = 300.0, dEWidth = 300.0, dThick = 200.0, dBr1Width = 300.0, dBr2Width = 300.0; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); m_pXDataMap->GetAt(HCRS_StartWidth, dSWidth); m_pXDataMap->GetAt(HCRS_Thick, dThick); m_pXDataMap->GetAt(HCRS_EndWidth, dEWidth); m_pXDataMap->GetAt(HCRS_Branch1Width, dBr1Width); m_pXDataMap->GetAt(HCRS_Branch2Width, dBr2Width); double dRadRatio = 1.0; m_pXDataMap->GetAt(HCRS_RadRatio, dRadRatio); if (!bIs3D) { //单线遮挡宽度 SetSingleDashWidth(dSWidth,dEWidth,dBr1Width,dBr2Width); } AcGeVector3d vtNor = AcGeVector3d::kZAxis; vtNor = GetSectNormal(); dSWidth *= 0.5; dEWidth *= 0.5; dBr1Width *= 0.5; dBr2Width *= 0.5; AcGePoint3d ptTemp1,ptTemp2,ptInter; AcGeVector3d vtStartv, vtEndv, vtBr1v, vtBr2v; vtStartv = vtStart; vtEndv = vtEnd; vtBr1v = vtBr1; vtBr2v = vtBr2; vtStartv.rotateBy(PI * 0.5,vtNor); vtEndv.rotateBy(PI * 0.5,vtNor); vtBr1v.rotateBy(PI * 0.5,vtNor); vtBr2v.rotateBy(PI * 0.5,vtNor); vtStart.normalize(); vtEnd.normalize(); vtBr1.normalize(); vtBr2.normalize(); vtStartv.normalize(); vtEndv.normalize(); vtBr1v.normalize(); vtBr2v.normalize(); AecHvac::HvacCrossType eType = AecHvac::eOrthoCross; m_pXDataMap->GetAt(HCRS_Type, (int&)eType); ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType,(int&)eSectType); if (eSectType == eRect) { AcGePlane planSta(ptStart, vtNor); AcGePlane planBr1(ptBr1, vtNor); AcGePlane planBr2(ptBr2, vtNor); AcGePlane planEnd(ptEnd, vtNor); // 投影至主矢量平面 if (eType == AecHvac::eInsertCross || eType == AecHvac::eInsertIntubCross) { ptBr1 = ptBr1.orthoProject(planSta); ptBr2 = ptBr2.orthoProject(planSta); } //0-7 arPts.append(ptStart); GetIntersectWith(ptStart, ptBr1, vtStart, vtBr1, ptInter); arPts.append(ptInter); arPts.append(ptEnd); GetIntersectWith(ptEnd, ptBr2, vtEnd, vtBr2, ptInter); arPts.append(ptInter); arPts.append(ptBr1); GetIntersectWith(ptEnd, ptBr1, vtEnd, vtBr1, ptInter); arPts.append(ptInter); arPts.append(ptBr2); GetIntersectWith(ptStart, ptBr2, vtStart, vtBr2, ptInter); arPts.append(ptInter); //8-10 ptTemp1 = ptStart + vtStartv * dSWidth; arPts.append(ptTemp1); ptTemp2 = ptBr1 - vtBr1v * dBr1Width; GetIntersectWith(ptTemp1,ptTemp2,vtStart,vtBr1,ptInter); arPts.append(ptInter); arPts.append(ptTemp2); //11-13 ptTemp1 = ptBr1 + vtBr1v * dBr1Width; arPts.append(ptTemp1); ptTemp2 = ptEnd - vtEndv * dEWidth; GetIntersectWith(ptTemp1,ptTemp2,vtBr1,vtEnd,ptInter); arPts.append(ptInter); arPts.append(ptTemp2); //14-16 ptTemp1 = ptEnd + vtEndv * dEWidth; arPts.append(ptTemp1); ptTemp2 = ptBr2 - vtBr2v * dBr2Width; GetIntersectWith(ptTemp1,ptTemp2,vtEnd,vtBr2,ptInter); arPts.append(ptInter); arPts.append(ptTemp2); //17-19 ptTemp1 = ptBr2 + vtBr2v * dBr2Width; arPts.append(ptTemp1); ptTemp2 = ptStart - vtStartv * dSWidth; GetIntersectWith(ptTemp1,ptTemp2,vtBr2,vtStart,ptInter); arPts.append(ptInter); arPts.append(ptTemp2); BOOL bIsOK = TRUE; if (!TAuxTools::isCodirectionalPt(arPts[8],arPts[9],vtStart)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[19],arPts[18],vtStart)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[13],arPts[12],vtEnd)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[14],arPts[15],vtEnd)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[10],arPts[9],vtBr1)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[11],arPts[12],vtBr1)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[16],arPts[15],vtBr2)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[17],arPts[18],vtBr2)) bIsOK = FALSE; //重新计算标准点 if (bDefault) { double dPlusEdge = MayAsMUnit(50.0); double dPlusEnd = MayAsMUnit(50.0); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); AcGePoint3d pt; double dLength = max(dBr1Width,dBr2Width); if (eType == AecHvac::eOrthoCross) { dLength = dLength * 2 * dRadRatio; arPts[0] = GetFinalPt(arPts[0],arPts[1],arPts[7],arPts[9],arPts[18],vtStart,dLength); arPts[2] = GetFinalPt(arPts[2],arPts[3],arPts[5],arPts[15],arPts[12],vtEnd,dLength); double dMax = max(dSWidth, dEWidth); arPts[4] = arPts[1] + vtBr1 * (dMax + dBr1Width); arPts[6] = arPts[7] + vtBr2 * (dMax + dBr2Width); } //承差 else { double dPlusSta = MayAsMUnit(100.0); double dPlusBr = MayAsMUnit(150.0); dLength = dLength * 2 * dRadRatio; arPts[0] = GetFinalPt(arPts[0],arPts[1],arPts[7],arPts[9],arPts[18],vtStart,dLength); arPts[2] = GetFinalPtEnd(arPts[2],arPts[3],arPts[5],arPts[15],arPts[12],vtEnd); AcGePoint3d ptTest = arPts[2]; arPts[2] = arPts[2].orthoProject(planEnd); ptTest = arPts[2]; AcGePoint3d ptCor1 = arPts[9],ptCor2 = arPts[18],ptCor3 = arPts[12],ptCor4 = arPts[15]; AcGePoint3d ptDis = arPts[4] + vtBr1 * 10000; double dis1 = ptDis.distanceTo(ptCor1); double dis2 = ptDis.distanceTo(ptCor3); if (dis1 < dis2) { arPts[4] = (ptCor1 + vtBr1 * (dPlusBr + dPlusEdge)) + vtBr1v * dBr1Width; } else { arPts[4] = (ptCor3 + vtBr1 * (dPlusBr + dPlusEdge)) - vtBr1v * dBr1Width; } ptDis = arPts[6] + vtBr2 * 10000; dis1 = ptDis.distanceTo(ptCor2); dis2 = ptDis.distanceTo(ptCor4); if (dis1 < dis2) { arPts[6] = (ptCor2 + vtBr2 * (dPlusBr + dPlusEdge)) - vtBr2v * dBr2Width; } else { arPts[6] = (ptCor4 + vtBr2 * (dPlusBr + dPlusEdge)) + vtBr2v * dBr2Width; } } } // 投影回支管平面 if (eType == AecHvac::eInsertCross || eType == AecHvac::eInsertIntubCross) { AcGePoint3d ptProj = AcGePoint3d::kOrigin; ptProj = arPts[4]; arPts.setAt(4, ptProj.orthoProject(planBr1)); ptProj = arPts[10]; arPts.setAt(10, ptProj.orthoProject(planBr1)); ptProj = arPts[11]; arPts.setAt(11, ptProj.orthoProject(planBr1)); ptProj = arPts[9]; arPts.setAt(9, ptProj.orthoProject(planBr1)); ptProj = arPts[12]; arPts.setAt(12, ptProj.orthoProject(planBr1)); ptProj = arPts[6]; arPts.setAt(6, ptProj.orthoProject(planBr2)); ptProj = arPts[16]; arPts.setAt(16, ptProj.orthoProject(planBr2)); ptProj = arPts[17]; arPts.setAt(17, ptProj.orthoProject(planBr2)); ptProj = arPts[15]; arPts.setAt(15, ptProj.orthoProject(planBr2)); ptProj = arPts[18]; arPts.setAt(18, ptProj.orthoProject(planBr2)); } return bIsOK; } if(eSectType == eCircle) { //求直边段的各个点 GetPlusEdgePts(arPts, ptStart, vtStart, vtNor, dSWidth); GetPlusEdgePts(arPts, ptBr1, vtBr1, vtNor, dBr1Width); GetPlusEdgePts(arPts, ptEnd, vtEnd, vtNor, dEWidth); GetPlusEdgePts(arPts, ptBr2, vtBr2, vtNor, dBr2Width); //求交点24,25,26,27 GetIntersectWith(arPts[3], arPts[17], arPts[11], arPts[8], ptInter); arPts.append(ptInter); GetIntersectWith(arPts[3], arPts[17], arPts[7], arPts[9], ptInter); arPts.append(ptInter); GetIntersectWith(arPts[5], arPts[15], arPts[20], arPts[23], ptInter); arPts.append(ptInter); GetIntersectWith(arPts[5], arPts[15], arPts[19], arPts[21], ptInter); arPts.append(ptInter); //中心点28,29,30,31 GetIntersectWith(ptStart, ptBr1, vtStart, vtBr1, ptInter); arPts.append(ptInter); GetIntersectWith(ptEnd, ptBr1, vtEnd, vtBr1, ptInter); arPts.append(ptInter); GetIntersectWith(ptEnd, ptBr2, vtEnd, vtBr2, ptInter); arPts.append(ptInter); GetIntersectWith(ptStart, ptBr2, vtStart, vtBr2, ptInter); arPts.append(ptInter); //计算上下两条圆弧的点32,33 AcGePoint3d ptArc; double dDis1 = arPts[11].distanceTo(arPts[24]); double dDis2 = arPts[9].distanceTo(arPts[25]); ptArc = arPts[10] - vtBr1 * ((dDis1 + dDis2) * 0.5 + dBr1Width * 0.3); arPts.append(ptArc); dDis1 = arPts[21].distanceTo(arPts[27]); dDis2 = arPts[23].distanceTo(arPts[26]); ptArc = arPts[22] - vtBr2 * ((dDis1 + dDis2) * 0.5 + dBr2Width * 0.3); arPts.append(ptArc); BOOL bIsOK = TRUE; if (!TAuxTools::isCodirectionalPt(arPts[1],arPts[24],vtStart)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[2],arPts[27],vtStart)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[13],arPts[/*12*/26],vtEnd)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[14],arPts[25],vtEnd)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[8],arPts[24],vtBr1)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[7],arPts[25],vtBr1)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[20],arPts[26],vtBr2)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[19],arPts[27],vtBr2)) bIsOK = FALSE; //重新计算标准点 if (bDefault) { double dPlusEdge = MayAsMUnit(50.0); double dPlusEnd = MayAsMUnit(50.0); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); AcGePoint3d pt; double dLength = max(dBr1Width,dBr2Width); dLength = dLength * 2 * dRadRatio; arPts[0] = GetFinalPt(arPts[0],arPts[28],arPts[31],arPts[24],arPts[27],vtStart,dLength); arPts[2] = GetFinalPt(arPts[12],arPts[29],arPts[30],arPts[25],arPts[26],vtEnd,dLength); arPts[4] = GetFinalPt(arPts[6],arPts[28],arPts[29],arPts[24],arPts[25],vtBr1,dLength); arPts[6] = GetFinalPt(arPts[18],arPts[31],arPts[30],arPts[27],arPts[26],vtBr2,dLength); } return bIsOK; } return FALSE; } // 4 6 // 方口 10┏━━-━━┓11 圆口有50直边 8 ┏━━-━━┓7 // ┃ ┆ ┃ ┃ ┆ ┃ // 9┃ ┆ ┃ 24┃11 10 9 ┃ // 8 ┏━━━-━┛ ┆ ┃12 1 ┏━━━-━┛ 29 ┃25 // ┃ 7 ┆ ┗━━━━┓13 ┃ 3 ┆ ┗━━━━┓14 // 0 ┃--------------┆1 ┃ 0 ┃--4--------- 28 17 ┃ // ┃ 3┆-----------------┃2 ┃ ------------16--┃12 // ┃ ┆ 5 ┃ ┃ 5 30 15 ┃ // 19 ┗━━━┓ ┆ ┏━━━━━━┛14 2 ┗━━━┓ ┆ ┏━━━━━━┛13 // 18┃ ┆ ┃15 27┃21 22 23┃26 // ┃ ┆ ┃ ┃ ┆ ┃ // 17┗━━━━┛16 19┗━━━━┛20 // 临时 6 18 BOOL ImpHvacCross::GetCrossPtsCirRedu(AcGePoint3dArray& arPts) const { AcGePoint3d ptStart,ptEnd,ptBr1,ptBr2; AcGeVector3d vtStart,vtEnd,vtBr1,vtBr2; double dSWidth = 300.0, dEWidth = 300.0, dThick = 200.0, dBr1Width = 300.0, dBr2Width = 300.0; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); m_pXDataMap->GetAt(HCRS_StartWidth, dSWidth); m_pXDataMap->GetAt(HCRS_Thick, dThick); m_pXDataMap->GetAt(HCRS_EndWidth, dEWidth); m_pXDataMap->GetAt(HCRS_Branch1Width, dBr1Width); m_pXDataMap->GetAt(HCRS_Branch2Width, dBr2Width); AcGeVector3d vtNor = AcGeVector3d::kZAxis; vtNor = GetSectNormal(); dSWidth *= 0.5; dEWidth *= 0.5; dBr1Width *= 0.5; dBr2Width *= 0.5; AcGePoint3d ptTemp1,ptTemp2,ptInter; AcGeVector3d vtStartv, vtEndv, vtBr1v, vtBr2v; vtStartv = vtStart; vtEndv = vtEnd; vtBr1v = vtBr1; vtBr2v = vtBr2; vtStartv.rotateBy(PI * 0.5,vtNor); vtEndv.rotateBy(PI * 0.5,vtNor); vtBr1v.rotateBy(PI * 0.5,vtNor); vtBr2v.rotateBy(PI * 0.5,vtNor); vtStart.normalize(); vtEnd.normalize(); vtBr1.normalize(); vtBr2.normalize(); vtStartv.normalize(); vtEndv.normalize(); vtBr1v.normalize(); vtBr2v.normalize(); ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType,(int&)eSectType); if (eSectType == eRect) { //0-7 arPts.append(ptStart); GetIntersectWith(ptStart, ptBr1, vtStart, vtBr1, ptInter); arPts.append(ptInter); arPts.append(ptEnd); GetIntersectWith(ptEnd, ptBr2, vtEnd, vtBr2, ptInter); arPts.append(ptInter); arPts.append(ptBr1); GetIntersectWith(ptEnd, ptBr1, vtEnd, vtBr1, ptInter); arPts.append(ptInter); arPts.append(ptBr2); GetIntersectWith(ptStart, ptBr2, vtStart, vtBr2, ptInter); arPts.append(ptInter); //8-10 ptTemp1 = ptStart + vtStartv * dSWidth; arPts.append(ptTemp1); ptTemp2 = ptBr1 - vtBr1v * dBr1Width; GetIntersectWith(ptTemp1,ptTemp2,vtStart,vtBr1,ptInter); arPts.append(ptInter); arPts.append(ptTemp2); //11-13 ptTemp1 = ptBr1 + vtBr1v * dBr1Width; arPts.append(ptTemp1); ptTemp2 = ptEnd - vtEndv * dEWidth; GetIntersectWith(ptTemp1,ptTemp2,vtBr1,vtEnd,ptInter); arPts.append(ptInter); arPts.append(ptTemp2); //14-16 ptTemp1 = ptEnd + vtEndv * dEWidth; arPts.append(ptTemp1); ptTemp2 = ptBr2 - vtBr2v * dBr2Width; GetIntersectWith(ptTemp1,ptTemp2,vtEnd,vtBr2,ptInter); arPts.append(ptInter); arPts.append(ptTemp2); //17-19 ptTemp1 = ptBr2 + vtBr2v * dBr2Width; arPts.append(ptTemp1); ptTemp2 = ptStart - vtStartv * dSWidth; GetIntersectWith(ptTemp1,ptTemp2,vtBr2,vtStart,ptInter); arPts.append(ptInter); arPts.append(ptTemp2); } else if(eSectType == eCircle) { //求直边段的各个点 GetPlusEdgePts(arPts, ptStart, vtStart, vtNor, dSWidth); GetPlusEdgePts(arPts, ptBr1, vtBr1, vtNor, dBr1Width); GetPlusEdgePts(arPts, ptEnd, vtEnd, vtNor, dEWidth); GetPlusEdgePts(arPts, ptBr2, vtBr2, vtNor, dBr2Width); //求交点24,25,26,27 GetIntersectWith(arPts[3], arPts[17], arPts[11], arPts[21], ptInter); arPts.append(ptInter); GetIntersectWith(arPts[3], arPts[17], arPts[9], arPts[23], ptInter); arPts.append(ptInter); GetIntersectWith(arPts[5], arPts[15], arPts[9], arPts[23], ptInter); arPts.append(ptInter); GetIntersectWith(arPts[5], arPts[15], arPts[11], arPts[21], ptInter); arPts.append(ptInter); //中心点28 GetIntersectWith(arPts[4], arPts[16], arPts[10], arPts[22], ptInter); arPts.append(ptInter); //计算上下两条圆弧的点29,30 AcGePoint3d ptArc; AcGeVector3d vtBr1ToBr2 = arPts[10] - arPts[22]; vtBr1ToBr2.normalize(); double dDis1 = arPts[11].distanceTo(arPts[24]); double dDis2 = arPts[9].distanceTo(arPts[25]); ptArc = arPts[10] - vtBr1ToBr2 * ((dDis1 + dDis2) * 0.5 + dBr1Width * 0.3); arPts.append(ptArc); dDis1 = arPts[21].distanceTo(arPts[27]); dDis2 = arPts[23].distanceTo(arPts[26]); ptArc = arPts[22] + vtBr1ToBr2 * ((dDis1 + dDis2) * 0.5 + dBr2Width * 0.3); arPts.append(ptArc); } return arPts.length() > 0; } // // 8 // 11╭───╮12 // 3┌──-│ │-──┐4 // 0│ 7 │ 2 │9 │1 // 6└──-│ │-──┘5 // 14╰───╯13 // 10 // BOOL ImpHvacCross::GetCrossPtsVerCir(AcGePoint3dArray& arPts) const { AcGePoint3d ptStart,ptEnd,ptBr1,ptBr2; AcGeVector3d vtStart,vtEnd,vtBr1,vtBr2; double dSWidth = 300.0, dEWidth = 300.0, dThick = 200.0, dBr1Width = 300.0, dBr2Width = 300.0; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); m_pXDataMap->GetAt(HCRS_StartWidth, dSWidth); m_pXDataMap->GetAt(HCRS_Thick, dThick); m_pXDataMap->GetAt(HCRS_EndWidth, dEWidth); m_pXDataMap->GetAt(HCRS_Branch1Width, dBr1Width); m_pXDataMap->GetAt(HCRS_Branch2Width, dBr2Width); AcGeVector3d vtNor = AcGeVector3d::kZAxis; vtNor = GetSectNormal(); dSWidth *= 0.5; dEWidth *= 0.5; dBr1Width *= 0.5; dBr2Width *= 0.5; //开始矢量和Z轴垂直(前视) if (IsStartVertAlignment()) { ptEnd.z = ptStart.z; ptBr1.z = ptStart.z; //0-6 arPts.append(ptStart); arPts.append(ptEnd); arPts.append(ptBr1); arPts.append(ptStart - vtNor * dSWidth); arPts.append(ptEnd - vtNor * dEWidth); arPts.append(ptEnd + vtNor * dEWidth); arPts.append(ptStart + vtNor * dSWidth); //7-10 arPts.append(ptBr1 + vtStart * dBr1Width); arPts.append(ptBr1 - vtNor * dBr1Width); arPts.append(ptBr1 - vtStart * dBr1Width); arPts.append(ptBr1 + vtNor * dBr1Width); AcGePoint3d ptIntersect1,ptIntersect2; //求出直线于圆弧的交点 AcGeCircArc3d circArc(ptBr1, vtBr1, dBr1Width); //定义求交直线 AcGeLine3d *pLine = new AcGeLine3d(arPts[3], arPts[4]); int nNum=0;//交点数 circArc.intersectWith(*pLine, nNum, ptIntersect1, ptIntersect2); delete pLine; if (2 == nNum) { if (arPts[3].distanceTo(ptIntersect1) < arPts[3].distanceTo(ptIntersect2)) { arPts.append(ptIntersect1); arPts.append(ptIntersect2); } else { arPts.append(ptIntersect2); arPts.append(ptIntersect1); } } //定义求交直线 pLine = new AcGeLine3d(arPts[5], arPts[6]); nNum=0;//交点数 circArc.intersectWith(*pLine, nNum, ptIntersect1, ptIntersect2); delete pLine; if (2 == nNum) { if (arPts[5].distanceTo(ptIntersect1) < arPts[5].distanceTo(ptIntersect2)) { arPts.append(ptIntersect1); arPts.append(ptIntersect2); } else { arPts.append(ptIntersect2); arPts.append(ptIntersect1); } } } //br1矢量和Z轴垂直(左视) else if (IsBr1VertAlignment()) { ptStart.z = ptBr1.z; ptBr2.z = ptBr1.z; //0-6 arPts.append(ptBr1); arPts.append(ptBr2); arPts.append(ptStart); arPts.append(ptBr1 - vtNor * dBr1Width); arPts.append(ptBr2 - vtNor * dBr2Width); arPts.append(ptBr2 + vtNor * dBr2Width); arPts.append(ptBr1 + vtNor * dBr1Width); //7-10 arPts.append(ptStart + vtBr1 * dSWidth); arPts.append(ptStart - vtNor * dSWidth); arPts.append(ptStart - vtBr1 * dSWidth); arPts.append(ptStart + vtNor * dSWidth); AcGePoint3d ptIntersect1,ptIntersect2; //求出直线于圆弧的交点 AcGeCircArc3d circArc(ptStart, vtStart, dSWidth); //定义求交直线 AcGeLine3d *pLine = new AcGeLine3d(arPts[3], arPts[4]); AcGePoint3d pt3 = arPts[3], pt4 = arPts[4]; int nNum=0;//交点数 circArc.intersectWith(*pLine, nNum, ptIntersect1, ptIntersect2); delete pLine; if (2 == nNum) { if (arPts[3].distanceTo(ptIntersect1) < arPts[3].distanceTo(ptIntersect2)) { arPts.append(ptIntersect1); arPts.append(ptIntersect2); } else { arPts.append(ptIntersect2); arPts.append(ptIntersect1); } } //定义求交直线 pLine = new AcGeLine3d(arPts[5], arPts[6]); nNum=0;//交点数 circArc.intersectWith(*pLine, nNum, ptIntersect1, ptIntersect2); delete pLine; if (2 == nNum) { if (arPts[5].distanceTo(ptIntersect1) < arPts[5].distanceTo(ptIntersect2)) { arPts.append(ptIntersect1); arPts.append(ptIntersect2); } else { arPts.append(ptIntersect2); arPts.append(ptIntersect1); } } } return arPts.length() > 0; } // 6 // 方口 50直边 8 ┏━━-━━┓7 // ┃ ┆ ┃ // C1╱11 10 9 ╲C3 // 1 ┏━━━╱ ┆ ╲ // ┃ 3 27 ┆ -━━┓14 // 0 ┃--4-----------┆ 24 17 ┃ // ┃ ┆-------------16--┃12 // ┃ 5 26┆ 25 15 ┃ // 2 ┗━-╲ ┆ ╱-━━━━┛13 // C2 ╲ 21 22 23 ╱ C4 // ┃ ┆ ┃ // 19┗━━━━┛20 // 18 BOOL ImpHvacCross::GetIntersectCrossPts(AcGePoint3dArray& arPts, BOOL bDefault) const { AcGePoint3d ptStart,ptEnd,ptBr1,ptBr2; AcGeVector3d vtStart,vtEnd,vtBr1,vtBr2; double dSWidth = 300.0, dEWidth = 300.0, dThick = 200.0, dBr1Width = 300.0, dBr2Width = 300.0; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); m_pXDataMap->GetAt(HCRS_StartWidth, dSWidth); m_pXDataMap->GetAt(HCRS_Thick, dThick); m_pXDataMap->GetAt(HCRS_EndWidth, dEWidth); m_pXDataMap->GetAt(HCRS_Branch1Width, dBr1Width); m_pXDataMap->GetAt(HCRS_Branch2Width, dBr2Width); double dRadRatio = 1.5; m_pXDataMap->GetAt(HCRS_RadRatio, dRadRatio); AcGeVector3d vtNor = AcGeVector3d::kZAxis; vtNor = GetSectNormal(); dSWidth *= 0.5; dEWidth *= 0.5; dBr1Width *= 0.5; dBr2Width *= 0.5; AcGePoint3d ptTemp1,ptTemp2,ptInter; //求直边段的各个点 GetPlusEdgePts(arPts, ptStart, vtStart, vtNor, dSWidth); GetPlusEdgePts(arPts, ptBr1, vtBr1, vtNor, dBr1Width); GetPlusEdgePts(arPts, ptEnd, vtEnd, vtNor, dEWidth); GetPlusEdgePts(arPts, ptBr2, vtBr2, vtNor, dBr2Width); //24-27 GetIntersectWith(ptStart, ptBr1, vtStart, vtBr1, ptInter); arPts.append(ptInter); GetIntersectWith(ptEnd, ptBr1, vtEnd, vtBr1, ptInter); arPts.append(ptInter); GetIntersectWith(ptEnd, ptBr2, vtEnd, vtBr2, ptInter); arPts.append(ptInter); GetIntersectWith(ptStart, ptBr2, vtStart, vtBr2, ptInter); arPts.append(ptInter); //交点28 if(TAuxTools::isCodirectionalPt(arPts[27], arPts[25], vtStart)) { arPts.append(arPts[27]); } else { arPts.append(arPts[25]); } //重新计算带有变径或偏心的个点 AcGeVector3d vtStartv, vtEndv, vtBr1v, vtBr2v; vtStartv = vtStart; vtEndv = vtEnd; vtBr1v = vtBr1; vtBr2v = vtBr2; vtStartv.rotateBy(PI * 0.5,vtNor); vtEndv.rotateBy(PI * 0.5,vtNor); vtBr1v.rotateBy(PI * 0.5,vtNor); vtBr2v.rotateBy(PI * 0.5,vtNor); vtStart.normalize(); vtEnd.normalize(); vtBr1.normalize(); vtBr2.normalize(); vtStartv.normalize(); vtEndv.normalize(); vtBr1v.normalize(); vtBr2v.normalize(); AcGePoint3d pt; double dPlusEdge = MayAsMUnit(50.0); double dPlusSta = MayAsMUnit(100.0); double dPlusEnd = MayAsMUnit(50.0); double dPlusBr = MayAsMUnit(150.0); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); double dLength = max(dBr1Width,dBr2Width); dLength = dPlusEdge + dPlusSta; AecHvac::HvacCrossType eCrossType = AecHvac::eOrthoCross; m_pXDataMap->GetAt(HCRS_Type, (int&)eCrossType); if(eCrossType == AecHvac::eLinearCross) { GetIntersectWith(arPts[7], arPts[9], arPts[14], arPts[17], ptInter); arPts[9] = ptInter; GetIntersectWith(arPts[13], arPts[15], arPts[20], arPts[23], ptInter); arPts[23] = ptInter; } else { } AcGePoint3d ptCor1,ptCor2,ptCor3,ptCor4; BOOL bIsOK = TRUE; GetIntersectWith(arPts[1], arPts[3], arPts[8], arPts[11], ptCor1); if (!TAuxTools::isCodirectionalPt(arPts[1],ptCor1,vtStart)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[8],ptCor1,vtBr1)) bIsOK = FALSE; GetIntersectWith(arPts[2], arPts[5], arPts[19], arPts[21], ptCor2); if (!TAuxTools::isCodirectionalPt(arPts[2],ptCor2,vtStart)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[19],ptCor2,vtBr2)) bIsOK = FALSE; GetIntersectWith(arPts[14], arPts[17], arPts[7], arPts[9], ptCor3); if (!TAuxTools::isCodirectionalPt(arPts[14],ptCor3,vtEnd)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[7],ptCor3,vtBr1)) bIsOK = FALSE; GetIntersectWith(arPts[13], arPts[15], arPts[20], arPts[23], ptCor4); if (!TAuxTools::isCodirectionalPt(arPts[13],ptCor4,vtEnd)) bIsOK = FALSE; if (!TAuxTools::isCodirectionalPt(arPts[20],ptCor4,vtBr2)) bIsOK = FALSE; //重新计算标准点 if (bDefault) { dLength = max(dSWidth, dEWidth) * 2 * dRadRatio; arPts[0] = GetInterFinalPt(arPts[0],arPts[24],arPts[27],ptCor1,ptCor2,vtStart,dLength); arPts[2] = GetFinalPtEnd(arPts[12],arPts[25],arPts[26],ptCor3,ptCor4,vtEnd); AcGePoint3d ptDis = arPts[6] + vtBr1 * 10000; double dis1 = ptDis.distanceTo(ptCor1); double dis2 = ptDis.distanceTo(ptCor3); if (dis1 < dis2) { arPts[4] = (ptCor1 + vtBr1 * (dPlusBr + dPlusEdge)) + vtBr1v * dBr1Width; } else { arPts[4] = (ptCor3 + vtBr1 * (dPlusBr + dPlusEdge)) - vtBr1v * dBr1Width; } ptDis = arPts[18] + vtBr2 * 10000; dis1 = ptDis.distanceTo(ptCor2); dis2 = ptDis.distanceTo(ptCor4); if (dis1 < dis2) { arPts[6] = (ptCor2 + vtBr2 * (dPlusBr + dPlusEdge)) - vtBr2v * dBr2Width; } else { arPts[6] = (ptCor4 + vtBr2 * (dPlusBr + dPlusEdge)) + vtBr2v * dBr2Width; } if(eCrossType == AecHvac::eInterCross) { arPts[2] = GetInterFinalPt(arPts[12],arPts[25],arPts[26],ptCor3,ptCor4,vtEnd,dLength); } } return bIsOK; } // 6 // 方口有50直边 8 ┏━━-━━┓7 // C1 ┃ ┆ ┃ // 28┃11 10 9 ┃30 C4 // 1 ┏━━━-━┛ ┆ ┃29 // ┃ 3 ┆ ┗━━━━┓14 // 0 ┃--4-----------┆ 17 ┃ // ┃ ┆-------------16--┃12 // ┃ 5 ┆ 15 ┃ // 2 ┗━━━┓ ┆ ┏━━━━━━┛13 // C2 31┃ ┆ ┃32 C3 // ┃21 22 23┃33 // 19┗━━━━┛20 // 18 BOOL ImpHvacCross::GetArcuateCrossPts(AcGePoint3dArray& arPts, BOOL bDefault) const { AcGePoint3d ptStart,ptEnd,ptBr1,ptBr2; AcGeVector3d vtStart,vtEnd,vtBr1,vtBr2; double dSWidth = 300.0, dEWidth = 300.0, dThick = 200.0, dBr1Width = 300.0, dBr2Width = 300.0; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); m_pXDataMap->GetAt(HCRS_StartWidth, dSWidth); m_pXDataMap->GetAt(HCRS_Thick, dThick); m_pXDataMap->GetAt(HCRS_EndWidth, dEWidth); m_pXDataMap->GetAt(HCRS_Branch1Width, dBr1Width); m_pXDataMap->GetAt(HCRS_Branch2Width, dBr2Width); AecHvac::HvacCrossType eCrosstype = AecHvac::eArcuateCross; m_pXDataMap->GetAt(HCRS_Type, (int&)eCrosstype); AcGeVector3d vtTT = GetSectNormal(); AcGePlane planSta(ptStart, vtTT); AcGePlane planBr1(ptBr1, vtTT); AcGePlane planBr2(ptBr2, vtTT); AcGePlane planEnd; if (eCrosstype == AecHvac::eArcuateIntubCross) { planEnd.set(ptEnd, vtTT); ptEnd = ptEnd.orthoProject(planSta); ptBr1 = ptBr1.orthoProject(planSta); ptBr2 = ptBr2.orthoProject(planSta); } if(vtStart.isCodirectionalTo(vtEnd) || vtStart.isCodirectionalTo(vtBr1) || vtStart.isCodirectionalTo(vtBr2) ) return FALSE; if(vtEnd.isCodirectionalTo(vtBr1) || vtEnd.isCodirectionalTo(vtBr2) ) return FALSE; if(vtBr1.isCodirectionalTo(vtBr2) ) return FALSE; double dRadRatio = 1.5; double dRadRatioBr1 = 1.5; double dRadRatioBr2 = 1.5; m_pXDataMap->GetAt(HCRS_RadRatio, dRadRatio); dRadRatioBr1 = min(dSWidth, dBr1Width) * (dRadRatio - 0.5); dRadRatioBr2 = min(dSWidth, dBr2Width) * (dRadRatio - 0.5); BOOL bIsOK = TRUE; AcGeVector3d vtNor = AcGeVector3d::kZAxis; vtNor = GetSectNormal(); dSWidth *= 0.5; dEWidth *= 0.5; dBr1Width *= 0.5; dBr2Width *= 0.5; AcGePoint3d ptInter; AcGeVector3d vtStartv, vtEndv, vtBr1v, vtBr2v; vtStartv = vtStart; vtEndv = vtEnd; vtBr1v = vtBr1; vtBr2v = vtBr2; vtStartv.rotateBy(PI * 0.5,vtNor); vtEndv.rotateBy(PI * 0.5,vtNor); vtBr1v.rotateBy(PI * 0.5,vtNor); vtBr2v.rotateBy(PI * 0.5,vtNor); vtStart.normalize(); vtEnd.normalize(); vtBr1.normalize(); vtBr2.normalize(); vtStartv.normalize(); vtEndv.normalize(); vtBr1v.normalize(); vtBr2v.normalize(); //求直边段的各个点 GetPlusEdgePts(arPts, ptStart, vtStart, vtNor, dSWidth); GetPlusEdgePts(arPts, ptBr1, vtBr1, vtNor, dBr1Width); GetPlusEdgePts(arPts, ptEnd, vtEnd, vtNor, dEWidth); GetPlusEdgePts(arPts, ptBr2, vtBr2, vtNor, dBr2Width); //求交点24,25 GetIntersectWith(arPts[1], arPts[3], arPts[8], arPts[11], ptInter); arPts.append(ptInter); GetIntersectWith(arPts[2], arPts[5], arPts[19], arPts[21], ptInter); arPts.append(ptInter); double dAngle = vtStart.angleTo(vtBr1, vtNor); if (dAngle > PI) { dAngle = 2 * PI - dAngle ; } dAngle *= 0.5; double dAngle1 = vtStart.angleTo(vtBr2, vtNor); if (dAngle1 > PI) { dAngle1 = 2 * PI - dAngle1 ; } dAngle1 *= 0.5; //求圆心26,27 ptInter = arPts[24] + vtStart * dRadRatioBr1 / tan(dAngle); ptInter = ptInter + vtStartv * dRadRatioBr1; arPts.append(ptInter); ptInter = arPts[25] + vtStart * dRadRatioBr2 / tan(dAngle1); ptInter = ptInter - vtStartv * dRadRatioBr2; arPts.append(ptInter); //偏心重新算点 //上弧 ptInter = arPts[26] - vtStartv * dRadRatioBr1; int nPos = TAuxTools::PositionOnLine(arPts[1], arPts[3], ptInter); if (nPos == 1) { bIsOK = FALSE; } else if (nPos == 2) { arPts[3] = ptInter; } if(!bDefault) { arPts[11] = arPts[26] + vtBr1v * dRadRatioBr1; arPts[9] = arPts[26] + vtBr1v * (dRadRatioBr1 + 2 * dBr1Width); } //下弧 ptInter = arPts[27] + vtStartv * dRadRatioBr2; nPos = TAuxTools::PositionOnLine(arPts[2], arPts[5], ptInter); if (nPos == 1) { bIsOK = FALSE; } else if (nPos == 2) { arPts[5] = ptInter; } if(!bDefault) { arPts[21] = arPts[27] - vtBr2v * dRadRatioBr2; arPts[23] = arPts[27] - vtBr2v * (dRadRatioBr2 + 2 * dBr2Width); } //计算上圆弧的点 AcGeVector3d vtCor = arPts[24] - arPts[26]; vtCor.normalize(); ptInter = arPts[26] + vtCor * dRadRatioBr1; //28 arPts.append(ptInter); AcDbCircle circArc(arPts[26],vtNor,dRadRatioBr1 + 2 * dBr1Width); //定义求交直线 AcGePoint3dArray arInterpts; AcDbLine line(arPts[14], arPts[17]); circArc.intersectWith(&line, AcDb::kExtendBoth, arInterpts); if (arInterpts.length() == 2) { //29 if (arPts[17].distanceTo(arInterpts[0]) > arPts[17].distanceTo(arInterpts[1])) { arPts.append(arInterpts[1]); } else { arPts.append(arInterpts[0]); } AcGeVector3d vtS, vtE; vtS = arPts[9] - arPts[26]; vtE = arPts[29] - arPts[26]; vtCor = vtS + vtE; vtCor.normalize(); //30 arPts.append(arPts[26] + vtCor * circArc.radius()); } else { GetIntersectWith(arPts[9], arPts[7], arPts[14], arPts[17], ptInter); arPts[9] = ptInter; arPts.append(ptInter); arPts.append(ptInter); } AcGePoint3d pt; //判断是否越界 pt = arPts[9] + vtEnd * 100; GetIntersectWith(arPts[9], pt, arPts[12], arPts[13], ptInter); if (!TAuxTools::isCodirectionalPt(arPts[14],ptInter,vtEndv)) { GetIntersectWith(arPts[9], arPts[7], arPts[14], arPts[17], ptInter); arPts[9] = ptInter; arPts[29] = ptInter; arPts[30] = ptInter; } //计算下圆弧的点 vtCor = arPts[25] - arPts[27]; vtCor.normalize(); ptInter = arPts[27] + vtCor * dRadRatioBr2; //31 arPts.append(ptInter); AcDbCircle circArc1(arPts[27],vtNor,dRadRatioBr2 + 2 * dBr2Width); //定义求交直线 arInterpts.setLogicalLength(0); AcDbLine line1(arPts[13], arPts[15]); circArc1.intersectWith(&line1, AcDb::kExtendBoth, arInterpts); if (arInterpts.length() == 2) { //32 if (arPts[15].distanceTo(arInterpts[0]) > arPts[15].distanceTo(arInterpts[1])) { arPts.append(arInterpts[1]); } else { arPts.append(arInterpts[0]); } AcGeVector3d vtS, vtE; vtS = arPts[23] - arPts[27]; vtE = arPts[32] - arPts[27]; vtCor = vtS + vtE; vtCor.normalize(); //33 arPts.append(arPts[27] + vtCor * circArc1.radius()); } else { GetIntersectWith(arPts[13], arPts[15], arPts[20], arPts[23], ptInter); arPts[23] = ptInter; arPts.append(ptInter); arPts.append(ptInter); } //判断是否越界 pt = arPts[23] + vtEnd * 100; GetIntersectWith(arPts[23], pt, arPts[12], arPts[13], ptInter); if (!TAuxTools::isCodirectionalPt(ptInter,arPts[13],vtEndv)) { GetIntersectWith(arPts[13], arPts[15], arPts[20], arPts[23], ptInter); arPts[23] = ptInter; arPts[32] = ptInter; arPts[33] = ptInter; } //重新计算标准点 if (bDefault) { double dPlusEdge = MayAsMUnit(50.0); double dPlusEnd = MayAsMUnit(50.0); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); double dLength; //计算角点 AcGePoint3d ptCor1,ptCor2,ptCor3,ptCor4; GetIntersectWith(arPts[1], arPts[3], arPts[8], arPts[11], ptCor1); GetIntersectWith(arPts[2], arPts[5], arPts[19], arPts[21], ptCor2); GetIntersectWith(arPts[13], arPts[15], arPts[20], arPts[23], ptCor3); GetIntersectWith(arPts[7], arPts[9], arPts[14], arPts[17], ptCor4); double dminSbr1 = dBr1Width; if (dBr1Width > dSWidth) { dminSbr1 = dSWidth; } double dminSbr2 = dBr2Width; if (dBr2Width > dSWidth) { dminSbr2 = dSWidth; } double dminEbr1 = dBr1Width; if (dBr1Width > dEWidth) { dminEbr1 = dEWidth; } double dminEbr2 = dBr2Width; if (dBr2Width > dEWidth) { dminEbr2 = dEWidth; } //start AcGePoint3d ptDis = ptStart + vtStart * 10000; double dis1 = ptDis.distanceTo(ptCor1); double dis2 = ptDis.distanceTo(ptCor2); if (dis1 < dis2) { dAngle = vtStart.angleTo(vtBr1); dAngle *= 0.5; dLength = (dRadRatio - 0.5) * dminSbr1 * 2 / tan(dAngle) + dPlusEdge; arPts[0] = ptCor1 + vtStart * dLength; arPts[0] = arPts[0] - vtStartv * dSWidth; } else { dAngle = vtStart.angleTo(vtBr2); dAngle *= 0.5; dLength = (dRadRatio - 0.5) * dminSbr2 * 2 / tan(dAngle) + dPlusEdge; arPts[0] = ptCor2 + vtStart * dLength; arPts[0] = arPts[0] + vtStartv * dSWidth; } //end ptDis = arPts[12] + vtEnd * 10000; dis1 = ptDis.distanceTo(ptCor4); dis2 = ptDis.distanceTo(ptCor3); if (dis1 < dis2) { dAngle = vtEnd.angleTo(vtBr1); dAngle *= 0.5; dLength = dPlusEnd + dPlusEdge; arPts[2] = ptCor4 + vtEnd * dLength; arPts[2] = arPts[2] + vtEndv * dEWidth; } else { dAngle = vtEnd.angleTo(vtBr2); dAngle *= 0.5; dLength = dPlusEnd + dPlusEdge; arPts[2] = ptCor3 + vtEnd * dLength; arPts[2] = arPts[2] - vtEndv * dEWidth; } if (eCrosstype == AecHvac::eArcuateIntubCross) { arPts[2] = arPts[2].orthoProject(planEnd); } //br1 ptDis = arPts[6] + vtBr1 * 10000; dis1 = ptDis.distanceTo(ptCor1); dis2 = ptDis.distanceTo(ptCor4); if (dis1 < dis2) { dAngle = vtBr1.angleTo(vtStart); dAngle *= 0.5; dLength = (dRadRatio - 0.5) * dminSbr1 * 2 / tan(dAngle) + dPlusEdge; arPts[4] = ptCor1 + vtBr1 * dLength; arPts[4] = arPts[4] + vtBr1v * dBr1Width; arPts[4] = arPts[4].orthoProject(planBr1); } else { dAngle = vtBr1.angleTo(vtEnd); dAngle *= 0.5; dLength = (dRadRatio - 0.5) * dminEbr1 * 2 / tan(dAngle) + dPlusEdge; arPts[4] = ptCor4 + vtBr1 * dLength; arPts[4] = arPts[4] - vtBr1v * dBr1Width; arPts[4] = arPts[4].orthoProject(planBr1); } //br2 ptDis = arPts[18] + vtBr2 * 10000; dis1 = ptDis.distanceTo(ptCor2); dis2 = ptDis.distanceTo(ptCor3); if (dis1 < dis2) { dAngle = vtBr2.angleTo(vtStart); dAngle *= 0.5; dLength = (dRadRatio - 0.5) * dminSbr2 * 2 / tan(dAngle) + dPlusEdge; arPts[6] = ptCor2 + vtBr2 * dLength; arPts[6] = arPts[6] - vtBr2v * dBr2Width; arPts[6] = arPts[6].orthoProject(planBr2); } else { dAngle = vtBr2.angleTo(vtEnd); dAngle *= 0.5; dLength = (dRadRatio - 0.5) * dminEbr2 * 2 / tan(dAngle) + dPlusEdge; arPts[6] = ptCor3 + vtBr2 * dLength; arPts[6] = arPts[6] + vtBr2v * dBr2Width; arPts[6] = arPts[6].orthoProject(planBr2); } } if (!bDefault && eCrosstype == AecHvac::eArcuateIntubCross) { AcGePoint3d ptProj = AcGePoint3d::kOrigin; ptProj = arPts[3]; arPts.setAt(3, ptProj.orthoProject(planBr1)); ptProj = arPts[28]; arPts.setAt(28, ptProj.orthoProject(planBr1)); ptProj = arPts[11]; arPts.setAt(11, ptProj.orthoProject(planBr1)); ptProj = arPts[8]; arPts.setAt(8, ptProj.orthoProject(planBr1)); ptProj = arPts[6]; arPts.setAt(6, ptProj.orthoProject(planBr1)); ptProj = arPts[7]; arPts.setAt(7, ptProj.orthoProject(planBr1)); ptProj = arPts[9]; arPts.setAt(9, ptProj.orthoProject(planBr1)); ptProj = arPts[30]; arPts.setAt(30, ptProj.orthoProject(planBr1)); ptProj = arPts[29]; arPts.setAt(29, ptProj.orthoProject(planBr1)); ptProj = arPts[10]; arPts.setAt(10, ptProj.orthoProject(planBr1)); ptProj = arPts[5]; arPts.setAt(5, ptProj.orthoProject(planBr2)); ptProj = arPts[31]; arPts.setAt(31, ptProj.orthoProject(planBr2)); ptProj = arPts[21]; arPts.setAt(21, ptProj.orthoProject(planBr2)); ptProj = arPts[19]; arPts.setAt(19, ptProj.orthoProject(planBr2)); ptProj = arPts[18]; arPts.setAt(18, ptProj.orthoProject(planBr2)); ptProj = arPts[20]; arPts.setAt(20, ptProj.orthoProject(planBr2)); ptProj = arPts[22]; arPts.setAt(22, ptProj.orthoProject(planBr2)); ptProj = arPts[23]; arPts.setAt(23, ptProj.orthoProject(planBr2)); ptProj = arPts[33]; arPts.setAt(33, ptProj.orthoProject(planBr2)); ptProj = arPts[32]; arPts.setAt(32, ptProj.orthoProject(planBr2)); } return arPts.length() > 0; } BOOL ImpHvacCross::GetIntersectWith(AcGePoint3d &pt1,AcGePoint3d &pt2,AcGeVector3d &vt1,AcGeVector3d &vt2,AcGePoint3d &ptIntersect) const { AcGePoint3d ptTmp1 = pt1; AcGePoint3d ptTmp2 = pt1 + vt1 * 1000; AcGePoint3d ptTmp3 = pt2; AcGePoint3d ptTmp4 = pt2 + vt2 * 1000; ptTmp1.z = ptTmp2.z = ptTmp3.z = ptTmp4.z = 0; AcDbLine line1(ptTmp1,ptTmp2),line2(ptTmp3,ptTmp4); AcGePoint3dArray arrPtInsec; BOOL bRes = FALSE; if(Acad::eOk == line1.intersectWith(&line2, AcDb::kExtendBoth, arrPtInsec)) { if(arrPtInsec.length() > 0) { ptIntersect = arrPtInsec[0]; bRes = TRUE; } } ptIntersect.z = pt1.z; return bRes; } BOOL ImpHvacCross::GetIntersectWith(AcGePoint3d &pt1,AcGePoint3d &pt2,AcGePoint3d &pt3,AcGePoint3d &pt4,AcGePoint3d &ptIntersect) const { AcGePoint3d ptTmp1 = pt1; AcGePoint3d ptTmp2 = pt2; AcGePoint3d ptTmp3 = pt3; AcGePoint3d ptTmp4 = pt4; ptTmp1.z = ptTmp2.z = ptTmp3.z = ptTmp4.z = 0; AcDbLine line1(ptTmp1,ptTmp2),line2(ptTmp3,ptTmp4); AcGePoint3dArray arrPtInsec; BOOL bRes = FALSE; if(Acad::eOk == line1.intersectWith(&line2, AcDb::kExtendBoth, arrPtInsec)) { if(arrPtInsec.length() > 0) { ptIntersect = arrPtInsec[0]; bRes = TRUE; } } ptIntersect.z = pt1.z; return bRes; } void ImpHvacCross::GetPlusEdgePts(AcGePoint3dArray &arPts, AcGePoint3d &ptStart, AcGeVector3d &vtStart, AcGeVector3d &vtNor, double dSWidth) const { double dPlusEdge = MayAsMUnit(50); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); if (dPlusEdge < 1.e-3) { dPlusEdge = 0.01; } AcGeVector3d vtStartv = vtStart; vtStartv.rotateBy(PI * 0.5, vtNor); vtStart.normalize(); vtStartv.normalize(); arPts.append(ptStart); AcGePoint3d ptpt,ptpt1; ptpt = ptStart + vtStartv * dSWidth; arPts.append(ptpt); ptpt1 = ptStart - vtStartv * dSWidth; arPts.append(ptpt1); int nSize = arPts.length(); arPts.append(arPts[nSize - 2] - vtStart * dPlusEdge); arPts.append(arPts[nSize - 3] - vtStart * dPlusEdge); arPts.append(arPts[nSize - 1] - vtStart * dPlusEdge); } void ImpHvacCross::GetArcPoint(AcDbPolyline &polyLine, AcGePoint3dArray &ptArcArr) const { if (polyLine.numVerts() != 4) return; double dPara1(0.0), dPara2(0.0); double dPar1, dPar2; AcGePoint3d pt0, pt1, pt2, pt3, ptMid; polyLine.getPointAt(0, pt0); polyLine.getPointAt(1, pt1); polyLine.getPointAt(2, pt2); polyLine.getPointAt(3, pt3); polyLine.getParamAtPoint(pt0, dPar1); polyLine.getParamAtPoint(pt1, dPar2); polyLine.getPointAtParam((dPar1 + dPar2)*0.5, ptMid); ptArcArr.append(pt0); ptArcArr.append(ptMid); ptArcArr.append(pt1); polyLine.getParamAtPoint(pt1, dPar1); polyLine.getParamAtPoint(pt2, dPar2); polyLine.getPointAtParam((dPar1 + dPar2)*0.5, ptMid); ptArcArr.append(ptMid); ptArcArr.append(pt2); polyLine.getParamAtPoint(pt2, dPar1); polyLine.getParamAtPoint(pt3, dPar2); polyLine.getPointAtParam((dPar1 + dPar2)*0.5, ptMid); ptArcArr.append(ptMid); ptArcArr.append(pt3); } AcGePoint3d ImpHvacCross::GetCenterPt() const { AcGeVector3d vtStart; AcGePoint3d ptStart; double dBr1Width = MayAsMUnit(300.0), dBr2Width = MayAsMUnit(300.0), dPlusEdge = MayAsMUnit(50.0); m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_Branch1Width, dBr1Width); m_pXDataMap->GetAt(HCRS_Branch2Width, dBr2Width); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); double dRadRatio = 1.0; m_pXDataMap->GetAt(HCRS_RadRatio, dRadRatio); dRadRatio *= max(dBr1Width,dBr2Width); vtStart.normalize(); AecHvac::HvacCrossType eType = AecHvac::eOrthoCross; m_pXDataMap->GetAt(HCRS_Type, (int&)eType); if (eType == AecHvac::eOrthoCross || eType == AecHvac::eArcuateCross || eType == AecHvac::eArcuateIntubCross) { return ptStart - vtStart * (dRadRatio + dPlusEdge); } double dPlusSta = 100.0; return ptStart - vtStart * (dPlusSta + dPlusEdge + max(dBr1Width,dBr2Width) * 0.5); } AcGePoint3d ImpHvacCross::GetPlusEdgeStartPt() const { AcGeVector3d vt; AcGePoint3d pt; double dPlusEdge = MayAsMUnit(50.0); m_pXDataMap->GetAt(HCRS_StartPoint, pt); m_pXDataMap->GetAt(HCRS_StartDir, vt); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); vt.normalize(); return pt - vt * dPlusEdge; } AcGePoint3d ImpHvacCross::GetPlusEdgeEndPt() const { AcGeVector3d vt; AcGePoint3d pt; double dPlusEdge = MayAsMUnit(50.0); m_pXDataMap->GetAt(HCRS_EndPoint, pt); m_pXDataMap->GetAt(HCRS_EndDir, vt); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); vt.normalize(); return pt - vt * dPlusEdge; } AcGePoint3d ImpHvacCross::GetPlusEdgeBra1Pt() const { AcGeVector3d vt; AcGePoint3d pt; double dPlusEdge = MayAsMUnit(50.0); m_pXDataMap->GetAt(HCRS_BranchPoint1, pt); m_pXDataMap->GetAt(HCRS_BranchDir1, vt); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); vt.normalize(); return pt - vt * dPlusEdge; } AcGePoint3d ImpHvacCross::GetPlusEdgeBra2Pt() const { AcGeVector3d vt; AcGePoint3d pt; double dPlusEdge = MayAsMUnit(50.0); m_pXDataMap->GetAt(HCRS_BranchPoint2, pt); m_pXDataMap->GetAt(HCRS_BranchDir2, vt); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); vt.normalize(); return pt - vt * dPlusEdge; } AcGePoint3d ImpHvacCross::GetFinalPt(AcGePoint3d ptStart,AcGePoint3d ptInter1,AcGePoint3d ptInter2,AcGePoint3d ptCor1, AcGePoint3d ptCor2,AcGeVector3d vtStart,double dLength) const { AcGeVector3d vtNor = AcGeVector3d::kZAxis,vtStartv; vtNor = GetSectNormal(); vtStartv = vtStart; vtStartv.rotateBy(PI * 0.5,vtNor); double dPlusEdge = MayAsMUnit(50.0); double dPlusEnd = MayAsMUnit(50.0); AcGePoint3d ptInter,ptRet; m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); double ddisPar = dPlusEnd + dPlusEdge; AcGePoint3d ptDis = ptStart + vtStart * 10000; double dis1 = ptDis.distanceTo(ptCor1); double dis2 = ptDis.distanceTo(ptCor2); double dWidthBr1, dWidthBr2; m_pXDataMap->GetAt(HCRS_Branch1Width, dWidthBr1); m_pXDataMap->GetAt(HCRS_Branch2Width, dWidthBr2); AecHvac::HvacCrossType eCrossType = AecHvac::eInsertCross; m_pXDataMap->GetAt(HCRS_Type, (int&)eCrossType); ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); // 不用该分支了 if (dis1 < dis2) { GetIntersectWith(ptCor1, ptInter1, vtStartv, vtStart, ptInter); if ((ptInter.distanceTo(ptInter1) + ddisPar) < dLength) { if (!(eCrossType == AecHvac::eInsertCross || eCrossType == AecHvac::eInsertIntubCross)) ptRet = ptInter1 + vtStart * dLength; else { if(eCircle == eSectType) ptRet = ptInter + vtStart * 50; else ptRet = ptInter1 + vtStart * (100.0 + dPlusEdge + dWidthBr1 * 0.5); } } else { if (!(eCrossType == AecHvac::eInsertCross || eCrossType == AecHvac::eInsertIntubCross)) ptRet = ptInter + vtStart * ddisPar; else ptRet = ptInter + vtStart * (100.0 + dPlusEdge); } } else { GetIntersectWith(ptCor2, ptInter2, vtStartv, vtStart,ptInter); if ((ptInter.distanceTo(ptInter2) + ddisPar) < dLength) { if (!(eCrossType == AecHvac::eInsertCross || eCrossType == AecHvac::eInsertIntubCross)) ptRet = ptInter2 + vtStart * dLength; else { if(eCircle == eSectType) ptRet = ptInter + vtStart * 50; else ptRet = ptInter2 + vtStart * (100.0 + dPlusEdge + dWidthBr2 * 0.5); } } else { if (!(eCrossType == AecHvac::eInsertCross || eCrossType == AecHvac::eInsertIntubCross)) ptRet = ptInter + vtStart * ddisPar; else ptRet = ptInter + vtStart * (100.0 + dPlusEdge); } } return ptRet; } AcGePoint3d ImpHvacCross::GetInterBrPt(AcGePoint3d ptStart,AcGePoint3d ptInter1,AcGePoint3d ptInter2,AcGePoint3d ptCor1, AcGePoint3d ptCor2,AcGeVector3d vtStart,double dLength) const { AcGeVector3d vtNor = AcGeVector3d::kZAxis,vtStartv; vtNor = GetSectNormal(); vtStartv = vtStart; vtStartv.rotateBy(PI * 0.5,vtNor); double dPlusEdge = MayAsMUnit(50.0); double dPlusEnd = MayAsMUnit(50.0); double dPlusBr = MayAsMUnit(150.0); AcGePoint3d ptInter,ptRet; double ddisPar = dPlusEnd + dPlusEdge; AcGePoint3d ptDis = ptStart + vtStart * 10000; double dis1 = ptDis.distanceTo(ptCor1); double dis2 = ptDis.distanceTo(ptCor2); double dWidthBr1, dWidthBr2; m_pXDataMap->GetAt(HCRS_Branch1Width, dWidthBr1); m_pXDataMap->GetAt(HCRS_Branch2Width, dWidthBr2); AecHvac::HvacCrossType eCrossType = AecHvac::eInsertCross; m_pXDataMap->GetAt(HCRS_Type, (int&)eCrossType); if (dis1 < dis2) { ptRet = (ptCor1 + vtStart * dPlusBr) + vtStartv * (dLength + dPlusEdge); } else { ptRet = (ptCor2 + vtStart * dPlusBr) - vtStartv * (dLength + dPlusEdge); } return ptRet; } AcGePoint3d ImpHvacCross::GetInterFinalPt(AcGePoint3d ptStart,AcGePoint3d ptInter1,AcGePoint3d ptInter2,AcGePoint3d ptCor1, AcGePoint3d ptCor2,AcGeVector3d vtStart,double dLength) const { AcGeVector3d vtNor = AcGeVector3d::kZAxis,vtStartv; vtNor = GetSectNormal(); vtStartv = vtStart; vtStartv.rotateBy(PI * 0.5,vtNor); double dPlusEdge = MayAsMUnit(50.0); double dPlusEnd = MayAsMUnit(50.0); AcGePoint3d ptInter,ptRet; m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); double ddisPar = dPlusEnd + dPlusEdge; AcGePoint3d ptDis = ptStart + vtStart * 10000; double dis1 = ptDis.distanceTo(ptCor1); double dis2 = ptDis.distanceTo(ptCor2); double dWidthBr1, dWidthBr2; m_pXDataMap->GetAt(HCRS_Branch1Width, dWidthBr1); m_pXDataMap->GetAt(HCRS_Branch2Width, dWidthBr2); AecHvac::HvacCrossType eCrossType = AecHvac::eInsertCross; m_pXDataMap->GetAt(HCRS_Type, (int&)eCrossType); if (dis1 < dis2) { GetIntersectWith(ptCor1, ptInter1, vtStartv, vtStart, ptInter); if ((ptInter.distanceTo(ptInter1) + ddisPar) < dLength) { ptRet = ptInter1 + vtStart * (100.0 + dPlusEdge + dWidthBr1 * 0.5); } else { ptRet = ptInter + vtStart * (100.0 + dPlusEdge); } } else { GetIntersectWith(ptCor2, ptInter2, vtStartv, vtStart,ptInter); if ((ptInter.distanceTo(ptInter2) + ddisPar) < dLength) { ptRet = ptInter2 + vtStart * (100.0 + dPlusEdge + dWidthBr2 * 0.5); } else { ptRet = ptInter + vtStart * (100.0 + dPlusEdge); } } return ptRet; } AcGePoint3d ImpHvacCross::GetFinalPtEnd(AcGePoint3d ptStart,AcGePoint3d ptInter1,AcGePoint3d ptInter2,AcGePoint3d ptCor1, AcGePoint3d ptCor2,AcGeVector3d vtStart, double dPlusEnd) const { AcGeVector3d vtNor = AcGeVector3d::kZAxis,vtStartv; vtNor = GetSectNormal(); vtStartv = vtStart; vtStartv.rotateBy(PI * 0.5,vtNor); double dPlusEdge = MayAsMUnit(50.0); AcGePoint3d ptInter,ptRet; m_pXDataMap->GetAt(HVAC_PlusEdge, dPlusEdge); double ddisPar = dPlusEnd + dPlusEdge; AcGePoint3d ptDis = ptStart + vtStart * 10000; double dis1 = ptDis.distanceTo(ptCor1); double dis2 = ptDis.distanceTo(ptCor2); if (dis1 < dis2) { GetIntersectWith(ptCor1, ptInter1, vtStartv, vtStart, ptInter); ptRet = ptInter + vtStart * ddisPar; } else { GetIntersectWith(ptCor2, ptInter2, vtStartv, vtStart,ptInter); ptRet = ptInter + vtStart * ddisPar; } return ptRet; } BOOL ImpHvacCross::GetInterfaceKeyPt(AcGePoint3dArray &ptUpArr, AcGePoint3dArray &ptDownArr) const { // 7━━━━━6 // ┃ ┃ ┃ // ┃ ┃ ┃ // ┃ ┃ ┃ // ┃ ┃ ┃ // 0━━━━┛ ┃ ┗━━━━5 // ┃ ┃ ┃ // ┃ ┃ ┃ // ━━━━━━━━━━━━━━━━ // ┃ ┃ ┃ // ┃ ┃ ┃ // 1━━━━┓ ┃ ┏━━━━4 // ┃ ┃ ┃ // ┃ ┃ ┃ // ┃ ┃ ┃ // ┃ ┃ ┃ // 2━━━━━3 if (NULL == m_pXDataMap) { return FALSE; } ESection eSectTeye = eRect; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectTeye); AcGePoint3d ptStart, ptEnd, ptBran1, ptBran2; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBran1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBran2); AcGeVector3d vtNormal = normal(); AcGeVector3d vtStart, vtEnd, vtBran1, vtBran2; m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBran1); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBran2); AcGeVector3d vtStartSide = vtStart; vtStartSide.rotateBy(PI * 0.5, vtNormal); AcGeVector3d vtEndSide = vtEnd; vtEndSide.rotateBy(PI * 0.5, vtNormal); AcGeVector3d vtBranSide1 = vtBran1; vtBranSide1.rotateBy(PI * 0.5, vtNormal); AcGeVector3d vtBranSide2 = vtBran2; vtBranSide2.rotateBy(PI * 0.5, vtNormal); double dStrWidth = 0, dEndWidth = 0, dBranWidth1 = 0, dBranWidth2 = 0; m_pXDataMap->GetAt(HCRS_StartWidth, dStrWidth); m_pXDataMap->GetAt(HCRS_EndWidth, dEndWidth); m_pXDataMap->GetAt(HCRS_Branch1Width, dBranWidth1); m_pXDataMap->GetAt(HCRS_Branch2Width, dBranWidth2); double dHalfStrWidth = dStrWidth * 0.5; double dHalfEndWidth = dEndWidth * 0.5; double dHalfBranWidth1 = dBranWidth1 * 0.5; double dHalfBranWidth2 = dBranWidth2 * 0.5; double dStrThick = 0, dEndThick = 0, dBranThick1 = 0, dBranThick2 = 0; if(eRect != eSectTeye) { dStrThick = dStrWidth; dEndThick = dEndWidth; dBranThick1 = dBranWidth1; dBranThick2 = dBranWidth2; } else { m_pXDataMap->GetAt(HCRS_Thick, dStrThick); if(!m_pXDataMap->GetAt(HCRS_EndThick, dEndThick)) dEndThick = dStrThick; m_pXDataMap->GetAt(HCRS_Branch1Thick, dBranThick1); m_pXDataMap->GetAt(HCRS_Branch2Thick, dBranThick2); } double dHalfStrThick = dStrThick * 0.5; double dHalfEndThick = dEndThick * 0.5; double dHalfBranThick1 = dBranThick1 * 0.5; double dHalfBranThick2 = dBranThick2 * 0.5; AcGePoint3d ptUp, ptDown; // pt0 ptUp = ptStart - vtStartSide * dHalfStrWidth; ptUp = ptUp + vtNormal * dHalfStrThick; ptUpArr.append(ptUp); ptDown = ptUp - vtNormal * dStrThick; ptDownArr.append(ptDown); // pt1 ptUp = ptStart + vtStartSide * dHalfStrWidth; ptUp = ptUp + vtNormal * dHalfStrThick; ptUpArr.append(ptUp); ptDown = ptUp - vtNormal * dStrThick; ptDownArr.append(ptDown); // pt2 ptUp = ptBran1 - vtBranSide1 * dHalfBranWidth1; ptUp = ptUp + vtNormal * dHalfBranThick1; ptUpArr.append(ptUp); ptDown = ptUp - vtNormal * dBranThick1; ptDownArr.append(ptDown); // pt3 ptUp = ptBran1 + vtBranSide1 * dHalfBranWidth1; ptUp = ptUp + vtNormal * dHalfBranThick1; ptUpArr.append(ptUp); ptDown = ptUp - vtNormal * dBranThick1; ptDownArr.append(ptDown); // pt4 ptUp = ptEnd - vtEndSide * dHalfEndWidth; ptUp = ptUp + vtNormal * dHalfEndThick; ptUpArr.append(ptUp); ptDown = ptUp - vtNormal * dEndThick; ptDownArr.append(ptDown); // pt5 ptUp = ptEnd + vtEndSide * dHalfEndWidth; ptUp = ptUp + vtNormal * dHalfEndThick; ptUpArr.append(ptUp); ptDown = ptUp - vtNormal * dEndThick; ptDownArr.append(ptDown); // pt6 ptUp = ptBran2 - vtBranSide2 * dHalfBranWidth2; ptUp = ptUp + vtNormal * dHalfBranThick2; ptUpArr.append(ptUp); ptDown = ptUp - vtNormal * dBranThick2; ptDownArr.append(ptDown); // pt7 ptUp = ptBran2 + vtBranSide2 * dHalfBranWidth2; ptUp = ptUp + vtNormal * dHalfBranThick2; ptUpArr.append(ptUp); ptDown = ptUp - vtNormal * dBranThick2; ptDownArr.append(ptDown); return TRUE; } double ImpHvacCross::InsertLength(double dEndWidth, double dBr1Width, double dBr2Width, double dFlange, double dAngle, AecHvac::HvacCrossType eType) const { double dWidth = dBr1Width > dBr2Width ? dBr1Width : dBr2Width; if (AecHvac::eInsertCross == eType) { // 承插标准长度算法 if ((int)dAngle == 30) { return dEndWidth + dWidth + 1.866 * (dFlange * 2.0 + 20); } if ((int)dAngle == 45) { return (dEndWidth + dWidth) * 0.65 + 1.21 * (dFlange * 2.0 + 20); } } if (AecHvac::eInclineCross == eType) { // 斜接标准长度算法 double dTmp = (dWidth * cos(dAngle * PI / 180) + dEndWidth) * 0.5 * 1.4 / sin(dAngle * PI / 180); int iTmp = (int)dTmp; int iDivNum = iTmp / 50; int iNum = iTmp % 50; if (iNum != 0) { iDivNum++; } iTmp = iDivNum * 50; dTmp = (double)iTmp; dTmp += dFlange; return dTmp; } return dWidth; } BOOL ImpHvacCross::GetInterfaceSizeData(int nIndex, AecInterface& inf) const { ASSERT(NULL != m_pXDataMap); // 获取对象类型 AecHvac::HvacCrossType eType = AecHvac::eOrthoCross; m_pXDataMap->GetAt(HCRS_Type, (int&)eType); // 获取截面类型 ESection eSectType = eRect; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); // 获取接口截面、宽度、厚度数据key值 LPCTSTR pszWidthKey, pszThickKey; switch (nIndex) { case 0: pszWidthKey = ((eCircle == eSectType) ? HCRS_StartDiameter : HCRS_StartWidth); pszThickKey = HCRS_Thick; break; case 1: pszWidthKey = ((eCircle == eSectType) ? HCRS_EndDiameter : HCRS_EndWidth); pszThickKey = HCRS_Thick; break; case 2: pszWidthKey = ((eCircle == eSectType) ? HCRS_Branch1Diameter : HCRS_Branch1Width); pszThickKey = ((AecHvac::eInsertCross == eType || AecHvac::eInsertIntubCross == eType) ? HCRS_Branch1Thick : HCRS_Thick); break; case 3: pszWidthKey = ((eCircle == eSectType) ? HCRS_Branch2Diameter : HCRS_Branch2Width); pszThickKey = ((AecHvac::eInsertCross == eType || AecHvac::eInsertIntubCross == eType) ? HCRS_Branch2Thick : HCRS_Thick); 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 ImpHvacCross::GetInterface(AcArray& arInfs) const { if (NULL == m_pXDataMap) return FALSE; // 获取四通各点位置 AcGePoint3d ptStart,ptEnd,ptBr1,ptBr2; AcGeVector3d vtStart,vtEnd,vtBr1,vtBr2; m_pXDataMap->GetAt(HCRS_StartPoint, ptStart); m_pXDataMap->GetAt(HCRS_StartDir, vtStart); m_pXDataMap->GetAt(HCRS_EndPoint, ptEnd); m_pXDataMap->GetAt(HCRS_EndDir, vtEnd); m_pXDataMap->GetAt(HCRS_BranchPoint1, ptBr1); m_pXDataMap->GetAt(HCRS_BranchDir1, vtBr1); m_pXDataMap->GetAt(HCRS_BranchPoint2, ptBr2); m_pXDataMap->GetAt(HCRS_BranchDir2, vtBr2); AecInterface inf; inf.idOwner = m_pOwnerEnt->objectId(); for (int nIndex = 0;nIndex <= 3;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; } case 2: { // 没有管件连接 inf.vtDir = vtBr1; inf.ptPos = ptBr1; GetInterfaceSizeData(nIndex, inf); break; } case 3: { // 没有管件连接 inf.vtDir = vtBr2; inf.ptPos = ptBr2; GetInterfaceSizeData(nIndex, inf); break; } } arInfs.append(inf); } return true; }