1546 lines
34 KiB
C++
1546 lines
34 KiB
C++
// PipeStyle6.cpp: implementation of the CPipeStyle6 class.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
#include "stdafx.h"
|
||
|
||
#include "PipeStyle6.h"
|
||
#include "math.h"
|
||
#include "geassign.h"
|
||
#include "PipeTools.h"
|
||
#include "GlobalFunction.h"
|
||
|
||
#ifdef _DEBUG
|
||
#undef THIS_FILE
|
||
static char THIS_FILE[]=__FILE__;
|
||
#define new DEBUG_NEW
|
||
#endif
|
||
|
||
#define _PI 3.14159265358979323846
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Construction/Destruction
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
extern double TransAngTo2PI(double dbAng);
|
||
extern double GetArcRadius(double dbInput);
|
||
|
||
|
||
CPipeStyle6::CPipeStyle6()
|
||
{
|
||
m_rectStartPt[X] = 0;
|
||
m_rectStartPt[Y] = 0;
|
||
m_rectStartPt[Z] = 0;
|
||
m_rectEndPt[X] = 0;
|
||
m_rectEndPt[Y] = 0;
|
||
m_rectEndPt[Z] = 0;
|
||
m_nDist = 0;
|
||
m_dbPGAng = 0.0;
|
||
m_nEntryType = 0;
|
||
|
||
m_pCenLine = NULL;
|
||
m_pOutLine = NULL;
|
||
m_dbCenDist = 0.0; // 中心线间距
|
||
m_dbArcRadius = 0.0; // 圆弧半径
|
||
m_nNum = 0; // 一边的盘管数(n)
|
||
m_dbDiagAng = 0.0; // 对角线与矩形夹角的锐角
|
||
m_dbDiagDist = 0.0; // 对角线长度
|
||
m_dbShortDist = 0.0; // 矩形短边长度
|
||
m_dbLongDist = 0.0; // 矩形长边长度
|
||
m_dbAssisAng = 0.0;
|
||
m_dbNormAng = 0.0;
|
||
m_nColorInd = 4;
|
||
}
|
||
|
||
CPipeStyle6::CPipeStyle6(XPoint rectStartPt, XPoint rectEndPt, int nDist
|
||
, double dbPGAng, int nEntryType, const int &nColorIndex)
|
||
{
|
||
ads_point_set(rectStartPt, m_rectStartPt);
|
||
ads_point_set(rectEndPt, m_rectEndPt);
|
||
m_nDist = nDist;
|
||
m_dbPGAng = dbPGAng;
|
||
m_nEntryType = nEntryType;
|
||
|
||
m_pCenLine = NULL;
|
||
m_pOutLine = NULL;
|
||
m_dbCenDist = 0.0; // 中心线间距
|
||
m_dbArcRadius = 0.0; // 圆弧半径
|
||
m_nNum = 0; // 一边的盘管数(n)
|
||
m_dbDiagAng = 0.0; // 对角线与矩形夹角的锐角
|
||
m_dbDiagDist = 0.0; // 对角线长度
|
||
m_dbShortDist = 0.0; // 矩形短边长度
|
||
m_dbLongDist = 0.0; // 矩形长边长度
|
||
m_dbAssisAng = 0.0;
|
||
m_dbNormAng = 0.0;
|
||
m_nColorInd = nColorIndex;
|
||
}
|
||
|
||
CPipeStyle6::~CPipeStyle6()
|
||
{
|
||
int i=0; // sg modify
|
||
for(i=0; i < m_LineArr1.GetSize(); i++)
|
||
{
|
||
if(m_LineArr1[i] != NULL)
|
||
{
|
||
delete m_LineArr1[i];
|
||
}
|
||
}
|
||
m_LineArr1.RemoveAll();
|
||
for( i=0; i < m_LineArr2.GetSize(); i++)
|
||
{
|
||
if(m_LineArr2[i] != NULL)
|
||
{
|
||
delete m_LineArr2[i];
|
||
}
|
||
}
|
||
m_LineArr2.RemoveAll();
|
||
for( i=0; i < m_LineArr3.GetSize(); i++)
|
||
{
|
||
if(m_LineArr3[i] != NULL)
|
||
{
|
||
delete m_LineArr3[i];
|
||
}
|
||
}
|
||
m_LineArr3.RemoveAll();
|
||
for( i=0; i < m_LineArr4.GetSize(); i++)
|
||
{
|
||
if(m_LineArr4[i] != NULL)
|
||
{
|
||
delete m_LineArr4[i];
|
||
}
|
||
}
|
||
m_LineArr4.RemoveAll();
|
||
m_ArcArr.RemoveAll();
|
||
if(m_pCenLine != NULL)
|
||
delete m_pCenLine;
|
||
if(m_pOutLine != NULL)
|
||
delete m_pOutLine;
|
||
}
|
||
|
||
void CPipeStyle6::SetStartPt(ads_point rectStartPt)
|
||
{
|
||
ads_point_set(rectStartPt, m_rectStartPt);
|
||
}
|
||
|
||
void CPipeStyle6::SetDist(int nDist)
|
||
{
|
||
m_nDist = nDist;
|
||
}
|
||
|
||
void CPipeStyle6::SetPGAng(double dbPGAng)
|
||
{
|
||
m_dbPGAng = dbPGAng;
|
||
}
|
||
|
||
void CPipeStyle6::SetEntryType(int nEntryType)
|
||
{
|
||
m_nEntryType = nEntryType;
|
||
}
|
||
|
||
bool CPipeStyle6::DrawPGLine(XExplodeDraw &dc)
|
||
{
|
||
if(abs(m_nDist) <= 0)
|
||
{
|
||
acutPrintf(_T("\n间距错误"));
|
||
return false;
|
||
}
|
||
if(m_nEntryType < 1 || m_nEntryType > 8)
|
||
{
|
||
acutPrintf(_T("\n入口类型错误"));
|
||
return false;
|
||
}
|
||
|
||
GetCenterPt(); // 得到中心点
|
||
GetDiagAng(); // 得到对角线锐角
|
||
GetLengthofSide(); // 得到长短边
|
||
GetVirtaulRect(); // 得到虚拟矩形
|
||
NormalizeRect(); // 把虚拟矩形放倒
|
||
m_dbArcRadius = GetArcRadius(m_nDist); // 得到圆弧半径
|
||
|
||
int nNum = (int)(m_dbShortDist / m_nDist);
|
||
if(nNum < 5 && nNum >= 4)
|
||
{// 如果是一圈
|
||
m_nNum = 1;
|
||
}
|
||
else
|
||
{
|
||
m_nNum = int((nNum-1) / 2);
|
||
}
|
||
if(!DrawMulti())
|
||
{
|
||
return false;
|
||
}
|
||
|
||
int i=0; // sg modify
|
||
for(i=0; i < m_LineArr1.GetSize(); i++)
|
||
{
|
||
m_LineArr1[i]->DrawTheLine(dc, m_nColorInd);
|
||
}
|
||
for( i=0; i < m_LineArr2.GetSize(); i++)
|
||
{
|
||
m_LineArr2[i]->DrawTheLine(dc, m_nColorInd);
|
||
}
|
||
for( i=0; i < m_LineArr3.GetSize(); i++)
|
||
{
|
||
m_LineArr3[i]->DrawTheLine(dc, m_nColorInd);
|
||
}
|
||
for( i=0; i < m_LineArr4.GetSize(); i++)
|
||
{
|
||
m_LineArr4[i]->DrawTheLine(dc, m_nColorInd);
|
||
}
|
||
if(m_pCenLine != NULL)
|
||
{
|
||
m_pCenLine->DrawTheLine(dc, m_nColorInd);
|
||
}
|
||
if(m_pOutLine != NULL)
|
||
{
|
||
m_pOutLine->DrawTheLine(dc, m_nColorInd);
|
||
}
|
||
if(!CreateArcArr(dc))
|
||
{
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
// 将矩形转换为躺倒的矩形
|
||
void CPipeStyle6::NormalizeRect()
|
||
{
|
||
double dbDist12 = acutDistance(m_ptLB, m_ptLT); // 1、2点间距离
|
||
double dbDist14 = acutDistance(m_ptLB, m_ptRB); // 1、4点间距离
|
||
if(dbDist12 <= dbDist14)
|
||
{// 已经是躺倒的
|
||
return ;
|
||
}
|
||
m_dbDiagAng = 0.5*_PI - m_dbDiagAng;
|
||
GetVirtaulRect();
|
||
m_nEntryType += 2;
|
||
if(m_nEntryType == 9)
|
||
{
|
||
m_nEntryType = 1;
|
||
}
|
||
else if(m_nEntryType == 10)
|
||
{
|
||
m_nEntryType = 2;
|
||
}
|
||
m_dbNormAng = 0.5*_PI;
|
||
}
|
||
|
||
// 矩形的中心点
|
||
void CPipeStyle6::GetCenterPt()
|
||
{
|
||
m_CenterPt[X] = (m_rectStartPt[X]+m_rectEndPt[X])/2;
|
||
m_CenterPt[Y] = (m_rectStartPt[Y]+m_rectEndPt[Y])/2;
|
||
m_CenterPt[Z] = (m_rectStartPt[Z]+m_rectEndPt[Z])/2;
|
||
|
||
}
|
||
|
||
// 得到对角线的锐角
|
||
void CPipeStyle6::GetDiagAng()
|
||
{
|
||
m_dbDiagAng = acutAngle(m_rectStartPt, m_CenterPt) - m_dbPGAng;
|
||
m_dbDiagAng = TransAngTo2PI(m_dbDiagAng);
|
||
if(m_dbDiagAng >= 0.5*_PI && m_dbDiagAng <_PI)
|
||
{
|
||
m_dbDiagAng = _PI - m_dbDiagAng;
|
||
}
|
||
else if(m_dbDiagAng >= _PI && m_dbDiagAng < 1.5*_PI)
|
||
{
|
||
m_dbDiagAng = m_dbDiagAng - _PI;
|
||
}
|
||
else if(m_dbDiagAng >=1.5*_PI && m_dbDiagAng < 2*_PI)
|
||
{
|
||
m_dbDiagAng = 2*_PI - m_dbDiagAng;
|
||
}
|
||
|
||
}
|
||
|
||
// 得到矩形边长
|
||
void CPipeStyle6::GetLengthofSide()
|
||
{
|
||
m_dbDiagDist = acutDistance(m_rectStartPt, m_rectEndPt);
|
||
double dbDist12 = fabs(m_dbDiagDist*sin(m_dbDiagAng)); // 1、2点间距离
|
||
double dbDist14 = fabs(m_dbDiagDist*cos(m_dbDiagAng)); // 1、4点间距离
|
||
|
||
m_dbShortDist = (dbDist12 < dbDist14)? dbDist12 : dbDist14;
|
||
m_dbLongDist = (dbDist12 > dbDist14)? dbDist12 : dbDist14;
|
||
}
|
||
|
||
XPoint CPipeStyle6::GetEntryPt(int nNum)
|
||
{
|
||
GetCenterPt(); // 得到中心点
|
||
GetDiagAng(); // 得到对角线锐角
|
||
GetLengthofSide(); // 得到长短边
|
||
GetVirtaulRect(); // 得到虚拟矩形
|
||
NormalizeRect(); // 把虚拟矩形放倒
|
||
|
||
/**
|
||
XPoint ptLB, ptLT, ptRT, ptRB;
|
||
ads_polar(m_CenterPt, _PI+m_dbDiagAng+m_dbPGAng, m_dbDiagDist/2, ptLB);
|
||
ads_polar(m_CenterPt, _PI-m_dbDiagAng+m_dbPGAng, m_dbDiagDist/2, ptLT);
|
||
ads_polar(m_CenterPt, m_dbDiagAng+m_dbPGAng, m_dbDiagDist/2, ptRT);
|
||
ads_polar(m_CenterPt, -m_dbDiagAng+m_dbPGAng, m_dbDiagDist/2, ptRB);
|
||
//*/
|
||
if(m_dbNormAng > 0.1) //add //==PI/2
|
||
{
|
||
nNum += 2;
|
||
if(nNum == 9)
|
||
{
|
||
nNum = 1;
|
||
}
|
||
else if(nNum == 10)
|
||
{
|
||
nNum = 2;
|
||
}
|
||
}
|
||
ads_point StartPtIn; // 入口起点
|
||
switch(nNum) // 判断入口
|
||
{
|
||
case 1:
|
||
acutPolar(m_ptLB, 0, m_nDist, StartPtIn);
|
||
break;
|
||
case 2:
|
||
acutPolar(m_ptLB, 0.5*_PI, m_nDist, StartPtIn);
|
||
break;
|
||
case 3:
|
||
acutPolar(m_ptLT, 1.5*_PI, m_nDist, StartPtIn);
|
||
break;
|
||
case 4:
|
||
acutPolar(m_ptLT, 0, m_nDist, StartPtIn);
|
||
break;
|
||
case 5:
|
||
acutPolar(m_ptRT, _PI, m_nDist, StartPtIn);
|
||
break;
|
||
case 6:
|
||
acutPolar(m_ptRT, 1.5*_PI, m_nDist, StartPtIn);
|
||
break;
|
||
case 7:
|
||
acutPolar(m_ptRB, 0.5*_PI, m_nDist, StartPtIn);
|
||
break;
|
||
case 8:
|
||
acutPolar(m_ptRB, _PI, m_nDist, StartPtIn);
|
||
break;
|
||
default:
|
||
return XPoint();
|
||
}
|
||
XPoint ptRet = StartPtIn;
|
||
TransToActualPt(StartPtIn, ptRet); //add
|
||
return ptRet;
|
||
}
|
||
|
||
|
||
bool CPipeStyle6::DrawMulti()
|
||
{
|
||
if(m_nNum == 1)
|
||
{
|
||
m_dbCenDist = (m_dbShortDist - 2*m_nDist) / 2;
|
||
}
|
||
else if(IsEvenNum())
|
||
{
|
||
m_dbCenDist = (m_dbShortDist - 2*m_nNum*m_nDist) / 2;
|
||
}
|
||
else
|
||
{
|
||
m_dbCenDist = (m_dbShortDist - (2*m_nNum-1)*m_nDist) / 2;
|
||
}
|
||
|
||
double dbWidth;
|
||
if(IsEvenNum())
|
||
{
|
||
if(m_nEntryType == 1 || m_nEntryType == 4 || m_nEntryType == 5 || m_nEntryType == 8)
|
||
{
|
||
dbWidth = m_dbLongDist - ((2*m_nNum+2)*m_nDist + m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbWidth = m_dbLongDist - ((2*m_nNum+1)*m_nDist + m_dbArcRadius);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(m_nEntryType == 1 || m_nEntryType == 4 || m_nEntryType == 5 || m_nEntryType == 8)
|
||
{
|
||
dbWidth = m_dbLongDist - ((2*m_nNum+1)*m_nDist + m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbWidth = m_dbLongDist - (2*m_nNum*m_nDist + m_dbArcRadius);
|
||
}
|
||
}
|
||
if(fabs(dbWidth) < 0)
|
||
{
|
||
// acutPrintf(_T("\n指定的绘制范围太小,宽 %.2f 时,长度应至少为%.2f"), m_dbShortDist, m_dbLongDist-dbWidth);
|
||
return false;
|
||
}
|
||
|
||
CreateLeftLineArr(m_nNum);
|
||
CreateTopLineArr();
|
||
CreateRightLineArr();
|
||
CreateBottomLineArr();
|
||
CreateCenterLine();
|
||
CreateOutLine();
|
||
|
||
return true;
|
||
}
|
||
|
||
// 将虚拟点转换到真实坐标
|
||
void CPipeStyle6::TransToActualPt(ads_point point, ads_point retPt)
|
||
{
|
||
double dbDist = acutDistance(m_CenterPt, point);
|
||
double ang = acutAngle(m_CenterPt, point);
|
||
acutPolar(m_CenterPt, m_dbPGAng+ang+m_dbNormAng, dbDist, retPt);
|
||
}
|
||
|
||
// 将真实坐标转换到虚拟点
|
||
void CPipeStyle6::TransToVirtualPt(ads_point point, ads_point retPt)
|
||
{
|
||
double dbDist = acutDistance(m_CenterPt, point);
|
||
double ang = acutAngle(m_CenterPt, point);
|
||
acutPolar(m_CenterPt, ang-m_dbPGAng-m_dbNormAng, dbDist, retPt);
|
||
}
|
||
|
||
// 虚拟矩形的四个顶点
|
||
void CPipeStyle6::GetVirtaulRect()
|
||
{
|
||
acutPolar(m_CenterPt, _PI+m_dbDiagAng, m_dbDiagDist/2, m_ptLB);
|
||
acutPolar(m_CenterPt, _PI-m_dbDiagAng, m_dbDiagDist/2, m_ptLT);
|
||
acutPolar(m_CenterPt, m_dbDiagAng, m_dbDiagDist/2, m_ptRT);
|
||
acutPolar(m_CenterPt, -m_dbDiagAng, m_dbDiagDist/2, m_ptRB);
|
||
}
|
||
|
||
void CPipeStyle6::CreateLeftLineArr(int nNum)
|
||
{
|
||
ads_point StartPtIn; // 输入线起点
|
||
double dbLen; // 线长度
|
||
switch(m_nEntryType) // 判断入口
|
||
{
|
||
case 1:
|
||
dbLen = m_dbShortDist - m_nDist - m_dbArcRadius;
|
||
m_dbAssisAng = 0.0;
|
||
acutPolar(m_ptLB, 0, m_nDist, StartPtIn);
|
||
break;
|
||
case 2:
|
||
dbLen = m_dbLongDist - m_nDist - m_dbArcRadius;
|
||
m_dbAssisAng = 0.5*_PI;
|
||
acutPolar(m_ptLB, 0.5*_PI, m_nDist, StartPtIn);
|
||
break;
|
||
case 3:
|
||
dbLen = m_dbLongDist - m_nDist - m_dbArcRadius;
|
||
m_dbAssisAng = 1.5*_PI;
|
||
acutPolar(m_ptLT, 1.5*_PI, m_nDist, StartPtIn);
|
||
break;
|
||
case 4:
|
||
dbLen = m_dbShortDist - m_nDist - m_dbArcRadius;
|
||
m_dbAssisAng = 0;
|
||
acutPolar(m_ptLT, 0, m_nDist, StartPtIn);
|
||
break;
|
||
case 5:
|
||
dbLen = m_dbShortDist - m_nDist - m_dbArcRadius;
|
||
m_dbAssisAng = _PI;
|
||
acutPolar(m_ptRT, _PI, m_nDist, StartPtIn);
|
||
break;
|
||
case 6:
|
||
dbLen = m_dbLongDist - m_nDist - m_dbArcRadius;
|
||
m_dbAssisAng = 1.5*_PI;
|
||
acutPolar(m_ptRT, 1.5*_PI, m_nDist, StartPtIn);
|
||
break;
|
||
case 7:
|
||
dbLen = m_dbLongDist - m_nDist - m_dbArcRadius;
|
||
m_dbAssisAng = 0.5*_PI;
|
||
acutPolar(m_ptRB, 0.5*_PI, m_nDist, StartPtIn);
|
||
break;
|
||
case 8:
|
||
dbLen = m_dbShortDist - m_nDist - m_dbArcRadius;
|
||
m_dbAssisAng = _PI;
|
||
acutPolar(m_ptRB, _PI, m_nDist, StartPtIn);
|
||
break;
|
||
default:
|
||
return ;
|
||
}
|
||
|
||
// 第一根线
|
||
ads_point actPt; // 实际点
|
||
TransToActualPt(StartPtIn, actPt);
|
||
CPipeLine *line1 = NULL;
|
||
if(m_nEntryType == 1 || m_nEntryType == 3 || m_nEntryType == 5 || m_nEntryType == 7)
|
||
{
|
||
line1 = new CPipeLine(actPt, m_dbPGAng, dbLen, 0.5*_PI+m_dbAssisAng, m_dbNormAng);
|
||
}
|
||
else
|
||
{
|
||
line1 = new CPipeLine(actPt, m_dbPGAng, dbLen, m_dbAssisAng-0.5*_PI, m_dbNormAng);
|
||
}
|
||
m_LineArr1.Add(line1);
|
||
|
||
if((m_nEntryType == 1 || m_nEntryType == 4 || m_nEntryType == 5 || m_nEntryType == 8)
|
||
&& IsEvenNum())
|
||
{
|
||
nNum++;
|
||
}
|
||
// 其余的
|
||
for(int i=1; i < nNum; i++)
|
||
{
|
||
ads_point lastPt; // 前一直线的起点
|
||
ads_point virPt; // 虚拟点
|
||
m_LineArr1[i-1]->GetStartPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
ads_point pt;
|
||
|
||
CPipeLine *line = NULL;
|
||
acutPolar(virPt, m_dbAssisAng, m_nDist, pt);
|
||
switch(m_nEntryType)
|
||
{
|
||
case 1:
|
||
case 3:
|
||
case 5:
|
||
case 7:
|
||
{
|
||
if(i == nNum-1 && (m_nEntryType == 1 || m_nEntryType == 5))
|
||
{// 最后一条
|
||
if(i == 1)
|
||
{// 第2条
|
||
if(IsEvenNum())
|
||
{// 是偶数
|
||
dbLen = m_dbCenDist - 2*m_dbArcRadius;
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - (2*m_nDist+m_dbArcRadius);
|
||
}
|
||
acutPolar(pt, m_dbAssisAng+0.5*_PI, m_nDist+m_dbArcRadius, pt);
|
||
}
|
||
else
|
||
{
|
||
if(IsEvenNum())
|
||
{
|
||
dbLen = m_dbCenDist - 2*m_dbArcRadius;
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
acutPolar(pt, m_dbAssisAng+0.5*_PI, m_nDist, pt);
|
||
}
|
||
}
|
||
else if(i == 1)
|
||
{// 第2条
|
||
dbLen = dbLen - (2*m_nDist + m_dbArcRadius);
|
||
acutPolar(pt, m_dbAssisAng+0.5*_PI, m_nDist+m_dbArcRadius, pt);
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
acutPolar(pt, m_dbAssisAng+0.5*_PI, m_nDist, pt);
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
line = new CPipeLine(actPt, m_dbPGAng, dbLen, 0.5*_PI+m_dbAssisAng, m_dbNormAng);
|
||
}
|
||
break;
|
||
case 2:
|
||
case 4:
|
||
case 6:
|
||
case 8:
|
||
{
|
||
if(i == nNum-1)
|
||
{// 最后一条
|
||
if(i == 1)
|
||
{// 第2条
|
||
if(IsEvenNum())
|
||
{// 是偶数
|
||
dbLen = m_dbLongDist - (3*m_nDist + 2*m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - (2*m_nDist+m_dbArcRadius);
|
||
}
|
||
acutPolar(pt, m_dbAssisAng-0.5*_PI, m_nDist+m_dbArcRadius, pt);
|
||
}
|
||
else
|
||
{
|
||
if((m_nEntryType == 4 || m_nEntryType == 8) && IsEvenNum())
|
||
{
|
||
dbLen = m_dbCenDist - 2*m_dbArcRadius;
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
acutPolar(pt, m_dbAssisAng-0.5*_PI, m_nDist, pt);
|
||
}
|
||
}
|
||
else if(i == 1)
|
||
{// 第2条
|
||
dbLen = dbLen - (2*m_nDist + m_dbArcRadius);
|
||
acutPolar(pt, m_dbAssisAng-0.5*_PI, m_nDist+m_dbArcRadius, pt);
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
acutPolar(pt, m_dbAssisAng-0.5*_PI, m_nDist, pt);
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
line = new CPipeLine(actPt, m_dbPGAng, dbLen, m_dbAssisAng-0.5*_PI, m_dbNormAng);
|
||
}
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
|
||
m_LineArr1.Add(line);
|
||
}
|
||
|
||
}
|
||
|
||
void CPipeStyle6::CreateTopLineArr()
|
||
{
|
||
double dbLen = 0; // 直线长
|
||
int size = (int)m_LineArr1.GetSize();
|
||
if((m_nEntryType == 1 || m_nEntryType == 4 || m_nEntryType == 5 || m_nEntryType == 8)
|
||
&& IsEvenNum())
|
||
{// 比数组1中的直线少1
|
||
size--;
|
||
}
|
||
for(int i=0; i < size; i++)
|
||
{
|
||
ads_point lastPt; // 前一组直线的终点
|
||
ads_point virPt; // 虚拟点
|
||
ads_point actPt; // 实际点
|
||
CPipeLine *line = NULL;
|
||
m_LineArr1[i]->GetEndPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
ads_point pt;
|
||
switch(m_nEntryType)
|
||
{
|
||
case 1:
|
||
case 3:
|
||
case 5:
|
||
case 7:
|
||
{
|
||
if(i == size-1)
|
||
{// 最后一根
|
||
if(m_nNum == 1)
|
||
{// 只有一圈
|
||
if(m_nEntryType == 1|| m_nEntryType == 5)
|
||
{
|
||
dbLen = m_dbLongDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbShortDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
switch(m_nEntryType)
|
||
{
|
||
case 1:
|
||
case 5:
|
||
dbLen = dbLen - 2*m_nDist;
|
||
break;
|
||
case 3:
|
||
case 7:
|
||
if(IsEvenNum())
|
||
{// 偶数
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbCenDist - 2*m_dbArcRadius;
|
||
}
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
else if(i == 0)
|
||
{// 第一根线
|
||
if(m_nEntryType == 1 || m_nEntryType == 5)
|
||
{
|
||
dbLen = m_dbLongDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbShortDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
acutPolar(virPt, m_dbAssisAng, m_dbArcRadius, pt);
|
||
acutPolar(pt, m_dbAssisAng+0.5*_PI, m_dbArcRadius, pt);
|
||
TransToActualPt(pt, actPt);
|
||
line = new CPipeLine(actPt, m_dbPGAng, dbLen, 0+m_dbAssisAng, m_dbNormAng);
|
||
}
|
||
break;
|
||
case 2:
|
||
case 4:
|
||
case 6:
|
||
case 8:
|
||
{
|
||
if(i == size-1)
|
||
{// 最后一根
|
||
if(m_nNum == 1)
|
||
{// 只有一圈
|
||
if(m_nEntryType == 4 || m_nEntryType == 8)
|
||
{
|
||
dbLen = m_dbLongDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbShortDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
switch(m_nEntryType)
|
||
{
|
||
case 4:
|
||
case 8:
|
||
dbLen = dbLen - 2*m_nDist;
|
||
break;
|
||
case 2:
|
||
case 6:
|
||
if(IsEvenNum())
|
||
{// 偶数
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbCenDist - 2*m_dbArcRadius;
|
||
}
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
else if(i == 0)
|
||
{// 第一根线
|
||
if(m_nEntryType == 4 || m_nEntryType == 8)
|
||
{
|
||
dbLen = m_dbLongDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbShortDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
acutPolar(virPt, m_dbAssisAng, m_dbArcRadius, pt);
|
||
acutPolar(pt, m_dbAssisAng-0.5*_PI, m_dbArcRadius, pt);
|
||
TransToActualPt(pt, actPt);
|
||
line = new CPipeLine(actPt, m_dbPGAng, dbLen, 0+m_dbAssisAng, m_dbNormAng);
|
||
}
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
m_LineArr2.Add(line);
|
||
}
|
||
}
|
||
|
||
void CPipeStyle6::CreateRightLineArr()
|
||
{
|
||
double dbLen = 0; // 直线长
|
||
int size = (int)m_LineArr2.GetSize();
|
||
if((m_nEntryType == 2 || m_nEntryType == 3 || m_nEntryType == 6 || m_nEntryType == 7)
|
||
&& !IsEvenNum())
|
||
{// 比数组2中的直线数量少1
|
||
size--;
|
||
}
|
||
|
||
for(int i=0; i < size; i++)
|
||
{
|
||
ads_point lastPt, virPt, actPt; // 前一组直线的终点,虚拟点,实际点
|
||
CPipeLine *line = NULL;
|
||
m_LineArr2[i]->GetEndPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
ads_point pt;
|
||
switch(m_nEntryType)
|
||
{
|
||
case 1:
|
||
case 3:
|
||
case 5:
|
||
case 7:
|
||
{
|
||
if(i == size-1)
|
||
{// 最后一根
|
||
if(m_nNum == 1)
|
||
{// 只有一圈
|
||
if(m_nEntryType == 1|| m_nEntryType == 5)
|
||
{
|
||
dbLen = m_dbShortDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbLongDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
switch(m_nEntryType)
|
||
{
|
||
case 1:
|
||
case 5:
|
||
if(IsEvenNum())
|
||
{// 偶数
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbCenDist - 2*m_dbArcRadius;
|
||
}
|
||
break;
|
||
case 3:
|
||
case 7:
|
||
if(m_nNum == 2)
|
||
{// 只有2圈
|
||
dbLen = m_dbLongDist - (4*m_nDist+2*m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
else if(i == 0)
|
||
{// 第一根线
|
||
if(m_nEntryType == 1 || m_nEntryType == 5)
|
||
{
|
||
dbLen = m_dbShortDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbLongDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
acutPolar(virPt, m_dbAssisAng-0.5*_PI, m_dbArcRadius, pt);
|
||
acutPolar(pt, m_dbAssisAng, m_dbArcRadius, pt);
|
||
TransToActualPt(pt, actPt);
|
||
line = new CPipeLine(actPt, m_dbPGAng, dbLen, m_dbAssisAng-0.5*_PI, m_dbNormAng);
|
||
}
|
||
break;
|
||
case 2:
|
||
case 4:
|
||
case 6:
|
||
case 8:
|
||
{
|
||
if(i == size-1)
|
||
{// 最后一根
|
||
if(m_nNum == 1)
|
||
{// 只有一圈
|
||
if(m_nEntryType == 4 || m_nEntryType == 8)
|
||
{
|
||
dbLen = m_dbShortDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbLongDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
switch(m_nEntryType)
|
||
{
|
||
case 4:
|
||
case 8:
|
||
if(IsEvenNum())
|
||
{// 偶数
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbCenDist - 2*m_dbArcRadius;
|
||
}
|
||
break;
|
||
case 2:
|
||
case 6:
|
||
if(m_nNum == 2)
|
||
{// 只有2圈
|
||
dbLen = m_dbLongDist - (4*m_nDist+2*m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
else if(i == 0)
|
||
{// 第一根线
|
||
if(m_nEntryType == 4 || m_nEntryType == 8)
|
||
{
|
||
dbLen = m_dbShortDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbLongDist - 2*(m_nDist+m_dbArcRadius);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
acutPolar(virPt, m_dbAssisAng+0.5*_PI, m_dbArcRadius, pt);
|
||
acutPolar(pt, m_dbAssisAng, m_dbArcRadius, pt);
|
||
TransToActualPt(pt, actPt);
|
||
line = new CPipeLine(actPt, m_dbPGAng, dbLen, m_dbAssisAng+0.5*_PI, m_dbNormAng);
|
||
}
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
m_LineArr3.Add(line);
|
||
}
|
||
}
|
||
|
||
void CPipeStyle6::CreateBottomLineArr()
|
||
{
|
||
double dbLen = 0; // 直线长
|
||
int size = (int)m_LineArr3.GetSize();
|
||
if((m_nEntryType == 1 || m_nEntryType == 4 || m_nEntryType == 5 || m_nEntryType == 8)
|
||
&& m_nNum != 1 && !IsEvenNum())
|
||
{// 比数组3中的直线数量少1
|
||
size--;
|
||
}
|
||
for(int i=0; i < size; i++)
|
||
{
|
||
ads_point lastPt, virPt, actPt; // 前一组直线的终点,虚拟点,实际点
|
||
CPipeLine *line = NULL;
|
||
m_LineArr3[i]->GetEndPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
ads_point pt;
|
||
switch(m_nEntryType)
|
||
{
|
||
case 1:
|
||
case 3:
|
||
case 5:
|
||
case 7:
|
||
{
|
||
if(i == size-1)
|
||
{// 最后一根
|
||
if(m_nNum == 1)
|
||
{// 只有一圈
|
||
if(m_nEntryType == 1 || m_nEntryType == 5)
|
||
{
|
||
dbLen = m_dbLongDist - (3*m_nDist+2*m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbCenDist - 2*m_dbArcRadius;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
switch(m_nEntryType)
|
||
{
|
||
case 1:
|
||
case 5:
|
||
if(m_nNum == 2)
|
||
{// 只有2圈
|
||
dbLen = m_dbLongDist - (5*m_nDist+2*m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
break;
|
||
case 3:
|
||
case 7:
|
||
if(IsEvenNum())
|
||
{// 偶数
|
||
dbLen = m_dbCenDist - 2*m_dbArcRadius;
|
||
}
|
||
else
|
||
{
|
||
if(m_nNum == 2)
|
||
{// 只有2圈
|
||
dbLen = m_dbShortDist - (3*m_nDist+2*m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
else if(i == 0)
|
||
{// 第一根线
|
||
if(m_nEntryType == 1 || m_nEntryType == 5)
|
||
{
|
||
dbLen = m_dbLongDist - (3*m_nDist+2*m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbShortDist - (3*m_nDist+2*m_dbArcRadius);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
acutPolar(virPt, m_dbAssisAng-_PI, m_dbArcRadius, pt);
|
||
acutPolar(pt, m_dbAssisAng-0.5*_PI, m_dbArcRadius, pt);
|
||
TransToActualPt(pt, actPt);
|
||
line = new CPipeLine(actPt, m_dbPGAng, dbLen, m_dbAssisAng-_PI, m_dbNormAng);
|
||
}
|
||
break;
|
||
case 2:
|
||
case 4:
|
||
case 6:
|
||
case 8:
|
||
{
|
||
if(i == size-1)
|
||
{// 最后一根
|
||
if(m_nNum == 1)
|
||
{// 只有一圈
|
||
if(m_nEntryType == 4 || m_nEntryType == 8)
|
||
{
|
||
dbLen = m_dbLongDist - (3*m_nDist+2*m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbCenDist - 2*m_dbArcRadius;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
switch(m_nEntryType)
|
||
{
|
||
case 4:
|
||
case 8:
|
||
if(m_nNum == 2)
|
||
{// 只有2圈
|
||
dbLen = m_dbLongDist - (5*m_nDist+2*m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
break;
|
||
case 2:
|
||
case 6:
|
||
if(IsEvenNum())
|
||
{// 偶数
|
||
dbLen = m_dbCenDist - 2*m_dbArcRadius;
|
||
}
|
||
else
|
||
{
|
||
if(m_nNum == 2)
|
||
{// 只有2圈
|
||
dbLen = m_dbShortDist - (3*m_nDist+2*m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
else if(i == 0)
|
||
{// 第一根线
|
||
if(m_nEntryType == 4 || m_nEntryType == 8)
|
||
{
|
||
dbLen = m_dbLongDist - (3*m_nDist+2*m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbShortDist - (3*m_nDist+2*m_dbArcRadius);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
dbLen = dbLen - 2*m_nDist;
|
||
}
|
||
acutPolar(virPt, m_dbAssisAng-_PI, m_dbArcRadius, pt);
|
||
acutPolar(pt, m_dbAssisAng+0.5*_PI, m_dbArcRadius, pt);
|
||
TransToActualPt(pt, actPt);
|
||
line = new CPipeLine(actPt, m_dbPGAng, dbLen, m_dbAssisAng-_PI, m_dbNormAng);
|
||
}
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
m_LineArr4.Add(line);
|
||
}
|
||
}
|
||
|
||
void CPipeStyle6::CreateCenterLine()
|
||
{
|
||
double dbLen = 0; // 直线长
|
||
ads_point lastPt, virPt, actPt; // 前一组直线的终点,虚拟点,实际点
|
||
ads_point pt;
|
||
double dbAng = 0.0; // 辅助角度(1、2取0,3、4取_PI)
|
||
|
||
switch(m_nEntryType)
|
||
{
|
||
case 1:
|
||
case 4:
|
||
case 5:
|
||
case 8:
|
||
{
|
||
if(IsEvenNum())
|
||
{// 偶数
|
||
int size = (int)m_LineArr1.GetSize();
|
||
m_LineArr1[size-1]->GetEndPt(lastPt); // 取1边的最后一条线
|
||
dbAng = 0.0;
|
||
}
|
||
else
|
||
{
|
||
int size = (int)m_LineArr3.GetSize(); // 取3边的最后一条线
|
||
m_LineArr3[size-1]->GetEndPt(lastPt);
|
||
dbAng = _PI;
|
||
}
|
||
TransToVirtualPt(lastPt, virPt);
|
||
|
||
acutPolar(virPt, m_dbAssisAng+dbAng, m_dbArcRadius, pt);
|
||
if(m_nEntryType == 1 || m_nEntryType == 5)
|
||
{
|
||
if(IsEvenNum())
|
||
{// 偶数
|
||
dbLen = m_dbLongDist - (2*m_nNum*m_nDist + 2*m_nDist + m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbLongDist - ((2*m_nNum-1)*m_nDist + 2*m_nDist + m_dbArcRadius);
|
||
}
|
||
acutPolar(pt, m_dbAssisAng+0.5*_PI+dbAng, m_dbArcRadius, pt);
|
||
}
|
||
else
|
||
{
|
||
if(IsEvenNum())
|
||
{// 偶数
|
||
dbLen = m_dbLongDist - (2*m_nNum*m_nDist + 2*m_nDist + m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbLongDist - ((2*m_nNum-1)*m_nDist + 2*m_nDist + m_dbArcRadius);
|
||
}
|
||
acutPolar(pt, m_dbAssisAng-0.5*_PI+dbAng, m_dbArcRadius, pt);
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
if(m_nEntryType == 1 || m_nEntryType == 4)
|
||
{
|
||
m_pCenLine = new CPipeLine(actPt, m_dbPGAng, dbLen, 0, m_dbNormAng+dbAng);
|
||
}
|
||
else
|
||
{
|
||
m_pCenLine = new CPipeLine(actPt, m_dbPGAng, dbLen, _PI, m_dbNormAng+dbAng);
|
||
}
|
||
}
|
||
break;
|
||
case 2:
|
||
case 3:
|
||
case 6:
|
||
case 7:
|
||
{
|
||
if(IsEvenNum())
|
||
{// 偶数
|
||
int size = (int)m_LineArr4.GetSize();
|
||
m_LineArr4[size-1]->GetEndPt(lastPt); // 取4边的最后一条线
|
||
dbAng = _PI;
|
||
}
|
||
else
|
||
{
|
||
int size = (int)m_LineArr2.GetSize();
|
||
m_LineArr2[size-1]->GetEndPt(lastPt); // 取2边的最后一条线
|
||
dbAng = 0.0;
|
||
}
|
||
TransToVirtualPt(lastPt, virPt);
|
||
|
||
acutPolar(virPt, m_dbAssisAng+dbAng, m_dbArcRadius, pt);
|
||
if(m_nEntryType == 2 || m_nEntryType == 6)
|
||
{
|
||
if(IsEvenNum())
|
||
{// 偶数
|
||
dbLen = m_dbLongDist - ((2*m_nNum-1)*m_nDist + 2*m_nDist + m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbLongDist - (2*(m_nNum-1)*m_nDist + 2*m_nDist + m_dbArcRadius);
|
||
}
|
||
acutPolar(pt, m_dbAssisAng+0.5*_PI+dbAng, m_dbArcRadius, pt);
|
||
}
|
||
else
|
||
{
|
||
if(IsEvenNum())
|
||
{// 偶数
|
||
dbLen = m_dbLongDist - ((2*m_nNum-1)*m_nDist + 2*m_nDist + m_dbArcRadius);
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_dbLongDist - (2*(m_nNum-1)*m_nDist + 2*m_nDist + m_dbArcRadius);
|
||
}
|
||
acutPolar(pt, m_dbAssisAng-0.5*_PI+dbAng, m_dbArcRadius, pt);
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
if(m_nEntryType == 2 || m_nEntryType == 3)
|
||
{
|
||
m_pCenLine = new CPipeLine(actPt, m_dbPGAng, dbLen, _PI, m_dbNormAng+dbAng);
|
||
}
|
||
else
|
||
{
|
||
m_pCenLine = new CPipeLine(actPt, m_dbPGAng, dbLen, 0, m_dbNormAng+dbAng);
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
}
|
||
|
||
bool CPipeStyle6::CreateArcArr(XExplodeDraw &dc)
|
||
{
|
||
ads_point StartPt, EndPt; // 圆弧起点、终点(实际点)
|
||
AcDbObjectId ArcID; // 圆弧ID
|
||
ads_point CenPt; // 圆弧圆心(实际点)
|
||
int size = (int)m_LineArr2.GetSize();
|
||
int i=0; // sg modify
|
||
for(i = 0; i < size; i++)
|
||
{// 1、2边加角圆弧
|
||
m_LineArr1[i]->GetEndPt(EndPt);
|
||
m_LineArr2[i]->GetStartPt(StartPt);
|
||
GetArcCenterPt(EndPt, 0, CenPt);
|
||
if(m_nEntryType == 1 || m_nEntryType == 3 || m_nEntryType == 5 || m_nEntryType == 7)
|
||
{
|
||
if(!CreateArc(StartPt, EndPt, CenPt, ArcID,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else
|
||
{// 反向画弧
|
||
if(!CreateArc(EndPt, StartPt, CenPt, ArcID,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
m_ArcArr.Add(ArcID);
|
||
}
|
||
|
||
size = (int)m_LineArr3.GetSize();
|
||
for(i=0; i < size; i++)
|
||
{// 2、3边加角圆弧
|
||
m_LineArr2[i]->GetEndPt(EndPt);
|
||
m_LineArr3[i]->GetStartPt(StartPt);
|
||
GetArcCenterPt(EndPt, -0.5*_PI, CenPt);
|
||
if(m_nEntryType == 1 || m_nEntryType == 3 || m_nEntryType == 5 || m_nEntryType == 7)
|
||
{
|
||
if(!CreateArc(StartPt, EndPt, CenPt, ArcID,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else
|
||
{// 反向画弧
|
||
if(!CreateArc(EndPt, StartPt, CenPt, ArcID,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
m_ArcArr.Add(ArcID);
|
||
}
|
||
|
||
size = (int)m_LineArr4.GetSize();
|
||
for(i=0; i < size; i++)
|
||
{// 3、4边加角圆弧
|
||
m_LineArr3[i]->GetEndPt(EndPt);
|
||
m_LineArr4[i]->GetStartPt(StartPt);
|
||
GetArcCenterPt(EndPt, -_PI, CenPt);
|
||
if(m_nEntryType == 1 || m_nEntryType == 3 || m_nEntryType == 5 || m_nEntryType == 7)
|
||
{
|
||
if(!CreateArc(StartPt, EndPt, CenPt, ArcID,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else
|
||
{// 反向画弧
|
||
if(!CreateArc(EndPt, StartPt, CenPt, ArcID,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
m_ArcArr.Add(ArcID);
|
||
}
|
||
|
||
for(i=0; i < size; i++)
|
||
{// 4、1边加角圆弧
|
||
if(m_nNum == 1)
|
||
{
|
||
m_LineArr4[0]->GetEndPt(StartPt);
|
||
if(m_LineArr1.GetSize() < 2)
|
||
{// 只有一圈时不画
|
||
break;
|
||
}
|
||
m_LineArr1[1]->GetStartPt(EndPt);
|
||
GetArcCenterPt(EndPt, 0, CenPt);
|
||
if(m_nEntryType == 1 || m_nEntryType == 3 || m_nEntryType == 5 || m_nEntryType == 7)
|
||
{
|
||
if(!CreateArc(EndPt, StartPt, CenPt, ArcID,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(!CreateArc(StartPt, EndPt, CenPt, ArcID,dc))
|
||
{// 反向画弧
|
||
return false;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
m_LineArr4[i]->GetEndPt(EndPt);
|
||
if(m_LineArr1.GetSize() < (i+2))
|
||
{// 1组中没有实体了
|
||
break;
|
||
}
|
||
m_LineArr1[i+1]->GetStartPt(StartPt);
|
||
GetArcCenterPt(EndPt, -1.5*_PI, CenPt);
|
||
if(m_nEntryType == 1 || m_nEntryType == 3 || m_nEntryType == 5 || m_nEntryType == 7)
|
||
{
|
||
if(!CreateArc(StartPt, EndPt, CenPt, ArcID,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else
|
||
{// 反向画弧
|
||
if(!CreateArc(EndPt, StartPt, CenPt, ArcID,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
m_ArcArr.Add(ArcID);
|
||
}
|
||
|
||
// 中心线圆弧
|
||
if(m_pCenLine != NULL)
|
||
{
|
||
m_pCenLine->GetStartPt(StartPt);
|
||
if(m_nEntryType == 1 || m_nEntryType == 4 || m_nEntryType == 5 || m_nEntryType == 8)
|
||
{
|
||
if(IsEvenNum())
|
||
{// 如果是偶数,且入口是1、4、5、8,则连接1边最后一根直线的终点
|
||
m_LineArr1[m_LineArr1.GetSize()-1]->GetEndPt(EndPt);
|
||
GetArcCenterPt(EndPt, 0, CenPt);
|
||
}
|
||
else
|
||
{// 否则连接3边最后一根直线的终点
|
||
m_LineArr3[m_LineArr3.GetSize()-1]->GetEndPt(EndPt);
|
||
GetArcCenterPt(EndPt, _PI, CenPt);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(IsEvenNum())
|
||
{// 如果是偶数,且入口是2、3、6、7,则连接4边最后一根直线的终点
|
||
m_LineArr4[m_LineArr4.GetSize()-1]->GetEndPt(EndPt);
|
||
GetArcCenterPt(EndPt, -1.5*_PI, CenPt);
|
||
}
|
||
else
|
||
{// 否则连接2边最后一根直线的终点
|
||
m_LineArr2[m_LineArr2.GetSize()-1]->GetEndPt(EndPt);
|
||
GetArcCenterPt(EndPt, -0.5*_PI, CenPt);
|
||
}
|
||
}
|
||
if(m_nEntryType == 1 || m_nEntryType == 3 || m_nEntryType == 5 || m_nEntryType == 7)
|
||
{
|
||
if(!CreateArc(StartPt, EndPt, CenPt, ArcID,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(!CreateArc(EndPt, StartPt, CenPt, ArcID,dc))
|
||
{// 反向画弧
|
||
return false;
|
||
}
|
||
}
|
||
m_ArcArr.Add(ArcID);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/*///////////////////////////////////////////////////////////////////////////
|
||
函数 CPipeStyle6::CreateArc()
|
||
主要功能: 创建圆弧
|
||
返回值: true:成功 false:失败
|
||
参数含义:
|
||
StartPt - 圆弧起点
|
||
EndPt - 圆弧终点
|
||
CenPt - 圆弧圆心
|
||
ObjID - 返回圆弧实体ID
|
||
///////////////////////////////////////////////////////////////////////////*/
|
||
bool CPipeStyle6::CreateArc(ads_point StartPt, ads_point EndPt, ads_point CenPt, AcDbObjectId& ObjID,XExplodeDraw &dc)
|
||
{
|
||
/*
|
||
AcDbArc *pArc = NULL;
|
||
AcDbBlockTable *pTab;
|
||
AcDbBlockTableRecord *pRec;
|
||
*/
|
||
|
||
double StartAng = acutAngle(CenPt, StartPt);
|
||
double EndAng = acutAngle(CenPt, EndPt);
|
||
/*
|
||
if(acdbHostApplicationServices()->workingDatabase()
|
||
->getBlockTable(pTab, AcDb::kForRead) != Acad::eOk)
|
||
{
|
||
acutPrintf(_T("\n打开块表失败"));
|
||
return false;
|
||
}
|
||
if(pTab->getAt(ACDB_MODEL_SPACE, pRec, AcDb::kForWrite) != Acad::eOk)
|
||
{
|
||
pTab->close();
|
||
acutPrintf(_T("\n打开块表失败"));
|
||
return false;
|
||
}
|
||
pTab->close();
|
||
|
||
pArc = new AcDbArc(asPnt3d(CenPt), m_dbArcRadius, StartAng, EndAng);
|
||
if(pRec->appendAcDbEntity(ObjID, pArc) != Acad::eOk)
|
||
{
|
||
pArc->close();
|
||
pRec->close();
|
||
acutPrintf(_T("\n添加实体失败"));
|
||
return false;
|
||
}
|
||
pArc->close();
|
||
pRec->close();
|
||
*/
|
||
XArc pArc(CenPt, m_dbArcRadius, StartAng, EndAng);
|
||
// sg modify
|
||
// dc.DrawArc(pArc,0);
|
||
|
||
XCurveSegment seg;
|
||
seg = pArc;
|
||
BOOL bIsWeight = g_bPipeWeight;
|
||
if (bIsWeight) {
|
||
// 注:先给定一个默认值,下个版本改进
|
||
double dWeight = DocGetPScale() * 0.35;
|
||
DrawWeight(dc, dWeight, seg, m_nColorInd, 1.0);
|
||
}
|
||
else
|
||
dc << seg;
|
||
return true;
|
||
}
|
||
|
||
void CPipeStyle6::GetArcCenterPt(ads_point EndPt, double dbAng, ads_point& actCenPt)
|
||
{
|
||
actCenPt[X] = actCenPt[Y] = actCenPt[Z] = 0.0; // 返回的圆心
|
||
ads_point virPt, CenPt; // 虚拟点,虚拟中心点
|
||
TransToVirtualPt(EndPt, virPt);
|
||
|
||
switch(m_nEntryType)
|
||
{
|
||
case 1:
|
||
acutPolar(virPt, dbAng, m_dbArcRadius, CenPt);
|
||
break;
|
||
case 2:
|
||
acutPolar(virPt, 0.5*_PI-dbAng, m_dbArcRadius, CenPt);
|
||
break;
|
||
case 3:
|
||
acutPolar(virPt, dbAng+1.5*_PI, m_dbArcRadius, CenPt);
|
||
break;
|
||
case 4:
|
||
acutPolar(virPt, 0-dbAng, m_dbArcRadius, CenPt);
|
||
break;
|
||
case 5:
|
||
acutPolar(virPt, dbAng+_PI, m_dbArcRadius, CenPt);
|
||
break;
|
||
case 6:
|
||
acutPolar(virPt, 1.5*_PI-dbAng, m_dbArcRadius, CenPt);
|
||
break;
|
||
case 7:
|
||
acutPolar(virPt, dbAng+0.5*_PI, m_dbArcRadius, CenPt);
|
||
break;
|
||
case 8:
|
||
acutPolar(virPt, _PI-dbAng, m_dbArcRadius, CenPt);
|
||
break;
|
||
default :
|
||
return;
|
||
}
|
||
TransToActualPt(CenPt, actCenPt);
|
||
}
|
||
|
||
bool CPipeStyle6::IsEvenNum()
|
||
{
|
||
int nNum = (int)(m_dbShortDist / m_nDist);
|
||
int nCount = (int)(nNum/2);
|
||
double dbExt = nNum - 2*nCount;
|
||
if(dbExt+1 == 1.0)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
void CPipeStyle6::CreateOutLine()
|
||
{
|
||
ads_point virPt, EndPt, StartPt; // 虚拟点,终点,起点
|
||
if(m_pCenLine == NULL)
|
||
{
|
||
acutPrintf(_T("\nm_pCenLine == NULL"));
|
||
return;
|
||
}
|
||
m_pCenLine->GetEndPt(StartPt);
|
||
m_LineArr1[0]->GetStartPt(EndPt);
|
||
TransToVirtualPt(EndPt, virPt);
|
||
|
||
switch(m_nEntryType)
|
||
{
|
||
case 1:
|
||
case 4:
|
||
acutPolar(virPt, 0, m_nDist, virPt);
|
||
break;
|
||
case 2:
|
||
case 7:
|
||
acutPolar(virPt, 0.5*_PI, m_nDist, virPt);
|
||
break;
|
||
case 3:
|
||
case 6:
|
||
acutPolar(virPt, 1.5*_PI, m_nDist, virPt);
|
||
break;
|
||
case 5:
|
||
case 8:
|
||
acutPolar(virPt, _PI, m_nDist, virPt);
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
TransToActualPt(virPt, EndPt);
|
||
|
||
m_pOutLine = new CPipeLine;
|
||
m_pOutLine->SetStartPt(StartPt);
|
||
m_pOutLine->SetEndPt(EndPt);
|
||
}
|
||
|