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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容