オブジェクトおよびコレクションに関する注意事項

 
 
 

コマンドおよびメソッドの典型的な動作としては、以下の 2 種類があります。

  1. 常に、コマンドおよびメソッドが、有効なオブジェクトまたはコレクションを返す。 たとえば以下のようになります。

    • GetPrimCamera コマンドまたは AddCamera メソッドは、カメラをシーンに追加して、新しいカメラを返します。 新しいカメラがメソッドにより常に作成されるため、戻り値は常に有効なオブジェクトです。

    • Geometry.Points プロパティは、オブジェクトのジオメトリからポイントのコレクションを取得します。 このプロパティを実装するオブジェクトはいずれも常にポイントのコレクションを含んでいるので、戻り値は常に有効なコレクションになります。

    • FindChildren および Filter メソッドは、指定した条件に一致する有効なコレクションを常に返します。 メンバがない場合でも、SIFilter コマンドとは異なり、空ではあるけれど有効なコレクションを戻します。

  2. 場合によっては、コマンドおよびメソッドが無効なオブジェクトまたはコレクションを返すこともあります。 たとえば以下のようになります。

    • SIFilter コマンドは、既存のリストを入力として取ります。また、そのメンバのサブセットを、指定された基準に合致する新しいコレクションとして返します。 何も基準に合致しない場合、有効なコレクションは作成されません。 この動作は、条件が満たされない場合は有効で空のコレクションを返す Filter メソッドとは異なります。

    • FindChild または Find メソッドは入力オブジェクトを入力値として取り、指定された条件に最初に一致したオブジェクトを戻します。 何も合致しない場合、有効なオブジェクトは戻されません。

重要:

無効なオブジェクトまたはコレクション(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 );

例: スクリプト コマンドを使用してオブジェクトを戻す

' Using the Set keyword allows you to create variables 
' that point to objects.
Set oSphere = CreatePrim("Sphere", "NurbsSurface")

例: オブジェクト モデルを使用してオブジェクトを戻す

Set oRoot = ActiveProject.ActiveScene.Root
Set oSphere = oRoot.AddGeometry("Sphere", "NurbsSurface", "sphere")
LogMessage oSphere.Name & " has a position in X of " & oSphere.posx.Value

単純なオブジェクトとコレクションの相違点

返されたオブジェクトを取得したときに覚えておかなければならない重要な点は、そのオブジェクトが単純なオブジェクトまたはコレクションのどちらかに該当するということです。 これは、返されたオブジェクトのテスト方法と使用方法に影響を与えます。たとえば、単純なオブジェクトには 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