1

スクリプトを早期に停止できる Maxscript のコマンドはありますか? たとえば、スクリプトが単一のオブジェクトを選択することに依存しているとします。選択するものがない場合、機能しません。

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

STOP が表す場所は、とらえどころのない、または架空の停止コマンドです。

次のようなテストを行う必要はありません。

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

これは問題ありませんが、スクリプトの大部分を括弧で囲むことを意味します。これにより、コードが編集しにくくなります。

4

2 に答える 2

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)
于 2013-01-18T17:17:13.323 に答える