PPGLayout

Object Hierarchy | 関連する C++クラス:PPGLayout

導入

v4.0

詳細

PPGLayout オブジェクトは、オブジェクトを検証する場合の視覚的な外観の状態です(PPGはプロパティページの略称です)。PPGレイアウトを使用すると、複数のオブジェクトをグループ化したり、特殊なコントロールを使用したり、使用済みのパラメータを非表示にしたり、Buttons を追加して、目で見て分かり易い形態でオブジェクトの状態を視覚的に表したものを作成したりできます。

Layout は、Softimage ではPPGItemオブジェクトの直線状のリストとしてモデル化されます。個々の PPGItem はインスペクト対象オブジェクトのパラメータか、タブやボタンなどの特殊なUI項目です。ほとんどの場合、レイアウトにはハードコーディングされたピクセル位置やPPGItem の寸法は指定しません。その代わりに、Softimage は適切なレイアウトで自動的にコントロールを描画します。これにより、ユーザがプロパティページをサイズ変更しても、満足のいく方法で表示を変更できます。ただし、PPGItem.WidthPercentageなどのヒントを与えるものや、PPGItem.SetAttributeを使用して明示的にサイズを指定するものもサポートします。

プロパティページで使用できるさまざまなコントロールが用意されています(「siPPGControlType」を参照)。すべてのコントロールはPPGLayout.AddItemを使用して追加できますが、PPGLayout.AddColorなど、一般的なコントロールには、より使用しやすいメソッドが用意されているものもあります。

実質的にすべてのビルトイン Softimage オブジェクトには、独自のレイアウトがあります。ただし、特定のレイアウトがない場合、すべてのパラメータが簡単にリストされたデフォルトのレイアウトで表示されます。

レイアウトは、Softimage の実行中はメモリ内に保持されます。内部オブジェクトの場合は、Softimage が再起動されたときに sPDL ファイルから再ロードされます。PluginItemとして実装されるCustomPropertyオブジェクトのレイアウトは、DefineLayoutコールバックを実装することによって定義します。

既存のレイアウト 構造は、最後に新しい項目を追加したり、すでにレイアウトに含まれている項目の属性を変更したりする以外は、直接変更することはできません。ただし、レイアウトを変更する場合は、PPGLayout.Clearを呼び出してから、変更内容を含めてレイアウト全体を再構築するとうまく行く場合があります。また、Parameter.Enableメソッドを使用して、レイアウトから削除せずにパラメータを非表示にすることもできます。

Logic コード(「PPGLayout.Logic」を参照)内からレイアウトを変更した場合、変更内容を反映させるにはPPG.Refreshを呼び出す必要があります。

通常、レイアウトはシーン内に残るオブジェクトに関連付けられます。ただし、このオブジェクトを使用して、一時的なダイアログボックスのユーザインターフェイスを定義することも可能です。たとえば、スクリプトで読み込み/書き出しオプションを指定するようユーザに促すこともできます。このような場合は、一時的なCustomPropertyオブジェクトとInspectObjコマンドを組み合わせて使用します。次の例ではこの方法について示します。

メソッド

AddButtonオペレータ AddColorオペレータ AddEnumControlオペレータ AddFCurveオペレータ
AddGroupオペレータ AddItemオペレータ AddRowオペレータ AddSpacerオペレータ
AddStaticTextオペレータ AddStringオペレータ AddTabオペレータ Clearオペレータ
Deleteオペレータ EndGroupオペレータ EndRowオペレータ GetAttributeオペレータ
SetAttributeオペレータ SetViewPositionオペレータ SetViewSizeオペレータ  
       

プロパティ

Countオペレータ Itemオペレータ Languageオペレータ Logicオペレータ
ViewPositionオペレータ ViewSizeオペレータ    
       

1. JScript の例

/*
        This example demonstrates a typical use of a custom pset with custom layout as a way of 
        collecting some information from the user.
*/
// Step 1: Create a custom pset and define the data on it
var oPSet=ActiveSceneRoot.AddProperty("CustomProperty",false,"Demo") ;
// Color is made up of 4 components
oPSet.AddParameter3( "MyR", siDouble ) ;
oPSet.AddParameter3( "MyG", siDouble ) ;
oPSet.AddParameter3( "MyB", siDouble ) ;
oPSet.AddParameter3( "MyA", siDouble ) ;
oPSet.AddParameter3( "EnumCtrl", siInt4, 4 ) ;
// Step 2: Put the items on the layout with a custom UI
var oPPGLayout = oPSet.PPGLayout ;
oPPGLayout.AddGroup( "Pick a Color" ) ;
var oItem = oPPGLayout.AddColor( "MyR", "",true ) ;
oItem.SetAttribute("NoLabel", true ) ;
oPPGLayout.EndGroup() ;
oPPGLayout.AddEnumControl( "EnumCtrl", new Array( "item 1", 4, "item 2", 6 ), "Choice",  siControlCombo ) ;
// Step 3: Show the user the dialog.  They can change the
// parameter values and then click OK or Cancel
try {
        InspectObj( oPSet, "", "Check out this layout created from scripting", siModal );
        // Step 4: Read the values and do something with them.  Normally this
        //      would be where you call a custom command which does the operation
        Application.LogMessage( "User picked the color (" + oPSet.Parameters("MyR").Value + ","  + oPSet.Parameters("MyG").Value + "," 
                + oPSet.Parameters("MyB").Value + ","  + oPSet.Parameters("MyA").Value + ")" ) ;                
        if ( oPSet.Parameters( "EnumCtrl" ).Value == 4 ) {
                Application.LogMessage( "User selected item 1" ) ;
        } else {
                Application.LogMessage( "User selected item 2" ) ;
        }
} catch( e ) {
        // Tip: rather than using try/catch, you can specify false
        // as the 5th argument to InspectObj and it will not throw an exception
        Application.LogMessage( "User Cancelled" );
}
//Step 5: Remove the pset now that we are done with it
DeleteObj( oPSet ) ;

2. JScript の例

/* 
        A demonstration of the Number Control on a Custom Property Set. The number control 
        normally appears as a [Animation Divot] [Label] [Edit+Slider Control] but this 
        example demonstrates how this appearance can be controlled. It also shows how to 
        change the range of a parameter. All these changes can be made dynamically.
*/
NewScene( null, false ) ;
var oCustomProperty = ActiveSceneRoot.AddProperty( "CustomProperty", false, "NumberControlTester" ) ;
// Add a parameter of type double.  
// It has the min/max values of -1000 to 1000,
// default value of -1.0, and ui range -100 to 100
var oGridParam = oCustomProperty.AddParameter2( "number", siDouble, -1.0, -1000.0, 1000.0, -100.0, 100.0, siClassifUnknown, siPersistable | siAnimatable ) ;
// Add the Edit boxes and other controls that will
// be used to get information from the user
oCustomProperty.AddParameter3( "setLabel", siString, "NewLabel" ) ;
oCustomProperty.AddParameter3( "setNoLabel", siBool, false,null,null,false) ;
oCustomProperty.AddParameter3( "setValueOnly", siBool, false,null,null,false) ;
oCustomProperty.AddParameter3( "setNoSlider", siBool, false,null,null,false) ;
oCustomProperty.AddParameter3( "setThumbWheel", siBool, false,null,null,false) ;
oCustomProperty.AddParameter3( "setTreadmill", siBool, false,null,null,false) ;
oCustomProperty.AddParameter3( "setDecimals", siInt4, 3,0,10,false) ;
oCustomProperty.AddParameter3( "setLabelMinPixels", siInt4, 10,0,300,false) ;
oCustomProperty.AddParameter3( "setLabelPercentage", siInt4, 30,0,100,false) ;
oCustomProperty.AddParameter3( "setCX", siInt4, 0,0,500,false) ;
oCustomProperty.AddParameter3( "setCY", siInt4, 0,0,100,false) ;
oCustomProperty.AddParameter3( "setUIMin", siDouble, -100,-10000,10000,false) ;
oCustomProperty.AddParameter3( "setUIMax", siDouble, 100,-10000,10000,false) ;
oCustomProperty.AddParameter3( "setMin", siDouble, -1000,-10000,10000,false) ;
oCustomProperty.AddParameter3( "setMax", siDouble, 1000,-10000,10000,false) ;
//
// Build the layout for the test property page
// 
var oLayout = oCustomProperty.PPGLayout
oLayout.AddGroup( "Test Number Parameter" ) ;
        //The logic code will set all the detailed attributes
        oLayout.AddItem( "number" ) ;
