Optimized field names collection.

Now they are collected on the fly. No need to visit all the components
again.
This commit is contained in:
SET 2020-08-10 19:56:52 -03:00
parent 67cc8e9fca
commit fae2a024dd
2 changed files with 21 additions and 17 deletions

View File

@ -644,7 +644,7 @@ class SchematicComponent(object):
return '{} ({} {})'.format(self.ref, self.name, self.value) return '{} ({} {})'.format(self.ref, self.name, self.value)
@staticmethod @staticmethod
def load(f, sheet_path, sheet_path_h, libs): def load(f, sheet_path, sheet_path_h, libs, fields, fields_lc):
# L lib:name reference # L lib:name reference
line = _get_line(f) line = _get_line(f)
if line[0] != 'L': if line[0] != 'L':
@ -691,7 +691,12 @@ class SchematicComponent(object):
comp.fields = [] comp.fields = []
comp.dfields = {} comp.dfields = {}
while line[0] == 'F': while line[0] == 'F':
comp.add_field(SchematicField.parse(line)) field = SchematicField.parse(line)
name_lc = field.name.lower()
if name_lc not in fields_lc:
fields.append(field.name)
fields_lc[name_lc] = 1
comp.add_field(field)
line = _get_line(f) line = _get_line(f)
# Redundant pos # Redundant pos
if not line.startswith('\t'+str(comp.unit)): if not line.startswith('\t'+str(comp.unit)):
@ -886,13 +891,13 @@ class SchematicSheet(object):
self.sheet = None self.sheet = None
self.id = '' self.id = ''
def load_sheet(self, parent, sheet_path, sheet_path_h, libs): def load_sheet(self, parent, sheet_path, sheet_path_h, libs, fields, fields_lc):
assert self.name assert self.name
self.sheet = Schematic() self.sheet = Schematic()
parent_dir = os.path.dirname(parent) parent_dir = os.path.dirname(parent)
sheet_path += '/'+self.id sheet_path += '/'+self.id
sheet_path_h += '/'+(self.name if self.name else 'Unknown') sheet_path_h += '/'+(self.name if self.name else 'Unknown')
self.sheet.load(os.path.join(parent_dir, self.file), sheet_path, sheet_path_h, libs) self.sheet.load(os.path.join(parent_dir, self.file), sheet_path, sheet_path_h, libs, fields, fields_lc)
return self.sheet return self.sheet
@staticmethod @staticmethod
@ -979,13 +984,15 @@ class Schematic(object):
raise SchFileError('Wrong entry in title block', line, _sch_line_number) raise SchFileError('Wrong entry in title block', line, _sch_line_number)
self.title_block[m.group(1)] = m.group(2) self.title_block[m.group(1)] = m.group(2)
def load(self, fname, sheet_path='', sheet_path_h='', libs={}): def load(self, fname, sheet_path='', sheet_path_h='', libs={}, fields=[], fields_lc={}):
""" Load a v5.x KiCad Schematic. """ Load a v5.x KiCad Schematic.
The caller must be sure the file exists. The caller must be sure the file exists.
Only the schematics are loaded not the libs. """ Only the schematics are loaded not the libs. """
logger.debug("Loading sheet from "+fname) logger.debug("Loading sheet from "+fname)
self.fname = fname self.fname = fname
self.libs = libs self.libs = libs
self.fields = fields
self.fields_lc = fields_lc
with open(fname, 'rt') as f: with open(fname, 'rt') as f:
global _sch_line_number global _sch_line_number
_sch_line_number = 0 _sch_line_number = 0
@ -1017,7 +1024,7 @@ class Schematic(object):
self.sheets = [] self.sheets = []
while not line.startswith('$EndSCHEMATC'): while not line.startswith('$EndSCHEMATC'):
if line.startswith('$Comp'): if line.startswith('$Comp'):
obj = SchematicComponent.load(f, sheet_path, sheet_path_h, libs) obj = SchematicComponent.load(f, sheet_path, sheet_path_h, libs, fields, fields_lc)
self.components.append(obj) self.components.append(obj)
elif line.startswith('NoConn'): elif line.startswith('NoConn'):
obj = SchematicConnection.parse(False, line[7:]) obj = SchematicConnection.parse(False, line[7:])
@ -1044,7 +1051,7 @@ class Schematic(object):
# Load sub-sheets # Load sub-sheets
self.sub_sheets = [] self.sub_sheets = []
for sch in self.sheets: for sch in self.sheets:
self.sub_sheets.append(sch.load_sheet(fname, sheet_path, sheet_path_h, libs)) self.sub_sheets.append(sch.load_sheet(fname, sheet_path, sheet_path_h, libs, fields, fields_lc))
def get_files(self): def get_files(self):
""" A list of the names for all the sheets, including this one. """ """ A list of the names for all the sheets, including this one. """
@ -1065,16 +1072,13 @@ class Schematic(object):
return components return components
def get_field_names(self, fields): def get_field_names(self, fields):
# TODO collect while loading """ Appends the collected field names to the provided names """
fields_lc = {v.lower(): 1 for v in fields} fields_lc = {v.lower(): 1 for v in fields}
for c in self.components: for f in self.fields:
for f in c.fields: name_lc = f.lower()
name_lc = f.name.lower()
if name_lc not in fields_lc: if name_lc not in fields_lc:
fields.append(f.name) fields.append(f)
fields_lc[name_lc] = 1 fields_lc[name_lc] = 1
for sch in self.sheets:
fields = sch.sheet.get_field_names(fields)
return fields return fields
def walk_components(self, function, obj): def walk_components(self, function, obj):

View File

@ -360,7 +360,7 @@ class BoMOptions(BaseOptions):
# Also create the rename and join lists. # Also create the rename and join lists.
# Lower case available columns (to check if valid) # Lower case available columns (to check if valid)
valid_columns_l = {c.lower(): c for c in valid_columns} valid_columns_l = {c.lower(): c for c in valid_columns}
logger.debug("Valid columns: "+str(valid_columns)) logger.debug("Valid columns: {} ({})".format(valid_columns, len(valid_columns)))
# Create the different lists # Create the different lists
columns = [] columns = []
for col in self.columns: for col in self.columns: