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

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);
    ...
}