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

1419 lines
31 KiB
C++

#include "stdafx.h"
#include "TDbExtentsEdge.h"
#include "dbsymutl.h"
#include "TCoverBooleanOper.h"
#include "math.h"
// 2001.5.9 mcl 绘制设置图层方式dc.SetLayer() 改为SetColorLayer(),
// SetLayer()方式会导致关闭图层后,仍能打印
#define COLOR_BYLAYER 256
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
static const Adesk::UInt16 kColorByLayer = 256;
TComplexCurve::TComplexCurve()
{
}
TComplexCurve::TComplexCurve(const TComplexCurve& src)
{
for (int i = 0;i < src.m_arCurElements.GetSize();i++)
{
m_arCurElements.Add(src.at(i));
}
}
TComplexCurve::~TComplexCurve()
{
}
TComplexCurve& TComplexCurve::operator = (const TComplexCurve& src)
{
if (this != &src)
{
for (int i = 0;i < src.m_arCurElements.GetSize();i++)
{
m_arCurElements.Add(src.at(i));
}
}
return *this;
}
TDb::TCurveElement TComplexCurve::operator [] (int nIndex)
{
ASSERT(nIndex > -1 && nIndex < m_arCurElements.GetSize());
return m_arCurElements[nIndex];
}
const TDb::TCurveElement TComplexCurve::operator [] (int nIndex) const
{
ASSERT(nIndex > -1 && nIndex < m_arCurElements.GetSize());
return m_arCurElements.GetAt(nIndex);
}
TDb::TCurveElement TComplexCurve::at(int nIndex) const
{
ASSERT(nIndex > -1 && nIndex < m_arCurElements.GetSize());
return m_arCurElements.GetAt(nIndex);
}
TDb::TCurveElement& TComplexCurve::atByRef(int nIndex)
{
ASSERT(nIndex > -1 && nIndex < m_arCurElements.GetSize());
return m_arCurElements.ElementAt(nIndex);
}
TComplexCurve& TComplexCurve::setAt(int nIndex, TDb::TCurveElement& value)
{
m_arCurElements.SetAt(nIndex,value);
return *this;
}
TDb::TCurveElement TComplexCurve::first()
{
ASSERT(m_arCurElements.GetSize() > 0);
return m_arCurElements[0];
}
const TDb::TCurveElement TComplexCurve::first() const
{
ASSERT(m_arCurElements.GetSize() > 0);
return m_arCurElements[0];
}
TDb::TCurveElement TComplexCurve::last()
{
ASSERT(m_arCurElements.GetSize() > 0);
return m_arCurElements[m_arCurElements.GetSize() - 1];
}
const TDb::TCurveElement TComplexCurve::last() const
{
ASSERT(m_arCurElements.GetSize() > 0);
return m_arCurElements.GetAt(m_arCurElements.GetSize() - 1);
}
int TComplexCurve::append(TDb::TCurveElement& value)
{
m_arCurElements.Add(value);
return (int)(m_arCurElements.GetSize() - 1);
}
TComplexCurve& TComplexCurve::append(const TComplexCurve& src)
{
TDb::TCurveElement el;
for (int i = 0;i < src.m_arCurElements.GetSize();i++)
{
el = src.at(i);
m_arCurElements.Add(el);
}
return *this;
}
TDb::TCurveElement TComplexCurve::removeAt(int nIndex)
{
ASSERT(nIndex > -1 && nIndex < m_arCurElements.GetSize());
TDb::TCurveElement el = m_arCurElements.GetAt(nIndex);
m_arCurElements.RemoveAt(nIndex);
return el;
}
BOOL TComplexCurve::remove(TDb::TCurveElement& value, int start)
{
BOOL bSuccess = FALSE;
TDb::TCurveElement el;
memset(&el,0,sizeof(TDb::TCurveElement));
int i = start;
while(i < m_arCurElements.GetSize())
{
el = m_arCurElements.GetAt(i);
if (isEqual(el,value))
{
m_arCurElements.RemoveAt(i);
bSuccess = TRUE;
}
else
{
i++;
}
}
return bSuccess;
}
BOOL TComplexCurve::isEqual(const TDb::TCurveElement& value1,const TDb::TCurveElement& value2) const
{
if (value1.ptGe[0].distanceTo(value2.ptGe[0]) < 1.e-6 &&
value1.ptGe[1].distanceTo(value2.ptGe[1]) < 1.e-6 &&
value1.ptGe[2].distanceTo(value2.ptGe[2]) < 1.e-6)
{
return TRUE;
}
return FALSE;
}
int TComplexCurve::logicalLength() const
{
return (int)m_arCurElements.GetSize();
}
void TComplexCurve::setLogicalLength(int nIndex)
{
if (nIndex == 0)
{
m_arCurElements.RemoveAll();
}
}
TDb::TCurveElement TComplexCurve::removeFirst()
{
ASSERT(m_arCurElements.GetSize() > 0);
TDb::TCurveElement el = m_arCurElements.GetAt(0);
m_arCurElements.RemoveAt(0);
return el;
}
TDb::TCurveElement TComplexCurve::removeLast()
{
ASSERT(m_arCurElements.GetSize() > 0);
TDb::TCurveElement el = m_arCurElements.GetAt(m_arCurElements.GetSize() - 1);
m_arCurElements.RemoveAt(0);
return el;
}
BOOL TComplexCurve::find(const TDb::TCurveElement& value, int& foundAt,int start) const
{
BOOL bSuccess = FALSE;
TDb::TCurveElement el;
memset(&el,0,sizeof(TDb::TCurveElement));
int i = start;
while(i < m_arCurElements.GetSize())
{
el = m_arCurElements.GetAt(i);
if (isEqual(el,value))
{
foundAt = i;
break;
}
else
{
i++;
}
}
return bSuccess;
}
int TComplexCurve::length() const
{
return (int)m_arCurElements.GetSize();
}
BOOL TComplexCurve::isEmpty() const
{
return (m_arCurElements.GetSize() == 0) ? TRUE : FALSE;
}
void TComplexCurve::setSubElementGsMark(int nGsMark)
{
for (int i = 0;i < m_arCurElements.GetSize();i++)
{
m_arCurElements[i].gsMark = nGsMark;
}
}
TDbExtentsEdge::TDbExtentsEdge()
{
}
TDbExtentsEdge::~TDbExtentsEdge()
{
}
TDbExtentsEdge::TDbExtentsEdge(const TDbExtentsEdge& src)
{
m_idOwner = src.m_idOwner;
if (src.m_curEdage.length() > 0)
{
m_curEdage = src.m_curEdage;
}
}
void TDbExtentsEdge::SetOwnerId(AcDbObjectId& id)
{
m_idOwner = id;
}
AcDbObjectId TDbExtentsEdge::GetOwnerId()
{
return m_idOwner;
}
void TDbExtentsEdge::SetEdage(const TComplexCurve& curEdage)
{
m_curEdage.setLogicalLength(0);
for (int i = 0;i < curEdage.length();i++)
{
m_curEdage.append(curEdage.at(i));
}
}
BOOL TDbExtentsEdge::GetEdage(TComplexCurve& curEdage)
{
for (int i = 0;i < m_curEdage.length();i++)
{
curEdage.append(m_curEdage.at(i));
}
return TRUE;
}
// mcl, add.10.01.22.两端各沿原方向,延长指定距离
void TDbExtentsEdge::ExtendStartAndEnd(double dExtLen)
{
AcGeTol tol;
tol.setEqualPoint(1);
AcGeVector3d vtExtent;
int i(0);
for (i = 0;i < m_curEdage.length();i++)
{
if (m_curEdage.atByRef(i).ptGe[1].isEqualTo(m_curEdage.atByRef(i).ptGe[2], tol)) // 直线
{
vtExtent = (m_curEdage.atByRef(i).ptGe[1] - m_curEdage.atByRef(i).ptGe[0]).normalize() * dExtLen;
m_curEdage.atByRef(i).ptGe[0] -= vtExtent;
m_curEdage.atByRef(i).ptGe[1] += vtExtent;
m_curEdage.atByRef(i).ptGe[2] = m_curEdage.atByRef(i).ptGe[1];
}
else // 圆弧,少数情况
{
AcGeCircArc3d arc(m_curEdage.atByRef(i).ptGe[0], m_curEdage.atByRef(i).ptGe[1], m_curEdage.atByRef(i).ptGe[2]);
// double dPercent = dExtLen / (arc.radius() * 2 * PI);
// double dRote = PI*2 * dPercent;
// 换算如下
double dRote = dExtLen / arc.radius();
AcGeVector3d vtNormal = arc.normal();
AcGePoint3d ptCenter = arc.center();
m_curEdage.atByRef(i).ptGe[0].rotateBy(-dRote, vtNormal, ptCenter);
m_curEdage.atByRef(i).ptGe[2].rotateBy(dRote, vtNormal, ptCenter);
}
}
}
BOOL TDbExtentsEdge::GetEdage(TComplexCurve& curEdage) const
{
for (int i = 0;i < m_curEdage.length();i++)
{
curEdage.append(m_curEdage.at(i));
}
return TRUE;
}
TDbExtentsEdge& TDbExtentsEdge::operator = (const TDbExtentsEdge& src)
{
if (this != &src)
{
m_idOwner = src.m_idOwner;
m_curEdage.setLogicalLength(0);
for (int i = 0;i < src.m_curEdage.length();i++)
{
m_curEdage.append(src.m_curEdage.at(i));
}
}
return *this;
}
Acad::ErrorStatus TDbExtentsEdge::dxfOutFields(AcDbDxfFiler* pFiler) const
{
return pFiler->filerStatus();
}
Acad::ErrorStatus TDbExtentsEdge::dxfInFields(AcDbDxfFiler* pFiler)
{
return pFiler->filerStatus();
}
Acad::ErrorStatus TDbExtentsEdge::dwgOutFields(AcDbDwgFiler* pFiler) const
{
if (pFiler != NULL)
{
pFiler->writeSoftPointerId(m_idOwner);
Adesk::UInt32 lLen = m_curEdage.length();
pFiler->writeUInt32(lLen);
for (Adesk::UInt32 i = 0;i < lLen;i++)
{
pFiler->writePoint3d(m_curEdage.at(i).ptGe[0]);
pFiler->writePoint3d(m_curEdage.at(i).ptGe[1]);
pFiler->writePoint3d(m_curEdage.at(i).ptGe[2]);
pFiler->writeUInt16(m_curEdage.at(i).bHided);
pFiler->writeUInt32(m_curEdage.at(i).gsMark);
pFiler->writeDouble(m_curEdage.at(i).dWidth);
}
}
return pFiler->filerStatus();
}
Acad::ErrorStatus TDbExtentsEdge::dwgInFields(AcDbDwgFiler* pFiler)
{
if (pFiler != NULL)
{
pFiler->readSoftPointerId(&m_idOwner);
TDb::TCurveElement curEl;
memset(&curEl,0,sizeof(TDb::TCurveElement));
Adesk::UInt32 lLen = 0l;
pFiler->readUInt32(&lLen);
m_curEdage.setLogicalLength(0);
for (Adesk::UInt32 i = 0;i < lLen;i++)
{
pFiler->readPoint3d(&curEl.ptGe[0]);
pFiler->readPoint3d(&curEl.ptGe[1]);
pFiler->readPoint3d(&curEl.ptGe[2]);
pFiler->readUInt16((Adesk::UInt16*)&curEl.bHided);
pFiler->readUInt32((Adesk::UInt32*)&curEl.gsMark);
pFiler->readDouble(&curEl.dWidth);
m_curEdage.append(curEl);
}
}
return pFiler->filerStatus();
}
void TDbExtentsEdge::OrthProjectEl2XYPlan(TDb::TCurveElement& el)
{
AcGePoint3d ptGe;
for (int i = 0;i < 3;i++)
{
ptGe = el.ptGe[i].orthoProject(AcGePlane::kXYPlane);
el.ptGe[i] = ptGe;
}
}
Adesk::Boolean TDbExtentsEdge::ExplodeOrDraw2d( XExplodeDraw &dc,const AcDbObjectId& idReal,
const AcDbObjectId& idDash,const AcDbObjectId& idCen,
TDb::TCurveElement* pElTmpl,BOOL bWeight,BOOL bCenWeight,
double dPScale)
{
//从注册表中读取显示方式
AcDbObjectId idOld,idOldLt;
BOOL bHideDraw = 1;
GetGlobalContext(KEY_HIDEDRAW,bHideDraw);
// add by hh 2011-01-05 从图纸中读取遮挡参数 避免全局参数对不同的图纸间的影响
TAuxTools::GetTHvacDataFromDwg(KEY_HIDEDRAW, bHideDraw);
int nColorIndexOld = -1,nCount = 0;
nColorIndexOld = dc.GetColor();
//显示
TDb::TCurveElement el;
memset(&el,0,sizeof(TDb::TCurveElement));
nColorIndexOld = dc.GetColor();
// 增加桥架隔板颜色
dc.SetColor(kColorByLayer);
for (int i = 0;i < m_curEdage.length();i++)
{
el = m_curEdage.at(i);
// tsj modyf:2010.11.17
if (el.gsMark == -2)
{
dc.SetColor(el.nColorIndex);
}
//画时,把点投影到XY面,在XY面
OrthProjectEl2XYPlan(el);
//复制来自模板的宽度属性等
if (pElTmpl != NULL)
{
el.dWidth = pElTmpl->dWidth;
}
//if (el.ptGe[1].distanceTo(el.ptGe[2]) < AcGeContext::gTol.equalPoint()) //直线
if (el.ptGe[1].distanceTo(el.ptGe[2]) < g_globalTol.equalPoint()) // modify by cq TFS8208
{
if (el.bHided) // 虚线 + 画
{
if (bHideDraw)//显示
{
if (el.gsMark == -1 )//中心线
{
idOldLt = dc.GetLineTypeId();
idOld = dc.GetLayerId();
if (!el.idSubLay.isValid() )
{
// dc.SetLayer(idDash); // mcl changed 2011.5.9 SetLayer会导致关闭图层后,仍能打印的问题,下同
dc.SetColorLayer(COLOR_BYLAYER, idDash);
}
else
{
// dc.SetLayer(el.idSubLay);
dc.SetColorLayer(COLOR_BYLAYER, el.idSubLay);
}
if (el.idSubLty.isValid())
{
dc.SetLineType(el.idSubLty);
}
if (el.dWidth > 1.e-6) //有宽度
{
if (bCenWeight) //中心线,且宽度显示
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl);
if (pPl != NULL)
{
pPl->setConstantWidth(el.dWidth * dPScale);
dc.Polyline(*pPl);
delete pPl;
}
}
else //有宽度,但不显示,画单线
{
dc.DrawLine(XLine(asDblArray(el.ptGe[0]),asDblArray(el.ptGe[1])));
}
}
else //没有宽度
{
dc.DrawLine(XLine(asDblArray(el.ptGe[0]),asDblArray(el.ptGe[1])));
}
dc.SetLayer(idOld);
dc.SetLineType(idOldLt);
}
else //非中心线
{
idOld = dc.GetLayerId();
idOldLt = dc.GetLineTypeId();
if (!el.idSubLay.isValid() )
{
// dc.SetLayer(idDash);
dc.SetColorLayer(COLOR_BYLAYER, idDash);
}
else
{
// dc.SetLayer(el.idSubLay);
dc.SetColorLayer(COLOR_BYLAYER, el.idSubLay);
}
if (el.idSubLty.isValid())
{
dc.SetLineType(el.idSubLty);
}
if (el.dWidth > 1.e-6) //有宽度
{
if (bWeight) //中心线,且宽度显示
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl);
if (pPl != NULL)
{
if (el.gsMark == -2)
pPl->setColorIndex(el.nColorIndex);
pPl->setConstantWidth(el.dWidth * dPScale);
dc.Polyline(*pPl);
delete pPl;
}
}
else //有宽度,但不显示,画单线
{
dc.DrawLine(XLine(asDblArray(el.ptGe[0]),asDblArray(el.ptGe[1])));
}
}
else
{
dc.DrawLine(XLine(asDblArray(el.ptGe[0]),asDblArray(el.ptGe[1])));
}
dc.SetLayer(idOld);
dc.SetLineType(idOldLt);
}
}
}
else // 实线
{
if (el.gsMark == -1) //中心线
{
idOldLt = dc.GetLineTypeId();
idOld = dc.GetLayerId();
if (!el.idSubLay.isValid() )
{
// dc.SetLayer(idCen);
dc.SetColorLayer(COLOR_BYLAYER, idCen);
}
else
{
// dc.SetLayer(el.idSubLay);
dc.SetColorLayer(COLOR_BYLAYER, el.idSubLay);
}
if (el.idSubLty.isValid())
{
dc.SetLineType(el.idSubLty);
}
if (el.dWidth > 1.e-6 && bCenWeight)
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl);
if (pPl != NULL)
{
pPl->setConstantWidth(el.dWidth * dPScale);
dc.Polyline(*pPl);
delete pPl;
}
}
else
{
dc.DrawLine(XLine(asDblArray(el.ptGe[0]),asDblArray(el.ptGe[1])));
}
dc.SetLayer(idOld);
dc.SetLineType(idOldLt);
}
else //非中心线
{
if (el.ptGe[0].distanceTo(el.ptGe[1]) > 1.e-10) //不重合
{
idOldLt = dc.GetLineTypeId();
idOld = dc.GetLayerId();
if (!el.idSubLay.isValid() )
{
// dc.SetLayer(idReal);
dc.SetColorLayer(COLOR_BYLAYER, idReal);
if (el.gsMark == -2)
{
//隔板线
dc.SetColorLayer(el.nColorIndex, idReal);
//隔板线保持 实线
AcDbObjectId idLineType = GetLinetypeIdFromString(_T("CONTINUOUS"));
dc.SetLineType(idLineType);
}
}
else
{
// dc.SetLayer(el.idSubLay);
dc.SetColorLayer(COLOR_BYLAYER, el.idSubLay);
if (el.gsMark == -2)
{
//隔板线
dc.SetColorLayer(el.nColorIndex, idReal);
//隔板线保持 实线
AcDbObjectId idLineType = GetLinetypeIdFromString(_T("CONTINUOUS"));
dc.SetLineType(idLineType);
}
}
if (el.idSubLty.isValid())
{
dc.SetLineType(el.idSubLty);
}
if (el.dWidth > 1.e-6 && bWeight)
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl);
if (pPl != NULL)
{
if (el.gsMark == -2)
pPl->setColorIndex(el.nColorIndex);
pPl->setConstantWidth(el.dWidth * dPScale);
dc.Polyline(*pPl);
delete pPl;
}
}
else
{
dc.DrawLine(XLine(asDblArray(el.ptGe[0]),asDblArray(el.ptGe[1])));
}
dc.SetLayer(idOld);
dc.SetLineType(idOldLt);
}
}
}
}
else //ARC 圆弧
{
if (el.bHided)// 虚线 + 画
{
if (bHideDraw) //显示
{
if (el.gsMark == -1 ) //中心线
{
idOldLt = dc.GetLineTypeId();
idOld = dc.GetLayerId();
if (!el.idSubLay.isValid() )
{
// dc.SetLayer(idDash);
dc.SetColorLayer(COLOR_BYLAYER, idDash);
}
else
{
// dc.SetLayer(el.idSubLay);
dc.SetColorLayer(COLOR_BYLAYER, el.idSubLay);
}
if (el.idSubLty.isValid())
{
dc.SetLineType(el.idSubLty);
}
if (el.dWidth > 1.e-6 && bCenWeight)
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl,TRUE);
if (pPl != NULL)
{
pPl->setConstantWidth(el.dWidth * dPScale);
dc.Polyline(*pPl);
delete pPl;
}
}
else
{
dc.DrawArc(XArc(asDblArray(el.ptGe[0]),asDblArray(el.ptGe[1]),asDblArray(el.ptGe[2])));
}
dc.SetLayer(idOld);
dc.SetLineType(idOldLt);
}
else //非中心线
{
if (el.ptGe[0].distanceTo(el.ptGe[1]) > 1.e-10) //不重合
{
idOldLt = dc.GetLineTypeId();
idOld = dc.GetLayerId();
if (!el.idSubLay.isValid() )
{
// dc.SetLayer(idDash);
dc.SetColorLayer(COLOR_BYLAYER, idDash);
}
else
{
// dc.SetLayer(el.idSubLay);
dc.SetColorLayer(COLOR_BYLAYER, el.idSubLay);
}
if (el.idSubLty.isValid())
{
dc.SetLineType(el.idSubLty);
}
if (el.dWidth > 1.e-6 && bWeight) //宽度显示
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl,TRUE);
if (pPl != NULL)
{
if (el.gsMark == -2)
pPl->setColorIndex(el.nColorIndex);
pPl->setConstantWidth(el.dWidth * dPScale);
dc.Polyline(*pPl);
delete pPl;
}
}
else
{
dc.DrawArc(XArc(asDblArray(el.ptGe[0]),asDblArray(el.ptGe[1]),asDblArray(el.ptGe[2])));
}
dc.SetLayer(idOld);
dc.SetLineType(idOldLt);
}
}
}
}
else// 实
{
if (el.gsMark == -1 ) //中心线
{
idOldLt = dc.GetLineTypeId();
idOld = dc.GetLayerId();
if (!el.idSubLay.isValid() )
{
// dc.SetLayer(idCen);
dc.SetColorLayer(COLOR_BYLAYER, idCen);
}
else
{
// dc.SetLayer(el.idSubLay);
dc.SetColorLayer(COLOR_BYLAYER, el.idSubLay);
}
if (el.idSubLty.isValid())
{
dc.SetLineType(el.idSubLty);
}
if (el.dWidth > 1.e-6 && bCenWeight)
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl,TRUE);
if (pPl != NULL)
{
pPl->setConstantWidth(el.dWidth * dPScale);
dc.Polyline(*pPl);
delete pPl;
}
}
else
{
dc.DrawArc(XArc(asDblArray(el.ptGe[0]),asDblArray(el.ptGe[1]),asDblArray(el.ptGe[2])));
}
dc.SetLayer(idOld);
dc.SetLineType(idOldLt);
}
else //非中心线
{
idOldLt = dc.GetLineTypeId();
idOld = dc.GetLayerId();
if (!el.idSubLay.isValid() )
{
// dc.SetLayer(idReal);
dc.SetColorLayer(COLOR_BYLAYER, idReal);
if (el.gsMark == -2)
{
//隔板线
dc.SetColorLayer(el.nColorIndex, idReal);
//隔板线保持 实线
AcDbObjectId idLineType = GetLinetypeIdFromString(_T("CONTINUOUS"));
dc.SetLineType(idLineType);
}
}
else
{
// dc.SetLayer(el.idSubLay);
dc.SetColorLayer(COLOR_BYLAYER, el.idSubLay);
}
if (el.idSubLty.isValid())
{
dc.SetLineType(el.idSubLty);
}
if (el.dWidth > 1.e-6 && bWeight) //宽度显示
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl,TRUE);
if (pPl != NULL)
{
if (el.gsMark == -2)
pPl->setColorIndex(el.nColorIndex);
pPl->setConstantWidth(el.dWidth * dPScale);
dc.Polyline(*pPl);
delete pPl;
}
}
else
{
dc.DrawArc(XArc(asDblArray(el.ptGe[0]),asDblArray(el.ptGe[1]),asDblArray(el.ptGe[2])));
}
dc.SetLayer(idOld);
dc.SetLineType(idOldLt);
}
}
}
// tsj modyf:2010.11.17
if (el.gsMark == -2)
{
dc.SetColor(kColorByLayer);
}
}
dc.SetColor(nColorIndexOld);
return Adesk::kTrue;
}
Adesk::Boolean TDbExtentsEdge::explode( AcDbVoidPtrArray& entitySet,const AcDbObjectId& idReal,
const AcDbObjectId& idDash,const AcDbObjectId& idCen,
TDb::TCurveElement* pElTmpl,BOOL bWeight,
BOOL bCenWeight)
{
//从注册表中读取显示方式
AcDbObjectId idOld,idOldLt;
BOOL bHideDraw = 1;
GetGlobalContext(KEY_HIDEDRAW,bHideDraw);
// add by hh 2011-01-05 从图纸中读取遮挡参数 避免全局参数对不同的图纸间的影响
TAuxTools::GetTHvacDataFromDwg(KEY_HIDEDRAW, bHideDraw);
int nColorIndexOld = -1,nCount = 0;
//显示
TDb::TCurveElement el;
memset(&el,0,sizeof(TDb::TCurveElement));
for (int i = 0;i < m_curEdage.length();i++)
{
el = m_curEdage.at(i);
//复制来自模板的宽度属性等
if (pElTmpl != NULL)
{
el.dWidth = pElTmpl->dWidth;
}
//if (el.ptGe[1].distanceTo(el.ptGe[2]) < AcGeContext::gTol.equalPoint()) //直线
if (el.ptGe[1].distanceTo(el.ptGe[2]) < g_globalTol.equalPoint()) // modify by cq TFS8208
{
if (el.bHided) // 虚线 + 画
{
if (bHideDraw)//显示
{
if (el.gsMark == -1 )//中心线
{
if (el.dWidth > 1.e-6) //有宽度
{
if (bCenWeight) //中心线,且宽度显示
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl);
if (pPl != NULL)
{
SetProperty(el,pPl,idReal,idDash,idCen);
entitySet.append(pPl);
}
}
else //有宽度,但不显示,画单线
{
el.dWidth = 0.0;
AcDbLine* pLine = NULL;
MakeLine(el,pLine);
if (pLine != NULL)
{
SetProperty(el,pLine,idReal,idDash,idCen);
entitySet.append(pLine);
}
}
}
else //没有宽度
{
el.dWidth = 0.0;
AcDbLine* pLine = NULL;
MakeLine(el,pLine);
if (pLine != NULL)
{
SetProperty(el,pLine,idReal,idDash,idCen);
entitySet.append(pLine);
}
}
}
else //非中心线
{
if (el.dWidth > 1.e-6) //有宽度
{
if (bWeight) //中心线,且宽度显示
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl);
if (pPl != NULL)
{
SetProperty(el,pPl,idReal,idDash,idCen);
entitySet.append(pPl);
}
}
else //有宽度,但不显示,画单线
{
el.dWidth = 0.0;
AcDbLine* pLine = NULL;
MakeLine(el,pLine);
if (pLine != NULL)
{
SetProperty(el,pLine,idReal,idDash,idCen);
entitySet.append(pLine);
}
}
}
else
{
el.dWidth = 0.0;
AcDbLine* pLine = NULL;
MakeLine(el,pLine);
if (pLine != NULL)
{
SetProperty(el,pLine,idReal,idDash,idCen);
entitySet.append(pLine);
}
}
}
}
}
else // 实线
{
if (el.gsMark == -1) //中心线
{
if (el.dWidth > 1.e-6 && bCenWeight)
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl);
if (pPl != NULL)
{
SetProperty(el,pPl,idReal,idDash,idCen);
entitySet.append(pPl);
}
}
else
{
el.dWidth = 0.0;
AcDbLine* pLine = NULL;
MakeLine(el,pLine);
if (pLine != NULL)
{
SetProperty(el,pLine,idReal,idDash,idCen);
entitySet.append(pLine);
}
}
}
else //非中心线
{
if (el.ptGe[0].distanceTo(el.ptGe[1]) > 1.e-10) //不重合
{
if (el.dWidth > 1.e-6 && bWeight)
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl);
if (pPl != NULL)
{
SetProperty(el,pPl,idReal,idDash,idCen);
entitySet.append(pPl);
}
}
else
{
el.dWidth = 0.0;
AcDbLine* pLine = NULL;
MakeLine(el,pLine);
if (pLine != NULL)
{
SetProperty(el,pLine,idReal,idDash,idCen);
entitySet.append(pLine);
}
}
}
}
}
}
else //ARC 圆弧
{
if (el.bHided)// 虚线 + 画
{
if (bHideDraw) //显示
{
if (el.gsMark == -1 ) //中心线
{
if (el.dWidth > 1.e-6 && bCenWeight)
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl,TRUE);
if (pPl != NULL)
{
SetProperty(el,pPl,idReal,idDash,idCen);
entitySet.append(pPl);
}
}
else
{
el.dWidth = 0.0;
AcDbArc* pArc = NULL;
MakeArc(el,pArc);
if (pArc != NULL)
{
SetProperty(el,pArc,idReal,idDash,idCen);
entitySet.append(pArc);
}
}
}
else //非中心线
{
if (el.ptGe[0].distanceTo(el.ptGe[1]) > 1.e-10) //不重合
{
if (el.dWidth > 1.e-6 && bWeight) //宽度显示
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl,TRUE);
if (pPl != NULL)
{
SetProperty(el,pPl,idReal,idDash,idCen);
entitySet.append(pPl);
}
}
else
{
el.dWidth = 0.0;
AcDbArc* pArc = NULL;
MakeArc(el,pArc);
if (pArc != NULL)
{
SetProperty(el,pArc,idReal,idDash,idCen);
entitySet.append(pArc);
}
}
}
}
}
}
else// 实
{
if (el.gsMark == -1 ) //中心线
{
if (el.dWidth > 1.e-6 && bCenWeight)
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl,TRUE);
if (pPl != NULL)
{
SetProperty(el,pPl,idReal,idDash,idCen);
entitySet.append(pPl);
}
}
else
{
el.dWidth = 0.0;
AcDbArc* pArc = NULL;
MakeArc(el,pArc);
if (pArc != NULL)
{
SetProperty(el,pArc,idReal,idDash,idCen);
entitySet.append(pArc);
}
}
}
else //非中心线
{
if (el.dWidth > 1.e-6 && bWeight) //宽度显示
{
AcDbPolyline* pPl = NULL;
MakePolgon(el,pPl,TRUE);
if (pPl != NULL)
{
SetProperty(el,pPl,idReal,idDash,idCen);
entitySet.append(pPl);
}
}
else
{
el.dWidth = 0.0;
AcDbArc* pArc = NULL;
MakeArc(el,pArc);
if (pArc != NULL)
{
SetProperty(el,pArc,idReal,idDash,idCen);
entitySet.append(pArc);
}
}
}
}
}
}
return Adesk::kTrue;
}
void TDbExtentsEdge::SetProperty(TDb::TCurveElement& el,AcDbEntity* pEnt,const AcDbObjectId& idReal,
const AcDbObjectId& idDash,const AcDbObjectId& idCen)
{
if (pEnt == NULL) return;
//从注册表中读取显示方式
BOOL bHideDraw = 1;
GetGlobalContext(KEY_HIDEDRAW,bHideDraw);
// add by hh 2011-01-05 从图纸中读取遮挡参数 避免全局参数对不同的图纸间的影响
TAuxTools::GetTHvacDataFromDwg(KEY_HIDEDRAW, bHideDraw);
//颜色非随块和随层
if (el.nColorIndex != 0 && el.nColorIndex != 256)
{
pEnt->setColorIndex(el.nColorIndex);
}
if (el.bHided) // 虚线 + 画
{
if (bHideDraw)//显示
{
if (el.gsMark == -1 )//中心线
{
if (!el.idSubLay.isValid() )
{
pEnt->setLayer(idDash);
}
else
{
pEnt->setLayer(el.idSubLay);
}
if (el.idSubLty.isValid())
{
pEnt->setLinetype(el.idSubLty);
}
}
else //非中心线
{
if (!el.idSubLay.isValid() )
{
pEnt->setLayer(idDash);
}
else
{
pEnt->setLayer(el.idSubLay);
}
if (el.idSubLty.isValid())
{
pEnt->setLinetype(el.idSubLty);
}
}
}
}
else // 实线
{
if (el.gsMark == -1) //中心线
{
if (!el.idSubLay.isValid() )
{
pEnt->setLayer(idCen);
}
else
{
pEnt->setLayer(el.idSubLay);
}
if (el.idSubLty.isValid())
{
pEnt->setLinetype(el.idSubLay);
}
}
else //非中心线
{
if (el.ptGe[0].distanceTo(el.ptGe[1]) > 1.e-10) //不重合
{
if (!el.idSubLay.isValid() )
{
pEnt->setLayer(idReal);
}
else
{
pEnt->setLayer(el.idSubLay);
}
if (el.idSubLty.isValid())
{
pEnt->setLinetype(el.idSubLty);
}
}
}
}
}
BOOL TDbExtentsEdge::MakeArc(TDb::TCurveElement& el,AcDbArc*& pArc)
{
pArc = TCoverBooleanOper::FormatArc(el.ptGe[0],el.ptGe[1],el.ptGe[2]);
if (pArc != NULL)
{
return TRUE;
}
return FALSE;
}
BOOL TDbExtentsEdge::MakeLine(TDb::TCurveElement& el,AcDbLine*& pLine)
{
pLine = new AcDbLine(el.ptGe[0],el.ptGe[1]);
return TRUE;
}
BOOL TDbExtentsEdge::MakePolgon(TDb::TCurveElement& el,AcDbPolyline*& pPl,BOOL bIsArc)
{
if (bIsArc)
{
AcDbArc* pArc = TCoverBooleanOper::FormatArc(el.ptGe[0],el.ptGe[1],el.ptGe[2]);
if (pArc != NULL)
{
AcGeVector3d vt = pArc->normal();
double dSweep = 0.0;
AcGePoint3d ptGe;
pArc->getEndPoint(ptGe);
pArc->getDistAtPoint(ptGe,dSweep);
dSweep /= pArc->radius();
AcGePlane plan;
plan.set(el.ptGe[0],el.ptGe[1],el.ptGe[2]);
AcGePoint3d ptOrth = AcGePoint3d::kOrigin.orthoProject(plan);
plan.set(ptOrth,plan.normal());
double dEl = ptOrth.asVector().length();
if (!ptOrth.asVector().isCodirectionalTo(plan.normal()))
{
dEl *= -1.0;
}
double dBulge = tan(0.25 * dSweep);
if (!vt.isCodirectionalTo(plan.normal()))
{
plan.set(ptOrth,-plan.normal());
dEl = ptOrth.asVector().length();
if (!ptOrth.asVector().isCodirectionalTo(plan.normal()))
{
dEl *= -1.0;
}
}
pArc->getStartPoint(ptGe);
pPl = new AcDbPolyline;
pPl->addVertexAt(0,ptGe.convert2d(plan),tan(0.25 * dSweep));
pArc->getEndPoint(ptGe);
pPl->addVertexAt(1,ptGe.convert2d(plan));
pPl->setElevation(dEl);
pPl->setNormal(plan.normal());
delete pArc;
}
}
else
{
AcGeVector3d vtNorm = AcGeVector3d::kZAxis;
AcGeVector3d vtLine = el.ptGe[1] - el.ptGe[0];
if (!vtLine.isZeroLength()) // tsjadd 2010.5.17,如果vtLine为零向量时04平台程序出现崩溃
{
vtNorm = vtNorm.orthoProject(vtLine);
if (vtNorm.isZeroLength())
vtNorm = AcGeVector3d::kXAxis;
AcGePlane plan;
plan.set(el.ptGe[0],vtNorm);
AcGePoint3d ptOrth = AcGePoint3d::kOrigin.orthoProject(plan);
plan.set(ptOrth,plan.normal());
double dEl = ptOrth.asVector().length();
if (!ptOrth.asVector().isCodirectionalTo(plan.normal()))
{
dEl *= -1.0;
}
pPl = new AcDbPolyline;
pPl->addVertexAt(0,el.ptGe[0].convert2d(plan));
pPl->addVertexAt(1,el.ptGe[1].convert2d(plan));
pPl->setElevation(dEl);
pPl->setNormal(plan.normal());
return TRUE;
}
}
return FALSE;
}
TDbExtentsEdges::TDbExtentsEdges()
{
}
TDbExtentsEdges::TDbExtentsEdges(const TDbExtentsEdges& src)
{
for (int i = 0;i < src.m_arPtrExtEdgePtrs.GetSize();i++)
{
Add(src.GetAt(i));
}
}
TDbExtentsEdges& TDbExtentsEdges::operator = (const TDbExtentsEdges& src)
{
if (this != &src)
{
for (int i = 0;i < src.m_arPtrExtEdgePtrs.GetSize();i++)
{
Add(src.GetAt(i));
}
}
return *this;
}
TDbExtentsEdges::~TDbExtentsEdges()
{
RemoveAll();
}
void TDbExtentsEdges::Add(const TDbExtentsEdge& edge)
{
TDbExtentsEdge* pEdage = new TDbExtentsEdge;
pEdage->m_idOwner = edge.m_idOwner;
if (edge.m_curEdage.length() > 0)
{
for (int i = 0;i < edge.m_curEdage.length();i++)
{
pEdage->m_curEdage.append(edge.m_curEdage.at(i));
}
}
m_arPtrExtEdgePtrs.Add(pEdage);
}
void TDbExtentsEdges::Add(const TDbExtentsEdges& edges)
{
for (int i = 0;i < edges.m_arPtrExtEdgePtrs.GetSize();i++)
{
Add(edges.GetAt(i));
}
}
TDbExtentsEdge& TDbExtentsEdges::GetAt(int nIndex) const
{
ASSERT(nIndex > -1 && nIndex < m_arPtrExtEdgePtrs.GetSize());
TDbExtentsEdge* pEdage = NULL;
if (nIndex > -1 && nIndex < m_arPtrExtEdgePtrs.GetSize())
{
pEdage = (TDbExtentsEdge*)m_arPtrExtEdgePtrs.GetAt(nIndex);
}
return *pEdage;
}
TDbExtentsEdge& TDbExtentsEdges::at(int nIndex) const
{
return GetAt(nIndex);
}
int TDbExtentsEdges::GetCount() const
{
return (int)m_arPtrExtEdgePtrs.GetSize();
}
void TDbExtentsEdges::RemoveAll()
{
for (int i = 0;i < m_arPtrExtEdgePtrs.GetSize();i++)
{
TDbExtentsEdge* pEdage = (TDbExtentsEdge*)m_arPtrExtEdgePtrs.GetAt(i);
if (pEdage != NULL)
{
delete pEdage;
}
}
m_arPtrExtEdgePtrs.RemoveAll();
}
BOOL TDbExtentsEdges::RemoveAt(int nIndex)
{
if (nIndex > -1 && nIndex < m_arPtrExtEdgePtrs.GetSize())
{
TDbExtentsEdge* pEdage = (TDbExtentsEdge*)m_arPtrExtEdgePtrs.GetAt(nIndex);
m_arPtrExtEdgePtrs.RemoveAt(nIndex);
delete pEdage;
return TRUE;
}
return FALSE;
}