MSelectionListでは、セレクション リスト上のオブジェクトの追加と削除を行うメソッドや、リスト上のオブジェクトを走査するメソッドが提供されています。
たとえば以下の単純なプラグインでは、選択されたすべての DAG ノードの名前が出力されます。ジオメトリを作成してそれを選択すると、このプラグインにより、選択された各オブジェクトの名前が出力されます。
#include <maya/MSimple.h>
#include <maya/MGlobal.h>
#include <maya/MString.h>
#include <maya/MDagPath.h>
#include <maya/MFnDagNode.h>
#include <maya/MSelectionList.h>
#include <maya/MIOStream.h>
MStatus pickExample::doIt( const MArgList& )
{
MDagPath node;
MObject component;
MSelectionList list;
MFnDagNode nodeFn;
MGlobal::getActiveSelectionList( list );
for ( unsigned int index = 0; index < list.length(); index++ )
{
list.getDagPath( index, node, component );
nodeFn.setObject( node );
cout nodeFn.name().asChar() << “ is selected” << endl;
}
return MS::kSuccess;
}
DeclareSimpleCommand( pickExample, "Autodesk", "1.0" );
選択したオブジェクトのリストを走査するのはとても簡単です。ジオメトリを作成してそれを選択すると、このプラグインにより、選択された各オブジェクトの名前が出力されます。
MFnDagNode の setObject() メソッドは MFnBase からの関数セットすべてに継承され、関数セットが操作するオブジェクトの設定に使用されます。通常、これは関数セットのコンストラクタによって行われますが、関数セットがすでに作成されていて、その関数セットが操作するオブジェクトを変更したい場合は、setObject() を使用します。これなら、関数セットが必要になるたび作成と破棄を繰り返すよりはるかに効率的です。
複数の CV を選択してから、このプラグインをコールしてみましょう。CV の名前が出力されるのではなく、親オブジェクト(カーブ、サーフェス、またはメッシュ)の名前が返されることに注意してください。また、選択したオブジェクトの数が、出力された名前の数と一致しないことにも注目してください。
Maya の選択アーキテクチャでは、CV などのオブジェクト コンポーネントの選択が単純になっています。それぞれのコンポーネント オブジェクト(たとえば CV など)の代わりに、親オブジェクトがセレクション リストに載っていて、そのコンポーネントがグループ化されています。
たとえば、nurbSphereShape1 の複数の CV が選択されている場合、前述の list.getDagPath() コールは、nurbSphereShape1 への MDagPath と、選択した CV をすべてグループ化している MObject を返します。次に MDagPath と MObject は MItSurfaceCV イテレータに渡され、選択した CV が審査されます。
1 つのオブジェクトのみのいくつかのコンポーネントを選択すると、そのオブジェクトはセレクション リストに 1 回だけ表示されます。しかし、あるオブジェクトのコンポーネントを選択して別のオブジェクトのコンポーネントを選択してから最初のオブジェクトのコンポーネントをさらに選択すると、最初のオブジェクトは実際にはセレクション リストに 2 回表示されます。これにより、オブジェクトを選択した順序を判断できます。