2119 lines
51 KiB
C++
2119 lines
51 KiB
C++
// PipeStyle2.cpp: implementation of the CPipeStyle2 class.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
#include "stdafx.h"
|
||
|
||
#include "PipeStyle2.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
|
||
|
||
BOOL PtInLine(XLine& line, AcGePoint3d& pt)
|
||
{
|
||
XPoint ptStart, ptEnd;
|
||
line.GetStartPoint(ptStart);
|
||
line.GetEndPoint(ptEnd);
|
||
|
||
double dDist1 = ptStart.Distance(pt);
|
||
double dDist2 = ptEnd.Distance(pt);
|
||
double dDist = ptStart.Distance(ptEnd);
|
||
|
||
//判断点是否在线上
|
||
if (1e-6 >= fabs(dDist1 + dDist2 - dDist))
|
||
{
|
||
return TRUE;
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Construction/Destruction
|
||
//////////////////////////////////////////////////////////////////////
|
||
CPipeStyle2::CPipeStyle2()
|
||
{
|
||
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; // 线宽
|
||
m_bDrawOutLine = FALSE;
|
||
|
||
InitVirtaulRect(); // 初始化矩形中的数据
|
||
}
|
||
|
||
// 统一间距,不考虑分区
|
||
CPipeStyle2::CPipeStyle2(XPoint rectStartPt, XPoint rectEndPt, double dbPGAng,
|
||
int nEntryType, double dRadius, double dDistToWall,
|
||
int nDistA, int nDistB, 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;
|
||
|
||
SetSameDist(TRUE, nDistA); // 统一间距
|
||
m_nDistB = nDistB; // 间距B
|
||
|
||
m_nAreaType = 0; // 划分区域的方式
|
||
m_dLeftArea = 0;
|
||
m_dRightArea = 0;
|
||
|
||
m_bWeight = bWeight; // 是否粗显
|
||
m_dLineWeight = dLineWeight; // 线宽
|
||
m_nColorInd = nColorIndex; // 颜色
|
||
m_bDrawOutLine = FALSE;
|
||
|
||
InitVirtaulRect(); // 初始化矩形中的数据
|
||
}
|
||
|
||
// 不统一间距,同时考虑分区
|
||
CPipeStyle2::CPipeStyle2(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; // 线宽
|
||
m_bDrawOutLine = FALSE;
|
||
|
||
InitVirtaulRect(); // 初始化矩形中的数据
|
||
}
|
||
|
||
// add by myy 2015-1-26
|
||
CPipeStyle2::CPipeStyle2(XPoint rectStartPt, XPoint rectEndPt, XPoint ptEntry, 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 = ptEntry;
|
||
|
||
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; // 线宽
|
||
m_bDrawOutLine = FALSE;
|
||
|
||
m_bDefaultEntry = FALSE;
|
||
|
||
InitVirtaulRect(); // 初始化矩形中的数据
|
||
}
|
||
|
||
// 初始化矩形中的数据,用于构造函数
|
||
void CPipeStyle2::InitVirtaulRect()
|
||
{
|
||
m_pOutLine = NULL;
|
||
|
||
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;
|
||
}
|
||
|
||
CPipeStyle2::~CPipeStyle2()
|
||
{
|
||
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_LineArr4.GetSize(); i++)
|
||
{
|
||
if (m_LineArr4[i] != NULL)
|
||
{
|
||
delete m_LineArr4[i];
|
||
}
|
||
}
|
||
m_LineArr4.RemoveAll();
|
||
|
||
if (m_pOutLine != NULL)
|
||
{
|
||
delete m_pOutLine;
|
||
m_pOutLine = NULL;
|
||
}
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Set函数
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 设置间距是否统一
|
||
void CPipeStyle2::SetSameDist(BOOL bSame, int nDist)
|
||
{
|
||
m_bSameDist = bSame;
|
||
if (m_bSameDist)
|
||
{
|
||
m_nLeftDist = nDist;
|
||
m_nDist = nDist;
|
||
m_nRightDist = nDist;
|
||
}
|
||
}
|
||
|
||
void CPipeStyle2::SetStartPt(ads_point rectStartPt)
|
||
{
|
||
ads_point_set(rectStartPt, m_rectStartPt);
|
||
}
|
||
|
||
void CPipeStyle2::SetPGAng(double dbPGAng)
|
||
{
|
||
m_dbPGAng = dbPGAng;
|
||
}
|
||
|
||
void CPipeStyle2::SetEntryType(int nEntryType)
|
||
{
|
||
m_nEntryType = nEntryType;
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Get函数
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 获取所有区域间距中最小的,用于倒角
|
||
double CPipeStyle2::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 CPipeStyle2::GetLeftAreaDist() // 左
|
||
{
|
||
if (m_bSameDist) // 统一间距时,不考虑宽度
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
if (m_nAreaType == 0) // 设置区域宽度
|
||
{
|
||
return m_dLeftArea;
|
||
}
|
||
|
||
double dLen = GetLRDist();
|
||
return m_dLeftArea*dLen; // 设置区域比例
|
||
}
|
||
|
||
double CPipeStyle2::GetRightAreaDist() // 右
|
||
{
|
||
if (m_bSameDist) // 统一间距时,不考虑宽度
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
if (m_nAreaType == 0) // 设置区域宽度
|
||
{
|
||
return m_dRightArea;
|
||
}
|
||
|
||
double dLen = GetLRDist();
|
||
return m_dRightArea*dLen; // 设置区域比例
|
||
}
|
||
|
||
// 获得中间区域宽度
|
||
double CPipeStyle2::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 CPipeStyle2::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 CPipeStyle2::GetCrossPts(XPoint &ptSupply, XPoint &ptReturn)
|
||
{
|
||
GetCenterPt(); // 得到中心点
|
||
GetDiagAng(); // 得到对角线锐角
|
||
GetLengthofSide(); // 得到长短边
|
||
GetVirtaulRect(); // 得到虚拟矩形
|
||
NormalizeRect(); // 3、把虚拟矩形放倒
|
||
|
||
BOOL bMultiFlag = TRUE;
|
||
double dLen = GetLRDist(),
|
||
dWidth = dLen - 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();
|
||
|
||
//add by dyw 20150423
|
||
BOOL bDrawSingle = FALSE;
|
||
int nNumOfLeft = (int)dLeftArea / m_nLeftDist;
|
||
int nNumOfMide = (int)(dLen - dLeftArea - dRightArea) / m_nDist;
|
||
int nNumOfRigh = (int)dRightArea / m_nRightDist;
|
||
if(nNumOfLeft + nNumOfMide + nNumOfRigh < 3)
|
||
{
|
||
bDrawSingle = TRUE;
|
||
}
|
||
//add end
|
||
// if (dLeftArea + dRightArea > dLen - 1.0E-5) // 仅够盘一圈
|
||
if (bDrawSingle || dLeftArea + dRightArea > dLen - 1.0E-5) // 仅够盘一圈
|
||
{
|
||
PreDrawSingle(); // 绘制一圈
|
||
bMultiFlag = FALSE;
|
||
}
|
||
else
|
||
{
|
||
DealDifferentDist();
|
||
}
|
||
}
|
||
}
|
||
|
||
if( !bMultiFlag )
|
||
{
|
||
ptSupply = m_ptDrawSupply;
|
||
ptReturn = m_ptDrawReturn;
|
||
return ;
|
||
}
|
||
CreateLeftLineArr();
|
||
CreateLine2Arr();
|
||
CreateBottomLineArr();
|
||
|
||
if (!!m_ptPickEntry && !m_bDefaultEntry)
|
||
{
|
||
ads_point ptNew;
|
||
m_LineArr4[2]->GetEndPt(ptNew);
|
||
ptReturn = ptNew;
|
||
m_LineArr4[3]->GetEndPt(ptNew);
|
||
ptSupply = ptNew;
|
||
}
|
||
else
|
||
{
|
||
ads_point ptNewStart;
|
||
|
||
if (m_LineArr1.GetSize() > 1)
|
||
{
|
||
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;
|
||
}
|
||
|
||
if (m_LineArr1[0] != NULL)
|
||
{
|
||
m_LineArr1[0]->GetStartPt(ptNewStart);
|
||
acutPolar(ptNewStart, dTemp+m_dbPGAng + m_dbNormAng, m_dToWallTB, ptNewStart);
|
||
m_LineArr1[0]->SetStartPt(ptNewStart);
|
||
|
||
ptSupply = ptNewStart;
|
||
}
|
||
}
|
||
|
||
if (m_LineArr4.GetSize() > 0)
|
||
{
|
||
m_LineArr4[0]->GetEndPt(ptNewStart);
|
||
ptReturn = ptNewStart;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 获得出口点坐标
|
||
//XPoint CPipeStyle2::GetEntryPt(int nNum)
|
||
XPoint CPipeStyle2::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 CPipeStyle2::GetLRDist()
|
||
{
|
||
double dLen = m_dbLongDist;
|
||
if ((2 == m_nEntryType) || (3 == m_nEntryType) || (6 == m_nEntryType)
|
||
|| (7 == m_nEntryType))
|
||
{
|
||
dLen = m_dbShortDist;
|
||
}
|
||
return dLen;
|
||
}
|
||
|
||
// 获取上下宽度
|
||
double CPipeStyle2::GetTBDist()
|
||
{
|
||
double dLen = m_dbShortDist;
|
||
if ((2 == m_nEntryType) || (3 == m_nEntryType) || (6 == m_nEntryType)
|
||
|| (7 == m_nEntryType))
|
||
{
|
||
dLen = m_dbLongDist;
|
||
}
|
||
return dLen;
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 构造虚拟矩形的函数
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 将矩形转换为躺倒的矩形
|
||
void CPipeStyle2::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 CPipeStyle2::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 CPipeStyle2::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 CPipeStyle2::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 CPipeStyle2::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 CPipeStyle2::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 CPipeStyle2::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 CPipeStyle2::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 CPipeStyle2::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 dLen = GetLRDist(),
|
||
dWidth = dLen - 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();
|
||
//add by dyw 20150423
|
||
BOOL bDrawSingle = FALSE;
|
||
int nNumOfLeft = (int)dLeftArea / m_nLeftDist;
|
||
int nNumOfMide = (int)(dLen - dLeftArea - dRightArea) / m_nDist;
|
||
int nNumOfRigh = (int)dRightArea / m_nRightDist;
|
||
if(nNumOfLeft + nNumOfMide + nNumOfRigh < 3)
|
||
{
|
||
bDrawSingle = TRUE;
|
||
}
|
||
//add end
|
||
// if (dLeftArea + dRightArea > dLen - 1.0E-5) // 仅够盘一圈
|
||
if (bDrawSingle || dLeftArea + dRightArea > dLen - 1.0E-5) // 仅够盘一圈
|
||
{
|
||
bool bRet = DrawSingle(dc); // 绘制一圈
|
||
return bRet;
|
||
}
|
||
else
|
||
{
|
||
if (!DrawMulti()) // 绘制多圈
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
int i = 0; // sg modify
|
||
int nSize = (int)m_LineArr1.GetSize();
|
||
AcDbObjectId idOrigLayer = dc.GetLayerId();
|
||
for (i = 0; i < nSize; i++) // 5、绘制所有管线
|
||
{
|
||
// mcl add 2010.11.14,支持区分回水图层
|
||
if (i > nSize*0.5 - 1 && idRetLayer.isValid())
|
||
dc.SetLayer(idRetLayer);
|
||
else
|
||
dc.SetLayer(idOrigLayer);
|
||
|
||
m_LineArr1[i]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
|
||
}
|
||
|
||
nSize = (int)m_LineArr2.GetSize();
|
||
for (i = 0; i < nSize; i++)
|
||
{
|
||
// mcl add 2010.11.14,支持区分回水图层
|
||
if (i > nSize*0.5 - 1 && idRetLayer.isValid())
|
||
dc.SetLayer(idRetLayer);
|
||
else
|
||
dc.SetLayer(idOrigLayer);
|
||
|
||
m_LineArr2[i]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
|
||
}
|
||
|
||
if (idRetLayer.isValid())
|
||
dc.SetLayer(idRetLayer);
|
||
|
||
for (i = 0; i < m_LineArr4.GetSize(); i++)
|
||
{
|
||
// change by myy 2015-1-27
|
||
if (0 == i % 2 && idOrigLayer.isValid())
|
||
dc.SetLayer(idRetLayer);
|
||
else
|
||
dc.SetLayer(idOrigLayer);
|
||
// change end
|
||
m_LineArr4[i]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
|
||
}
|
||
|
||
// change by hh 2011-04-28 兼容8.2版
|
||
if(DrawOutLine())
|
||
{
|
||
if (m_pOutLine != NULL) // 6、绘制出口线
|
||
{
|
||
m_pOutLine->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
|
||
}
|
||
}
|
||
|
||
dc.SetLayer(idOrigLayer);
|
||
if (!CreateArcArr(dc, idRetLayer)) // 7、绘制管线连接处的弧线
|
||
{
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
// 区域过小,仅绘制一条线
|
||
bool CPipeStyle2::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 CPipeStyle2::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
|
||
if(!!m_ptDrawSupply)
|
||
{
|
||
if(NULL != m_LineArr1[0])
|
||
m_LineArr1[0]->SetStartPt(m_ptDrawSupply);
|
||
}
|
||
else
|
||
{
|
||
ads_point ptTmp;
|
||
if(NULL != m_LineArr1[0])
|
||
{
|
||
m_LineArr1[0]->GetStartPt(ptTmp);
|
||
ads_point_set(ptTmp, m_ptDrawSupply);
|
||
}
|
||
}
|
||
if(!!m_ptDrawReturn)
|
||
{
|
||
if(NULL != m_LineArr1[1])
|
||
m_LineArr1[1]->SetStartPt(m_ptDrawReturn);
|
||
}
|
||
else
|
||
{
|
||
ads_point ptTmp;
|
||
if(NULL != m_LineArr1[1])
|
||
{
|
||
m_LineArr1[1]->GetStartPt(ptTmp);
|
||
ads_point_set(ptTmp, m_ptDrawReturn);
|
||
}
|
||
}
|
||
//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 CPipeStyle2::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);
|
||
|
||
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
|
||
if(!!m_ptDrawSupply)
|
||
{
|
||
if(NULL != m_LineArr1[0])
|
||
m_LineArr1[0]->SetStartPt(m_ptDrawSupply);
|
||
}
|
||
else
|
||
{
|
||
ads_point ptTmp;
|
||
if(NULL != m_LineArr1[0])
|
||
{
|
||
m_LineArr1[0]->GetStartPt(ptTmp);
|
||
ads_point_set(ptTmp, m_ptDrawSupply);
|
||
}
|
||
}
|
||
if(!!m_ptDrawReturn)
|
||
{
|
||
if(NULL != m_LineArr1[1])
|
||
m_LineArr1[1]->SetStartPt(m_ptDrawReturn);
|
||
}
|
||
else
|
||
{
|
||
ads_point ptTmp;
|
||
if(NULL != m_LineArr1[1])
|
||
{
|
||
m_LineArr1[1]->GetStartPt(ptTmp);
|
||
ads_point_set(ptTmp, m_ptDrawReturn);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 绘制多圈盘管
|
||
bool CPipeStyle2::DrawMulti()
|
||
{
|
||
// 1、给各个参数赋值
|
||
if (m_bSameDist) // 统一间距
|
||
{
|
||
DealSameDist();
|
||
}
|
||
else // 不统一间距
|
||
{
|
||
DealDifferentDist();
|
||
}
|
||
|
||
CreateLeftLineArr(); // 2、初始化LINEARR数组
|
||
CreateLine2Arr();
|
||
CreateBottomLineArr();
|
||
|
||
// change by myy 2015-1-27
|
||
// mcl add 2010.11.17 修正供回水起始点位置,不再多出一个 距墙 的长度
|
||
if (!!m_ptPickEntry && !m_bDefaultEntry)
|
||
{
|
||
ads_point ptNew;
|
||
if(!!m_ptDrawReturn)
|
||
{
|
||
m_LineArr4[2]->SetEndPt(m_ptDrawReturn);
|
||
}
|
||
else
|
||
{
|
||
m_LineArr4[2]->GetEndPt(ptNew);
|
||
m_ptDrawReturn = ptNew;
|
||
}
|
||
|
||
if(!!m_ptDrawSupply)
|
||
{
|
||
m_LineArr4[3]->SetEndPt(m_ptDrawSupply);
|
||
}
|
||
else
|
||
{
|
||
m_LineArr4[3]->GetEndPt(ptNew);
|
||
m_ptDrawSupply = ptNew;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
ads_point ptNewStart;
|
||
|
||
if (m_LineArr1.GetSize() > 1)
|
||
{
|
||
if (!!m_ptDrawSupply)
|
||
{
|
||
m_LineArr1[0]->SetStartPt(m_ptDrawSupply);
|
||
}
|
||
else
|
||
{
|
||
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;
|
||
}
|
||
|
||
if (m_LineArr1[0] != NULL)
|
||
{
|
||
m_LineArr1[0]->GetStartPt(ptNewStart);
|
||
acutPolar(ptNewStart, dTemp+m_dbPGAng + m_dbNormAng, m_dToWallTB, ptNewStart);
|
||
m_LineArr1[0]->SetStartPt(ptNewStart);
|
||
|
||
m_ptDrawSupply = ptNewStart;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (m_LineArr4.GetSize() > 0)
|
||
{
|
||
if (!!m_ptDrawReturn)
|
||
m_LineArr4[0]->SetEndPt(m_ptDrawReturn);
|
||
else
|
||
{
|
||
m_LineArr4[0]->GetEndPt(ptNewStart);
|
||
m_ptDrawReturn = ptNewStart;
|
||
}
|
||
}
|
||
}
|
||
|
||
// mcl commented 2010.11.17 不再多出一个 距墙 的长度
|
||
// change by hh 2011-04-28 兼容8.2版
|
||
if(DrawOutLine())
|
||
{
|
||
if (m_nNum + m_nLeftNum + m_nRightNum > 2)
|
||
{
|
||
CreateOutLine();
|
||
}
|
||
return true;
|
||
}
|
||
// change end
|
||
|
||
return true;
|
||
}
|
||
|
||
// 处理相同间距
|
||
void CPipeStyle2::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 = 1;
|
||
m_nRightNum = 1;
|
||
m_dbSideDist = m_nDist; // 左区距中区、中区距右区距离
|
||
}
|
||
|
||
// 处理不同间距
|
||
void CPipeStyle2::DealDifferentDist()
|
||
{
|
||
// 1、先算m_nLeftNum、m_nRightNum
|
||
int nLeftNum(0), nRightNum(0);
|
||
double dLeftArea = GetLeftAreaDist(), // 获得左、右区域的真实宽度
|
||
dRightArea = GetRightAreaDist(),
|
||
dMidArea(0); // 获得中间区域宽度
|
||
if (dLeftArea + dRightArea < GetLRDist() - 1.0E-5)
|
||
{
|
||
nLeftNum = (int)((dLeftArea-m_dToWallLR)/m_nLeftDist);
|
||
nRightNum = (int)((dRightArea-m_dToWallLR)/m_nRightDist);
|
||
|
||
do {
|
||
m_nLeftNum = (nLeftNum--) + 1;
|
||
m_nRightNum = (nRightNum--) + 1;
|
||
dMidArea = GetMidAreaDist();
|
||
} while(dMidArea < m_nDist-1.0E-5); // 中区必须大于一个中区宽度
|
||
|
||
nLeftNum++;
|
||
if (nLeftNum < 0) // 左、右区至少会有一条距墙距离的线
|
||
{
|
||
nLeftNum = 0;
|
||
m_nLeftNum = 1;
|
||
dMidArea = GetMidAreaDist();
|
||
}
|
||
|
||
nRightNum++;
|
||
if (nRightNum < 0)
|
||
{
|
||
nRightNum = 0;
|
||
m_nRightNum = 1;
|
||
dMidArea = GetMidAreaDist();
|
||
}
|
||
}
|
||
m_nLeftNum = nLeftNum + 1; // 左区盘管数量
|
||
m_nRightNum = nRightNum + 1; // 右区盘管数量
|
||
|
||
// 2、计算m_nNum
|
||
int nNum = (int)(dMidArea/m_nDist);
|
||
double dDifference = dMidArea - nNum*m_nDist; // 差值
|
||
if (dDifference > 1.0E-5) // 不能整除
|
||
{
|
||
if (IsEvenNum(nLeftNum+nRightNum+nNum)) // 偶数
|
||
{
|
||
m_dbSideDist = (dDifference+m_nDist)/2; // 左区距中区、中区距右区距离
|
||
m_nNum = nNum; // 中区盘管数量
|
||
}
|
||
else // 奇数
|
||
{
|
||
m_dbSideDist = m_nDist + dDifference/2;
|
||
m_nNum = nNum - 1;
|
||
}
|
||
}
|
||
else // 整除
|
||
{
|
||
if (IsEvenNum(nLeftNum+nRightNum+nNum))
|
||
{
|
||
m_dbSideDist = m_nDist*1.5;
|
||
m_nNum = nNum - 2;
|
||
}
|
||
else
|
||
{
|
||
m_dbSideDist = m_nDist;
|
||
m_nNum = nNum - 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 初始化LINEARR数组
|
||
//////////////////////////////////////////////////////////////////////
|
||
void CPipeStyle2::CreateLeftLineArr()
|
||
{
|
||
double dbLen = GetTBDist() - m_dToWallTB - 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 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;
|
||
}
|
||
|
||
// add by myy 2015-3-17 如果开口点在中间位置,并且开口方向为2、4、6、8,则交换左右间距和左右个数
|
||
if (!m_bDefaultEntry && !!m_ptPickEntry && (0 == m_nEntryType % 2))
|
||
{
|
||
m_nLeftDist += m_nRightDist;
|
||
m_nRightDist = m_nLeftDist - m_nRightDist;
|
||
m_nLeftDist = m_nLeftDist - m_nRightDist;
|
||
|
||
m_nLeftNum += m_nRightNum;
|
||
m_nRightNum = m_nLeftNum - m_nRightNum;
|
||
m_nLeftNum = m_nLeftNum - m_nRightNum;
|
||
}
|
||
|
||
ads_point actPt; // 实际点
|
||
TransToActualPt(StartPtIn, actPt);
|
||
CPipeLine *line1 = new CPipeLine(actPt, m_dbPGAng, dbLen, dTemp, m_dbNormAng);
|
||
m_LineArr1.Add(line1); // 第一根线
|
||
|
||
// 第二到倒数第二根线长
|
||
dbLen = dbLen - m_dToWallTB - m_nDistB - m_dbArcRadius;
|
||
|
||
int i(1);
|
||
ads_point lastPt, virPt, pt; // 前一直线的起点、虚拟点,临时点
|
||
for (i = 1; i < m_nLeftNum; i++) // 左区盘管
|
||
{
|
||
m_LineArr1[i-1]->GetStartPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
|
||
acutPolar(virPt, m_dbAssisAng, m_nLeftDist, pt);
|
||
if (i == 1) // 第一根线调整起点位置
|
||
{
|
||
acutPolar(pt, dTemp, (m_dToWallTB+m_nDistB+m_dbArcRadius), pt);
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
|
||
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, dTemp, m_dbNormAng);
|
||
m_LineArr1.Add(line);
|
||
}
|
||
|
||
int nSize = m_nLeftNum -1;
|
||
for (i = 0; i < m_nNum; i++) // 中间盘管
|
||
{
|
||
m_LineArr1[nSize+i]->GetStartPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
|
||
if (i == 0) // 第一根线,取距左区的距离
|
||
{
|
||
acutPolar(virPt, m_dbAssisAng, m_dbSideDist, pt);
|
||
if (nSize == 0) // 左区仅有1根线,调整起点位置
|
||
{
|
||
acutPolar(pt, dTemp, (m_dToWallTB+m_nDistB+m_dbArcRadius), pt);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
acutPolar(virPt, m_dbAssisAng, m_nDist, pt);
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
|
||
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, dTemp, m_dbNormAng);
|
||
m_LineArr1.Add(line);
|
||
}
|
||
|
||
nSize += m_nNum;
|
||
for (i = 0; i < m_nRightNum; i++) // 右区盘管
|
||
{
|
||
m_LineArr1[nSize+i]->GetStartPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
|
||
if (i == m_nRightNum - 1) // 所有中的最后一根线
|
||
{
|
||
dbLen += m_nDistB; // 最后一根线长度变长
|
||
|
||
BOOL bFlag(TRUE); // 标志位
|
||
if (m_nRightNum == 1) // 右区仅有1根线,取距中区的距离
|
||
{
|
||
acutPolar(virPt, m_dbAssisAng, m_dbSideDist, pt);
|
||
if (nSize == 0) // 总供只有2根线,线长改变,且不用调整起点
|
||
{
|
||
dbLen = GetTBDist() - m_dToWallTB - m_dbArcRadius;
|
||
bFlag = FALSE;
|
||
}
|
||
}
|
||
else // 右区不止1根线,取右区间距
|
||
{
|
||
acutPolar(virPt, m_dbAssisAng, m_nRightDist, pt);
|
||
}
|
||
|
||
if (bFlag) // 调整起点位置
|
||
{
|
||
if ((1 == m_nEntryType) || (3 == m_nEntryType) || (5 == m_nEntryType)
|
||
|| (7 == m_nEntryType))
|
||
{
|
||
acutPolar(pt, m_dbAssisAng+1.5*_PI, m_nDistB, pt);
|
||
}
|
||
else
|
||
{
|
||
acutPolar(pt, m_dbAssisAng+0.5*_PI, m_nDistB, pt);
|
||
}
|
||
}
|
||
}
|
||
else if (i == 0) // 右区第1根线
|
||
{
|
||
acutPolar(virPt, m_dbAssisAng, m_dbSideDist, pt);
|
||
// 左区仅一根线,没有中区,调整起点位置
|
||
if ((0 == nSize) && (m_nRightNum > 1))
|
||
{
|
||
acutPolar(pt, dTemp, (m_dToWallTB+m_nDistB+m_dbArcRadius), pt);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
acutPolar(virPt, m_dbAssisAng, m_nRightDist, pt);
|
||
}
|
||
TransToActualPt(pt, actPt);
|
||
|
||
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, dTemp, m_dbNormAng);
|
||
m_LineArr1.Add(line);
|
||
}
|
||
}
|
||
|
||
void CPipeStyle2::CreateLine2Arr()
|
||
{
|
||
double dbLen(0); // 直线长
|
||
BOOL bIsUp(TRUE); // 是否顶部
|
||
ads_point lastPt, virPt, actPt, pt; // 前一组直线的终点,虚拟点,实际点
|
||
|
||
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 i(0),
|
||
nSize = m_nLeftNum-1;
|
||
for (i = 0; i < nSize; i++) // 左区
|
||
{
|
||
if (bIsUp)
|
||
{
|
||
m_LineArr1[i]->GetEndPt(lastPt);
|
||
bIsUp = FALSE;
|
||
}
|
||
else
|
||
{
|
||
m_LineArr1[i]->GetStartPt(lastPt);
|
||
bIsUp = TRUE;
|
||
}
|
||
|
||
TransToVirtualPt(lastPt, virPt);
|
||
dbLen = m_nLeftDist - 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);
|
||
}
|
||
|
||
nSize += m_nNum + 1;
|
||
for (i = m_nLeftNum-1; i < nSize; i++) // 中区
|
||
{
|
||
if (bIsUp)
|
||
{
|
||
m_LineArr1[i]->GetEndPt(lastPt);
|
||
bIsUp = FALSE;
|
||
}
|
||
else
|
||
{
|
||
m_LineArr1[i]->GetStartPt(lastPt);
|
||
bIsUp = TRUE;
|
||
}
|
||
|
||
TransToVirtualPt(lastPt, virPt);
|
||
if ((i == m_nLeftNum-1) || (i == nSize-1)) // 第1根、最后1根取区域之间的距离
|
||
{
|
||
dbLen = m_dbSideDist - 2*m_dbArcRadius;
|
||
}
|
||
else
|
||
{
|
||
dbLen = m_nDist - 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);
|
||
}
|
||
|
||
nSize = (int)m_LineArr1.GetSize();
|
||
for (i = m_nLeftNum+m_nNum; i < nSize-1; i++) // 右区
|
||
{
|
||
if (bIsUp)
|
||
{
|
||
m_LineArr1[i]->GetEndPt(lastPt);
|
||
bIsUp = FALSE;
|
||
}
|
||
else
|
||
{
|
||
m_LineArr1[i]->GetStartPt(lastPt);
|
||
bIsUp = TRUE;
|
||
}
|
||
|
||
TransToVirtualPt(lastPt, virPt);
|
||
dbLen = m_nRightDist - 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 CPipeStyle2::CreateBottomLineArr()
|
||
{
|
||
int nSize = (int)m_LineArr1.GetSize();
|
||
ads_point lastPt, virPt; // 前一组直线的终点,虚拟点
|
||
m_LineArr1[nSize-1]->GetStartPt(lastPt);
|
||
TransToVirtualPt(lastPt, virPt);
|
||
|
||
// 直线长度
|
||
double dbLen = GetLRDist() - 2*(m_dToWallLR+m_dbArcRadius) - m_nLeftDist;
|
||
// 没有了最后出头段,所以不再倒角,少了一个曲率长度
|
||
// double dbLen = GetLRDist() - 2*m_dToWallLR - m_dbArcRadius - m_nLeftDist;
|
||
if(!DrawOutLine())
|
||
dbLen = GetLRDist() - 2*m_dToWallLR - m_dbArcRadius - m_nLeftDist;
|
||
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 pt, actPt; // 虚拟点,实际点
|
||
acutPolar(virPt, m_dbAssisAng-_PI, m_dbArcRadius, pt);
|
||
acutPolar(pt, dAng, m_dbArcRadius, pt);
|
||
TransToActualPt(pt, actPt);
|
||
|
||
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, m_dbAssisAng-_PI,
|
||
m_dbNormAng);
|
||
// change by myy 2015-1-26
|
||
//m_LineArr4.Add(line);
|
||
ads_point ptS, ptE;
|
||
XPoint ptProj;
|
||
BOOL bPtOnLine = TRUE;
|
||
|
||
line->GetStartPt(ptS);
|
||
line->GetEndPt(ptE);
|
||
XLine pLine(ptS, ptE);
|
||
m_ptPickEntry.Project(&pLine, ptProj);
|
||
bPtOnLine = PtInLine(pLine, ptProj);
|
||
|
||
double dPickToS = ads_distance(ptProj, ptS);
|
||
double dPickToE = ads_distance(ptProj, ptE);
|
||
|
||
double dDist = 0.0;
|
||
if (dPickToE+m_nLeftDist > m_nDistB / 2)
|
||
dDist = m_nDistB;
|
||
else
|
||
dDist = m_nLeftDist;
|
||
|
||
m_dPickToE = dPickToE + dDist / 2;
|
||
|
||
if (bPtOnLine)
|
||
{
|
||
if ((1e-6 >= dPickToS - m_nRightDist)|| (1e-6 >= dPickToE))
|
||
{
|
||
m_LineArr4.Add(line);
|
||
m_bDefaultEntry = TRUE;
|
||
}
|
||
else
|
||
{
|
||
ads_point ptS1, ptE1, ptTmp;
|
||
|
||
// 从右区最后一根线引出的开口处第一根线
|
||
double dLen = dbLen - dPickToE - dDist / 2;
|
||
if (!m_bDistance)
|
||
dLen -= m_dbArcRadius;
|
||
|
||
CPipeLine *line1 = new CPipeLine(actPt, m_dbPGAng, dLen, m_dbAssisAng-_PI, m_dbNormAng);
|
||
m_LineArr4.Add(line1);
|
||
|
||
// 开口处第二根线
|
||
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 ptNewStart;
|
||
if (m_LineArr1[0] != NULL)
|
||
{
|
||
m_LineArr1[0]->GetStartPt(ptNewStart);
|
||
acutPolar(ptNewStart, dTemp+m_dbPGAng + m_dbNormAng, m_dToWallTB, ptNewStart);
|
||
m_LineArr1[0]->SetStartPt(ptNewStart);
|
||
}
|
||
|
||
if (!m_bDistance)
|
||
{
|
||
if (1 == m_nEntryType % 2)
|
||
acutPolar(ptNewStart, -0.5*_PI+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptNewStart);
|
||
else
|
||
acutPolar(ptNewStart, 0.5*_PI+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptNewStart);
|
||
m_LineArr1[0]->SetStartPt(ptNewStart);
|
||
}
|
||
|
||
dLen = dPickToE + m_nLeftDist - dDist / 2 - m_dbArcRadius;
|
||
|
||
m_LineArr1[0]->GetStartPt(actPt);
|
||
|
||
CPipeLine *lineTmp1 = new CPipeLine(actPt, m_dbPGAng+_PI, dLen, m_dbAssisAng-_PI, m_dbNormAng);
|
||
lineTmp1->GetStartPt(ptS1);
|
||
lineTmp1->GetEndPt(ptE1);
|
||
TransToVirtualPt(ptS1, ptS1);
|
||
TransToVirtualPt(ptE1, ptE1);
|
||
double dDistance = XPoint(ptS1).Distance(XPoint(ptE1));
|
||
double dLineLen = dDistance; // 直线长度
|
||
|
||
if (!m_bDistance && 0 == m_nEntryType % 2)
|
||
dLineLen -= m_dbArcRadius;
|
||
|
||
acutPolar(ptS1, m_dbAssisAng, m_dbArcRadius, pt);
|
||
TransToActualPt(pt, ptTmp);
|
||
|
||
if (!m_bDistance && 0 == m_nEntryType % 2)
|
||
acutPolar(ptTmp, -0.5*_PI+m_dbAssisAng, m_dbArcRadius, ptTmp);
|
||
|
||
CPipeLine *line2 = new CPipeLine(ptTmp, m_dbPGAng+_PI, dLineLen, m_dbAssisAng-_PI, m_dbNormAng);
|
||
if (!m_bDistance)
|
||
{
|
||
if (1 == m_nEntryType % 2)
|
||
{
|
||
line2->GetStartPt(ptS1);
|
||
acutPolar(ptS1, 0.5*_PI+m_dbAssisAng, m_dbArcRadius, pt);
|
||
line2->SetStartPt(pt);
|
||
}
|
||
|
||
//m_LineArr1[0]->GetStartPt(ptS1);
|
||
//acutPolar(ptS1, _PI+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, pt);
|
||
//m_LineArr1[0]->GetStartPt(pt);
|
||
}
|
||
m_LineArr4.Add(line2);
|
||
|
||
// 两根开口线段,长度100m
|
||
double dAngle = 0.5*_PI+m_dbPGAng;
|
||
double dA = -0.5*_PI;
|
||
if (2 == m_nEntryType || 4 == m_nEntryType || 6 == m_nEntryType || 8 == m_nEntryType)
|
||
{
|
||
dAngle = -0.5*_PI+m_dbPGAng;
|
||
dA = 0.5*_PI;
|
||
}
|
||
|
||
ads_point ptEnd;
|
||
line1->GetEndPt(ptEnd);
|
||
if (m_bDistance)
|
||
{
|
||
CPipeLine *pLine1 = new CPipeLine(ptEnd, dAngle, 100.0, m_dbAssisAng-_PI, m_dbNormAng);
|
||
acutPolar(ptEnd, m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptE1);
|
||
line1->SetEndPt(ptE1);
|
||
acutPolar(ptEnd, dA+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptS1);
|
||
pLine1->SetStartPt(ptS1);
|
||
m_LineArr4.Add(pLine1);
|
||
}
|
||
else
|
||
{
|
||
if (1 == m_nEntryType % 2)
|
||
{
|
||
acutPolar(ptEnd, -0.5*_PI+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptE);
|
||
acutPolar(ptE, m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptEnd);
|
||
}
|
||
else
|
||
{
|
||
acutPolar(ptEnd, -0.5*_PI+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptE);
|
||
acutPolar(ptE, _PI+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptEnd);
|
||
}
|
||
|
||
CPipeLine *pLine1 = new CPipeLine(ptEnd, dAngle, 100.0, m_dbAssisAng-_PI, m_dbNormAng);
|
||
m_LineArr4.Add(pLine1);
|
||
}
|
||
|
||
|
||
line2->GetEndPt(ptEnd);
|
||
if (m_bDistance)
|
||
{
|
||
CPipeLine *pLine2 = new CPipeLine(ptEnd, dAngle, 100.0, m_dbAssisAng-_PI, m_dbNormAng);
|
||
acutPolar(ptEnd, _PI+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptE1);
|
||
line2->SetEndPt(ptE1);
|
||
acutPolar(ptEnd, dA+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptS1);
|
||
pLine2->SetStartPt(ptS1);
|
||
m_LineArr4.Add(pLine2);
|
||
}
|
||
else
|
||
{
|
||
if (1 == m_nEntryType % 2)
|
||
{
|
||
acutPolar(ptEnd, 0.5*_PI+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptE);
|
||
acutPolar(ptE, m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptEnd);
|
||
}
|
||
else
|
||
{
|
||
acutPolar(ptEnd, 0.5*_PI+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptE);
|
||
acutPolar(ptE, -_PI+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, ptEnd);
|
||
}
|
||
CPipeLine *pLine2 = new CPipeLine(ptEnd, dAngle, 100.0, m_dbAssisAng-_PI, m_dbNormAng);
|
||
m_LineArr4.Add(pLine2);
|
||
}
|
||
|
||
m_bDefaultEntry = FALSE;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
m_LineArr4.Add(line);
|
||
m_bDefaultEntry = TRUE;
|
||
}
|
||
|
||
if (!!m_ptPickEntry && !m_bDefaultEntry)
|
||
{
|
||
double dTmpAng = 0.5*_PI;
|
||
if (2 == m_nEntryType || 4 == m_nEntryType || 6 == m_nEntryType || 8 == m_nEntryType)
|
||
dTmpAng = -0.5*_PI;
|
||
|
||
m_LineArr1[0]->GetStartPt(pt);
|
||
acutPolar(pt, dTmpAng+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, pt);
|
||
if (!m_bDistance && 1 == m_nEntryType % 2)
|
||
acutPolar(pt, _PI+m_dbPGAng+m_dbAssisAng, m_dbArcRadius, pt);
|
||
else if (!m_bDistance && 0 == m_nEntryType % 2)
|
||
acutPolar(pt, m_dbPGAng+m_dbAssisAng, m_dbArcRadius, pt);
|
||
m_LineArr1[0]->SetStartPt(pt);
|
||
}
|
||
// change end
|
||
}
|
||
|
||
// 出口处的小短线
|
||
void CPipeStyle2::CreateOutLine()
|
||
{
|
||
ads_point virStartPt, virEndPt, EndPt, StartPt; // 虚拟起点、终点,终点、起点
|
||
m_LineArr1[0]->GetStartPt(EndPt);
|
||
|
||
TransToVirtualPt(EndPt, virEndPt);
|
||
|
||
// change by myy 2015-1-27
|
||
double dDist = 0.0;
|
||
if (m_bDefaultEntry)
|
||
dDist = m_nLeftDist;
|
||
else
|
||
dDist = m_nLeftDist + m_dPickToE;
|
||
|
||
switch(m_nEntryType) // 根据出口位置判断
|
||
{
|
||
case 1:
|
||
//acutPolar(virEndPt, 0, m_nLeftDist, virEndPt);
|
||
acutPolar(virEndPt, 0, dDist, virEndPt);
|
||
acutPolar(virEndPt, 0.5*_PI, m_dToWallTB-m_dbArcRadius, virStartPt);
|
||
break;
|
||
case 2:
|
||
//acutPolar(virEndPt, 0.5*_PI, m_nLeftDist, virEndPt);
|
||
acutPolar(virEndPt, 0.5*_PI, dDist, virEndPt);
|
||
acutPolar(virEndPt, 0, m_dToWallTB-m_dbArcRadius, virStartPt);
|
||
break;
|
||
case 3:
|
||
//acutPolar(virEndPt, 1.5*_PI, m_nLeftDist, virEndPt);
|
||
acutPolar(virEndPt, 1.5*_PI, dDist, virEndPt);
|
||
acutPolar(virEndPt, 0, m_dToWallTB-m_dbArcRadius, virStartPt);
|
||
break;
|
||
case 4:
|
||
//acutPolar(virEndPt, 0, m_nLeftDist, virEndPt);
|
||
acutPolar(virEndPt, 0, dDist, virEndPt);
|
||
acutPolar(virEndPt, 1.5*_PI, m_dToWallTB-m_dbArcRadius, virStartPt);
|
||
break;
|
||
case 5:
|
||
//acutPolar(virEndPt, _PI, m_nLeftDist, virEndPt);
|
||
acutPolar(virEndPt, _PI, dDist, virEndPt);
|
||
acutPolar(virEndPt, 1.5*_PI, m_dToWallTB-m_dbArcRadius, virStartPt);
|
||
break;
|
||
case 6:
|
||
//acutPolar(virEndPt, 1.5*_PI, m_nLeftDist, virEndPt);
|
||
acutPolar(virEndPt, 1.5*_PI, dDist, virEndPt);
|
||
acutPolar(virEndPt, _PI, m_dToWallTB-m_dbArcRadius, virStartPt);
|
||
break;
|
||
case 7:
|
||
//acutPolar(virEndPt, 0.5*_PI, m_nLeftDist, virEndPt);
|
||
acutPolar(virEndPt, 0.5*_PI, dDist, virEndPt);
|
||
acutPolar(virEndPt, _PI, m_dToWallTB-m_dbArcRadius, virStartPt);
|
||
break;
|
||
case 8:
|
||
//acutPolar(virEndPt, _PI, m_nLeftDist, virEndPt);
|
||
acutPolar(virEndPt, _PI, dDist, virEndPt);
|
||
acutPolar(virEndPt, 0.5*_PI, m_dToWallTB-m_dbArcRadius, virStartPt);
|
||
break;
|
||
default:
|
||
return;
|
||
}
|
||
|
||
TransToActualPt(virEndPt, EndPt);
|
||
TransToActualPt(virStartPt, StartPt);
|
||
|
||
m_pOutLine = new CPipeLine;
|
||
|
||
m_LineArr4[0]->GetEndPt(StartPt);
|
||
|
||
m_pOutLine->SetStartPt(StartPt);
|
||
m_pOutLine->SetEndPt(EndPt);
|
||
// change end
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// 处理弧线
|
||
//////////////////////////////////////////////////////////////////////
|
||
bool CPipeStyle2::CreateArcArr( XExplodeDraw &dc,AcDbObjectId idRetLayer /*= AcDbObjectId::kNull*/ )
|
||
{
|
||
ads_point StartPtL, EndPtL, StartPtR, EndPtR; // 左右圆弧起点、终点
|
||
AcDbObjectId ArcIDL, ArcIDR; // 左右圆弧实体ID
|
||
ads_point CenPtL, CenPtR; // 左右圆弧中心点
|
||
bool bIsUp(true); // 是否顶部圆弧
|
||
|
||
AcDbObjectId idOrigLayer = dc.GetLayerId();
|
||
int size = (int)m_LineArr1.GetSize();
|
||
for (int i = 0; i < size-1; i++) // 连接1、2边直线
|
||
{
|
||
if (i > size*0.5 - 2 && idRetLayer.isValid())
|
||
dc.SetLayer(idRetLayer);
|
||
else
|
||
dc.SetLayer(idOrigLayer);
|
||
|
||
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);
|
||
}
|
||
|
||
// 连接1边最后一条直线与4边线
|
||
ads_point StartPt, EndPt; // 圆弧起点,圆弧终点
|
||
AcDbObjectId ArcID; // 圆弧实体ID
|
||
ads_point CenPt; // 圆弧中心点
|
||
|
||
m_LineArr4[0]->GetStartPt(StartPt);
|
||
m_LineArr1[m_LineArr1.GetSize()-1]->GetStartPt(EndPt);
|
||
GetArcCenterPt(EndPt, _PI, CenPt);
|
||
if ((1 == m_nEntryType) || (3 == m_nEntryType) || (5 == m_nEntryType)
|
||
|| (7 == m_nEntryType))
|
||
{
|
||
if (!CreateArc(StartPt, EndPt, CenPt, ArcID, dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (!CreateArc(EndPt, StartPt, CenPt, ArcID, dc)) // 反向画弧
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
m_ArcArr.Add(ArcID);
|
||
|
||
// add by myy 2015-2-9
|
||
if (!!m_ptPickEntry && !m_bDefaultEntry)
|
||
{
|
||
m_LineArr4[3]->GetStartPt(StartPtL);
|
||
m_LineArr4[1]->GetEndPt(EndPtL);
|
||
m_LineArr4[0]->GetEndPt(StartPtR);
|
||
m_LineArr4[2]->GetStartPt(EndPtR);
|
||
GetArcCenterPt(EndPtL, -0.5*_PI, CenPtL);
|
||
GetArcCenterPt(EndPtR, 0, CenPtR);
|
||
if ((1 == m_nEntryType) || (3 == m_nEntryType) || (5 == m_nEntryType) || (7 == m_nEntryType))
|
||
{
|
||
dc.SetLayer(idOrigLayer);
|
||
if (!CreateArc(StartPtL, EndPtL, CenPtL, ArcIDL,dc))
|
||
{
|
||
return false;
|
||
}
|
||
dc.SetLayer(idRetLayer);
|
||
if (!CreateArc(StartPtR, EndPtR, CenPtR, ArcIDR,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else // 反画圆弧
|
||
{
|
||
dc.SetLayer(idOrigLayer);
|
||
if (!CreateArc(EndPtL, StartPtL, CenPtL, ArcIDL,dc))
|
||
{
|
||
return false;
|
||
}
|
||
dc.SetLayer(idRetLayer);
|
||
if (!CreateArc(EndPtR, StartPtR, CenPtR, ArcIDR,dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
m_ArcArr.Add(ArcIDL);
|
||
m_ArcArr.Add(ArcIDR);
|
||
|
||
// 连接1边第一条直线与4边线
|
||
m_LineArr1[0]->GetStartPt(StartPt);
|
||
m_LineArr4[1]->GetStartPt(EndPt);
|
||
GetArcCenterPt(EndPt, -1.5*_PI, CenPt);
|
||
dc.SetLayer(idOrigLayer);
|
||
if ((1 == m_nEntryType) || (3 == m_nEntryType) || (5 == m_nEntryType)
|
||
|| (7 == m_nEntryType))
|
||
{
|
||
if (!CreateArc(StartPt, EndPt, CenPt, ArcID, dc))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (!CreateArc(EndPt, StartPt, CenPt, ArcID, dc)) // 反向画弧
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
m_ArcArr.Add(ArcID);
|
||
}
|
||
// add end
|
||
|
||
// mcl commented 不再绘制出头的一小段
|
||
// change by hh 2011-04-28 兼容8.2版
|
||
if(!DrawOutLine())
|
||
return false;
|
||
|
||
if (m_pOutLine == NULL) // 连接4边直线与导出线
|
||
{
|
||
return false;
|
||
}
|
||
|
||
m_LineArr4[0]->GetEndPt(StartPt);
|
||
m_pOutLine->GetStartPt(EndPt);
|
||
GetArcCenterPt(EndPt, 0, CenPt);
|
||
if ((1 == m_nEntryType) || (3 == m_nEntryType) || (5 == m_nEntryType)
|
||
|| (7 == m_nEntryType))
|
||
{
|
||
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;
|
||
}
|
||
|
||
|
||
/*----------------------------------------------------------------------------*
|
||
* 函数名称: CPipeStyle2::CreateArc()
|
||
* 功能描述: 创建圆弧
|
||
* 参 数: [in] StartPt:圆弧起点
|
||
[in] EndPt:圆弧终点
|
||
[in] CenPt:圆弧圆心
|
||
[out] ObjID:圆弧实体ID
|
||
* 返 回 值: 创建是否成功,true:成功,false:失败
|
||
* 历 史:
|
||
* 备 注: 自定义实体用
|
||
-----------------------------------------------------------------------------*/
|
||
bool CPipeStyle2::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;
|
||
}
|
||
|
||
BOOL CPipeStyle2::DrawOutLine() const
|
||
{
|
||
return m_bDrawOutLine && !!m_ptDrawSupply && !!m_ptDrawReturn;
|
||
}
|
||
|
||
void CPipeStyle2::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);
|
||
} |