FreeCAD模块开发指南 第1章 FreeCAD概述和软件架构
FreeCAD概述和软件架构
首先,感谢初始开发人员(Jürgen Riegel, Werner Mayer, Yorik van Havre),免费分享了如此出色的杰作。FreeCAD遵循LGPL许可证发布,可通过动态链接免费使用,并可用于商业用途。
FreeCAD简介
FreeCAD的诞生:初始版本0.0.1于2002年10月29日上线。
FreeCAD的维基百科
FreeCAD基本上是各种功能强大的库的集合,其中最重要的是openCascade,它用于管理和构造几何体,还有Coin3D用于显示几何体,使用Qt将其放入漂亮的图形用户界面中,Python提供完整的脚本/宏功能。
关键特征
- 支持多平台:windows, Linux 和 MacOS X。
- 可以通过python模块导入控制台模式。
- 像商业CAD工具一样,支持参数化建模,脚本编辑和宏。
- 具有丰富插件的模块化结构:CAD,CAM,机器人,网格划分,FEM等。
- 支持海量标准的2D和3D CAD通用文件格式,如STL,STEP等。
- 文件类型为*.fcstd,这是一种经压缩的文件容器,包含多种不同类型的信息,例如几何体,脚本或者缩略图标。
实例:将FreeCAD python模块嵌入Blender。
关于详细的和最新的功能,请参见FreeCAD官网的功能列表。
软件架构
关键软件库
请参见第二章中的FreeCAD源代码结构
站在巨人肩膀上
- 以OpenCASCADE作为CAD内核
- 使用OpenInventor/Coin3D/pivy进行3D场景渲染
- 图形用户界面使用Qt和PySide
- Python脚本和封装:PyCXX, swig, boost.python
- 还有其他功能强大的软件库,像Xerces XML, boost
使用OpenCASCADE的几何算法将在第7章中讨论。
混合了python和C++语言
- 控制台模式中使用python脚本,GUI模式中使用基于python的宏录制功能
- 所有FreCAD类都源自BaseClass类,并与BaseClassPy类连接
- 在0.17版本之前,C++11使用并不广泛
- C++模板使用不多,不过FeatureT<>使DocumentObject, ViewProvider可在Python中扩展。
- 除了GUI模式,FreeCAD并没有和Qt系统绑定,Boost::signal用于命令行模式:FreeCADCmd。
- 内部使用std::string(UTF8),并应用QString getString(){QString.fromUtf8(s.c_str())}。
- C++用于大多数耗时的任务(线程模式),以避免全局解释器锁定的瓶颈。
- 在模块开发中混合使用C++和Python语言的问题将在第5章讨论。
安装程序中不包含GPL代码
https://github.com/yorikvanhavre/Draft-dxf-importer
当前FreeCAD的策略是只包含LGPL软件,默认不包含GPL软件。以前进行DXF格式文件导入导出操作时,会默认下载DXF导入导出库,不过Debian不喜欢这样,于是我们改变了改成了需要手动开启下载。
打开草绘工作台,然后选择编辑->首选项。在导入-导出->DXF/DWG选项卡中,开启自动更新。之后FreeCAD将在第一次进行DXF导入导出操作时,下载提到的库。如果下载不了,请重启FreeCAD并重试。
资金条件
FreeCAD目前仍由社区非正式地推动,由开发者在业余时间开发,而未建立任何基金会。
如何渲染3D模型
FreeCAD使用Coin3D库进行几何体的3D视图渲染。Coin3D是OpenInventor标准的技术实现,使您无需开发OpenGL代码。请参见FreeCAD维基中的OpenInventor Scenegraph章节。3D渲染的其他例子:
FreeCAD ViewProvider中的OpenInventor
FreeCAD本身提供多种工具来查看或修改openInventor代码。例如,以下Python代码将显示所选对象的openInventor表现形式:
```
obj=FreeCAD.ActiveDocument.ActiveObjectviewprovider=obj.ViewObjectprintviewprovider.toString()
```
Pivy: Coin3D的Python封装
pivy是Coin3D C ++ 库的Python封装器,为SWIG添加新的SoPyScript节点以直接包含Python脚本。
pivy追踪器—一一个基于pivy/coin3D的小型python对象库,用于在视景图级别渲染线条/点,以向用户界面提供反馈。最初作为FreeCAD追踪工作台的一部分来应用。
3D可视化库的选择
作为一个CAD内核,OpenCASCADE最初并不支持对3D对象的屏幕渲染(2002年FreeCAD诞生时),直到最近的版本,才有了几个基于OpenGL的3D库。请参见此列表(与QT一起使用) https://wiki.qt.io/Using_3D_engines_with_Qt。3D游戏引擎也可用于渲染3D对象,例如OGRE(面向对象的图形渲染引擎),虚幻,Unity。
选择Open Inventor来渲染FreeCAD是基于软件许可和性能考虑。Open Inventor,源自IRIS Inventor,是SGI设计的一种面向C++对象的保留模式3D图形API,旨在为OpenGL编程提供更高层次支持。其主要目标是提供更便捷和高效的编程。Open Inventor是免费开源软件,遵循GNU宽松通用公共许可协议(LGPL),2000年8月,2.1版。
Coin3D应用和Open Inventor相同的API,但源代码不同,通过安全屋实现对Open Inventor v2.1稳定版的兼容。Kongsberg于2011年终止了Coin3D开发,并且通过BSD 3协议发布了源代码。这使通过Python在Open Inventor场景中绘制对象成为可能,即使用Coin3D的python封装器pivy。请参见https://www.freecadweb.org/wiki/Pivy
VTK,ParaView的基础,是另一个开源跨平台的可视化库。它使互动操作成为可能,请参见将VTK管道输出转换为Inventor节点的方法。从0.17版本开始,将VTK管道添加进Fem mpivy追踪器——一个基于pivy/coin3D的小型python对象库,用于在视景图级别渲染线条/点,以向用户界面提供反馈。最初作为FreeCAD追踪工作台的一部分来应用。
FreeCAD论坛关于3D渲染库选择的讨论
这是我关于3D渲染库选择的疑问,发表在FreeCAD论坛上:
我浏览了OpenCASCADE 文档[1],其中展示了OpenCASCADE源代码架构图。它与FreeCAD很类似。为什么FreeCAD要开发自己的基础类,文档控制器,对象树结构,等等。它们有很多重叠之处。
1. 是因为许可证问题吗?当FC开始的时候OpenCASCADE不兼容LGPL协议吗?还是OpenCASCADE不支持python封装功能?
2. OpenCASCADE有3D渲染可视化功能,为什么要用OpenInventor/3D来代替?根据文档,OCC用户交互功能不是很强大,但仍然提供了选择。
[1] http://www.opencascade.com/content/overview
[2] https://forum.freecadweb.org/viewtopic.php?f=10&t=12821&p=102683#p102683 by "ickby"
一位主要开发者的回复:
首先,FreeCAD在没有OpenCASCADE的情况下可以工作。这是一项重要功能,并非所有事情都需要几何建模,例如机器人工作台。 OCC仅包含在零件工作台中。
当然,可以使FreeCAD完全基于OCC并重用OCAF和可视化库,但是,有很多反对意见:
1. OCAF的重叠是最小的: 仅可以重用App中的某些内容,无论如何都需要对整个GUI进行处理 。 而且要集成所有当前可用的功能,它们所需要的工作量基本相同。根据Jriegel的说法, 最初 FreeCAD 的文档结构是基于OCAF的,但后来发现它缺少许多功能,于是改为用自定义方式实现。这使得适配和强化的方法更加容易,例如,最近的表达式的集成化。
2. OpenCASCADE多年来一直缺乏可视化库。最近开发人员做了很多工作来改善它, 但这对于FreeCAD来说为时已晚 。最重要的问题是:OpenCASCADE 的可视化库高度针对它自己的类型。没有提供适合其它内容的通用接口, 因此对FreeCAD 并不适合。在FreeCAD中,许多工作台都通过漂亮的openInventor API绘制各种内容。
FreeCAD路线图
跟进FreeCAD的路线图非常重要,因为它仍处于开发阶段。
https://www.freecadweb.org/wiki/Development_roadmap
不断更新的主要组件:
主要的外部组件正在逐步升级,例如OpenInventor,pyCXX。
- 从版本0.17开始采用C++11。C++17最新标准库可在将来取代boost :: FileSystem。
- 在C++中,可直接从Qt4迁移到Qt5(将Qt4All.h从Qt4切换到Qt5),但取决于Qt5 的python封装包:PySide2,的LGPL版本的可用性。
- Python3支持正在实施中,应该会在0.19版中完成,因为python2将于2020年1月停用。
- OpenCASCADE(OCC)和VTK将于2016年底迁移到7.0,这是一次重大升级,将打破目前不兼容的局面。
将不会从从OpenGL过渡到Vulkan,因为OpenGL应该可以使用很长时间(10年)。
C++11
C++不是一种简单的语言,它的目标是高性能,你需要手动管理内存,并且有很多陷阱,请参阅http://horstmann.com/cpp/pitfalls.html。即使是经验丰富的C ++程序员,也会发现自己没有完全掌握C ++。安全性异常超出普通人想象。
附录中示例了C++的常见陷阱。
尽管如此,C++11几乎是一种新语言,或者叫下一代C++。C++11添加了一些额外的关键字,例如“ explicit,overload / final,noexcept”,以避免一些意外错误,还引入了新功能和额外的STL函数,例如lambda和std :: function,constexpr,enum类,智能指针,自动类型派生,std :: thread,atomic,regex等等。
Qt 5.x的Pyside 2项目
适用于Qt 5.x的官方LGPL python封装包,即pyside2, 或者叫Qt for Python,已经与Qt 5.12 一起发布。
Pyside 2项目旨在为Qt 5.x提供完整的PySide端口。其开发工作于2015年5月在GitHub上开始。该项目成功为Qt 5.3、5.4和5.5开发了Pyside端口。 在2016年4月,Qt公司决定适当支持该端口(请参阅详细信息)。
版权声明:本文翻译自《Module developer's guide to FreeCAD source code》,遵循 CC 4.0 BY-SA 协议(https://creativecommons.org/licenses/by-sa/4.0/),转载请附上原文出处链接及本声明。原文链接:https://github.com/qingfengxia/FreeCAD_Mod_Dev_Guide/blob/master/chapters/1.FreeCAD_overview_architecture.md