FreeCAD模塊開發(fā)指南 第1章 FreeCAD概述和軟件架構(gòu)

FreeCAD概述和軟件架構(gòu)


首先,感謝初始開發(fā)人員(Jürgen Riegel, Werner Mayer, Yorik van Havre),免費分享了如此出色的杰作。FreeCAD遵循LGPL許可證發(fā)布,可通過動態(tài)鏈接免費使用,并可用于商業(yè)用途。

FreeCAD簡介


FreeCAD的誕生:初始版本0.0.1于2002年10月29日上線。

FreeCAD的維基百科

FreeCAD基本上是各種功能強大的庫的集合,其中最重要的是openCascade,它用于管理和構(gòu)造幾何體,還有Coin3D用于顯示幾何體,使用Qt將其放入漂亮的圖形用戶界面中,Python提供完整的腳本/宏功能。

關(guān)鍵特征


- 支持多平臺:windows, Linux 和 MacOS X。

- 可以通過python模塊導(dǎo)入控制臺模式。

- 像商業(yè)CAD工具一樣,支持參數(shù)化建模,腳本編輯和宏。

- 具有豐富插件的模塊化結(jié)構(gòu):CAD,CAM,機器人,網(wǎng)格劃分,F(xiàn)EM等。

- 支持海量標(biāo)準(zhǔn)的2D和3D CAD通用文件格式,如STL,STEP等。

- 文件類型為*.fcstd,這是一種經(jīng)壓縮的文件容器,包含多種不同類型的信息,例如幾何體,腳本或者縮略圖標(biāo)。

實例:將FreeCAD python模塊嵌入Blender

關(guān)于詳細的和最新的功能,請參見FreeCAD官網(wǎng)的功能列表。

軟件架構(gòu)


關(guān)鍵軟件庫

請參見第二章中的FreeCAD源代碼結(jié)構(gòu)

站在巨人肩膀上

- 以O(shè)penCASCADE作為CAD內(nèi)核

- 使用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模式,F(xiàn)reeCAD并沒有和Qt系統(tǒng)綁定,Boost::signal用于命令行模式:FreeCADCmd。

- 內(nèi)部使用std::string(UTF8),并應(yīng)用QString getString(){QString.fromUtf8(s.c_str())}。

- C++用于大多數(shù)耗時的任務(wù)(線程模式),以避免全局解釋器鎖定的瓶頸。

- 在模塊開發(fā)中混合使用C++和Python語言的問題將在第5章討論。

安裝程序中不包含GPL代碼

https://github.com/yorikvanhavre/Draft-dxf-importer

當(dāng)前FreeCAD的策略是只包含LGPL軟件,默認不包含GPL軟件。以前進行DXF格式文件導(dǎo)入導(dǎo)出操作時,會默認下載DXF導(dǎo)入導(dǎo)出庫,不過Debian不喜歡這樣,于是我們改變了改成了需要手動開啟下載。

打開草繪工作臺,然后選擇編輯->首選項。導(dǎo)入-導(dǎo)出->DXF/DWG選項卡中,開啟自動更新。之后FreeCAD將在第一次進行DXF導(dǎo)入導(dǎo)出操作時,下載提到的庫。如果下載不了,請重啟FreeCAD并重試。

資金條件

FreeCAD目前仍由社區(qū)非正式地推動,由開發(fā)者在業(yè)余時間開發(fā),而未建立任何基金會。

如何渲染3D模型


FreeCAD使用Coin3D庫進行幾何體的3D視圖渲染。Coin3D是OpenInventor標(biāo)準(zhǔn)的技術(shù)實現(xiàn),使您無需開發(fā)OpenGL代碼。請參見FreeCAD維基中的OpenInventor Scenegraph章節(jié)。3D渲染的其他例子:

土木工程特征實現(xiàn)(交通工程)

FreeCAD ViewProvider中的OpenInventor

