【MEL】選択中のオブジェクトやコンポーネントを指定のタイプで返す

 オブジェクトが選択されている状態でエッジを返したり、メッシュが選択されている状態で頂点を返したりと、何が選択されていても指定のタイプで返すための関数です。
 頂点が選択されてない!などのエラーを吐き出すのも微妙だし、毎回タイプごとに変換するMELを書くのも面倒だったのでまとめてみました。
 親を調べたり子を調べたりと、いろいろ手間ですし^^;
 意外と便利に使えてますv

ソース

  
// 選択中のオブジェクトやコンポーネントを指定のタイプで返す。
//  戻値:オブジェクトまたはコンポーネント名 引数:タイプ(vertex|edge|face|mesh|transform),戻値を一つにするフラグ
global proc string[] getSelectParticularType( string $aType, int $aSingleFlag ){
	string $aSelect[] = `ls -os -fl -showType`;
	string $aReternList[] = {};
	
	if( size($aSelect) == 0 ){
		return( {} );
	}
	
	int $i = 0;
	for( $i = 0 ; $i < size($aSelect) ; $i+=2 ){
		if( $aSelect[1+$i] == "float3" ){
			if( $aType == "vertex" ){
				$aReternList = stringArrayCatenate( $aReternList, `polyListComponentConversion -toVertex $aSelect[0+$i]` );
			}else if( $aType == "edge" ){
				$aReternList = stringArrayCatenate( $aReternList, `polyListComponentConversion -toEdge $aSelect[0+$i]` );
			}else if( $aType == "face" ){
				$aReternList = stringArrayCatenate( $aReternList, `polyListComponentConversion -toFace $aSelect[0+$i]` );
			}else if( $aType == "mesh" ){
				$aReternList = stringArrayCatenate( $aReternList, `listRelatives -p $aSelect[0+$i]` );
			}else if( $aType == "transform" ){
				string $aMesh[] = `listRelatives -p $aSelect[0+$i]`;
				$aReternList = stringArrayCatenate( $aReternList, `listRelatives -p $aMesh[0]` );
			}
		}else if( $aSelect[1+$i] == "mesh" ){
			if( $aType == "vertex" ){
				$aReternList = stringArrayCatenate( $aReternList, `polyListComponentConversion -toVertex $aSelect[0+$i]` );
			}else if( $aType == "edge" ){
				$aReternList = stringArrayCatenate( $aReternList, `polyListComponentConversion -toEdge $aSelect[0+$i]` );
			}else if( $aType == "face" ){
				$aReternList = stringArrayCatenate( $aReternList, `polyListComponentConversion -toFace $aSelect[0+$i]` );
			}else if( $aType == "mesh" ){
				$aReternList[size($aReternList)] = $aSelect[0+$i];
			}else if( $aType == "transform" ){
				$aReternList = stringArrayCatenate( $aReternList, `listRelatives -p $aSelect[0+$i]` );
			}
		}else if( $aSelect[1+$i] == "transform" ){
			if( $aType == "vertex" ){
				$aReternList = stringArrayCatenate( $aReternList, `polyListComponentConversion -toVertex $aSelect[0+$i]` );
			}else if( $aType == "edge" ){
				$aReternList = stringArrayCatenate( $aReternList, `polyListComponentConversion -toEdge $aSelect[0+$i]` );
			}else if( $aType == "face" ){
				$aReternList = stringArrayCatenate( $aReternList, `polyListComponentConversion -toFace $aSelect[0+$i]` );
			}else if( $aType == "mesh" ){
				$aReternList = stringArrayCatenate( $aReternList, `listRelatives -shapes $aSelect[0+$i]` );
			}else if( $aType == "transform" ){
				$aReternList[size($aReternList)] = $aSelect[0+$i];
			}
		}
	}
	$aReternList = stringArrayRemoveDuplicates($aReternList);
	if( $aSingleFlag == true ){
		return({$aReternList[size($aReternList)-1]});
	}
	return($aReternList);
}

使い方

string $aSelect[] = getSelectParticularType( "vertex", false );

 選択しているものがオブジェクトでもエッジでも$aSelect[]には頂点の一覧が返ります。
 あくまで返すだけなので、選択されているものは元のままです。
 選択したい場合はlsに返ってきた配列を渡してください。

 二つ目の引数にtrueを渡した場合、戻り値は一つになります。けれど配列ではあるので注意。
 基本的に複数が選択されていた場合、後に選んだアイテムが中心になります。

 何も選択されてなかった場合、空の配列が返ります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です