Files
envi-code/SourceCode/Code2026/inc/AdsXRx/CPloyLine.h
T

179 lines
5.9 KiB
C++
Raw Normal View History

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