パラメータ値へのアクセス

 
 
 

スクリプト コマンドを使ってパラメータ値を処理する場合、SetValue および GetValue コマンドを使用できます。このコマンドを使用するには、パラメータのスクリプト名が分かっている必要があります(「パラメータ名の検索」を参照)。

オブジェクト モデルを使用している場合は、ParameterCollection を使って、どのプロジェクト アイテムからも直接にパラメータ値を取得し設定できます。

ヒント:

これらの両方の方法で、パラメータ名の指定時に冗長な標準形式を省略できるショートカットを使用できます。これらのショートカットはすべてのパラメータのセットに使用できるわけではありません。 詳細については、「ショートカットの使用」を参照してください。

パラメータ値の取得

パラメータの値を取得するには、まず対象となるオブジェクトを特定してからパラメータを特定します。 その後で、変数に値を格納するか直接にその値を処理できます。

次のように、引数にパラメータのフルネームを取る GetValue コマンドを使用できます。

rtn = GetValue( "light.Name" );

次のように、パラメータの Parameter.Value プロパティを使用できます。

// Get a pointer to the parameter first
var p = oObject.Parameters( "Name" );
rtn = p.Value;

// Or just get the value directly
rtn = oObject.Parameters( "Name" ).Value;

コマンドまたはオブジェクト モデルのいずれを使用するかによって、パラメータのフル パスを判断する必要があります。 詳細については、「パラメータ名の検索」を参照してください。

例: Softimage ネイティブ コマンドを使用したカメラ視野角の取得

' Get an object containing the camera's fov
lFOV = GetValue( "Camera.camera.fov" ) 

' Display the value
LogMessage "Camera's field of view = " & lFOV

例: オブジェクト モデルを使用したカメラ視野角の取得

' Get an object containing the camera's fov
set oCamera = ActiveSceneRoot.FindChild( "Camera" )

' Display the value
LogMessage oCamera.ActivePrimitive.Parameters( "fov" ).Value

' Or, the identical approach using shortcuts:
LogMessage oCamera.fov.Value

例: Softimage ネイティブ コマンドを使用した指定フレームでのカメラ位置の取得

' Store the position value in a variable and then display the variable
iPos = GetValue( "Scene_Root.Camera.kine.local.pos.posx", 24 )
LogMessage "Camera's X position at frame 24 is " & CStr( iPos )

例: オブジェクト モデルを使用した指定フレームでのカメラ位置の取得

' Store the position value in a variable and then display the variable
set oCamera = ActiveSceneRoot.FindChild( "Camera" )
iPos = oCamera.Kinematics.Local.Parameters( "posx" ).Value(24)
LogMessage "Camera's X position at frame 24 is " &CStr(iPos)

パラメータ値を設定する

値を設定する作業は値を取得する作業に似ていますが、変更予定のパラメータへのリファレンスを指定する以外にパラメータの設定値も指定しなければならない点で異なります。

単一パラメータの値を設定する

次のように、第 1 引数にはパラメータのフルネーム、第 2 引数には適用する新しい値を指定する SetValue コマンドを使用できます。

SetValue( "light.Name", "Sparky" );

次のように、パラメータの Parameter.Value プロパティを使用できます。

// Get a pointer to the parameter first
var p = oObject.Parameters( "Name" );
p.Value = "Sparky";

// Or just set the value directly
oObject.Parameters( "Name" ).Value = "Sparky";

コマンドまたはオブジェクト モデルのいずれを使用するかによって、パラメータのフル パスを判断する必要があります。 詳細については、「パラメータ名の検索」を参照してください。

複数のオブジェクトに対する同じ値の一括設定

Softimage ネイティブ コマンドを使用して値を設定する場合、値を相対的に変更したり、値の範囲を使用したり、ランダムな値を使用したりすることができます。 オブジェクト モデルを使用すると、オブジェクトのコレクション全体を対象に値を変更できます(ただし、その値がコレクション全体に関連付けられていることを前提とします)。

Softimage ネイティブ コマンドを使用して複数の球を一括移動するには

この例では、ワイルドカードを含む文字列 sphere*を使用して、「sphere」で始まるすべてのオブジェクトを対象として絞り込んでいます。 ターゲットに続く文字列「.kine.local.posy」は、変更されるパラメータが Y のローカル位置であることを示しています。最終的に、最後の引数は現在の値を 10 単位増やします。 代わりに現在値を 10 に設定する場合は、プラス(+)記号を付けずにその数値を使用してもかまいません。

