//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, SH Software Co. Ltd. // = FileName : XRegion2D // = Version : ver2.0 // = Author : zjq // = CreateDate : 2002-09-09 // = Description: XRegion2D ÀඨÒå // = Maintainers: // //-----------------------------------------------------------------------------+ #include "StdAfx.h" #include "XRegion2D.h" #include "dbregion.h" #include "XGlobalCurveFunc.h" #include "XPrivateGlobalFunc.h" #include "XCurveInline.h" XRegion2D::XRegion2D() : XPoly2D(1) { } XRegion2D::XRegion2D(const XPoly2D &poly) : XPoly2D(poly) { } XRegion2D::~XRegion2D() { } void XRegion2D::AppendHole(XPoly2D *pPoly) { m_lstHole.Append(pPoly); } void XRegion2D::ClearHole() { m_lstHole.Reset(); } long XRegion2D::GetHoleNum()const { return m_lstHole.Length(); } const XPoly2D& XRegion2D::GetHole(long i)const { return m_lstHole[i]; } XPoly2D& XRegion2D::GetHole(long i) { return *m_lstHole[i]; } double XRegion2D::Area()const { double dArea = XPoly2D::Area(); for (long i = 0; i < m_lstHole.Length(); i++) { dArea -= m_lstHole[i].Area(); } return dArea; } int XRegion2D::HitTest2d(XPoint 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 XRegion2D::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* XRegion2D::AsRegion()const { if (!IsValid()) { return NULL; } AcDbRegion *pRegion = XPoly2D::AsRegion(); if (pRegion == NULL) { return NULL; } long i(0); for (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 XRegion2D::IsKindOf(XEntity::TEntityId entType) const { switch(entType) { case XEntity::eEntity: case XEntity::eCurve: case XEntity::eShape: case XEntity::ePoly: case XEntity::eRegion2D: return true; } return false; } XEntity::TEntityId XRegion2D::Type() const { return XEntity::eRegion2D; }