Вернуться список, используя SWIG от C до Python

1

У меня есть следующая функция C, которую я пытаюсь использовать SWIG-ify:

void    GetAttOrder(int node, DCE_ORDER order, float att[3]);

который я хочу вызвать на Python и получить доступ через:

node = 0; order = DCD_TYPR;
attitude = GetAttOrder(node, order);
attitude[0] // 45.232

Где я ранее реализовал тип DCE_ORDER как

typedef enum
{
  DCD_TPYR = 0,
  DCD_TYPR,
  DCD_TYRP,
  ...
  DCD_PRYT
} DCE_ORDER;

Я нашел документацию по подобным проблемам в документации SWIG, но мне не удавалось реализовать решение. Я также рассмотрел некоторые другие проблемы с stackoverflow (этот кажется подозрительно закрытым), также безрезультатно. Я подозреваю, что я должен использовать типографию здесь, но я молод и глуп, когда дело доходит до SWIG.

Любые предложения или указатели?

Большое спасибо.

  • 0
    Вы пытались создать float* GetAttOrder(int node, DCE_ORDER order) перегрузки float* GetAttOrder(int node, DCE_ORDER order) который вызывает ваш GetAttOrder ? Я считаю, что SWIG знает, как обрабатывать возврат указателя как список Python.
  • 0
    Нет, я не пробовал этого, но в итоге я заставил что-то работать. Я пойду вперед и отвечу сам.
Теги:
swig

1 ответ

1
Лучший ответ

Завершилось решение этого через пару дней. Если у вас есть вектор, который вы хотите получить, вы можете сделать что-то вроде:

%typemap(in, numinputs=0) float vec3out[3] (float temp[3]) {
  $1 = temp;
}

%typemap(argout) float vec3out[3] {
  int i;
  $result = PyList_New(3);
  for (i = 0; i < 3; i++) {
    PyObject *o = PyFloat_FromDouble((double) $1[i]);
    PyList_SetItem($result,i,o);
  }
}

А затем можно получить доступ к этой функции через Python, как я просил выше. Кроме того, если у вас есть другая функция, которую вы хотите передать в список (пара функций getter/setter), вы можете использовать следующий код:

%typemap(in) float vec3in[3] (float temp[3]) {
  int i;
  if (!PySequence_Check($input)) {
    PyErr_SetString(PyExc_ValueError,"Expected a sequence");
    return NULL;
  }
  if (PySequence_Length($input) != 3) {
    PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected 3 elements");
    return NULL;
  }
  for (i = 0; i < 3; i++) {
    PyObject *o = PySequence_GetItem($input,i);
    if (PyNumber_Check(o)) {
      temp[i] = (float) PyFloat_AsDouble(o);
    } else {
      PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers");
      return NULL;
    }
  }
  $1 = temp;
}

который позволит вам пройти в списке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню