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

2106 lines
53 KiB
C++
Raw Permalink Blame History

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