OpenCascade 入门须知API

2023-10-19 07:10
文章标签 入门 api opencascade 须知

本文主要是介绍OpenCascade 入门须知API,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Tutorial简述

gp_XXX
Standard_XXX
Geom_XXX
GC_MakeXXX
TopoDS_XXX
BRepBuilderAPI_XXX
BRepPrimAPI_XXX
BRepFilletAPI_XXX
TopExp_Explorer
TopAbs_ShapeEnum
BRepAlgoAPI_XXX
BRep_Tool与 Standard_Transient
TopTools_XXX
BRepOffsetAPI_XXX

Tutorial简述
Tutorial用一个绘制Bottle的例子描述了OCC建模的基本步骤。这里涉及了一些概念和类的用法,不细心看做笔记是很容易忘掉的。

gp_XXX

gp_Pnt 是最简单的“点”;此外对应的有还有许多这样的简单结构,这些类从其类名就可以知道它可能有哪些参数,没错,这些类包含了点、线、面、轴以及各种曲面等,其中的参数都是构建这些几何结构必须的参数,我们可以称gp_Pnt这一类的类为基本几何类。

- gp_Ax2 
- gp_Ax2d 
- gp_Ax3 
- gp_Ax3d 
- gp_Ax22 
- gp_Ax22d 
- gp_Circ 
- gp_Circ2d 
- gp_Cone 
- gp_Cylinder 
- gp_Dir 
- gp_Dir2d 
- gp_Elips 
- gp_Elips2d 
- gp_EulerSequence 
- gp_GTrsf 
- gp_GTrsf2d 
- gp_Hypr 
- gp_Hypr2d 
- gp_Lin 
- gp_Lin2d 
- gp_Mat 
- gp_Mat2d 
- gp_Parab 
- gp_Parab2d 
- gp_Pln 
- gp_Pnt2d 
- gp_Quaternion 
- gp_QuaternionNLerp 
- gp_QuaternionSLerp 
- gp_Sphere 
- gp_Torus 
- gp_Trsf 
- gp_Trsf2d 
- gp_TrsfForm 
- gp_TrsfNLerp 
- gp_Vec 
- gp_Vec2d 
- gp_VectorWithNullMagnitude 
- gp_XY 
- gp_XYZ

Geom_XXX

Geom定义了几何数据结构,但也仅此而已,并不包含什么算法,可以说它是由gp_XXX构建而成的数据结构,比gp_XXX高级一些。我们可以称其为构建几何类。

Geom_Axis1Placement 
Geom_Axis2Placement 
Geom_AxisPlacement 
Geom_BezierCurve 
Geom_BezierSurface 
Geom_BoundedCurve 
Geom_BoundedSurface 
Geom_BSplineCurve 
Geom_BSplineSurface 
Geom_CartesianPoint 
Geom_Circle 
Geom_Conic 
……

Standard_XXX

Standard_XXX类型的类是OCC的类型定义、宏定义的数据结构,与我们常用的C++没有区别的,我们可以称其为OCC定义数值类型。

#define Standard_False false
#define Standard_True  true
typedef int           Standard_Integer;
typedef double        Standard_Real;
typedef bool          Standard_Boolean;
typedef float         Standard_ShortReal;
typedef char          Standard_Character;
typedef unsigned char Standard_Byte;
typedef void*         Standard_Address;
typedef size_t        Standard_Size;
typedef std::time_t   Standard_Time;// Unicode primitives, char16_t, char32_t
typedef char          Standard_Utf8Char;     //!< signed   UTF-8 char
typedef unsigned char Standard_Utf8UChar;    //!< unsigned UTF-8 char

Geom_XXX

Geom定义了几何数据结构,但也仅此而已,并不包含什么算法,可以说它是由gp_XXX构建而成的数据结构,比gp_XXX高级一些。我们可以称其为构建几何类。

