Beispiel #1
0
 def _wm_get_cb(self, msg):
     with self._times:
         to_ret = srvs.WmGetResponse()
         if msg.action == msg.GET:
             to_ret.elements.append(
                 utils.element2msg(
                     self._get_context(msg.context).get_element(
                         msg.element.id)))
         elif msg.action == msg.GET_TEMPLATE:
             to_ret.elements.append(
                 utils.element2msg(
                     self._get_context(msg.context).get_template_individual(
                         msg.element.label)))
         elif msg.action == msg.GET_RECURSIVE:
             for _, e in self._get_context(msg.context).get_recursive(
                     msg.element.id, msg.relation_filter,
                     msg.type_filter).items():
                 to_ret.elements.append(utils.element2msg(e))
         elif msg.action == msg.RESOLVE:
             for e in self._get_context(msg.context).resolve_elements(
                     utils.msg2element(msg.element)):
                 to_ret.elements.append(utils.element2msg(e))
     output = ""
     einput = utils.msg2element(msg.element)
     for e in to_ret.elements:
         output += "{} ".format(e.id)
     if self._verbose:
         log.info(
             "[WmGet]",
             "Done {} [{}]. Answer: {}. Time: {:0.3f} secs".format(
                 msg.action, einput, output, self._times.get_last()))
     to_ret.snapshot_id = self._curr_snapshot.hex
     return to_ret
Beispiel #2
0
 def _wm_modify_cb(self, msg):
     to_ret = srvs.WmModifyResponse()
     with self._times:
         if msg.action == msg.ADD:
             for e in msg.elements:
                 updated_e = self._get_context(msg.context).add_element(
                     utils.msg2element(e), msg.author)
                 to_ret.elements.append(utils.element2msg(updated_e))
             self._publish_change(msg.author,
                                  "add",
                                  elements=to_ret.elements,
                                  context_id=msg.context)
         elif msg.action == msg.UPDATE:
             for e in msg.elements:
                 self._get_context(msg.context).update_element(
                     utils.msg2element(e), msg.author)
                 er = utils.element2msg(
                     self._get_context(msg.context).get_element(e.id))
                 to_ret.elements.append(er)
             self._publish_change(msg.author,
                                  "update",
                                  elements=to_ret.elements,
                                  context_id=msg.context)
         elif msg.action == msg.UPDATE_PROPERTIES:
             for e in msg.elements:
                 self._get_context(msg.context).update_properties(
                     utils.msg2element(e), msg.author,
                     self._ontology.get_reasoner(msg.type_filter), False)
                 er = utils.element2msg(
                     self._get_context(msg.context).get_element(e.id))
                 to_ret.elements.append(er)
             self._publish_change(msg.author,
                                  "update",
                                  elements=to_ret.elements,
                                  context_id=msg.context)
         elif msg.action == msg.REMOVE:
             for e in msg.elements:
                 self._get_context(msg.context).remove_element(
                     utils.msg2element(e), msg.author)
             to_ret.elements = msg.elements
             self._publish_change(msg.author,
                                  "remove",
                                  elements=msg.elements,
                                  context_id=msg.context)
         elif msg.action == msg.REMOVE_RECURSIVE:
             for e in msg.elements:
                 self._get_context(msg.context).remove_recursive(
                     utils.msg2element(e), msg.author, msg.relation_filter,
                     msg.type_filter)
             to_ret.elements = msg.elements
             self._publish_change(msg.author,
                                  "remove_recursive",
                                  elements=msg.elements,
                                  context_id=msg.context)
     if self._verbose:
         log.info(
             "[WmModify]", "{} {} {}. Time: {:0.3f} secs".format(
                 msg.author, msg.action, [e.id for e in to_ret.elements],
                 self._times.get_last()))
     return to_ret
Beispiel #3
0
 def remove_element(self,
                    e,
                    recursive=True,
                    rel_filter=":sceneProperty",
                    type_filter="",
                    context_id='scene'):
     """
     @brief Removes an element from the scene. e can be an Element or an id
     """
     #print "{}".format(eid)
     msg = srvs.WmModifyRequest()
     msg.context = context_id
     msg.author = self._author_name + self._debug_info()
     msg.type_filter = type_filter
     msg.relation_filter = rel_filter
     if isinstance(e, Element):
         msg.elements.append(utils.element2msg(e))
     elif isinstance(e, str):
         e = Element("", "", e)
         msg.elements.append(utils.element2msg(e))
     if recursive:
         msg.action = msg.REMOVE_RECURSIVE
     else:
         msg.action = msg.REMOVE
     res = self._call(self._modify, msg)
     if (res):
         e._id = ""
         return 1
     return -1
Beispiel #4
0
    def remove_element(self, e, recursive=True, rel_filter="skiros:sceneProperty", type_filter="", context_id='scene'):
        """
        @brief      Removes an element from the scene. e can be an
                    Element or an id

        @param      e            (Element/string) Element or id of element to remove
        @param      recursive    The recursive, if True, remove all children matching the rel_filter
        @param      rel_filter   The relative filter
        @param      type_filter  The type filter
        @param      context_id  (string)Ontology context identifier

        @return     (int) 1 on success, -1 if an error occurs
        """
        msg = srvs.WmModifyRequest()
        msg.context = context_id
        msg.author = self._author_name + self._debug_info()
        msg.type_filter = type_filter
        msg.relation_filter = rel_filter
        if isinstance(e, Element):
            msg.elements.append(utils.element2msg(e))
        elif isinstance(e, str):
            e = Element("", "", e)
            msg.elements.append(utils.element2msg(e))
        if recursive:
            msg.action = msg.REMOVE_RECURSIVE
        else:
            msg.action = msg.REMOVE
        res = self._call(self._modify, msg)
        if(res):
            e._id = ""
            return 1
        return -1
