非推奨 API 呼び出しを処理する

非推奨 API 呼び出しを使用すると、次のような警告がコンパイラによって生成されます。

warning C4996: 'MPxTransform::validateAndSetValue': Override validateAndSetValue(const MPlug&, const MDataHandle&) instead.  If needed, useMDGContext::current() to get the context.

コンパイラで treat warning as error (警告をエラーとして扱う)が有効になっていて、移行中に関連するビルド エラーが発生した場合は、非推奨の警告を無効にすることができます。

非推奨の警告を無視するには、_OPENMAYA_DEPRECATION_DISABLE_WARNING プリプロセッサ マクロを定義するか、次のコンパイラ スイッチを使用します。

MSVC /Wd"4996"
ICC -diag-disable 1786
Clang -Wno-error=deprecated-declarations
GCC -Wno-error=deprecated-declarations

非推奨をエラーとして処理するには、_OPENMAYA_DEPRECATION_ERROR_ALL プリプロセッサ マクロを定義するか、次のコンパイラ スイッチを使用します。

MSVC /We"4996" (/D_CRT_NONSTDC_NO_DEPRECATE)
ICC -diag-error 1786
Clang -Werror=deprecated-declarations
GCC Werror=deprecated-declarations

廃止されたメソッドの下位互換性

非推奨のメソッドは、3 つの主要なリリース内で API から削除される可能性があります。そのため、非推奨のメソッドはプラグインからできるだけ早く削除する必要があります。

ただし、変更の範囲が大きすぎてすべてを一度に処理できない場合、またはサードパーティ製ソフトウェアを使用している場合は、コードに非推奨 API 呼び出しが残っている可能性があります。

非推奨 API 呼び出しはオーバーライドすることができます。ただし、非推奨 API と新しい API の両方を同じ階層または同じクラスでオーバーライドすることはできません。

次の例は、新しい API および非推奨 API をオーバーライドする方法を示します。サンプルでは、getMatrix() メソッドを使用します。MMatrix::getMatrix(const MDGContext&) は Maya 2018 で廃止され、MMatrix::getMatrix() に置き換えられました。

新しい API をオーバーライドするには:

class UserTransform : public MPxTransform {
    MMatrix getMatrix() override;
};

非推奨 API をオーバーライドするには:

class UserTransform: public MPxTransform {
    MMatrix getMatrix(const MDGContext&) override; // deprecated
};

避けるべき一般的な間違い

新しい API と非推奨 API を使用する場合は、同じクラスまたは継承階層内で新しい API と非推奨 API の両方をオーバーライドしないでください。また、新しい API のオーバーライドから非推奨 API を呼び出さないでください(その反対も同様)。

次の例では、これらの一般的な間違いを示します。サンプルでは、getMatrix() メソッドを使用します。MMatrix::getMatrix(const MDGContext&) は Maya 2018 で廃止され、MMatrix::getMatrix() に置き換えられました。

同じクラス内で新しい API と非推奨 API をオーバーライドしないでください。たとえば、次の操作は行わないでください。

class UserTransform: public MPxTransform {
    MMatrix getMatrix() override; // new
    MMatrix getMatrix(const MDGContext&) override; // deprecated
}; // Error, override both API in one class

同じ継承階層内で新しい API と非推奨 API の両方をオーバーライドしないでください。

たとえば、次の操作は行わないでください。

class UserTransformBase: public MPxTransform {
   MMatrix getMatrix(const MDGContext&) override; // deprecated
}; // Ok

class UserTransformDerived: public UserTransformBase {  
    MMatrix getMatrix() override; // new
}; // Error, override both API in one inheritance hierarchy

新しい API のオーバーライドから非推奨 API を呼び出さないでください(または非推奨 API のオーバーライドから新しい API を呼び出さないでください)。

たとえば、次の操作は行わないでください。

class UserTransform: public MPxTransform {
    MMatrix getMatrix() override {
        return MPxTransform::getMatrix(MDGContext::current()); // Error, calling deprecated API from new API overridden
    }
};