2013-08-21 2 views
2

std :: array를 사용하여 최단 경로 함수에 대한 2D 점을 정의했습니다.boost :: python std :: array convert

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>> >()) 
; 

이 될 것이라고 : 지금은

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 벡터 및로 부스트 :: 파이썬 :: vector_indexing_suite를 사용하는 점을 (표준 : 배열)를 변환하는 것입니다 가능한 인덱스 또는 직접/std :: array/python 변환 할?

+1

[이] (http://stackoverflow.com/a/15940413/1053968) 답변이 도움이 될 수있다 여기에 스케치입니다. 여러 차원을 포함하여 컬렉션에 대해 사용자 지정 변환기를 등록하는 방법을 보여줍니다. –

답변

2

pythonic 모양을 부여하려면 boost::python::extract, tuplelist의 조합을 사용합니다.

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);