//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TGGeRegion2D // = Version : ver2.0 // = Author : wlw // = CreateDate : 2002-09-09 // = Description: TGGeRegion2D 类定义 // = Maintainers: // //-----------------------------------------------------------------------------+ #include "StdAfx.h" #include "TGGeRegion2D.h" #include "dbregion.h" #include "TchGlobalCurveFunc.h" #include "TchPrivateGlobalFunc.h" #include "TGGeCurveInline.h" TGGeRegion2D::TGGeRegion2D() : TGGePoly2D(1) { } TGGeRegion2D::TGGeRegion2D(const TGGePoly2D &poly) : TGGePoly2D(poly) { } TGGeRegion2D::~TGGeRegion2D() { } void TGGeRegion2D::AppendHole(TGGePoly2D *pPoly) { m_lstHole.Append(pPoly); } void TGGeRegion2D::ClearHole() { m_lstHole.Reset(); } long TGGeRegion2D::GetHoleNum()const { return m_lstHole.Length(); } const TGGePoly2D& TGGeRegion2D::GetHole(long i)const { return m_lstHole[i]; } TGGePoly2D& TGGeRegion2D::GetHole(long i) { return *m_lstHole[i]; } double TGGeRegion2D::Area()const { double dArea = TGGePoly2D::Area(); for (long i = 0; i < m_lstHole.Length(); i++) { dArea -= m_lstHole[i].Area(); } return dArea; } int TGGeRegion2D::HitTest2d(TADSGePoint3d pt)const { int nRet = pt & (*this); if (nRet == PR_INSIDE) { for (long i = 0; i < m_lstHole.Length(); i++) { int nRet1 = pt & (m_lstHole[i]); if (nRet1 == PR_OUTSIDE) { continue; } else if (nRet1 == PR_EDGE) { return PR_EDGE; } else { return PR_OUTSIDE; } } } return nRet; } bool TGGeRegion2D::IsValid()const { if (!IsClosed() || IsSelfIntersect()) { return false; } for (long i = 0; i < m_lstHole.Length(); i++) { if (!m_lstHole[i].IsClosed() || m_lstHole[i].IsSelfIntersect()) { return false; } } if (Area() < 1E-6) { return false; } return true; } AcDbRegion* TGGeRegion2D::AsRegion()const { if (!IsValid()) { return NULL; } AcDbRegion *pRegion = TGGePoly2D::AsRegion(); if (pRegion == NULL) { return NULL; } for (long i = 0; i < m_lstHole.Length(); i++) { AcDbRegion *pHole = m_lstHole[i].AsRegion(); if (pHole == NULL) { break; } Acad::ErrorStatus es = pRegion->booleanOper(AcDb::kBoolSubtract,pHole); delete pHole; if (es != Acad::eOk) { break; } } if (i != m_lstHole.Length() || pRegion->isNull()) { delete pRegion; return NULL; } return pRegion; } bool TGGeRegion2D::IsKindOf(TGGeEntity::TEntityId entType) const { switch(entType) { case TGGeEntity::eEntity: case TGGeEntity::eCurve: case TGGeEntity::eShape: case TGGeEntity::ePoly: case TGGeEntity::eRegion2D: return true; } return false; } TGGeEntity::TEntityId TGGeRegion2D::Type() const { return TGGeEntity::eRegion2D; }