Пример #1
0
def get_plot_fields(topic_name):
    topic_type, real_topic, _ = topic_helpers.get_topic_type(topic_name)
    if topic_type is None:
        message = "topic %s does not exist" % ( topic_name )
        return [], message
    field_name = topic_name[len(real_topic)+1:]

    slot_type, is_array, array_size = roslib.msgs.parse_type(topic_type)
    field_class = roslib.message.get_message_class(slot_type)

    fields = [f for f in field_name.split('/') if f]

    for field in fields:
        # parse the field name for an array index
        try:
            field, _, field_index = roslib.msgs.parse_type(field)
        except roslib.msgs.MsgSpecException:
            message = "invalid field %s in topic %s" % ( field, real_topic )
            return [], message

        if field not in getattr(field_class, '__slots__', []):
            message = "no field %s in topic %s" % ( field_name, real_topic )
            return [], message
        slot_type = field_class._slot_types[field_class.__slots__.index(field)]
        slot_type, slot_is_array, array_size = roslib.msgs.parse_type(slot_type)
        is_array = slot_is_array and field_index is None

        field_class = topic_helpers.get_type_class(slot_type)

    if field_class in (int, float, bool):
        topic_kind = 'boolean' if field_class == bool else 'numeric'
        if is_array:
            if array_size is not None:
                message = "topic %s is fixed-size %s array" % ( topic_name, topic_kind )
                return [ "%s[%d]" % (topic_name, i) for i in range(array_size) ], message
            else:
                message = "topic %s is variable-size %s array" % ( topic_name, topic_kind )
                return [], message
        else:
            message = "topic %s is %s" % ( topic_name, topic_kind )
            return [ topic_name ], message
    else:
        if not roslib.msgs.is_valid_constant_type(slot_type):
            numeric_fields = []
            for i, slot in enumerate(field_class.__slots__):
                slot_type = field_class._slot_types[i]
                slot_type, is_array, array_size = roslib.msgs.parse_type(slot_type)
                slot_class = topic_helpers.get_type_class(slot_type)
                if slot_class in (int, float) and not is_array:
                    numeric_fields.append(slot)
            message = ""
            if len(numeric_fields) > 0:
                message = "%d plottable fields in %s" % ( len(numeric_fields), topic_name )
            else:
                message = "No plottable fields in %s" % ( topic_name )
            return [ "%s/%s" % (topic_name, f) for f in numeric_fields ], message
        else:
            message = "Topic %s is not numeric" % ( topic_name )
            return [], message
Пример #2
0
def get_plot_fields(topic_name):
    topic_type, real_topic, _ = topic_helpers.get_topic_type(topic_name)
    if topic_type is None:
        message = "topic %s does not exist" % ( topic_name )
        return [], message
    field_name = topic_name[len(real_topic)+1:]

    slot_type, is_array, array_size = roslib.msgs.parse_type(topic_type)
    field_class = roslib.message.get_message_class(slot_type)

    fields = [f for f in field_name.split('/') if f]

    for field in fields:
        # parse the field name for an array index
        try:
            field, _, field_index = roslib.msgs.parse_type(field)
        except roslib.msgs.MsgSpecException:
            message = "invalid field %s in topic %s" % ( field, real_topic )
            return [], message

        if field not in getattr(field_class, '__slots__', []):
            message = "no field %s in topic %s" % ( field_name, real_topic )
            return [], message
        slot_type = field_class._slot_types[field_class.__slots__.index(field)]
        slot_type, slot_is_array, array_size = roslib.msgs.parse_type(slot_type)
        is_array = slot_is_array and field_index is None

        field_class = topic_helpers.get_type_class(slot_type)

    if field_class in (int, float):
        if is_array:
            if array_size is not None:
                message = "topic %s is fixed-size numeric array" % ( topic_name )
                return [ "%s[%d]" % (topic_name, i) for i in range(array_size) ], message
            else:
                message = "topic %s is variable-size numeric array" % ( topic_name )
                return [], message
        else:
            message = "topic %s is numeric" % ( topic_name )
            return [ topic_name ], message
    else:
        if not roslib.msgs.is_valid_constant_type(slot_type):
            numeric_fields = []
            for i, slot in enumerate(field_class.__slots__):
                slot_type = field_class._slot_types[i]
                slot_type, is_array, array_size = roslib.msgs.parse_type(slot_type)
                slot_class = topic_helpers.get_type_class(slot_type)
                if slot_class in (int, float) and not is_array:
                    numeric_fields.append(slot)
            message = ""
            if len(numeric_fields) > 0:
                message = "%d plottable fields in %s" % ( len(numeric_fields), topic_name )
            else:
                message = "No plottable fields in %s" % ( topic_name )
            return [ "%s/%s" % (topic_name, f) for f in numeric_fields ], message
        else:
            message = "Topic %s is not numeric" % ( topic_name )
            return [], message
Пример #3
0
    def fill_message_slots(self, message, topic_name, expressions, counter):
        # qDebug(
        #     'fill_message_slots('
        #     '\n\tmessage={}, \n\ttopic_name={}, \n\texpressions={}, \n\tcounter={})'.format(
        #         message, topic_name, expressions, counter))
        if type(message) in (list, set):
            for i, msg in enumerate(message):
                slot_key = topic_name + '[{}]'.format(i)
                if slot_key not in expressions:
                    self.fill_message_slots(msg, slot_key, expressions,
                                            counter)
                    continue

                expression = expressions[slot_key]
                if len(expression) == 0:
                    continue

                self._eval_locals['i'] = counter
                slot_type_class = type(msg)
                is_array = False
                if slot_type_class in (list, tuple):
                    is_array = True
                value = self._evaluate_expression(expression, None, is_array)
                if value is not None:
                    message[i] = value

        elif hasattr(message, 'get_fields_and_field_types'):
            for slot_name, slot_type in message.get_fields_and_field_types(
            ).items():
                slot_key = topic_name + '/' + slot_name

                # if no expression exists for this slot_key, continue with it's child slots
                if slot_key not in expressions:
                    self.fill_message_slots(getattr(message, slot_name),
                                            slot_key, expressions, counter)
                    continue

                expression = expressions[slot_key]
                if len(expression) == 0:
                    continue

                self._eval_locals['i'] = counter
                slot_type_class = None

                slot_type_no_array = slot_type.split('[', 1)[0]
                is_array = slot_type.find('[') >= 0
                if is_primitive_type(slot_type_no_array):
                    slot_type_class = get_type_class(slot_type_no_array)
                else:
                    slot_type_class = get_message_class(slot_type_no_array)
                value = self._evaluate_expression(expression, slot_type_class,
                                                  is_array)
                if value is not None:
                    try:
                        setattr(message, slot_name, value)
                    except AssertionError as e:
                        qWarning('Failed to set {} to {}\n\t{}'.format(
                            slot_name, value, e.__str__()))
def get_plot_fields(topic_name):
    field_class, slot_type, is_array, array_size = get_topic_properties(
        topic_name)

    if not roslib.msgs.is_valid_constant_type(slot_type):
        numeric_fields = []
        for i, slot in enumerate(field_class.__slots__):
            slot_type = field_class._slot_types[i]
            slot_type, is_array, array_size = roslib.msgs.parse_type(slot_type)
            slot_class = topic_helpers.get_type_class(slot_type)
            if slot_class in (int, float) and not is_array:
                numeric_fields.append(slot)
        message = ""
        if len(numeric_fields) > 0:
            message = "%d plottable fields in %s" % (len(numeric_fields),
                                                     topic_name)
        else:
            message = "No plottable fields in %s" % (topic_name)
        return ["%s/%s" % (topic_name, f) for f in numeric_fields], message
    else:
        message = "Topic %s is not numeric" % (topic_name)
        return [], message
Пример #5
0
def get_plot_fields(node, topic_name):
    topics = node.get_topic_names_and_types()
    real_topic = None
    for name, topic_types in topics:
        if name == topic_name[:len(name)]:
            real_topic = name
            topic_type_str = topic_types[0] if topic_types else None
            break
    if real_topic is None:
        message = "topic %s does not exist" % (topic_name)
        return [], message

    if topic_type_str is None:
        message = "no topic types found for topic %s " % (topic_name)
        return [], message

    if len(topic_name) < len(real_topic) + 1:
        message = 'no field specified in topic name "{}"'.format(topic_name)
        return [], message

    field_name = topic_name[len(real_topic) + 1:]

    message_class = message_helpers.get_message_class(topic_type_str)
    if message_class is None:
        message = 'message class "{}" is invalid'.format(topic_type_str)
        return [], message

    slot_type, is_array, array_size = _parse_type(topic_type_str)
    field_class = message_helpers.get_message_class(slot_type)

    fields = [f for f in field_name.split('/') if f]

    for field in fields:
        # parse the field name for an array index
        field, _, field_index = _parse_type(field)
        if field is None:
            message = "invalid field %s in topic %s" % (field, real_topic)
            return [], message

        field_names_and_types = field_class.get_fields_and_field_types()
        if field not in field_names_and_types:
            message = "no field %s in topic %s" % (field_name, real_topic)
            return [], message
        slot_type = field_names_and_types[field]
        slot_type, slot_is_array, array_size = _parse_type(slot_type)
        is_array = slot_is_array and field_index is None

        if topic_helpers.is_primitive_type(slot_type):
            field_class = topic_helpers.get_type_class(slot_type)
        else:
            field_class = message_helpers.get_message_class(slot_type)

    if field_class in (int, float, bool):
        topic_kind = 'boolean' if field_class == bool else 'numeric'
        if is_array:
            if array_size is not None:
                message = "topic %s is fixed-size %s array" % (topic_name,
                                                               topic_kind)
                return ["%s[%d]" % (topic_name, i)
                        for i in range(array_size)], message
            else:
                message = "topic %s is variable-size %s array" % (topic_name,
                                                                  topic_kind)
                return [], message
        else:
            message = "topic %s is %s" % (topic_name, topic_kind)
            return [topic_name], message
    else:
        if not topic_helpers.is_primitive_type(slot_type):
            numeric_fields = []
            for slot, slot_type in field_class.get_fields_and_field_types(
            ).items():
                slot_type, is_array, array_size = _parse_type(slot_type)
                slot_class = topic_helpers.get_type_class(slot_type)
                if slot_class in (int, float) and not is_array:
                    numeric_fields.append(slot)
            message = ""
            if len(numeric_fields) > 0:
                message = "%d plottable fields in %s" % (len(numeric_fields),
                                                         topic_name)
            else:
                message = "No plottable fields in %s" % (topic_name)
            return ["%s/%s" % (topic_name, f) for f in numeric_fields], message
        else:
            message = "Topic %s is not numeric" % (topic_name)
            return [], message