OCC常用类型转换

1、gp_xxx包含了基本的几何类。
属于FoundationClasses模块下的TKMath包,源码路径FoundationClasses/TKMath/gp,包括30多个类

 

// 定义三维点
gp_Pnt aPnt1(2. , 0 , 0);

//
gp_Pnt aOrigin(0 , 0 , 0); //
gp_Dir xDir(1 , 0 , 0);  // 方向
gp_Ax1 xAxis(aOrigin , xDir); //

2、Standard_XXX是occ定义的数值类型,包括一些类型定义和宏定义。
属于FoundationClasses模块下的TKernel包,源码路径FoundationClasses/TKernel/Standard,包括好几十个类

3、Geom_XXX定义了几何数据结构,由gp_XXX构建成的数据结构,不包含算法,一般称其为构建几何类
属于ModelingData模块下的TKG3d包,源码路径ModelingData/TKG3d/Geom,包括40个类

4、GC_MakeXXX也是由gp_XXX构建成的数据结构,与Geom_XXX不同的是,GC_MakeXXX包含构建算法,一般称其为几何形状构建包。
属于ModelingData模块下的TKGeomBase包,源码路径ModelingData/TKGeomBase/GC,包括近18个类

Handle(Geom_TrimmedCurve) aArcOfCircle = GC_MakeArcOfCircle(aPnt2,aPnt3 ,aPnt4);
Handle(Geom_TrimmedCurve) aSegment1 = GC_MakeSegment(aPnt1 , aPnt2);

Handle(Geom_TrimmedCurve) aArcOfCircle = GC_MakeArcOfCircle(aPnt2,aPnt3 ,aPnt4); 
Handle(Geom_TrimmedCurve) aSegment1 = GC_MakeSegment(aPnt1 , aPnt2);

5、TopoDS_XXX是由多个Geom_XXX组成的,他们有共同的父类TopoDS_Shape,从名字可以看出该类对象包括了拓扑关系,但是TopoDS_XXX仅是一种数据结构,不包括算法。
属于ModelingData模块下的TKBRep包,源码路径ModelingData/TKBRep/TopoDS,包括15个类

图形 Open CASCADE Class 描述
Vertex(顶点) TopoDS_Vertex 表示几何体上的一个点
Edge (边) TopoDS_Edge 表示一个曲线和一个有边界的向量
Wire (网格) TopoDS_Wire 由顶点连起来的一系列边
Face (面) TopoDS_Face 由闭合的网格组成的边界平面
Shell (壳) TopoDS_Shell 通过边连接起起来一组面
Solid (体) TopoDS_Solid 由壳组成的有边界的三维空间
CompSolid (复合体) TopoDS_CompSolid 通过面连接的一组体
Compound (复合对象) TopoDS_Compound 由上面各种图形形成的一个集合
拓扑仅仅是数据结构,本身并不可做什么操作和运算,一般需要转成Geom_XX后,可以进行相关信息的提取及操作;如何转换呢,一般使用BRep_Tool(见12)

6、BRepBuilderAPI_XXX一般称为拓扑结构构建包,实现了从Geom_XXX到TopoDS_XXX的构建过程。
属于ModelingAlgorithms模块下的TKTopAlgo包,源码路径ModelingAlgorithms/TKTopAlgo/BrepBuilderAPI,包括20个类

TopoDS_Edge aEdge1 = BRepBuilderAPI_MakeEdge(aSegment1); // aSegment1为Geom_TrimmedCurve类型
TopoDS_Edge aEdge2 = BRepBuilderAPI_MakeEdge(aArcOfCircle); // aArcOfCircle为Geom_TrimmedCurve

// 由多个边拓扑创建得到网格拓扑
TopoDS_Wire aWire = BRepBuilderAPI_MakeWire(aEdge1 , aEdge2 , aEdge3);

TopoDS_Edge aEdge1 = BRepBuilderAPI_MakeEdge(aSegment1);  // aSegment1为Geom_TrimmedCurve类型
TopoDS_Edge aEdge2 = BRepBuilderAPI_MakeEdge(aArcOfCircle); // aArcOfCircle为Geom_TrimmedCurve

// 由多个边拓扑创建得到网格拓扑
TopoDS_Wire aWire = BRepBuilderAPI_MakeWire(aEdge1 , aEdge2 , aEdge3);

7、BRepPrimAPI_XXX一般称为实体构建包,也就是将TopoDS_XXX构建成为实体,当然这里的实体也是TopoDS_XXX对象
属于ModelingAlgorithms模块下的TKPrim包,源码路径ModelingAlgorithms/TKPrim/BRepPrimAPI,包括11个类

