From a30d20be0491ee6b3d87d380daecc71af4975d18 Mon Sep 17 00:00:00 2001 From: Marco Biasini <marco.biasini@unibas.ch> Date: Sat, 26 Mar 2011 22:35:41 +0100 Subject: [PATCH] added repr() for vector and matrix types --- modules/geom/pymod/export_mat2.cc | 7 +++++ modules/geom/pymod/export_mat3.cc | 12 ++++++++ modules/geom/pymod/export_mat4.cc | 12 ++++++++ modules/geom/pymod/export_vec2.cc | 9 ++++++ modules/geom/pymod/export_vec3.cc | 12 ++++---- modules/geom/pymod/export_vec4.cc | 8 +++++ modules/geom/pymod/export_vecmat2_op.cc | 4 +-- modules/geom/pymod/export_vecmat3_op.cc | 4 +-- modules/geom/pymod/export_vecmat4_op.cc | 4 +-- modules/geom/tests/CMakeLists.txt | 1 + modules/geom/tests/test_repr.py | 39 +++++++++++++++++++++++++ 11 files changed, 100 insertions(+), 12 deletions(-) create mode 100644 modules/geom/tests/test_repr.py diff --git a/modules/geom/pymod/export_mat2.cc b/modules/geom/pymod/export_mat2.cc index ff8159cab..fa1e382c9 100644 --- a/modules/geom/pymod/export_mat2.cc +++ b/modules/geom/pymod/export_mat2.cc @@ -26,7 +26,13 @@ using namespace boost::python; const Real Mat2_getitem(const geom::Mat2& m, tuple i) {return m(extract<int> (i[0]),extract<int> (i[1]));} void Mat2_setitem(geom::Mat2& m,const tuple i,const Real val) {m(extract<int> (i[0]),extract<int> (i[1]))=val;} +String mat2_repr(const geom::Mat2& m) { + std::stringstream ss; + ss << "geom.Mat2(" << m(0,0) << ", " << m(0,1) << ", " + << m(1,0) << ", " << m(1,1) << ")"; + return ss.str(); +} void export_Mat2() { using namespace geom; @@ -36,6 +42,7 @@ void export_Mat2() .def(self += self) .def(self -= self) .def(self + self) + .def("__repr__", mat2_repr) .def(self - self) .def(self *= Real()) .def(self /= Real()) diff --git a/modules/geom/pymod/export_mat3.cc b/modules/geom/pymod/export_mat3.cc index 613c6f41b..4d86381a4 100644 --- a/modules/geom/pymod/export_mat3.cc +++ b/modules/geom/pymod/export_mat3.cc @@ -53,6 +53,17 @@ void Mat3_setslice(geom::Mat3& m,const slice s,const Mat2& m2) m(start0+1,start1+1)=m2(1,1); } +String mat3_repr(const geom::Mat3& m) +{ + std::stringstream ss; + + ss << "geom.Mat3(" << m(0,0) << ", " << m(0,1) << ", " << m(0,2) << ", " + << m(1, 0) << ", " << m(1,1) << ", " << m(1, 2) << ", " + << m(2, 0) << "," << m(2, 1) << ", " << m(2, 2) << ")"; + return ss.str(); +} + + void export_Mat3() { class_<Mat3>("Mat3",init<>()) @@ -61,6 +72,7 @@ void export_Mat3() .def(init<Real,Real,Real>()) .def(self += self) .def(self -= self) + .def("__repr__", mat3_repr) .def(self + self) .def(self - self) .def(self *= Real()) diff --git a/modules/geom/pymod/export_mat4.cc b/modules/geom/pymod/export_mat4.cc index 071c46d58..7a5805dc6 100644 --- a/modules/geom/pymod/export_mat4.cc +++ b/modules/geom/pymod/export_mat4.cc @@ -74,6 +74,17 @@ void Mat4_setslice3(geom::Mat4& m,const slice s,const Mat3& m2) m(start0+2,start1+2)=m2(2,2); } +String mat4_repr(const geom::Mat4& m) { + std::stringstream ss; + + ss << "geom.Mat4(" + << m(0,0) << ", " << m(0,1) << ", " << m(0,2) << ", " << m(0,3) << ", " + << m(1,0) << ", " << m(1,1) << ", " << m(1,2) << ", " << m(1,3) << ", " + << m(2,0) << ", " << m(2,1) << ", " << m(2,2) << ", " << m(2,3) << ", " + << m(3,0) << ", " << m(3,1) << ", " << m(3,2) << ", " << m(3,3) << ")"; + return ss.str(); +} + void export_Mat4() { @@ -94,6 +105,7 @@ void export_Mat4() .def(self * Vec4()) .def(self / Real()) .def(self_ns::str(self)) + .def("__repr__", mat4_repr) .def("__getitem__",Mat4_getitem) .def("__getitem__",Mat4_getslice) .def("__setitem__",Mat4_setitem) diff --git a/modules/geom/pymod/export_vec2.cc b/modules/geom/pymod/export_vec2.cc index 586b9b9d6..eec194418 100644 --- a/modules/geom/pymod/export_vec2.cc +++ b/modules/geom/pymod/export_vec2.cc @@ -27,6 +27,14 @@ using namespace boost::python; const Real Vec2_getitem(const geom::Vec2& v, int i) {return v[i];} void Vec2_setitem(geom::Vec2& v,const int i,const Real val) {v[i]=val;} + +String vec2_repr(const geom::Vec2& v) +{ + std::stringstream ss; + ss << "geom.Vec2(" << v[0] << ", " << v[1] << ")"; + return ss.str(); +} + void export_Vec2() { using namespace geom; @@ -50,6 +58,7 @@ void export_Vec2() .def(self / Real()) .def(self + self) .def(self - self) + .def("__repr__", vec2_repr) .def(self_ns::str(self)) .def("__getitem__",Vec2_getitem) .def("__setitem__",Vec2_setitem) diff --git a/modules/geom/pymod/export_vec3.cc b/modules/geom/pymod/export_vec3.cc index ce7704ddf..623671de5 100644 --- a/modules/geom/pymod/export_vec3.cc +++ b/modules/geom/pymod/export_vec3.cc @@ -31,13 +31,13 @@ geom::Vec3 NormalizeV3(const geom::Vec3& v) { return geom::Normalize(v); } - -void vec_test(const geom::Vec3List& v) +String vec3_repr(const geom::Vec3& v) { - for (size_t i=0; i<v.size(); ++i) { - std::cout << i << v[i] << std::endl; - } + std::stringstream ss; + ss << "geom.Vec3(" << v[0] << ", " << v[1] << "," << v[2] << ")"; + return ss.str(); } + void export_Vec3() { using namespace geom; @@ -64,6 +64,7 @@ void export_Vec3() .def(self_ns::str(self)) .def("__getitem__",Vec3_getitem) .def("__setitem__",Vec3_setitem) + .def("__repr__", vec3_repr) .def("GetX", &Vec3::GetX) .def("GetY", &Vec3::GetY) .def("GetZ", &Vec3::GetZ) @@ -82,5 +83,4 @@ void export_Vec3() .add_property("inertia", &Vec3List::GetInertia) .add_property("principal_axes", &Vec3List::GetPrincipalAxes) ; - def("vec_test", &vec_test); } diff --git a/modules/geom/pymod/export_vec4.cc b/modules/geom/pymod/export_vec4.cc index 409cf1cc2..bb3d80f90 100644 --- a/modules/geom/pymod/export_vec4.cc +++ b/modules/geom/pymod/export_vec4.cc @@ -26,6 +26,13 @@ using namespace boost::python; const Real Vec4_getitem(const geom::Vec4& v, int i) {return v[i];} void Vec4_setitem(geom::Vec4& v,const int i,const Real val) {v[i]=val;} +String vec4_repr(const geom::Vec4& v) +{ + std::stringstream ss; + ss << "geom.Vec4(" << v[0] << ", " << v[1] << "," << v[2] + << ", " << v[3] << ")"; + return ss.str(); +} void export_Vec4() { @@ -40,6 +47,7 @@ void export_Vec4() .def(self /= Real()) .def(self += Real()) .def(self += self) + .def("__repr__", vec4_repr) .def(self -= self) .def(-self) .def(self * Real()) diff --git a/modules/geom/pymod/export_vecmat2_op.cc b/modules/geom/pymod/export_vecmat2_op.cc index 2e5b2e568..4215e25fd 100644 --- a/modules/geom/pymod/export_vecmat2_op.cc +++ b/modules/geom/pymod/export_vecmat2_op.cc @@ -42,10 +42,10 @@ void export_VecMat2_op() def("Length",Vec2Length); def("Length2",Vec2Length2); - def("Equal",Vec2Equal); + def("Equal",Vec2Equal, (arg("v1"), arg("v2"), arg("epsilon")=EPSILON)); def("CompMultiply",Vec2CompMultiply); def("CompDivide",Vec2CompDivide); - def("Equal",Mat2Equal); + def("Equal",Mat2Equal, (arg("m1"), arg("m2"), arg("epsilon")=EPSILON)); def("Dot",Mat2Dot); def("Det",Mat2Det); def("Invert",Mat2Invert); diff --git a/modules/geom/pymod/export_vecmat3_op.cc b/modules/geom/pymod/export_vecmat3_op.cc index 9e66832f8..fe4444b75 100644 --- a/modules/geom/pymod/export_vecmat3_op.cc +++ b/modules/geom/pymod/export_vecmat3_op.cc @@ -44,11 +44,11 @@ void export_VecMat3_op() def("Length",Vec3Length); def("Length2",Vec3Length2); - def("Equal",Vec3Equal); + def("Equal",Vec3Equal, (arg("v1"), arg("v2"), arg("epsilon")=EPSILON)); def("CompMultiply",Vec3CompMultiply); def("CompDivide",Vec3CompDivide); def("Distance",Vec3Distance); - def("Equal",Mat3Equal); + def("Equal",Mat3Equal, (arg("m1"), arg("m2"), arg("epsilon")=EPSILON)); def("DihedralAngle", &DihedralAngle); def("Dot",Mat3Dot); def("Det",Mat3Det); diff --git a/modules/geom/pymod/export_vecmat4_op.cc b/modules/geom/pymod/export_vecmat4_op.cc index c4baaf63a..9d91f48bb 100644 --- a/modules/geom/pymod/export_vecmat4_op.cc +++ b/modules/geom/pymod/export_vecmat4_op.cc @@ -42,12 +42,12 @@ void export_VecMat4_op() { using namespace geom; - def("Length",Vec4Length); + def("Equal",Vec4Equal, (arg("v1"), arg("v2"), arg("epsilon")=EPSILON)); def("Length2",Vec4Length2); def("Equal",Vec4Equal); def("CompMultiply",Vec4CompMultiply); def("CompDivide",Vec4CompDivide); - def("Equal",Mat4Equal); + def("Equal",Mat4Equal, (arg("m1"), arg("m2"), arg("epsilon")=EPSILON)); def("Dot",Mat4Dot); def("Det",Mat4Det); def("Transpose",Mat4Transpose); diff --git a/modules/geom/tests/CMakeLists.txt b/modules/geom/tests/CMakeLists.txt index a7c4ab6c2..86c40f1bb 100644 --- a/modules/geom/tests/CMakeLists.txt +++ b/modules/geom/tests/CMakeLists.txt @@ -11,6 +11,7 @@ set(GEOM_UNITTESTS test_vec3.cc test_vec4.cc tests.cc + test_repr.py ) ost_unittest(geom "${GEOM_UNITTESTS}") diff --git a/modules/geom/tests/test_repr.py b/modules/geom/tests/test_repr.py new file mode 100644 index 000000000..e69358f20 --- /dev/null +++ b/modules/geom/tests/test_repr.py @@ -0,0 +1,39 @@ +import unittest +from ost import geom + +class TestRepr(unittest.TestCase): + def testReprVec2(self): + v=geom.Vec2(1,2) + v2=eval(repr(v)) + assert geom.Equal(v, v2) + + def testReprVec3(self): + v=geom.Vec3(1,2,3) + v2=eval(repr(v)) + assert geom.Equal(v, v2) + + def testReprVec4(self): + v=geom.Vec4(1,2,3,4) + v2=eval(repr(v)) + assert geom.Equal(v, v2) + + def testReprMat2(self): + m=geom.Mat2(1,2,3,4) + m2=eval(repr(m)) + assert geom.Equal(m, m2) + + def testReprMat3(self): + m=geom.Mat3(1,2,3,4,5,6,7,8,9) + m2=eval(repr(m)) + assert geom.Equal(m, m2) + + def testReprMat4(self): + m=geom.Mat4(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) + m2=eval(repr(m)) + assert geom.Equal(m, m2) + +if __name__ == "__main__": + try: + unittest.main() + except Exception, e: + print e \ No newline at end of file -- GitLab