From 4a48fe4739fd57d3d578a25661f6b3443000a2c9 Mon Sep 17 00:00:00 2001
From: Rohan Budhiraja <budhiraja@laas.fr>
Date: Fri, 29 Jan 2016 23:02:45 +0100
Subject: [PATCH] [wip/py-dynamic-graph3] Patch for inputing Eigen::Transform
 as Matrix4d

---
 py-dynamic-graph3/Makefile         |   3 +
 py-dynamic-graph3/distinfo         |   1 +
 py-dynamic-graph3/patches/patch-aa | 127 +++++++++++++++++++++++++++++
 3 files changed, 131 insertions(+)
 create mode 100644 py-dynamic-graph3/patches/patch-aa

diff --git a/py-dynamic-graph3/Makefile b/py-dynamic-graph3/Makefile
index aca5a7b9..f83b9c0c 100644
--- a/py-dynamic-graph3/Makefile
+++ b/py-dynamic-graph3/Makefile
@@ -4,6 +4,8 @@
 
 DISTNAME=		dynamic-graph-python-${VERSION}
 VERSION=		3.0.0
+PKGREVISION=		1
+
 PKGNAME=		${PKGTAG.python-}dynamic-graph-${VERSION}
 MASTER_SITES=		${MASTER_SITE_OPENROBOTS:=dynamic-graph-python/}
 MASTER_REPOSITORY=	${MASTER_REPOSITORY_GITHUB}/proyan/dynamic-graph-python
@@ -29,6 +31,7 @@ CMAKE_ARGS+=		-DCMAKE_INSTALL_LIBDIR=lib
 # fixed here
 CMAKE_ARGS+=		-DCXX_DISABLE_WERROR=yes
 
+PATCH_STRIP?=		-p1
 DEPEND_ABI.python+=	python<3
 
 include ../../wip/dynamic-graph3/depend.mk
diff --git a/py-dynamic-graph3/distinfo b/py-dynamic-graph3/distinfo
index 2cdf132a..e096e9ba 100644
--- a/py-dynamic-graph3/distinfo
+++ b/py-dynamic-graph3/distinfo
@@ -1,3 +1,4 @@
 SHA1 (dynamic-graph-python-3.0.0.tar.gz) = 8c847cca3273d60b9d12c5fb883f3ff8aba25117
 RMD160 (dynamic-graph-python-3.0.0.tar.gz) = 64c15fd48b1cf96d60e3e9b7f4267ecbb9a878d3
 Size (dynamic-graph-python-3.0.0.tar.gz) = 778414 bytes
