diff --git a/idl/gepetto/viewer/graphical-interface.idl b/idl/gepetto/viewer/graphical-interface.idl index bec1455692beacc597b2f3d6afbe79167906d61f..9489eaee3dad25240f5c75fd755bc87fb851627c 100644 --- a/idl/gepetto/viewer/graphical-interface.idl +++ b/idl/gepetto/viewer/graphical-interface.idl @@ -209,6 +209,11 @@ typedef float Color [4]; /// \param input groupName : name of the mother node (=group node). boolean addToGroup(in string nodeName, in string groupName) raises (Error); + /// remove the node from the child list of a group node. + /// \param input nodeName : name of the child node. + /// \param input groupName : name of the mother node (=group node). + boolean removeFromGroup(in string nodeName, in string groupName) raises (Error); + /// Set a new configuration to a node. THIS CONFIGURATION WILL AFFECTIVE ONLY AFTER CALLING REFRESH FUNCTION!!! /// \param input nodeName : name of the node. /// \param input configuration : Float[7] new configuration. diff --git a/include/gepetto/viewer/corba/windows-manager.h b/include/gepetto/viewer/corba/windows-manager.h index 1c4065a6dc782f21628c417f341eefa832f144cb..7fbd51d6e278bf3bc629c5d7707732bd061adb74 100644 --- a/include/gepetto/viewer/corba/windows-manager.h +++ b/include/gepetto/viewer/corba/windows-manager.h @@ -109,9 +109,9 @@ namespace graphics { virtual bool createRoadmap(const char* nameCorba,const value_type* colorNodeCorba, float radius, float sizeAxis, const value_type* colorEdgeCorba); - virtual bool addEdgeToRoadmap(const char* nameRoadmap, const value_type* posFromCorba, const value_type* posToCorba); + virtual bool addEdgeToRoadmap(const char* nameRoadmapCorba, const value_type* posFromCorba, const value_type* posToCorba); - virtual bool addNodeToRoadmap(const char* nameRoadmap, const value_type* configuration); + virtual bool addNodeToRoadmap(const char* nameRoadmapCorba, const value_type* configuration); virtual bool addURDF(const char* urdfNameCorba, const char* urdfPathCorba, const char* urdfPackagePathCorba); @@ -126,6 +126,8 @@ namespace graphics { virtual bool createGroup(const char* groupNameCorba); virtual bool addToGroup(const char* nodeNameCorba, const char* groupNameCorba); + virtual bool removeFromGroup (const char* nodeNameCorba, const char* groupNameCorba); + virtual bool applyConfiguration(const char* nodeNameCorba, const value_type* configuration); diff --git a/src/graphical-interface.impl.cpp b/src/graphical-interface.impl.cpp index 0cbca83a75d0bb95bba4606a0ef9557794b483d4..3394473a92d45b57f7ce9f80a85e1b8c1251d94b 100644 --- a/src/graphical-interface.impl.cpp +++ b/src/graphical-interface.impl.cpp @@ -308,6 +308,16 @@ namespace graphics { } } + bool GraphicalInterface::removeFromGroup (const char* nodeNameCorba, + const char* groupNameCorba) throw (Error) + { + try { + return windowsManager_->removeFromGroup ( nodeNameCorba, groupNameCorba) ; + } catch (const std::exception& exc) { + throw Error (exc.what ()); + } + } + bool GraphicalInterface::applyConfiguration (const char* nodeNameCorba, const value_type* configurationCorba) throw (Error) { try { diff --git a/src/graphical-interface.impl.hh b/src/graphical-interface.impl.hh index b4f07fae9338af4f10c45dba1f5dee5c0195a8df..5e47276247c1aa04d3821129448b309e2ff1fa5b 100644 --- a/src/graphical-interface.impl.hh +++ b/src/graphical-interface.impl.hh @@ -95,6 +95,7 @@ public: virtual bool createGroup(const char* groupNameCorba) throw (Error); virtual bool addToGroup(const char* nodeNameCorba, const char* groupNameCorba) throw (Error); + virtual bool removeFromGroup (const char* nodeNameCorba,const char* groupNameCorba) throw (Error); virtual bool applyConfiguration(const char* nodeNameCorba, const value_type* configuration) throw (Error); diff --git a/src/windows-manager.cpp b/src/windows-manager.cpp index 5d00e95bf5dc442db296099d6561dc79ea781c93..60c467e93e00b628cf17d8a3b03a8b5646360c9c 100644 --- a/src/windows-manager.cpp +++ b/src/windows-manager.cpp @@ -142,6 +142,7 @@ namespace graphics { return parentName; } + void WindowsManager::initParent (const std::string& nodeName, NodePtr_t node) { @@ -175,6 +176,8 @@ namespace graphics { } } + + osgQuat WindowsManager::corbaConfToOsgQuat (const value_type* configCorba) { // configurationCorba = trans (x, y, z), quat (w, x, y, z) @@ -232,8 +235,8 @@ namespace graphics { it != newNodeConfigurations_.end (); it++) { (*it).node->applyConfiguration ( (*it).position, (*it).quat); } - mtx_.unlock (); newNodeConfigurations_.clear (); + mtx_.unlock (); } void WindowsManager::createScene (const char* sceneNameCorba) @@ -526,13 +529,29 @@ namespace graphics { RoadmapViewerPtr_t rm_ptr = roadmapNodes_[nameRoadmap]; osgVector3 posFrom = osgVector3(posFromCorba[0], posFromCorba[1],posFromCorba[2]); osgVector3 posTo = osgVector3(posToCorba[0], posToCorba[1],posToCorba[2]); - rm_ptr->addEdge(posFrom,posTo); + // mtx_.lock(); mtx is now locked only when required in addEdge + rm_ptr->addEdge(posFrom,posTo,mtx_); + // mtx_.unlock(); return true; } } - bool WindowsManager::addNodeToRoadmap(const char* nameRoadmap, const value_type* configuration){ -//TODO + bool WindowsManager::addNodeToRoadmap(const char* nameRoadmapCorba, const value_type* configuration){ + const std::string nameRoadmap (nameRoadmapCorba); + if (roadmapNodes_.find (nameRoadmap) == roadmapNodes_.end ()) { + //no node named nodeName + std::cout << "No roadmap named \"" << nameRoadmap << "\"" << std::endl; + return false; + } + else { + RoadmapViewerPtr_t rm_ptr = roadmapNodes_[nameRoadmap]; + osgVector3 position = WindowsManager::corbaConfToOsgVec3 (configuration); + osgQuat quat = WindowsManager::corbaConfToOsgQuat (configuration); + // mtx_.lock(); + rm_ptr->addNode(position,quat,mtx_); + // mtx_.unlock(); + return true; + } } std::vector<std::string> WindowsManager::getNodeList () @@ -686,6 +705,23 @@ namespace graphics { } } + bool WindowsManager::removeFromGroup (const char* nodeNameCorba, + const char* groupNameCorba) + { + const std::string nodeName (nodeNameCorba); + const std::string groupName (groupNameCorba); + if (nodes_.find (nodeName) == nodes_.end () || + groupNodes_.find (groupName) == groupNodes_.end ()) { + std::cout << "Node name \"" << nodeName << "\" and/or groupNode \"" + << groupName << "\" doesn't exist." << std::endl; + return false; + } + else { + groupNodes_[groupName]->removeChild(nodes_[nodeName]); + return true; + } + } + bool WindowsManager::applyConfiguration (const char* nodeNameCorba, const value_type* configurationCorba) { @@ -709,7 +745,9 @@ namespace graphics { "quatY, quatZ]" <<std::endl; return false; } + mtx_.lock(); newNodeConfigurations_.push_back (newNodeConfiguration); + mtx_.unlock(); return true; } }