def get_field(self, name): """ Return field instance with a given name """ matching_fields = list(filter(lambda field: field.name == name, self._fields)) if len(matching_fields) == 1: return matching_fields[0] elif len(matching_fields) > 1: Out.warn('More than one field with name ' + name + ' defined!') return None else: Out.fine('No field with name ' + name) return None
def edit(self): """ Open an editor to edit the filter """ if len(self._constraints) != 0: Out.warn('Editing filters that already have constraints is not yet supported') # create initial content initial_content = '# FILTER EDITOR\n' initial_content += '# - an asterisk (*) indicates "dont-care" fields\n' initial_content += '# - you may either\n' initial_content += '# - simply specify a field such as value = 100n, or\n' initial_content += '# - you can use regular expressiong i.e. ^R for getting all resistors\n\n' for field_name in Field.known_names: initial_content += '\'' + field_name + '\' = *\n' # run editor editor = Editor(initial_content) filter_file_content = editor.run() # parse content and add fields fields_dict = editor.parse(filter_file_content) for name, value in fields_dict.items(): self.add_constraint(name, value)
def add_or_update_field(self, name, value): """ Add a new (custom) field or replace an existing field """ # warn and return if name is empty if name == '': Out.warn('Will not add or update field in ' + self.get_field('Designator').value + ' due to empty name') return # log when clearing a value elif value == '': Out.log('Clearing value of field "' + name + '" in ' + self.get_field('Designator').value + '.') # change value of name-matching fields Out.fine('Changing value of fields matching the name "' + name + '"') for index, field in enumerate(self._fields): if field.name == name: Out.fine('Overwriting value of field #' + str(index) + ' with ' + name + ':' + value) self._fields[index].value = value # only designator and value should be visible if name == 'Designator' or name == 'Value': self._fields[index].set_visible(True) else: self._fields[index].set_visible(False) return # Construct and add new custom field new_field = CustomField.copy(self.get_field('Designator')) new_field.name = name new_field.value = value new_field.number = len(self._fields) new_field.set_visible(False) Out.fine('Adding new custom field:' + new_field.serialize()) self._fields.append(new_field)