boost :: python конвертировать std :: array

Я использую std :: array для определения 2D точек для функции кратчайшего пути.

typedef std::array<double, 2> point_xy_t;
typedef std::vector<point_xy_t> path_t;
path_t search(const point_xy_t& start, const point_xy_t& goal);

На данный момент мое лучшее решение — преобразовать точки (std :: array) в std :: vector и использовать boost :: python :: vector_indexing_suite как:

bpy::class_<std::vector<double> >("Point")
.def(bpy::vector_indexing_suite<std::vector<double> >())
;
bpy::class_<std::vector<std::vector<double>> >("Path")
.def(bpy::vector_indexing_suite<std::vector<std::vector<double>> >())
;

Можно ли индексировать или конвертировать напрямую из / в std :: array в / из python?

2

Решение

Чтобы придать этому питоническому виду, я бы использовал комбинацию boost::python::extract, tupleи list«S. Вот эскиз:

static bpy::list py_search(bpy::tuple start, bpy::tuple goal) {
// optionally check that start and goal have the required
// size of 2 using bpy::len()

// convert arguments and call the C++ search method
std::array<double,2> _start = {bpy::extract<double>(start[0]), bpy::extract<double>(start[1])};
std::array<double,2> _goal  = {bpy::extract<double>(goal[0]), bpy::extract<double>(goal[1])};
std::vector<std::array<double,2>> cxx_retval = search(_start, _goal);

// converts the returned value into a list of 2-tuples
bpy::list retval;
for (auto &i : cxx_retval) retval.append(bpy::make_tuple(i[0], i[1]));
return retval;
}

Тогда привязки будут выглядеть так:

bpy::def("search", &py_search);
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]