API ガイド > マニピュレータ >

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

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

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

- creator メソッド
- initialize メソッド
- createChildren メソッド
- connectToDependNode メソッド

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

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