Files
envi-code/SourceCode/Code2026/tg_shs/shs_pipewire/PipeStyle6.cpp
T

1545 lines
33 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
// 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);
}