#include "stdafx.h" #include "FoldProTool.h" CFoldProTool::CFoldProTool(void) { } CFoldProTool::~CFoldProTool(void) { } BOOL CFoldProTool::IsCrossBy(const AcGeLine3d& line,PFoldProLine line1) { AcGePoint3d ptTurn,ptS1,ptS2,ptTemp; ptTurn = line1->m_ptTurn; AcGeLine3d lineTemp; double dParam1 = 0.0,dParam2 = 0.0; if (line1->m_LinePart1.m_bValid) { //半边有效 ptS1 = line1->m_LinePart1.m_ptS; lineTemp.set(ptTurn,ptS1); if(lineTemp.intersectWith(line,ptTemp)) { //判断点是否在线外 if( (line.isOn(ptTemp,dParam1) && (dParam1 - 1 < -1e-3 && dParam1 > 1e-3)) && (lineTemp.isOn(ptTemp,dParam2) && (dParam2 - 1 < -1e-3 && dParam2 > 1e-3))) { return TRUE; } } } if(line1->m_LinePart2.m_bValid) { //另外半边有效 ptS2 = line1->m_LinePart2.m_ptS; lineTemp.set(ptTurn,ptS2); if(lineTemp.intersectWith(line,ptTemp)) { //判断点是否在线外 0 < param < 1不包括断点 if( (line.isOn(ptTemp,dParam1) && (dParam1 - 1 < -1e-3 && dParam1 > 1e-3)) && (lineTemp.isOn(ptTemp,dParam2) && (dParam2 - 1 < -1e-3 && dParam2 > 1e-3))) { return TRUE; } } } return FALSE; } BOOL CFoldProTool::IsCrossBy(PFoldProLine ProLine1,PFoldProLine ProLine2) { int nNo11,nNo12,nNo21,nNo22; ProLine1->GetProLineNo(nNo11,nNo12); ProLine2->GetProLineNo(nNo21,nNo22); if ((nNo11 == nNo21 && nNo12 == nNo22) || (nNo11 == nNo22 && nNo12 == nNo21)) { return FALSE; } AcGeLine3d line; if(ProLine1->m_LinePart1.m_bValid) { //半边有效 line.set(ProLine1->m_ptTurn,ProLine1->m_LinePart1.m_ptS); if (IsCrossBy(line,ProLine2)) { return TRUE; } } if(ProLine1->m_LinePart2.m_bValid) { //半边有效 line.set(ProLine1->m_ptTurn,ProLine1->m_LinePart2.m_ptS); if (IsCrossBy(line,ProLine2)) { return TRUE; } } return FALSE; } BOOL CFoldProTool::IsCrossBy(PFoldProLine proLine,XFoldThunder thunder,double dHx) { CFoldToolKit* pToolKit = CFoldToolKit::Instance(); if (pToolKit) { double dR = pToolKit->CalcFoldRx(thunder.m_dHeight,dHx); dR *= 1000; AcGeCircArc3d cir; cir.set(thunder.m_ptPos,AcGeVector3d::kZAxis,dR); AcGePoint3d ptTurn,ptS1,ptS2,ptCross1,ptCross2; AcGeLine3d lineTemp; double dParam = 0.0; ptTurn = proLine->m_ptTurn; if (proLine->m_LinePart1.m_bValid) { //半边有效 ptS1 = proLine->m_LinePart1.m_ptS; lineTemp.set(ptTurn,ptS1); int nCount = 0; if(cir.intersectWith(lineTemp,nCount,ptCross1,ptCross2)) { //判断点是否在线外 if (nCount > 0) { if (ptCross1 == ptTurn || ptCross2 == ptTurn) { return FALSE; } if((lineTemp.isOn(ptCross1,dParam) && (dParam - 1 < 1e-3 && dParam > -1e-3))) { return TRUE; } } else return FALSE; } } if (proLine->m_LinePart2.m_bValid) { //半边有效 ptS2 = proLine->m_LinePart2.m_ptS; lineTemp.set(ptTurn,ptS2); int nCount = 0; if(cir.intersectWith(lineTemp,nCount,ptCross1,ptCross2)) { //判断点是否在线外 if (nCount > 0) { if (ptCross1 == ptTurn || ptCross2 == ptTurn) { return FALSE; } if((lineTemp.isOn(ptCross1,dParam) && (dParam - 1 < 1e-3 && dParam > -1e-3))) { return TRUE; } else return FALSE; } } } } return FALSE; } BOOL CFoldProTool::GetCrossPoint(PFoldProLine proLine,XFoldThunder thunder,double dHx,AcGePoint3dArray& arCross) { CFoldToolKit* pToolKit = CFoldToolKit::Instance(); if (pToolKit) { double dR = pToolKit->CalcFoldRx(thunder.m_dHeight,dHx); dR *= 1000; AcGeCircArc3d cir; cir.set(thunder.m_ptPos,AcGeVector3d::kZAxis,dR); AcGePoint3d ptTurn,ptS1,ptS2,ptCross1,ptCross2; AcGeLine3d lineTemp; double dParam = 0.0; ptTurn = proLine->m_ptTurn; if (proLine->m_LinePart1.m_bValid) { //半边有效 ptS1 = proLine->m_LinePart1.m_ptS; lineTemp.set(ptTurn,ptS1); int nCount = 0; if(cir.intersectWith(lineTemp,nCount,ptCross1,ptCross2)) { //判断点是否在线外 if (nCount > 0) { if((lineTemp.isOn(ptCross1,dParam) && (dParam - 1 < 1e-3 && dParam > -1e-3))) { arCross.append(ptCross1); } if ((lineTemp.isOn(ptCross2,dParam) && (dParam - 1 < 1e-3 && dParam > -1e-3))) { arCross.append(ptCross2); } } } } if (proLine->m_LinePart2.m_bValid) { //半边有效 ptS2 = proLine->m_LinePart2.m_ptS; lineTemp.set(ptTurn,ptS2); int nCount = 0; if(cir.intersectWith(lineTemp,nCount,ptCross1,ptCross2)) { //判断点是否在线外 if (nCount > 0) { if((lineTemp.isOn(ptCross1,dParam) && (dParam - 1 < 1e-3 && dParam > -1e-3))) { arCross.append(ptCross1); } if((lineTemp.isOn(ptCross2,dParam) && (dParam - 1 < 1e-3 && dParam > -1e-3))) { arCross.append(ptCross2); } } } } } return arCross.length() > 0; } //将ProLine1设置为基准保护线 BOOL CFoldProTool::SortBaseLine(const AcGeIntArray& arNoBase,PFoldProLine& ProLine1,PFoldProLine& ProLine2,PFoldProLine& ProLine3) { PFoldProLine pTemp = NULL; int nPos = 0; if (arNoBase.find(ProLine1->m_LinePart1.m_nNo,nPos) && arNoBase.find(ProLine1->m_LinePart2.m_nNo,nPos)) { return TRUE; } else if(arNoBase.find(ProLine2->m_LinePart1.m_nNo,nPos) && arNoBase.find(ProLine2->m_LinePart2.m_nNo,nPos)) { pTemp = ProLine1; ProLine1 = ProLine2; ProLine2 = pTemp; return TRUE; } else if(arNoBase.find(ProLine3->m_LinePart1.m_nNo,nPos) && arNoBase.find(ProLine3->m_LinePart2.m_nNo,nPos)) { pTemp = ProLine1; ProLine1 = ProLine3; ProLine3 = pTemp; return TRUE; } return FALSE; } BOOL CFoldProTool::SortBaseLine(const AcGeIntArray& arNoBase,PFoldProLine& ProLine1,PFoldProLine& ProLine2) { PFoldProLine pTemp = NULL; int nPos = 0; if (arNoBase.find(ProLine1->m_LinePart1.m_nNo,nPos) && arNoBase.find(ProLine1->m_LinePart2.m_nNo,nPos)) { return TRUE; } else if(arNoBase.find(ProLine2->m_LinePart1.m_nNo,nPos) && arNoBase.find(ProLine2->m_LinePart2.m_nNo,nPos)) { pTemp = ProLine1; ProLine1 = ProLine2; ProLine2 = pTemp; return TRUE; } return FALSE; } BOOL CFoldProTool::IsCloserByLine(const AcGeLine3d& line,PFoldProLine ProBase,PFoldProLine ProLine) { AcGePoint3d ptS1,ptS2,ptTemp,ptTurn1,ptTurn2; ptTurn1 = ProBase->m_ptTurn; ptTurn2 = ProLine->m_ptTurn; if (ProBase->m_LinePart1.m_nNo == ProLine->m_LinePart1.m_nNo) { ptS1 = ProBase->m_LinePart1.m_ptS; ptS2 = ProLine->m_LinePart1.m_ptS; } if (ProBase->m_LinePart1.m_nNo == ProLine->m_LinePart2.m_nNo) { ptS1 = ProBase->m_LinePart1.m_ptS; ptS2 = ProLine->m_LinePart2.m_ptS; } if (ProBase->m_LinePart2.m_nNo == ProLine->m_LinePart1.m_nNo) { ptS1 = ProBase->m_LinePart2.m_ptS; ptS2 = ProLine->m_LinePart1.m_ptS; } if (ProBase->m_LinePart2.m_nNo == ProLine->m_LinePart2.m_nNo) { ptS1 = ProBase->m_LinePart2.m_ptS; ptS2 = ProLine->m_LinePart2.m_ptS; } AcGePointOnCurve3d ptPrj; line.getClosestPointTo(ptS1,ptPrj); ptTemp = ptPrj; AcDbLine line1(ptS1,ptTemp),line2(ptTurn2,ptS2); AcGePoint3dArray arCross; line1.intersectWith(&line2,AcDb::kExtendThis,arCross); if (arCross.length() > 0) { ptS2 = arCross[0]; } else { line.getClosestPointTo(ptS2,ptPrj); ptTemp = ptPrj; line1.setStartPoint(ptS2); line1.setEndPoint(ptTemp); line2.setStartPoint(ptS1); line2.setEndPoint(ptTurn1); line1.intersectWith(&line2,AcDb::kExtendThis,arCross); if (arCross.length() > 0) { ptS1 = arCross[0]; } else { ptS1 = ProBase->m_ptTurn; ptS2 = ProLine->m_ptTurn; } } double dTemp1 = line.distanceTo(ptS1); double dTemp2 = line.distanceTo(ptS2); return (line.distanceTo(ptS2) - line.distanceTo(ptS1)) > 1e-3; } BOOL CFoldProTool::HasUnionPro(const XFoldThunder& thunder1,const XFoldThunder& thunder2,double dHx) { BOOL bSuc = FALSE; double dH1 = thunder1.m_dHeight; double dH2 = thunder2.m_dHeight; AcGePoint3d pt1 = thunder1.m_ptPos; AcGePoint3d pt2 = thunder2.m_ptPos; double dBx = 0.0; double dDist = 0.0; dDist = pt1.distanceTo(pt2); dDist *= 1e-3; CFoldToolKit* pToolKit = CFoldToolKit::Instance(); if (pToolKit) { bSuc = pToolKit->CalcFoldBx(dH1,dH2,dDist,dHx,dBx); } return bSuc; } //获取2保护线交点 BOOL CFoldProTool::GetCrossPoint(PFoldProLine ProLine1,PFoldProLine ProLine2,AcGePoint3dArray& arCross) { AcGeLine3d line; AcGePoint3d ptTemp,ptCross; double dParam1 = 0.0,dParam2 = 0.0; if (ProLine1->m_ptTurn == ProLine2->m_ptTurn) { ptCross = ProLine2->m_ptTurn; arCross.append(ptCross); return TRUE; } if (ProLine1->m_LinePart1.m_bValid) { //线1半边1有效 line.set(ProLine1->m_ptTurn,ProLine1->m_LinePart1.m_ptS); AcGeLine3d line1; if (ProLine2->m_LinePart1.m_bValid) { //线2半边1有效 line1.set(ProLine2->m_ptTurn,ProLine2->m_LinePart1.m_ptS); line.intersectWith(line1,ptTemp); if ((line.isOn(ptTemp,dParam1) && (dParam1 > -1e-6 && dParam1 - 1< 1e-6)) && (line1.isOn(ptTemp,dParam2) && (dParam2 > -1e-6 && dParam2 - 1< 1e-6))) { ptCross = ptTemp; arCross.append(ptCross); } } if (ProLine2->m_LinePart2.m_bValid) { //线2半边2有效 line1.set(ProLine2->m_ptTurn,ProLine2->m_LinePart2.m_ptS); line.intersectWith(line1,ptTemp); if ((line.isOn(ptTemp,dParam1) && (dParam1 > -1e-6 && dParam1 - 1< 1e-6)) && (line1.isOn(ptTemp,dParam2) && (dParam2 > -1e-6 && dParam2 - 1< 1e-6))) { ptCross = ptTemp; arCross.append(ptCross); } } } if (ProLine1->m_LinePart2.m_bValid) { //线1半边2有效 line.set(ProLine1->m_ptTurn,ProLine1->m_LinePart2.m_ptS); AcGeLine3d line1; if (ProLine2->m_LinePart1.m_bValid) { //线2半边1有效 line1.set(ProLine2->m_ptTurn,ProLine2->m_LinePart1.m_ptS); line.intersectWith(line1,ptTemp); if ((line.isOn(ptTemp,dParam1) && (dParam1 > -1e-6 && dParam1 - 1< 1e-6)) && (line1.isOn(ptTemp,dParam2) && (dParam2 > -1e-6 && dParam2 - 1< 1e-6))) { ptCross = ptTemp; arCross.append(ptCross); } } if (ProLine2->m_LinePart2.m_bValid) { //线2半边2有效 line1.set(ProLine2->m_ptTurn,ProLine2->m_LinePart2.m_ptS); line.intersectWith(line1,ptTemp); if ((line.isOn(ptTemp,dParam1) && (dParam1 > -1e-6 && dParam1 - 1< 1e-6)) && (line1.isOn(ptTemp,dParam2) && (dParam2 > -1e-6 && dParam2 - 1< 1e-6))) { ptCross = ptTemp; arCross.append(ptCross); } } } return arCross.length() > 0; }