From 3553fb20d7674b8a9c8ca17e98194100a49df4e5 Mon Sep 17 00:00:00 2001
From: Joseph Mirabel <jmirabel@laas.fr>
Date: Mon, 14 Dec 2015 17:13:53 +0100
Subject: [PATCH] Add Edge::canConnect

---
 include/hpp/manipulation/graph/edge.hh |  4 ++++
 src/graph/edge.cc                      | 16 ++++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/include/hpp/manipulation/graph/edge.hh b/include/hpp/manipulation/graph/edge.hh
index ace1836c..4b5f3286 100644
--- a/include/hpp/manipulation/graph/edge.hh
+++ b/include/hpp/manipulation/graph/edge.hh
@@ -73,6 +73,8 @@ namespace hpp {
 
           virtual bool applyConstraints (ConfigurationIn_t qoffset, ConfigurationOut_t q) const;
 
+          virtual bool canConnect (ConfigurationIn_t q1, ConfigurationIn_t q2) const;
+
           virtual bool build (core::PathPtr_t& path, ConfigurationIn_t q1,
               ConfigurationIn_t q2) const;
 
@@ -204,6 +206,8 @@ namespace hpp {
 
           virtual bool direction (const core::PathPtr_t& path) const;
 
+          virtual bool canConnect (ConfigurationIn_t q1, ConfigurationIn_t q2) const;
+
           virtual bool build (core::PathPtr_t& path, ConfigurationIn_t q1, ConfigurationIn_t q2) const;
 
           virtual bool applyConstraints (ConfigurationIn_t qoffset, ConfigurationOut_t q) const;
diff --git a/src/graph/edge.cc b/src/graph/edge.cc
index 402857b7..1c2089f9 100644
--- a/src/graph/edge.cc
+++ b/src/graph/edge.cc
@@ -256,6 +256,17 @@ namespace hpp {
         return constraint;
       }
 
+      bool Edge::canConnect (ConfigurationIn_t q1, ConfigurationIn_t q2)
+	const
+      {
+        ConstraintSetPtr_t constraints = pathConstraint ();
+        constraints->configProjector ()->rightHandSideFromConfig(q1);
+        if (!constraints->isSatisfied (q1) || !constraints->isSatisfied (q2)) {
+          return false;
+        }
+        return true;
+      }
+
       bool Edge::build (core::PathPtr_t& path, ConfigurationIn_t q1,
 			ConfigurationIn_t q2)
 	const
@@ -311,6 +322,11 @@ namespace hpp {
         wkPtr_ = weak;
       }
 
+      bool WaypointEdge::canConnect (ConfigurationIn_t q1, ConfigurationIn_t q2) const
+      {
+        return waypoint_.first->canConnect (q1, q2) && Edge::canConnect (q1, q2);
+      }
+
       bool WaypointEdge::build (core::PathPtr_t& path, ConfigurationIn_t q1,
           ConfigurationIn_t q2) const
       {
-- 
GitLab