Geom_Axis1Placement 
Geom_Axis2Placement 
Geom_AxisPlacement 
Geom_BezierCurve 
Geom_BezierSurface 
Geom_BoundedCurve 
Geom_BoundedSurface 
Geom_BSplineCurve 
Geom_BSplineSurface 
Geom_CartesianPoint 
Geom_Circle 
Geom_Conic 
……

GC_MakeXXX

GC_MakeXXX由简单的几何数据结构构建复杂的、常见的、带参数的几何结构Geom_XXX,它主要包含的就是构建算法,我们可以称其为几何形状构建包,构建的结果是指向Geom_XXX的指针。

GC_MakeArcOfCircle 
GC_MakeArcOfEllipse 
GC_MakeArcOfHyperbola 
GC_MakeArcOfParabola 
GC_MakeCircle 
GC_MakeConicalSurface 
GC_MakeCylindricalSurface 
GC_MakeEllipse 
GC_MakeHyperbola. 
GC_MakeLine 
GC_MakeMirror 
GC_MakePlane 
GC_MakeRotation 
GC_MakeScale 
GC_MakeSegment 
GC_MakeTranslation 
GC_MakeTrimmedCone 
GC_MakeTrimmedCylinder 
GC_RootHandle(Geom_TrimmedCurve) aArcOfCircle = GC_MakeArcOfCircle(aPnt2,aPnt3,aPnt4);

TopoDS_XXX

TopoDS_XXX比Geom_XXX再高一级,是多个Geom_XXX的一种组合。每一个TopoDS_XXX类都继承至TopoDS_Shape。我们可以称这一层为几何拓扑结构。包含了拓扑点、线、面、体等简单的、复杂的几何拓扑结构。注意:这层也只是数据结构,并不包含算法。

TopoDS_AlertWithShape 
TopoDS_Builder 
TopoDS_Compound 
TopoDS_CompSolid 
TopoDS_Edge 
TopoDS_Face 
TopoDS_FrozenShape 
TopoDS_HShape 
TopoDS_Iterator 
TopoDS_ListIteratorOfListOfShape 
TopoDS_ListOfShape 
TopoDS_LockedShape 
TopoDS_Shape 
TopoDS_Shell 
TopoDS_Solid 
TopoDS_TCompound 
TopoDS_TCompSolid 
TopoDS_TEdge 
TopoDS_TFace 
TopoDS_TShape 
TopoDS_TShell 
TopoDS_TSolid 
TopoDS_TVertex 
TopoDS_TWire 
TopoDS_UnCompatibleShapes 
TopoDS_Vertex 
TopoDS_Wire

BRepBuilderAPI_XXX

前边说了TopoDS_XXX只是数据结构,那么如何由Geom_XXX构建TopoDS_XXX呢,这就是BRepBuilderAPI_XXX的工作了。我们可以称这一层为拓扑结构构建包。它的返回值直接就是TopoDS_XXX。

此外这一部分有好多需要注意的事项:

通过矩阵变换获取拓扑结构
通过向下转型(TopoDS::XXX)获取拓扑结构
通过TopoDS的组合获取TopoDS结构
也就是说:这一步骤相当于使用一个CAD、SolidWorks等的造型软件。熟悉造型的功能,想必更熟悉这部分要完成的工作。

