432 lines
10 KiB
C++
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;
|
|
}
|