カスタム プロパティの動的変更

 
 
 

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

パラメータ値を変更する

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

注:

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

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

基本パラメータから値を取得するには、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 セクションで定義されているコールバック内にあります)を使用すると、PPG.Inspected プロパティ(CustomProperty オブジェクトを返します)を介して基本カスタム プロパティにアクセスすることができます。

注:

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

PPG オブジェクトを使用すると、PPG.PPGLayout プロパティ(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();
}