Prepare harness.populate_bom()

This commit is contained in:
Daniel Rojas 2021-10-21 22:07:30 +02:00 committed by KV
parent 5c18001188
commit fe016d63ce
7 changed files with 42 additions and 15 deletions

View File

@ -253,7 +253,7 @@ class Component:
class AdditionalComponent(Component): class AdditionalComponent(Component):
qty: float = 1 qty: float = 1
unit: Optional[str] = None unit: Optional[str] = None
qty_multiplier: Union[ConnectorMultiplier, CableMultiplier, None] = None qty_multiplier: Union[ConnectorMultiplier, CableMultiplier, None] = 1
designators: Optional[str] = None # used for components definedi in the designators: Optional[str] = None # used for components definedi in the
# additional_bom_items section within another component # additional_bom_items section within another component
bgcolor: SingleColor = None # ^ same here bgcolor: SingleColor = None # ^ same here
@ -262,6 +262,10 @@ class AdditionalComponent(Component):
super().fill_partnumbers() super().fill_partnumbers()
self.bgcolor = SingleColor(self.bgcolor) self.bgcolor = SingleColor(self.bgcolor)
@property
def qty_final(self):
return 999
@property @property
def description(self) -> str: def description(self) -> str:
substrs = [self.type, self.subtype if self.subtype else ""] substrs = [self.type, self.subtype if self.subtype else ""]
@ -428,6 +432,7 @@ class Connector(TopLevelGraphicalComponent):
self.ports_right = True self.ports_right = True
def get_qty_multiplier(self, qty_multiplier: Optional[ConnectorMultiplier]) -> int: def get_qty_multiplier(self, qty_multiplier: Optional[ConnectorMultiplier]) -> int:
# TODO!!! how and when to compute final qty for additional components???
if not qty_multiplier: if not qty_multiplier:
return 1 return 1
elif qty_multiplier == "pincount": elif qty_multiplier == "pincount":

View File

