115 lines
3.4 KiB
C++
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> §ionList)
|
|
{
|
|
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);
|
|
} |