//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TGGePoly2D // = Version : ver2.0 // = Author : wlw // = CreateDate : 2002-09-09 // = Description: TGGePoly2D类声明 // = Maintainers: // //-----------------------------------------------------------------------------+ #ifndef _TGGEPOLY2D_H_ #define _TGGEPOLY2D_H_ #ifndef _TENTITYSET_H_ #include "TEntitySet.h" #endif #ifndef _TGGELINE_H_ #include "TGGeLine.h" #endif #ifndef _TGGEARC_H_ #include "TGGeArc.h" #endif #ifndef _TGGECURVESEGMENT_H_ #include "TGGeCurveSegment.h" #endif /* #ifndef _TGGEDIRECTIONCURVE_H_ #include "TGGeDirectionCurve.h" #endif */ #ifndef _TADSGEPOINT3D_H_ #include "TADSGePoint3d.h" #endif #ifndef _TGGEPOLY_H_ #include "TGGePoly.h" #endif #ifndef _TDPTRLIST_H_ #include "TDPtrList.h" #endif #ifndef _TADSGEPOINTLIST_H_ #include "TADSGePointList.h" #endif class TGGePoly3D; class TGGeCurveSegment; class TGGeDirectionCurve; class GEOAPI TGGePoly2D : public TADSGePointList, public TGGeCurve { public: TGGePoly2D(); TGGePoly2D(const TEntitySet& entPline); TGGePoly2D(int nflg); TGGePoly2D(const TGGePoly2D & src); virtual ~TGGePoly2D(); virtual bool IsKindOf(TEntityId entType) const; virtual TEntityId Type() const; // add by xlc on 110413 virtual double GetLength()const; //曲线长度 virtual double Area() const; virtual void Reset(); virtual bool SetAcDbCurve(AcDbCurve* pCurve); virtual AcDbCurve* AsAcDbCurve()const; virtual AcDbRegion *AsRegion() const; virtual void CopyFrom(const TGGeEntity* pSrc); virtual int Nth(int nIndex, TGGeLine &xline, TGGeArc &xarc, AcDb::Visibility *pVal = NULL) const; virtual int Nth(int nIndex, TGGeCurveSegment & cvCurve, AcDb::Visibility *pVal = NULL) const; virtual int Nth(int nIndex, TGGeDirectionCurve &curve, AcDb::Visibility *pVal = NULL) const; virtual int Reverse(); virtual int Compress(bool bUnionCurve = true); virtual int Make(LPCTSTR szLay = NULL) const; virtual int MakeSegments(LPCTSTR szLay = NULL) const; virtual int MakeSegment(int nIndex, LPCTSTR szLay = NULL) const; virtual void TransformBy(const AcGeMatrix3d &mat); virtual void RemoveNode(long nIndex); virtual void InsertNodeAt(int nIndex, const TADSGePoint3d &pt, double dBulge = 0.0, AcDb::Visibility eVal = AcDb::kVisible); virtual void InsertNodeAt(const TADSGePoint3d &ptOn, AcDb::Visibility eVal = AcDb::kVisible); virtual void AppendNode(const TADSGePoint3d &pt, ads_real dBulge = 0.0, AcDb::Visibility eVal = AcDb::kVisible); int operator ! () const; TGGePoly2D& operator = (const TGGePoly2D &src); void SetFlag(int nFlag); int GetFlag() const; void AppendBugle(ads_real dBugle); void RemoveBugle(int nIndex); double GetBulge(int nIndex) const; void SetBulge(int nIndex, double dBugle); int SetBulges(const TDPtrList& ardbulges); int GetBulges(TDPtrList& ardbulges); TDPtrList& GetBulges(); ads_real Distance3d(int nIndex) const; ads_real Distance3d() const; ads_real Distance2d(int nIndex) const; ads_real Distance2d() const; // 求路径面积有正负之分,不闭合时为路径与X轴之间的区域面积,正负无实际意义 // 闭合时,路径围成的面积,为正表示曲线是顺时针方向的 ads_real PathArea() const; double PathDistance2d(TADSGePoint3d ptHit) const; //是否自交 BOOL IsSelfIntersect() const; int IsValid(int nIndex) const; int IsClosed() const; bool SetClosed(); int HasArcSegment() const; int TotalSegments() const; int Polar2d(ads_real dis, TADSGePoint3d &ptRes, ads_real *dDrt = NULL) const; int Polar3d(ads_real dis, TADSGePoint3d &ptRes, TVector3D & vt) const; //取得封闭PLINE内的一点或外的一点 TADSGePoint3d GetPoint(int nIOFlag, ads_real dist); TADSGePoint3d GetInsidePoint(); int AppendSegment(const TGGeCurveSegment &cvCurve, int bMinus = 0, int bFinal = 0); // 消除路径的重合点,bUnionCurve为true时合并共线点 // 路径偏移,各段分别偏移,再求交点,构成偏移线 int Offset(ads_real nDist, TGGePoly2D &destPoly) const; // 路径偏移,各顶点计算偏移,再求顶点的圆心角(弧段),构成偏移线 int QuickOffset(ads_real nDist, TGGePoly2D &destPoly) const; int MapToPolygon1(TGGePoly &pts, double dDeviation); int MapToPolygon(TGGePoly &pts, int nCirDiv = 30); resbuf *Fence(int nCirDiv = 30); resbuf *Polygon(int nCirDiv = 30); int AsOpenPoly1(TGGePoly &pts, double dDeviation) const; int AsOpenPoly(TGGePoly &pts, int nCirDiv = 30) const; //离散化 void Disperse1(TGGePoly2D &polydestPoly, double dDeviation) const; void Disperse(TGGePoly2D &polydestPoly, int nCirDiv = 30) const; int CreatePface(int cirDivSegs, const TCHAR *szLay = NULL); int GetExtend(ads_point lowPt, ads_point upPt) const; //返回值nRet, //nRet>0时表示的是输入点在第几个顶点上 //nRet<0时|nRet|表示的是输入点在第几条边上 //nRet=0表示不在线上 int HitTestOnCurve(const TADSGePoint3d &ptTest, double dTol = TchGeLib::_DIST_SNAP) const; void SetPointListAt(int nIndex, const TADSGePoint3d& pt); TADSGePoint3d* GetPointListAt(int nIndex); const TADSGePoint3d& GetPointListAt(int nIndex) const; void RemovePointListAt(int nIndex); void AppendPointListAt(TADSGePoint3d* pPt); TGGePoly3D PlaneToWcs(const AcGeVector3d& normal)const; bool IsRegionInclude(const TGGePoly2D& poly)const; bool IsRegionOverlap(const TGGePoly2D& poly)const; public: int m_nFlag; TDPtrList m_ardbulges; }; /* inline int TGGePoly2D::operator !() const { return (Length() < 2 ? 1 : 0); } inline int TGGePoly2D::IsValid(int nIndex) const { int nLen = Length(); if (nIndex < 0 || nIndex >= nLen) { return 0; } if (!(GetFlag() & 1) && nIndex == nLen - 1) { return 0; } return 1; } inline int TGGePoly2D::IsClosed() const { return ((GetFlag() & 0x01) ? 1 : 0); } inline int TGGePoly2D::TotalSegments() const { int nLen = Length(); return (GetFlag() & 1) ? nLen : nLen - 1; } inline double TGGePoly2D::Area() const { return fabs(PathArea()); } */ #endif