FreeCAD源码分析:Part模块
济南友泉软件有限公司
一、功能概述
Part模块通过封装OpenCASCADE (OCC) 实现了基本几何体的创建、布尔操作等功能。Part模块为各个Workbench提供了2D/3D建模功能,是整个FreeCAD几何建模功能的核心。
实际上,Part模块实现了CSG(Constructive Solid Geometry)的建模方法。
在CSG中,模型可以看作是由一些基本几何元素按照一定的顺序通过布尔操作拼合而成。一个模型的CSG可以表示为一个有向二叉树,树的内部节点表示各种操作,树的叶子节点表示基本几何元素,树的根节点表示最终的几何模型。
从CSG建模方法原理可以看出,体素与布尔操作是CSG建模方法的核心,可以从这两方面作为主线来研究Part模块代码。
具体来说,Part模块提供的主要功能包括:
- 封装OCC
Part::Geometry2d及其子类封装了OCC中Geom2d_Geometry及其子类;Part::Geometry及其子类封装了Geom_Geometry及其子类。
Part::TopoShape封装了TopoDS_Shape,而借助于FreeCAD属性系统,属性Part::PropertyPartShape负责维护Part::TopoShape;Part::Feature包含属性PropertyPartShape,最终通过文档对象Part::Feature将TopoDS_Shape嵌入到了FreeCAD文档/视图框架。
在Part::Geometry2d、Part::Geometry、Part::TopoShape、Part::Feature等类基础之上,Part模块提供了2D/3D几何体创建、文件导入、布尔操作等功能。
- Python扩展
通过Python C API,Part::Geometry2dPy及其子类、Part::GeometryPy及其子类分别实现将Geom_Geometry2d及其子类、OCC Geom_Geometry及其子类注入到Python中。
通过PyCXX,在Part::Module中定义了创建与操作基本几何体的功能
- CSG
构造实体几何建模(CSG, Constructive Solide Geometry)是一种比较久远的建模方法,目前的许多CAD软件仍然提供这种建模方法。CSG通过基本实体(Box、Sphere、Cylinder等)与一系列布尔操作(Cut、Union、Fuse等)来生成最终的几何实体。
二、Geometry
Geometry及其子类在Base::Persistence串行化功能基础之上,封装了点、直线、曲线(Bezier曲线、样条曲线等)、圆柱面、球面等三维OpenCASCADE几何体。
2.1 Part::Geometry
Part::Geometry继承自Base::Persistence类,定义了三维几何体参数控制、OpenCASCADE几何体句柄访问的接口。同时,借助于Python C API,提供了三维几何体Python扩展类型。
2.2 Part::TopoShape
Part::TopoShape继承自Data::ComplexGeoData,封装了OpenCASCADE TopoDS_Shape句柄。
同时,Part::TopoShape继承自属性App::PropertyComplexGeoData,将Part::TopoShape嵌入到了FreeCAD属性系统中。这样,在FreeCAD文档对象中便可ProperyPartShape关联OpenCASCADE几何对象。
三、Geom2d
Geometry2d及其子类在Base::Persistence串行化功能基础之上,封装了点、直线、曲线(Bezier曲线、样条曲线等)等二维OpenCASCADE几何体。
3.1 Part::Geometry2d
与Part::Geometry类似,Part::Geometry2d及其子类访问与控制二维OpenCASCADE几何体的功能。同时,借助于Python C API,提供了二维几何体Python扩展类型
四、布尔操作
Part::Fuse、Part::Cut、Part::Common等类实现了几何元素的并、减、交等布尔运算操作。
五、Features
Part模块同时实现了基于features构建模型的框架。在FreeCAD中,feature指的是修改模型形状的一个操作。PartDesign模块正是在此基础之上,通过几何约束与约束求解器,实现了”Feature Editing“建模方式。
“A feature is an operation that modifies the shape of a model.” 引用:https://en.wikipedia.org/wiki/Feature_recognition
具体来说,Part::BodyBase包含一组继承自Part::Feature的feature列表,其中第一个feature通常称之为base feature(即Part::BodyBase::BaseFeature);最后一个feature称为Tip(即Part::BodyBase::Tip),对应着Part::BodyBase模型的最终形状。从base feature按顺序到Tip,后一个feature在前一个feature基础之上,完成进一步的模型修改,以此类推,最终完成整个模型的修改(即Part::BodyBase::Tip)。
5.1 Part::Feature
实际上,在Part模块封装OpenCADCADE的过程中,封装过程大体分成了两类:第一类是二维/三维等OpenCASCADE几何体,第二类就是是OpenCASCADE中BRepPrimAPI_MakeBox、BRepFilletAPI_MakeFillet等针对几何体的操作,当然也包括Cut、Union、Fuse等布尔操作。而第二类封装的结果就是这里所说的Part::Feature及其子类。
值得注意的一个地方是在FreeCAD Part模块中,并没有提供对应Part::Feature及其子类的Python扩展类型,因此在Python脚本中,只能通过App.ActiveDocument.addObject()函数来完成这类对象的创建。不过由于FreeCAD“比较巧妙”的属性访问机制,仍旧可以在Python脚本中访问对应的属性。*
注*:关于此机制,参见笔者博文:FreeCAD中对象属性的Python访问机制。
参考资料
- Yorik Van Havre. FreeCAD Manual.
- PyCXX
- PyCXX Python3
- FreeCADWeb
- 杜平安. CAD/CAE/CAM方法与技术. 清华大学出版社, 2010.
- 王定标. CAD/CAE/CAM技术与应用. 化学出版社, 2010.
暂无评论内容