//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, SH Software Co. Ltd. // = FileName : CPloyLine.h // = Version : ver2.0 // = Author : zjq // = CreateDate : 2002-09-09 // = Description: 类的声明,坐标为UCS // = Maintainers: // //-----------------------------------------------------------------------------+ #ifndef _BPLOYLINE_H_ #define _BPLOYLINE_H_ #ifndef _BNODE_H_ #include "CBNode.h" #endif #ifndef _XPOLYGONEX_H_ #include "XPolygonEx.h" #endif #ifndef _XPOLY2D_H_ #include "XPoly2D.h" #endif #ifndef _DNODE_H_ #include "CDNode.h" #endif class GEOAPI CPloyLine : public CObject { public: CPloyLine(); CPloyLine(const CPloyLine& bline); virtual ~CPloyLine(); //返回下一结点,如果pNode是最后节点,返回NULL. virtual CBNode* GetNextNode(const CBNode* pNode); //返回上一结点,如果pNode是头节点,返回NULL. virtual CBNode* GetPreNode(const CBNode* pNode); //赋值操作 CPloyLine& operator = (const CPloyLine& basLine); //基线合并.只有当两基线首尾结点重合时才能合并(闭合的基线不能相加,相加后不检查闭合性)。 CPloyLine operator + (const CPloyLine& basLine) const; //与Create(AcDbObjectId&)区别:不考虑坐标的转换 BOOL Create(const AcDbEntity* pEntity); BOOL Create(const XPoly2D& poly); BOOL Create(const XPolygonEx& 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坐标处的CDNode,totalLength>=s>=0;bCalZ=1,计算Z值 BOOL GetDNode(double s,CDNode* pDivNode); //返回基线链表头结点 CBNode* Head(); //返回基线链表尾结点 CBNode* Tail(); //得到最左边的结点 CBNode* GetMostLeftNode(); //返回S±deta范围内的结点,bPercent=1,则deta为百分比 CBNode* GetNodeRangedAt(double ds,double deta,BOOL bPercent = 0); //返回圆弧始点切线与X轴夹角 double GetActAngOfArcIn(CBNode* pNode); //返回圆弧终点切线与X轴夹角 double GetActAngOfArcOut(CBNode* pNode); //1:顺时针,2:逆时针,0:无法判断--注意:需要先直线段化 BOOL GetClockwise(); //在结点pNode处插入一条基线,LinkEdgeUnvisible=1:基线的最后一点与pNode连线不可见 BOOL InsertBLineInto(CBNode* pNode,CPloyLine* 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(CPloyLine* pBLine); //基线反向操作 CPloyLine& 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(CBNode* pHead); //平移基线 void MoveTo(AcGeVector3d& disp); //释放并清空等分点链表 void ReleaseDivLst(); //清空基线链表 void ReleaseBasLst(); //清空基线和等分链表,m_bClosed=0 void ReleaseAll(); public: //是否封闭 BOOL m_bClosed; //基线基础链表,调用ConstructBasLine构造 CBNodeList m_BNodeList; //基线等分点链表,调用CostructDivLst构造,用ReleaseDivLst清空 CDNodeList 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