2ちゃんねる掲示板(3DCG)より転載
SoftImageとMayaのスクリプトの比較。比較しやすいようにコメントを削除し記述方法を統一しました。
SoftImageユーザでこれからMelを学ばれる方。その逆の方。そしてツール選定をする過程での判断材料になれば幸いです。
例題1
例題2
例題3
例題4
例題5
261 :名無しさん@お腹いっぱい。:2011/07/25(月) 18:43:13.13 ID:FZJd6sF5
例題1
http://junkithejunkie.cocolog-nifty.com/blog/2011/05/post-cd87.html
「現在選択しているオブジェクトが所属するレイヤを勝手に探してそれを Isolate する」
Sel = Selection.GetAsText(); //選択中のブツを保存
var oLayers = XSIFactory.CreateObject( "XSI.Collection" ); //Layer入れる箱用意
oLayers.Unique = true; // 選択中のブツを全部ループしてレイヤをたどるが、同じレイヤに属している複数のブツから取得した場合にダブってしまうのを回避
for ( var i=0; i<Selection.count; i++ )
{
if ( Selection(i).IsClassOf( siX3DObjectID ) )
{
var oOwners = Selection(i).Owners;
for ( var j=0; j<oOwners.count; j++ )
{
//オーナーの中からレイヤを探して取得
if ( oOwners(j).IsClassOf( siLayerID ) )
{
oLayers.Add( oOwners(j) );
break;
}
}
}
}
Logmessage( oLayers );
Selection.SetAsText( oLayers ); // レイヤを選択状態にする(Isolateは選択に依存するため)
IsolateSelected( null, 0); //全部のビューで Isolate する
IsolateSelected( null, 1);
IsolateSelected( null, 2);
IsolateSelected( null, 3);
Selection.SetAsText( Sel ); //もともと選択していたものを選択し直しておしまい。
262 :名無しさん@お腹いっぱい。:2011/07/25(月) 18:44:20.60 ID:FZJd6sF5
Mayaの場合
{
string $obj[] = `ls -sl`;//選択したオブジェクトを取得
string $layer[] = `listConnections -d false -type displayLayer $obj`;
if(size($layer) > 0){
string $allLayer[] = `ls -type displayLayer`;//システム全体のレイヤ取得
for($onelayer in $allLayer){
if($onelayer == $layer[0]){
//IsolateしたいものをOn
setAttr ($onelayer + ".visibility") 1;
}else{
//隠したいものをOff
catch(`setAttr ($onelayer + ".visibility") 0`);
}
}
}
}
選択したオブジェクトにコネクトされたLayerノードを取得して、シーンに存在する
Layerと比較してVisiblityアトリビュートを切り替える
利用した主要なMelコマンドは4つ
ls
listConnections
setAttr
catch
263 :名無しさん@お腹いっぱい。:2011/07/25(月) 18:48:15.50 ID:FZJd6sF5
例題2
ttp://junkithejunkie.cocolog-nifty.com/blog/2011/07/post-b474.html
「Camera, CameraRoot, CameraInterest のいずれかを選んで実行すると、現在アクティブなビューポート(ABCDのどれか)がバシッとそのカメラに変わります。」
if ( Selection.count != 0 )
{
if ( Selection(0).Type == "camera" )
{
var oCam = Selection(0);
}
else if ( Selection(0).Type == "CameraRoot" )
{
var oCam = Selection(0).Camera;
}
else if ( Selection(0).Type == "CameraInterest" )
{
var oConstraining = GetConstrainedObjects( Selection(0) )(0);
if ( oConstraining.item(0).Type == "camera" )
{
var oCam = oConstraining.item(0);
}
}
}
if ( oCam ) // Camera を取得できてたら以下実行。取得できてなければ何も起こらず。
{
View = GetFocusedViewport( );
var oVM = Application.Desktop.ActiveLayout.Views.Find( "View Manager" );
oVM.SetAttributeValue( "activecamera:" + View, oCam.fullname );
}
264 :名無しさん@お腹いっぱい。:2011/07/25(月) 18:49:29.04 ID:FZJd6sF5
Mayaの場合
{
string $sel[] = `ls -sl`;//選択したオブジェクトを取得
$cam = `ls -type camera $sel`;//選択したオブジェクトからカメラを取得
if(size($cam) == 0){
//Transformノードの場合配下のcameraシェイプノードを取得
$cam = `listRelatives -c -type camera $sel`;
}
if(size($cam) > 0){
//カメラを切り替える
lookThroughModelPanelClipped $cam[0] modelPanel4 0.001 1000;
}
}
解説
選択したオブジェクトからカメラシェイプノードを取得して関数のパラメタに指定する。
シェイプノードでもTransformノードでも利用可能にしている。
使った主要なコマンド、関数。
ls
listRelatives
lookThroughModelPanelClipped 関数(スクリプトエディタにエコーされる)
265 :名無しさん@お腹いっぱい。:2011/07/26(火) 21:02:36.59 ID:Z2Nx1KFx
ttp://junkithejunkie.cocolog-nifty.com/blog/2011/04/post-c7fb.html
オブジェクト(複数可)を選んで実行するとそのオブジェクトが所属するレイヤがエコーされレイヤが選択状態になります。
実行するときに Shift など押しておくと、上記に加えて、該当レイヤがアクティブ(現在レイヤ)になります。
var rtn = GetKeyboardState( );
ModKey = rtn(1);
var oLayers = XSIFactory.CreateObject( "XSI.Collection" );
oLayers.Unique = true;
for ( var i=0; i<Selection.count; i++ )
{
if ( Selection(i).IsClassOf( siX3DObjectID ) )
{
var oOwners = Selection(i).Owners;
for ( var j=0; j<oOwners.count; j++ )
{
if ( oOwners(j).IsClassOf( siLayerID ) )
{
oLayers.Add( oOwners(j) );
Logmessage( Selection(i) + " -- Layer : " + oOwners(j) );
break;
}
}
}
}
SelectObj( oLayers );
InspectObj( oLayers );
if ( ModKey != 0 )
{
SetCurrentLayer( oLayers(0) );
}
266 :名無しさん@お腹いっぱい。:2011/07/26(火) 21:04:20.30 ID:Z2Nx1KFx
Mayaの場合
{
int $flg = true;
int $mods = `getModifiers`;
string $obj[] = `ls -sl`;
string $layer[] = `listConnections -d false -type displayLayer $obj`;
for($someLayer in $layer){
print("layer name : " + $someLayer + "\n");
if($mods == 8){
if($flg){
layerEditorLayerButtonSelect 0 $someLayer;
layerEditorDisplayLayerManagerChange;
$flg = false;
}else{
layerEditorLayerButtonSelect 4 $someLayer;
}
}
}
}
Altキーを押しながら実行すると選択したオブジェクトが存在するレイヤを選択した状態となる。
主要なMelコマンド
ls
getModifiers
listConnections
下記関数はスクリプトエディタにエコーされる。
layerEditorLayerButtonSelect
layerEditorDisplayLayerManagerChange
267 :名無しさん@お腹いっぱい。:2011/07/26(火) 21:07:05.82 ID:Z2Nx1KFx
例題4
ttp://junkithejunkie.cocolog-nifty.com/blog/2011/04/post-8b1f.html
「シーンの中にある Instance を全部選んでくれる」
var oInstances = XSIFactory.CreateObject( "XSI.Collection" ); // 淫スタンスを入れる箱
var oModels = ActiveSceneRoot.FindChildren( "", siModelType ); // シーンルート以下で Model を全部取得
for ( var i=0; i<oModels.count; i++ ) // 取得した Model を全部ループ
{
if( oModels(i).ModelKind == siModelKind_Instance ) // 淫スタンスなら、箱に入れる
{
oInstances.Add( oModels(i) );
}
}
SelectObj( oInstances ); // 選択しておしまい。
268 :名無しさん@お腹いっぱい。:2011/07/26(火) 21:08:33.43 ID:Z2Nx1KFx
Mayaの場合
{
string $ins[];
for($someObj in `ls -transforms`){
select -r $someObj;
string $buf[] = `pickWalk -d down`;
string $shapeName = `substitute ($someObj+"|") $buf[0] ""`;
select -r $shapeName;
string $pObj[] = `pickWalk -d up`;
if($someObj != $pObj[0]){
$ins[size($ins)] = $someObj;
}
}
select -r $ins;
}
SIの場合はModelKindプロパティでダイレクトに判定できる為スマートなコーディング。
Mayaの場合、インスタンスがDGグラフで判別不能のため階層から判定。
(もっと良い方法あるかな)
269 :名無しさん@お腹いっぱい。:2011/07/28(木) 19:26:33.44 ID:YyQwSLGs
例題5
シーン内の、中身が空っぽの Group を探して選択する
SoftImage
var oEmptyGroups = XSIFactory.CreateObject( "XSI.Collection" );
var oModels = ActiveSceneRoot.FindChildren( "", siModelType );
for ( var i=0; i<oModels.count; i++ ){
var oModel = oModels(i);
var oGroups = oModel.Groups;
for ( var j=0; j<oGroups.count; j++ ){
var oGroup = oGroups(j);
if ( oGroup.members.count == 0 ){
oEmptyGroups.Add( oGroup );
Logmessage( oGroup.fullname + " は空っぽでつ。。(;´Д`)" );
}
}
}
if ( oEmptyGroups.count != 0 ){
SelectObj( oEmptyGroups );
}else{
Logmessage( "空っぽなGroupは無いでつ。。(;´Д`)" );
}
270 :名無しさん@お腹いっぱい。:2011/07/28(木) 19:27:36.05 ID:YyQwSLGs
Maya
string $empty[];
for($group in `ls -type transform`){
if(size(`listRelatives -c $group`) == 0){
print($group + " は空っぽでつ。。(;´Д`)");
$empty[size($empty)] = $group;
}
}
if(size($empty) > 0){
select -r $empty;
}else{
print("空っぽなGroupは無いでつ。。(;´Д`)" );