Esempio n. 1
0
    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
Esempio n. 2
0
    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)
Esempio n. 3
0
    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)