カスタム プロパティを動的に変更する

 
 
 

PPG オブジェクトおよび PPGLayout オブジェクトを使用して、パラメータ値の変更、パラメータの追加/削除、およびプロパティページ上のコントロールのレイアウト変更を動的に実行できます。

パラメータ値を変更する

基本パラメータ付きコントロールについては、パラメータ値を直接更新することができます。 ほとんどの場合、新しい値はすぐプロパティ ページに表示されます。

注:

これに対する例外は、標準の数値コントロールを指定して siUISyncSlider 属性を false に設定した場合です。その場合、レイアウトを更新しない限り、新しい値が表示されません。

パラメータの戻り値は、その基本パラメータのタイプに応じて、基本パラメータのデータ値またはオブジェクト インスタンスのどちらかに決定されます。 たとえば、ブール型パラメータが true または false のどちらかを返すのに対して、FCurve パラメータは FCurve のインスタンスを返します。

基本パラメータから値を取得するには、PPG オブジェクト(プロパティ ページ Logic セクションのコンテキスト内のグローバル変数)を使用します。PPG オブジェクトを使用してパラメータにアクセスすることができ、アクセスしたパラメータを使用してパラメータ値を取得することができます。

ヒント:

そうした呼び出しは、次のように長い形式になる場合があります。

PPG.Inspected(0).Parameter( "MyPC" ).Value;

ショートカットは次のような形式です。

PPG.MyPC.Value;

たとえば、DaisyChain という文字列パラメータを作成して、パラメータ値が変更されるたびにパラメータ値を記録したい場合があります。 スクリプトの主要箇所を次に示します。

// Create the underlying parameters (eg., under the _Define callback)
var oCusProp = in_Context.Source
oCusProp.AddParameter3( "DaisyChain", siString, "Wheelbarrow6" );

// <snip>

// Create the property page layout (eg., under the _DefineLayout callback)
var oPPGLayout = in_Context.Source
oPPGLayout.AddItem( "DaisyChain" );

// <snip>

// Event handler must be attached to logic
function DaisyChain_OnChanged() {
	LogMessage( PPG.DaisyChain.Value );
}

レイアウトを変更する

行コントロール以外のコントロールはそれぞれ、PPGLayout オブジェクトから名前でアクセスでき、一般的にいくつかの UI コンポーネント(たとえば、ラベルや幅)を持ちます。レイアウトを介して、または(PPGLayout.Item を使用して)コントロールに名前で直接アクセスして、すべてのコントロールを列挙できます。

各コントロールにアクセスできれば、それらのコントロールの属性にアクセスできます。これにより、外観(つまり、レイアウト)を制御できます。ただし、属性のタイプはきわめて多様です。 たとえば、属性によってはコントロールの高さ、幅、および一般的スタイルを制御するものもあれば、Softimage を更新するかどうかをインタラクティブに決定するものもあります。 また、コントロールに表示されるビットマップの場所を指定する属性もあります。 使用可能な項目属性の完全なリストについては、「コントロール属性を設定する」のセクションの冒頭を参照してください。

コントロールに属性を設定するには、PPGItem.SetAttribute メソッドを使用します。SetAttribute は、設定する属性の名前と使用する値の、2 つの引数を取ります。PPGItem オブジェクトの取得方法は、開発プロセスにおける現在のステージに応じて決定されます。レイアウトを定義する際には、作成した項目へのポインタを取得することができます。Logic では PPG(グローバル)オブジェクトを使用して PPGLayout を取得し、そこから PPGItem オブジェクトを取得する必要があります。

重要:

プロパティ ページの Logic セクションを介してレイアウトを変更する場合、PPG.Refresh メソッドを使用して、画面上のレイアウトを忘れずに更新してください。

たとえば、ユーザがボタンをクリックしたときに別のイメージにインタラクティブに変更できるビットマップ コントロールを作成したいとします。 スクリプトの主要箇所を次に示します。

// Create the underlying parameters (eg., inside the Define callback)
var oCusProp = in_Context.Source
oCusProp.AddParameter3( "CompanyLogo", siString );

// <snip>

// Create the property page layout (eg., under the _DefineLayout callback)
var oPPGLayout = in_Context.Source

// Need to set up the location of the bitmap image when layout is defined
var oItem = oPPGLayout.AddItem( "CompanyLogo", "", siControlBitmap );
oItem.SetAttribute( siUIFilePath, "C:\temp\images\pauper.bmp" );
oPPGLayout.AddButton( "ChgImg", "Change Image" );

// <snip>

// Event handler must be attached to logic
function ChgImg_OnClicked() 
{
	// Get a pointer to the control as a PPGItem
	var oCtrl = PPG.PPGLayout.Item( "CompanyLogo" );
	if ( oCtrl.GetAttribute(siUIFilePath) == "C:\temp\images\pauper.bmp" ) {
		oCtrl.SetAttribute( siUIFilePath, "C:\temp\images\prince.bmp" );
	} else {
		oCtrl.SetAttribute( siUIFilePath, "C:\temp\images\pauper.bmp" );
	}

	// Finish by refreshing the layout
	PPG.Refresh();
}

パラメータを追加する

また、プロパティ ページを検証すると同時に、カスタム プロパティ セットのパラメータを追加、削除、または再定義することもできます。 PPG オブジェクト(Logic セクションに対して定義されたコールバック内部で常に使用可能)では、CustomProperty オブジェクトを戻り値とする PPG.Inspected プロパティを介して、基本カスタムプロパティにアクセスできます。

注:

レイアウト コントロールに関連付けられているパラメータを削除した場合は、レイアウトを更新してもコントロールは表示されません。 同様に、新しいパラメータを追加したとしても、レイアウトを更新しない限り、そのパラメータがプロパティ ページに表示されません。

PPG オブジェクトを使用すると、PPGLayout オブジェクトを戻り値とする PPG.PPGLayout プロパティを介して、関連するレイアウトにアクセスできます。

次に、自己インストールプラグインのサンプルを示します。このサンプルでは、ユーザが AddField ボタンをクリックすると処理中に文字列フィールドを追加でき、ロジックが装備されます(ただし、機能的には明らかに脆弱です)。

function MyProperty_AddField_OnClicked() 
{
	// Get the CustomProperty and PPGLayout objects
	var oCusProp = PPG.Inspected(0);
	var oLayout = PPG.PPGLayout;

	// Add a new string parameter to the CustomProperty
	sNewName = "Item_" + oLayout.Count.toString();
	oCusProp.AddParameter3( sNewName, siString );

	// Add a new string control to the PPGLayout with logic
	oLayout.AddItem( sNewName );
	oLayout.Logic = oLayout.Logic.toString()
			+ "function " + sNewName + "_OnChanged() {\n"
			+ "    Application.LogMessage( PPG." + sNewName + ".Value );\n"
			+ "}";


	// Redraw the page
	PPG.Refresh();
}