138 lines
2.4 KiB
C++
138 lines
2.4 KiB
C++
//-----------------------------------------------------------------------------+
|
|
// Copyright (C), 1998-2007, SH Software Co. Ltd.
|
|
// = FileName : XHoleModel 类
|
|
// = Version : ver2.0
|
|
// = Author : zjq
|
|
// = CreateDate : 2002-09-09
|
|
// = Description: XHoleModel 类定义
|
|
// = Maintainers:
|
|
//
|
|
//-----------------------------------------------------------------------------+
|
|
#include "StdAfx.h"
|
|
#include "XHoleModel.h"
|
|
#include "XPrivateGlobalFunc.h"
|
|
|
|
XHoleModel::XHoleModel()
|
|
{
|
|
|
|
}
|
|
|
|
XHoleModel::~XHoleModel()
|
|
{
|
|
|
|
}
|
|
|
|
void XHoleModel::SetOutLine(const XPolygonEx& outline)
|
|
{
|
|
m_outline = outline;
|
|
}
|
|
|
|
void XHoleModel::GetOutLine(XPolygonEx& outline)
|
|
{
|
|
outline = m_outline;
|
|
}
|
|
|
|
XPolygonEx& XHoleModel::GetOutLine()
|
|
{
|
|
return m_outline;
|
|
}
|
|
|
|
void XHoleModel::AppendHoleList(XPolygonEx* pHole)
|
|
{
|
|
m_holes.Append(pHole);
|
|
}
|
|
|
|
DList<XPolygonEx>& XHoleModel::GetHoleList()
|
|
{
|
|
return m_holes;
|
|
}
|
|
|
|
int XHoleModel::GetHoleList(DList<XPolygonEx>& lstPolygonEx)
|
|
{
|
|
for (int i = 0; i < m_holes.Length(); i++)
|
|
{
|
|
lstPolygonEx.Append(m_holes[i]);
|
|
}
|
|
return lstPolygonEx.Length();
|
|
}
|
|
|
|
BOOL XHoleModel::IsValid() const
|
|
{
|
|
return (m_outline.Length() >= 3);
|
|
}
|
|
|
|
BOOL XHoleModel::Wcs2Ecs(XVector3D &vtEcs, double &nElev)
|
|
{
|
|
ASSERT(IsValid());
|
|
int nRet = m_outline.GetNormal(vtEcs);
|
|
|
|
if (nRet != RTNORM)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
m_outline.Wcs2Ecs(vtEcs);
|
|
nElev = m_outline[0]->z;
|
|
m_outline.SetElevation(0.0);
|
|
|
|
for (int i = 0; i < m_holes.Length(); i++)
|
|
{
|
|
m_holes[i]->Wcs2Ecs(vtEcs);
|
|
m_holes[i]->SetElevation(0.0);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL XHoleModel::Triangulate(BOOL bKeepConstant, DList<XTriangle> &lstTris, BOOL bAs3D)
|
|
{ //坐标系发生变化
|
|
XVector3D vtEcs(0,0,1);
|
|
double nElev = 0.0;
|
|
if (bAs3D)
|
|
{
|
|
if (!this->Wcs2Ecs(vtEcs, nElev))
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL bRet = TRUE;
|
|
if (XPrivate::Triangulate(m_outline, m_holes, lstTris))
|
|
{
|
|
for (int n = 0; n < lstTris.Length(); n++)
|
|
{
|
|
XTriangle *triangle = lstTris[n];
|
|
triangle->vertex1.z = triangle->vertex2.z = triangle->vertex3.z = nElev;
|
|
|
|
if (bAs3D)
|
|
{
|
|
triangle->Ecs2Wcs(vtEcs);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bRet = FALSE;
|
|
}
|
|
|
|
if (bKeepConstant)
|
|
{
|
|
m_outline.SetElevation(nElev);
|
|
if (bAs3D)
|
|
{
|
|
m_outline.Ecs2Wcs(vtEcs);
|
|
}
|
|
|
|
for (int i = 0; i < m_holes.Length(); i++)
|
|
{
|
|
m_holes[i]->SetElevation(nElev);
|
|
if (bAs3D)
|
|
{
|
|
m_holes[i]->Ecs2Wcs(vtEcs);
|
|
}
|
|
}
|
|
}
|
|
|
|
return bRet;
|
|
}
|