Hi Bryn,<br><br>Don't use vtkPythonGetObjectFromPointer(), it is an internal function and no longer exists in the VTK development head.<br><br><span style="color: rgb(31, 73, 125);"></span>Your earlier attempt with <span style="color: rgb(31, 73, 125);"></span><span style="font-size: 9.5pt; font-family: Consolas;">address_str </span>is the right way to go, but the string format is important. Take a look at <span style="color: rgb(31, 73, 125);"></span>GetObjectFromObject() in vtkPythonUtil.cxx to see how the string is decoded.<br>
<br> - David<br><br><br><div class="gmail_quote">On Thu, May 26, 2011 at 8:07 AM, Bryn Lloyd <span dir="ltr"><<a href="mailto:lloyd@itis.ethz.ch">lloyd@itis.ethz.ch</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div link="blue" vlink="purple" lang="EN-US"><div><p class="MsoNormal"><span style="color: rgb(31, 73, 125);">Although I am still interested in a better solution, I currently have found following way to deal with this:</span></p>
<p class="MsoNormal"><span style="color: rgb(31, 73, 125);"> </span></p><p class="MsoNormal"><span style="color: rgb(31, 73, 125);">I wrote a function, which creates a boost::python::object from the vtkUnstructuredGrid, which it obtains from my MyClass object:</span></p>
<p class="MsoNormal"><span style="color: rgb(31, 73, 125);"> </span></p><p class="MsoNormal"><span style="color: rgb(31, 73, 125);">#include <vtkPythonUtil.h></span></p><p class="MsoNormal"><span style="color: rgb(31, 73, 125);">using boost::python::object;</span></p>
<p class="MsoNormal"><span style="color: rgb(31, 73, 125);">using boost::python::import;</span></p><p class="MsoNormal"><span style="color: rgb(31, 73, 125);"> </span></p><p class="MsoNormal"><span style="color: rgb(31, 73, 125);">boost::python::object GetGrid(MyClass *m)</span></p>
<p class="MsoNormal"><span style="color: rgb(31, 73, 125);">{</span></p><p class="MsoNormal" style=""><span style="color: rgb(31, 73, 125);"> object vtk_module = import("vtk");</span></p><p class="MsoNormal" style="">
<span style="color: rgb(31, 73, 125);"> vtkUnstructuredGrid *volume = m->GetVolume();</span></p><p class="MsoNormal" style=""><span style="color: rgb(31, 73, 125);"> if(volume==NULL) return object(boost::python::handle<>(Py_None));</span></p>
<p class="MsoNormal" style=""><span style="color: rgb(31, 73, 125);"> boost::python::handle<> pvolume(vtkPythonGetObjectFromPointer((vtkObjectBase *)volume));</span></p><p class="MsoNormal" style="">
<span style="color: rgb(31, 73, 125);"> return object(pvolume);</span></p>
<p class="MsoNormal" style=""><span style="color: rgb(31, 73, 125);">}</span></p><p class="MsoNormal" style=""><span style="color: rgb(31, 73, 125);"> </span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> </span></p>
<p class="MsoNormal"><span style="color: rgb(31, 73, 125);"> </span></p><p class="MsoNormal"><span style="color: rgb(31, 73, 125);"> </span></p><p class="MsoNormal"><span style="color: rgb(31, 73, 125);"> </span></p><p class="MsoNormal">
<span style="color: rgb(31, 73, 125);"> </span></p><div><div style="border-width: 1pt medium medium; border-style: solid none none; border-color: rgb(181, 196, 223) -moz-use-text-color -moz-use-text-color; padding: 3pt 0in 0in;">
<p class="MsoNormal"><b><span style="font-size: 10pt;">From:</span></b><span style="font-size: 10pt;"> <a href="mailto:vtkusers-bounces@vtk.org" target="_blank">vtkusers-bounces@vtk.org</a> [mailto:<a href="mailto:vtkusers-bounces@vtk.org" target="_blank">vtkusers-bounces@vtk.org</a>] <b>On Behalf Of </b>Bryn Lloyd<br>
<b>Sent:</b> Thursday, May 26, 2011 12:05 PM<br><b>To:</b> <a href="mailto:vtkusers@vtk.org" target="_blank">vtkusers@vtk.org</a><br><b>Subject:</b> [vtkusers] Mixing Boost.Python and VTK/Python</span></p></div></div><div>
<div></div><div class="h5"><p class="MsoNormal"> </p><p class="MsoNormal">Hi</p><p class="MsoNormal"> </p><p class="MsoNormal">A similar question has been asked here before, but I have not managed to get a working solution from it. </p>
<p class="MsoNormal">I have a class which returns a vtkUnstructuredGrid. I wrap my class using boost python.</p><p class="MsoNormal"> </p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;">class MyClass { </span></p>
<p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;">public: </span></p><p class="MsoNormal" style="text-indent: 0.5in;"><span style="font-size: 9.5pt; font-family: Consolas;">vtkUnstructuredGrid* GetGrid () { return m_Grid; }</span></p>
<p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;">private:</span></p><p class="MsoNormal" style="text-indent: 0.5in;"><span style="font-size: 9.5pt; font-family: Consolas;">vtkUnstructuredGrid * m_Grid;<br>
};</span></p><p class="MsoNormal"> </p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> </span></p><p class="MsoNormal" style="">But if I call the function GetGrid in Python:</p><p class="MsoNormal" style="">
<span style="font-size: 9.5pt; font-family: Consolas;"> </span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;">from vtk import * </span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;">from MyModule import *</span></p>
<p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;">obj = MyClass()</span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;">grid = obj.GetGrid()</span></p>
<p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> </span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> </span></p><p class="MsoNormal" style="">
I get following error:</p><p class="MsoNormal" style="">TypeError: No Python class registered for C++ class class vtkUnstructuredGrid</p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> </span></p>
<p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> </span></p><p class="MsoNormal" style="">The class MyClass has been wrapped as follows:</p><p class="MsoNormal"> </p><p class="MsoNormal" style="">
<span style="font-size: 9.5pt; font-family: Consolas; color: blue;">template</span><span style="font-size: 9.5pt; font-family: Consolas;"><<span style="color: blue;">class</span> T></span></p><p class="MsoNormal" style="">
<span style="font-size: 9.5pt; font-family: Consolas; color: blue;">struct</span><span style="font-size: 9.5pt; font-family: Consolas;"> vtkObject_to_python</span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;">{</span></p>
<p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> <span style="color: blue;">static</span> PyObject *convert(<span style="color: blue;">const</span> T &p)</span></p><p class="MsoNormal" style="">
<span style="font-size: 9.5pt; font-family: Consolas;"> {</span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> std::ostringstream oss;</span></p><p class="MsoNormal" style="">
<span style="font-size: 9.5pt; font-family: Consolas;"> oss << (<span style="color: blue;">void</span>*) &p;</span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> std::string address_str = oss.str();</span></p>
<p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> </span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> object obj = import(<span style="color: rgb(163, 21, 21);">"vtk"</span>).attr(<span style="color: rgb(163, 21, 21);">"vtkObjectBase"</span>)(address_str);</span></p>
<p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> <span style="color: blue;">return</span> incref(obj.ptr());</span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> }</span></p>
<p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;">};</span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> </span></p><p class="MsoNormal" style="">
<span style="font-size: 9.5pt; font-family: Consolas;">BOOST_PYTHON_MODULE(MyModule)</span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;">{</span></p><p class="MsoNormal" style="">
<span style="font-size: 9.5pt; font-family: Consolas;"> to_python_converter<vtkUnstructuredGrid,</span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> vtkObject_to_python<vtkUnstructuredGrid> >();</span></p>
<p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> </span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> class_<MyClass>(“MyClass”)</span></p>
<p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;"> .def(“GetGrid”,&MyClass::GetGrid, return_value_policy<reference_existing_object>())</span></p><p class="MsoNormal" style="">
<span style="font-size: 9.5pt; font-family: Consolas;"> ;</span></p><p class="MsoNormal" style=""><span style="font-size: 9.5pt; font-family: Consolas;">}</span></p></div></div></div></div></blockquote></div>