cleanup
This commit is contained in:
parent
f77654f876
commit
43d6d19f63
@ -65,15 +65,17 @@ def build_generated(groupkeys):
|
|||||||
# collect and iterate input YAML files
|
# collect and iterate input YAML files
|
||||||
yaml_files = [f for f in collect_filenames("Building", key, input_extensions)]
|
yaml_files = [f for f in collect_filenames("Building", key, input_extensions)]
|
||||||
try:
|
try:
|
||||||
res = cli([
|
res = cli(
|
||||||
"--formats", "ghpstb", # no pdf for now
|
[
|
||||||
"--prepend", yaml_files[0].parent / "metadata.yml",
|
"--formats",
|
||||||
*[str(f) for f in yaml_files],
|
"ghpstb", # no pdf for now
|
||||||
])
|
"--prepend",
|
||||||
|
yaml_files[0].parent / "metadata.yml",
|
||||||
|
*[str(f) for f in yaml_files],
|
||||||
|
]
|
||||||
|
)
|
||||||
except BaseException as e:
|
except BaseException as e:
|
||||||
if str(e) != "0" and not isinstance(
|
if str(e) != "0" and not isinstance(e, (click.ClickException, SystemExit)):
|
||||||
e, (click.ClickException, SystemExit)
|
|
||||||
):
|
|
||||||
raise
|
raise
|
||||||
|
|
||||||
if build_readme:
|
if build_readme:
|
||||||
@ -111,6 +113,7 @@ def clean_generated(groupkeys):
|
|||||||
print(f' rm "{filename}"')
|
print(f' rm "{filename}"')
|
||||||
filename.unlink()
|
filename.unlink()
|
||||||
|
|
||||||
|
|
||||||
def parse_args():
|
def parse_args():
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description=f"{APP_NAME} Example Manager",
|
description=f"{APP_NAME} Example Manager",
|
||||||
|
|||||||
@ -22,7 +22,6 @@ def partnumbers2list(
|
|||||||
if not isinstance(partnumbers, list):
|
if not isinstance(partnumbers, list):
|
||||||
partnumbers = [partnumbers]
|
partnumbers = [partnumbers]
|
||||||
|
|
||||||
|
|
||||||
# if there's no parent, fold
|
# if there's no parent, fold
|
||||||
if parent_partnumbers is None:
|
if parent_partnumbers is None:
|
||||||
return PartNumberInfo.list_keep_only_eq(partnumbers).str_list
|
return PartNumberInfo.list_keep_only_eq(partnumbers).str_list
|
||||||
|
|||||||
@ -14,7 +14,12 @@ import yaml
|
|||||||
|
|
||||||
import wireviz.wireviz as wv
|
import wireviz.wireviz as wv
|
||||||
from wireviz import APP_NAME, __version__
|
from wireviz import APP_NAME, __version__
|
||||||
from wireviz.wv_output import generate_pdf_output, generate_html_output, generate_shared_bom, generate_titlepage
|
from wireviz.wv_output import (
|
||||||
|
generate_pdf_output,
|
||||||
|
generate_html_output,
|
||||||
|
generate_shared_bom,
|
||||||
|
generate_titlepage,
|
||||||
|
)
|
||||||
from wireviz.wv_dataclasses import AUTOGENERATED_PREFIX, Metadata, Options
|
from wireviz.wv_dataclasses import AUTOGENERATED_PREFIX, Metadata, Options
|
||||||
|
|
||||||
format_codes = {
|
format_codes = {
|
||||||
@ -108,11 +113,20 @@ epilog = (
|
|||||||
@click.option(
|
@click.option(
|
||||||
"-m",
|
"-m",
|
||||||
"--multiplier-file-name",
|
"--multiplier-file-name",
|
||||||
default='quantity_multipliers.txt',
|
default="quantity_multipliers.txt",
|
||||||
type=str,
|
type=str,
|
||||||
help="name of file used to fetch the qty_multipliers",
|
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):
|
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.
|
Parses the provided FILE and generates the specified outputs.
|
||||||
"""
|
"""
|
||||||
@ -141,8 +155,8 @@ def cli(files, formats, prepend, output_dir, output_name, version, use_qty_multi
|
|||||||
extra_metadata["sheet_current"] += 1
|
extra_metadata["sheet_current"] += 1
|
||||||
extra_metadata["sheet_total"] += 1
|
extra_metadata["sheet_total"] += 1
|
||||||
|
|
||||||
if 'pdf' in harness_output_formats:
|
if "pdf" in harness_output_formats:
|
||||||
harness_output_formats.remove('pdf')
|
harness_output_formats.remove("pdf")
|
||||||
|
|
||||||
# run WireVIz on each input file
|
# run WireVIz on each input file
|
||||||
for _file in files:
|
for _file in files:
|
||||||
@ -170,7 +184,6 @@ def cli(files, formats, prepend, output_dir, output_name, version, use_qty_multi
|
|||||||
)
|
)
|
||||||
shared_bom = ret["shared_bom"]
|
shared_bom = ret["shared_bom"]
|
||||||
|
|
||||||
|
|
||||||
shared_bom_base = None
|
shared_bom_base = None
|
||||||
if "shared_bom" in output_formats:
|
if "shared_bom" in output_formats:
|
||||||
shared_bom_base, shared_bomlist = generate_shared_bom(
|
shared_bom_base, shared_bomlist = generate_shared_bom(
|
||||||
@ -181,24 +194,27 @@ def cli(files, formats, prepend, output_dir, output_name, version, use_qty_multi
|
|||||||
multiplier_file_name=multiplier_file_name,
|
multiplier_file_name=multiplier_file_name,
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('html' in output_formats) and create_titlepage:
|
if ("html" in output_formats) and create_titlepage:
|
||||||
# TODO: yaml data parsing shared
|
# TODO: yaml data parsing shared
|
||||||
yaml_data_str = "\n".join(f.open("r").read() for f in prepend)
|
yaml_data_str = "\n".join(f.open("r").read() for f in prepend)
|
||||||
yaml_data = yaml.safe_load(yaml_data_str)
|
yaml_data = yaml.safe_load(yaml_data_str)
|
||||||
|
|
||||||
generate_titlepage(yaml_data, extra_metadata, shared_bom)
|
generate_titlepage(yaml_data, extra_metadata, shared_bom)
|
||||||
|
|
||||||
if 'pdf' in output_formats:
|
if "pdf" in output_formats:
|
||||||
extra_metadata["titlepage"] = extra_metadata["titlepage"].with_suffix('_for_pdf')
|
extra_metadata["titlepage"] = extra_metadata["titlepage"].with_suffix(
|
||||||
|
"_for_pdf"
|
||||||
|
)
|
||||||
if create_titlepage:
|
if create_titlepage:
|
||||||
extra_metadata["output_names"].insert(0, extra_metadata["titlepage"].with_suffix('.html'))
|
extra_metadata["output_names"].insert(
|
||||||
|
0, extra_metadata["titlepage"].with_suffix(".html")
|
||||||
|
)
|
||||||
|
|
||||||
generate_titlepage(yaml_data, extra_metadata, shared_bom, for_pdf=True)
|
generate_titlepage(yaml_data, extra_metadata, shared_bom, for_pdf=True)
|
||||||
|
|
||||||
if 'pdf' in output_formats:
|
if "pdf" in output_formats:
|
||||||
generate_pdf_output([_output_dir / p for p in extra_metadata["output_names"]])
|
generate_pdf_output([_output_dir / p for p in extra_metadata["output_names"]])
|
||||||
|
|
||||||
|
|
||||||
print() # blank line after execution
|
print() # blank line after execution
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -157,7 +157,9 @@ class PartNumberInfo:
|
|||||||
}
|
}
|
||||||
|
|
||||||
def __bool__(self):
|
def __bool__(self):
|
||||||
return bool(self.pn or self.manufacturer or self.mpn or self.supplier or self.spn)
|
return bool(
|
||||||
|
self.pn or self.manufacturer or self.mpn or self.supplier or self.spn
|
||||||
|
)
|
||||||
|
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return hash((self.pn, self.manufacturer, self.mpn, self.supplier, self.spn))
|
return hash((self.pn, self.manufacturer, self.mpn, self.supplier, self.spn))
|
||||||
@ -175,7 +177,7 @@ class PartNumberInfo:
|
|||||||
empty_if_none = lambda x: "" if x is None else str(x)
|
empty_if_none = lambda x: "" if x is None else str(x)
|
||||||
|
|
||||||
if isinstance(self.pn, list):
|
if isinstance(self.pn, list):
|
||||||
raise ValueError(f'pn ({self.pn}) should not be a list')
|
raise ValueError(f"pn ({self.pn}) should not be a list")
|
||||||
self.pn = empty_if_none(self.pn)
|
self.pn = empty_if_none(self.pn)
|
||||||
self.manufacturer = empty_if_none(self.manufacturer)
|
self.manufacturer = empty_if_none(self.manufacturer)
|
||||||
self.mpn = empty_if_none(self.mpn)
|
self.mpn = empty_if_none(self.mpn)
|
||||||
@ -222,33 +224,33 @@ class PartNumberInfo:
|
|||||||
part = self.copy()
|
part = self.copy()
|
||||||
|
|
||||||
if other is None:
|
if other is None:
|
||||||
if op == '==':
|
if op == "==":
|
||||||
return part
|
return part
|
||||||
elif op == '!=':
|
elif op == "!=":
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError(f'op {op} not supported')
|
raise NotImplementedError(f"op {op} not supported")
|
||||||
|
|
||||||
if isinstance(other, list):
|
if isinstance(other, list):
|
||||||
for item in other:
|
for item in other:
|
||||||
part = part.clear_per_field(op, item)
|
part = part.clear_per_field(op, item)
|
||||||
else:
|
else:
|
||||||
for k in ["pn", "manufacturer", "mpn", "supplier", "spn"]:
|
for k in ["pn", "manufacturer", "mpn", "supplier", "spn"]:
|
||||||
if op == '==':
|
if op == "==":
|
||||||
if part[k] == other[k]:
|
if part[k] == other[k]:
|
||||||
part[k] = ""
|
part[k] = ""
|
||||||
elif op == '!=':
|
elif op == "!=":
|
||||||
if part[k] != other[k]:
|
if part[k] != other[k]:
|
||||||
part[k] = ""
|
part[k] = ""
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError(f'op {op} not supported')
|
raise NotImplementedError(f"op {op} not supported")
|
||||||
return part
|
return part
|
||||||
|
|
||||||
def keep_only_eq(self, other):
|
def keep_only_eq(self, other):
|
||||||
return self.clear_per_field('!=', other)
|
return self.clear_per_field("!=", other)
|
||||||
|
|
||||||
def remove_eq(self, other):
|
def remove_eq(self, other):
|
||||||
return self.clear_per_field('==', other)
|
return self.clear_per_field("==", other)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def list_keep_only_eq(partnumbers):
|
def list_keep_only_eq(partnumbers):
|
||||||
@ -257,6 +259,7 @@ class PartNumberInfo:
|
|||||||
pn = pn.keep_only_eq(p)
|
pn = pn.keep_only_eq(p)
|
||||||
return pn
|
return pn
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class BomEntry:
|
class BomEntry:
|
||||||
qty: NumberAndUnit
|
qty: NumberAndUnit
|
||||||
@ -277,7 +280,6 @@ class BomEntry:
|
|||||||
MAX_PRINTED_DESIGNATORS: int = 2
|
MAX_PRINTED_DESIGNATORS: int = 2
|
||||||
restrict_printed_lengths: bool = True
|
restrict_printed_lengths: bool = True
|
||||||
|
|
||||||
|
|
||||||
scaled_per_harness = False
|
scaled_per_harness = False
|
||||||
|
|
||||||
# Map a bom key to the header
|
# Map a bom key to the header
|
||||||
@ -291,7 +293,7 @@ class BomEntry:
|
|||||||
}
|
}
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f'{id}: {self.partnumbers}, {self.qty}'
|
return f"{id}: {self.partnumbers}, {self.qty}"
|
||||||
|
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return hash((self.partnumbers, self.description))
|
return hash((self.partnumbers, self.description))
|
||||||
@ -323,9 +325,7 @@ class BomEntry:
|
|||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
|
|
||||||
def __post_init__(self):
|
def __post_init__(self):
|
||||||
assert isinstance(
|
assert isinstance(self.qty, NumberAndUnit), f"Unexpected qty type {self.qty}"
|
||||||
self.qty, NumberAndUnit
|
|
||||||
), f"Unexpected qty type {self.qty}"
|
|
||||||
assert isinstance(
|
assert isinstance(
|
||||||
self.partnumbers, PartNumberInfo
|
self.partnumbers, PartNumberInfo
|
||||||
), f"Unexpected partnumbers type {self.partnumbers}"
|
), f"Unexpected partnumbers type {self.partnumbers}"
|
||||||
@ -342,11 +342,13 @@ class BomEntry:
|
|||||||
if not isinstance(self.qty_multiplier, str):
|
if not isinstance(self.qty_multiplier, str):
|
||||||
self.qty *= float(self.qty_multiplier)
|
self.qty *= float(self.qty_multiplier)
|
||||||
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def description_str(self):
|
def description_str(self):
|
||||||
description = self.description
|
description = self.description
|
||||||
if self.restrict_printed_lengths and len(description) > self.MAX_PRINTED_DESCRIPTION:
|
if (
|
||||||
|
self.restrict_printed_lengths
|
||||||
|
and len(description) > self.MAX_PRINTED_DESCRIPTION
|
||||||
|
):
|
||||||
description = f"{description[:self.MAX_PRINTED_DESCRIPTION]} (...)"
|
description = f"{description[:self.MAX_PRINTED_DESCRIPTION]} (...)"
|
||||||
return description
|
return description
|
||||||
|
|
||||||
@ -356,7 +358,10 @@ class BomEntry:
|
|||||||
return ""
|
return ""
|
||||||
|
|
||||||
all_designators = sorted(self.designators)
|
all_designators = sorted(self.designators)
|
||||||
if self.restrict_printed_lengths and len(all_designators) > self.MAX_PRINTED_DESIGNATORS:
|
if (
|
||||||
|
self.restrict_printed_lengths
|
||||||
|
and len(all_designators) > self.MAX_PRINTED_DESIGNATORS
|
||||||
|
):
|
||||||
all_designators = all_designators[: self.MAX_PRINTED_DESIGNATORS] + ["..."]
|
all_designators = all_designators[: self.MAX_PRINTED_DESIGNATORS] + ["..."]
|
||||||
return ", ".join(all_designators)
|
return ", ".join(all_designators)
|
||||||
|
|
||||||
@ -403,18 +408,22 @@ class BomEntry:
|
|||||||
|
|
||||||
def scale_per_harness(self, qty_multipliers):
|
def scale_per_harness(self, qty_multipliers):
|
||||||
if self.scaled_per_harness:
|
if self.scaled_per_harness:
|
||||||
logging.warn('{self}: Already scaled')
|
logging.warn("{self}: Already scaled")
|
||||||
|
|
||||||
qty = NumberAndUnit(0, self.qty.unit_str)
|
qty = NumberAndUnit(0, self.qty.unit_str)
|
||||||
for name, info in self.per_harness.items():
|
for name, info in self.per_harness.items():
|
||||||
multiplier_name = [k for k in qty_multipliers.keys() if name.endswith(k)]
|
multiplier_name = [k for k in qty_multipliers.keys() if name.endswith(k)]
|
||||||
if len(multiplier_name) == 0:
|
if len(multiplier_name) == 0:
|
||||||
raise ValueError(f'No multiplier found for harness {name} in {qty_multipliers}')
|
raise ValueError(
|
||||||
|
f"No multiplier found for harness {name} in {qty_multipliers}"
|
||||||
|
)
|
||||||
if len(multiplier_name) > 1:
|
if len(multiplier_name) > 1:
|
||||||
raise ValueError(f'Conflicting multipliers found ({multiplier_name}) for harness {name} in {qty_multipliers}')
|
raise ValueError(
|
||||||
|
f"Conflicting multipliers found ({multiplier_name}) for harness {name} in {qty_multipliers}"
|
||||||
|
)
|
||||||
|
|
||||||
info['qty'] *= qty_multipliers[multiplier_name[0]]
|
info["qty"] *= qty_multipliers[multiplier_name[0]]
|
||||||
qty += info['qty']
|
qty += info["qty"]
|
||||||
self.qty = qty
|
self.qty = qty
|
||||||
self.scaled_per_harness = True
|
self.scaled_per_harness = True
|
||||||
|
|
||||||
@ -563,7 +572,7 @@ class Component:
|
|||||||
self.qty = NumberAndUnit.to_number_and_unit(self.qty)
|
self.qty = NumberAndUnit.to_number_and_unit(self.qty)
|
||||||
self.amount = NumberAndUnit.to_number_and_unit(self.amount)
|
self.amount = NumberAndUnit.to_number_and_unit(self.amount)
|
||||||
if isinstance(self.pn, list):
|
if isinstance(self.pn, list):
|
||||||
raise RuntimeError(f'PN ({self.pn}) should not be a list')
|
raise RuntimeError(f"PN ({self.pn}) should not be a list")
|
||||||
|
|
||||||
for i, item in enumerate(self.additional_components):
|
for i, item in enumerate(self.additional_components):
|
||||||
if isinstance(item, Component):
|
if isinstance(item, Component):
|
||||||
@ -766,15 +775,21 @@ class Connector(GraphicalComponent):
|
|||||||
}
|
}
|
||||||
for subitem in self.additional_components:
|
for subitem in self.additional_components:
|
||||||
if isinstance(subitem.qty_multiplier, str):
|
if isinstance(subitem.qty_multiplier, str):
|
||||||
computed_factor = qty_multipliers_computed[subitem.qty_multiplier.upper()]
|
computed_factor = qty_multipliers_computed[
|
||||||
#if isinstance(subitem.qty_multiplier, QtyMultiplierConnector):
|
subitem.qty_multiplier.upper()
|
||||||
|
]
|
||||||
|
# if isinstance(subitem.qty_multiplier, QtyMultiplierConnector):
|
||||||
# computed_factor = qty_multipliers_computed[subitem.qty_multiplier.name.upper()]
|
# computed_factor = qty_multipliers_computed[subitem.qty_multiplier.name.upper()]
|
||||||
#elif isinstance(subitem.qty_multiplier, QtyMultiplierCable):
|
# elif isinstance(subitem.qty_multiplier, QtyMultiplierCable):
|
||||||
# raise Exception("Used a cable multiplier in a connector!")
|
# raise Exception("Used a cable multiplier in a connector!")
|
||||||
elif isinstance(subitem.qty_multiplier, int) or isinstance(subitem.qty_multiplier, float):
|
elif isinstance(subitem.qty_multiplier, int) or isinstance(
|
||||||
|
subitem.qty_multiplier, float
|
||||||
|
):
|
||||||
computed_factor = subitem.qty_multiplier
|
computed_factor = subitem.qty_multiplier
|
||||||
else:
|
else:
|
||||||
raise ValueError(f'Unexpected qty multiplier "{subitem.qty_multiplier}"')
|
raise ValueError(
|
||||||
|
f'Unexpected qty multiplier "{subitem.qty_multiplier}"'
|
||||||
|
)
|
||||||
subitem._qty_multiplier_computed = computed_factor
|
subitem._qty_multiplier_computed = computed_factor
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -30,7 +30,11 @@ from wireviz.wv_graphviz import (
|
|||||||
parse_arrow_str,
|
parse_arrow_str,
|
||||||
set_dot_basics,
|
set_dot_basics,
|
||||||
)
|
)
|
||||||
from wireviz.wv_output import embed_svg_images_file, generate_html_output, generate_pdf_output
|
from wireviz.wv_output import (
|
||||||
|
embed_svg_images_file,
|
||||||
|
generate_html_output,
|
||||||
|
generate_pdf_output,
|
||||||
|
)
|
||||||
from wireviz.wv_utils import bom2tsv
|
from wireviz.wv_utils import bom2tsv
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -4,9 +4,11 @@ import click
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
class HarnessQuantity():
|
|
||||||
|
|
||||||
def __init__(self, harnesses, multiplier_file="quantity_multipliers.txt", output_dir=None):
|
class HarnessQuantity:
|
||||||
|
def __init__(
|
||||||
|
self, harnesses, multiplier_file="quantity_multipliers.txt", output_dir=None
|
||||||
|
):
|
||||||
self.harness_names = [harness.stem for harness in harnesses]
|
self.harness_names = [harness.stem for harness in harnesses]
|
||||||
self.multipliers = {}
|
self.multipliers = {}
|
||||||
self.folder = output_dir if output_dir is not None else harnesses[0].parent
|
self.folder = output_dir if output_dir is not None else harnesses[0].parent
|
||||||
@ -17,11 +19,13 @@ class HarnessQuantity():
|
|||||||
|
|
||||||
def fetch_qty_multipliers_from_file(self):
|
def fetch_qty_multipliers_from_file(self):
|
||||||
if self.qty_multipliers.is_file():
|
if self.qty_multipliers.is_file():
|
||||||
with open(self.qty_multipliers, 'r') as f:
|
with open(self.qty_multipliers, "r") as f:
|
||||||
try:
|
try:
|
||||||
self.multipliers = json.load(f)
|
self.multipliers = json.load(f)
|
||||||
except json.decoder.JSONDecodeError as err:
|
except json.decoder.JSONDecodeError as err:
|
||||||
raise ValueError(f'Invalid format for file {self.qty_multipliers}, error: {err}')
|
raise ValueError(
|
||||||
|
f"Invalid format for file {self.qty_multipliers}, error: {err}"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
self.get_qty_multipliers_from_user()
|
self.get_qty_multipliers_from_user()
|
||||||
self.save_qty_multipliers_to_file()
|
self.save_qty_multipliers_to_file()
|
||||||
@ -29,19 +33,22 @@ class HarnessQuantity():
|
|||||||
|
|
||||||
def check_all_multipliers_defined(self):
|
def check_all_multipliers_defined(self):
|
||||||
for name in self.harness_names:
|
for name in self.harness_names:
|
||||||
assert name in self.multipliers, \
|
assert (
|
||||||
f"No multiplier defined for harness {name}, maybe delete the multiplier_file {self.qty_multipliers}"
|
name in self.multipliers
|
||||||
|
), f"No multiplier defined for harness {name}, maybe delete the multiplier_file {self.qty_multipliers}"
|
||||||
|
|
||||||
def get_qty_multipliers_from_user(self):
|
def get_qty_multipliers_from_user(self):
|
||||||
for name in self.harness_names:
|
for name in self.harness_names:
|
||||||
try:
|
try:
|
||||||
self.multipliers[name] = int(input("Quantity multiplier for {}? ".format(name)))
|
self.multipliers[name] = int(
|
||||||
|
input("Quantity multiplier for {}? ".format(name))
|
||||||
|
)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
logging.warning("Quantity multiplier must be an integer!")
|
logging.warning("Quantity multiplier must be an integer!")
|
||||||
break
|
break
|
||||||
|
|
||||||
def save_qty_multipliers_to_file(self):
|
def save_qty_multipliers_to_file(self):
|
||||||
with open(self.qty_multipliers,"w") as f:
|
with open(self.qty_multipliers, "w") as f:
|
||||||
json.dump(self.multipliers, f)
|
json.dump(self.multipliers, f)
|
||||||
|
|
||||||
def retrieve_harness_qty_multiplier(self, bom_file):
|
def retrieve_harness_qty_multiplier(self, bom_file):
|
||||||
@ -63,7 +70,7 @@ class HarnessQuantity():
|
|||||||
@click.option(
|
@click.option(
|
||||||
"-m",
|
"-m",
|
||||||
"--multiplier-file-name",
|
"--multiplier-file-name",
|
||||||
default='quantity_multipliers.txt',
|
default="quantity_multipliers.txt",
|
||||||
type=str,
|
type=str,
|
||||||
help="name of file used to fetch or save the qty_multipliers",
|
help="name of file used to fetch or save the qty_multipliers",
|
||||||
)
|
)
|
||||||
@ -82,4 +89,3 @@ def qty_multipliers(files, multiplier_file_name, force_new):
|
|||||||
harnesses.fetch_qty_multipliers_from_file()
|
harnesses.fetch_qty_multipliers_from_file()
|
||||||
qty_multipliers = harnesses.multipliers
|
qty_multipliers = harnesses.multipliers
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@ -64,26 +64,27 @@ def embed_svg_images_file(
|
|||||||
|
|
||||||
def generate_pdf_output(
|
def generate_pdf_output(
|
||||||
filename_list: List[Path],
|
filename_list: List[Path],
|
||||||
options: Dict=None,
|
options: Dict = None,
|
||||||
):
|
):
|
||||||
'''Generate a pdf output, options are ignored for now, expect the formatting
|
"""Generate a pdf output, options are ignored for now, expect the formatting
|
||||||
to be done within the html files
|
to be done within the html files
|
||||||
'''
|
"""
|
||||||
if isinstance(filename_list, Path):
|
if isinstance(filename_list, Path):
|
||||||
filename_list = [filename_list]
|
filename_list = [filename_list]
|
||||||
output_path = filename_list[0].with_suffix('.pdf')
|
output_path = filename_list[0].with_suffix(".pdf")
|
||||||
else:
|
else:
|
||||||
output_dir = filename_list[0].parent
|
output_dir = filename_list[0].parent
|
||||||
output_path = (output_dir / output_dir.name).with_suffix('.pdf')
|
output_path = (output_dir / output_dir.name).with_suffix(".pdf")
|
||||||
|
|
||||||
filepath_list = [f.with_suffix('.html') for f in filename_list]
|
filepath_list = [f.with_suffix(".html") for f in filename_list]
|
||||||
|
|
||||||
print(f'Generating pdf output: {output_path}')
|
print(f"Generating pdf output: {output_path}")
|
||||||
files_html = [HTML(path) for path in filepath_list]
|
files_html = [HTML(path) for path in filepath_list]
|
||||||
documents = [f.render() for f in files_html]
|
documents = [f.render() for f in files_html]
|
||||||
all_pages = [p for doc in documents for p in doc.pages]
|
all_pages = [p for doc in documents for p in doc.pages]
|
||||||
documents[0].copy(all_pages).write_pdf(output_path)
|
documents[0].copy(all_pages).write_pdf(output_path)
|
||||||
|
|
||||||
|
|
||||||
def generate_shared_bom(
|
def generate_shared_bom(
|
||||||
output_dir,
|
output_dir,
|
||||||
shared_bom,
|
shared_bom,
|
||||||
@ -93,13 +94,13 @@ def generate_shared_bom(
|
|||||||
):
|
):
|
||||||
shared_bom_base = output_dir / "shared_bom"
|
shared_bom_base = output_dir / "shared_bom"
|
||||||
shared_bom_file = shared_bom_base.with_suffix(".tsv")
|
shared_bom_file = shared_bom_base.with_suffix(".tsv")
|
||||||
print(f'Generating shared bom at {shared_bom_base}')
|
print(f"Generating shared bom at {shared_bom_base}")
|
||||||
|
|
||||||
if use_qty_multipliers:
|
if use_qty_multipliers:
|
||||||
harnesses = HarnessQuantity(files, multiplier_file_name, output_dir=output_dir)
|
harnesses = HarnessQuantity(files, multiplier_file_name, output_dir=output_dir)
|
||||||
harnesses.fetch_qty_multipliers_from_file()
|
harnesses.fetch_qty_multipliers_from_file()
|
||||||
qty_multipliers = harnesses.multipliers
|
qty_multipliers = harnesses.multipliers
|
||||||
print(f'Using quantity multipliers: {qty_multipliers}')
|
print(f"Using quantity multipliers: {qty_multipliers}")
|
||||||
for bom_item in shared_bom.values():
|
for bom_item in shared_bom.values():
|
||||||
bom_item.scale_per_harness(qty_multipliers)
|
bom_item.scale_per_harness(qty_multipliers)
|
||||||
|
|
||||||
@ -121,7 +122,7 @@ def generate_html_output(
|
|||||||
template_name = metadata.get("template", {}).get("name", "simple")
|
template_name = metadata.get("template", {}).get("name", "simple")
|
||||||
|
|
||||||
svgdata = None
|
svgdata = None
|
||||||
if template_name != 'titlepage':
|
if template_name != "titlepage":
|
||||||
# embed SVG diagram for all but the titlepage
|
# embed SVG diagram for all but the titlepage
|
||||||
with filename.with_suffix(".svg").open("r") as f:
|
with filename.with_suffix(".svg").open("r") as f:
|
||||||
svgdata = re.sub(
|
svgdata = re.sub(
|
||||||
@ -133,7 +134,9 @@ def generate_html_output(
|
|||||||
|
|
||||||
# generate BOM table
|
# generate BOM table
|
||||||
# generate BOM header (may be at the top or bottom of the table)
|
# generate BOM header (may be at the top or bottom of the table)
|
||||||
bom_reversed = False if template_name == "simple" or template_name == "titlepage" else True
|
bom_reversed = (
|
||||||
|
False if template_name == "simple" or template_name == "titlepage" else True
|
||||||
|
)
|
||||||
bom_header = bom[0]
|
bom_header = bom[0]
|
||||||
bom_columns = [
|
bom_columns = [
|
||||||
"bom_col_{}".format("id" if c == "#" else c.lower()) for c in bom_header
|
"bom_col_{}".format("id" if c == "#" else c.lower()) for c in bom_header
|
||||||
@ -142,7 +145,6 @@ def generate_html_output(
|
|||||||
if bom_reversed:
|
if bom_reversed:
|
||||||
bom_content.reverse()
|
bom_content.reverse()
|
||||||
|
|
||||||
|
|
||||||
if metadata:
|
if metadata:
|
||||||
sheet_current = metadata["sheet_current"]
|
sheet_current = metadata["sheet_current"]
|
||||||
sheet_total = metadata["sheet_total"]
|
sheet_total = metadata["sheet_total"]
|
||||||
@ -217,39 +219,37 @@ def generate_html_output(
|
|||||||
# save generated file
|
# save generated file
|
||||||
filename.with_suffix(".html").open("w").write(page_rendered)
|
filename.with_suffix(".html").open("w").write(page_rendered)
|
||||||
|
|
||||||
|
|
||||||
def generate_titlepage(yaml_data, extra_metadata, shared_bom, for_pdf=False):
|
def generate_titlepage(yaml_data, extra_metadata, shared_bom, for_pdf=False):
|
||||||
print('Generating titlepage')
|
print("Generating titlepage")
|
||||||
|
|
||||||
index_table_content = []
|
index_table_content = []
|
||||||
index_table_content.append((
|
index_table_content.append((1, extra_metadata["titlepage"], ""))
|
||||||
1, extra_metadata['titlepage'], ''
|
|
||||||
))
|
|
||||||
|
|
||||||
for index, page_name in enumerate(extra_metadata['output_names']):
|
|
||||||
index_table_content.append((
|
|
||||||
index+2, page_name, ''
|
|
||||||
))
|
|
||||||
|
|
||||||
|
for index, page_name in enumerate(extra_metadata["output_names"]):
|
||||||
|
index_table_content.append((index + 2, page_name, ""))
|
||||||
|
|
||||||
if not for_pdf:
|
if not for_pdf:
|
||||||
index_table_content = [(
|
index_table_content = [
|
||||||
p[0],
|
(
|
||||||
f"<a href={Path(p[1]).with_suffix('.html')}>{p[1]}</a>",
|
p[0],
|
||||||
p[2],
|
f"<a href={Path(p[1]).with_suffix('.html')}>{p[1]}</a>",
|
||||||
) for p in index_table_content]
|
p[2],
|
||||||
|
)
|
||||||
|
for p in index_table_content
|
||||||
|
]
|
||||||
|
|
||||||
|
# if create_titlepage:
|
||||||
#if create_titlepage:
|
|
||||||
# extra_metadata["index_table_content"].append([
|
# extra_metadata["index_table_content"].append([
|
||||||
# sheet_current,
|
# sheet_current,
|
||||||
# f"<a href={Path(_output_name).with_suffix('.html')}>{extra_metadata['sheet_name']}</a>",
|
# f"<a href={Path(_output_name).with_suffix('.html')}>{extra_metadata['sheet_name']}</a>",
|
||||||
# "",
|
# "",
|
||||||
# ])
|
# ])
|
||||||
#index_table_content.insert(0, [
|
# index_table_content.insert(0, [
|
||||||
# 1,
|
# 1,
|
||||||
# f"<a href={Path('titlepage').with_suffix('.html')}>Title Page</a>",
|
# f"<a href={Path('titlepage').with_suffix('.html')}>Title Page</a>",
|
||||||
# ''
|
# ''
|
||||||
#])
|
# ])
|
||||||
|
|
||||||
titlepage_metadata = {
|
titlepage_metadata = {
|
||||||
**yaml_data.get("metadata", {}),
|
**yaml_data.get("metadata", {}),
|
||||||
@ -262,7 +262,7 @@ def generate_titlepage(yaml_data, extra_metadata, shared_bom, for_pdf=False):
|
|||||||
"bom_updated_position": "top: 20mm; left: 10mm",
|
"bom_updated_position": "top: 20mm; left: 10mm",
|
||||||
"notes_width": "200mm",
|
"notes_width": "200mm",
|
||||||
}
|
}
|
||||||
titlepage_metadata['template']['name'] = 'titlepage'
|
titlepage_metadata["template"]["name"] = "titlepage"
|
||||||
titlepage_options = {
|
titlepage_options = {
|
||||||
"show_bom": True,
|
"show_bom": True,
|
||||||
"show_index_table": True,
|
"show_index_table": True,
|
||||||
@ -270,8 +270,8 @@ def generate_titlepage(yaml_data, extra_metadata, shared_bom, for_pdf=False):
|
|||||||
**yaml_data.get("options", {}),
|
**yaml_data.get("options", {}),
|
||||||
}
|
}
|
||||||
generate_html_output(
|
generate_html_output(
|
||||||
extra_metadata['output_dir']/ extra_metadata['titlepage'],
|
extra_metadata["output_dir"] / extra_metadata["titlepage"],
|
||||||
bom = bom_list(shared_bom),
|
bom=bom_list(shared_bom),
|
||||||
metadata = Metadata(**titlepage_metadata), # TBD what we need to add here
|
metadata=Metadata(**titlepage_metadata), # TBD what we need to add here
|
||||||
options = Options(**titlepage_options),
|
options=Options(**titlepage_options),
|
||||||
)
|
)
|
||||||
|
|||||||
@ -1,11 +1,9 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import jinja2
|
import jinja2
|
||||||
|
|
||||||
|
|
||||||
def get_template(template_name, extension=""):
|
def get_template(template_name, extension=""):
|
||||||
template_file_path = jinja2.FileSystemLoader(
|
template_file_path = jinja2.FileSystemLoader(Path(__file__).parent / "templates")
|
||||||
Path(__file__).parent / "templates"
|
|
||||||
)
|
|
||||||
jinja_env = jinja2.Environment(loader=template_file_path)
|
jinja_env = jinja2.Environment(loader=template_file_path)
|
||||||
|
|
||||||
return jinja_env.get_template(template_name + extension)
|
return jinja_env.get_template(template_name + extension)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user