美文网首页
FreeCAD模块开发指南 第1章 FreeCAD概述和软件架构

FreeCAD模块开发指南 第1章 FreeCAD概述和软件架构

作者: 户佳页 | 来源:发表于2020-12-26 19:58 被阅读0次

    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

    相关文章

      网友评论

          本文标题:FreeCAD模块开发指南 第1章 FreeCAD概述和软件架构

          本文链接:https://www.haomeiwen.com/subject/nwyunktx.html