Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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