SetValue "sphere*.kine.local.posy", "10+"

オブジェクト モデルを使用して複数の球を一括移動するには

この例では、オブジェクト名に依存していません(球に「Buck」、立方体に「sphere」などの名前が指定される可能性もあるためです)。このため、正確度は多少向上していますが、代わりにシーンにあるすべての球からコレクションが構築されます。 その後、既存の値に 10 を追加してコレクション内にある各球の Y のローカル位置の値を 1 つずつ増分します。

' Find all the spheres under the Scene Root
Set oRoot = ActiveProject.ActiveScene.Root
Set oSpheres = oRoot.FindChildren( , "Sphere" )

' Loop through the whole collection and add 10 to 
' each sphere's position in Y
For Each s in Spheres
	s.posy = s.posy.Value + 10
Next

上の例では、Y のローカル位置用のパラメータ値は、「posy」(ショートカット名)で表されます。ショートカットおよびその使用方法の詳細については、「ショートカットの使用」を参照してください。

パラメータ名の検索

コーディング用のパラメータ名は、Animation パネル上のマークパラメータ表示ボックスの中に表示されるパラメータと同じ名前です。 名前でそのパラメータを参照する方法は、Softimage ネイティブ コマンド内で使用するか、オブジェクト モデルで使用するかによって異なります。

Softimage ネイティブ コマンド内のパラメータの名前には、ターゲットとなるシーン オブジェクトを識別するための文字列式が使用されます。その文字列式を拡張するだけで、それらのオブジェクト上にあるパラメータを含めることができます。

注:

パラメータ用のスクリプト名は、Explorer に表示されるパス名と必ずしも同じではありません。 スクリプト名はスペースを含めることのできない内部的な名前ですが、Explorer にユーザ インタフェースのラベルが表示されます。

スクリプト名とインタフェース ラベル間の相違点の詳細については、Parameter.ScriptName を参照してください。Explorer にスクリプト名を表示する方法については、「Scene Explorer を使用したパラメータ名の判定」を参照してください。

例: Softimage ネイティブ コマンド内のパラメータ名

SetValue "myModel.cone.kine.local.ori.euler.rotx", 90

この場合、

  • myModel はモデルです。 このモデルが Scene_Root の場合は、省略可能です。

  • cone はオブジェクトです。 現在の選択範囲では、オブジェクト名を省略し、残りのパラメータ名の前にピリオドを置くことができます。 たとえば、.kine.local.ori.euler.rotx には現在の選択されているオブジェクト用のローカル X 回転を指定します。

  • kine.local.ori.euler は次のように分解できる複合体のエレメントを格納します。

    場合によっては、この複雑なパスの一部を省略できることもあります(「ショートカットの使用」を参照)。

  • rotx はパラメータです。

プロジェクト アイテムのパラメータの大半でその情報にアクセスする場合、オブジェクト モデルでは ParameterCollection を使用します。Softimage ネイティブ コマンドと同様、まずターゲットを特定してから、コレクションとしてのそのパラメータにアクセスする必要があります。

Autodesk Softimage SDK のすべてのコレクションと同様、メンバのインデックス(0 から開始する番号を基準とした位置)またはメンバ名を使用して、メンバの識別を可能にしています。 ParameterCollection の場合、Softimage ネイティブ コマンド内に使用されているパラメータのスクリプト名を使用できます。

例: オブジェクト モデル内の完全なパラメータ名

Set oRoot = ActiveProject.ActiveScene.Root
Set oCone = oRoot.AddGeometry("Cone", "MeshSurface")
oCone.Kinematics.Local.Parameters("rotx") = 90

この場合、

  • oCone は、オブジェクト変数です。

  • Kinematics.Local は、プロパティ セットです。

  • Parameters は、プロパティ セット内のパラメータのコレクションです。

  • rotx は、呼び出される特定のパラメータです。

ショートカットを使用すると、オブジェクトおよびそのパラメータ間にある階層の一部を省けます。 詳細については、「ショートカットの使用」を参照してください。

例: オブジェクト モデル内のパラメータのショートカット名

Set oRoot = ActiveProject.ActiveScene.Root
Set oCone = oRoot.AddGeometry("Cone", "MeshSurface")
oCone.rotx = 90

