179 lines
5.4 KiB
C++
179 lines
5.4 KiB
C++
//-----------------------------------------------------------------------------+
|
|
// 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 |