+SHA1 (patch-aa) = 3f3f7224e931fd652ac8861b20a2eae39695b8af
diff --git a/py-dynamic-graph3/patches/patch-aa b/py-dynamic-graph3/patches/patch-aa
new file mode 100644
index 00000000..c1343f6d
--- /dev/null
+++ b/py-dynamic-graph3/patches/patch-aa
@@ -0,0 +1,127 @@
+Patch for inputing Eigen::Transform as Matrix4d
+
+diff --git a/src/convert-dg-to-py.cc b/src/convert-dg-to-py.cc
+index 0c9cc61..446dba0 100644
+--- a/src/convert-dg-to-py.cc
++++ b/src/convert-dg-to-py.cc
+@@ -49,6 +49,24 @@ namespace dynamicgraph {
+ 				   "a floating point number.");
+ 	}
+       }
++      void fillMatrixRow(Eigen::Matrix4d& m, unsigned iRow, PyObject* tuple)
++      {
++	if (PyTuple_Size(tuple) != (int)m.cols()) {
++	  throw ExceptionPython(ExceptionPython::MATRIX_PARSING,
++				 "lines of matrix have different sizes.");
++	}
++	for (int iCol=0; iCol < m.cols(); iCol++) {
++	  PyObject* pyDouble = PyTuple_GetItem(tuple, iCol);
++	  if (PyFloat_Check(pyDouble))
++	    m(iRow, iCol) = PyFloat_AsDouble(pyDouble);
++	  else if(PyInt_Check(pyDouble))
++	    m(iRow, iCol) = (int)PyInt_AS_LONG(pyDouble)+0.0;
++	  else
++	    throw ExceptionPython(ExceptionPython::MATRIX_PARSING,
++				   "element of matrix should be "
++				   "a floating point number.");
++	}
++      }
+ 
+       command::Value pythonToValue(PyObject* pyObject,
+ 				   const command::Value::Type& valueType)
+@@ -62,6 +80,7 @@ namespace dynamicgraph {
+ 	std::string svalue;
+ 	Vector v;
+ 	Matrix m;
++	Eigen::Matrix4d m4;
+ 	Py_ssize_t nCols;
+ 	Py_ssize_t size;
+ 	PyObject* row;
+@@ -175,6 +194,36 @@ namespace dynamicgraph {
+ 	  }
+ 	  return Value(m);
+ 	  break;
++	case (Value::MATRIX4D) :
++	  // Check that argument is a tuple
++	  if (!PyTuple_Check(pyObject)) {
++	    throw ExceptionPython(ExceptionPython::VALUE_PARSING,
++				   "matrix4d");
++	  }
++	  nRows = PyTuple_Size(pyObject);
++	  if (nRows == 0) {
++	    return Value(Eigen::Matrix4d());
++	  }
++	  row = PyTuple_GetItem(pyObject, 0);
++	  if (!PyTuple_Check(row)) {
++	    throw ExceptionPython(ExceptionPython::MATRIX_PARSING,
++				   "matrix4d");
++	  }
++	  nCols = PyTuple_Size(row);
++
++	  m4.resize(nRows, nCols);
++	  fillMatrixRow(m4, 0, row);
++
++	  for (Py_ssize_t iRow=1; iRow<nRows; iRow++) {
++	    row = PyTuple_GetItem(pyObject, iRow);
++	    if (!PyTuple_Check(row)) {
++	      throw ExceptionPython(ExceptionPython::MATRIX_PARSING,
++				     "matrix");
++	    }
++	    fillMatrixRow(m4, static_cast<unsigned> (iRow), row);
++	  }
++	  return Value(m4);
++	  break;
+ 	default:
+ 	  std::cerr << "Only int, double and string are supported."
+ 		    << std::endl;
+@@ -206,6 +255,20 @@ namespace dynamicgraph {
+ 	return tuple;
+       }
+ 
++      PyObject* matrix4dToPython(const Eigen::Matrix4d& matrix)
++      {
++	PyObject* tuple = PyTuple_New(matrix.rows());
++	for (int iRow = 0; iRow < matrix.rows(); iRow++) {
++	  PyObject* row = PyTuple_New(matrix.cols());
++	  for (int iCol=0; iCol < matrix.cols(); iCol++) {
++	    PyObject* pyDouble = PyFloat_FromDouble(matrix(iRow, iCol));
++	    PyTuple_SET_ITEM(row, iCol, pyDouble);
++	  }
++	  PyTuple_SET_ITEM(tuple, iRow, row);
++	}
++	return tuple;
++      }
++
+       PyObject* valueToPython(const command::Value& value)
+       {
+ 	using command::Value;
+@@ -217,6 +280,7 @@ namespace dynamicgraph {
+ 	std::string stringValue;
+ 	Vector vectorValue;
+ 	Matrix matrixValue;
++	Eigen::Matrix4d matrix4dValue;
+ 	switch(value.type()) {
+ 	case (Value::BOOL) :
+ 	  boolValue = value.value();
+@@ -245,6 +309,9 @@ namespace dynamicgraph {
+ 	case (Value::MATRIX) :
+ 	  matrixValue = value.value();
+ 	  return matrixToPython(matrixValue);
++	case (Value::MATRIX4D) :
++	  matrix4dValue = value.value();
++	  return matrix4dToPython(matrix4dValue);
+ 	default:
+ 	  return Py_BuildValue("");
+ 	}
+diff --git a/src/convert-dg-to-py.hh b/src/convert-dg-to-py.hh
+index 62d6fc2..13f114f 100644
+--- a/src/convert-dg-to-py.hh
++++ b/src/convert-dg-to-py.hh
+@@ -26,6 +26,7 @@ namespace dynamicgraph {
+ 				   const command::Value::Type& valueType);
+       PyObject* vectorToPython(const Vector& vector);
+       PyObject* matrixToPython(const  ::dynamicgraph::Matrix& matrix);
++      PyObject* matrix4dToPython(const  Eigen::Matrix4d& matrix);
+       PyObject* valueToPython(const  ::dynamicgraph::command::Value& value);
+ 
+     } // namespace dynamicgraph
-- 
GitLab