この場合、

  • oCone は、オブジェクト変数です。

  • rotx は、パラメータへのショートカットです。

ヒストリを使用してパラメータ名を判定する

パラメータ名を判定するには、プロパティ エディタでパラメータの値を変更して、コマンド ヒストリの中にログ出力される内容を確認するのも 1 つの方法です。以下のようにします。

  1. オブジェクト(または Explorer 内の任意のノード。目的のオブジェクトを探すには、スコープおよびフィルタ オプションを使用)を選択します。

  2. Enter キーを押してプロパティ エディタを開くとオブジェクトのプロパティが表示されます。[Alt]+[Enter]を押してプロパティ エディタを開くとオブジェクトのプロパティがすべて表示されます。

  3. 該当するプロパティ ページ上でパラメータを修正します。

  4. 結果コマンドが Script Editor のヒストリ ペインに表示されます。 表示形式は以下のとおりです。

    SetValue "[Model.]Object.Property.Parameter", Value
    注:

    Explorer でパラメータにマークを付けてから SetMarking コマンド結果の引数を検査して、パラメータ名を判定することもできます。ただし、SetMarking コマンド実行時は、ログ出力される名前は現在選択されているノードを基準としたものであるため、プロパティ セットが一部しか表示されない場合もあります。

Scene Explorer を使用してパラメータ名を判定する

スクリプトのパラメータ名を判定する方法としては、上記以外にも、スコープを Selection または Scene のどちらかに設定した状態で Explorer にスクリプト名を表示する方法があります。

  • Selection では、現在選択されているエレメントの関連ノードだけが表示されます。

  • Scene では、シーン ルートからの全シーン エレメントとプロパティ ノードが表示されます。

Explorer ウィンドウのメニューから項目を選択し、表示するシーン構造を選択することができます。

A

表示するシーン構造を選択するには、[スコープ](scope)ボタンをクリックします。

B

メニューにチェックマークの付いている項目は、現在表示されているビューを示します。

C

メニューの太字の項目は、前回表示されていたビューを示します。 [スコープ](scope)ボタンを中央クリックすると、このビューをすばやく選択できます。

  • [ビュー](Show)[スクリプト名の使用](Use Script Names)を選択すると、ノードとパラメータにスクリプト名が使用されます。 たとえば、[Kinematics]>[Global Transform]>[Pos]>[X]にスクリプト名を使用すると、[kine]>[global]>[pos]>[posx]になります。

階層が短縮された場合にマウス ポインタをパラメータの上に移動すると、プロパティ パスとパラメータの名前を確認できます。ツールチップが開き、パラメータのパスと名前が表示されます。 スクリプト名の使用がオンの場合は、ツールチップにスクリプトのパスと名前が表示されます。 スクリプトに必要ない文字列(kine など)は、ツールチップに表示されるパスから省略されます。

同じ名前の複数プロパティの参照

名前が同じ複数のパラメータ セットの 1 つに属するパラメータへアクセスしたい場合があります。 たとえば、同じタイプの複数のコンストレイント(位置コンストレイントなど)をシーン オブジェクトに適用する場合です。 たとえば、同じタイプのコンストレイントが「Position Cns」という名前でコンストレイント スタックに 3 つ存在することもあります。

ミュート設定などを目的にどの位置コンストレイントにアクセスするかを識別するには、[Scene Explorer]内でその位置コンストレイントの横に表示されるインデックス番号(開始番号は 0)を指定する必要があります。

Softimage ネイティブ コマンドを使用して複数のプロパティを参照するには

名前が同じ複数のプロパティが存在する場合、それらのプロパティは角カッコ内のインデックス番号を使って区別できます。 たとえば、次のコード行は、「ball」という名前のオブジェクトの下にある 3 番目の位置コンストレイントをミュートします。

SetValue "ball.kine.poscns[2].active", false

オブジェクト モデルを使用して複数のプロパティを参照するには

名前が同じ複数のプロパティが存在する場合、それらのプロパティは丸カッコ内のインデックス番号を使って区別できます。 たとえば、次のコード行は、「ball」という名前のオブジェクトの下にある 3 番目の位置コンストレイントをミュートします。

Set oBall = ActiveSceneRoot.FindChild( "ball" )
oBall.Kinematics.Constraints.Filter( siPosCnsType )(2).Active = false

ショートカットの使用