oLayout.EndGroup() ;
oLayout.AddGroup( "Display Attributes" ) ;
        oLayout.AddItem( "setLabel","Label" ) ;
        oLayout.AddItem( "setNoLabel","NoLabel" ) ;
        oLayout.AddItem( "setNoSlider","NoSlider" ) ;
        oLayout.AddItem( "setThumbWheel","ThumbWheel" ) ;
        oLayout.AddItem( "setTreadmill","Treadmill" ) ;
        oLayout.AddItem( "setCX","Fixed Width" ) ;
        oLayout.AddItem( "setCY","Fixed Height" ) ;
        oLayout.AddItem( "setDecimals","Decimals" ) ;
        oLayout.AddItem( "setLabelMinPixels","Label Pixels (Min)" ) ;
        oLayout.AddItem( "setLabelPercentage","Label %" ) ;
        oLayout.AddButton( "Update" ) ;
oLayout.EndGroup() ;
// These values actually fundamentally affect the
// parameter itself.
// Note1:You could potentially change the script name
//      but that would break the logic code that depends
//      on the scripting name
// Note2:You can't change the type of a parameter.
//      Instead you could delete and recreate a new parameter
//      dynamically but that is not part of this example
oLayout.AddGroup( "Parameter Attributes" ) ;
        oLayout.AddItem( "setMin" ) ;
        oLayout.AddItem( "setMax" ) ;
        oLayout.AddItem( "setUIMin" ) ;
        oLayout.AddItem( "setUIMax" ) ;
        oLayout.AddButton( "PDefUpdate","Update" ) ;
oLayout.EndGroup() ;
oLayout.Language = "Jscript" ;
oLayout.Logic = NumberControlTester_Update_OnClicked.toString() + 
                NumberControlTester_PDefUpdate_OnClicked.toString();
oLayout.SetAttribute( "LogicPrefix", "NumberControlTester_" ) ;
InspectObj( oCustomProperty ) ;
//
// This is the logic code
// 
function NumberControlTester_Update_OnClicked()
{
        var oCustomProperty = PPG.Inspected(0) ;
        var oLayout = oCustomProperty.PPGLayout
        var oPPGItem = oLayout.Item( "number" ) ;
        // Based on the property page items, set the attributes
        // of the control
        oPPGItem.Label = oCustomProperty.setLabel.Value ;
        oPPGItem.SetAttribute( "NoLabel", oCustomProperty.setNoLabel.Value ) ;
        oPPGItem.SetAttribute( "ValueOnly", oCustomProperty.setValueOnly.Value ) ;
        oPPGItem.SetAttribute( "NoSlider", oCustomProperty.setNoSlider.Value ) ;
        oPPGItem.SetAttribute( "Decimals", oCustomProperty.setDecimals.Value ) ;        
        oPPGItem.SetAttribute( "ThumbWheel", oCustomProperty.setThumbWheel.Value ) ;    
        oPPGItem.SetAttribute( "Treadmill", oCustomProperty.setTreadmill.Value ) ;      
        oPPGItem.SetAttribute( "CX", oCustomProperty.setCX.Value ) ;    
        oPPGItem.SetAttribute( "CY", oCustomProperty.setCY.Value ) ;    
        oPPGItem.LabelMinPixels = oCustomProperty.setLabelMinPixels.Value ;
        oPPGItem.LabelPercentage = oCustomProperty.setLabelPercentage.Value ;
        // (There is also a logithmic attribute 
        // but it only works for integer parameters)
        // You need to rebuild the PPG contents to see the changes
        PPG.Refresh() ;
}
function NumberControlTester_PDefUpdate_OnClicked()
{
        var oCustomProperty = PPG.Inspected(0) ;
        var oLayout = oCustomProperty.PPGLayout
        var newUIMin = oCustomProperty.setUIMin.Value ;
        var newUIMax = oCustomProperty.setUIMax.Value ;
        var newMin = oCustomProperty.setMin.Value ;
        var newMax = oCustomProperty.setMax.Value ;
        if ( newUIMin > newUIMax ) {
                Logmessage( "UIMin must be less than UIMax!" ) ;
                return ;
        }
        if ( newMax < newUIMax ) {
                Logmessage( "UIMax can't be bigger than Max!" ) ;
                return ;                
        }
        if ( newMin > newUIMin ) {
                Logmessage( "UIMin can't be smaller than Min!" ) ;
                return ;                
        }
        // Call the command with the new parameter ranges
        EditParameterDefinition( oCustomProperty.number.FullName, null, null, newMin, newMax, newUIMin, newUIMax ) ;
        // You need to rebuild the PPG contents to see the changes
        PPG.Refresh() ;
}

関連項目

PPGItem ProjectItem.PPGLayout InspectObj