大きなあの人が書いてくれたコードをパクって改造してみますた。
var rtn = GetKeyboardState( );
ModKey = rtn(1);
var oObjects = FilterX3D( Selection );
if ( oObjects.count != 0 )
{
var oSymRingpulls = Ringpull285cm( oObjects, ModKey );
SelectObj( oSymRingpulls );
}
function Ringpull285cm( oObjects, ModKey )
{
// If no modkey pressed = hardcoded options
if ( ModKey == 0 )
{
PivotObj = "Maman";
xx = 1.0;
yy = 0.0;
zz = 0.0;
DuplicateConstraint = true;
ShareParent = true;
FreezeNegativeScaling = true;
IsRingpullTall = true; // Cancel flag = NOT cancelled
}
// If any modkey pressed = PPG
else
{
var oP = XSIFactory.CreateObject( "CustomProperty" );
oP.name = "身長285cm";
var oParam;
oParam = oP.AddParameter2( "sPlane", siString, "X" );
oParam = oP.AddParameter2( "sPivot", siString, "Parent" );
oParam = oP.AddParameter2( "bDupConst", siBool, true );
oParam = oP.AddParameter2( "bShareParent", siBool, true );
oParam = oP.AddParameter2( "bFreezeNegScl", siBool, true );
var oLayout, oItem;
oL = oP.PPGLayout;
var aItems1 = Array( "YZ (X)","X", "XZ (Y)","Y", "XY (Z)", "Z" );
var aItems2 = Array( "Parent", "Parent", "Self", "Ringpull" );
oL.AddGroup();
oL.AddRow( );
oItem = oL.AddEnumControl( "sPlane", aItems1, "Plane", siControlCombo );
oItem = oL.AddEnumControl( "sPivot", aItems2, "Pivot", siControlCombo );
oL.EndRow( );
oL.EndGroup( );
oL.AddGroup();
oL.AddRow( );
oL.AddGroup( "", false, 40 );
oItem = oL.AddItem( "bDupConst", "Duplicate Constraints" );
oL.EndGroup( );
oL.AddGroup( "", false, 60 );
oL.EndGroup( );
oL.EndRow( );
oL.AddRow( );
oL.AddGroup( "", false, 30 );
oL.EndGroup( );
oL.AddGroup( "", false, 40);
oItem = oL.AddItem( "bShareParent", "Share Parent" );
oL.EndGroup( );
oL.AddGroup( "", false, 30 );
oL.EndGroup( );
oL.EndRow( );
oL.AddRow( );
oL.AddGroup( "", false, 60 );
oL.EndGroup( );
oL.AddGroup( "", false, 40 );
oItem = oL.AddItem( "bFreezeNegScl", "Freeze Negative Scaling" );
oL.EndGroup( );
oL.EndRow( );
oL.EndGroup( );
Inspect = InspectObj( oP,null, null, siModal, false );
if ( !Inspect )
{
switch( oP.sPlane.value)
{
case "X" : xx = 1.0; yy = 0.0; zz = 0.0; break;
case "Y" : xx = 0.0; yy = 1.0; zz = 0.0; break;
case "Z" : xx = 0.0; yy = 0.0; zz = 1.0; break;
}
switch ( oP.sPivot.value )
{
case "Parent" : PivotObj = "Maman"; break;
case "Ringpull" : PivotObj = "Ringpull"; break;
}
DuplicateConstraint = oP.bDupConst.value;
ShareParent = oP.bShareParent.value;
FreezeNegativeScaling = oP.bFreezeNegScl.value;
IsRingpullTall = true; // Cancel flag = NOT cancelled
}
else
{
IsRingpullTall = false; // Cancel flag = Cancelled
}
}
// Do Duplicate Symmetry (Mainly stolen from Ringpull's code )
if ( IsRingpullTall )
{
var oRingpulls = XSIFactory.CreateObject( "XSI.Collection" );
for ( var i=0; i<oObjects.count; i++ )
{
var oObj = oObjects(i);
if ( PivotObj == "Maman" )
{
var oPivotObject = oObj.Parent;
}
else if ( PivotObj == "Ringpull" )
{
var oPivotObject = oObj;
}
var oTrans = oPivotObject.Kinematics.Global.Transform;//軸になるオブジェクトのトランフォームげっと(=親 or りんぷる)
var vT = XSIMath.CreateVector3();
var vR = XSIMath.CreateVector3();
var vN = XSIMath.CreateVector3( xx, yy, zz );
var rA = XSIMath.CreateRotation();
oTrans.GetTranslation(vT);//選択オブジェクトの位置げっと
oTrans.GetRotationXYZAngles(vR);//選択オブジェクトの回転げっと
rA.SetFromXYZAngles( vR);
vN.MulByRotationInPlace( rA);//プレーンをげっとした回転で回す
vN.NormalizeInPlace();
d = vT.Dot(vN);
var oRingpull = DuplicateSymmetry( oObj, DuplicateConstraint, ShareParent, vN.x, vN.y, vN.z, d, FreezeNegativeScaling )(0);
oRingpulls.Add( oRingpull );
}
return oRingpulls;
}
}
function FilterX3D( in_Objs )
{
var oCol = XSIFactory.CreateObject( "XSI.Collection" );
for ( var i=0; i<in_Objs.count; i++ )
{
if ( in_Objs(i).IsClassOf( siX3DObjectID ) )
{
oCol.Add( in_Objs(i) );
}
}
return oCol;
}
オブジェクト(複数可)を選んで実行します。
何も押さないで実行すると、速攻で親を軸としたXローカルなシンメトリ複製が実行されます。
Shift とか何か押して実行すると PPG が降臨してオプション指定が可能です。
一応、標準の Duplicate Symmetry のオプションは再現したつもりですが。
こちらにも Python で書かれたバージョンがあります。
http://d.hatena.ne.jp/fmt0808/20110220/1298220836
うーむ、なんか美しい感じがしますよね。わかっている/慣れている人は違う。 丁寧なコメントが付いているので Python そのものの勉強にもなります。
あとはクローンできるようにした方がいいのかな。
日々使いながら改造します。
しばらくは毎日使います。
.
最近のコメント