FreeCAD本身提供多種工具來查看或修改openInventor代碼。例如,以下Python代碼將顯示所選對象的openInventor表現(xiàn)形式:

```

obj=FreeCAD.ActiveDocument.ActiveObjectviewprovider=obj.ViewObjectprintviewprovider.toString()

```

Pivy: Coin3D的Python封裝

pivy是Coin3D C ++ 庫的Python封裝器,為SWIG添加新的SoPyScript節(jié)點以直接包含Python腳本。

pivy追蹤器—一一個基于pivy/coin3D的小型python對象庫,用于在視景圖級別渲染線條/點,以向用戶界面提供反饋。最初作為FreeCAD追蹤工作臺的一部分來應(yīng)用。

3D可視化庫的選擇

作為一個CAD內(nèi)核,OpenCASCADE最初并不支持對3D對象的屏幕渲染(2002年FreeCAD誕生時),直到最近的版本,才有了幾個基于OpenGL的3D庫。請參見此列表(與QT一起使用)?https://wiki.qt.io/Using_3D_engines_with_Qt。3D游戲引擎也可用于渲染3D對象,例如OGRE(面向?qū)ο蟮膱D形渲染引擎),虛幻,Unity。

選擇Open Inventor來渲染FreeCAD是基于軟件許可和性能考慮。Open Inventor,源自IRIS Inventor,是SGI設(shè)計的一種面向C++對象的保留模式3D圖形API,旨在為OpenGL編程提供更高層次支持。其主要目標(biāo)是提供更便捷和高效的編程。Open Inventor是免費開源軟件,遵循GNU寬松通用公共許可協(xié)議(LGPL),2000年8月,2.1版。

Coin3D應(yīng)用和Open Inventor相同的API,但源代碼不同,通過安全屋實現(xiàn)對Open Inventor v2.1穩(wěn)定版的兼容。Kongsberg于2011年終止了Coin3D開發(fā),并且通過BSD 3協(xié)議發(fā)布了源代碼。這使通過Python在Open Inventor場景中繪制對象成為可能,即使用Coin3D的python封裝器pivy。請參見https://www.freecadweb.org/wiki/Pivy

VTK,ParaView的基礎(chǔ),是另一個開源跨平臺的可視化庫。它使互動操作成為可能,請參見將VTK管道輸出轉(zhuǎn)換為Inventor節(jié)點的方法。從0.17版本開始,將VTK管道添加進Fem mpivy追蹤器——一個基于pivy/coin3D的小型python對象庫,用于在視景圖級別渲染線條/點,以向用戶界面提供反饋。最初作為FreeCAD追蹤工作臺的一部分來應(yīng)用。

FreeCAD論壇關(guān)于3D渲染庫選擇的討論

這是我關(guān)于3D渲染庫選擇的疑問,發(fā)表在FreeCAD論壇上:

我瀏覽了OpenCASCADE 文檔[1],其中展示了OpenCASCADE源代碼架構(gòu)圖。它與FreeCAD很類似。為什么FreeCAD要開發(fā)自己的基礎(chǔ)類,文檔控制器,對象樹結(jié)構(gòu),等等。它們有很多重疊之處。

????1. 是因為許可證問題嗎?當(dāng)FC開始的時候OpenCASCADE不兼容LGPL協(xié)議嗎?還是OpenCASCADE不支持python封裝功能?

? ? 2.?OpenCASCADE有3D渲染可視化功能,為什么要用OpenInventor/3D來代替?根據(jù)文檔,OCC用戶交互功能不是很強大,但仍然提供了選擇。

[1]?http://www.opencascade.com/content/overview

[2]?https://forum.freecadweb.org/viewtopic.php?f=10&t=12821&p=102683#p102683?by "ickby"

一位主要開發(fā)者的回復(fù):

首先,F(xiàn)reeCAD在沒有OpenCASCADE的情況下可以工作。這是一項重要功能,并非所有事情都需要幾何建模,例如機器人工作臺。 OCC僅包含在零件工作臺中。

