#include "StdAfx.h" #include "GeHatch.h" GeHatch::GeHatch(GePoly2D poly,const TCHAR* sName,double nScale) : m_poly(poly), m_polys(1),m_sHatchName(sName),m_dScale(nScale),m_dRotation(0.0) { // 对房间实体的填充而言,初始化所 m_polys[0] = poly; } GeHatch::GeHatch(GePoly2D poly,const TCHAR* sName,double nScale,double nAngle) : m_poly(poly),m_polys(1),m_sHatchName(sName),m_dScale(nScale),m_dRotation(nAngle) { m_polys[0] = poly; } GeHatch::~GeHatch() { } bool GeHatch::IsKindOf(GeEntity::TEntityId entType) const { switch(entType) { case GeEntity::eEntity: case GeEntity::eHatch: return true; } return false; } GeEntity::TEntityId GeHatch::Type() const { return GeEntity::eHatch; } void GeHatch::CopyFrom(const GeEntity* pSrc) { if (this != pSrc && pSrc->IsKindOf(GeEntity::eHatch)) { m_poly = ((GeHatch*)pSrc)->GetHatchPoly(); m_polys = ((GeHatch*)pSrc)->m_polys; m_sHatchName = ((GeHatch*)pSrc)->GetHatchName(); m_dScale = ((GeHatch*)pSrc)->GetHatchScale(); m_dRotation = ((GeHatch*)pSrc)->GetHatchRotation(); } } bool GeHatch::IsSolid()const { return _tcscmp(m_sHatchName,_T("SOLID")) == 0; } GePoly2D GeHatch::GetHatchPoly()const { return m_poly; } void GeHatch::SetHatchPoly(GePoly2D poly) { m_poly = poly; } CString GeHatch::GetHatchName()const { return m_sHatchName; } void GeHatch::SetHatchName(CString sHatchName) { m_sHatchName = sHatchName; } double GeHatch::GetHatchScale()const { return m_dScale; } void GeHatch::SetHatchScale(double dScale) { m_dScale = dScale; } double GeHatch::GetHatchRotation()const { return m_dRotation; } void GeHatch::SetHatchRotation(double dRotation) { m_dRotation = dRotation; } #include "GeCurveInline.h" namespace { bool IsPolyAInPolyB(const GePoly2D &A, const GePoly2D &B) { ADSGePoint3d pt; GePoly2D polyB(B); for (int i = 0; i < A.Length(); ++i) { pt = A.GetAt(i); if ((pt & polyB) != PR_INSIDE) return false; } return true; } } void GeHatch::AppendPoly(const GePoly2D &poly) { if (IsPolyAInPolyB(poly, m_poly)) m_polys.push_back(poly); } void GeHatch::AppendPoly(const std::vector &polys) { for (size_t i = 0; i < polys.size(); ++i) { const GePoly2D &poly = polys[i]; if (!IsPolyAInPolyB(poly, m_poly)) return; // 由于房间文字非常密集。故只要有一个洞口不在,则全部洞口都不添加。 } m_polys.insert(m_polys.end(), polys.begin(), polys.end()); }