2008年10月22日水曜日

blender - BlenderのPythonの機能を勝手に拡張する

5 他のアプリケーションへの Python の埋め込み
http://www.python.jp/doc/nightly/ext/embedding.html


を参考に、勝手にBlenderのPythonモジュール(っていうのか?)を追加してみました。
Blenderを独自ビルドできてる人なら、思ったより簡単に出来るかと思います。
あ、ちなみに結局SCONSは使わずに、projectfiles_vc7/blender の中のプロジェクトからビルドしてます。

手順
1.BPY_pythonの中に、自作Pythonモジュール用のヘッダとc/cppファイルを入れる
(ファイルは他のファイルがあるところと同じディレクトリに置く)
2.BPY_pythonのblender.cに、そのヘッダをincludeし、最後のほうに
  PyDict_SetItemString(dict, "BDx", BDx_Init()); //BDxは使いたいモジュール名
 を追加
3.自作Pythonモジュール用のヘッダに、
  PyObject *BDx_Init(); //BDxは(ry
 と宣言
4.他のモジュールを参考に実装。
  自分の場合こんな感じに(↓)。適当なサンプル化するのが面倒だったので本番コードです。
 (BLO_write~ってのは、呼び出したい自作C++メソッド)



#include "BLO_writeXML.h"
#include "BDx.h"

///* copy and paste from World.c *///
#include "DNA_scene_types.h" /* for G.scene */
#include "DNA_userdef_types.h"
#include "BKE_global.h"
#include "BKE_world.h"
#include "BKE_main.h"
#include "BKE_library.h"
#include "BKE_texture.h"
#include "BLI_blenlib.h"
#include "BSE_editipo.h"
#include "BIF_keyframing.h"
#include "BIF_space.h"
#include "mydevice.h"
#include "Ipo.h"
#include "MTex.h"
#include "gen_utils.h"
#include "gen_library.h"
#include "MEM_guardedalloc.h"
///////////////////////////////////

static PyObject* write_xml_mesharm(PyObject* self, PyObject* args)
{
char* target_dir;
if (PyArg_ParseTuple(args, "s", &target_dir)) {
if (BLO_write_XML(target_dir, BLO_WRITEXML_MESH | BLO_WRITEXML_ARMATURE, NULL))
return Py_BuildValue("i", 1);
}
return Py_BuildValue("i", 0);
}

static PyObject* write_xml_empty(PyObject *self, PyObject* args)
{
char* target_dir;
if (PyArg_ParseTuple(args, "s", &target_dir)) {
if (BLO_write_XML(target_dir, BLO_WRITEXML_EMPTY, NULL))
return Py_BuildValue("i", 1);
}
return Py_BuildValue("i", 0);
}

static PyObject* write_xml_camera(PyObject *self, PyObject* args)
{
char* target_dir;
if (PyArg_ParseTuple(args, "s", &target_dir)) {
if (BLO_write_XML(target_dir, BLO_WRITEXML_CAMERA, NULL))
return Py_BuildValue("i", 1);
}
return Py_BuildValue("i", 0);
}

static PyObject* write_xml_lamp(PyObject *self, PyObject* args)
{
char* target_dir;
if (PyArg_ParseTuple(args, "s", &target_dir)) {
if (BLO_write_XML(target_dir, BLO_WRITEXML_LAMP, NULL))
return Py_BuildValue("i", 1);
}
return Py_BuildValue("i", 0);
}

static PyObject* write_xml_world(PyObject *self, PyObject* args)
{
char* target_dir;
if (PyArg_ParseTuple(args, "s", &target_dir)) {
if (BLO_write_XML(target_dir, BLO_WRITEXML_WORLD, NULL))
return Py_BuildValue("i", 1);
}
return Py_BuildValue("i", 0);
}

static char M_BDx_doc[] = "The Blender BDx module\n\n\
This module provides access to XMLExporting functions for BDxViewer\n\n";

struct PyMethodDef M_BDx_methods[] = {
{"writeMeshArmature", write_xml_mesharm, METH_VARARGS,M_BDx_doc},
{"writeEmpty", write_xml_empty, METH_VARARGS, M_BDx_doc},
{"writeCamera", write_xml_camera, METH_VARARGS, M_BDx_doc},
{"writeLamp", write_xml_lamp, METH_VARARGS, M_BDx_doc},
{"writeWorld", write_xml_world, METH_VARARGS, M_BDx_doc},
{NULL, NULL, 0, NULL}
};

PyObject *BDx_Init() {
PyObject *submodule;

submodule = Py_InitModule3( "Blender.BDx", M_BDx_methods, M_BDx_doc );

return submodule;
}


5.Blenderのエディタで、


import Blender
from Blender import *

print BDx.writeEmpty('folderName') # 成功すると"1"が表示される
print "finished!!!"


というように、普通に自作メソッドが実行できるようになります!

0 件のコメント: