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