179 lines
2.8 KiB
C++
179 lines
2.8 KiB
C++
//-----------------------------------------------------------------------------+
|
|
// 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;
|
|
}
|