Commit d395b74d authored by acpaquette's avatar acpaquette Committed by amystamile-usgs
Browse files

Initial changes for isis pvl python interface

parent c1e5823a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ find files of those names at the top level of this repository. **/
#include <QTemporaryFile>

#include "Preference.h"
#include "PvlGroup.h"
#include "IException.h"
#include "IString.h"

@@ -843,6 +844,10 @@ namespace Isis {

    int varSearchStartPos = 0;
    int varStartPos = -1;
    if(Preference::Preferences().hasGroup("DataDirectory")) {
      PvlGroup &testing = Preference::Preferences().findGroup("DataDirectory");
      cout << testing << endl;
    }
    // Loop while there are any "$" at the current position or after
    // Some "$" might be skipped if no translation can be found
    while((varStartPos = expandedStr.indexOf("$", varSearchStartPos)) != -1) {
@@ -886,6 +891,7 @@ namespace Isis {
          }
        }
      }
      cout << expandedStr << endl;

      if (variableValid) {
        // We could expand multiple times...
+38 −38
Original line number Diff line number Diff line
%module isisblob
%module(package="isisio") Blob
%{
    #include "Blob.h"
%}
@@ -6,40 +6,40 @@
%include "Blob.h"
%nodefaultdtor Isis::Blob;

%extend Isis::Blob {

  Blob(const char* name, const char* type) {
    QString qname(name);
    QString qtype(type);
    Isis::Blob *blob = new Isis::Blob(qname, qtype);
    return blob;
  }

  Blob(const char* name, const char* type, const char* file) {
    QString qname(name);
    QString qtype(type);
    QString qfile(file);
    Isis::Blob *blob = new Isis::Blob(qname, qtype, file);
    return blob;
  }

  void Write(const char *file) {
    QString qfile(file);

    $self->Write(file);
  }

  char * getStringBuffer() {
    int bufferSize = $self->Size();
    char * buffer = $self->getBuffer();
    std::ostringstream os;
    for (int i = 0; i < bufferSize; i++) os << buffer[i];
    os << '\0';

    std::string str = os.str();
    char * cstr = new char [str.length()+1];
    std::strcpy (cstr, str.c_str());
    return cstr;
  }

}
// %extend Isis::Blob {

//   Blob(const char* name, const char* type) {
//     QString qname(name);
//     QString qtype(type);
//     Isis::Blob *blob = new Isis::Blob(qname, qtype);
//     return blob;
//   }

//   Blob(const char* name, const char* type, const char* file) {
//     QString qname(name);
//     QString qtype(type);
//     QString qfile(file);
//     Isis::Blob *blob = new Isis::Blob(qname, qtype, file);
//     return blob;
//   }

//   void Write(const char *file) {
//     QString qfile(file);

//     $self->Write(file);
//   }

//   char * getStringBuffer() {
//     int bufferSize = $self->Size();
//     char * buffer = $self->getBuffer();
//     std::ostringstream os;
//     for (int i = 0; i < bufferSize; i++) os << buffer[i];
//     os << '\0';

//     std::string str = os.str();
//     char * cstr = new char [str.length()+1];
//     std::strcpy (cstr, str.c_str());
//     return cstr;
//   }

// }
+147 −29
Original line number Diff line number Diff line
%module isisio

%{
    #include <QString>
    #include <array>
    #include <vector> 
    #include <string>
    #include <sstream>
%}

%include std_string.i
%include std_vector.i
%include exception.i
%include "std_vector.i"
%include "std_string.i"
%include "std_array.i"
%include "std_map.i"
%include "carrays.i"
%include "std_pair.i"
%include "exception.i"

%include "pvlKeyword.i"
%include "PvlContainer.h"
%include "pvlGroup.i"
#include <nlohmann/json.hpp>
#include <QVector>
#include <QString>

%typemap(in) nlohmann::json {
  if (PyDict_Check($input) || PyList_Check($input)) {
    PyObject* module = PyImport_ImportModule("json");
    PyObject* jsonDumps = PyUnicode_FromString("dumps");
    PyObject* pythonJsonString = PyObject_CallMethodObjArgs(module, jsonDumps, $input, NULL);
    $1 = nlohmann::json::parse(PyUnicode_AsUTF8(pythonJsonString));
  }
  else {
    PyErr_SetString(PyExc_TypeError, "not a json serializable type");
    SWIG_fail;
  }
}

%typemap(typecheck, precedence=SWIG_TYPECHECK_MAP) nlohmann::json {
  $1 = PyDict_Check($input) ? 1 : 0;
}

%typemap(out) nlohmann::json {
  PyObject* module = PyImport_ImportModule("json");
  PyObject* jsonLoads = PyUnicode_FromString("loads");
  std::string jsonString = ($1).dump();
  PyObject* pythonJsonString = PyUnicode_DecodeUTF8(jsonString.c_str(), jsonString.size(), NULL);
  $result = PyObject_CallMethodObjArgs(module, jsonLoads, pythonJsonString, NULL);
}

%typemap(in) QVector<QString> & {
  int i;
  if (!PySequence_Check($input)) {
    PyErr_SetString(PyExc_ValueError,"Expected a List");
    SWIG_fail;
  }

  int size = PySequence_Length($input);
  $1 = new QVector<QString>(size);
  
  for (i = 0; i < size; i++) {
    PyObject *o = PySequence_GetItem($input,i);
    if (PyUnicode_Check(o)) {
      QString s = QString::fromUtf8(PyUnicode_AsUTF8(o));
      (*$1)[i] = s; 
    } else {
      PyErr_SetString(PyExc_ValueError,"Sequence elements must be string");      
      SWIG_fail;
    }
  }
}

%include "pvlObject.i"
%nodefaultdtor Isis::PvlObject;


class QString
{
public:
    static QString fromStdString(const std::string &s);
    std::string toStdString() const;
    QString(const char* str);
    ~QString();
%typemap(out) QVector<QString> & {
  $result = PyList_New($1_dim0);
  for (i = 0; i < $1_dim0; i++) {
    PyObject *o = PyString_AsString($1->at(i));
    PyList_SetItem($result,i,o);
  }
}


%typemap(in) QString const & {
  if (!PyUnicode_Check($input)) {
    PyErr_SetString(PyExc_ValueError,"Expected a String");
    SWIG_fail;
  }
  $1 = new QString(QString::fromUtf8(PyUnicode_AsUTF8($input))); 
}

    int size() const;
    int count() const;
    int length() const;
    bool isEmpty() const;
};

%typemap(out) QString const & {
  $result = Py_BuildValue("s#", $1.toStdString().c_str(), $1.size());
}


%typemap(in) QString {
  if (!PyUnicode_Check($input)) {
    std::cout << "TANGERINE" << std::endl;
    PyErr_SetString(PyExc_ValueError,"Expected a String");
    SWIG_fail;
  }
  $1 = QString::fromUtf8(PyUnicode_AsUTF8($input)); 
}

%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) QString {
    $1 = !PyUnicode_Check($input);
    std::cout << PyUnicode_AsUTF8($input) << std::endl;
}

