Skip to content

Commit e76eaae

Browse files
committed
Add copying and pickling to Eigen transform
1 parent 7d8db39 commit e76eaae

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

lib/matplotlib/_eigen.pyi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import numpy as np
66

77
class Affine2d:
88
def __init__(self, matrix: Sequence[Sequence[float]] | None = ...): ...
9+
def copy(self) -> Affine2d: ...
10+
def __copy__(self) -> Affine2d: ...
11+
def __deepcopy__(self) -> Affine2d: ...
912
def get_matrix(self) -> np.ndarray: ...
1013
def is_diagonal(self) -> bool: ...
1114
def __call__(self, i: int, j: int) -> float: ...

src/_eigen.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,42 @@ PYBIND11_MODULE(_eigen, m) {
1717
}),
1818
"matrix"_a.none(false))
1919

20+
.def("copy", [](const Eigen::Affine2d& self) {
21+
return Eigen::Affine2d(self);
22+
})
23+
.def("__copy__", [](const Eigen::Affine2d& self) {
24+
return Eigen::Affine2d(self);
25+
})
26+
.def("__deepcopy__", [](const Eigen::Affine2d& self, py::dict) {
27+
return Eigen::Affine2d(self);
28+
}, "memo"_a)
29+
.def(py::pickle(
30+
[](const Eigen::Affine2d &self) { // __getstate__
31+
return py::make_tuple(
32+
self(0, 0), self(0, 1), self(0, 2),
33+
self(1, 0), self(1, 1), self(1, 2));
34+
},
35+
[](const py::tuple& t) { // __setstate__
36+
if (t.size() != 6) {
37+
throw std::runtime_error("Invalid state!");
38+
}
39+
40+
Eigen::Affine2d ret;
41+
42+
ret(0, 0) = t[0].cast<double>();
43+
ret(0, 1) = t[1].cast<double>();
44+
ret(0, 2) = t[2].cast<double>();
45+
46+
ret(1, 0) = t[3].cast<double>();
47+
ret(1, 1) = t[4].cast<double>();
48+
ret(1, 2) = t[5].cast<double>();
49+
50+
ret.makeAffine();
51+
52+
return ret;
53+
}
54+
))
55+
2056
.def("get_matrix", [](const Eigen::Affine2d& self) {
2157
return self.matrix();
2258
})

0 commit comments

Comments
 (0)