FreeCAD源碼閱讀筆記
本文目標在於記錄在FreeCAD源碼閱讀中了解到的一些東西。
FreeCAD編譯
FreeCAD源碼的編譯最好使用官方提供的LibPack,否則第三方庫難以找全,找到之後還需要自己編譯,此外還不知道CMake是否能夠那麽順利找好(find_package)自己設的第三方庫。采用官方提供的LibPack可以免除這一大堆的麻煩。但是官方的LibPack僅有提供針對VS2008, VS2013, VS2012x64的版本,分別可以在FreeCAD在github上的發布地址0.16和0.15版本位置找到(VC9, VC12),而sourceforge地址還可以找到x64的VS2012。
我采用的LibPack是FreeCADLibs_11.0_x64_VC11.7z版本,這個版本在boost_python上有lib和dll缺失,可以從boost官方預編譯版本1.55.0版本拷貝x64位相應的lib和dll,也可以從FreeCADLibs_10.0_x64_VC11.7z裏邊把4個文件拷貝出來。
源碼采用0.16的,沒有使用0.17_pre,目標主要在於編譯出來看看,沒有去追求官方最新的版本。解壓source,LibPack默認是與源碼放置同一目錄的,如果要放置在不同的目錄,可以將CMakeLists.txt第125行set(FREECAD_LIBPACK_DIR ${CMAKE_SOURCE_DIR} CACHE PATH "Directory of the FreeCAD LibPack")中的${CMAKE_SOURCE_DIR}改為${CMAKE_BINARY_DIR},cmake-gui.exe可以完美通過。
第三方庫粗略記錄
沒列舉齊全的第三方庫表格如下:
Lib Name | version in LibPack_11.0_x64_VC11 | Link to get it |
---|---|---|
Python | Python 2.7.8 | http://www.python.org/ |
PySide | 1.2.2 | http://wiki.qt.io/PySide |
shiboken | 1.2.2 | http://shiboken.readthedocs.io/en/latest/ |
Qt | Qt 4 | https://www.qt.io/ |
Boost | 1.55.0 | http://www.boost.org/ |
Coin3D | 4.0 | https://bitbucket.org/Coin3D/coin/wiki/Home |
SoQt | 1.2 | https://bitbucket.org/Coin3D/soqt |
OpenCASCADE | oce-16(對應6.7.1) | http://www.opencascade.com |
在以上第三方庫中,PySide是Python與Qt的融合,可以使用Python語言構建Gui。建議是在Python2.7系列中使用,支持部分Python3,與PySide有相同功能的PyQt相對成熟一些,但商用需要付費,估計這是FreeCAD采用PySide的原因,PySide是Qt官方出的,完成了對Qt4.8版本的完整實現,支持Qt5的PySide2也可以在github中找到。shiboken作何用途,我還沒弄得很明白。
FreeCAD對Python是重度依賴,不能缺失。如果自己來搞第三方庫,就必須先搞定Python,PySide,Boost,shiboken,所以使用官方提供的LibPack是可以節省不少麻煩的。
工程項目的簡要分析
可以將FreeCAD_trunk.sln目錄之下的項目分為兩類,一類為 FreeCAD打頭的基礎工程項目;另一類為Mod模塊工程。基礎工程項目列表如下:
工程項目 | 產生文件 | 備註 |
---|---|---|
FreeCADMain | FreeCAD.exe | FreeCAD主執行啟動文件,main()函數所在地 |
FreeCADMainPy | FreeCAD.pyd | 兼容Python的擴展dll,導出initFreeCAD() |
FreeCADMainCmd | FreeCADCmd.exe | App::Application::Config()["RunMode"]有三種模式,Gui、Exit、Console,這裏對應的是Exit模式,執行(argc, argv)之後自動退出 |
FreeCADGui | FreeCADGui.dll | 命名空間Gui,Command,Workbench,View3dInventor(視圖),Gui層的Document |
FreeCADGuiPy | FreeCADGui.pyd | 兼容Python的擴展dll |
FreeCADBase | FreeCADBase.dll | 代碼基礎與上層,命名空間Base,Type類型體系,InterpreterSingleton腳本解釋器 |
FreeCADApp | FreeCADApp.dll | 表征exe執行所在的應用,命名空間App,App::GetApplication()可以獲取唯一的那個pcSingleton指針,App層Document |
以上這些就建構了FreeCAD運行的基礎框架,它們實際上僅使用了Python, Boost, PySide, shiboken, xerces-c, zlib, coin3d等這些,其余的Mod都是模塊擴展,依賴諸如OCE,PCL,Eigen3,libqhull等等,每個Mod工程項目分為帶Gui的及不帶Gui的版本。帶Gui的項目定義了可用的Command,Workbench(工作臺),顯示等這些。
之所以FreeCAD對Python依賴如此之深,是因為本質上FreeCAD所有的命令實現都是通過Python語句來實現的。比如一個Box的創建命令是這樣的:
C++
void CmdPartBox::activated(int iMsg)
{
QString cmd;
cmd = qApp->translate("CmdPartBox","Cube");
openCommand((const char*)cmd.toUtf8());
doCommand(Doc,"App.ActiveDocument.addObject(\"Part::Box\",\"Box\")");
cmd = QString::fromLatin1("App.ActiveDocument.ActiveObject.Label = \"%1\"")
.arg(qApp->translate("CmdPartBox","Cube"));
doCommand(Doc,(const char*)cmd.toUtf8());
commitCommand();
updateActive();
doCommand(Gui, "Gui.SendMsgToActiveView(\"ViewFit\")");
}
裏邊這些都是發送給解釋器的Python語句呀,執行後會在界面上的Python Console窗口播報Python執行語句,這樣錄制宏就簡單極了,此外也可以全部采用Python來建模或者寫個功能實現,比如就有個SheetMetal就完全是用Python來實現。
Command命令的目標是產生NewObject加入Document,特征附有屬性,然後recompute()執行計算,這樣就可以重生成,響應修改屬性的結果。
fcstd文件格式分析
fcstd是FreeCAD存儲下來的文件,這個格式實際上就是zip壓縮文件,可以修改後綴成為zip或者直接拖拽至剛打開的WinRAR可以看到裏邊的文件,簡單的話就4個,多的話數量不少。其中Document.xml是對應FreeCADApp裏邊的Doc,GuiDocument.xml對應FreeCADGui裏邊的Doc,另外有PartShape.brp文件就是OpenCASCADE官方的brep格式呀。
Sketcher草圖
之所以說草圖,是發現FreeCAD的草圖看起來還不錯,實時可見(不同於實體的創建),可以捕捉到線段的端點,中點,兩條線的交點等這些。
- CmdSketcherCreateLine 是草圖繪制線段的命令,該命令在激活時會調用ActivateHandler(getActiveGuiDocument(), new DrawSketchHandlerLine())將這個handler交給SketcherGui::ViewProviderSketch激活
- DrawSketchHandlerLine 派生自 DrawSketchHandler,會有個mouseMove()的函數重載定義鼠標行為,並調用seekAutoConstraint(), renderSuggestConstraitsCursor()
- App裏邊有個planegcs文件夾,裏邊可以對約束求解,代碼稍微有點多沒細看,相比D-Cubed怎麽樣就不知道了
關於BUILD_JTREADER
因為筆者對JT格式做過分析,發現FreeCAD裏邊有這個選項,就特別留意了一下。需要提醒的是BUILD_JTREADER在這個版本無效,因為src/Mod下邊沒有JtReader文件夾,0.17_pre裏邊也沒有,但是github最新版的源碼裏有該文件夾。略略地看了一下,實現很簡略,跳過很多東西,相比OpenCASCADE官方提供的TKJT弱很多(不過OCC的TKJT也很久沒更新了,一更新就到了需要付費方可得到裏邊去了)。不過FreeCAD還有個JTREADER.h文件,調用了JtOpen的頭文件呀,這個牛,可惜JtOpen試用版一般只有一個月吧。
小結
2017/12/22 FreeCAD架構體系還是很清晰的,也實現了不少要點(比如Undo/Redo,參數化,自動保存等),模塊也包攬很多;Python嵌入好壞不好評價,但我個人不大習慣。總的來說給我的感覺是不精細。
FreeCAD源碼閱讀筆記