Site Tools


Differences

This shows you the differences between two versions of the page.

Link to this comparison view

zh-tw:rhino:basicmacros [2015/09/14]
zh-tw:rhino:basicmacros [2020/08/14] (current)
Line 1: Line 1:
 +
 +
 +======建立巨集(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//**,就可以避開對話框,效率也比較好。來看看以下的例子。
 +
 +<code>
 +_-Loft
 +_Pause
 +_Type=_Normal
 +_Simplify=_None
 +_Closed=_No
 +_Enter
 +</code>
 +
 +要注意的是該命令暫停時,您挑選所需的曲線後,立即就會執行。如果這個暫停被拿掉,當您尚未挑選曲線時,巨集也不會繼續進行。 如果您事先選擇了曲線,那麼這個暫停將自動被忽略。接下來這個指令會繼續設置您指定的所有選項,並且完成曲面。 試試看用兩個開放曲線,不管是事先或是之後才選取。 嘗試修改其中一個或是多個選項,比如////Closed=//Yes//或是////Simplify=//Rebuild// (對於這一點您必須加上 ////Rebuild=//20// 或是其他數值。)
 +
 +=====修改以作為封閉曲線使用=====
 +現在試試看兩個封閉曲線。 您將會碰到問題,為何? 
 +關於封閉曲線,放樣(Loft)需要使用者輸入接縫的位置, 在執行巨集時必須被指定在正確排序。所以您可以從之前自動跳出的選項中挑選接縫值(在子選項),也可以在螢幕上調整。不管用哪個方法,您都需要對巨集做出修改。
 +
 +在適當的地方加入暫停,讓使用者能有足夠的時間檢查並對螢幕上的接縫作出調整。
 +
 +<code>
 +_-Loft
 +_Pause
 +_Pause  <--
 +_Type=_Normal
 +_Simplify=_None
 +_Closed=_No
 +_Enter
 +</code>
 +
 +以Enter替代暫停(Pause)指令,表示Rhino會跳過這些預設值的接縫。
 +
 +<code>
 +_-Loft
 +_Pause
 +_Enter  <--
 +_Type=_Normal
 +_Simplify=_None
 +_Closed=_No
 +_Enter
 +</code>
 +或者可以進入接縫子選項來指定另一個放樣接縫選項。
 +
 +<code>
 +_-Loft
 +_Pause
 +_Natural  <--
 +_Enter    <--
 +_Type=_Normal
 +_Simplify=_None
 +_Closed=_No
 +_Enter
 +</code>
 +(Enter是用來離開"接縫"選項層,再回到放樣選項層)
 +
 +//很可惜的是,因為需要輸入額外的接縫選項,同樣的巨集並沒有辦法在開放或是關閉的曲線上正常運作。這是巨集系統和一些Rhino指令寫入的限制。//
 +
 +
 +======利用巨集來快速設定介面選項======
 +
 +巨集也可以自動設定不同GUI和文件內容選項,而無須進入選項對話框。我用以下的方式來設定自己想要的彩線網格方式。(注意-_DocumentProperties前面的- 破折號)
 +
 +<code>
 +-_DocumentProperties
 +_Mesh _Custom
 +_MaxAngle=0 _AspectRatio=0
 +_MinEdgeLength=0 _MaxEdgeLength=0
 +_MaxEdgeSrf=0.01 _GridQuads=16
 +_Refine=Yes _JaggedSeams=No
 +_SimplePlanes=No
 +_Enter
 +_Enter
 +</code>
 +為何最後要兩個Enter?
 +
 +因為在-_DocumentProperties之下我們進入了兩層,第一層是網格,第二層是網格的自訂子層。第一個Enter用來離開子層並且回到主層,第二個Enter用來離開指令。有些腳本可能需要三個Enter。
 +以下是Jeff LaSor關閉或開啟滑鼠游標的腳本。
 +
 +要開啟或關閉滑鼠游標,您必須將以下步驟鍵入按鈕設定:
 +<code>
 +  -_Options _Appearance _Visibility
 +  _Crosshairs _Enter _Enter _Enter
 +</code>
 +請注意每個指令選項名字。在腳本裡面指定這些指令,就像使用滑鼠點選。
 +同樣也請注意三個enter的輸入。
 +在本案例,每個指令能帶領使用者進入下一層指令選項,也就是說您需要一個Enter指令來回到上一層。既然這個腳本進入了三個子層,所以也需要3個Enter來離開此指令。
 +
 +或者,不管之前進入了多少個子層,最後使用一個驚嘆號"!" 就可以馬上回到原來的地方。註:如果您想要繼續使用此巨集,千萬不要用驚嘆號"!",而是用Enter,否則此巨集將永遠停在"!"處,然後關閉。
 +
 +以上腳本只是將滑鼠游標開啟或關閉,但如果您需要一個一直開啟或是一直關閉的滑鼠游標,請參考以下腳本:
 +
 +滑鼠游標永遠開啟:
 +<code>
 +  -_Options _Appearance _Visibility
 +  _Crosshairs=_Show !
 +</code>
 +滑鼠游標永遠關閉:
 +<code>
 +  -_Options _Appearance _Visibility
 +  _Crosshairs=_Hide !
 +</code>
 +請注意這裡的"!",參考上述提醒過的重點。 也請注意無論選項設定值為何,可以用 '=' 直接定。滑鼠游標有兩種可能的選項,"Show"和"Hide"
 +
 +謝謝你,Jeff。
 +
 +======其他編寫巨集有用的工具與指令======
 +
 +有一些小技巧可以用來編寫更複雜的巨集。其一是不同篩選器的識別,尤其是**SelLast**,這個指令選取最後一個建立/轉換的物件。**SelPrev**,是選取前一個輸入的物件。
 +**SelNone**則是取消選取所有的物件。
 +也可以命名多個物件,將它們選為一組,然後命名這個群組。
 +之後再用這些名字叫出此物件/群組。
 +
 +<code>
 +Select
 +SelLast
 +SelPrev
 +SelNone
 +SetObjectName
 +SetGroupName
 +SelGroup
 +SelName
 +Group
 +Ungroup
 +</code>
 +設置單一物件名稱 
 +<code>
 +  _Properties _Pause _Object _Name
 +  [輸入物件名稱] _Enter _Enter
 +</code>
 +取消單一物件名稱,但不刪除此物件
 +<code>
 +  _Properties _Pause _Object _Name
 +  “ “ _Enter _Enter (quote space quote for the name)
 +</code>
 +=====案例=====
 +請閱讀以下巨集:
 +
 +<code>
 +_Select _Pause _Setredrawoff
 +_BoundingBox _World _Enter
 +_Selnone _Sellast
 +_OffsetSrf _Solid _Pause
 +_Delete _Sellast
 +_BoundingBox _World _Enter
 +_Delete _Setredrawon
 +</code>
 +此腳本建立一個偏移值邊框方塊圍繞的物件,此偏移值由使用者輸入。The Setredrawoff/on stop/restart 會停止或重新啟動螢幕更新,執行之後可以消除畫面閃爍,並且加速處理。但是要小心,如果在Setredrawon之前中止指令,您會以為Rhino當機,因為螢幕不再更新。
 +別擔心,只要鍵入Setredrawon,螢幕就會恢復原狀。
 +
 +**//最後一個案例//**:以下巨集建立一個在2D平面或是文字物件上的中心點。這個巨集預設使用者與文字在同樣的視圖上,那麼此物件是2D平面的。
 +
 +請注意已命名的群組還有各種指令的使用,**NoEcho**暫時停止對於指令的回報,與Setredrawoff/on共同使用,可以讓巨集運作時不閃爍,也不會有過多的指令回報。
 +當然不用**NoEcho**也是可以運作的。
 +
 +<code>
 +_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
 +
 +</code>
 +==請自由增加或編輯本教學==
 +教學仍在編輯中