當(dāng)然,可以使FreeCAD完全基于OCC并重用OCAF和可視化庫,但是,有很多反對意見:

? ? 1. OCAF的重疊是最小的: 僅可以重用App中的某些內(nèi)容,無論如何都需要對整個GUI進行處理 。 而且要集成所有當(dāng)前可用的功能,它們所需要的工作量基本相同。根據(jù)Jriegel的說法, 最初 FreeCAD 的文檔結(jié)構(gòu)是基于OCAF的,但后來發(fā)現(xiàn)它缺少許多功能,于是改為用自定義方式實現(xiàn)。這使得適配和強化的方法更加容易,例如,最近的表達式的集成化。

? ? 2.?OpenCASCADE多年來一直缺乏可視化庫。最近開發(fā)人員做了很多工作來改善它, 但這對于FreeCAD來說為時已晚 。最重要的問題是:OpenCASCADE 的可視化庫高度針對它自己的類型。沒有提供適合其它內(nèi)容的通用接口, 因此對FreeCAD 并不適合。在FreeCAD中,許多工作臺都通過漂亮的openInventor API繪制各種內(nèi)容。

FreeCAD路線圖


跟進FreeCAD的路線圖非常重要,因為它仍處于開發(fā)階段。

https://www.freecadweb.org/wiki/Development_roadmap

不斷更新的主要組件:

主要的外部組件正在逐步升級,例如OpenInventor,pyCXX。

-?從版本0.17開始采用C++11。C++17最新標(biāo)準(zhǔn)庫可在將來取代boost :: FileSystem。

-?在C++中,可直接從Qt4遷移到Qt5(將Qt4All.h從Qt4切換到Qt5),但取決于Qt5 的python封裝包:PySide2,的LGPL版本的可用性。

-?Python3支持正在實施中,應(yīng)該會在0.19版中完成,因為python2將于2020年1月停用。

-?OpenCASCADE(OCC)和VTK將于2016年底遷移到7.0,這是一次重大升級,將打破目前不兼容的局面。

將不會從從OpenGL過渡到Vulkan,因為OpenGL應(yīng)該可以使用很長時間(10年)。

C++11

C++不是一種簡單的語言,它的目標(biāo)是高性能,你需要手動管理內(nèi)存,并且有很多陷阱,請參閱http://horstmann.com/cpp/pitfalls.html。即使是經(jīng)驗豐富的C ++程序員,也會發(fā)現(xiàn)自己沒有完全掌握C ++。安全性異常超出普通人想象。

附錄中示例了C++的常見陷阱。

盡管如此,C++11幾乎是一種新語言,或者叫下一代C++。C++11添加了一些額外的關(guān)鍵字,例如“ explicit,overload / final,noexcept”,以避免一些意外錯誤,還引入了新功能和額外的STL函數(shù),例如lambda和std :: function,constexpr,enum類,智能指針,自動類型派生,std :: thread,atomic,regex等等。

Qt 5.x的Pyside 2項目

適用于Qt 5.x的官方LGPL python封裝包,即pyside2, 或者叫Qt for Python,已經(jīng)與Qt 5.12 一起發(fā)布。

Pyside 2項目旨在為Qt 5.x提供完整的PySide端口。其開發(fā)工作于2015年5月在GitHub上開始。該項目成功為Qt 5.3、5.4和5.5開發(fā)了Pyside端口。 在2016年4月,Qt公司決定適當(dāng)支持該端口(請參閱詳細信息)。


版權(quán)聲明:本文翻譯自《Module developer's guide to FreeCAD source code》,遵循 CC 4.0 BY-SA 協(xié)議(https://creativecommons.org/licenses/by-sa/4.0/),轉(zhuǎn)載請附上原文出處鏈接及本聲明。原文鏈接:https://github.com/qingfengxia/FreeCAD_Mod_Dev_Guide/blob/master/chapters/1.FreeCAD_overview_architecture.md

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容