オブジェクトが選択されている状態でエッジを返したり、メッシュが選択されている状態で頂点を返したりと、何が選択されていても指定のタイプで返すための関数です。
頂点が選択されてない!などのエラーを吐き出すのも微妙だし、毎回タイプごとに変換する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を渡した場合、戻り値は一つになります。けれど配列ではあるので注意。
基本的に複数が選択されていた場合、後に選んだアイテムが中心になります。
何も選択されてなかった場合、空の配列が返ります。