self.vertex_list へのアクセス方法.
今回は self.vertex_list へのアクセスである.これは, float の長さ 3 の numpy.array の list である.list の取り出し方は,http://shitohichiumaya.blogspot.com/2010/08/boostpython-how-to-pass-python-object.html で dict の keylist として説明した.
list の要素の float の numpy.array の要素へのアクセスをどうするかは以下のようになっている.
void print_float32_3(boost::python::object const & float32_3_obj)
{
// check sequence length is 3 or not.
if(boost::python::len(float32_3_obj) != 3){
std::string const objstr =
boost::python::extract< std::string >(
boost::python::str(float32_3_obj));
std::cerr << "print_float32_3: arg is not a float[3] obj ["
<< objstr << "]" << std::endl;
return;
}
float vec[] = {0.0f, 0.0f, 0.0f};
for(int i = 0; i < 3; ++i){
vec[i] = boost::python::extract< float >(
float32_3_obj.attr("__getitem__")(i));
}
std::cout << "float[3] = " << vec[0] << " " << vec[1] << " "
<< vec[2] << std::endl;
}
まずは,numpy.arrayは sequence なので boost::python::len() を使って,長さが 3 であるかどうかをチェックしている.その後に __getitem__ のattribute を通して各要素にアクセスしている.numpy.array にはnumpy.float64 が入っているが,extract< float > で要素にアクセスすることができる.
最後の int の array も同じ,と言いたいのだが,実は問題につきあたってしまったので,それは次回に回そう.