Changeset 9014:688dcc01cc98 in orange


Ignore:
Timestamp:
09/26/11 00:29:07 (3 years ago)
Author:
matejd <matejd@…>
Branch:
default
Convert:
76ad994f09603afd7117b2fe1cc86c60b92b72cb
Message:

Added numpy.array -> native array converters in Plot3D

Location:
source/orangeqt
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • source/orangeqt/plot3d.cpp

    r8932 r9014  
    33#include <limits> 
    44#include <QGLFormat> 
     5#include <numpy/arrayobject.h> 
    56 
    67#ifdef _WIN32 // Should be defined by most Windows compilers 
     
    3435    data_array = NULL; 
    3536    valid_data = NULL; 
     37    num_examples = 0; 
     38    example_size = 0; 
     39    num_selected_vertices = 0; 
     40    num_unselected_vertices = 0; 
     41    num_edges_vertices = 0; 
     42 
     43    // Initialize numpy C-API 
     44    import_array(); 
    3645} 
    3746 
     
    4453        glDeleteBuffers(1, &vbo_edges_id); 
    4554    } 
     55 
     56    if (data_array != NULL) 
     57        delete [] data_array; 
     58 
     59    if (valid_data != NULL) 
     60        delete [] valid_data; 
    4661} 
    4762 
     
    6782} 
    6883 
    69 void Plot3D::set_data(quint64 array_address, int num_examples, int example_size) 
    70 { 
    71     data_array = reinterpret_cast<float*>(array_address); // TODO: this is dangerous, make a numpy.array type or something instead 
     84void Plot3D::set_data(float* data_array, int num_examples, int example_size) 
     85{ 
     86    if (this->data_array != NULL) 
     87        delete [] this->data_array; // Clean previous data. 
     88 
     89    this->data_array = data_array;  // Data is copied to a fresh array in set_data() 
    7290    this->num_examples = num_examples; 
    7391    this->example_size = example_size; 
     
    100118} 
    101119 
    102 void Plot3D::set_valid_data(quint64 valid_data_address) 
    103 { 
    104     valid_data = reinterpret_cast<bool*>(valid_data_address); // TODO: the same as the TODO above 
     120void Plot3D::set_valid_data(bool* valid_data) 
     121{ 
     122    if (this->valid_data != NULL) 
     123        delete [] this->valid_data; 
     124 
     125    this->valid_data = valid_data;//reinterpret_cast<bool*>(valid_data_address); // TODO: the same as the TODO above 
    105126} 
    106127 
     
    110131                         bool x_discrete, bool y_discrete, bool z_discrete, bool use_2d_symbols) 
    111132{ 
     133    if (data_array == NULL) 
     134    { 
     135        std::cout << "set_data must be called before update_data!" << std::endl; 
     136        return; 
     137    } 
     138 
    112139    if (vbos_generated) 
    113140    { 
     
    483510QList<bool> Plot3D::get_selected_indices() 
    484511{ 
    485     //return selected_indices.toList(); // TODO: this crashes on adult.tab 
    486     return QList<bool>(); 
     512    return selected_indices.toList(); 
     513} 
     514 
     515int Plot3D::get_num_examples() 
     516{ 
     517    return num_examples; 
     518} 
     519 
     520bool convert_numpy_array_to_native_f(PyObject* in, float*& out_data, int& out_size) 
     521{ 
     522    if (!PyArray_Check(in)) 
     523    { 
     524        PyErr_SetString(PyExc_RuntimeError, "Unknown object type (must be numpy.array)"); 
     525        return false; 
     526    } 
     527 
     528    PyObject* array = PyArray_ContiguousFromAny(in, PyArray_FLOAT, 1, 0); // Returns a C-style contiguous and behaved (aligned + writable) array 
     529 
     530    if (!array) 
     531    { 
     532        PyErr_SetString(PyExc_RuntimeError, "Failed to make contiguous array of PyArray_FLOAT"); 
     533        return false; 
     534    } 
     535 
     536    out_size = PyArray_DIM(array, 0); 
     537    out_data = new float[out_size]; 
     538    memcpy(out_data, (float *)PyArray_DATA(array), out_size*sizeof(float)); 
     539    Py_DECREF(array); 
     540    return true; 
     541} 
     542 
     543bool convert_numpy_array_to_native_b(PyObject* in, bool*& out_data, int& out_size) 
     544{ 
     545    if (!PyArray_Check(in)) 
     546    { 
     547        PyErr_SetString(PyExc_RuntimeError, "Unknown object type (must be numpy.array)"); 
     548        return false; 
     549    } 
     550 
     551    PyObject* array = PyArray_ContiguousFromAny(in, PyArray_BOOL, 1, 0); 
     552 
     553    if (!array) 
     554    { 
     555        PyErr_SetString(PyExc_RuntimeError, "Failed to make contiguous array of PyArray_BOOL"); 
     556        return false; 
     557    } 
     558 
     559    out_size = PyArray_DIM(array, 0); 
     560    out_data = new bool[out_size]; 
     561    memcpy(out_data, (bool *)PyArray_DATA(array), out_size*sizeof(bool)); 
     562    Py_DECREF(array); 
     563    return true; 
    487564} 
    488565 
  • source/orangeqt/plot3d.h

    r8848 r9014  
    77#include <QVector4D> 
    88#include <QMatrix4x4> 
     9#include <Python.h> 
    910 
    1011#ifdef __APPLE__ // Apple OpenGL framework (What if we want to use X11 - then the include should be GL/gl.h) 
     
    2526                             const QList<QVector3D>& geometry); 
    2627 
    27     void set_data(quint64 array_address, 
     28    void set_data(float* data_array, 
    2829                  int num_examples, 
    2930                  int example_size); 
    3031 
    31     void set_valid_data(quint64 valid_data_address); // Until I get QList<bool> to work, address of numpy array will have to do 
     32    void set_valid_data(bool* valid_data); 
    3233 
    3334    void update_data(int x_index, int y_index, int z_index, 
     
    5657    QList<bool> get_selected_indices(); 
    5758 
     59    int get_num_examples(); 
     60 
    5861private: 
    5962    float* data_array; 
     
    8083}; 
    8184 
     85bool convert_numpy_array_to_native_f(PyObject* in, float*& out_data, int& out_size); 
     86bool convert_numpy_array_to_native_b(PyObject* in, bool*& out_data, int& out_size); 
     87 
    8288#endif 
  • source/orangeqt/plot3d.sip

    r8835 r9014  
    1414                             const QList<QVector3D>& geometry); 
    1515 
    16     void set_data(quint64 array_address, 
     16    void set_data(SIP_PYOBJECT, 
     17                  SIP_PYOBJECT,  // int num_examples 
     18                  SIP_PYOBJECT); // int example_size 
     19%MethodCode 
     20    int size = -1; 
     21    float* data = NULL; 
     22    int num_examples = -1; 
     23    int example_size = -1; 
     24    if (!PyInt_Check(a1) || !PyInt_Check(a2)) 
     25    { 
     26        PyErr_SetString(PyExc_RuntimeError, "Wrong argument types!"); 
     27        return 0; 
     28    } 
     29    num_examples = (int)PyInt_AsLong(a1); 
     30    example_size = (int)PyInt_AsLong(a2); 
     31    bool success = convert_numpy_array_to_native_f(a0, data, size); 
     32    if (!success) 
     33    { 
     34        return 0; 
     35    } 
     36    else if (size != num_examples * example_size) 
     37    { 
     38        delete [] data; 
     39        PyErr_SetString(PyExc_RuntimeError, "Data conversion corrupted!"); 
     40        return 0; 
     41    } 
     42    sipCpp->Plot3D::set_data(data, num_examples, example_size); 
     43%End 
     44 
     45    void set_data(float* data_array, 
    1746                  int num_examples, 
    1847                  int example_size); 
    1948 
    20     void set_valid_data(quint64 valid_data_address); // Until I get QList<bool> to work, address of numpy array will have to do 
     49    void set_valid_data(SIP_PYOBJECT); 
     50%MethodCode 
     51    int size = -1; 
     52    bool* data = NULL; 
     53    bool success = convert_numpy_array_to_native_b(a0, data, size); 
     54    if (!success) 
     55    { 
     56        return 0; 
     57    } 
     58    else if (size != sipCpp->Plot3D::get_num_examples()) 
     59    { 
     60        delete [] data; 
     61        PyErr_SetString(PyExc_RuntimeError, "Data conversion corrupted!"); 
     62        return 0; 
     63    } 
     64    sipCpp->Plot3D::set_valid_data(data); 
     65%End 
     66 
     67    void set_valid_data(bool* valid_data); 
    2168 
    2269    void update_data(int x_index, int y_index, int z_index, 
     
    4491 
    4592    QList<bool> get_selected_indices(); 
     93 
     94    int get_num_examples(); 
    4695}; 
Note: See TracChangeset for help on using the changeset viewer.