COMPASSi/trunk/code/inc/OCC/OCCLib/BaseAlgo.h

73 lines
3.5 KiB
C
Raw Normal View History

2025-06-25 15:06:42 +08:00
#pragma once
class BaseAlgo
{
public:
BaseAlgo(void);
~BaseAlgo(void);
public:
//获取边的端点
void GetEdgeStartEndPoint(const TopoDS_Edge& edge, gp_Pnt& sp, gp_Pnt& ep);
//判断两条边是否重合
bool isOnEdge(TopoDS_Edge& edge1, TopoDS_Edge& edge2);
//判断两条边是否有公共部分
bool hasCommenPart(TopoDS_Edge& edge1, TopoDS_Edge& edge2);
//
Bnd_Box getFaceBox(TopoDS_Face face);
//从边集合中分离出独立的边集合,其中不含有重复边
void GetWireSingleEdges(map<int, TopoDS_Edge>& mapEdge,vector<vector<int>>& edgeIndex);
//判断边是否重合
bool CheckTwoEdgeOverlapByLinePointProject(TopoDS_Edge& tedgeA,TopoDS_Edge& tedgeB);
//如果交线端点不在在所在面的边界上,则构造一条短边
bool GetConnectEdge(std::map<int, TopoDS_Edge>& mapEdge,std::vector<int> edgeIndex, TopoDS_Face &face, TopoDS_Edge& edge1, TopoDS_Edge& edge2, bool& isEdge1, bool& isEdge2);
//如果两条边的端点不重合,则构造一条短边
bool GetConnectEdge(TopoDS_Face& face, TopoDS_Edge& edge1, TopoDS_Edge& edge2, TopoDS_Edge& newEdge1, TopoDS_Edge& newEdge2, bool& hasNewEdge1, bool& hasNewEdge2);
//重新构造交线
void RebuildConnectLines(TopoDS_Face& face, std::map<int, TopoDS_Edge> mapEdge,std::vector<int> edgeIndex, std::vector<TopoDS_Edge>& newEdges);
//获取点在线上的投影点,并返回最短距离
Standard_Real Project(const TopoDS_Vertex& V, const TopoDS_Edge& theEdge, gp_Pnt& p);
//建立边在面上的关系
void PutPCurve(const TopoDS_Edge& Edg, const TopoDS_Face& Fac);
//根据交线将面集合进行拆分
TopoDS_Shape GetCutResult(map<int, TopoDS_Face>& mapFace,TopoDS_Shape& InterSecLine);
//拆分topo成shell集合
vector<TopoDS_Shell> SplitShapeToShell(TopoDS_Shape S);
//判断点是否在线上
bool IsInCurve(TopoDS_Edge edge, TopoDS_Vertex vertex);
//通过连接关系构造相连的曲面集合
void GetFaceSet( vector<int> &resultSet, map<int,bool>& mapFaceSign, map<int,vector<int>>& mapConnectFace, vector<int>& tempFaceSet);
//将曲线转化成B样条曲线
Handle(Geom_BSplineCurve) GetBSplineCurve(const TopoDS_Shape& aS);
//判断两个topo的边界是否相连
bool IsConnect(TopoDS_Shape s1, TopoDS_Shape s2);
//将曲面集合缝合
TopoDS_Shell SewShell(vector<TopoDS_Shape> shapeSet, double tol = 1e-6);
//
void GetWireSingleEdges1(map<int, TopoDS_Edge>& mapEdge,vector<vector<int>>& edgeIndex);
//删除重复点
void DeleteSamePoint(vector<gp_Pnt>& pSet, double tol);
//
TopoDS_Solid RebuildSolid(TopoDS_Solid solid, double tol = 1e-6);
//
vector<TopoDS_Shape> SolidSurfaceClear(vector<TopoDS_Shape> shapeSet, vector<int> onID);
//判断两条边是否平行
bool IsParallel( TopoDS_Edge e1, TopoDS_Edge e2);
//判断体的方向是否向外
bool IsReversed(TopoDS_Shape solid, gp_Pnt p = gp_Pnt(2000,2000,2000));
//判断点是否在线上
bool IsPointOnEdge( const TopoDS_Edge& edge,const gp_Pnt& pt1);
//通过线上两点来截取曲线
bool TrimEdgeBy2Points( const TopoDS_Edge& edge,const gp_Pnt& pt1,const gp_Pnt& pt2,TopoDS_Edge& newEdge );
//按顺序获取边集合的端点集合
vector<gp_Pnt> GetPointSet(vector<TopoDS_Edge> edgeSet);
//获取点在线上投影点坐标
gp_Pnt ProjectPointOnCurvePoint(TopoDS_Edge edge, gp_Pnt p);
//获取点在线上投影点参数
double ProjectPointOnCurvePara(TopoDS_Edge edge, gp_Pnt p);
//获取点在线上投影点距离
double ProjectPointOnCurveDis(TopoDS_Edge edge, gp_Pnt p);
public:
int flag;
};