116 lines
3.3 KiB
C++
116 lines
3.3 KiB
C++
//-----------------------------------------------------------------------------+
|
|
// Copyright (C), 1998-2007, SH Software Co. Ltd.
|
|
// = FileName : XArc3DWall.cpp
|
|
// = Version : ver2.0
|
|
// = Author : zjq
|
|
// = CreateDate : 2002-09-09
|
|
// = Description: 3维弧墙圆弧类的定义
|
|
// = Maintainers:
|
|
//
|
|
//-----------------------------------------------------------------------------+
|
|
#include "StdAfx.h"
|
|
#include "XArc3DWall.h"
|
|
#include "XPrivateGlobalFunc.h"
|
|
#include "AdsXRx.h"
|
|
|
|
XArc3DWall::XArc3DWall(const XArc &a, ads_real h, ads_real iD, ads_real oD)
|
|
: XArc(a), height(h), iDist(iD), oDist(oD)
|
|
{
|
|
|
|
}
|
|
|
|
XArc3DWall::~XArc3DWall()
|
|
{
|
|
|
|
}
|
|
|
|
int XArc3DWall::MakeWall(XExplodeDraw &dc,const XArc &iArc, const XArc &oArc, DList<XArcSection> §ionList)
|
|
{
|
|
int len = sectionList.Length();
|
|
ads_real lastAng = GetStarAngle();
|
|
for(int i = 0; i<len; i++)
|
|
{
|
|
XArcSection &sec = *sectionList[i];
|
|
if(!i)
|
|
{
|
|
XArc ia(GetCenterPt(), iArc.GetRadius(), iArc.GetStarAngle(), sec.GetStarAngle());
|
|
XArc 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
|
|
{
|
|
XArc 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, XExport::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))
|
|
{
|
|
XArc ia(GetCenterPt(), iArc.GetRadius(), nAngleI, iArc.GetEndAngle());
|
|
XArc 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
|
|
{
|
|
XArc iaT(GetCenterPt(), iArc.GetRadius(), nAngleI, iArc.GetEndAngle());
|
|
XArc oaT(GetCenterPt(), oArc.GetRadius(), nAngleO, oArc.GetEndAngle());
|
|
MakeArcWallSeg(dc, iaT, oaT, height, 0, 1);
|
|
}
|
|
}
|
|
|
|
return RTNORM;
|
|
}
|
|
|
|
int XArc3DWall::MakeArcWallSeg(XExplodeDraw &dc, const XArc &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;
|
|
}
|
|
|
|
XArc iArc = arc.Offset(-iDist);
|
|
XArc oArc = arc.Offset(oDist);
|
|
XPrivate::DrawArcSeg(dc, iArc, height, bShowStart, bShowEnd);
|
|
XPrivate::DrawArcSeg(dc, oArc, height, bShowStart, bShowEnd);
|
|
|
|
return RTNORM;
|
|
}
|
|
|
|
void XArc3DWall::MakeArcWallSeg(XExplodeDraw &dc, const XArc &iArc, const XArc &oArc, ads_real height, int bShowStart, int bShowEnd)
|
|
{
|
|
DrawArcSeg(dc, iArc, height, bShowStart, bShowEnd);
|
|
DrawArcSeg(dc, oArc, height, bShowStart, bShowEnd);
|
|
}
|