//-----------------------------------------------------------------------------+ // 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& XHoleModel::GetHoleList() { return m_holes; } int XHoleModel::GetHoleList(DList& 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 &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; }