コマンドおよびメソッドの典型的な動作としては、以下の 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