Beispiel #5
0
 def _wm_change_cb(self, author, action, element=None, relation=None):
     if element is not None:
         self._publish_change(author, action, [utils.element2msg(element)])
     else:
         self._publish_change(author,
                              action,
                              relation=utils.relation2msg(relation))
Beispiel #6
0
 def resolve_elements(self, e, context_id='scene'):
     msg = srvs.WmGetRequest()
     msg.context = context_id
     msg.element = utils.element2msg(e)
     msg.action = msg.RESOLVE
     res = self._call(self._get, msg)
     if (res):
         return [utils.msg2element(x) for x in res.elements]
Beispiel #7
0
 def update_element(self, e, context_id='scene'):
     """
     @brief Update properties and relations of an element
     """
     msg = srvs.WmModifyRequest()
     msg.context = context_id
     msg.author = self._author_name + self._debug_info()
     msg.elements.append(utils.element2msg(e))
     msg.action = msg.UPDATE
     res = self._call(self._modify, msg)
     if res:
         return e.id
     return -1
Beispiel #8
0
 def update_element_properties(self, e, reasoner="", context_id='scene'):
     """
     @brief Update the properties of an element (ignores the relations)
     """
     msg = srvs.WmModifyRequest()
     msg.context = context_id
     msg.author = self._author_name + self._debug_info()
     msg.elements.append(utils.element2msg(e))
     msg.action = msg.UPDATE_PROPERTIES
     msg.type_filter = reasoner
     res = self._call(self._modify, msg)
     if (res):
         return e.id
     return -1
Beispiel #9
0
 def add_elements(self, es, context_id='scene'):
     msg = srvs.WmModifyRequest()
     msg.context = context_id
     msg.author = self._author_name + self._debug_info()
     for e in es:
         msg.elements.append(utils.element2msg(e))
     msg.action = msg.ADD
     res = self._call(self._modify, msg)
     to_ret = list()
     if res:
         for old, new in zip(es, res.elements):
             to_ret.append(utils.msg2element(new))
             old._id = new.id
             self._resolve_local_relations(old)
     return to_ret
Beispiel #10
0
    def resolve_elements(self, e, context_id='scene'):
        """
        @brief      Find all elements matching the input *type, label
                    and properties)

        @param      e           An element to match
        @param      context_id  (string)Ontology context identifier

        @return     list(Element) List of matches
        """
        msg = srvs.WmGetRequest()
        msg.context = context_id
        msg.element = utils.element2msg(e)
        msg.action = msg.RESOLVE
        res = self._call(self._get, msg)
        if (res):
            return [utils.msg2element(x) for x in res.elements]
Beispiel #11
0
    def update_element(self, e, context_id='scene'):
        """
        @brief      Update properties and relations of an element

        @param      e           (Element) to update
        @param      context_id  (string)Ontology context identifier

        @return     (int) id of the element, or -1 if an error occurs
        """
        msg = srvs.WmModifyRequest()
        msg.context = context_id
        msg.author = self._author_name + self._debug_info()
        msg.elements.append(utils.element2msg(e))
        msg.action = msg.UPDATE
        res = self._call(self._modify, msg)
        if res:
            return e.id
        return -1
Beispiel #12
0
    def update_element_properties(self, e, reasoner="", context_id='scene'):
        """
        @brief      Update the properties of an element, ignoring the
                    relations. More efficient than full update

        @param      e           (Element) to update
        @param      reasoner    (string) If specified, only updates
                                properties related to the reasoner
        @param      context_id  (string)Ontology context identifier

        @return     (int) id of the element, or -1 if an error occurs
        """
        msg = srvs.WmModifyRequest()
        msg.context = context_id
        msg.author = self._author_name + self._debug_info()
        msg.elements.append(utils.element2msg(e))
        msg.action = msg.UPDATE_PROPERTIES
        msg.type_filter = reasoner
        res = self._call(self._modify, msg)
        if (res):
            return e.id
        return -1
Beispiel #13
0
    def add_elements(self, es, context_id='scene'):
        """
        @brief      Add elements to the scene. The id is updated with
                    the one assigned from the world model

        @param      es          list(Elements) without id
        @param      context_id  (string)Ontology context identifier

        @return     list(Elements) with id
        """
        msg = srvs.WmModifyRequest()
        msg.context = context_id
        msg.author = self._author_name + self._debug_info()
        for e in es:
            msg.elements.append(utils.element2msg(e))
        msg.action = msg.ADD
        res = self._call(self._modify, msg)
        to_ret = list()
        if res:
            for old, new in zip(es, res.elements):
                to_ret.append(utils.msg2element(new))
                old._id = new.id
                self._resolve_local_relations(old)
        return to_ret