From cdf8cccbb060c0a008cbbc05850addf254c1c177 Mon Sep 17 00:00:00 2001 From: Marco Biasini <marco.biasini@unibas.ch> Date: Wed, 29 Dec 2010 15:37:53 +0100 Subject: [PATCH] added converter to initialize std::vectors from iterable In Python, it's now possible to do: a=geom.Vec3(1,0,0) b=geom.Vec3(0,1,0) c=geom.Vec3(0,0,1) print geom.Vec3List((a,b,c,)) print geom.Vec3List([a,b,c,]) def f(*args): for a in args: yield a print geom.Vec3List(f(a,b,c)) --- modules/base/src/export_helper/vector.hh | 18 ++++++++++++++---- modules/geom/pymod/export_vec3.cc | 8 ++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/modules/base/src/export_helper/vector.hh b/modules/base/src/export_helper/vector.hh index 0b262bf55..68409cc2b 100644 --- a/modules/base/src/export_helper/vector.hh +++ b/modules/base/src/export_helper/vector.hh @@ -1,27 +1,37 @@ #ifndef OST_EXPORT_HELPER_VECTOR_HH #define OST_EXPORT_HELPER_VECTOR_HH -# include <boost/python/def_visitor.hpp> - +#include <boost/python/def_visitor.hpp> +#include <boost/python/suite/indexing/container_utils.hpp> /* Author: Marco Biasini */ namespace ost { - +namespace bp=boost::python; template <typename Container> class VectorAdditions : - public boost::python::def_visitor<VectorAdditions<Container> > { + public bp::def_visitor<VectorAdditions<Container> > { public: + typedef typename Container::value_type value_type; + typedef Container container_type; template <class Class> void visit(Class& cl) const { cl .def("__str__", &to_string) + .def("__init__", make_constructor(&from_iter)) ; } private: + static boost::shared_ptr<Container> from_iter(const bp::object& obj) + { + boost::shared_ptr<Container> c(new Container); + bp::container_utils::extend_container(*c.get(), obj); + return c; + } + static std::string to_string(Container& cl) { std::stringstream ss; diff --git a/modules/geom/pymod/export_vec3.cc b/modules/geom/pymod/export_vec3.cc index 25c9cd164..a077c25dd 100644 --- a/modules/geom/pymod/export_vec3.cc +++ b/modules/geom/pymod/export_vec3.cc @@ -31,6 +31,13 @@ geom::Vec3 NormalizeV3(const geom::Vec3& v) { return geom::Normalize(v); } + +void vec_test(const geom::Vec3List& v) +{ + for (size_t i=0; i<v.size(); ++i) { + std::cout << i << v[i] << std::endl; + } +} void export_Vec3() { using namespace geom; @@ -75,4 +82,5 @@ void export_Vec3() .add_property("inertia", &Vec3List::GetInertia) .add_property("principal_axes", &Vec3List::GetPrincipalAxes) ; + def("vec_test", &vec_test); } -- GitLab