株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • Maya2013導入で発生した開発室での出来ごと

Maya2013導入で発生した開発室での出来ごと

2013/4/1

Tag: ,,

お久しぶりです
開発室の齊藤です

Autodesk 2014製品が発表されました! 早速2014の紹介を!!
ではなく、今回はMaya 2013 を導入する際に起こった、開発室での出来事から2つを紹介します

Pythonモジュールの用意

最初はPythonモジュールについて。
Maya2013からWinodwsでは開発環境が、VisualStudio2008から2010へと変わりました。
この変更は、一部のPythonモジュールにも影響が及びます。

Maya2013でPythonモジュールインポートするとエラーが出る報告がありました。

ImportError: DLL load failed: The specified module could not be found.

エラーを見ても、いつも通りぶっきらぼうに言っています。 “どの”DLLなのか教えてくれない。
最初は環境変数PATHの設定間違えか?などと疑いました。
しかし、このエラー原因を突き詰めていくとあるファイルに辿りつきます。

拡張子がpydのファイルです。

pydファイルはC/C++で書かれたコードをビルドすることで作られるファイルです。
この問題の原因は、pydファイルがMSVCR90.dllを要求することに起因します。

MSVCR90.dllはVisualStudio2008です。
冒頭の通り2013から、VisualStudio2010です。

と言うことで、モジュールをVisualStudio2010でビルドすることで、エラーは解決します。

じゃぁビルドしていくかとなるわけですが、ここからが大変な話でした。
ビルドする際に以下のコマンドを使うモジュールがあります

> python setup.py build

この場合にもちろんpython.exeが必要ですが、ここに問題があります。
Mayaが使っているPythonのバージョンは2.6です。公式で配布されているものはVisualStudio2008でビルドされたものです。
VisualStudio2010でビルドされたPythonは配布されていません。

今回の対象はMayaだったので、そもそもMayaにないのか?っと探るとありました。名前を変えて。

Mayaインストールディレクトリ/bin/mayapy.exe

このexeを用いて、モジュールのビルドは進みました。

しかし、ビルド途中でエラーが発生するモジュールが現れます。NumPyです。
NumPyではビルド途中で、”マニフェストが見つからない”とエラーが発生しました。

最初はNumPyビルド時の設定ミスか、バグかと疑いました。
しかし、エラーを探るとPythonのIssue TrackerからIssue16296というのを発見しました。
バグに対してパッチが出ていたので、パッチを当てたPythonを使うことでビルドが通りました。

このようにエラーが出るモジュールもあれば、すんなりビルドが通るモジュールもあります。
エラーが出れば都度解決方法を見つけてビルドしていきました。

現在、リビルドが必要だと分かっているモジュールとしては、以下のものが挙げられます

・NumPy
・PyQt
・PySide
・PyWin32 (Python for Windows extensions)

モジュールの中でも一部だけがエラーを起こすこともあり、最初は使えると思っていても後に問題になることがあります。

MFnBaseの仕様変更

次は、Maya APIの仕様変更で起きたことを1つ。
Maya2013から、MFnBaseクラスのコピーコンストラクタがプライベートになりました。

だから何だという話もあると思います。

Mayaのバージョンが変わると、社内で開発されたプラグインをMaya2013に向けてビルドをします
ビルドが成功する中、とあるプラグインで以下のC2248のエラーが大量に発生しているプラグインが現れました。

error C2248: ‘MFnMeshData::operator =’ : private メンバー (クラス ‘MFnMeshData’ で宣言されている) にアクセスできません。(省略)

何が起きたんだと探っていると、MFnBaseクラスのコピーコンストラクタがプライベートになっていることを発見。
そこから、問題のプラグインのコードを探っていき問題のコードに辿りつきました。

std::vector< MFnMesh > …

問題のクラスはMFnBaseですが、クラス名からの想像通りこのクラスは、MFn~となっているクラスに影響をします。
今回のは上記のコードが原因で、MFnMeshのコピーコンストラクタを呼ぶことになり、エラーを出していたというものです。
このエラーを出しているプラグインには、他にもstd::vector< MFn~> があり大量のエラーを生み出していました。
なので以下のように書き換え

std::vector< MFnMesh* > …

その後、他の部分も正常に動作するようにコードを書き換えて、この問題は解決しました。

最後に

MFnBaseの仕様変更については、あまり話が出ないのはわかるんですが
Pythonモジュールの話は、あまり情報が無いんですよね。

今回発表された2014導入するとなると、どんな出来事があるのかドキドキします。

Pocket

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*