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