//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TGGeHoleModel 类 // = Version : ver2.0 // = Author : wlw // = CreateDate : 2002-09-09 // = Description: TGGeHoleModel 类定义 // = Maintainers: // //-----------------------------------------------------------------------------+ #include "StdAfx.h" #include "TGGeHoleModel.h" #include "TchPrivateGlobalFunc.h" TGGeHoleModel::TGGeHoleModel() { } TGGeHoleModel::~TGGeHoleModel() { } void TGGeHoleModel::SetOutLine(const TGGePolygonEx& outline) { m_outline = outline; } void TGGeHoleModel::GetOutLine(TGGePolygonEx& outline) { outline = m_outline; } TGGePolygonEx& TGGeHoleModel::GetOutLine() { return m_outline; } void TGGeHoleModel::AppendHoleList(TGGePolygonEx* pHole) { m_holes.Append(pHole); } TDPtrList& TGGeHoleModel::GetHoleList() { return m_holes; } int TGGeHoleModel::GetHoleList(TDPtrList& lstPolygonEx) { for (int i = 0; i < m_holes.Length(); i++) { lstPolygonEx.Append(m_holes[i]); } return lstPolygonEx.Length(); } BOOL TGGeHoleModel::IsValid() const { return (m_outline.Length() >= 3); } BOOL TGGeHoleModel::Wcs2Ecs(TVector3D &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 TGGeHoleModel::Triangulate(BOOL bKeepConstant, TDPtrList &lstTris, BOOL bAs3D) { //坐标系发生变化 TVector3D vtEcs(0,0,1); double nElev = 0.0; if (bAs3D) { if (!this->Wcs2Ecs(vtEcs, nElev)) { return FALSE; } } BOOL bRet = TRUE; if (TchPrivate::Triangulate(m_outline, m_holes, lstTris)) { for (int n = 0; n < lstTris.Length(); n++) { TGGeTriangle *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; }