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); ... }
connectToDependNode は仮想のメソッドですが、カスタム コンテキスト内でマニピュレータを使用している場合は、通常は自分でこのメソッドをコールする責任があります。詳細については、マニピュレータをマニピュレータの表示ツールにコネクトするを参照してください。
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); ... }