13 template <
typename Vector,
14 typename holder_type = std::unique_ptr<Vector>,
17 py::module &m, std::string
const &
name, Args &&...args) {
20 using Class_ = py::class_<Vector, holder_type>;
21 Class_ cl(m,
name.c_str(), std::forward<Args>(args)...);
24 "__bool__", [](
const Vector &v) ->
bool {
return !v.empty(); },
25 "Check whether the list is nonempty");
37 template <
typename EigenVector>
39 py::array_t<double> array) {
41 if (!(array.flags() & (py::array::c_style))) {
43 array = py::array_t<double, py::array::c_style>(array);
45 int64_t eigen_vector_size = EigenVector::SizeAtCompileTime;
46 if (array.ndim() != 2 || array.shape(1) != eigen_vector_size) {
47 throw py::cast_error();
49 std::vector<EigenVector> eigen_vectors(array.shape(0));
50 auto array_unchecked = array.mutable_unchecked<2>();
51 for (
auto i = 0; i < array_unchecked.shape(0); ++i) {
55 eigen_vectors[i] = Eigen::Map<EigenVector>(&array_unchecked(i, 0));
60 template <
typename EigenVector>
62 if (!(array.flags() & (py::array::c_style))) {
63 array = py::array_t<int, py::array::c_style>(array);
65 int64_t eigen_vector_size = EigenVector::SizeAtCompileTime;
66 if (array.ndim() != 2 || array.shape(1) != eigen_vector_size) {
67 throw py::cast_error();
69 std::vector<EigenVector> eigen_vectors(array.shape(0));
70 auto array_unchecked = array.mutable_unchecked<2>();
71 for (
auto i = 0; i < array_unchecked.shape(0); ++i) {
72 eigen_vectors[i] = Eigen::Map<EigenVector>(&array_unchecked(i, 0));
77 template <
typename EigenVector,
78 typename EigenAllocator = Eigen::aligned_allocator<EigenVector>>
79 std::vector<EigenVector, EigenAllocator>
81 if (!(array.flags() & (py::array::c_style))) {
82 array = py::array_t<int, py::array::c_style>(array);
84 int64_t eigen_vector_size = EigenVector::SizeAtCompileTime;
85 if (array.ndim() != 2 || array.shape(1) != eigen_vector_size) {
86 throw py::cast_error();
88 std::vector<EigenVector, EigenAllocator> eigen_vectors(array.shape(0));
89 auto array_unchecked = array.mutable_unchecked<2>();
90 for (
auto i = 0; i < array_unchecked.shape(0); ++i) {
91 eigen_vectors[i] = Eigen::Map<EigenVector>(&array_unchecked(i, 0));
96 template <
typename EigenVector,
97 typename EigenAllocator = Eigen::aligned_allocator<EigenVector>>
98 std::vector<EigenVector, EigenAllocator>
100 if (!(array.flags() & (py::array::c_style))) {
101 array = py::array_t<int64_t, py::array::c_style>(array);
103 int64_t eigen_vector_size = EigenVector::SizeAtCompileTime;
104 if (array.ndim() != 2 || array.shape(1) != eigen_vector_size) {
105 throw py::cast_error();
107 std::vector<EigenVector, EigenAllocator> eigen_vectors(array.shape(0));
108 auto array_unchecked = array.mutable_unchecked<2>();
109 for (
auto i = 0; i < array_unchecked.shape(0); ++i) {
110 eigen_vectors[i] = Eigen::Map<EigenVector>(&array_unchecked(i, 0));
112 return eigen_vectors;
119 template <
typename Scalar,
120 typename Vector = std::vector<Scalar>,
121 typename holder_type = std::unique_ptr<Vector>>
122 py::class_<Vector, holder_type> pybind_eigen_vector_of_scalar(
123 py::module &m,
const std::string &bind_name) {
124 auto vec = py::bind_vector<std::vector<Scalar>>(m, bind_name,
125 py::buffer_protocol());
126 vec.def_buffer([](std::vector<Scalar> &v) -> py::buffer_info {
127 return py::buffer_info(v.data(),
sizeof(Scalar),
129 {v.size()}, {sizeof(Scalar)});
132 [](std::vector<Scalar> &v) {
return std::vector<Scalar>(v); });
133 vec.def(
"__deepcopy__", [](std::vector<Scalar> &v, py::dict &memo) {
134 return std::vector<Scalar>(v);
149 template <
typename EigenVector,
150 typename Vector = std::vector<EigenVector>,
151 typename holder_type = std::unique_ptr<Vector>,
153 py::class_<Vector, holder_type> pybind_eigen_vector_of_vector(
155 const std::string &bind_name,
156 const std::string &repr_name,
157 InitFunc init_func) {
158 typedef typename EigenVector::Scalar Scalar;
159 auto vec = py::bind_vector_without_repr<std::vector<EigenVector>>(
160 m, bind_name, py::buffer_protocol());
161 vec.def(py::init(init_func));
162 vec.def_buffer([](std::vector<EigenVector> &v) -> py::buffer_info {
163 size_t rows = EigenVector::RowsAtCompileTime;
164 return py::buffer_info(v.data(),
sizeof(Scalar),
167 {sizeof(EigenVector), sizeof(Scalar)});
169 vec.def(
"__repr__", [repr_name](
const std::vector<EigenVector> &v) {
170 return repr_name + std::string(
" with ") +
std::to_string(v.size()) +
171 std::string(
" elements.\n") +
172 std::string(
"Use numpy.asarray() to access data.");
174 vec.def(
"__copy__", [](std::vector<EigenVector> &v) {
175 return std::vector<EigenVector>(v);
177 vec.def(
"__deepcopy__", [](std::vector<EigenVector> &v, py::dict &memo) {
178 return std::vector<EigenVector>(v);
182 using Class_ = py::class_<Vector, std::unique_ptr<Vector>>;
183 py::detail::vector_if_copy_constructible<Vector, Class_>(vec);
184 py::detail::vector_if_equal_operator<Vector, Class_>(vec);
185 py::detail::vector_modifiers<Vector, Class_>(vec);
186 py::detail::vector_accessor<Vector, Class_>(vec);
220 template <
typename EigenVector,
221 typename EigenAllocator = Eigen::aligned_allocator<EigenVector>,
222 typename Vector = std::vector<EigenVector, EigenAllocator>,
223 typename holder_type = std::unique_ptr<Vector>,
225 py::class_<Vector, holder_type> pybind_eigen_vector_of_vector_eigen_allocator(
227 const std::string &bind_name,
228 const std::string &repr_name,
229 InitFunc init_func) {
230 typedef typename EigenVector::Scalar Scalar;
232 std::vector<EigenVector, EigenAllocator>>(m, bind_name,
233 py::buffer_protocol());
234 vec.def(py::init(init_func));
236 [](std::vector<EigenVector, EigenAllocator> &v) -> py::buffer_info {
237 size_t rows = EigenVector::RowsAtCompileTime;
238 return py::buffer_info(v.data(),
sizeof(Scalar),
241 {sizeof(EigenVector), sizeof(Scalar)});
244 [repr_name](
const std::vector<EigenVector, EigenAllocator> &v) {
245 return repr_name + std::string(
" with ") +
247 std::string(
"Use numpy.asarray() to access data.");
249 vec.def(
"__copy__", [](std::vector<EigenVector, EigenAllocator> &v) {
250 return std::vector<EigenVector, EigenAllocator>(v);
252 vec.def(
"__deepcopy__",
253 [](std::vector<EigenVector, EigenAllocator> &v, py::dict &memo) {
254 return std::vector<EigenVector, EigenAllocator>(v);
258 using Class_ = py::class_<Vector, std::unique_ptr<Vector>>;
259 py::detail::vector_if_copy_constructible<Vector, Class_>(vec);
260 py::detail::vector_if_equal_operator<Vector, Class_>(vec);
261 py::detail::vector_modifiers<Vector, Class_>(vec);
262 py::detail::vector_accessor<Vector, Class_>(vec);
267 template <
typename EigenMatrix,
268 typename EigenAllocator = Eigen::aligned_allocator<EigenMatrix>,
269 typename Vector = std::vector<EigenMatrix, EigenAllocator>,
270 typename holder_type = std::unique_ptr<Vector>>
271 py::class_<Vector, holder_type> pybind_eigen_vector_of_matrix(
273 const std::string &bind_name,
274 const std::string &repr_name) {
275 typedef typename EigenMatrix::Scalar Scalar;
277 std::vector<EigenMatrix, EigenAllocator>>(m, bind_name,
278 py::buffer_protocol());
280 [](std::vector<EigenMatrix, EigenAllocator> &v) -> py::buffer_info {
283 size_t rows = EigenMatrix::RowsAtCompileTime;
284 size_t cols = EigenMatrix::ColsAtCompileTime;
285 return py::buffer_info(v.data(),
sizeof(Scalar),
287 3, {v.size(), rows, cols},
288 {sizeof(EigenMatrix), sizeof(Scalar),
289 sizeof(Scalar) * rows});
292 [repr_name](
const std::vector<EigenMatrix, EigenAllocator> &v) {
293 return repr_name + std::string(
" with ") +
295 std::string(
"Use numpy.asarray() to access data.");
297 vec.def(
"__copy__", [](std::vector<EigenMatrix, EigenAllocator> &v) {
298 return std::vector<EigenMatrix, EigenAllocator>(v);
300 vec.def(
"__deepcopy__",
301 [](std::vector<EigenMatrix, EigenAllocator> &v, py::dict &memo) {
302 return std::vector<EigenMatrix, EigenAllocator>(v);
306 using Class_ = py::class_<Vector, std::unique_ptr<Vector>>;
307 py::detail::vector_if_copy_constructible<Vector, Class_>(vec);
308 py::detail::vector_if_equal_operator<Vector, Class_>(vec);
309 py::detail::vector_modifiers<Vector, Class_>(vec);
310 py::detail::vector_accessor<Vector, Class_>(vec);
321 auto intvector = pybind_eigen_vector_of_scalar<int>(m,
"IntVector");
323 py::cpp_function([](py::handle arg) -> std::string {
324 return R
"(Convert int32 numpy array of shape ``(n,)`` to CloudViewer format.)";
326 py::none(), py::none(), "");
329 pybind_eigen_vector_of_scalar<double>(m,
"DoubleVector");
331 py::cpp_function([](py::handle arg) -> std::string {
332 return R
"(Convert float64 numpy array of shape ``(n,)`` to CloudViewer format.)";
334 py::none(), py::none(), "");
336 auto vector3dvector = pybind_eigen_vector_of_vector<Eigen::Vector3d>(
337 m,
"Vector3dVector",
"std::vector<Eigen::Vector3d>",
338 py::py_array_to_vectors_double<Eigen::Vector3d>);
340 py::cpp_function([](py::handle arg) -> std::string {
341 return R
"(Convert float64 numpy array of shape ``(n, 3)`` to CloudViewer format.
345 .. code-block:: python
350 pcd = cloudViewer.geometry.ccPointCloud()
351 np_points = np.random.rand(100, 3)
353 # From numpy to CloudViewer
354 pcd.set_points(cloudViewer.utility.Vector3dVector(np_points))
356 # From CloudViewer to numpy
357 np_points = np.asarray(pcd.get_points())
360 py::none(), py::none(), "");
362 auto vector3ivector = pybind_eigen_vector_of_vector<Eigen::Vector3i>(
363 m,
"Vector3iVector",
"std::vector<Eigen::Vector3i>",
364 py::py_array_to_vectors_int<Eigen::Vector3i>);
366 py::cpp_function([](py::handle arg) -> std::string {
367 return R
"(Convert int32 numpy array of shape ``(n, 3)`` to CloudViewer format..
371 .. code-block:: python
378 # [0: (-1, 2)]__________[1: (1, 2)]
383 # [2: (0, 0)]\/________\[3: (2, 0)]
387 mesh = cloudViewer.geometry.ccMesh()
388 mesh.create_internal_cloud()
389 np_vertices = np.array([[-1, 2, 0],
393 np_triangles = np.array([[0, 2, 1],
394 [1, 2, 3]]).astype(np.int32)
395 mesh.set_vertices(cloudViewer.Vector3dVector(np_vertices))
397 # From numpy to CloudViewer
398 mesh.set_triangles(cloudViewer.Vector3iVector(np_triangles))
400 # From CloudViewer to numpy
401 np_triangles = np.asarray(mesh.triangles)
404 py::none(), py::none(), "");
406 auto vector2ivector = pybind_eigen_vector_of_vector<Eigen::Vector2i>(
407 m,
"Vector2iVector",
"std::vector<Eigen::Vector2i>",
408 py::py_array_to_vectors_int<Eigen::Vector2i>);
410 py::cpp_function([](py::handle arg) -> std::string {
411 return "Convert int32 numpy array of shape ``(n, 2)`` to "
412 "CloudViewer format.";
414 py::none(), py::none(),
"");
416 auto vector2dvector = pybind_eigen_vector_of_vector<Eigen::Vector2d>(
417 m,
"Vector2dVector",
"std::vector<Eigen::Vector2d>",
418 py::py_array_to_vectors_double<Eigen::Vector2d>);
420 py::cpp_function([](py::handle arg) -> std::string {
421 return "Convert float64 numpy array of shape ``(n, 2)`` to "
422 "CloudViewer format.";
424 py::none(), py::none(),
"");
426 auto matrix3dvector =
427 pybind_eigen_vector_of_matrix<Eigen::Matrix3d,
428 std::allocator<Eigen::Matrix3d>>(
429 m,
"Matrix3dVector",
"std::vector<Eigen::Matrix3d>");
431 py::cpp_function([](py::handle arg) -> std::string {
432 return "Convert float64 numpy array of shape ``(n, 3, 3)`` to "
433 "CloudViewer format.";
435 py::none(), py::none(),
"");
437 auto matrix4dvector = pybind_eigen_vector_of_matrix<Eigen::Matrix4d>(
438 m,
"Matrix4dVector",
"std::vector<Eigen::Matrix4d>");
440 py::cpp_function([](py::handle arg) -> std::string {
441 return "Convert float64 numpy array of shape ``(n, 4, 4)`` to "
442 "CloudViewer format.";
444 py::none(), py::none(),
"");
446 auto vector4ivector = pybind_eigen_vector_of_vector_eigen_allocator<
448 m,
"Vector4iVector",
"std::vector<Eigen::Vector4i>",
449 py::py_array_to_vectors_int_eigen_allocator<Eigen::Vector4i>);
451 py::cpp_function([](py::handle arg) -> std::string {
452 return "Convert int numpy array of shape ``(n, 4)`` to "
453 "CloudViewer format.";
455 py::none(), py::none(),
"");
filament::Texture::InternalFormat format
py::handle static_property
void pybind_eigen(py::module &m)
Generic file read and write utility for python interface.
Eigen::Matrix< Index, 4, 1 > Vector4i
std::string to_string(const T &n)
std::vector< EigenVector, EigenAllocator > py_array_to_vectors_int_eigen_allocator(py::array_t< int > array)
py::class_< Vector, holder_type > bind_vector_without_repr(py::module &m, std::string const &name, Args &&...args)
std::vector< EigenVector > py_array_to_vectors_int(py::array_t< int > array)
std::vector< EigenVector > py_array_to_vectors_double(py::array_t< double > array)
std::vector< EigenVector, EigenAllocator > py_array_to_vectors_int64_eigen_allocator(py::array_t< int64_t > array)