Softimage の複雑なオブジェクトは、数百個、時に数千個の個々のパラメータによって記述される場合があります。 これらのパラメータは、プロパティ、オペレータ、プリミティブ、シェーダ、別のエレメント(この複雑なオブジェクトを記述する別のオブジェクト)から構成される階層全体にわたって分布された状態で存在します。

オブジェクト モデルを使用するとこの階層内を移動できるので、各 ProjectItem オブジェクトを検索し、そのパラメータを見つけ出すことができます。 ただし、使用頻度の高いパラメータの一部は、利便性を考慮して階層の上位に昇格された形もとっており、X3DObject 親に直接関連付けられたパラメータのように扱うことが可能です。 これらはショートカットと呼ばれます。

スクリプトではショートカットを使用することも、プロパティとパラメータのフルネーム構文を使用することも可能ですが、コンパイル済みコードではパラメータのフルネーム構文のみがサポートされています。 ショートカットを使用するとフル ネームを指定する必要がなく、中間ノードの名前を省略できます。ショートカットはスクリプトの作成時にコマンドとオブジェクト モデルの両方で使用できます。

重要:

Kinematics のショートカットは、Local 変換ノードの下にネストされたパラメータのみを参照します。 たとえば、oCone.posxを展開すると、常にoCone.Kinematics.Local.Parameters(“posx”)になります。

Global 変換パラメータにアクセスする場合は、パラメータのフルネーム構文(oCone.Kinematics.Global.Parameters(“posx”)など)を使用する必要があります。

プロパティ セットとパラメータ名のショートカットの使用

プロパティ セット名に含まれるノード名のうち、以下のものは省略可能です。

  • Softimage ネイティブ コマンド内の surfmeshpolymshcrvlist などのジオメトリ タイプ

  • 変換用のローカルまたはグローバル座標系。 省略した場合は、デフォルトではローカルが使用されます。

  • kine または Kinematics とパラメータ自体との間にある、変換用の他ノード(たとえば euler)

たとえば、cone が選択されている場合、以下のステートメントは同等です。

SetValue "cone.kine.local.ori.euler.rotx", 90
SetValue ".kine.rotx", 90
Selection(0).Kinematics.Local.Parameters("rotx").Value = 90
Selection(0).rotx.Value = 90

コンパイル済みコード内におけるショートカットの参照

C++ では、残念ながらショートカットを使用できません。 パラメータは通常の構文で参照する必要があります(これはショートカットとして表示されるパラメータにも当てはまります)。

たとえば、「立方体」オブジェクトの各パラメータの名前と値を出力するために、以下のコード断片を使用できます。

using namespace XSI;
Application app;
Model root = app.GetActiveSceneRoot();

X3DObject myCube;
root.AddGeometry( L"Cube", L"MeshSurface", CString(L"MyCube"), myCube );

// print the names of all parameter exposed by the cube object
CRefArray params = myCube.GetParameters();

for (long i = 0 ; i < params.GetCount(); ++i )
{
	Parameter param(params[i]);
	app.LogMessage
	( 
		param.GetScriptName() + L" = " + param.GetValue().GetAsText() 
	);
}

オブジェクト モデルのショートカット使用法に関する詳細情報を入手する

オブジェクト モデルのショートカットに対応しているエレメントには、以下のようにいくつかの種類があります。

  • 3D オブジェクト(カメラ、コントロール オブジェクト、ラティス、ライト、モデル プリセット(人物用スケルトンのプリセット、プリミティブなど)

  • オペレータ(Curve Generator、Deform、Surface Generator、Topology など)

  • Scene プロパティ(アンビエント ライティング、アノテーション、表示、ジオメトリ アプロクシメーション、マテリアル、テクスチャ投影、表示/非表示、ウェイトマップなど)

  • すべてのカスタム プロパティ

  • すべてのシェーダ(異方性、Blinn、コンスタント、Cook-Torrance、Lambert、Phong、ストロースなど)

  • スケルトン(ChainBone、ChainEffector、ChainRoot など)

  • コンストレイント(2 ポイント、3 ポイント、バウンディング ボリューム、カーブ パス、方向、距離、オブジェクトをクラスタに、向き、ポーズ、位置、スケーリング、サーフェイス パス、アップ ベクトルなど)

すべてのパラメータがすべてのオブジェクトでサポートされているわけではありません。 各カテゴリで使用できるプロパティについては、「ショートカット リファレンス」で説明しています。