MPxManipContainer は、ユーザ定義のコンテナ マニピュレータの親クラスです。ユーザ定義のコンテナ マニピュレータは、1 つまたは複数のベース マニピュレータから構成されます。MPxManipContainer には多くのメソッドがあり、これを使用すると、さまざまなベース マニピュレータをコンテナに追加できます。MPxManipContainer から派生したユーザ定義マニピュレータにも、いくつかのメソッドを実装する必要があります。
draw メソッドをオーバーライドし、コンテナ マニピュレータの描画方法をカスタマイズすることもできます。
creator メソッドは、マニピュレータの新しいインスタンスを返す必要があり、MFnPlugin::registerNode メソッドへのコールとともに initializePlugin 関数に登録されます。
initialize メソッドは、マニピュレータに必要な初期化および親クラス MPxManipContainer::initialize のコールを実行します。creator メソッドと同じように、initialize メソッドは派生メソッドではなく、スタティックかつ登録されたメソッドです。
createChildren メソッドは、ベース マニピュレータを追加するためのコールが呼び出される場所です。
たとえば moveManip::createChildren メソッドは以下のようになります。
MStatus moveManip::createChildren()
{
...
fDistanceManip = addDistanceManip(manipName,
distanceName);
fFreePointManip = addFreePointTriadManip(pointManipName,
pointName);
...
}
connectToDependNode メソッドは、やり取りを行うマニピュレータとプラグ間に関連付けが作成される場所です。このメソッドでは、マニピュレータとプラグの関係を作成した後で、さらに 2 つのメソッドをコールする必要があります。そのメソッドは MPxManipContainer::finishAddingManips と MPxManipContainer::connectToDependNode で、この順序でコールする必要があります。MPxManipContainer::finishAddingManipsは、プラグとのコネクションを確立した後でコールする必要があることに注意してください。さらに、finishAddingManips は 1 回しかコールする必要がありません。
たとえば moveManip::connectToDependNode メソッドでは以下のようになります。
MStatus moveManip::connectToDependNode(const MObject &node)
{
...
distanceManipFn.connectToDistancePlug(syPlug);
...
freePointTriadManipFn.connectToPointPlug(tPlug);
...
finishAddingManips();
...
MPxManipContainer::connectToDependNode(node);
...
}
draw メソッドは、コンテナ マニピュレータの作成をカスタマイズするために使用する、オプションのメソッドです。draw メソッドを上書きする場合は、最初に MPxManipContainer::draw をコールしてすべての子を描画する必要があります。
たとえば moveManip::draw メソッドでは、ベース マニピュレータに加えてラベルが描画されます。
void moveManip::draw(M3dView &view,
const MDagPath &path,
M3dView::DisplayStyle style,
M3dView::DispalyStatus status)
{
MPxManipContainer::draw(view, path, style, status);
view.beginGL();
MPoint textPos(0, 0, 0);
char str[100];
sprintf(str, "Stretch Me!");
MString distanceText(str);
view.drawText(distanceText, textPos, M3dView::kLeft);
view.endGL();
}
マニピュレータ コンテナはノードから派生しているので、ユーザ定義マニピュレータの登録と登録解除はほかのノードと同じようにできますが、MFnPlugin::registerNodeのMPxNode::Type 引数の設定先が、デフォルトの MPxNode::kDependNode ではなく MPxNode::kManipContainer である点だけが異なります。
たとえば moveToolManip.cpp では以下のようになっています。
MStatus initializePlugin(MObject obj)
{
...
plugin.registerNode("moveManip",
moveManip::id,
&moveManip::creator,
&moveManip::initialize,
MPxNode::kManipContainer);
...
}
MStatus uninitializePlugin(MObject obj)
{
...
plugin.deregisterNode(moveManip::id);
...
}