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