180 lines
2.7 KiB
C++
180 lines
2.7 KiB
C++
//-----------------------------------------------------------------------------+
|
|
// 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;
|
|
}
|