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