Files
envi-code/SourceCode/Code2026/tg_shs/shs_pipewire/PipeStyle2.cpp
T
2026-09-28 15:28:50 +08:00

2119 lines
51 KiB
C++
Raw Blame History

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