1. 程式人生 > >FreeCAD源碼閱讀筆記

FreeCAD源碼閱讀筆記

buck qstring plane 必須 oos 麻煩 code ans 派生

本文目標在於記錄在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源碼閱讀筆記