from functools import total_ordering from pathlib import Path from typing import List, Tuple from ee.part import PartDb, load_db, save_db from ee.xml import types, bom_file_utils __all__ = ["create_order"] @total_ordering class PartInfo(object): def __init__(self, part: types.Part): self.part = part self.id = part.id self.pn = bom_file_utils.find_pn(part) self.available_from: List[Tuple[str, types.Part]] = [] def __lt__(self, other: "PartInfo"): return self.part.idProp == other.part.idProp def create_order(schematic_dir: Path, out_dir: Path, part_db_dirs: List[Path], fail_on_missing_parts: bool): sch_db = load_db(schematic_dir) dbs = [(path.parent.name, load_db(path)) for path in part_db_dirs] out_parts = PartDb() infos = [PartInfo(sch) for sch in sch_db.iterparts()] for info in infos: print("Resolving {}".format(info.id)) for distributor, db in dbs: for p in db.iterparts(sort=True): if info.pn: p_pn: str = bom_file_utils.find_pn(p) if info.pn == p_pn: info.available_from.append((distributor, p)) for sch_pn_ in bom_file_utils.part_numbers(info.part): sch_pn: types.PartNumber = sch_pn_ for p_pn_ in bom_file_utils.part_numbers(p): p_pn: types.PartNumber = p_pn_ if sch_pn.distributorProp == p_pn.distributorProp and sch_pn.value == p_pn.value: if p.idProp not in info.available_from: info.available_from.append((distributor, p)) for info in infos: print("Resolved {} to {}".format(info.id, info.available_from)) warnings = [] has_missing_parts = False for info in infos: if len(info.available_from) == 0: has_missing_parts = True warnings.append("Could not find {} in any database, part numbers: {}". format(info.id, ", ".join([p.value for p in bom_file_utils.part_numbers(info.part)]))) for w in sorted(warnings): print(w) if has_missing_parts and fail_on_missing_parts: print("has missing parts") return False for info in infos: part = types.Part(id=info.part.id, schema_reference=info.part.schema_reference, part_numbers=types.PartNumberList()) part_numbers = part.part_numbersProp.part_number if len(info.available_from) == 0: continue distributor, distributor_part = info.available_from[0] part_numbers.append(types.PartNumber(value=distributor_part.id, distributor=distributor)) out_parts.add_entry(part, True) print("Saving {} work parts".format(out_parts.size())) save_db(out_dir, out_parts)