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

The Workflow of Feature Editing

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访问机制。

参考资料

  1. Yorik Van Havre. FreeCAD Manual.
  2. PyCXX
  3. PyCXX Python3
  4. FreeCADWeb
  5. 杜平安. CAD/CAE/CAM方法与技术. 清华大学出版社, 2010.
  6. 王定标. CAD/CAE/CAM技术与应用. 化学出版社, 2010.

FreeCAD源码分析:Part模块相关推荐

  1. FreeCAD源码分析:FreeCADGui模块

    FreeCAD源码分析:FreeCADGui模块 济南友泉软件有限公司 FreeCADGui项目实现了界面操作.模型显示与交互等相关功能,项目构建生成FreeCAD(_d).dll动态链接库. Fre ...

  2. FreeCAD源码分析:FreeCADMain模块

    FreeCAD源码分析:FreeCADCmd\FreeCADMain\FreeCADPy模块 济南友泉软件有限公司 FreeCAD提供了控制台.GUI.Python等三种运行模式,分别对应FreeCA ...

  3. koa源码分析-co模块以及thunk

    Thunk以及CO模块 co4.0之前都是返回的thunk函数 之后的都是返回promise thunk thunk:在 JavaScript 语言中,Thunk 函数替换的是将多参数函数,替换成单参 ...

  4. Python3.5源码分析-sys模块及site模块导入

    Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3的sys模块初始化 根据分析完成builtins ...

  5. nginx源码分析之模块初始化

    在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ...

  6. Fabric源码分析-共识模块

    正好这些天要有一个需求要帮客户魔改Fabric-v0.6,把一些hyperchain的高级特性移植过去,借此机会把之前看过的源码在梳理一下. 下面就是对Fabric共识模块的源码分析和梳理,代码都是以 ...

  7. [Abp vNext 源码分析] - 2. 模块系统的变化

    一.简要说明 本篇文章主要分析 Abp vNext 当中的模块系统,从类型构造层面上来看,Abp vNext 当中不再只是单纯的通过 AbpModuleManager 来管理其他的模块,它现在则是 I ...

  8. Canal源码分析deployer模块

    canal有两种使用方式:1.独立部署 2.内嵌到应用中. deployer模块主要用于独立部署canal server.关于这两种方式的区别,请参见server模块源码分析.deployer模块源码 ...

  9. 5章 性能平台GodEye源码分析-第三方模块

    5. 第三方模块 5.1 Crash(XCrash) Crash监控崩溃后的堆栈上传,作者采用接入爱奇艺的XCrash框架 源码分析 1.启动Crash的监控 Crash的监控通过反射启动XCrash ...

  10. WebRTC源码分析——Call模块

    目录 1. 引言 2. Call对象的创建 2.1 创建CallFactory对象 2.2 创建Call对象 2.2.1 PeerConnection.CreateCall_w 2.2.2 CallF ...

最新文章

  1. 解决Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/
  2. RDKit | 化合物亚结构搜索与结果输出
  3. scrapy 模块功能流程--转
  4. css字体设置奇怪问题
  5. LeetCode - 141. 环形链表
  6. #3601. 一个人的数论
  7. P4619 [SDOI2018]旧试题
  8. mysql与php6_PHP与MySQL的连接
  9. JAVA File转Byte[]
  10. android+影子系统,神器再升级,手机影子系统来啦
  11. LINUX设置终端窗口显示内容的滚动缓冲行数
  12. eth0: ERROR while getting interface flags: No such device
  13. 关于 extern inline
  14. 介绍一款在线仿站小工具
  15. 最小错误率贝叶斯决策 matlab,最小错误贝叶斯决策规则
  16. ZYNQ-AXI DMA IP简介
  17. 3DMAX的vray自发光材质为什么渲出来是黑的?
  18. ubuntu20.04双系统启动盘制作、安装和卸载
  19. 分享一个react 图片上传组件 支持OSS 七牛云
  20. 简单实现你想数字电脑猜的小游戏

热门文章

  1. android高清壁纸,40张极Cool的Android系统桌面壁纸
  2. VMware Workstation 8.0 序列号
  3. 百度语音识别API报错KeyError: ‘result‘
  4. PCB设计培训,Layout工程师培训,射频基带技术培训,硬件技术培训,驱动开发培训
  5. 网络语言c某人,1999—2019,21年的网络流行语,你确定你真的懂?
  6. 同义词挖掘的一些常用方法 及同义词替换程序
  7. python函数手册 stata_Eviews、Stata、Python描述性分析教程汇总
  8. 一分钟学会清理垃圾运行命令
  9. PreparedStatement 大数据查询
  10. SQL2000中文版打不上SP4提示用户验证没有通过