======建立巨集(Macros)基礎教學 (與Rhino指令一起的腳本)======
=====介紹=====
在Rhino裡建立巨集可以一次執行很多任務,包括定義命令或是改善工作流程。
"腳本"這個詞有可能造成一些困惑。腳本被使用在描寫巨集以及編寫更多複雜的[[developer:rhinoscript|RhinoScript]]或是其他程式語言。
這兩樣其實非常不同。編寫"RhinoScript"功能或是其他程式語言比建立巨集更加複雜,而且需要更多有關程式語言的知識跟技巧。關於那一方面我們不在此討論。
這裡所說的"巨集"指的是在Rhino中將一連串Rhion指令及其選項串聯起來,變成一個自動執行的功能。這裡用的是最簡單的"腳本",任何Rhino使用者都接觸得到,即便他們對程式語言並沒有很深的了解。 只要稍微懂得Rhino 指令還有結構,加上合乎邏輯的腦袋,還有一點實驗精神就可以完成了。
=====所需要的工具:=====
你的腦袋
Rhino的Help檔 - 是Rhino所有指令以及子選項的列表,也是你最重要的參考來源。
Rhino**巨集編輯器(MacroEditor)**,可以讓使用者輕鬆使用或是調整巨集。
=====您曾經用過一兩個巨集=====
Rhino使用者可能不知道自己已經使用過巨集了。很多Rhino裡的指令已被寫成"巨集",所以當您點選工具列上的按鈕或是從功能表單叫出某個指令,那就是一個已經設定好的"巨集"。現在,按下shift並在**直線擠出**上按右鍵。
{{:zh-tw:rhino:marco-zh.png?500|}}
這是一個簡單巨集的案例,只要用一個指令就可以設定好一連串的選項,所以不用每次用到此功能就要註明很多設定。**ExtrudeCrv**有幾個"預先設定的選項"的按鈕,//Tapered//, //AlongCurve//, //ToPoint//, //Cap=Yes// (solid) 等等。
查看**ExtrudeCrv**按鈕來檢視到底是如何布局的。
這有點像您在下指令的時候按或是輸入選項,一次一個。 事實上巨集不過就是這樣的東西而已,是一組指令重複序列,不建立巨集的話,您只能手動輸入一個個的指令。
一個單一指令的腳本選項可能與數據組合(比如座標或是其他數據資料)。
也可以將數個指令串聯在一起,就是把操縱或是建立物件的""事件"自動排序。
> **註:**//為何用下底線_? 下底線告訴Rhino,無論在任何語言環境下執行Rhino,接下來的指令是英文,這樣的巨集不管在何種語言環境下都可以使用。如果您已經在英文環境下作業,在不造成其他影響的情況下,可以消除下底線( _ )。
為什麼要用驚嘆號( ! )? 為安全起見,這可以取消前一個在運作的任何指令。//
====入門====
假設你已經把一連串10 x 10 x 10的方塊底部放置在想要位置的中心,那個中心點可以經由滑鼠在想要的位置點一下,或是用鍵盤輸入座標來設定。
使用者可以使用立方體指令(角對角加高度),但在預設值裡,插入點將會被放置在立方體的第一個角。 要把插入點放在使用者想要的地方,使用立方體還有居中的指令會比較簡單。事實上這只是立方體指令加上居中的選項,所以在巨集裡,使用者需要啟動此功能。
開啟**巨集編輯器**,鍵入以下指令:
! _Box _Center
//這是立方體底下的巨集,底部居中//\\
所有輸入(指令或是數據輸入),都必須要有一個空格隔開。
現在我們需要定位中心點。要完成這個任務,Rhino被告知暫時停止處理指令,直到使用者用滑鼠點選或是用鍵盤輸入座標。這是藉由"暫停"(Pause)命令來達成的。
! _Box _Center _Pause
只要輸入數據,就可以直接用指令來指定正方體的尺寸。 既然立方體居中選項需要一個立方體的角來做第二個輸入,我們就可以指定它的X, Y座標:
! _Box _Center _Pause r5,5
(為什麼要用"r"? 我們希望這個座標是最後一個選取的點,也就是立方體底部的中心。不然立方體的角永遠都會落在X5, Y5)
此時我們可以加入高度,在此案例中大概是原來的起點。
! _Box _Center _Pause r5,5 10
由於並沒有進一步輸入的需要,巨集到此完成,正方體也完成。請注意因為我們希望正方體的長寬相等,有另外一種可能性是直接按Enter,而不是最後輸入的"10"。
! _Box _Center _Pause r5,5 _Enter
現在巨集運作中,而且您也挺滿意的。[[zh-tw:rhino:macroscriptsetup|製作一個新的工具列按紐]] 並且將巨集貼進去,再給它一個好認的名字,比如“10 x 10 x 10 bottom centered box”。
只要巨集被執行過一次,以後只要按右鍵,就會自動執行,而無須每次點擊按鈕。
======較複雜的巨集======
有些指令可以叫出有許多選擇的對話框,這通常會讓巨集停止,等到使用者點選所需選項才會繼續運作。 既然使用者希望能夠自動完成巨集所執行的任務,那麼可以用-(破折號)來跳過之前出現的對話框。 使用者用腳本寫入選項,巨集就會自動運作完成。有些指令有好幾層的子選項,如果你想要知道有哪些,在指令欄鍵入指令加上-(破折號),點擊選項就可以查看。
=====放樣兩個開放曲線=====
如果你想要重複放樣兩個//開放的//曲線來組成一個曲面。用**Loft**指令的話,你還是需要點選一些對話框。如果使用**//-Loft//**,就可以避開對話框,效率也比較好。來看看以下的例子。
_-Loft
_Pause
_Type=_Normal
_Simplify=_None
_Closed=_No
_Enter
要注意的是該命令暫停時,您挑選所需的曲線後,立即就會執行。如果這個暫停被拿掉,當您尚未挑選曲線時,巨集也不會繼續進行。 如果您事先選擇了曲線,那麼這個暫停將自動被忽略。接下來這個指令會繼續設置您指定的所有選項,並且完成曲面。 試試看用兩個開放曲線,不管是事先或是之後才選取。 嘗試修改其中一個或是多個選項,比如////Closed=//Yes//或是////Simplify=//Rebuild// (對於這一點您必須加上 ////Rebuild=//20// 或是其他數值。)
=====修改以作為封閉曲線使用=====
現在試試看兩個封閉曲線。 您將會碰到問題,為何?
關於封閉曲線,放樣(Loft)需要使用者輸入接縫的位置, 在執行巨集時必須被指定在正確排序。所以您可以從之前自動跳出的選項中挑選接縫值(在子選項),也可以在螢幕上調整。不管用哪個方法,您都需要對巨集做出修改。
在適當的地方加入暫停,讓使用者能有足夠的時間檢查並對螢幕上的接縫作出調整。
_-Loft
_Pause
_Pause <--
_Type=_Normal
_Simplify=_None
_Closed=_No
_Enter
以Enter替代暫停(Pause)指令,表示Rhino會跳過這些預設值的接縫。
_-Loft
_Pause
_Enter <--
_Type=_Normal
_Simplify=_None
_Closed=_No
_Enter
或者可以進入接縫子選項來指定另一個放樣接縫選項。
_-Loft
_Pause
_Natural <--
_Enter <--
_Type=_Normal
_Simplify=_None
_Closed=_No
_Enter
(Enter是用來離開"接縫"選項層,再回到放樣選項層)
//很可惜的是,因為需要輸入額外的接縫選項,同樣的巨集並沒有辦法在開放或是關閉的曲線上正常運作。這是巨集系統和一些Rhino指令寫入的限制。//
======利用巨集來快速設定介面選項======
巨集也可以自動設定不同GUI和文件內容選項,而無須進入選項對話框。我用以下的方式來設定自己想要的彩線網格方式。(注意-_DocumentProperties前面的- 破折號)
-_DocumentProperties
_Mesh _Custom
_MaxAngle=0 _AspectRatio=0
_MinEdgeLength=0 _MaxEdgeLength=0
_MaxEdgeSrf=0.01 _GridQuads=16
_Refine=Yes _JaggedSeams=No
_SimplePlanes=No
_Enter
_Enter
為何最後要兩個Enter?
因為在-_DocumentProperties之下我們進入了兩層,第一層是網格,第二層是網格的自訂子層。第一個Enter用來離開子層並且回到主層,第二個Enter用來離開指令。有些腳本可能需要三個Enter。
以下是Jeff LaSor關閉或開啟滑鼠游標的腳本。
要開啟或關閉滑鼠游標,您必須將以下步驟鍵入按鈕設定:
-_Options _Appearance _Visibility
_Crosshairs _Enter _Enter _Enter
請注意每個指令選項名字。在腳本裡面指定這些指令,就像使用滑鼠點選。
同樣也請注意三個enter的輸入。
在本案例,每個指令能帶領使用者進入下一層指令選項,也就是說您需要一個Enter指令來回到上一層。既然這個腳本進入了三個子層,所以也需要3個Enter來離開此指令。
或者,不管之前進入了多少個子層,最後使用一個驚嘆號"!" 就可以馬上回到原來的地方。註:如果您想要繼續使用此巨集,千萬不要用驚嘆號"!",而是用Enter,否則此巨集將永遠停在"!"處,然後關閉。
以上腳本只是將滑鼠游標開啟或關閉,但如果您需要一個一直開啟或是一直關閉的滑鼠游標,請參考以下腳本:
滑鼠游標永遠開啟:
-_Options _Appearance _Visibility
_Crosshairs=_Show !
滑鼠游標永遠關閉:
-_Options _Appearance _Visibility
_Crosshairs=_Hide !
請注意這裡的"!",參考上述提醒過的重點。 也請注意無論選項設定值為何,可以用 '=' 直接定。滑鼠游標有兩種可能的選項,"Show"和"Hide",
謝謝你,Jeff。
======其他編寫巨集有用的工具與指令======
有一些小技巧可以用來編寫更複雜的巨集。其一是不同篩選器的識別,尤其是**SelLast**,這個指令選取最後一個建立/轉換的物件。**SelPrev**,是選取前一個輸入的物件。
**SelNone**則是取消選取所有的物件。
也可以命名多個物件,將它們選為一組,然後命名這個群組。
之後再用這些名字叫出此物件/群組。
Select
SelLast
SelPrev
SelNone
SetObjectName
SetGroupName
SelGroup
SelName
Group
Ungroup
設置單一物件名稱
_Properties _Pause _Object _Name
[輸入物件名稱] _Enter _Enter
取消單一物件名稱,但不刪除此物件
_Properties _Pause _Object _Name
“ “ _Enter _Enter (quote space quote for the name)
=====案例=====
請閱讀以下巨集:
_Select _Pause _Setredrawoff
_BoundingBox _World _Enter
_Selnone _Sellast
_OffsetSrf _Solid _Pause
_Delete _Sellast
_BoundingBox _World _Enter
_Delete _Setredrawon
此腳本建立一個偏移值邊框方塊圍繞的物件,此偏移值由使用者輸入。The Setredrawoff/on stop/restart 會停止或重新啟動螢幕更新,執行之後可以消除畫面閃爍,並且加速處理。但是要小心,如果在Setredrawon之前中止指令,您會以為Rhino當機,因為螢幕不再更新。
別擔心,只要鍵入Setredrawon,螢幕就會恢復原狀。
**//最後一個案例//**:以下巨集建立一個在2D平面或是文字物件上的中心點。這個巨集預設使用者與文字在同樣的視圖上,那麼此物件是2D平面的。
請注意已命名的群組還有各種指令的使用,**NoEcho**暫時停止對於指令的回報,與Setredrawoff/on共同使用,可以讓巨集運作時不閃爍,也不會有過多的指令回報。
當然不用**NoEcho**也是可以運作的。
_Select _Pause _Noecho _Setredrawoff
_Group _Enter _SetGroupName TexTemp
_BoundingBox _CPlane _Enter
_SelNone _SelLast _PlanarSrf
_SelPrev _Delete _SelLast
_AreaCentroid _Delete
_Sellast _SelGroup TexTemp
_Ungroup _Group _Setredrawon
==請自由增加或編輯本教學==
教學仍在編輯中