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

115 lines
3.4 KiB
C++

//-----------------------------------------------------------------------------+
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : TArc3DWall.cpp
// = Version : ver2.0
// = Author : xlc
// = CreateDate : 2002-09-09
// = Description: 3维弧墙圆弧类的定义
// = Maintainers:
//
//-----------------------------------------------------------------------------+
#include "StdAfx.h"
#include "TArc3DWall.h"
#include "TchPrivateGlobalFunc.h"
#include "TchGeLib.h"
TArc3DWall::TArc3DWall(const TGGeArc &a, ads_real h, ads_real iD, ads_real oD)
: TGGeArc(a), height(h), iDist(iD), oDist(oD)
{
}
TArc3DWall::~TArc3DWall()
{
}
int TArc3DWall::MakeWall(TGGiExplodeDrawBase &dc,const TGGeArc &iArc, const TGGeArc &oArc, TDPtrList<TArcSection> &sectionList)
{
int len = sectionList.Length();
ads_real lastAng = GetStarAngle();
for(int i = 0; i<len; i++)
{
TArcSection &sec = *sectionList[i];
if(!i)
{
TGGeArc ia(GetCenterPt(), iArc.GetRadius(), iArc.GetStarAngle(), sec.GetStarAngle());
TGGeArc oa(GetCenterPt(), oArc.GetRadius(), oArc.GetStarAngle(), sec.GetStarAngle());
if(iArc.AngleFlag(sec.GetStarAngle()) == PR_OUTSIDE || oArc.AngleFlag(sec.GetStarAngle()) == PR_OUTSIDE)
{
ia.SetEndAngle(iArc.GetStarAngle()); //无效的弧
oa.SetEndAngle(oArc.GetStarAngle());
}
MakeArcWallSeg(dc, ia, oa, height, 1, 0);
}
else
{
TGGeArc ar(GetCenterPt(), GetRadius(), lastAng, sec.GetStarAngle());
if(ar.Bulge()<Bulge())
{//避免墙洞发生干涉,如门联窗
MakeArcWallSeg(dc, ar, height, iDist, oDist, 0, 0);
}
}
sec.MakeWall(dc, iArc, oArc, iDist, oDist, height, TchExport::GetCirDivNum(GetRadius(), _AS_SYS_UNIT(g_nCirDeviation)));
lastAng = sec.GetEndAngle();
}
if (fabs(lastAng - GetEndAngle()) < _angSnap)
{
}
else
{
double nAngleI = len ? lastAng : iArc.GetStarAngle();
double nAngleO = len ? lastAng : oArc.GetStarAngle();
if(len && (iArc.AngleFlag(lastAng) == PR_OUTSIDE || oArc.AngleFlag(lastAng) == PR_OUTSIDE))
{
TGGeArc ia(GetCenterPt(), iArc.GetRadius(), nAngleI, iArc.GetEndAngle());
TGGeArc oa(GetCenterPt(), oArc.GetRadius(), nAngleO, oArc.GetEndAngle());
if(iArc.AngleFlag(lastAng) == PR_OUTSIDE)
{
ia.SetStarAngle(iArc.GetEndAngle());
}
if(oArc.AngleFlag(lastAng) == PR_OUTSIDE)
{
oa.SetStarAngle(oArc.GetEndAngle());
}
MakeArcWallSeg(dc, ia, oa, height, 0, 1);
}
else
{
TGGeArc iaT(GetCenterPt(), iArc.GetRadius(), nAngleI, iArc.GetEndAngle());
TGGeArc oaT(GetCenterPt(), oArc.GetRadius(), nAngleO, oArc.GetEndAngle());
MakeArcWallSeg(dc, iaT, oaT, height, 0, 1);
}
}
return RTNORM;
}
int TArc3DWall::MakeArcWallSeg(TGGiExplodeDrawBase &dc, const TGGeArc &arc, ads_real height, ads_real iDist, ads_real oDist, int bShowStart, int bShowEnd)
{
if (height <= 0)
{
height = 0;
}
if (iDist >= arc.GetRadius() || oDist >= arc.GetRadius())
{
return RTERROR;
}
TGGeArc iArc = arc.Offset(-iDist);
TGGeArc oArc = arc.Offset(oDist);
TchPrivate::DrawArcSeg(dc, iArc, height, bShowStart, bShowEnd);
TchPrivate::DrawArcSeg(dc, oArc, height, bShowStart, bShowEnd);
return RTNORM;
}
void TArc3DWall::MakeArcWallSeg(TGGiExplodeDrawBase &dc, const TGGeArc &iArc, const TGGeArc &oArc, ads_real height, int bShowStart, int bShowEnd)
{
DrawArcSeg(dc, iArc, height, bShowStart, bShowEnd);
DrawArcSeg(dc, oArc, height, bShowStart, bShowEnd);
}