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

 
 
 

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