ユーザの作った python object を C++ に渡す(2) | Chandler@Berlin

Chandler@Berlin

ベルリン在住

前回の python コードは,単純な三角形メッシュを作成し,データをセットしていた.このメッシュには一枚の四角形があるだけであまり面白いものではないが,例としては十分であろう.シーンを下から見た様子を画像に示しておく.



ここではどうやって TriMesh の3つのメンバに C++ でアクセスするのかということになる.Python のオブジェクトのメンバは attribute であり,これにアクセスする一般的な方法も考えられる.しかし,それは複雑なので,ここではC++側がpython の class に関して知識があるとしよう.そうすると,この例では3つのメ
ンバにアクセスすることになる.

- self.__material_name
       string, しかし private なメンバであり,get_material_name() を使ってアクセスする
- self.vertex_list
       float (実は numpy.float64) の長さ 3 の numpy.array の list である.
- self.face_idx_list
       int (実は numpy.int64) の長さ 3 の numpy.array の list である.


subsection self.__material_name|へのアクセス方法

self.__material_name へのアクセス方法.TriMesh のオブジェクトはpytrimesh として渡されるとする.

std::string const matname = extract< std::string >(pytrimesh.attr("get_material_name")());

ここでは boost::python::object のメンバ attr を使ってメンバ関数を得,そのoperator() を使って python の string を得る.コードの最後にある () に注意して欲しい.

    pytrimesh.attr("get_material_name")

ではなく,

    pytrimesh.attr("get_material_name")()

である.

しかし object のoperator() はやはり object を返すため, extract を使ってC++ の std::stringに object を返す.これは python の build-in の objectが返ってくるので比較的簡単であった.

ここで2つ注意しておこう.

- 存在しない attribute にアクセスすると AttributeError exception が発生する.例えば以下のコードはその例である.

boost::python::object const vlist = pytrimesh.attr("vertex_list_non_exist");

- private のメンバにはアクセスすることができない.したがって以下の方法は失敗する.
   std::string const matname = extract< std::string >(pytrimesh.attr("__material_name"));

次回は numpy.array の list を C++ に渡す方法である.