2106 lines
53 KiB
C++
2106 lines
53 KiB
C++
// PipeStyle4.cpp: implementation of the CPipeStyle4 class.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
#include "stdafx.h"
|
||
|
||
#include "PipeStyle4.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
|
||
|
||
// add by myy 2015-2-2 自CPipeStyle1中
|
||
extern BOOL PtInLine(XLine& line, AcGePoint3d& pt);
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Construction/Destruction
|
||
//////////////////////////////////////////////////////////////////////
|
||
CPipeStyle4::CPipeStyle4()
|
||
{
|
||
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_dbPGAng = 0.0;
|
||
m_nEntryType = 0;
|
||
m_dbArcRadius = 0.0; // 圆弧半径
|
||
m_dToWallLR = 0.0; // 距墙距离,左右距墙值会根据间距调整
|
||
m_dToWallTB = 0.0;
|
||
|
||
SetSameDist(TRUE, 0); // 统一间距
|
||
m_nDistB = 0; // 间距B
|
||
|
||
m_nAreaType = 0; // 划分区域的方式,0:宽度,1:比例
|
||
m_dLeftArea = 0; // 左区宽度或比例值
|
||
m_dRightArea = 0; // 右区宽度或比例值
|
||
|
||
m_nColorInd = 4; // 颜色
|
||
m_bWeight = FALSE; // 是否粗显
|
||
m_dLineWeight = 0.35; // 线宽
|
||
|
||
InitVirtaulRect(); // 初始化矩形中的数据
|
||
}
|
||
|
||
CPipeStyle4::CPipeStyle4(XPoint rectStartPt, XPoint rectEndPt, double dbPGAng,
|
||
int nEntryType, double dRadius, double dDistToWall,
|
||
int nLeftDist, int nMidDist, int nRightDist, int nDistB,
|
||
int nAreaType, double dLeftArea, double dRightArea,
|
||
BOOL bWeight, double dLineWeight, int nColorIndex)
|
||
{
|
||
ads_point_set(rectStartPt, m_rectStartPt);
|
||
ads_point_set(rectEndPt, m_rectEndPt);
|
||
|
||
m_dbPGAng = dbPGAng;
|
||
m_nEntryType = nEntryType;
|
||
m_dbArcRadius = dRadius; // 圆弧半径
|
||
m_dToWallLR = dDistToWall; // 距墙距离
|
||
m_dToWallTB = dDistToWall;
|
||
|
||
m_bSameDist = FALSE; // 不统一间距
|
||
m_nLeftDist = nLeftDist; // 左区间距
|
||
m_nDist = nMidDist; // 中间区域间距
|
||
m_nRightDist = nRightDist; // 右区间距
|
||
m_nDistB = nDistB; // 间距B
|
||
|
||
m_nAreaType = nAreaType; // 划分区域的方式
|
||
m_dLeftArea = dLeftArea;
|
||
m_dRightArea = dRightArea;
|
||
|
||
m_nColorInd = nColorIndex; // 颜色
|
||
m_bWeight = bWeight; // 是否粗显
|
||
m_dLineWeight = dLineWeight; // 线宽
|
||
|
||
InitVirtaulRect(); // 初始化矩形中的数据
|
||
}
|
||
|
||
// add by myy 2015-1-30
|
||
CPipeStyle4::CPipeStyle4(XPoint rectStartPt, XPoint rectEndPt, XPoint ptPickEntry, double dbPGAng, int nEntryType,
|
||
double dRadius, double dDistToWall, int nLeftDist, int nMidDist, int nRightDist, int nDistB,
|
||
int nAreaType, double dLeftArea, double dRightArea, BOOL bWeight, double dLineWeight, int nColorIndex)
|
||
{
|
||
ads_point_set(rectStartPt, m_rectStartPt);
|
||
ads_point_set(rectEndPt, m_rectEndPt);
|
||
|
||
m_ptPickEntry = ptPickEntry;
|
||
m_bDefaultEntry = TRUE;
|
||
|
||
m_dbPGAng = dbPGAng;
|
||
m_nEntryType = nEntryType;
|
||
m_dbArcRadius = dRadius; // 圆弧半径
|
||
m_dToWallLR = dDistToWall; // 距墙距离
|
||
m_dToWallTB = dDistToWall;
|
||
|
||
m_bSameDist = FALSE; // 不统一间距
|
||
m_nLeftDist = nLeftDist; // 左区间距
|
||
m_nDist = nMidDist; // 中间区域间距
|
||
m_nRightDist = nRightDist; // 右区间距
|
||
m_nDistB = nDistB; // 间距B
|
||
|
||
m_nAreaType = nAreaType; // 划分区域的方式
|
||
m_dLeftArea = dLeftArea;
|
||
m_dRightArea = dRightArea;
|
||
|
||
m_nColorInd = nColorIndex; // 颜色
|
||
m_bWeight = bWeight; // 是否粗显
|
||
m_dLineWeight = dLineWeight; // 线宽
|
||
|
||
InitVirtaulRect(); // 初始化矩形中的数据
|
||
}
|
||
|
||
// 初始化矩形中的数据,用于构造函数
|
||
void CPipeStyle4::InitVirtaulRect()
|
||
{
|
||
m_nNum = 0; // 中间边的盘管数(n)
|
||
m_nLeftNum = 0; // 左区的盘管数(n)
|
||
m_nRightNum = 0; // 右区的盘管数(n)
|
||
m_dbSideDist = 0; // 区域间距离
|
||
|
||
m_dbDiagAng = 0.0; // 对角线与矩形夹角的锐角
|
||
m_dbDiagDist = 0.0; // 对角线长度
|
||
m_dbShortDist = 0.0; // 矩形短边长度
|
||
m_dbLongDist = 0.0; // 矩形长边长度
|
||
m_dbAssisAng = 0.0;
|
||
m_dbNormAng = 0.0;
|
||
}
|
||
|
||
CPipeStyle4::~CPipeStyle4()
|
||
{
|
||
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();
|
||
|
||
// add by myy 2015-2-2
|
||
for (i = 0; i < m_LineArr5.GetSize(); i++)
|
||
{
|
||
if (m_LineArr5[i] != NULL)
|
||
{
|
||
delete m_LineArr5[i];
|
||
}
|
||
}
|
||
m_LineArr5.RemoveAll();
|
||
// add end
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Set函数
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 设置间距是否统一
|
||
void CPipeStyle4::SetSameDist(BOOL bSame, int nDist)
|
||
{
|
||
m_bSameDist = bSame;
|
||
if (m_bSameDist)
|
||
{
|
||
m_nLeftDist = nDist;
|
||
m_nDist = nDist;
|
||
m_nRightDist = nDist;
|
||
}
|
||
}
|
||
|
||
void CPipeStyle4::SetStartPt(ads_point rectStartPt)
|
||
{
|
||
ads_point_set(rectStartPt, m_rectStartPt);
|
||
}
|
||
|
||
void CPipeStyle4::SetPGAng(double dbPGAng)
|
||
{
|
||
m_dbPGAng = dbPGAng;
|
||
}
|
||
|
||
void CPipeStyle4::SetEntryType(int nEntryType)
|
||
{
|
||
m_nEntryType = nEntryType;
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Get函数
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 获取所有区域间距中最小的,用于倒角
|
||
double CPipeStyle4::GetMinDist()
|
||
{
|
||
double dMin1 = min(m_nLeftDist, m_nRightDist),
|
||
dMin2 = min(m_nDist, m_dToWallTB),
|
||
dMin = min(dMin1, dMin2);
|
||
dMin = min(dMin, m_nDistB);
|
||
return dMin;
|
||
}
|
||
|
||
// 获取左、右区域真实宽度
|
||
double CPipeStyle4::GetLeftAreaDist() // 左
|
||
{
|
||
if (m_bSameDist) // 统一间距时,不考虑宽度
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
if (m_nAreaType == 0) // 设置区域宽度
|
||
{
|
||
return m_dLeftArea;
|
||
}
|
||
|
||
double dLen = GetLRDist();
|
||
return m_dLeftArea*dLen; // 设置区域比例
|
||
}
|
||
|
||
double CPipeStyle4::GetRightAreaDist() // 右
|
||
{
|
||
if (m_bSameDist) // 统一间距时,不考虑宽度
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
if (m_nAreaType == 0) // 设置区域宽度
|
||
{
|
||
return m_dRightArea;
|
||
}
|
||
|
||
double dLen = GetLRDist();
|
||
return m_dRightArea*dLen; // 设置区域比例
|
||
}
|
||
|
||
// 获得中间区域宽度
|
||
double CPipeStyle4::GetMidAreaDist()
|
||
{
|
||
double dMidArea = GetLRDist() - 2*m_dToWallLR;
|
||
if (!m_bSameDist) // 间距不统一
|
||
{
|
||
dMidArea -= (m_nLeftNum-1)*m_nLeftDist + (m_nRightNum-1)*m_nRightDist;
|
||
}
|
||
return dMidArea;
|
||
}
|
||
|
||
// 获取左右方向距墙距离,仅用于GetEntryPt函数中
|
||
void CPipeStyle4::GetLRWallDist()
|
||
{
|
||
double dLen = GetLRDist(), // 左右宽度
|
||
dWidth = dLen - 2*m_dToWallLR; // 抛去距墙距离
|
||
if (m_bSameDist) // 统一间距的情况
|
||
{
|
||
int nNum = (int)(dWidth/m_nDist);
|
||
if ((nNum == 1) || (nNum == 2)) // 仅够盘一圈
|
||
{
|
||
m_dToWallLR = (dLen - m_nDist)/2;
|
||
}
|
||
else if (nNum > 2) // 绘制多圈
|
||
{
|
||
DealSameDist();
|
||
}
|
||
}
|
||
else // 不统一间距的情况
|
||
{
|
||
if (dWidth > 1.0E-5) // 距离至少要大于两个距墙距离
|
||
{
|
||
double dLeftArea = GetLeftAreaDist(), // 获得左、右区域宽度
|
||
dRightArea = GetRightAreaDist();
|
||
if (dLeftArea + dRightArea > dLen - 1.0E-5) // 仅够盘一圈
|
||
{
|
||
m_dToWallLR = (dLen - m_nDist)/2;
|
||
}
|
||
else // 绘制多圈
|
||
{
|
||
DealDifferentDist();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void CPipeStyle4::GetCrossPts(XPoint &ptSupply, XPoint &ptReturn)
|
||
{
|
||
GetCenterPt();
|
||
GetDiagAng();
|
||
GetLengthofSide();
|
||
GetVirtaulRect();
|
||
NormalizeRect();
|
||
BOOL bMultiFlag = TRUE;
|
||
double dWidth = GetLRDist() - 2*m_dToWallLR;
|
||
if (m_bSameDist) // 统一间距的情况
|
||
{
|
||
int nNum = (int)(dWidth/m_nDist);
|
||
if (nNum < 1)
|
||
{
|
||
return ;
|
||
}
|
||
else if ((nNum == 1) || (nNum == 2)) // 仅够盘一圈
|
||
{
|
||
PreDrawSingle(); // 绘制一圈
|
||
bMultiFlag = FALSE;
|
||
}
|
||
DealSameDist();
|
||
}
|
||
else // 不统一间距的情况
|
||
{
|
||
if (dWidth < 1.0E-5) // 距离至少要大于两个距墙距离
|
||
{
|
||
return ;
|
||
}
|
||
else
|
||
{
|
||
double dLeftArea = GetLeftAreaDist(), // 获得左、右区域宽度
|
||
dRightArea = GetRightAreaDist();
|
||
if (dLeftArea + dRightArea > GetLRDist() - 1.0E-5) // 仅够盘一圈
|
||
{
|
||
PreDrawSingle(); // 绘制一圈
|
||
bMultiFlag = FALSE;
|
||
}
|
||
}
|
||
DealDifferentDist();
|
||
}
|
||
|
||
if( !bMultiFlag )
|
||
{
|
||
ptReturn = m_ptDrawReturn;
|
||
ptSupply = m_ptDrawSupply;
|
||
return ;
|
||
}
|
||
CreateLine1Arr();
|
||
CreateLine3Arr();
|
||
if(!m_bDefaultEntry)
|
||
{
|
||
if (m_LineArr1.GetSize() > 1 && m_LineArr5.GetSize() == 6 && m_LineArr3.GetSize() > 1)
|
||
{
|
||
double dAng(m_dbAssisAng + 0.5*_PI);
|
||
if ((2 == m_nEntryType) || (4 == m_nEntryType) || (6 == m_nEntryType)
|
||
|| (8 == m_nEntryType))
|
||
{
|
||
dAng = m_dbAssisAng - 0.5*_PI;
|
||
}
|
||
|
||
if(NULL != m_LineArr1[0] && NULL != m_LineArr3[0])
|
||
{
|
||
double dSupAjDist = 2 * m_nLeftDist - m_dbArcRadius - m_dToWallTB; //供水入口调整距离
|
||
double dRetAjDist = m_nLeftDist - m_dToWallTB - m_dbArcRadius; //回水入口调整距离
|
||
|
||
ads_point ptNewSupStart, ptNewRetStart;
|
||
m_LineArr1[0]->GetStartPt(ptNewSupStart);
|
||
m_LineArr3[0]->GetStartPt(ptNewRetStart);
|
||
|
||
TransToVirtualPt(ptNewSupStart, ptNewSupStart);
|
||
TransToVirtualPt(ptNewRetStart, ptNewRetStart);
|
||
acutPolar(ptNewSupStart, dAng + PI, dSupAjDist, ptNewSupStart);
|
||
acutPolar(ptNewRetStart, dAng + PI, dRetAjDist, ptNewRetStart);
|
||
TransToActualPt(ptNewSupStart, ptNewSupStart);
|
||
TransToActualPt(ptNewRetStart, ptNewRetStart);
|
||
|
||
m_LineArr1[0]->SetStartPt(ptNewSupStart);
|
||
m_LineArr3[0]->SetStartPt(ptNewRetStart);
|
||
|
||
ads_point ptSup, ptRet;
|
||
m_LineArr5[2]->GetEndPt(ptSup);
|
||
m_LineArr5[3]->GetEndPt(ptRet);
|
||
ads_point_set(ptSup, ptSupply);
|
||
ads_point_set(ptRet, ptReturn);
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// mcl add 2010.11.17 修正供回水起始点位置,不再多出一个 距墙 的长度
|
||
if (m_LineArr1.GetSize() > 1)
|
||
{
|
||
double dAng(m_dbAssisAng + 0.5*_PI);
|
||
if ((2 == m_nEntryType) || (4 == m_nEntryType) || (6 == m_nEntryType)
|
||
|| (8 == m_nEntryType))
|
||
{
|
||
dAng = m_dbAssisAng - 0.5*_PI;
|
||
}
|
||
|
||
ads_point ptNewStart;
|
||
if (m_LineArr1[0] != NULL)
|
||
{
|
||
{
|
||
m_LineArr1[0]->GetStartPt(ptNewStart);
|
||
acutPolar(ptNewStart, dAng+m_dbPGAng + m_dbNormAng, m_dToWallTB, ptNewStart);
|
||
m_LineArr1[0]->SetStartPt(ptNewStart);
|
||
ptSupply = ptNewStart;
|
||
}
|
||
}
|
||
|
||
if (m_LineArr3[0] != NULL)
|
||
{
|
||
{
|
||
m_LineArr3[0]->GetStartPt(ptNewStart);
|
||
acutPolar(ptNewStart, dAng+m_dbPGAng + m_dbNormAng, m_dToWallTB, ptNewStart);
|
||
m_LineArr3[0]->SetStartPt(ptNewStart);
|
||
ptReturn = ptNewStart;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//XPoint CPipeStyle4::GetEntryPt(int nNum)
|
||
XPoint CPipeStyle4::GetEntryPt()
|
||
{
|
||
GetCenterPt(); // 得到中心点
|
||
GetDiagAng(); // 得到对角线锐角
|
||
GetLengthofSide(); // 得到长短边
|
||
|
||
// mcl add 2010.12.13, 缺少这两步,计算出的出口点跟实际绘制不符,见 DrawPGLine()中
|
||
GetVirtaulRect(); // 得到虚拟矩形
|
||
NormalizeRect(); // 把虚拟矩形放倒
|
||
|
||
XPoint ptLB, ptLT, ptRT, ptRB;
|
||
acutPolar(m_CenterPt, _PI+m_dbDiagAng, m_dbDiagDist/2, ptLB);
|
||
acutPolar(m_CenterPt, _PI-m_dbDiagAng, m_dbDiagDist/2, ptLT);
|
||
acutPolar(m_CenterPt, m_dbDiagAng, m_dbDiagDist/2, ptRT);
|
||
acutPolar(m_CenterPt, -m_dbDiagAng, m_dbDiagDist/2, ptRB);
|
||
GetLRWallDist();
|
||
|
||
ads_point StartPtIn; // 入口起点
|
||
// switch(nNum)
|
||
switch(m_nEntryType)
|
||
{
|
||
case 1:
|
||
acutPolar(ptLB, 0, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 2:
|
||
acutPolar(ptLB, 0.5*_PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 3:
|
||
acutPolar(ptLT, 1.5*_PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 4:
|
||
acutPolar(ptLT, 0, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 5:
|
||
acutPolar(ptRT, _PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 6:
|
||
acutPolar(ptRT, 1.5*_PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 7:
|
||
acutPolar(ptRB, 0.5*_PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 8:
|
||
acutPolar(ptRB, _PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
default:
|
||
return XPoint();
|
||
}
|
||
|
||
XPoint ptRet = StartPtIn;
|
||
TransToActualPt(StartPtIn, ptRet);
|
||
return ptRet;
|
||
}
|
||
|
||
// 获取左右宽度
|
||
double CPipeStyle4::GetLRDist()
|
||
{
|
||
double dLen = m_dbLongDist;
|
||
if ((2 == m_nEntryType) || (3 == m_nEntryType) || (6 == m_nEntryType)
|
||
|| (7 == m_nEntryType))
|
||
{
|
||
dLen = m_dbShortDist;
|
||
}
|
||
return dLen;
|
||
}
|
||
|
||
// 获取上下宽度
|
||
double CPipeStyle4::GetTBDist()
|
||
{
|
||
double dLen = m_dbShortDist;
|
||
if ((2 == m_nEntryType) || (3 == m_nEntryType) || (6 == m_nEntryType)
|
||
|| (7 == m_nEntryType))
|
||
{
|
||
dLen = m_dbLongDist;
|
||
}
|
||
return dLen;
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 构造虚拟矩形的函数
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 将矩形转换为躺倒的矩形
|
||
void CPipeStyle4::NormalizeRect()
|
||
{
|
||
double dbDist12 = acutDistance(m_ptLB, m_ptLT), // 1、2点间距离
|
||
dbDist14 = acutDistance(m_ptLB, m_ptRB); // 1、4点间距离
|
||
|
||
// change by myy 2015-3-2
|
||
if (dbDist12 <= dbDist14)
|
||
{
|
||
m_bDistance = TRUE;
|
||
return;
|
||
}
|
||
|
||
m_bDistance = FALSE;
|
||
// change end
|
||
|
||
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 CPipeStyle4::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 CPipeStyle4::GetDiagAng()
|
||
{
|
||
m_dbDiagAng = acutAngle(m_rectStartPt, m_CenterPt) - m_dbPGAng;
|
||
m_dbDiagAng = AngleRangeTo2PI(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 CPipeStyle4::GetLengthofSide()
|
||
{
|
||
m_dbDiagDist = acutDistance(m_rectStartPt, m_rectEndPt);
|
||
|
||
double dbDist12 = fabs(m_dbDiagDist*sin(m_dbDiagAng)), // 1、2点间距离
|
||
dbDist14 = fabs(m_dbDiagDist*cos(m_dbDiagAng)); // 1、4点间距离
|
||
m_dbShortDist = min(dbDist12, dbDist14);
|
||
m_dbLongDist = max(dbDist12, dbDist14);
|
||
}
|
||
|
||
// 虚拟矩形的四个顶点
|
||
void CPipeStyle4::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 CPipeStyle4::TransToActualPt(ads_point point, ads_point retPt)
|
||
{
|
||
double dbDist = acutDistance(m_CenterPt, point),
|
||
dAng = acutAngle(m_CenterPt, point);
|
||
acutPolar(m_CenterPt, m_dbPGAng+dAng+m_dbNormAng, dbDist, retPt);
|
||
}
|
||
|
||
// 将真实坐标转换到虚拟点
|
||
void CPipeStyle4::TransToVirtualPt(ads_point point, ads_point retPt)
|
||
{
|
||
double dbDist = acutDistance(m_CenterPt, point),
|
||
dAng = acutAngle(m_CenterPt, point);
|
||
acutPolar(m_CenterPt, dAng-m_dbPGAng-m_dbNormAng, dbDist, retPt);
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 主函数
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 管道数是否是偶数
|
||
bool CPipeStyle4::IsEvenNum(int nNum)
|
||
{
|
||
int nCount = (int)(nNum/2);
|
||
double dbExt = nNum - 2*nCount;
|
||
if (dbExt+1 == 1.0)
|
||
{
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// TDbFloorPipe::ExplodeOrDraw2d中调用的绘制函数
|
||
bool CPipeStyle4::DrawPGLine( XExplodeDraw &dc,AcDbObjectId idRetLayer /*= AcDbObjectId::kNull*/ )
|
||
{
|
||
// 1、对输入数据的合理性进行检查
|
||
if ((abs(m_nLeftDist) <= 0) || (abs(m_nRightDist) <= 0) ||
|
||
(abs(m_nDist) <= 0) || (abs(m_nDistB) <= 0))
|
||
{
|
||
acutPrintf(_T("\n间距错误"));
|
||
return false;
|
||
}
|
||
|
||
if (m_nEntryType < 1 || m_nEntryType > 8)
|
||
{
|
||
acutPrintf(_T("\n入口类型错误"));
|
||
return false;
|
||
}
|
||
|
||
// 2、构造一个虚拟的外包“矩形”
|
||
GetCenterPt(); // 得到中心点
|
||
GetDiagAng(); // 得到对角线锐角
|
||
GetLengthofSide(); // 得到长短边
|
||
GetVirtaulRect(); // 得到虚拟矩形
|
||
|
||
NormalizeRect(); // 3、把虚拟矩形放倒
|
||
|
||
// 4、分类初始化LINEARR数组
|
||
double dWidth = GetLRDist() - 2*m_dToWallLR;
|
||
if (m_bSameDist) // 统一间距的情况
|
||
{
|
||
int nNum = (int)(dWidth/m_nDist);
|
||
if (nNum < 1) // 至少要大于两个距墙距离
|
||
{
|
||
bool bRet = DrawSingleLine(dc); // 仅绘制一根线
|
||
return bRet;
|
||
}
|
||
else if ((nNum == 1) || (nNum == 2)) // 仅够盘一圈
|
||
{
|
||
bool bRet = DrawSingle(dc); // 绘制一圈
|
||
return bRet;
|
||
}
|
||
else
|
||
{
|
||
if (!DrawMulti()) // 绘制多圈
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
else // 不统一间距的情况
|
||
{
|
||
if (dWidth < 1.0E-5) // 距离至少要大于两个距墙距离
|
||
{
|
||
bool bRet = DrawSingleLine(dc); // 仅绘制一根线
|
||
return bRet;
|
||
}
|
||
else
|
||
{
|
||
double dLeftArea = GetLeftAreaDist(), // 获得左、右区域宽度
|
||
dRightArea = GetRightAreaDist();
|
||
if (dLeftArea + dRightArea > GetLRDist() - 1.0E-5) // 仅够盘一圈
|
||
{
|
||
bool bRet = DrawSingle(dc); // 绘制一圈
|
||
return bRet;
|
||
}
|
||
else
|
||
{
|
||
if (!DrawMulti()) // 绘制多圈
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
int i(0); // sg modify
|
||
AcDbObjectId idOrigLayer = dc.GetLayerId();
|
||
for (i = 0; i < m_LineArr1.GetSize(); i++) // 5、绘制所有管线
|
||
{
|
||
m_LineArr1[i]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
|
||
}
|
||
|
||
for (i = 0; i < m_LineArr2.GetSize(); i++)
|
||
{
|
||
m_LineArr2[i]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
|
||
}
|
||
|
||
if (idRetLayer.isValid())
|
||
dc.SetLayer(idRetLayer);
|
||
for (i = 0; i < m_LineArr3.GetSize(); i++)
|
||
{
|
||
m_LineArr3[i]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
|
||
}
|
||
|
||
for (i = 0; i < m_LineArr4.GetSize(); i++)
|
||
{
|
||
m_LineArr4[i]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
|
||
}
|
||
|
||
// add by myy 2015-1-30
|
||
for (i = 0; i < m_LineArr5.GetSize(); i++)
|
||
{
|
||
if ((4 == i || 5 == i) && idRetLayer.isValid())
|
||
dc.SetLayer(idRetLayer);
|
||
else if (1 == i % 2 && idRetLayer.isValid())
|
||
dc.SetLayer(idRetLayer);
|
||
else if(idOrigLayer.isValid())
|
||
{
|
||
dc.SetLayer(idOrigLayer);
|
||
}
|
||
|
||
m_LineArr5[i]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
|
||
}
|
||
// add end
|
||
|
||
dc.SetLayer(idOrigLayer);
|
||
|
||
if (!CreateArcArr(dc, idRetLayer)) // 6、绘制管线连接处的弧线
|
||
{
|
||
dc.SetLayer(idOrigLayer);
|
||
return false;
|
||
}
|
||
dc.SetLayer(idOrigLayer);
|
||
return true;
|
||
}
|
||
|
||
// 区域过小,仅绘制一条线
|
||
bool CPipeStyle4::DrawSingleLine(XExplodeDraw &dc)
|
||
{
|
||
double dbLen = GetTBDist() - m_dToWallTB - m_dbArcRadius; // 直线长度
|
||
|
||
double dAngArray[8] = {0.0, 0.5*_PI, 1.5*_PI, 0, _PI, 1.5*_PI,
|
||
0.5*_PI, _PI};
|
||
m_dbAssisAng = dAngArray[m_nEntryType-1]; // 角度
|
||
|
||
ads_point StartPtIn; // 入口起点
|
||
if ((1 == m_nEntryType) || (2 == m_nEntryType))
|
||
{
|
||
acutPolar(m_ptLB, m_dbAssisAng, m_dToWallTB, StartPtIn);
|
||
}
|
||
else if ((3 == m_nEntryType) || (4 == m_nEntryType))
|
||
{
|
||
acutPolar(m_ptLT, m_dbAssisAng, m_dToWallTB, StartPtIn);
|
||
}
|
||
else if ((5 == m_nEntryType) || (6 == m_nEntryType))
|
||
{
|
||
acutPolar(m_ptRT, m_dbAssisAng, m_dToWallTB, StartPtIn);
|
||
}
|
||
else
|
||
{
|
||
acutPolar(m_ptRB, m_dbAssisAng, m_dToWallTB, StartPtIn);
|
||
}
|
||
|
||
double dTemp(m_dbAssisAng + 0.5*_PI); // 临时统一角度使用
|
||
if ((2 == m_nEntryType) || (4 == m_nEntryType) || (6 == m_nEntryType)
|
||
|| (8 == m_nEntryType))
|
||
{
|
||
dTemp = m_dbAssisAng - 0.5*_PI;
|
||
}
|
||
|
||
ads_point actPt; // 实际点
|
||
TransToActualPt(StartPtIn, actPt);
|
||
CPipeLine *line1 = new CPipeLine(actPt, m_dbPGAng, dbLen, dTemp, m_dbNormAng);
|
||
m_LineArr1.Add(line1);
|
||
|
||
bool bRet = m_LineArr1[0]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
|
||
return bRet; // 画线
|
||
}
|
||
|
||
// 区域仅够盘一圈管线
|
||
bool CPipeStyle4::DrawSingle(XExplodeDraw &dc)
|
||
{
|
||
m_nNum = 1; // 与m_nLeftNum、m_nRightNume无关
|
||
|
||
double dbLen1 = GetTBDist() - m_dToWallTB - m_dbArcRadius, // 直线长度
|
||
dbLen2 = m_nDist - 2*m_dbArcRadius;
|
||
m_dToWallLR = (GetLRDist() - m_nDist)/2; // 调整左右方向距墙距离
|
||
|
||
XPoint ptStart;
|
||
if ((1 == m_nEntryType) || (8 == m_nEntryType))
|
||
{
|
||
ptStart = m_ptLB;
|
||
m_dbAssisAng = 0;
|
||
}
|
||
else if ((2 == m_nEntryType) || (3 == m_nEntryType))
|
||
{
|
||
ptStart = m_ptLT;
|
||
m_dbAssisAng = 1.5*_PI;
|
||
}
|
||
else if ((4 == m_nEntryType) || (5 == m_nEntryType))
|
||
{
|
||
ptStart = m_ptRT;
|
||
m_dbAssisAng = _PI;
|
||
}
|
||
else
|
||
{
|
||
ptStart = m_ptRB;
|
||
m_dbAssisAng = 0.5*_PI;
|
||
}
|
||
|
||
double dTemp = m_dbAssisAng + 0.5*_PI;
|
||
ads_point virStartPtIn, virEndPtIn; // 虚拟输入起点、终点
|
||
acutPolar(ptStart, m_dbAssisAng, m_dToWallLR, virStartPtIn);
|
||
acutPolar(virStartPtIn, dTemp, dbLen1, virEndPtIn);
|
||
|
||
ads_point virStartPtOut, virEndPtOut; // 虚拟输出起点、终点
|
||
acutPolar(virStartPtIn, m_dbAssisAng, m_nDist, virStartPtOut);
|
||
acutPolar(virStartPtOut, dTemp, dbLen1, virEndPtOut);
|
||
|
||
ads_point pt;
|
||
ads_point virStartPt, virEndPt; // 端部虚拟起点、终点
|
||
acutPolar(virEndPtIn, m_dbAssisAng, m_dbArcRadius, pt);
|
||
acutPolar(pt, dTemp, m_dbArcRadius, virStartPt);
|
||
acutPolar(virStartPt, m_dbAssisAng, dbLen2, virEndPt);
|
||
|
||
ads_point StartPtIn, EndPtIn; // 实际起点、终点
|
||
TransToActualPt(virStartPtIn, StartPtIn);
|
||
TransToActualPt(virEndPtIn, EndPtIn);
|
||
CPipeLine *pLine1 = new CPipeLine; // 创建第一条线
|
||
pLine1->SetStartPt(StartPtIn);
|
||
pLine1->SetEndPt(EndPtIn);
|
||
m_LineArr1.Add(pLine1);
|
||
|
||
ads_point StartPtOut, EndPtOut;
|
||
TransToActualPt(virStartPtOut, StartPtOut);
|
||
TransToActualPt(virEndPtOut, EndPtOut);
|
||
CPipeLine *pLine2 = new CPipeLine; // 创建第2条线
|
||
pLine2->SetStartPt(StartPtOut);
|
||
pLine2->SetEndPt(EndPtOut);
|
||
m_LineArr1.Add(pLine2);
|
||
|
||
ads_point StartPt, EndPt;
|
||
TransToActualPt(virStartPt, StartPt);
|
||
TransToActualPt(virEndPt, EndPt);
|
||
CPipeLine *pLine3 = new CPipeLine; // 创建端部直线
|
||
pLine3->SetStartPt(StartPt);
|
||
pLine3->SetEndPt(EndPt);
|
||
m_LineArr1.Add(pLine3);
|
||
|
||
//add by dyw 20150422
|
||
XPoint ptSup = m_ptDrawSupply;
|
||
XPoint ptRet = m_ptDrawReturn;
|
||
XPoint ptTmp;
|
||
if(0 == m_nEntryType % 2)
|
||
{
|
||
ptTmp = ptSup;
|
||
ptSup = ptRet;
|
||
ptRet = ptTmp;
|
||
}
|
||
if(!!m_ptDrawSupply && !!m_ptDrawReturn)
|
||
{
|
||
if(NULL != m_LineArr1[0])
|
||
m_LineArr1[0]->SetStartPt(ptSup);
|
||
|
||
if(NULL != m_LineArr1[1])
|
||
m_LineArr1[1]->SetStartPt(ptRet);
|
||
}
|
||
else
|
||
{
|
||
ads_point ptTemp;
|
||
if(NULL != m_LineArr1[0])
|
||
{
|
||
m_LineArr1[0]->GetStartPt(ptTemp);
|
||
m_ptDrawSupply = ptTemp;
|
||
}
|
||
|
||
if(NULL != m_LineArr1[1])
|
||
{
|
||
m_LineArr1[0]->GetStartPt(ptTemp);
|
||
m_ptDrawSupply = ptTemp;
|
||
}
|
||
}
|
||
//add end
|
||
|
||
for (int i=0; i < m_LineArr1.GetSize(); i++) // 画线
|
||
{
|
||
if (m_LineArr1[i] != NULL)
|
||
{
|
||
if (!m_LineArr1[i]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight))
|
||
{
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
|
||
ads_point virCenPtL, virCenPtR;
|
||
acutPolar(virEndPtIn, m_dbAssisAng, m_dbArcRadius, virCenPtL);
|
||
acutPolar(virEndPtOut, m_dbAssisAng, -m_dbArcRadius, virCenPtR);
|
||
ads_point CenPtL, CenPtR; // 圆弧圆心
|
||
TransToActualPt(virCenPtL, CenPtL);
|
||
TransToActualPt(virCenPtR, CenPtR);
|
||
|
||
AcDbObjectId ArcID;
|
||
if (!CreateArc(StartPt, EndPtIn, CenPtL, ArcID, dc)) // 创建圆弧
|
||
{
|
||
return false;
|
||
}
|
||
m_ArcArr.Add(ArcID);
|
||
|
||
if (!CreateArc(EndPtOut, EndPt, CenPtR, ArcID, dc))
|
||
{
|
||
return false;
|
||
}
|
||
m_ArcArr.Add(ArcID);
|
||
return true;
|
||
}
|
||
|
||
void CPipeStyle4::PreDrawSingle()
|
||
{
|
||
m_nNum = 1; // 与m_nLeftNum、m_nRightNume无关
|
||
|
||
double dbLen1 = GetTBDist() - m_dToWallTB - m_dbArcRadius, // 直线长度
|
||
dbLen2 = m_nDist - 2*m_dbArcRadius;
|
||
m_dToWallLR = (GetLRDist() - m_nDist)/2; // 调整左右方向距墙距离
|
||
|
||
XPoint ptStart;
|
||
if ((1 == m_nEntryType) || (8 == m_nEntryType))
|
||
{
|
||
ptStart = m_ptLB;
|
||
m_dbAssisAng = 0;
|
||
}
|
||
else if ((2 == m_nEntryType) || (3 == m_nEntryType))
|
||
{
|
||
ptStart = m_ptLT;
|
||
m_dbAssisAng = 1.5*_PI;
|
||
}
|
||
else if ((4 == m_nEntryType) || (5 == m_nEntryType))
|
||
{
|
||
ptStart = m_ptRT;
|
||
m_dbAssisAng = _PI;
|
||
}
|
||
else
|
||
{
|
||
ptStart = m_ptRB;
|
||
m_dbAssisAng = 0.5*_PI;
|
||
}
|
||
|
||
double dTemp = m_dbAssisAng + 0.5*_PI;
|
||
ads_point virStartPtIn, virEndPtIn; // 虚拟输入起点、终点
|
||
acutPolar(ptStart, m_dbAssisAng, m_dToWallLR, virStartPtIn);
|
||
acutPolar(virStartPtIn, dTemp, dbLen1, virEndPtIn);
|
||
|
||
ads_point virStartPtOut, virEndPtOut; // 虚拟输出起点、终点
|
||
acutPolar(virStartPtIn, m_dbAssisAng, m_nDist, virStartPtOut);
|
||
acutPolar(virStartPtOut, dTemp, dbLen1, virEndPtOut);
|
||
|
||
ads_point pt;
|
||
ads_point virStartPt, virEndPt; // 端部虚拟起点、终点
|
||
acutPolar(virEndPtIn, m_dbAssisAng, m_dbArcRadius, pt);
|
||
acutPolar(pt, dTemp, m_dbArcRadius, virStartPt);
|
||
acutPolar(virStartPt, m_dbAssisAng, dbLen2, virEndPt);
|
||
|
||
ads_point StartPtIn, EndPtIn; // 实际起点、终点
|
||
TransToActualPt(virStartPtIn, StartPtIn);
|
||
TransToActualPt(virEndPtIn, EndPtIn);
|
||
CPipeLine *pLine1 = new CPipeLine; // 创建第一条线
|
||
pLine1->SetStartPt(StartPtIn);
|
||
pLine1->SetEndPt(EndPtIn);
|
||
m_LineArr1.Add(pLine1);
|
||
|
||
ads_point StartPtOut, EndPtOut;
|
||
TransToActualPt(virStartPtOut, StartPtOut);
|
||
TransToActualPt(virEndPtOut, EndPtOut);
|
||
CPipeLine *pLine2 = new CPipeLine; // 创建第2条线
|
||
pLine2->SetStartPt(StartPtOut);
|
||
pLine2->SetEndPt(EndPtOut);
|
||
m_LineArr1.Add(pLine2);
|
||
|
||
if( m_nEntryType %2 == 0 )
|
||
{
|
||
m_ptDrawSupply = StartPtOut;
|
||
m_ptDrawReturn = StartPtIn;
|
||
}
|
||
else
|
||
{
|
||
m_ptDrawSupply = StartPtIn;
|
||
m_ptDrawReturn = StartPtOut;
|
||
}
|
||
}
|
||
|
||
// 绘制多圈盘管
|
||
bool CPipeStyle4::DrawMulti()
|
||
{
|
||
// 1、给各个参数赋值
|
||
if (m_bSameDist) // 统一间距
|
||
{
|
||
DealSameDist();
|
||
}
|
||
else // 不统一间距
|
||
{
|
||
DealDifferentDist();
|
||
}
|
||
|
||
CreateLine1Arr(); // 2、初始化LINEARR数组
|
||
CreateLine3Arr();
|
||
CreateLine2Arr();
|
||
CreateLine4Arr();
|
||
|
||
if(!!m_ptPickEntry && !m_bDefaultEntry)
|
||
{
|
||
//调整原来的入口的位置
|
||
if(m_LineArr1.GetSize() > 1 && m_LineArr3.GetSize() > 1 )
|
||
{
|
||
double dAng(m_dbAssisAng + 0.5*_PI);
|
||
if ((2 == m_nEntryType) || (4 == m_nEntryType) || (6 == m_nEntryType)
|
||
|| (8 == m_nEntryType))
|
||
{
|
||
dAng = m_dbAssisAng - 0.5*_PI;
|
||
}
|
||
|
||
if(NULL != m_LineArr1[0] && NULL != m_LineArr3[0])
|
||
{
|
||
double dSupAjDist = 2 * m_nLeftDist - m_dbArcRadius - m_dToWallTB;
|
||
double dRetAjDist = m_nLeftDist - m_dToWallTB - m_dbArcRadius;
|
||
|
||
ads_point ptNewSupStart, ptNewRetStart;
|
||
m_LineArr1[0]->GetStartPt(ptNewSupStart);
|
||
m_LineArr3[0]->GetStartPt(ptNewRetStart);
|
||
|
||
TransToVirtualPt(ptNewSupStart, ptNewSupStart);
|
||
TransToVirtualPt(ptNewRetStart, ptNewRetStart);
|
||
acutPolar(ptNewSupStart, dAng + PI, dSupAjDist, ptNewSupStart);
|
||
acutPolar(ptNewRetStart, dAng + PI, dRetAjDist, ptNewRetStart);
|
||
TransToActualPt(ptNewSupStart, ptNewSupStart);
|
||
TransToActualPt(ptNewRetStart, ptNewRetStart);
|
||
|
||
m_LineArr1[0]->SetStartPt(ptNewSupStart);
|
||
m_LineArr3[0]->SetStartPt(ptNewRetStart);
|
||
}
|
||
}
|
||
|
||
if (m_LineArr5.GetSize() == 6)
|
||
{
|
||
if(!!m_ptDrawSupply && !!m_ptDrawReturn)
|
||
{
|
||
m_LineArr5[2]->SetEndPt(m_ptDrawSupply);
|
||
m_LineArr5[3]->SetEndPt(m_ptDrawReturn);
|
||
}
|
||
else
|
||
{
|
||
ads_point ptSup, ptRet;
|
||
m_LineArr5[2]->GetEndPt(ptSup);
|
||
m_LineArr5[3]->GetEndPt(ptRet);
|
||
ads_point_set(ptSup, m_ptDrawSupply);
|
||
ads_point_set(ptRet, m_ptDrawReturn);
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// mcl add 2010.11.17 修正供回水起始点位置,不再多出一个 距墙 的长度
|
||
if (m_LineArr1.GetSize() > 1)
|
||
{
|
||
double dAng(m_dbAssisAng + 0.5*_PI);
|
||
if ((2 == m_nEntryType) || (4 == m_nEntryType) || (6 == m_nEntryType)
|
||
|| (8 == m_nEntryType))
|
||
{
|
||
dAng = m_dbAssisAng - 0.5*_PI;
|
||
}
|
||
|
||
ads_point ptNewStart;
|
||
if (m_LineArr1[0] != NULL)
|
||
{
|
||
if(!!m_ptDrawSupply)
|
||
{
|
||
m_LineArr1[0]->SetStartPt(m_ptDrawSupply);
|
||
}
|
||
else
|
||
{
|
||
m_LineArr1[0]->GetStartPt(ptNewStart);
|
||
acutPolar(ptNewStart, dAng+m_dbPGAng + m_dbNormAng, m_dToWallTB, ptNewStart);
|
||
m_LineArr1[0]->SetStartPt(ptNewStart);
|
||
m_ptDrawSupply = ptNewStart;
|
||
}
|
||
}
|
||
|
||
if (m_LineArr3[0] != NULL)
|
||
{
|
||
if(!!m_ptDrawReturn)
|
||
{
|
||
m_LineArr3[0]->SetStartPt(m_ptDrawReturn);
|
||
}
|
||
else
|
||
{
|
||
m_LineArr3[0]->GetStartPt(ptNewStart);
|
||
acutPolar(ptNewStart, dAng+m_dbPGAng + m_dbNormAng, m_dToWallTB, ptNewStart);
|
||
m_LineArr3[0]->SetStartPt(ptNewStart);
|
||
m_ptDrawReturn = ptNewStart;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
// 处理相同间距
|
||
// 注:主体区域宽度(左右宽度-距墙距离)必须是间距的奇数倍
|
||
// 各区的管线数量均为偶数
|
||
void CPipeStyle4::DealSameDist()
|
||
{
|
||
double dWidth = GetLRDist() - 2*m_dToWallLR; // 主体区宽度
|
||
|
||
int nNum = (int)(dWidth/m_nDist);
|
||
double dDifferent = dWidth - nNum*m_nDist; // 差值
|
||
if (!IsEvenNum(nNum)) // 奇数
|
||
{
|
||
m_dToWallLR = m_dToWallTB + dDifferent/2;
|
||
m_nNum = nNum - 1;
|
||
}
|
||
else // 偶数
|
||
{
|
||
m_dToWallLR = m_dToWallTB + (dDifferent+m_nDist)/2;
|
||
m_nNum = nNum - 2;
|
||
}
|
||
|
||
m_nLeftNum = 2;
|
||
m_nRightNum = 0;
|
||
m_dbSideDist = m_nDist; // 左区距中区、中区距右区距离
|
||
}
|
||
|
||
// 处理不同间距
|
||
// 注:任意区域宽度必须是间距的奇数倍
|
||
void CPipeStyle4::DealDifferentDist()
|
||
{
|
||
// 1、初算m_nLeftNum、m_nRightNum
|
||
double dLeftArea = GetLeftAreaDist(); // 获得左区域的宽度,包括距墙距离
|
||
int nLeftNum = (int)((dLeftArea-m_dToWallLR)/m_nLeftDist);
|
||
if (nLeftNum < 1) // <=m_dToWallLR,没有左区
|
||
{
|
||
nLeftNum = 1; // 左区必须要有两根
|
||
m_nLeftDist = m_nDist;
|
||
}
|
||
else if (IsEvenNum(nLeftNum)) // 偶数
|
||
{
|
||
nLeftNum -= 1; // 间距要求必须是奇数
|
||
}
|
||
|
||
double dRightArea = GetRightAreaDist(); // 获得右区域的宽度
|
||
int nRightNum = (int)((dRightArea-m_dToWallLR)/m_nRightDist);
|
||
if (nRightNum < 1) // <=m_dToWallLR,没有右区
|
||
{
|
||
nRightNum = -1;
|
||
m_nRightDist = m_nDist;
|
||
}
|
||
else if (IsEvenNum(nRightNum))
|
||
{
|
||
nRightNum -= 1; // 间距要求必须是奇数
|
||
}
|
||
|
||
m_nLeftNum = nLeftNum + 1;
|
||
m_nRightNum = nRightNum + 1;
|
||
|
||
// 2、计算m_nNum
|
||
double dMidArea = GetMidAreaDist(); // 中间区域宽度
|
||
int nNum = (int)(dMidArea/m_nDist);
|
||
if (nNum < 2) // <=m_nDist,没有中区
|
||
{
|
||
m_nNum = 0;
|
||
m_dbSideDist = dMidArea;
|
||
return;
|
||
}
|
||
|
||
double dDifference = dMidArea - nNum*m_nDist; // 差值
|
||
if (!IsEvenNum(nNum)) // 奇数
|
||
{
|
||
m_nNum = nNum - 1;
|
||
m_dbSideDist = m_nDist + dDifference/2; // 各个区域之间的间距
|
||
}
|
||
else // 偶数
|
||
{
|
||
m_nNum = nNum;
|
||
m_dbSideDist = (m_nDist + dDifference)/2;
|
||
}
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 初始化LINEARR数组
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 短线
|
||
// 注:长线数量与短线数量一定是相等的,都为(m_nLeftNum+m_nNum+m_nRightNum)/2
|
||
void CPipeStyle4::CreateLine1Arr()
|
||
{
|
||
// 第一根直线长度
|
||
double dbLen = GetTBDist() - m_dToWallTB - m_nDistB - m_dbArcRadius;
|
||
|
||
ads_point StartPtIn; // 入口起点
|
||
switch(m_nEntryType) // 判断入口
|
||
{
|
||
case 1:
|
||
m_dbAssisAng = 0.0;
|
||
acutPolar(m_ptLB, 0, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 2:
|
||
m_dbAssisAng = 0.5*_PI;
|
||
acutPolar(m_ptLB, 0.5*_PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 3:
|
||
m_dbAssisAng = 1.5*_PI;
|
||
acutPolar(m_ptLT, 1.5*_PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 4:
|
||
m_dbAssisAng = 0;
|
||
acutPolar(m_ptLT, 0, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 5:
|
||
m_dbAssisAng = _PI;
|
||
acutPolar(m_ptRT, _PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 6:
|
||
m_dbAssisAng = 1.5*_PI;
|
||
acutPolar(m_ptRT, 1.5*_PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 7:
|
||
m_dbAssisAng = 0.5*_PI;
|
||
acutPolar(m_ptRB, 0.5*_PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 8:
|
||
m_dbAssisAng = _PI;
|
||
acutPolar(m_ptRB, _PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
|
||
double dAng(m_dbAssisAng + 0.5*_PI); // 统一代码使用
|
||
if ((2 == m_nEntryType) || (4 == m_nEntryType) || (6 == m_nEntryType)
|
||
|| (8 == m_nEntryType))
|
||
{
|
||
dAng = m_dbAssisAng - 0.5*_PI;
|
||
}
|
||
|
||
//dyw add 20150416
|
||
BOOL bPickExist = !!m_ptPickEntry;
|
||
double dOffset = 0.0;
|
||
if(bPickExist)
|
||
{
|
||
XPoint ptVirPick;
|
||
TransToVirtualPt(m_ptPickEntry, ptVirPick);
|
||
//绘制任意开口多出的一圈
|
||
ads_point ptTmpS, ptTmpE; //开口线的起点和终点
|
||
XPoint ptTmpPro; //选取点的映射点
|
||
double dLRExWallDist = GetLRDist() - 2 * m_dToWallLR; //去掉距墙距离的虚拟左右距离
|
||
|
||
acutPolar(StartPtIn, dAng, m_dToWallTB, ptTmpS);
|
||
acutPolar(ptTmpS, m_dbAssisAng, dLRExWallDist, ptTmpE);
|
||
XLine ptTmpLine(ptTmpS, ptTmpE);
|
||
ptVirPick.Project(&ptTmpLine, ptTmpPro);
|
||
|
||
double dStartToProDist = acutDistance(ptTmpS, ptTmpPro); //起点到映射点的距离
|
||
double dEndToProDist = acutDistance(ptTmpE, ptTmpPro); //终点到映射点的距离
|
||
|
||
if(PtInLine(ptTmpLine, ptTmpPro))
|
||
{
|
||
|
||
double dRgAreaDist = m_nLeftDist;
|
||
if(m_nNum < 2 && m_nRightNum < 2) //没有右区和中区的时候
|
||
{
|
||
dRgAreaDist = m_nLeftDist;
|
||
}
|
||
else if(m_nRightNum < 2) //没有右区的时候
|
||
{
|
||
dRgAreaDist = m_nDist;
|
||
}
|
||
else //全有的时候
|
||
{
|
||
dRgAreaDist = m_nRightDist;
|
||
}
|
||
|
||
if(dEndToProDist < dRgAreaDist + 1E-6) //映射点在离终点一个间距的时候开口转换
|
||
{
|
||
ChangeEntry(StartPtIn);
|
||
}
|
||
else if(dStartToProDist < m_nLeftDist + 1E-6) //映射点在起始点间距距离内的位置
|
||
{}
|
||
else
|
||
{
|
||
/*
|
||
| |
|
||
| |
|
||
| -----------6--------------
|
||
| |5
|
||
------1------- ----2------
|
||
3| |4
|
||
*/
|
||
m_bDefaultEntry = FALSE;
|
||
|
||
ads_point ptLine2SAct; //线段2的起点的实际位置
|
||
double dLineLen = 0.0; //计算每根线的长度
|
||
|
||
//起始点到映射点的线段 (线段1)
|
||
dLineLen = dStartToProDist - 2 * m_dbArcRadius - m_nLeftDist / 2;
|
||
acutPolar(ptTmpS, m_dbAssisAng, m_dbArcRadius, ptTmpS);
|
||
TransToActualPt(ptTmpS, ptTmpS);
|
||
CPipeLine *pLine = new CPipeLine(ptTmpS, m_dbPGAng, dLineLen, m_dbAssisAng, m_dbNormAng);
|
||
m_LineArr5.Add(pLine);
|
||
|
||
//终点到映射点的距离 (线段2)
|
||
dLineLen = dEndToProDist - 2 * m_dbArcRadius - m_nLeftDist / 2;
|
||
acutPolar(ptTmpPro, m_dbAssisAng, m_nLeftDist / 2 + m_dbArcRadius, ptLine2SAct);
|
||
TransToActualPt(ptLine2SAct, ptLine2SAct);
|
||
pLine = new CPipeLine(ptLine2SAct, m_dbPGAng, dLineLen, m_dbAssisAng, m_dbNormAng);
|
||
m_LineArr5.Add(pLine);
|
||
|
||
ads_point ptSupEtry, ptRetEtry; //供水口的的起始点
|
||
acutPolar(ptTmpPro, m_dbAssisAng, m_nLeftDist / 2, ptRetEtry);
|
||
acutPolar(ptTmpPro, m_dbAssisAng + PI, m_nLeftDist / 2, ptSupEtry);
|
||
|
||
//开口的供水线 绘制长度固定为100 (线段3)
|
||
dLineLen = 100 - m_dbArcRadius;
|
||
acutPolar(ptSupEtry, dAng + PI, m_dbArcRadius, ptSupEtry);
|
||
TransToActualPt(ptSupEtry, ptSupEtry);
|
||
pLine = new CPipeLine(ptSupEtry, m_dbPGAng, dLineLen, dAng + PI, m_dbNormAng);
|
||
m_LineArr5.Add(pLine);
|
||
|
||
//开口的回水线 绘制长度固定为100 (线段4)
|
||
acutPolar(ptRetEtry, dAng + PI, m_dbArcRadius, ptRetEtry);
|
||
TransToActualPt(ptRetEtry, ptRetEtry);
|
||
pLine = new CPipeLine(ptRetEtry, m_dbPGAng, dLineLen, dAng + PI, m_dbNormAng);
|
||
m_LineArr5.Add(pLine);
|
||
|
||
//封口线 (线段5)
|
||
dLineLen = m_nLeftDist - 2 * m_dbArcRadius;
|
||
acutPolar(ptTmpE, dAng, m_dbArcRadius, ptTmpE);
|
||
TransToActualPt(ptTmpE, ptTmpE);
|
||
pLine = new CPipeLine(ptTmpE, m_dbPGAng, dLineLen, dAng, m_dbNormAng);
|
||
m_LineArr5.Add(pLine);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(dEndToProDist - dStartToProDist < 1E-6) //点不在线上, 如果距终点距离近则需要转换开口方向
|
||
{
|
||
ChangeEntry(StartPtIn);
|
||
}
|
||
}
|
||
|
||
//调整绘制下面盘管的起始点
|
||
if(!m_bDefaultEntry)
|
||
{
|
||
dOffset = 2 * m_nLeftDist;
|
||
dbLen = dbLen - dOffset;
|
||
acutPolar(StartPtIn, dAng, dOffset, StartPtIn);
|
||
}
|
||
}
|
||
|
||
ads_point actPt, pt; // 实际点、临时点
|
||
TransToActualPt(StartPtIn, actPt);
|
||
CPipeLine *line1 = new CPipeLine(actPt, m_dbPGAng, dbLen, dAng, m_dbNormAng);
|
||
m_LineArr1.Add(line1); // 第一根线
|
||
|
||
int i(1),
|
||
nSize = m_nLeftNum/2;
|
||
dbLen = GetTBDist() - 2*(m_dToWallTB+m_nDistB+m_dbArcRadius); // 长度
|
||
|
||
//dyw add
|
||
dbLen = dbLen - dOffset;
|
||
//end
|
||
for (i = 1; i < nSize; i++) // 左区
|
||
{
|
||
ads_point lastPt, virPt; // 前一直线的起点、虚拟点
|
||
m_LineArr1[i-1]->GetStartPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
|
||
acutPolar(virPt, m_dbAssisAng, 2*m_nLeftDist, pt);
|
||
if (i == 1) // 中区第二根
|
||
{
|
||
acutPolar(pt, dAng, (m_dToWallTB+m_nDistB+m_dbArcRadius), pt);
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
|
||
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, dAng, m_dbNormAng);
|
||
m_LineArr1.Add(line);
|
||
}
|
||
|
||
i = nSize;
|
||
nSize += m_nNum/2;
|
||
for (; i < nSize; i++) // 中区
|
||
{
|
||
ads_point lastPt, virPt; // 前一直线的起点,虚拟点
|
||
m_LineArr1[i-1]->GetStartPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
|
||
if (i == m_nLeftNum/2) // 中区第一根
|
||
{
|
||
acutPolar(virPt, m_dbAssisAng, (m_nLeftDist+m_dbSideDist), pt);
|
||
if (m_nLeftNum == 2) // 相当于没有左区
|
||
{
|
||
acutPolar(pt, dAng, (m_dToWallTB+m_nDistB+m_dbArcRadius), pt);
|
||
}
|
||
}
|
||
else // 其他的
|
||
{
|
||
acutPolar(virPt, m_dbAssisAng, 2*m_nDist, pt);
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
|
||
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, dAng, m_dbNormAng);
|
||
m_LineArr1.Add(line);
|
||
}
|
||
|
||
i = nSize;
|
||
nSize += m_nRightNum/2;
|
||
for (; i < nSize; i++) // 右区
|
||
{
|
||
ads_point lastPt, virPt; // 前一直线的起点,虚拟点
|
||
m_LineArr1[i-1]->GetStartPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
|
||
if (i == (m_nLeftNum+m_nNum)/2) // 右区第一根
|
||
{
|
||
if (m_nNum == 0) // 没有中区,直接接左区
|
||
{
|
||
acutPolar(virPt, m_dbAssisAng, (m_nLeftDist+m_dbSideDist), pt);
|
||
}
|
||
else // 接中区
|
||
{
|
||
acutPolar(virPt, m_dbAssisAng, (m_nDist+m_dbSideDist), pt);
|
||
}
|
||
|
||
if ((2 == m_nLeftNum) && (0 == m_nNum)) // 相当于没有左、中区
|
||
{
|
||
acutPolar(pt, dAng, (m_dToWallTB+m_nDistB+m_dbArcRadius), pt);
|
||
}
|
||
}
|
||
else // 其他的
|
||
{
|
||
acutPolar(virPt, m_dbAssisAng, 2*m_nRightDist, pt);
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
|
||
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, dAng, m_dbNormAng);
|
||
m_LineArr1.Add(line);
|
||
}
|
||
}
|
||
|
||
// 长线
|
||
void CPipeStyle4::CreateLine3Arr()
|
||
{
|
||
double dbLen = GetTBDist() - m_dToWallTB - m_dbArcRadius; // 直线长
|
||
|
||
double dAng(m_dbAssisAng + 0.5*_PI); // 统一代码使用
|
||
if ((2 == m_nEntryType) || (4 == m_nEntryType) || (6 == m_nEntryType)
|
||
|| (8 == m_nEntryType))
|
||
{
|
||
dAng = m_dbAssisAng - 0.5*_PI;
|
||
}
|
||
|
||
//add dyw
|
||
BOOL bPickExist = !!m_ptPickEntry;
|
||
if(bPickExist && !m_bDefaultEntry)
|
||
{
|
||
ads_point ptStart;
|
||
if(m_LineArr1.GetSize() > 0)
|
||
{
|
||
//找到回水的口
|
||
m_LineArr1[0]->GetStartPt(ptStart);
|
||
TransToVirtualPt(ptStart, ptStart);
|
||
acutPolar(ptStart, dAng + PI, m_nLeftDist - m_dToWallTB, ptStart);
|
||
acutPolar(ptStart, m_dbAssisAng, m_nLeftDist + m_dbArcRadius, ptStart);
|
||
|
||
//绘制开口那一圈的回水线 (线段6)
|
||
double dLRExWallDist = GetLRDist() - 2 * m_dToWallLR - m_nLeftDist - 2 * m_dbArcRadius;
|
||
TransToActualPt(ptStart, ptStart);
|
||
CPipeLine *pLine = new CPipeLine(ptStart, m_dbPGAng, dLRExWallDist, m_dbAssisAng, m_dbNormAng);
|
||
m_LineArr5.Add(pLine);
|
||
}
|
||
|
||
dbLen -= 2 * m_nLeftDist;
|
||
}
|
||
//add end
|
||
|
||
int i(0),
|
||
nSize = m_nLeftNum/2;
|
||
ads_point lastPt, virPt, actPt, pt; // 前一组直线的终点、虚拟点、实际点、临时点
|
||
for (i = 0; i < nSize; i++) // 左区
|
||
{
|
||
if (i == 0) // 第一根(输出管)
|
||
{
|
||
m_LineArr1[0]->GetStartPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
acutPolar(virPt, m_dbAssisAng, m_nLeftDist, pt);
|
||
}
|
||
else // 其他
|
||
{
|
||
m_LineArr3[i-1]->GetStartPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
acutPolar(virPt, m_dbAssisAng, 2*m_nLeftDist, pt);
|
||
|
||
if (i == 1) // 第二根
|
||
{
|
||
dbLen -= m_dToWallTB + m_dbArcRadius; // 调整长度
|
||
acutPolar(pt, dAng, (m_dToWallTB+m_dbArcRadius), pt);
|
||
}
|
||
|
||
if ((i == nSize-1) && (m_nNum == 0) && (m_nRightNum == 0)) // 最后一根
|
||
{
|
||
dbLen -= m_nDistB; // 所有中的最后一根,调整长度
|
||
if (IsEvenNum(nSize)) // 末尾圆弧向下
|
||
{
|
||
acutPolar(pt, dAng, m_nDistB, pt);
|
||
}
|
||
}
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
|
||
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, dAng, m_dbNormAng);
|
||
m_LineArr3.Add(line);
|
||
}
|
||
|
||
i = nSize;
|
||
nSize += m_nNum/2;
|
||
for (; i < nSize; i++) // 中区
|
||
{
|
||
m_LineArr3[i-1]->GetStartPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
|
||
if (i == m_nLeftNum/2)
|
||
{
|
||
acutPolar(virPt, m_dbAssisAng, (m_dbSideDist+m_nDist), pt);
|
||
if (m_nLeftNum == 2) // 相当于没有左区
|
||
{
|
||
dbLen -= m_dToWallTB + m_dbArcRadius;
|
||
acutPolar(pt, dAng, (m_dToWallTB+m_dbArcRadius), pt);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
acutPolar(pt, m_dbAssisAng, 2*m_nDist, pt);
|
||
}
|
||
|
||
if ((i == nSize-1) && (m_nRightNum == 0)) // 最后一根
|
||
{
|
||
dbLen -= m_nDistB; // 所有中的最后一根,调整长度
|
||
if (IsEvenNum(nSize)) // 末尾圆弧向下
|
||
{
|
||
acutPolar(pt, dAng, m_nDistB, pt);
|
||
}
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
|
||
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, dAng, m_dbNormAng);
|
||
m_LineArr3.Add(line);
|
||
}
|
||
|
||
i = nSize;
|
||
nSize += m_nRightNum/2;
|
||
for (; i < nSize; i++) // 右区
|
||
{
|
||
m_LineArr3[i-1]->GetStartPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
|
||
if (i == (m_nLeftNum+m_nNum)/2)
|
||
{
|
||
acutPolar(virPt, m_dbAssisAng, (m_dbSideDist+m_nRightDist), pt);
|
||
if ((2 == m_nLeftNum) && (0 == m_nNum)) // 相当于没有左、中区
|
||
{
|
||
dbLen -= m_dToWallTB + m_dbArcRadius;
|
||
acutPolar(pt, dAng, (m_dToWallTB+m_dbArcRadius), pt);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
acutPolar(pt, m_dbAssisAng, 2*m_nRightDist, pt);
|
||
}
|
||
|
||
if (i == nSize - 1) // 最后一根,调整长度
|
||
{
|
||
dbLen -= m_nDistB;
|
||
if (IsEvenNum(nSize)) // 末尾圆弧向下
|
||
{
|
||
acutPolar(pt, dAng, m_nDistB, pt);
|
||
}
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
|
||
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, dAng, m_dbNormAng);
|
||
m_LineArr3.Add(line);
|
||
}
|
||
}
|
||
|
||
// 短线连接弧中的直线,包括末尾圆弧
|
||
void CPipeStyle4::CreateLine2Arr()
|
||
{
|
||
double dbLen(0); // 直线长
|
||
ads_point lastPt, virPt, actPt; // 前一组直线的终点,虚拟点,实际点
|
||
BOOL bIsUp(TRUE); // 是否顶部
|
||
|
||
double dUpAng = m_dbAssisAng - 0.5*_PI, // 角度,统一代码使用
|
||
dDownAng = m_dbAssisAng + 0.5*_PI;
|
||
if ((2 == m_nEntryType) || (4 == m_nEntryType) || (6 == m_nEntryType)
|
||
|| (8 == m_nEntryType))
|
||
{
|
||
TchPrivate::Exchange(dUpAng, dDownAng);
|
||
}
|
||
|
||
int nSize = (int)m_LineArr1.GetSize();
|
||
for (int i = 0; i < nSize; i++)
|
||
{
|
||
ads_point endPt, virEndPt, pt; // 下一根的起点、虚拟点、临时点
|
||
if (bIsUp)
|
||
{
|
||
m_LineArr1[i]->GetEndPt(lastPt);
|
||
if (i == nSize-1) // 最后一根
|
||
{
|
||
m_LineArr3[i]->GetEndPt(endPt);
|
||
}
|
||
else
|
||
{
|
||
m_LineArr1[i+1]->GetEndPt(endPt);
|
||
}
|
||
bIsUp = false;
|
||
}
|
||
else
|
||
{
|
||
m_LineArr1[i]->GetStartPt(lastPt);
|
||
if (i == nSize-1) // 最后一根
|
||
{
|
||
m_LineArr3[i]->GetStartPt(endPt);
|
||
}
|
||
else
|
||
{
|
||
m_LineArr1[i+1]->GetStartPt(endPt);
|
||
}
|
||
bIsUp = true;
|
||
}
|
||
TransToVirtualPt(lastPt, virPt);
|
||
TransToVirtualPt(endPt, virEndPt);
|
||
|
||
double dDistance = XPoint(virPt).Distance(XPoint(virEndPt));
|
||
dbLen = dDistance - 2*m_dbArcRadius; // 直线长度
|
||
|
||
acutPolar(virPt, m_dbAssisAng, m_dbArcRadius, pt);
|
||
if (!bIsUp)
|
||
{
|
||
acutPolar(pt, dDownAng, m_dbArcRadius, pt);
|
||
}
|
||
else
|
||
{
|
||
acutPolar(pt, dUpAng, m_dbArcRadius, pt);
|
||
}
|
||
|
||
TransToActualPt(pt, actPt);
|
||
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, m_dbAssisAng,
|
||
m_dbNormAng);
|
||
m_LineArr2.Add(line);
|
||
}
|
||
}
|
||
|
||
// 长线连接弧中的直线
|
||
void CPipeStyle4::CreateLine4Arr()
|
||
{
|
||
double dbLen(0); // 直线长
|
||
ads_point lastPt, virPt, actPt; // 前一组直线的终点,虚拟点,实际点
|
||
bool bIsUp = true; // 是否顶部
|
||
|
||
double dUpAng = m_dbAssisAng - 0.5*_PI, // 角度,统一代码使用
|
||
dDownAng = m_dbAssisAng + 0.5*_PI;
|
||
if ((2 == m_nEntryType) || (4 == m_nEntryType) || (6 == m_nEntryType)
|
||
|| (8 == m_nEntryType))
|
||
{
|
||
TchPrivate::Exchange(dUpAng, dDownAng);
|
||
}
|
||
|
||
int nSize = (int)m_LineArr3.GetSize();
|
||
for (int i = 0; i < nSize; i++)
|
||
{
|
||
if (nSize-1 == i)
|
||
{
|
||
break;
|
||
}
|
||
|
||
ads_point endPt, virEndPt, pt; // 下一根的起点、虚拟点、临时点
|
||
if (bIsUp)
|
||
{
|
||
m_LineArr3[i]->GetEndPt(lastPt);
|
||
m_LineArr3[i+1]->GetEndPt(endPt);
|
||
bIsUp = false;
|
||
}
|
||
else
|
||
{
|
||
m_LineArr3[i]->GetStartPt(lastPt);
|
||
m_LineArr3[i+1]->GetStartPt(endPt);
|
||
bIsUp = true;
|
||
}
|
||
TransToVirtualPt(lastPt, virPt);
|
||
TransToVirtualPt(endPt, virEndPt);
|
||
|
||
double dDistance = XPoint(virPt).Distance(XPoint(virEndPt));
|
||
dbLen = dDistance - 2*m_dbArcRadius; // 直线长度
|
||
|
||
acutPolar(virPt, m_dbAssisAng, m_dbArcRadius, pt);
|
||
if (!bIsUp)
|
||
{
|
||
acutPolar(pt, dDownAng, m_dbArcRadius, pt);
|
||
}
|
||
else
|
||
{
|
||
acutPolar(pt, dUpAng, m_dbArcRadius, pt);
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, m_dbAssisAng,
|
||
m_dbNormAng);
|
||
m_LineArr4.Add(line);
|
||
}
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 处理弧线
|
||
//////////////////////////////////////////////////////////////////////
|
||
bool CPipeStyle4::CreateArcArr( XExplodeDraw &dc,AcDbObjectId idRetLayer /*= AcDbObjectId::kNull*/ )
|
||
{
|
||
ads_point StartPtL, EndPtL, StartPtR, EndPtR; // 左右圆弧起点,圆弧终点
|
||
AcDbObjectId ArcIDL, ArcIDR; // 左右圆弧实体ID
|
||
ads_point CenPtL, CenPtR; // 左右圆弧中心点
|
||
bool bIsUp = true; // 是否顶部圆弧
|
||
|
||
int i(0), // sg modify
|
||
nSize = (int)m_LineArr1.GetSize();
|
||
AcDbObjectId idOrigLayer = dc.GetLayerId();
|
||
for (i = 0; i < nSize-1; i++) // 连接1、2边直线
|
||
{
|
||
if (bIsUp)
|
||
{
|
||
m_LineArr2[i]->GetStartPt(StartPtL);
|
||
m_LineArr1[i]->GetEndPt(EndPtL);
|
||
m_LineArr1[i+1]->GetEndPt(StartPtR);
|
||
m_LineArr2[i]->GetEndPt(EndPtR);
|
||
GetArcCenterPt(EndPtL, 0, CenPtL);
|
||
GetArcCenterPt(EndPtR, -0.5*_PI, CenPtR);
|
||
bIsUp = false;
|
||
}
|
||
else
|
||
{
|
||
m_LineArr1[i]->GetStartPt(StartPtL);
|
||
m_LineArr2[i]->GetStartPt(EndPtL);
|
||
m_LineArr2[i]->GetEndPt(StartPtR);
|
||
m_LineArr1[i+1]->GetStartPt(EndPtR);
|
||
GetArcCenterPt(EndPtL, -1.5*_PI, CenPtL);
|
||
GetArcCenterPt(EndPtR, _PI, CenPtR);
|
||
bIsUp = true;
|
||
}
|
||
|
||
if ((1 == m_nEntryType) || (3 == m_nEntryType) || (5 == m_nEntryType)
|
||
|| (7 == m_nEntryType))
|
||
{
|
||
if (!CreateArc(StartPtL, EndPtL, CenPtL, ArcIDL,dc))
|
||
{
|
||
return false;
|
||
}
|
||
if (!CreateArc(StartPtR, EndPtR, CenPtR, ArcIDR,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else // 反画圆弧
|
||
{
|
||
if (!CreateArc(EndPtL, StartPtL, CenPtL, ArcIDL,dc))
|
||
{
|
||
return false;
|
||
}
|
||
if (!CreateArc(EndPtR, StartPtR, CenPtR, ArcIDR,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
m_ArcArr.Add(ArcIDL);
|
||
m_ArcArr.Add(ArcIDR);
|
||
}
|
||
|
||
if (idRetLayer.isValid())
|
||
dc.SetLayer(idRetLayer);
|
||
|
||
bIsUp = true;
|
||
nSize = (int)m_LineArr3.GetSize();
|
||
for (i = 0; i < nSize-1; i++) // 连接3、4边直线
|
||
{
|
||
if (bIsUp)
|
||
{
|
||
m_LineArr4[i]->GetStartPt(StartPtL);
|
||
m_LineArr3[i]->GetEndPt(EndPtL);
|
||
m_LineArr3[i+1]->GetEndPt(StartPtR);
|
||
m_LineArr4[i]->GetEndPt(EndPtR);
|
||
GetArcCenterPt(EndPtL, 0, CenPtL);
|
||
GetArcCenterPt(EndPtR, -0.5*_PI, CenPtR);
|
||
bIsUp = false;
|
||
}
|
||
else
|
||
{
|
||
m_LineArr3[i]->GetStartPt(StartPtL);
|
||
m_LineArr4[i]->GetStartPt(EndPtL);
|
||
m_LineArr4[i]->GetEndPt(StartPtR);
|
||
m_LineArr3[i+1]->GetStartPt(EndPtR);
|
||
GetArcCenterPt(EndPtL, -1.5*_PI, CenPtL);
|
||
GetArcCenterPt(EndPtR, _PI, CenPtR);
|
||
bIsUp = true;
|
||
}
|
||
|
||
switch(m_nEntryType)
|
||
{
|
||
case 1:
|
||
case 3:
|
||
case 5:
|
||
case 7:
|
||
if (!CreateArc(StartPtL, EndPtL, CenPtL, ArcIDL,dc))
|
||
{
|
||
return false;
|
||
}
|
||
if (!CreateArc(StartPtR, EndPtR, CenPtR, ArcIDR,dc))
|
||
{
|
||
return false;
|
||
}
|
||
break;
|
||
case 2:
|
||
case 4:
|
||
case 6:
|
||
case 8:
|
||
if (!CreateArc(EndPtL, StartPtL, CenPtL, ArcIDL,dc))
|
||
{
|
||
return false;
|
||
}
|
||
if (!CreateArc(EndPtR, StartPtR, CenPtR, ArcIDR,dc))
|
||
{
|
||
return false;
|
||
}
|
||
break;
|
||
default:
|
||
return false;
|
||
}
|
||
m_ArcArr.Add(ArcIDL);
|
||
m_ArcArr.Add(ArcIDR);
|
||
}
|
||
|
||
dc.SetLayer(idOrigLayer);
|
||
if (!IsEvenNum((m_nLeftNum+m_nNum+m_nRightNum)/2)) // 连接1、3的最后一根线
|
||
{
|
||
m_LineArr2[nSize-1]->GetStartPt(StartPtL);
|
||
m_LineArr1[nSize-1]->GetEndPt(EndPtL);
|
||
m_LineArr3[nSize-1]->GetEndPt(StartPtR);
|
||
m_LineArr2[i]->GetEndPt(EndPtR);
|
||
GetArcCenterPt(EndPtL, 0, CenPtL);
|
||
GetArcCenterPt(EndPtR, -0.5*_PI, CenPtR);
|
||
bIsUp = false;
|
||
}
|
||
else
|
||
{
|
||
m_LineArr1[nSize-1]->GetStartPt(StartPtL);
|
||
m_LineArr2[nSize-1]->GetStartPt(EndPtL);
|
||
m_LineArr2[nSize-1]->GetEndPt(StartPtR);
|
||
m_LineArr3[nSize-1]->GetStartPt(EndPtR);
|
||
GetArcCenterPt(EndPtL, -1.5*_PI, CenPtL);
|
||
GetArcCenterPt(EndPtR, _PI, CenPtR);
|
||
bIsUp = true;
|
||
}
|
||
|
||
if ((1 == m_nEntryType) || (3 == m_nEntryType) || (5 == m_nEntryType)
|
||
|| (7 == m_nEntryType))
|
||
{
|
||
if (!CreateArc(StartPtL, EndPtL, CenPtL, ArcIDL,dc))
|
||
{
|
||
return false;
|
||
}
|
||
if (!CreateArc(StartPtR, EndPtR, CenPtR, ArcIDR,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else // 反画圆弧
|
||
{
|
||
if (!CreateArc(EndPtL, StartPtL, CenPtL, ArcIDL,dc))
|
||
{
|
||
return false;
|
||
}
|
||
if (!CreateArc(EndPtR, StartPtR, CenPtR, ArcIDR,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
m_ArcArr.Add(ArcIDL);
|
||
m_ArcArr.Add(ArcIDR);
|
||
|
||
// add by myy 2015-2-2
|
||
if (!!m_ptPickEntry && !m_bDefaultEntry && m_LineArr5.GetSize() == 6)
|
||
{
|
||
for (i = 0; i < 3; i++)
|
||
{
|
||
switch (i)
|
||
{
|
||
case 0:
|
||
{
|
||
m_LineArr1[0]->GetStartPt(StartPtL);
|
||
m_LineArr5[0]->GetStartPt(EndPtL);
|
||
m_LineArr5[2]->GetStartPt(StartPtR);
|
||
m_LineArr5[0]->GetEndPt(EndPtR);
|
||
GetArcCenterPt(EndPtL, -1.5*_PI, CenPtL);
|
||
GetArcCenterPt(EndPtR, -0.5*_PI, CenPtR);
|
||
dc.SetLayer(idOrigLayer);
|
||
break;
|
||
}
|
||
case 1:
|
||
{
|
||
m_LineArr5[1]->GetStartPt(StartPtL);
|
||
m_LineArr5[3]->GetStartPt(EndPtL);
|
||
m_LineArr5[1]->GetEndPt(StartPtR);
|
||
m_LineArr5[4]->GetStartPt(EndPtR);
|
||
GetArcCenterPt(EndPtL, 0, CenPtL);
|
||
GetArcCenterPt(EndPtR, _PI, CenPtR);
|
||
dc.SetLayer(idRetLayer);
|
||
break;
|
||
}
|
||
case 2:
|
||
{
|
||
m_LineArr3[0]->GetStartPt(StartPtL);
|
||
m_LineArr5[5]->GetStartPt(EndPtL);
|
||
m_LineArr5[5]->GetEndPt(EndPtR);
|
||
m_LineArr5[4]->GetEndPt(StartPtR);
|
||
GetArcCenterPt(EndPtL, -1.5*_PI, CenPtL);
|
||
GetArcCenterPt(StartPtR, -_PI, CenPtR);
|
||
dc.SetLayer(idRetLayer);
|
||
break;
|
||
}
|
||
}
|
||
|
||
if ((1 == m_nEntryType) || (3 == m_nEntryType) || (5 == m_nEntryType) || (7 == m_nEntryType))
|
||
{
|
||
if (!CreateArc(StartPtL, EndPtL, CenPtL, ArcIDL,dc))
|
||
{
|
||
return false;
|
||
}
|
||
if (!CreateArc(StartPtR, EndPtR, CenPtR, ArcIDR,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else // 反画圆弧
|
||
{
|
||
if (!CreateArc(EndPtL, StartPtL, CenPtL, ArcIDL,dc))
|
||
{
|
||
return false;
|
||
}
|
||
if (!CreateArc(EndPtR, StartPtR, CenPtR, ArcIDR,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
m_ArcArr.Add(ArcIDL);
|
||
m_ArcArr.Add(ArcIDR);
|
||
}
|
||
}
|
||
// add end
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
/*----------------------------------------------------------------------------*
|
||
* 函数名称: CPipeStyle2::CreateArc()
|
||
* 功能描述: 创建圆弧
|
||
* 参 数: [in] StartPt:圆弧起点
|
||
[in] EndPt:圆弧终点
|
||
[in] CenPt:圆弧圆心
|
||
[out] ObjID:圆弧实体ID
|
||
* 返 回 值: 创建是否成功,true:成功,false:失败
|
||
* 历 史:
|
||
* 备 注: 自定义实体用
|
||
-----------------------------------------------------------------------------*/
|
||
bool CPipeStyle4::CreateArc(ads_point StartPt, ads_point EndPt, ads_point CenPt,
|
||
AcDbObjectId &ObjID, XExplodeDraw &dc)
|
||
{
|
||
if (fabs(m_dbArcRadius) < 1.0E-5) // sg add
|
||
{
|
||
return true; // 曲率半径为0时不绘制
|
||
}
|
||
|
||
double StartAng = acutAngle(CenPt, StartPt),
|
||
EndAng = acutAngle(CenPt, EndPt);
|
||
XArc pArc(CenPt, m_dbArcRadius, StartAng, EndAng);
|
||
// dc.DrawArc(pArc,0); // sg modify
|
||
|
||
XCurveSegment seg;
|
||
seg = pArc;
|
||
// if (m_bWeight)
|
||
// if (g_bPipeWeight)
|
||
if (g_bFloorPipeWeight)
|
||
{
|
||
double dWeight = DocGetPScale() * m_dLineWeight;
|
||
DrawWeight(dc, dWeight, seg, m_nColorInd, 1.0);
|
||
}
|
||
else
|
||
{
|
||
dc << seg;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
void CPipeStyle4::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);
|
||
}
|
||
|
||
void CPipeStyle4::ChangeEntry(ads_point &StartPtIn)
|
||
{
|
||
switch(m_nEntryType) // 判断入口
|
||
{
|
||
case 8:
|
||
m_dbAssisAng = 0.0;
|
||
acutPolar(m_ptLB, 0, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 3:
|
||
m_dbAssisAng = 0.5*_PI;
|
||
acutPolar(m_ptLB, 0.5*_PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 2:
|
||
m_dbAssisAng = 1.5*_PI;
|
||
acutPolar(m_ptLT, 1.5*_PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 5:
|
||
m_dbAssisAng = 0;
|
||
acutPolar(m_ptLT, 0, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 4:
|
||
m_dbAssisAng = _PI;
|
||
acutPolar(m_ptRT, _PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 7:
|
||
m_dbAssisAng = 1.5*_PI;
|
||
acutPolar(m_ptRT, 1.5*_PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 6:
|
||
m_dbAssisAng = 0.5*_PI;
|
||
acutPolar(m_ptRB, 0.5*_PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
case 1:
|
||
m_dbAssisAng = _PI;
|
||
acutPolar(m_ptRB, _PI, m_dToWallLR, StartPtIn);
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
}
|