to_python / from_python guidance?
Hi, I'm trying to expose a class that uses a third party library: gmtl. The gmtl library has already bindings for python. I want to be able to do this: struct Test { gmtl::Vec3d x; gmtl::Point3d y; Test() : x(0,0,0),y(0,0,0) {} Test(const Test &other) : x(other.x), y(other.y){} Test& operator=(const Test& other) { if (this==&other) return *this; x = other.x; y = other.y; } }; Im exposing the class like this: class_< Test >("Test", init< >()) .def(init< const Test& >()) .def_readwrite("x", &Test::x) .def_readwrite("y", &Test::y) ; But this fails:
import gmtl from PyStatATA import * test = Test() test.x = gmtl.Vec3d(0,0,1) Traceback (most recent call last): File "<stdin>", line 1, in ? Boost.Python.ArgumentError: Python argument types in None.None(Test, Vec3d) did not match C++ signature: None(struct Test {lvalue}, class gmtl::Vec<double,3>) test.y = gmtl.Point3d(0,0,1) Traceback (most recent call last): File "<stdin>", line 1, in ? Boost.Python.ArgumentError: Python argument types in None.None(Test, Point3d) did not match C++ signature: None(struct Test {lvalue}, class gmtl::Point<double,3>) my = test.y Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: No Python class registered for C++ class class gmtl::Point<double,3> mx = test.x Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: No Python class registered for C++ class class gmtl::Vec<double,3>
From my understanding, to solve this I need to define the to and from python converters. But the examples assume I have headers to the python type of gmtl::Vec3d and gmtl::Point3d. In my case, I don't have that.
What is the best approach to solve this? Thanks, Alexis Programming Tutorial: In Python: To do this, do this In Perl: To do this, do this or this or this or this... In C: To do this, do this, but be careful In C++: To do this, do this, but don't do this, be careful of this, watch out for this, and whatever you do, don't do this __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com
Well, at first it is worth noting gtml Python library was made with Boost.Python ! Because it should simplify things a lot ! At least, what's written here suggest that : http://www.vrjuggler.org/pyjuggler/1.0/python.programmer.reference/gmtl.html If you use another Python extension for gtml, let us know ! The converters should be defined by Boost.Python itself. Also, verify the gmtl Python extension is linked against the same library as your C++ code ... because it should work, and your error looks like some multi-symbol error to me. Pierre Alexis H. Rivera-Rios a écrit :
Hi,
I'm trying to expose a class that uses a third party library: gmtl. The gmtl library has already bindings for python. I want to be able to do this:
struct Test { gmtl::Vec3d x; gmtl::Point3d y; Test() : x(0,0,0),y(0,0,0) {} Test(const Test &other) : x(other.x), y(other.y){}
Test& operator=(const Test& other) { if (this==&other) return *this;
x = other.x; y = other.y; } };
Im exposing the class like this:
class_< Test >("Test", init< >()) .def(init< const Test& >()) .def_readwrite("x", &Test::x) .def_readwrite("y", &Test::y) ;
But this fails:
import gmtl from PyStatATA import * test = Test() test.x = gmtl.Vec3d(0,0,1)
Traceback (most recent call last): File "<stdin>", line 1, in ? Boost.Python.ArgumentError: Python argument types in None.None(Test, Vec3d) did not match C++ signature: None(struct Test {lvalue}, class gmtl::Vec<double,3>)
test.y = gmtl.Point3d(0,0,1)
Traceback (most recent call last): File "<stdin>", line 1, in ? Boost.Python.ArgumentError: Python argument types in None.None(Test, Point3d) did not match C++ signature: None(struct Test {lvalue}, class gmtl::Point<double,3>)
my = test.y
Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: No Python class registered for C++ class class gmtl::Point<double,3>
mx = test.x
Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: No Python class registered for C++ class class gmtl::Vec<double,3>
From my understanding, to solve this I need to define the to and from python converters. But the examples assume I have headers to the python type of gmtl::Vec3d and gmtl::Point3d. In my case, I don't have that.
What is the best approach to solve this?
Thanks, Alexis
Programming Tutorial: In Python: To do this, do this In Perl: To do this, do this or this or this or this... In C: To do this, do this, but be careful In C++: To do this, do this, but don't do this, be careful of this, watch out for this, and whatever you do, don't do this
__________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com _______________________________________________ C++-sig mailing list C++-sig@python.org http://mail.python.org/mailman/listinfo/c++-sig
-- Pierre Barbier de Reuille INRA - UMR Cirad/Inra/Cnrs/Univ.MontpellierII AMAP Botanique et Bio-informatique de l'Architecture des Plantes TA40/PSII, Boulevard de la Lironde 34398 MONTPELLIER CEDEX 5, France tel : (33) 4 67 61 65 77 fax : (33) 4 67 61 56 68
participants (2)
-
Alexis H. Rivera-Rios -
Pierre Barbier de Reuille