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

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渲染的其他例子:

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搓劫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖特石,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逊朽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凌箕,警方通過(guò)查閱死者的電腦和手機(jī)犀填,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門辛慰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)深员,“玉大人负蠕,你說(shuō)我怎么就攤上這事【氤” “怎么了遮糖?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)叠赐。 經(jīng)常有香客問(wèn)我欲账,道長(zhǎng),這世上最難降的妖魔是什么芭概? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任赛不,我火速辦了婚禮,結(jié)果婚禮上罢洲,老公的妹妹穿的比我還像新娘踢故。我一直安慰自己,他們只是感情好奏路,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布畴椰。 她就那樣靜靜地躺著,像睡著了一般鸽粉。 火紅的嫁衣襯著肌膚如雪斜脂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天触机,我揣著相機(jī)與錄音帚戳,去河邊找鬼。 笑死儡首,一個(gè)胖子當(dāng)著我的面吹牛片任,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔬胯,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼对供,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了氛濒?” 一聲冷哼從身側(cè)響起产场,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舞竿,沒(méi)想到半個(gè)月后京景,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骗奖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年确徙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了醒串。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鄙皇,死狀恐怖芜赌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情育苟,我是刑警寧澤较鼓,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站违柏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏香椎。R本人自食惡果不足惜漱竖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畜伐。 院中可真熱鬧馍惹,春花似錦、人聲如沸玛界。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)慎框。三九已至良狈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笨枯,已是汗流浹背薪丁。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馅精,地道東北人严嗜。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像洲敢,于是被迫代替她去往敵國(guó)和親漫玄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容