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

432 lines
10 KiB
C++

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