From c53455533e71cf371ae9215dfff424b3bc22311a Mon Sep 17 00:00:00 2001 From: KV Date: Sun, 30 Jun 2024 16:01:21 +0200 Subject: [PATCH 1/2] Add options.terminology to override certain terms These terms can optionally be replaced by user defined terms: pin, wire, shield Resolves #331 basic feature --- src/wireviz/DataClasses.py | 17 ++++++++++++++++- src/wireviz/Harness.py | 5 +++-- src/wireviz/wv_bom.py | 10 +++++++--- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index 5b4bb06..7e8a93a 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from dataclasses import InitVar, dataclass, field +from dataclasses import InitVar, asdict, dataclass, field, replace from enum import Enum, auto from pathlib import Path from typing import Dict, List, Optional, Tuple, Union @@ -47,6 +47,19 @@ class Metadata(dict): pass +@dataclass +class Terminology: + """Terms that the user might want to override""" + + pin: Optional[PlainText] = None + wire: Optional[PlainText] = None + shield: Optional[PlainText] = None + + def fully_populated(self): + """Return a copy where empty field values are replaced with their names""" + return replace(self, **{k: v or k for k, v in asdict(self).items()}) + + @dataclass class Options: fontname: PlainText = "arial" @@ -58,6 +71,7 @@ class Options: color_mode: ColorMode = "SHORT" mini_bom_mode: bool = True template_separator: str = "." + terminology: Optional[Terminology] = None def __post_init__(self): if not self.bgcolor_node: @@ -68,6 +82,7 @@ class Options: self.bgcolor_cable = self.bgcolor_node if not self.bgcolor_bundle: self.bgcolor_bundle = self.bgcolor_cable + self.terminology = Terminology(**(self.terminology or {})) @dataclass diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 30468a6..a5333e4 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -77,6 +77,7 @@ class Harness: self.mates = [] self._bom = [] # Internal Cache for generated bom self.additional_bom_items = [] + self.terminology = self.options.terminology.fully_populated() def add_connector(self, name: str, *args, **kwargs) -> None: check_old(f"Connector '{name}'", OLD_CONNECTOR_ATTR, kwargs) @@ -200,7 +201,7 @@ class Harness: html_line_breaks(pn_info_string(HEADER_SPN, connector.supplier, connector.spn))], [html_line_breaks(connector.type), html_line_breaks(connector.subtype), - f'{connector.pincount}-pin' if connector.show_pincount else None, + f'{connector.pincount}-{self.terminology.pin}' if connector.show_pincount else None, translate_color(connector.color, self.options.color_mode) if connector.color else None, html_colorbar(connector.color)], '' if connector.style != 'simple' else None, @@ -419,7 +420,7 @@ class Harness: wirehtml.append("  ") # spacer wirehtml.append(" ") wirehtml.append(" ") - wirehtml.append(" Shield") + wirehtml.append(f" {self.terminology.shield.title()}") wirehtml.append(" ") wirehtml.append(" ") if isinstance(cable.shield, str): diff --git a/src/wireviz/wv_bom.py b/src/wireviz/wv_bom.py index 27ee59b..1f354e0 100644 --- a/src/wireviz/wv_bom.py +++ b/src/wireviz/wv_bom.py @@ -107,7 +107,11 @@ def generate_bom(harness: "Harness") -> List[BOMEntry]: "Connector" + (f", {connector.type}" if connector.type else "") + (f", {connector.subtype}" if connector.subtype else "") - + (f", {connector.pincount} pins" if connector.show_pincount else "") + + ( + f", {connector.pincount} {harness.terminology.pin}s" + if connector.show_pincount + else "" + ) + ( f", {translate_color(connector.color, harness.options.color_mode)}" if connector.color @@ -140,7 +144,7 @@ def generate_bom(harness: "Harness") -> List[BOMEntry]: if cable.gauge else " wires" ) - + (" shielded" if cable.shield else "") + + (f" {harness.terminology.shield}ed" if cable.shield else "") + ( f", {translate_color(cable.color, harness.options.color_mode)}" if cable.color @@ -160,7 +164,7 @@ def generate_bom(harness: "Harness") -> List[BOMEntry]: # add each wire from the bundle to the bom for index, color in enumerate(cable.colors): description = ( - "Wire" + harness.terminology.wire.title() + (f", {cable.type}" if cable.type else "") + (f", {cable.gauge} {cable.gauge_unit}" if cable.gauge else "") + ( From 320977e2ec213f9983c6c151190971ed726167bc Mon Sep 17 00:00:00 2001 From: KV Date: Sun, 30 Jun 2024 18:41:49 +0200 Subject: [PATCH 2/2] Update syntax.md with options.terminology --- docs/syntax.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/syntax.md b/docs/syntax.md index 2da6c7d..b9946be 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -392,6 +392,24 @@ If any component is defined in the `connectors` or `cables` sections but not ref # Character to split template and designator for autogenerated components template_separator: # Default = '.' + + # Terms to be replaced by user defined terms + terminology: # see below +``` + + +## Terminology + +A selection of terms can optionally be replaced by user defined terms. + +This is a simple literal replacement of such terms in the diagram and BOM output. The original term is assumed in grammatical variations, like "{pin}s" and "{shield}ed", and that might create weird results in some use cases. + +These are the supported terms (all entries are optional): +```yaml +terminology: + pin: + wire: + shield: ```