Add connector aditional bom components

This commit is contained in:
Tyler Ward 2020-07-20 02:13:44 +01:00
parent 389e48035d
commit 84c9db6a8a
2 changed files with 46 additions and 0 deletions

View File

@ -66,6 +66,7 @@ class Connector:
autogenerate: bool = False autogenerate: bool = False
loops: List[Any] = field(default_factory=list) loops: List[Any] = field(default_factory=list)
ignore_in_bom: bool = False ignore_in_bom: bool = False
additional_components: List[Any] = None
def __post_init__(self): def __post_init__(self):

View File

@ -332,6 +332,7 @@ class Harness:
def bom(self): def bom(self):
bom = [] bom = []
bom_connectors = [] bom_connectors = []
bom_connectors_extra = []
bom_cables = [] bom_cables = []
bom_extra = [] bom_extra = []
# connectors # connectors
@ -351,6 +352,50 @@ class Harness:
bom_connectors.append(item) bom_connectors.append(item)
bom_connectors = sorted(bom_connectors, key=lambda k: k['item']) # https://stackoverflow.com/a/73050 bom_connectors = sorted(bom_connectors, key=lambda k: k['item']) # https://stackoverflow.com/a/73050
bom.extend(bom_connectors) bom.extend(bom_connectors)
connectors_extra = []
for connector in self.connectors.values():
if connector.additional_components:
for part in connector.additional_components:
print(part)
if 'qty' in part:
if isinstance(part['qty'], int) or isinstance(part['qty'], float):
qty = part['qty']
else: # check for special quantities
if part['qty'] == 'pincount':
qty = connector.pincount
elif part['qty'] == 'connectioncount':
qty = connector.pincount
else:
raise ValueError('invalid aty parameter')
else:
qty = 1
connectors_extra.append(
{
'type': part['type'] if 'type' in part else None,
'qty': qty,
'unit': part['unit'] if 'unit' in part else None,
'manufacturer': part['manufacturer'] if 'manufacturer' in part else None,
'mpn': part['mpn'] if 'mpn' in part else None,
'pn': part['pn'] if 'pn' in part else None,
'designator': connector.name
}
)
connector_extra_group = lambda ce: (ce['type'], ce['qty'], ce['unit'], ce['manufacturer'], ce['mpn'], ce['pn'])
for group in Counter([connector_extra_group(v) for v in connectors_extra]):
items = [v for v in connectors_extra if connector_extra_group(v) == group]
shared = items[0]
designators = [i['designator'] for i in items]
designators = list(dict.fromkeys(designators)) # remove duplicates
designators.sort()
total_qty = sum(i['qty'] for i in items)
item = {'item': shared['type'], 'qty': round(total_qty, 3), 'unit': shared['unit'], 'designators': designators,
'manufacturer': shared['manufacturer'], 'mpn': shared['mpn'], 'pn': shared['pn']}
bom_connectors_extra.append(item)
bom_connectors_extra = sorted(bom_connectors_extra, key=lambda k: k['item']) # sort list of dicts by their values (https://stackoverflow.com/a/73050)
bom.extend(bom_connectors_extra)
# cables # cables
# TODO: If category can have other non-empty values than 'bundle', maybe it should be part of item name? # TODO: If category can have other non-empty values than 'bundle', maybe it should be part of item name?
# The category needs to be included in cable_group to keep the bundles excluded. # The category needs to be included in cable_group to keep the bundles excluded.