顶点/gp_Pnt->线段/GC_MakeSegment->边/BRepBuilderAPI_MakeEdge->线框/BrepBuilderAPI_MakeWire->面/BRepBuilderAPI_MakeFace->体/BRepPrimAPI_MakePrism

gp_Vec aPrismVec(0 , 0 , myHeight);  // 向量
TopoDS_Shape myBody = BRepPrimAPI_MakePrism(myFaceProfile , aPrismVec); 
// 注意myFaceProfile 为一个封闭的网格

8、BRepFilletAPI_XXX为倒角包。
属于ModelingAlgorithms模块下的TKFillet包,源码路径ModelingAlgorithms/TKFillet/BRepFilletAPI,包括3个类

BRepFilletAPI_MakeFillet mkFillet(myBody);  // myBody为Solid实体,一个TopoDS_Shape类型 
mkFillet.Add(myThickness / 12. , aEdge);  // 添加需要倒角的边,aEdge为TopoDS_Edge 类型
myBody = mkFillet.Shape(); // 获取新的TopoDS_Shape类型

9、TopExp_Explorer为拓扑解析包,用于TopoDS_XXX的解析,就是将已知实体(拓扑结构)解析为边组合、面组合等等。
属于ModelingData模块下的TKBRep包,源码路径ModelingData/TKBRep/TopExp,2个类

TopExp_Explorer aEdgeExplorer(myBody , TopAbs_EDGE); 
while(aEdgeExplorer.More())
{ 
    TopoDS_Edge aEdge = TopoDS::Edge(aEdgeExplorer.Current()); //Add edge to fillet algorithm 
    mkFillet.Add(myThickness / 12. , aEdge); 
    ... 
    aEdgeExplorer.Next(); 
} 


10、TopAbs_ShapeEnum是一个特殊的结构,类似于一个拓扑结构的数组,具有More()、Next()、Current()三个重要的方法,一般称之为拓扑解析结果集
11、BRepAlgoAPI_XXX是核心算法包,专门用于Shape对象的布尔运算(交集common(Boolean intersection)、差集cut(Boolean subtraction)、并集fuse(Boolean union)),一般称之为几何算法包
属于ModelingAlgorithms模块下的TKBO包,源码路径ModelingAlgorithms/TKBO/BRepAlgoAPI,包括10个类

TopoDS_Shape myNeck = BRepPrimAPI_MakeCylinder(neckAx2 , myNeckRadius , myNeckHeight); // neckAx2为gp_Ax2类型
myBody = BRepAlgoAPI_Fuse(myBody , myNeck); // myBody 为 TopoDS_Shape 类型

12、BRep_Tool主要有三个方法,用于从TopoDS_XXX到Geom_XXX的转换
属于ModelingData模块下的TKBRep包,源码路径ModelingData/TKBRep/BRepTools,14个类
TopoDS_Face -> Geom_Surface
TopoDS_Edge->Geom_Curve
TopoDS_Vertex->Geom_Point

Handle(Geom_Surface) aSurface = BRep_Tool::Surface(aFace); // aFace 为TopoDS_Face类型,但是并不知道是平面还是圆柱侧面
// 一般这里还需要做一次类型检测,使用Standard_Transient(见13点)
Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aSurface);

为什么需要转换多次,从TopoDS_Face->Geom_Surface->Geom_Plane? Geom_Surface本身不带信息的,都是引用具体的Geom_Plane或Geom_CylindricalSurface;这里可以通过Geom_Plane::Location获取相关信息

13、Standard_Transient类主要有两个用途
DynamicType 函数用来获取 Handle(Geom_Surface)的真实类型,因为Geom_Surface有可能是任何一种面
IsKind 用来判断该类型是否是某个类的子类
if(aSurface->DynamicType() == STANDARD_TYPE(Geom_Plane))
{
// 这里可以执行一些检测成功后的内容,比如做类型转换
Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aSurface);

14、BRepOffisetAPI_XXX一般称为形体生成包,用于将线框模型生成实体模型
TopTools_ListOfShape facesToRemove; // 一个可以存放Shape集合的对象
facesToRemove.Append(face); // 添加一个一个面face为TopoDS_Face 类型

MyBody = BRepOffsetAPI_MakeThickSolid(myBody , facesToRemove , -myThickness / 50 , 1.e-3);
————————————————
版权声明:本文为CSDN博主「丰色木夕」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/youlinhuanyan/article/details/123968903

posted @ 2022-04-30 22:13  格美格美  阅读(3181)  评论(0编辑  收藏  举报