Files
envi-code/SourceCode/Code2026/tg_shs/shs_geLib/TGGeRegion2D.cpp
T
2026-09-28 15:28:50 +08:00

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;
}