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

2343 lines
55 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.
// PipeStyle3.cpp: implementation of the CPipeStyle3 class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PipeStyle3.h"
#include "math.h"
#include "geassign.h"
#include "PipeTools.h"
#include "GlobalFunction.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define _PI 3.14159265358979323846
// add by myy 2015-2-2 自CPipeStyle1中
extern BOOL PtInLine(XLine& line, AcGePoint3d& pt);
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPipeStyle3::CPipeStyle3()
{
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_nAreaType = 0; // 划分区域的方式,0:宽度,1:比例
m_dLeftArea = 0; // 左区宽度或比例值
m_dRightArea = 0; // 右区宽度或比例值
m_nColorInd = 4; // 颜色
m_bWeight = FALSE; // 是否粗显
m_dLineWeight = 0.35; // 线宽
InitVirtaulRect(); // 初始化矩形中的数据
}
CPipeStyle3::CPipeStyle3(XPoint rectStartPt, XPoint rectEndPt, double dbPGAng,
int nEntryType, double dRadius, double dDistToWall,
int nLeftDist, int nMidDist, int nRightDist,
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_nAreaType = nAreaType; // 划分区域的方式
m_dLeftArea = dLeftArea;
m_dRightArea = dRightArea;
m_nColorInd = nColorIndex; // 颜色
m_bWeight = bWeight; // 是否粗显
m_dLineWeight = dLineWeight; // 线宽
InitVirtaulRect(); // 初始化矩形中的数据
}
// add by myy 2015-1-28
CPipeStyle3::CPipeStyle3(XPoint rectStartPt, XPoint rectEndPt, XPoint ptEntry, double dbPGAng,
int nEntryType, double dRadius, double dDistToWall, int nLeftDist, int nMidDist,
int nRightDist, 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_bDefaultEntry = TRUE;
m_dbPGAng = dbPGAng;
m_nEntryType = nEntryType;
m_dbArcRadius = dRadius; // 圆弧半径
m_dToWallLR = dDistToWall; // 距墙距离
m_dToWallTB = dDistToWall;
m_bSameDist = FALSE; // 不统一间距
m_nLeftDist = nLeftDist; // 左区间距
m_nDist = nMidDist; // 中间区域间距
m_nRightDist = nRightDist; // 右区间距
m_nAreaType = nAreaType; // 划分区域的方式
m_dLeftArea = dLeftArea;
m_dRightArea = dRightArea;
m_nColorInd = nColorIndex; // 颜色
m_bWeight = bWeight; // 是否粗显
m_dLineWeight = dLineWeight; // 线宽
InitVirtaulRect(); // 初始化矩形中的数据
}
// 初始化虚拟矩形中的数据,用于构造函数
void CPipeStyle3::InitVirtaulRect()
{
m_pEndLine = 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;
}
CPipeStyle3::~CPipeStyle3()
{
int i = 0; // sg modify
for (i = 0; i < m_LineArr1.GetSize(); i++)
{
if(m_LineArr1[i] != NULL)
{
delete m_LineArr1[i];
}
}
m_LineArr1.RemoveAll();
for (i = 0; i < m_LineArr2.GetSize(); i++)
{
if(m_LineArr2[i] != NULL)
{
delete m_LineArr2[i];
}
}
m_LineArr2.RemoveAll();
for (i = 0; i < m_LineArr3.GetSize(); i++)
{
if(m_LineArr3[i] != NULL)
{
delete m_LineArr3[i];
}
}
m_LineArr3.RemoveAll();
if (m_pEndLine != NULL)
{
delete m_pEndLine;
m_pEndLine = NULL;
}
// add by myy 2015-1-30
for (i = 0; i < m_lineArr4.GetSize(); i++)
{
if (NULL != m_lineArr4[i])
{
delete m_lineArr4[i];
}
}
m_lineArr4.RemoveAll();
// add end
}
//////////////////////////////////////////////////////////////////////
// Set函数
//////////////////////////////////////////////////////////////////////
// 设置间距是否统一
void CPipeStyle3::SetSameDist(BOOL bSame, int nDist)
{
m_bSameDist = bSame;
if (m_bSameDist)
{
m_nLeftDist = nDist;
m_nDist = nDist;
m_nRightDist = nDist;
}
}
void CPipeStyle3::SetStartPt(ads_point rectStartPt)
{
ads_point_set(rectStartPt, m_rectStartPt);
}
void CPipeStyle3::SetPGAng(double dbPGAng)
{
m_dbPGAng = dbPGAng;
}
void CPipeStyle3::SetEntryType(int nEntryType)
{
m_nEntryType = nEntryType;
}
//////////////////////////////////////////////////////////////////////
// Get函数
//////////////////////////////////////////////////////////////////////
// 获取所有区域间距中最小的,用于倒角
double CPipeStyle3::GetMinDist()
{
double dMin1 = min(m_nLeftDist, m_nRightDist),
dMin2 = min(m_nDist, m_dToWallTB),
dMin = min(dMin1, dMin2);
return dMin;
}
// 获取左、右区域真实宽度
double CPipeStyle3::GetLeftAreaDist() // 左
{
if (m_bSameDist) // 统一间距时,不考虑宽度
{
return 0;
}
if (m_nAreaType == 0) // 设置区域宽度
{
return m_dLeftArea;
}
double dLen = GetLRDist();
return m_dLeftArea*dLen; // 设置区域比例
}
double CPipeStyle3::GetRightAreaDist() // 右
{
if (m_bSameDist) // 统一间距时,不考虑宽度
{
return 0;
}
if (m_nAreaType == 0) // 设置区域宽度
{
return m_dRightArea;
}
double dLen = GetLRDist();
return m_dRightArea*dLen; // 设置区域比例
}
// 获得中间区域宽度
double CPipeStyle3::GetMidAreaDist()
{
double dMidArea = GetLRDist() - 2*m_dToWallLR;
if (!m_bSameDist) // 间距不统一
{
dMidArea -= (m_nLeftNum-1)*m_nLeftDist + (m_nRightNum-1)*m_nRightDist;
}
return dMidArea;
}
// 获取左右宽度
double CPipeStyle3::GetLRDist()
{
double dLen = m_dbLongDist;
if ((2 == m_nEntryType) || (3 == m_nEntryType) || (6 == m_nEntryType)
|| (7 == m_nEntryType))
{
dLen = m_dbShortDist;
}
return dLen;
}
// 获取上下宽度
double CPipeStyle3::GetTBDist()
{
double dLen = m_dbShortDist;
if ((2 == m_nEntryType) || (3 == m_nEntryType) || (6 == m_nEntryType)
|| (7 == m_nEntryType))
{
dLen = m_dbLongDist;
}
return dLen;
}
// 获取左右方向距墙距离,仅用于GetEntryPt函数中
void CPipeStyle3::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 if (dWidth < (m_nLeftDist+m_nDist+m_nRightDist) + 1.0E-5)
{
m_dToWallLR = (dLen - m_nDist)/2;
}
else // 绘制多圈
{
DealDifferentDist();
}
}
}
}
void CPipeStyle3::GetCrossPts(XPoint &ptSupply, XPoint &ptReturn)
{
GetCenterPt(); // 得到中心点
GetDiagAng(); // 得到对角线锐角
GetLengthofSide(); // 得到长短边
GetVirtaulRect(); // 得到虚拟矩形
NormalizeRect(); // 3、把虚拟矩形放倒
double dWidth = GetLRDist() - 2*m_dToWallLR;
BOOL bMultiFlag = TRUE;
if (m_bSameDist) // 统一间距的情况
{
int nNum = (int)(dWidth/m_nDist);
if (nNum < 1)
{
return ;
}
else if ((nNum == 1) || (nNum == 2)) // 仅够盘一圈
{
PreDrawSingle();
bMultiFlag = FALSE;
}
DealSameDist();
}
else // 不统一间距的情况
{
if (dWidth < 1.0E-5) // 距离至少要大于两个距墙距离
{
return ;
}
else
{
double dLeftArea = GetLeftAreaDist(), // 获得左、右区域宽度
dRightArea = GetRightAreaDist();
if (dLeftArea + dRightArea > GetLRDist() - 1.0E-5) // 仅够盘一圈
{
PreDrawSingle();
bMultiFlag = FALSE;
}
else if (dWidth < (m_nLeftDist+m_nDist+m_nRightDist) + 1.0E-5)
{
PreDrawSingle();
bMultiFlag = FALSE;
}
}
DealDifferentDist();
}
if (bMultiFlag)
CreateLeftLineArr();
ptSupply = m_ptDrawSupply;
ptReturn = m_ptDrawReturn;
}
//XPoint CPipeStyle3::GetEntryPt(int nNum)
XPoint CPipeStyle3::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;
}
//////////////////////////////////////////////////////////////////////
// 构造虚拟矩形的函数
//////////////////////////////////////////////////////////////////////
// 将矩形转换为躺倒的矩形
void CPipeStyle3::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 CPipeStyle3::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 CPipeStyle3::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 CPipeStyle3::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 CPipeStyle3::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 CPipeStyle3::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 CPipeStyle3::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 CPipeStyle3::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 CPipeStyle3::DrawPGLine( XExplodeDraw &dc, AcDbObjectId idRetLayer /*= AcDbObjectId::kNull*/ )
{
// 1、对输入数据的合理性进行检查
if ((abs(m_nLeftDist) <= 0) || (abs(m_nRightDist) <= 0) ||
(abs(m_nDist) <= 0))
{
acutPrintf(_T("\n间距错误"));
return false;
}
if (m_nEntryType < 1 || m_nEntryType > 8)
{
acutPrintf(_T("\n入口类型错误"));
return false;
}
// 2、构造一个虚拟的外包“矩形”
GetCenterPt(); // 得到中心点
GetDiagAng(); // 得到对角线锐角
GetLengthofSide(); // 得到长短边
GetVirtaulRect(); // 得到虚拟矩形
NormalizeRect(); // 3、把虚拟矩形放倒
// 4、分类初始化LINEARR数组
double dWidth = GetLRDist() - 2*m_dToWallLR;
if (m_bSameDist) // 统一间距的情况
{
int nNum = (int)(dWidth/m_nDist);
if (nNum < 1) // 至少要大于两个距墙距离
{
bool bRet = DrawSingleLine(dc); // 仅绘制一根线
return bRet;
}
else if ((nNum == 1) || (nNum == 2)) // 仅够盘一圈
{
bool bRet = DrawSingle(dc); // 绘制一圈
return bRet;
}
else
{
if (!DrawMulti()) // 绘制多圈
{
return false;
}
}
}
else // 不统一间距的情况
{
if (dWidth < 1.0E-5) // 距离至少要大于两个距墙距离
{
bool bRet = DrawSingleLine(dc); // 仅绘制一根线
return bRet;
}
else
{
double dLeftArea = GetLeftAreaDist(), // 获得左、右区域宽度
dRightArea = GetRightAreaDist();
if (dLeftArea + dRightArea > GetLRDist() - 1.0E-5) // 仅够盘一圈
{
bool bRet = DrawSingle(dc); // 绘制一圈
return bRet;
}
else if (dWidth < (m_nLeftDist+m_nDist+m_nRightDist) + 1.0E-5)
{
bool bRet = DrawSingle(dc); // 绘制一圈
return bRet;
}
else
{
if (!DrawMulti()) // 绘制多圈
{
return false;
}
}
}
}
BOOL bRetLayar(FALSE); // 是否属于回水
AcDbObjectId idOrigLayer = dc.GetLayerId();
int i = 0; // sg modify
for (i = 0; i < m_LineArr1.GetSize(); i++) // 5、绘制所有管线
{
// mcl add 2010.11.14,支持区分回水图层
if (bRetLayar && idRetLayer.isValid())
dc.SetLayer(idRetLayer);
else
dc.SetLayer(idOrigLayer);
if (i%2 == 0) // 此时,轮到供回水转换
bRetLayar = !bRetLayar;
m_LineArr1[i]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
}
for (i = 0; i < m_LineArr2.GetSize(); i++)
{
// mcl add 2010.11.14,支持区分回水图层
if (i%2 == 1 && idRetLayer.isValid())
dc.SetLayer(idRetLayer);
else
dc.SetLayer(idOrigLayer);
m_LineArr2[i]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
}
for (i = 0; i < m_LineArr3.GetSize(); i++)
{
// mcl add 2010.11.14,支持区分回水图层
if (i%2 == 0 && idRetLayer.isValid())
dc.SetLayer(idRetLayer);
else
dc.SetLayer(idOrigLayer);
m_LineArr3[i]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
}
// add by myy 2015-1-28
for (i = 0; i < m_lineArr4.GetSize(); i++)
{
if ((0 == i || 2 == i) && idOrigLayer.isValid())
dc.SetLayer(idOrigLayer);
else if (idRetLayer.isValid())
dc.SetLayer(idRetLayer);
m_lineArr4[i]->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
}
// add end
if (m_pEndLine != NULL) // 6、绘制最后一根线
{
//add by dyw 20150714 根据大小圆弧为偶数时,最后一根线为回水线,否则为供水线
if(m_LineArr2.GetSize() % 2 == 0)
{
dc.SetLayer(idOrigLayer);
}
else
{
dc.SetLayer(idRetLayer);
}
//add end;
m_pEndLine->DrawTheLine(dc, m_bWeight, m_nColorInd, m_dLineWeight);
}
dc.SetLayer(idOrigLayer);
if (!CreateArcArr(dc, idRetLayer)) // 7、绘制管线连接处的弧线
{
dc.SetLayer(idOrigLayer);
return false;
}
dc.SetLayer(idOrigLayer);
return true;
}
// 区域过小,仅绘制一条线
bool CPipeStyle3::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 CPipeStyle3::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);
//change by dyw 20150421 如果供回点不为空的时候,从新设置供回点, 拖动夹点的时候可以看出效果
// if( m_nEntryType %2 == 0 )
// {
// m_ptDrawSupply = StartPtOut;
// m_ptDrawReturn = StartPtIn;
// }
// else
// {
// m_ptDrawSupply = StartPtIn;
// m_ptDrawReturn = StartPtOut;
// }
if(!! m_ptDrawSupply && !! m_ptDrawReturn)
{
XPoint ptSup, ptRet, ptTmp;
ptSup = m_ptDrawSupply;
ptRet = m_ptDrawReturn;
if(0 == m_nEntryType % 2)
{
ptTmp = ptSup;
ptSup = ptRet;
ptRet = ptTmp;
}
if(m_LineArr1.GetSize() > 1)
{
if(NULL != m_LineArr1[0])
{
m_LineArr1[0]->SetStartPt(ptSup);
}
if(NULL != m_LineArr1[1])
{
m_LineArr1[1]->SetStartPt(ptRet);
}
}
}
else
{
if( m_nEntryType %2 == 0 )
{
m_ptDrawSupply = StartPtOut;
m_ptDrawReturn = StartPtIn;
}
else
{
m_ptDrawSupply = StartPtIn;
m_ptDrawReturn = StartPtOut;
}
}
ads_point StartPt, EndPt;
TransToActualPt(virStartPt, StartPt);
TransToActualPt(virEndPt, EndPt);
CPipeLine *pLine3 = new CPipeLine; // 创建端部直线
pLine3->SetStartPt(StartPt);
pLine3->SetEndPt(EndPt);
m_LineArr1.Add(pLine3);
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, m_dbArcRadius, ArcID, dc)) // 创建圆弧
{
return false;
}
m_ArcArr.Add(ArcID);
if (!CreateArc(EndPtOut, EndPt, CenPtR, m_dbArcRadius, ArcID, dc))
{
return false;
}
m_ArcArr.Add(ArcID);
return true;
}
void CPipeStyle3::PreDrawSingle()
{
m_nNum = 1; // 与m_nLeftNum、m_nRightNume无关
double dbLen1 = GetTBDist() - m_dToWallTB - m_dbArcRadius, // 直线长度
dbLen2 = m_nDist - 2*m_dbArcRadius;
m_dToWallLR = (GetLRDist() - m_nDist)/2; // 调整左右方向距墙距离
XPoint ptStart;
if ((1 == m_nEntryType) || (8 == m_nEntryType))
{
ptStart = m_ptLB;
m_dbAssisAng = 0;
}
else if ((2 == m_nEntryType) || (3 == m_nEntryType))
{
ptStart = m_ptLT;
m_dbAssisAng = 1.5*_PI;
}
else if ((4 == m_nEntryType) || (5 == m_nEntryType))
{
ptStart = m_ptRT;
m_dbAssisAng = _PI;
}
else
{
ptStart = m_ptRB;
m_dbAssisAng = 0.5*_PI;
}
double dTemp = m_dbAssisAng + 0.5*_PI;
ads_point virStartPtIn, virEndPtIn; // 虚拟输入起点、终点
acutPolar(ptStart, m_dbAssisAng, m_dToWallLR, virStartPtIn);
acutPolar(virStartPtIn, dTemp, dbLen1, virEndPtIn);
ads_point virStartPtOut, virEndPtOut; // 虚拟输出起点、终点
acutPolar(virStartPtIn, m_dbAssisAng, m_nDist, virStartPtOut);
acutPolar(virStartPtOut, dTemp, dbLen1, virEndPtOut);
ads_point pt;
ads_point virStartPt, virEndPt; // 端部虚拟起点、终点
acutPolar(virEndPtIn, m_dbAssisAng, m_dbArcRadius, pt);
acutPolar(pt, dTemp, m_dbArcRadius, virStartPt);
acutPolar(virStartPt, m_dbAssisAng, dbLen2, virEndPt);
ads_point StartPtIn, EndPtIn; // 实际起点、终点
TransToActualPt(virStartPtIn, StartPtIn);
TransToActualPt(virEndPtIn, EndPtIn);
CPipeLine *pLine1 = new CPipeLine; // 创建第一条线
pLine1->SetStartPt(StartPtIn);
pLine1->SetEndPt(EndPtIn);
m_LineArr1.Add(pLine1);
ads_point StartPtOut, EndPtOut;
TransToActualPt(virStartPtOut, StartPtOut);
TransToActualPt(virEndPtOut, EndPtOut);
CPipeLine *pLine2 = new CPipeLine; // 创建第2条线
pLine2->SetStartPt(StartPtOut);
pLine2->SetEndPt(EndPtOut);
m_LineArr1.Add(pLine2);
if( m_nEntryType %2 == 0 )
{
m_ptDrawSupply = StartPtOut;
m_ptDrawReturn = StartPtIn;
}
else
{
m_ptDrawSupply = StartPtIn;
m_ptDrawReturn = StartPtOut;
}
ads_point StartPt, EndPt;
TransToActualPt(virStartPt, StartPt);
TransToActualPt(virEndPt, EndPt);
CPipeLine *pLine3 = new CPipeLine; // 创建端部直线
pLine3->SetStartPt(StartPt);
pLine3->SetEndPt(EndPt);
m_LineArr1.Add(pLine3);
}
// 绘制多圈盘管
bool CPipeStyle3::DrawMulti()
{
// 1、给各个参数赋值
if (m_bSameDist) // 统一间距
{
DealSameDist();
}
else // 不统一间距
{
DealDifferentDist();
}
CreateLeftLineArr(); // 2、初始化LINEARR数组
CreateLine2Arr();
CreateLine3Arr();
CreateEndLine();
return true;
}
// 处理相同间距
// 注:主体区域宽度(左右宽度-距墙距离)必须是间距的奇数倍
// 各区的管线数量均为偶数
void CPipeStyle3::DealSameDist()
{
double dWidth = GetLRDist() - 2*m_dToWallLR; // 主体区域宽度
int nNum = (int)(dWidth/m_nDist);
double dDifferent = dWidth - nNum*m_nDist; // 差值
if (!IsEvenNum(nNum)) // 奇数
{
m_nNum = nNum - 1;
m_dToWallLR = m_dToWallTB + dDifferent/2;
}
else // 偶数
{
m_nNum = nNum - 2;
m_dToWallLR = m_dToWallTB + (dDifferent+m_nDist)/2;
}
m_nLeftNum = 2;
m_nRightNum = 0;
m_dbSideDist = m_nDist; // 左区距中区、中区距右区距离
}
// 处理不同间距
// 注:任意区域宽度必须是间距的奇数倍
void CPipeStyle3::DealDifferentDist()
{
// 1、初算m_nLeftNum、m_nRightNum
double dLeftArea = GetLeftAreaDist(); // 获得左区域的宽度,包括距墙距离
int nLeftNum = (int)((dLeftArea-m_dToWallLR)/m_nLeftDist);
if (nLeftNum < 1) // <=m_dToWallLR,没有左区
{
nLeftNum = 1; // 左区必须要有两根
m_nLeftDist = m_nDist;
}
else if (IsEvenNum(nLeftNum)) // 偶数
{
nLeftNum -= 1; // 间距要求必须是奇数
}
double dRightArea = GetRightAreaDist(); // 获得右区域的宽度
int nRightNum = (int)((dRightArea-m_dToWallLR)/m_nRightDist);
if (nRightNum < 1) // <=m_dToWallLR,没有右区
{
nRightNum = -1;
m_nRightDist = m_nDist;
}
else if (IsEvenNum(nRightNum))
{
nRightNum -= 1; // 间距要求必须是奇数
}
m_nLeftNum = nLeftNum + 1;
m_nRightNum = nRightNum + 1;
// 2、计算m_nNum
double dMidArea = GetMidAreaDist(); // 中间区域宽度
int nNum = (int)(dMidArea/m_nDist);
if (nNum < 2) // <=m_nDist,没有中区
{
m_nNum = 0;
m_dbSideDist = dMidArea;
return;
}
double dDifference = dMidArea - nNum*m_nDist; // 差值
if (!IsEvenNum(nNum)) // 奇数
{
m_nNum = nNum - 1;
m_dbSideDist = m_nDist + dDifference/2; // 各个区域之间的间距
}
else // 偶数
{
m_nNum = nNum;
m_dbSideDist = (m_nDist + dDifference)/2;
}
}
//////////////////////////////////////////////////////////////////////
// 初始化LINEARR数组
//////////////////////////////////////////////////////////////////////
void CPipeStyle3::CreateLeftLineArr()
{
double dbLen = GetTBDist() - m_dToWallTB - 3*m_dbArcRadius; // 直线长度
ads_point StartPtIn; // 入口起点
switch(m_nEntryType) // 判断入口
{
case 1:
m_dbAssisAng = 0.0;
acutPolar(m_ptLB, 0, m_dToWallLR, StartPtIn);
break;
case 2:
m_dbAssisAng = 0.5*_PI;
acutPolar(m_ptLB, 0.5*_PI, m_dToWallLR, StartPtIn);
break;
case 3:
m_dbAssisAng = 1.5*_PI;
acutPolar(m_ptLT, 1.5*_PI, m_dToWallLR, StartPtIn);
break;
case 4:
m_dbAssisAng = 0;
acutPolar(m_ptLT, 0, m_dToWallLR, StartPtIn);
break;
case 5:
m_dbAssisAng = _PI;
acutPolar(m_ptRT, _PI, m_dToWallLR, StartPtIn);
break;
case 6:
m_dbAssisAng = 1.5*_PI;
acutPolar(m_ptRT, 1.5*_PI, m_dToWallLR, StartPtIn);
break;
case 7:
m_dbAssisAng = 0.5*_PI;
acutPolar(m_ptRB, 0.5*_PI, m_dToWallLR, StartPtIn);
break;
case 8:
m_dbAssisAng = _PI;
acutPolar(m_ptRB, _PI, m_dToWallLR, StartPtIn);
break;
default:
return;
}
double dAng(m_dbAssisAng + 0.5*_PI); // 统一代码使用
if ((2 == m_nEntryType) || (4 == m_nEntryType) || (6 == m_nEntryType)
|| (8 == m_nEntryType))
{
dAng = m_dbAssisAng - 0.5*_PI;
}
BOOL bPickExist = !!m_ptPickEntry;
double dEntryOffset = 0.0;
if(bPickExist)
{
XPoint ptVirPick;
TransToVirtualPt(m_ptPickEntry, ptVirPick);
//绘制任意开口多出的一圈
ads_point ptTmpS, ptTmpE; //开口线的起点和终点
XPoint ptTmpPro; //选取点的映射点
double dLRExWallDist = GetLRDist() - 2 * m_dToWallLR; //去掉距墙距离的虚拟左右距离
acutPolar(StartPtIn, dAng, m_dToWallTB, ptTmpS);
acutPolar(ptTmpS, m_dbAssisAng, dLRExWallDist, ptTmpE);
XLine ptTmpLine(ptTmpS, ptTmpE);
ptVirPick.Project(&ptTmpLine, ptTmpPro);
double dStartToProDist = acutDistance(ptTmpS, ptTmpPro); //起点到映射点的距离
double dEndToProDist = acutDistance(ptTmpE, ptTmpPro); //终点到映射点的距离
if(PtInLine(ptTmpLine, ptTmpPro))
{
double dRgAreaDist = m_nLeftDist;
if(m_nNum < 2 && m_nRightNum < 2) //没有右区和中区的时候
{
dRgAreaDist = m_nLeftDist;
}
else if(m_nRightNum < 2) //没有右区的时候
{
dRgAreaDist = m_nDist;
}
else //全有的时候
{
dRgAreaDist = m_nRightDist;
}
if(dEndToProDist < dRgAreaDist + 1E-6) //映射点在离终点一个间距的时候开口转换
{
ChangeEntry(StartPtIn);
}
else if(dStartToProDist < m_nLeftDist + 1E-6) //映射点在起始点间距距离内的位置
{}
else
{
/*
| |
| |
| -----------6--------------
| |5
------1------- ----2------
3| |4
*/
m_bDefaultEntry = FALSE;
ads_point ptLine2SAct; //线段2的起点的实际位置
double dLineLen = 0.0; //计算每根线的长度
//起始点到映射点的线段 (线段1)
dLineLen = dStartToProDist - 2 * m_dbArcRadius - m_nLeftDist / 2;
acutPolar(ptTmpS, m_dbAssisAng, m_dbArcRadius, ptTmpS);
TransToActualPt(ptTmpS, ptTmpS);
CPipeLine *pLine = new CPipeLine(ptTmpS, m_dbPGAng, dLineLen, m_dbAssisAng, m_dbNormAng);
m_lineArr4.Add(pLine);
//终点到映射点的距离 (线段2)
dLineLen = dEndToProDist - 2 * m_dbArcRadius - m_nLeftDist / 2;
acutPolar(ptTmpPro, m_dbAssisAng, m_nLeftDist / 2 + m_dbArcRadius, ptLine2SAct);
TransToActualPt(ptLine2SAct, ptLine2SAct);
pLine = new CPipeLine(ptLine2SAct, m_dbPGAng, dLineLen, m_dbAssisAng, m_dbNormAng);
m_lineArr4.Add(pLine);
ads_point ptSupEtry, ptRetEtry; //供水口的的起始点
acutPolar(ptTmpPro, m_dbAssisAng, m_nLeftDist / 2, ptRetEtry);
acutPolar(ptTmpPro, m_dbAssisAng + PI, m_nLeftDist / 2, ptSupEtry);
//开口的供水线 绘制长度固定为100 (线段3)
dLineLen = 100 - m_dbArcRadius;
acutPolar(ptSupEtry, dAng + PI, m_dbArcRadius, ptSupEtry);
TransToActualPt(ptSupEtry, ptSupEtry);
pLine = new CPipeLine(ptSupEtry, m_dbPGAng, dLineLen, dAng + PI, m_dbNormAng);
m_lineArr4.Add(pLine);
//开口的回水线 绘制长度固定为100 (线段4)
acutPolar(ptRetEtry, dAng + PI, m_dbArcRadius, ptRetEtry);
TransToActualPt(ptRetEtry, ptRetEtry);
pLine = new CPipeLine(ptRetEtry, m_dbPGAng, dLineLen, dAng + PI, m_dbNormAng);
m_lineArr4.Add(pLine);
//封口线 (线段5)
dLineLen = m_nLeftDist - 2 * m_dbArcRadius;
acutPolar(ptTmpE, dAng, m_dbArcRadius, ptTmpE);
TransToActualPt(ptTmpE, ptTmpE);
pLine = new CPipeLine(ptTmpE, m_dbPGAng, dLineLen, dAng, m_dbNormAng);
m_lineArr4.Add(pLine);
}
}
else
{
if(dEndToProDist - dStartToProDist < 1E-6) //点不在线上, 如果距终点距离近则需要转换开口方向
{
ChangeEntry(StartPtIn);
}
}
//调整绘制下面盘管的起始点
if(!m_bDefaultEntry)
{
dEntryOffset = 2 * m_nLeftDist;
acutPolar(StartPtIn, dAng, dEntryOffset, StartPtIn);
}
}
//end
ads_point actPt, pt; // 实际点、临时点
TransToActualPt(StartPtIn, actPt);
CPipeLine *line1 = new CPipeLine(actPt, m_dbPGAng, dbLen - dEntryOffset, dAng, m_dbNormAng);
m_LineArr1.Add(line1); // 第一根线
ads_point StartPtOut; // 输出线起点
acutPolar(StartPtIn, m_dbAssisAng, m_nLeftDist, StartPtOut);
TransToActualPt(StartPtOut, actPt);
dbLen = GetTBDist() - m_dToWallTB - m_nLeftDist - m_dbArcRadius - dEntryOffset; // 出口线长
CPipeLine *line2 = new CPipeLine(actPt, m_dbPGAng, dbLen, dAng, m_dbNormAng);
m_LineArr1.Add(line2); // 第二根线
//add by dyw 20150416
if(!m_bDefaultEntry)
{
//线段6
ads_point ptStart;
acutPolar(StartPtOut, m_dbAssisAng, m_dbArcRadius, ptStart);
acutPolar(ptStart, dAng + PI, m_nLeftDist - m_dToWallTB, ptStart);
TransToActualPt(ptStart, ptStart);
double dLineLen = GetLRDist() - 2 * m_dToWallLR - 2 * m_dbArcRadius - m_nLeftDist;
CPipeLine *pLine = new CPipeLine(ptStart, m_dbPGAng, dLineLen, m_dbAssisAng, m_dbNormAng);
m_lineArr4.Add(pLine);
}
//add end
int i(2),
nCount(1); // 计数器,累加到4后,自动归1
dbLen = dbLen - m_dToWallTB - 3*m_dbArcRadius; // 左区线长
for (i = 2; i < m_nLeftNum; i++) // 左区盘管
{
acutPolar(StartPtOut, m_dbAssisAng, (i-1)*m_nLeftDist, pt);
if (i == m_nLeftNum - 1) // 最后一根
{
ads_point_set(pt, StartPtOut); // 记录点坐标,为中区提供参考用
// 调整最后一根线长
if ((m_nNum < 1) && (m_nRightNum < 1)) // 没有中区、右区
{
dbLen = GetTBDist() - 2*m_dToWallTB - m_nLeftDist - 4*m_dbArcRadius - dEntryOffset;
}
else if ((m_nNum < 1) && (m_nRightNum > 1)) // 没有中区,有右区
{
dbLen = GetTBDist() - 2*m_dToWallTB - m_nRightDist - 4*m_dbArcRadius - dEntryOffset;
}
else // 正常情况,与中区线等长
{
dbLen = GetTBDist() - 2*m_dToWallTB - m_nDist - 4*m_dbArcRadius - dEntryOffset;
}
}
double dOffset(m_dToWallTB); // 距离墙边的距离
switch(nCount) {
case 1:
// 没有中区、右区时,需要调整倒数第二根的长度
if ((m_nNum < 1) && (m_nRightNum < 1) && (i == m_nLeftNum-2))
{
dbLen = GetTBDist() - 2*(m_dToWallTB+m_nLeftDist+m_dbArcRadius) - dEntryOffset;
dOffset += m_nLeftDist + m_dbArcRadius;
}
else
{
dOffset += 3*m_dbArcRadius;
}
break;
case 2:
if ((m_nNum > 1) && (i == m_nLeftNum-1))
{
dOffset += m_nDist + m_dbArcRadius;
}
else if ((m_nNum < 1) && (m_nRightNum > 1) && (i == m_nLeftNum-1))
{
dOffset += m_nRightDist + m_dbArcRadius;
}
else
{
dOffset += m_nLeftDist + m_dbArcRadius;
}
break;
case 3:
dOffset += m_nLeftDist + m_dbArcRadius;
// 没有中区、右区时,需要调整倒数第二根的长度
if ((m_nNum < 1) && (m_nRightNum < 1) && (i == m_nLeftNum-2))
{
dbLen = GetTBDist() - 2*(m_dToWallTB+m_nLeftDist+m_dbArcRadius);
}
break;
case 4:
dOffset += 3*m_dbArcRadius;
break;
default:
return;
}
acutPolar(pt, dAng, dOffset, pt); // 确定起点位置
TransToActualPt(pt, actPt);
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, dAng,
m_dbNormAng);
m_LineArr1.Add(line);
nCount++;
if (nCount > 4)
{
nCount = 1; // 将计数器自动归1
}
}
//add by dyw 20150417 左边只有两根(只有出水线和回水线的时候),中区长度需要调整
double dTmpAdjDist = 0.0; //只有出水线和回水线的时候,中区第一条线需要把长度再调整回来
if(2 == m_nLeftNum)
{
dbLen += m_nLeftDist - m_nDist;
}
//add end
for (i = 0; i < m_nNum; i++) // 中区盘管
{
if (i == 0) // 第一根
{
//add by dyw 20150417
if(2 == m_nLeftNum)
{
dTmpAdjDist = m_nLeftDist - m_nDist;
}
else
{
dTmpAdjDist = 0;
}
//add end
acutPolar(StartPtOut, m_dbAssisAng, m_dbSideDist, pt);
ads_point_set(pt, StartPtOut); // 中区起点
}
else
{
dTmpAdjDist = 0;
acutPolar(StartPtOut, m_dbAssisAng, i*m_nDist, pt);
if (i == m_nNum - 1) // 最后一根
{
ads_point_set(pt, StartPtOut); // 记录点坐标,为右区提供参考用
dbLen = GetTBDist() - 2*m_dToWallTB - m_nDist - 4*m_dbArcRadius - dEntryOffset;
}
}
double dOffset(m_dToWallTB); // 距离墙边的距离
switch(nCount) {
case 1:
if ((m_nRightNum < 1) && (i == m_nNum-2)) // 没有右区,倒数第二根
{
dOffset += m_nDist + m_dbArcRadius;
dbLen = GetTBDist() - 2*(m_dToWallTB+m_nDist+m_dbArcRadius) - dEntryOffset;
}
else
{
dOffset += 3*m_dbArcRadius;
}
break;
case 2:
dOffset += m_nDist + m_dbArcRadius;
break;
case 3:
dOffset += m_nDist + m_dbArcRadius;
if ((m_nRightNum < 1) && (i == m_nNum-2)) // 没有右区,倒数第二根
{
dbLen = GetTBDist() - 2*(m_dToWallTB+m_nDist+m_dbArcRadius) - dEntryOffset;
}
break;
case 4:
dOffset += 3*m_dbArcRadius;
break;
default:
return;
}
acutPolar(pt, dAng, dOffset, pt); // 确定起点位置
TransToActualPt(pt, actPt);
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen - dTmpAdjDist, dAng,
m_dbNormAng);
m_LineArr1.Add(line); // 添加
nCount++;
if (nCount > 4)
{
nCount = 1;
}
}
for (i = 0; i < m_nRightNum; i++) // 右区盘管
{
if (i == 0) // 第一根
{
acutPolar(StartPtOut, m_dbAssisAng, m_dbSideDist, pt);
ads_point_set(pt, StartPtOut); // 右区起点
if (m_nNum > 1) // 接中区
{
dbLen = GetTBDist() - 2*m_dToWallTB - m_nDist - 4*m_dbArcRadius - dEntryOffset;
}
else if (m_nNum < 1) // 没有中区,接左区
{
dbLen = GetTBDist() - 2*m_dToWallTB - m_nLeftDist - 4*m_dbArcRadius;
}
}
else
{
acutPolar(StartPtOut, m_dbAssisAng, i*m_nRightDist, pt);
dbLen = GetTBDist() - 2*m_dToWallTB - 4*m_dbArcRadius - m_nRightDist - dEntryOffset;
}
double dOffset(m_dToWallTB); // 距离墙边的距离
switch(nCount) {
case 1:
if (i == m_nRightNum-2) // 倒数第二根
{
dOffset += m_nRightDist + m_dbArcRadius;
dbLen = GetTBDist() - 2*(m_dToWallTB+m_dbArcRadius);
if ((m_nRightNum == 2) && (m_nNum < 1)) // 同时是第一根,接左区
{
dbLen = dbLen - m_nLeftDist - m_nRightDist;
}
else if ((m_nRightNum == 2) && (m_nNum > 1)) // 同时是第一根,接中区
{
dbLen = dbLen - m_nDist - m_nRightDist - dEntryOffset;
}
else
{
dbLen = dbLen - 2*m_nRightDist - dEntryOffset;
}
}
else
{
dOffset += 3*m_dbArcRadius;
}
break;
case 2:
dOffset += m_nRightDist + m_dbArcRadius;
break;
case 3:
if ((i == 0) && (m_nNum < 1)) // 没有中区,接左区
{
dOffset += m_nLeftDist + m_dbArcRadius;
}
else if ((i == 0) && (m_nNum > 1)) // 接中区
{
dOffset += m_nDist + m_dbArcRadius;
}
else
{
dOffset += m_nRightDist + m_dbArcRadius;
if (i == m_nRightNum - 2) // 倒数第二根长度不一样
{
dbLen = GetTBDist() - 2*(m_dToWallTB+m_dbArcRadius+m_nRightDist) - dEntryOffset;
}
}
break;
case 4:
dOffset += 3*m_dbArcRadius;
//add by dyw 20150417
if(2 == m_nRightNum)
{
dbLen += m_nRightDist - 2 * m_dbArcRadius;
}
//add end
break;
default:
return;
}
acutPolar(pt, dAng, dOffset, pt); // 确定起点位置
TransToActualPt(pt, actPt);
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, dAng,
m_dbNormAng);
m_LineArr1.Add(line);
nCount++;
if (nCount > 4)
{
nCount = 1;
}
}
if(!m_bDefaultEntry)
{
//调整原来入口的位置
if(m_LineArr1.GetSize() > 1)
{
double dSupAjDist = 2 * m_nLeftDist - m_dbArcRadius - m_dToWallTB;
double dRetAjDist = m_nLeftDist - m_dbArcRadius - m_dToWallTB;
if(NULL != m_LineArr1[0] && NULL != m_LineArr1[1])
{
ads_point ptNewSupStart, ptNewRetStart;
m_LineArr1[0]->GetStartPt(ptNewSupStart);
m_LineArr1[1]->GetStartPt(ptNewRetStart);
TransToVirtualPt(ptNewSupStart, ptNewSupStart);
TransToVirtualPt(ptNewRetStart, ptNewRetStart);
acutPolar(ptNewSupStart, dAng + PI, dSupAjDist, ptNewSupStart);
acutPolar(ptNewRetStart, dAng + PI, dRetAjDist, ptNewRetStart);
TransToActualPt(ptNewSupStart, ptNewSupStart);
TransToActualPt(ptNewRetStart, ptNewRetStart);
m_LineArr1[0]->SetStartPt(ptNewSupStart);
m_LineArr1[1]->SetStartPt(ptNewRetStart);
}
}
if (m_lineArr4.GetSize() == 6)
{
if(NULL != m_LineArr1[0] && NULL != m_LineArr1[1])
{
if(!!m_ptDrawSupply && !!m_ptDrawReturn)
{
m_lineArr4[2]->SetEndPt(m_ptDrawSupply);
m_lineArr4[3]->SetEndPt(m_ptDrawReturn);
}
else
{
ads_point ptSup, ptRet;
m_lineArr4[2]->GetEndPt(ptSup);
m_lineArr4[3]->GetEndPt(ptRet);
ads_point_set(ptSup, m_ptDrawSupply);
ads_point_set(ptRet, m_ptDrawReturn);
}
}
}
}
else
{
// mcl add 2010.11.17 修正供回水起始点位置,不再多出一个 距墙 的长度
if (m_LineArr1.GetSize() > 1)
{
ads_point ptNewStart;
if (m_LineArr1[0] != NULL)
{
if(!!m_ptDrawSupply)
{
m_LineArr1[0]->SetStartPt(m_ptDrawSupply);
}
else
{
m_LineArr1[0]->GetStartPt(ptNewStart);
acutPolar(ptNewStart, dAng+m_dbPGAng + m_dbNormAng, m_dToWallTB, ptNewStart);
m_LineArr1[0]->SetStartPt(ptNewStart);
m_ptDrawSupply = ptNewStart;
}
}
if (m_LineArr1[1] != NULL)
{
if(!!m_ptDrawReturn)
{
m_LineArr1[1]->SetStartPt(m_ptDrawReturn);
}
else
{
m_LineArr1[1]->GetStartPt(ptNewStart);
acutPolar(ptNewStart, dAng+m_dbPGAng + m_dbNormAng, m_dToWallTB, ptNewStart);
m_LineArr1[1]->SetStartPt(ptNewStart);
m_ptDrawReturn = ptNewStart;
}
}
}
}
}
// 大圆弧部分直线
void CPipeStyle3::CreateLine2Arr()
{
double dbLen(0), // 直线长
dArcRadius(m_dbArcRadius*3); // 大圆弧曲率半径
BOOL bIsUp(TRUE); // 是否顶部
ads_point lastPt, virPt, actPt; // 前一组直线的终点,虚拟点,实际点
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;
dbLen = 3*m_nLeftDist - 2*dArcRadius; // 左区部分大圆线宽
for (i = 0; i < nSize-1; i+=2) // 左区
{
if (i+2 > nSize-1) // 最后一组
{
if ((m_nNum < 1) && (m_nRightNum < 1)) // 没有中区、右区
{
break;
}
if ((m_nNum < 1) && (m_nRightNum > 1)) // 没有中区,有右区
{
dbLen = m_nLeftDist + m_dbSideDist + m_nRightDist - 2*dArcRadius;
}
else
{
dbLen = m_nLeftDist + m_dbSideDist + m_nDist - 2*dArcRadius;
}
}
if (bIsUp) // 上弧
{
m_LineArr1[i]->GetEndPt(lastPt);
bIsUp = FALSE;
}
else // 下弧
{
m_LineArr1[i]->GetStartPt(lastPt);
bIsUp = TRUE;
}
TransToVirtualPt(lastPt, virPt);
ads_point pt;
acutPolar(virPt, m_dbAssisAng, dArcRadius, pt);
if (!bIsUp) // 下弧
{
acutPolar(pt, dDownAng, dArcRadius, pt);
}
else // 上弧
{
acutPolar(pt, dUpAng, dArcRadius, pt);
}
TransToActualPt(pt, actPt);
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, m_dbAssisAng,
m_dbNormAng);
m_LineArr2.Add(line);
}
nSize += m_nNum;
dbLen = 3*m_nDist - 2*dArcRadius; // 中区部分大圆线宽
for (i = m_nLeftNum; i < nSize; i+=2) // 中区
{
if (i+2 > nSize-1) // 最后一组
{
if (m_nRightNum < 1) // 没有右区
{
break;
}
dbLen = m_dbSideDist + m_nDist + m_nRightDist - 2*dArcRadius;
}
if (bIsUp) // 上弧
{
m_LineArr1[i]->GetEndPt(lastPt);
bIsUp = FALSE;
}
else // 下弧
{
m_LineArr1[i]->GetStartPt(lastPt);
bIsUp = TRUE;
}
TransToVirtualPt(lastPt, virPt);
ads_point pt;
acutPolar(virPt, m_dbAssisAng, dArcRadius, pt);
if (!bIsUp) // 下弧
{
acutPolar(pt, dDownAng, dArcRadius, pt);
}
else // 上弧
{
acutPolar(pt, dUpAng, dArcRadius, pt);
}
TransToActualPt(pt, actPt);
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, m_dbAssisAng,
m_dbNormAng);
m_LineArr2.Add(line);
}
nSize += m_nRightNum;
dbLen = 3*m_nRightDist - 2*dArcRadius; // 右区部分大圆线宽
for (i = m_nLeftNum+m_nNum; i < nSize; i+=2) // 右区
{
if (i+2 > nSize-1) // 最后一组
{
break;
}
if (bIsUp) // 上弧
{
m_LineArr1[i]->GetEndPt(lastPt);
bIsUp = FALSE;
}
else // 下弧
{
m_LineArr1[i]->GetStartPt(lastPt);
bIsUp = TRUE;
}
TransToVirtualPt(lastPt, virPt);
ads_point pt;
acutPolar(virPt, m_dbAssisAng, dArcRadius, pt);
if (!bIsUp) // 下弧
{
acutPolar(pt, dDownAng, dArcRadius, pt);
}
else // 上弧
{
acutPolar(pt, dUpAng, dArcRadius, pt);
}
TransToActualPt(pt, actPt);
CPipeLine *line = new CPipeLine(actPt, m_dbPGAng, dbLen, m_dbAssisAng,
m_dbNormAng);
m_LineArr2.Add(line);
}
}
// 小圆弧部分直线
void CPipeStyle3::CreateLine3Arr()
{
double dbLen(0); // 直线长
BOOL bIsUp(TRUE); // 是否顶部
ads_point lastPt, virPt, actPt; // 前一组直线的终点,虚拟点,实际点
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(1),
nSize = m_nLeftNum;
dbLen = m_nLeftDist - 2*m_dbArcRadius;
for (i = 1; i < nSize; i+=2) // 左区
{
if (i+2 > nSize-1)
{
if ((m_nNum < 1) && (m_nRightNum < 1))
{
break;
}
dbLen = m_dbSideDist - 2*m_dbArcRadius;
}
if (bIsUp)
{
m_LineArr1[i]->GetEndPt(lastPt);
bIsUp = FALSE;
}
else
{
m_LineArr1[i]->GetStartPt(lastPt);
bIsUp = TRUE;
}
TransToVirtualPt(lastPt, virPt);
ads_point pt;
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_LineArr3.Add(line);
}
nSize += m_nNum;
dbLen = m_nDist - 2*m_dbArcRadius;
for (i = m_nLeftNum+1; i < nSize; i+=2) // 中区
{
if (i+2 > nSize-1)
{
if (m_nRightNum < 1)
{
break;
}
dbLen = m_dbSideDist - 2*m_dbArcRadius;
}
if (bIsUp)
{
m_LineArr1[i]->GetEndPt(lastPt);
bIsUp = FALSE;
}
else
{
m_LineArr1[i]->GetStartPt(lastPt);
bIsUp = TRUE;
}
TransToVirtualPt(lastPt, virPt);
ads_point pt;
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_LineArr3.Add(line);
}
nSize += m_nRightNum;
dbLen = m_nRightDist - 2*m_dbArcRadius;
for (i = m_nLeftNum+m_nNum+1; i < nSize; i+=2) // 右区
{
if (i+2 > nSize-1)
{
break;
}
if (bIsUp)
{
m_LineArr1[i]->GetEndPt(lastPt);
bIsUp = FALSE;
}
else
{
m_LineArr1[i]->GetStartPt(lastPt);
bIsUp = TRUE;
}
TransToVirtualPt(lastPt, virPt);
ads_point pt;
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_LineArr3.Add(line);
}
}
// 最后两根管线连接时的短线
void CPipeStyle3::CreateEndLine()
{
int nSize = (int)m_LineArr1.GetSize();
if (nSize <= 2)
{
return;
}
BOOL bIsUp(TRUE); // 是否顶部
ads_point lastPt, virPt, actPt; // 前一组直线的终点,虚拟点,实际点
if (IsEvenNum((m_nNum+m_nLeftNum+m_nRightNum)/2))
{
m_LineArr1[nSize-2]->GetStartPt(lastPt);
bIsUp = FALSE;
}
else
{
m_LineArr1[nSize-2]->GetEndPt(lastPt);
bIsUp = TRUE;
}
TransToVirtualPt(lastPt, virPt);
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);
}
ads_point pt;
acutPolar(virPt, m_dbAssisAng, m_dbArcRadius, pt);
if (bIsUp)
{
acutPolar(pt, dUpAng, m_dbArcRadius, pt);
}
else
{
acutPolar(pt, dDownAng, m_dbArcRadius, pt);
}
TransToActualPt(pt, actPt);
double dbLen = m_nRightDist - 2*m_dbArcRadius; // 直线长
m_pEndLine = new CPipeLine(actPt, m_dbPGAng, dbLen, m_dbAssisAng, m_dbNormAng);
}
//////////////////////////////////////////////////////////////////////
// 处理弧线
//////////////////////////////////////////////////////////////////////
bool CPipeStyle3::CreateArcArr( XExplodeDraw &dc,AcDbObjectId idRetLayer /*= AcDbObjectId::kNull*/ )
{
AcDbObjectId ArcIDL, ArcIDR; // 左右圆弧实体ID
ads_point StartPtL, EndPtL, StartPtR, EndPtR; // 左右圆弧起点,圆弧终点
ads_point CenPtL, CenPtR; // 左右圆弧中心点
bool bIsUp = true; // 是否顶部圆弧
// 连接大圆弧
int i(0), j(0), // sg modify
nSize = (int)m_LineArr1.GetSize();
double dRadius(m_dbArcRadius*3); // 大圆弧半径
BOOL bRetLayar(FALSE); // 是否回水
AcDbObjectId idOrigLayer = dc.GetLayerId();
for (i = 0; i < nSize, j < m_LineArr2.GetSize(); i += 2, j++)
{
// mcl add 2010.11.14,支持区分回水图层
if (j%2 == 1 && idRetLayer.isValid())
dc.SetLayer(idRetLayer);
else
dc.SetLayer(idOrigLayer);
if (bIsUp)
{
m_LineArr2[j]->GetStartPt(StartPtL);
m_LineArr1[i]->GetEndPt(EndPtL);
m_LineArr1[i+3]->GetEndPt(StartPtR);
m_LineArr2[j]->GetEndPt(EndPtR);
GetArcCenterPt(EndPtL, 0, dRadius, CenPtL);
GetArcCenterPt(EndPtR, -0.5*_PI, dRadius, CenPtR);
bIsUp = false;
}
else
{
m_LineArr1[i]->GetStartPt(StartPtL);
m_LineArr2[j]->GetStartPt(EndPtL);
m_LineArr2[j]->GetEndPt(StartPtR);
m_LineArr1[i+3]->GetStartPt(EndPtR);
GetArcCenterPt(EndPtL, -1.5*_PI, dRadius, CenPtL);
GetArcCenterPt(EndPtR, _PI, dRadius, CenPtR);
bIsUp = true;
}
if ((1 == m_nEntryType) || (3 == m_nEntryType) || (5 == m_nEntryType)
|| (7 == m_nEntryType))
{
if (!CreateArc(StartPtL, EndPtL, CenPtL, dRadius, ArcIDL,dc))
{
return false;
}
if (!CreateArc(StartPtR, EndPtR, CenPtR, dRadius, ArcIDR,dc))
{
return false;
}
}
else // 反画圆弧
{
if (!CreateArc(EndPtL, StartPtL, CenPtL, dRadius, ArcIDL,dc))
{
return false;
}
if (!CreateArc(EndPtR, StartPtR, CenPtR, dRadius, ArcIDR,dc))
{
return false;
}
}
m_ArcArr.Add(ArcIDL);
m_ArcArr.Add(ArcIDR);
}
// 连接小圆弧
bRetLayar = FALSE;
bIsUp = true;
nSize = (int)m_LineArr1.GetSize();
for (i = 1, j=0; i < nSize-1, j < m_LineArr3.GetSize(); i += 2, j++)
{
// mcl add 2010.11.14,支持区分回水图层
if (j%2 == 0 && idRetLayer.isValid())
dc.SetLayer(idRetLayer);
else
dc.SetLayer(idOrigLayer);
if (bIsUp)
{
m_LineArr3[j]->GetStartPt(StartPtL);
m_LineArr1[i]->GetEndPt(EndPtL);
m_LineArr1[i+1]->GetEndPt(StartPtR);
m_LineArr3[j]->GetEndPt(EndPtR);
GetArcCenterPt(EndPtL, 0, m_dbArcRadius, CenPtL);
GetArcCenterPt(EndPtR, -0.5*_PI, m_dbArcRadius, CenPtR);
bIsUp = false;
}
else
{
m_LineArr1[i]->GetStartPt(StartPtL);
m_LineArr3[j]->GetStartPt(EndPtL);
m_LineArr3[j]->GetEndPt(StartPtR);
m_LineArr1[i+1]->GetStartPt(EndPtR);
GetArcCenterPt(EndPtL, -1.5*_PI, m_dbArcRadius, CenPtL);
GetArcCenterPt(EndPtR, _PI, m_dbArcRadius, CenPtR);
bIsUp = true;
}
if ((1 == m_nEntryType) || (3 == m_nEntryType) || (5 == m_nEntryType)
|| (7 == m_nEntryType))
{
if (!CreateArc(StartPtL, EndPtL, CenPtL, m_dbArcRadius, ArcIDL,dc))
{
return false;
}
if (!CreateArc(StartPtR, EndPtR, CenPtR, m_dbArcRadius, ArcIDR,dc))
{
return false;
}
}
else // 反画圆弧
{
if (!CreateArc(EndPtL, StartPtL, CenPtL, m_dbArcRadius, ArcIDL,dc))
{
return false;
}
if (!CreateArc(EndPtR, StartPtR, CenPtR, m_dbArcRadius, ArcIDR,dc))
{
return false;
}
}
m_ArcArr.Add(ArcIDL);
m_ArcArr.Add(ArcIDR);
}
if (m_pEndLine == NULL) // 连接尾部圆弧
{
return false;
}
int nCount = m_nLeftNum + m_nNum + m_nRightNum;
if (!IsEvenNum(nCount/2))
{
m_pEndLine->GetStartPt(StartPtL);
m_LineArr1[nSize-2]->GetEndPt(EndPtL);
m_LineArr1[nSize-1]->GetEndPt(StartPtR);
m_pEndLine->GetEndPt(EndPtR);
GetArcCenterPt(EndPtL, 0, m_dbArcRadius, CenPtL);
GetArcCenterPt(EndPtR, -0.5*_PI, m_dbArcRadius, CenPtR);
bIsUp = false;
}
else
{
m_LineArr1[nSize-2]->GetStartPt(StartPtL);
m_pEndLine->GetStartPt(EndPtL);
m_pEndLine->GetEndPt(StartPtR);
m_LineArr1[nSize-1]->GetStartPt(EndPtR);
GetArcCenterPt(EndPtL, -1.5*_PI, m_dbArcRadius, CenPtL);
GetArcCenterPt(EndPtR, _PI, m_dbArcRadius, CenPtR);
bIsUp = true;
}
if ((1 == m_nEntryType) || (3 == m_nEntryType) || (5 == m_nEntryType)
|| (7 == m_nEntryType))
{
if (!CreateArc(StartPtL, EndPtL, CenPtL, m_dbArcRadius, ArcIDL,dc))
{
return false;
}
if (!CreateArc(StartPtR, EndPtR, CenPtR, m_dbArcRadius, ArcIDR,dc))
{
return false;
}
}
else // 反画圆弧
{
if (!CreateArc(EndPtL, StartPtL, CenPtL, m_dbArcRadius, ArcIDL,dc))
{
return false;
}
if (!CreateArc(EndPtR, StartPtR, CenPtR, m_dbArcRadius, ArcIDR,dc))
{
return false;
}
}
m_ArcArr.Add(ArcIDL);
m_ArcArr.Add(ArcIDR);
// add by myy 2015-2-9
if (!!m_ptPickEntry && !m_bDefaultEntry)
{
for (i = 0; i < 3; i++)
{
switch (i)
{
case 0:
{
m_LineArr1[0]->GetStartPt(StartPtL);
m_lineArr4[0]->GetStartPt(EndPtL);
m_lineArr4[2]->GetStartPt(StartPtR);
m_lineArr4[0]->GetEndPt(EndPtR);
GetArcCenterPt(EndPtL, -1.5*_PI, m_dbArcRadius, CenPtL);
GetArcCenterPt(EndPtR, -0.5*_PI, m_dbArcRadius, CenPtR);
dc.SetLayer(idOrigLayer);
break;
}
case 1:
{
m_lineArr4[1]->GetStartPt(StartPtL);
m_lineArr4[3]->GetStartPt(EndPtL);
m_lineArr4[1]->GetEndPt(StartPtR);
m_lineArr4[4]->GetStartPt(EndPtR);
GetArcCenterPt(EndPtL, 0, m_dbArcRadius, CenPtL);
GetArcCenterPt(EndPtR, _PI, m_dbArcRadius, CenPtR);
dc.SetLayer(idRetLayer);
break;
}
case 2:
{
m_LineArr1[1]->GetStartPt(StartPtL);
m_lineArr4[5]->GetStartPt(EndPtL);
m_lineArr4[5]->GetEndPt(EndPtR);
m_lineArr4[4]->GetEndPt(StartPtR);
GetArcCenterPt(EndPtL, -1.5*_PI, m_dbArcRadius, CenPtL);
GetArcCenterPt(StartPtR, -_PI, m_dbArcRadius, CenPtR);
dc.SetLayer(idRetLayer);
break;
}
}
if ((1 == m_nEntryType) || (3 == m_nEntryType) || (5 == m_nEntryType) || (7 == m_nEntryType))
{
if (!CreateArc(StartPtL, EndPtL, CenPtL, m_dbArcRadius, ArcIDL,dc))
{
return false;
}
if (!CreateArc(StartPtR, EndPtR, CenPtR, m_dbArcRadius, ArcIDR,dc))
{
return false;
}
}
else // 反画圆弧
{
if (!CreateArc(EndPtL, StartPtL, CenPtL, m_dbArcRadius, ArcIDL,dc))
{
return false;
}
if (!CreateArc(EndPtR, StartPtR, CenPtR, m_dbArcRadius, ArcIDR,dc))
{
return false;
}
}
m_ArcArr.Add(ArcIDL);
m_ArcArr.Add(ArcIDR);
}
}
// add end
return true;
}
/*----------------------------------------------------------------------------*
* 函数名称: CPipeStyle3::CreateArc()
* 功能描述: 创建圆弧
* 参 数: [in] StartPt:圆弧起点
[in] EndPt:圆弧终点
[in] CenPt:圆弧圆心
[in] dbArcRadius:圆弧半径
[out] ObjID:圆弧实体ID
* 返 回 值: 创建是否成功,true:成功,false:失败
* 历 史:
* 备 注: 自定义实体用
-----------------------------------------------------------------------------*/
bool CPipeStyle3::CreateArc(ads_point StartPt, ads_point EndPt, ads_point CenPt,
double dbArcRadius, 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, dbArcRadius, StartAng, EndAng);
// dc.DrawArc(pArc,0); // sg modify
XCurveSegment seg;
seg = pArc;
// if (m_bWeight)
// if (g_bPipeWeight)
if (g_bFloorPipeWeight)
{
double dWeight = DocGetPScale() * m_dLineWeight;
DrawWeight(dc, dWeight, seg, m_nColorInd, 1.0);
}
else
{
dc << seg;
}
return true;
}
void CPipeStyle3::GetArcCenterPt(ads_point EndPt, double dbAng,
double dbArcRadius, 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, dbArcRadius, CenPt);
break;
case 2:
acutPolar(virPt, 0.5*_PI-dbAng, dbArcRadius, CenPt);
break;
case 3:
acutPolar(virPt, dbAng+1.5*_PI, dbArcRadius, CenPt);
break;
case 4:
acutPolar(virPt, 0-dbAng, dbArcRadius, CenPt);
break;
case 5:
acutPolar(virPt, dbAng+_PI, dbArcRadius, CenPt);
break;
case 6:
acutPolar(virPt, 1.5*_PI-dbAng, dbArcRadius, CenPt);
break;
case 7:
acutPolar(virPt, dbAng+0.5*_PI, dbArcRadius, CenPt);
break;
case 8:
acutPolar(virPt, _PI-dbAng, dbArcRadius, CenPt);
break;
default :
return;
}
TransToActualPt(CenPt, actCenPt);
}
void CPipeStyle3::ChangeEntry(ads_point &StartPtIn)
{
switch(m_nEntryType) // 判断入口
{
case 8:
m_dbAssisAng = 0.0;
acutPolar(m_ptLB, 0, m_dToWallLR, StartPtIn);
break;
case 3:
m_dbAssisAng = 0.5*_PI;
acutPolar(m_ptLB, 0.5*_PI, m_dToWallLR, StartPtIn);
break;
case 2:
m_dbAssisAng = 1.5*_PI;
acutPolar(m_ptLT, 1.5*_PI, m_dToWallLR, StartPtIn);
break;
case 5:
m_dbAssisAng = 0;
acutPolar(m_ptLT, 0, m_dToWallLR, StartPtIn);
break;
case 4:
m_dbAssisAng = _PI;
acutPolar(m_ptRT, _PI, m_dToWallLR, StartPtIn);
break;
case 7:
m_dbAssisAng = 1.5*_PI;
acutPolar(m_ptRT, 1.5*_PI, m_dToWallLR, StartPtIn);
break;
case 6:
m_dbAssisAng = 0.5*_PI;
acutPolar(m_ptRB, 0.5*_PI, m_dToWallLR, StartPtIn);
break;
case 1:
m_dbAssisAng = _PI;
acutPolar(m_ptRB, _PI, m_dToWallLR, StartPtIn);
break;
default:
return;
}
}