From f9c05e26b69749b11b64d058ff619c25571e6689 Mon Sep 17 00:00:00 2001
From: Joseph Mirabel <jmirabel@laas.fr>
Date: Thu, 29 Mar 2018 18:06:44 +0200
Subject: [PATCH] Add applyConfigurations

---
 idl/gepetto/viewer/graphical-interface.idl    |  5 ++++
 .../gepetto/viewer/corba/windows-manager.hh   |  1 +
 src/graphical-interface.impl.cpp              | 14 ++++++++-
 src/graphical-interface.impl.hh               |  2 ++
 src/windows-manager.cpp                       | 29 +++++++++++++++++++
 5 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/idl/gepetto/viewer/graphical-interface.idl b/idl/gepetto/viewer/graphical-interface.idl
index a589289..609856d 100644
--- a/idl/gepetto/viewer/graphical-interface.idl
+++ b/idl/gepetto/viewer/graphical-interface.idl
@@ -24,6 +24,7 @@ typedef unsigned long WindowID;
 typedef sequence <string> Names_t; /// Sequence of names
 typedef sequence<float> floatSeq;
 typedef sequence<Position> PositionSeq;
+typedef sequence<Transform> TransformSeq;
 
   /// IDL of the graphical interface.
   /// It contains the following groups:
@@ -348,6 +349,10 @@ typedef sequence<Position> PositionSeq;
     /// \param input configuration : Float[7] new configuration.
     boolean applyConfiguration(in string nodeName, in Transform configuration) raises (Error);
 
+    /// Same as \ref applyConfiguration on a list of node name and configuration.
+    /// Both input list should be of same length.
+    boolean applyConfigurations(in Names_t nodeName, in TransformSeq configuration) raises (Error);
+
     /// Change configurations according to the last applyConfigurations.d
     void refresh() raises (Error);
     
diff --git a/include/gepetto/viewer/corba/windows-manager.hh b/include/gepetto/viewer/corba/windows-manager.hh
index 21874f7..a2de9af 100644
--- a/include/gepetto/viewer/corba/windows-manager.hh
+++ b/include/gepetto/viewer/corba/windows-manager.hh
@@ -223,6 +223,7 @@ namespace graphics {
             virtual bool deleteNode (const std::string& nodeName, bool all);
 
             virtual bool applyConfiguration(const std::string& nodeName, const Configuration& configuration);
+            virtual bool applyConfigurations(const std::vector<std::string>& nodeName, const std::vector<Configuration>& configuration);
 
             virtual bool addLandmark(const std::string& nodeName, float size);
             virtual bool deleteLandmark(const std::string& nodeName);
diff --git a/src/graphical-interface.impl.cpp b/src/graphical-interface.impl.cpp
index 8b93272..4cfa29e 100644
--- a/src/graphical-interface.impl.cpp
+++ b/src/graphical-interface.impl.cpp
@@ -46,7 +46,7 @@ namespace graphics {
         }
 
         enum ArgType { STRING, STRING_LIST, OUT_STRING_LIST, COLOR,
-          TRANSFORM, POSITION, POSITION_SEQ,
+          TRANSFORM, TRANSFORM_SEQ, POSITION, POSITION_SEQ,
           FLOAT, SHORT, LONG, WINDOW_ID, BOOL, VOID,
           GLMODE
         };
@@ -71,6 +71,16 @@ namespace graphics {
             return ret;
           }
         };
+        template <> struct traits<TRANSFORM_SEQ> {
+          typedef const GraphicalInterface::TransformSeq& In_t;
+          typedef       std::vector<Configuration>        Out_t;
+          static Out_t op  (In_t in) {
+            Out_t out (in.length());
+            for (CORBA::ULong i = 0; i < in.length (); ++i)
+              out[i] = traits<TRANSFORM>::op (in[i]);
+            return out;
+          }
+        };
         template <> struct traits<POSITION> {
           typedef       osgVector3    Out_t;
           typedef const GraphicalInterface::Position In_t;
@@ -369,6 +379,8 @@ namespace graphics {
 
       BIND_TO_WINDOWS_MANAGER_2(BOOL, applyConfiguration, STRING, TRANSFORM)
 
+      BIND_TO_WINDOWS_MANAGER_2(BOOL, applyConfigurations, STRING_LIST, TRANSFORM_SEQ)
+
       BIND_TO_WINDOWS_MANAGER_2(BOOL, addLandmark, STRING, FLOAT)
 
       BIND_TO_WINDOWS_MANAGER_1(BOOL, deleteLandmark, STRING)
diff --git a/src/graphical-interface.impl.hh b/src/graphical-interface.impl.hh
index 62d56e0..76f94a6 100644
--- a/src/graphical-interface.impl.hh
+++ b/src/graphical-interface.impl.hh
@@ -37,6 +37,7 @@ private:
 public:
     typedef CORBA::ULong WindowID;
     typedef gepetto::corbaserver::Transform Transform;
+    typedef gepetto::corbaserver::TransformSeq TransformSeq;
     typedef gepetto::corbaserver::PositionSeq PositionSeq;
     typedef gepetto::corbaserver::Position Position;
     typedef gepetto::corbaserver::Position_slice Position_slice;
@@ -136,6 +137,7 @@ public:
   virtual bool removeFromGroup (const char* nodeNameCorba,const char* groupNameCorba)  throw (Error);
 
   virtual bool applyConfiguration(const char* nodeNameCorba, const value_type* configuration)  throw (Error);
+  virtual bool applyConfigurations(const Names_t& nodeNameCorba, const TransformSeq& configuration)  throw (Error);
 
   virtual bool addLandmark(const char* nodeNameCorba, float size) throw (Error);
   virtual bool deleteLandmark(const char* nodeNameCorba) throw (Error);
diff --git a/src/windows-manager.cpp b/src/windows-manager.cpp
index 34be9af..8ec5df3 100644
--- a/src/windows-manager.cpp
+++ b/src/windows-manager.cpp
@@ -956,6 +956,35 @@ namespace graphics {
         return true;
     }
 
+    bool WindowsManager::applyConfigurations (const std::vector<std::string>& nodeNames,
+            const std::vector<Configuration>& configurations)
+    {
+        if (nodeNames.size() != configurations.size())
+          throw std::invalid_argument ("Number of node names and configurations must be equal.");
+
+        newNodeConfigurations_.reserve (
+            newNodeConfigurations_.capacity() + nodeNames.size());
+
+        bool success = true;
+        scoped_lock lock(configListMtx_);
+        for (std::size_t i = 0; i < nodeNames.size(); ++i) {
+          NodePtr_t updatedNode = getNode (nodeNames[i], false);
+          if (!updatedNode) {
+            success = false;
+            continue;
+          }
+
+          NodeConfiguration newNodeConfiguration;
+          newNodeConfiguration.node = updatedNode;
+          newNodeConfiguration.position = configurations[i].position;
+          newNodeConfiguration.quat = configurations[i].quat;
+
+          newNodeConfigurations_.push_back (newNodeConfiguration);
+        }
+
+        return success;
+    }
+
     bool WindowsManager::addLandmark (const std::string& nodeName,
             float size)
     {
-- 
GitLab