コマンドおよびメソッドの典型的な動作としては、以下の 2 種類があります。
常に、コマンドおよびメソッドが、有効なオブジェクトまたはコレクションを返す。 たとえば以下のようになります。
GetPrimCamera コマンドまたは AddCamera メソッドは、カメラをシーンに追加して、新しいカメラを返します。 新しいカメラがメソッドにより常に作成されるため、戻り値は常に有効なオブジェクトです。
Geometry.Points プロパティは、オブジェクトのジオメトリからポイントのコレクションを取得します。 このプロパティを実装するオブジェクトはいずれも常にポイントのコレクションを含んでいるので、戻り値は常に有効なコレクションになります。
FindChildren および Filter メソッドは、指定した条件に一致する有効なコレクションを常に返します。 メンバがない場合でも、SIFilter コマンドとは異なり、空ではあるけれど有効なコレクションを戻します。
場合によっては、コマンドおよびメソッドが無効なオブジェクトまたはコレクションを返すこともあります。 たとえば以下のようになります。
無効なオブジェクトまたはコレクション(nothing)の使用を試みると、スクリプトは失敗します。 この理由から、さらに処理を進める前に、戻り値をテストしておかなければなりません。 詳細については、「戻り値が有効であるかどうかを確認する」を参照してください。
コマンドおよびメソッドのなかには、オブジェクトをテストして、ある条件が真であるかどうかを判定するものもあります。それらが返すのは、True または False のどちらかを表す boolean 型の値です。 たとえば、IsAnimated コマンドはオブジェクトにアニメートされたパラメータがあるかどうかを判定し、SIObject.IsEqualTo メソッドはオブジェクトが他の項目と同じかどうかを判定します。
何らかの種類の算術計算を実行するコマンドやメソッドは他にもたくさんあり、それらにより数値が返されます。 たとえば、GetNbTriangles コマンドは特定のオブジェクト上にある三角形の数を(long として)返し、XSIMath.DegreesToRadians メソッドは度の単位で表された角度をラジアン(double として)に変換します。
型の詳細については、「「型」について」を参照してください。
ほとんどのメソッドと一部のコマンドは、個別のシーン アイテムを作成し、新しく作成されたオブジェクトの名前を返します。 たとえば、CreatePrim コマンドと X3DObject.AddGeometry メソッドはどちらも、指定されたジオメトリ タイプの 3D オブジェクトを作成します。
このような場合、VBScript を使用している場合は、オブジェクトを取得するために変数の前に Set キーワードを使用する必要があります。 たとえば、CreatePrim コマンドは、作成したプリミティブを返します。 Set キーワードを指定すると、(X3DObject としての)オブジェクトへのポインタが返されます。
Set oObj = CreatePrim( "Arc", "NurbsCurve" ) ' TypeName(oObj) returns 'X3DObject'
Set キーワードを指定しないと、新しいオブジェクトの名前が返ります。これは、X3DObject のデフォルトのプロパティが Name プロパティであるためです。
sRtn = CreatePrim( "Arc", "NurbsCurve" ) ' TypeName(sRtn) returns 'String'
JScript などのような他の言語では、暗黙的に Object 型を変数に代入するため、この場合は特定のキーワードを使用する必要はありません。
// ClassName(oObj) will return 'X3DObject' var oObj = CreatePrim( "Arc", "NurbsCurve );
返されたオブジェクトを取得したときに覚えておかなければならない重要な点は、そのオブジェクトが単純なオブジェクトまたはコレクションのどちらかに該当するということです。 これは、返されたオブジェクトのテスト方法と使用方法に影響を与えます。たとえば、単純なオブジェクトには Name および Type プロパティがありますが、コレクションには Count および Item プロパティがあります。
オブジェクトのデフォルトのプロパティは Name プロパティなので、オブジェクト変数 oSphere をコード ステートメントで使用するときは、コンテキストに応じて oSphere または oSphere.Name として解釈できます。
' These two LogMessage statements are equivalent ' since LogMessage is looking for a string Set oSphere = CreatePrim( "Sphere", "NurbsSurface" ) LogMessage oSphere LogMessage oSphere.Name
オブジェクトの詳細については、「Softimage API の構造について」を参照してください。
コレクションのデフォルトのプロパティは Item プロパティなので、オブジェクト変数 oOwners をコード ステートメントで使用するときは、コンテキストに応じて oOwners または oOwners.Item として解釈できます。
' These four LogMessage statements are also equivalent ' because the Item actually identifies the object ' that is the first member of the collection, both ' are interpreted as oOwners.Item(0).Name Set oSphere = CreatePrim( "Sphere", "NurbsSurface" ) Set oOwners = oSphere.Owners LogMessage oOwners(0) LogMessage oOwners(0).Name LogMessage oOwners.Item(0) LogMessage oOwners.Item(0).Name
戻り値がオブジェクトまたはコレクションのどちらに該当するかを調べるには
以下のコードで、不明なオブジェクトがコレクションまたは単純なオブジェクトのどちらに該当するかをテストして確認します。
' Continue processing if there is an error in the next block On Error Resume Next ' Test to see if it is a collection myCount = mysteryObj.Count if (Err.Number = 0) then if (myCount = 0) then LogMessage "Empty collection." else LogMessage "Collection contains:" for each myItem in mysteryObj LogMessage myItem.Name & " is a " & myItem.Type next end if ' Test to see if it is a simple object else Err.Clear myName = mysteryObj.Name if (Err.Number = 0) then LogMessage "Object: " & myName & " is a " & mysteryObj.Type else LogMessage "Unknown" end if end if 'Stop processing if there is an error in the remainder of the script Err.Clear On Error GoTo 0