このヘルプ ファイル内の関数定義はどのように理解したらよいですか。

MAXScriptに関する質問と回答 > このヘルプ ファイル内の関数定義はどのように理解したらよいですか。

このヘルプ ファイルで使用する構文定義

上のトピックでは、MAXScript オンライン リファレンスで使用されている一般的な構文について説明してありますが、これまでの実例では、多くのユーザが関数定義を実際のコードに適用するところで問題を抱えていることがわかっています。

ここでは、構文を理解するのに役立ついくつかのガイドラインを示します。

次に示すのは、「Meshop 面メソッド」から抜粋した代表的な関数定義です。

meshop.detachFaces <Mesh mesh> <facelist> delete:<boolean=true> asMesh:<boolean=false>

指定された面をデタッチします。

delete true の場合、面はデタッチ後に削除されます。 delete false の場合、面は削除されません。

asMesh true の場合、面はデタッチされ、メッシュ値として返されます。 asMesh false の場合、面はメッシュの要素としてデタッチされ、OK が返されます。

最初に、この関数は meshop と呼ばれる構造体の一部です。構造体を使用すると、関連する関数をグループ化できます。この関数は、SDK を使用して実装されていますが、構造体の中に挿入することで独自の MAXScript 関数を作成することもできます。詳細は、「構造体でのローカル関数の定義」を参照してください。

関数の名前は detachFaces です。太字で記述されているのは、「このヘルプ ファイルで使用する構文定義」に従い、太字はコード「そのもの」であることを示すからです。実際は、構造体の名前 (meshop) も太字で記述すべきなのですが、そうするとヘルプ ファイルが読みづらくなってしまいます。これで、ページを参照して太字をすばやく探すことで、関数やキーワードを簡単に見つけることができます。

次に、関数に対する 2 つの引数 (パラメータ) が記述されています。これら 2 つの引数は必須です。 パラメータが指定されていなかったり、指定した値のクラスが要件と一致しなかったりすると、関数がエラー メッセージを発行します。

<Mesh mesh>ルールを定義します。<>の中のテキストは、ルールの代わりに使用するものを記述しています。この場合、ルールをメッシュ オブジェクトで置き換えるように指示しています。

次のルール <facelist> は、面のリストを指定するように指示しています。面のリストは、影響する面のインデックスを格納した通常の Array (例: #(1,3,10,11,12,13,14,15)) か、影響を受ける面のビット セットによる bitArray (例: #3,10,15.) のいずれかになります。

次に、2 つのオプション パラメータが記述されています。最初の 2 つのパラメータの順序は重要ですが (関数は mesh が最初 facelist が 2 番目のパラメータであることを前提としている)、オプションの名前付きパラメータは名前によって認識されるので、どんな順序でもかまいません。

注:

このヘルプ ファイルの構文定義では、オプション パラメータは角カッコ [ ] の中に記述されています。通常、関数を定義するときには、名前付きパラメータはどれもオプションです。関数定義によっては、オプション パラメータが角カッコ [ ] で囲まれていない場合もあるからです。

オプション パラメータに値が指定されていない場合、特殊値 unsupplied が関数に送られます。関数は値が指定されているがどうかをチェックし、 unsupplied 値を既定値で置き換えます。 unsupplied 値の詳細は、「「undefined」値と「unsupplied」値の違いは何ですか。」および「Unsupplied 値」を参照してください。

delete: パラメータを使用する場合、パラメータの名前はそのまま記述され、ブール値( true または false )がコロン ' : ' の後に記述されます。パラメータが与えられない場合、 true の値が既定値とみなされます。

最後の asMesh: パラメータもオプションで、指定されていない場合は false が既定値となります。

この関数の呼び出しは、通常次のようになります。

meshop.detachFaces $MyMesh02 #{1..25}

この場合、関数は、「MyMesh02」という名前の編集可能メッシュ オブジェクトから、 1 ~ 25 のインデックスの付いた面をデタッチするように指示しています。既定値では面が元のメッシュから削除され、2 つのオプション パラメータが既定値によって使用されるので、MyMesh02 の内側の新しい要素が作成されます。

この行を次のとおりに変更した場合

meshop.detachFaces $MyMesh02 #{1..10,40..55} delete:false

インデックス 1 ~ 10 と 40 ~ 55 の面がメッシュ内部の要素にクローン化されます。 つまり、新しい要素が作成されますが (既定値では asMesh が false)、メッシュから元の面は削除されません。

このコードを、今度は次のとおりに変更した場合

newMesh = meshop.detachFaces $MyMesh02 #(1,2,3,4,5,10,11,15) delete:false asMesh:true

通常の配列で記述されたインデックスを持つ面が、元のオブジェクトから削除されずに、新しく TriMesh にクローン化されます。関数が TriMesh 値を返し、それを newMesh ユーザ変数内に格納します。返された TriMesh 値を使用して新しいオブジェクトを作成する方法の詳細は、「Meshop 面メソッド」で、この関数用に提供されている 2 番目の例を参照してください。