@ -55,17 +55,17 @@ class Harness:
def add_connector(self, designator: str, *args, **kwargs) -> None: def add_connector(self, designator: str, *args, **kwargs) -> None:
conn = Connector(designator=designator, *args, **kwargs) conn = Connector(designator=designator, *args, **kwargs)
self.connectors[designator] = conn self.connectors[designator] = conn
self._add_to_internal_bom(conn) # self._add_to_internal_bom(conn)
def add_cable(self, designator: str, *args, **kwargs) -> None: def add_cable(self, designator: str, *args, **kwargs) -> None:
cbl = Cable(designator=designator, *args, **kwargs) cbl = Cable(designator=designator, *args, **kwargs)
self.cables[designator] = cbl self.cables[designator] = cbl
self._add_to_internal_bom(cbl) # self._add_to_internal_bom(cbl)
def add_additional_bom_item(self, item: dict) -> None: def add_additional_bom_item(self, item: dict) -> None:
new_item = AdditionalComponent(**item) new_item = AdditionalComponent(**item)
self.additional_bom_items.append(new_item) self.additional_bom_items.append(new_item)
self._add_to_internal_bom(new_item) # self._add_to_internal_bom(new_item)
def add_mate_pin(self, from_name, from_pin, to_name, to_pin, arrow_str) -> None: def add_mate_pin(self, from_name, from_pin, to_name, to_pin, arrow_str) -> None:
from_con = self.connectors[from_name] from_con = self.connectors[from_name]
@ -115,7 +115,7 @@ class Harness:
_add( _add(
comp.bom_hash, comp.bom_hash,
designator=item.designator, designator=item.designator,
qty=comp.qty, qty=comp.qty_final,
category="connector/additional", category="connector/additional",
) )
elif isinstance(item, Cable): elif isinstance(item, Cable):
@ -123,29 +123,47 @@ class Harness:
if item.category == "bundle": if item.category == "bundle":
_cat = "wire" _cat = "wire"
for wire in item.wire_objects: for wire in item.wire_objects:
_add(None, qty=item.length+.001, designator=item.designator, category="wire DUMMY") _add(
None,
qty=item.length + 0.001,
designator=item.designator,
category="wire DUMMY",
)
else: else:
_cat = "cable" _cat = "cable"
_add(item.bom_hash, qty=item.length, designator=item.designator, category="cable") _add(
item.bom_hash,
qty=item.length,
designator=item.designator,
category="cable",
)
for comp in item.additional_components: for comp in item.additional_components:
if comp.ignore_in_bom: if comp.ignore_in_bom:
continue continue
_add( _add(
comp.bom_hash, comp.bom_hash,
designator=item.designator, designator=item.designator,
qty=comp.qty, qty=comp.qty_final,
category=f"{_cat}/additional", category=f"{_cat}/additional",
) )
elif isinstance(item, AdditionalComponent): # additional component elif isinstance(item, AdditionalComponent): # additional component
_add( _add(
item.bom_hash, item.bom_hash,
designator=item.designators, designator=item.designators,
qty=item.qty, qty=item.qty_final,
category="additional", category="additional",
) )
else: else:
raise Exception(f"Unknown type of item:\n{item}") raise Exception(f"Unknown type of item:\n{item}")
def populate_bom(self):
pass
# raise Exception(
# "Implement BOM population after all connections have been made, "
# " so that additional component qty's can be computed correctly "
# "(factoring in number of connected pins/wires/...)"
# )
def connect( def connect(
self, self,
from_name: str, from_name: str,

View File

@ -370,6 +370,8 @@ def parse(
for line in yaml_data["additional_bom_items"]: for line in yaml_data["additional_bom_items"]:
harness.add_additional_bom_item(line) harness.add_additional_bom_item(line)
harness.populate_bom()
if output_formats: if output_formats:
harness.output(filename=output_file, fmt=output_formats, view=False) harness.output(filename=output_file, fmt=output_formats, view=False)

View File

@ -5,6 +5,8 @@ from dataclasses import dataclass
from enum import Enum from enum import Enum
from typing import List, Optional, Union from typing import List, Optional, Union
from wireviz.wv_helper import html_line_breaks
BOM_HASH_FIELDS = "description unit partnumbers" BOM_HASH_FIELDS = "description unit partnumbers"
BomHash = namedtuple("BomHash", BOM_HASH_FIELDS) BomHash = namedtuple("BomHash", BOM_HASH_FIELDS)
BomHashList = namedtuple("BomHashList", BOM_HASH_FIELDS) BomHashList = namedtuple("BomHashList", BOM_HASH_FIELDS)

View File

@ -19,7 +19,7 @@ from wireviz.DataClasses import (
WireClass, WireClass,
) )
from wireviz.wv_bom import partnumbers_to_list from wireviz.wv_bom import partnumbers_to_list
from wireviz.wv_helper import remove_links from wireviz.wv_helper import html_line_breaks, remove_links
from wireviz.wv_table_util import * # TODO: explicitly import each needed tag later from wireviz.wv_table_util import * # TODO: explicitly import each needed tag later
@ -454,10 +454,6 @@ def html_size_attr_dict(image):
return attr_dict return attr_dict
def html_line_breaks(inp):
return remove_links(inp).replace("\n", "<br />") if isinstance(inp, str) else inp
def set_dot_basics(dot, options): def set_dot_basics(dot, options):
dot.body.append(f"// Graph generated by {APP_NAME} {__version__}\n") dot.body.append(f"// Graph generated by {APP_NAME} {__version__}\n")
dot.body.append(f"// {APP_URL}\n") dot.body.append(f"// {APP_URL}\n")

View File

@ -100,6 +100,10 @@ def tuplelist2tsv(inp, header=None):
return output return output
def html_line_breaks(inp):
return remove_links(inp).replace("\n", "<br />") if isinstance(inp, str) else inp
def remove_links(inp): def remove_links(inp):
return ( return (
re.sub(r"<[aA] [^>]*>([^<]*)</[aA]>", r"\1", inp) re.sub(r"<[aA] [^>]*>([^<]*)</[aA]>", r"\1", inp)

View File

@ -6,9 +6,9 @@ from typing import Dict, List, Union
from wireviz import APP_NAME, APP_URL, __version__, wv_colors from wireviz import APP_NAME, APP_URL, __version__, wv_colors
from wireviz.DataClasses import Metadata, Options from wireviz.DataClasses import Metadata, Options
from wireviz.wv_gv_html import html_line_breaks
from wireviz.wv_helper import ( from wireviz.wv_helper import (
flatten2d, flatten2d,
html_line_breaks,
open_file_read, open_file_read,
open_file_write, open_file_write,
smart_file_resolve, smart_file_resolve,