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
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
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
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