From 5b419138277dcee365e303ea9dfb3fecfa27743f Mon Sep 17 00:00:00 2001 From: Laurier Loiselle Date: Wed, 29 Mar 2023 11:55:23 -0400 Subject: [PATCH] src: add scaling of shared harness --- src/wireviz/wv_cli.py | 29 +++++++++++++++++++++++++++-- src/wireviz/wv_dataclasses.py | 22 ++++++++++++++++++++++ src/wireviz/wv_harness.py | 5 ++++- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/wireviz/wv_cli.py b/src/wireviz/wv_cli.py index 25e26c8..4c71470 100644 --- a/src/wireviz/wv_cli.py +++ b/src/wireviz/wv_cli.py @@ -13,6 +13,7 @@ import wireviz.wireviz as wv from wireviz import APP_NAME, __version__ from wireviz.wv_bom import bom_list from wireviz.wv_utils import bom2tsv +from wireviz.wv_harness_quantity import HarnessQuantity format_codes = { "c": "csv", @@ -95,7 +96,21 @@ epilog = ( default=False, help=f"Output {APP_NAME} version and exit.", ) -def cli(files, formats, prepend, output_dir, output_name, version): +@click.option( + "-u", + "--use-qty-multipliers", + is_flag=True, + type=bool, + help="if set, the shared bom counts will be scaled with the qty-multipliers", +) +@click.option( + "-m", + "--multiplier-file-name", + default='quantity_multipliers.txt', + type=str, + help="name of file used to fetch the qty_multipliers", +) +def cli(files, formats, prepend, output_dir, output_name, version, use_qty_multipliers, multiplier_file_name): """ Parses the provided FILE and generates the specified outputs. """ @@ -141,9 +156,19 @@ def cli(files, formats, prepend, output_dir, output_name, version): shared_bom = ret["shared_bom"] if "shared_bom" in output_formats: + shared_bom_file = (_output_dir / "shared_bom").with_suffix(".tsv") + print(f'Generating shared bom at {shared_bom_file}') + if use_qty_multipliers: + harnesses = HarnessQuantity(files, multiplier_file_name, output_dir=_output_dir) + harnesses.fetch_qty_multipliers_from_file() + qty_multipliers = harnesses.multipliers + for bom_item in shared_bom.values(): + bom_item.scale_per_harness(qty_multipliers) + shared_bomlist = bom_list(shared_bom) + shared_bom_tsv = bom2tsv(shared_bomlist) - (_output_dir / "shared_bom").with_suffix(".tsv").open("w").write(shared_bom_tsv) + shared_bom_file.open("w").write(shared_bom_tsv) print() # blank line after execution diff --git a/src/wireviz/wv_dataclasses.py b/src/wireviz/wv_dataclasses.py index 461083a..d039b18 100644 --- a/src/wireviz/wv_dataclasses.py +++ b/src/wireviz/wv_dataclasses.py @@ -268,6 +268,8 @@ class BomEntry: category: Optional[str] = None ignore_in_bom: Optional[bool] = False + scaled_per_harness = False + # Used to add all occurence of a BomEntry designators: [List] = field(default_factory=list) per_harness: [Dict] = field(default_factory=dict) @@ -286,6 +288,9 @@ class BomEntry: "per_harness": "Per Harness", } + def __repr__(self): + f'{id}: {self.partnumbers}, {self.qty}' + def __hash__(self): return hash((self.partnumbers, self.description)) @@ -394,6 +399,23 @@ class BomEntry: return self.partnumbers.BOM_KEY_TO_COLUMNS[key] raise ValueError(f"key '{key}' not found in bom keys") + def scale_per_harness(self, qty_multipliers): + if self.scaled_per_harness: + logging.warn('{self}: Already scaled') + + qty = NumberAndUnit(0, self.qty.unit_str) + for name, info in self.per_harness.items(): + multiplier_name = [k for k in qty_multipliers.keys() if name.endswith(k)] + if len(multiplier_name) == 0: + raise ValueError(f'No multiplier found for harness {name} in {qty_multipliers}') + if len(multiplier_name) > 1: + raise ValueError(f'Conflicting multipliers found ({multiplier_name}) for harness {name} in {qty_multipliers}') + + info['qty'] *= qty_multipliers[multiplier_name[0]] + qty += info['qty'] + self.qty = qty + self.scaled_per_harness = True + @dataclass class Options: diff --git a/src/wireviz/wv_harness.py b/src/wireviz/wv_harness.py index 120ab8e..43acc5b 100644 --- a/src/wireviz/wv_harness.py +++ b/src/wireviz/wv_harness.py @@ -52,7 +52,10 @@ class Harness: def name(self) -> str: pn = self.metadata.get("pn", "") output_name = self.metadata["output_name"] - return pn + output_name + if pn: + return f"{pn}-{output_name}" + else: + return output_name def add_connector(self, designator: str, *args, **kwargs) -> None: conn = Connector(designator=designator, *args, **kwargs)