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

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> &sectionList)
{
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);
}