<div dir="ltr">Try declaring m_dict as a PyObject:<div><br></div><div>  PyObject *m_dict;</div><div>  PyObject *getDict();</div><div>  void setDict(PyObject *);</div><div>  </div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Aug 1, 2016 at 5:55 AM, Kit Chambers <span dir="ltr"><<a href="mailto:kit.chambers.kc@gmail.com" target="_blank">kit.chambers.kc@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>Hi David/VTK'ers, </div><div><br></div><div>Following on from my previous email i am now having diffcultly using a more complicated data structure in a derived class. In this case i am trying:</div><div><br></div><div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">#include "vtkImageData.h"</font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">#include <boost/python.hpp></font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier" size="1"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">class VTK_EXPORT vtkImageDataDict: public vtkImageData</font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">{</font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">public:</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier" size="1"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">  vtkTypeMacro(vtkImageDataDict, vtkImageData);</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier" size="1"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">  // New method</font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">  static vtkImageDataDict *New();</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font size="1" face="Courier"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">  // Python dictionary</font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">  boost::python::dict m_dict;</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier" size="1"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">  // test function to set the dictionary</font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">  void test_set_dict();</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier" size="1"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">  // prints the dictionary</font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">  void printImageDict();</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier" size="1"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">  // Dictionary getter</font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">  boost::python::dict getDict(){return this->m_dict;}</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier" size="1"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">  // Dictionary setter</font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">  void setDict(boost::python::object dd);</font></div><div style="margin:0px;line-height:normal"><font face="Courier" size="1">};</font></div></div><div><br></div><div><br></div><div>When I wrap the above class the <span style="font-family:Courier;font-size:x-small">test_set_dict </span>and<span style="font-family:Courier;font-size:x-small"> </span><span style="font-family:Courier;font-size:x-small">printImageDict </span>work fine but the wrapper seems to ignore <span style="font-family:Courier;font-size:x-small">getDict()</span></div><div>and <span style="font-family:Courier;font-size:x-small">setDict(). </span>I assume this is because vtkWrapperPython does not know what to do with <span style="font-family:Courier;font-size:x-small">boost::python </span>objects. Maybe I am going about this the wrong way? I did try doing the wrapping through boost python rather than VTK but found I ran into compilation issues. </div><div><br></div><div>Any help would be very much appreciated. </div><span><font color="#888888"><div><br></div><div>Kit</div><div><br></div><div><br></div><div><br></div><br></font></span><div><blockquote type="cite"><span><div>On 29 Jul 2016, at 17:07, David Gobbi <<a href="mailto:david.gobbi@gmail.com" target="_blank">david.gobbi@gmail.com</a>> wrote:</div><br></span><div><div><div><div dir="ltr">Hi Kit,<div><br></div><div>It's most likely because the class is missing vtkTypeMacro:</div><div><br></div><div>vtkTypeMacro(vtkNewData, vtkImageData);</div><div><br></div><div> - David</div><div><br></div><div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 29, 2016 at 9:02 AM, Kit Chambers <span dir="ltr"><<a href="mailto:kit.chambers.kc@gmail.com" target="_blank">kit.chambers.kc@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word">Hi,<div><br></div><div>I am trying to wrap a custom class derived from vtkImageData in python. And it works except for when i try to access my custom methods. For example:</div><div><br></div><font face="Courier New"><span>import vtkNewDataPython as idp<br></span><span><br>mydata = idp.vtkNewData()<br><br>print "\nvtkImageData functionality"<br>mydata.SetDimensions(2,3,1)<br>dims = mydata.GetDimensions()<br>print "image dimensions =",dims<br>print "Number of points: ",mydata.GetNumberOfPoints()<br>print "Number of cells: ",mydata.GetNumberOfCells()<br><br>print "\ncustom functionality" <br>mydata.set_myvalue()<br>print "Myvalue = ", mydata.get_myvalue()<br></span></font><span><br></span><span><br></span><div>Produces:</div><div><div><font face="Courier New">vtkImageData functionality</font></div><div><font face="Courier New">image dimensions = (2, 3, 1)</font></div><div><font face="Courier New">Number of points:  6</font></div><div><font face="Courier New">Number of cells:  2</font></div><div><font face="Courier New"><br></font></div><div><font face="Courier New">custom functionality</font></div><div><font face="Courier New">Traceback (most recent call last):</font></div><div><font face="Courier New">  File "./pytest.py", line 14, in <module></font></div><div><font face="Courier New">    mydata.set_myvalue()</font></div><div><font face="Courier New">AttributeError: set_myvalue</font></div></div><div><br></div><div><br></div><div>Basically it is doing just fine up until I try to call a custom method</div><div><br></div><div>The class looks like this:</div><div><br></div><div style="margin:0px;line-height:normal"><font face="Courier New">#include "vtkImageData.h"</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier New"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier New">class VTK_EXPORT vtkNewData: public vtkImageData</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">{</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">public:</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">  static vtkNewData *New();</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">  void set_myvalue(){</font></div><div style="margin:0px;line-height:normal"><font face="Courier New"><span style="white-space:pre-wrap">     </span>  this->myvalue=3;</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">  }</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">  int get_myvalue(){</font></div><div style="margin:0px;line-height:normal"><font face="Courier New"><span style="white-space:pre-wrap">  </span>  return this->myvalue;</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">  }</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">  int myvalue;</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">};</font></div><div style="margin:0px;line-height:normal"><font face="Courier New"><br></font></div><div style="margin:0px;line-height:normal"><br></div><div style="margin:0px;line-height:normal">The CmakeLists.txt is adapted mostly from <a href="https://github.com/paulmelis/vtk-wrapping-example" target="_blank">https://github.com/paulmelis/vtk-wrapping-example</a> and looks like this</div><div style="margin:0px;line-height:normal"><br></div><div style="margin:0px;line-height:normal"><br></div><div style="margin:0px;line-height:normal"><div style="margin:0px;line-height:normal"><font face="Courier New">#######################################</font></div><div style="margin:0px;line-height:normal"><font face="Courier New"># Pre-requisites</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier New"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier New"># C++11 flags</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier New"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier New"># VTK</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">find_package(VTK REQUIRED</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">                vtkCommonCore</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">                vtkCommonDataModel</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">                vtkWrappingPythonCore                  </font></div><div style="margin:0px;line-height:normal"><font face="Courier New">            )</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">include(${VTK_USE_FILE})</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier New"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier New"># Python and vtk wrapping</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">find_package(PythonLibs 2.7 EXACT REQUIRED)</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">include(vtkWrapPython)</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">include_directories("${PYTHON_INCLUDE_PATH}")</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier New"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier New">#######################################</font></div><div style="margin:0px;line-height:normal"><font face="Courier New"># Building vtkNewData</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">add_library(vtkNewData SHARED vtkNewData.cxx)</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">TARGET_LINK_LIBRARIES(vtkNewData ${VTK_LIBRARIES} )</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">if(APPLE) </font></div><div style="margin:0px;line-height:normal"><font face="Courier New">    set_target_properties(vtkNewData PROPERTIES SUFFIX ".so")</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">endif()</font></div></div><div style="margin:0px;line-height:normal"><div style="margin:0px;line-height:normal"><font face="Courier New"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier New">#######################################</font></div><div style="margin:0px;line-height:normal"><font face="Courier New"># Wrapping vtkNewData</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">vtk_wrap_python3(vtkNewDataPython vtkNewDataPython_SRCS vtkNewData.cxx)</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier New"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier New">add_library(vtkNewDataPythonD ${vtkNewDataPython_SRCS} vtkNewData.cxx)</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">target_link_libraries(vtkNewDataPythonD         </font></div><div style="margin:0px;line-height:normal"><font face="Courier New">        ${VTK_LIBRARIES}</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">        vtkWrappingPythonCore </font></div><div style="margin:0px;line-height:normal"><font face="Courier New">        ${VTK_PYTHON_LIBRARIES})</font></div><div style="margin:0px;line-height:normal;min-height:15px"><br></div><div style="margin:0px;line-height:normal"><font face="Courier New">add_library(vtkNewDataPython MODULE vtkNewDataPythonInit.cxx)</font></div><div style="margin:0px;line-height:normal"><font face="Courier New"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier New">set(VTK_MODULES_USED vtkCommonDataModel vtkCommonCore) </font></div><div style="margin:0px;line-height:normal"><font face="Courier New">set(VTK_PYTHOND_LIBS)</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">foreach(TMP_LIB ${VTK_MODULES_USED})</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">   set(VTK_PYTHOND_LIBS ${VTK_PYTHOND_LIBS} ${TMP_LIB}PythonD)</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">endforeach()  </font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier New"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier New">target_link_libraries(vtkNewDataPython vtkNewDataPythonD ${VTK_PYTHOND_LIBS})</font></div><div style="margin:0px;line-height:normal;min-height:15px"><font face="Courier New"><br></font></div><div style="margin:0px;line-height:normal"><font face="Courier New">set_target_properties(vtkNewDataPython PROPERTIES PREFIX "")</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">if(WIN32 AND NOT CYGWIN)</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">    set_target_properties(vtkNewDataPython PROPERTIES SUFFIX ".pyd")</font></div><div style="margin:0px;line-height:normal"><font face="Courier New">endif(WIN32 AND NOT CYGWIN)</font></div></div><div style="margin:0px;line-height:normal"><br></div><div style="margin:0px;line-height:normal"><br></div><div style="margin:0px;line-height:normal">I suspect there is something very simple I am missing here but cannot for the life of me think what. Any help would be appreciated.</div><div style="margin:0px;line-height:normal"><br></div><div style="margin:0px;line-height:normal"><br></div><div style="margin:0px;line-height:normal">Cheers</div><span><font color="#888888"><div style="margin:0px;line-height:normal"><br></div><div style="margin:0px;line-height:normal">Kit</div></font></span></div></blockquote></div><br></div></div></div>
</div></div></div></blockquote></div><br></div></blockquote></div><br></div></div>