Files
envi-code/SourceCode/Code2026/inc/AdsXRx/CPloyLine.h
T
2026-09-28 15:28:50 +08:00

180 lines
5.3 KiB
C++

//-----------------------------------------------------------------------------+
// 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