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

1546 lines
34 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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);
}