BRepBuilderAPI_BndBoxTreeSelector 
BRepBuilderAPI_CellFilter 
BRepBuilderAPI_Collect 
BRepBuilderAPI_Command 
BRepBuilderAPI_Copy 
BRepBuilderAPI_EdgeError 
BRepBuilderAPI_FaceError 
BRepBuilderAPI_FastSewing 
BRepBuilderAPI_FindPlane 
BRepBuilderAPI_GTransform 
BRepBuilderAPI_MakeEdge 
BRepBuilderAPI_MakeEdge2d 
BRepBuilderAPI_MakeFace 
BRepBuilderAPI_MakePolygon 
BRepBuilderAPI_MakeShape 
BRepBuilderAPI_MakeShell 
BRepBuilderAPI_MakeSolid 
BRepBuilderAPI_MakeVertex 
BRepBuilderAPI_MakeWire 
BRepBuilderAPI_ModifyShape 
BRepBuilderAPI_NurbsConvert 
BRepBuilderAPI_PipeError 
BRepBuilderAPI_Sewing 
BRepBuilderAPI_ShapeModification 
BRepBuilderAPI_ShellError 
BRepBuilderAPI_Transform 
BRepBuilderAPI_TransitionMode 
BRepBuilderAPI_VertexInspector 
BRepBuilderAPI_WireErrorTopoDS_Edge aEdge1 = BRepBuilderAPI_MakeEdge(aSegment1); 
TopoDS_Edge aEdge2 = BRepBuilderAPI_MakeEdge(aArcOfCircle); 
TopoDS_Edge aEdge3 = BRepBuilderAPI_MakeEdge(aSegment2);

BRepPrimAPI_XXX

这一层包的功能是把之前的拓扑结构建立成实体,它们构建的结果当然也是拓扑结果的TopoDS_XXX。我们可以称这一层为实体构建包,拓扑构建满足以下的规律:
在这里插入图片描述

BRepPrimAPI_MakeBox 
BRepPrimAPI_MakeCone 
BRepPrimAPI_MakeCylinder 
BRepPrimAPI_MakeHalfSpace 
BRepPrimAPI_MakeOneAxis 
BRepPrimAPI_MakePrism 
BRepPrimAPI_MakeRevol 
BRepPrimAPI_MakeRevolution 
BRepPrimAPI_MakeSphere 
BRepPrimAPI_MakeSweep 
BRepPrimAPI_MakeTorus 
BRepPrimAPI_MakeWedge

BRepFilletAPI_XXX

倒角包:计算倒角。

BRepFilletAPI_LocalOperation 
BRepFilletAPI_MakeChamfer 
BRepFilletAPI_MakeFillet 
BRepFilletAPI_MakeFillet2d

TopExp_Explorer

这个类比较特殊,专门用于TopoDS_XXX的解析的,就是将已知实体(拓扑结构)解析为边组合、面组合等等。我们可以称其为拓扑解析包。

for(TopExp_Explorer aFaceExplorer(myBody, TopAbs_FACE) ; aFaceExplorer.More() ; aFaceExplorer.Next())
{ TopoDS_Face aFace = TopoDS::Face(aFaceExplorer.Current()); 
}

TopAbs_ShapeEnum

这也是一个特殊的结构,类似一个拓扑结构的数组,具有.More().Next().Current()三个重要的方法,我们可以称其为拓扑解析结果集。

BRepAlgoAPI_XXX

这个是核心算法包,专门用于Shape的交common(Boolean intersection)、差cut(Boolean subtraction)、和fuse(Boolean union)的计算。底层采用的是布尔操作。我们可以称其为几何算法包。

BRepAlgoAPI_Algo 
BRepAlgoAPI_BooleanOperation 
BRepAlgoAPI_BuilderAlgo 
BRepAlgoAPI_Check 
BRepAlgoAPI_Common 
BRepAlgoAPI_Cut 
BRepAlgoAPI_Defeaturing 
BRepAlgoAPI_Fuse 
BRepAlgoAPI_Section 
BRepAlgoAPI_Splitter

**BRep_Tool **

这个BRep_Tool类主要有三个方法,用于从TopoDS_XXX向Geom_XXX转换。

TopoDS_Face -> Geom_Surface 
TopoDS_Edge -> Geom_Curve 
TopoDS_Vertex -> Geom_Point 

Standard_Transient
主要有两个用途。:
DynamicType 函数用来获取 Handle(Geom_Surface)的真实类型,因为Geom_Surface有可能是任何一种面。
IsKind 用来判断该类型是否是某个类的子类。

Handle(Geom_Surface) aSurface = BRep_Tool::Surface(aFace);if(aSurface->DynamicType() == STANDARD_TYPE(Geom_Plane))
{ Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aSurface);//
}

TopTools_XXX

