#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; };