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);
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);
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);