组。List,Array,Sequence等。

TopTools_Array1OfListOfShape 
TopTools_Array1OfShape 
TopTools_Array2OfShape 
TopTools_DataMapIteratorOfDataMapOfIntegerListOfShape 
TopTools_DataMapIteratorOfDataMapOfIntegerShape 
……

BRepOffsetAPI_XXX

非常有用的包,通俗点讲它的功能:如果你的线框模型可以生成实体,模型,那么它可以……里边是一个复杂而漫长的过程……我可以称他形体生成包

BRepOffsetAPI_ThruSections aTool(Standard_True); 
aTool.AddWire(threadingWire1); 
aTool.AddWire(threadingWire2); 
aTool.CheckCompatibility(Standard_False); 
TopoDS_Shape myThreading = aTool.Shape();

Tutorial源代码

TopoDS_Shape MakeBottle(const Standard_Real myWidth, const Standard_Real myHeight, const Standard_Real myThickness) 
{ // Profile : Define Support Points gp_Pnt aPnt2(-myWidth / 2., -myThickness / 4., 0); gp_Pnt aPnt3(0, -myThickness / 2., 0); gp_Pnt aPnt4(myWidth / 2., -myThickness / 4., 0); gp_Pnt aPnt5(myWidth / 2., 0, 0);// Profile : Define the Geometry Handle(Geom_TrimmedCurve) aSegment1 = GC_MakeSegment(aPnt1, aPnt2); Handle(Geom_TrimmedCurve) aSegment2 = GC_MakeSegment(aPnt4, aPnt5);// Profile : Define the Topology TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(aSegment1); TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(aSegment2); TopoDS_Wire aWire = BRepBuilderAPI_MakeWire(anEdge1, anEdge2, anEdge3);// Complete Profile gp_Ax1 xAxis = gp::OX(); gp_Trsf aTrsf;aTrsf.SetMirror(xAxis); BRepBuilderAPI_Transform aBRepTrsf(aWire, aTrsf); TopoDS_Wire aMirroredWire = TopoDS::Wire(aMirroredShape);BRepBuilderAPI_MakeWire mkWire; mkWire.Add(aMirroredWire); TopoDS_Wire myWireProfile = mkWire.Wire();// Body : Prism the Profile TopoDS_Face myFaceProfile = BRepBuilderAPI_MakeFace(myWireProfile); gp_Vec aPrismVec(0, 0, myHeight); TopoDS_Shape myBody = BRepPrimAPI_MakePrism(myFaceProfile, aPrismVec);// Body : Apply Fillets BRepFilletAPI_MakeFillet mkFillet(myBody); TopExp_Explorer anEdgeExplorer(myBody, TopAbs_EDGE); while(anEdgeExplorer.More()){ TopoDS_Edge anEdge = TopoDS::Edge(anEdgeExplorer.Current()); //Add edge to fillet algorithm mkFillet.Add(myThickness / 12., anEdge); anEdgeExplorer.Next(); }myBody = mkFillet.Shape();// Body : Add the Neck gp_Pnt neckLocation(0, 0, myHeight); gp_Dir neckAxis = gp::DZ(); gp_Ax2 neckAx2(neckLocation, neckAxis);Standard_Real myNeckRadius = myThickness / 4.; Standard_Real myNeckHeight = myHeight / 10.;BRepPrimAPI_MakeCylinder MKCylinder(neckAx2, myNeckRadius, myNeckHeight); TopoDS_Shape myNeck = MKCylinder.Shape();myBody = BRepAlgoAPI_Fuse(myBody, myNeck);// Body : Create a Hollowed Solid TopoDS_Face faceToRemove; Standard_Real zMax = -1;for(TopExp_Explorer aFaceExplorer(myBody, TopAbs_FACE); aFaceExplorer.More(); aFaceExplorer.Next()){ TopoDS_Face aFace = TopoDS::Face(aFaceExplorer.Current()); // Check if <aFace> is the top face of the bottle’s neck Handle(Geom_Surface) aSurface = BRep_Tool::Surface(aFace); if(aSurface->DynamicType() == STANDARD_TYPE(Geom_Plane)){ Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aSurface); gp_Pnt aPnt = aPlane->Location(); Standard_Real aZ = aPnt.Z(); if(aZ > zMax){ zMax = aZ; faceToRemove = aFace; }}}TopTools_ListOfShape facesToRemove; facesToRemove.Append(faceToRemove); BRepOffsetAPI_MakeThickSolid BodyMaker; BodyMaker.MakeThickSolidByJoin(myBody, facesToRemove, -myThickness / 50, 1.e-3); myBody = BodyMaker.Shape(); // Threading : Create Surfaces Handle(Geom_CylindricalSurface) aCyl1 = new Geom_CylindricalSurface(neckAx2, myNeckRadius * 0.99); Handle(Geom_CylindricalSurface) aCyl2 = new Geom_CylindricalSurface(neckAx2, myNeckRadius * 1.05);// Threading : Define 2D Curves gp_Pnt2d aPnt(2. * M_PI, myNeckHeight / 2.); gp_Dir2d aDir(2. * M_PI, myNeckHeight / 4.); gp_Ax2d anAx2d(aPnt, aDir);Standard_Real aMajor = 2. * M_PI; Standard_Real aMinor = myNeckHeight / 10;Handle(Geom2d_Ellipse) anEllipse1 = new Geom2d_Ellipse(anAx2d, aMajor, aMinor); Handle(Geom2d_Ellipse) anEllipse2 = new Geom2d_Ellipse(anAx2d, aMajor, aMinor / 4); Handle(Geom2d_TrimmedCurve) anArc1 = new Geom2d_TrimmedCurve(anEllipse1, 0, M_PI); Handle(Geom2d_TrimmedCurve) anArc2 = new Geom2d_TrimmedCurve(anEllipse2, 0, M_PI); gp_Pnt2d anEllipsePnt1 = anEllipse1->Value(0); gp_Pnt2d anEllipsePnt2 = anEllipse1->Value(M_PI);Handle(Geom2d_TrimmedCurve) aSegment = GCE2d_MakeSegment(anEllipsePnt1, anEllipsePnt2); // Threading : Build Edges and Wires TopoDS_Edge anEdge1OnSurf1 = BRepBuilderAPI_MakeEdge(anArc1, aCyl1); TopoDS_Edge anEdge2OnSurf1 = BRepBuilderAPI_MakeEdge(aSegment, aCyl1); TopoDS_Edge anEdge1OnSurf2 = BRepBuilderAPI_MakeEdge(anArc2, aCyl2); TopoDS_Edge anEdge2OnSurf2 = BRepBuilderAPI_MakeEdge(aSegment, aCyl2); TopoDS_Wire threadingWire1 = BRepBuilderAPI_MakeWire(anEdge1OnSurf1, anEdge2OnSurf1); TopoDS_Wire threadingWire2 = BRepBuilderAPI_MakeWire(anEdge1OnSurf2, anEdge2OnSurf2); BRepLib::BuildCurves3d(threadingWire1); BRepLib::BuildCurves3d(threadingWire2);// Create Threading BRepOffsetAPI_ThruSections aTool(Standard_True); aTool.AddWire(threadingWire1); aTool.AddWire(threadingWire2); aTool.CheckCompatibility(Standard_False);TopoDS_Shape myThreading = aTool.Shape();// Building the Resulting Compound TopoDS_Compound aRes; BRep_Builder aBuilder; aBuilder.MakeCompound (aRes); aBuilder.Add (aRes, myBody); aBuilder.Add (aRes, myThreading);return aRes;
}

这篇关于OpenCascade 入门须知API的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/238190

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

史上最全MybatisPlus从入门到精通

《史上最全MybatisPlus从入门到精通》MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页... 目录1.简介2.基础篇2.1.通用mapper接口操作2.2.通用service接口操作3.进阶篇3

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底