%typemap(out) QString = QString const &;

%typemap(in) QVector<QString> {
  int i;
  if (!PySequence_Check($input)) {
    PyErr_SetString(PyExc_ValueError,"Expected a List");
    SWIG_fail;
  }

  int size = PySequence_Length($input);
  $1 = new QVector<QString>(size);
  
  for (i = 0; i < size; i++) {
    PyObject *o = PySequence_GetItem($input,i);
    if (PyUnicode_Check(o)) {
      QString s = QString::fromUtf8(PyUnicode_AsUTF8(o));
      (*$1)[i] = s; 
    } else {
      PyErr_SetString(PyExc_ValueError,"Sequence elements must be string");      
      SWIG_fail;
    }
  }
}


%typemap(out) QVector<QString> = QVector<QString> &;

namespace std {
  %template(IntVector) vector<int>;
  %template(DoubleVector) vector<double>;
  %template(VectorDoubleVector) vector< vector<double> >;
  %template(StringVector) vector<string>;
  %template(ConstCharVector) vector<const char*>;
  %template(PairDoubleVector) vector<pair<double, double>>;
  %template(DoubleArray6) array<double, 6>;
}

%exception {
  try {
@@ -41,5 +153,11 @@ public:
  }
}

%include "pvlKeyword.i"
%include "PvlContainer.h"
%include "pvlGroup.i"
%include "pvlObject.i"
%nodefaultdtor Isis::PvlObject;
// %include "UserInterface.i"
%include "isisblob.i"
%include "isispvl.i"
+0 −32
Original line number Diff line number Diff line
@@ -5,35 +5,3 @@

%include "Pvl.h"
%nodefaultdtor Isis::Pvl;

%extend Isis::Pvl {
  const char* __str__() {
    std::ostringstream out;
    out << *$self;
    std::string str = out.str();
    char * cstr = new char [str.length()+1];
    std::strcpy (cstr, str.c_str());
    return cstr;
  }

  Pvl(const char* file) {
    QString qfile(file);
    Isis::Pvl *pvl = new Isis::Pvl(qfile);
    return pvl;
  }

  void readString(const char *pvlString) {
    std::istringstream in(pvlString);
    in >> *$self;
  }

  void read(const char* file) {
    QString qfile(file);
    $self->read(qfile);
  }

  void write(const char* file) {
    QString qfile(file);
    $self->write(qfile);
  }
}
+0 −17
Original line number Diff line number Diff line
@@ -4,20 +4,3 @@
%}

%include "PvlGroup.h"

%extend Isis::PvlGroup {
  const char* __str__() {
    std::ostringstream out;
    out << *$self;
    std::string str = out.str();
    char * cstr = new char [str.length()+1];
    std::strcpy (cstr, str.c_str());
    return cstr;
  }

  PvlGroup(const char* groupName) {
    QString qgroupName(groupName);
    Isis::PvlGroup *group = new Isis::PvlGroup(qgroupName);
    return group;
  }
}
Loading