Files
envi-code/SourceCode/Code2026/tg_shs/shs_siteplan/commonRoad.h
T

261 lines
8.5 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
// Copyright (C), 1998-2007, Beijing Tangent Engineering Software Co. Ltd.
// = FileName: commonRoad.h
// = Version: 8.5
// = Author: lgh
// = Date: 2010-10-26 11:07:20
// = Description: 道路公用函数
// = Maintainers:
#ifndef __TCH_SITEPLAN_COMMONROAD_H__
#define __TCH_SITEPLAN_COMMONROAD_H__
class CLineInterStruct;
class CArcInterStruct;
class CInterStruct;
typedef AcArray<CLineInterStruct*> AcAryLineInterStruct;
typedef AcArray<CArcInterStruct*> AcAryArcInterStruct;
typedef AcArray<CInterStruct*> AcAryInterStructPointer;
#define POINT_2D_TO_3D(point) (AcGePoint3d((point).x, (point).y, 0.0))
#define POINT_3D_TO_2D(point) (AcGePoint2d((point).x, (point).y))
namespace TRoadCommon
{
// 显示的指定内存分配器,以使平台之间兼容。
typedef AcArray<AcGeLineSeg2d, AcArrayObjectCopyReallocator<AcGeLineSeg2d> > AcAryLineSeg2d;
typedef AcArray<AcGeCircArc2d, AcArrayObjectCopyReallocator<AcGeCircArc2d> > AcAryCircArc2d;
// 描述两个向量的方向的关系。相同,相反,垂直
enum EVecDirection {eSameDir, eOppDir, ePerpDir};
enum ERoadInterRet {eIntersect = 0, eNotIntersect, eOverlay, eOverlayed};
enum EFilletStyle{eSameCenter = 0, eSameRadius};
// 在垂直方向上,一个点相对于一个道路的位置,从左到右依次为:左部,左边线上,道路内,右边线上,右部
enum EPointAtRoadPerp
{eRoadLeftSide = 0, eRoadLeftEdge, eInRoad, eRoadRightEdge, eRoadRightSide};
inline bool InRoadPerp(EPointAtRoadPerp ep){ return (ep == eRoadLeftEdge) || (ep == eRoadRightEdge) || (ep == eInRoad);}
inline bool InRoadEdgePerp(EPointAtRoadPerp ep) {return (ep == eRoadLeftEdge) || (ep == eRoadRightEdge);}
// 水平方向上,交点跟当前道路的关系,起点外,路内,终点外
// 从起点到终点依次为:起点外,路上,终点外。
enum EPointAtRoadInDir
{eRoadStartOut, eInEdge, eRoadEndOut};
// 点跟线(包括弧线)的关系(有长度的线)依次为:
enum EPointToLine{
eLeft, // 线左侧
eOnLine, // 线上
eRight, // 线右侧
eStartOut, // 起点外
eStartPoint, // 起点处
eEndOut, // 终点外
eEndPoint // 终点处
};
template <class TAcAryPtrs>
void ClearAcaryAll(TAcAryPtrs &arry)
{
while (!arry.isEmpty())
arry.removeFirst();
}
template <class TAcAryPtrs>
void ClearAndDeleteAry(TAcAryPtrs &arry)
{
for (int i = 0; i < (int)arry.length(); i++)
{
delete arry[i];
}
ClearAcaryAll(arry);
}
template <class T>
inline void SWAP(T &a, T&b)
{
T c = a;
a = b;
b = c;
}
template <class T>
inline T MAX(const T &a, const T&b)
{
return a > b ? a : b;
}
template <class T>
inline T MIN(const T &a, const T&b)
{
return a < b ? a : b;
}
// 判断是否是偶数。
inline bool EvenNum(int num) {return (num & 0x1) == 0;}
inline bool DoubleEqual(double d1, double d2, double dTol = 1e-6)
{
return (fabs(d1 - d2) < dTol);
}
inline AcGeLine2d ToLine(const AcGeLineSeg2d &lineSeg) {return AcGeLine2d(lineSeg.startPoint(), lineSeg.endPoint());}
inline AcGeCircArc2d ToCircle(const AcGeCircArc2d &arc) {return AcGeCircArc2d(arc.center(), arc.radius());}
// 点相对于线段的关系,左侧,右侧,线段(所在的直线)上,
EPointToLine PointToLineSegPerp(const AcGeLineSeg2d &lineseg, const AcGePoint2d &point, double dTol = 1.0);
EPointToLine PointToArcPerp(const AcGeCircArc2d &arc, const AcGePoint2d &point, double dTol = 1.0);
EPointToLine PointToLineSegDir(const AcGeLineSeg2d &lineseg, const AcGePoint2d &point, double dTol = 1.0);
EPointToLine PointToArcDir(const AcGeCircArc2d &arc, const AcGePoint2d &point, double dTol = 1.0);
// GeArc是MM单位,DbArc是系统单位
AcDbArc& GeArcToDbSys(const AcGeCircArc2d &arc, AcDbArc &dbArc);
AcDbArc* GeArcToDbSys(const AcGeCircArc2d &arc);
AcGeCircArc2d DbArcToGeMM(const AcDbArc &dbArc);
AcDbLine* GeLineToDbLineSys(const AcGeLineSeg2d &lineSeg);
AcGeLineSeg2d DbLineToGeLineMM(const AcDbLine &dbLine);
enum EEntType {eRoadEdgeType = 0, eRoadMidType};
void SetLayer(AcDbEntity *pEnt, EEntType entType);
//AcGeCircArc2d ConArc(const AcGePoint2d &center, const AcGePoint2d &ptStart, const AcGePoint2d &ptEnd);
AcGeCircArc2d OutSideArc(const AcGeCircArc2d &arcTem, double dHalfWid);
AcGeCircArc2d InSideArc(const AcGeCircArc2d &arcTem, double dHalfWid);
AcGeLineSeg2d LeftLine(const AcGeLineSeg2d &lineseg, double dDis);
AcGeLineSeg2d RightLine(const AcGeLineSeg2d &lineseg, double dDis);
AcGeCircArc2d LeftArc(const AcGeCircArc2d &arc, double dDis);
AcGeCircArc2d RightArc(const AcGeCircArc2d &arc, double dDis);
// ptStart, ptEnd仅仅用来控制生成圆弧的角度,不改变圆弧的半径和圆形。所以他们可以不再该弧上
AcGeCircArc2d ConNewArc(const AcGeCircArc2d &arcTemplate, const AcGePoint2d &ptStart, const AcGePoint2d &ptEnd);
AcGeCircArc2d ConNewArc(const AcGeCircArc2d &arcTemplate, double dRadius);
AcGeVector2d TanVecOfArcStartPoint(const AcGeCircArc2d &arc);
AcGeVector2d TanVecOfArcEndPoint(const AcGeCircArc2d &arc);
double NormalAngle(double dAngle);
double AngleInClock(bool bClockwise, double angle1, double angle2);
// 从Vec1 到 Vec2的角度,按照bClock的方向
double AngleOfVec(const AcGeVector2d &vec1, const AcGeVector2d &vec2, bool bClock);
// 取得圆弧的中点
AcGePoint2d MidPointOfArc(const AcGeCircArc2d &arc);
AcGePoint2d AntiMidPointOfArc(const AcGeCircArc2d &arc);
// clock的方向上添加角度
inline double AddAngleInClock(bool bClockWise, double dAngle, double dAdd)
{
return NormalAngle(dAngle + (bClockWise ? -dAdd : dAdd));
}
// 反方向的角度
inline double AntiAngle(double dAngle)
{
return NormalAngle(dAngle + PI);
}
// 向量vec的方向上,对pt1和pt2排序
// ret:-1:pt1 < pt2; 0: pt == pt2;1: pt1 > pt2。
int PointSequence(const AcGeVector2d &vec, const AcGePoint2d &pt1, const AcGePoint2d &pt2, double dTol = 1e-6);
// 圆弧arc的方向上(顺时针,逆时针)对pt1和pt2进行排序.
// 备注:排序的起点是arc另一侧圆弧的中点,方向是按照圆弧的时针方向
// ret:-1:pt1 < pt2; 0: pt == pt2;1: pt1 > pt2。
int PointSequence(const AcGeCircArc2d &arc, const AcGePoint2d &pt1, const AcGePoint2d &pt2, double dTol = 1e-6);
// 向一端延长直线,延伸长度 == dExtend
AcGeLineSeg2d ExtendLine(const AcGeLineSeg2d &lineseg, bool bStart, double dExtend);
// 向一端延长弧线,延伸部分不会超过本半圆。延伸长度 = dExtendLen
AcGeCircArc2d ExtendArc(const AcGeCircArc2d &arc, bool bStart, double dExtendLen);
// 两端延伸线段,延伸长度分别为:dExtendStart, dExtendEnd;
AcGeLineSeg2d ExtendLine(const AcGeLineSeg2d &lineseg, double dExtendStart, double dExtendEnd);
// 两端延伸圆弧,延伸长度分别为:dExtendStart, dExntedEnd;两端的延伸长度皆不超过半圆弧
AcGeCircArc2d ExtendArc(const AcGeCircArc2d &arc, double dExtendStart, double dExtendEnd);
void ResetLine(AcGeLineSeg2d &line, bool bStart, const AcGePoint2d &ptAccurate);
void ResetArc(AcGeCircArc2d &arc, bool bStart, const AcGePoint2d &ptAccurate);
double LenOfArc(const AcGeCircArc2d &arc);
BOOL SameAngle(double dAngle1, double dAngle2, double dAngleTol);
template <class TGeCurve>
inline AcGePoint2d ChosePoint(const TGeCurve &curve, BOOL bStart)
{
return bStart ? curve.startPoint() : curve.endPoint();
}
inline AcGePoint2d AsSysUnitPoint2d(const AcGePoint2d &pt)
{
return AcGePoint2d(_AS_SYS_UNIT(pt.x), _AS_SYS_UNIT(pt.y));
}
inline AcGePoint2d AsMMUnitPoint2d(const AcGePoint2d &pt)
{
return AcGePoint2d(_AS_MM(pt.x), _AS_MM(pt.y));
}
inline AcGePoint3d AsSysUnitPoint3d(const AcGePoint3d &pt)
{
return AcGePoint3d(_AS_SYS_UNIT(pt.x), _AS_SYS_UNIT(pt.y), _AS_SYS_UNIT(pt.z));
}
inline AcGePoint3d AsMMUnitPoint3d(const AcGePoint3d &pt)
{
return AcGePoint3d(_AS_MM(pt.x), _AS_MM(pt.y), _AS_MM(pt.z));
}
// 多选,每选择一次,函数退出。
// csPrompt:提示信息
// ssResult:结果选择集
// rbBaseMask:过滤列表
// szKeyword:关键字列表(单个关键字,不区分大小写,无须空格)
// chRet:所选择的关键字
// ret:空格,回车,右键:RTNONE;
// ret:关键字:RTKWORD;
// ret:正常选择:RTNORMAL;
// ret:ESC:RTCAN;
// ret:所选实体无亮显,用户可在每次选择之后自己控制亮显。
int SelectEntitiesOnce(CString csPrompt,PickSet &ssResult, TRBList &rbBaseMask,const TCHAR* szKeyword, TCHAR &chRet);
// 测试类
class MyArc
{
public:
MyArc (const AcGeCircArc2d &arc)
{
Set(arc);
}
void Set(const AcGeCircArc2d &arc)
{
ptStart = arc.startPoint();
ptEnd = arc.endPoint();
ptCenter = arc.center();
dRaidus = arc.radius();
bColck = arc.isClockWise();
}
AcGePoint2d ptStart;
AcGePoint2d ptEnd;
AcGePoint2d ptCenter;
double dRaidus;
Adesk::Boolean bColck;
};
class MyLineSeg
{
public:
MyLineSeg(const AcGeLineSeg2d &line)
{
ptStart = line.startPoint();
ptEnd = line.endPoint();
dLen = line.length();
}
AcGePoint2d ptStart;
AcGePoint2d ptEnd;
double dLen;
};
}
using namespace TRoadCommon;
#endif