Sketchup提供了兩套API:
-
C API,主要用於讀寫SU文件。我們的SU文件導入功能就是用這套API做的
-
Ruby API,用於開發SU插件
這次我們主要關注Ruby API,因為它是實現更豐富的SU擴展功能的主要方式
不得不承認Sketchup的Ruby API開發文檔相對於React,或是Inventor/Revit這些都太不友好了。不過從這篇文檔開始我們還是能按圖索驥,找到門徑。
如果不想讀這篇文檔,那么也可以遵循如下步驟:
-
去Github把官方tutorial教程項目clone下來
-
clone下來之后,直接把tutorial里面的rb源文件拷貝到Sketchup的Plugins目錄(e.g. C:\Users\kzhan\AppData\Roaming\SketchUp\SketchUp 2018\SketchUp\Plugins),重啟SU,就可以執行tutorial里面的插件了
-
用VS code把官方tutorial項目打開,閱讀代碼。代碼里有詳細的注釋,解釋了插件代碼要怎么寫
-
代碼全都是Ruby的,但我覺得也沒必要再專門去學Ruby語言了。對着代碼看,大部分還是能理解意思。遇到不熟悉的語法可以查Ruby官方文檔 以及SU的 Ruby API文檔
-
個人查閱過,覺得值得了解的Ruby語法知識點有:
-
Ruby的方法名可以包含!,?這些標點符號。包含!的方法名一般表示這是一個“危險”的操作,包含?的方法名一般表示它會return一個boolean。注意這些是coding convention而不是編譯要求
-
Ruby有unless語句,unless [condition] then 中,condition為false,then后面的語句才會執行。且 unless和if 都可以放到待執行表達式的后面,如 a += 1 if a.zero
-
Sketchup::InputPoint.new, Sketchup是module name,InputPoint是class name,此語句new了一個InputPoint對象
-
Ruby調用一個方法時,如果不帶參數,則方法后的括號可以省略。e.g. my_method()也可寫成my_method
-
以$開頭的變量名是全局變量,以@開頭的變量名是類的成員變量(instance variable),以@@開頭的變量名是類的靜態成員變量(class variable)
-
-
-
可以先閱讀tut_hello_cube的代碼和注釋。這是一個Hello World級別的插件,執行插件命令后直接在世界坐標系原點處生成一個立方體
-
接下來閱讀tut_custom_tool,這是一個實現了和SU原生的“畫直線”命令相同功能的插件。這才是我們真正需要了解的東西
從tut_custom_tool的程序結構看,SU插件和Inventor/Revit插件的程序結構其實很相似。它要定義一個custom tool的類,然后實現activate/deactivate/onCancle/onMouseMove/onLButtonDown等方法,在這些方法里實現業務邏輯
從tut_custom_tool的調用的API來看,SU Ruby API還是提供了相當豐富的、封裝層次較高的基礎設施,包括:
-
交互操作工具類。如InputPoint類,可完成從屏幕上交互拾取一個點的功能。其pick方法的輸入參數還可打開“本次拾取的點與上次拾取的點的連線與坐標軸平行吸附“這樣的高級功能。打開后,我們的插件畫線工具和原生畫直線工具一樣,可以紅/綠/藍燈不同顏色的虛線,表示此時推斷的連線和哪個坐標軸平行。而這樣的交互能力的獲取,只需要在調用API時傳入一個參數即可
-
幾何造型工具類。如Sketchup.active_model.active_entities.add_line,根據拾取的點在模型上加邊;edge.find_faces,用於根據剛加好的邊生成面
-
實現undo/redo管理util,如start_operation/commit_opeation等
-
視圖操作util,如view.tool_tip, Sketchup.status_text, view.invalidate 等直接修改/更新視圖對象的方法
感覺按照這樣的API能力,SU Ruby API也和Onshape的FeatureScript一樣,可以將其原生的建模功能完全用API重寫一遍。