Files
envi-code/SourceCode/Code2026/inc/AdsXRx/XCurveSegment.h
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

332 lines
7.7 KiB
C++

//-----------------------------------------------------------------------------+
// Copyright (C), 1998-2007, SH Software Co. Ltd.
// = FileName : XCurveSegment类
// = Version : ver2.0
// = Author : zjq
// = CreateDate : 2002-09-09
// = Description: XCurveSegment类声明
// = Maintainers:
//
//-----------------------------------------------------------------------------+
#ifndef _XCURVESEGMENT_H_
#define _XCURVESEGMENT_H_
#ifndef _ENTITY_H_
#include "Entity.h"
#endif
#ifndef _XPOLY2D_H_
#include "XPoly2D.h"
#endif
#ifndef _XPointDir2d_H_
#include "XPointDir2d.h"
#endif
class XPoly2D;
class GEOAPI XCurveSegment : public XLine
{
public:
XCurveSegment(int flg = LS_FINITE);
XCurveSegment(const XCurveSegment &src);
XCurveSegment(const Entity & ent, int flg = LS_FINITE);
XCurveSegment(const XPoint &spt, const XPoint &ept, ads_real dAng, int flg = LS_FINITE);
virtual ~XCurveSegment();
XCurveSegment & operator = (const XLine &ln);
XCurveSegment & operator = (const XArc &arc);
XCurveSegment & operator = (const XCircle &cir);
XCurveSegment & operator = (const XCurveSegment &src);
bool operator == (const XCurveSegment &src) const;
//zjq 2009-08-31 增加line,arc的set函数
XCurveSegment & SetLine(const XPoint& pt1, const XPoint& pt2);
XCurveSegment & SetArc(const XPoint &spt, const XPoint &ept, ads_real dang);
XCurveSegment & SetCircle(const XPoint& ptCen,double dRadius);
virtual bool IsKindOf(TEntityId entType) const;
virtual TEntityId Type() const;
virtual void CopyFrom(const XEntity* pSrc);
virtual int Make(LPCTSTR lay = NULL) const;
virtual int MakeEntity(const Entity &e);
virtual int HitTest2d(const XPoint &ptTest) const;
virtual int OSnap(int nMode, XPoint &ptPick) const;
virtual int GetExtend(XPoint &low, XPoint &up) const;
virtual int Intersection(const XArc* pArc, ads_point ptRp1 = NULL, ads_point ptRp2 = NULL) const;
virtual int Intersection(const XCircle* pCircle, ads_point ptRp1 = NULL, ads_point ptRp2 = NULL) const;
virtual void TransformBy(ads_matrix mat);
virtual void SetPoints(const XPoint &ptStart, const XPoint &ptEnd);
//图形长度,周长
virtual ads_real GetLength() const;
virtual XPoint MidPoint() const;
// 与曲线方向有关的成员
virtual XArc GetArc() const;
// 0--左(内);1-右(外);2-其他 ---> 枚举,下同
virtual int OnWhichSide(const XPoint &src) const;
// 0-左;1-右;2-其他;与上面的区别是,弧段作为有限长,在圆外但在弦的左侧算左
virtual int OnWhichSide1(const XPoint &src) const;
// 从端点开始沿曲线走过给定距离的点向量
virtual int Polar(ads_real nDist, XPointDir2d &res, int bFromStart = 1) const;
virtual void AsPoly2D(XPoly2D &poly) const;
virtual ads_real PathArea(XPoint &tmpt) const;
// 取得指向内部的方向,线和弧不支持圆。 pt--0:start; 1--end
virtual ads_real IDirection(int pt) const;
// 曲线上的点pt的方向(切向)
virtual ads_real Direction(const XPoint &pt) const;
// 求通过pt点的法向
virtual ads_real OrthoDirection(const XPoint &pt) const;
// 求到端点的沿曲线线位移, 在线内距离为正,否则为负, 和Polar配合使用
// pt如果不在线上的话则先投影
virtual ads_real PathDistance(const XPoint &pt, int bFromStart = 1) const;
virtual bool IsDirectionCurve();
int Is(CurveType t) const;
int MakeArrow(Entity &) const;
int ProjectToMe(const XPoint &src, XPoint &res) const;
int Intersection(const XLine &, ads_point, ads_point) const ;
int Intersection(const XCurveSegment &, ads_point pt1, ads_point pt2) const;
int GetSubSegment(const XPoint &ptloc, ads_real dchordLen, XCurveSegment &ptres) const;
//Wcs到展开坐标系
XPoint Wcs2Ecs(XPoint pt) const;
//展开坐标系到Wcs
XPoint Ecs2Wcs(XPoint pt) const;
void Wcs2Ecs(const XPoly2D &polyWcs, XPoly2D &polyEcs) const;
void Ecs2Wcs(const XPoly2D &polyEcs, XPoly2D &polyWcs) const;
XCircle GetCircle() const;
XLine GetLine() const;
//点到曲线的距离, 负数为内/左侧
double GetDist2Me(XPoint 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;
XCurveSegment Offset(ads_real dDist, int nflg) const;
XCurveSegment Offset(int lr, ads_real dDist, int nflg) const;
double GetBulge() const;
void SetBulge(const double dBulge);
public:
ads_real m_dBulge;
};
inline bool XCurveSegment::operator == (const XCurveSegment &src) const
{
bool bRet = false;
if (src.GetCurveType() != GetCurveType())
{
bRet = false;
}
else if (Is(CURVE_LINE))
{
bRet = (GetLine() == src.GetLine());
}
else if (Is(CURVE_ARC))
{
bRet = (GetArc() == src.GetArc());
}
else
{
bRet = (GetCircle() == src.GetCircle());
}
return bRet;
}
inline int XCurveSegment::Is(CurveType t) const
{
double dBulge = fabs(GetBulge());
return ((dBulge < 1E-6 && t == CURVE_LINE)
|| (fabs(2.0 * PI - dBulge) < 1E-5 && t == CURVE_CIRCLE)
|| (dBulge > 1E-6 && dBulge < 2.0 * PI - 1E-6 && t == CURVE_ARC));
}
inline CurveType XCurveSegment::GetCurveType() const
{
CurveType t;
double dBulge = fabs(GetBulge());
if (dBulge < 1E-6)
{
t = CURVE_LINE;
}
else if (fabs(2.0 * PI - dBulge) < 1E-5)
{
t = CURVE_CIRCLE;
}
else
{
t = CURVE_ARC;
}
return t;
}
inline XLine XCurveSegment::GetLine() const
{
return *this;
}
inline double XCurveSegment::GetChordLength(double nArcLen) const
{
double nRes = nArcLen;
if (Is(CURVE_ARC))
{
XArc ar = GetArc();
double dRadius = ar.GetRadius();
nRes = 2.0 * dRadius * sin(nArcLen / 2.0 / dRadius);
}
return fabs(nRes);
}
inline int XCurveSegment::HitTest2d(const XPoint &ptTest) const
{
CurveType t = GetCurveType();
int nHitFlag = 0;
if (t == CURVE_LINE)
{
nHitFlag = GetLine().HitTest2d(ptTest);
}
else if (t == CURVE_ARC)
{
nHitFlag = GetArc().HitTest2d(ptTest);
}
else if (t == CURVE_CIRCLE)
{
nHitFlag = GetCircle().HitTest2d(ptTest);
}
return nHitFlag;
}
inline int XCurveSegment::MakeEntity(const Entity &e)
{
if (Is(CURVE_LINE))
{
return GetLine().MakeEntity(&e);
}
if (Is(CURVE_ARC))
{
return GetArc().MakeEntity(&e);
}
if (Is(CURVE_CIRCLE))
{
return GetCircle().MakeEntity(&e);
}
return RTERROR;
}
inline int XCurveSegment::GetExtend(XPoint &lowPt, XPoint &upPt) const
{
if (Is(CURVE_LINE))
{
return XLine::GetExtend(lowPt, upPt);
}
else if (Is(CURVE_ARC))
{
return GetArc().GetExtend(lowPt, upPt);
}
else
{
return GetCircle().GetExtend(lowPt, upPt);
}
}
inline XCurveSegment & XCurveSegment::operator = (const XCurveSegment &src)
{
if (this != &src)
{
m_nFlag = src.m_nFlag;
m_startPoint = src.m_startPoint;
m_endPoint = src.m_endPoint;
m_dBulge = src.m_dBulge;
}
return *this;
}
inline XCurveSegment & XCurveSegment::operator = (const XLine &ln)
{
m_nFlag = ln.m_nFlag;
m_startPoint = ln.m_startPoint;
m_endPoint = ln.m_endPoint;
m_dBulge = 0.0;
return *this;
}
inline XCurveSegment & XCurveSegment::operator = (const XArc &arc)
{
//SetLineFlag(LS_FINITE);
m_nFlag = LS_FINITE;
XPoint ptStart, ptEnd;
XPoint ptCen = arc.GetCenterPt();
double dRadius = arc.GetRadius();
ads_polar(ptCen, arc.GetStarAngle(), dRadius, ptStart);
ads_polar(ptCen, arc.GetEndAngle(), dRadius, ptEnd);
m_startPoint = ptStart;
m_endPoint = ptEnd;
m_dBulge = arc.Bulge();
return *this;
}
inline XCurveSegment & XCurveSegment::operator = (const XCircle &cir)
{
XPoint ptStart, ptEnd;
XPoint ptCen = cir.GetCenterPt();
double dRadius = cir.GetRadius();
ads_polar(ptCen, 0.0, dRadius, ptStart);
ads_polar(ptCen, PI, dRadius, ptEnd);
m_startPoint = ptStart;
m_endPoint = ptEnd;
m_dBulge = 2.0 * PI;
return *this;
}
#endif