FreeCAD概述和軟件架構(gòu)
首先鲁沥,感謝初始開發(fā)人員(Jürgen Riegel, Werner Mayer, Yorik van Havre),免費(fèi)分享了如此出色的杰作。FreeCAD遵循LGPL許可證發(fā)布,可通過(guò)動(dòng)態(tài)鏈接免費(fèi)使用逢艘,并可用于商業(yè)用途。
FreeCAD簡(jiǎn)介
FreeCAD的誕生:初始版本0.0.1于2002年10月29日上線骤菠。
FreeCAD的維基百科
FreeCAD基本上是各種功能強(qiáng)大的庫(kù)的集合它改,其中最重要的是openCascade,它用于管理和構(gòu)造幾何體商乎,還有Coin3D用于顯示幾何體央拖,使用Qt將其放入漂亮的圖形用戶界面中,Python提供完整的腳本/宏功能截亦。
關(guān)鍵特征
- 支持多平臺(tái):windows, Linux 和 MacOS X爬泥。
- 可以通過(guò)python模塊導(dǎo)入控制臺(tái)模式。
- 像商業(yè)CAD工具一樣崩瓤,支持參數(shù)化建模,腳本編輯和宏踩官。
- 具有豐富插件的模塊化結(jié)構(gòu):CAD却桶,CAM,機(jī)器人蔗牡,網(wǎng)格劃分颖系,F(xiàn)EM等。
- 支持海量標(biāo)準(zhǔn)的2D和3D CAD通用文件格式辩越,如STL嘁扼,STEP等。
- 文件類型為*.fcstd黔攒,這是一種經(jīng)壓縮的文件容器趁啸,包含多種不同類型的信息强缘,例如幾何體,腳本或者縮略圖標(biāo)不傅。
實(shí)例:將FreeCAD python模塊嵌入Blender旅掂。
關(guān)于詳細(xì)的和最新的功能,請(qǐng)參見FreeCAD官網(wǎng)的功能列表访娶。
軟件架構(gòu)
關(guān)鍵軟件庫(kù)
請(qǐng)參見第二章中的FreeCAD源代碼結(jié)構(gòu)
站在巨人肩膀上
- 以O(shè)penCASCADE作為CAD內(nèi)核
- 使用OpenInventor/Coin3D/pivy進(jìn)行3D場(chǎng)景渲染
- 圖形用戶界面使用Qt和PySide
- Python腳本和封裝:PyCXX, swig, boost.python
- 還有其他功能強(qiáng)大的軟件庫(kù)商虐,像Xerces XML, boost
使用OpenCASCADE的幾何算法將在第7章中討論。
混合了python和C++語(yǔ)言
- 控制臺(tái)模式中使用python腳本崖疤,GUI模式中使用基于python的宏錄制功能
- 所有FreCAD類都源自BaseClass類秘车,并與BaseClassPy類連接
- 在0.17版本之前,C++11使用并不廣泛
- C++模板使用不多劫哼,不過(guò)FeatureT<>使DocumentObject, ViewProvider可在Python中擴(kuò)展叮趴。
- 除了GUI模式,F(xiàn)reeCAD并沒(méi)有和Qt系統(tǒng)綁定沦偎,Boost::signal用于命令行模式:FreeCADCmd疫向。
- 內(nèi)部使用std::string(UTF8),并應(yīng)用QString getString(){QString.fromUtf8(s.c_str())}豪嚎。
- C++用于大多數(shù)耗時(shí)的任務(wù)(線程模式)搔驼,以避免全局解釋器鎖定的瓶頸。
- 在模塊開發(fā)中混合使用C++和Python語(yǔ)言的問(wèn)題將在第5章討論侈询。
安裝程序中不包含GPL代碼
https://github.com/yorikvanhavre/Draft-dxf-importer
當(dāng)前FreeCAD的策略是只包含LGPL軟件舌涨,默認(rèn)不包含GPL軟件。以前進(jìn)行DXF格式文件導(dǎo)入導(dǎo)出操作時(shí)扔字,會(huì)默認(rèn)下載DXF導(dǎo)入導(dǎo)出庫(kù)囊嘉,不過(guò)Debian不喜歡這樣,于是我們改變了改成了需要手動(dòng)開啟下載革为。
打開草繪工作臺(tái)扭粱,然后選擇編輯->首選項(xiàng)。在導(dǎo)入-導(dǎo)出->DXF/DWG選項(xiàng)卡中震檩,開啟自動(dòng)更新琢蛤。之后FreeCAD將在第一次進(jìn)行DXF導(dǎo)入導(dǎo)出操作時(shí),下載提到的庫(kù)抛虏。如果下載不了博其,請(qǐng)重啟FreeCAD并重試。
資金條件
FreeCAD目前仍由社區(qū)非正式地推動(dòng)迂猴,由開發(fā)者在業(yè)余時(shí)間開發(fā)慕淡,而未建立任何基金會(huì)。
如何渲染3D模型
FreeCAD使用Coin3D庫(kù)進(jìn)行幾何體的3D視圖渲染沸毁。Coin3D是OpenInventor標(biāo)準(zhǔn)的技術(shù)實(shí)現(xiàn)峰髓,使您無(wú)需開發(fā)OpenGL代碼傻寂。請(qǐng)參見FreeCAD維基中的OpenInventor Scenegraph章節(jié)。3D渲染的其他例子:
FreeCAD ViewProvider中的OpenInventor
FreeCAD本身提供多種工具來(lái)查看或修改openInventor代碼儿普。例如崎逃,以下Python代碼將顯示所選對(duì)象的openInventor表現(xiàn)形式:
```
obj=FreeCAD.ActiveDocument.ActiveObjectviewprovider=obj.ViewObjectprintviewprovider.toString()
```
Pivy: Coin3D的Python封裝
pivy是Coin3D C ++ 庫(kù)的Python封裝器,為SWIG添加新的SoPyScript節(jié)點(diǎn)以直接包含Python腳本眉孩。
pivy追蹤器—一一個(gè)基于pivy/coin3D的小型python對(duì)象庫(kù)个绍,用于在視景圖級(jí)別渲染線條/點(diǎn),以向用戶界面提供反饋浪汪。最初作為FreeCAD追蹤工作臺(tái)的一部分來(lái)應(yīng)用巴柿。
3D可視化庫(kù)的選擇
作為一個(gè)CAD內(nèi)核,OpenCASCADE最初并不支持對(duì)3D對(duì)象的屏幕渲染(2002年FreeCAD誕生時(shí))死遭,直到最近的版本广恢,才有了幾個(gè)基于OpenGL的3D庫(kù)。請(qǐng)參見此列表(與QT一起使用)?https://wiki.qt.io/Using_3D_engines_with_Qt呀潭。3D游戲引擎也可用于渲染3D對(duì)象钉迷,例如OGRE(面向?qū)ο蟮膱D形渲染引擎),虛幻钠署,Unity糠聪。
選擇Open Inventor來(lái)渲染FreeCAD是基于軟件許可和性能考慮。Open Inventor谐鼎,源自IRIS Inventor舰蟆,是SGI設(shè)計(jì)的一種面向C++對(duì)象的保留模式3D圖形API,旨在為OpenGL編程提供更高層次支持狸棍。其主要目標(biāo)是提供更便捷和高效的編程身害。Open Inventor是免費(fèi)開源軟件,遵循GNU寬松通用公共許可協(xié)議(LGPL)草戈,2000年8月塌鸯,2.1版。
Coin3D應(yīng)用和Open Inventor相同的API唐片,但源代碼不同界赔,通過(guò)安全屋實(shí)現(xiàn)對(duì)Open Inventor v2.1穩(wěn)定版的兼容。Kongsberg于2011年終止了Coin3D開發(fā)牵触,并且通過(guò)BSD 3協(xié)議發(fā)布了源代碼。這使通過(guò)Python在Open Inventor場(chǎng)景中繪制對(duì)象成為可能咐低,即使用Coin3D的python封裝器pivy揽思。請(qǐng)參見https://www.freecadweb.org/wiki/Pivy
VTK,ParaView的基礎(chǔ)见擦,是另一個(gè)開源跨平臺(tái)的可視化庫(kù)钉汗。它使互動(dòng)操作成為可能羹令,請(qǐng)參見將VTK管道輸出轉(zhuǎn)換為Inventor節(jié)點(diǎn)的方法。從0.17版本開始损痰,將VTK管道添加進(jìn)Fem mpivy追蹤器——一個(gè)基于pivy/coin3D的小型python對(duì)象庫(kù)福侈,用于在視景圖級(jí)別渲染線條/點(diǎn),以向用戶界面提供反饋卢未。最初作為FreeCAD追蹤工作臺(tái)的一部分來(lái)應(yīng)用肪凛。
FreeCAD論壇關(guān)于3D渲染庫(kù)選擇的討論
這是我關(guān)于3D渲染庫(kù)選擇的疑問(wèn),發(fā)表在FreeCAD論壇上:
我瀏覽了OpenCASCADE 文檔[1]辽社,其中展示了OpenCASCADE源代碼架構(gòu)圖伟墙。它與FreeCAD很類似。為什么FreeCAD要開發(fā)自己的基礎(chǔ)類滴铅,文檔控制器戳葵,對(duì)象樹結(jié)構(gòu),等等汉匙。它們有很多重疊之處拱烁。
????1. 是因?yàn)樵S可證問(wèn)題嗎?當(dāng)FC開始的時(shí)候OpenCASCADE不兼容LGPL協(xié)議嗎噩翠?還是OpenCASCADE不支持python封裝功能戏自?
? ? 2.?OpenCASCADE有3D渲染可視化功能,為什么要用OpenInventor/3D來(lái)代替绎秒?根據(jù)文檔浦妄,OCC用戶交互功能不是很強(qiáng)大,但仍然提供了選擇见芹。
[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在沒(méi)有OpenCASCADE的情況下可以工作。這是一項(xiàng)重要功能玄呛,并非所有事情都需要幾何建模阅懦,例如機(jī)器人工作臺(tái)。 OCC僅包含在零件工作臺(tái)中徘铝。
當(dāng)然耳胎,可以使FreeCAD完全基于OCC并重用OCAF和可視化庫(kù),但是惕它,有很多反對(duì)意見:
? ? 1. OCAF的重疊是最小的: 僅可以重用App中的某些內(nèi)容怕午,無(wú)論如何都需要對(duì)整個(gè)GUI進(jìn)行處理 。 而且要集成所有當(dāng)前可用的功能淹魄,它們所需要的工作量基本相同郁惜。根據(jù)Jriegel的說(shuō)法, 最初 FreeCAD 的文檔結(jié)構(gòu)是基于OCAF的甲锡,但后來(lái)發(fā)現(xiàn)它缺少許多功能兆蕉,于是改為用自定義方式實(shí)現(xiàn)羽戒。這使得適配和強(qiáng)化的方法更加容易,例如虎韵,最近的表達(dá)式的集成化易稠。
? ? 2.?OpenCASCADE多年來(lái)一直缺乏可視化庫(kù)。最近開發(fā)人員做了很多工作來(lái)改善它包蓝, 但這對(duì)于FreeCAD來(lái)說(shuō)為時(shí)已晚 驶社。最重要的問(wèn)題是:OpenCASCADE 的可視化庫(kù)高度針對(duì)它自己的類型。沒(méi)有提供適合其它內(nèi)容的通用接口养晋, 因此對(duì)FreeCAD 并不適合衬吆。在FreeCAD中,許多工作臺(tái)都通過(guò)漂亮的openInventor API繪制各種內(nèi)容绳泉。
FreeCAD路線圖
跟進(jìn)FreeCAD的路線圖非常重要逊抡,因?yàn)樗蕴幱陂_發(fā)階段。
https://www.freecadweb.org/wiki/Development_roadmap
不斷更新的主要組件:
主要的外部組件正在逐步升級(jí)零酪,例如OpenInventor冒嫡,pyCXX。
-?從版本0.17開始采用C++11四苇。C++17最新標(biāo)準(zhǔn)庫(kù)可在將來(lái)取代boost :: FileSystem孝凌。
-?在C++中,可直接從Qt4遷移到Qt5(將Qt4All.h從Qt4切換到Qt5)月腋,但取決于Qt5 的python封裝包:PySide2蟀架,的LGPL版本的可用性。
-?Python3支持正在實(shí)施中榆骚,應(yīng)該會(huì)在0.19版中完成片拍,因?yàn)閜ython2將于2020年1月停用。
-?OpenCASCADE(OCC)和VTK將于2016年底遷移到7.0妓肢,這是一次重大升級(jí)捌省,將打破目前不兼容的局面。
將不會(huì)從從OpenGL過(guò)渡到Vulkan碉钠,因?yàn)镺penGL應(yīng)該可以使用很長(zhǎng)時(shí)間(10年)纲缓。
C++11
C++不是一種簡(jiǎn)單的語(yǔ)言,它的目標(biāo)是高性能喊废,你需要手動(dòng)管理內(nèi)存祝高,并且有很多陷阱,請(qǐng)參閱http://horstmann.com/cpp/pitfalls.html污筷。即使是經(jīng)驗(yàn)豐富的C ++程序員褂策,也會(huì)發(fā)現(xiàn)自己沒(méi)有完全掌握C ++。安全性異常超出普通人想象。
附錄中示例了C++的常見陷阱斤寂。
盡管如此,C++11幾乎是一種新語(yǔ)言揪惦,或者叫下一代C++遍搞。C++11添加了一些額外的關(guān)鍵字,例如“ explicit器腋,overload / final溪猿,noexcept”,以避免一些意外錯(cuò)誤纫塌,還引入了新功能和額外的STL函數(shù)诊县,例如lambda和std :: function,constexpr措左,enum類依痊,智能指針,自動(dòng)類型派生怎披,std :: thread胸嘁,atomic,regex等等凉逛。
Qt 5.x的Pyside 2項(xiàng)目
適用于Qt 5.x的官方LGPL python封裝包性宏,即pyside2, 或者叫Qt for Python,已經(jīng)與Qt 5.12 一起發(fā)布状飞。
Pyside 2項(xiàng)目旨在為Qt 5.x提供完整的PySide端口毫胜。其開發(fā)工作于2015年5月在GitHub上開始。該項(xiàng)目成功為Qt 5.3诬辈、5.4和5.5開發(fā)了Pyside端口酵使。 在2016年4月,Qt公司決定適當(dāng)支持該端口(請(qǐng)參閱詳細(xì)信息)自晰。
版權(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)載請(qǐng)附上原文出處鏈接及本聲明酬荞。原文鏈接:https://github.com/qingfengxia/FreeCAD_Mod_Dev_Guide/blob/master/chapters/1.FreeCAD_overview_architecture.md