パッていしょん。
またもパーティションがらみのスクリプト(のベータ版)です。
if ( Selection.count !=0 && Selection(0).type == "Partition" )
{
DefPartitionName = Selection(0).name;
}
else
{
DefPartitionName = "";
}
// ############################################################
var oP = XSIFactory.CreateObject( "CustomProperty" );
oP.name = "パッていしょん";
oP.AddParameter2( "sPassNames", siString, "" );
oP.AddParameter2( "sPass", siString, "" );
oP.AddParameter2( "sPartitionName", siString, DefPartitionName );
oP.AddParameter2( "bSkip", siBool, true );
// ############################################################
var oAllPasses = ActiveProject.ActiveScene.Passes;
PassNames = "";
var aListItems = new Array( );
for ( var i=0; i<oAllPasses.count; i++ )
{
aListItems.push( oAllPasses(i).name ); // for ListBox
aListItems.push( oAllPasses(i).name ); // for ListBox
PassNames += oAllPasses(i).name; // for internal reserve
if ( i != oAllPasses.count -1 )
{
PassNames += ";"; // separator
}
}
// Store the value in a parameter for the sake of being able to access from PPG logic
oP.sPassNames.value = PassNames;
// ############################################################
var oL, oItem;
var oL = oP.PPGLayout;
oL.AddGroup( "Target Passes", true, 50 );
oL.AddRow( );
oItem = oL.AddButton( "SelectAllPass", "All ON" );
oItem.SetAttribute( siUICX, 150 );
oItem.SetAttribute( siUICY, 16 );
oItem = oL.AddButton( "DeselectAllPass", "All OFF" );
oItem.SetAttribute( siUICX, 150 );
oItem.SetAttribute( siUICY, 16 );
oL.EndRow( );
var oListBox = oL.AddItem( "sPass", "", siControlListBox );
oListBox.SetAttribute( siUICY, oAllPasses.count * 20 );
oListBox.UIItems = aListItems;
oListBox.SetAttribute( siUIMultiSelectionListBox, true );
oListBox.SetAttribute( siUINoLabel, true );
oL.EndGroup( )
oL.AddGroup( "Target Partitions", true, 50 );
oL.AddRow( )
oItem = oL.AddItem( "sPartitionName", "Name" );
oItem.SetAttribute( siUINoLabel, true );
oItem = oL.AddButton( "Pick" );
oL.EndRow( )
oItem = oL.AddItem( "bSkip", "Do not create partition if already exists" );
oL.AddRow( )
oItem = oL.AddButton( "Create", "Create Partition" );
oItem.SetAttribute( siUICX, 95);
oItem.SetAttribute( siUICY, 30 );
oItem = oL.AddButton( "Move", "Create && Move Selection to Partition" );
oItem.SetAttribute( siUICX, 205 );
oItem.SetAttribute( siUICY, 30 );
oL.EndRow( )
oL.EndGroup( )
oL.Language = "JScript";
oL.Logic = OnInit.toString( ) +
allon_OnClicked.toString() +
alloff_OnClicked.toString() +
Pick_OnClicked.toString() +
Create_OnClicked.toString()+
Move_OnClicked.toString()+
DoTheGodDamnThing.toString()+
PickPartition.toString();
function OnInit( )
{
allon_OnClicked( )
}
function allon_OnClicked( )
{
PPG.sPass.value = PPG.sPassNames.value;
}
function alloff_OnClicked( )
{
PPG.sPass.value = "";
}
function Pick_OnClicked( )
{
var oPartition = PickPartition( );
if ( oPartition != null )
{
PPG.sPartitionName.value = oPartition.name
}
else
{
Logmessage( "ドルァ" );
}
}
function Move_OnClicked( )
{
DoTheGodDamnThing( "move" );
}
function Create_OnClicked( )
{
DoTheGodDamnThing( "create" );
}
function DoTheGodDamnThing( mode )
{
var oTargetPasses = XSIFactory.CreateObject( "XSI.Collection" );
var aPassNames = GetSelectedPassInPPG( );
for ( var i=0; i<aPassNames.length; i++ )
{
var oPass = Dictionary.GetObject( "Passes." + aPassNames[i], false );
if ( oPass != null && oPass.type == "Pass" )
{
oTargetPasses.Add( oPass );
}
}
if ( oTargetPasses.count == 0 )
{
Logmessage( "Pass がひとつも選ばれてねえよ", siError );
}
else
{
PartitionName = PPG.sPartitionName.value;
Flag = 0;
if ( PartitionName == "" )
{
var oPartition = PickPartition( );
if ( oPartition != null )
{
PartitionName = oPartition.name;
}
else
{
Flag = 1;
}
}
if ( Flag == 0 )
{
for ( var i=0; i<oTargetPasses.count; i++ )
{
var oPass = oTargetPasses(i);
var oPartition = oPass.Partitions( PartitionName );
if ( oPartition == null )
{
var oPartition = oPass.CreatePartition( PartitionName, siObjectPartition );
Logmessage( oPass.name + " に " + oPartition.name + " 作りマスター!!!!");
}
else
{
Logmessage( "******** " + oPartition + " は既に存在してまスター!!!!。" );
if ( ! PPG.bSkip.value )
{
PartitionName += "1";
var oPartition = oPass.CreatePartition( PartitionName, siObjectPartition );
Logmessage( oPass.name + " に " + oPartition.name + " 作りマスター!!!!");
}
}
if ( mode == "move" )
{
var oObjects = FilterX3D( Selection );
if ( oObjects.count != 0 )
{
for ( var j=0; j<oObjects.count; j++ )
{
if ( !oPartition.IsMember( oObjects(j) ) )
{
oPartition.AddMember( oObjects(j) );
Logmessage( oObjects(j).name + " を " + oPartition + " に入れマスター!!!!" );
}
else
{
Logmessage( "******** " + oObjects(j).name + " は既に " + oPartition + " に入ってまスター!!!!" );
}
}
}
}
}
}
}
// ############################################################
function FilterX3D( in_Objects )
{
var oX3DObjects = XSIFactory.CreateObject( "XSI.Collection" );
for ( var j=0; j<Selection.count; j++ )
{
if ( Selection(j).IsClassOf( siX3DObjectID ) && !Selection(j).IsClassOf( siLightID ) )
{
oX3DObjects.Add( Selection(j) );
}
}
return oX3DObjects;
}
function GetSelectedPassInPPG( )
{
var aPassNames = PPG.sPass.value.split( ";" );
return aPassNames;
}
}
function PickPartition( )
{
var rtn = PickElement( siGroupFilter, "パーティションをピックして。", "パーティションだって言ってんだよオルァ" );
var oPicked = rtn.Value( "PickedElement" );
var button = rtn.Value( "ButtonPressed" );
if ( button == 0 )
{
Logmessage( "モルァ" ); //button が 0 =ピックセッションがキャンセルされた場合
}
else if ( oPicked.type == "Partition" )
{
return oPicked;
}
}
InspectObj( oP, null, null, siLock );
何に使うかと言いますと、
全Pass(あるいは PPG の中で指定した Pass)に対して
新しいパーティションを作ります
あるいは、新しいパーティションを作りながら、現在選択中のオブジェクトをブチ込んでいきます
あるいは、既に存在しているパーティションに、現在選択中のオブジェクトをブチ込んでいきます
前回書いたのと似たような状況で使うのですが、つまり既に Pass 分けが進んでしまったシーンに対して、新規で追加したオブジェクトを全Passで特定のパーティションに入れていったりするものですね。 新規オブジェクトでなくても、Pass の運用方針が若干変わったりして、あーーこのオブジェクト、全 Pass で Background に戻してえよ、とかそういうのよくあるじゃないですか。 そういうときに使います。 Pass が1つや2つならともかく、6個や7個以上あるときは、Pass をひとつひとつ切り替えてブツをパーティションに追加していくとか、もうやってられません。
起動すると PPG が表れます。
Target Passes の所に全 Pass がリスト表示されるので、対象にしたい Pass を選んでおきます。 起動時は、全 Pass が既に選ばれている状態になっています。
Target Partitions のところで、パーティションの名前を入力します。テキストフィールドに手打ちしてもいいし、Pick ボタンを押すとピックを促されるので、パーティションをクリックして下さい。するとそのパーティションの名前がフィールドに入ります。
あるいは空っぽのままでもいいです。 その場合はボタンを押した後にピックを促されるのでそこでパーティションをピックします。
Create Partition ボタンを押すと、指定した Pass 以下に、テキストフィールドに入力した名前のパーティションを作成します。 作成するだけでオブジェクトをパーティションにブチ込んだりはしません。 Do not create ... のチェックがオンだと、すでにその名前のパーティションが存在していた場合はスキップします。つまり重複したパーティションは作りません。 このチェックがオフだと、重複していてもパーティションを作成します。 末尾に1 が付いた同名のパーティションを作成します(同じ名前は存在できないので)。
Create & Move Selection to Partition ボタンを押すと、パーティションを作成しながら、現在選択中のオブジェクトをそのパーティションに追加して行きます。この機能の方がよく使うでしょう。 Do not create ... チェックボックスの効果は上記と同じ=ダブってたら作らないか、ダブっていても作るかの指定です。
何も選んでない状態でこのボタンを押すと、パーティションが作成されるだけでオブジェクトが追加されることはありません(何も選んでないんだから当たり前)。 結果、となりの Create Partition ボタンを押したのと同じ挙動になります。
上に書いたように、パーティションの名前を入力しないままこれらのボタンを押した時は、ボタンを押した後にピックを促されるので、パーティションをひとつピックして下さい。するとそのパーティションの名前が全Pass(PPGの中で指定したPass)において対象になります。
大昔に同様の機能のスクリプトを書いてずっと使っていたのですが、いい加減設計が古かったので、つい最近このように書き直しました。書き直したてホヤホヤなのでなんか不具合ありそう。 っていうか、新たに作成されたパーティションを Inspect する機能とか付けるの忘れてた。 そのうちやろう。 あーー light の扱いも忘れてた。 現在、light はシカトされます。 いかんな。 light と普通のブツが混ざって選択されていた場合の対処を書かないと・・・・・。 現在はめんどくさくて light は無視するように書いている気がします。
Pass 分けな作業をしているお方がいらっしゃいましたら、テストしてくれると嬉しいッス。
最近ブログにナマなコードを書き逃げするだけで、ちゃんとまとめたりしてません orz
そのうち中身忘れるしなあ。もったいねえ。
まとめるかな。
来月だな。
.
| 固定リンク
コメント