//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TBPloyLine.h // = Version : ver2.0 // = Author : xlc // = CreateDate : 2002-09-09 // = Description: 类的声明,坐标为UCS // = Maintainers: // //-----------------------------------------------------------------------------+ #ifndef _TBPLOYLINE_H_ #define _TBPLOYLINE_H_ #ifndef _TBNODE_H_ #include "TBNode.h" #endif #ifndef _TGGEPOLYGONEX_H_ #include "TGGePolygonEx.h" #endif #ifndef _TGGEPOLY2D_H_ #include "TGGePoly2D.h" #endif #ifndef _TDNODE_H_ #include "TDNode.h" #endif class GEOAPI TBPloyLine : public CObject { public: TBPloyLine(); TBPloyLine(const TBPloyLine& bline); virtual ~TBPloyLine(); //返回下一结点,如果pNode是最后节点,返回NULL. virtual TBNode* GetNextNode(const TBNode* pNode); //返回上一结点,如果pNode是头节点,返回NULL. virtual TBNode* GetPreNode(const TBNode* pNode); //赋值操作 TBPloyLine& operator = (const TBPloyLine& basLine); //基线合并.只有当两基线首尾结点重合时才能合并(闭合的基线不能相加,相加后不检查闭合性)。 TBPloyLine operator + (const TBPloyLine& basLine) const; //与Create(AcDbObjectId&)区别:不考虑坐标的转换 BOOL Create(const AcDbEntity* pEntity); BOOL Create(const TGGePoly2D& poly); BOOL Create(const TGGePolygonEx& poly); //ConstructBasLine根据objId构造基线链表,如果是圆或圆弧 BOOL Create(AcDbObjectId& objId); //将基线按每节段数nSegs近似等分,flag=1,等分直线,否则不等分直线 void DivideBySegs(const int nSegs,BOOL flag = 1); //将基线中圆弧按角度detaAng近似等分 void DivideByAng(const double detaAng); //按每段段数直线段化基线 void LinearizePLine(int nSegs); //按角度直线段化基线 void LinearizePLine(double dAng); //返回基线总长度 double GetLength(BOOL bReCalSCoord = 0) const; //返回基线上最大X值,最小X值 double GetMaxX(); double GetMinX(); double GetMinY(); double GetMaxY(); //返回s坐标处的TDNode,totalLength>=s>=0;bCalZ=1,计算Z值 BOOL GetDNode(double s,TDNode* pDivNode); //返回基线链表头结点 TBNode* Head(); //返回基线链表尾结点 TBNode* Tail(); //得到最左边的结点 TBNode* GetMostLeftNode(); //返回S±deta范围内的结点,bPercent=1,则deta为百分比 TBNode* GetNodeRangedAt(double ds,double deta,BOOL bPercent = 0); //返回圆弧始点切线与X轴夹角 double GetActAngOfArcIn(TBNode* pNode); //返回圆弧终点切线与X轴夹角 double GetActAngOfArcOut(TBNode* pNode); //1:顺时针,2:逆时针,0:无法判断--注意:需要先直线段化 BOOL GetClockwise(); //在结点pNode处插入一条基线,LinkEdgeUnvisible=1:基线的最后一点与pNode连线不可见 BOOL InsertBLineInto(TBNode* pNode,TBPloyLine* pBLine,BOOL LinkEdgeUnvisible = 1); //测试基线是否封闭 BOOL IsClosed() const; //判断是否有圆弧存在 BOOL HasArc() const; //判断是否为园 BOOL isCircle() const; //判断基线是否在XY平面内 BOOL IsInXYPlane() const; //判断pt是否在闭合基线内部,1:内部,0:外部,2:边界上 BOOL IsPtInPolygon(AcGePoint3d& pt) const; //基线是否与LINE线段相交,只与小于X的线段作比较,假设基线全为直线段 BOOL IsIntersectWith(double x,AcGePoint3d pt1,AcGePoint3d pt2) const; //测试是否为空 BOOL IsEmpty() const; //重新计算首尾点距离,看是否封闭,封闭返回1 BOOL CheckClose(); //返回1:pBLine在此区域内部,2:外部,3:相交 int IsWhere(TBPloyLine* pBLine); //基线反向操作 TBPloyLine& Reverse(); //整理基线,将重合点、同一直线或圆弧上的多余点删除 void ClearUp(double tol = TOL); //将共线的圆弧段合并 void MergeCoArc(double tol = TOL); //将共线的直线段合并 void MergeCoLine(double tol = TOL); //删除重合结点 void RmvOverlapPt(double tol = TOL); //重新计算S坐标 void ReCalcSValue(); //将pHead设置基线的头,只对封闭曲线 void ResetHead(TBNode* pHead); //平移基线 void MoveTo(AcGeVector3d& disp); //释放并清空等分点链表 void ReleaseDivLst(); //清空基线链表 void ReleaseBasLst(); //清空基线和等分链表,m_bClosed=0 void ReleaseAll(); public: //是否封闭 BOOL m_bClosed; //基线基础链表,调用ConstructBasLine构造 TBNodeList m_BNodeList; //基线等分点链表,调用CostructDivLst构造,用ReleaseDivLst清空 TDNodeList m_DNodeList; private: //判断ECS与UCS的Z轴是否平行1:同向平行,2:反向平行;0:不平行 int IsZParalECSAndUcs(AcDbObjectId& objId); //将点从WCS转换到UCS,bVer = 1:转换矢量 void WCS2UCS(AcGePoint3d& pt,BOOL bVer = 0); void WCS2ECS(AcGePoint3d& pt,AcDbObjectId& objId,BOOL bVer = 0); //将点从ECS转换到UCS,bVer = 1:转换矢量 void ECS2UCS(AcGePoint3d& pt,AcDbObjectId& objId,BOOL bVer = 0); //与acutPolar()功能相同 AcGePoint3d polar(AcGePoint3d& pt0,double ang,double dist); //x1\x2是否同号 BOOL IsEqualSign(double x1,double x2); }; #endif