2013-01-18 123 views
1

Maxscript中是否存在允許您提前停止腳本的命令?舉個例子,腳本依賴於將單個對象作爲選擇。如果沒有東西可以選擇,那麼它將無法工作。Maxscript中的停止腳本

myObj = $ 
if ($ == undefined) then STOP 
-- rest of code 

其中STOP代表的是難以捉摸的或虛構停止命令

而不是必須做這樣一個試驗:

myObj = $ 
if ($ != undefined) then 
(
--rest of code 
) 

這很好,但它確實意味着把大部分括號內的腳本 - 我發現它使代碼變得更加醜陋,無法編輯。

回答

2

這取決於,您通常可以使用return強制提前退出。這將在事件處理程序的情況下,甚至工作,因爲他們基本上只是功能:

rollout test "Test" 
(
    button btn "Exception" 

    on btn pressed do 
    (
     if selection.count != 1 do 
      return messageBox "Selection count expected to be one." 
     if NOT isKindOf selection[1] Editable_poly do 
      return messageBox "Object not an Editable Poly." 
     btn.text = selection[1].name 
    ) 
) 
createDialog test 

由於一些實施細節,如果在一個循環的主體使用或其他地方在那裏它可能被執行多次,它會盡管如此,讓整個腳本變得更慢。

如果您只想退出腳本並僅在偵聽器中打印信息,則throw可能是更好的使用功能。

if selection.count != 1 do 
     throw "Selection count expected to be one." 
    if NOT isKindOf selection[1] Editable_poly do 
     throw "Object not an Editable Poly" 
    print selection[1].name 
在大多數情況下

但是您當前使用的是最恰當的解決方案。如果你想提高它(尤其是如果你發現自己一遍又一遍寫同一段代碼),你可以寫類似的自定義結構,例如,Filters

#Struct:Filters(
     GetModOrObj:<fn>; Public, 
     Is_EditSpline:<fn>; Public, 
     CanSwitchTo_Segment:<fn>; Public, 
     HasBaseObjectProperty:<fn>; Public, 
     ... 
     Is_EditPolyMod:<fn>; Public, 
     Is_This_EditPolyObj:<fn>; Public, 
     Is_EditPatch:<fn>; Public, 
     CanSwitchTo_Face:<fn>; Public) 
1

使用退出,這裏有一個簡單的例子爲:a = 100

while True do 

(

    a -= 1 

    print a 

    if a == 20 do 

    (

     print "a is equal to 20!" 

     exit 

    ) 

) 
+0

即僅適用循環內(它並不適用於所提供的示例OP)。 – Swordslayer

+0

@Swordslayer是真的,它只適用於for和while循環,我很快就讀過這篇文章,並且有一個印象,就是他發佈了一小段代碼,它放在一些循環中!我的錯! :) –