マニピュレータのコンテナ
 
 
 

MPxManipContainer は、ユーザ定義のコンテナ マニピュレータの親クラスです。ユーザ定義のコンテナ マニピュレータは、1 つまたは複数のベース マニピュレータから構成されます。MPxManipContainer には多くのメソッドがあり、これを使用すると、さまざまなベース マニピュレータをコンテナに追加できます。MPxManipContainer から派生したユーザ定義マニピュレータにも、いくつかのメソッドを実装する必要があります。

必要なメソッドは以下のとおりです。

draw メソッドをオーバーライドし、コンテナ マニピュレータの描画方法をカスタマイズすることもできます。

creator メソッド

creator メソッドは、マニピュレータの新しいインスタンスを返す必要があり、MFnPlugin::registerNode メソッドへのコールとともに initializePlugin 関数に登録されます。

注:このメソッドはスタティックで登録されており、派生メソッドではありません。したがって、メソッド名が「creator」である必要はありませんが、慣習では「creator」という名前が一般的に使用されます。

initialize メソッド

initialize メソッドは、マニピュレータに必要な初期化および親クラス MPxManipContainer::initialize のコールを実行します。creator メソッドと同じように、initialize メソッドは派生メソッドではなく、スタティックかつ登録されたメソッドです。

createChildren メソッド

createChildren メソッドは、ベース マニピュレータを追加するためのコールを行う場所です。

たとえば moveManip::createChildren メソッドは以下のようになります。

MStatus moveManip::createChildren()
{
 ...
 fDistanceManip = addDistanceManip(manipName,
 distanceName); 
 fFreePointManip = addFreePointTriadManip(pointManipName,
 pointName);
 ...
}

connectToDependNode メソッド

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 メソッドは、コンテナ マニピュレータの作成をカスタマイズするために使用する、オプションのメソッドです。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);
 ...
}