Files
envi-code/SourceCode/Code2026/Dimension/GeCurveSegment.h
T
2026-09-28 15:28:50 +08:00

183 lines
5.6 KiB
C++

#pragma once
#include "GeLine.h"
class EntitySet;
class ADSGePointDir2d;
class GePoly2D;
class GeCurveSegment: public GeLine
{
public:
GeCurveSegment(int flg = LS_FINITE);
GeCurveSegment(const GeCurveSegment &src);
GeCurveSegment(const EntitySet & ent, int flg = LS_FINITE);
GeCurveSegment(const ADSGePoint3d &spt, const ADSGePoint3d &ept, ads_real dAng, int flg = LS_FINITE);
virtual ~GeCurveSegment();
GeCurveSegment & operator = (const GeLine &ln);
GeCurveSegment & operator = (const GeArc &arc);
GeCurveSegment & operator = (const GeCircle &cir);
GeCurveSegment & operator = (const GeCurveSegment &src);
bool operator == (const GeCurveSegment &src) const;
//lfy 2010-08-31 增加line,arc的set函数
GeCurveSegment & SetLine(const ADSGePoint3d& pt1, const ADSGePoint3d& pt2);
GeCurveSegment & SetArc(const ADSGePoint3d &spt, const ADSGePoint3d &ept, ads_real dang);
GeCurveSegment & SetCircle(const ADSGePoint3d& ptCen,double dRadius);
virtual bool IsKindOf(GeEntity::TEntityId entType) const;
virtual GeEntity::TEntityId Type() const;
virtual void CopyFrom(const GeEntity* pSrc);
virtual int Make(LPCTSTR lay = NULL) const;
virtual int MakeEntity(const EntitySet &e);
virtual int HitTest2d(const ADSGePoint3d &ptTest) const;
virtual int OSnap(int nMode, ADSGePoint3d &ptPick) const;
virtual int GetExtend(ADSGePoint3d &low, ADSGePoint3d &up) const;
virtual int Intersection(const GeArc* pArc, ads_point ptRp1 = NULL, ads_point ptRp2 = NULL) const;
virtual int Intersection(const GeCircle* pCircle, ads_point ptRp1 = NULL, ads_point ptRp2 = NULL) const;
virtual void TransformBy(ads_matrix mat);
virtual void SetPoints(const ADSGePoint3d &ptStart, const ADSGePoint3d &ptEnd);
//图形长度,周长
virtual ads_real GetLength() const;
virtual ADSGePoint3d MidPoint() const;
// 与曲线方向有关的成员
virtual GeArc GetArc() const;
// 0--左(内);1-右(外);2-其他 ---> 枚举,下同
virtual int OnWhichSide(const ADSGePoint3d &src) const;
// 0-左;1-右;2-其他;与上面的区别是,弧段作为有限长,在圆外但在弦的左侧算左
virtual int OnWhichSide1(const ADSGePoint3d &src) const;
// 从端点开始沿曲线走过给定距离的点向量
virtual int Polar(ads_real nDist, ADSGePointDir2d &res, int bFromStart = 1) const;
virtual void AsPoly2D(GePoly2D &poly) const;
virtual ads_real PathArea(ADSGePoint3d &tmpt) const;
// 取得指向内部的方向,线和弧不支持圆。 pt--0:start; 1--end
virtual ads_real IDirection(int pt) const;
// 曲线上的点pt的方向(切向)
virtual ads_real Direction(const ADSGePoint3d &pt) const;
// 求通过pt点的法向
virtual ads_real OrthoDirection(const ADSGePoint3d &pt) const;
// 求到端点的沿曲线线位移, 在线内距离为正,否则为负, 和Polar配合使用
// pt如果不在线上的话则先投影
virtual ads_real PathDistance(const ADSGePoint3d &pt, int bFromStart = 1) const;
virtual bool IsDirectionCurve();
int Is(CurveType t) const;
int MakeArrow(EntitySet &) const;
int ProjectToMe(const ADSGePoint3d &src, ADSGePoint3d &res) const;
int Intersection(const GeLine &, ads_point, ads_point) const ;
int Intersection(const GeCurveSegment &, ads_point pt1, ads_point pt2) const;
int GetSubSegment(const ADSGePoint3d &ptloc, ads_real dchordLen, GeCurveSegment &ptres) const;
//Wcs到展开坐标系
ADSGePoint3d Wcs2Ecs(ADSGePoint3d pt) const;
//展开坐标系到Wcs
ADSGePoint3d Ecs2Wcs(ADSGePoint3d pt) const;
void Wcs2Ecs(const GePoly2D &polyWcs, GePoly2D &polyEcs) const;
void Ecs2Wcs(const GePoly2D &polyEcs, GePoly2D &polyWcs) const;
GeCircle GetCircle() const;
GeLine GetLine() const;
//点到曲线的距离, 负数为内/左侧
double GetDist2Me(ADSGePoint3d ptMid) const;
double GetChordLength(double nArcLen) const;
CurveType GetCurveType() const;
static resbuf *Mask(LPCTSTR lay = NULL);
resbuf * AsFence(int nCirDiv = 20) const;
AcDbCurve *AsAcDbCurve() const;
GeCurveSegment Offset(ads_real dDist, int nflg) const;
GeCurveSegment Offset(int lr, ads_real dDist, int nflg) const;
double GetBulge() const;
void SetBulge(const double dBulge);
public:
ads_real m_dBulge;
};
class GeDirectionCurve : public GeCurveSegment
{
public:
GeDirectionCurve(int flg = LS_FINITE);
GeDirectionCurve(const GeArc &ar, int bMinus = 0);
GeDirectionCurve(const GeDirectionCurve &src);
GeDirectionCurve(const ADSGePoint3d &spt, const ADSGePoint3d &ept, ads_real dAng = 0.0, int flg = LS_FINITE);
virtual ~GeDirectionCurve();
virtual int IsMinusArc() const;
// 与曲线方向有关的成员
virtual int OnWhichSide(const ADSGePoint3d &src) const;
virtual int OnWhichSide1(const ADSGePoint3d &src) const;
// 从端点开始沿曲线走过给定距离的点向量
virtual int Polar(ads_real nDist, ADSGePointDir2d &res, BOOL bFromStart = TRUE) const;
virtual void Reverse();
virtual void TransUCS(ads_matrix mat);
virtual void TransUCS(const resbuf *, const resbuf *);
virtual void AsPoly2D(GePoly2D &poly) const;
virtual void SetPoints(const ADSGePoint3d &ptStart, const ADSGePoint3d &ptEnd);
// 端点处朝曲线段内部的方向
virtual ads_real IDirection(int pt) const;
// 取得指向内部的方向支持Line,Arc,不支持Cir。 pt--0:start; 1--end
virtual ads_real PathArea(ADSGePoint3d &tmpt) const;
virtual ads_real Direction(const ADSGePoint3d &pt) const;
// 求到端点的沿曲线线位移, 在线内距离为正,否则为负, 和Polar配合使用
// pt如果不在线上的话则先投影
virtual ads_real PathDistance(const ADSGePoint3d &pt, BOOL bFromStart = TRUE) const;
// 求通过pt点的法向
virtual ads_real OrthoDirection(const ADSGePoint3d &pt) const;
// dist left<0 / right>0
virtual GeCurveSegment GetCurve() const;
virtual GeDirectionCurve Offset(ads_real dist, int flg) const;
virtual bool IsDirectionCurve();
GeArc GetArc() const;
};