From 4c97195e0e9c76aabbcffabb768ff5ce4dc88bd4 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Mon, 11 Oct 2021 22:08:49 +0200 Subject: [PATCH 001/155] Bump version to 0.4-dev --- src/wireviz/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wireviz/__init__.py b/src/wireviz/__init__.py index d658231..178fbf1 100644 --- a/src/wireviz/__init__.py +++ b/src/wireviz/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Please don't import anything in this file to avoid issues when it is imported in setup.py -__version__ = '0.3.2' +__version__ = '0.4-dev' CMD_NAME = 'wireviz' # Lower case command and module name APP_NAME = 'WireViz' # Application name in texts meant to be human readable From 211ded0c71f9bf629c44bc2a27458df498119eec Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Mon, 11 Oct 2021 22:11:24 +0200 Subject: [PATCH 002/155] Bump version in generated files `.gv` and `.html` files include the version number as a comment. Rebuild to avoid diffs during development --- examples/demo01.gv | 2 +- examples/demo01.html | 2 +- examples/demo02.gv | 2 +- examples/demo02.html | 2 +- examples/ex01.gv | 2 +- examples/ex01.html | 2 +- examples/ex02.gv | 2 +- examples/ex02.html | 2 +- examples/ex03.gv | 2 +- examples/ex03.html | 2 +- examples/ex04.gv | 2 +- examples/ex04.html | 2 +- examples/ex05.gv | 2 +- examples/ex05.html | 2 +- examples/ex06.gv | 2 +- examples/ex06.html | 2 +- examples/ex07.gv | 2 +- examples/ex07.html | 2 +- examples/ex08.gv | 2 +- examples/ex08.html | 2 +- examples/ex09.gv | 2 +- examples/ex09.html | 2 +- examples/ex10.gv | 2 +- examples/ex10.html | 2 +- tutorial/tutorial01.gv | 2 +- tutorial/tutorial01.html | 2 +- tutorial/tutorial02.gv | 2 +- tutorial/tutorial02.html | 2 +- tutorial/tutorial03.gv | 2 +- tutorial/tutorial03.html | 2 +- tutorial/tutorial04.gv | 2 +- tutorial/tutorial04.html | 2 +- tutorial/tutorial05.gv | 2 +- tutorial/tutorial05.html | 2 +- tutorial/tutorial06.gv | 2 +- tutorial/tutorial06.html | 2 +- tutorial/tutorial07.gv | 2 +- tutorial/tutorial07.html | 2 +- tutorial/tutorial08.gv | 2 +- tutorial/tutorial08.html | 2 +- 40 files changed, 40 insertions(+), 40 deletions(-) diff --git a/examples/demo01.gv b/examples/demo01.gv index 00653b5..4926116 100644 --- a/examples/demo01.gv +++ b/examples/demo01.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/examples/demo01.html b/examples/demo01.html index 12d0029..f192c77 100644 --- a/examples/demo01.html +++ b/examples/demo01.html @@ -1,7 +1,7 @@ - + demo01

demo01

diff --git a/examples/demo02.gv b/examples/demo02.gv index 80b789b..48f5381 100644 --- a/examples/demo02.gv +++ b/examples/demo02.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/examples/demo02.html b/examples/demo02.html index 56c2310..cc726ae 100644 --- a/examples/demo02.html +++ b/examples/demo02.html @@ -1,7 +1,7 @@ - + demo02

demo02

diff --git a/examples/ex01.gv b/examples/ex01.gv index db5e619..f5f1ead 100644 --- a/examples/ex01.gv +++ b/examples/ex01.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/examples/ex01.html b/examples/ex01.html index e0bb0a2..63558a5 100644 --- a/examples/ex01.html +++ b/examples/ex01.html @@ -1,7 +1,7 @@ - + ex01

ex01

diff --git a/examples/ex02.gv b/examples/ex02.gv index 88eb93d..11fae02 100644 --- a/examples/ex02.gv +++ b/examples/ex02.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/examples/ex02.html b/examples/ex02.html index b010071..51dbe58 100644 --- a/examples/ex02.html +++ b/examples/ex02.html @@ -1,7 +1,7 @@ - + ex02

ex02

diff --git a/examples/ex03.gv b/examples/ex03.gv index b0a1965..0ffd10e 100644 --- a/examples/ex03.gv +++ b/examples/ex03.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/examples/ex03.html b/examples/ex03.html index a37e9e9..011b5cd 100644 --- a/examples/ex03.html +++ b/examples/ex03.html @@ -1,7 +1,7 @@ - + ex03

ex03

diff --git a/examples/ex04.gv b/examples/ex04.gv index f0c3b37..d7bddcf 100644 --- a/examples/ex04.gv +++ b/examples/ex04.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/examples/ex04.html b/examples/ex04.html index 9bae2b1..a1e3e39 100644 --- a/examples/ex04.html +++ b/examples/ex04.html @@ -1,7 +1,7 @@ - + ex04

ex04

diff --git a/examples/ex05.gv b/examples/ex05.gv index ebecf91..6bdff44 100644 --- a/examples/ex05.gv +++ b/examples/ex05.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/examples/ex05.html b/examples/ex05.html index 8244778..7865b88 100644 --- a/examples/ex05.html +++ b/examples/ex05.html @@ -1,7 +1,7 @@ - + ex05

ex05

diff --git a/examples/ex06.gv b/examples/ex06.gv index 70f4a9a..3f9d11a 100644 --- a/examples/ex06.gv +++ b/examples/ex06.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/examples/ex06.html b/examples/ex06.html index 024fd45..6c16745 100644 --- a/examples/ex06.html +++ b/examples/ex06.html @@ -1,7 +1,7 @@ - + ex06

ex06

diff --git a/examples/ex07.gv b/examples/ex07.gv index 0af1417..4d6c72b 100644 --- a/examples/ex07.gv +++ b/examples/ex07.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/examples/ex07.html b/examples/ex07.html index 6016a51..4880e67 100644 --- a/examples/ex07.html +++ b/examples/ex07.html @@ -1,7 +1,7 @@ - + ex07

ex07

diff --git a/examples/ex08.gv b/examples/ex08.gv index 5b302fc..55125c7 100644 --- a/examples/ex08.gv +++ b/examples/ex08.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/examples/ex08.html b/examples/ex08.html index de4b397..b23a1a9 100644 --- a/examples/ex08.html +++ b/examples/ex08.html @@ -1,7 +1,7 @@ - + ex08

ex08

diff --git a/examples/ex09.gv b/examples/ex09.gv index 2bd338f..8817143 100644 --- a/examples/ex09.gv +++ b/examples/ex09.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/examples/ex09.html b/examples/ex09.html index 8e19d08..e0fe77b 100644 --- a/examples/ex09.html +++ b/examples/ex09.html @@ -1,7 +1,7 @@ - + ex09

ex09

diff --git a/examples/ex10.gv b/examples/ex10.gv index 9c955e1..6b2d92d 100644 --- a/examples/ex10.gv +++ b/examples/ex10.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/examples/ex10.html b/examples/ex10.html index 00cd621..df17113 100644 --- a/examples/ex10.html +++ b/examples/ex10.html @@ -1,7 +1,7 @@ - + ex10

ex10

diff --git a/tutorial/tutorial01.gv b/tutorial/tutorial01.gv index f2d449f..a825600 100644 --- a/tutorial/tutorial01.gv +++ b/tutorial/tutorial01.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/tutorial/tutorial01.html b/tutorial/tutorial01.html index e051ef1..00c5502 100644 --- a/tutorial/tutorial01.html +++ b/tutorial/tutorial01.html @@ -1,7 +1,7 @@ - + tutorial01

tutorial01

diff --git a/tutorial/tutorial02.gv b/tutorial/tutorial02.gv index f0020e7..f9e0e26 100644 --- a/tutorial/tutorial02.gv +++ b/tutorial/tutorial02.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/tutorial/tutorial02.html b/tutorial/tutorial02.html index 0c5b36d..92b0d44 100644 --- a/tutorial/tutorial02.html +++ b/tutorial/tutorial02.html @@ -1,7 +1,7 @@ - + tutorial02

tutorial02

diff --git a/tutorial/tutorial03.gv b/tutorial/tutorial03.gv index d1937fa..47a17af 100644 --- a/tutorial/tutorial03.gv +++ b/tutorial/tutorial03.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/tutorial/tutorial03.html b/tutorial/tutorial03.html index d876420..3eedf2d 100644 --- a/tutorial/tutorial03.html +++ b/tutorial/tutorial03.html @@ -1,7 +1,7 @@ - + tutorial03

tutorial03

diff --git a/tutorial/tutorial04.gv b/tutorial/tutorial04.gv index 2df4930..56baeeb 100644 --- a/tutorial/tutorial04.gv +++ b/tutorial/tutorial04.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/tutorial/tutorial04.html b/tutorial/tutorial04.html index c11befc..7e9d02d 100644 --- a/tutorial/tutorial04.html +++ b/tutorial/tutorial04.html @@ -1,7 +1,7 @@ - + tutorial04

tutorial04

diff --git a/tutorial/tutorial05.gv b/tutorial/tutorial05.gv index 80c9f44..fe4c91f 100644 --- a/tutorial/tutorial05.gv +++ b/tutorial/tutorial05.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/tutorial/tutorial05.html b/tutorial/tutorial05.html index 32691f5..f1ec2fc 100644 --- a/tutorial/tutorial05.html +++ b/tutorial/tutorial05.html @@ -1,7 +1,7 @@ - + tutorial05

tutorial05

diff --git a/tutorial/tutorial06.gv b/tutorial/tutorial06.gv index 181ce58..3b0fb8e 100644 --- a/tutorial/tutorial06.gv +++ b/tutorial/tutorial06.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/tutorial/tutorial06.html b/tutorial/tutorial06.html index 5900ad1..21df96a 100644 --- a/tutorial/tutorial06.html +++ b/tutorial/tutorial06.html @@ -1,7 +1,7 @@ - + tutorial06

tutorial06

diff --git a/tutorial/tutorial07.gv b/tutorial/tutorial07.gv index 6feeab6..d101f2c 100644 --- a/tutorial/tutorial07.gv +++ b/tutorial/tutorial07.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/tutorial/tutorial07.html b/tutorial/tutorial07.html index c1b952a..fd226a1 100644 --- a/tutorial/tutorial07.html +++ b/tutorial/tutorial07.html @@ -1,7 +1,7 @@ - + tutorial07

tutorial07

diff --git a/tutorial/tutorial08.gv b/tutorial/tutorial08.gv index 3203ad5..97dffd8 100644 --- a/tutorial/tutorial08.gv +++ b/tutorial/tutorial08.gv @@ -1,5 +1,5 @@ graph { -// Graph generated by WireViz 0.3 +// Graph generated by WireViz 0.4-dev // https://github.com/formatc1702/WireViz graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] diff --git a/tutorial/tutorial08.html b/tutorial/tutorial08.html index 314bb6a..ce4f1ae 100644 --- a/tutorial/tutorial08.html +++ b/tutorial/tutorial08.html @@ -1,7 +1,7 @@ - + tutorial08

tutorial08

From e3fbc913121af4851fd8b269051f228f7a3466aa Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 22 Oct 2020 18:12:36 +0200 Subject: [PATCH 003/155] Squash `feature/mate+autogenerate` branch --- examples/demo02.yml | 5 +- examples/ex04.yml | 7 +- src/wireviz/DataClasses.py | 28 +++- src/wireviz/Harness.py | 52 ++++++- src/wireviz/wireviz.py | 296 +++++++++++++++++++++++-------------- src/wireviz/wv_helper.py | 18 +++ test/.gitignore | 5 + test/test1.yml | 25 ++++ test/test2.yml | 25 ++++ test/test3.yml | 33 +++++ test/test4.yml | 26 ++++ test/test5.yml | 64 ++++++++ test/test9.yml | 55 +++++++ tutorial/tutorial05.yml | 3 +- tutorial/tutorial06.yml | 4 +- 15 files changed, 511 insertions(+), 135 deletions(-) create mode 100644 test/.gitignore create mode 100644 test/test1.yml create mode 100644 test/test2.yml create mode 100644 test/test3.yml create mode 100644 test/test4.yml create mode 100644 test/test5.yml create mode 100644 test/test9.yml diff --git a/examples/demo02.yml b/examples/demo02.yml index 5002e7d..d83167f 100644 --- a/examples/demo02.yml +++ b/examples/demo02.yml @@ -22,9 +22,8 @@ connectors: X4: <<: *molex_f pinlabels: [GND, +12V, MISO, MOSI, SCK] - ferrule_crimp: + F: style: simple - autogenerate: true type: Crimp ferrule subtype: 0.25 mm² color: YE @@ -64,6 +63,6 @@ connections: - W3: [1-4] - X4: [1,3-5] - - - ferrule_crimp + - F. - W4: [1,2] - X4: [1,2] diff --git a/examples/ex04.yml b/examples/ex04.yml index 74148ec..c3c7234 100644 --- a/examples/ex04.yml +++ b/examples/ex04.yml @@ -8,13 +8,12 @@ cables: category: bundle connectors: - ferrule_crimp: + F: style: simple - autogenerate: true type: Crimp ferrule connections: - - - ferrule_crimp + - F. - W1: [1-6] - - ferrule_crimp + - F. diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index 6b7462a..87b7bc1 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -140,7 +140,6 @@ class Connector: show_name: Optional[bool] = None show_pincount: Optional[bool] = None hide_disconnected_pins: bool = False - autogenerate: bool = False loops: List[List[Pin]] = field(default_factory=list) ignore_in_bom: bool = False additional_components: List[AdditionalComponent] = field(default_factory=list) @@ -172,7 +171,8 @@ class Connector: raise Exception('Pins are not unique') if self.show_name is None: - self.show_name = not self.autogenerate # hide auto-generated designators by default + # hide designators for simple and for auto-generated connectors by default + self.show_name = (self.style != 'simple' and self.name[0:2] != '__') if self.show_pincount is None: self.show_pincount = self.style != 'simple' # hide pincount for simple (1 pin) connectors by default @@ -227,7 +227,7 @@ class Cable: colors: List[Colors] = field(default_factory=list) wirelabels: List[Wire] = field(default_factory=list) color_code: Optional[ColorScheme] = None - show_name: bool = True + show_name: Optional[bool] = None show_wirecount: bool = True show_wirenumbers: Optional[bool] = None ignore_in_bom: bool = False @@ -310,9 +310,11 @@ class Cable: else: raise Exception('lists of part data are only supported for bundles') - # by default, show wire numbers for cables, hide for bundles - if self.show_wirenumbers is None: - self.show_wirenumbers = self.category != 'bundle' + if self.show_name is None: + self.show_name = self.name[0:2] != '__' # hide designators for auto-generated cables by default + + if not self.show_wirenumbers: + self.show_wirenumbers = self.category != 'bundle' # by default, show wire numbers for cables, hide for bundles for i, item in enumerate(self.additional_components): if isinstance(item, dict): @@ -351,3 +353,17 @@ class Connection: via_port: Wire to_name: Optional[Designator] to_port: Optional[PinIndex] + +@dataclass +class MatePin: + from_name: Designator + from_port: PinIndex + to_name: Designator + to_port: PinIndex + shape: str + +@dataclass +class MateComponent: + from_name: Designator + to_name: Designator + shape: str diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 95419a4..a135717 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -9,7 +9,7 @@ from itertools import zip_longest import re from wireviz import wv_colors, __version__, APP_NAME, APP_URL -from wireviz.DataClasses import Metadata, Options, Tweak, Connector, Cable +from wireviz.DataClasses import Cable, Connector, MatePin, MateComponent, Metadata, Options, Tweak from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_gv_html import nested_html_table, \ html_bgcolor_attr, html_bgcolor, html_colorbar, \ @@ -19,8 +19,7 @@ from wireviz.wv_bom import pn_info_string, component_table_entry, \ HEADER_PN, HEADER_MPN, HEADER_SPN from wireviz.wv_html import generate_html_output from wireviz.wv_helper import awg_equiv, mm2_equiv, tuplelist2tsv, flatten2d, \ - open_file_read, open_file_write - + open_file_read, open_file_write, is_arrow @dataclass class Harness: @@ -31,6 +30,7 @@ class Harness: def __post_init__(self): self.connectors = {} self.cables = {} + self.mates = [] self._bom = [] # Internal Cache for generated bom self.additional_bom_items = [] @@ -40,6 +40,12 @@ class Harness: def add_cable(self, name: str, *args, **kwargs) -> None: self.cables[name] = Cable(name, *args, **kwargs) + def add_mate_pin(self, *args, **kwargs) -> None: + self.mates.append(MatePin(*args, **kwargs)) + + def add_mate_component(self, *args, **kwargs) -> None: + self.mates.append(MateComponent(*args, **kwargs)) + def add_bom_item(self, item: dict) -> None: self.additional_bom_items.append(item) @@ -66,7 +72,12 @@ class Harness: raise Exception(f'{name}:{pin} not found.') # check via cable - if via_name in self.cables: + if is_arrow(via_name): + if '-' in via_name: + self.mates[(from_name, from_pin, to_name, to_pin)] = via_name + elif '=' in via_name: + self.mates[(from_name, to_name)] = via_name + elif via_name in self.cables: cable = self.cables[via_name] # check if provided name is ambiguous if via_wire in cable.colors and via_wire in cable.wirelabels: @@ -114,8 +125,17 @@ class Harness: for connection_color in cable.connections: if connection_color.from_port is not None: # connect to left self.connectors[connection_color.from_name].ports_right = True + self.connectors[connection_color.from_name].activate_pin(connection_color.from_port) if connection_color.to_port is not None: # connect to right self.connectors[connection_color.to_name].ports_left = True + self.connectors[connection_color.to_name].activate_pin(connection_color.to_port) + + for mate in self.mates: + if isinstance(mate, MatePin): + self.connectors[mate.from_name].ports_right = True + self.connectors[mate.from_name].activate_pin(mate.from_port) + self.connectors[mate.to_name].ports_left = True + self.connectors[mate.to_name].activate_pin(mate.to_port) for connector in self.connectors.values(): @@ -409,6 +429,30 @@ class Harness: typecheck('tweak.append', self.tweak.append, str) dot.body.append(self.tweak.append) + for mate in self.mates: + if mate.shape[0] == '<' and mate.shape[-1] == '>': + dir = 'both' + elif mate.shape[0] == '<': + dir = 'back' + elif mate.shape[-1] == '>': + dir = 'forward' + else: + dir = 'none' + + if isinstance(mate, MatePin): + color = '#000000' + elif isinstance(mate, MateComponent): + color = '#000000:#000000' + else: + raise Exception(f'{mate} is an unknown mate') + + dot.attr('edge', color=color, style='dashed', dir=dir) + from_port = f':p{mate.from_port}r' if isinstance(mate, MatePin) and self.connectors[mate.from_name].style != 'simple' else '' + code_from = f'{mate.from_name}{from_port}:e' + to_port = f':p{mate.to_port}l' if isinstance(mate, MatePin) and self.connectors[mate.to_name].style != 'simple' else '' + code_to = f'{mate.to_name}{to_port}:w' + dot.edge(code_from, code_to) + return dot @property diff --git a/src/wireviz/wireviz.py b/src/wireviz/wireviz.py index a9b3749..e1b0da4 100755 --- a/src/wireviz/wireviz.py +++ b/src/wireviz/wireviz.py @@ -15,7 +15,7 @@ if __name__ == '__main__': from wireviz import __version__ from wireviz.DataClasses import Metadata, Options, Tweak from wireviz.Harness import Harness -from wireviz.wv_helper import expand, open_file_read +from wireviz.wv_helper import expand, get_single_key_and_value, is_arrow, open_file_read def parse(yaml_input: str, file_out: (str, Path) = None, return_types: (None, str, Tuple[str]) = None) -> Any: @@ -35,13 +35,22 @@ def parse(yaml_input: str, file_out: (str, Path) = None, return_types: (None, st yaml_data = yaml.safe_load(yaml_input) + + # define variables ========================================================= + # containers for parsed component data and connection sets + template_connectors = {} + template_cables = {} + connection_sets = [] + # actual harness harness = Harness( metadata = Metadata(**yaml_data.get('metadata', {})), options = Options(**yaml_data.get('options', {})), tweak = Tweak(**yaml_data.get('tweak', {})), ) + # others + designators_and_templates = {} # store mapping of components to their respective template + autogenerated_designators = {} # keep track of auto-generated designators to avoid duplicates - # When title is not given, either deduce it from filename, or use default text. if 'title' not in harness.metadata: if file_out is None: harness.metadata['title'] = "WireViz diagram and BOM" @@ -49,11 +58,13 @@ def parse(yaml_input: str, file_out: (str, Path) = None, return_types: (None, st harness.metadata['title'] = Path(file_out).stem # add items + # parse YAML input file ==================================================== + sections = ['connectors', 'cables', 'connections'] types = [dict, dict, list] for sec, ty in zip(sections, types): - if sec in yaml_data and type(yaml_data[sec]) == ty: - if len(yaml_data[sec]) > 0: + if sec in yaml_data and type(yaml_data[sec]) == ty: # section exists + if len(yaml_data[sec]) > 0: # section has contents if ty == dict: for key, attribs in yaml_data[sec].items(): # The Image dataclass might need to open an image file with a relative path. @@ -61,132 +72,191 @@ def parse(yaml_input: str, file_out: (str, Path) = None, return_types: (None, st if isinstance(image, dict): image['gv_dir'] = Path(file_out if file_out else '').parent # Inject context + # store component templates only; do not generate instances yet if sec == 'connectors': - if not attribs.get('autogenerate', False): - harness.add_connector(name=key, **attribs) + template_connectors[key] = attribs elif sec == 'cables': - harness.add_cable(name=key, **attribs) - else: - pass # section exists but is empty + template_cables[key] = attribs + else: # section exists but is empty + pass else: # section does not exist, create empty section if ty == dict: yaml_data[sec] = {} elif ty == list: yaml_data[sec] = [] - # add connections + connection_sets = yaml_data['connections'] - def check_designators(what, where): # helper function - for i, x in enumerate(what): - if x not in yaml_data[where[i]]: - return False - return True + # go through connection sets, generate and connect components ============== - autogenerated_ids = {} - for connection in yaml_data['connections']: - # find first component (potentially nested inside list or dict) - first_item = connection[0] - if isinstance(first_item, list): - first_item = first_item[0] - elif isinstance(first_item, dict): - first_item = list(first_item.keys())[0] - elif isinstance(first_item, str): - pass + template_separator_char = '.' # TODO: make user-configurable (in case user wants to use `.` as part of their template/component names) - # check which section the first item belongs to - alternating_sections = ['connectors','cables'] - for index, section in enumerate(alternating_sections): - if first_item in yaml_data[section]: - expected_index = index - break - else: - raise Exception('First item not found anywhere.') - expected_index = 1 - expected_index # flip once since it is flipped back at the *beginning* of every loop - - # check that all iterable items (lists and dicts) are the same length - # and that they are alternating between connectors and cables/bundles, starting with either - itemcount = None - for item in connection: - expected_index = 1 - expected_index # make sure items alternate between connectors and cables - expected_section = alternating_sections[expected_index] - if isinstance(item, list): - itemcount_new = len(item) - for subitem in item: - if not subitem in yaml_data[expected_section]: - raise Exception(f'{subitem} is not in {expected_section}') - elif isinstance(item, dict): - if len(item.keys()) != 1: - raise Exception('Dicts may contain only one key here!') - itemcount_new = len(expand(list(item.values())[0])) - subitem = list(item.keys())[0] - if not subitem in yaml_data[expected_section]: - raise Exception(f'{subitem} is not in {expected_section}') - elif isinstance(item, str): - if not item in yaml_data[expected_section]: - raise Exception(f'{item} is not in {expected_section}') - continue - if itemcount is not None and itemcount_new != itemcount: - raise Exception('All lists and dict lists must be the same length!') - itemcount = itemcount_new - if itemcount is None: - raise Exception('No item revealed the number of connections to make!') - - # populate connection list - connection_list = [] - for i, item in enumerate(connection): - if isinstance(item, str): # one single-pin component was specified - sublist = [] - for i in range(1, itemcount + 1): - if yaml_data['connectors'][item].get('autogenerate'): - autogenerated_ids[item] = autogenerated_ids.get(item, 0) + 1 - new_id = f'_{item}_{autogenerated_ids[item]}' - harness.add_connector(new_id, **yaml_data['connectors'][item]) - sublist.append([new_id, 1]) - else: - sublist.append([item, 1]) - connection_list.append(sublist) - elif isinstance(item, list): # a list of single-pin components were specified - sublist = [] - for subitem in item: - if yaml_data['connectors'][subitem].get('autogenerate'): - autogenerated_ids[subitem] = autogenerated_ids.get(subitem, 0) + 1 - new_id = f'_{subitem}_{autogenerated_ids[subitem]}' - harness.add_connector(new_id, **yaml_data['connectors'][subitem]) - sublist.append([new_id, 1]) - else: - sublist.append([subitem, 1]) - connection_list.append(sublist) - elif isinstance(item, dict): # a component with multiple pins was specified - sublist = [] - id = list(item.keys())[0] - pins = expand(list(item.values())[0]) - for pin in pins: - sublist.append([id, pin]) - connection_list.append(sublist) + def resolve_designator(inp, separator): + if separator in inp: # generate a new instance of an item + if inp.count(separator) > 1: + raise Exception(f'{inp} - Found more than one separator ({separator})') + template, designator = inp.split(separator) + if designator == '': + autogenerated_designators[template] = autogenerated_designators.get(template, 0) + 1 + designator = f'__{template}_{autogenerated_designators[template]}' + # check if redefining existing component to different template + if designator in designators_and_templates: + if designators_and_templates[designator] != template: + raise Exception(f'Trying to redefine {designator} from {designators_and_templates[designator]} to {template}') else: - raise Exception('Unexpected item in connection list') + designators_and_templates[designator] = template + else: + template, designator = (inp, inp) + if designator in designators_and_templates: + pass # referencing an exiting connector, no need to add again + else: + designators_and_templates[designator] = template + return (template, designator) - # actually connect components using connection list - for i, item in enumerate(connection_list): - id = item[0][0] # TODO: make more elegant/robust/pythonic - if id in harness.cables: - for j, con in enumerate(item): - if i == 0: # list started with a cable, no connector to join on left side - from_name = None - from_pin = None + # utilities to check for alternating connectors and cables/arrows ========== + + alternating_types = ['connector','cable/arrow'] + expected_type = None + + def check_type(designator, template, actual_type): + nonlocal expected_type + if not expected_type: # each connection set may start with either section + expected_type = actual_type + + if actual_type != expected_type: # did not alternate + raise Exception(f'Expected {expected_type}, but "{designator}" ("{template}") is {actual_type}') + + def alternate_type(): # flip between connector and cable/arrow + nonlocal expected_type + expected_type = alternating_types[1 - alternating_types.index(expected_type)] + + for connection_set in connection_sets: + + # figure out number of parallel connections within this set + connectioncount = [] + for entry in connection_set: + if isinstance(entry, list): + connectioncount.append(len(entry)) + elif isinstance(entry, dict): + connectioncount.append(len(expand(list(entry.values())[0]))) # - X1: [1-4,6] yields 5 + else: + pass # strings do not reveal connectioncount + if not any(connectioncount): + raise Exception('No item in connection set revealed number of connections') + # TODO: The following should be a valid connection set, + # even though no item reveals the connection count; + # the count is not needed because only a component-level mate happens. + # - + # - CONNECTOR + # - ==> + # - CONNECTOR + + # check that all entries are the same length + if len(set(connectioncount)) > 1: + raise Exception('All items in connection set must reference the same number of connections') + # all entries are the same length, connection count is set + connectioncount = connectioncount[0] + + # expand string entries to list entries of correct length + for index, entry in enumerate(connection_set): + if isinstance(entry, str): + connection_set[index] = [entry] * connectioncount + + # resolve all designators + for index, entry in enumerate(connection_set): + if isinstance(entry, list): + for subindex, item in enumerate(entry): + template, designator = resolve_designator(item, template_separator_char) + connection_set[index][subindex] = designator + elif isinstance(entry, dict): + key = list(entry.keys())[0] + template, designator = resolve_designator(key, template_separator_char) + value = entry[key] + connection_set[index] = {designator: value} + else: + pass # string entries have been expanded in previous step + + # expand all pin lists + for index, entry in enumerate(connection_set): + if isinstance(entry, list): + connection_set[index] = [{designator: 1} for designator in entry] + elif isinstance(entry, dict): + designator = list(entry.keys())[0] + pinlist = expand(entry[designator]) + connection_set[index] = [{designator: pin} for pin in pinlist] + else: + pass # string entries have been expanded in previous step + + # Populate wiring harness ============================================== + + expected_type = None # reset check for alternating types + # at the beginning of every connection set + # since each set may begin with either type + + # generate components + for entry in connection_set: + for item in entry: + designator = list(item.keys())[0] + template = designators_and_templates[designator] + + if designator in harness.connectors: # existing connector instance + check_type(designator, template, 'connector') + elif template in template_connectors.keys(): # generate new connector instance from template + check_type(designator, template, 'connector') + harness.add_connector(name = designator, **template_connectors[template]) + + elif designator in harness.cables: # existing cable instance + check_type(designator, template, 'cable/arrow') + elif template in template_cables.keys(): # generate new cable instance from template + check_type(designator, template, 'cable/arrow') + harness.add_cable(name = designator, **template_cables[template]) + + elif is_arrow(designator): + check_type(designator, template, 'cable/arrow') + # arrows do not need to be generated here + else: + raise Exception(f'{template} is an unknown template/designator/arrow.') + + alternate_type() # entries in connection set must alternate between connectors and cables/arrows + + # transpose connection set list + # before: one item per component, one subitem per connection in set + # after: one item per connection in set, one subitem per component + connection_set = list(map(list, zip(*connection_set))) + + # connect components + for index_entry, entry in enumerate(connection_set): + for index_item, item in enumerate(entry): + designator = list(item.keys())[0] + + if designator in harness.cables: + if index_item == 0: # list started with a cable, no connector to join on left side + from_name, from_pin = (None, None) else: - from_name = connection_list[i-1][j][0] - from_pin = connection_list[i-1][j][1] - via_name = item[j][0] - via_pin = item[j][1] - if i == len(connection_list) - 1: # list ends with a cable, no connector to join on right side - to_name = None - to_pin = None + from_name, from_pin = get_single_key_and_value(connection_set[index_entry][index_item-1]) + via_name, via_pin = (designator, item[designator]) + if index_item == len(entry) - 1: # list ends with a cable, no connector to join on right side + to_name, to_pin = (None, None) else: - to_name = connection_list[i+1][j][0] - to_pin = connection_list[i+1][j][1] + to_name, to_pin = get_single_key_and_value(connection_set[index_entry][index_item+1]) harness.connect(from_name, from_pin, via_name, via_pin, to_name, to_pin) + elif is_arrow(designator): + if index_item == 0: # list starts with an arrow + raise Exception('An arrow cannot be at the start of a connection set') + elif index_item == len(entry) - 1: # list ends with an arrow + raise Exception('An arrow cannot be at the end of a connection set') + + from_name, from_pin = get_single_key_and_value(connection_set[index_entry][index_item-1]) + via_name, via_pin = (designator, None) + to_name, to_pin = get_single_key_and_value(connection_set[index_entry][index_item+1]) + if '-' in designator: # mate pin by pin + harness.add_mate_pin(from_name, from_pin, to_name, to_pin, designator) + elif '=' in designator and index_entry == 0: # mate two connectors as a whole + harness.add_mate_component(from_name, to_name, designator) + + # harness population completed ============================================= + if "additional_bom_items" in yaml_data: for line in yaml_data["additional_bom_items"]: harness.add_bom_item(line) diff --git a/src/wireviz/wv_helper.py b/src/wireviz/wv_helper.py index 6b78f17..6b39fef 100644 --- a/src/wireviz/wv_helper.py +++ b/src/wireviz/wv_helper.py @@ -65,6 +65,12 @@ def expand(yaml_data): return output +def get_single_key_and_value(d: dict): + k = list(d.keys())[0] + v = d[k] + return (k, v) + + def int2tuple(inp): if isinstance(inp, tuple): output = inp @@ -105,6 +111,18 @@ def open_file_write(filename): def open_file_append(filename): return open(filename, 'a', encoding='UTF-8') +def is_arrow(inp): + """ + Matches strings of one or multiple `-` or `=` (but not mixed) + optionally starting with `<` and/or ending with `>`. + + Examples: + <-, --, ->, <-> + <==, ==, ==>, <=> + """ + # regex by @shiraneyo + return bool(re.match(r"^\s*(?P-+|=+)(?P>?)\s*$", inp)) + def aspect_ratio(image_src): try: from PIL import Image diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 0000000..e28d925 --- /dev/null +++ b/test/.gitignore @@ -0,0 +1,5 @@ +*.bom.tsv +*.gv +*.html +*.png +*.svg diff --git a/test/test1.yml b/test/test1.yml new file mode 100644 index 0000000..0d88a64 --- /dev/null +++ b/test/test1.yml @@ -0,0 +1,25 @@ +# based on @stmaxed's example in #134 + +connectors: + X1: &X + type: Screw connector + subtype: male + color: GN + pincount: 4 + pinlabels: [A, B, C, D] + F: + style: simple + type: Ferrule + color: GY + +cables: + W: + color: BK + colors: [BK, WH, BU, BN] + +connections: + - # ferrules + connector X1 + - W.W1: [1-4] + - F. + - --> + - X1: [1-4] diff --git a/test/test2.yml b/test/test2.yml new file mode 100644 index 0000000..a8a4c85 --- /dev/null +++ b/test/test2.yml @@ -0,0 +1,25 @@ +# based on @MSBGit's example in #134 + +connectors: + X1: &dupont + type: Dupont 2.54mm + subtype: male + pincount: 5 + color: BK + X2: + <<: *dupont + subtype: female + +cables: + W: + category: bundle + colors: [RD, BK, BU, GN] + length: 0.2 + +connections: + - + - W.W1: [1-4] + - X1: [1-4] + - ==> + - X2: [1-4] + - W.W2: [1-4] diff --git a/test/test3.yml b/test/test3.yml new file mode 100644 index 0000000..a01bedf --- /dev/null +++ b/test/test3.yml @@ -0,0 +1,33 @@ +# expanding upon @stmaxed's example in #134 + +connectors: + X1: &X + type: Screw connector + subtype: male + color: GN + pincount: 4 + pinlabels: [A, B, C, D] + X2: + <<: *X + subtype: female + F: + style: simple + type: Ferrule + color: GY + +cables: + W: + color: BK + colors: [BK, WH, BU, BN] + +connections: + - # ferrules + connector X1 + - W.W1: [1-4] + - F. + - --> + - X1: [1-4] + - ==> + - X2: [1-4] + - <-- + - F. + - W.W2: [1-4] diff --git a/test/test4.yml b/test/test4.yml new file mode 100644 index 0000000..85b9081 --- /dev/null +++ b/test/test4.yml @@ -0,0 +1,26 @@ +# based on @formatc1702's example in #184 + +connectors: + X: + pincount: 4 + pinlabels: [A, B, C, D] + F: + style: simple + type: ferrule + +cables: + C: + wirecount: 4 + color_code: DIN + +connections: + - + - X.X1: [1-4] + - C.C1: [1-4] + - [F.F1, F.F2, F.F3, F.F4] # generate new instances of F and assign designators + - C.C2: [1-4] + - X.X2: [1-4] + - + - [F1, F2, F3, F4] # use previously assigned designators + - C.C3: [1-4] + - X.X3: [1-4] diff --git a/test/test5.yml b/test/test5.yml new file mode 100644 index 0000000..0e67032 --- /dev/null +++ b/test/test5.yml @@ -0,0 +1,64 @@ +connectors: + XS: + type: Screw terminal connector + subtype: male + color: GN + pincount: 3 + XM: + type: Molex KK 254 + subtype: female + pincount: 3 + F: + style: simple + type: Ferrule + subtype: 0.25 mm2 + color: LB + LED_RD: &LED + type: LED + subtype: 5mm + show_pincount: false + color: RD + pins: [+, -] + pinlabels: [Anode, Cathode] + LED_GN: + <<: *LED + color: GN + LED_YE: + <<: *LED + color: YE + +cables: + C: + category: bundle + # show_name: false + colors: [RD, BK] + gauge: 0.25 mm2 + W: + category: bundle + # show_name: false + colors: [BN] + gauge: 0.25 mm2 + +connections: + - + - [F.F1, F.F2] + - C.W1: [1,2] + - LED_RD: [+,-] + - + - F.F3 + - W.W2: [1] + - LED_GN: [+] + - + - LED_GN: [-] + - W.W3: [1] + - + - XS.X1: [1-3] + - <-- + - [F1, F2, F3] + - + - LED_YE: [+,-] + - C.W4: [1,2] + - XM.X2: [1,2] + - + - W3: [1] + - X2: [3] diff --git a/test/test9.yml b/test/test9.yml new file mode 100644 index 0000000..bad0256 --- /dev/null +++ b/test/test9.yml @@ -0,0 +1,55 @@ +connectors: + JSTMALE: &JST_SM # use generic names here, assign designators at generation time + type: JST SM + subtype: male + pincount: 4 + pinlabels: [A, B, C, D] + JSTFEMALE: + <<: *JST_SM # easily create JSTMALE's matching connector + subtype: female + X4: # this connector is only used once, use fixed designator here already + type: Screw terminal connector + pincount: 4 + color: GN + pinlabels: [W, X, Y, Z] + S: + style: simple + type: Splice + color: CU + F: + style: simple + type: Ferrule + color: GY + + +cables: + CABLE: + wirecount: 4 + color_code: DIN + length: 0.1 + WIRE: + wirecount: 1 + colors: [BK] + length: 0.1 + +connections: + - + - JSTMALE.X1: [4-1] # use `.` syntax to generate a new instance of JSTMALE, named X1 + - CABLE.W1: [1-4] # same syntax for cables + - [S., S., S.S1, S.] # splice W1 and W2 together; only wire #3 needs a user-defined designator + - CABLE.W2: [1-4] + - S. # test shorthand, auto-get required number of ferrules from context + - CABLE.W21: [1-4] + - JSTFEMALE.X2: [1-4] + - <=> # mate X2 and X3 + - JSTMALE.X3: [1-4] + - CABLE.W3: [1-4] + - [F., F., F., F.] + - --> # insert ferrules into screw terminal connector + - X4: [2,1,4,3] # X4 does not require auto-generation, thus no `.` syntax here + - + - S1: [1] # reuse previously generated splice + # TODO: Make it work with `- F1` only, making pin 1 is implied + - WIRE.: [1] # We don't care about a simple wire's designator, auto-generate please! + # TODO: Make it work with `- W.W4: 1`, dropping the need for `[]` + - X2: [4] diff --git a/tutorial/tutorial05.yml b/tutorial/tutorial05.yml index e894a45..d4739c5 100644 --- a/tutorial/tutorial05.yml +++ b/tutorial/tutorial05.yml @@ -5,7 +5,6 @@ connectors: subtype: female F1: style: simple - autogenerate: true type: Crimp ferrule subtype: 0.5 mm² color: OG # optional color @@ -19,6 +18,6 @@ cables: connections: - - - F1 # a new ferrule is auto-generated for each of the four wires + - F1. # a new ferrule is auto-generated for each of the four wires - W1: [1-4] - X1: [1-4] diff --git a/tutorial/tutorial06.yml b/tutorial/tutorial06.yml index 5143157..0cd79b6 100644 --- a/tutorial/tutorial06.yml +++ b/tutorial/tutorial06.yml @@ -5,13 +5,11 @@ connectors: subtype: female F_10: # this is a unique ferrule style: simple - show_name: false # non-autogenerated connectors show their name by default; override type: Crimp ferrule subtype: 1.0 mm² color: YE # optional color F_05: # this is a ferrule that will be auto-generated on demand style: simple - autogenerate: true type: Crimp ferrule subtype: 0.5 mm² color: OG @@ -25,6 +23,6 @@ cables: connections: - - - [F_05, F_10, F_10, F_05] + - [F_05., F_10.F1, F_10.F1, F_05.] - W1: [1-4] - X1: [1-4] From f20f313af06512105ae0ee1c6e155fcf358e7119 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 23 Sep 2021 16:20:59 +0200 Subject: [PATCH 004/155] Resolve edge case of empty HTML tables --- src/wireviz/wv_gv_html.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 0b843db..ff8b4ea 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -14,6 +14,8 @@ def nested_html_table(rows: List[Union[str, List[Optional[str]], None]], table_a # attributes in any leading inside a list are injected into to the preceeding tag html = [] html.append(f'') + + num_rows = 0 for row in rows: if isinstance(row, List): if len(row) > 0 and any(row): @@ -25,10 +27,14 @@ def nested_html_table(rows: List[Union[str, List[Optional[str]], None]], table_a html.append(f' '.replace('>
{cell}
') html.append(' ') + num_rows = num_rows + 1 elif row is not None: html.append(' ') html.append(f' {row}') html.append(' ') + num_rows = num_rows + 1 + if num_rows == 0: # empty table + html.append('') # generate empty cell to avoid GraphViz errors html.append('') return html From def03d1ce37c0b8400a687e2e4fab0677e23d9da Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 23 Sep 2021 16:52:21 +0200 Subject: [PATCH 005/155] Resolve component level mate not revealing connection count --- src/wireviz/wireviz.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/wireviz/wireviz.py b/src/wireviz/wireviz.py index e1b0da4..8b87a71 100755 --- a/src/wireviz/wireviz.py +++ b/src/wireviz/wireviz.py @@ -142,10 +142,12 @@ def parse(yaml_input: str, file_out: (str, Path) = None, return_types: (None, st else: pass # strings do not reveal connectioncount if not any(connectioncount): - raise Exception('No item in connection set revealed number of connections') - # TODO: The following should be a valid connection set, - # even though no item reveals the connection count; - # the count is not needed because only a component-level mate happens. + # no item in the list revealed connection count; + # assume connection count is 1 + connectioncount = [1] + # Example: The following is a valid connection set, + # even though no item reveals the connection count; + # the count is not needed because only a component-level mate happens. # - # - CONNECTOR # - ==> From aa81c18609e0012cd680b3b27c5d92d33d2389de Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 23 Sep 2021 17:02:17 +0200 Subject: [PATCH 006/155] Update syntax description (autogeneration, arrows) Moved metadata and options info further down, so that the core functionality (connectors, cables, connection sets) comes first. --- docs/syntax.md | 152 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 138 insertions(+), 14 deletions(-) diff --git a/docs/syntax.md b/docs/syntax.md index 8da04ae..2859fdb 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -85,22 +85,8 @@ tweak: # optional tweaking of .gv output # loops loops: # every list item is itself a list of exactly two pins # on the connector that are to be shorted - - # auto-generation - autogenerate: # optional; defaults to false; see below - ``` -### Auto-generation of connectors - -The `autogenerate: true` option is especially useful for very simple, recurring connectors such as crimp ferrules, splices, and others, where it would be a hassle to individually assign unique designators for every instance. - -By default, when defining a connector, it will be generated once using the specified designator, and can be referenced multiple times, in different connection sets (see below). - -If `autogenerate: true` is set, the connector will _not_ be generated at first. When defining the `connections` section (see below), every time the connector is mentioned, a new instance with an auto-incremented designator is generated and attached. - -Since the auto-incremented and auto-assigned designator is not known to the user, one instance of the connector can not be referenced again outside the point of creation. The `autogenerate: true` option is therefore only useful for terminals with only one wire attached, or splices with exactly one wire going in, and one wire going out. If more wires are to be attached (e.g. for a three-way splice, or a crimp where multiple wires are joined), a separate connector with `autogenerate: false` and a user-defined, unique designator needs to be used. - ## Cable attributes ```yaml @@ -173,6 +159,7 @@ connections: - # Each list entry is a connection set - # Each connection set is itself a list of items - # Items must alternatingly belong to the connectors and cables sections + # Arrows may be used instead of cables -... - # example (single connection) @@ -189,6 +176,18 @@ connections: - [, ..., ] # specify multiple simple connectors to attach in parallel # these may be unique, auto-generated, or a mix of both + - # example (arrows between pins) + - : [, ..., ] + - [, ..., ] # draw arrow linking pins of both connectors + # use single line arrows (--, <--, <-->, -->) + - : [, ..., ] + + - # example (arrows between connectors) + - + - # draw arrow linking the connectors themselves + # use double line arrow (==, <==, <==>, ==>) + - + ... ``` @@ -199,6 +198,7 @@ connections: - When a connection set defines multiple parallel connections, the number of specified ``s and ``s for each component in the set must match. When specifying only one designator, one is auto-generated for each connection of the set. - `` may reference a pin's unique ID (as per the connector's `pins` attribute, auto-numbered from 1 by default) or its label (as per `pinlabels`). - `` may reference a wire's number within a cable/bundle, its label (as per `wirelabels`) or, if unambiguous, its color. +- For ``, see below. ### Single connections @@ -249,6 +249,130 @@ For connectors with `autogenerate: true`, a new instance, with auto-generated de - `-` auto-expands to a range. - `` to refer to a wire's label or color, if unambiguous. +### Arrows + +Arrows may be used in place of wires to join two connectors. This can represent the mating of matching connectors. + +To represent joining individual pins between two connectors, a list of single arrows is used: +```yaml +connections: + - + - : [,...,] + - [, ..., ] # --, <--, <--> or --> + - : [,...,] +``` + +To represent mating of two connectors as a whole, one double arrow is used: +```yaml +connections: + - + - # using connector designator only + - # ==, <==, <==> or ==> + - + - + - ... + - : [, ...] # designator and pinlist (pinlist is ignored) + # useful when combining arrows and wires + - # ==, <==, <==> or ==> + - : [, ...] + - ... +``` + +### Autogeneration of items + +For very simple, recurring connectors such as crimp ferrules, splices and others, where it would be a hassle to individually assign unique designators for every instance, autogeneration may be used. Both connectors and cables can be autogenerated. + +Example (see `connections` section): + +```yaml +connectors: + X: + # ... + Y: + # ... + Z: + style: simple + # ... +cables: + V: + # ... + W: + # ... + +connections: + - # no autogeneration (normal use) + - X: [1,2,...] # Use X as both the template and the instance designator + - V: [1,2,...] # Use V as both the template and the instance designator + # ... + + - # autogeneration of named instances + - Y.Y1: [1,2,...] # Use template Y, generate instance with designator Y1 + - W.W1: [1,2,...] # Use template W, generate instance with designator W1 + - Y.Y2: [1,2,...] # generate more instances from the same templates + - W.W2: [1,2,...] + - Y.Y3: [1,2,...] + + - # autogeneration of unnamed instances + - Y3: [1,2,...] # reuse existing instance Y3 + - W.W4: [1,2,...] + - Z. # Use template Z, generate one unnamed instance + # for each connection in set +``` + +Since the internally assigned designator of an unnamed component is not known to the user, one instance of the connector can not be referenced again outside the point of creation (i.e. in other connection sets, or later in the same set). Autogeneration of unnamed instances is therefore only useful for terminals with only one wire attached, or splices with exactly one wire going in, and one wire going out. +If a component is to be used in other connection sets (e.g. for a three-way splice, or a crimp where multiple wires are joined), a named instance needs to be used. + +Names of autogenerated components are hidden by default. While they can be shown in the graphical output using the `show_name: true` option, it is not recommended to manually use the internally assigned designator (starting with a double underscore `__`), since it might change in future WireViz versions, or when the order of items in connection sets changes. + + +## Metadata entries + +```yaml + # Meta-information describing the harness + + # Each key/value pair replaces all key references in + # the HTML output template with the belonging value. + # Typical keys are 'title', 'description', and 'notes', + # but any key is accepted. Unused keys are ignored. + : # Any valid YAML syntax is accepted + # If no value is specified for 'title', then the + # output filename without extension is used. +``` + +## Options + +```yaml + # Common attributes for the whole harness. + # All entries are optional and have default values. + + # Background color of diagram and HTML output + bgcolor: # Default = 'WH' + + # Background color of other diagram elements + bgcolor_node: # Default = 'WH' + bgcolor_connector: # Default = bgcolor_node + bgcolor_cable: # Default = bgcolor_node + bgcolor_bundle: # Default = bgcolor_cable + + # How to display colors as text in the diagram + # 'full' : Lowercase full color name + # 'FULL' : Uppercase full color name + # 'hex' : Lowercase hexadecimal values + # 'HEX' : Uppercase hexadecimal values + # 'short': Lowercase short color name + # 'SHORT': Uppercase short color name + # 'ger' : Lowercase short German color name + # 'GER' : Uppercase short German color name + color_mode: # Default = 'SHORT' + + # Fontname to use in diagram and HTML output + fontname: # Default = 'arial' + + # If True, show only a BOM entry reference together with basic info + # about additional components inside the diagram node (connector/cable box). + # If False, show all info about additional components inside the diagram node. + mini_bom_mode: # Default = True +``` ## Metadata entries From 5cc133c596ccb01a6b49c515aba57af57a311f54 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 23 Sep 2021 17:07:06 +0200 Subject: [PATCH 007/155] Move selected test files to examples directory --- test/test1.yml => examples/ex11.yml | 0 test/test2.yml => examples/ex12.yml | 0 test/test4.yml => examples/ex13.yml | 0 test/test9.yml => examples/ex14.yml | 0 test/.gitignore | 5 --- test/test3.yml | 33 --------------- test/test5.yml | 64 ----------------------------- 7 files changed, 102 deletions(-) rename test/test1.yml => examples/ex11.yml (100%) rename test/test2.yml => examples/ex12.yml (100%) rename test/test4.yml => examples/ex13.yml (100%) rename test/test9.yml => examples/ex14.yml (100%) delete mode 100644 test/.gitignore delete mode 100644 test/test3.yml delete mode 100644 test/test5.yml diff --git a/test/test1.yml b/examples/ex11.yml similarity index 100% rename from test/test1.yml rename to examples/ex11.yml diff --git a/test/test2.yml b/examples/ex12.yml similarity index 100% rename from test/test2.yml rename to examples/ex12.yml diff --git a/test/test4.yml b/examples/ex13.yml similarity index 100% rename from test/test4.yml rename to examples/ex13.yml diff --git a/test/test9.yml b/examples/ex14.yml similarity index 100% rename from test/test9.yml rename to examples/ex14.yml diff --git a/test/.gitignore b/test/.gitignore deleted file mode 100644 index e28d925..0000000 --- a/test/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -*.bom.tsv -*.gv -*.html -*.png -*.svg diff --git a/test/test3.yml b/test/test3.yml deleted file mode 100644 index a01bedf..0000000 --- a/test/test3.yml +++ /dev/null @@ -1,33 +0,0 @@ -# expanding upon @stmaxed's example in #134 - -connectors: - X1: &X - type: Screw connector - subtype: male - color: GN - pincount: 4 - pinlabels: [A, B, C, D] - X2: - <<: *X - subtype: female - F: - style: simple - type: Ferrule - color: GY - -cables: - W: - color: BK - colors: [BK, WH, BU, BN] - -connections: - - # ferrules + connector X1 - - W.W1: [1-4] - - F. - - --> - - X1: [1-4] - - ==> - - X2: [1-4] - - <-- - - F. - - W.W2: [1-4] diff --git a/test/test5.yml b/test/test5.yml deleted file mode 100644 index 0e67032..0000000 --- a/test/test5.yml +++ /dev/null @@ -1,64 +0,0 @@ -connectors: - XS: - type: Screw terminal connector - subtype: male - color: GN - pincount: 3 - XM: - type: Molex KK 254 - subtype: female - pincount: 3 - F: - style: simple - type: Ferrule - subtype: 0.25 mm2 - color: LB - LED_RD: &LED - type: LED - subtype: 5mm - show_pincount: false - color: RD - pins: [+, -] - pinlabels: [Anode, Cathode] - LED_GN: - <<: *LED - color: GN - LED_YE: - <<: *LED - color: YE - -cables: - C: - category: bundle - # show_name: false - colors: [RD, BK] - gauge: 0.25 mm2 - W: - category: bundle - # show_name: false - colors: [BN] - gauge: 0.25 mm2 - -connections: - - - - [F.F1, F.F2] - - C.W1: [1,2] - - LED_RD: [+,-] - - - - F.F3 - - W.W2: [1] - - LED_GN: [+] - - - - LED_GN: [-] - - W.W3: [1] - - - - XS.X1: [1-3] - - <-- - - [F1, F2, F3] - - - - LED_YE: [+,-] - - C.W4: [1,2] - - XM.X2: [1,2] - - - - W3: [1] - - X2: [3] From 22e75f918e8aef089931ab85728d27e618908d1a Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Wed, 13 Oct 2021 21:45:22 +0200 Subject: [PATCH 008/155] Fix duplicates in `syntax.md` after rebase --- docs/syntax.md | 49 ------------------------------------------------- 1 file changed, 49 deletions(-) diff --git a/docs/syntax.md b/docs/syntax.md index 2859fdb..1c14d3e 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -375,55 +375,6 @@ Names of autogenerated components are hidden by default. While they can be shown ``` -## Metadata entries - -```yaml - # Meta-information describing the harness - - # Each key/value pair replaces all key references in - # the HTML output template with the belonging value. - # Typical keys are 'title', 'description', and 'notes', - # but any key is accepted. Unused keys are ignored. - : # Any valid YAML syntax is accepted - # If no value is specified for 'title', then the - # output filename without extension is used. -``` - -## Options - -```yaml - # Common attributes for the whole harness. - # All entries are optional and have default values. - - # Background color of diagram and HTML output - bgcolor: # Default = 'WH' - - # Background color of other diagram elements - bgcolor_node: # Default = 'WH' - bgcolor_connector: # Default = bgcolor_node - bgcolor_cable: # Default = bgcolor_node - bgcolor_bundle: # Default = bgcolor_cable - - # How to display colors as text in the diagram - # 'full' : Lowercase full color name - # 'FULL' : Uppercase full color name - # 'hex' : Lowercase hexadecimal values - # 'HEX' : Uppercase hexadecimal values - # 'short': Lowercase short color name - # 'SHORT': Uppercase short color name - # 'ger' : Lowercase short German color name - # 'GER' : Uppercase short German color name - color_mode: # Default = 'SHORT' - - # Fontname to use in diagram and HTML output - fontname: # Default = 'arial' - - # If True, show only a BOM entry reference together with basic info - # about additional components inside the diagram node (connector/cable box). - # If False, show all info about additional components inside the diagram node. - mini_bom_mode: # Default = True -``` - ## BOM items and additional components Connectors (both regular, and auto-generated), cables, and wires of a bundle are automatically added to the BOM, From bc5ef2eccef3666f361c1061e0e439984f19b2bb Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 14 Oct 2021 18:03:18 +0200 Subject: [PATCH 009/155] Fix bug of arrows using the wrong port IDs --- src/wireviz/Harness.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index a135717..a04bbdd 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -40,11 +40,13 @@ class Harness: def add_cable(self, name: str, *args, **kwargs) -> None: self.cables[name] = Cable(name, *args, **kwargs) - def add_mate_pin(self, *args, **kwargs) -> None: - self.mates.append(MatePin(*args, **kwargs)) + def add_mate_pin(self, from_name, from_pin, to_name, to_pin, arrow_type) -> None: + from_pin_id = self.connectors[from_name].pins.index(from_pin) + to_pin_id = self.connectors[to_name].pins.index(to_pin) + self.mates.append(MatePin(from_name, from_pin_id, to_name, to_pin_id, arrow_type)) - def add_mate_component(self, *args, **kwargs) -> None: - self.mates.append(MateComponent(*args, **kwargs)) + def add_mate_component(self, from_name, to_name, arrow_type) -> None: + self.mates.append(MateComponent(from_name, to_name, arrow_type)) def add_bom_item(self, item: dict) -> None: self.additional_bom_items.append(item) @@ -447,9 +449,9 @@ class Harness: raise Exception(f'{mate} is an unknown mate') dot.attr('edge', color=color, style='dashed', dir=dir) - from_port = f':p{mate.from_port}r' if isinstance(mate, MatePin) and self.connectors[mate.from_name].style != 'simple' else '' + from_port = f':p{mate.from_port+1}r' if isinstance(mate, MatePin) and self.connectors[mate.from_name].style != 'simple' else '' code_from = f'{mate.from_name}{from_port}:e' - to_port = f':p{mate.to_port}l' if isinstance(mate, MatePin) and self.connectors[mate.to_name].style != 'simple' else '' + to_port = f':p{mate.to_port+1}l' if isinstance(mate, MatePin) and self.connectors[mate.to_name].style != 'simple' else '' code_to = f'{mate.to_name}{to_port}:w' dot.edge(code_from, code_to) From 37cd08d47614eb4e6d65b3475f63a1b2ade8a42a Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 14 Oct 2021 18:03:30 +0200 Subject: [PATCH 010/155] Simplify code --- src/wireviz/wireviz.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/wireviz/wireviz.py b/src/wireviz/wireviz.py index 8b87a71..b0c46e2 100755 --- a/src/wireviz/wireviz.py +++ b/src/wireviz/wireviz.py @@ -235,12 +235,12 @@ def parse(yaml_input: str, file_out: (str, Path) = None, return_types: (None, st if index_item == 0: # list started with a cable, no connector to join on left side from_name, from_pin = (None, None) else: - from_name, from_pin = get_single_key_and_value(connection_set[index_entry][index_item-1]) + from_name, from_pin = get_single_key_and_value(entry[index_item-1]) via_name, via_pin = (designator, item[designator]) if index_item == len(entry) - 1: # list ends with a cable, no connector to join on right side to_name, to_pin = (None, None) else: - to_name, to_pin = get_single_key_and_value(connection_set[index_entry][index_item+1]) + to_name, to_pin = get_single_key_and_value(entry[index_item+1]) harness.connect(from_name, from_pin, via_name, via_pin, to_name, to_pin) elif is_arrow(designator): @@ -249,9 +249,11 @@ def parse(yaml_input: str, file_out: (str, Path) = None, return_types: (None, st elif index_item == len(entry) - 1: # list ends with an arrow raise Exception('An arrow cannot be at the end of a connection set') - from_name, from_pin = get_single_key_and_value(connection_set[index_entry][index_item-1]) +# self.connectors[from_name].pins.index(from_pin) + # import pudb; pu.db + from_name, from_pin = get_single_key_and_value(entry[index_item-1]) via_name, via_pin = (designator, None) - to_name, to_pin = get_single_key_and_value(connection_set[index_entry][index_item+1]) + to_name, to_pin = get_single_key_and_value(entry[index_item+1]) if '-' in designator: # mate pin by pin harness.add_mate_pin(from_name, from_pin, to_name, to_pin, designator) elif '=' in designator and index_entry == 0: # mate two connectors as a whole From d44b649fcc3c69e5bbd8810070f61ce5570eed92 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Sat, 16 Oct 2021 21:46:31 +0200 Subject: [PATCH 011/155] Refactor functions for harness building - Use pin names instead of pin indices, until the last moment when generating the ports for the GraphViz nodes - `Harness.add_mate_pin()` now uses pin names - Remove unused `if is_arrow()` check from `Harness.connect()` - Consolidate calling of `Connector.activate_pin()` to prevent subtle bugs - Call it from `connect()` and `add_mate_pin()` - No longer call it from `create_graph()` - Misc. other tuning --- src/wireviz/DataClasses.py | 21 +++++++--- src/wireviz/Harness.py | 83 +++++++++++++++++--------------------- 2 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index 87b7bc1..6e87bb6 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- +from enum import Enum, auto from typing import Dict, List, Optional, Tuple, Union from dataclasses import dataclass, field, InitVar from pathlib import Path @@ -23,11 +24,17 @@ ImageScale = PlainText # = Literal['false', 'true', 'width', 'height', 'both'] Pin = Union[int, PlainText] # Pin identifier PinIndex = int # Zero-based pin index Wire = Union[int, PlainText] # Wire number or Literal['s'] for shield +NoneOrMorePins = Union[Pin, Tuple[Pin, ...], None] # None, one, or a tuple of pin identifiers NoneOrMorePinIndices = Union[PinIndex, Tuple[PinIndex, ...], None] # None, one, or a tuple of zero-based pin indices OneOrMoreWires = Union[Wire, Tuple[Wire, ...]] # One or a tuple of wires # Metadata can contain whatever is needed by the HTML generation/template. MetadataKeys = PlainText # Literal['title', 'description', 'notes', ...] + +class Side(Enum): + LEFT = auto() + RIGHT = auto() + class Metadata(dict): pass @@ -188,8 +195,12 @@ class Connector: if isinstance(item, dict): self.additional_components[i] = AdditionalComponent(**item) - def activate_pin(self, pin: Pin) -> None: + def activate_pin(self, pin: Pin, side: Side) -> None: self.visible_pins[pin] = True + if side == Side.LEFT: + self.ports_left = True + elif side == Side.RIGHT: + self.ports_right = True def get_qty_multiplier(self, qty_multiplier: Optional[ConnectorMultiplier]) -> int: if not qty_multiplier: @@ -349,17 +360,17 @@ class Cable: @dataclass class Connection: from_name: Optional[Designator] - from_port: Optional[PinIndex] + from_pin: Optional[Pin] via_port: Wire to_name: Optional[Designator] - to_port: Optional[PinIndex] + to_pin: Optional[Pin] @dataclass class MatePin: from_name: Designator - from_port: PinIndex + from_pin: Pin to_name: Designator - to_port: PinIndex + to_pin: Pin shape: str @dataclass diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index a04bbdd..f93350d 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -9,7 +9,7 @@ from itertools import zip_longest import re from wireviz import wv_colors, __version__, APP_NAME, APP_URL -from wireviz.DataClasses import Cable, Connector, MatePin, MateComponent, Metadata, Options, Tweak +from wireviz.DataClasses import Cable, Connector, MatePin, MateComponent, Metadata, Options, Tweak, Side from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_gv_html import nested_html_table, \ html_bgcolor_attr, html_bgcolor, html_colorbar, \ @@ -41,9 +41,9 @@ class Harness: self.cables[name] = Cable(name, *args, **kwargs) def add_mate_pin(self, from_name, from_pin, to_name, to_pin, arrow_type) -> None: - from_pin_id = self.connectors[from_name].pins.index(from_pin) - to_pin_id = self.connectors[to_name].pins.index(to_pin) - self.mates.append(MatePin(from_name, from_pin_id, to_name, to_pin_id, arrow_type)) + self.mates.append(MatePin(from_name, from_pin, to_name, to_pin, arrow_type)) + self.connectors[from_name].activate_pin(from_pin, Side.RIGHT) + self.connectors[to_name].activate_pin(to_pin, Side.LEFT) def add_mate_component(self, from_name, to_name, arrow_type) -> None: self.mates.append(MateComponent(from_name, to_name, arrow_type)) @@ -74,12 +74,7 @@ class Harness: raise Exception(f'{name}:{pin} not found.') # check via cable - if is_arrow(via_name): - if '-' in via_name: - self.mates[(from_name, from_pin, to_name, to_pin)] = via_name - elif '=' in via_name: - self.mates[(from_name, to_name)] = via_name - elif via_name in self.cables: + if via_name in self.cables: cable = self.cables[via_name] # check if provided name is ambiguous if via_wire in cable.colors and via_wire in cable.wirelabels: @@ -95,14 +90,12 @@ class Harness: raise Exception(f'{via_name}:{via_wire} is used for more than one wire.') via_wire = cable.wirelabels.index(via_wire) + 1 # list index starts at 0, wire IDs start at 1 - from_pin_id = self.connectors[from_name].pins.index(from_pin) if from_pin is not None else None - to_pin_id = self.connectors[to_name].pins.index(to_pin) if to_pin is not None else None - - self.cables[via_name].connect(from_name, from_pin_id, via_wire, to_name, to_pin_id) + # perform the actual connection + self.cables[via_name].connect(from_name, from_pin, via_wire, to_name, to_pin) if from_name in self.connectors: - self.connectors[from_name].activate_pin(from_pin) + self.connectors[from_name].activate_pin(from_pin, Side.RIGHT) if to_name in self.connectors: - self.connectors[to_name].activate_pin(to_pin) + self.connectors[to_name].activate_pin(to_pin, Side.LEFT) def create_graph(self) -> Graph: dot = Graph() @@ -122,23 +115,6 @@ class Harness: dot.attr('edge', style='bold', fontname=self.options.fontname) - # prepare ports on connectors depending on which side they will connect - for _, cable in self.cables.items(): - for connection_color in cable.connections: - if connection_color.from_port is not None: # connect to left - self.connectors[connection_color.from_name].ports_right = True - self.connectors[connection_color.from_name].activate_pin(connection_color.from_port) - if connection_color.to_port is not None: # connect to right - self.connectors[connection_color.to_name].ports_left = True - self.connectors[connection_color.to_name].activate_pin(connection_color.to_port) - - for mate in self.mates: - if isinstance(mate, MatePin): - self.connectors[mate.from_name].ports_right = True - self.connectors[mate.from_name].activate_pin(mate.from_port) - self.connectors[mate.to_name].ports_left = True - self.connectors[mate.to_name].activate_pin(mate.to_port) - for connector in self.connectors.values(): # If no wires connected (except maybe loop wires)? @@ -341,32 +317,34 @@ class Harness: else: # it's a shield connection # shield is shown with specified color and black borders, or as a thin black wire otherwise dot.attr('edge', color=':'.join(['#000000', shield_color_hex, '#000000']) if isinstance(cable.shield, str) else '#000000') - if connection.from_port is not None: # connect to left + if connection.from_pin is not None: # connect to left from_connector = self.connectors[connection.from_name] - from_port = f':p{connection.from_port+1}r' if from_connector.style != 'simple' else '' - code_left_1 = f'{connection.from_name}{from_port}:e' + from_pin_index = from_connector.pins.index(connection.from_pin) + from_port_str = f':p{from_pin_index+1}r' if from_connector.style != 'simple' else '' + code_left_1 = f'{connection.from_name}{from_port_str}:e' code_left_2 = f'{cable.name}:w{connection.via_port}:w' dot.edge(code_left_1, code_left_2) if from_connector.show_name: - from_info = [str(connection.from_name), str(self.connectors[connection.from_name].pins[connection.from_port])] + from_info = [str(connection.from_name), str(connection.from_pin)] if from_connector.pinlabels: - pinlabel = from_connector.pinlabels[connection.from_port] + pinlabel = from_connector.pinlabels[from_pin_index] if pinlabel != '': from_info.append(pinlabel) from_string = ':'.join(from_info) else: from_string = '' html = [row.replace(f'', from_string) for row in html] - if connection.to_port is not None: # connect to right + if connection.to_pin is not None: # connect to right to_connector = self.connectors[connection.to_name] + to_pin_index = to_connector.pins.index(connection.to_pin) + to_port_str = f':p{to_pin_index+1}l' if to_connector.style != 'simple' else '' code_right_1 = f'{cable.name}:w{connection.via_port}:e' - to_port = f':p{connection.to_port+1}l' if self.connectors[connection.to_name].style != 'simple' else '' - code_right_2 = f'{connection.to_name}{to_port}:w' + code_right_2 = f'{connection.to_name}{to_port_str}:w' dot.edge(code_right_1, code_right_2) if to_connector.show_name: - to_info = [str(connection.to_name), str(self.connectors[connection.to_name].pins[connection.to_port])] + to_info = [str(connection.to_name), str(connection.to_pin)] if to_connector.pinlabels: - pinlabel = to_connector.pinlabels[connection.to_port] + pinlabel = to_connector.pinlabels[to_pin_index] if pinlabel != '': to_info.append(pinlabel) to_string = ':'.join(to_info) @@ -448,11 +426,22 @@ class Harness: else: raise Exception(f'{mate} is an unknown mate') + from_connector = self.connectors[mate.from_name] + if isinstance(mate, MatePin) and self.connectors[mate.from_name].style != 'simple': + from_pin_index = from_connector.pins.index(mate.from_pin) + from_port_str = f':p{from_pin_index+1}r' + else: # MateComponent or style == 'simple' + from_port_str = '' + if isinstance(mate, MatePin) and self.connectors[mate.to_name].style != 'simple': + to_pin_index = to_connector.pins.index(mate.to_pin) + to_port_str = f':p{to_pin_index+1}l' if isinstance(mate, MatePin) and self.connectors[mate.to_name].style != 'simple' else '' + else: # MateComponent or style == 'simple' + to_port_str = '' + code_from = f'{mate.from_name}{from_port_str}:e' + to_connector = self.connectors[mate.to_name] + code_to = f'{mate.to_name}{to_port_str}:w' + dot.attr('edge', color=color, style='dashed', dir=dir) - from_port = f':p{mate.from_port+1}r' if isinstance(mate, MatePin) and self.connectors[mate.from_name].style != 'simple' else '' - code_from = f'{mate.from_name}{from_port}:e' - to_port = f':p{mate.to_port+1}l' if isinstance(mate, MatePin) and self.connectors[mate.to_name].style != 'simple' else '' - code_to = f'{mate.to_name}{to_port}:w' dot.edge(code_from, code_to) return dot From a839a47c3f84375bce963428231b838466f05bd0 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 26 Aug 2021 18:50:08 +0200 Subject: [PATCH 012/155] Implement template-based HTML output --- src/wireviz/templates/din-6771.html | 284 ++++++++++++++++++++++++++++ src/wireviz/templates/simple.html | 45 +++++ src/wireviz/wv_helper.py | 19 ++ src/wireviz/wv_html.py | 120 +++++++----- 4 files changed, 424 insertions(+), 44 deletions(-) create mode 100644 src/wireviz/templates/din-6771.html create mode 100644 src/wireviz/templates/simple.html diff --git a/src/wireviz/templates/din-6771.html b/src/wireviz/templates/din-6771.html new file mode 100644 index 0000000..aec0f90 --- /dev/null +++ b/src/wireviz/templates/din-6771.html @@ -0,0 +1,284 @@ + + + + + + + <!-- %title% --> + + + + +
+
+ +
+ +
+ +
+ + + +
+ +
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DateName
Sheet
of
RevChangelogDateName
+
+ +
+
+ + diff --git a/src/wireviz/templates/simple.html b/src/wireviz/templates/simple.html new file mode 100644 index 0000000..961ef9d --- /dev/null +++ b/src/wireviz/templates/simple.html @@ -0,0 +1,45 @@ + + + + + <!-- %title% --> + + +

+

Diagram

+ +
+ +
+ +
+ +
+ +
+ +
+ +

Bill of Materials

+ +
+ +
+ + diff --git a/src/wireviz/wv_helper.py b/src/wireviz/wv_helper.py index 6b39fef..d5d6456 100644 --- a/src/wireviz/wv_helper.py +++ b/src/wireviz/wv_helper.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from typing import List +from pathlib import Path import re awg_equiv_table = { @@ -134,3 +135,21 @@ def aspect_ratio(image_src): except Exception as error: print(f'aspect_ratio(): {type(error).__name__}: {error}') return 1 # Assume 1:1 when unable to read actual image size + + +def smart_file_resolve(filename, possible_paths): + filename = Path(filename) + if filename.is_absolute(): + if filename.exists(): + return filename + else: + raise Exception(f'{filename} does not exist.') + else: # search all possible paths in decreasing order of precedence + possible_paths = [Path(path).resolve() for path in possible_paths] + for possible_path in possible_paths: + resolved_path = (possible_path / filename).resolve() + if (resolved_path).exists(): + return resolved_path + else: + raise Exception(f'{filename} was not found in any of the following locations: \n' + + '\n'.join([str(x) for x in possible_paths])) diff --git a/src/wireviz/wv_html.py b/src/wireviz/wv_html.py index 0b81974..09bba26 100644 --- a/src/wireviz/wv_html.py +++ b/src/wireviz/wv_html.py @@ -1,54 +1,86 @@ # -*- coding: utf-8 -*- from pathlib import Path -from typing import List, Union +from typing import Dict, List, Union import re from wireviz import __version__, APP_NAME, APP_URL, wv_colors from wireviz.DataClasses import Metadata, Options -from wireviz.wv_helper import flatten2d, open_file_read, open_file_write +from wireviz.wv_helper import flatten2d, open_file_read, open_file_write, smart_file_resolve +from wireviz.wv_gv_html import html_line_breaks def generate_html_output(filename: Union[str, Path], bom_list: List[List[str]], metadata: Metadata, options: Options): + + # load HTML template + if 'name' in metadata.get('template',{}): + # if relative path to template was provided, check directory of YAML file first, fall back to built-in template directory + templatefile = smart_file_resolve(f'{metadata["template"]["name"]}.html', [Path(filename).parent, Path(__file__).parent / 'templates']) + else: + # fall back to built-in simple template if no template was provided + templatefile = Path(__file__).parent / 'templates/simple.html' + + with open_file_read(templatefile) as file: + html = file.read() + + # embed SVG diagram + with open_file_read(f'{filename}.svg') as file: + svgdata = file.read() + svgdata = re.sub( + '^<[?]xml [^?>]*[?]>[^<]*]*>', + '', + svgdata, 1) + html = html.replace('', svgdata) + + # generate BOM table + bom = flatten2d(bom_list) + + # generate BOM header (may be at the top or bottom of the table) + bom_header_html = ' \n' + for item in bom[0]: + th_class = f'bom_col_{item.lower()}' + bom_header_html = f'{bom_header_html} {item}\n' + bom_header_html = f'{bom_header_html} \n' + + # generate BOM contents + bom_contents = [] + for row in bom[1:]: + row_html = ' \n' + for i, item in enumerate(row): + td_class = f'bom_col_{bom[0][i].lower()}' + row_html = f'{row_html} {item}\n' + row_html = f'{row_html} \n' + bom_contents.append(row_html) + + bom_html = '\n' + bom_header_html + ''.join(bom_contents) + '
\n' + bom_html_reversed = '\n' + ''.join(list(reversed(bom_contents))) + bom_header_html + '
\n' + + # insert BOM table + html = html.replace('', bom_html) + html = html.replace('', bom_html_reversed) + + # insert generator + html = html.replace('', f'{APP_NAME} {__version__} - {APP_URL}') + + # insert other metadata + if metadata: + + html = html.replace(f'"sheetsize_default"', '"{}"'.format(metadata.get('template',{}).get('sheetsize', ''))) # include quotes so no replacement happens within - +

Diagram

From 928f607457833d88f379ac96b8549c2cc19503ad Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 28 Sep 2021 20:49:18 +0200 Subject: [PATCH 016/155] Consolidate code for replacing HTML placeholders --- src/wireviz/wv_html.py | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/wireviz/wv_html.py b/src/wireviz/wv_html.py index 09bba26..73881f8 100644 --- a/src/wireviz/wv_html.py +++ b/src/wireviz/wv_html.py @@ -29,7 +29,6 @@ def generate_html_output(filename: Union[str, Path], bom_list: List[List[str]], '^<[?]xml [^?>]*[?]>[^<]*]*>', '', svgdata, 1) - html = html.replace('', svgdata) # generate BOM table bom = flatten2d(bom_list) @@ -54,33 +53,34 @@ def generate_html_output(filename: Union[str, Path], bom_list: List[List[str]], bom_html = '\n' + bom_header_html + ''.join(bom_contents) + '
\n' bom_html_reversed = '\n' + ''.join(list(reversed(bom_contents))) + bom_header_html + '
\n' - # insert BOM table - html = html.replace('', bom_html) - html = html.replace('', bom_html_reversed) + # prepare simple replacements + replacements = { + '': f'{APP_NAME} {__version__} - {APP_URL}', + '': svgdata, + '': bom_html, + '': bom_html_reversed, + '': '1', # TODO: handle multi-page documents + '': '1', # TODO: handle multi-page documents + } - # insert generator - html = html.replace('', f'{APP_NAME} {__version__} - {APP_URL}') - - # insert other metadata + # prepare metadata replacements if metadata: - - html = html.replace(f'"sheetsize_default"', '"{}"'.format(metadata.get('template',{}).get('sheetsize', ''))) # include quotes so no replacement happens within +

demo01

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Cable, 3 x 0.25 mm² shielded0.2mW1
2Connector, D-Sub, female, 9 pins1X1
3Connector, Molex KK 254, female, 3 pins1X2
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, 3 x 0.25 mm² shielded0.2mW1
2Connector, D-Sub, female, 9 pins1X1
3Connector, Molex KK 254, female, 3 pins1X2
+ + + diff --git a/examples/demo01.svg b/examples/demo01.svg index bd45444..68a3ea1 100644 --- a/examples/demo01.svg +++ b/examples/demo01.svg @@ -1,7 +1,7 @@ - > fillcolor="#FFFFFF" shape=box style=filled] - _ferrule_crimp_1 [label=< + AUTOGENERATED_F_1 [label=<
@@ -180,7 +180,7 @@ graph {
> fillcolor="#FFFFFF" shape=box style=filled] - _ferrule_crimp_2 [label=< + AUTOGENERATED_F_2 [label=<
@@ -487,10 +487,10 @@ graph {
> fillcolor="#FFFFFF" shape=box style="filled,dashed"] edge [color="#000000:#000000:#000000"] - _ferrule_crimp_1:e -- W4:w1:w + AUTOGENERATED_F_1:e -- W4:w1:w W4:w1:e -- X4:p1l:w edge [color="#000000:#ff0000:#000000"] - _ferrule_crimp_2:e -- W4:w2:w + AUTOGENERATED_F_2:e -- W4:w2:w W4:w2:e -- X4:p2l:w W4 [label=< diff --git a/examples/demo02.html b/examples/demo02.html index cc726ae..1002edd 100644 --- a/examples/demo02.html +++ b/examples/demo02.html @@ -1,13 +1,194 @@ - - - - demo02 - -

demo02

-

Diagram

- - + + + +SCK - + -_ferrule_crimp_1 +AUTOGENERATED_F_1 Crimp ferrule @@ -389,16 +570,16 @@   - + -_ferrule_crimp_1:e--W4:w +AUTOGENERATED_F_1:e--W4:w - + -_ferrule_crimp_2 +AUTOGENERATED_F_2 Crimp ferrule @@ -409,9 +590,9 @@ - + -_ferrule_crimp_2:e--W4:w +AUTOGENERATED_F_2:e--W4:w @@ -516,98 +697,193 @@ -

Bill of Materials

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+ +
+ + + +
+
IdDescriptionQtyUnitDesignators
1Cable, 2 x 0.25 mm²0.3mW4
2Connector, Crimp ferrule, 0.25 mm², YE2
3Connector, Molex KK 254, female, 4 pins2X2, X3
4Connector, Molex KK 254, female, 5 pins1X4
5Connector, Molex KK 254, female, 8 pins1X1
6Wire, 0.14 mm², BK0.9mW1, W2, W3
7Wire, 0.14 mm², BU0.3mW3
8Wire, 0.14 mm², GN0.6mW1, W2
9Wire, 0.14 mm², OG0.3mW3
10Wire, 0.14 mm², RD0.6mW1, W2
11Wire, 0.14 mm², VT0.3mW3
12Wire, 0.14 mm², YE0.6mW1, W2
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
12Wire, 0.14 mm², YE0.6mW1, W2
11Wire, 0.14 mm², VT0.3mW3
10Wire, 0.14 mm², RD0.6mW1, W2
9Wire, 0.14 mm², OG0.3mW3
8Wire, 0.14 mm², GN0.6mW1, W2
7Wire, 0.14 mm², BU0.3mW3
6Wire, 0.14 mm², BK0.9mW1, W2, W3
5Connector, Molex KK 254, female, 8 pins1X1
4Connector, Molex KK 254, female, 5 pins1X4
3Connector, Molex KK 254, female, 4 pins2X2, X3
2Connector, Crimp ferrule, 0.25 mm², YE2
1Cable, 2 x 0.25 mm²0.3mW4
IdDescriptionQtyUnitDesignators
- + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DateNameWireViz Demo 2
Created2020-05-20D. Rojas
Approved2020-05-20D. Rojas
WV-DEMO-02Sheet
1
AWireViz 0.2 release2020-10-17D. Rojasof 1
RevChangelogDateName
+
+ + + + + diff --git a/examples/demo02.svg b/examples/demo02.svg index 06320f8..a23c9f6 100644 --- a/examples/demo02.svg +++ b/examples/demo02.svg @@ -1,7 +1,7 @@ - SCK - + -_ferrule_crimp_1 +AUTOGENERATED_F_1 Crimp ferrule @@ -383,16 +383,16 @@   - + -_ferrule_crimp_1:e--W4:w +AUTOGENERATED_F_1:e--W4:w - + -_ferrule_crimp_2 +AUTOGENERATED_F_2 Crimp ferrule @@ -403,9 +403,9 @@ - + -_ferrule_crimp_2:e--W4:w +AUTOGENERATED_F_2:e--W4:w diff --git a/examples/ex01.html b/examples/ex01.html index 63558a5..c11a3a6 100644 --- a/examples/ex01.html +++ b/examples/ex01.html @@ -1,13 +1,36 @@ - - - ex01 - + + + ex01 + +

ex01

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Cable, Serial, 4 x 0.25 mm² shielded0.2mW1
2Connector, Molex KK 254, female, 4 pins2X1, X2
+ + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, Serial, 4 x 0.25 mm² shielded0.2mW1
2Connector, Molex KK 254, female, 4 pins2X1, X2
+ + + diff --git a/examples/ex01.svg b/examples/ex01.svg index d72503b..4667ae5 100644 --- a/examples/ex01.svg +++ b/examples/ex01.svg @@ -1,7 +1,7 @@ - - - - ex02 - + + + ex02 + +

ex02

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Cable, 2 x 0.25 mm²0.4mW1, W2
2Cable, 2 x 20 AWG0.2mW3
3Connector, Molex Micro-Fit, female, 2 pins3X2, X3, X4
4Connector, Molex Micro-Fit, male, 2 pins1X1
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, 2 x 0.25 mm²0.4mW1, W2
2Cable, 2 x 20 AWG0.2mW3
3Connector, Molex Micro-Fit, female, 2 pins3X2, X3, X4
4Connector, Molex Micro-Fit, male, 2 pins1X1
+ + + diff --git a/examples/ex02.svg b/examples/ex02.svg index fe8f153..cb86958 100644 --- a/examples/ex02.svg +++ b/examples/ex02.svg @@ -1,7 +1,7 @@ - - - - ex03 - + + + ex03 + +

ex03

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Connector, Molex Micro-Fit, female, 2 pins3X2, X3, X4
2Connector, Molex Micro-Fit, male, 2 pins1X1
3Wire, 0.25 mm², BK0.6mW1
4Wire, 0.25 mm², RD0.6mW1
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Connector, Molex Micro-Fit, female, 2 pins3X2, X3, X4
2Connector, Molex Micro-Fit, male, 2 pins1X1
3Wire, 0.25 mm², BK0.6mW1
4Wire, 0.25 mm², RD0.6mW1
+ + + diff --git a/examples/ex03.svg b/examples/ex03.svg index 50fd135..a13b918 100644 --- a/examples/ex03.svg +++ b/examples/ex03.svg @@ -1,7 +1,7 @@ -
@@ -13,7 +13,7 @@ graph {
> fillcolor="#FFFFFF" shape=box style=filled] - _ferrule_crimp_2 [label=< + AUTOGENERATED_F_2 [label=<
@@ -22,7 +22,7 @@ graph {
> fillcolor="#FFFFFF" shape=box style=filled] - _ferrule_crimp_3 [label=< + AUTOGENERATED_F_3 [label=<
@@ -31,7 +31,7 @@ graph {
> fillcolor="#FFFFFF" shape=box style=filled] - _ferrule_crimp_4 [label=< + AUTOGENERATED_F_4 [label=< ") - # # fmt: on - - - # connections + gv_html = gv_node_component(cable, self.options) + dot.node(cable.name, label=f"<\n{gv_html}\n>", shape="box") + # style=style, + # fillcolor=translate_color(bgcolor, "HEX"), + # generate edges for wires in cable for connection in cable.connections: - if isinstance(connection.via_port, int): - # check if it's an actual wire and not a shield - dot.attr( - "edge", - color=":".join( - ["#000000"] - + wv_colors.get_color_hex( - cable.colors[connection.via_port - 1], pad=pad - ) - + ["#000000"] - ), - ) - else: # it's a shield connection - # shield is shown with specified color and black borders, or as a thin black wire otherwise - if isinstance(cable.shield, str): - shield_color_hex = wv_colors.get_color_hex(cable.shield)[0] - shield_color_str = ":".join(["#000000", shield_color_hex, "#000000"]) - else: - shield_color_str = "#000000" - dot.attr( - "edge", - color=shield_color_str, - ) - if connection.from_pin is not None: # connect to left - from_connector = self.connectors[connection.from_name] - from_pin_index = from_connector.pins.index(connection.from_pin) - from_port_str = ( - f":p{from_pin_index+1}r" - if from_connector.style != "simple" - else "" - ) - code_left_1 = f"{connection.from_name}{from_port_str}:e" - code_left_2 = f"{cable.name}:w{connection.via_port}:w" - dot.edge(code_left_1, code_left_2) - if from_connector.show_name: - from_info = [ - str(connection.from_name), - str(connection.from_pin), - ] - if from_connector.pinlabels: - pinlabel = from_connector.pinlabels[from_pin_index] - if pinlabel != "": - from_info.append(pinlabel) - from_string = ":".join(from_info) - else: - from_string = "" - # html = [ - # row.replace(f"", from_string) - # for row in html - # ] - if connection.to_pin is not None: # connect to right - to_connector = self.connectors[connection.to_name] - to_pin_index = to_connector.pins.index(connection.to_pin) - to_port_str = ( - f":p{to_pin_index+1}l" if to_connector.style != "simple" else "" - ) - code_right_1 = f"{cable.name}:w{connection.via_port}:e" - code_right_2 = f"{connection.to_name}{to_port_str}:w" - dot.edge(code_right_1, code_right_2) - if to_connector.show_name: - to_info = [str(connection.to_name), str(connection.to_pin)] - if to_connector.pinlabels: - pinlabel = to_connector.pinlabels[to_pin_index] - if pinlabel != "": - to_info.append(pinlabel) - to_string = ":".join(to_info) - else: - to_string = "" - # html = [ - # row.replace(f"", to_string) - # for row in html - # ] + color, l1, l2, r1, r2 = gv_edge_wire(self, cable, connection) + dot.attr("edge", color=color) + if not (l1, l2) == (None, None): + dot.edge(l1, l2) + if not (r1, r2) == (None, None): + dot.edge(r1, r2) style, bgcolor = ( ("filled,dashed", self.options.bgcolor_bundle) if cable.category == "bundle" else ("filled", self.options.bgcolor_cable) ) - # html = "\n".join(html) - # dot.node( - # cable.name, - # label=f"<\n{html}\n>", - # shape="box", - # style=style, - # fillcolor=translate_color(bgcolor, "HEX"), - # ) apply_dot_tweaks(dot, self.tweak) @@ -349,6 +223,8 @@ class Harness: from_port_str = f":p{from_pin_index+1}r" else: # MateComponent or style == 'simple' from_port_str = "" + + to_connector = self.connectors[mate.to_name] if ( isinstance(mate, MatePin) and self.connectors[mate.to_name].style != "simple" diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index a2f7d19..8c70548 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -209,11 +209,16 @@ def gv_conductor_table(cable, harness_options) -> Table: rows.append(Tr(cells_above)) # the wire itself - color_list = ["#000000"] + get_color_hex(connection_color, pad=harness_options._pad) + ["#000000"] + color_list = ( + ["#000000"] + + get_color_hex(connection_color, pad=harness_options._pad) + + ["#000000"] + ) rows.append(Tr(gv_wire_cell(i, color_list))) # row below the wire # TODO: PN stuff for bundles + # wire_pn_stuff() see below if cable.shield: rows.append(Tr(Td(" "))) # spacer between wires and shield @@ -260,6 +265,118 @@ def gv_wire_cell(index, color_list) -> Td: return wire_outer_cell +def wire_pn_stuff(): + # # for bundles, individual wires can have part information + # if cable.category == "bundle": + # # create a list of wire parameters + # wireidentification = [] + # if isinstance(cable.pn, list): + # wireidentification.append( + # pn_info_string( + # HEADER_PN, None, remove_links(cable.pn[i - 1]) + # ) + # ) + # manufacturer_info = pn_info_string( + # HEADER_MPN, + # cable.manufacturer[i - 1] + # if isinstance(cable.manufacturer, list) + # else None, + # cable.mpn[i - 1] if isinstance(cable.mpn, list) else None, + # ) + # supplier_info = pn_info_string( + # HEADER_SPN, + # cable.supplier[i - 1] + # if isinstance(cable.supplier, list) + # else None, + # cable.spn[i - 1] if isinstance(cable.spn, list) else None, + # ) + # if manufacturer_info: + # wireidentification.append(html_line_breaks(manufacturer_info)) + # if supplier_info: + # wireidentification.append(html_line_breaks(supplier_info)) + # # print parameters into a table row under the wire + # if len(wireidentification) > 0: + # # fmt: off + # wirehtml.append(' ") + # # fmt: on + pass + + +def gv_edge_wire(harness, cable, connection) -> (str, str, str): + if isinstance(connection.via_port, int): + # check if it's an actual wire and not a shield + wire_color = get_color_hex( + cable.colors[connection.via_port - 1], pad=harness.options._pad + ) + color = ":".join(["#000000"] + wire_color + ["#000000"]) + else: # it's a shield connection + # shield is shown with specified color and black borders, or as a thin black wire otherwise + if isinstance(cable.shield, str): + shield_color_hex = get_color_hex(cable.shield)[0] + shield_color_str = ":".join(["#000000", shield_color_hex, "#000000"]) + else: + shield_color_str = "#000000" + color = shield_color_str + if connection.from_pin is not None: # connect to left + from_connector = harness.connectors[connection.from_name] + from_pin_index = from_connector.pins.index(connection.from_pin) + from_port_str = ( + f":p{from_pin_index+1}r" if from_connector.style != "simple" else "" + ) + code_left_1 = f"{connection.from_name}{from_port_str}:e" + code_left_2 = f"{cable.name}:w{connection.via_port}:w" + # dot.edge(code_left_1, code_left_2) + if from_connector.show_name: + from_info = [ + str(connection.from_name), + str(connection.from_pin), + ] + if from_connector.pinlabels: + pinlabel = from_connector.pinlabels[from_pin_index] + if pinlabel != "": + from_info.append(pinlabel) + from_string = ":".join(from_info) + + else: + from_string = "" + # html = [ + # row.replace(f"", from_string) + # for row in html + # ] + else: + code_left_1, code_left_2 = None, None + + if connection.to_pin is not None: # connect to right + to_connector = harness.connectors[connection.to_name] + to_pin_index = to_connector.pins.index(connection.to_pin) + to_port_str = f":p{to_pin_index+1}l" if to_connector.style != "simple" else "" + code_right_1 = f"{cable.name}:w{connection.via_port}:e" + code_right_2 = f"{connection.to_name}{to_port_str}:w" + # dot.edge(code_right_1, code_right_2) + if to_connector.show_name: + to_info = [str(connection.to_name), str(connection.to_pin)] + if to_connector.pinlabels: + pinlabel = to_connector.pinlabels[to_pin_index] + if pinlabel != "": + to_info.append(pinlabel) + to_string = ":".join(to_info) + else: + to_string = "" + # html = [ + # row.replace(f"", to_string) + # for row in html + # ] + else: + code_right_1, code_right_2 = None, None + + return color, code_left_1, code_left_2, code_right_1, code_right_2 + + def colored_cell(contents, bgcolor) -> Td: return Td(contents, bgcolor=translate_color(bgcolor, "HEX")) From efda8fa219a332a0a0666a20ae2570f7a5fbe1ee Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 19 Oct 2021 19:16:59 +0200 Subject: [PATCH 085/155] Make connecting things more object-oriented --- src/wireviz/DataClasses.py | 141 ++++++++++++++++++++++++++------- src/wireviz/Harness.py | 13 +++- src/wireviz/wv_gv_html.py | 154 ++++++++++++++++--------------------- 3 files changed, 189 insertions(+), 119 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index 7b238a3..c3c40fb 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -2,6 +2,7 @@ from dataclasses import InitVar, dataclass, field from enum import Enum, auto +from itertools import zip_longest from pathlib import Path from typing import Dict, List, Optional, Tuple, Union @@ -146,6 +147,42 @@ class Component: pass +@dataclass +class PinClass: + index: int + id: str + label: str + color: str + parent: str # designator of parent connector + + +@dataclass +class WireClass: + index: int + id: str + label: str + color: str + parent: str # designator of parent cable/bundle + # gauge: Gauge + # pn: str + # manufacturer: str + # mpn: str + # supplier: str + # spn: str + + +@dataclass +class ShieldClass(WireClass): + pass # TODO, for wires with multiple shields more shield details, ... + + +@dataclass +class Connection: + from_: PinClass = None + via: Union[WireClass, ShieldClass] = None + to: PinClass = None + + @dataclass class Connector(Component): name: Designator @@ -173,6 +210,7 @@ class Connector(Component): loops: List[List[Pin]] = field(default_factory=list) ignore_in_bom: bool = False additional_components: List[AdditionalComponent] = field(default_factory=list) + pin_objects: List[PinClass] = field(default_factory=list) @property def is_autogenerated(self): @@ -213,6 +251,23 @@ class Connector(Component): if len(self.pins) != len(set(self.pins)): raise Exception("Pins are not unique") + # all checks have passed + pin_tuples = zip_longest( + self.pins, + self.pinlabels, + self.pincolors, + ) + for pin_index, (pin_id, pin_label, pin_color) in enumerate(pin_tuples): + self.pin_objects.append( + PinClass( + index=pin_index, + id=pin_id, + label=pin_label, + color=pin_color, + parent=self.name, + ) + ) + if self.show_name is None: self.show_name = self.style != "simple" and not self.is_autogenerated @@ -231,6 +286,19 @@ class Connector(Component): if isinstance(item, dict): self.additional_components[i] = AdditionalComponent(**item) + def _check_if_unique_id(self, id): + results = [pin for pin in self.pin_objects if pin.id == id] + if len(results) == 0: + raise Exception(f"Pin ID {id} not found in {self.name}") + if len(results) > 1: + raise Exception(f"Pin ID {id} found more than once in {self.name}") + return True + + def get_pin_by_id(self, id): + if self._check_if_unique_id(id): + pin = [pin for pin in self.pin_objects if pin.id == id] + return pin[0] + def activate_pin(self, pin: Pin, side: Side) -> None: self.visible_pins[pin] = True if side == Side.LEFT: @@ -281,6 +349,8 @@ class Cable(Component): show_wirenumbers: Optional[bool] = None ignore_in_bom: bool = False additional_components: List[AdditionalComponent] = field(default_factory=list) + connections: List[Connection] = field(default_factory=list) + wire_objects: List[WireClass] = field(default_factory=list) @property def is_autogenerated(self): @@ -350,8 +420,6 @@ class Cable(Component): elif self.length_unit is None: self.length_unit = "m" - self.connections = [] - if self.wirecount: # number of wires explicitly defined if self.colors: # use custom color palette (partly or looped if needed) pass @@ -392,6 +460,36 @@ class Cable(Component): else: raise Exception("lists of part data are only supported for bundles") + # all checks have passed + wire_tuples = zip_longest( + # TODO: self.wire_ids + self.colors, + self.wirelabels, + ) + for wire_index, (wire_color, wire_label) in enumerate(wire_tuples): + self.wire_objects.append( + WireClass( + index=wire_index, # TODO: wire_id + id=wire_index + 1, # TODO: wire_id + label=wire_label, + color=wire_color, + parent=self.name, + ) + ) + + if self.shield: + index_offset = len(self.wire_objects) + # TODO: add support for multiple shields + self.wire_objects.append( + ShieldClass( + index=index_offset, + id="s", + label="Shield", + color=self.shield if isinstance(self.shield, str) else None, + parent=self.name, + ) + ) + if self.show_name is None: self.show_name = not self.is_autogenerated @@ -403,25 +501,19 @@ class Cable(Component): if isinstance(item, dict): self.additional_components[i] = AdditionalComponent(**item) - # The *_pin arguments accept a tuple, but it seems not in use with the current code. - def connect( - self, - from_name: Optional[Designator], - from_pin: NoneOrMorePinIndices, - via_wire: OneOrMoreWires, - to_name: Optional[Designator], - to_pin: NoneOrMorePinIndices, - ) -> None: + def get_wire_by_id(self, id): + wire = [wire for wire in self.wire_objects if wire.id == id] + if len(wire) == 0: + raise Exception(f"Wire ID {id} not found in {self.name}") + if len(wire) > 1: + raise Exception(f"Wire ID {id} found more than once in {self.name}") + return wire[0] - from_pin = int2tuple(from_pin) - via_wire = int2tuple(via_wire) - to_pin = int2tuple(to_pin) - if len(from_pin) != len(to_pin): - raise Exception("from_pin must have the same number of elements as to_pin") - for i, _ in enumerate(from_pin): - self.connections.append( - Connection(from_name, from_pin[i], via_wire[i], to_name, to_pin[i]) - ) + def connect( + self, from_pin_obj: [PinClass], via_wire_id: str, to_pin_obj: [PinClass] + ) -> None: + via_wire_obj = self.get_wire_by_id(via_wire_id) + self.connections.append(Connection(from_pin_obj, via_wire_obj, to_pin_obj)) def get_qty_multiplier(self, qty_multiplier: Optional[CableMultiplier]) -> float: if not qty_multiplier: @@ -440,15 +532,6 @@ class Cable(Component): ) -@dataclass -class Connection: - from_name: Optional[Designator] - from_pin: Optional[Pin] - via_port: Wire - to_name: Optional[Designator] - to_pin: Optional[Pin] - - @dataclass class MatePin: from_name: Designator diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 34b0802..7d7bdc9 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -140,7 +140,18 @@ class Harness: ) # list index starts at 0, wire IDs start at 1 # perform the actual connection - self.cables[via_name].connect(from_name, from_pin, via_wire, to_name, to_pin) + if from_name is not None: + from_con = self.connectors[from_name] + from_pin_obj = from_con.get_pin_by_id(from_pin) + else: + from_pin_obj = None + if to_name is not None: + to_con = self.connectors[to_name] + to_pin_obj = to_con.get_pin_by_id(to_pin) + else: + to_pin_obj = None + + self.cables[via_name].connect(from_pin_obj, via_wire, to_pin_obj) if from_name in self.connectors: self.connectors[from_name].activate_pin(from_pin, Side.RIGHT) if to_name in self.connectors: diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 8c70548..d3ac9fe 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -5,7 +5,16 @@ from itertools import zip_longest from typing import Any, List, Optional, Union from wireviz import APP_NAME, APP_URL, __version__ -from wireviz.DataClasses import Cable, Color, Component, Connector, Options +from wireviz.DataClasses import ( + Cable, + Color, + Component, + Connection, + Connector, + Options, + ShieldClass, + WireClass, +) from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_helper import pn_info_string, remove_links from wireviz.wv_table_util import * # TODO: explicitly import each needed tag later @@ -154,6 +163,7 @@ def gv_pin_table(component) -> Table: def gv_pin_row(pin_index, pin_name, pin_label, pin_color, connector) -> Tr: + # ports in GraphViz are 1-indexed for more natural maping to pin/wire numbers cell_pin_left = Td(pin_name, port=f"p{pin_index+1}l") cell_pin_label = Td(pin_label, delete_if_empty=True) cell_pin_right = Td(pin_name, port=f"p{pin_index+1}r") @@ -187,61 +197,56 @@ def gv_conductor_table(cable, harness_options) -> Table: rows = [] rows.append(Tr(Td(" "))) # spacer row on top - for i, (connection_color, wirelabel) in enumerate( - zip_longest(cable.colors, cable.wirelabels), 1 - ): + inserted_break_inbetween = False + for wire in cable.wire_objects: + + # insert blank space between wires and shields + if isinstance(wire, ShieldClass) and not inserted_break_inbetween: + rows.append(Tr(Td(" "))) # spacer row between wires and shields + inserted_break_inbetween = True # row above the wire wireinfo = [] - if cable.show_wirenumbers: - wireinfo.append(str(i)) - colorstr = translate_color(connection_color, harness_options.color_mode) - if colorstr: - wireinfo.append(colorstr) - if cable.wirelabels: - wireinfo.append(wirelabel if wirelabel is not None else "") + if cable.show_wirenumbers and not isinstance(wire, ShieldClass): + wireinfo.append(str(wire.id)) + wireinfo.append(translate_color(wire.color, harness_options.color_mode)) + wireinfo.append(wire.label) + + ins, outs = [], [] + for conn in cable.connections: + if conn.via.id == wire.id: + if conn.from_ is not None: + from_label = f":{conn.from_.label}" if conn.from_.label else "" + ins.append(f"{conn.from_.parent}:{conn.from_.id}{from_label}") + if conn.to is not None: + to_label = f":{conn.to.label}" if conn.to.label else "" + outs.append(f"{conn.to.parent}:{conn.to.id}{to_label}") cells_above = [ - Td(f""), - Td(":".join(wireinfo)), - Td(f""), + Td(", ".join(ins)), + Td(":".join([wi for wi in wireinfo if wi is not None])), + Td(", ".join(outs)), ] rows.append(Tr(cells_above)) # the wire itself - color_list = ( - ["#000000"] - + get_color_hex(connection_color, pad=harness_options._pad) - + ["#000000"] - ) - rows.append(Tr(gv_wire_cell(i, color_list))) + rows.append(Tr(gv_wire_cell(wire, padding=harness_options._pad))) # row below the wire # TODO: PN stuff for bundles # wire_pn_stuff() see below - if cable.shield: - rows.append(Tr(Td(" "))) # spacer between wires and shield - # row above the shield - cells_above = [ - Td(""), - Td("Shield"), - Td(""), - ] - rows.append(Tr(cells_above)) - # thw shield itself - if isinstance(cable.shield, str): - color_list = ["#000000"] + get_color_hex(cable.shield) + ["#000000"] - else: - color_list = ["#000000"] - rows.append(Tr(gv_wire_cell("s", color_list))) - rows.append(Tr(Td(" "))) # spacer row on bottom tbl = Table(rows, border=0, cellspacing=0, cellborder=0) return tbl -def gv_wire_cell(index, color_list) -> Td: +def gv_wire_cell(wire: Union[WireClass, ShieldClass], padding) -> Td: + if wire.color: + color_list = ["#000000"] + get_color_hex(wire.color, pad=padding) + ["#000000"] + else: + color_list = ["#000000"] + wire_inner_rows = [] for j, bgcolor in enumerate(color_list[::-1]): wire_inner_cell_attribs = { @@ -257,9 +262,10 @@ def gv_wire_cell(index, color_list) -> Td: "colspan": 3, "border": 0, "cellspacing": 0, - "port": f"w{index}", + "port": f"w{wire.index+1}", "height": 2 * len(color_list), } + # ports in GraphViz are 1-indexed for more natural maping to pin/wire numbers wire_outer_cell = Td(wire_inner_table, **wire_outer_cell_attribs) return wire_outer_cell @@ -308,69 +314,39 @@ def wire_pn_stuff(): def gv_edge_wire(harness, cable, connection) -> (str, str, str): - if isinstance(connection.via_port, int): + if connection.via.color: # check if it's an actual wire and not a shield - wire_color = get_color_hex( - cable.colors[connection.via_port - 1], pad=harness.options._pad - ) + wire_color = get_color_hex(connection.via.color, pad=harness.options._pad) color = ":".join(["#000000"] + wire_color + ["#000000"]) else: # it's a shield connection # shield is shown with specified color and black borders, or as a thin black wire otherwise - if isinstance(cable.shield, str): - shield_color_hex = get_color_hex(cable.shield)[0] + if connection.via.color: + shield_color_hex = get_color_hex(connection.via.color)[0] shield_color_str = ":".join(["#000000", shield_color_hex, "#000000"]) else: shield_color_str = "#000000" color = shield_color_str - if connection.from_pin is not None: # connect to left - from_connector = harness.connectors[connection.from_name] - from_pin_index = from_connector.pins.index(connection.from_pin) - from_port_str = ( - f":p{from_pin_index+1}r" if from_connector.style != "simple" else "" - ) - code_left_1 = f"{connection.from_name}{from_port_str}:e" - code_left_2 = f"{cable.name}:w{connection.via_port}:w" - # dot.edge(code_left_1, code_left_2) - if from_connector.show_name: - from_info = [ - str(connection.from_name), - str(connection.from_pin), - ] - if from_connector.pinlabels: - pinlabel = from_connector.pinlabels[from_pin_index] - if pinlabel != "": - from_info.append(pinlabel) - from_string = ":".join(from_info) - else: - from_string = "" - # html = [ - # row.replace(f"", from_string) - # for row in html - # ] + if connection.from_ is not None: # connect to left + from_port_str = ( + f":p{connection.from_.index+1}r" + if harness.connectors[connection.from_.parent].style != "simple" + else "" + ) + code_left_1 = f"{connection.from_.parent}{from_port_str}:e" + code_left_2 = f"{connection.via.parent}:w{connection.via.index+1}:w" + # ports in GraphViz are 1-indexed for more natural maping to pin/wire numbers else: code_left_1, code_left_2 = None, None - if connection.to_pin is not None: # connect to right - to_connector = harness.connectors[connection.to_name] - to_pin_index = to_connector.pins.index(connection.to_pin) - to_port_str = f":p{to_pin_index+1}l" if to_connector.style != "simple" else "" - code_right_1 = f"{cable.name}:w{connection.via_port}:e" - code_right_2 = f"{connection.to_name}{to_port_str}:w" - # dot.edge(code_right_1, code_right_2) - if to_connector.show_name: - to_info = [str(connection.to_name), str(connection.to_pin)] - if to_connector.pinlabels: - pinlabel = to_connector.pinlabels[to_pin_index] - if pinlabel != "": - to_info.append(pinlabel) - to_string = ":".join(to_info) - else: - to_string = "" - # html = [ - # row.replace(f"", to_string) - # for row in html - # ] + if connection.to is not None: # connect to right + to_port_str = ( + f":p{connection.to.index+1}l" + if harness.connectors[connection.from_.parent].style != "simple" + else "" + ) + code_right_1 = f"{connection.via.parent}:w{connection.via.index+1}:e" + code_right_2 = f"{connection.to.parent}{to_port_str}:w" else: code_right_1, code_right_2 = None, None From 12275865096634f160354a7a46fe2285b562fe53 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 19 Oct 2021 19:40:36 +0200 Subject: [PATCH 086/155] Alphabetize HTML tags, improve bgcolor rendering --- src/wireviz/Harness.py | 16 ++++++-------- src/wireviz/wv_gv_html.py | 45 ++++++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 7d7bdc9..06f6f9d 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -39,6 +39,7 @@ from wireviz.wv_gv_html import ( gv_node_component, html_line_breaks, remove_links, + calculate_node_bgcolor, set_dot_basics, ) from wireviz.wv_helper import ( @@ -164,8 +165,9 @@ class Harness: for connector in self.connectors.values(): # generate connector node gv_html = gv_node_component(connector, self.options) + bgcolor = calculate_node_bgcolor(connector, self.options) dot.node( - connector.name, label=f"<\n{gv_html}\n>", shape="box", style="filled" + connector.name, label=f"<\n{gv_html}\n>", bgcolor=bgcolor, shape="box", style="filled" ) # generate edges for connector loops if len(connector.loops) > 0: @@ -188,10 +190,9 @@ class Harness: # generate cable node # TODO: PN info for bundles (per wire) gv_html = gv_node_component(cable, self.options) - dot.node(cable.name, label=f"<\n{gv_html}\n>", shape="box") - # style=style, - # fillcolor=translate_color(bgcolor, "HEX"), - # generate edges for wires in cable + bgcolor = calculate_node_bgcolor(cable, self.options) + style = "filled,dashed" if cable.category == "bundle" else "filled" + dot.node(cable.name, label=f"<\n{gv_html}\n>", bgcolor=bgcolor, shape="box", style=style) for connection in cable.connections: color, l1, l2, r1, r2 = gv_edge_wire(self, cable, connection) dot.attr("edge", color=color) @@ -200,11 +201,6 @@ class Harness: if not (r1, r2) == (None, None): dot.edge(r1, r2) - style, bgcolor = ( - ("filled,dashed", self.options.bgcolor_bundle) - if cable.category == "bundle" - else ("filled", self.options.bgcolor_cable) - ) apply_dot_tweaks(dot, self.tweak) diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index d3ac9fe..4d6b2ac 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -86,18 +86,24 @@ def gv_node_component( line_notes, ] - if component.bgcolor: - tbl_bgcolor = translate_color(component.bgcolor, "HEX") - elif isinstance(component, Connector) and harness_options.bgcolor_connector: - tbl_bgcolor = translate_color(harness_options.bgcolor_connector, "HEX") - elif isinstance(component, Cable) and harness_options.bgcolor_cable: - tbl_bgcolor = translate_color(harness_options.bgcolor_cable, "HEX") - tbl = nested_table(lines) - tbl.update_attribs(bgcolor=tbl_bgcolor) + return tbl +def calculate_node_bgcolor(component, harness_options): + # assign component node bgcolor at the GraphViz node level + # instead of at the HTML table level for better rendering of node outline + if component.bgcolor: + return translate_color(component.bgcolor, "HEX") + elif isinstance(component, Connector) and harness_options.bgcolor_connector: + return translate_color(harness_options.bgcolor_connector, "HEX") + elif isinstance(component, Cable) and component.category == "bundle" and harness_options.bgcolor_bundle: + return translate_color(harness_options.bgcolor_bundle, "HEX") + elif isinstance(component, Cable) and harness_options.bgcolor_cable: + return translate_color(harness_options.bgcolor_cable, "HEX") + + def make_list_of_cells(inp) -> List[Td]: # inp may be List, if isinstance(inp, List): @@ -135,7 +141,7 @@ def nested_table(lines: List[Td]) -> Table: else: # nest cell content inside a table inner_table = Table( - Tr(cells), border=0, cellspacing=0, cellpadding=3, cellborder=1 + Tr(cells), border=0, cellborder=1, cellpadding=3, cellspacing=0 ) rows.append(Tr(Td(inner_table))) @@ -158,7 +164,7 @@ def gv_pin_table(component) -> Table: pin_rows.append( gv_pin_row(pinindex, pinname, pinlabel, pincolor, component) ) - tbl = Table(pin_rows, border=0, cellspacing=0, cellpadding=3, cellborder=1) + tbl = Table(pin_rows, border=0, cellborder=1, cellpadding=3, cellspacing=0) return tbl @@ -237,7 +243,7 @@ def gv_conductor_table(cable, harness_options) -> Table: # wire_pn_stuff() see below rows.append(Tr(Td(" "))) # spacer row on bottom - tbl = Table(rows, border=0, cellspacing=0, cellborder=0) + tbl = Table(rows, border=0, cellborder=0, cellspacing=0) return tbl @@ -250,20 +256,21 @@ def gv_wire_cell(wire: Union[WireClass, ShieldClass], padding) -> Td: wire_inner_rows = [] for j, bgcolor in enumerate(color_list[::-1]): wire_inner_cell_attribs = { - "colspan": 3, - "cellpadding": 0, - "height": 2, - "border": 0, "bgcolor": bgcolor if bgcolor != "" else "BK", + "border": 0, + "cellpadding": 0, + "colspan": 3, + "height": 2, } wire_inner_rows.append(Tr(Td("", **wire_inner_cell_attribs))) - wire_inner_table = Table(wire_inner_rows, cellspacing=0, cellborder=0, border=0) + wire_inner_table = Table(wire_inner_rows, border=0, cellborder=0, cellspacing=0) wire_outer_cell_attribs = { - "colspan": 3, "border": 0, "cellspacing": 0, - "port": f"w{wire.index+1}", + "cellpadding": 0, + "colspan": 3, "height": 2 * len(color_list), + "port": f"w{wire.index+1}", } # ports in GraphViz are 1-indexed for more natural maping to pin/wire numbers wire_outer_cell = Td(wire_inner_table, **wire_outer_cell_attribs) @@ -386,7 +393,7 @@ def image_and_caption_cells(component: Component) -> (Td, Td): # further nest the image in a table with width/height/fixedsize parameters, and place that table in a cell image_cell_inner.update_attribs(**html_size_attr_dict(component.image)) image_cell = Td( - Table(Tr(image_cell_inner), border=0, cellspacing=0, cellborder=0, id="!") + Table(Tr(image_cell_inner), border=0, cellborder=0, cellspacing=0, id="!") ) else: image_cell = image_cell_inner From 974e9a4abd8c488c3f88b1d4c7e0499f7aa0fb79 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 19 Oct 2021 21:44:08 +0200 Subject: [PATCH 087/155] Make mates object-oriented --- src/wireviz/DataClasses.py | 34 ++++++++++++---- src/wireviz/Harness.py | 83 +++++++++++++++----------------------- src/wireviz/wv_gv_html.py | 75 +++++++++++++++++++++++++++++----- 3 files changed, 123 insertions(+), 69 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index c3c40fb..f10eead 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -42,10 +42,18 @@ MetadataKeys = PlainText # Literal['title', 'description', 'notes', ...] Side = Enum("Side", "LEFT RIGHT") +ArrowDirection = Enum("ArrowDirection", "NONE BACK FORWARD BOTH") +ArrowWeight = Enum("ArrowWeight", "SINGLE DOUBLE") AUTOGENERATED_PREFIX = "AUTOGENERATED_" +@dataclass +class Arrow: + direction: ArrowDirection + weight: ArrowWeight + + class Metadata(dict): pass @@ -154,6 +162,16 @@ class PinClass: label: str color: str parent: str # designator of parent connector + _anonymous: bool = False # true for pins on autogenerated connectors + _simple: bool = False # true for simple connector + + def __str__(self): + snippets = [ # use str() for each in case they are int or other non-str + str(self.parent) if not self._anonymous else "", + str(self.id) if not self._anonymous and not self._simple else "", + str(self.label) if self.label else "", + ] + return ":".join([snip for snip in snippets if snip != ""]) @dataclass @@ -265,6 +283,8 @@ class Connector(Component): label=pin_label, color=pin_color, parent=self.name, + _anonymous=self.is_autogenerated, + _simple=self.style == "simple", ) ) @@ -534,15 +554,13 @@ class Cable(Component): @dataclass class MatePin: - from_name: Designator - from_pin: Pin - to_name: Designator - to_pin: Pin - shape: str + from_: PinClass + to: PinClass + arrow: Arrow @dataclass class MateComponent: - from_name: Designator - to_name: Designator - shape: str + from_: str # Designator + to: str # Designator + arrow: Arrow diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 06f6f9d..d084fed 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -11,6 +11,9 @@ from graphviz import Graph from wireviz import APP_NAME, APP_URL, __version__, wv_colors from wireviz.DataClasses import ( + Arrow, + ArrowDirection, + ArrowWeight, Cable, Connector, MateComponent, @@ -34,12 +37,14 @@ from wireviz.wv_bom import ( from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_gv_html import ( apply_dot_tweaks, + calculate_node_bgcolor, gv_connector_loops, + gv_edge_mate, gv_edge_wire, gv_node_component, html_line_breaks, + parse_arrow_str, remove_links, - calculate_node_bgcolor, set_dot_basics, ) from wireviz.wv_helper import ( @@ -71,13 +76,20 @@ class Harness: def add_cable(self, name: str, *args, **kwargs) -> None: self.cables[name] = Cable(name, *args, **kwargs) - def add_mate_pin(self, from_name, from_pin, to_name, to_pin, arrow_type) -> None: - self.mates.append(MatePin(from_name, from_pin, to_name, to_pin, arrow_type)) + def add_mate_pin(self, from_name, from_pin, to_name, to_pin, arrow_str) -> None: + from_con = self.connectors[from_name] + from_pin_obj = from_con.get_pin_by_id(from_pin) + to_con = self.connectors[to_name] + to_pin_obj = to_con.get_pin_by_id(to_pin) + arrow = Arrow(direction=parse_arrow_str(arrow_str), weight=ArrowWeight.SINGLE) + + self.mates.append(MatePin(from_pin_obj, to_pin_obj, arrow)) self.connectors[from_name].activate_pin(from_pin, Side.RIGHT) self.connectors[to_name].activate_pin(to_pin, Side.LEFT) - def add_mate_component(self, from_name, to_name, arrow_type) -> None: - self.mates.append(MateComponent(from_name, to_name, arrow_type)) + def add_mate_component(self, from_name, to_name, arrow_str) -> None: + arrow = Arrow(direction=parse_arrow_str(arrow_str), weight=ArrowWeight.SINGLE) + self.mates.append(MateComponent(from_name, to_name, arrow)) def add_bom_item(self, item: dict) -> None: self.additional_bom_items.append(item) @@ -167,7 +179,11 @@ class Harness: gv_html = gv_node_component(connector, self.options) bgcolor = calculate_node_bgcolor(connector, self.options) dot.node( - connector.name, label=f"<\n{gv_html}\n>", bgcolor=bgcolor, shape="box", style="filled" + connector.name, + label=f"<\n{gv_html}\n>", + bgcolor=bgcolor, + shape="box", + style="filled", ) # generate edges for connector loops if len(connector.loops) > 0: @@ -192,7 +208,15 @@ class Harness: gv_html = gv_node_component(cable, self.options) bgcolor = calculate_node_bgcolor(cable, self.options) style = "filled,dashed" if cable.category == "bundle" else "filled" - dot.node(cable.name, label=f"<\n{gv_html}\n>", bgcolor=bgcolor, shape="box", style=style) + dot.node( + cable.name, + label=f"<\n{gv_html}\n>", + bgcolor=bgcolor, + shape="box", + style=style, + ) + + # generate wire edges between component nodes and cable nodes for connection in cable.connections: color, l1, l2, r1, r2 = gv_edge_wire(self, cable, connection) dot.attr("edge", color=color) @@ -201,53 +225,10 @@ class Harness: if not (r1, r2) == (None, None): dot.edge(r1, r2) - apply_dot_tweaks(dot, self.tweak) for mate in self.mates: - if mate.shape[0] == "<" and mate.shape[-1] == ">": - dir = "both" - elif mate.shape[0] == "<": - dir = "back" - elif mate.shape[-1] == ">": - dir = "forward" - else: - dir = "none" - - if isinstance(mate, MatePin): - color = "#000000" - elif isinstance(mate, MateComponent): - color = "#000000:#000000" - else: - raise Exception(f"{mate} is an unknown mate") - - from_connector = self.connectors[mate.from_name] - if ( - isinstance(mate, MatePin) - and self.connectors[mate.from_name].style != "simple" - ): - from_pin_index = from_connector.pins.index(mate.from_pin) - from_port_str = f":p{from_pin_index+1}r" - else: # MateComponent or style == 'simple' - from_port_str = "" - - to_connector = self.connectors[mate.to_name] - if ( - isinstance(mate, MatePin) - and self.connectors[mate.to_name].style != "simple" - ): - to_pin_index = to_connector.pins.index(mate.to_pin) - to_port_str = ( - f":p{to_pin_index+1}l" - if isinstance(mate, MatePin) - and self.connectors[mate.to_name].style != "simple" - else "" - ) - else: # MateComponent or style == 'simple' - to_port_str = "" - code_from = f"{mate.from_name}{from_port_str}:e" - to_connector = self.connectors[mate.to_name] - code_to = f"{mate.to_name}{to_port_str}:w" + color, dir, code_from, code_to = gv_edge_mate(mate) dot.attr("edge", color=color, style="dashed", dir=dir) dot.edge(code_from, code_to) diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 4d6b2ac..68c9301 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -6,11 +6,16 @@ from typing import Any, List, Optional, Union from wireviz import APP_NAME, APP_URL, __version__ from wireviz.DataClasses import ( + Arrow, + ArrowDirection, + ArrowWeight, Cable, Color, Component, Connection, Connector, + MateComponent, + MatePin, Options, ShieldClass, WireClass, @@ -41,9 +46,16 @@ def gv_node_component( line_pn = part_number_str_list(component) + is_simple_connector = ( + isinstance(component, Connector) and component.style == "simple" + ) + if isinstance(component, Connector): line_info = [ - html_line_breaks(component.type), + Td( + html_line_breaks(component.type), + port="p1l" if is_simple_connector else None, + ), html_line_breaks(component.subtype), f"{component.pincount}-pin" if component.show_pincount else None, translate_color(component.color, harness_options.color_mode), @@ -87,6 +99,7 @@ def gv_node_component( ] tbl = nested_table(lines) + tbl.update_attribs(port="p1r" if is_simple_connector else None) return tbl @@ -98,7 +111,11 @@ def calculate_node_bgcolor(component, harness_options): return translate_color(component.bgcolor, "HEX") elif isinstance(component, Connector) and harness_options.bgcolor_connector: return translate_color(harness_options.bgcolor_connector, "HEX") - elif isinstance(component, Cable) and component.category == "bundle" and harness_options.bgcolor_bundle: + elif ( + isinstance(component, Cable) + and component.category == "bundle" + and harness_options.bgcolor_bundle + ): return translate_color(harness_options.bgcolor_bundle, "HEX") elif isinstance(component, Cable) and harness_options.bgcolor_cable: return translate_color(harness_options.bgcolor_cable, "HEX") @@ -222,16 +239,14 @@ def gv_conductor_table(cable, harness_options) -> Table: for conn in cable.connections: if conn.via.id == wire.id: if conn.from_ is not None: - from_label = f":{conn.from_.label}" if conn.from_.label else "" - ins.append(f"{conn.from_.parent}:{conn.from_.id}{from_label}") + ins.append(str(conn.from_)) if conn.to is not None: - to_label = f":{conn.to.label}" if conn.to.label else "" - outs.append(f"{conn.to.parent}:{conn.to.id}{to_label}") + outs.append(str(conn.to)) cells_above = [ - Td(", ".join(ins)), - Td(":".join([wi for wi in wireinfo if wi is not None])), - Td(", ".join(outs)), + Td(", ".join(ins), align="left"), + Td(":".join([wi for wi in wireinfo if wi is not None and wi != ""])), + Td(", ".join(outs), align="right"), ] rows.append(Tr(cells_above)) @@ -349,7 +364,7 @@ def gv_edge_wire(harness, cable, connection) -> (str, str, str): if connection.to is not None: # connect to right to_port_str = ( f":p{connection.to.index+1}l" - if harness.connectors[connection.from_.parent].style != "simple" + if harness.connectors[connection.to.parent].style != "simple" else "" ) code_right_1 = f"{connection.via.parent}:w{connection.via.index+1}:e" @@ -360,6 +375,46 @@ def gv_edge_wire(harness, cable, connection) -> (str, str, str): return color, code_left_1, code_left_2, code_right_1, code_right_2 +def parse_arrow_str(inp: str) -> ArrowDirection: + if inp[0] == "<" and inp[-1] == ">": + return ArrowDirection.BOTH + elif inp[0] == "<": + return ArrowDirection.BACK + elif inp[-1] == ">": + return ArrowDirection.FORWARD + else: + return ArrowDirection.NONE + + +def gv_edge_mate(mate) -> (str, str, str, str): + if mate.arrow.weight == ArrowWeight.SINGLE: + color = "#000000" + elif mate.arrow.weight == ArrowWeight.DOUBLE: + color = "#000000:#000000" + + dir = mate.arrow.direction.name.lower() + + if isinstance(mate, MatePin): + from_pin_index = mate.from_.index + from_port_str = f":p{from_pin_index+1}r" + from_designator = mate.from_.parent + to_pin_index = mate.to.index + to_port_str = f":p{to_pin_index+1}l" + to_designator = mate.to.parent + elif isinstance(mate, MateComponent): + from_designator = mate.from_ + from_port_str = "" + to_designator = mate.to + to_port_str = "" + else: + raise Exception(f"Unknown type of mate:\n{mate}") + + code_from = f"{from_designator}{from_port_str}:e" + code_to = f"{to_designator}{to_port_str}:w" + + return color, dir, code_from, code_to + + def colored_cell(contents, bgcolor) -> Td: return Td(contents, bgcolor=translate_color(bgcolor, "HEX")) From 585db0ebd861fdb28e56cfb283c0e6cd7f97194d Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 19 Oct 2021 21:44:14 +0200 Subject: [PATCH 088/155] Add `devtools.txt` --- devtools.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 devtools.txt diff --git a/devtools.txt b/devtools.txt new file mode 100644 index 0000000..5343d7a --- /dev/null +++ b/devtools.txt @@ -0,0 +1,11 @@ +# The following tools have proven useful during development +# Feel free to install while inside the WireViz virtualenv, using: +# pip install -r devtools.txt + +# Code formatting +black +isort + +# Development aids +pudb # visual python debugger +autoflake # to be tested From 539e9e38696d385eaa3e73381b17cb58a290cd10 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 19 Oct 2021 21:46:43 +0200 Subject: [PATCH 089/155] Run `autoflake -i` --- src/wireviz/DataClasses.py | 5 ++--- src/wireviz/Harness.py | 3 --- src/wireviz/wv_gv_html.py | 2 +- src/wireviz/wv_helper.py | 2 +- src/wireviz/wv_table_util.py | 2 +- 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index f10eead..2696cf7 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -1,9 +1,8 @@ # -*- coding: utf-8 -*- -from dataclasses import InitVar, dataclass, field -from enum import Enum, auto +from dataclasses import dataclass, field +from enum import Enum from itertools import zip_longest -from pathlib import Path from typing import Dict, List, Optional, Tuple, Union from wireviz.wv_colors import COLOR_CODES, Color, ColorMode, Colors, ColorScheme diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index d084fed..e5dc1da 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -1,11 +1,8 @@ # -*- coding: utf-8 -*- -import re -from collections import Counter from dataclasses import dataclass from itertools import zip_longest from pathlib import Path -from typing import Any, List, Union from graphviz import Graph diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 68c9301..e31cf5f 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -2,7 +2,7 @@ import re from itertools import zip_longest -from typing import Any, List, Optional, Union +from typing import Any, List, Union from wireviz import APP_NAME, APP_URL, __version__ from wireviz.DataClasses import ( diff --git a/src/wireviz/wv_helper.py b/src/wireviz/wv_helper.py index 8c46299..fdc1e7a 100644 --- a/src/wireviz/wv_helper.py +++ b/src/wireviz/wv_helper.py @@ -2,7 +2,7 @@ import re from pathlib import Path -from typing import Dict, List, Optional +from typing import List, Optional awg_equiv_table = { "0.09": "28", diff --git a/src/wireviz/wv_table_util.py b/src/wireviz/wv_table_util.py index 6de208c..1c4b750 100644 --- a/src/wireviz/wv_table_util.py +++ b/src/wireviz/wv_table_util.py @@ -2,7 +2,7 @@ from collections.abc import Iterable from dataclasses import dataclass, field -from typing import Dict, List, Optional +from typing import Dict indent_count = 1 From d4fc17408b4d836509e656107f344ed7c13b625f Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 19 Oct 2021 21:47:40 +0200 Subject: [PATCH 090/155] Run `autoflake -i --remove-all-unused-imports` --- src/wireviz/DataClasses.py | 2 +- src/wireviz/Harness.py | 15 --------------- src/wireviz/wv_gv_html.py | 5 +---- 3 files changed, 2 insertions(+), 20 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index 2696cf7..d1054f4 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -6,7 +6,7 @@ from itertools import zip_longest from typing import Dict, List, Optional, Tuple, Union from wireviz.wv_colors import COLOR_CODES, Color, ColorMode, Colors, ColorScheme -from wireviz.wv_helper import aspect_ratio, awg_equiv, int2tuple, mm2_equiv +from wireviz.wv_helper import aspect_ratio, awg_equiv, mm2_equiv # Each type alias have their legal values described in comments - validation might be implemented in the future PlainText = str # Text not containing HTML tags nor newlines diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index e5dc1da..46063d0 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -1,15 +1,12 @@ # -*- coding: utf-8 -*- from dataclasses import dataclass -from itertools import zip_longest from pathlib import Path from graphviz import Graph -from wireviz import APP_NAME, APP_URL, __version__, wv_colors from wireviz.DataClasses import ( Arrow, - ArrowDirection, ArrowWeight, Cable, Connector, @@ -22,16 +19,9 @@ from wireviz.DataClasses import ( ) from wireviz.svgembed import embed_svg_images_file from wireviz.wv_bom import ( - HEADER_MPN, - HEADER_PN, - HEADER_SPN, bom_list, - component_table_entry, generate_bom, - get_additional_component_table, - pn_info_string, ) -from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_gv_html import ( apply_dot_tweaks, calculate_node_bgcolor, @@ -39,15 +29,10 @@ from wireviz.wv_gv_html import ( gv_edge_mate, gv_edge_wire, gv_node_component, - html_line_breaks, parse_arrow_str, - remove_links, set_dot_basics, ) from wireviz.wv_helper import ( - flatten2d, - is_arrow, - open_file_read, open_file_write, tuplelist2tsv, ) diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index e31cf5f..016f362 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -6,13 +6,10 @@ from typing import Any, List, Union from wireviz import APP_NAME, APP_URL, __version__ from wireviz.DataClasses import ( - Arrow, ArrowDirection, ArrowWeight, Cable, - Color, Component, - Connection, Connector, MateComponent, MatePin, @@ -470,7 +467,7 @@ def image_and_caption_cells(component: Component) -> (Td, Td): def html_size_attr_dict(image): # Return Graphviz HTML attributes to specify minimum or fixed size of a TABLE or TD object - from wireviz.DataClasses import Image + pass attr_dict = {} if image: From 194f1345604a0cb70555fb2771486adf0ffb968e Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 19 Oct 2021 21:49:31 +0200 Subject: [PATCH 091/155] Add sample use to `devtools.txt` --- devtools.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/devtools.txt b/devtools.txt index 5343d7a..7d11556 100644 --- a/devtools.txt +++ b/devtools.txt @@ -3,9 +3,9 @@ # pip install -r devtools.txt # Code formatting -black -isort +black # black src/wireviz/*.py +isort # isort src/wireviz/*py # Development aids -pudb # visual python debugger -autoflake # to be tested +pudb # import pudb; pudb.set_trace() +autoflake # autoflake -i --remove-all-unused-imports src/wireviz/*.py From 7f29c0a403129adc1e4b34a03fd2aad1f9c703c2 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 19 Oct 2021 22:48:30 +0200 Subject: [PATCH 092/155] Streamline assignment of ports to simple connectors --- src/wireviz/Harness.py | 10 ++-------- src/wireviz/wv_gv_html.py | 14 +++++++++----- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 46063d0..8c6572f 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -18,10 +18,7 @@ from wireviz.DataClasses import ( Tweak, ) from wireviz.svgembed import embed_svg_images_file -from wireviz.wv_bom import ( - bom_list, - generate_bom, -) +from wireviz.wv_bom import bom_list, generate_bom from wireviz.wv_gv_html import ( apply_dot_tweaks, calculate_node_bgcolor, @@ -32,10 +29,7 @@ from wireviz.wv_gv_html import ( parse_arrow_str, set_dot_basics, ) -from wireviz.wv_helper import ( - open_file_write, - tuplelist2tsv, -) +from wireviz.wv_helper import open_file_write, tuplelist2tsv from wireviz.wv_html import generate_html_output diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 016f362..0daaf1d 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -49,10 +49,7 @@ def gv_node_component( if isinstance(component, Connector): line_info = [ - Td( - html_line_breaks(component.type), - port="p1l" if is_simple_connector else None, - ), + html_line_breaks(component.type), html_line_breaks(component.subtype), f"{component.pincount}-pin" if component.show_pincount else None, translate_color(component.color, harness_options.color_mode), @@ -96,7 +93,14 @@ def gv_node_component( ] tbl = nested_table(lines) - tbl.update_attribs(port="p1r" if is_simple_connector else None) + if is_simple_connector: + # Simple connectors have no pin table, and therefore, no ports to attach wires to. + # Manually assign left and right ports here if required. + # Use table itself for right port, and the first cell for left port. + # Even if the table only has one cell, two separate ports can still be assigned. + tbl.update_attribs(port="p1r") + first_cell_in_tbl = tbl.contents[0].contents + first_cell_in_tbl.update_attribs(port="p1l") return tbl From 8adf8b0ba2173406919fbf4a0bbcb41beb141702 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 19 Oct 2021 23:05:38 +0200 Subject: [PATCH 093/155] Add `cleanup.sh` (maybe move/delete later? or add commit hook?) --- cleanup.sh | 5 +++++ 1 file changed, 5 insertions(+) create mode 100755 cleanup.sh diff --git a/cleanup.sh b/cleanup.sh new file mode 100755 index 0000000..9c774be --- /dev/null +++ b/cleanup.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +autoflake -i --remove-all-unused-imports src/wireviz/*.py +isort src/wireviz/*py +black src/wireviz/*.py From c23430e4a2869465a2c7c434419dd237865d5027 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Wed, 20 Oct 2021 03:51:37 +0200 Subject: [PATCH 094/155] Implement color objects --- src/wireviz/wv_colors_new.py | 199 +++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 src/wireviz/wv_colors_new.py diff --git a/src/wireviz/wv_colors_new.py b/src/wireviz/wv_colors_new.py new file mode 100644 index 0000000..24fdee9 --- /dev/null +++ b/src/wireviz/wv_colors_new.py @@ -0,0 +1,199 @@ +# -*- coding: utf-8 -*- + +from collections import namedtuple +from dataclasses import dataclass, field +from enum import Enum +from typing import List + +KnownColor = namedtuple("KnownColor", "html code_de full_en full_de") +ColorOutputMode = Enum("ColorOutputMode", "EN_LOWER EN_UPPER DE_LOWER DE_UPPER HTML_LOWER HTML_UPPER") + +known_colors = { + "BK": KnownColor("#000000", "sw", "black", "schwarz"), + "WH": KnownColor("#ffffff", "ws", "white", "weiß"), + "GY": KnownColor("#999999", "gr", "grey", "grau"), + "PK": KnownColor("#ff66cc", "rs", "pink", "rosa"), + "RD": KnownColor("#ff0000", "rt", "red", "rot"), + "OG": KnownColor("#ff8000", "or", "orange", "orange"), + "YE": KnownColor("#ffff00", "ge", "yellow", "gelb"), + "OL": KnownColor("#708000", "ol", "olive green", "olivgrün"), + "GN": KnownColor("#00ff00", "gn", "green", "grün"), + "TQ": KnownColor("#00ffff", "tk", "turquoise", "türkis"), + "LB": KnownColor("#a0dfff", "hb", "light blue", "hellblau"), + "BU": KnownColor("#0066ff", "bl", "blue", "blau"), + "VT": KnownColor("#8000ff", "vi", "violet", "violett"), + "BN": KnownColor("#895956", "br", "brown", "braun"), + "BG": KnownColor("#ceb673", "bg", "beige", "beige"), + "IV": KnownColor("#f5f0d0", "eb", "ivory", "elfenbein"), + "SL": KnownColor("#708090", "si", "slate", "schiefer"), + "CU": KnownColor("#d6775e", "ku", "copper", "Kupfer"), + "SN": KnownColor("#aaaaaa", "vz", "tin", "verzinkt"), + "SR": KnownColor("#84878c", "ag", "silver", "Silber"), + "GD": KnownColor("#ffcf80", "au", "gold", "Gold"), +} + +color_output_mode = ColorOutputMode.EN_UPPER +padding_amount = 1 + +def convert_case(inp): + if "_LOWER" in color_output_mode.name: + return inp.lower() + elif "_UPPER" in color_output_mode.name: + return inp.upper() + else: # currently not used + return inp + +@dataclass +class SingleColor(): + _code_en: str + _code_de: str + _html: str + + @property + def code_en(self): + return convert_case(self._code_en) + # repeat for _code_de, _html + + @property + def code_de(self): + return convert_case(self._code_de) + # repeat for _code_de, _html + + @property + def html(self): + return convert_case(self._html) + # repeat for _code_de, _html + + @property + def known(self): + return self.code_en.upper() in known_colors.keys() + + def __init__(self, inp): + if isinstance(inp, int): + hex_str = f"#{inp:06x}" + self._html = hex_str + self._code_en = hex_str # do not perform reverse lookup + self._code_de = hex_str + elif inp.upper() in known_colors.keys(): + inp_upper = inp.upper() + self._code_en = inp_upper + self._code_de = known_colors[inp_upper].code_de + self._html = known_colors[inp_upper].html + else: # assume valid HTML color + self._html = inp + self._code_en = inp + self._code_de = inp + + @property + def html_padded(self): + return ":".join([self.html] * padding_amount) + + def __str__(self): + if self.known and "EN_" in color_output_mode.name: + return self.code_en + elif self.known and "DE_" in color_output_mode.name: + return self.code_de + else: + return self.html + +@dataclass +class MultiColor(): + colors: List[SingleColor] = field(default_factory=list) + + def __init__(self, inp): + self.colors = [] + if isinstance(inp, List): # input is already a list + for item in inp: + if isinstance(item, SingleColor): + self.colors.append(item) + else: # string + self.colors.append(SingleColor(item)) + elif isinstance(inp, SingleColor): # single color + self.colors = [inp] + else: # split input into list + if ":" in str(inp): + self.colors = [SingleColor(item) for item in inp.split(":")] + else: + if isinstance(inp, int): + self.colors = [SingleColor(inp)] + elif len(inp) % 2 == 0: + items = [inp[i:i+2] for i in range(0, len(inp), 2)] + known = [item.upper() in known_colors.keys() for item in items] + if all(known): + self.colors = [SingleColor(item) for item in items] + else: # assume it's a HTML color name + self.colors = [SingleColor(inp)] + else: # assume it's a HTML color name + self.colors = [SingleColor(inp)] + + + def __len__(self): + return len(self.colors) + + def __str__(self): + if "EN_" in color_output_mode.name or "DE_" in color_output_mode.name: + joiner = "" if self.all_known else ":" + elif "HTML_" in color_output_mode.name: + joiner = ":" + else: + joiner = "???" + return joiner.join([str(color) for color in self.colors]) + + @property + def all_known(self): + return all([color.known for color in self.colors]) + + @property + def html(self): + return ":".join([color.html for color in self.colors]) + + @property + def html_padded(self): + if len(self) == 0: + out = [] + elif len(self) == 1: + out = [self.colors[0] for i in range(3)] + elif len(self) == 2: + out = [self.colors[0], self.colors[1], self.colors[0]] + elif len(self) == 3: + out = self.colors + else: + raise Exception(f"Padding not supported for len {len(selfq)}") + return ":".join([str(color) for color in out]) + +COLOR_CODES = { + # fmt: off + "DIN": [ + "WH", "BN", "GN", "YE", "GY", "PK", "BU", "RD", "BK", "VT", "GYPK", "RDBU", + "WHGN", "BNGN", "WHYE", "YEBN", "WHGY", "GYBN", "WHPK", "PKBN", "WHBU", "BNBU", + "WHRD", "BNRD", "WHBK", "BNBK", "GYGN", "YEGY", "PKGN", "YEPK", "GNBU", "YEBU", + "GNRD", "YERD", "GNBK", "YEBK", "GYBU", "PKBU", "GYRD", "PKRD", "GYBK", "PKBK", + "BUBK", "RDBK", "WHBNBK", "YEGNBK", "GYPKBK", "RDBUBK", "WHGNBK", "BNGNBK", + "WHYEBK", "YEBNBK", "WHGYBK", "GYBNBK", "WHPKBK", "PKBNBK", "WHBUBK", + "BNBUBK", "WHRDBK", "BNRDBK", + ], + # fmt: on + "IEC": ["BN", "RD", "OG", "YE", "GN", "BU", "VT", "GY", "WH", "BK"], + "BW": ["BK", "WH"], + # 25-pair color code - see also https://en.wikipedia.org/wiki/25-pair_color_code + # 5 major colors (WH,RD,BK,YE,VT) combined with 5 minor colors (BU,OG,GN,BN,SL). + # Each POTS pair tip (+) had major/minor color, and ring (-) had minor/major color. + # fmt: off + "TEL": [ # 25x2: Ring and then tip of each pair + "BUWH", "WHBU", "OGWH", "WHOG", "GNWH", "WHGN", "BNWH", "WHBN", "SLWH", "WHSL", + "BURD", "RDBU", "OGRD", "RDOG", "GNRD", "RDGN", "BNRD", "RDBN", "SLRD", "RDSL", + "BUBK", "BKBU", "OGBK", "BKOG", "GNBK", "BKGN", "BNBK", "BKBN", "SLBK", "BKSL", + "BUYE", "YEBU", "OGYE", "YEOG", "GNYE", "YEGN", "BNYE", "YEBN", "SLYE", "YESL", + "BUVT", "VTBU", "OGVT", "VTOG", "GNVT", "VTGN", "BNVT", "VTBN", "SLVT", "VTSL", + ], + "TELALT": [ # 25x2: Tip and then ring of each pair + "WHBU", "BU", "WHOG", "OG", "WHGN", "GN", "WHBN", "BN", "WHSL", "SL", + "RDBU", "BURD", "RDOG", "OGRD", "RDGN", "GNRD", "RDBN", "BNRD", "RDSL", "SLRD", + "BKBU", "BUBK", "BKOG", "OGBK", "BKGN", "GNBK", "BKBN", "BNBK", "BKSL", "SLBK", + "YEBU", "BUYE", "YEOG", "OGYE", "YEGN", "GNYE", "YEBN", "BNYE", "YESL", "SLYE", + "VTBU", "BUVT", "VTOG", "OGVT", "VTGN", "GNVT", "VTBN", "BNVT", "VTSL", "SLVT", + ], + # fmt: on + "T568A": ["WHGN", "GN", "WHOG", "BU", "WHBU", "OG", "WHBN", "BN"], + "T568B": ["WHOG", "OG", "WHGN", "BU", "WHBU", "GN", "WHBN", "BN"], +} From c2fb59f937a467945e4a4f5955d1d9fd50991784 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Wed, 20 Oct 2021 20:14:10 +0200 Subject: [PATCH 095/155] Use color objects in WireViz --- src/wireviz/DataClasses.py | 91 ++++++--- src/wireviz/Harness.py | 21 +- src/wireviz/wv_bom.py | 11 +- src/wireviz/wv_colors.py | 365 +++++++++++++++++++---------------- src/wireviz/wv_colors_new.py | 199 ------------------- src/wireviz/wv_gv_html.py | 86 ++++----- src/wireviz/wv_html.py | 2 +- 7 files changed, 313 insertions(+), 462 deletions(-) delete mode 100644 src/wireviz/wv_colors_new.py diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index d1054f4..a9497ac 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -5,7 +5,13 @@ from enum import Enum from itertools import zip_longest from typing import Dict, List, Optional, Tuple, Union -from wireviz.wv_colors import COLOR_CODES, Color, ColorMode, Colors, ColorScheme +from wireviz.wv_colors import ( + COLOR_CODES, + ColorOutputMode, + MultiColor, + SingleColor, + get_color_by_colorcode_index, +) from wireviz.wv_helper import aspect_ratio, awg_equiv, mm2_equiv # Each type alias have their legal values described in comments - validation might be implemented in the future @@ -60,12 +66,12 @@ class Metadata(dict): @dataclass class Options: fontname: PlainText = "arial" - bgcolor: Color = "WH" - bgcolor_node: Optional[Color] = "WH" - bgcolor_connector: Optional[Color] = None - bgcolor_cable: Optional[Color] = None - bgcolor_bundle: Optional[Color] = None - color_mode: ColorMode = "SHORT" + bgcolor: SingleColor = "WH" # will be converted to SingleColor in __post_init__ + bgcolor_node: SingleColor = "WH" + bgcolor_connector: SingleColor = None + bgcolor_cable: SingleColor = None + bgcolor_bundle: SingleColor = None + color_mode: ColorOutputMode = ColorOutputMode.EN_UPPER mini_bom_mode: bool = True template_separator: str = "." _pad: int = 0 @@ -74,6 +80,13 @@ class Options: _image_paths: [List] = field(default_factory=list) def __post_init__(self): + + self.bgcolor = SingleColor(self.bgcolor) + self.bgcolor_node = SingleColor(self.bgcolor_node) + self.bgcolor_connector = SingleColor(self.bgcolor_connector) + self.bgcolor_cable = SingleColor(self.bgcolor_cable) + self.bgcolor_bundle = SingleColor(self.bgcolor_bundle) + if not self.bgcolor_node: self.bgcolor_node = self.bgcolor if not self.bgcolor_connector: @@ -99,13 +112,15 @@ class Image: width: Optional[int] = None height: Optional[int] = None fixedsize: Optional[bool] = None - bgcolor: Optional[Color] = None + bgcolor: SingleColor = None # Contents of the text cell \n" - for item in bom[0]: - th_class = f"bom_col_{item.lower()}" - bom_header_html = f'{bom_header_html} \n' - bom_header_html = f"{bom_header_html} \n" + def update_attribs(self, **kwargs): + for k, v in kwargs.items(): + self.attribs[k] = v - # generate BOM contents - bom_contents = [] - for row in bom[1:]: - row_html = " \n" - for i, item in enumerate(row): - td_class = f"bom_col_{bom[0][i].lower()}" - row_html = f'{row_html} \n' - row_html = f"{row_html} \n" - bom_contents.append(row_html) + @property + def tagname(self): + return type(self).__name__.lower() - bom_html = ( - '
@@ -40,7 +40,7 @@ graph {
> fillcolor="#FFFFFF" shape=box style=filled] - _ferrule_crimp_5 [label=< + AUTOGENERATED_F_5 [label=< ", - # ] - # return "\n".join(html) class Tr(Tag): pass - # cells: List[Cell] = field(default_factory=list) - # - # def __init__(self, cells, *args, **kwargs): - # self.cells = cells - # super().__init__(*args, **kwargs) - # - # def __repr__(self): - # html = [ - # f"", - # "\n".join([str(c) for c in self.cells]), - # f"", - # ] - # return "\n".join(html) class Table(Tag): pass - # rows: List[Row] = field(default_factory=list) - # - # def __repr__(self): - # html = [ - # f"", - # "\n".join([str(r) for r in self.rows]), - # "
@@ -49,7 +49,7 @@ graph {
> fillcolor="#FFFFFF" shape=box style=filled] - _ferrule_crimp_6 [label=< + AUTOGENERATED_F_6 [label=<
@@ -58,7 +58,7 @@ graph {
> fillcolor="#FFFFFF" shape=box style=filled] - _ferrule_crimp_7 [label=< + AUTOGENERATED_F_7 [label=<
@@ -67,7 +67,7 @@ graph {
> fillcolor="#FFFFFF" shape=box style=filled] - _ferrule_crimp_8 [label=< + AUTOGENERATED_F_8 [label=<
@@ -76,7 +76,7 @@ graph {
> fillcolor="#FFFFFF" shape=box style=filled] - _ferrule_crimp_9 [label=< + AUTOGENERATED_F_9 [label=<
@@ -85,7 +85,7 @@ graph {
> fillcolor="#FFFFFF" shape=box style=filled] - _ferrule_crimp_10 [label=< + AUTOGENERATED_F_10 [label=<
@@ -94,7 +94,7 @@ graph {
> fillcolor="#FFFFFF" shape=box style=filled] - _ferrule_crimp_11 [label=< + AUTOGENERATED_F_11 [label=<
@@ -103,7 +103,7 @@ graph {
> fillcolor="#FFFFFF" shape=box style=filled] - _ferrule_crimp_12 [label=< + AUTOGENERATED_F_12 [label=< +
@@ -113,23 +113,23 @@ graph {
> fillcolor="#FFFFFF" shape=box style=filled] edge [color="#000000:#895956:#000000"] - _ferrule_crimp_1:e -- W1:w1:w - W1:w1:e -- _ferrule_crimp_7:w + AUTOGENERATED_F_1:e -- W1:w1:w + W1:w1:e -- AUTOGENERATED_F_7:w edge [color="#000000:#ff0000:#000000"] - _ferrule_crimp_2:e -- W1:w2:w - W1:w2:e -- _ferrule_crimp_8:w + AUTOGENERATED_F_2:e -- W1:w2:w + W1:w2:e -- AUTOGENERATED_F_8:w edge [color="#000000:#ff8000:#000000"] - _ferrule_crimp_3:e -- W1:w3:w - W1:w3:e -- _ferrule_crimp_9:w + AUTOGENERATED_F_3:e -- W1:w3:w + W1:w3:e -- AUTOGENERATED_F_9:w edge [color="#000000:#ffff00:#000000"] - _ferrule_crimp_4:e -- W1:w4:w - W1:w4:e -- _ferrule_crimp_10:w + AUTOGENERATED_F_4:e -- W1:w4:w + W1:w4:e -- AUTOGENERATED_F_10:w edge [color="#000000:#00ff00:#000000"] - _ferrule_crimp_5:e -- W1:w5:w - W1:w5:e -- _ferrule_crimp_11:w + AUTOGENERATED_F_5:e -- W1:w5:w + W1:w5:e -- AUTOGENERATED_F_11:w edge [color="#000000:#0066ff:#000000"] - _ferrule_crimp_6:e -- W1:w6:w - W1:w6:e -- _ferrule_crimp_12:w + AUTOGENERATED_F_6:e -- W1:w6:w + W1:w6:e -- AUTOGENERATED_F_12:w W1 [label=< +
diff --git a/examples/ex04.html b/examples/ex04.html index a1e3e39..cd0d4a4 100644 --- a/examples/ex04.html +++ b/examples/ex04.html @@ -1,22 +1,45 @@ - - - ex04 - + + + ex04 + +

ex04

Diagram

- - + + +
+ + - + -_ferrule_crimp_1 +AUTOGENERATED_F_1 Crimp ferrule @@ -60,226 +83,238 @@   - + -_ferrule_crimp_1:e--W1:w +AUTOGENERATED_F_1:e--W1:w - + -_ferrule_crimp_2 +AUTOGENERATED_F_2 Crimp ferrule - + -_ferrule_crimp_2:e--W1:w +AUTOGENERATED_F_2:e--W1:w - + -_ferrule_crimp_3 +AUTOGENERATED_F_3 Crimp ferrule - + -_ferrule_crimp_3:e--W1:w +AUTOGENERATED_F_3:e--W1:w - + -_ferrule_crimp_4 +AUTOGENERATED_F_4 Crimp ferrule - + -_ferrule_crimp_4:e--W1:w +AUTOGENERATED_F_4:e--W1:w - + -_ferrule_crimp_5 +AUTOGENERATED_F_5 Crimp ferrule - + -_ferrule_crimp_5:e--W1:w +AUTOGENERATED_F_5:e--W1:w - + -_ferrule_crimp_6 +AUTOGENERATED_F_6 Crimp ferrule - + -_ferrule_crimp_6:e--W1:w +AUTOGENERATED_F_6:e--W1:w - + -_ferrule_crimp_7 +AUTOGENERATED_F_7 Crimp ferrule - + -_ferrule_crimp_8 +AUTOGENERATED_F_8 Crimp ferrule - + -_ferrule_crimp_9 +AUTOGENERATED_F_9 Crimp ferrule - + -_ferrule_crimp_10 +AUTOGENERATED_F_10 Crimp ferrule - + -_ferrule_crimp_11 +AUTOGENERATED_F_11 Crimp ferrule - + -_ferrule_crimp_12 +AUTOGENERATED_F_12 Crimp ferrule - + -W1:e--_ferrule_crimp_7:w +W1:e--AUTOGENERATED_F_7:w - + -W1:e--_ferrule_crimp_8:w +W1:e--AUTOGENERATED_F_8:w - + -W1:e--_ferrule_crimp_9:w +W1:e--AUTOGENERATED_F_9:w - + -W1:e--_ferrule_crimp_10:w +W1:e--AUTOGENERATED_F_10:w - + -W1:e--_ferrule_crimp_11:w +W1:e--AUTOGENERATED_F_11:w - + -W1:e--_ferrule_crimp_12:w +W1:e--AUTOGENERATED_F_12:w + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Connector, Crimp ferrule12
2Wire, 0.25 mm², BN0.2mW1
3Wire, 0.25 mm², BU0.2mW1
4Wire, 0.25 mm², GN0.2mW1
5Wire, 0.25 mm², OG0.2mW1
6Wire, 0.25 mm², RD0.2mW1
7Wire, 0.25 mm², YE0.2mW1
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Connector, Crimp ferrule12
2Wire, 0.25 mm², BN0.2mW1
3Wire, 0.25 mm², BU0.2mW1
4Wire, 0.25 mm², GN0.2mW1
5Wire, 0.25 mm², OG0.2mW1
6Wire, 0.25 mm², RD0.2mW1
7Wire, 0.25 mm², YE0.2mW1
+ + + diff --git a/examples/ex04.svg b/examples/ex04.svg index 19174c3..fe8bb93 100644 --- a/examples/ex04.svg +++ b/examples/ex04.svg @@ -1,16 +1,16 @@ - - + -_ferrule_crimp_1 +AUTOGENERATED_F_1 Crimp ferrule @@ -54,163 +54,163 @@   - + -_ferrule_crimp_1:e--W1:w +AUTOGENERATED_F_1:e--W1:w - + -_ferrule_crimp_2 +AUTOGENERATED_F_2 Crimp ferrule - + -_ferrule_crimp_2:e--W1:w +AUTOGENERATED_F_2:e--W1:w - + -_ferrule_crimp_3 +AUTOGENERATED_F_3 Crimp ferrule - + -_ferrule_crimp_3:e--W1:w +AUTOGENERATED_F_3:e--W1:w - + -_ferrule_crimp_4 +AUTOGENERATED_F_4 Crimp ferrule - + -_ferrule_crimp_4:e--W1:w +AUTOGENERATED_F_4:e--W1:w - + -_ferrule_crimp_5 +AUTOGENERATED_F_5 Crimp ferrule - + -_ferrule_crimp_5:e--W1:w +AUTOGENERATED_F_5:e--W1:w - + -_ferrule_crimp_6 +AUTOGENERATED_F_6 Crimp ferrule - + -_ferrule_crimp_6:e--W1:w +AUTOGENERATED_F_6:e--W1:w - + -_ferrule_crimp_7 +AUTOGENERATED_F_7 Crimp ferrule - + -_ferrule_crimp_8 +AUTOGENERATED_F_8 Crimp ferrule - + -_ferrule_crimp_9 +AUTOGENERATED_F_9 Crimp ferrule - + -_ferrule_crimp_10 +AUTOGENERATED_F_10 Crimp ferrule - + -_ferrule_crimp_11 +AUTOGENERATED_F_11 Crimp ferrule - + -_ferrule_crimp_12 +AUTOGENERATED_F_12 Crimp ferrule - + -W1:e--_ferrule_crimp_7:w +W1:e--AUTOGENERATED_F_7:w - + -W1:e--_ferrule_crimp_8:w +W1:e--AUTOGENERATED_F_8:w - + -W1:e--_ferrule_crimp_9:w +W1:e--AUTOGENERATED_F_9:w - + -W1:e--_ferrule_crimp_10:w +W1:e--AUTOGENERATED_F_10:w - + -W1:e--_ferrule_crimp_11:w +W1:e--AUTOGENERATED_F_11:w - + -W1:e--_ferrule_crimp_12:w +W1:e--AUTOGENERATED_F_12:w diff --git a/examples/ex05.html b/examples/ex05.html index 7865b88..5be09bd 100644 --- a/examples/ex05.html +++ b/examples/ex05.html @@ -1,13 +1,36 @@ - - - ex05 - + + + ex05 + +

ex05

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Connector, Molex KK 254, female, 4 pins3X1, X2, X3
2Wire, I2C, 0.25 mm², PK0.4mW1, W2
3Wire, I2C, 0.25 mm², TQ0.4mW1, W2
4Wire, I2C, 0.25 mm², VT0.4mW1, W2
5Wire, I2C, 0.25 mm², YE0.4mW1, W2
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Connector, Molex KK 254, female, 4 pins3X1, X2, X3
2Wire, I2C, 0.25 mm², PK0.4mW1, W2
3Wire, I2C, 0.25 mm², TQ0.4mW1, W2
4Wire, I2C, 0.25 mm², VT0.4mW1, W2
5Wire, I2C, 0.25 mm², YE0.4mW1, W2
+ + + diff --git a/examples/ex05.svg b/examples/ex05.svg index abfa6ec..6d4e75f 100644 --- a/examples/ex05.svg +++ b/examples/ex05.svg @@ -1,7 +1,7 @@ - - - - ex06 - + + + ex06 + +

ex06

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Connector, Molex KK 254, female, 4 pins6X1, X2, X3, X4, X5, X6
2Wire, 0.25 mm², PK1.0mW1, W2, W3, W4, W5
3Wire, 0.25 mm², TQ1.0mW1, W2, W3, W4, W5
4Wire, 0.25 mm², VT1.0mW1, W2, W3, W4, W5
5Wire, 0.25 mm², YE1.0mW1, W2, W3, W4, W5
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Connector, Molex KK 254, female, 4 pins6X1, X2, X3, X4, X5, X6
2Wire, 0.25 mm², PK1.0mW1, W2, W3, W4, W5
3Wire, 0.25 mm², TQ1.0mW1, W2, W3, W4, W5
4Wire, 0.25 mm², VT1.0mW1, W2, W3, W4, W5
5Wire, 0.25 mm², YE1.0mW1, W2, W3, W4, W5
+ + + diff --git a/examples/ex06.svg b/examples/ex06.svg index 1dc1a5c..fa1c378 100644 --- a/examples/ex06.svg +++ b/examples/ex06.svg @@ -1,7 +1,7 @@ - - - - ex07 - + + + ex07 + +

ex07

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Cable, 2 x 20 AWG1mC1
2Connector, D-Sub, female, 9 pins1X2
3Connector, TE 776164-1, female, 35 pins1X1
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, 2 x 20 AWG1mC1
2Connector, D-Sub, female, 9 pins1X2
3Connector, TE 776164-1, female, 35 pins1X1
+ + + diff --git a/examples/ex07.svg b/examples/ex07.svg index 02d8378..2c92ead 100644 --- a/examples/ex07.svg +++ b/examples/ex07.svg @@ -1,7 +1,7 @@ -
- +
@@ -135,7 +135,7 @@ graph {
- +
diff --git a/examples/ex08.html b/examples/ex08.html index b23a1a9..cd62b4a 100644 --- a/examples/ex08.html +++ b/examples/ex08.html @@ -1,13 +1,36 @@ - - - ex08 - + + + ex08 + +

ex08

Diagram

- - + + +
+ + S - + Tip, Ring, and Sleeve @@ -83,7 +106,7 @@   - + Cross-section @@ -117,28 +140,40 @@ + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Cable, 3 x 24 AWG shielded, BK0.2mW1
2Connector, Phone Connector, male 3.51Key
+ + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, 3 x 24 AWG shielded, BK0.2mW1
2Connector, Phone Connector, male 3.51Key
+ + + diff --git a/examples/ex08.svg b/examples/ex08.svg index 3355f08..78ab558 100644 --- a/examples/ex08.svg +++ b/examples/ex08.svg @@ -1,7 +1,7 @@ - S - + Tip, Ring, and Sleeve @@ -77,7 +77,7 @@   - + Cross-section diff --git a/examples/ex09.html b/examples/ex09.html index e0fe77b..8c6a6fe 100644 --- a/examples/ex09.html +++ b/examples/ex09.html @@ -1,13 +1,36 @@ - - - ex09 - + + + ex09 + +

ex09

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Cable, 12 x 0.25 mm² shielded0.2mW1
2Connector, D-Sub, male, 25 pins1X1
3Connector, F48, female, 48 pins1X2
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, 12 x 0.25 mm² shielded0.2mW1
2Connector, D-Sub, male, 25 pins1X1
3Connector, F48, female, 48 pins1X2
+ + + diff --git a/examples/ex09.svg b/examples/ex09.svg index 607a693..e5e5c7c 100644 --- a/examples/ex09.svg +++ b/examples/ex09.svg @@ -1,7 +1,7 @@ - - - - ex10 - + + + ex10 + +

ex10

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Cable, CAT5e, 8 x 24 AWG1mW1
2Connector, Stewart Connector SS-37000-002, male, 8 pins2X1, X2
+ + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, CAT5e, 8 x 24 AWG1mW1
2Connector, Stewart Connector SS-37000-002, male, 8 pins2X1, X2
+ + + diff --git a/examples/ex10.svg b/examples/ex10.svg index d0e302f..abc7168 100644 --- a/examples/ex10.svg +++ b/examples/ex10.svg @@ -1,7 +1,7 @@ - +
+
+ + + +
FerruleGY
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_F_2 [label=< + + +
+ + + + +
FerruleGY
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_F_3 [label=< + + +
+ + + + +
FerruleGY
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_F_4 [label=< + + +
+ + + + +
FerruleGY
+
+> fillcolor="#FFFFFF" shape=box style=filled] + X1 [label=< + + + + +
+ + +
X1
+
+ + + + + + +
Screw connectormale4-pinGN
+
+ + + + + + + + + + + + + + + + + +
1A
2B
3C
4D
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#000000:#000000"] + W1:w1:e -- AUTOGENERATED_F_1:w + edge [color="#000000:#ffffff:#000000"] + W1:w2:e -- AUTOGENERATED_F_2:w + edge [color="#000000:#0066ff:#000000"] + W1:w3:e -- AUTOGENERATED_F_3:w + edge [color="#000000:#895956:#000000"] + W1:w4:e -- AUTOGENERATED_F_4:w + W1 [label=< + + + + +
+ + +
W1
+
+ + + + +
4xBK
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ 1:BK +
+ + + + +
+
+ 2:WH +
+ + + + +
+
+ 3:BU +
+ + + + +
+
+ 4:BN +
+ + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000" dir=forward style=dashed] + AUTOGENERATED_F_1:e -- X1:p1l:w + edge [color="#000000" dir=forward style=dashed] + AUTOGENERATED_F_2:e -- X1:p2l:w + edge [color="#000000" dir=forward style=dashed] + AUTOGENERATED_F_3:e -- X1:p3l:w + edge [color="#000000" dir=forward style=dashed] + AUTOGENERATED_F_4:e -- X1:p4l:w +} diff --git a/examples/ex11.html b/examples/ex11.html new file mode 100644 index 0000000..9f2a3e7 --- /dev/null +++ b/examples/ex11.html @@ -0,0 +1,245 @@ + + + + + ex11 + + +

ex11

+

Diagram

+ +
+ +
+ +
+ + + + + + + + +AUTOGENERATED_F_1 + + +Ferrule + +GY + + + + + +X1 + + +X1 + +Screw connector + +male + +4-pin + +GN + + + +1 + +A + +2 + +B + +3 + +C + +4 + +D + + + +AUTOGENERATED_F_1:e--X1:w + + + + + +AUTOGENERATED_F_2 + + +Ferrule + +GY + + + + + +AUTOGENERATED_F_2:e--X1:w + + + + + +AUTOGENERATED_F_3 + + +Ferrule + +GY + + + + + +AUTOGENERATED_F_3:e--X1:w + + + + + +AUTOGENERATED_F_4 + + +Ferrule + +GY + + + + + +AUTOGENERATED_F_4:e--X1:w + + + + + +W1 + + +W1 + +4x + +BK + + +  +     1:BK     + + + +     2:WH     + + + +     3:BU     + + + +     4:BN     + + + +  + + + +W1:e--AUTOGENERATED_F_1:w + + + + + + +W1:e--AUTOGENERATED_F_2:w + + + + + + +W1:e--AUTOGENERATED_F_3:w + + + + + + +W1:e--AUTOGENERATED_F_4:w + + + + + + + +
+ +
+ +
+ +

Bill of Materials

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, 4 wires, BK0mW1
2Connector, Ferrule, GY4
3Connector, Screw connector, male, 4 pins, GN1X1
+ +
+ + diff --git a/examples/ex11.png b/examples/ex11.png new file mode 100644 index 0000000000000000000000000000000000000000..1f572f08d1bc26a683fe802b5cf5a89bd1deb7f8 GIT binary patch literal 37497 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 + + + + + + + + +AUTOGENERATED_F_1 + + +Ferrule + +GY + + + + + +X1 + + +X1 + +Screw connector + +male + +4-pin + +GN + + + +1 + +A + +2 + +B + +3 + +C + +4 + +D + + + +AUTOGENERATED_F_1:e--X1:w + + + + + +AUTOGENERATED_F_2 + + +Ferrule + +GY + + + + + +AUTOGENERATED_F_2:e--X1:w + + + + + +AUTOGENERATED_F_3 + + +Ferrule + +GY + + + + + +AUTOGENERATED_F_3:e--X1:w + + + + + +AUTOGENERATED_F_4 + + +Ferrule + +GY + + + + + +AUTOGENERATED_F_4:e--X1:w + + + + + +W1 + + +W1 + +4x + +BK + + +  +     1:BK     + + + +     2:WH     + + + +     3:BU     + + + +     4:BN     + + + +  + + + +W1:e--AUTOGENERATED_F_1:w + + + + + + +W1:e--AUTOGENERATED_F_2:w + + + + + + +W1:e--AUTOGENERATED_F_3:w + + + + + + +W1:e--AUTOGENERATED_F_4:w + + + + + + diff --git a/examples/ex12.bom.tsv b/examples/ex12.bom.tsv new file mode 100644 index 0000000..b7242cb --- /dev/null +++ b/examples/ex12.bom.tsv @@ -0,0 +1,7 @@ +Id Description Qty Unit Designators +1 Connector, Dupont 2.54mm, female, 5 pins, BK 1 X2 +2 Connector, Dupont 2.54mm, male, 5 pins, BK 1 X1 +3 Wire, BK 0.4 m W1, W2 +4 Wire, BU 0.4 m W1, W2 +5 Wire, GN 0.4 m W1, W2 +6 Wire, RD 0.4 m W1, W2 diff --git a/examples/ex12.gv b/examples/ex12.gv new file mode 100644 index 0000000..c542986 --- /dev/null +++ b/examples/ex12.gv @@ -0,0 +1,269 @@ +graph { +// Graph generated by WireViz 0.4-dev +// https://github.com/formatc1702/WireViz + graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] + node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] + edge [fontname=arial style=bold] + X1 [label=< + + + + +
+ + +
X1
+
+ + + + + + +
Dupont 2.54mmmale5-pinBK
+
+ + + + + + + + + + + + + + + + +
1
2
3
4
5
+
+> fillcolor="#FFFFFF" shape=box style=filled] + X2 [label=< + + + + +
+ + +
X2
+
+ + + + + + +
Dupont 2.54mmfemale5-pinBK
+
+ + + + + + + + + + + + + + + + +
1
2
3
4
5
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#000000"] + W1:w1:e -- X1:p1l:w + edge [color="#000000:#000000:#000000"] + W1:w2:e -- X1:p2l:w + edge [color="#000000:#0066ff:#000000"] + W1:w3:e -- X1:p3l:w + edge [color="#000000:#00ff00:#000000"] + W1:w4:e -- X1:p4l:w + W1 [label=< + + + + +
+ + +
W1
+
+ + + +
4x0.2 m
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ RD + X1:1
+ + + + +
+
+ BK + X1:2
+ + + + +
+
+ BU + X1:3
+ + + + +
+
+ GN + X1:4
+ + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style="filled,dashed"] + edge [color="#000000:#ff0000:#000000"] + X2:p1r:e -- W2:w1:w + edge [color="#000000:#000000:#000000"] + X2:p2r:e -- W2:w2:w + edge [color="#000000:#0066ff:#000000"] + X2:p3r:e -- W2:w3:w + edge [color="#000000:#00ff00:#000000"] + X2:p4r:e -- W2:w4:w + W2 [label=< + + + + +
+ + +
W2
+
+ + + +
4x0.2 m
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
X2:1 + RD +
+ + + + +
+
X2:2 + BK +
+ + + + +
+
X2:3 + BU +
+ + + + +
+
X2:4 + GN +
+ + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style="filled,dashed"] + edge [color="#000000:#000000" dir=forward style=dashed] + X1:e -- X2:w +} diff --git a/examples/ex12.html b/examples/ex12.html new file mode 100644 index 0000000..e3d983c --- /dev/null +++ b/examples/ex12.html @@ -0,0 +1,289 @@ + + + + + ex12 + + +

ex12

+

Diagram

+ +
+ +
+ +
+ + + + + + + + +X1 + + +X1 + +Dupont 2.54mm + +male + +5-pin + +BK + + + +1 + +2 + +3 + +4 + +5 + + + +X2 + + +X2 + +Dupont 2.54mm + +female + +5-pin + +BK + + + +1 + +2 + +3 + +4 + +5 + + + +X1:e--X2:w + + + + + + +W2 + + +W2 + +4x + +0.2 m +  +X2:1 +     RD     + + + +X2:2 +     BK     + + + +X2:3 +     BU     + + + +X2:4 +     GN     + + + +  + + + +X2:e--W2:w + + + + + + +X2:e--W2:w + + + + + + +X2:e--W2:w + + + + + + +X2:e--W2:w + + + + + + +W1 + + +W1 + +4x + +0.2 m +  +     RD     +X1:1 + + + +     BK     +X1:2 + + + +     BU     +X1:3 + + + +     GN     +X1:4 + + + +  + + + +W1:e--X1:w + + + + + + +W1:e--X1:w + + + + + + +W1:e--X1:w + + + + + + +W1:e--X1:w + + + + + + + +
+ +
+ +
+ +

Bill of Materials

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Connector, Dupont 2.54mm, female, 5 pins, BK1X2
2Connector, Dupont 2.54mm, male, 5 pins, BK1X1
3Wire, BK0.4mW1, W2
4Wire, BU0.4mW1, W2
5Wire, GN0.4mW1, W2
6Wire, RD0.4mW1, W2
+ +
+ + diff --git a/examples/ex12.png b/examples/ex12.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0fce6c59488d433ec3a52b39023d0554426b8a GIT binary patch literal 29039 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

YY7x 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 + + + + + + + + +X1 + + +X1 + +Dupont 2.54mm + +male + +5-pin + +BK + + + +1 + +2 + +3 + +4 + +5 + + + +X2 + + +X2 + +Dupont 2.54mm + +female + +5-pin + +BK + + + +1 + +2 + +3 + +4 + +5 + + + +X1:e--X2:w + + + + + + +W2 + + +W2 + +4x + +0.2 m +  +X2:1 +     RD     + + + +X2:2 +     BK     + + + +X2:3 +     BU     + + + +X2:4 +     GN     + + + +  + + + +X2:e--W2:w + + + + + + +X2:e--W2:w + + + + + + +X2:e--W2:w + + + + + + +X2:e--W2:w + + + + + + +W1 + + +W1 + +4x + +0.2 m +  +     RD     +X1:1 + + + +     BK     +X1:2 + + + +     BU     +X1:3 + + + +     GN     +X1:4 + + + +  + + + +W1:e--X1:w + + + + + + +W1:e--X1:w + + + + + + +W1:e--X1:w + + + + + + +W1:e--X1:w + + + + + + diff --git a/examples/ex13.bom.tsv b/examples/ex13.bom.tsv new file mode 100644 index 0000000..b5936d2 --- /dev/null +++ b/examples/ex13.bom.tsv @@ -0,0 +1,4 @@ +Id Description Qty Unit Designators +1 Cable, 4 wires 0 m C1, C2, C3 +2 Connector, 4 pins 3 X1, X2, X3 +3 Connector, ferrule 4 diff --git a/examples/ex13.gv b/examples/ex13.gv new file mode 100644 index 0000000..b26897a --- /dev/null +++ b/examples/ex13.gv @@ -0,0 +1,433 @@ +graph { +// Graph generated by WireViz 0.4-dev +// https://github.com/formatc1702/WireViz + graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] + node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] + edge [fontname=arial style=bold] + X1 [label=< + + + + +
+ + +
X1
+
+ + +
4-pin
+
+ + + + + + + + + + + + + + + + + +
A1
B2
C3
D4
+
+> fillcolor="#FFFFFF" shape=box style=filled] + F1 [label=< + + +
+ + +
ferrule
+
+> fillcolor="#FFFFFF" shape=box style=filled] + F2 [label=< + + +
+ + +
ferrule
+
+> fillcolor="#FFFFFF" shape=box style=filled] + F3 [label=< + + +
+ + +
ferrule
+
+> fillcolor="#FFFFFF" shape=box style=filled] + F4 [label=< + + +
+ + +
ferrule
+
+> fillcolor="#FFFFFF" shape=box style=filled] + X2 [label=< + + + + +
+ + +
X2
+
+ + +
4-pin
+
+ + + + + + + + + + + + + + + + + +
1A
2B
3C
4D
+
+> fillcolor="#FFFFFF" shape=box style=filled] + X3 [label=< + + + + +
+ + +
X3
+
+ + +
4-pin
+
+ + + + + + + + + + + + + + + + + +
1A
2B
3C
4D
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ffffff:#000000"] + X1:p1r:e -- C1:w1:w + C1:w1:e -- F1:w + edge [color="#000000:#895956:#000000"] + X1:p2r:e -- C1:w2:w + C1:w2:e -- F2:w + edge [color="#000000:#00ff00:#000000"] + X1:p3r:e -- C1:w3:w + C1:w3:e -- F3:w + edge [color="#000000:#ffff00:#000000"] + X1:p4r:e -- C1:w4:w + C1:w4:e -- F4:w + C1 [label=< + + + + +
+ + +
C1
+
+ + +
4x
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
X1:1:A + 1:WH +
+ + + + +
+
X1:2:B + 2:BN +
+ + + + +
+
X1:3:C + 3:GN +
+ + + + +
+
X1:4:D + 4:YE +
+ + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ffffff:#000000"] + F1:e -- C2:w1:w + C2:w1:e -- X2:p1l:w + edge [color="#000000:#895956:#000000"] + F2:e -- C2:w2:w + C2:w2:e -- X2:p2l:w + edge [color="#000000:#00ff00:#000000"] + F3:e -- C2:w3:w + C2:w3:e -- X2:p3l:w + edge [color="#000000:#ffff00:#000000"] + F4:e -- C2:w4:w + C2:w4:e -- X2:p4l:w + C2 [label=< + + + + +
+ + +
C2
+
+ + +
4x
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ 1:WH + X2:1:A
+ + + + +
+
+ 2:BN + X2:2:B
+ + + + +
+
+ 3:GN + X2:3:C
+ + + + +
+
+ 4:YE + X2:4:D
+ + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ffffff:#000000"] + F1:e -- C3:w1:w + C3:w1:e -- X3:p1l:w + edge [color="#000000:#895956:#000000"] + F2:e -- C3:w2:w + C3:w2:e -- X3:p2l:w + edge [color="#000000:#00ff00:#000000"] + F3:e -- C3:w3:w + C3:w3:e -- X3:p3l:w + edge [color="#000000:#ffff00:#000000"] + F4:e -- C3:w4:w + C3:w4:e -- X3:p4l:w + C3 [label=< + + + + +
+ + +
C3
+
+ + +
4x
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ 1:WH + X3:1:A
+ + + + +
+
+ 2:BN + X3:2:B
+ + + + +
+
+ 3:GN + X3:3:C
+ + + + +
+
+ 4:YE + X3:4:D
+ + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] +} diff --git a/examples/ex13.html b/examples/ex13.html new file mode 100644 index 0000000..1e7bbe5 --- /dev/null +++ b/examples/ex13.html @@ -0,0 +1,449 @@ + + + + + ex13 + + +

ex13

+

Diagram

+ +
+ +
+ +
+ + + + + + + + +X1 + + +X1 + +4-pin + +A + +1 + +B + +2 + +C + +3 + +D + +4 + + + +C1 + + +C1 + +4x +  +X1:1:A +     1:WH     + + + +X1:2:B +     2:BN     + + + +X1:3:C +     3:GN     + + + +X1:4:D +     4:YE     + + + +  + + + +X1:e--C1:w + + + + + + +X1:e--C1:w + + + + + + +X1:e--C1:w + + + + + + +X1:e--C1:w + + + + + + +F1 + + +ferrule + + + +C2 + + +C2 + +4x +  +     1:WH     +X2:1:A + + + +     2:BN     +X2:2:B + + + +     3:GN     +X2:3:C + + + +     4:YE     +X2:4:D + + + +  + + + +F1:e--C2:w + + + + + + +C3 + + +C3 + +4x +  +     1:WH     +X3:1:A + + + +     2:BN     +X3:2:B + + + +     3:GN     +X3:3:C + + + +     4:YE     +X3:4:D + + + +  + + + +F1:e--C3:w + + + + + + +F2 + + +ferrule + + + +F2:e--C2:w + + + + + + +F2:e--C3:w + + + + + + +F3 + + +ferrule + + + +F3:e--C2:w + + + + + + +F3:e--C3:w + + + + + + +F4 + + +ferrule + + + +F4:e--C2:w + + + + + + +F4:e--C3:w + + + + + + +X2 + + +X2 + +4-pin + +1 + +A + +2 + +B + +3 + +C + +4 + +D + + + +X3 + + +X3 + +4-pin + +1 + +A + +2 + +B + +3 + +C + +4 + +D + + + +C1:e--F1:w + + + + + + +C1:e--F2:w + + + + + + +C1:e--F3:w + + + + + + +C1:e--F4:w + + + + + + +C2:e--X2:w + + + + + + +C2:e--X2:w + + + + + + +C2:e--X2:w + + + + + + +C2:e--X2:w + + + + + + +C3:e--X3:w + + + + + + +C3:e--X3:w + + + + + + +C3:e--X3:w + + + + + + +C3:e--X3:w + + + + + + + +
+ +
+ +
+ +

Bill of Materials

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, 4 wires0mC1, C2, C3
2Connector, 4 pins3X1, X2, X3
3Connector, ferrule4
+ +
+ + diff --git a/examples/ex13.png b/examples/ex13.png new file mode 100644 index 0000000000000000000000000000000000000000..9b24caff75716a1008fd19cc80fd421203e556c4 GIT binary patch literal 122595 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 K+UYwF1^)+cBL$5B literal 0 HcmV?d00001 diff --git a/examples/ex13.svg b/examples/ex13.svg new file mode 100644 index 0000000..cf6f379 --- /dev/null +++ b/examples/ex13.svg @@ -0,0 +1,376 @@ + + + + + + + + + +X1 + + +X1 + +4-pin + +A + +1 + +B + +2 + +C + +3 + +D + +4 + + + +C1 + + +C1 + +4x +  +X1:1:A +     1:WH     + + + +X1:2:B +     2:BN     + + + +X1:3:C +     3:GN     + + + +X1:4:D +     4:YE     + + + +  + + + +X1:e--C1:w + + + + + + +X1:e--C1:w + + + + + + +X1:e--C1:w + + + + + + +X1:e--C1:w + + + + + + +F1 + + +ferrule + + + +C2 + + +C2 + +4x +  +     1:WH     +X2:1:A + + + +     2:BN     +X2:2:B + + + +     3:GN     +X2:3:C + + + +     4:YE     +X2:4:D + + + +  + + + +F1:e--C2:w + + + + + + +C3 + + +C3 + +4x +  +     1:WH     +X3:1:A + + + +     2:BN     +X3:2:B + + + +     3:GN     +X3:3:C + + + +     4:YE     +X3:4:D + + + +  + + + +F1:e--C3:w + + + + + + +F2 + + +ferrule + + + +F2:e--C2:w + + + + + + +F2:e--C3:w + + + + + + +F3 + + +ferrule + + + +F3:e--C2:w + + + + + + +F3:e--C3:w + + + + + + +F4 + + +ferrule + + + +F4:e--C2:w + + + + + + +F4:e--C3:w + + + + + + +X2 + + +X2 + +4-pin + +1 + +A + +2 + +B + +3 + +C + +4 + +D + + + +X3 + + +X3 + +4-pin + +1 + +A + +2 + +B + +3 + +C + +4 + +D + + + +C1:e--F1:w + + + + + + +C1:e--F2:w + + + + + + +C1:e--F3:w + + + + + + +C1:e--F4:w + + + + + + +C2:e--X2:w + + + + + + +C2:e--X2:w + + + + + + +C2:e--X2:w + + + + + + +C2:e--X2:w + + + + + + +C3:e--X3:w + + + + + + +C3:e--X3:w + + + + + + +C3:e--X3:w + + + + + + +C3:e--X3:w + + + + + + diff --git a/examples/ex14.bom.tsv b/examples/ex14.bom.tsv new file mode 100644 index 0000000..c0e5307 --- /dev/null +++ b/examples/ex14.bom.tsv @@ -0,0 +1,8 @@ +Id Description Qty Unit Designators +1 Cable, 1 wires 0.1 m +2 Cable, 4 wires 0.4 m W1, W2, W21, W3 +3 Connector, Ferrule, GY 4 +4 Connector, JST SM, female, 4 pins 1 X2 +5 Connector, JST SM, male, 4 pins 2 X1, X3 +6 Connector, Screw terminal connector, 4 pins, GN 1 X4 +7 Connector, Splice, CU 8 diff --git a/examples/ex14.gv b/examples/ex14.gv new file mode 100644 index 0000000..4f24330 --- /dev/null +++ b/examples/ex14.gv @@ -0,0 +1,717 @@ +graph { +// Graph generated by WireViz 0.4-dev +// https://github.com/formatc1702/WireViz + graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] + node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] + edge [fontname=arial style=bold] + X1 [label=< + + + + +
+ + +
X1
+
+ + + + +
JST SMmale4-pin
+
+ + + + + + + + + + + + + + + + + +
A1
B2
C3
D4
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_S_1 [label=< + + +
+ + + + +
SpliceCU
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_S_2 [label=< + + +
+ + + + +
SpliceCU
+
+> fillcolor="#FFFFFF" shape=box style=filled] + S1 [label=< + + +
+ + + + +
SpliceCU
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_S_3 [label=< + + +
+ + + + +
SpliceCU
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_S_4 [label=< + + +
+ + + + +
SpliceCU
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_S_5 [label=< + + +
+ + + + +
SpliceCU
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_S_6 [label=< + + +
+ + + + +
SpliceCU
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_S_7 [label=< + + +
+ + + + +
SpliceCU
+
+> fillcolor="#FFFFFF" shape=box style=filled] + X2 [label=< + + + + +
+ + +
X2
+
+ + + + +
JST SMfemale4-pin
+
+ + + + + + + + + + + + + + + + + +
1A
2B
3C
4D
+
+> fillcolor="#FFFFFF" shape=box style=filled] + X3 [label=< + + + + +
+ + +
X3
+
+ + + + +
JST SMmale4-pin
+
+ + + + + + + + + + + + + + + + + +
A1
B2
C3
D4
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_F_1 [label=< + + +
+ + + + +
FerruleGY
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_F_2 [label=< + + +
+ + + + +
FerruleGY
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_F_3 [label=< + + +
+ + + + +
FerruleGY
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_F_4 [label=< + + +
+ + + + +
FerruleGY
+
+> fillcolor="#FFFFFF" shape=box style=filled] + X4 [label=< + + + + +
+ + +
X4
+
+ + + + + +
Screw terminal connector4-pinGN
+
+ + + + + + + + + + + + + + + + + +
1W
2X
3Y
4Z
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ffffff:#000000"] + X1:p4r:e -- W1:w1:w + W1:w1:e -- AUTOGENERATED_S_1:w + edge [color="#000000:#895956:#000000"] + X1:p3r:e -- W1:w2:w + W1:w2:e -- AUTOGENERATED_S_2:w + edge [color="#000000:#00ff00:#000000"] + X1:p2r:e -- W1:w3:w + W1:w3:e -- S1:w + edge [color="#000000:#ffff00:#000000"] + X1:p1r:e -- W1:w4:w + W1:w4:e -- AUTOGENERATED_S_3:w + W1 [label=< + + + + +
+ + +
W1
+
+ + + +
4x0.1 m
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
X1:4:D + 1:WH +
+ + + + +
+
X1:3:C + 2:BN +
+ + + + +
+
X1:2:B + 3:GN +
+ + + + +
+
X1:1:A + 4:YE +
+ + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ffffff:#000000"] + AUTOGENERATED_S_1:e -- W2:w1:w + W2:w1:e -- AUTOGENERATED_S_4:w + edge [color="#000000:#895956:#000000"] + AUTOGENERATED_S_2:e -- W2:w2:w + W2:w2:e -- AUTOGENERATED_S_5:w + edge [color="#000000:#00ff00:#000000"] + S1:e -- W2:w3:w + W2:w3:e -- AUTOGENERATED_S_6:w + edge [color="#000000:#ffff00:#000000"] + AUTOGENERATED_S_3:e -- W2:w4:w + W2:w4:e -- AUTOGENERATED_S_7:w + W2 [label=< + + + + +
+ + +
W2
+
+ + + +
4x0.1 m
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ 1:WH +
+ + + + +
+
+ 2:BN +
+ + + + +
+
+ 3:GN +
+ + + + +
+
+ 4:YE +
+ + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ffffff:#000000"] + AUTOGENERATED_S_4:e -- W21:w1:w + W21:w1:e -- X2:p1l:w + edge [color="#000000:#895956:#000000"] + AUTOGENERATED_S_5:e -- W21:w2:w + W21:w2:e -- X2:p2l:w + edge [color="#000000:#00ff00:#000000"] + AUTOGENERATED_S_6:e -- W21:w3:w + W21:w3:e -- X2:p3l:w + edge [color="#000000:#ffff00:#000000"] + AUTOGENERATED_S_7:e -- W21:w4:w + W21:w4:e -- X2:p4l:w + W21 [label=< + + + + +
+ + +
W21
+
+ + + +
4x0.1 m
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ 1:WH + X2:1:A
+ + + + +
+
+ 2:BN + X2:2:B
+ + + + +
+
+ 3:GN + X2:3:C
+ + + + +
+
+ 4:YE + X2:4:D
+ + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ffffff:#000000"] + X3:p1r:e -- W3:w1:w + W3:w1:e -- AUTOGENERATED_F_1:w + edge [color="#000000:#895956:#000000"] + X3:p2r:e -- W3:w2:w + W3:w2:e -- AUTOGENERATED_F_2:w + edge [color="#000000:#00ff00:#000000"] + X3:p3r:e -- W3:w3:w + W3:w3:e -- AUTOGENERATED_F_3:w + edge [color="#000000:#ffff00:#000000"] + X3:p4r:e -- W3:w4:w + W3:w4:e -- AUTOGENERATED_F_4:w + W3 [label=< + + + + +
+ + +
W3
+
+ + + +
4x0.1 m
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
X3:1:A + 1:WH +
+ + + + +
+
X3:2:B + 2:BN +
+ + + + +
+
X3:3:C + 3:GN +
+ + + + +
+
X3:4:D + 4:YE +
+ + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#000000:#000000"] + S1:e -- AUTOGENERATED_WIRE_1:w1:w + AUTOGENERATED_WIRE_1:w1:e -- X2:p4l:w + AUTOGENERATED_WIRE_1 [label=< + + + +
+ + + +
1x0.1 m
+
+ + + + + + + + + + + +
 
+ 1:BK + X2:4:D
+ + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#000000" dir=both style=dashed] + X2:e -- X3:w + edge [color="#000000" dir=forward style=dashed] + AUTOGENERATED_F_1:e -- X4:p2l:w + edge [color="#000000" dir=forward style=dashed] + AUTOGENERATED_F_2:e -- X4:p1l:w + edge [color="#000000" dir=forward style=dashed] + AUTOGENERATED_F_3:e -- X4:p4l:w + edge [color="#000000" dir=forward style=dashed] + AUTOGENERATED_F_4:e -- X4:p3l:w +} diff --git a/examples/ex14.html b/examples/ex14.html new file mode 100644 index 0000000..e20c232 --- /dev/null +++ b/examples/ex14.html @@ -0,0 +1,777 @@ + + + + + ex14 + + +

ex14

+

Diagram

+ +
+ +
+ +
+ + + + + + + + +X1 + + +X1 + +JST SM + +male + +4-pin + +A + +1 + +B + +2 + +C + +3 + +D + +4 + + + +W1 + + +W1 + +4x + +0.1 m +  +X1:4:D +     1:WH     + + + +X1:3:C +     2:BN     + + + +X1:2:B +     3:GN     + + + +X1:1:A +     4:YE     + + + +  + + + +X1:e--W1:w + + + + + + +X1:e--W1:w + + + + + + +X1:e--W1:w + + + + + + +X1:e--W1:w + + + + + + +AUTOGENERATED_S_1 + + +Splice + +CU + + + + + +W2 + + +W2 + +4x + +0.1 m +  +     1:WH     + + + +     2:BN     + + + +     3:GN     + + + +     4:YE     + + + +  + + + +AUTOGENERATED_S_1:e--W2:w + + + + + + +AUTOGENERATED_S_2 + + +Splice + +CU + + + + + +AUTOGENERATED_S_2:e--W2:w + + + + + + +S1 + + +Splice + +CU + + + + + +S1:e--W2:w + + + + + + +AUTOGENERATED_WIRE_1 + + +1x + +0.1 m +  +     1:BK     +X2:4:D + + + +  + + + +S1:e--AUTOGENERATED_WIRE_1:w + + + + + + +AUTOGENERATED_S_3 + + +Splice + +CU + + + + + +AUTOGENERATED_S_3:e--W2:w + + + + + + +AUTOGENERATED_S_4 + + +Splice + +CU + + + + + +W21 + + +W21 + +4x + +0.1 m +  +     1:WH     +X2:1:A + + + +     2:BN     +X2:2:B + + + +     3:GN     +X2:3:C + + + +     4:YE     +X2:4:D + + + +  + + + +AUTOGENERATED_S_4:e--W21:w + + + + + + +AUTOGENERATED_S_5 + + +Splice + +CU + + + + + +AUTOGENERATED_S_5:e--W21:w + + + + + + +AUTOGENERATED_S_6 + + +Splice + +CU + + + + + +AUTOGENERATED_S_6:e--W21:w + + + + + + +AUTOGENERATED_S_7 + + +Splice + +CU + + + + + +AUTOGENERATED_S_7:e--W21:w + + + + + + +X2 + + +X2 + +JST SM + +female + +4-pin + +1 + +A + +2 + +B + +3 + +C + +4 + +D + + + +X3 + + +X3 + +JST SM + +male + +4-pin + +A + +1 + +B + +2 + +C + +3 + +D + +4 + + + +X2:e--X3:w + + + + + + + +W3 + + +W3 + +4x + +0.1 m +  +X3:1:A +     1:WH     + + + +X3:2:B +     2:BN     + + + +X3:3:C +     3:GN     + + + +X3:4:D +     4:YE     + + + +  + + + +X3:e--W3:w + + + + + + +X3:e--W3:w + + + + + + +X3:e--W3:w + + + + + + +X3:e--W3:w + + + + + + +AUTOGENERATED_F_1 + + +Ferrule + +GY + + + + + +X4 + + +X4 + +Screw terminal connector + +4-pin + +GN + + + +1 + +W + +2 + +X + +3 + +Y + +4 + +Z + + + +AUTOGENERATED_F_1:e--X4:w + + + + + +AUTOGENERATED_F_2 + + +Ferrule + +GY + + + + + +AUTOGENERATED_F_2:e--X4:w + + + + + +AUTOGENERATED_F_3 + + +Ferrule + +GY + + + + + +AUTOGENERATED_F_3:e--X4:w + + + + + +AUTOGENERATED_F_4 + + +Ferrule + +GY + + + + + +AUTOGENERATED_F_4:e--X4:w + + + + + +W1:e--AUTOGENERATED_S_1:w + + + + + + +W1:e--AUTOGENERATED_S_2:w + + + + + + +W1:e--S1:w + + + + + + +W1:e--AUTOGENERATED_S_3:w + + + + + + +W2:e--AUTOGENERATED_S_4:w + + + + + + +W2:e--AUTOGENERATED_S_5:w + + + + + + +W2:e--AUTOGENERATED_S_6:w + + + + + + +W2:e--AUTOGENERATED_S_7:w + + + + + + +W21:e--X2:w + + + + + + +W21:e--X2:w + + + + + + +W21:e--X2:w + + + + + + +W21:e--X2:w + + + + + + +W3:e--AUTOGENERATED_F_1:w + + + + + + +W3:e--AUTOGENERATED_F_2:w + + + + + + +W3:e--AUTOGENERATED_F_3:w + + + + + + +W3:e--AUTOGENERATED_F_4:w + + + + + + +AUTOGENERATED_WIRE_1:e--X2:w + + + + + + + +
+ +
+ +
+ +

Bill of Materials

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, 1 wires0.1m
2Cable, 4 wires0.4mW1, W2, W21, W3
3Connector, Ferrule, GY4
4Connector, JST SM, female, 4 pins1X2
5Connector, JST SM, male, 4 pins2X1, X3
6Connector, Screw terminal connector, 4 pins, GN1X4
7Connector, Splice, CU8
+ +
+ + diff --git a/examples/ex14.png b/examples/ex14.png new file mode 100644 index 0000000000000000000000000000000000000000..bae9a15d316250c2094c2943b1a95a802c5f641f GIT binary patch literal 207268 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
$@{c&u{R?nV2Yl-h7Wj`jXD2Y=FP9$X( zCtu%W-nzhMwBsBgZ{*-|Tf@5ZmAJMZq@%mSKT<;ke4mFEk#CUv?}>NbXr9OMCdrhwBVuYXy9E`gmT1 z_6ehj=3;Ru@lmFeLXeyq=H})xb4M`s?13)^(VKTXD%kfk;`xVGl>^JhbuDoFDG_oh z1~>re_H~%m^^LBr@vLUy+5K{M&sXpg(RCAFK$N4&unZ#p9>f|L`~1nvCV7nE3QtZ^ zD$jeBtqb1Q?=C%+e&q5sd1})HI^Xj{Q+Jr0+N!Uavon`ud9``c!ZRWq~)X0u6Bnq1zu%b?WFo%e@+tbC#3R217SPv-t z))5+|EXmHkNjTIj;_hOjBxgiN1egJ+mB~9KzXP~wuA*%3+p=^;5e2awV{CEBSqOc= zEJ@dF`t_%&L+eI$H4inlon5Eq;KYuR3CCIr<#4tk{ro)F)NJwK2<^bY;HWkgd*6?z zI*u5ilUQ#nCj=JKhvZlsI&^5Fn1k```fplUsQOUtM#}0Lj62t77iK1tQyw&1L_ZXs zP|eXy|H?#@`sfj!{2^#Vg59(|#g;w6RfL_DO-T;^_SnV_kao!&0EfO@JPU9$kSbA$ zgYo;m@QwZVxzhpaIyh>?a?S;vSGifh+^O@u^!>r$9+3cbCQ@?m-|txcUacmj$#N@F zra?%Acn!L)?f3)gRltA2aGekqUU{QllU@6Kx$RxQyNx5iMrDp|X0>G~WN_r!(fmPW znr1rG#LAYj@XBwEu3f^P{SPYoCG&H$Mjl>sGK}$1sH=AAVBx--n*y&#Sw7ghF@K&2^I1`pN3>K z+F>h;CJo-Ntyu^>ES{Pc?y`gSO1u7-z3|=r4|5BGl()0XxcK_oGoJiA80#}YbEy=@ zPeRksnKE8B%(jLFl4sAO)eN+_i?_mjbkZBn1}Gv4(hqf`HQqjC2~0x2!cvL186d4O z-K-@+RQx!?juM@V!kWMA$V)hb_acQ4#{@CDMQ8T-`FW$AsVc$t%zD#x)1h_zs&`@~ z_r`pkZ8z>T|I>PNVb888$MrwTd@CkE7%5iC$M4HAVyToKva1Zi9KrZidfvsVZfDuJ zuMwWihtNg@(K5icjw}xhWg};GgFrX~t%W$@!TBy4X^(qxf2ZJ>!UHILYe8xef{}su zOmHD*IscDp2U)Cy6RvmScBjbQ`CD=QeLj8PoMe>29{<0f-TN-11dL2uG>h4syC`5_ zbTYNmjvGZh>D18(!5!|Ppw(&2$GMLNOfL)HZ8&lKkia|_`+MQg9a6;k3%>}-owJ9c!Om4kp{!oY;?W4GQR|{|bV>WQ?lI-DInETp<#2 zCjOUb?_4gwvEdpE3m47mMklF2fA;NnPl)RaF*WR`dvz>MgHQW(>5ppWE-cG@mm#I~ z;>OpZDaMKSAG70WP%Mz;0F}8V-Z!cB2s{AFX?K}c)AL|9CnrhYLQqOc8u!tZyRZU^ z?$yieY=)w89(9_3GII@>5i{Kuch-U_g(d(_L1%`a2VX!&CZ0azw7`ajs2?=yqBkYvyQ8t+KeNhSVSS#!bz|Cj6XQB9X*@8!Zfo zWj@$KXK{HDP>uTOTmfk45NF?nt`_I}ne;`N^&?nD4s|nfF};E(!1N`!9_A`Vnk9S? zq$2zR4#I?R98i1 zfoh+m1*5klqFS8n0%0uuwvezQ$gJe$1Q`jQtp4;@Ll9f`4=`Iq-?UNQGwbEbohpn1 zy-|itbxcnJ4MLR!e%LK;)-N)><$8zhnJ?|vz~7@6Dkk6y0D=f;>BQXDIUqoz>R&E^ zPhHTIdAeEk0f+<#Q6+kgTNyk8aStmp%7A)7aSD-z#OwSG8gK-+{_A;-zVIpXlXwqY z=+Ni0RgVL60EG|is>)uR8G|xtXI}NEmfwep1572jl0tHh-Y!w%~df!+(pyV zt#gcp5sUEP`C;0(FmCgxUC~)MyCltE;ZqFQdPyNb|91pss?b z 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�#nE3Y79d@_P(*1sm z-nuC^x3#6AXOg?-^{<)4LO?fQ#)AFZ&}0lWl3r5c^_VFXeg&w&p!F5VH85eIDQa<# zFI_bw=puZa0X&N@H!&DFPI5}Gl+%s-)5MD^vDUgVGHO^#Tqh6{tf2ZcIfx`i2U0=Z zvL;XwZdN(i8SxC+$+RVP>qOGXU%@pIK@i7g_sf^FbZLxEyZrVquL8Uk2hWzA z!C;I5%v4H2#47SZWKJ%m8lG7&9DN7WmfgQM(*gTK6(!b&tbN!4!U;wx4WfZD!WK92 z@+u*SsK&-59g*#?lrhf{0nS?HxW9b9;yO-L8zi0D5v2{ZNBk@g+``Kdy0z&BjVvoA zMK~QzW23V;xveObd9a3HkskXZHcj!!AWFUtp#E3FN4G4W&<25kW8C=SWb!vYGo zXM_EU6WMp~>L68&N%HH?Sc0>El%KqpN=W7Xd*g!#!yuIJO+87yO)f?!)MI++H(w2z2mCFtWp{T7{(~z=bb)OVK`vm}$*h4= zsU;a~ilm)VO$vYgXX$2{Xr)!G-@3!^F>k*JzZb^QEl?E4^=nu`9M|OAH~T7uoGBKS zhd8*FhSh}E_w2V?qR>nzCAJ-Koj@30{0>%qJd77XHV}RYx~&mcOO~Oba5#QZWjR}- zaibG_%!jfGmoAJ%K+LDS=iEHrE!sZCa{8qIcV|uF4e;Kb|82J{Ml@dd>jggq*`Y4RUvT0FSH#a5MLsP+&nT-B04X=N*x zyA zI%h!A(P@yZWSJAPE5l4gqatWznQ7&kjSP;P)(rP+!1TVw84rwcAqI&zoMtv30~D>nBi-R{Zvc zBWRDXfvI^C(9`{q9U+lYlMjiRE=$}cbBJ#t+u~95MT)ND+_pTBx3k@8l*~~71$rA) zwGoefuDj(0H%4&=JcijC!luo$$WmuIimi%lb}*4$8-+))RonMEg2%_2BCXr-ve!)X zioekk-F$^8@GY5CYO{UBv>0>(whs>W%54ky7BmJ~TC<**xgp#pNUeBQ@tmsq(T=^h z_W40zR0zW(zlKvrZL{qyAz0}>9YDmc3QkVw%3xpcOOKE6a-6x-fCU7Q#b!VR2nYp4 z4UeP3+@-dWTMI9CAHU`J0I2d#WnC!CHM?`rR59*49^t~|VxjKWa4(`!G7Cykti7=N zEuSqSO58NA8Zt*Z0)aak$z@`KL8sFjVzrZlog-;?fK81>j}_Eb+el+S3q{Mz$|3`9 z>lCo}wvhyBX*bvB@`GqedF`rzoFl5xj6Z#JnI2<=_ljHI*N2uCl})~p99Uxg<g4dP=PreS7D%~4?eROZvIJrFJoX=+o}~+vDHQE9jV&D}ITe13mNqOd{!c z&RK<@UXkjX#g9Mzom6pWmfimO1yZEIEVBCfmH+>epXKrG+5cH_nI9aTgM^>jF-e|9 zmi%SQGX#X= + + + + + + + + +X1 + + +X1 + +JST SM + +male + +4-pin + +A + +1 + +B + +2 + +C + +3 + +D + +4 + + + +W1 + + +W1 + +4x + +0.1 m +  +X1:4:D +     1:WH     + + + +X1:3:C +     2:BN     + + + +X1:2:B +     3:GN     + + + +X1:1:A +     4:YE     + + + +  + + + +X1:e--W1:w + + + + + + +X1:e--W1:w + + + + + + +X1:e--W1:w + + + + + + +X1:e--W1:w + + + + + + +AUTOGENERATED_S_1 + + +Splice + +CU + + + + + +W2 + + +W2 + +4x + +0.1 m +  +     1:WH     + + + +     2:BN     + + + +     3:GN     + + + +     4:YE     + + + +  + + + +AUTOGENERATED_S_1:e--W2:w + + + + + + +AUTOGENERATED_S_2 + + +Splice + +CU + + + + + +AUTOGENERATED_S_2:e--W2:w + + + + + + +S1 + + +Splice + +CU + + + + + +S1:e--W2:w + + + + + + +AUTOGENERATED_WIRE_1 + + +1x + +0.1 m +  +     1:BK     +X2:4:D + + + +  + + + +S1:e--AUTOGENERATED_WIRE_1:w + + + + + + +AUTOGENERATED_S_3 + + +Splice + +CU + + + + + +AUTOGENERATED_S_3:e--W2:w + + + + + + +AUTOGENERATED_S_4 + + +Splice + +CU + + + + + +W21 + + +W21 + +4x + +0.1 m +  +     1:WH     +X2:1:A + + + +     2:BN     +X2:2:B + + + +     3:GN     +X2:3:C + + + +     4:YE     +X2:4:D + + + +  + + + +AUTOGENERATED_S_4:e--W21:w + + + + + + +AUTOGENERATED_S_5 + + +Splice + +CU + + + + + +AUTOGENERATED_S_5:e--W21:w + + + + + + +AUTOGENERATED_S_6 + + +Splice + +CU + + + + + +AUTOGENERATED_S_6:e--W21:w + + + + + + +AUTOGENERATED_S_7 + + +Splice + +CU + + + + + +AUTOGENERATED_S_7:e--W21:w + + + + + + +X2 + + +X2 + +JST SM + +female + +4-pin + +1 + +A + +2 + +B + +3 + +C + +4 + +D + + + +X3 + + +X3 + +JST SM + +male + +4-pin + +A + +1 + +B + +2 + +C + +3 + +D + +4 + + + +X2:e--X3:w + + + + + + + +W3 + + +W3 + +4x + +0.1 m +  +X3:1:A +     1:WH     + + + +X3:2:B +     2:BN     + + + +X3:3:C +     3:GN     + + + +X3:4:D +     4:YE     + + + +  + + + +X3:e--W3:w + + + + + + +X3:e--W3:w + + + + + + +X3:e--W3:w + + + + + + +X3:e--W3:w + + + + + + +AUTOGENERATED_F_1 + + +Ferrule + +GY + + + + + +X4 + + +X4 + +Screw terminal connector + +4-pin + +GN + + + +1 + +W + +2 + +X + +3 + +Y + +4 + +Z + + + +AUTOGENERATED_F_1:e--X4:w + + + + + +AUTOGENERATED_F_2 + + +Ferrule + +GY + + + + + +AUTOGENERATED_F_2:e--X4:w + + + + + +AUTOGENERATED_F_3 + + +Ferrule + +GY + + + + + +AUTOGENERATED_F_3:e--X4:w + + + + + +AUTOGENERATED_F_4 + + +Ferrule + +GY + + + + + +AUTOGENERATED_F_4:e--X4:w + + + + + +W1:e--AUTOGENERATED_S_1:w + + + + + + +W1:e--AUTOGENERATED_S_2:w + + + + + + +W1:e--S1:w + + + + + + +W1:e--AUTOGENERATED_S_3:w + + + + + + +W2:e--AUTOGENERATED_S_4:w + + + + + + +W2:e--AUTOGENERATED_S_5:w + + + + + + +W2:e--AUTOGENERATED_S_6:w + + + + + + +W2:e--AUTOGENERATED_S_7:w + + + + + + +W21:e--X2:w + + + + + + +W21:e--X2:w + + + + + + +W21:e--X2:w + + + + + + +W21:e--X2:w + + + + + + +W3:e--AUTOGENERATED_F_1:w + + + + + + +W3:e--AUTOGENERATED_F_2:w + + + + + + +W3:e--AUTOGENERATED_F_3:w + + + + + + +W3:e--AUTOGENERATED_F_4:w + + + + + + +AUTOGENERATED_WIRE_1:e--X2:w + + + + + + diff --git a/examples/readme.md b/examples/readme.md index 145ee5a..88a4389 100644 --- a/examples/readme.md +++ b/examples/readme.md @@ -60,3 +60,27 @@ [Source](ex10.yml) - [Bill of Materials](ex10.bom.tsv) +## Example 11 +![](ex11.png) + +[Source](ex11.yml) - [Bill of Materials](ex11.bom.tsv) + + +## Example 12 +![](ex12.png) + +[Source](ex12.yml) - [Bill of Materials](ex12.bom.tsv) + + +## Example 13 +![](ex13.png) + +[Source](ex13.yml) - [Bill of Materials](ex13.bom.tsv) + + +## Example 14 +![](ex14.png) + +[Source](ex14.yml) - [Bill of Materials](ex14.bom.tsv) + + diff --git a/tutorial/readme.md b/tutorial/readme.md index ee64faf..b65b1e4 100644 --- a/tutorial/readme.md +++ b/tutorial/readme.md @@ -189,7 +189,6 @@ connectors: subtype: female F1: style: simple - autogenerate: true type: Crimp ferrule subtype: 0.5 mm² color: OG # optional color @@ -203,7 +202,7 @@ cables: connections: - - - F1 # a new ferrule is auto-generated for each of the four wires + - F1. # a new ferrule is auto-generated for each of the four wires - W1: [1-4] - X1: [1-4] ``` @@ -228,13 +227,11 @@ connectors: subtype: female F_10: # this is a unique ferrule style: simple - show_name: false # non-autogenerated connectors show their name by default; override type: Crimp ferrule subtype: 1.0 mm² color: YE # optional color F_05: # this is a ferrule that will be auto-generated on demand style: simple - autogenerate: true type: Crimp ferrule subtype: 0.5 mm² color: OG @@ -248,7 +245,7 @@ cables: connections: - - - [F_05, F_10, F_10, F_05] + - [F_05., F_10.F1, F_10.F1, F_05.] - W1: [1-4] - X1: [1-4] ``` diff --git a/tutorial/tutorial01.html b/tutorial/tutorial01.html index 00c5502..16f1993 100644 --- a/tutorial/tutorial01.html +++ b/tutorial/tutorial01.html @@ -1,13 +1,36 @@ - - - tutorial01 - + + + tutorial01 + +

tutorial01

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Cable, 4 wires1mW1
2Connector, 4 pins2X1, X2
+ + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, 4 wires1mW1
2Connector, 4 pins2X1, X2
+ + + diff --git a/tutorial/tutorial01.svg b/tutorial/tutorial01.svg index c96a7c3..ca1330a 100644 --- a/tutorial/tutorial01.svg +++ b/tutorial/tutorial01.svg @@ -1,7 +1,7 @@ - - - - tutorial02 - + + + tutorial02 + +

tutorial02

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Cable, 4 x 0.25 mm²1mW1
2Connector, Molex KK 254, female, 4 pins2X1, X2
+ + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, 4 x 0.25 mm²1mW1
2Connector, Molex KK 254, female, 4 pins2X1, X2
+ + + diff --git a/tutorial/tutorial02.svg b/tutorial/tutorial02.svg index 30d0a32..6b546a1 100644 --- a/tutorial/tutorial02.svg +++ b/tutorial/tutorial02.svg @@ -1,7 +1,7 @@ - - - - tutorial03 - + + + tutorial03 + +

tutorial03

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Cable, 4 x 0.25 mm² shielded1mW1
2Connector, Molex KK 254, female, 4 pins2X1, X2
+ + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, 4 x 0.25 mm² shielded1mW1
2Connector, Molex KK 254, female, 4 pins2X1, X2
+ + + diff --git a/tutorial/tutorial03.svg b/tutorial/tutorial03.svg index c49d74b..d6640e4 100644 --- a/tutorial/tutorial03.svg +++ b/tutorial/tutorial03.svg @@ -1,7 +1,7 @@ - - - - tutorial04 - + + + tutorial04 + +

tutorial04

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Cable, 4 x 24 AWG0.4mW1, W2
2Connector, Molex KK 254, female, 4 pins2X2, X3
3Connector, Molex KK 254, male, 4 pins1X1
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Cable, 4 x 24 AWG0.4mW1, W2
2Connector, Molex KK 254, female, 4 pins2X2, X3
3Connector, Molex KK 254, male, 4 pins1X1
+ + + diff --git a/tutorial/tutorial04.svg b/tutorial/tutorial04.svg index 42e0890..430a4b9 100644 --- a/tutorial/tutorial04.svg +++ b/tutorial/tutorial04.svg @@ -1,7 +1,7 @@ - +
+
+ + + + +
Crimp ferrule0.5 mm²OG
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_F1_2 [label=< + + +
+ + + + + +
Crimp ferrule0.5 mm²OG
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_F1_3 [label=< + + +
+ + + + + +
Crimp ferrule0.5 mm²OG
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_F1_4 [label=< + + +
+ + + + + +
Crimp ferrule0.5 mm²OG
+
+> fillcolor="#FFFFFF" shape=box style=filled] X1 [label=<
@@ -39,66 +87,18 @@ graph {
-> fillcolor="#FFFFFF" shape=box style=filled] - _F1_1 [label=< - - -
- - - - - -
Crimp ferrule0.5 mm²OG
-
-> fillcolor="#FFFFFF" shape=box style=filled] - _F1_2 [label=< - - -
- - - - - -
Crimp ferrule0.5 mm²OG
-
-> fillcolor="#FFFFFF" shape=box style=filled] - _F1_3 [label=< - - -
- - - - - -
Crimp ferrule0.5 mm²OG
-
-> fillcolor="#FFFFFF" shape=box style=filled] - _F1_4 [label=< - - -
- - - - - -
Crimp ferrule0.5 mm²OG
-
> fillcolor="#FFFFFF" shape=box style=filled] edge [color="#000000:#ffff00:#000000"] - _F1_1:e -- W1:w1:w + AUTOGENERATED_F1_1:e -- W1:w1:w W1:w1:e -- X1:p1l:w edge [color="#000000:#000000:#000000"] - _F1_2:e -- W1:w2:w + AUTOGENERATED_F1_2:e -- W1:w2:w W1:w2:e -- X1:p2l:w edge [color="#000000:#000000:#000000"] - _F1_3:e -- W1:w3:w + AUTOGENERATED_F1_3:e -- W1:w3:w W1:w3:e -- X1:p3l:w edge [color="#000000:#ff0000:#000000"] - _F1_4:e -- W1:w4:w + AUTOGENERATED_F1_4:e -- W1:w4:w W1:w4:e -- X1:p4l:w W1 [label=< diff --git a/tutorial/tutorial05.html b/tutorial/tutorial05.html index f1ec2fc..a906e4a 100644 --- a/tutorial/tutorial05.html +++ b/tutorial/tutorial05.html @@ -1,51 +1,45 @@ - - - tutorial05 - + + + tutorial05 + +

tutorial05

Diagram

- - + + +
+ + - + -X1 - - -X1 - -Molex 8981 - -female - -4-pin - -1 - -+12V - -2 - -GND - -3 - -GND - -4 - -+5V - - - -_F1_1 +AUTOGENERATED_F1_1 Crimp ferrule @@ -91,16 +85,16 @@   - + -_F1_1:e--W1:w +AUTOGENERATED_F1_1:e--W1:w - - -_F1_2 + + +AUTOGENERATED_F1_2 Crimp ferrule @@ -111,16 +105,16 @@ - + -_F1_2:e--W1:w +AUTOGENERATED_F1_2:e--W1:w - - -_F1_3 + + +AUTOGENERATED_F1_3 Crimp ferrule @@ -131,16 +125,16 @@ - + -_F1_3:e--W1:w +AUTOGENERATED_F1_3:e--W1:w - - -_F1_4 + + +AUTOGENERATED_F1_4 Crimp ferrule @@ -151,13 +145,42 @@ - + -_F1_4:e--W1:w +AUTOGENERATED_F1_4:e--W1:w + + +X1 + + +X1 + +Molex 8981 + +female + +4-pin + +1 + ++12V + +2 + +GND + +3 + +GND + +4 + ++5V + W1:e--X1:w @@ -188,49 +211,61 @@ + +
+ +
+ +
+

Bill of Materials

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Connector, Crimp ferrule, 0.5 mm², OG4
2Connector, Molex 8981, female, 4 pins1X1
3Wire, 0.5 mm², BK0.6mW1
4Wire, 0.5 mm², RD0.3mW1
5Wire, 0.5 mm², YE0.3mW1
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Connector, Crimp ferrule, 0.5 mm², OG4
2Connector, Molex 8981, female, 4 pins1X1
3Wire, 0.5 mm², BK0.6mW1
4Wire, 0.5 mm², RD0.3mW1
5Wire, 0.5 mm², YE0.3mW1
+ + + diff --git a/tutorial/tutorial05.svg b/tutorial/tutorial05.svg index 7c485c2..389147b 100644 --- a/tutorial/tutorial05.svg +++ b/tutorial/tutorial05.svg @@ -1,45 +1,16 @@ - - + -X1 - - -X1 - -Molex 8981 - -female - -4-pin - -1 - -+12V - -2 - -GND - -3 - -GND - -4 - -+5V - - - -_F1_1 +AUTOGENERATED_F1_1 Crimp ferrule @@ -85,16 +56,16 @@   - + -_F1_1:e--W1:w +AUTOGENERATED_F1_1:e--W1:w - - -_F1_2 + + +AUTOGENERATED_F1_2 Crimp ferrule @@ -105,16 +76,16 @@ - + -_F1_2:e--W1:w +AUTOGENERATED_F1_2:e--W1:w - - -_F1_3 + + +AUTOGENERATED_F1_3 Crimp ferrule @@ -125,16 +96,16 @@ - + -_F1_3:e--W1:w +AUTOGENERATED_F1_3:e--W1:w - - -_F1_4 + + +AUTOGENERATED_F1_4 Crimp ferrule @@ -145,13 +116,42 @@ - + -_F1_4:e--W1:w +AUTOGENERATED_F1_4:e--W1:w + + +X1 + + +X1 + +Molex 8981 + +female + +4-pin + +1 + ++12V + +2 + +GND + +3 + +GND + +4 + ++5V + W1:e--X1:w diff --git a/tutorial/tutorial06.gv b/tutorial/tutorial06.gv index 3b0fb8e..472fa8b 100644 --- a/tutorial/tutorial06.gv +++ b/tutorial/tutorial06.gv @@ -4,6 +4,42 @@ graph { graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] edge [fontname=arial style=bold] + AUTOGENERATED_F_05_1 [label=< + + +
+ + + + + +
Crimp ferrule0.5 mm²OG
+
+> fillcolor="#FFFFFF" shape=box style=filled] + F1 [label=< + + +
+ + + + + +
Crimp ferrule1.0 mm²YE
+
+> fillcolor="#FFFFFF" shape=box style=filled] + AUTOGENERATED_F_05_2 [label=< + + +
+ + + + + +
Crimp ferrule0.5 mm²OG
+
+> fillcolor="#FFFFFF" shape=box style=filled] X1 [label=<
@@ -39,54 +75,18 @@ graph {
-> fillcolor="#FFFFFF" shape=box style=filled] - F_10 [label=< - - -
- - - - - -
Crimp ferrule1.0 mm²YE
-
-> fillcolor="#FFFFFF" shape=box style=filled] - _F_05_1 [label=< - - -
- - - - - -
Crimp ferrule0.5 mm²OG
-
-> fillcolor="#FFFFFF" shape=box style=filled] - _F_05_2 [label=< - - -
- - - - - -
Crimp ferrule0.5 mm²OG
-
> fillcolor="#FFFFFF" shape=box style=filled] edge [color="#000000:#ffff00:#000000"] - _F_05_1:e -- W1:w1:w + AUTOGENERATED_F_05_1:e -- W1:w1:w W1:w1:e -- X1:p1l:w edge [color="#000000:#000000:#000000"] - F_10:e -- W1:w2:w + F1:e -- W1:w2:w W1:w2:e -- X1:p2l:w edge [color="#000000:#000000:#000000"] - F_10:e -- W1:w3:w + F1:e -- W1:w3:w W1:w3:e -- X1:p3l:w edge [color="#000000:#ff0000:#000000"] - _F_05_2:e -- W1:w4:w + AUTOGENERATED_F_05_2:e -- W1:w4:w W1:w4:e -- X1:p4l:w W1 [label=< diff --git a/tutorial/tutorial06.html b/tutorial/tutorial06.html index 21df96a..8fba713 100644 --- a/tutorial/tutorial06.html +++ b/tutorial/tutorial06.html @@ -1,60 +1,54 @@ - - - tutorial06 - + + + tutorial06 + +

tutorial06

Diagram

- - + + +
+ + - + -X1 - - -X1 - -Molex 8981 - -female - -4-pin - -1 - -+12V - -2 - -GND - -3 - -GND - -4 - -+5V - - - -F_10 - - -Crimp ferrule - -1.0 mm² - -YE - - +AUTOGENERATED_F_05_1 + + +Crimp ferrule + +0.5 mm² + +OG + + @@ -91,43 +85,43 @@   - - -F_10:e--W1:w - - - - - - -F_10:e--W1:w - - - - - - -_F_05_1 - - -Crimp ferrule - -0.5 mm² - -OG - - - - + -_F_05_1:e--W1:w +AUTOGENERATED_F_05_1:e--W1:w - - -_F_05_2 + + +F1 + + +Crimp ferrule + +1.0 mm² + +YE + + + + + +F1:e--W1:w + + + + + + +F1:e--W1:w + + + + + + +AUTOGENERATED_F_05_2 Crimp ferrule @@ -138,13 +132,42 @@ - + -_F_05_2:e--W1:w +AUTOGENERATED_F_05_2:e--W1:w + + +X1 + + +X1 + +Molex 8981 + +female + +4-pin + +1 + ++12V + +2 + +GND + +3 + +GND + +4 + ++5V + W1:e--X1:w @@ -175,56 +198,68 @@ + +
+ +
+ +
+

Bill of Materials

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Connector, Crimp ferrule, 0.5 mm², OG2
2Connector, Crimp ferrule, 1.0 mm², YE1
3Connector, Molex 8981, female, 4 pins1X1
4Wire, 0.5 mm², BK0.6mW1
5Wire, 0.5 mm², RD0.3mW1
6Wire, 0.5 mm², YE0.3mW1
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Connector, Crimp ferrule, 0.5 mm², OG2
2Connector, Crimp ferrule, 1.0 mm², YE1
3Connector, Molex 8981, female, 4 pins1X1
4Wire, 0.5 mm², BK0.6mW1
5Wire, 0.5 mm², RD0.3mW1
6Wire, 0.5 mm², YE0.3mW1
+ + + diff --git a/tutorial/tutorial06.svg b/tutorial/tutorial06.svg index 4eb4093..99f6119 100644 --- a/tutorial/tutorial06.svg +++ b/tutorial/tutorial06.svg @@ -1,54 +1,25 @@ - - + -X1 - - -X1 - -Molex 8981 - -female - -4-pin - -1 - -+12V - -2 - -GND - -3 - -GND - -4 - -+5V - - - -F_10 - - -Crimp ferrule - -1.0 mm² - -YE - - +AUTOGENERATED_F_05_1 + + +Crimp ferrule + +0.5 mm² + +OG + + @@ -85,43 +56,43 @@   - - -F_10:e--W1:w - - - - - - -F_10:e--W1:w - - - - - - -_F_05_1 - - -Crimp ferrule - -0.5 mm² - -OG - - - - + -_F_05_1:e--W1:w +AUTOGENERATED_F_05_1:e--W1:w - - -_F_05_2 + + +F1 + + +Crimp ferrule + +1.0 mm² + +YE + + + + + +F1:e--W1:w + + + + + + +F1:e--W1:w + + + + + + +AUTOGENERATED_F_05_2 Crimp ferrule @@ -132,13 +103,42 @@ - + -_F_05_2:e--W1:w +AUTOGENERATED_F_05_2:e--W1:w + + +X1 + + +X1 + +Molex 8981 + +female + +4-pin + +1 + ++12V + +2 + +GND + +3 + +GND + +4 + ++5V + W1:e--X1:w diff --git a/tutorial/tutorial07.html b/tutorial/tutorial07.html index fd226a1..181abea 100644 --- a/tutorial/tutorial07.html +++ b/tutorial/tutorial07.html @@ -1,13 +1,36 @@ - - - tutorial07 - + + + tutorial07 + +

tutorial07

Diagram

- - + + +
+ + + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignators
1Connector, Molex KK 254, female, 4 pins6X1, X2, X3, X4, X5, X6
2Wire, 0.25 mm², PK1.0mW1, W2, W3, W4, W5
3Wire, 0.25 mm², TQ1.0mW1, W2, W3, W4, W5
4Wire, 0.25 mm², VT1.0mW1, W2, W3, W4, W5
5Wire, 0.25 mm², YE1.0mW1, W2, W3, W4, W5
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignators
1Connector, Molex KK 254, female, 4 pins6X1, X2, X3, X4, X5, X6
2Wire, 0.25 mm², PK1.0mW1, W2, W3, W4, W5
3Wire, 0.25 mm², TQ1.0mW1, W2, W3, W4, W5
4Wire, 0.25 mm², VT1.0mW1, W2, W3, W4, W5
5Wire, 0.25 mm², YE1.0mW1, W2, W3, W4, W5
+ + + diff --git a/tutorial/tutorial07.svg b/tutorial/tutorial07.svg index 7a18935..e5cf431 100644 --- a/tutorial/tutorial07.svg +++ b/tutorial/tutorial07.svg @@ -1,7 +1,7 @@ -
- +
1 x Test
P/N: ABC, Molex: 45454, Mousikey: 9999
1 x
P/N: ABC, Molex: 45454, Mousikey: 9999
@@ -106,7 +106,7 @@ graph {
- +
1 x Test
P/N: ABC, Molex: 45454, Mousikey: 9999
1 x
P/N: ABC, Molex: 45454, Mousikey: 9999
@@ -159,7 +159,7 @@ graph {
- +
1 x Test
P/N: ABC, Molex: 45454, Mousikey: 9999
1 x
P/N: ABC, Molex: 45454, Mousikey: 9999
diff --git a/tutorial/tutorial08.html b/tutorial/tutorial08.html index ce4f1ae..09e5600 100644 --- a/tutorial/tutorial08.html +++ b/tutorial/tutorial08.html @@ -1,13 +1,36 @@ - - - tutorial08 - + + + tutorial08 + +

tutorial08

Diagram

- - + + +
+ + 4 x Crimp, Molex KK 254, 22-30 AWG Molex: 08500030 -1 x Test +1 x P/N: ABC, Molex: 45454, Mousikey: 9999 @@ -236,7 +259,7 @@ 4 x Crimp, Molex KK 254, 22-30 AWG Molex: 08500030 -1 x Test +1 x P/N: ABC, Molex: 45454, Mousikey: 9999 @@ -269,7 +292,7 @@ 4 x Crimp, Molex KK 254, 22-30 AWG Molex: 08500030 -1 x Test +1 x P/N: ABC, Molex: 45454, Mousikey: 9999 @@ -330,139 +353,151 @@ + +
+ +
+ +
+

Bill of Materials

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+
IdDescriptionQtyUnitDesignatorsP/NManufacturerMPNSupplierSPN
1Cable, 4 x 0.25 mm²1mW1CAB1CablesCoABC123Cables R Us999-888-777
2Connector, Molex KK 254, female, 4 pins2X1, X3Molex22013047Digimouse1234
3Connector, Molex KK 254, female, 4 pins1X2CON4Molex22013047Digimouse1234
4Crimp, Molex KK 254, 22-30 AWG12X1, X2, X3Molex08500030
5Label, pinout information2X2, X3Label-ID-1BradyB-499
6Sleve, Braided nylon, black, 3mm1mW2SLV-1
7Test3X1, X2, X3ABCMolex45454Mousikey9999
8Wire, 0.25 mm², BK2mW2WIRE2WiresCoW1-BKWireShack1002
9Wire, 0.25 mm², RD1mW2WIRE3WiresCoW1-RDWireShack1009
10Wire, 0.25 mm², YE1mW2WIRE1WiresCoW1-YEWireShack1001
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdDescriptionQtyUnitDesignatorsP/NManufacturerMPNSupplierSPN
13X1, X2, X3ABCMolex45454Mousikey9999
2Cable, 4 x 0.25 mm²1mW1CAB1CablesCoABC123Cables R Us999-888-777
3Connector, Molex KK 254, female, 4 pins2X1, X3Molex22013047Digimouse1234
4Connector, Molex KK 254, female, 4 pins1X2CON4Molex22013047Digimouse1234
5Crimp, Molex KK 254, 22-30 AWG12X1, X2, X3Molex08500030
6Label, pinout information2X2, X3Label-ID-1BradyB-499
7Sleve, Braided nylon, black, 3mm1mW2SLV-1
8Wire, 0.25 mm², BK2mW2WIRE2WiresCoW1-BKWireShack1002
9Wire, 0.25 mm², RD1mW2WIRE3WiresCoW1-RDWireShack1009
10Wire, 0.25 mm², YE1mW2WIRE1WiresCoW1-YEWireShack1001
+ + + diff --git a/tutorial/tutorial08.png b/tutorial/tutorial08.png index d2b10be44127e33b89b0da5dfea90f6ca17e79de..b6cefb930d8c17b3893a1d3224e3cdd814a409c4 100644 GIT binary patch delta 125763 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

-hJ(a6ox*7E5meZ1Onmf%Wm*z zD+Bf^ZQ4YxtXj_RrmeyE71IjILw*RNPtx8M)xL%U%+wBJ5l}(Q@bZVOj8ZrHAsx$; z#EyvAC&5P|SEYj39{Kn&V7QLq(RxR84$jU)D1W77+#q>}p?MRAo`SBiiD*TSg)^cY zzAW5*yUc|sdzzr>y-r|HB&Z8ioIvHGqIeDTe?>$%|8jc}!Y3)|Jn8c6anKV`r)VmW zeLV?nhHpT=eQS{Z*VoZ7gP^p8%mqn>P*j9%`*ChSTQ_tQUYn+7$kM{xsZU9}+#$&- z&dE^**F-qq>%--BT#XuhhCVE6YRz7h1`FheMmDd+Mwbe|K_^_a1_m)DpHSN&#Xw~B zYT<9zQz=E4=Fb>M((RtL%gI`CnV&;TXJ_b~3yQ5sq0B8o=88r2kmj88g8o9@Scv)9 zvEMlG;}X?#N@07+1{^femfFzN6jM@*VgxGL0!9FA_3(Nm2kU zUOFqr`W^1CG`sU!Db0Py#M5wYH|#lL2ysk@=L2UT$`&~I9u}dlYeQ559?slT3$s=q zj>6qmiRhUr2a#WAcFxqpJA2lTn_6r`!C^2v$)ahJl~TiVa*FO zn+tB-Ao=+D*LoW%@#M;$uyV-V*gEWw__48)OSr9&|Ibww9y{+2aRoGmc{w?Cwi{&+ zs-ejEk6vvAj{o{lk4L#ad;E*IaU6m&bji&NpHlY&8rdhdgPt7a7zV#enikf1okz%vt6 z#%Tc~7B^iOVp8Wo&Y%~j_|q_eayj;*7ZD}lm(>vIYfr?*s&87BXqImefudK0-s2HR@$oNpxLg?tj1GZy1BUwV?;j(;r4)sIHz}}Zm_xT)9bmNnMNtmo z)EPb_*?Yi)o>#;x-?@~Ux-1a}c~L|J#_z5W4!U#IC6bMU16DnJAtVm%J&?SWG+BU1 zrh=Am5&*l5?YucA@38t0$7M#QTN9FB@+aAZW}7*qKr#HDQGU^=U*Hu&UVb>okNxk+GK{kgnLdlAWs z8iDfaE8W5Q#ZAB)Db;y|ER4&4GlafkEPAUb1-u8m5@nYSC{WR`jJ_z%YK5&&E!8#a zB9RGzm4gbZY65Z|&?$Iar{bw}L*#29(B*1cn&~x7RZKX2>RS!t5qM_@gi@_crY6n* zj(~&_qC@BkETthSgZseax-Di>WBz6rC_;w6Qbx*ha$e69B&Ie~0&x&@Hp^p2Ot6db zEDC20DC$bvVzo>Np1)ok9(erOv)NLB(Gdu8yQqloNG~qUR$Q8phP+>4X~xw;T*A_Z zky_gL5gio5A6a9Ba&>Q@N2XpQrxk9i)xaN2GA|ixMd1OUW~D*~MEZSLxag0d!rg0v zK0;Bj55ps&gBb^+f?&X{Bxg#>Rt1G2f5C0rCdRn?s<+b-7_f=WuZm?486~dsMCl?! z0bqpJ0c7DufYz~~4!Ua^m?U)~snrhB3}O^St}~Jtq`59k_fj8vCO!D>5x%I;lq<7w z<23Y@kmdou9`{~j#vJhmDi_>ZXt(z7-Fuc5_v_E$VVw#i3k#sVW~iGmTAhL?@Zm5N zf*SE$@(C`?(|^C;#}xrs1g62 zGQy)Np_i!W1urO-&>5gHihrtz*Nnqr5sjX8z9~%@?0l%zpc-Qd{0o5_t>INZ>*6GMS~LVEk`Mfec4Q zHAX_;17HeQ<1Cu^*azOIn?A#&_42ybV=nOwsV%go>x>8pw4dN}$=rqvGTVZ7YL*#k zXd!SwA2alZ1R4JUAfWaZe*3)+4oHYmYYP0w93*bW2?JPF^T>xNkO$YbNN2AXk58s5 zsz%QS4@`g0%4;CPaF<~;6C(Vc+uNOQ_0W5C7Y_$whp|90Li@esvFr&($?1Y4b|oq4C?w`nH^c~NAi!Jo;%bJk(w|6V4BWVL$F#BY z_MJPRK;292`uh4ll8b)Vu3e)U!f)$QnxD^jLiqIj6w76JM_J^Jk zUkJ@KN#1+se^+x#%9JK5g+zoTLNkS^gfb=-QOZzK zSSit9sJP9NO6DnKEM=^ON`?@Tq0Evg%KohTe&7Gz`#ARQc#rpZo(J`7t?&05&g(qS ztB>gmls|%Px3E34C({~;l&1Tao+X$v{uH7sti-Y@8Gn)`*H1~ADJ{y~je+AR7Wl{s zXt!*WGBylZC9SVbADqUtxwYafJSjXsKx?P>-q5we!fKS0exm(q75gIFj(VfBiX5CA zv$EeLzB%&d#S5U!j-XzeXv=5uxr2hngs^H$S6|f!kxQ7aj0$bzL_- zexcL&^+_ZSicWa*x{SyPKp>6)PzynD4}K*}fn_vuy{RJa6cyoLDoV4o^ObQws6z8Q zm*2bBO!dY%X~o~>C5s!cPVUU8Lj(F9>2pl9b99>US4j|<0#KHB@c#yqpnU!^-OQkk zz4U~|%p(X#b*smu8dtX_FAbP?Us`(M{?@ISkYOm!cC-o`40lAY|1_(b`w$UiLR&RH#8y^66fh-A4 zh5MM7O+RZl*a$vM`Fsp(CQ3)w(W5!2k65Mdwqi4reze>| z0fB^NF+2yiTK){m$3iQ;O|BCnh~BRrr-1f#CV-H=$XYby&9v%Xhv=lMVk+(_v52!I zB(Ce~FnISAw2I4;RMxEEqAn5NKP+#Z+LDx=4Wd7&{IJT~MH<(D=7!I_EWdc;)l>2y zr96s+E+xxILJ0NxvzFr6&_RQKP*Z0tPTRO~(W{bw=-{xQ3yS*3kaIEArIzzdk>e?J z$`3$uvFsHy0xI933@`>hlQ+5__Z1BRYyuXgi3t(!u5`M+q=2l2c6>O_VDE#phHRoW zx7_i(R!&{NA@WCnAi;}NN=US*HB9Ht?B}ufblv5}ob3L1lR@=Hj{{m5Utt^56kxQe zicceofAM%7)&AH<9?0jmpV_!Rw<~;Vb zZl(%UosiU~Q)F5E@V9Rr?d+bzU%y#edJ5C7hbL+=f?fzV;@7U@f=!mYD6wn2+AY|B z%J%BXLUJ5&ll#Z5V_5@68IEP4QzlMSl+{+J?ti{RUrFKoL&}nXvB(i4IkDn0hxSeu z2p!seQE;9z1>P!W>Mn<2`-I6J9?~p|L*SuHuPgbo`}?<-zZFkU6L_3P=l;1sC@UcL zeYQl=(Tq3@O7C|qT1F1!$5*DEuv)e?cK>)&vmxAYC)&G=zJZG;oyEi-v@)Q*HlOIP z_~+|5i$gJO7A9e=@RmVia@l3Az>Gb67SKaeAEbM$FV^fk{XOd9A9+wz7G7S}3U12f z3z!OVv$$Zi2(`QyLNMZElM-va?7^@S!uMj==7-jhl3mX_e9Uq0nKKRZD9Uf$zaLHj zLydFfUHb(m#jZ_ptbtTvApm_HTq`I>-+A2aE6nmk^Lwy7JA(5C@gs2V+_+WIaSETx zjYeEr@%d-JJ2#ZJj*%6{?zEa25I}10#i^*sJ-S~F~yyEZ-Lm6Vw6p&rFI1}DYQ zWdj}14gG>d3TC=V%DK!>+}1dLdBN%42cC^N|z zpCK5Vw&S1LjvwEC!oagbu!C|x>~(@}Ku!>HmVJ&G+SX++F)Eb>SLL)N;t_jeAP!S25T(LI)>0DlDCV{#PjEYU zgR~5)i6g*h*UE`2O*-8spe@0p5fv>Xe!ymQzBrO-x-LK1UVFL~TQvB(mG_T+GCyu# zcD7`#tF7(he{D*h&ek!$zr)WiT2pyYuYX}%h=CH1wddd0>=Zw@S#KV7A|byfII2!b+w~X7{1w2 z&(y4KWT<#naZ&$dX+aA%bO_3DRKx5tTBoemZQ_IpVH9MvdYm>-^&-bz$;q}AU1b-Z zdjjf*>$It!A^q`DWj31pwE^=6eb4`j*1&>?1C4l zj3VTF=?bLaE=qKsTmFXf#lUHRNG`CqZ%P@9#&_d+p@WsT_aw1VUsk zQ{Ma=Yw&)Vw_&u}GpDhu5o~G5i{-~=*fc(rE+E5%bLW=g;Bv1!u1lZ`*L=fpX^XI! znra-jc(J74x^n|0OSXVBu_LgPxxMY`hz>`#$>!zI9OdPsSRO{`WxL*6sP|^Bfm7P5 zO}8?6ZIL($$!TEV0l-`0)w_3Yt2?bn9(Fe~b=F%EIT7bIGjPW1*U4$ro}gn-s{j75 z)id{zq|yFnJx6G@D=xOp?K15r_N4*@;_16rn_OJ!)zp1P`tpQcC&LsUeX2USFF$|9 z@(X=64bJUs4Lrq1REn;t@i~}Wath((!(u#8ad1`NPNjIl2tI%bv|6YQ@UR|irvW9duBhVV z!u05DpbJJ_^epeh2ghccYgJlz+i?qzlW1DWQJ)d$H~si@jP>Z7H;+ht`QNC!u6Rtn z1UGtnR}~Z(fQU&l^q*fqnKvn{`xBlII@?8CdntBqKoUePumS@^u8B+mYm{Kmz&0}p zDPnHt_?~XU*d?R)Wg4t=BK#B&j|$p+!3RwBe^I&z%4O97t%O##zb*wc@4tHQSO0J$ zL>6U-`;W(L*Q3vsO<#w8+sFJBiFe9+V=cqCNC=p+zhD@%W`JPNtbA)BU*G(YCZGr-C0( zR7l@cXd>q}+gwN|jW>>)U>^ajH7s4O2{P%(ar1h9rgx`|QGO)T6UXJzmzMfwjSCAq zO+iWx1W`b2j$8YJhNy1bF3YouyZ8O8+`+l3IB{KD1v_264L2U=_^Uok$lh)!w-f0s z9#p+w2D@5BJa+@u!U9Z2fcT^CSy3~=Vbqt)g_c(JTz7)q`ki-2u3x3Dzty;v{_ujW z{r)C>be!a8Zl==eQO)H1KFi>LG(D}d7wzpG18oyCL+<~YYiQ>`vFtcYG1~}>FCEDi zT#pyJ!>D7#x307GcY2~_eWoqGspFE0vXirmAA*IY*ji*FvWi4G=4d_ z3M&0slYQint716i6o2GH>EPWzCY}ydy}w70+85|mNxxO0*3LD(*4=EYah7CY>lU(gZ^F< zYPHUbx6>voJf!J%db_Mtp|bsyM(<>>m=4RVZtb?Yr{T(|VRpeC;0@JP z9%wJH2hRC;6+gWEhLe#|CUjHp;wOn3uP!fGxX?aQwfd&ZPhQCn>6HYgZrZdeNJ&R0 z^esCMK1XPDkWWnfJEH32L;TkzkCzDv_p-;h~kg8BgdiUZjqhsgMFBiqNZ;7*gaaF`;<$9NFX~iObae;}e_DK2q zc_JZTmBpdEial0gXTofaC8l7s-EYPRwk|pw05=^H3sl-;$2REA!ef5KlJyR^yn0WB z?B*`01zC1faPPy8kx!&c-lx=<1BYcS?)B>5STzRE%72DExus@mDry69D6FYA2V8bcW!G_@^-cL#>Ld{I3Bx8xB@{R`@o8-AtS6j?k>7^J1J4ZhZg`E zNQ7zKXk9^3$YeZgX(?^#&NzHDGjjmp>Ssudr{#`yF^@*6L9`*osT9X_Xxp~@!jce? zCJkmqpvr2>4XSmBlHuXu5P{mIo_Fv4|LX2MP73Dz4TlVALbO4PB>5Kb8ld1|g^*a` z8Uioof&^&~jVLQA0XOPBbm-KHvS(BrFNV@BhmopiO%W$kwts`qaQVVDx=!^Z@!BKg zsMK~$ggR*|cJF@iXT*rz!;`lbO*`K~S=KqVb*om|R-x%82ln^VD&25}OeQ(xA!>a0 z&YE>%3^5?Cqg*JN+-I#PXH6OsDVhu}mk|W7KS%HnxYG4#J_h|APIVkyxaY7kg)FHs z4vFLJaT3Tj&AIe~%j9wbAvgyl`Y zf1^lY$ulNBQiarYp|7#5od%qV9fKDIK=gt5oc9(u3)|>1-M`XVlNPy#m{o52XQ!F| zi9UM&r*D+}&kdKqPa_ojPPwCpn`1TSf}IEQ2RQ4K10zAuup~Z2)(z(f+Mp z{kwOcsxO>j!4OfGU%h|wv1>*zdl#~RL^Kdw9PK>+Tt-a8n9*{S@yM0=!|0(NJlJ=* zj~>J;z77PpaVVz`C!JE#DJWng;8Ud0P;LEszx(ILo)4a;3DNWkRQ$MFG{F)DyaG4t zf*g_>2`+~;rUMyceh@{G>TlLz#M`nS*)NthfPap#ius|ow(k9-)2dhjCJQT{&A-eL zqr-x4gjvMt!gb-PMo>$rv!zx;^|$+*czO5+Pnw6z0y=&}(hn%D7dJvC)Yomp-;Z z)@a}ElW&%Ae^I}0G9GJ{)&v$aIlHzZ6y(pSn`Gvdk+HBtdSW5&qL+Py0-*7qUD-dk z2D%-d^nV_7Y$Hg>bn}+}922ICixw}=8kPKQU7vBwmi>XTM)=etY*f6i)xZ*?Q?AFu zpzoA0Odx4M2tdyN@RBFZn1Q9RR=qN7`n9#N5z%&o!Mw*flf*01*OAY&m_Lrxcsgb8)O*%kbzzpH)T?&kEudN+xN^+RC04FQ@|y z#Gggbu`VsG%by43tp#Zp`(fWf&VGJbp;LqmxxKT=Ex#~~S~ipB)Q3D4?PTeS+zUtU38lNWBPD9YsNt1{7~~}*a70(Bolpf z+VfABTBXWc>RQg1@Ba1KzTC95r*KgH%wBI${`ZhPRBz)Tre<~cHZ>+|X)jFWZ!`CX zeMPELJLrLDpORzQ%~nR5@HQl`L)B!J&#lw@3IfKQRPvLrcELq^efKftFe@=x=((|Y z)BfWx3Ik4p+hfE9?AHCFKm51qClXuv0qLf`XrjKn9kYjUw&dk>#8B>(=yi7LN5+8> zL(@>71bsTO^}an5FaS&rzpKXa#XaTa&0oG+s;(b%sMmmANvZ-l9SPaP9RDOL$is2X zD+?m~WDi%4`P|U(2#q#WkVP@z08zISC>=7m<=D7wBDX$(K%ZF=hw%E)6UG_RX6N&T)6#eGnCyVj@Rv{ z^oCn2!FlL_B0(9q+Dul;f7X<;I%(DTXqw_B6u&JpKW&3|I0{m~MP>IAcWnY5%w z7LYk;`13V8z8au)aA;baSof>7IDjPz! zU)ZR3&UeyGl19G)1*l$nt*D&yc)Pr|P{KMgNHGoz$BDYK@jDF4F4M!rhi#eK( z*QHqZuU?`T|T|;7x&K?OpZ5CKD%oPzS;&jAJ z4I|jcC$&?2fA{(szs7_(N93R8)HB7|3WtKn3S2*EW6;03HD3+}zaVrAx^~KzvT((( zS6e_g&xELt+|cg(cjFC8zrPnAyVQT~yrn|=kt3aTbcV2-%zJdxFzGi^(tGAQHQ6`j zo3);L8<7{6KZRZtNoULE&K++(9J=sjeBChMIfI*RBgY!(PNbQqv)=AdlkGEqeiuzm zX|EYuVfpn625o~$zF|m-FjD>G4gHq znZCa5x^$5?3BmEEe9+E!nj&nkUnhPv8R>cxJ61XmAdK)ui{4Qwa9q)>y(!&>4ccOu zP%sF{QX@t?r5cCFNL<1(i(>6B;n=r_Q#f;`&&Y#G&zwV-~5mXHqR^f|N`uFusO&w9kG*X?}jnhiqWPR;d8fRenzt-^T%2w2n zhsO3|A`I{uA%OLIlX4}>d2@lya#d_x%bu_&A9IN z?fKW&YI8ctg3S!b5H&YZjncIOq>}T1dJ5~0ic;Pwbl%8lac_2Z8(quZMskX6Uc$3U zOuU*lEcBJi;<^I)XcU{M%h=D65~(cB@?KlZ-H_TG-{{&xmqelj0E*|9P0M`DJ49UU z(|Sa!4f`@dgf}|uPVKpqR7rzI`Tg0+>o@k%-N$S#8yYhjAJ3ieuRoLRDJd#$f&>tS z)97x(QZr%v(WW5c^4lHSd?FZzFH)0&a?K2ADXYNJCkDcKC-9(acm9AzQ?kXO<8y zshw?_8#j*W)_k-e^5X`%^-4YZSas2}pBs5}=hyfCl$7}G6r;d%bhg|)edf%T!^ynt(vp&Pn+#D`^z7*Z<)o@=Fj=h7^4q!s z-a7~#SSY7LWH&(Bz3+S@=(G)|2Mrj|{{2g)gS<&+yEN9!dJ8bKV3tuJH?Lt5S=D?gL{@608hs?ZE z+fUTN=7dHCz+(p1C;%77SJJ+2xfxv6YQ2FnQv(=ccoduqVZ_oQpv}6OOa#bwy1Ey9 zuO(u79Z;n&m3b!J#67APq0|*wyDy7N~{2IUJF2{dMn)C}yF~T^LI`3~?zMR2DxIJihwmF&^ zC`&MFsHVop5gd^F~%U&OyZM3^|KyHX5#+MMNevgq^EEpf*nO30^Aaf&_JuI)I-?SY<^ zE(3lQy1e{@qV*?Jd*8Uy`4(p7>K}>ZG{P{L@wQ1R%H?%3xLGZ+c_?ASm`fsy%+yJ5 z9l6ecyhEc7tHZUEWPP>06^WaJX56EPP1pDq<3JaUR>s;LJAP|v7JqX;;vcq(ErejU z;m8pn$2lWRo2oH)AxP&yjmp0nqt4) zz`LspeSjrDcS|*L$vJh(^RwJx1BykCFC(hd>bBCG#|t{C*bfCv(!;dv2iWltba$W94rFJK*!GelfFD>v9k}^Ze04iXMgR5dZ@gV4XW5S5 zvS*Kb`ZTZRt;(chsWWFDkLbrzkS*J{4*_Z=(6C194+1uRQ+%!%}TSC9T_s%yk zG?Vw6D#?;X?!$ifOr7cgDrI&dKvN-QkdP#MaU8hOtTDtpoSu&NA;l=9v|oBRezp$9 ztzz*a5YS96x5qsN;iq@Ik66=(W5b{+$jif?HWoszZQo_Pe* z@6|1t${j%Sw5&qKbjKk#pv7;#L-`;j4Cfr1f@P^=1n@)(a%kzD^4jxU{&T(0c%#=u zZ6-1MBO)ReB|I&ytFH%IglqR}XqQh6*a#%pa*ku8@2y)-YRtl(`SntaUHRl0q4?a? z`HeSV_>_@E%vV8WwWeAa+$W!EbqxOq@j}~mRNQ!)UbmK*W zrtlw&jB)4526yY>d4CPd;n^|D9viBTCr={Uw$;!pUA(BaO_$O|OM1+&?n;$OBt}C| zC7RfAujVx#HPIOl3%eg~2^%(uzs2uIAOlKmk;x7Nt{AxPv7-`T^a#rW-D*YQKj*^O z*w}yIfcU`YVn?XNlHfKl>?0tPAV1dBNV;sp2DT8-aB!&QMY%pY^!g=#M=+=I3yPj6 zpE~3cL-BSg`GStu< zEnQYz>TcY)v1QXHh`_9DzN!O#c;@za z*u`L(o}QK12kgI0oYT_Po#N$H795IJ>|t*36wqELr#M7obo6ESCinPupun{}CuPC9 zTLI5l6!7TL`SM^P9m*fnHM-*>VGSYc8FN7VTm-@UC760&$258(ShmEU$B!PVY?(SS zLX3)nQKm0IZq(7!TZX4QS6pLmx)*&Q^;c%*EPy_MX8O+y7bHgRRIzjmx#YX1C)46|M@-i7-SrI74Ye6leTKlz{QAHoR1rGX;l0I! z(=M%8&bwn_(A)!14+%S*M~nmMvgq$u!2USWH%@Sob6rRm+g$+{S;eMW6fdY0A4bRA zeD$cR3aJXDg=A^2cMsHsgGTrsQ8bycgb+;$!4b{eEG=BTbjZ>mR>5#oMD z=Bzv;68}^JJQq|s=J=U2JzV-Ts#sUV?1-bUT4h2S?^O6(F*~7j#~^jVUT}_9c=oXr zq~pc++E1VQMywfRVd287)hQFB$sc~pS3nSY zlpB1A{o{O9!!jc>wcWP`6*%}L$INh|CGH(iE`B#Pu~r;XTTzosMGSjI!j>!jtRw1%k@JnV4w&6WGTxMOlq5GPIXCraZti#HTwv=e z0;#OKOMh~r>kiS9=gednme3*A_{J9EZY-SM%pe|CRJmwqdi?C zg@~m~2cFnS7iKulHY!StQdi%AxmS*%TpZDq!iXV{IUZER@{?Y@si!Dz*bTyyxN!C? zs~JcjMDP@24Bc>g$1ncV$B+4;&n0&-L1MObi;mB<@5&EZ`LfY^!JT94)~!2wbUrNr zQ94&rkrg~A)9k;0`}R>9BTw-rUHlTvm^u&Y&?M~+NKMtNp4IK%j^mhPJDwXfa1NeY z{mDLjV1{P|JxD+@(OgjF8BS%27-auJ#XG)xD()%m@IO78k;pA|9irO$fzxkmW_)skY=Q( zPQjbdZSApIN459>3^^9!kI!sW6xf_SXh*9Nne6<3+^S>*1G?c9WlE+ z!RN%OAio)skpX>yP*7A9pE~}qrP@M}dm(huB8Q}+Shnpg6`2vB(xHu3i00mBOlIRZ zX^;iU&qIqegQSPgb`3#ND<5?HSw$F<5o~O1JfozAl$1i4gWGi@fyfAc_MIUxtX@5W zm5T>oe2JjYa2Vg>o=}&WQSV%)_#pmk()!2TfCF7tu<4LUfs|mQtY~Q^q+dKt(kB7( zTX0bvSB+dUDPi%w0!;Q&b10b-0%F(e4x+$6?|)?Y&!Esb{Zrry<=sNJAyWgD9tV-i zO3q><+Yb8lY14V}+>5CaOk<(zabZxi+aDZegk*aSW7|t1-qtiC*FN;XQ*rsweSdSj z#NLf6@onV=h+@4^ka8$SEdy|1#>I;w%|tZTxufIc(J*IWw{1NVAI!(O!B26ys;XMb zM3huTqSNekL3U$t5S<8Kuf2LbnBC_+Y+Dj3wL{#v^j{x&S5r>SX**;sg*bcUHX85Q zuRK+pwsOcRFa*-W$izO`cH4^;e_&94S8XOAf$)wzJExH2*hav|%6>-YZEq=c%DVao z2f8VAzeWOD&OSv6Pf@s+QR?S=y6srzsT4dcyl`=8Wx9=63~OdaUSymmj0IL)5iXds zj7ZJG9Ub31al+%opis56&VGg&>oKu!E3DP(7c+Nl_M6N>cYs}B6GToj@qR^hT%O^T znUV0{tAtdSnVr2_R>#1t?j-EM6j@8F7=vUZL)ll&>Fbxam)r@aeo>fRy0tB&6iQzB zh4^R0UudGDkyzg9YW@h@J5CVyrl)^?9CC?fw(8--Q}Z6o=RlGRpqCf4ilu5eG>fL4 zJ3rVyRY`cg@#QR5Y_`|bd|g{>G|`3|Pnn{krq(U6SerR)kpDPw$Zw!aZRv6n+}Yv7&qCsqk29G)a{Ty>L)z4hBMI%lUN?O83q>uFeWb5m(F>Ri8`ey} z!g#D#@80q}1dbcD9L*B4pn^;f=!*0w32>=(M#{NoeBNvUy z-!KishG&vR;*+t?u>qxDR;C?ebWZqeoMo!QlaPrfdu-dWm=@a24OL|cID0&3*iUNZEjT>+7l$6*i)^_R=(lOTkdM%To!;?>sdSZ|X z=>>R#pJQSsXUdS|I(pw^ed~Xv(7t&_m9t&>yj#lL<$e zi8Uj;)>pAjGcZ zjvCU}XC_t%(pIfmLyFcp*Fsk^W}axrlml#v9;Wq%L8=9DH-5_*^y>AF_r&e%bm$P% zR%jx#ZtontNv4fK2dQ!0Fhk-;wvmK!L9g7xj3{zd=X{T)bsK(<~UN zoUToK)}l<0pM2*Wdf^tu*wN&#@4y6}KX-qVcur(O ze~o5B0BM>tcBa3|a^HhlFA5<#c)&C)DM`Hfss%fF;ds=K`Ogo1z7~tXo%}bu|F*_> zXFxe26vknyF>e%?Oj;j@d)CI9@;GL&mR zVlk>?w-JWo@Z_0o9F#(bTA@#Aq9x~R%jpi6L7-6*;fMeI^JicRpXKXYa|6S&=QA9Q z$v1|+PE}-s_5fb#;UD7~1`lVm;eT8LozQbnINyeScii4(*!%snscN12+CMn@*V>8< zv=-Xl>EmW80f|aXfi~O_*`0!|A6$_1oLwGYYKRun)Pn2Dx}v$?AXv-T+S|)c&gv=- z+%KE7*MI!rarJTBH`}CfJx1x;!HE!n`#v^CzsGnflc!5y^w%|TSqK6nZ^!vl3BQ;4 zqHthDIH~~h?|xIu9cltuD`S*IITa<&Y5vl$-G#%`^R^#E!Z)n{b@u}qPWl~PN9HVb zua8gL_?(O5SxnW;u*dGz&liQ|8_Zo&F@}|o2IqBloXog0^-ST3s`tcBHZtvb*%v5N z{M*74TxO^AOQSR?5?P$|irI(&Ka)mlSZtx>YJ5*DsH*aIa)Q%g21wXO zBFZ!T6^QC%H3%;wcWIl)?JsySw<_$>1B^yt&C3hYDxwo=`f+h_FeNxj^jt}QM^6=} zVhYT#Nbs3AFN#Woa(~m?nFvF|RH`V9{2UZj%7a6}5Fs#_q}E7LcIV)`IFD*3DG1;) zj_aKCI=0)>?O_ecYcVWiuAa1#Lf#H10kwN8wpdyf-*Kw`KPF9)+5NYba@wH3HshG@ zBD%O_M2)om|FBRR_Suit|6f}l#uI%d_8=U<$CZ^Gj_86E@L8e5Fb9m+bpt*1$+`pL zI_a=i+tOMEnbO)XnlfyzSREI4gq3nnj#6ARn92*h+dXwNuL`EbSI!d>Y|+`PaiXe= zYPYd(NECH9HQ0BLd@-AvE-dmIBfW4?R-|?#pC_07mYK1GC`msRNUTyzT+APF0I`SI z)^fHtf`^0zHu0Fu)^uW?gti()E9qKdLPEcR1NUYO-v|D_Z{Jh)fM&-_c^$d<^IUy~2M?AM7Vhb}W50Sr>!F5k;Nnp`)41W`0_8Vp zLa(N<2Z^{BS|2pA^Ptnaq z62Ay#m;mDr_#l97(?Bm`Mo=U~t4x?=kOe~1W@YvKf-QWXmZOzU7X8bsF zF1B{gl8mpB%a+02tln0=qk7km6)M=44$b2ueb_I<)6d>wG<)+}aqU_jyiCCcn-=FI zsSP<~X1l#%GeG|~4U%t^*=_8y(zXWo`0jt}M1+%#o%7YA>{@=zn;nH=uhXs4l!0m+ zi>JaJb2ABQzCGp1yhN%203b{4FLK+=;w3f?J`3KirRUj^I1N3DxA!l|HNg*)?$0<& z3K89863Q-aD)y7Iyr)9(v1h@~?;iJk^=KD0+AW{*hre2WfAXK&>-X7rq2Zw(OxFMM zKd9UMk-%J+bz2RTHAg>*#*i%`P@AM&gZl6&opQ!<8pbI zwYgu>-`#59M?eTAR__+Qo+WO5quHSYTYGPMc{g?VSv%4|LlRp>rX=?$8^I5pbLh}` zLdmXOX1@=uux>Vebf?W&&HZnzci(|Czb#|CUCDy9$1=mSC63aUYn|4`wR>>y9{wIn zVqNZY*=)`@zNQnb%{X+(8fwWBVYahJ`+{l4ve6uFV%cfYCj`_4h-2I7yA1oe*zjzo zoc?u}GDZS^`0ClS9{LEAkUPc2+lGYAMbe)K$+47_c0jU?#YZalXF4dRU=Uu;q{z+f z4gFZ;QYyxj6nCPo&f~|FcMZd_0a(f@B{+=4FORJw(}VwtEzLdEAVfqlF7`1j1puU+^@*W;+P!VSqt{?8Xl1U-fpl48}|JQU0_ z=Wy`Hv%f7^){eW^LtF!JnuS`6V>`oNlSS^S#s{9X*`(D&L%HlpLZOeC{$?78H~Xl! zY{A>JoShM@GV69_=aR+D)A{F{@lIgScG>>=`zoIh^;WG`?dp8>TFUe1J^>@7WR z7sB4)W}T<-2_gL&D{B{)zH1C5DEOXBSpx~0#)$jS+x{iEYm zySvmy;bMQ#OXB4S(TQi#TW`2g8*0VpG_-kG2SX4(>(1tRXG0tjs$6 z#yPdIp+Pnp@t);-rwhC~THCp-nbEY!V%CY2$sity@2LijBlX`v8{luTcLBI=ZFs1! z;(VY&!FEF%qlsoj0i1&&GIn{C9UN6I`nvfoI1&91P(773S=Tm6|48SZjq?UAdOhZZ z?IZe_Gp9~D%DFX7uDVgZ&rj)r7T*gZ?Qf9!he5dyr;g}vzccH|PTn23)iE#Cr0=yf zZ(xd8LDqb1bM9R0)K!lrE33rZ-u3s{Q+u3~4GaKgMwEY;&^jVb{QXP#5Tf)W;Y-TH z!k&8PZY{Eo?ksJUUe+BT>hhyUO*5kRwO-vm+ALN^DwX^6>NT&b4eE0;?O3yneQfs` zT$1ug(X6G^cH>Tp(St7`8^S~eu*e!E&DK}in$NziSK=jSx9c;s2L=k1oLPkqbQsKO z#Eij~rsq~PN8-Xj4&_d#{G$;zC)F4fWyd`QGqWQEQ~oa(De-mJpUYaLr6zK6^#@vi zc>i9APFs=h8hL_$ZW=Nyr&SaFA50w}JmQ!y)bQ+ZNn&i0d-^otG*UV;T$5(_I5*k0nOYRDXjSlvsTOS1uy(vPL-?-)h7y)qaPMAOFmE zL?1w>gnD`&<=w0v&l!;7hSEw^H8xwZw{u>&u?sZC1*BDz^Mfznz55k3$@#^WoLq(4 zk9V(=8y-CP!LP*`he*Vpxop{xa-*x_9vkD}R}}s{RIah5Pl4o~G{2Z<*lYBuVBNYpb3yXi1$;h{oBI_1coyV@3FtU43vGDn+c)LME<2++X}Et=pWAntr4L!vDfi#h+y405&3e^p5)z%@anC^hH!UCQK0zov)XyE#S zh`vdGFB$O;9C#1M0l0&Ufs_B)xpRz$V{Gax zY*Hl=RJ-_{L&lgxQ5@AAQstVlf0`7z7 zCiSf3HV2UoLjHIuvOK&b{^ip)zP)$z-o0;3v0#cgEb$b8$wl3Pb3JWsqp4$KW3T9o zfBJC(P^}h!R8mkd^Ez&euWz^XISUI$oeQT60w^7h5yCO|tvpL@uKsIZ`#7$!c@%hO1WK%$n0XJFE<9fM*eB zzsJpl$INU^flrT?%+uX{kCImIi4!=ts5a^T%3yK$mxznRQW6L-{HeKD-`k|jM{axyYvu*Yp`%2){RnQkWYlI~Y0sFE`alqB!k z`uYP^MCr%LC`#z-0lQm*-AiButxLUyLZgIN&90aFgJcsQDNG% zr(IIl6m(o`Svl|ZfP3TV;gPZPDxQVh*Sw1tuRhY((;K598Ow`db={SE$Gtr5P*S~p z;Jmsxj=Mti46%7a)8yjj(b`M64K&uXH=6xf#Rpu^)WmP1cfZ`ol=I}d`pKNgvXwe(_kG3*<@teZqOEc-LwxAaZq|iH#VxpY&I|nR`!x#I6b7M=bT%U z^uDNS@Vj(-hB_QUoUM*ouJljHr=Y_ zdKm zHYyDot(gkBU+L&xK~Se$Xa`W2B)W zEuOCIENuqLy4p9ZuzZO%1yrO9TqUnGZ@(faM~3YZa2H4pGrmSix<5K$zf{AB-IaYI zPnq4^*lVd|+9@Yo`qQAAr{S`b?&P2Ri9v7rufK3dZ;x99f;+mVep?nXq?k8q)mBS< zqWcr~uV-6!-o$v0y+4_0+qYkyA+EHwO*Y=N`SSI3>HBV^?_L*@|LZk@AaVY}-!TKv z-cc&hnL40QM^Co8-KzznL6iNgAKBLfj7SskEZZNtIQvc)+VzGjL4NFVppxc(g9c~R(Y;T)`lWma zq?kQxmQn43$BDE>F$UQzVd(34EZ5gL+hu;J`1pQEpE%2*kB_VxUO30~^J`5b4Q198 z#7*zIZ45l1CaO9AV`bYRS;;bG-~}UD z$zLS(Rowx$;MNl$`TF!pUrS4?ZCk^DUTyXC4zu6B`dyt4pdY1KjQV}i_ErVrnw_jK zVW#Yo3RWN^n69}_=OJl?8YNRITZIQ9V`49`J%-YkA_x@^6%)2lJyoq%tsSgw0#mZc z_XN_oFZ{BWpA>o;zLF@LhunUeBR?6b!$4Us8ZJiW5DvG~kAC>&0NgR7sk|@V&zL}A zf!9QEgSS+$rMrxcmmnB;>MJ%*o9}(>n&rNCRuuAGEZl}`6z^=^HN^z+4XbVn3Znbh z*x!SYNz#>4X=@uAJ}xfC#As~eTp)+N z8@Q4)^2A6cZTaknqL^_jyi7CogOxYtq3SwTDGooQ|MIDk!k6+EAgzt+K@0<@D)lpq|){R7yl1$nJVrVRh*; zf9A}7jP~hZc1(Zs_MUhM#wEG4ij|3=`pi6_N8zO>mGXVObF#cY%sg3D)H9m8h@+J= zyVGVHo)_c(KEIx6T{m{g-n)0Owe{a`Gp-J)sL4I@Y^vt))hCC++c#3zPV zsGTU~i97(!P=ebJ8?&`h<%oAu$^iWL;Uk9UsU+X>X{~fTfRdK(8~%~m(|vpPJg1Q> zpJJsmuSOf0aih`FO-!m_v}4YsD!65ZPY@?eh*a>~+|6=Q$ffCbmx9m*>i7;u zxfAmf6rEfReqUQ#TYpG$^6~d)!vP`-Fo|3gowz!lUedR&Q=9GQ!RLi}Vn@y;AvS5vj@SnH|3J*h5)(v1ozc^DR9=vB-!L86Gs%@3*>ghwI&OJez)g@qzQ_w=*!0qui%* zpv|wF&|>6Q7^47K%gxx^X}H*O5oiLdPtQ8vsx!gOuX8^4+Zp__DAU9_^~tF~wqADZ z*l#u?7V2IJ|8L=ja9j6IVu#V(FOx~T3gLggt}=)Rn*PIQU*nizCVX|w7$_7alKW83`&TQbJLR?t3x2I0lvnO!^VfD*Q_}@l4*ndpGEi3m5Du9DevC z2*XV#*)9E^LHHEXj~;Egp)b0{kslQ z-SkkK(+T{LlIynVduKQFSpFd@h#bD!uku!temvgONJ1JbE| zdxxq&Bb=OMqMeQHKdtfoov?mAEP-t-MXY$uQCsp!d^*k3Q<7NGYGdFJNMBrG-IF0A zlM}pklX1P0n5)apCI=Osy;24ig?v+rJ>(p209|EDeYBg2Joh5bb8w?gY@w~D3Nlh6 z9kDOXGI;y$-OqX?%V)ygXS!HYS_TMFBmIf0oDIA1_(FMRzTaazZ--I$DgXD_@*@SOtjWbc?Qf1{6_`*n zpu0`ohy@i;S#`pOkS>MeP-70h1aV-O<;9CT|J3}m2%V>5Y&lus{7BR4UOl>X^KTGe z78@EGdK~`dmc5pl7yV^I=aitLo;Xj@zHr%rgAe-Aug>X_`rC$H08T!k)p)O3ha&5C zd$Zdu@|}EsaUhT_@MiSu&facrHSgZd3keC49M$T#ZQbg8Z%d<-Szk%9vX>CJZrv@y zGoYy3(y3FQuz!1F`Acmy&uH;p!oo|*+2xRG3=F}vY%!yCQo(r#lm7jF1FlUuE*0rx z7u~V!`EAuPuM?N=+}V)75u5~TKkdPt!8DkIO3GYs?{!FY>Bd?zo1d@IH#s(}-;7Ea zrt?s7ZHgT?t5e$v?URxt(4`L&2My}5adb(T+N!$yEH^QnbrIQ43ej$oosWI5_O`RR$|izf_pqTZIHTIz160r$Z( zVQXJg*>k1s<;#1|@Juzvij=9ioWP(qdkgyB9Ams6FS(^yGGZ*1>YDG~MGiXXea8zy6qZ@3(Kvm&7xv#?WH5 zT3^RT;=pN>Q}-bnx};La16>#^+n4J8KyC%L>fj(ZSm$fRMRov$eR%Xw7frFfw%yGx z8&90e%QlJ{YIWj4+K*3-=>{(UOD1>*QCsr$*}Q3Pk;RzaHPhZj8NRxl(toOT<6%}* z+<5cVJ-?EBkZO!W?bV#QWy{@(E9)h~-zLdyoSS^Bn20TYkCrz+qE zj2x+yH(0I9P_Jpz@_-g5Klbt2L=2S^hJC$)DS&d!oaJlf8nd_V-p!PH+?I{2?2(N~ zJ5K5jvKaji9S_4zQX19*AZSa_g1k7F+)igIwCru$wCzL&l%k=(O2@seiH6u3gthb}R(3bK| za71o#Kw4<3arv9&jfXxrHUhf?0!XZfhQ7MMn-fl+hzP|k5mZpb1fcHKm=Y()d@~cP z4);{Kwiqt$aq9Wt3%#_!?9HLCqoNh@%yl9S@QKYuAD*s)B_u2CR5FmsUKU}B!``uf zF5J3#Gc#(iyR=g%E#~t8naO(!kIc9}#{|rSigqkqs|fO)$BjI0=*ExpP$n7+_s(=13M)--DGqG@L$r*6Uwi zwqHMg#!ql|c9t%MtIOcJ?p2gyEJ6v5~Zx^3?I~_KI}HNs}ihrtW8B;`Ao>?e|pcJFO3T`v@*2u%D^` zib_`(#`p`Avx`gOrv0YVVyVwWw}}%W14xu0iW+F^+<|df{gEMTGA;%L5eh(_my(}2 ztC>EF_&ghfY+O={!rC^s`0E|_GkPFxfd+4)eFYI1GisF1p!s@9*CJ6;Y@9b`z(;de z50OiaAc688V@XYSKD=jZPb4HZliRtkNl zMyt16_`3n8s@=P1+_*J$WvwJ2u3xrRXDTLCfOjf!vMZ^NYCvufCsS@LZf^|T;O)S; z?dyoe{{nYGrjxp}X1ag9bxE;PToDQ%*=Pdx_>N^$UZ>l|u2vT%dSNK_SmO$pV-BfV zoU@0Ir`)tXSVk7t>@&6Kc__b}+u-f8Y)z?{u!k_l8W8~aj3JCSF-g;FqvS8sY2zx) zBBKK~xJ{X2&0ZN8>5Uf|SC*HR)jiE)SUPfbYo~wy36*~O#jTSEvh$J_fryfRO>y8^ z0N@w{7!@X8>`Ri?joNZrN^lK`}!S%m|yQ)s)SwpLdUIeeMN z^_UIwtv$vvVT_AY7&638gWJ>xlGOcx*|RgF#7@kZhOqT9e<^blS_pR&lT&Lj&vUz9 zf=Nw1s&tR3^8P zd~+`yZg;*_qHzYXSo*Cv2EBvz#xeyypi*acm)B0tp=7L7k#UIQh$U_eMR%jon% znxh&hYqvjTXgU8$(W`|$|90qS7zF4br_?6vJ}%8tY`x}d_*ka?aqfym^+hXki`6gL zYLByusi?u#0tF(Nt+ajd#n65mqg>QJiah>0d$)w|+b_n0m<|x!zUDEkN2y^jva-AP z310E}q?cI{6E2BqPSa~~-8kNyYS!*ffA2xF>yb)3H0Rs(C1eXQJ&?!k& z`N+ugjpgikDtq32o4!rOvCb~3RDnn`DtnyKd~bu(P~zRGXlsEM|1_&m17-OQ{3k!x z1(1WU$rlHAr}@Ag(bs#))zTMN7oX>f6Y@>ZKM#&|Gok926imzgP8L>oJ~~}&-W_|; zO?gmA%x?X7? zMfC3wAZGRK=dROh;;>+JFHY&a?a0(+k=g4P#z_n)MC+D1t{R53iN zZZa2FINAoomS05`p%!&}daiahi0<1awpj|e=iBekCJsINH4h%$klGYob9xUFM_E*2 zmg2N<{~0{s*++V}Xvo}YyQKb?C1ZYpnd?;}o+>X`(A0NrTP6MeS|K-OEiH}zw3meC zPtNe*b{}S=%x?!mx1E*xHeM{-bO||UGYoWl7Z}o^aTgvJ6%GEdXgCI3@fj5_s-YUx zA`At}q@bK^U&HzK8#T&AV~y-Itfys|S1Rg?mGSzkd8{5^zkUGIc8|~*|1VZEx?uP2 zU>3ID^g2=+Y)*dh$-jjy39N}@Hj(J;1)pD!)k|Dkms&+XD-c@?B&EO8tZi+9&EhQD zD8|q~2{e+9#v_j(WkN2jj*r*^XtWuj94} z0>C8!{s25EnXiDk5FiL`7hW02|B#)oXe-B6fW!&@yDW=ylg{#1<1^I;^B@{)20YwAPc~i`En;iN-+8*aY^;cfFwg zX1DXH;n8_>KPn4cZTv(P14cnF8$aHAjR#Ixd?eZ%Tci_wB+AOWNw3_CpFBBF*XMS| z84s1W_2`jua>N|;nj-!=luNyl>*Y9vy3<(tB1aoB{aMe-#t;{&bft|rB<%#Z zxDkDlJvH?@2;9Eo(-6mx1s|k`5%HHf0itgDAy{$6^*4=BQGfoV`t66R8%@Ngr{~Yj zoA50x{XmcT^VO$Mzl^M3r>}#F=Aik)@ZsuuH}mFsJ0$9BtohFmA@XDo!X`J1d&obj zMn`9vNeAZLV5|7>=`4_@b~93v?HV(rpY~44ibI5@6W23;Kae;Z*mZ5A_rJ~o0==|K zf4r)z-cso3DSLbqO30nmlr5KA&#qRvPz@N(DMRzRE_;K?XSYNn7X!?UOW_=V&g_4k zx@8`GsP~Ks!KdH#uWeRrGN`UAIGjMXymX1;3DTd>)`H)k!~w#YrGIVR6FC^fT9c1rTxM{3lDLRapik<#*Ol@$*G+t0gCwy!jD@4w&@Y#shK z-~CPwy5z~%M?>e?w(V-Lc}<)9JpD4kSQ$+_cI^CqU_FHxSp9VHRFdIgVi+ANTJZz? zwV}H#<6E{hW?bZRv5I;gbbJ4foaVOAHt~n5=eb#AXCX<&LH5tzm-!z7-$wjqLffvd zo(nzB`^}~QaG)?x>;JHQ?qB4H(pdi8q3)S+@smzG;%+k^O33K&EQEHRfWZSu$-PIk z3kzGmuUp3f3R9*u&Gzf+UUEHlw|6`t|(D1FDGH{wtEED0HKCYorzKQt~16@D@-Se#Sl?v#28f%>0VpA={ zwLBi>^EeX{;Q`1<=5%7s7`P3TvXBfQ?sC!JQ@Rsh18Asxee-6$QO;?Lq>k=MGyI@q zO^*66#|c#8{w>G0LwDCAWC)@*(2|F_#k{$O%K{?QqQA&Hr5*S2z0 z=QtYf9p|hJI@c@@LkcLqdvo`QVdH-5$j5L>elpHfR8(Z&O5Ve67o5WH-@T~2V@LLp zBX})Ol+m=%{w7>iQ4nfsYwPBpKV^HFN>MlZey4uZeAX514Ls7MInMDl^gXABk zhK8}bVt44{o8aoRz|=i);DS0MVfD8a8&ik*z#2$A_XXA)$@!j{o|h{U_Tc zc9(??!qUzCr@X)*A8k)B3@iDxv6iVJ@!Try_V!t79h`lYDs#gzG}5v~1V0zD&xguW zvu3~RcK+2Nhk!#GR6R)LRvZ4OfY4?2U5SUU@m<)#W%FOuWFta_tPC z43Vf6Fwvwxz3@lQ;q>&Qv$|fs(&yKoCaVpG?(_e3bQ*lIc-7I|fC=WAzcO%)R_$ml ztr$nB2gu?yGhQmwGi|18(OQ*Z#h}Z~QV3SXf3eHy1-%^gR0IP zKB{_`Lug{Hs~l#0`{tX)T;rwi5b3HOF4A}fYmVf}6z%b2@$sS1m@R9iwP}=taQ_yA z(B6D%wy_u=#1&8sWB`^So}-vnN7H{C>S5ZJMS}EJ}CL6#H+; zc}{%N~~^RQ#?hdTP<(_3C9Fp*_1q-O1}?(}}dL+XpYS z9k@_lM`zuTjSpLQR(^irz>GSRi2jvKRiJrMh%k^LA^6EMP(q&XzGo=|&f2Pp;nio8 zyw}076GgGpMiHMhzj5Q9EjNFYoIM zEey|{*wEts3(e(hl|a+gGp1GHw3r@($!IS+^2fF6M()zmJG%UYAWPgBXd{k2TEB1$ zC8LV#GO4F;cK&p+dR-3{P&6`f6O845bOC?@837=J9unVS%JNZj%=@99=C4o&N4oHrk$p~yIQ9~zDw$yyIY;k-@m$> zM(*{YSy+fnocL<0-R&#-)*U6PCyq8t|9mZe_;3{6ok+9qr_FdC0XA)oU-V$R_I3x_ z+M$7?RFIa3FnAbp>#?5N!HeCc@3MfouAH;%4w)!9A%>Aby85cf6+R{~w+7CxUiaEG zLUol?9j`NDq(_lf326$zWxo?ddXH5GO3U??Jd)55@?ib_bnbIc(afw}*^}>B!WsAJ z^Ob^#QVOOzHU9n``n$tN)>O7{Y*^+P>)-gjYs0q%iK!1B3|?w?eqoEVXTLOB{;ufp z?fk$I<8~cAx@ml1;M0^J-inH=km=lBylbr^UJX}p`4o)3cddg5$~`kr^4>)42myC- z{Y@+TKVJrm<+=7AM-}#|%gZi9)tma~&p?I2l_m04!b3cK~KGWsY%}mPK2B+e!7yBRcy^6!UAYB)L>HU-(~F;4JCQiUKZNx z_|1~%1^l?W=?6OEo`LI(c#c+xf(v19&A+q4?mhMP?$f^n2Mid{byAh?lsCpfemzWg zpYQmrU`W%b&(9BB5RWweyD)3PS>FXVn~h{*TEt{5Jt4C@%XQS4wf(1H(n$rSb9;85 z=%Wg&(#aImetni(TDyEj1&e*)Ou0hWn45yVj39M?ix)2zAAffMNaU-{Fn`F_gTFk8 zwjNKsM;Gc!EbQRNo4}OeW+C-HvE^l|W>+;~$BrGel>O-_6xwbPJy=U+kK~DX&+O;| z|KoOFHnI`Q?kfx(dh}%6^rxei{0@tLf7PO&=DXSv=E-vo&0txBT1d!4HMM%N^Z(Ze z9Uc@E0kSc6OzIHzH%6fz>bXXItJH*qF57OL{N|SM63Nd3crr{|PYue*_}|CeK{DeL zNYDXaXTNjL(AXr6sZ*xBfgZ?yo|jRYWkD`Jetv_uzs7i_`{%KJM)fqeY%xikR94Yq z(xfRvhpHMHo=Q(o+|?=lkeUC;BUMph4?lRs7?1Nhrm!jjHj1{?b{|hUj6lv@+htO4 zusK%%9zb6s8`WS__my%3Dezz`0dq!HPRh>78OQQwDAgO*u5CN!+w0P{n3w=)HxPUy zTmRQ9>~q{M_8LpST2H6d$u@c#X9j$}q$ge%3b9=@l@o*^U8Cmz`*XISpoy_5+K?)S zi`W6ZP&;W)K}?ItYua#qbOrAP;ZvUK7t$Ym5S}hmM%mkrV z`-c(ODD50@0FUW_fUaZ5ic=)jDmAs&f;noEjBwe<7wEG47S4@QHbQ$q7SefP>|hYn zRuHiKg0pn8_$4eQdqt;1FaWMpg;0g7Be#*wOu_|k{+`hANGOatV(tyR>>hyQa(8df zW0|<|FJeb8nRtucw@1DsNB&^8#T!YU;NRH4!myg=r#syi1zY#-p`Xr~+$xPpkgvQr zp{8WUuAz4w+S*{mA^F(pI@O_M?nbR8#GI3NlzoVC2rJFW38%|n(gnllcNBXLC;E+F z`pd;gBey*Ljhw(WGs$arXd(`I!cnnl>9IOy?J|WF;qO*dh|P5z%e=fk&23iN#r~95 zK2{#TlT?sRr{8{d<@&^F_aT`Y)EnhN>)c zP}k83oiW3^a|xwygG-;SPmuK+7-ZzRbw zOs4PN74QCQd=LBR+jnbQS1kmo_Xr~pgb;sZfJpEELK=pS6?lAdDg9)23bzWUyXNUm zX(XLGn8j%rTTNezS|hn-n1}5QTr^Of8O6JTGiR}Tlb=d7dS6?MSK9@GEf@b?Z7qD4 zW5>KKEJO?V9{5(xVT-!7IOo*&sv+B!l|NawyKvd&9XnJ6q^Td5=zFfE=b@6}MUq!m zQ2`Y(a8ERm)t%CI)xUjCSGqz{GcrP>D|PUVjY~aRCIq%#dxfyhi*592>r$OvU9r_V z6@EY}1dMBz2Mw_4H$fyNsn{&;T-Z-3?KTAJ7sB~T=3zp#wu(>#iHW}UT&H;`wkFPv zx|flg`;FmI<+qxTiqVS)z~6(`1&w*+%(Bzt+nf7})5;22R@qA6?A{rb3zdW_6!si+{gM;8daI2U zhs{=8E~~hK;n1m1??z3YGKJES+*OvA)9|*Z#r{k!ipr@sQ@*{pDCc5zUM}|U1@pw< z0oE#d6jM!`6)M3b)mC8xptrOCmU{D>PM8jX#|(@qGH9b1d{}go7YKPgkC6|mC?x+u ze`{DAdG9tR5aDD>#0n7)6i(vtGxtewlqS+x9%N4NQ%Le@w|_9(wMd4y-Y|axqi(Qk z_*WBm`K-S8KcSDj8F94+sV~uT8Vn~t#@M{c-*d|o+M)N*64&BGpc_Pf`O4zW`wt#q zQzH4R)kOxbN-tezxI};T`V`~$lgy*(p`=Jn@SqCg87x{gx-(CIPr)I*(~H)+Y)r;Z9T(tz*h#FB_mcQ$RXXuA^8W{0Pov>JRLMG5I*ko_`{P7 zf9(^PU~Fo8O-=mVdl?$anL!oxdo~E`s1E%jAQ9iRdcL^)@YuqV|CAmg8U$6-lK&|^ zuJn1j*Ko-Tx6Vov_hgkeQpQ1bL^)Fr3rbRuG`x#dPB1j}eHBx^J6?-|qR*6TnrMFU z^}wCiGy{nQv^Bl>6PZ$$^cVX%1+ z`hOa)na>nP7v}G8hStlAk2dSiqRrX=AtRL3MP6CuWRrABCMG#~G=($|WrrX{jjyV! z`{Ne^RoAAU!r&p;2i<%k>GPjNQh(4*g-@PrGy=ZgKQ1_i6l8rE4tbHf@u6)flX{@Z z?B0FB@9*MA;+>!mtDLMiv4W=%YBkoXI4nYOoal1$WbFU-T{d3qw+3txr$S1kf`WpT zD-{H04=0uXdUS8^Z*;ZG?2(8Au>Zy_4c>%@qblB>m}PH@y(LxUNvCl4z9?)0!BUYG z1clhI@DKZ*wPd`uMR}3Y8bnN_+!nISo;>e>sWpZch$@PlM z2P&$aiv8X2A39bGCqn%D$TUQ8$myiPM`YmNf*cc0;-~*BRyx%@giJ`aTPal}Xn2p! zdgCEHY#|8GWd!(ak1_jyqDzkaK*nFwLT?XhqWT{{5XO0XcqES5Y&Vq~I1@<{rvmD% zFWvm}=S^hY$lTeq7hph;>fecX_nvy(Ez43}{wt;9q6G`ETEWSseB{nSi|%88QaZU4 z+cWXBftgBm=I1}aerbwjRLTJLFNGIRDm45iSg`Nq1Gb1h8~i6L4w>TPl28@1?JBIY zi@Xtb>qSLX#2=$!87sI2ojW%VSCcjrgO_U`600D$ZJePL$ndEw1!-5b<3>oQp zyW;+R*8`8Ut|Xljy1KQgx5MYeQ5@CGBIF?nBU4f?DNhrh582qzobMhk>x(VbJEIsOAGXp8Sh$ z`if%)NdI!uhG#%duovoL9XkpU?2!9s#=g5ya}$jfOex{(J321=Q~4eK+s>Vbz!`#r zu?%%?ml3lBVt(Sm=b628d`#|PE$!zA3&kv8_1$n#f!qn#`&byfTkDZ18ESIkWXKak zJ#tZX3Wd;E-aL4s=Ct{L6=6r@>LdpVi0jsKiq;UZI)2a!465ONpvBIv>13iIevq~( zWg1#7QITeA3gulG)qy?uwwOOuy`2y!FC*YPJFt`Yzx8aW!JdAPcT1zKXt~aT1;P9J zWp$*Fpl@K{bm!1C8;%u&0ofQzp}W_q(EuE#lb3NPxwgQ7k zia0|H?uX^RbSZU+!3u-H3Vy!hZ>_)c;DJ5H4wUkEqfehM(cSyWJL2&*7`pU0BvJg9R{R)b%Wl}-tfI8^Jb`AY@XS% zJn3enacI0)uoRd~U}qZ>ef(!1&#i6YswHu&J9`?Jmz5nwQc2Qcu~JsUAtV%LViVk!-z_9BGVd$c`f@A7N8}6e|H`m)twZSYc zJ7DBnjmu*aKRBt+F?vLO%wO!Q9pCcDXg|LbQbMad<&HDHN5{t0i@{I^CJ-=qp#A;* zhHvI`u;D?oB4(pby3bE`R42G005%KtTy{}hZ2VvOo?s8!Gzdc@Xk7sO0jn4LyBM^& z5T{XPqN1YWy0OzoYR}r*9G2J?xL)5`Qo=$gZ(Q15&+AT)zo3p4P{O8IyOqs?*LQ`| z$`E4TDj~nc7g=i@Xz_vj0bft^VGc7Iat%>N&+Kl6Xw~>!fYuLqa|3`AgSnD|oy{Ri z`^LUy4*F;cKxCi|XNd}fJLjcnRso7|Pd?J_V7|@4I303bHS;1_ou|g*PNWp$3`L211`K0@PD<19oQh*TN?Oh>ZkXpcA*1FXfu|=VgAV{1?9!||C76RT~ zWaLiPQH5n?>bkzKUKIUUz)ibt-^4=r2W4eZj4?=tbdB-h*3BPHuN{>(yWS|7(d$yH zq{ja=#@?W4`^8|N;rd{CcRDvj^kMZI5-UM7PIF;nu=_$E%<&xoSOY0^mmwv{nw`OIqov%;f8Oc`#KmBpT)a5sqI=Adtv%94;>l=lMQMJXCk14$(v&s7k$tGYpLRg_s8t}B*~fA$&(QWj3=l9H!PMF z&zw6aCydZC_rl|22_|>kF*b$94+?{hXp(BJthLr04 zmGml~Y5}2>bed@q^q}n~D^E4l*ejDM^H64!AWe3!w&~oCaWYAu0MZVIVgV*umoF-M z>m1uyuY~iQj3}o7svAv7Mil{o1P~YYV=nfQH;R?{);Hf!>~o@EX)F#3+VODDw$jNO z@?C!YLGPxbFxYqB;H1=4!#--108hqw&FC({`#>fOU>`yy=N+*F=>9pPdA`6UR47*= zc;Ozt=7g|W##nHcVgCA`l}NiM$6cjkhy)rCdL7<3#Iv3#a;|zPy;mUaqA>eV2j3|+Ou@8H#vq6LELrx!a6^V}#U2d+d z(3~h^LlvlpPOy@_yJnWmKtWq@kcHcTXG-_H(7W(HYzY4#o)nZrdQUwz%HPz=mLdXU zG8iC^50XNby?V;M7p1Cr>$yvmsaFu&*CBT>-rQYdO-))y%;OQCiR4k5H;ZIXW?@=u z_tLyUjmLZRAH+f!-5=%n>PSRuW;D208MZVBt*0`=1yqu)qQQ4x1b|}36sY`_3+qS6)co!UdxrZJX9QD7`z_VoY~{YQdtK1ygGMo z!r`_Qv!hg_(yP19dK&vdcFauUkUoeip;7Oxm zf8Tgn|BH5>U41wcwhs7-v%~LSzi17leK^Vy9b8{F2O!o9Rj1C#Z`r!Fy`p)`;EshZ z!p}2%F1f!1XJZh|7=SlWeSA?e%+AiH2x7Q?>ceQ)M5FJb6l2qb$cc)@Z)Oql@Qi*K z!K%~A$3}S?Z#HsYuJ3Hnrf%@-`d?gPPS4E%UlR!Rd~@jn;N}Ok3QytYO@^@ilVmrh ze5vOmob}kD$cv2u4Nx2vs!nRivwX`faf^nT+Ojwso(YXL^9PO-H-8(mrg=nUK)6d( z>1h3hL<1)a?oj;nR;~&E`+^F|mzH$Vd?t5B&Ri)*zNYdt%l_sKI6T{jBAnn%cwPJK zcX${LH_&%ZcDDPkk}tphut(*Zg0qH1BTVv+CDZTQySKa1WQ^cVey=C<-4#E?IZfa# zh?Xb(+b!4s&%S3_!x{D$AT8mAgyw}$bmuPYm*DS%a17(idwDH^l{Cq6bkA)xGbcQI z>!_?G3|NE=(Kza$&qa0|vBNC<3lwXpmK^IgRiKB!Dku`vR8<3_$NVphiLs$AA!||5 z3~KqJ6|y-& zrU_)WCu}dRb8+eS^H(}xD<4|&?TXQ`)-PT6IL@e)XBs=nWe$Z^UpLj>X{>G|4;zr% z!THm&#qD-Q&x@A?co0|OSLWul>Bh-M3Rg|df%10(Z__NwHQ!%wk{R*@z2yfUC{gg z4P4D*JWJ@_YSz*AKx%`Zn{V1@>d4?T-Z>*L&$iP>^b3!cXI8*X-#gVM%a?QOHJzQq zkvK?9nl$+D#(=XMl{;l%NR1sna8~(?Q6HBGQh8Vc#M^fK_~&TvtSzx(tdp^yRYCFm-r_d9DA5CVXqr zOZ|4EaPDVn+Coc7Uf%J`uf>`d)dj9kS!XOnu68!7uAhL^)&AelJtt1o69NxmrCd`T zY}flg9BXkHo)?nVDPY9+<@)oDLS59i8f70kw38SN0ZFX6zrX54lA&Ygd0s^MXx z6rs}yufO6Wb^|Ai-?*`OW|WeU|NGN9{M{KtFdVF*Y>NeFM67+Y$<8VTPP|LNF?20@!xTq zhP|-1j#F<`ayQao4*7(KPS_@-$qp11S@c7POD}fd@SgBqQ5`!vDOt*_ab_$1ko$^o zJ*PkiA2#e3btIBcUMF{SE2;X*W9xRI|= z-fbDxGo)@N-*xh>Y)@muF&QIAjPNi@RR$GZ`A& zZ}*4|g9Z+aZl@il7UiuFr|zUW3;CwKeL)`~UFagTl@Wrmr{I#Usamko9oZ({7L4xpd6to#M`&&^V;b z^5c`VO$r#Q$vC~bThE>ml&?v#;V+p_9f1{iZ($fe1&uH4)qI~5%Wb%tPO6p+z9FuR zm8+3^(ITpqARwBTx}c{D_dSEv)VegZ(N7(K`}RBAO|HgTYx`PQxY+^9S22B|)?-qt zEA~n^iN7%kX}83{{4rH+V=UQH55pC1 z920#)E-W$pSj8Ti%5%N}jwD|+)mmE-U^sguv*Wyr(Ey7GeT@dcmRO<$GS~3dVWvqu z4xuX-S?I^9hwUdrODqZr=4ox-;YE0iy}n&Y0MB81)El>n^z#p(_Z1Xh-~Le||ESnsaeoM;kPR zn`}sD)cIJTeWV=V>9AZUDrb-H!GtIZt_{9QlJDWuogEIt1_iNU4o0xxvoT|lNXL7g zoPBm^gxT#|w>GR^T{cj!nlG!PqjQ6tpHB@%jhYkr$u%e7y>s;)vH6zZdD*;v(uy49MU_vV zKD~A=XV}zS@pGV3f}8WoeF--Vg_6m~>C=t7{-CyFP8)J7+c*2*DZ@Ai{TKDWn4jFp zI*ejy&a)mICnb5FD^Ce^MSKV+W<^IjzB6202K48|bNrH#V*-@B#Hrtnb5-in@O5E* z^?F8f-5u;4y2JptGrb_Bja_wrvDvuuXYQvZF(2lQvPUdn7A0BvdPzfAp^Oy=$(|z) zZJ-1PxvjoK#88ZZP+4&aeoLaz$!_ufKop#d1-D_tj71&1`F`BU7Gq+BIrcw_*Xj6; z9_^lU2v7f_8A=G6yHvcM^$YHJN#~~5Nv-L z5$q3R;ycnrQ?+2hg)uixdiUm8J?Efb_GdT9@VyT`!E1pIQYtWN&k0Q0vSsr0>9?xB zVhtjeuRb(welZmJHIFhA{|xDudXsTiU%zFqdvvH%Qq}ELurhzZ(m(TI@g>dcrmydC z{lw#fdE8lEs%x4I4YyzKOuMP8n};h0AQ8@gzC~8H%N&A3Lax58uLw|IJ4WZhCcNFSP7*?`~6H)h=;%(@8j}Hx|l$(TnL` zs2~WNJoY|cT(7!5yv?*|MmU(Y@Zxw=7O_{M!ZriMIo3-WPp%wFr>Ur-jWl#F zUFw9Qm6j8G=suiD$Q-};>k4)w(IrtVOEXC)C!W)7gd%K(7d}5#I<4j$k1T{)N*+s4 zbTPN6)dIz}{UR z+2k%WP)uIF99Q(KAlqr;v7ZDkupePmPifZ7%BE6HxfoC5p>A#uk)yByiRhx&v168J zvb0SYJ8{*%liN5cyN)=AipfJVG@ z3(i(`zy5G<%4QT_WMjtcvrl-didMOu6-SO6ck9h8jMy%1*|KdL`v=m*e~(x;3&iHR z0C!WD;W&Zp2@QN|eFj9*|D1>|orC_gikx;jzg(_f99yt->}-F~>UL|KZ`9a`DOrRq zWr1on?DB~7BdIn(A7}xH4>@mOU-s|YcaMoFk#O0@X>JFa{?vO@@!O@%h>Se+#`;W{ z+!HvXDgw?UJ|oTWnI*!Om3`qOE$}|H|1`2CL8*1?k!Fk84-O~z&K^aZh*MQB`u%vy zp?MfFcbGU#&5yCeL@MHO4mYJJ7u7Ln?3ydD$bWoDuQWR;Gw0}71&|AQb8bZGnSjCh zJ99c1bkkI3>jRzVZyx^5ss@|XUQ*<23h~<3xrlO(PzL+3+xFsAIsFz7RSR1PF<`v# z-<^sRmiTZ=1brJDF}eHMnN=%2jXSVQ%dZZ9jnX%D*yohKnN<;<-1#G1L{2OWl$>vE zxG=PkuV+N~&O)i0?GLg$0O-WRWA%c5Ugf}zIeu*cCV-E}!36N}+5M)g#+u1Y+L*kT zJ$Nux88(NE!&8M7-=<$-B8c*1u$^c;X*rvPkji_DViWbYT+FDRxPhF-4i}J^%)#rx z3SCXj*YDn4oVSIQ;{R4hhqW*5uEROfT}wOxiYUczE4Eo^xxlOM8HNR}!R zpfhL0GXt0YdC01A%vj*RJzw%e&+ivEpI=>oGe98#xC4PF|T&^KDaU;QOXqJU)V53p@fN1Ys<7l&ljz#U3L5I zqJ;|)DjJEKO}BU}sR5UZQgl!#tNQ3I zjY4W{Pll|z;j&&_zdk^+5^(CZ{q5`59S1G+H`3si_Z`r#tlv{u(s-KH^+{fvvUO{~ z=+S6o5j``x^d5!-1Z1;Bz|OS*aZnnE&hg&3etnA=g21LC20`oCaGmvzzE^Ek{m0YK z6K6@j((T*V9m_krpHkvxm4G{lq_7B9j8=B08=p3;rSu?{JMO6)Ip&0KJ!w| zCoDgE)@F3qr%cJOC$D3AN&LKV?FT(BQ55qkxT+23#JnR*4~?*#_1ewsZHB}?VJ;~( z2T((F+;R#1DHWJPgocDD2#h@p(yq?S8PcQQypDelOHqPz5!6d3y%p`Qw4(=oN>Hz< z8FdW}@-dv3gux89LPGAdEGWx~2uBx)45K97H#>si@T#KWrd#`oUK_RhIANciY_uym zxwPsl_Jo0E|A;-qH7%KcSKs-(c!G}Q?+uebK_^KM)Yj2yDPW~@p!$U6=OZsKR7zfJ zUa8M?y5yuW8AIC2hISAipv>KWytftX=BO{(bsnpBmgJmThexAJ1W|fd2^H zqqwYg`=Bsq>-O!sWRBkarr2B&Fv08!Ne@PSo{XE!r-GdcVG$8KU`f0$OKCsncLwv0 zm2q+A6(!Xw1YqM;o@yJi-r;?swf4=24?VYfylc97@xtbyUhUU7Gpx%BwH-7_Px$w< zs`acKM$GVq`+2RsGLan!f4&`lBj)dy_%YbpgJ=4!fBhox^z_IvMTuR9hN*t$IULyO z_OoZZZrr9gD9hbD>+-}tHW`tKnwEs1#*drFocP>qvk7%2z|5$-c#E1Z)Nahj z>cISYHA|Q@VUh>0MsfmA9vhyMZgLGZ$(-ja!<-EgsEP6dUNeWF_r%0{K0HC{;F`QE zom)4z<%ZAWQeQac_I8Yyaz;5f5!r8HVWECZXW^gf7efb@TaYl(U|b71F-I@hZ;y#+ zilyoOcZ&pb_^}ofHeZ=2p(sdt9z4JkcuTe<`o)d&xRakHVV(!G6}79fvP7P()#O;A z5N0^P@^qz-#qYyvEbpOPr+K4nA*Rf+zaO~MUVQfS=~&~<5T|dY+1p!L&EsQRc00~u zDRzH}`|c0$KY?)@5ACDMN_;!f0v3E8!C13{j!weH(p_@2r}}5Lm-iH1hs`|ugwZ=w z4WegCa%UAuNM6JgFMY`XqNN7T_lnQ|j~QU?8D&MF`o6sDP>DaBQx{|xSQO1^5MwKkwt zDR6yy^@*Gn^nNuA||b`pr-fNzpFZPHJ06JnO8&NH4raF>HVjI>E3 zy7_;MX6y09i3SO7NtZxKpvu+B$~w^B1wF45zkH!I4=6v`Flo-8pEKv29S*djE8#5Z zTCZuz>^ZfMGcyx}9x}INF3T}10M{dbJ3Y8#*_-1~e%@iJv-4#J9rynBZ$jh&zW@fs z2I$j=H-7*2Z4fbx`38{@-|)VVC(=A}VbLUaq`aMyr&Sn%V$NiTT7te}O!REaO$SbN|I#W!*_nca`$L<@_aL$9Crob*jk z@)AOa(svaE=F*GV875&Ro4P;;;0%Sc)RF<*>{=w%r%s<%jA{Dw)}H@P**A^?kOfZ- zK)1cVS;m5rye#@N zT$4P$FA!oVWvE`bY+6!l37SNdKz9izL()KKDyJU5&{+m?lf>k3uuM-sU+Oo~as2ou z>KvYgauL@^CHXmdHlyF#85>tav6-yZBg#I+I8A0D<5aPeaCdXiHzL(I~od!BUb`_h)O;hNVU zsIJt~odCR!6o~%0!j8arf}df0}Po{Fn}XBfo!T&H!`(AG|p{i5eEBqoyHaQk(t z5Kje}E|Hh7US*ZjTw~oPoiGfFt$8gz-(!W!NNzF;Fs7tAOAL0;95Vs#e0Vq+0&L>Crh>e@ zlKgTU6BGpkEcYI_q>}D9jM5j%3CWrerLkk$$fZnJHhdjT?h$x{B_-2f{)t8*(3Qbg zEkq5uLhiA{`;Jc*)t;M&$frwcNSO8nt0j%mJe`z+X5;gN>Yt_@{|t)H@kQ4!wVKV; zejJ$HhTnr0`|s8eiGs5A8b!86%QLhEbg6PNLA_2NJzB#)US>PVFWr2zrB!X9J5$AN z54*LU&po1#$>RCT{&eQCIz%aI=_y%HuDz+F)?;Zw#hp7}cTRo(<5_yhC9oFEO@Y17 zEc(&w(KNo*Aql4b+q9A3j(vQ>=l(`j#u{sqj#YT5?Wu9JHEop?QP&&iWp4ra{x_h&)l$6YGpmwc-@ zoy(?cWv_C=kVXIg)loP<+{hl$#nv{j%^1fAqaHuMc+v6O2STk(;gu_II2(X@JSEJr zz=DEJrKRoi%W15;f)FzV;0Wf7nEz!p6NS6X#$p~R47N39x3wtD zq&i?6%H#Z<(RKHD$-i}h<;i#Xd8Y!meqUrE?VD@3geKwY#?Iceys;U{8R0c&yFyA9 zy@OZ(;iSAR)%)&cw@VqYVd=={_@>Q$cejN=fZf)6JTb8V??Y=F8<|4NLw8Zn+xvFd zfJ%Vz#06Dkb2t&)P)vrula8AH{V1Su?ymD<+pb;1${W!83%e;4q+NQX6mEu0Fr|lO z)xOZj4<2mKFsb`?uRTVrkk9T z+X>_A8z(SgiVMu(Vx^>}rpmk)G-b@oM@s!at-`Ruv!VtqYzRIs=X}V)hmfv z5^Gqx8W=2W!}@ihjeqLJ+XuGNcnUFL`7wuw(n*9`INrW`HS6HPb+2FC>oQ&iWVY56 zY2|5ddw9Y%n?>JYt(z^dbs5en3BZDF_IIkToYbL^zo<^K$L-p&V<2AmA=hQ&GeDMz zP&tFT;sObo{vM68WT~||^?ugx+Q(r5kKc+fv;p=YHD15IR^_=gWRgSbaJ12*`pE;Wzk4E0D|CV5l zNGd}7|BYqn*&?5vKYRaYXv(dU5_Khcpk})G!2F{p8^wH(Tm4pFhHF*;*igw%n|-Rw zXT8Q4=rc%xY*=c=Mw`j)cL%OlUX)ELR+UqevYP*o2XVq3gPuA?4eJPO@j@{000UcTjk6*lTU` zvUV>R?|+m1SNLrwubHvGJF4*N;+r{ z_snk?Sy@5sk9Y5o?wWq~bF+CpH-cgIpgRMwhsO+8m1l;F z2Gj?pTRn_hj@ozPvu1}5t%NhX-wuh1IO*{{kmNUlRCTBVaddwE($S-J`d-M>jn62t zzQ&m2_?QE>9o34lfTn{ZKEi0t1qe8C!f@@-rITUlLIi*R`LoC#(XqwLNn0f|)Vwxz zZk}D{22H;B`Lobp5IZU)G2fsE9p>g1d{t)2W!*%n_zjszH7Ud-uh_UQs23nsw_j%{ z_Rt(=k9m&U_4C5Q-F(?cx6>J`cGXmV6miPm6dhanpJ_aH=bEO3hgTjRJ77+BeQVk3 z7n^cOiZrvUZaf(A!+!4my`jfDcKo!KF3n6F$*3N{?aQ0%7i6+zFU$T>W2?Ot(V6V< zU`EGlitT-o`(_*)6fc$uZ2sNTcH7^u>1LO*AFq z#+EJS_SIWF7&wo(VDB=VIaP6$`(9sGPo%uSqnys)G1qI6jDv_uH2lFWp17xDD5}X) zN1N?hK38pyDf@jC3wJJ!#f)O$x6)S%N|vfpqv><~O2`SA@DSu|zrDHcEptlNh>s4} z-80$Z4TH+sZEG3j#rbUR)4x9hM43szq!tO5vIxOg>1ynHe=97+RkCNwr5sxv4~TK$V*vsC!s9-3ML{QdwvPSIe`DUPi?^bt&EL zzV|LD7ZBt|{S{6Vh#*V}K;f|@YJRn;m+5Xa^eH7IBn7G#?CwVmuAAA*)BqrIbE23C z@7PN#uHD)zRPfK9J)7L2^S#8ELH=Z4ugf=YMgpZvaG7?@31OeiK$*(|cqV&hikq~Z zxxy)ZJ8gUmO|iE2+7?NIP1V-5>xw_ANlE+j0)sFDV?A-L9(19!+i#<+eX~zK&YSgr zhWl@IwYAy*BMUci_!duN$df&L^zg&3WWh8*tFdFIf?8L7h5e_KIwK;&^PhipJzISm zg~Ex)p4sS(C{i1^-v!%Ok*Bi$8xBx$PTb*&NdNsV7bSK;mn0T@EnL`$R9{QxgS?WQ zwyeJ5PiTtLJ5F9kG)iy1d@J=IFD8V388$t-ZNGkC${Qu@XzPMB)?`-qKL}P=+kZw2 z0lZ`I;K6ojNA~R-GF;QE+#(r!KM#Y1X%Fo(jO#S#EO0P;dG+GzsHmu5JCNIF$EOTk zy7V7sc8<12SZFh*r6f74{iI$vcd1BEMoadCe3IO59}^LCh6n`hjf)2Ind9twRve$D zyy6v+%c$#i8kGNTBJzyLPCQltH}9pwo~Ie-k9@OPTS*+Zd@nG7gNt<6cpf9y(qJp7 zpKoSygi~)S;7iUF#NCbSvo3bCn^C57ukD-P`f3J57OzQ(`rB3XzsVvy2Ehz+nSt3- zsg7M08>lWlX6mv6vqBOe$6{#Pwvj@JoTltSS;$bjeI{N81);db+>J>480na=&{$){Q?h4eSke7{Dk87}xKvQD?L{wrG`nuU4k6sz*||n`*j%Ds9l|>-u0B6cMM+yZ-$7L)``4O7cdiujvt=nm=`BCM(TG}|0}(|eSY55>X@~1aC?Uqg>58( z6O87x0rS+l?d7MOO39VAoK`KaN0c zifYMSZt&lve~N7?D#;NPU(fgy+?T#9nA*SI^68b6Su3e4R|eVbH4HDjO+PgqG zO1n@gxSNB!dnv10fMVB=>8CI9DctnpGq4}vMRw`u4+c5$_$*KHLIg@7~)z_VN=vio?G4JL6RoJ2fn9A<-8I#XH&J3gDq8aC-Zw310W& zns45IEiiayT=n(!?+p`z6n?74$Q>0`cV}cw#B2#T8qw17!;_@2R;IYFxC$T=WV`>j zbLUww*=svY;^sjGHgQhZ-ppDcMYduZLh#bi9lP%+k|=O~>f zhUO#Qu=u3R zxv{vzpoP)7ej00DgEB}V=jeo-H~biH0UPV?zwRKh)O6I-p>eB+>-~=f6nAAJG2aH~ zT5D_b6=;~4*5BxY#-6i&;zT&uLiv@(m;1%?we~2{xCz4uO^0MIUR7AE->1H;52c`V+Q9WxVU@CNh zxOk>|*mQK-GKE;xK3KLp#Ie_Qj9YQn;f_&+rL3iEI2QKr?n;hlAFA_S;<)qs%`J3= zD4F0kg`!M@j37yM2Cr1P7!WaM8g&CXfApycOlfWXe$rn{)dbERubbwtp~ayu2Oa-7 zgLyZ^jcDB;-VbvB{}D=P(X}O{t$q7;?dI?$DBfW}iP3<3q@cX`^N;RUUpdS70QsTm zeh*QNejEb867W&{C5s2lc-GK+7{vpx&4cKC?4qGp0T8Awu4{Q>doL$1h1pE~U;8yspQ`@$S=rf@+E788>|rV-2(M^Ye2N+~E;Ghd0$$C0ghT%$S!YO{)beA#~h z!zfC6>^i3+gf*^d)|S=~homXqDsOk}_wn ztgO6!`!lBsvXAG`p<|9sT%i^_W7o+AGZ`VVbUH7xvOn`;>_~5>idG%8wK)TSc3RD7 zY(JGJF6Z+ADHEocHK(A3r@=&?<;^)Tc;B#cVT8~iyIP?JIUf$X?|N$e%PISy-Jt{3?geVo-Mbye60Jaw?lYXE zxuDnSH)Ve3xOw^3;5r-Et-~`!e-%)-iKfS1-&v#HkCEeXk{%DkKYseJP&t)7xQKH7S1 zb^Bt*Pmdmn$>_R*B&XBrw{N|7SSM_`w>VrF-;qzObfHyqkKi^220p(orC;dXbSyoE zDA^ZEF;<1LLU#u@w-Slc%$AyFT=wp^6~$G5Y1d(T(R~7g-A5Rn6QJF1+NPD)F>)Xx zPo3bH)jrlK9cu*N?Y+dYQK?5mUNLQAboLq`4wmmsLRm_dM5>!NZs;jjFL!sal?4UE zm&QE%^-6t@>v~(9wt{*+&zsZZ(Mg%G^OiBa)ubbHGNzf8I;Ze$Jw(ZT_!XU({=Ddt zJy6-a!|nlv@)X+4H$bWBq@Gb;B-;e-7hBf6dq-s~V9s{%eXc>me&W!L3CQ@sLYP_f z@_*v#pIQUf{vI(GOckHhle(j~s#pyhJ|wk0zS1GwGNiE2&&=F|puC{K{@(omUB6J7 zw^A<7=@6gs@9$@kv^y+xqJ@009+iW0%nZRq;9EkrdPI)Ex_9i5$G#i`l%FF|<}X^r z;Nkh>h^PD6?-CRo{DNGRb2G%nHk$AQ1A<5lmFWWPTZ`lf`tHCD;aCCa2q3QK-)h^t z1?F4xHSMBnd>FyH8L<^0=+Glu0wh-|v$=~>&)Im}UThlJr_Zr-2i_ORC|Y=NSXCdOz;~w_na-{`{Y1r!##+ zqoW%DCJ~V6T83qsv8IGjHGTRsjx69PtIgT5y(@WV&LeWPjHKxtR4o2<%qd@MsHse> zJLF@+gl>F&&wOj{rutolTQ2Yj{JrT5H^#?H>~oIKxx3Nkg%L4EF;j$9!n7D>21K1X zD9?b?Z~)EQ@S~~$&bKtXW!3{Y#vFxb7rG+29BSS!_3H0|hO=nbI1HX*ORsXuRG4xo zw}#6N`8EN#jB-FmPT}XTUxVg0f^5Wo5-L5o==pdS{NNQu?;_Qb(#=&4nYS$i&t@l zsT73^{!8yem%<}-oIyg3?cI$x`A!5}SQrp;lP-bz$Vux+!tZxxZ!_YaazmzpL)Pn7 zlsOE)ATKX36v8jf*~%U$L0}n(gPQv;6Fa+cxx*M+k-%hvnJ#!~ep*$vv-bw4baV6{ z{UmqY$)@;O2_o{#b^SLMwpUCK0i`-w+H}iRY03PQ7nNVs?axeg|$4SbB4Y{oOQN^P8i0TLfI#x=AGrl3x}J`T_9F#mQ50 zQln^i{Nyd)2&z)J_~7u883`G#5*rHj`--?YY(AHDS5Z?NcNCkf7Og0rYN3F=cp+`J zg4cL6#d7GX^!|e%pSNaly}9|(g9mSrZAb(XV9H&e!5(>re$+XIrxns$Z!Rbh+x}U$ zUcFJ>@{yH6b5aSD2Z$v;*+#t(g{L_cDly}Pc`{i-=G_Kg!Olg7eK+@^-cpS+CmTC% z+~N0|?B~;2qcRwCa@rj>a%2ZipEm7hTGO9ZS0;KTTeze~`l1KHwB$S4`-fKdu*nQM z;LOU#kR~jS+$DDWCkNetco{t{kvwhSf?2nBiGws<-t~JJGUR&usm$diRGo`WOGYN0 z!(%OJFgd=N7WtOaGm)d1)4lCd{>^S7z*LVB2OplE(K$7%z3gJ|;aB_pRSxc3I3hl0 z;qSr4j2B?u@lb?6&%bckX|D-`_Gq-*dCEeUdpEjk#`92udx_Y+_D?4N2N1xl$w*T4*O_6fKp} zsnVjd8b*sG4Jr*qN<&dJ5K(Dq7$p&H&+Fv6?)!f~&;37+$8jImab0)A&v|~opYi^@ z-|x>;@1Ai)K#bwnl;xF%PByyUL~70bx+*qQDqRmHiAi;woxyI!Spx3{6nM+R2N6jVg5Jl z&^4K~NyqoMbPtS9mTe;EpsU;#f%L>-Dl0OH;*tadnui3Gu|tV2fs=)n*t++g$odH&R9Vs&l-{QGRl6cNn#(ni0UdAR8@+G z&sC8w=(^U<+q^*E*F-O{*-&}+z4v@{_Jp)Vsvx=4@sr8=ZrE_031$)XHvTG76a?5O zFdr+v?-bwuSr--QDaJMJO%G?}GyG5QZ4qh>J>Vc+##?YEury=syaPvhduC=!nZ13K zHDzvF<#iJKPFLR?-6pNsaYMP6EsPB#RkPn39Y3YDZ^qQAlB1ZGmi`dP6%a!B;`_Nh zy%>)~kP*dZX@j((fkC?#(n24Qg-h`o4aY*(moUNlwoV;8mJL_Rdo2l3{DKrQ>5*JB znCtC?;gYh(ji9^4R5aDGtnT1{U6^Z?XQp^(QqOa8VMnJJFIuE#Y-nt_HPm5VP>+4@ zr%lyQ3YlAk#VhwH*r^?e3xbWi*q$0-3Xe!_;!^vf)-tZZHVRw@@-Up$HR{i5@H{Xr44W zb}9{lE=PNf^i_xJiXT(B&6}ZweB6y4Z|pFG@Ls-c(mILWR|BRN*+q43sy{(*Ye+jm zr^#C3b5Qz(w%ZdgJ##(!g%*2^ZFubi6gop?WHj<}c0YdmGsY3Rhtnzhs5;BpIcLH2J8&+y7CLmJRQi*REk=6ZDC<)A%e4rTyQMH3tDw z5^c?nx}^BoW|6jfTI;l}(apMb9d3SfBg>5hADJJ$_e`03>)BY@pw>ZhQ_|k=Ytclz zS+k=f=jiUU&swnE$36Ib_@_5&-ze2?cZfCBl7ZsP|-(ua;_@KKENJ(}oJ-%bw zw`2M6CaNoM9{Q>v2+A!a%0C+#5^-db9=1+nRvCu?8B#MrYCmPWq>G|tA< zJrQp1S#Kl3Fa6es;X#fQ=gvKKdT#mEqISV?i5FFqoQ$qr%HKTJ_EZa_YbP#RDF67O zePP!b$Fp~bs@N{wmr+x5SJ~fAZ~i%pC3aR%wWsx+ZW?bp)xUR0rn9bm+*BQ{3$vre z7^me25)WmyK5Cu$)F-s7$*eiWpFiI3(8ARGNX#aymP$<5$%A2G+wL{doZX0Eyvu+{ zOW8}O+r$?!74sXupnT9A_Vw-SJJ4EJxudMm?Xaq`ywJ<&Mf#IV?E@Ff%FPo>IhZq_65iIly%;qwSh$t_u`ucU} zH}8dti;tU}&A!{a+52PN{fyi{rF!;j`s9n4a5;|a`a@;c)rctT)i++bx3cZ)ar6E8 zkZgHpRfSkJQ>!w)M>BeVb?!DJJ=)1<(3^{wtaVRbOgXFE;$nox5e30CDcoQYsdxBJ#S6-f2|%Niqy`psN8H&>UT6e- z!IGFnSTO5R$4BLO{^=%bWj>qqZhCxo#rw2xyKXLDxiTRAavTqC_S1{P8RhrUgBM=B zefz>PdzV{px)fXt?jy`>-lU?aHhEB9?m+8vdp0x;oN@1dOW{Y~y=N|t>LR4=&We$w;&--g1>jJmRq={%gtm6G1yl>N4U)m%#e7pRGiH*<5Y5=YD_RDMX zV|1J|L$rr}6*Ov=AHL9eV&1m;-*`Pvdt_FvchuTx_K<-XO~w1no%%JYT|oK;z53Ii zR+{9lIva7zmhUa0<|{UvSbe!Bm(Yc1mRRH{<8mqH%9UAmPk-5pN3D-9J7lwZpCsw) z*@)Cr>I59dfr_tkohdfCK^JZIO?J%~RgPkCtks>SGA_6f?Ow7!AmZS`T^5tO`$fn# z1OO@fJRA=Wh-5#{bHeQJ<9qh)JF!6H@H>Tl+G8wF*IpQg66Wu6L&;=kQ;Hz5;Xi%i z7rDiXN$%?I(*NZt-xz43@;+*WK{AVoxT^yC1?Rj`T!&$I8`8Ly-4T>T6WDLG?!dCsqZ5;AkyWA|@)U#!y)p0V(m z4nEWdJhyE9hrliaV{z`EYLAJ^mbub0>l-6oN^``ceLDttx_~e2EN+5{5&~A2YTFZs zK7V#c?0BR5_Ev)nT&3y@dBQ;xE9LDTl)Mw0hFoyX&@^1K_E%R=DHT$?$uSmcD)7PV#Djb8@ssrL^%niQ zjpQA?Iw2;MeICS^f$O(I^7xuhml@KXbzEZqjG;_KF}Sy$FB zr#pkc0XPEza6uWKzpd0ph7H5F{XVM{%YI9S^ui@Lm(KIyVy32!`fhw-BszK#aVICG z?2`uxz6vstAjMW9=M)%kpiA+Ak&Z*7_@)>EG=k4{aWtxwC9m1dGyINrjIGm!Sw)Vpgp%{ zPWs~N?8tKz+pQH9Ypbj8VN%k+|BEy8f#`m@^NnI%I-7{x>#nogmwe|0MzvAs@|Uu@ z`rPFalnmK>@^0QR=%x1bJHLsk^l1E03n>U++A2~}(Kzvqo{3l=q`BJlMPTA=CU%AX! z9=r$1bs47k>A)z9li#~e@4ZLz^Yg_@?P}n~Jo_nAlmx%6TTgc6#_i5_to!h2lgi+y z%iSZq+<9THgGY$HdTrGuO+aAO9Ch^7DeL2u^odDHrx^m>Co!WjyT++0vXO-Om40uS zD@6>lUEk`CG@mrF!wXr~m(@Be*1oyjI(*{bd1*rI4el%Ry`D4e#7J=r1N< z$}LDc@q5aj`+&XjeXEO3zK{XC84(X1slSVUo1UG5g zbRDyVp+mjduY^8PbV#OL;LI$bAO>HXo*MK2p*m$#fo{NlND{A8?FT^xVNdg+qF zbIPW$eB-%u;0W_foOfTma_*<`!ZsZ{b&?adR*w!)=6Fa=6nE`}Y7MQO6Km5~m*y;D z=)ugP&+ls%!~c=3-TOzjHaCuB0S6fKq17u_a-3(|*+nEz&I8FWxM`7@KB1k zAe;%1*XTv(w;*d_Dm*6VNZ0$)M)a5%2L>Gse}|1gkB`D1dFtxx-KF>&7k+b87byV8 zW7(@H;J%hA#Rv%a=k9hEf(lpi$y`_m2&y-?+>+W4L5%In@@6**3hEfKw^27*wPHn& zK>Yy&u-7O6lLEByA;|T=_N$$MrSc>zZ+ z!H1Q^5HldpZS(i{{PSzr_iy~YNEeC90A_fi^Dm(2jKP_^aTL@Ue?#qLV2c7zpAFe7 zGLgaXvA%OV2ZDh2b#c`m_*b251fEyXOyIe)!9(=;(7sHOQ9mx?48_l$ai|BpP zPH|+xKt`^0Q(XfsBl(@R%L$tYKfZrwq6p{b@w0_7#Y-PO^AQeTmX{WtW8)16_!P(| z)4+)rSMg^~Z0I2A$u3DM6ei>lt)LF@qk;05Q~*Ma+u3!|(xo5E%kRB%mpXVF6SONK z;#4~{d5pYBjz&&7T55qw)TM-4sB>}e)D-AMbTQLM-Ry({&B(&oT#BBLu4AiqjOc^;zN(G#0LgG0I}dYI{P5#uB6PS z6bY}{3Uvc6+>2|Yx8A(${z}$dgo8J1#0cnsF5Bw=`&41bV`s2DXK;}0?k=KU*=S~s z^lTY#zi|IxIsf&1Ww)cvVNJW_pZbo@gfPphIsPvEKcrPJ*bNHbShdKGc?SC8go2b00&g+a_UBi|t!o%(>M}FY!94rP-oCa5 zAi;PMELyahw{v^x#p#>K49gyE7v|gL`odjF=VnUeDD$dPtQF$ZKukx#PvU;^DAuaen)IE zv{WDJ&NMGcW$9Xb!&U0>rfu30Imn)MRaNt?CqZb1*{ijf&~fs)gye}Qv;i6)dqir> z6$0sH6gh*N+l=yhd$)t*qEYSY;ZErIM_}vo+v8q*;U=a81r2r|^*=S?es((k(M-rC!-?|3vkS#LA>lrKJD%jw za7NMQGwUm<070bqMy~BL=L1S*ra#yMf#NYwi<+cyw$POqWpHB6v>gCa}L_Z zun{+v$G>N~NJMIIr|^k;BO-=_A;N(nQWU8Cz$jwEmY%7(6ml{z(PET~h&LG#eyOf@ zQ9SH&swcXu&{c9*4ynDDz_WjlkpT)`$~|-rB2~;7m38kP?!7%Nb1_k_-sfMN@nIM&NIo4j!$F6{ zroIeG0j>`YUA{5v1WPAIk|xlUO?`h&lY8{x=EerQ8Iub$c@5k(>3^&p0=`}bq%cud zQIH%jT6Z05H8sBA&#&qSumQ~H&Fg-ydulBa3L*d<1HT0jCnIaj+DQ5BXrEC08+S)T z_|RKaZ=BNoseh7Ec}XYX)BKlJ$ZOKF5pj%4z z$}NrBH674>?=3UenNxxmtW#DBT5`)|z;=akZ94>A?4i){#F-J5>UI0p^-4L@_xXye zV#&>CUW?ylWwk4Df3Id~$rOkTLLN>@PBy3%^*zFn?(<@eyPKJreYk4TJz#!Ytv*q> zrQKMtXwijLrPe)9zW(^}H{=VcHDDa&zipd4x|g$OHJY}7V{4DHm$k0z_YzU4o#2|b! z-cESsE42YhE$>TH4Zose2#9g?x$(uGN5n!c(#RZeFWWX2o({o3VWRSRLf)QLApf*( zy^~`|oRMbuv-_R3#C(iD5e_SC)25r`d#(Ojcc!xnkGT?5i8C)AXj@FjhEc4|(r%@0 zq#{6M06@NJIGFk1pg{x7!}09HQnwlNA$fV0*Ri=t4^)felu~&WR^JHR4Q9>^!-PL0 znC~f}S+w;y>(E%s7_VP%Hc|t^XDs6h15MEgSd^_d`ve$% zdC#5>>zq1Cw{tZ_8;K?=YK~iF?ka&>Wlcw&c_(2DHO*ut+oURw=H-R$$w)o!{W|Aj zpwEG3RZVlDBBB+17fvUgRy$cb;v+gNVL~r_?kSXTlj8O4;8IITO^;}mfc=-3nGv>>nm4aBirfAk*<#SZ2c!T-*%(3>K&N8SLLSNQOAGdupt)R#Esz*ylUB^~{rz=28nn_6m(~dFuUndf|r@M9# zDDodaUZlQ~#wBaWZ2UMkZoEO-gm?t!Y!zS~S39Knvbsv~#WAOdzQ+eU<-~B_AYEol z)g?v*ebh!<=Hi=)J)3t+v+8HtJ06`kt-ODACeg(h23KbReai?Zowlpt;eP(|XSj2i>!RhrsKdFRibt%6(f=~MgEqqo#sF9;Hc)flgDMFX`3?;7YYs*`CCi0M z1Z%jS!=cTQif|5dU%p&MBH0GZNd8^KV%{VYzR9dpUEid+9JQeNuu2|5=;KzB&nK1A z_L_FyqS1?|PrdLBVr-3afnH={0Z)}en2<%jXYs<)#fw>|1n3nm!>H}+=g((|E(HZh z&YT(0QF0u;BIj*18k@1ZyLEXDG-PCrJw3JBO@l@UdPoAJzCzM%ZQV}bU5pqyG%O+l zm=-3iIA9ZT(7QapA1{sGkK9csS7kQbTV8lc8$yLcp*H~T%Iehskh>l0I;vap`>1d) zAA&8)J#k*PZ10!#(YqRDA5tRMsL`X$u$eJKGFJx-IePT1)R3oorq@UV`$ond{2SD9 zVr{3n-fh`=Q#|{NFMdIZEsjAhx1DHA^TSt6Cqa#^1)u=LO~TtMf&~2>wOfp!EMO+6 zP4F)&`a%5yOC27sk&zLc8_iT?spJjF@q-NvB6w0vJ#clw-{I(G$rPH@M;(vRjYzaa zJh~VY2ZvyrOpV|;kdIyy!=}I}#ws5$6G(1@F6U7>9U-iohO>pkFZJsK;z!-ZXr`b=c5&_h$y8#<~+vSPbmosi$heA z@s0{h#(2`CPt-**n|C({59vB^Ee9gzG$^j7NE`f#HU)frDQSDyftC5n;sZ^bqd^i9d zYrf#Va;0V@XaGp&I@PZnQ0fBaMvi-r5h>0lB`x-FTj{$Sq8LP5L^1q?W-a&KV_Tbr zkI$%qHantq-dUQHW?{up!tCoW&XtwelLWx<)uVO&Igw0J6OJDb_MQ_FOAT7_;loe> z)0`V`swiT(kTK1-&+B=lu&7AZ_rQVY5T= z+FmK=E43QkGJA#}mzUO2ESRxCyUUO-5yv)c7(?=>uX+L5%!ddJng|~aQxJ>S+!;JKba|K&w7~#?N<3~(j-NptJtmE(UAxI zMtlbDU}bDRHc9i7pllE5GOl?_Ky_{H#S0gttvFO}R8iDX;o-KJqY+zb?!V8RMKNcrueEBK7}+_JVnw61q2Z37WH~5_(sQZ)hHlUjJze647~99 zX|gO1a9x?XENYfC%y;L_S81bjua50Zi-wCod{yRJ6E$^}9yvDaO=qQ}T=ewmz~-0e z<)GAURIZFx?5sae#J`7&J8>#tYHdx;Gx{2k-VrL+F1%}6%G<8&Puv!*6H-y0#UjIh zH*Wv*ZPM^G>2gZO5loz>TUkkfaYiidDAIkI!^z2Z{wK$(`Ze&YE7t^%XY*zS9*wA?zyJJ+|2vaeX^|Jb=k@DR zH#_Yr%9pz^qpirBAEG3H+JE&>mZDAB97-VJCChG}Zm8KPtrOAFVQ**B6AS0ap1peI z8mhA6)xn{Oplk{iSQ?xQQ|8Wn&}y%KT7Ld?d;7>%gg1jBL*xa$eSMS^#(FwM?DF^T zYT%$?KK}FCD`2M>L*+0Ei9dPr-mcH0YkyOq$HaFi? z>G(TWUKNnh)sm@S-Q0TbuD{-{7q5bz(9$!1ze_EE)eUesymI?)g_*hFLbS1*^%EzG z5>(UGB}O{bq|x7AZelXOx^LJT;rr09|0;tUlLUEv#4z6_=bX!!ARpaX`hto$O#9Vv z-*Dfa2{$z^m|=lwBAZZsto*Z&l4uAv+UxZ3Xi?3#ykV5v_?Kwpr8Z(P(vJ)eXED+h z+M-iQM~vO{{)y2w7bh?j5L&hjC{}F3kzr3yorl7Qom(2N8Go#JI-*s0~ z{5j9b^B1}Q{kH~Q|5s*{^oI(o`~UM-H~faY)PHzDjUS@!#@EJboBvFG!)4O-FZ-xN zq8Rk=KjwKyD&~Ha9!phiYVyGnf3Ads!`e1bVEKfe_WT^R9tsMnsu=5>BT*IalGUi` zc|%2P;6qbwwI=ped{mOYqgIDgnE-(wMwwc%e{Pi=cIN|5B^4G;2z&l(o`(kFtp>Wy?{(-ZSbj1p(q+q3lGXJ)TMfPS;S=t=%_bREQ+ z(i{3QyAK|O=l_@BzG@Ym+a9UZDc9=%j1bUGr4Wxp+U&vMOG!a8@78Pc1=V>&I(4yIb%C_=|aenbclx!rx{AS zmT?=1sX|gsNrDl>3#G5Bd_kwjyGwqIv2)rq?>kE z>813SF`g<;o!a<(qdr0JXevNmYj+#rl(q6(T!J>gm$*05*r4(`_>I7tKD?HDD=BDI z;IMEqKK}XU`DT^(`d`y}G;aL(fI9X8ZmD5_ekS`bIAA;25ZP@(%(ZW?TMBDyKD134 zKpFxo95dz>ItA-pZ3~_~6Dx3dYG+?^4g8d@X;HJ8_Vxjbr$VI4SU&u-t#ftWQbnaC zc&5~uW$Lt6i|UyCtp9vnKI;)EOi?Qq-<6ky+`M_S@FTraGpUF1SP1Q+i#I*J$4@B@ zu?l1>Ug_Gw`hqcLpxy&0kr-GEep6~UO2jL8jnzN2wA5?NJEXm<@9IA51&4&ZE-8sQ zc~Y`^;B6xEm&#@);E;s0T0e?l7G|dQ@Hy{4Jz)AHLsgbHSWP|cr)5iwXLd&k%AmQR zC~Jh%ZCBznkFjOPzTa3052`C&6$Xq$#bLuR`RFPvi9o(_ap%tL>tg%My;OhpH8;9o zC^uH}wgW(<#gW!9j2Uws+zg{wX=R+>4LI z#27+IVb{Vk)J1s@A0E~zBcaS*5uITA?t1qAVK(OG;&E1aJvV)4T=?WkTDQS%zz|s@ za)b{<@3^d>^KxXuH0|IWqjFif+f0DUbJ%Hk|Nd=+i*7IUhF#g^vsdeoU4%>zcoRGW zx~j}~fN&Ua;9=W7@$$UuvWi>Tp>=x)lQC7QIKM6tR825vZP_WlSL|mmyrdMEID?FM z<;pKO{&&w`VRi1DIqM;hNxBP~nj(}fw z8<2X1Bxp4CpxZCR`cx4Aehw{iU=<<6Vv@!0fyp45qj?T-eIjv`BO}W{eOl(=Q1ame z_V!H#pjN&GWilu+g?v^OzwZnlkK7>W0p0McPf1}P^Lepu%g_-c3LZa(^LVZszWXdF zVNclIWo(=Rx24pj>cryA+`=N%{R#7aNEb!iKx90R9}gNhF!X#<`ECCUKtkk<+-+;? z93Z?ABby1JT^-S5QVtoojg?K4s_&PaQ-S4QO$BO%P^G}#hmMN12a~g9UNcqN9TE}^ zzjQDS_Q~kz8xuc3?Kz}B{|4DKyoyeXSex}%+fJ&gvu$h!V$*<-SeQ3?GvASlwnw3H z4x^8w+zrITmJPZVHU>-O~V3-Vj%PC;4$?Eoi@B@xqMJnFBZ8AMHTHzQ+KipS2_(jPxO zfufm61e@O3CRr0In+`Y^q}3TdDYZ4z@jOuXzHN$jCV@P!&eK9W3srq zoQw>A){Cc8TRbyj(4C!G%YcqxojJvd9zR}9oi~WXtfA@N3Wf&h`i{K8A3se`3M_N5^pZl;<#Mq)`Rg~e^Vu}D>)$62{$Dk z097}5R=S94vq=-gmuf}d8(yQn@2d|V)-s9UV=zi)geE8GemudtGPQ9hVyDxItPO(X zNqyIEcJl72MzhZ^35LK0zIgRVSsw!l17%LcDAoQg z7f=)B6%+*2zbT`rcW=?PUBf}Ms3t-ZTOmQ9lau@r zh6OM~=Bl`Nx9O>Y?{F=Pq$_8jz~B`o<|ec>yz{itpkY=?+O(f^U$NZPwYtqv*ws{r`{& zJS4iq_U+3(JeD~-gIeV=ZYq?65-l&Vz+?W9kZdLn0V*G%(+g9qt#3@sm-8hW$F__~ zIqOOWLW7j^_;EJ1Ir3B3TpjghJ=rjzAHvtPAuqg-fdA}c3jORC^7G(LEVpzg=i?PZ z0j>J2ues=)DaZam#ARu%Fh`Lc@ye|D`!{a5L=KuYi!u(Vu)&LAp88(bkibxd4aN|g zt+cg|vaKUgMMHoDPI~=Gt5CAX8YlLuJL;iR`|J8mSm7?{!_As2&V3;PIF61uhs64@ zC;{bu!if{sGiLPaM_!xgh&2c+L{DE>x6W2_Q9jYTPGE6yhX37uXsDVcQi~i#b!3+XR-Zp~1DBNlQZqFdPpQ$1uYodnKy^ zCYp*{S8|RCbJ9Ynm}O30ceYj6)nQ?N{>+(6c-W12t_$iRBPEg%zoal@uksm~Y3AOJ zVtH?1v$dX{Et+iP`;Xbw%u1OPldfhwm^a)1Y9;sOoA=czI?ryKIFI>-5H#xy5d~Xa zqNdh>0gu?oj9fkDfYx(z9J_Fkrc7MnA+5A-CEyw&zp@EFq~GfBN)_G>PK|i1!PGk1q=4B=rkt(UYnLJ+gA=}buWr6m;r^; zI`uFq$zByAuY7!Q@77<2JJXF&8}Mh$swNn`>N9%uq37%XL6Y9HXOFF2|G@|6gG4UI zV~BO=T{PeBTqNp;9%J5A3rqw@5dP}6n65{=Xf7ZgF#%)fgZsmL4|&N}7zyban@MSR z`*~EH(|UXSsS0qm_B>p4&G2!eFF=%_1yS~1XwA7~Xbp|q3 z<{01C6w5N)=7O2OfA^M-rsKvLypeec zc$4Kz!!t$sD@(mH3nm36#{uXYTDIJLgX#is%AT#L$35=mnZ}bW}jGhcbS$=4w8VQ>YAS*rpgE; zOJue=k74j7xy|Kb17*i9N0_f{8f@3PN0EJ}X*Z4^RY_yvH)~mc)|B4#&iWvh1;JWo zH^%Zef4Be`JXJx0OJUyg`zI z41{^?1pjCX1v9m+{7$DI^o9bBMOSDN!NIS}%ll|*4ulygDn5JCvD!sSZt`uKNp=&FyDWqPxa`kr-GuGVtU)OKmzTFe9!oYzzZ?qQ(Lq!XMULVqKKIB@q4HFlY z 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 diff --git a/tutorial/tutorial08.svg b/tutorial/tutorial08.svg index a6125f2..391897a 100644 --- a/tutorial/tutorial08.svg +++ b/tutorial/tutorial08.svg @@ -1,7 +1,7 @@ - 4 x Crimp, Molex KK 254, 22-30 AWG Molex: 08500030 -1 x Test +1 x P/N: ABC, Molex: 45454, Mousikey: 9999 @@ -230,7 +230,7 @@ 4 x Crimp, Molex KK 254, 22-30 AWG Molex: 08500030 -1 x Test +1 x P/N: ABC, Molex: 45454, Mousikey: 9999 @@ -263,7 +263,7 @@ 4 x Crimp, Molex KK 254, 22-30 AWG Molex: 08500030 -1 x Test +1 x P/N: ABC, Molex: 45454, Mousikey: 9999 From 21d6e032eac2fd940cd034891105493acc90a38e Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Sun, 17 Oct 2021 13:11:19 +0200 Subject: [PATCH 066/155] Add `metadata.title` to `demo01.yml` to avoid diffs later when calling via CLI --- examples/demo01.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/demo01.yml b/examples/demo01.yml index 56c77c1..fc93c5c 100644 --- a/examples/demo01.yml +++ b/examples/demo01.yml @@ -1,3 +1,6 @@ +metadata: + title: demo01 + connectors: X1: type: D-Sub From 3937509f939d965fd91ebc8b28c3b4817baf2ea1 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Sun, 17 Oct 2021 13:12:44 +0200 Subject: [PATCH 067/155] Add temporary loop to `demo01` for debugging purposes --- examples/demo01.gv | 2 ++ examples/demo01.html | 21 ++++++++++++++------- examples/demo01.png | Bin 56966 -> 64020 bytes examples/demo01.svg | 21 ++++++++++++++------- examples/demo01.yml | 2 ++ 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/examples/demo01.gv b/examples/demo01.gv index 4926116..56dc5f7 100644 --- a/examples/demo01.gv +++ b/examples/demo01.gv @@ -60,6 +60,8 @@ graph {

> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ffffff:#000000"] + X1:p7r:e -- X1:p8r:e X2 [label=<
diff --git a/examples/demo01.html b/examples/demo01.html index 207bb10..c7b557b 100644 --- a/examples/demo01.html +++ b/examples/demo01.html @@ -86,6 +86,13 @@ 9 + + +X1:e--X1:e + + + + W1 @@ -126,28 +133,28 @@   - + X1:e--W1:w - + X1:e--W1:w - + X1:e--W1:w - + X1:e--W1:w @@ -177,21 +184,21 @@ TX - + W1:e--X2:w - + W1:e--X2:w - + W1:e--X2:w diff --git a/examples/demo01.png b/examples/demo01.png index f8a95a3174c31f80b6df25a6195122dffa87122b..75ac33326f449d797d3c934cbf90c161630ef096 100644 GIT binary patch delta 12785 zcmbWdcQn_1{5P&Ww4@M85eivFwk8cxSJ^W=dyDXHtE>w}MpWvOY_eC8J+oK#DtmA4 z$6I~Rx&Qh7?)%)IbDS%e&*$@gjpulb=hLhWFQ+!dIe%S$m?Dw*dSEM2kr&1>y5g0? z?&~ph#_k-=<*m0*Mmd~mx)dlN<}mHTF;U962{&K!Plq;oPo#+p^Qzbs%h;G0?n`|NVo9TNpr zb@g&rCYPd_;g+D_?xCTwRLgE+ZmLGkVJN<^sHDWmZrA;c3{edYjk&owUaOu<$!0%a zL`HI+)GssSSHBdPAX`o^=^}RM(4lLd*FwY&+#k(ZU3t;K%DncnO0#)w!73o|O2D{& z&!I!IIWEf08Q4>%e==vj z+`KWxoXK@JlbMwXQTJJ%qSYdAXY#RY7uH@q35NDNO=(Z4=yE+!Q&G9%=qR!{I~pDp z<-RzQ;f0?{q1pNVP=nF7EV1$L)KMx)FQ{0gs=}mq|MSm3N;xj#(w+x9Bf>+B62vCu z9DaTDS4!01$>cP)&i<#Zze4t%Z@zL8#U-ye1B5J@d9sN)=Hr&7i`_3y)PMPCbzP{8C9z1ZT<9kT1;<7K>ZTgtlpM`BsF z?%YY}wP!oGI?w)WwXPIb;-YbKb`B7==cc6LinDe2bFs{(CA#rST#~I+w6uj^?$o^I z*Sq3-IE>{OCnpOl>yty`jy9=hbSr{|xs($gGiALIRQ%_kb9Q!u-rnBV9`dLr)>|cI zY5e)B>XGj$8Qz@Hog*W%t1HW<>IH;AeoYOvoSdAh|B=6O)MWGQY4YDkGbg{dxcKK@ zE_~R(FXqp=JbU)#VebAv!9nG%a6R>Z-d(+YyW-z>Ur;&Q`Qq=}FL5@84u1XiXiLCJ zgNj#C7gcVT`kkO~ti)Rh^6fFazWLhmOBT{k`SRuE!oq@JY*T3|rEl@$ zH*Xk2LP98ngoHZ!`kp2xo_r%>n~P&&XJ>D1ZMCqr&inC$iid}%_2>cTqyWiXHQ*v_s)~gAL ziIt1a8XAYNe!+;E;^J+zw6sIR!7-%?c6thRM~@!}W?`RI(_~UmS?Trm?P1h_ZQHjq^YZ>%Rdqc# zH+L%~CClN%9X|j2G9qQppWmRYto-5QNAJKuGC%L!xl^EMtW{mFrmh}z?aBDW1WwDh z;*IEO(Z1imU%0w%8EcOa8W|aBY-#E4>U!wwdo!q^Q2}d;AR;2(y?_5OA%VXlMEok2 ziwis9*%9wKQCwNcE-4xM@ZowRBclq3<%I>ugoFf?Ns)fxii!%Us=YKcQg`nP-MDe% zf|S(Wy?Y-P>!u$};a-bH{|7iP&Y_{E#1G-&47Z;PT!`O%48^auzCQW4FfMWH)~#O~ z8fcjarcnL%lzoAXEt;Y^yQ0DjRKiecT3gj7CMMjgdZ&KX^z`)n8xU|=R(2OY-_zHZ zJm;dIsObCh+E!?y28(Zbe0x9A`(ap(q{T)uOn4`*w7U>RNa0G2^XqWw3B!@xCWZOHOv9ZRN<7i0J5##Olh9 zLt?N0{rBJc_Dfq7R8?EL?oFL{adBaExpKkQR-n*}ssH

H@o^IZN3$A{XuKW>}+@ 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 Z?)4|uDD@Y@j1+iXz9@Sk=A72U{{t_ delta 5676 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 9 + + +X1:e--X1:e + + + + W1 @@ -97,28 +104,28 @@   - + X1:e--W1:w - + X1:e--W1:w - + X1:e--W1:w - + X1:e--W1:w @@ -148,21 +155,21 @@ TX - + W1:e--X2:w - + W1:e--X2:w - + W1:e--X2:w diff --git a/examples/demo01.yml b/examples/demo01.yml index fc93c5c..d5ed3ef 100644 --- a/examples/demo01.yml +++ b/examples/demo01.yml @@ -6,6 +6,8 @@ connectors: type: D-Sub subtype: female pinlabels: [DCD, RX, TX, DTR, GND, DSR, RTS, CTS, RI] + loops: + - [7,8] X2: type: Molex KK 254 subtype: female From e769be3905fd022ed68777a960776016510e0a32 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Sun, 17 Oct 2021 15:33:41 +0200 Subject: [PATCH 068/155] WIP --- src/wireviz/Harness.py | 98 +++-------------------- src/wireviz/wv_bom.py | 13 +-- src/wireviz/wv_colors.py | 4 +- src/wireviz/wv_gv_html.py | 148 ++++++++++++++++++++++++++++++++++- src/wireviz/wv_helper.py | 13 ++- src/wireviz/wv_table_util.py | 104 ++++++++++++++++++++++++ 6 files changed, 276 insertions(+), 104 deletions(-) create mode 100644 src/wireviz/wv_table_util.py diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 17f078e..14174bb 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -33,6 +33,9 @@ from wireviz.wv_bom import ( ) from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_gv_html import ( + gv_connector_loops, + gv_node_connector, + gv_pin, html_bgcolor, html_bgcolor_attr, html_caption, @@ -174,102 +177,21 @@ class Harness: dot.attr("edge", style="bold", fontname=self.options.fontname) for connector in self.connectors.values(): - - # If no wires connected (except maybe loop wires)? - if not (connector.ports_left or connector.ports_right): - connector.ports_left = True # Use left side pins. - - html = [] - # fmt: off - rows = [[f'{html_bgcolor(connector.bgcolor_title)}{remove_links(connector.name)}' - if connector.show_name else None], - [pn_info_string(HEADER_PN, None, remove_links(connector.pn)), - html_line_breaks(pn_info_string(HEADER_MPN, connector.manufacturer, connector.mpn)), - 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, - translate_color(connector.color, self.options.color_mode) if connector.color else None, - html_colorbar(connector.color)], - '' if connector.style != 'simple' else None, - [html_image(connector.image)], - [html_caption(connector.image)]] - # fmt: on - - rows.extend(get_additional_component_table(self, connector)) - rows.append([html_line_breaks(connector.notes)]) - html.extend(nested_html_table(rows, html_bgcolor_attr(connector.bgcolor))) - - if connector.style != "simple": - pinhtml = [] - pinhtml.append( - '' - ) - - for pinindex, (pinname, pinlabel, pincolor) in enumerate( - zip_longest( - connector.pins, connector.pinlabels, connector.pincolors - ) - ): - if ( - connector.hide_disconnected_pins - and not connector.visible_pins.get(pinname, False) - ): - continue - - pinhtml.append(" ") - if connector.ports_left: - pinhtml.append(f' ') - if pinlabel: - pinhtml.append(f" ") - if connector.pincolors: - if pincolor in wv_colors._color_hex.keys(): - # fmt: off - pinhtml.append(f' ') - pinhtml.append( ' ') - # fmt: on - else: - pinhtml.append(' ') - - if connector.ports_right: - pinhtml.append(f' ') - pinhtml.append(" ") - - pinhtml.append("
{pinname}{pinlabel}{translate_color(pincolor, self.options.color_mode)}') - pinhtml.append( ' ') - pinhtml.append(f' ') - pinhtml.append( '
') - pinhtml.append( '
{pinname}
") - - html = [ - row.replace("", "\n".join(pinhtml)) - for row in html - ] - - html = "\n".join(html) + gv_html = gv_node_connector(connector, self.options) + _default_fillcolor = translate_color(self.options.bgcolor_connector, "HEX") dot.node( connector.name, - label=f"<\n{html}\n>", + label=f"<\n{gv_html}\n>", shape="box", style="filled", - fillcolor=translate_color(self.options.bgcolor_connector, "HEX"), + fillcolor=_default_fillcolor, ) if len(connector.loops) > 0: dot.attr("edge", color="#000000:#ffffff:#000000") - if connector.ports_left: - loop_side = "l" - loop_dir = "w" - elif connector.ports_right: - loop_side = "r" - loop_dir = "e" - else: - raise Exception("No side for loops") - for loop in connector.loops: - dot.edge( - f"{connector.name}:p{loop[0]}{loop_side}:{loop_dir}", - f"{connector.name}:p{loop[1]}{loop_side}:{loop_dir}", - ) + loops = gv_connector_loops(connector) + for head, tail in loops: + dot.edge(head, tail) # determine if there are double- or triple-colored wires in the harness; # if so, pad single-color wires to make all wires of equal thickness diff --git a/src/wireviz/wv_bom.py b/src/wireviz/wv_bom.py index 6689d79..d28e3a1 100644 --- a/src/wireviz/wv_bom.py +++ b/src/wireviz/wv_bom.py @@ -7,7 +7,7 @@ from typing import Any, Dict, List, Optional, Tuple, Union from wireviz.DataClasses import AdditionalComponent, Cable, Color, Connector from wireviz.wv_colors import translate_color from wireviz.wv_gv_html import html_bgcolor_attr, html_line_breaks -from wireviz.wv_helper import clean_whitespace +from wireviz.wv_helper import clean_whitespace, pn_info_string BOM_COLUMNS_ALWAYS = ("id", "description", "qty", "unit", "designators") BOM_COLUMNS_OPTIONAL = ("pn", "manufacturer", "mpn", "supplier", "spn") @@ -263,17 +263,6 @@ def component_table_entry(

""" -def pn_info_string( - header: str, name: Optional[str], number: Optional[str] -) -> Optional[str]: - """Return the company name and/or the part number in one single string or None otherwise.""" - number = str(number).strip() if number is not None else "" - if name or number: - return f'{name if name else header}{": " + number if number else ""}' - else: - return None - - def index_if_list(value: Any, index: int) -> Any: """Return the value indexed if it is a list, or simply the value otherwise.""" return value[index] if isinstance(value, list) else value diff --git a/src/wireviz/wv_colors.py b/src/wireviz/wv_colors.py index 857f307..34d9241 100644 --- a/src/wireviz/wv_colors.py +++ b/src/wireviz/wv_colors.py @@ -178,8 +178,10 @@ def get_color_translation(translate: Dict[Color, str], input: Colors) -> List[st def translate_color(input: Colors, color_mode: ColorMode) -> str: - if input == "" or input is None: + if input == "": return "" + if input is None: + return None upper = color_mode.isupper() if not (color_mode.isupper() or color_mode.islower()): raise Exception("Unknown color mode capitalization") diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index ec80aa7..92c29a5 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -1,11 +1,155 @@ # -*- coding: utf-8 -*- import re +from itertools import zip_longest from typing import List, Optional, Union -from wireviz.DataClasses import Color +from wireviz.DataClasses import Color, Connector, Options from wireviz.wv_colors import translate_color -from wireviz.wv_helper import remove_links +from wireviz.wv_helper import pn_info_string, remove_links +from wireviz.wv_table_util import * # TODO: explicitly import each needed tag later + +HEADER_PN = "P/N" +HEADER_MPN = "MPN" +HEADER_SPN = "SPN" + +# TODO: remove harness argument; only used by get_additional_component_table() +def gv_node_connector(connector: Connector, harness_options: Options) -> str: + # If no wires connected (except maybe loop wires)? + if not (connector.ports_left or connector.ports_right): + connector.ports_left = True # Use left side pins by default + + html = [] + if connector.show_name: + row_name = [ + f"{html_bgcolor(connector.bgcolor_title)}" f"{remove_links(connector.name)}" + ] + else: + row_name = [] + + row_pn = [ + pn_info_string(HEADER_PN, None, connector.pn), + pn_info_string(HEADER_MPN, connector.manufacturer, connector.mpn), + pn_info_string(HEADER_SPN, connector.supplier, connector.spn), + ] + row_pn = [html_line_breaks(cell) for cell in row_pn] + + row_info = [ + html_line_breaks(connector.type), + html_line_breaks(connector.subtype), + f"{connector.pincount}-pin" if connector.show_pincount else None, + translate_color(connector.color, harness_options.color_mode), + html_colorbar(connector.color), + ] + + if connector.style != "simple": + row_connector_table = "" + else: + row_connector_table = None + + row_image = [html_image(connector.image)] + row_image_caption = [html_caption(connector.image)] + row_notes = [html_line_breaks(connector.notes)] + # row_additional_component_table = get_additional_component_table(self, connector) + row_additional_component_table = None + + rows = [ + row_name, + row_pn, + row_info, + row_connector_table, + row_image, + row_image_caption, + row_additional_component_table, + row_notes, + ] + + html.extend(nested_html_table(rows, html_bgcolor_attr(connector.bgcolor))) + + if connector.style != "simple": + pinhtml = [] + # fmt: off + # pinhtml.append('') + # fmt: on + + pin_tuples = zip_longest( + connector.pins, + connector.pinlabels, + connector.pincolors, + ) + + contents = [] + for pinindex, (pinname, pinlabel, pincolor) in enumerate(pin_tuples): + if connector.hide_disconnected_pins and not connector.visible_pins.get( + pinname, False + ): + continue + + contents.append(gv_pin(pinindex, pinname, pinlabel, pincolor, connector)) + + table_attribs = { + "border": 0, + "cellspacing": 0, + "cellpadding": 3, + "cellborder": 1, + } + pinhtml.append(str(Table(contents, attribs=Attribs(table_attribs)))) + + pin_html_joined = "\n".join(pinhtml) + + html = [ + row.replace("", pin_html_joined) for row in html + ] + + html = "\n".join(html) + + return html + + +def gv_pin(pinindex, pinname, pinlabel, pincolor, connector): + pinhtml = [] + pinhtml.append(" ") + if connector.ports_left: + pinhtml.append(f' ') + if pinlabel: + pinhtml.append(f" ") + if connector.pincolors: + if pincolor in wv_colors._color_hex.keys(): + # fmt: off + pinhtml.append(f' ') + pinhtml.append( ' ') + # fmt: on + else: + pinhtml.append(' ') + + if connector.ports_right: + pinhtml.append(f' ') + pinhtml.append(" ") + + pinhtml = "\n".join(pinhtml) + + return pinhtml + + +def gv_connector_loops(connector: Connector) -> List: + loop_edges = [] + if connector.ports_left: + loop_side = "l" + loop_dir = "w" + elif connector.ports_right: + loop_side = "r" + loop_dir = "e" + else: + raise Exception("No side for loops") + for loop in connector.loops: + head = f"{connector.name}:p{loop[0]}{loop_side}:{loop_dir}" + tail = f"{connector.name}:p{loop[1]}{loop_side}:{loop_dir}" + loop_edges.append((head, tail)) + return loop_edges def nested_html_table( diff --git a/src/wireviz/wv_helper.py b/src/wireviz/wv_helper.py index a10f6ac..8c46299 100644 --- a/src/wireviz/wv_helper.py +++ b/src/wireviz/wv_helper.py @@ -2,7 +2,7 @@ import re from pathlib import Path -from typing import Dict, List +from typing import Dict, List, Optional awg_equiv_table = { "0.09": "28", @@ -176,3 +176,14 @@ def smart_file_resolve(filename: str, possible_paths: (str, List[str])) -> Path: f"{filename} was not found in any of the following locations: \n" + "\n".join([str(x) for x in possible_paths]) ) + + +def pn_info_string( + header: str, name: Optional[str], number: Optional[str] +) -> Optional[str]: + """Return the company name and/or the part number in one single string or None otherwise.""" + number = str(number).strip() if number is not None else "" + if name or number: + return f'{name if name else header}{": " + number if number else ""}' + else: + return None diff --git a/src/wireviz/wv_table_util.py b/src/wireviz/wv_table_util.py new file mode 100644 index 0000000..eb76408 --- /dev/null +++ b/src/wireviz/wv_table_util.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- + +from dataclasses import dataclass, field +from typing import Dict, List, Optional +from collections.abc import Iterable + + +class Attribs(Dict): + def __repr__(self): + if len(self) == 0: + return "" + + html = [] + for k, v in self.items(): + if v is not None: + html.append(f' {k}="{v}"') + else: + html.append(f" {k}") + return "".join(html) + + +@dataclass +class Tag: + contents: str + attribs: Attribs = field(default_factory=Attribs) + one_line: bool = False + + @property + def tagname(self): + return type(self).__name__.lower() + + def get_contents(self): + if isinstance(self.contents, Iterable): + return "\n".join([str(c) for c in self.contents]) + else: + return str(self.contents) + + + def __repr__(self): + separator = "" if self.one_line else "\n" + html = [ + f"<{self.tagname}{str(self.attribs)}>", + self.get_contents(), + f"", + ] + return separator.join(html) + + +@dataclass +class TagSingleton(Tag): + def __repr__(self): + return f"<{self.tagname}{self.attribs} />" + + +@dataclass +class Br(TagSingleton): + pass + + +class Td(Tag): + pass + # contents: str = "" + # + # def __init__(self, contents, *args, **kwargs): + # self.contents = contents + # super().__init__(*args, **kwargs) + # + # def __repr__(self): + # html = [ + # f"", + # self.contents, + # f"", + # ] + # return "\n".join(html) + + +class Tr(Tag): + pass + # cells: List[Cell] = field(default_factory=list) + # + # def __init__(self, cells, *args, **kwargs): + # self.cells = cells + # super().__init__(*args, **kwargs) + # + # def __repr__(self): + # html = [ + # f"", + # "\n".join([str(c) for c in self.cells]), + # f"", + # ] + # return "\n".join(html) + + +class Table(Tag): + pass + # rows: List[Row] = field(default_factory=list) + # + # def __repr__(self): + # html = [ + # f"", + # "\n".join([str(r) for r in self.rows]), + # "
{pinname}{pinlabel}{translate_color(pincolor, harness_options.color_mode)}') + pinhtml.append( ' ') + pinhtml.append(f' ') + pinhtml.append( '
') + pinhtml.append( '
{pinname}
", + # ] + # return "\n".join(html) From 77080c90a26799a6b36ea884e49b1dbf784d3a3f Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Sun, 17 Oct 2021 16:12:36 +0200 Subject: [PATCH 069/155] Refactor connector node generation --- src/wireviz/DataClasses.py | 3 + src/wireviz/Harness.py | 4 +- src/wireviz/wv_gv_html.py | 109 ++++++++++++----------------------- src/wireviz/wv_table_util.py | 15 +++-- 4 files changed, 52 insertions(+), 79 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index fa819b1..31a4ab8 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -169,6 +169,9 @@ class Connector: def is_autogenerated(self): return self.name.startswith(AUTOGENERATED_PREFIX) + def should_show_pin(self, pin_name): + return not self.hide_disconnected_pins or self.visible_pins.get(pin_name, False) + def __post_init__(self) -> None: if isinstance(self.image, dict): diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 14174bb..6dab389 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -35,7 +35,6 @@ from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_gv_html import ( gv_connector_loops, gv_node_connector, - gv_pin, html_bgcolor, html_bgcolor_attr, html_caption, @@ -177,6 +176,7 @@ class Harness: dot.attr("edge", style="bold", fontname=self.options.fontname) for connector in self.connectors.values(): + # generate connector node gv_html = gv_node_connector(connector, self.options) _default_fillcolor = translate_color(self.options.bgcolor_connector, "HEX") dot.node( @@ -186,7 +186,7 @@ class Harness: style="filled", fillcolor=_default_fillcolor, ) - + # generate edges for connector loops if len(connector.loops) > 0: dot.attr("edge", color="#000000:#ffffff:#000000") loops = gv_connector_loops(connector) diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 92c29a5..88e3ea4 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -19,10 +19,10 @@ def gv_node_connector(connector: Connector, harness_options: Options) -> str: if not (connector.ports_left or connector.ports_right): connector.ports_left = True # Use left side pins by default - html = [] + # generate all rows to be shown in the node if connector.show_name: row_name = [ - f"{html_bgcolor(connector.bgcolor_title)}" f"{remove_links(connector.name)}" + f"{html_bgcolor(connector.bgcolor_title)}{remove_links(connector.name)}" ] else: row_name = [] @@ -42,17 +42,33 @@ def gv_node_connector(connector: Connector, harness_options: Options) -> str: html_colorbar(connector.color), ] - if connector.style != "simple": - row_connector_table = "" - else: - row_connector_table = None - row_image = [html_image(connector.image)] row_image_caption = [html_caption(connector.image)] row_notes = [html_line_breaks(connector.notes)] # row_additional_component_table = get_additional_component_table(self, connector) row_additional_component_table = None + if connector.style != "simple": + pin_tuples = zip_longest( + connector.pins, + connector.pinlabels, + connector.pincolors, + ) + + pin_rows = [] + for pinindex, (pinname, pinlabel, pincolor) in enumerate(pin_tuples): + if connector.should_show_pin(pinname): + pin_rows.append( + gv_pin_row(pinindex, pinname, pinlabel, pincolor, connector) + ) + + table_attribs = Attribs( + {"border": 0, "cellspacing": 0, "cellpadding": 3, "cellborder": 1} + ) + row_connector_table = str(Table(pin_rows, attribs=table_attribs)) + else: + row_connector_table = None + rows = [ row_name, row_pn, @@ -64,75 +80,26 @@ def gv_node_connector(connector: Connector, harness_options: Options) -> str: row_notes, ] - html.extend(nested_html_table(rows, html_bgcolor_attr(connector.bgcolor))) - - if connector.style != "simple": - pinhtml = [] - # fmt: off - # pinhtml.append('') - # fmt: on - - pin_tuples = zip_longest( - connector.pins, - connector.pinlabels, - connector.pincolors, - ) - - contents = [] - for pinindex, (pinname, pinlabel, pincolor) in enumerate(pin_tuples): - if connector.hide_disconnected_pins and not connector.visible_pins.get( - pinname, False - ): - continue - - contents.append(gv_pin(pinindex, pinname, pinlabel, pincolor, connector)) - - table_attribs = { - "border": 0, - "cellspacing": 0, - "cellpadding": 3, - "cellborder": 1, - } - pinhtml.append(str(Table(contents, attribs=Attribs(table_attribs)))) - - pin_html_joined = "\n".join(pinhtml) - - html = [ - row.replace("", pin_html_joined) for row in html - ] - - html = "\n".join(html) + html = "\n".join(nested_html_table(rows, html_bgcolor_attr(connector.bgcolor))) return html -def gv_pin(pinindex, pinname, pinlabel, pincolor, connector): - pinhtml = [] - pinhtml.append(" ") - if connector.ports_left: - pinhtml.append(f' ') - if pinlabel: - pinhtml.append(f" ") - if connector.pincolors: - if pincolor in wv_colors._color_hex.keys(): - # fmt: off - pinhtml.append(f' ') - pinhtml.append( ' ') - # fmt: on - else: - pinhtml.append(' ') +def gv_pin_row(pin_index, pin_name, pin_label, pin_color, connector): + cell_pin_left = Td( + pin_name, attribs=Attribs({"port": f"p{pin_index+1}l"}), flat=True + ) + cell_pin_label = Td(pin_label, flat=True) + cell_pin_right = Td( + pin_name, attribs=Attribs({"port": f"p{pin_index+1}r"}), flat=True + ) - if connector.ports_right: - pinhtml.append(f' ') - pinhtml.append(" ") - - pinhtml = "\n".join(pinhtml) - - return pinhtml + cells = [ + cell_pin_left if connector.ports_left else None, + cell_pin_label, + cell_pin_right if connector.ports_right else None, + ] + return Tr(cells) def gv_connector_loops(connector: Connector) -> List: diff --git a/src/wireviz/wv_table_util.py b/src/wireviz/wv_table_util.py index eb76408..a3264c7 100644 --- a/src/wireviz/wv_table_util.py +++ b/src/wireviz/wv_table_util.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- +from collections.abc import Iterable from dataclasses import dataclass, field from typing import Dict, List, Optional -from collections.abc import Iterable class Attribs(Dict): @@ -23,21 +23,24 @@ class Attribs(Dict): class Tag: contents: str attribs: Attribs = field(default_factory=Attribs) - one_line: bool = False + flat: bool = False @property def tagname(self): return type(self).__name__.lower() def get_contents(self): - if isinstance(self.contents, Iterable): - return "\n".join([str(c) for c in self.contents]) + # import pudb; pudb.set_trace() + separator = "" if self.flat else "\n" + if isinstance(self.contents, Iterable) and not isinstance(self.contents, str): + return separator.join([str(c) for c in self.contents if c is not None]) + elif self.contents is None: + return "" else: return str(self.contents) - def __repr__(self): - separator = "" if self.one_line else "\n" + separator = "" if self.flat else "\n" html = [ f"<{self.tagname}{str(self.attribs)}>", self.get_contents(), From 738012911d00aaed50f88cd2af6e37c1f2b09205 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Sun, 17 Oct 2021 18:13:59 +0200 Subject: [PATCH 070/155] Further refactor connector node generation --- src/wireviz/Harness.py | 2 - src/wireviz/wv_gv_html.py | 152 ++++++++++++++++++++++++++++++----- src/wireviz/wv_table_util.py | 31 +++++-- 3 files changed, 155 insertions(+), 30 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 6dab389..d65a667 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -178,13 +178,11 @@ class Harness: for connector in self.connectors.values(): # generate connector node gv_html = gv_node_connector(connector, self.options) - _default_fillcolor = translate_color(self.options.bgcolor_connector, "HEX") dot.node( connector.name, label=f"<\n{gv_html}\n>", shape="box", style="filled", - fillcolor=_default_fillcolor, ) # generate edges for connector loops if len(connector.loops) > 0: diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 88e3ea4..949a818 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -13,17 +13,22 @@ HEADER_PN = "P/N" HEADER_MPN = "MPN" HEADER_SPN = "SPN" -# TODO: remove harness argument; only used by get_additional_component_table() -def gv_node_connector(connector: Connector, harness_options: Options) -> str: + +def gv_node_connector(connector: Connector, harness_options: Options) -> Table: # If no wires connected (except maybe loop wires)? if not (connector.ports_left or connector.ports_right): connector.ports_left = True # Use left side pins by default # generate all rows to be shown in the node if connector.show_name: - row_name = [ - f"{html_bgcolor(connector.bgcolor_title)}{remove_links(connector.name)}" - ] + str_name = [f"{remove_links(connector.name)}"] + if connector.bgcolor_title: + row_name_attribs = { + "bgcolor": translate_color(connector.bgcolor_title, "HEX") + } + row_name = [Td(str_name, attribs=row_name_attribs)] + else: + row_name = [str_name] else: row_name = [] @@ -34,16 +39,47 @@ def gv_node_connector(connector: Connector, harness_options: Options) -> str: ] row_pn = [html_line_breaks(cell) for cell in row_pn] + if connector.color: + colorbar_attribs = { + "bgcolor": translate_color(connector.color, "HEX"), + "width": 4, + } + colorbar_cell = Td("", attribs=colorbar_attribs) + else: + colorbar_cell = None + row_info = [ html_line_breaks(connector.type), html_line_breaks(connector.subtype), f"{connector.pincount}-pin" if connector.show_pincount else None, translate_color(connector.color, harness_options.color_mode), - html_colorbar(connector.color), + colorbar_cell, ] - row_image = [html_image(connector.image)] - row_image_caption = [html_caption(connector.image)] + # + # {html_size_attr(image)} + if connector.image and connector.image.caption: + # import pudb; pudb.set_trace() + row_image_attribs = html_size_attr_dict(connector.image) + row_image_attribs["balign"] = "left" + row_image_attribs["sides"] = "TLR" + if connector.image.bgcolor: + row_image_attribs["bgcolor"] = translate_color( + connector.image.bgcolor, "HEX" + ) + row_caption_attribs = {"balign": "left", "sides": "BLR"} + row_image = [Td(html_image_new(connector.image), attribs=row_image_attribs)] + row_image_caption = [ + Td( + html_caption_new(connector.image), + attribs=row_caption_attribs, + flat=True, + ) + ] + else: + row_image = [] + row_image_caption = [] row_notes = [html_line_breaks(connector.notes)] # row_additional_component_table = get_additional_component_table(self, connector) row_additional_component_table = None @@ -62,9 +98,12 @@ def gv_node_connector(connector: Connector, harness_options: Options) -> str: gv_pin_row(pinindex, pinname, pinlabel, pincolor, connector) ) - table_attribs = Attribs( - {"border": 0, "cellspacing": 0, "cellpadding": 3, "cellborder": 1} - ) + table_attribs = { + "border": 0, + "cellspacing": 0, + "cellpadding": 3, + "cellborder": 1, + } row_connector_table = str(Table(pin_rows, attribs=table_attribs)) else: row_connector_table = None @@ -80,19 +119,20 @@ def gv_node_connector(connector: Connector, harness_options: Options) -> str: row_notes, ] - html = "\n".join(nested_html_table(rows, html_bgcolor_attr(connector.bgcolor))) + tbl = nested_table(rows) - return html + if connector.bgcolor: + tbl.attribs["bgcolor"] = translate_color(connector.bgcolor, "HEX") + elif harness_options.bgcolor_connector: + tbl.attribs["bgcolor"] = translate_color(harness_options.bgcolor_connector, "HEX") + + return tbl def gv_pin_row(pin_index, pin_name, pin_label, pin_color, connector): - cell_pin_left = Td( - pin_name, attribs=Attribs({"port": f"p{pin_index+1}l"}), flat=True - ) - cell_pin_label = Td(pin_label, flat=True) - cell_pin_right = Td( - pin_name, attribs=Attribs({"port": f"p{pin_index+1}r"}), flat=True - ) + cell_pin_left = Td(pin_name, attribs={"port": f"p{pin_index+1}l"}, flat=True) + cell_pin_label = Td(pin_label, flat=True, empty_is_none=True) + cell_pin_right = Td(pin_name, attribs={"port": f"p{pin_index+1}r"}, flat=True) cells = [ cell_pin_left if connector.ports_left else None, @@ -119,6 +159,39 @@ def gv_connector_loops(connector: Connector) -> List: return loop_edges +def nested_table(rows_in: List[Tr]): + outer_rows = [] + for row in rows_in: + if isinstance(row, List) and len(row) > 0 and any(row): + # remove rows which are none + row_no_empty = [cell for cell in row if cell is not None] + inner_cells = [] + for cell in row_no_empty: + if isinstance(cell, Td): + inner_cells.append(cell) + else: + inner_cell_attribs = {"balign": "left"} + inner_cells.append(Td(cell, attribs=inner_cell_attribs, flat=True)) + + inner_table_attribs = { + "border": 0, + "cellspacing": 0, + "cellpadding": 3, + "cellborder": 1, + } + if len(inner_cells) > 0: + inner_table = Table(Tr(inner_cells), attribs=inner_table_attribs) + outer_rows.append(Tr(Td(inner_table))) + elif row is not None and any(row): + outer_rows.append(Tr(Td(row))) + if len(outer_rows) == 0: + outer_rows = Tr(Td("")) # Generate empty cell to avoid GraphViz errors + outer_table_attribs = {"border": 0, "cellspacing": 0, "cellpadding": 0} + outer_table = Table(outer_rows, attribs=outer_table_attribs) + + return outer_table + + def nested_html_table( rows: List[Union[str, List[Optional[str]], None]], table_attrs: str = "" ) -> str: @@ -193,6 +266,24 @@ def html_image(image): return f"""' + if image.fixedsize: + # Close the preceeding tag and enclose the image cell in a table without + # borders to avoid narrow borders when the fixed width < the node width. + html = f""" +
{pinname}{pinlabel}{translate_color(pincolor, harness_options.color_mode)}') - pinhtml.append( ' ') - pinhtml.append(f' ') - pinhtml.append( '
') - pinhtml.append( '
{pinname}
+ +
{html}
+ """ + return f"{html_bgcolor_attr(image.bgcolor)}{html}" + + def html_caption(image): from wireviz.DataClasses import Image @@ -203,6 +294,12 @@ def html_caption(image): ) +def html_caption_new(image): + from wireviz.DataClasses import Image + + return f"{html_line_breaks(image.caption)}" if image and image.caption else None + + def html_size_attr(image): from wireviz.DataClasses import Image @@ -218,5 +315,20 @@ def html_size_attr(image): ) +def html_size_attr_dict(image): + # Return Graphviz HTML attributes to specify minimum or fixed size of a TABLE or TD object + from wireviz.DataClasses import Image + + attr_dict = {} + if image: + if image.width: + attr_dict["width"] = image.width + if image.height: + attr_dict["height"] = image.height + if image.fixedsize: + attr_dict["fixedsize"] = "true" + return attr_dict + + def html_line_breaks(inp): return remove_links(inp).replace("\n", "
") if isinstance(inp, str) else inp diff --git a/src/wireviz/wv_table_util.py b/src/wireviz/wv_table_util.py index a3264c7..b5a36e6 100644 --- a/src/wireviz/wv_table_util.py +++ b/src/wireviz/wv_table_util.py @@ -24,13 +24,25 @@ class Tag: contents: str attribs: Attribs = field(default_factory=Attribs) flat: bool = False + empty_is_none: bool = False + + def __post_init__(self): + if self.attribs is None: + self.attribs = Attribs({}) + elif isinstance(self.attribs, Dict): + self.attribs = Attribs(self.attribs) + elif not isinstance(self.attribs, Attribs): + raise Exception( + "Tag.attribs must be of type None, Dict, or Attribs, " + f"but type {type(self.attribs).__name__} was given instead:\n" + f"{self.attribs}" + ) @property def tagname(self): return type(self).__name__.lower() def get_contents(self): - # import pudb; pudb.set_trace() separator = "" if self.flat else "\n" if isinstance(self.contents, Iterable) and not isinstance(self.contents, str): return separator.join([str(c) for c in self.contents if c is not None]) @@ -41,18 +53,21 @@ class Tag: def __repr__(self): separator = "" if self.flat else "\n" - html = [ - f"<{self.tagname}{str(self.attribs)}>", - self.get_contents(), - f"", - ] - return separator.join(html) + if self.contents is None and self.empty_is_none: + return "" + else: + html = [ + f"<{self.tagname}{str(self.attribs)}>", + self.get_contents(), + f"", + ] + return separator.join(html) @dataclass class TagSingleton(Tag): def __repr__(self): - return f"<{self.tagname}{self.attribs} />" + return f"<{self.tagname}{str(self.attribs)} />" @dataclass From f4da47f39fd5b534fc91f26cf2e53d39975ac8a4 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Sun, 17 Oct 2021 19:22:59 +0200 Subject: [PATCH 071/155] Rebuild demos --- examples/demo01.html | 2 ++ examples/demo01.png | Bin 64020 -> 64428 bytes examples/demo01.svg | 2 ++ examples/demo02.html | 6 ++++++ examples/demo02.png | Bin 188704 -> 189607 bytes examples/demo02.svg | 6 ++++++ 6 files changed, 16 insertions(+) diff --git a/examples/demo01.html b/examples/demo01.html index c7b557b..8dcb550 100644 --- a/examples/demo01.html +++ b/examples/demo01.html @@ -41,6 +41,7 @@ X1 + X1 @@ -162,6 +163,7 @@ X2 + X2 diff --git a/examples/demo01.png b/examples/demo01.png index 75ac33326f449d797d3c934cbf90c161630ef096..179147d40af80914f3f4c48b272f91804bd1757b 100644 GIT binary patch literal 64428 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�tlzlJu#EDz8-y$P86csfXNNDlUxbV}b10lc& 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 f|GOZ(@OzzIN3wX0Q2QvZ?#V diff --git a/examples/demo01.svg b/examples/demo01.svg index 7f284b7..03b2a4b 100644 --- a/examples/demo01.svg +++ b/examples/demo01.svg @@ -12,6 +12,7 @@ X1 + X1 @@ -133,6 +134,7 @@ X2 + X2 diff --git a/examples/demo02.html b/examples/demo02.html index 1002edd..8fe7c47 100644 --- a/examples/demo02.html +++ b/examples/demo02.html @@ -199,6 +199,7 @@ X1 + X1 @@ -445,6 +446,7 @@ X2 + X2 @@ -474,6 +476,7 @@ X3 + X3 @@ -503,6 +506,7 @@ X4 + X4 @@ -536,6 +540,7 @@ AUTOGENERATED_F_1 + Crimp ferrule @@ -581,6 +586,7 @@ AUTOGENERATED_F_2 + Crimp ferrule diff --git a/examples/demo02.png b/examples/demo02.png index 667267704f56e435a495791a2525a0d14ebfec64..f7dd69188130f0292ecca718b122bc78a878c71e 100644 GIT binary patch literal 189607 zcma&O2{@H)+cvzKi87U;3=txUP%>+!Ohu(ALS!Z~%h+H{W>Mx@B?_5ClT68!nN-M} zd7l1#bwAJZzTf+O-~a#Dy=~oXm9?(xJkR4e_G91ok|TD%R1R+{7IFh&{6zvyS}o#9ASg>UqWem7=dtrpeT3hvQx}hkK6Ttg^eAP^)18e zXGLqC3GxfkDzyf5pUV)4&XyxqUvlV68>qFMjOD6r{qiJRkUfRtL`oVHO^>fHKMj9C zQ>LY==wM7QTYPU;WuEPbolNqibv*GrxAS~3Fz12ZF%rANvS%*DpU ze5tF`>cIo&+z{*_C&)Vb1_aDaPhYazLy)?B?%bE|BHO(z+X#1QPX{p*WJN!))e<<5 zQ6>*j6A0m~aUom&e$NG=|HD^5klT&F>_5cMf4-5OK$zYB_ut66=Ua3nk$&8H3#Sc% z(6iZ`s;bhee9d8~A@TF)vzB_+)>Db6eUg%sD-I7146umX4gLJ+qdySDD%F{5th%rr z_u7yeT(t@Jq^zVgJvCKbRrQ1Z?3pu5i;G|4Wj5+%Hu@v1ddqq$E7P;G0=2H{>Tb+; zS$WJh%1@Iq5C{qW2S~Tg^?PJQiLA(VNvJ^Z*s;c@rqHq<5$P!@PoknUwX|}%aIvzo zc64;ukkjLbYXAA66M7%E+S|{4`*t}$B|m?DdZ4zftc;$X-nc%_u$J%eVawjK@!!8c zN64Ky6To&!l>3W-vM`>bkaePfw59 zrAs5Dqozx#%8_y$G@>CCl$38?zpkpPdRte#fVG>QW1cL0fzmG6*)>hcT z&QM=JDIqs>by)6>(e(yl{){-}^OHaFYa*oZs+VP;P$E*6)N*#A^Zm71CP<$v2?4sPzV zjqGoEoFu=8^QxHyF~_Eba@%-Pi;5PMI8H=FMy98w?cBOKA5SLR!A{zm)WMOFf1@s}&RV5R-OHe;0Lj=%$UvE1goiVcLSO zy4Kd#_V$zf{QSp{+fVmbkBp2w^rykn^ZoPT#)gK5mX>8M3x7I0H7z+18q=TmTcxC= z7#JD-+JwLvI!`)XvQ~ojBi~X|IQjWA{pb$a)DD~3?Ao=9bcho~PjT!Z5K8Z5WMn9C zMv0h)rloNgbl26L=cL`WPsC(#^5?^cyGV!T`C)Nv+uftDZ~y#&ol%OQVic6+q*d%) z_~b{|L$~J*$A6+@=x;17b>tZOC!NMk>>}NS9fg2^z!@J>kd@N^C#e64EG$>`-yOwY z{=WraWn<&Te**9-H8UY$|1Rc}uO)VCsi~bNZQp3%g9l9)KhFnaAN~gQerG&kamD9= z{UsAW^8Q{uj;1?8>jHp z%?$^!I=B)HNY6mJc>eAa>32%oNv8?d-O%?2hX{m+cJpJ`SXg4Q#11W+&Tw2bGWwk? zAH>YUa{l~z!|u_>WO+Y7zfGGq-MTU~eNv)-xH)~WK3;&A_o?O-)U; z-Omy3GK7#}O;4RWcdkU{CLJ9ellN087YBJN%fHvrYwlz1$Heckmu{>t_5~S=X(Amw zId;>|&aPPU>(Ptq>a7J zdHMNiRyS|nOg|s3uBEk~h9)FFUKf|Tx&!uzSmm)k6R+#B_E|9W9?WuKJ$>J$EK#MJB8)MQ(4 zu?!-~ojrS2Q&ZE($mrHwm6U3XHs8U6r%|zd*xXI*M-hd{Is5nT@1V7{wRLk_^Y-4J zZ_t=@#xoe@+*d9s&%EtLMuxGGQI3|(>g4HNy8_<6eXAa%tEGj2*iTI@8|hqrXNJ4v zc~+K+w)R?`Xs>}Xj{moomeWMykt0XGJN50#$B)G5G0MouEa#`Bd_uvgsv3G#zD_Hl zeeq&QTH5da>adPbPtUF1dY_gT+EtfV|DJ9lDPs-Ml778#*KK7!R@zPc@ZpCml$Vs0 z9{TvmJ2{=y3JnYE`}s5b&dhHIDjr(DuQ6i6rcEiEwrqdxrK6)m#VU!fGBJPk?wu?J zh5w^Rl!(}lK8u#lJoAqqKG@jWuC1+QW@e(e#)gN>kuBl4N=Zsu+`4u8^l1tT3WO0%=AD+5`CjlW*j&`9TUmF}&tpU8MsroV%amN+&xM#f%I zQQ;YkGsGlp^k~0mU{A5zii32#jNMR!y37p=3w-$a>~Qm7U9>#ePlp;)b8`tXu|`jy zh!`1l{56ySRN5A;DZPhmJtFQ(IrJTVyk^vA!VVoctw9 zQ13&r{iyU(KOIt$v9U33&trY{!-o%6WlL#2H`mt|dLKW24Ajw0T%He-S^uH3{(f$z zUM5%3Ys@--`42d9(es-u@F7?YYMF zJtdCEj~|z~{FHjSfl+o$4AI zk&hpj&Uc!prlw9!O+9`3RG@ry`u;YGLb_nzjsmOrkdVeVrp+W&!ootuCcTPX8yy~Q z%*@KlVmNvo8BXSGAhRNw;=hs0YIC}(<9Me%N+hy-bH*n@N|uL;WMbC8wk{bPq@~!8 zwp#bTc>cWZ$+12hMHKGG(`PPV9h(Fq`==z9cWt%{%g}gLw(#8r&;4-sR#{f>-7L=Q zt9R!4Nj0;GmTW5p!_hbS`RlXIsud@mKYIpv*3sU+xU$mw_Ks~`)N$kxX(ZJ4ai@$I zFJ6$bfByWrn}|b3Q~+4ea#5`QmGY@0LS|#t_M`VM5~yPDM*#;u)ODRYbN1|KWNR|^ zc(?g$SFc`GSC7cewe>l?fhWZ>3m!k-^A-V67mZxSxAdetR>F~tee8j8CNg5}moKw( zb1afhlWZQVr^pbc?&EoFJ1Hmt>+sj*>&v50o;)#aPE-679U19}j3quFO8skaumGv@ zqYqU%p83uFjEqs7mrH7D9dcih*(&==@pE_%#7(N-btR>m_UxPZz#*N5iQcxxM$-(c z3!wo4b?+bS0D#tU9_AW8F44wXSQwenvXf=GcvEpTDll*=@NDO@?Oxee)}yVNy&fB} zTK9qJWwWp{Kz%v6xx?rD^tV&7l4{2yz;~RK1UtK4btu=kN))kilas{`n$(O8WwPOJ zgS}0C78DZuef<3?*bRPt@|(?%TW!vsS?Kj}d^3$R*VotAQK~uqv&eQZ5GU>F(`#Dy zxHviSsaG{MExYmqsDb3@h*fFlqrbZ?^Z?^`fBQBYsq0QoNqPOPleMK~*1dc8+W&-v zgm_Xfe_>?*R9nl(!(-BxrES3>YT11fxwAG>V8{0DzXt}STo-STcjkFgOG!x`I+SiZ z_?3o;ESif4+7o%%&@lD+b6&^x5!A2;_wQq`cFGY+-hbM&AAB`#e}R$}hXl#Z z{kf(_Y5A6jM!EYM8GC)4R3Cj)!R&l#ZC|*7iAhzO?Cdtt+$23RuMdIh4t91H3*T@y zSp{$0ePK3Q{%wA&W9I!1HmnKvp+n8KjeX{3X6}G4c18J)-|q|-^t!M7^kMrND9+?6Yj>&leSc1=$gvY5~`z9jt$z)*M> z>LJm$q(s88@fH;o6|rhbTJ2HkWWkJt@iEP zrM-6}GEt^XR$W_5v3oZTV0ZS-O7C6!QOFJ1w2Pdke&H+d6O9GvuNoU00XWsw z)wNlTRfSC&4kTWva(6HT6#n`1C&JN(iY+ZH{I!#0Tzq^lkcy3sP5Xzw${;%8C+7uwTl<;^aY4sx^ziM zSh&I{a%y^7^NmR(8U{Syfr#3H!9g~0JB6{EO>!zWnfKN0-$*GGT?a|9h1Bm2@d91Z zAHB}AXXn9#2d`Ydto}+z%CfsqRc7t-OWjod+6eyU)>ee3Gm%Kt)a;a)c&m2x>SD91 z%rVN-e5)W1P-jDPzbtHiBYH$sG?Jf}pI^Jg0qFAZM?pUImsh`9Bbta+hvHp{8dJz! z#mM!*FZHn!3s`wu2AzYRs5Zw%MOPLV72>|t*9Yl6@%1IkZ?hZu_8f7E+oLbJbUexJi+j zkiPiKUjWPc@#9C+c=Di1V6Zp2xmvGpoIhZYnpL|c_r3w~Lg>cc9^ z2eHG^5>+iP zJ`MtrM~t`L)%p1D-GQS=|KM(Zs?;mMGdz1b zJ33gTT?^?Bo=Omw!#UbDBy58o7YWDKb|ybx+I_X~*|TTSDm^#(wTov{BX!J7OooO6 zvF;x0OX(MQ#sZ&-r@VP1A|XM7rIz-5+8=*_MhlG&&yu1h>g((8Vc9mj{n)W%yLa!7 zi;H`>JB8seKR*j{e15)zrR7mAryuV&5v$MvDD--JdQuZz-P~T`(KIzlSQS~&+WpAO#}o4L<;CiTYZ0v!~{ZxS7e@H8wqO-?LtS``bu{LokrEkEh#od z$S5GR%9eibKeMB0TT@fh9+u67s!w%w{5(87=m`H;+fBd*nok|lpt(KQ{~_iU8{ zp@*wM92gqAPxPHt45Fi@b#-+;!q0E0yS^um?q8gZ$(frslOrP|We?o8w)P7O>Me1! z%4k8c5(WXme%kwb;qCWmg1(+Ad;KrUM3zrIQ_~)IO#;^dNQlQ%r%pLeeBYZvhoE6( z9QyGiI4bI)n9TtBzZex?|Dd1^l>hFY9#FleW@g1m)WyZc;21@ZAJ4XLeR(a{ea+d* zY63BeFy3}{WizP+kgg37CqE`8dU4J`Y&1MR0qj_cY>%q+N~<8SwWG+^*vZN1#*H5! zV~3-*9#DOfM+-8^epIMgN^h6>kXQpNAt6IVRJ1-?^c7lfbngPCv$R@e=nVZC1W3fl zpFe+2oH$|LmW8!4WHhRHxVO8fw6qj#Xg}*5#ST1$tRwl(oi=uMV}S=j{n8Locv@L@ z>_|<1G`>mn4nYbnj9WxpT$#;44N8Y?t-ZZH6^nR3c*4=q5|C0z%0vaEo_5j~Ey^6- zL1OEQy%abvVM7UoSQ;R9R@Uz$+@KI6BIuXJ4;+vUJazA+M!eu&-oXx1&D_h zC^eN=9F%mb&j4v9|I*t;GCzNRHM;`@Ld`DH8R@yN_XKDAj68`9EB*JGAaFe(aVGe< zmjE~j3`XyZ_?c<%zq~mi{PFYWrpS=Jt~2M)?3ljaS>hK6N$XO& z>F-Ab$0L|XTw}w260JBy&k>?P;tdJ1ue|=bCFjQ|{woU;bVQ^2xJ=L{`FYQt4T0G7 z48E3YG(0kr@A3vT!97{Qo1Y(L?V1KTf)+pc5j#js07{^s=H{@z^x;2 z&`{-q-@dri_Kgv62xmjTq#bQD>)=>NuDG~3isM*Ay36X~6t;Zgd#QxkHy#<8^4;Sr zF~!3xN#c&j3*EtCh=}S zAvNa27>>1PA3XbL=>F}Ey0*4R>d^T3dj7ZeqY>a6y}dsp?wS(Kt^?*EZ=^omzt;Bk z>rnszt;&v$YeE9lJH7OMl+K+qU^GG)-*Vgew>;Qpe?Z@*p>xNJ8nn`J$3NZkS#k`c zvkNUF#y`y#%&I;hgESgp1f27v|!~_{cA|(cDBlj{!r^Lj>wCQ@p)(;-y8()7!hFOf$K3=JDiZ%*`M#gZov$MJ3 z;o;OoP-+{qQAYwLD_f}P7#Z8Srl?>36Og5$k&znc+@1;>7kUA8KP2#Ly?>mh`{53ceE~rS=wxzzp`t`KWZhKo>Fj;8h%=lP&2On$uWPJu$0yzha`g365I3C2qV*^p;KgPCS>;Q8E`P^`~$pve)hL^{I|5^#Qqk&88>M2M>`7W!+6(IH z^VNsqQ_|9CiHol5t4lK^?i_u)l3!SwF)>k4Osu22dRQz21qja&a(*w*KKAG`BV%J> zO0~+bOE{1%-q~` z30me^vg*1z?QH#RKhHV*8X9_*nOUc@C8ebBbjqZ2N!Qca)b#5I>1t?dLQW6?(I?)aXkfs}-j7E!R!-3s z6`!fW;tjPfE;kJ9C`yuhR01yLj%|_H8Yc+nv9c*PppId zueP-9qhPnpmMx%2?%cV9o+n1yEvih)d3FfEGV|rjLVGAnc5@?FkS+4BD=V7=1OfC~ z2<${{um=l|wC*r}2elu8@$li!`90_!)`5Hepf~`$q4FKMmIMArS;-S}jfRE>6(!}D z+S-*L52)gDqf!t{Y;0`G%C%^!vb_N2(2;^8H$sDnQ)FrRCz$;-9%?2ghMA~fVq$`p z{PN|?85#TR?jLCjp#Cr~S5#O?P2^UIIcfBTQIohr3+ma5STC%n`)@CR!sW}~0D4U{ zmC5uNKX-H#0VUvA+73R>veh`Psu~o_43;kQT5ei?e#Ct9Lp?^LmKRrMAwJ|MC*Q=T z+S}(HF&>tpIzaLr5N@B3IhhT%09p!I^SZja${@Cl{xH=~BdbtGJcAJywiLr%P*ZIv zCVEQb$#@SR{`Iv7VE&zD5_(@!tBrC9ux+{g?J#HpEDIHr5a*#oBmn}nEPAupEN&Ea zDK^*1d#S00VE69b+oXl;N|XHnjjN}pCnqQ8x3;!_7_E;`oO=3d6(UBl&sAp?be}wZ zn*DfqpY!a`V|;uWFdLvn?mYuP zs59YXY#Gm=vwPmQDj{bFH13Z-(|#3?a?q0!S}cluw+*^bnuBL=D??r?YedW_G(Ksk06W?_!1G*NSSawTS%eQZ2>}ae)(|;IQv-}%!@e2sN!ifej_>J6# zn(<)!F4_!Px)cZww<*}9T@}b^lnFx|ZO+cl5)NZGD5C#fMID;x)X)=?S~x)PrKP1c z6e9i6To_Ge1AvR7018kutEv>T#ld=mYe2PiMq+Cxo)|Q> zv_w>jNVIUW%W=|9Ev^3grC*)xFBCdeT%80R4ze}O10b0Vy0CB;38t9X))Q1kC#r(I-G_!JdVFJd9d`RugQv@s}s>`8{TbE}~PG zmA(5YJ-D>&0*@pV5M-w~B<|ZkWWg-BxU5LKE#Dr6YX7~|rLCjmPE|0weo4H9Blyc0 zm6eFckI%?+fnU@_{R4;d`}c1l@16k|FFusAH-G!~CMRd#2@A#rb??@v$ITj{Vn+TyU}~f_?d>;P2}dEyfD3?730=XW^NnK8{l|}6lm$xnFfkPY zVRqW01@QGfK3MP^`A}*$`8-e(^x(9h9^WtU7VeBiW=giTo}Ed zO1l-eQ>zhuBO+SAJy)w>Wf-HrmKFU7+%MOjoxRZfPD~?*KsF3*^;VbOxU=x5hfkfO zuf+-01pq6QdD&i4kWqeo#3obLBkb^KR#5|;iY*yCc#G~(5Y5rlIp%Fgv!m>q`myuY z6d*f4KVnKwPCnQ-Z15^RJX{3(w9I#xrSaH}cX#2Vu*@^8ji4cdoM`LrKH}iXtCltd zS*R`Zd+ems+ieu|{ey$GjIM1-!f*Z1j&BU7$A22}J>xXm$`8pLgecZARqJ4QDiB+8+| z@zw)|QaVKJ|9ao)*C%qKZ)WB=R=Byjxh+!*UJxOVb=Ts&qN0xP-*o_H*R5`unlg!6 z#-ybgsi*`ROlGbh03t}{tpvp+aXDaac35r8mMvGVwBVQ@T`7PuNYfacqGvEU9rvft zpN$L*8n|9Sn*FFQU=#U8lXtDSQD$%UV+1KVySux)MRiB6F*!R(EP&Zo5DxWHzrklB zSO7*_P`5q1OI;$>Bi2?z2XgI(%wDtkte*riSY1=2nQOG`qaYTAtLN|ubFPI45Zs|4 zmU{-{q$#kf+q5eEHCPdaLiqmDO9V%6^F|p*D*bY4;0+j#$k~OsZF1Uz{QNFnym(AR zC!5DkqycayhMf!5UztaKWn-$R;Cg`}-WR3jEUO z=%}Gzxp`xB9Exc=E+pBM6lO6SPiaMtfzQ51)`&xW({ql&sa&Wf|2ImDS6=;L#A_TA zfX}Miv4qY;H#y`ZkJ{PV-sA%_I(s24E$vMnddkHxRcTXuahDJUJJdFCdQV#o7=On) ze%DL?kREi|%f~18F(fL;+_x+&7G2A(24@D{{@qp!--YIDZBi^Bf< zo)}O5c#nFKe()4Y`OVa-v^)b|rJ-4o+a}4weFB6c8eKoRB#>ngg@afmB33BYkr@!U zSQlvjIh@!Bm|Bj(Z6YLuL|y*r1SA(gXq7n0r~HWp6G&npdQnV&sYkqZtB2)H9WCfA zw<&0p@z1>jnx(^ubm7?^UVAfa5izhZXlrX{cLn}wwp11r6>V#4vobNc;dt$h2@QKc z8uME$bo`riWN&fV#Lh2H-7I#vUZSL|Y}HddhqgOQJa0Ac&71CWkND_1hxR&nj!)&caQ-|vgQOX^ad%HE7=vKC5Cu-Ll1RYr3m4EPr~?DW*Dp*@ z|C(|_1JYetuzAZC{v${5gk$656%Kfa$;rv~au1n;3-inW5zs?iTYJBJu|PY8lBsWN z<_0ANT{wb8zn;}sj)ONoR__TCB>Z*yIHh(YC%lA(h1ITHNzGO9M}576ZV2HO78=T} z8h0e#DWzcRf7&~1V_~R#2R$2%|1{DPimRcAwSV6~4DwSxU?11~x#u=Nr<`8Bo!%Ks zBWGDWQp~h}Kj^pGOGY8XX)_MKpamKdPnS$A{w-gJj~w~(`7<|u?dn>A<_7#luNC_n zUX`z3zCdk`=w6uWt30FAS! zqN+&74upUX3eLD>2?w0KHwXprRMp?2jI96NSt-U{R5T@rJ7>SB<(_DAepoJ6g@>6m zffR4FDnacAZRr~rn4g;~ac9~!G?{Az#7kvOMd(2&Og;)x3K9t}tt zK}^ElZp`J$b3mp5K1FKnx{z{#*icYdW~i2B#UkN8!L1Iz7GEY5KSDT@vm-ac1$F~EH5ofjnEt3-UA&C0wzia@prC+2(9xfVjfL`&Z~hDLH`1bf-(}^KlypT) zZ*!7{M12*RSy;?YPs1hva~LcQq2}N0;_N%`ElwqqT1j=R&xlJO&-2oy(<^p+x zb5=9>&F&Ru;96hkrk&`n?yE;LQfK$v+k|ma>>BEO#V#GiDC_lbk z`W+4Z1yI~nNol7RD;t}YscCiJ)NU5>l#GlOh|2u~1J(S8uW1s|^W3E z;x%HIy>5|%Cj84ZE`h!Nzmv?>KgTHOj~wt^MaSH&!^_mDXHQIQsIOOzFrnDF6S)kI zI5ChGUq5y3T3(n?CBswEXz3dm$mzm4VbNPw3JC;MyMFF*2fAyTAEJ(%Lrj<$9|uYN z#k-ShPZuq+&`^>NfiNjaVmqo7Po26~UhV-keK+$-S>toSKlAAE5mYK|!Q+=cxzZ z2BSmS3ScJ$K^*#6Ab4m+`Wd%+%hqs*;B^B^N>%{RQrTv3Bmf`g78Z0NEgm`M+oEyt zBFRdlz$uPU!al$%V*aXh9tV)rm%xeygi={K7$EvR*ydeuFsU0^LocX50OfV|^c4*a z26}oULqqfwTmN2Fw8oC$4IY%0NwdrG>_Kvl15keX(qf?IvA)05Z7_H%pw7_0ui=i2 zzs7W&zgOKv3pE8sCU|0M1Sz#IL=TLQkN5X`MiAb?j#C6*nKmDjcqV+%$aCOvNB@do zp26R(*IX8je@gG0+$c87v?dUKaCpMV``T(_rFVmts17RS+6-!tBx^lz_{*1%w4^}} zvaqmNl54N?ojh6CB3yG-_W-pkNd)R`Md<_GQ(`l)v!FA_u$GJ+ESkQtqN?iPloM#* z*;^MbP%k(>L~=&wo~9b_4qTUbq1`N|hs5jdrwyt^eTWv+BN`YO*xCvgsJOeAwU>eG zq5R0m#H8pxnZ=>3+zz=}tGo&V3;(6*h#$kGi?_LAvxzDMt+w5g+lPJ@j>psZ$vq6* zK}cYr9Ss@12M_i-T7RI^4&!Ve9mTKwdf>}EgQ3og#ZWkxg2qO!hj}^qj8uA%^zsm- z_0u{HVcT}>K%srS!lGxwMR-S1gMSBkpz-3}Ux{4s${sxD@VD*%x6XjZmxqZmb1VM8 z^#8@#KUo2X`wUbm7dN;5sft1NJv-}hTyT6z?FaM82Be_x-^*0vrMt!9+`{A9J21wcWR{B;QD z{gc>TrNL6H!Gtp2lA*Dege$zp+Ls(I0xUN-_eBhijNlY0 zc4)}U%Y(LdLlgfTy)YTDKTJwLS##+UKlnd~ehHzn%yEL1wn$|K2^q8}^ss|OU)a*( z>koONr@DbJg_G7I4@40BHaEKqtMh>id`K>LSMp9X-9Da6qBrVTU_k)C+z=F+gH)2KjX7GkJoX zbKM7B93Do-hBjcvSue~0fQVw31GDq}LXH?F1M*?i{Au8a<_y%mCpDG_aO{I30}Kdg zal52Wx||zAB37d3*9?!1J-2T4YiaX1<^ktt?B0zn2c9=lK7gaf3h=?okSW*DTKcDZ}(dga&>DM!Bfh44h( z`SSH^+ENz)y2P6j1x_Rqs&^fL9q1tuiZ3^@ZrDM&q%(tuh3Vsl6^2z>!G>%0P=6{L*5ww6deo?e7AL_tpV5Un4u zxCwiFeYya)ZAfQsZjP839D!!Df#mP+khwfKx#YUsH&k&9W>MA^6E#%HygYjYgMP5p z@Oz{W-41U;RRC);?(zwOjAt*R^fP}&hseUhW)3U*&hOmf8|CAGGFGQRt^*z}OsBJnr zM;8<}>FfdB71pIQo&Ms5Ql+X84`;n(4ZQ?DO;rr{zW>;cch;^O>b zdr)7YUSLGQSdfItt5@6c>=Jh3R8&C?4GrDh*R`~|ROI-K0g!)e!?6Nin~f6(y<62H z3}JyViOyH_pjXk=jSpN(^k~CA_Dwlq<$)7Gy}W;)=pwWIZqD<}%v43+*=+;+_V1T) zHo(s6>I$^-wqe6tN##v`rREt*E7E^p+~^(b(d*=~J<@yBl$HG*44*xJ-gt5Q>>);W zPdyN{jhta60%&A2>V7{RzjX1Up0Fwt2!a#x1BV3!CN2zS#<2Ulxc}pgWD>VC@tN<0 z#UI=me2%DurZ;aMTnT*RxB!Sx!u`%MkoW+fCpz<#EhbZ%hK}q%o28Lto=nks|&TC9Qu0|W#!Sh`b`O+hBl(&B-8mM?vS&~;T#8s!&IC8 zK=6(vtHi!Aqf@YxwbJbLvg3hYAmQ4sE>rG3JBQ6t(!PEBB=`uSYhse1HLM#*cBuX( z=nIqlW^xii?hzY0GQ=;<6A5&xrlz*s#zwLN!!_V3d|Bwo5%5%|-K9_g@T3!CW9N2U ztyzD)W$hLJ09B#XPT*jti`UEDr8qc#p`q_CFGJPGSWb13qMg0{9Z4N~`{Qd;jg6Hm zuya9YFYY6RUk-|jBqFe++d!Orkp5A*yW(3@Q<7L>|AlkY^;_I8dFwY-IxCu=K6ZwK zCR*nbV=(!2Te-&u41?f^KU7uuM%<3v3;6_YGxI#-uJ`Zt0Lg%0pretXf`McYvKcu$ zDXl+jFJZww4y^%Emzp+nTMjSt(WBj5zAnxLrAV~U8RY&0=+ z%g{IVff_5DYt_P`?U{Q{2yX^`rEE-tNw>$B#(}-NHwEYP%`E9_pTqI*-WZ0KHfAbb ztqo6T$3<7<0lSz(TAA6|A@g0L=*^aMlg#1g%Jnlu5p;~tI{hgvRj<-GXGp=mngv$7 zc1e-(rf=WE&mF7AdjO%Lf%JAI!PilzaMBamTVUrC|uFJdKJcXOE7ix8!#7-H+*CS zhaD?ytfJw%`|kG#b-m8b8@rJow6)K#$8zPAZnd~n^V?q;C`uYcGX3~@fV4y^?**3?!sYgZ^_wLyP9}Lp%rRCyn zQaebu7)wh>Cu-3i92a*~U1cJvu-P}aKzjT3?VzaV=jRdg1<;O8oQSafLP$s%n$4fJ zN5i#u|2b`K7Ps!m^Se9BJ|U}$=fAbBW-npzuTwC5dBD4CrsL>|3NMC-(0wmmYJ$2A zkKgUZNj=M>k?|xq8~bocIjrXy>Y2-6NtnDt;%Xm>kqIvS=rPTcAgf%o;#ePOsW6y)W7zQ4{XG8CZSzrVzORQ-(n zrXGbeXAE(x93ewsXplhB69Rd6!laI-!X1JqDh(T3yy$nQ(={|hgj%@5)m}tNfPLl=~XhD2953btYl z4zd>q+Vpi!$>qt@syefoBurWNq;}5Ix7Q1r8-Wey|pzt z8QBvtTO(DS24V~uAwfeyLBVO@u}0@wqA_eq`V|iW!5kbVJ%iCD<>!~J&3AbQLo)Jv zyt1-FM+{_<_{{$j^D7w9053i(oc|Bu`~6k3$N1P7=0YUaXkubxxdaZ3*RMj>BV#97 z^D`s@_Z_c+gAM9UbNZhc@Z*J<6KyPbxYwlqW&-5Pjq0*|fsG=g6Hsn?_<_(=p46vCtS5^AoO%lgrD_ zMHNSsNt^2*K@ix@X`_AS8f_5+6DgE$Woeg?nniUP%DPcZUS+~5&nJG#`frQW{=bu# z^@F+gyICbo3=AOZ!4TJK$zcow{;OB@<7-#{O)y@X7k6Jh`B5;`e(3%%2`gwx1TqPq z#TsStRpi+WDE(FXW=%@AobNxXUCgPjbM4ym=tz zX@eU#1dYBt`Rnhx#M{E?-I0H*%a`UL@F9DB^;AlMXP|qo3CI-zGGwiUa1wjbs%7N{ zI_K7Ti(BUAF0e%x78b(pS|fI%1AQ09Ry@7D?zp)0LI;9ugC4DWC+YMX8Koh`_m=@@ zNL&AsQ&HJX>ZpofUx6}VGYZ&FL&R_s*JuHsghaI76Nt31)nH4E5Fps;?wx?9ZQs7_ ziC$g;Aq4_oIpRpj)RE~B5Lh80dXPB}@q~T-`0+H)9w4t8cEO17h=xWhdj3s-diSpJ zZIWHW9Lo)4GYk~UXK3LpLsBU~c*T|Pe&p?a*3Rw?Cgw<^lbbhV9OjVv`~N{p=3QY& zvK1C?Mp8s46FPTOUw>%&0{T?XV9e)&A*LpRh8vpQZzp#hRzx^f{u%UH!V)31yUlkP z&yt}d1C5Fn*ll$&86Gqgl)dTSxLr@ zUOV$`(z*v|PKWZ2z}AV!VD*`u&Squ&U@D5Es;}B~*JcGu8a$yOO1VVmM%yMZxr8wp z7$2soUfKd*qhf5`e9zxs+0}IwQff*6Yq%($g02Fca`bxPjT<)_%wiusdIY)}7wjz& z)Tkn7dUGhAvx(VoN=e1C{4j=jt*@`Ssp*5Zsas7rF9cVT``-$BV02W}9_gr~sKhxr z(~#QGiGmzQzfKxlF`UqGS)62N_jJ&y4tT_WD#9v1dCtXJ8BXFJ^saZC+HuTfWo0v{ zD(apJgQAeYbXus#<@%dIikRzJoURoBv@$a=*t2I3r{OPpCNFf}+qa9KJPC(V)YGSV zS8l-~hSZ8n%2UF__o-g=HKOq`vOsh4@>xXon$-L|3p@OMq}Wdsw!H| zcb`6y=9SmTCr{dib5DBfA%S*vYW^?I z;k{q}%Q;-ItZ0~x=_;r^SV%zmTK9>p^z?<1j8|r+rq&c_S|BKDWNKbfSN}}^rz6)# z?+FfwtvU9ssHCJ4S4G8hu+xi+c1IWg2piUfqX0^|Er&~Q;y9zI=vQ7Y1D6zDYSC>} z6O#H*VZh08lMChh#4}_nMIcz+mz2OFNZ9&mSsLrBb6KOByTO89?x+*bZ~jkkJvJgJA9j{6*Xh`OpOGD=ELPuInt zKB31+Z64X3;nc|Apws%^mndpc+(%YzkP(JkvVk`08;-G$4hP(uSZs_%(hxUq-t0+C zbln{B_W{P2_}@1-)2XS+YG6KIds|rStZQgk>-hp_TM!AbU0t zig4$?iDBtUPfSF082R;!mYP}+ig2ee_l}%5p1by+up2_9#u(TsL5^w_al+lWpMca5 z@ug}|rLzpD_UTn{|AVI|INoFsgU7uQ5h+Iw00civ$%atpui=jJM zgM9YvCL<{-^$)652nmPKiFJZ<*V5GdR3o$a;{h5>4u5d>cNv&1y$K1GXh|`c4tF5~ zA8GU!k1J3x7)eNw_}4ozmf+IE*m~CU=S(Lop1{NYaHsgiVhue#b~lwLwVyx#hF*hN z&Uw5?1?_$J=zqZYc-E!nWVoyE#-(C-AB&CLMavftKn{j+ijP{h1Kcnl-nwxI^Wkjn zi$4Jfa5%sNUf{uCjs&(5q)O81(YoLD@$penht)CH1f>(k%?|ie(bsC(yu#8Hz?Y5s zV&j)hdT+_yxB_sT?yo|S0_!70QIBSsim1BD5u0DcJ|ZZMsB z>FLH8WCg#Hlsp=X`5PPvxI%sm4p#CTGk)&v^*}C0hL1ScPcnIih2>gw2qC1FDmwQf zZ_85IVDbIGbeU?d%z(HoMn*A!Zkn2RA^pn43X9974A zAY4HIV|3Tcld}Xc8uTkJ@G?lkD0zT8NYsjfG~4dt15hR29M^pd_AnwsT|Ve}dU{)< zX)vSrF+suL)HGm*s|-qm_dOYQK*pY#5f&94beIMnW>Ka~rgogtR zDFDJdgEtktjKWs7=aymX^!q+T#sB2(gdFN0pcFjyBb4_U;1Rrb1)i0Ce)borNnTrn zr`KLU5Rhbj)nhgum!+)~DTWRc+j{Y(Ak<}QeRJ~+Utb+EXl0Zi_w3zU2Tw2@;c!nq zDK9TCDUs+AhnIyQmt4kQ2#yFKHu zul#3n`gPLHi|WW9cG?`yAA^ype!Sm8^o@&Sb(`jwkkI0!1->WsQkaCp;9QWuKZYKYpdArFnaK`R&DM>>6y!VYZyE z(lY$~>6P3iKbUWpST$EP+*Z>rhaLO3}x^&kiR_2kr4HY^+Yx1zBi z`V(a))PT^rZIi*g&%{ zhj9YUyoc16badPyO2d~0mlp4jnZNHZO1J?w4ChOKO#|l$F7n4+q1M<_W6V5Zx>Hkg zUwnP!%Y@7<>86I;Z(fYRG4Vbx@AvuhTgZodyT62o2Zx5XQoTqLg5@MMqO~+}3s2(C zTepZ+F(kdnw~2b%sh-nPBz|uAU<6mIsk!Kyi-}=!l;&DF8_S+arxsc&I(4P+Z<9{^ zLj6rd)`@HK@@#^X@s;K#W+Ux7W@aq`0rx%9n>~Zkas6g3FC0StlwSO?1;K-vCnmO9 zPjy2$vgAor2m>=SGo0n{@Dj-++!ukOx|gAj!3&GiN={BL5<+^%2dt8qcrxW+U}5R` z_ATX6bIb*hz_RZ#EjrXdmIW{f-T8HiD#;RoW5fm%A3AdCu9ValBhS(Yuj^Vhx0{@< z;yZu-Z9eS@!cYQ+tL?5h`aYDM^cd@LyuPP$1uqQKk@;bwZo%^@E8${N5~KN8HpAHG z1n#qEzCF`b{uXR?&f+57{_O#CJ`cI{_Z&A<*m`^)g##Dk``t=ne**bR%4N8}FBERs znldu8e(+UE5e8Jc-${!K*B7>rSzBmLJ4C6K%#VluIeip%6TI1?4O8^U^kDQO>>O+I zf$MS@FlD|Ss^?P8m01jEYGJ?@kJhdg*oS^j7;}D*okdL=e!!e)){t=T)hnxu^TlKr z55Q}zh}sOopy2T8P;wAh3JtqMZXhS21mQEkuG2o@{q!qh=NXBBw9*4_1osV`sMS6v zbS>1sR=7y=+7Wk3Ns*_tLc)D-I_1sm57+PC#FDV>oa{bApm|3QS3o6=e#X9FLch?X zOQ%z7tak1q>@^hfx*pe?9JA?4D<@Yz=lu)E%-`P=9*n`bm}0ysq8%57cWW zQExSDrQsy6*SeMUVd`yZwZU<&Q_q{PJyx(6w{ATpoUJ2JBi>ZO6ri7ZLV5K5yVSJK z>m0naq!bm(rM$YfCVH!rvwovaahi*lcNmJ>3$21bXgR-lp+XU0V$eH^YVrk?66w`2 z;8@Tfc1e4Nv+t>*Au3VU&j20@GEzo(frLBr##5Hs6QfKo@fn!9h&W^)s^Gkn=n?ij zqdMiy)kytd1XKO(y1T3bv>}}WG8h@@aB^E} z=Xj6C-Y%tk1)fT&FLcYxu5hTquY29BuPnT*+`4ZZbqs zvMIXG9R{~m($x~3XFS0NJ;R^iqreAh?ak86tND4QH*hdgJ);KNDwi}|Dj1A* zwF3rePFnIxYY1lft5vwVo}iU6~aV@=^4#& z8d2;Z$?r4ykqYw7F&|e$nr$|o!J#2BF_M@`&iH`8%>AV1b>>wYLg5bdNW9lXgy968 z-{+}S!Q_zh#uYeWg0t%y4@9Wqc zvO8|S7jJ>z=jsY08tom*1ubz>oRFTp)ni;AU zbuJAf#TlP(iJnnVR?e*vFx(&ho2#(y`Tkc1f{fqH?8|m%uPH{5ctPWh21IMYa#d}u z|7N^q4vjIbAI1Qx))$Kl3yLMN!9mGf4TU{RmxM($Oyi4encmC z;reI~|2E(W5`-wW$7HECQ_neXY9bjs;gi0#3VZi{@6BRF1@c8GnVD%*-!e2Nz+}6v zMPN9X^dcg32=lFhebV%v*CZ#lGoG|8Ip9gSC@DZ-u3XA91>+x&&uzgp^PFld1DXQh zWSgRH2m4@^^sZdvps+ACxB^~ED=8?P#GDpria!B(ZNUO&q7FZRkq$*i!gK0 z7&l||HRcWilUNiJLm;D|$mKWoCt!8WuSh$LT_qsivJb<(Y0{M9S6b@!C;cYHmcqz& zD0aVfHXyV7W(jDQ@ws|Lr_8nJ3dxiqE+&?3cIkQemFSb!N!12IZA{>e?t--IuD?p@ zzC3)0aI5pp&pY2ok}-oofcg1`)dq$F`==wPFhNq$&?Whu{A{u{W z@9yPOf0BVQj&nyNMNOLwkbnLkzTP_!>-T*df891ovO|UJO~}fMvQo(=sVEs4NknxM zm1JZlBN<6#Mk&=z$;yZnkz`gXqO|iIFMU7X=leXr;g9#{)4Ip?x~}s&&*M1G;{TItP?r9(#~Z6`H5Er7K}Y*V#4F)!|^|bi`W~$(=5n z{A@+y>{QYP0g@QJk#mh#s*9o@@;KnYzL`N%iMN(B21ZBI)%7GS9RY|z3v79s15ox( zu?^)mxH;5^s0fJ>+c~~-C{rZeHqw&VTPEhvCNqQ%Vos&;BOnq2g>kyp-*Z)BX~b3o z^>RtW*NaylB~DXcpKY-X|wsxCJ1k;+K!TLLV(tQYYqGjM;?i%{s7yt`WDHW zqUgpl^*e)NOf@e&nQ^YSR?p&`Z_TMlIHH-Fwp8qS=pgt7FXyFp30N$&hXYkku>L|i zi7?kWby)xP=$pyOTCYA?98bKHT_6e<$Vn4~wW>frN(^prF0bbf(td?=_5h{|(MEgp zt^<1}*65#Lzr)QUI__&{ts)^huHddC3{49lx@FJ7Z(O{$agdFpjHYNntf4%la6plO z=I08*P0|~Kw6kGNU?ckxbu|^P4= z5W(~l6auU80H5K?w+H^<3gebnL)kd)+N+UhVP-};(_mFgy%wflB*c}4qqDQ_1;XWB zEfq^r{Du|~5HtBtJZUx=Pe< z?-Am?pOm!YV*9F!= zid}-N(m@_w&utdRZ`g%Fu&hy2jxQzu`7|~dXe5uoA6Y3c11>Tx7c>>;YF888U+CrK zv1W$E3PJ55BY|vjvhs6Js1)>~_!%$MkE*xE?hRdJHyUP2`=;;9V#OlE0i=kTL%2fr z$&9}XN>AWIq!5!>L!;!btl+xHp{c1;zBnm#_(W`vAJRTh4la1?=wB7wa7Y;58BZV*zWg{`C?_$Ql)v$;dqmfr?Rp?bh2oYK?wK3?E|nC z_tF%EDt(P8sM8gkNrz5I3wX@W#Gb_$b&#*MaC$rQ~wXO{u} zecwzzp8P~fGz5PTqXd8WWx$n7uSZ9~Dvcz%&K`4hYuU5O|INhYvt4(B_UOE<%2(Fmuf#%#-OT#%E$ zxw-61zPnUZA{RVL-oJh8$=mYr^#lDG1=2+^JT$GD;T2{1Ea6EZ1kme?##nO~s|Y;F zdN}8yp#^K;qbR(7KRXo_miwU1r--ap_drPBVE$!grNIv%kFMn)ozS4vF*MSrMQdl5 zLGUTuT=^jyFca_z;bzA}41~RwB@X|<79!a#ygh2DLbNlK`%FQY`d1M|Op`7$6`>~*wtB2J=Lx1)Ah za;rPYYFs|wzI~fPXG*%_E<8#yy~lx?)g|>ZC9Ef)$oEG>ul&L8+y>ZG&HdEBnK%FH z=xYz1hH`9oC}X92c20e^3i%&pl-@_!PagLlKot&KiOtyxd z{)TiL=OBKyI=eEF9??cMFZ_vIB=+W1IqN`N%htItwAajJ620J2at(-{^mFhzhR#v?;(pu;EQeA`&_j- z0I^R$Y@yU+wFbw&61;i&Ulra$`}md#via2H)h*zH=U=K7;Y#)GYCwVz%;fOX0=ensqy;2fdr z<{fEEUxcKlzqX~2uQ>pcGzeQ|YuBR?1MteHmAUrzZW$N|>gf%mAFlrH9fccqAjYos zzC-&casamC2L;zs=5+P|-_CWHDo7+HIoR9aE%SBWt8dNLPW9Ds>{%_U1yRr5*QYWq zmM%e0-~Nh*>tr?>8Z(O00aQg>-t83;M`&vejv7o%@~v7mfI?gB-62OwzS!w!#mTSp zZDdoSm-=)h#k}xig{({s;(5WB+d${QE85DYmY0`<+%-E|^aOT~5V^qfysE)%c5cpV zxE?gyU0?OM&4=TT51nVsPznzdKEX zyYBBc`Wh!+kQk_@DY+XtnTBBN&bv{UTwnkXd?tRZqD{G|Nq|qp@|1%D9;BuMO25DTI|`g0_bG{Q%@Azcqt1!+WQ&U3ldHV zt{8`Gq)vW-hZGgdESUrIl0Ffl<69SylB1Q*DNPNu@I4q~PDETrZGn832%&`S-oN1j zjs~P;=SEp%dZ9SRkNF+`D4sf$T^RGgzxocPHPSNa`ZcYR(pS_+BD$;sx0J=0$$21}~sBqSKA z#z_((VAEiYYqoXkM5wDc7yM4Q=RZX?oBc6oFEWriG_c@~$eD_*=`}e|mMc3{PHx%{ z3zcmp3Pq)lnwplc(d~CvrF>uM$-z!3i)qrI8GeNfMC^l{XjJ`;^PBe_J9ft-Mug?V zl^>~)ezI|9R5X7IU%gi~qjX`N2bwZ=dTmqmSWmq|OQ$K043^d|0GV zKiLaf5E6CIfBGG9JZ`m4ZNc50b~SKXz>dSGhcHQ)N&>J5lVG3VQ=mFi9f)fIXY&5W z!SR1z0!?SVPAUU{)X?lgQVJUu4G> zGrPd{o{h34Q0}~kk1YZKX*d1$En+=t%wIo$V(soCX=FO}h74Z-f!-bBTgx`iB5KkY z>`K=8DdrwlUrBde*da4f*H^4M%eSH4$uiC0Ib*d^!3`(ut;TCK);K1^KL>v?&`j%O?^vT=s!QMeyL zx7lg-RoGz3Kkl#oOwCm(oysicr&uh1HEz2DYk^Z!RTle+HANoL;`@+lZ{^}6i8|-A)(8{ zbaH$gZ2r_puD^fc-P@Y|gBF&OJ0F~|MakpHzFM+?eMd>3Y$^+l7BS!_JvHtw#WmsA zm+T-P7{o*WW0`DYVJ0E=J;_`ZZe^*a-3w^4&IxYqj)qnq09MbPT zrKo6UV@SqvJXpZ53UWK7d6shQy2B83A-3h`qH}F2 zVwqo0QW&`zqLoxtd%SL#;zrd8dYicO5B%}}V9kifbf+TfXsg_&E~%>nA(*>=A6`yJ z5xf2wcE}c~Y}m5J;}nykx_8@k+f85JA3J)~x5lfu@A~IdS;}_$_oaOjfB&wCSa0(B zs8QR+^#`np4=;Il;-W6N2Ge|)P(K_T)KOOMc6mEG+NdX6cOunRHA7xmxdMqi>iNo_ zZ@~+~&fCMth>igCfEZ6|l9-vDZ3m&*LToOvE!i9)3`|Z^S9j=o0WhS=nie}yyS0!Y z6EzVt)YlPBG-T;kuXpj)5~0aKD)`;&8MmdD}*2*0TDwkHq>UZLzd3E@8}V8Dem=>K`TV6= zZ~c7VVNFH~E9*PE=oM=UroY++L^FltR~aU~5ao&i_on~nOD}5ctvR~5kl#ZS2KWle zuGc`)UqzlrfQ`{bv;pxOC@9?c@kmhA!Q>KAyd!60=Euz<$*q9Ipq>5%t45##SV@~w zhtD8R5MoC{|Dpu23lo8epN2m8ssh7POdl!>EOSY0y@eE2*Fv8Y82BEQNNp;xEdhRh zW;gckl@}Sr&l*4Qdxb*Hf#>*o!8l<4WS1GhECu`fTAHSJj&6B<|M9}d9mUpZtCE~< zh^ah%^IYL+Q|zT>{LeP{iHTAKw@S`_NiBj|Y*WU1EEuPE-}M0s3tL`sszkz=Cj3%L zjNrmEblAkS(3+Wf`jKqtn-3pcs6K^21Ow}I2NTd71{R}sZR+i9dOxD3ejsmyuzW3b zsZMBsSkvOpZjV$9xxr8(MAvOtLkztzlxB?0lBp zvj-~44l^qfj)y&! zx;%UD*s6|%jT`)AgJ+)q`6>7Jck&C*(xM%nksIfNpl!=p+|?`@&kzxr`7bl!_JEUjF9&|!8nw;PL$SV~m_rx6qXN2%?DFZJ=M z&egr8m+)eSD#C(4{R950BdnqCS_2~^>sa$V8{;#tr_XQvPE*i4F~op@ zLO;H%A=cq+bpDX(;)ywea z!o}Zl&k1-5jxyeFInybWuW(g>B~8a=1bk9EFnP&En4i6zW@IZzH$Q54qseSQ~_unpP)c47Jzv{HolNPr~=e*HqL#;ORv zdpgu~tK``J&M2qlhO|GwhEinQv}SE&`%sjV(|cZMy_o(EjEPdZ>+bXG;mA7(z$*J3 zFJdZ2ff+Yi1L|*`1QZ=V2LFT0VKo4tFMaFTQ#^|T7pXx9FFaCw7hTUbjqZ7P8ahso z!K+#)AaV2_)^XuMHx6>!PVIf2oNp&dDBxh(JUnqJo+#uS+$yw5>j~M^>(_KL(sdd< z)lk&rm>l}>05$1dsH6bCpcmOT8M2MG5aei!sPh&8qqE8uarfr`y_P)%@f zKc28N$~F{XKm{i&ADW2D%Ufb7%kA5xyC38f{stV4xp4`ZnL^D0lMeBWfdnq%8&1+W z28v2Y8}m$JiSy8*LeB=IZvfcGcwi{5WK=YV{j$I>F60`NRcsfr|GA`fk=5-YDI3{D zQpadpgQBoHA&p*lWI0Oz>C_ch>#~B7kWTJMXXEAMV=|<=CZx(W1eTJ2istk7mX?r@ z7V^SS-wQXx*}}5?#j;3$puIXecTvqEKp)Nq_6J=K=wp18$&HEAP;ldV^H6pClrRJN zuR0YhhZEobAk{u7{lrx%KRv6fk2WBJ)IWIbykV!KsR?={96UM!>N%@fkG~A`CSDpp zf03cttwlX2%X1E3a^)@g#FFh-A}uB1v2f0#W0Z9~N_U7AwHlIz94m1AvXtzHsEr7VJ?iw=AZqWxYx!?F zhDE(_7QBPXEA7{o4c^a5!+F)kgw03kL$>5^7lIKgSL}yLQ2L_2Jq(slFzmoD^2Ew$k z2PiV=u{`Cn(%E-G+OS+MwrQ(1hsLtVmT{h)1`w}5z6Bua3IohYs~bo0i4=tNR1;yr zV6#Bs$F*|+^cn(O5Z_^{I*X^}6L#^VCi{9wUP{2p;K)HIqL>bWvy-qZCEhwF=-=)sY{+}Y#IqOcBvWo zM44L*0dwktY(t({@i4<>&Fg`S@9`I(NFV@3Hno)jT3mNmZB0`yx)gC&NhZHbRqu$% zvMV9)6idnV+vwyw4Xj$`vqe}Mu}8@0(c@yhc_s>b4nIRmX^FbXdZVMS+NGVS-6=PJ zsp%r8QDDP-{l~M5=p^*}fo)YI7{^3oH(-)y@Ooa_`uz7eUTydBueLzpurnxMrqA>i z?Z{`6+_rhD)70WH+w$cbQRJRE(>%Rv`vu@@KIYEQ2b@Sa5*X+O3(Ztn+x|fqy#nvR zr`&&cMUJhu^snTjwOKF?7H-HQu@Q;!%LGkWpo7MurvwLvkzHd~d<9 zW6)Pi`gk6v+Z#$+Uos%Dm9J*apIIryJz#PbJs-3hnFY zNg@4dLOzRG{N0fSjtP!aU$8*|R)d%f3=ZzB<#@#k-r>1S#uY=OmP`+zy><_rOZi$b zkgH-YL+M-m;Uh8eVhv=q678IdNGVs-+}uIQ6di=;My%j0P}D zs$C05*p)N{Nlc&_dH>$a&+l??RhdtbofGowWMi>+dkn?7Y=Nu-{Ts;HRniArlreM% zRR8fra~6TbKyh6AO8m!^}cJAT@qQ@D_6x( z=qvWn>wPD z>{}Ko@;2xWbZ{koUV}fEpqcLa*h>-`ycz&5(|gGnkB~A`KW~Nm#L)~zQ*!|7N1FrS z-tPksr?V73z8V}neZ`?y+R3dc<@5s#7CBQ`%3T#F&mz)g&yup~%nes15eV79p6GQ1MSue#8XH5mw*09lWQk9lt~sp4 zY|3O-ZYeq{C>q?Sc&YGH=ku=!@X4rUOy^r==$ZvgwLMP5ksI#Fsvc=(7=7-Mode8yj8N7oHgPKYZ=XBJV&PYj+^?tjz`BCIISygVcn@L zry7(&ZGk_6mf!ZeO{>d&+$1D0j15Jy)eW0J0jJP_P8}X_xMPcmRGhq%2n)cWqt2Yc zWRTEf#~wE~Z!tCoLg9;)E$!|dk}~?b9-@4}s<@|2w{2U&LjJh%)*gBV?r3wx#!c)xw}B=pQ%6 zb3}hWP%0!e6mp?0Vi){{n}c6#%zyiKKuDn*SK6vTa7)ljlzg-`yAPnS>Cq#X`{4s_ z%J>)Re#1lcmi#mf0h2!&A(z^QTp80e#{br%JDuNKE+6QA}(ieM-iT=%ZR?e{|i{>BEcXPzj$CfPoeIIgdA zafJ{DfeWKPyXKmQa}DY1TylC(9G7=TZsS>dnQwJ+>lX}mfw-=DXc6Bb2)MPj_DdJ3 z!IfHuoSiuv<@jP_j~SDRHO^+>&xiN+JY=$~J3q{-CborbhvTXXI)URX%>i{QlG00i z^u>-s^f1qUc)q+8WniY9!=L+mQ3gRH75FmcEuKl~OBA)S)7osE!Nz4ai>Fo^wMF6c zIsX|}^And~Y2@D>-oUnj!jvo9jg(EdRu@k;eZ}bQ0D3R={y zy*EpZ10qFW#(k|I%n)RuINPIc?%0aw6@7|?e2YS}^ST%s5`qB9E~Eh%I*Vgm z^APS{j8py&23lP(Zeq)Sr|1U~BqqQ9_F#zvc;(uTr(9|d5f`}l0dEaqW;b2`6`E|} zxZ&aV zPBpjfE-vcD|zag~@0|L_d_)*fI`_@S9@V?+=e|)+-b7>hm)ZhpP&k@P= zc8E7?P`RVC+OE)=x0R7+ISD?MHwC+TfKKX{g?aQi2q1b-)@RK3i4c(y+j&{&*@uzR z;PVi>!z2FwQSn=&;X?{8=8`S}T^e2^AG|kWE36*7=0SRbK!opl`HKVY?z6g=FI{32 zfwKj!1h@0H1X^;$Sm?Z?`uG_lmLGRuvM6-HU2Sn^8BmLKA$2b`NQRO=S!BF`JOao~ z985bq+77}`1kVE{&(q?aQk4$B+a5ZOwt2rO%b>4A$+`$S7#O8{t1NC!OuhY%)O*`S zlIbgLn-(YJP*)_b=+Nee>q~ zd%5$1>gRlAtXM=nQk-sR2(ZiNsxt5LX^D;Vu56Iw^R65@w>s(4r8bT|sg92dd*9u3 z@-^Gd-MSS68PS*yUVM)0V4}SseC9EU4mS**FFMm^QpgC+T6iHZ|-9IS=k& z%Cqu>j?941Vw>ZQ+tY5qymFh)c0jDL6aLAeS6y#AefW5w~dn4i%Y);X9Z6~*-$5`HT=^B_= zXxH6(>9N+ho#@V_Vq1?mw<+S*vcMlE@Bih`fK~sHL-2ZzhaR>8CJEjW({zz-K$iXs z{4weFGB$R2W*B+krS^!WR64Ws|45}(Rg=hmxm|UE61W|*DsFsPlK1h!TaFawNebllzkW^iIAP+ozrQjeC1q@EP-1dfPujlhCzy1LDUEFHY&Zyz zv@>=yW~PHt?|ToZ8x%Q2dvMr9Fl>JGC?#kEtIQEp+%PP1&s^RT$ZKci>e#HC!AS_! zw}p)rCg&%wlNuG?C9I`#V8*k{Oe^|Sng=>XH2mXT zuF7*SbjJimCc9BZdsVpi7RdB!G8Uy>i<4bPwJAvZ(sZv9ecsDPkU)boahEuD?=P+` z2=s*^a4&3Z5yyZWC zX_6}ixGcQ#;g*k3j^&ra0;;HxmhxJCQ<{hHoA@Qpw@l{=E^A46?CWA?D(*3fR~H(^ z?ORaeo61)my~*r0<=z~l8DlNBv&A@AEXGAFkTbyA>Vx!TQ+>aq56>!-PBFfqcLmy= z5$%Z{{tH=7SNKvQUt0O52(1@Z6)_R)*?u)rF|5IrO@=V!6yCbH|JG>e@NaEr$z-!O zi;1iD;l5J6ZJKXRZVCo`ICQEti<|Q7D6cJ!QE%shW)Z^91!GW%*!@&Wae+(#*`PJ(Jj~|*6&$`!^ zbB|B%k!s=j)zX#ertXVYbSYY`nk$)UEvq~_RqX~u)J<0xl+u-tH?gS@_bipF_}^XO zcVSpl-)Y!vR>vNC+D+=MvG%Ft24d4`S$ZyavGv>;M9x^K-U&XF$F3FWEL;-hDQwo2 zW~Jk)^)a_L^k-U1*12|OXeuTr3l=hE8|KJt5MZ~Cd*-hE*~`_3$Gf-2I@_kGH=tOU z!Bb7pQ0}a%2?2L6<5gk;04lV1brc2?fIw?xoa!yDG9uUyZ;&7BVh-8PV-MR&-w=M2 zhvgn9p6n!m7$DR6^3j#@|4Z+_$cjIXsszO25$#u~X!`dy;qpQf0GQWta{y>Mcs-G= zbjYdPL(_VeL_iH5nN?gQApx^g#@r1e%#B2)gRcJwE$b!5(M=(Y6Cua;e)Y=IiyLtx zXMLb_H5oYWEgzzTL1SSKb1bVeg=!KXb#2NhniO)(c0 z#)eQ~@4oFXitI*2gqEci26&a}l;|Myc?1g5924j;3UE1Yxp^5C$*|M5_weU=>$yT5(E36K!1NXR&fjsAK1>+9MIXh7=H1|o3SjZaWeHoYD4q{NSo+DG08{d2CwgQ~lx^#1D- zh$WKN{wT>t*0-mCl}dIhbs9*Gup}~lnR%^W6pSRie{c1>-p|8f0@^$=F-h01`IZlD z_^rO{-m%mszuK4$yu3U;wbn;;YDT0kzR%2Q4~!kiTHYCWZ>ZC)nKf%jJpH2hUc*u~ z*?pX2fjxzVc^*4l8ALsx2{_85&FGY8yH~C~u+r+us=(iDE}RUTt{Pq_ZYhp*E$3%2 z%u7ETxA$<2u|fm_Y>-#Bjg&_;_FVx#1?sAi9fNjVy0$tV6g5M;_=rkk^p5yC`lr zvq%2<-mR7S^7%DA+c=}Dl6Ib}jSblfI2i>s32kFLW53>rTtu(WxJOYQ^1_L^ci6DI zt1mY#5xNxMl25M}fa5YRRMpT}0OLpKF^n5%VrB~IFyp%pY=!$>o@dvi>kfZzSL(0h z-W{$|1l7>M^OMH~<0cpX&MX3>55tuA_Q05I@uf?rB2;*m~Yfr%Pwl{xHZP)Y_Y3G&Vyyq=7mY7;_@kh z0RgatMT=3bA^);#RX3g(DQSooVja#2?{hL5_5m}~-d<7=wnKJFL?^=65+HmaC%*sY z!JP!I9}hof;@F5tH{eg74b#s&)c~niim(Wui4$s=zo<-RxtSZof_DUc$8p1I0gSdJ z747Fz#DW;~6E`fVSA`Fq-*o-dmn^lf{<0^dn-$z8_v@L&Ysvb?H0@1pwYhjtDvF0m zV@;E5rqo}@&gu1C>}o44GnmUUyy^+BgF%y#e0^4U%cvY*j_9IN&WL2TX-r zBr5$^ney=PFwvi*#X)1Hv5GLhMWI`(fVR-@m{!X)`*h3OZc4J$SOfhIn`e)WUaKoY zl>Ri&1c|)*x3pyc@0^X&5sTF3_L-X0Z>bq)RDbA)WS#zb*{5d{ngfs^BJ-=OAAkS8 z&9#D2e81QQPoRRxh}hZKWQV-L`a9nb*K(e`NisTte3BE7REcU2j%)IjD;0>zmUAdw z#Fs<~qu4HKgJa}}g$Cm{Mq&`*L`wt<#!MA@BVMW z0?ObIb;=1|FUqnl%B+lrttMAre!Iv45PS8~XNp|j?D%QUnd`U@Wc42*ok#Y z!aVF|i-*2rG9KBG51>g6FcCbD;EGnEy@^F7e~*_Diww`wJ2z_d#sJ@pja`;$FGF{S zQc2tBW*+=70AK>o4?Kq<#>Z{T`FrezbfA1$3H6S6N8_Eada;9$i4)XEve0dNgc_V_+K#Cao zI~vtQ_u%pw3IWFu^vSjWBzO)&RK3drLJLmoCrgsYC=ZclqbiK*$`42-N_=NT z_2vmb=)OwaY3m0Uigro`O`i^(pMATsvC(eQ`$xtN@()BrMgWB@-apCgz!*eNWHH^3 z;1o45h-Tx3N&)ce0JMZJv{vJ-& z#Q1Qe2+3j-#$xi$r=u9~AAlTy9eHo-Lw^9661Vq@>92&QgjBeq8(%JAMYoJ9O+Zb5 z2@D&cP=`YSKo-`wj+UNO%bsxv)RTj*vwK{jk=-!7y}^6D|>w zXs}|%`kk_^!L73JVlRyd3ElHMM1VaBY!?6R^+3K?qo5EPrKjp~-sc|S5GM{tC=lIv zekjg>K_!1&Wdf~7$95=CHMq$sh!U^TtG1TEkV`fHsgf3m^7~e}1%iP1YoDFSon@Js z&p_}*e59=O=c0D_3Fk~<&WQ!FSA|cWroZSmzaItnd*snF4%^^@jL9K+b|n-V>-RMR z99HeD%NXUEf@bIEovYl?uWbUd-IFt;Kmsrgz^X^W8Y0f1gU1Ed;IH z0NN~c0=kE~IXDPp3XIIaD?%k$p26_v<;CAc#BpW8I243`FpKf;@z-qqY$0?H3m5Yr*!~C?+gy%WIg$P+CAxq% zV~Ib1cHDx^hA3An3g_h49GC%hAH4{Rn*%1O>uBsF>?6xdjf>*5(U*w~*mZP=a5D*{ z$PVa{ZR_J(O~`L_5)+O4+X5{BfW;;xFn6ya{OPD$MZQ6(Ud3-{7&1%f93@5hNOOK@ z{{lw>t=d3cH^Xh>COscSYIv7wl3UrTQ+V* zfayX2P`B4a-6yo^*9g6u@3~d$-IV=-DF4t#{CtFtxtmT31UrKUMKV{(pKQ|}fEERU zl4XHrI8eZ2mXj#lT(d@Ei9_Wmz|eu|1={fuzgz%XX^xv=J<;g;j1}GPbh8Vai>&%9D8wFc<$MqRk{Qb;9TaGlp#~lM3vK^wX{{l;ffj4=!-IN88FVa(|LJz-r zK<}YMUzcnEI{ir|8%jhtj}jAYduH8)HK~X!4$4}1aV!JcO&AQREG&$hDT7p%Yu~Ky z;mP5s@Vu;9X>`s6n7sL&W%%rpWVxEO0#wyANK2!EV$;(ozEmCBCbvhwW-|3b>dXKp zq?}(xA5Ay?yrH%AAef6#Ez)um`UEf448o03nazP>d1~9?%Ovv;5IOqDuBgPl$*<+N zVBxElcHi2nt&X9;7JP{#)H#|cVF19P<1%U!KB8Gvga`=G44~tdiobd5*2#&w&dd7b zEc0wDW@0xbIYQll6RGn}^b8}w7}e$F?W^lrvlMyXSrUp@4!|t(e|A7T zjpKh|DVndq!;~m-U%cT`r~2#cjbmE$(y48D&FV(7D?6fin_h&~nT||SH3CR`;soCf zyFsiJUWlNvxJmeP3YY@HQ zn~<>OIXT$7m=M+~)AP6EJkK{TOU?tkc#*~J?RL|`{yV%79iXOb|0566+zw=klw7t7 zp%C^jXU=3cBPRlC96Q-Yo@%2u0rOxZmevyJ{v1#Hv$vZLSaUv7;%}+(d>VNiv!nPH zz`*GqKew-0+1>Q@(3xlC00NNW1eLCTg(l_3m7ePyzmL&$&m@y4Icn+5l_0nc@(Hpt z)w_uB(~o$Fq^G6T!VQ;LE;Rb;Xl1z8`OW7ARK(I3Fsexf{UIke2=%k5F`qUFvb{M* zi?>%Sk*n!fvvJm%xLNSiX3_WBT5j%r8G~tfT$F!rfRxuE73JIwyV&%IA+22WdO&JK zUjZ6FZZo~xm$!=tW;(~b+7|Vx4?6GNx>ryt(`bCtRH9exbY5l0dED%wW-=AfS4Yw&MJp1+IO!K|V^L0}v zI`2(Q)^|Z1CI;;QIUwc*3#QM4|TC{^Jm?zzo-Vyut}K<=(kbUyWtwgS)=QIaB>lI zDqRmxhGy~d$o_iW)oHprM&C z5Nk*jJ$tSZIRoyaiNcNF|I3e}DqoAnH=+!WKdU;nJG1G49_OmS-y`tjj`x;PSYyAtB+>5Xng7QheySB9u^{&wyfiK{H(1r_Z?6 zZYFW&aZRM8qQC3fHPh@d`4GL+Q}cwgvonD@1vAl%-ra87bOs5M_nrVPMqo<_sRY%8 z$~Y@}^W06Sg2XO#`%03#J~8lVAs0T^s6qVlB=HG8Gl*VC7R>xXSa`{`FN$BdVxr0cvcAG<+xrRq4 zhrvOS1K!>kNf!oHE%EB^!+wD+33N1I#;Hdk=J*aV0X@O&L#d(;R8&{XneAS>vyIxe zY$7=~@IzyxqqBi+=8yRZ|J5U!o$!~0TygI-wYvXfzls_XBvb)yzlJLIZ1VAuC(bhp zQ`WZhcs$7YZ7Z4oz=DitqU8n~5rgb4OikV1WT@&Ga10TaTerfaFQH0L6AtQ$X{X!M zf&E;8RD1S1G83}Jn#xxpe4FCa48C_jUWZ&PPHUAVYRb;F&0NN9`4FQkfuSCOb-&?} zLcFYvu2HwjG6+z?=_&Z#C}EKXx|yDqZXo2gMsQl)^-j>it!o&_WitI^xalH3Rq*`e z)@ZKyv5=e@cF$PJ78974U%i?ae>ZPtf>@O& zn3tdb8zfxxke#blEWdpUef3tMYnCzq7MT@fl(!!V%_&T`v2v98(n4A~peqThN@Qhq zUt1Y@ijuOjMFC<31^#%yh`nyS@Z(0XaC*oLS`=$rP6o)(Xp%|r@Q_JAY+x@EGuA`k zJ5*FuzzUK0^oj8QsRln+;4n=}n9T$c6gUFPLqdN<6e2de$-p=N7Dbn=8eOl{r=)(= zDqHCvH${OqtRf(l__<)>x<=783g$MDF@2YSbDPq;=gu7Cl-CUy4E1E9k<62fOc}`w zus#yo?&`8G`m;;~CI(a*lg6{hBd`#l z3LZi&f%o5NjA${=>yRKky@7j5r;>>-d`Q(GM}P5pWem zf%z8*P6VTHR}o2roUBuWaNVIhT@N)sr+; zXu#7&udJbQ|Ky?`^~4_{#WIomfVLJ2X;2*$8gn<}bGRnEK{&1cDr9L%f1V??k|u2y zjxv^s^xKmf8Qik{i?-z-?7a%{%t~39K~o5En#~BGKNCv!=Y4%Q>h^P!|MZz3xgTV$ zacl!b(m|B6?b`MEyUM2_Lu6S|CXC=ip=DzsPEl)V$NYuAL74T-Xl!XGyq6-0M*tRu`AY>q;q@1^L!_qQP5zs=UQ ztxZukp@%iF(FJWt<5OerZE+Mly}hd&lT2tHGyxI1vyX62J^Lt2i~Qo>n@<#$-lQWQ zVbTNim~Y?uYiQgKULG2{7*~SPn4MshiCq0|uKwi&1pH<1{%e)Pf_7(dS}R7Uq#9Lm z!}xgF9J-o_`d^Al$!{7N4b%(|f%cS0p4MYxqyF&^2zUoVM4{$>84P7~vPd zHs$9>eH7LjWs?YF#>D8OoV^kj>f4WB-(5bvhz3lLH0*^PtBbPEqjna6$usPECgzH$ z#$pHM)8RrUAtgnx8Ok;DUga_;>Xw9&#-EeK z$&-so{O2h-bW+M7a!zwMEu}usq{%(zA%{Iy=)ytug}Ez(+d)?PQ|Xc|m|6wwgMoNS z%+Q^Qpo84D%1&@8*Rft)S{>(5899Z1JHo)uj?dgaao-Oa_h8FlCEsZrmHd>7l(cXoiDGSK1_-ic!6Wx@A2=A#_;{D1Jdm zd)?`XO5E@oqNMkCAmX%MyZt#z=>eRW9ha)Cvnn^ey#N~yc<&N-j%?boGB5ur8V`Ma zKmPvx8|V}_@q}=ut&sLQn|=ttJiKee6+_MAKZ61T(^qIE{6`BghgXODM^q!YMRe~L z+gw-9-2l%XFr4U~g8X2g1Uk^rHh@F=w!bnTW7Uj}zHPwytY7{1q`Z;oDmX+tBxD8l zG4iAU)6h`ya14+YVI>#4s4~%IF5{1Cl&6L)M|;1oq;n!tun=8rC1P6%noe z4S7MOM8uWY>=#YXSL-!9aYBy>3nOq$2@LB9$=ufX zT%Lr?qPlt>O2DW+G$SL)MkTW@gJ^cJu zP;Yo{``_Q(uq7xmy{NS^C3W-&>xYj!T+UyU#@%7KdpBvpCn2QAFc%>Lzw%mmIMxbU z35vmq3kQDB#6#32^z^5oqYHxsacb)F#;~;1%Q{ElHLAgbxnYN)EQ7#yaWCT{ORDspm&Yit44+fu- z_%x1vW$i(RZypH=2{zGWqxg`R7;glq$h7e+-(@abLPw$et!OC6MM-fK6Hf*)_5PqzX3Y&Vt+f1 zZ=x)zjL9?A@{pK5Sv?*~sN@9(T;;|Py+t~$qazgmTkcPsA42|R^J1%~0S*j`x^!qd za9}V=ckkZDHplT`JTDAAL(l_p7fpI2f!4r-KYiv5gdZ=0?~?Cxoy^AaOzXD9Z%x~` z(Yr0f>d=q@fdA#}?696Aa=E(&zb_+@10L+2@;Um?tB<0!9YCe=-6sWHajMzrb=*(i*uR5902dql}zI4o?XBu#l>V`^#Pkgih;jVc;zWPgo4uQ$wx_)mct5OnS zHgemu$8cYt>5YKHhX>KN1*>;#?4}8vIXLuk+9mFT@&W9Ncyg;|{4cb|Hhl$aP^?Qw zq9UQaOF6k2xFi=vd&P8u&mhTo&PI{Bi@u_gLVfE=RABt={5(Ces+;>PL(hmt)fKz9UU3(-$Dj<*m;4W%Eb3+hWdrVU(~p9vX#pIjw8x!4pJHzey%Cx$ z*LfH2B9rI1TrK38>C()BK7|yyLZl-iMa9J#Sy@?`nahad6rusA7fRLZ(M;S%!-^1t zmP||H-yJ7=MaL!DB3y8%-nelgyF)^ph7r=pvLy=tP<2Oi;h8P?J;~+YRTe?U!LNK| zPP>Sq8j=zcsdZ);&|PAeG}*Cob;rCe#uHkoW~(vXp-e@%2-?R$yWe*NCWScPe&pr- zqYLs5Uh@KLnJ_ojmI&va`5rR18^I&SGgNo=2hWOS!=_`-)(<|rxGXIB^~N;1K=05mBx z?cL!D21SZVuE%ZiOBi|akYAn)ILfiVzw3-dr!VZwu!=IU+H`9DhAn}r={X#*#nUj1 zKRPK&Q6z}C67i^%Gh?^!9HK)`&U{luQ?wvzu8|(!X7813c(Qk9!&601_8fCJGSbLM zI>MhqM4cMbWE*EdB~cvnN)kDmva0I!nC#?Ror6d81cZd>p?5EzhU;z1U>up)uucU1 zAd$+5EZ*%;0xIS6%?<*GFpO7Hh*~DXT$YQS1pL0_hTVfYCUyZ%PR`kOr3cTBY+?!J zM!)IO;~D=*5-SCd0O#|XyQ{7uj>NAY`=ObedvmCbO?vq_6lWBJwWH zNG~X1ywdJm=NnG94lN%+hmm^a;koCb)1A!kZ@~!e#g@a^=tN>xRyewxqZ@G*5!oTG z%g^#LiW`Z*mlTal1dXqosgZIC8-v^-^W*~|3^1wJCkF0qw8 z738)x#B4&K?YwM`fC|zK^qN^S+gpO>INTWi>aO_D$Cs1#mJlsC&l-rf0=HGOL7HV7 zySB`Q2fUNCu*g+Q44WHgB`UN6_$h4TvNPbxFiizCd1=||IbBQu{tOKdOhm6Ze@%rd z5E;^U)MP34S6&V}%D^0oW64eF4e5H=>a5+K{Q5f*+v~?KM{)LW zevV3H@`DD9?c^$;i-qOoD`=}mB5veu6%`!`t)J)kD`fOTpUQkJa_lyAop*r zs-wKI5v2RwKQyGVV~24D9yizl{?sx19m>i)u14IOHoZ8yjF%D84!3*;Aw@+)%O!Ys z6|`ZavnL=hfkqQyW_obeZm3ZrkiRh-6dkRPu}VD%!^s~Hgx_ID&c!Z1gO(@suki2-#cRiVI&h!~qB#VZ{RWX|w37AuwIPrZylHdi(+-#< zI+mm$hN(7OsW4qoLo8fUFD9nIla*lp0U;g6MUeOJ-d(%Rt_kBbTan!eR2a%Bps-{C zkBbpQgJQ9*c+GLhWP;8X26@OXV>U0s;=x)%mc+R?PYzk4hFvp^%Xp+7)g|1ZerQ^5 zLiTl*k+k%V1AHo&Z^6h_aZwT0AtJCaSB$xGINJ&nfcRD+)@aOH{PO-S^jzQpk1rn2 zo?Z@A9_B|Kct1vMjVP0_S8m7tYdC?sHmxwv1YWk#v>4TKKz2c z{1siJOjg6m;3hQM2q(|ZK6nn-q(P>lq~sw9SQ9(rQD80m{vJdnfRY>Wc}PL>-Q|(r z^J3ZyB)z}?A8?d$6<(;SkR!IdysQNr0_V?VBpm83K-W$Kg97TVZ{WQROiUs}Le`bO zNZdwNEbzJL_=D{2Pt((v7h1OfSz~Y;ZDO-I?(JQQC^s0}2gksP6cIJ#TqP)Z%-Q7Y z!D#P=`#b1E27B=K@O{vj0|At%I$>*jAFkm?JqUoYaT%|2Q6ZiY zk<0%qvsF489vq#HG%hq-TbLcQVnW@CRejUoxn(z0l-#0~Hi&9g* zyy6qQn**ih6dX_qrHFQaU&*;+yXm^@UI^&Fv=3yMAnMR!PyaeIB*e864rUt|{1-@C zeD9L2->+RrK?mt4#@-4J#P@DjXJ<)K5kP-^*rnEQio0ZO+BJ>qqmjgoX$vr+v9Lk1 zqy87dIN~miwK<sa4)ET9UdlxkmM9Du!{EsyJ>vG37mCX5l;`1K37#K zs23bszP`TdUGO!A&Bm^PRm*|tnHd%#aq;WB?(8^wJ1A(6zWz%vrA))1408NHV+k~4 zKqPUOm$x^)-h6|4A=qCa=ld$EDqk@4*3P$GzG@4IDJvRC9}tS{8L6Zw<$Fsja>`M^ zU4O6$vuR$feu%1Vg#SkeCTRK)=1S}!*3Pa!`=*FaeXX*x{!8&d2Fqve?*NHT{|X!u znjO`bm6MY40JwAhyo{982t_sl90Ms%Id|@ELIOs4WC+M^O@=}jf-jvvuNWv-yJBF; zDGo%g$H^_&xYtGbh8Pq_K+Fbk7I9Rnb&6{TOjYjgKuqx5m#U@K>)$i zm&lL*mS*t5C%tA59cN3l)7aOqU*WblK5o>{Cj798oMrr2dH-D+1=FJ_Bw-|*Kei|@ z?0PS(hyS%J#$yl}$DIJvCJd$S_;FaZ=MYTr*KK4&7Z|_ozG%-OQHYCml>-ew&dl(m z2j$~4n`rw45(kb{Xt8H;bAvDwKXx}~WI5^Hy|tR~AhN^}$dWpioYm(Yf3T(LNZc@ARu90U#~!@)L$X3HG4ZrCeE2gO62wkWcB#+77*gsdUVh0iBSJi5B0zo9UN zrKUShEtvIUOfds4c$o5nyaqgT&fEg5L&I{+zyc0{WE>Yp1*zOu5 zOqttos*w;&)n)(*V`(6_m&dXWwcy^)s&D+clT)vD!12pdTjkjUOBW+t6eFA!h^Yl>&ug5KfI%(s#Y zeeXiGDTH=Fs`cz!kBb*WZpG0c+k~dh;#+s>;Vlk!f25eXd2gX|Bhuu-5HWfeKU3EJSa$dEEZd!25*O?xb81eEx8;+$8AIknn5Y5P z0AdWJoz_DeTU%-jl|FvFB@isM)a*wbwU|)><+*cxpK~?LIMOh9{u`$@d# zy=}W+TX9X%5?2rj$!dKB{5%k2E6`1+JzUP3nvua6SfUj9Dvku0be9eWS(>%Y9#l|L zDk&^HwEm;72C7VeWzy0&d*{D>!^VRmxd&O{W_K?d4IMpl1pa0!;^GG^TkaO^IY+s# zv-5)lUeOBtD0PqOM&o87?==h-v#wdgE$1UFU8j4gJQk+^{QTtYc*Hbt2i zT@F|^;+iP_-ALfL}e=&UVIS0RN)D&c#@Qpj#Usy`7LsP*nmgzQd;e8g>r6Pi_Q@px(!n zYcUdPl$G;;c-J_>5Pow)J0f80I*%SF>Hx-(Q-GtR#dw*)g?kttaGzYj zjZauRs?(xq(zv`*o}G;5c>^;y$RS^6PDiG>tWwkjhbmoDfU2Ord*v3& zp)HTGvdcJgu)K(ZIJyz6b_Nd*A$AmejzFZtOG||%q@;ia-LjPZ08iq5B1tftN0$PR zW$EC{lm*gU!@}YcB-r?ZJ@^I%`xaE(PtU&HA$(mG9UmUe;Kja0))}^&;o)35{~svq zbSNfFsOk`B*=jsLgh^) z$SKOku|9J9Kj=2JHucONxAuu(1o<~$b4Y6dK<-2(13z2OdCbWu z{W4bvv~YM5=F+*F+28>du|VC8wg$bd%`%e!L9D-@+t(M>UJld8 zbVT+hC_0Wn`-lq6>|Us$6zTPBDJ!_^qN1*rX(7}EH-du?iN>JdRNJ`|91}|5=S@uq zGT?mdi6-Y_g~vJkCEY-hpQ{5b)ag^FxVgB{N8|?ZSzJm*eMY)WqsAiRLV${{{+h`L zqi8g>ji$i=w>Kmi@!PC|u*Ptzpb$4R4*>1|1vTn)udZ;(DUcIBcU^IfLA=W8EfTGb zojwm|B4=l3v=gpaE2z(_0PQ6wTln}a;c+#VX@jgHk=tO)xc_;Q@MT>>35`d@(?xp< zaX+dE_7VR38B=Xgg=*lXV4{(Xs)01CWN3gsr;5Ui$sFkcovc|n@YS_vuiX|aeuUZ$ zJ)FA@E^UBj6q8S4y)0}V`#0|hJDdYj8YpJ{=Vi}80eJ$T9C7B18y#J_=RxW?S`V=b zy%j2JnD=}6Yq|=Q`suQLw)A~3UkIZ$#6E1eIHTN$S!VMmXY?nSUvq&ET)}S!Ypx?t zvJ9|B@qzF{3@41eC&!^qX-gie{FY|3+AF3M)EAwt3Tzy=HgZ3aIHUCu4_V0EFgAS} z(O(O=c~R?$A5CGj2FvC3dhFs+-;Ju%(b;%0XJKOe3s!rBh770B4B#KY@2v?HOmO|b z#`@Si+bONAmq^{=)WOh}gTf#V87gh6ox_4c56-{D8-cWeUwLd@Uz+WO9}lQB)whMd zR>i0>v$0`zJ{fnKkWhwq-BzP#WmSud)>TVu1+v690|QS`Dt6?4@c;RqLC~*`KH6C4 zxw;@|)l57_(B?qNHzFtj0keT*7nQuDv#;+5P9}S=8pyWMF=7kB*r)IH>+dj`deztW zsG_9gI(5aHM{W7kb*Os)dO^qiDZt8r1JW?KJf`WjeA!%}9^V%z>$YCgQOeJ~t&LqK z>L#^LaR!IM4N&br&_(5&6(4A1jdD%EnXyww#s%fC*ZU}^)Plo;!eik`#;OHGhydo^ z{(faSxvqbm#3mIt&AofC8Vz9R3^)?PMlWT--vl@4tx8d)aOw)Rxi%|0(is=6D134o zpFK-kldLnHjp8MkuN6%*{tC>$`SU!(OoRoc1F6$K;(C@)lk(0zZ5J1D;;+7QptxVey8Yi{pA5p!ZU5 z@MMXi_kd_1L<_IBw17F2?#YVgdsAdzK@EsVYS7MJ7>`Ax7#hGuVAyE&m~aK3aPJgu zOcRM^bXTumzaA*p0V_?&l4^vUnetn4l)m926^)>>CuN+Ek8J6{4+p8l76H$-f)xK< zd(HA0g}v||uI5@UU_Fy40Z2uO;x|}h5Mr1c8h!^BTTr$3A-7(n<$LQ|=1fELq5LcN zRSZ0Fms7qyD4Lzt5}IVRcYn7v6-y(hp^e$sH|Ek$9fdpEhegjYuhOr*+hoK};_~sp zr4EbJ=WLMY_!gR10l>YckXPJ-L_-LDe2>dM;|r` z^sg^(_|^zn099&!S5l&o`1OQ#eM3W9%^{;TdXGpw$wQ6yuCAXyet?|z_VR*9$s7b} z=BG+9GwTT81@#d~D15Tin{VIj39@{zH*c~>`-t8q6IG;bVr=~0y#N3s#Mgx?TI*42 zz(rK17T*MJWJqixEF2;XV3dL1e~5fSs4U5_6@)W%ce~+m8>yOM20RFtOO%;2*zeZ9vIXzYh~#p7?d#;rXsycr=NheBW9jT+g(WkL`*`x5T1ELTmgg!n1tVt z!P96O-k{d;_Wl8fVbhasm^wS0DE|=`-ul{xy1Kx#S;^eW@^P~d*MtOc2{fNY@>P2~ zJm~ZRqd~k+FglE0x#ab) zGCej2^V1KECBk>w4CQ?bS|HXh7;9^n7|T`sj}|~XQPI%=EAPVRH;u+`1mK#7b_R!h zAr$?vKYG^PO**qdHijshl(aPAOT7S5NGVRQLk~YId613&k;0KzivPay+{VmFpS!@k zo@#wWzdcA(dPRWYJi|!P7E;wcC@vgjHz+Bl#-12-sYN)pa#U&r7QlNied$i4ak#(b zO4*E`+xhd~kraW>;e;~wR36+Tkr8H(ix@ftAS7DLK!M+sxz++yM6nN#EJT|l&l!yr zE*IGJ0ND8q-yO`sxp)5gd9WelV4g8kZ5VEAi4`f*z3)`#2JrF9%4KRU!kHgnB6A4@ zfqQ6tJU71y(=bdl2sPqJP%J^jM=}8XfAvZuD7CeBrvjR`6v15g{zMEL*Ub7(bBpgjIa3PXrmJ`snDL4T6Gl3GMJL z*PLnV6Gy#5nXYAihI_@ST>oJj+VH;+)p0Vzp=ID|)H?2`Y08kwTie@{*~Ua)pE{UP zGpf`$3Q1xFA-D_W*NL+G!uLr$kQ0YoYkNCKf~mPV3Y6kzV9iu@RMnUhph*P{Ewj~# zFX^c1EH@i0qEI})IkSr-PZ-x@G9rpTt)KvyWjJ#%*(I;_xqF&pEGLjVeN-wuJbbWE zfm&7CjZR<$#}&iYt+}_)s{Q+4^+|mkTRkcwb`Fk4G1Q1ahtw}2U6&FcfBls^S{9D$ z6&7Y`<-BF*g0@BqJ4)`^KBw%TLI(^=W(V!U3qlrQcBsTaYm{1;sRh&i(u3PDx5XAk6pWX<>rib$ zU1-{$ORgI2Kl^4{)*E#Bf9q6M@4Bh0uC9(pBd+c+Dn<33J}gkL4wiK=f985K7&Phr zM@>;l>D$7B5S5J3p@f#>W5!2~VG{r5A3NI?6B`TXW?|Ot!X>j9CL?foPFD)|4zul! zM{O<{7suaHxcH! z5aKQkYEqyQ3_{U$P4sIwxqbRnm6yjF_^^6k-sS|WxU2uUgV;_&lQlFv{McY<&Q8Bv zE|QsAl{U{5Nl}rr?rGpA zw+#edBytXFspOS!gAOWD|S@FP*xQ0uBpVNWH6dv2~JtFqJ1lhptR)V z*4AkfbxfKjCjDT*KLq@xvvyq@cQi_xiP3D9n}#qpHdY$Ah{Fb_q6U=v+SN({tA4BF zCwxwxqd6#_nKqZmw%)qUADo$Htf=vsoXLae0O-kV0gD{=1b?RB7Oeo2>-GU_@H zTrB6q-E~@0<3LNi-qUI^X0C-~Kk6dH{?-`WWhOrv0zS&0?K&hlfSUna z_0QHc%T{Up512M2RMx<&673>J&)Hjb|0sh9le5@woYUd=8aMgtmoGn|K2491MSwFf z1~lYA5pXv7rJwwL+iB{zZPpLR5a1qGgM)*RxB32Qg4#pdKQ=0A4mM{JoQMyCDbyoo zGJk?Tm8P6(GH{aAHbFAQEhrfID!pz{qCLi)lCB$c^`A(=wE#3Wq;MMp!90TdIZcIXgNc zG^aeCreedd8ol0Qdy(1w729K4JStoHf(kr=Elb|=XUwfRc;v&7=KJ>_Gt%Uw!TdqC zrmWom=FKl9yQ@xB&*zOvMa-Z9)fK#6S<7<0GyvGt{939+H~lIB|BZ{JEw0S|FqJ6j zXEpaE0u}DyF7X}B%+3}>A0Qkx>O1t|!@W_Jla5AtYR&bqwU`HD|liO3@k>5C$+o}9&A=9L)v0=^&GZEn*|!J0fMK(P!=YTU3M`coV__A%t4j4K!W^*IA(ukd)@BUn!U!y2 zWxg3@xY_u|2(Tb1oO%c9%Z{EpCC-xE2-;lLrk-}Z4gV1X!DdaYV}3|Z4iQ)vjG9Nn zi^~qW$lTQk2HVu?oFm*CGfag#I`y6KKmDYBRdqEO=xf2=iKHwbIr(j&%@z?fEePhB z29}hbJ|41u^T6Nh4x}YGST4An**H3q3M(9XjLB%=;BFCYkxn2V4S%WyzY~_cVdKX4 zn43X;43rPx=U1<+|5L-sjDp60#SuI+B~EN5{L6HrGp1u!FfSb zfI0*`$;TtoOYZ=;k>CKN8{pc^%*@y}swqlHFxG)IAOG~p@$~7*nVELuatBBsm0$o4 zfEgnE@5o03ax-gCb(pIve_CqMQO5kq6t2(e%YQ1%%F6H&AydFvdo35}?Og?jFg-GN z5t2z0c@AO@zN0w5 zN;5Re&JFvn{E{YsSJMYROs7>}M^BK7v_B8X;Ym)zcbk7=PoljDl`F&5fby2?+Q|S5 zzv>M)Oqq8&gI$*dV zzy&X*oBj&)UV-!+6i&`(&R}|WsJZzxh#DEXI!OGk(PymsS1*`K{dQ!$Vdv!Z2AwKe zg*>z3>qj1{VF2i@)TTWXBO|t;vhD2~);tEnL;%qa_gG?vBN@_DfM;PRUbz>6m) zCYX2M!Wx8YfSQU5hR^WhSx!{m(sGHyA=b!aRj?PbnFhdGW@G>h6yFQby)Y^vl?i_? z!a7voms|5{;1B>E!A+Y^4yrNZqDL=`U2@9(BNjCwpy8J&x3Sk7TZh@Z2skq+3ZO?% zN4}+Y43l03v)98AV+X!~>0$?sU#jYKhOAeVnGU{Cc=;%i@kIE)sa=Q?UnDNi2 zQP`1lw7|#Em7TM(+2%gdfXXaH8XKYoKC&6JGc%W9X6NnP+}pbdjz$jWyl21ZU928E>VLHF>%d_=b z(`!+sjJKcD%6c@SDGN;v&~kHgbFB~00WDF%5J1W@ACv`F0ZXg{7^;*zcS@c-0mji) z>&Mh^ARjzq#IDY+t_xmXN{Whyj~zQrYPz5iR8Us#YHx>ZnmZ5&SHhr=_tuM0ed1=O zCZ__l1P`TW83mq5MUQ(_f=}L>Ai&=NLIERRc&Qw|XVw-s!@>aL;tPLRYGd&D&opyj z`GtogUExQLAQ*!0ZCgws;AiL{?oj-&YY0=H+2P@CAofq5D3%_QO(=8hIRF{=@g%9m zf9rD5QGV7f9?_$-X&4JYkBxmkLZMbAz^2VQLi~d5S6b?wl#tWA<4Fbq7Glaq4xg#D!n~&_i9FF<}zw2GQR+C zY4*(%C=L(=w2X$r?6K9!lS9}VpfUfn%?{C3#!7kdf&jxRV!4yX>MT5y z3KjU6iY$!qu(%P+IRn>Xv)Te74GmI$1XBy9o6S<~fFofftcl+Nn^%^iBfZp3kQ6YE zMyShlw6zNg3sphrLSGIeZZttDv9Ud{Ee7&aQCT@LK3@0>;u%bI?)03vMWK-1?ii*3 zFrgB9qP;d}Ln4Gm3j8@aD;-XtARv4+T#+xi(bw_2YrCe`f!ZV63FPA=Z<*G7i=YI5*W zr!Z`ya*-{Uk7;OSB4jNCp_psst2g+e*QP^ZLw$ZFS``PbQ&3si1!$cL-o04;^BWSG z##VkRbwGUhHG%lEw_&Z4P%bWI0=W5X8|05V>M&F($~B+h1WEQ5vMEM5fGpNjcIP)A}f0ihg`nd5i<G$#ZjFg*DKUJj)# zmI%c5XA$BAu{1n8sg{2II&knH0>&O!Jqe(sw@uP(mLG+EI$byDDd1j3?B3~rre1C) zP#iL`u-MsbB_c+_K4L;fN5REp)nD4Up z|C_Z_z^JBLe@{^?#7{FbGoAv?;+9OxqHTurpV?NGzPJr<{TeMTC1tz!b|ckENiJcfYZu3~l`c9& z3h?W;=9QzMVr63+WR#myEPE4|4pkG zSClygRBj-~*%xxnC0d-N7Pz z&YyBYCVxc{-&x7>8e6lMyF1i)9A76Pk07uoTBJ|pOLa*78o4P)6xdu~&dNQwM(W*1 zy+1$b4MP&8FI}R^dS98b@R=>n>&9qqO*It-HD~*0HUhV~1q6AhVurx00h)xk1v-aC zY#*+weT#4TeL8mvxKhAYlA}gxZpaD-9eXZm(F`s6OHHad2KeW{sqw!Q_XEBOL8WKi zKT?l*AVRi$%;5yFDdakK3H(`{rcB8`*hw^68=^E6PJrW&A;LF0I?a!2nN0r#+ccsD z_Ac&JFSk1Et~62SyX?olJl&Cqn^`!owT}wQE4V;pl#~7Bj_unK*l{kl{4IGk!S4wkz2HlUwBy-ioT z2z&q-6%_m1Vc^`*K*l2H%o|<$5LUg=gC=LUsEECRzUdG-_pN#Pa?OH8i03Oq<6a)` zDYRdJgF)y+;&;N-G$X||>iuF_Vc~k7qQ_{OjR)T1fF>aE59|3ki5eoA0FF6g!>{u7S_c!KyP2OZ8wx)cuR7r8 zdoo_YbWp7gZ?+Z;HxykfAO8M<*u;g>2=fedB3vJatRHV6gi{3p07!57O*uqadj$KH zl)8OKs1=my7G`DuW?=Y_@XTVWB#QqBleU%?xD~AgQqf#XnELbyDdXf#A|xb)*7x1n z?DX_TYSms>*Wtx4ZdF^ciG^9Ob52c9!+oQ;D&hmiq<-A%anqz3U^(ODR8&}mP!bdp z*UwymxgoqU=>sDI#mAyOB;MZKaSgwM2<7-=-{T}0h4LtTh)v%kOSmU&6D^P>IP;|W&1CqYJ(x~M zAXZX>&I6bh-YDCeHJEMKp`c(JjEH#Bh62+5i$A}x3E^hO6T`m*OarY!r-_w+38pZ| z8-v;uA+1550OvHGiBhb^i55nG8Ajj!aXytatB>^Bf-k|7KQN7B+Hq^{iE1Vl|| zm1d6K$6A#jBg>5=zUDsmJLwPGl9Ank)bR!YpZ1Q_WB;N$Ld0jrl6O}BT4rW&dP=|Z zf`4y>R04(8h!dowwB5ijaV7=tLV%6Mv15_DWWP=ClcFF%r?TVx+mgUPz9y*%b6mB{ zUa=y&zF{5|#e7e9w+aFx!b|lUx7%Rhu!mlgF2P`dk@xDvJtoD25rz*;UPRj+8ypis z+GU)CeJ(I;oUVILPE8tv~RS|~Q9M7C7&?gPeaa2Pcwq3UbX_04* z%@)7vQtUEcKNc2P^V@U!>(>Avbr8(m{CnMG`QqZ=!JS{rB_ei2{Qa@!OF7L$32qq) zTa(!n92O0-B0o%hxD>ZZIVtMf*~aY)53Sx8enP))h-I5GC)cwpg=rb4>()hi{Q2?6 z?!4!adovZoyJvp8{m#4o7#uw9I_W)`%uQdiLV63<6!m!)Pa2xiVbu42nV7)`E*>P znfutg)1=j1)h$^h7f@jgEYNZ0}TWDgcRNh zV7Oy;nF?dj=zFjhsez-TIp}_TaFI~bR9C2Yy$y5Og!S3*9GQ1jOn%=J83Kg@>F8+! zKgw+6T=U+W0$TxOnRKqxn{6Jt+BfqJTa<+RZYhr4O285Pao*=YhgIawo5!3y-nvB+3pgf`z_>OQ>j;-j)0C@u%cwt&B7k#{ z16I3z)Pfbgdx?DaHWA|#ZP8Z>cFZ((=G10?cH&wAlmm=CHsLFp6t;es^;>OFk16tq zH5&3dwnRsNz)9svZGK%Kv#qz6^28h9KIU9Bn%#cLwBss#fb`~9UoK(Z7F zHQQBcw}O5F7eD@;t~e)@Rkd&UXZ&N?8NBvGteynatRN2fnap3XDe?!@-l~XK_ve2% zUS3hrd1q&W&lSTwOSA2zVHLa{F6TB2T)&}g`e5sXI-6@j6WfU~FQ2PQw%49td(MC0 zK(1o%9DRFHMTFbfC7-{?B+4m2`6((sUYz@8iKXz9)U81V%r8&3j3;ANxIgP6H#Uqi^WMDy!Zw?|HJvU8?n>go(!g@XZ)9Fq#!@!z!9%YIC!g+f&0j&Nn{Il#mlhS>hOw==`R$so z4diomVpUByNV0R|0nO-N7I;;qh9yXJSbzw0zHgb5?pjONekI4}PuKp>lDteb8laAu z|FUCrQCJutUH8^4Ye%5O&=-kTJkwn_G;}xFNF2!WlQS>L0hXbmA@le1m>$EzgdRdH zU;+3SRRLD30N2R^>t`sy%Wp`1szLL8qj{9%OL}tiP!vM`XTP)g%g!`lP3oJvG^ajm zi8MD~0`fzl^rBQd?-0T@IXtY_P~3Ulq8^+%QcyA_t>8$G9~yi14Z8&Al~y)Yos-)r z^LA?z-$iZTDlR{^aAW>Cf6jQMTcW+s^T7Go&EhMs78L7kI(*rzZkp#p7Hj6>l7mD( zzdS8G&aG`x$E7IX9bT4<;I1qG9{6i`L6Mcg)S6dl9b?D`nf9UvJHEP54!!J;BUca+ z5zWeRn2+9RSdAE)KC0Qum1#H)JROMH=g;9OeTp6@&sM&7SK!lt)^??p^+)mEN5Dv`R(n5Jw7cQ2OwP%>D%5PUl)D* zwvK_iyKmkZ-Bdls*HO~m8N!csqxn3RBh8bxlxuEl(#x|{Js01^{_)$g=o?3U+j_aJ z$BejEs#u>-(NpiZr6)mJtL{1Kl-4r7fctU!lzU-m>Cn>)atWLC1XHXWh$z-s2HXwO zh8dd7Xk%OnY7icphgoA{LHfCB)rRE$0Lr34^?D>wJ-$p8)1hH&lG*3;92to5(%I#*gzOB+1-RvKCU=RnRv zJ$=B1YiZS^SnSWWc)WNPr|8=cA9ky%!n)%PE=y@!HqWz6*PsuistrtT zytK*D?F{4`)uAh|#RY{o_20(o2V6kupyyb7cJq2hS^}ta`0j>lRhNE(H738r#K!S- z2w-j{3;TeRSqiPgI35tOs4*2u+gpxI5X?gBR!~y%2MBO^VE+>_JqgaR!6KaM?5wo~ zY1aiBZQ&?&7H4>v#mx~|`B&r6to$QIkmK+=9}_pDz!zOMs-cUk+mH%M5><@qApiRH zdkiWsd}byB{<3M@`)ehed4R|eKCJ-U2;jM)lo8+n5H|VA4<5~BzF#~(p!U4aIeVdl?q=$*Fv|N0K1`2}4+uXa5~#Pig&nMmCQiv;m_4@B}-qr}$X>iyMl&VI8zj0UtM` zk5X`(MR$Y#i=UH|OeEWU>>&02%BN3xG#z^CZc9c)2{zb!*n z`=q$|H{{o(^2XkLJW~uMI|D6khG7;u9G;ce>80eG)H!rzg9m4rnJ0#qp(t%^YMTD? z3lm)s2W+vE8ieut#fxfz`BYQ|0vQJBVW*~aZCeK4z|PRJ=2ni3AIzkoL7^h(&oEA~ zT`fCX z8)rA);KEIV#$~cE{81SAY=8Cot;%bGY7CQL}6#YmIUN2!+ zE+)EV3yf?qr)T+X9k9N{mOX`WWwgw}T9SNvdn2^A9XE|9V?r^HbADqA?{%}v^Pe!t zc`FlUEq~xZLp0RULgBn25j0^*iPCyp5Fue<)N_NU*D-2}PXeAeaQ$tP6RW_pp;LSQ zNUt$<2*SJzjp0?`~Ro9zey#5#jIz`7x1z4@*sG`K*QHee!T zrVrpjB(C(35P6xT#6%Tf2$_atu^996;ehYo)m`%`qE!4|7;yPEKaYe?NF)x}NXI(s zx_Ntpd7lI5r&KKnSreCKnTK zGz5mPPNrr{IUpp;2Mmv8nMIl&E67>o5aQEY7U&V!)`-+uLFxBpe7u+Pj^+=D^Hbn^ zv6t>Z9JWpEOzStFDipKDGEcEt@WlR0Tw%Xqv}gk79v5>XN~_wX5f&OQ*cJW7-{64H zH(rhr({0&b9q@M*ry1HXK0ZDi<+r!yhF}8Z?$xU_1VYVj-@XVJYD~QY*a6izwUewF zL7JJBI2l2uhOJ{V2T?F{%YN7fV`KK69-F_lj2oRyH`scz z3IV@wET1BkfmHIqh2;@%!mh(JGN{u1G_0gAC7$BQ1z&=K9lf2ky_!z!H!G1#1aYq` zA14@8vT&BE7b||T%~9ol7tv-v>yHG_Z?(bIgrjCmYM%(1_+0Ln%>AAnfR$sPTv#R} zx(dICl5wvBPyIe^8sDj(0a+l%2}FOgq)#0Jj@!|pxcWPxeH;%SE!9@T+=YWD^YO2c zOHg3F=jBo^Al(3e%

e1F(kj^Fu7C=d)Q^SfsCb>g%Xu(i>Mfyj$@qWY3+D zNk%0D-o`n+h4(qG?&#*Ym#1zfS+xU;I*0nq@#!b8+=s$!VLZ{=agUXz&?JfaRq@62 zJ4@cl=$*!v#n8xhpcx0Lp!Ef|YLtKS{gRr40w2@*b2J^a_X9`kW+jg+=9a^*8F1$dpo3VHK8CH~CHJbO$pNYC`UCbd=B? zC&1V8U6|<(C_%#`A|6>iP~DD_3{aC({FD-6N@nLA&&!3WZU@bZ-P`ktf84g}}OX3D-&41+sQO@$pvL`W0m{_Y@pLX5tHEnn#2^zVmv^yuOiQ%zB z=rz+pLW-_19S^rTVfsUqB^BM3Z;d>TOeE28>U`9EfRm)L6+8DgxGhM(Z5uzmxb}8n zfSd?J`QuwMf;u8#d7Ov%Q70h8u0ntKuDV(K-}r{(ALqLtFxc9`eG%=aT(q{vJ~hWC zYE4ef&2ZPiF{PE3$f4*Y7Hpty3BOdx#c<8{eD~@zFE+<2A08ftigE10Do%&!ckabO zVRb@v6)uBdmYv(QMPpEnQ=NIgflDgzp~Y8V(NJ$QxSHBN-A{G?Km@)uW2N_1e1^l+ zN@EgnBKy-GC~dBKsj+gL}xeyzpwL&{EMvAWM(;KP(G>cjL}LArHW zzTdR9Y$C{+W4H=W^)L_-0($_lfV=%ps`aCm&a|kisPHnrIg01h#Ia$6`8%n9S7;!v zP@VPexQj8_g*+!CD-{mEl<4f^k6%C_i%I_YubznYlHz10ZW0>uEEyJMU%)SvG?c4* z`TrXJY_acvZFlNj^m7=0418p5!23h>ZI!O)rpSx7li?sp)Ps4`|NW$K+=ZxX9x`#U zTrtnpK%Nqw0oFGrc2VDh6KTiEex}V5bSxTVa?VWu!S%k6fW?tr&!=`?A`m(3or;Mf z(Jk0aNFhtvn=={G$nWv}kvVhvkM%!bhJ@9QB6k-YTTE=CwH0B_gY-*5l?=`wR}ME~oghv0;Qe2N0|OZ9 zCV(lufk`rIK-EI>S)8n{#8Sr^}XSLQQZVc0Y*b^X{bUxGD-;5cD|k&GMKTRM*jeiGfhd2gnnjwm~P5e+hj zY6Fg)NBZBxsO^QUoKl=&$mcXjd*t89XLp+#hZJI=MB660;vN3N`5#9ecl)3ur)Lue zl)#Fq7t4h06M-$-mj`+hqOxE5`uaqtIPZ0B8Ew36EHYXCWok;Bo64g!9bRvI2XW(b zG1A_CJS@e-NQ<6=0Mt7B`Lj}&R^fRFS5Z}NKf z&~>4`#SGm;Kt3t(7c73eb{KdODY(Mr|Iw+;We};L{sbbbA$f!78R!XE>Pp{lkF-Ul z8fLa_y$uR76C}xgNcDA-Y+Y2xCi}4XDyTz&_$i_BPb_z$mB^ znH2$@u?Ja009F};Z@ZbFhCyU2+sBXO+(>NfaonN?nY4iyH5J^}6W6ppV!#GXLrWD$ zVLme7P;j6wFp@F?p?1%T)= z8;Y|0_4GGTB@l4cTGd`Al`eXoz!ITGY4sP7x7M__9>%vL2|A4Xb2gPE3g{}0O&uxW z)EV1+INd-@RJ5V7ahLCcC_FQA)GLZa|##z zpL~X5M$_*$o**=Qdkf}J{=CZw(-s|hG+4pProJh1#t(&zNUCvmtEtMC=V!AGvn>CV zD}FVPkZ0Z7C+0K)wi)~OIfH>j`Z^O66Y^K;bkElmYFXrYOvfkL<5Bt1+wrzwrIIu! z^AReF&Z3R{%;-S{Mg-5dj7B?{DNJ@1$uO<4%qWma2Cz_C!R8rQyjE3(B`US+tdaAJ z9$r?TI>@50cs`Tg3!)mKJLRM##dGqms^_Ef-a>7N4p-6hVUKxkyc~fC+m*C^i;|KN z@@>|r<)C)JgcNWTK&7w!WOz^ReJ0-lfeYOK{)3Cwuk25jww39PdZ65EP>_0X00_^L zUk%m@{ z((2)sg8A@{>Kkx@JFVkbNyq+pAMd2}5;yO%`)}L>%!JtiHvGJG-BH}`K{MU>C>s!agR-rTN2vM;*F#z0LN{37fNu}{kyxd z(C6lBqI!~+r|K}51BX8IcjkH$rx?uqPR1BVVa_9VUg+HULlT_q*-dS2VJ`Bl&)K%D z=Ub4cC12?jyYG>xpZHEf!5}%_3f+L^Vr*IHJ`v%3dK^*QiJW}6!P^UDWOo*my`slS zJC*ZOQGHd^V)@`6h`<^~x7{mqSI^mCuY>RXK?=?=VhsYsSM3h0DD?EYNlmJfbNt$~ zH+lcN%4Me3d(RE;iGBS*_3xw5zNlw746skm#%$-N-MMpMPbXo>p4a-kQO-oySM>1w zrirrQJvY9|>>PupDEs`fU%UeyHC3UoulgqCOHCD9qu5>?+LLbJ_`)b=a`#XDT;q0o zg(F|-D=hO$`~tVDl(e8AR=<^Z6M&p_g30E>IN2!GZ)kO(->bSk^M8Oy(9DMKj$+-8 zR@!{uy$=R#suz!MrPKAj#+PU#O|9rp*BU1@SXx;4aVTFTI;2Xj^=*QK83vrcRR0EV z4m_2*fNBFxQr#|8K4ySH5k7024LF%EN35DHFFQJkNr5L3dd5SR+^siy-3d5O;fv+B zu24v$t%Cm+?wh?%CDql{r@F|&?KHipuR5{`-=;BH*`LL3j<8?N#V-K&Bt8j zZ;3H|c{|Vn9O(g4KkO04>PWp(*Yv(nxPQRGB z*GbliZ8(O?=g^^Thf2(&#J)Z(6Xm|icYQr`Fza(u3ybZn&qwD~l2N~~-#CPAMbYt9 zKM55!?#x07+!7e@c`gr%bIS?Ak$RmtIo8gbF*t$~0<%-~!svpvqFpyXWbDi35H!^T%oFYbnIS@eQON*6im=Z9=Q7jMGa|PdN}P;nqB5~f$B`o9vt`I9q8oQ z{l)JAPiY@-d{u}^MtigPfvAQNN7_PAr|VU=Oj$^C46ouPVm-CpOUa(lWKBGPZk^8m0{As86>dJD8+}-HMm%dM}Cv;oYPW|VBe7n(c9F;k~qB1u5 zY23RuEt0P`BAlrwfrS)ek!p}BO5GrQqiT&9dnkp%6}m=ig}zmdHr@fYQ#frx%N{BT z(LW@VOAdByrP(ponJlYYk%tGkq_^SAN}9_pbEFEC0u+iLV;f90#(Dm~#OJC$IT-{*saR2g=rai&1@1tH5U zz%pn#o%4hrm2`h^+}>n?*_u_9&8RT0?|qlNHr@%vl+L!T!O+r!f0 zN@SO&dOK*5?bv%BD$(6rJc`*>M`Kye?;MxrFxrE<_z!w7JKiR@vfbOZxkI!J^AU*We3fLwSpK_>*`yrYhzeukU_VeXqsljY^UQYfpi70~G1>T3S+S^G$%@`pNj$OHIM-$YiR zV0DOfv>o(SbtyJz>_0)>RMoGG{w$qO<6akE?7J}b?R(nKQj(L#APS2{rz$|Is0 z&w;wjQm7;(gmJ{AgLoPgq$#LrbJqXY>r5yNKOL777bn3pqN;kEpNjZlBC`26fXvXh zbEtcEx0KMl))WO~w>P)EUI=g<>SFZ77s8`p_5nKgL0VH{Te^l2<_WE=zvvpM;PP_hU~EToaeNkl71bQzk=*B) zs9g4|K_j%RedVMFNFx}eeV^`~!8nzuRGjMb{j-V|;GCckzG-nYg^UV_$xgJCg`rs| z9s}qS7;14MTsPN38FD;GBN-E5P>&Nyw>g`kns<9n@ zLZ|7G=6s7aPVy>He~(MRjo1idP5N~-1bWKO8y7jReDsFx#BS1}zDEiQLzzJIcuw4> z92{U8C)#fnWsnKOI&~fePEGtGxR~yJ)jb0=_1s(WuIF$m*ieTQF%R_ufQFC^i1zH& zUwD7v!>3Dwn3gj=E||-p@snjELYDAg^`~9zbrCJMA+p&{V*&Eo4H-Qh7WH`i$hV1e zb&%jZ0y8%-E2A?r7C@-fCqBfAii(LfHZ)ZEEfj3?X=;t`X*PnWJJp=t4@YMey`#EGxt{Ju?uCnWF$TC!DOqtoyzIlTs)6&n)+d<>Tk?As(_ zTNl!5&2!;bKhvG|-0Ggz4~)sJpV9tVhn|Ug2~mv;?ysn|SStW#?E2e+H3qQ!n8J}= zaCtZyqrM#tE<3;sK0aSeVc@@sW;6xH--+R6g*)MnOc3AE%l|)OiogE`pWq?u@AWEP zQ*xKy-WP`5cONbvw`Egh{@sMx=|Zt8agcv;AckD@NA`Szwdb5FxT8D(=eu*jPHAr#9C0tNchYR z2Qk$|zk;H_1-&^dV~Uzrm`x(+iuQ4jcn3gM(%d)6p*>$|@L*q%i_9L1+`yDP0BPG6#rX~0>eCvUWJO02_E4Z6C2g1qqJ|G*Q$cAk)wVHA zs%046y?xus*%@bw8T%K?pQVl}@6Wd%C7S2nRrgg01QgE`-6Ye#;U&A8_w3Z{Yzl?4 zU*i$n%o=SmVB*j9e>|oK&Mo5~?Cxr%jcKE=Lf?n}Iw~e+0Wv}8luPjb?Rm^3AJ2qk z8fSxK&<7cbUiwUKevjym9i_llMfo&$TXVSa&Cxq4yZFG-u=AZpWr567=(xZpudE=) z;r@eH3ZVBKftf;uxGrTcqalVVIT{@~*C%m_FVcsfiAfl)) zz@c9@s@@cW_x3Rym z8IX^Yi&S#Ptk5o`8XO%4|3gnm4|@*F&TRk?*D^^te(Mx=1PVFSZUQ@8OkG@NF)RVC zh9Vt?_s(O5<8P-o{RZTK(O$P)G)kwChlZP?KW?zljv)}LuTO20I)@LlK9|RA5O$s` zC~y=zc-QHY@_tKhz_@ZHo?!q*TSw=Wi}{4+;lmvmg0ehuLbc4EW@%{&7(VWVNhwDy z*0O78`jyVUiE{yB13T7Zpy0r03yJ+>vUNT+z)HtJf}1w78K*AfobQeCfN>t<_}cCN z%h2SO4R5@I+=l#H@hNT`gAtcdJrh?J2OD$W1vdtJZ# zdG7nUkLUP1uIo6uu8Q+Kzn}4bzt(%wITX=X=iO=O-oDe0h_Xj;?|2yU^x!WcdRe`Q zCQ75%__1hB-0*6kAVEy(UlQxEh2Fkkg4Uco-gO+>NA{9lz3Chid?te~>Vpfn=_z zXr~Brt&1>V0_L1AKa)~IahWElI+AmM;IL6v_69=InbO>$;EG{uy93G9MP-L!vgGL_ znuHg%qfcMSf(jMlHS^^&cF$#el4)1mB^V@UxN9v900VE>I<$PPYxja9;@H|5i@+cF zde`kBMBmW8p}Hn+G1T6=Ly(&iy72OG#rLlk1XAdxX;8*}n<)0BaD1TUjr#^7qv;2u zFgK||5X)Qs{CPKD@^DQVF8Ym(ktlcJ-jZYV3O;K-P;7RUfr&?!l#f8BwQVbocSL)k z-tvcpsgzYJp{wMU76LvQXb>{`WbTByPpr9FxqU0nGdI=D*h57hM+bgcuQpn^K%TcXh$~l&E)ScBqtcW0K<_V}5>6Lv`_$eMghL3=L9LLE9Ol}t873bOi~f10m0r?d-mC}#8pxv6HkB;wUWh4R*4tz)l)#`WOK(@)W# z-HZ9}hk@`58J`~)kzfVeX1z_>Mj{hC6y%FkeGi^LfM-g+6_3`t3xaP@0S{gyhr(U( z6{DDDuEWSc-)=4SjwDo}TpD95n4^LQ5K8F=XmNMq-BC+IFJX1&_)vR^StT8!ghS0s zWUZe;SutF6OwYGlu&V-(3&Zn(PUY^!A-Ibxs?REQ6qhB0e%%=dZTOfuudXj&?7gn; zfdPgDe6u}CQ#ER&pUWZkI4&pEEQziPwR<#4TJPrP-JP8=k)~-)d`BrB$CPPaYBde4 z5)ZO3*^8n)_PIO;x=K)btl?E@2-3EqE%X?3J}@vbiTxVZS(qQMMMSqrMxt`oA{^Fd z3cY~6PmR2>ZFlhUJ&aSm=4LxhB87{{4wG(VgzH6W#xcn-GbB_AHdK$7+>N+~q`MH? zH~#V^SJavf8;0dohU51m*AgTGYLNCelx*n3%+1WmX-YTrYEhV%29?HZ#^<;+H_XQ5Wn;3 zAN)%MKkd;`Umq>Ek(W34+k(~EhA-qJj5)C6Z)7w;$}BZ~S@`-A06#%n3l7#6Z#K4I z2|N5Trc%xhHotlNeMwItFzP)0CNHyf3|l$clV}yfnnM$R7<0%&35Fx?CNx)AQqo-? z=jQ=Apl)bG-|!L=T4+1zL_0b=&%%C*E4IB2ajo$75;(<%6A>ihjx6frpil)x#Nz5N`{gZA7z2HHx-Km^R9S=$7GWe{y`7jKqvn}+mdY|S-lUtAdTO63=QY+j zi*!dc`s{eoC9d^%Hd(!=@OQm?? z?aa&>uwjr{Zs3w?dGW&hTRvjNQFXlT>e@N%ciTzz#O^7rK^>XBT1x`+xI$2HW7tI_ zDsAa53(2Ra#paqT6yC@+i#d%p5OTdR{GxLp58|R*s6Sx)DFCU4e+Chlrw14KH~a}Q ze3czDB_^@YkiIgpaHaknKidlow_YqQZ5-XJY9>kQZng!i4mIogvkwIi3c@`PmzL{Yr4S*X+ohK$1Ni&DR~zsGL9{X z|DwvuJOQdH@domQ zAXY>L?S(wZc2JY=Up$BW!WSP5s-z=bZC|j`QAy(txZ3p&BOmyjU*DxD@Cxaw;Oaxo zR%$T@u%)AA3mp})UWt#{WqTz_sv~snAX(MCd2<(L!Y{!Yh=9aJ07wr;C*j|wC!SD zvp?i;VL$k8Yl;g1SpMteFk$< zQ2Un@E6$t)s3M+m>ZKco@<2a5TsYp*p;@F-?PJvqTMKSbB@qVz8i->lG%Cnm{Y`Ex z2%}+S5K(K@Vv?(`fN+|?1-Y&5Ff<n(C3ViB29}t=P!uP~3Z)W+t>S#K2s6=9|utSAgql_(Ye1~L* z*o{KNgpD8_QI!LqCuOGS`Nk)tQe(SBoWUO!+^|`|4e|E=>G{Ss^HJD1rVL-UZ}@9d z<8|ouvk06K(M(n5Cv7iA*!yrsdHeYdh>9J}Wy*N=Yz0)`*rNv{A6_&*$#kn?g^tH= ziqnP#$yb#Kl_*jE@`Svnybder_3w;(y%271te z`K63~-rFFbZ_}rm*3;ZG<#XrWOQSuH-}2g_o7xqyoi#~|N^o|eS9A6^;O470%kS8G zI_Jrhx(l#H$9|Bwc+x$>7+pN1{MQ(By z@#0qC72cXW7KVfsv#bzzEewm++o4uNfGPZn`hwQvL>6oiD$*k(mKcqF&P$%=xBy zYu6XkWcv7nRs&489n1*E(789@M`K_ff}vOY#I`q>1q-cE-UxdQy!sS^Re3(ZSNnJBGDa)<-4mWHXch zw0`YdoMFIjA!Ro$w^#L^vwuuxU-kQ0{(uv?Lk&feX2xq|L!&c7LHz}zJV9`e7aA8K zWw-zWX_Vnqk|;58YN9r|x=0}x8xj%_C{sFD;n+Bvg(jHpYa08HptrC%YSI8x8^S;; zsGS{0k%0uLz|_nP_3({rzmQ=^1S6LH%WgS2Gd||;tE=q4tEO%s0%lKx&40<1#SN z3A8n)jc@-vc|Y)F6I->(@+Umciu(H2GP>WlL#Dr-1}yw#F(+iX>`h3e+u)a#74cVB zBFMHCvx$sR$wLtPc1U#>=mG~bgtI&Zdqd(BP{UFF!6`5}Bdq>#@UPG61g1=F+X}S; zI&NgSb+qBbpwwWrgn^5V?Z4!LR#Pn8w8N&!v|gb60Q%!tI6tL6ee*teESYy*|DYW0 zxOH%W-!y%XdJfSHui?Kf??H_ye!c5N%Epc4;RJHzMRT)&f`a8ROGcun2~{`vQ6b3)(TUy zZIk?^Ag}o);E|MxNzj1?b?T9&Rg>EEu4p^=gGqLrPjsDiHSg$4W+;Xfvone(eb?Il zsb51^p(-s;X1Jx|XF*!pm+`|0IM#rJWKA4K z$p;Jev&f5}UY|Yl#NR;AUu4tp2RH64Ebq0NHrnC*>YjzE$64YelN~4L=dn?p%-A!X z%w#g{%_7ayiwzxxlYEkssDD_mDDajYNtFV!3^h5r!r~-j**NDTUTivoLG=SQhaHr1 z&DWt}9mf2$T;;42;lg3Bs2)Gf)!Ab#TAN%HtA+VPNV9Z^m*HQ~|NQw63wnGR&+Z%Z z?&5K2ezm{SP1rbcSmht@@D&z$iRN%x6vAwMzx-_+)F~!!EqAU>a$Udvm)`X+4=%Q5 z>#29n(^9qR4YOJ-1xRE>wb1Av5*{$$IPc<^BXd(|`m@Rt5uxd&$TLB&*A$nip4q$~ zQ`uNWlN7cbJ^-hajnZ`8G&ksaFTc$%a)6fiSHJCz2ck2%El&+7FP|oZ6*Ipw{$y&*;j;Ei z&E0ZPcL2mf^?`2--$dF&oK|So8QVeiLpFV&L>V41q(Y;iIS1(>B7UG<`vL5;3MU89 z3)h^DJb+d~&XTU8j~~0u=#w=rNkJtkvr}w=R!o>QEajQj4^`9PFb62uX^)9%(CA-&kZFxc3{rPSv1L802@{U>|zKF2~$_v|Mbrp zSu@5XXeOP)J)BNzWswQ;KL>^lBrryPyOg@c?qh!9gO-|ldc#&!=O9^z)8PHeysA<_ zz`j-Up)#AYsxB0XOo4~CpT~jqIp7iS#njkrv<*nB_<)I7{j76neQCkV%+cI()d^U;jY3vF`L*wyuydPYhsXR(i8_$LaG+c7ma&Ksf zJcfZFRDfh2S+t7L;zd&rp=+%k0s;OQDKl18o{(vGS~O6 zF3Ew0O#p#1wxsUl7gOXwkVIGbbFaNzuw+qQ0W)wNiaa4@nZco zUyf_cH=E2gxYa9Z1^H`6o8>~jtd3ODi^Yf>C2Uc8-h7Ig6!(HBgB1S)fD-GHu(&^e zxX&<@mb(dMG{BtKv`JpLnNhiBS-kq+5`iR4W`snb1^T|lnTs3bmJ+ae2Jij?bys_H zqeE20v-hB|jI>E7yCoEQrq`am$D9m<97AuZmi>DrBzhLPVnXqRDL_}wo0kl|sPcTR zNB}k$+6s98*L6u{~!piy_THif-3?3{bm3{jL^G$A_?KD4@ zb}~$Rwj&EeA|$FxCj2~@o|zp4hLZQrR~8x-f~<61(L$O`wqXH!U0Om`iP5Wx$7B0{ zX#v&~NCh>D-DK>Fv5#m-5>3VGL;flr(-4a%kAgM8f}eDCtqrw1OwJJ`$c6->E0BJF ze}4)gWIe|7_5NT<1SvK^EdxnmI~0prT8!)0Bh+7jOo;HdhaUnGK%F#cGgv@zU&2uc z^bwUklP%8wn<-}guYWGjP?I9_v`AE55c`lQIv_;NHM^&PgltOPh=^$hBbkcrQ!~>f zSAFuoDE-6hYFXEU(x=(87X!c7Y-+L=d-8eG)=bQjfuN>i>P8` z;ozhSQ;JVXF%>(eBIiHL)+`C!5bzf|ekA&eaqK<$!l*0wf20H09WF(4gkS*ll~c!| zWj7W3`sK^>9SsO}ATZy%Pb@Yj28vi5IDA`?_94I#1Mcn_*Fh5H#|GHVw1l;u$XYpD z-*9%N6Oj^-EhsA9+KIqInoz)<-rHN^_d}QI{o(u8C-)*0URr`t&ROT$p33;*s&t4S z-eb!C7-bPnK|w(h7k1FRbX!0-1ISd0%-TvPGAa?cVPB^NL1x@z84Zd4il4ki$)$X5 zR3ziF0kNujuVdTt;PfY6%>Tte5;iu$BrPb7n%*yAN@$hTJS`0kghVjumf)G0%V30S zH01L~v&MKK5b2H$ndH zBqV7?JoMw6^Nk9g<01udgOo0f4m6v%jv*5fhEMSApw6b_=HV0MLMIU#>*diPKee8U z%t>Kd%Cx+|CXCR{kuEl*t@b=z^5?FE2OvWShJ)%rW^ec|%qtRWkI*$sk_Bj|Tb2t% z$zTT2XhW1sL0p!_v1t?<4&-D?H?;-aX$0O*ZlIB?tEeW^_hFlmnX3)p&zdE%`o`|s zogb23s}4U8XVk>>DJI*fB}s?XQJlAE<#BeQV^B*p@lNT8-Rx$m{ie6B7PPjO9A51| z`jW#|JGI4@-ydUs+8dAT5Hc#mIriKixmSTJ5gX0(|1@AVjas+boW|Xzk zR)qu~yD7bcJ@kcWT*nZ56D{GU-2xpAktRC;~J_%DUI49D|4v`DOQH%6~ zfq;T*#bh{uhDMl-g&qPzn?bxe+;#x(B9%X*i@{QPKi3(Z0j~gfNAOAwSdSl3uWFdC zw*uZ|T_03nY`T2O6+D34D{{A713LH`kR8sr){={khi@HRc9V9NUeacPp1_w4;UDB6 z^Gp7^yF(z}fDlLf)3HCMh@Js(+0B2OyQ>0(A0Qb>^XQ0j&bi^qu3aqbkre91S$0xh zB^Y;eH)=Yzt!$0SmZ~*PY zI9eyC+=L`&2ZwteFMj~m0NH`v(QRxknuH6+8;l2B*cf$tIWDgH{(azvq)!1nRKO!k zlcS)n&jJF3ei(aA&DB&II2Ab&9W|drz4lcy25JcCX9eLpKzoOP#N$*KI2uurqJyLoH>I8sMf(j zf7D922=LJipNf>Zf>IVkud!L(I8bvYSUvbc6~+e!9pcBnmn&#BsQFy4>Zg+26#E#O zYjoz&l-$~IQY3Ba1?v|--xH)K`r7lz`cmH^H+29j&a?*3_I}#H*kuJy3GI%3oA=VMs-#K8A399J_AE$y%o`bQLf1iXCV7 zvYS}fla>|)$R~>&joQB@J)!GAmy`C1HQ;>gl|RJZEXX{dxpaYUKS(Fq)FT|Mte9ht zDUAY#Z)ZDyEpLRT(v%}+)A0pMQ;V44lAp(6Sg(ze?MT3CoKAUt0^Ae!wP^g;YroKX zk(!6(WWX@xjO?Ob@BXLd9k0rAjwI(%839Gv@7%MQH*OPt8uAS>7aE?}TI_v%%vUa6 z521ghU{H&Z|%lWQlnN`Q%pb;f2vnb4afPzN zCr0%j+qr{ODrGe`mI(_I?aEabv>>>u$TfUm$O+Srx%s;UNe2qb7=;oUJjfrr~_Uw&yhXDSRe)E>_@Fh93Oz)*<-zZimi zr?G5uVh5BOfq_3!fF#HiO<&4c7Q{Ry(&7)LMWpfsjJ?^aYheYlDn~g3RPh&#RoL*T zRu)n9X^C(Ae;O48OlLo@%OuHd2l;ne`EIaUe}J4j2oMnJBC;xE?7C+6B-XCs@2wJ} zHHIP^*;*vbBZ|fRW(Q8-yukt!Yv)4J%_bh6wS*1TM@sspHmF6(_;QK0k~t3Wu!D9= zAHEI75oOJ~E+F>Yoiza+{oOK4$?*qmyct_rQx(rW$n_`3y`iru3NWs4A?@^FZc!6a zY&oMG%@i{lkRT&v-0F>mk9ITB!K(89eG_4}AjJ@r;H22Xp1v5z(jDz`zQelLS?$}C zoaV-Vm0v3t?$0(7B|jaU>Ja-v(5CJC{f_RISI2A$+AbeIc`_lryV$Zr!mLS1FcVkG zU*}IflgIb{r4J2pa{e?g#8Q3H#nNA}v?bx<{#mhYEq#fLsuto2&lh(_XP0ivaj81A zCUM_$dC_pzq>F~z7*5>u7MvQN7Ygit`YF!N{gf|%$HJ5Mq#gkGTTjrCuIy6k`_yNc zuiA-#)$iiZd{CKT+7A`MM{7#)+Q_$FkX6&bfMxhSb`To&K{-$!@G3Nq1d>}QN%F6Hr1f1IEZ=Kh#Ri2D_5ex4dqarx(=Q!r^E!IKDY0Il5-Kc3=<1~SO8f@89P9~;5IQF4U z^pyO|Xw1AmU|U4*!+8|*aA}UeyaPuTM4;V6YgLK(>(}Xtpy2W;81Tu%3j=ecbr6(- z>w6OisXne$JuQd3~<7udfSurLfPJ&hNpd!(Og3p2HF!Uh<4wx@uT} zNl+tRzw@i}3=3cgAP9!gqr@t4ISarT97=Yary^|*1Nd~@zOaQKkH;xlVVg6kq|+F? zL@Z)&r|eHoG@DMnlhyF|&keqd;AnqAPNSB$d~?IWU-5hl3r{PVh5~wQsMV(=_g6a% z`HRnre>x(-z^57h%vpo=dyt0SF?BVnz#SR}Ecr&6M)mu8VdX@lWGR8AjxX79hPbvp z<{<^rKDFZ??rw@{MdMHp%`(v#NLWxxiO(r6yNg?q$3khm7w{5&`5A>ZlcjYOL{qO*Yt8B{-d zq>vk6rv$>We}>6oz_qIH*ZMkZ8-0D-ktRu|Kt_j)2bM$vCy~$WTJ>Yywp|8@$Wnd4 zC3S8WyB)VI8C3|RIQZo{lRPMre&Y%|TNjK94fo~l)BA=xF<}vhaadRwC=Y4^p)lz3 zp})8j^7qg9XgkDoX&{#ujE>#^q2dAH4x$Cb?)?CQ3C#3Kjw}A6Wd^PyW}4l$jYR+T zI8KbTxX3cdHutdYZjG6>HJQGQt`=Gbk04vnzde=h)~KjjxFJm>qyY7bkbpu`piK?6?USV9~V;e)R<>H2P=);S&QSfE%xOw zgnlG#&sZREr9WD5Vk!JgHt?G_TRvGn4mbCMW5177CPe4k@}hVWj+SyqboGFXblJoG z%O0rrZb{lTK|=sV$VYhP-@kWWxL7=h>Isc8gfc)wH=_BzdGir`5=dRi&(DW0rrfsx z^?mmireivt80WUR$qkB<^x;Ih;syh&UuE*dfVO(r+NBSx)V-jfHKi z-dkB^HV#%s+7hF1En0K&yCL6j5nD=BS5_9aKk(wdTz~iORLqsA=;(W{D@DExQCaNK zRB88@-`R-bh)ca?TlYA}W(lqd=x!ToZ!5Jco6R@beBy=*fMe6c@7viJ-Q8PqR^B6M zBBCi;!l=Exx|;vu@QpRC@2~pQGK5N<6WzbxBCm3pRvgQcp1|b`{~lTI;o0B})dWF^ zx!s;EOFn)VrZzyhhQ9Z#`#r2WHO+Bj!|#uh+>~45&9Ir*+o$@Ojd7Bt zc5B*dv9>qL*4ZCV4w2 zHq;h8QW%`OQsG*4HmS45M5mUK@!HvDZ_|ig3y860Wy{WetTGWFGprBOc04Y?!Ps?> zWgA1&t5^Gq%B$ED9m;`f2b># zE0}0+BSS?IxXS);wrw&jJ^k~syLIRI53!A1v$Sr1&vW?{2j$V%>Wp{af6Q?d6ilzr zrke6uMeFVK?AAGy=2*TX;}fP_Rp#gZ8P?E7f+OM}12Eei@!3%4N=r*iNPr3tMsH8D zE~q+ft}#hsoWNDUV8MWi$Ow_Ii$z*G8dF52Z_I_^?57b0#ziAr*bZM%o_wrrMppvwwy&I(zx7T3McO^w5k;8eKXn3+C%mZ4rD7Se92iP#ofm=~GHY zIm@Ni2Z=T&@`-{cPtN$1?OYqlm(WX~tpg);B5nHf*7*g{@Ci_osB|lT}5lCG@b_pCGuS(_AM`SqhqOb)RwibP+~Bq6KQ5E(rT4d zj%H=|CRS&7Efa_HzJ)2~fX~ z3T8x%)ttJlR*9ZHoR3sll5Ge%KpwaZa(bpPEy`b8OUt~%;Sz)`u+2PWK9^L!Kpq_0 zPFBO&0Sd2PR6W^aC>li(rV*wIFzMJ`$1c;@%6RI)xd-~fViRS@Yd3Gkb=|5f7NJ~m zhhHz(0hIJ%DIa#ZlwryqFEYv}Eg zOk@1BT%c7V`(S4#uI3b6-<24-eNOhJ65WK|%n+kXs}^M_Laf z`VQu-eK>8PcEWt5y>3Hff&|(Id0uoQ z_vI)3{a5)e;^%UndWfueNY#+Ri6o6N`^#=xcg4I`HbiG*DL6=ReS6j=8H<_P1mNYA z-I7NMW)>E^p4W$s4o}#)MQ9DwcpslGaibMzamD*?Efv7f9-&gf3YBeUj{?foZtp&= zzrC_?kLFPnptvuglyKBGy(&10`Up@Tr@ywYF0wlJ9b1X#yNJ6LqaV1x+C5v+$8s0ly9bd4AL zo4<{>E8ED`$^APw!A&|1@ABq>z@fW+DDu$ZM2Y9_+>&ZSy;uBe_qBVa2A6hocE^i+ zj%46>P(5<2{a$&w$mt|qa<`tmEbI7SAR0jvg@Nu5Jn|r!60x?-X}LTs#Z@O|#Wo=A zb2OJ?q;iShIO0S++K6_5tPPLp$OOebimOvs@ydFoU*b8lzNRYN2MC0NgO0!lf$apL zNNV5iXRe?S{rvn43?NC2L-aOOs7Ks}K@*U6l0gmm5dw80AW5z$ ze$5J;OrT*UZ_+Eewax+#B{F8`_D*i6V<^Rpn4e2ii=96qVP3k|^nq4hzle^ge+AAcvde^MX7~l4 zvJ4cHb0b#^@for1$2c~{zbid@N0x5-7z-Y=OBK?9vSHlQJi=5^6GZ#-aRYp`wE&4r z<`p4<_Bu4l-7&jSu5o_6VxlU)P!gOGUgR1glcSM^U`+HdSSpTqxU{4WY@z@z6&);1nJL6=ENyI>d|?VXtfKl`Eyo`Yg)r zY=@ZDmgq1qu`Y}|sh!_wvIIRbIn#!)4{auH5myO&ThyHZK?}d1Qj6uZ8(`((u~@i# zhJkox%a?Hfj@e)HeDHVtS+yrN}lehRD#7!yHIg=&N<5*fsNB#PN{pm)luWYCvk zVr{dzm}t^0PL_Eov3x@`Z+9Kd~n-&v5T@9B{mv3x};&xE`wA+T|A3Y7GoeLChSb@C&07Atb70Z_2Ixzb#3Mlgz1Z|AA4tS9JpMK zynY4-RpT3M)KdGh6*TBGN2`)dq6;>aR!}Mx6B`MDly0#?5mLFrGBuJVc8mrCLIJsiK2~h?OF(V5HY!dz>%Wh{Wikx zJ-T?vjyuJ?O{O&d1EP@i94<5b+t}Fn_h-Z3pYN{QbiUk2KImm#Ve$9PEOK+TRl+p_6}n}{>)@Z=a2st)*e5S<5~SjRQW7`}2V48 zf6akk3_vAXo-P+n`~IH!7jtU#m|xHZvQFqoic-JdiG+o&${= zYa-@g?MvIV_vk{xBK`n0u8BqE@Ngk7Yu$DE76A%>#H$lI?}GMibGBNP?;In#coJ?4 zyW;zn^)&yWDA4y3-zmgX5(dk!e%*!1FpkTSlF0O}ek~??-Mr+KukS_%8u!&+RGi%Y zZx*I8PcmZW;yBhb!MAT;iW@}SNZKJ^ZnGph5UMKt2XTgQVmn~67X8rN_4|MbdA;`&au=r4b`M7LU4O`~;u_timtimX;ZFA$~= z{6xMPfi7^6GBb`^)v8se+VS528L!I$f_!W&ERSElztsD%aq;`E6`$ZkhbV;Cw-|x7 z*VEJ2eLqtd34OWmg~d+11tGm#LAc>J#pO}lsRGvb^6*ihF+oIvnaKXx{=8=~QYpKD zQqB0uhbifcjH&0~jK^X85tRZwl~}JjYX#SHN@m7h|2EVA9s~|kOiE66I)1z#rA>4LkckE|odj8Xu<#)V%*4MuDSuob3`bo) zVA#WD!=4zFS`yXNgr`oBdD5UYAuq6BP%0h+RSn9^+Wwq?13$=H{7jqXWW$Yemc<*h zX4@p8Uc7;3{G0v#L?%8aTWKY#(5;IZpND_nU5MFLpI`iPvP}IC$eMg%LBkeVRQ(ELII^a7{Y#gn|gR<bBq@Y|Mw(vV@&H4D$Rx7w&s;jf&!69!){fzLgod78*_TXx z#}vG9Tj)XA&JKp&Zj z8O#k=Z$cGG*rFGLS03lSyOWa>meS=PZxTY8l|ONdoeGa%eK$3Q>ZuH<_O6P3YZ|pe z8;DuT5lRX}N!mSm&@b*IT*#a)}r1`{BAh=fPwtM zK0-NGDA0S|dQJnOa5&j-3(o?s%6<0s-}iZBidkw0T5sSdkPqVOomJf}zbmwe;3qy4 zA1O_Z!^7WDfsrJVF^z3nd-}nUSNTj^3N3M@W7_rBgWunrMLD2%{_TBI0^v2t*z zF}GmhU26p)jR2;)$1Q!;yD>JK7pTk z1FA22E@>p1WH%USf?Tnrh2<>MhmXVkQc&CO(Qn@8s2 zkYysUqISEZV!+KRzz|+yZE9cA1fe6CbE-xRdv3Y!;N%1;FOaLW1xJWGasvxo*;LE- zx~%^EIk$4QIS*3Ek=-8`7rmZjy5`tzy?a7AIDn)i^=dG z$W_trVr^7`usNhE)QkC!q?#87GAI#Oc>JtkA3}43tsD5Jk%AKtiwLLYCz3$%7*Bz9 z4i#U`Fgf`7^3g1PawaR(edt@EA0r28joG0Mluus(e=hsd6Ejs25s#iR58PqJi$Z6} zY$4Z)vLo}i(U-&De;U&{z__8W`h=Y@s(&shNGos^XEo->-b_q19P~C>)G);nchLM*aGpEGSL=<atVFu?OXp>=d%Cw4GF@sK4^4tErxRs zlvoV6wnmDVTcqKBHDr^)E(Zw$-b?oum|e`(ri7z$TMhu-g1+$ET8$BA z$&Gx}p%e}J6b7YGB|b8{$WPwN_(BV2VrBIWD`U$SIuFa-nDK6vFq3r~66^25qy<4u zS;*aX?(Di-7e3d{C3<=VpC87qQc+XG-`08S|3yr^w#16+$Eaju@H-jcghMC$MB3aC z)SpOCzj4FDUeLYM4{R)JMu|L|Dp{2;ZqvXXqF=|&wsq^X6%lWhD|RU@Eh>qEMQ2q? z->Q>|HQ0Qt+M|DV znpb;l8O~~{+NhCu6HEg7061N z91``b(>$eujWNwt>nX1Z2a2Q;8|z(8B`Ts9RREe^6D!HwBSkmj1yg~@r|%xnFg|B# z3~y!vGIxwbySHd01)!9Hw-qiE_XVX_(bi=RxSJtb>T~GpG)`AQa}j<92_#%%;bmnsW%kbiI>b%#3`aH3;N!`v>ApQKLh%$4X3_A~Fgugoi!|V7juo4d zbH`oRSD~&$4p)hZuQ;13>c;Zd=klFk6&-9~JXHk@fZWGVx3rFJ)2!egQZMKc$Z8Qy zV;Ho>?^IP+wjDV*%U5mH$(*?Y@y8Rp_6|IbIC*3oQVsf2^u)O_CUyn`#WBc zilBckIq)hVE z$_V$7e@Jjg{88}k*oiZ+Hj@um?1~?s9i7s)-n}PMC<@{ml8OF^Ff-e$o=f0{q3C(| zqjDd?9Md{3zIU^SC3jsp68(Y5_jQpo#64)A*RMT zsEI~!nNQiYyLTfn4N?bYWhbg}!Pb1OLC*@I4=K)g|H21GjgC$*y< zg`ry}Cx$z8+4r-63^c);V`ILwI!{pO7%Vk{Cg2Jk9C zrC`q@?nd+swQ=)dejgsz_ZI_M15R{?4&nfj7M|Bo*Q^WWiKf%EXm zhU{$-`Z_s%E;kp|6@^TuDo!>Q`5JyTAX zmpO(^|M^v3W*>r}CHeHyv#+-kO1LBnL-N=U84RdzJvRW92&dhR{TxLYd`oUNpd4_R zP{<00o;QSqBnoz&le4J#g3U877lMc%+};O}nsVRN5w|9k^3Bc72Z0k825n7x z`tOHw)Bjv#-AOBVDh9>J@l1=9h)k1wepWu#P>McveyGWFC29gHpRYsd|L)<=SFc`q z4J&7ncf40KFjKD)Gts1qwmc0%d-|)iRAEPisEL2D>`{;TrpJV>vvb>e9pABu`+OWR zqk$?q8*AbG#-6Hu_^@HHVU03F7Nc!HzwC;rsHkDlpu112(^1qG(mHsX5+P1TTpkLSxvo8Me;9WDN_vzV2!T(a>4=bKX1>1!_xZucQsiIn(xK5Xk0U}HR^ zaI25a7cdw~J_>Q&)u$j6sOHbP=A3ZLKONhz(j4+~?5}k&{3m2tc+VD927c}1(z>lq zmg9m-vT^o%idfYfnJT63AK1J1`nlT39adCfjcQ-tzQ|S)n!x-Rf~I}mCdlfly`eA* z6+s=_Ytk-ohG>kBZ8T{-#dn8>|Ezy`;{B{MO;VohR|#>6mEau&pXwd8!UOG9LPsy{E-w$ZY)oKeGAREvswO0M3X;ad~xv0qFAJP)8~#64=JD z^_uahTHD$z`hI^TS?J*WKlFAy29!y ziAED&Wz!l2QiOpqmLK$$yMr9zK)KK^elyGHb}0<^@-7f+bBU&cT={o+M!6$2%zSS5pTI=p|2yvLopn#XbIA0< zywpv3m#{mshEPZ*X=^H;IPOWU5dT6uY{Rx%hKR=MiGIQE>UaH0OY;GZ)OAMBHh%V_ z+QKieoSElpz$B?!u}xWtEt>I!NXfesGN-t?T_Q`UG2=UFjblcfZ*crj z3YZTHv6&p=G|}uHV^VYg^*2UXL5X#7uR#OHe=*nU9&-NWrt@T;_vA)4Ha2c-5|P=grs6zF+*+ExS{UO-rV1_VdMoZFULF#CP+0)9rMGvfjnDE$%eg3M^xnp9-vr zA_(O}%xn}Qld6}BkW_^&ln5Q__2XYhT)T2MX!7&q-{^I$Uub_t>8_(FrItCk&=E#j z#xmo78?B3+LL^osRNNXRpW+rrX&dZIA0FR|aaJ+W(G~X&(irOqT}RKInjZUx#qxP; zeC&wHQwGkkBT6wY_1E+?g>R*(kLvT$)LH5+ov2H<)^gwtIoH9lzsYkrqaC zdbfPuO%>gbWbGHPvbJff{Rq)nQPK=kyoE3#Gunr zeH#($y1Tc3>3m?5o}C|FOeHM#>IGHixp%*A7-a+OY0bwlX~0Aq$`~k8!FRRMbkTwdu39e&Ev5>toZIbIGLm5%$ES|D+8cgEFS!I7orr zLf2Ss>b|)7gS+2+x^0vTnz)!Zt)-fb?$Jr+eGD>pJ`7q#N*^kUbX`z9yd|qYW|>f8 zF=A=B_%b0p&$c>VZ|eF!QPcV!f=aT!n~&v9GwTo6JKPH#k?wbk*>z9)oTOQF)s@NG z;XvE!QMZx((n#exfuI9WmJK<$9~F#m+QwfZv3lwXl*o(Iiw{cnTHoG~b=uO^web6W zPU3<3slDzyzDMYm-VPOg=T8vQnr`kgj($YwwnHr21IrV(X(m|zvM+VIr4YA&uH(Wn z+6CXvn!Hh}yEDo09MLWb`n#r%29@hFon>}wxp#|W(vanz3(m+# zUXi%7vU)aMEAQ9`E}5e#HX8XCQJ}O(W@m5Hxk7g@leUE8o~>r>cI6zi|64n+c&vt( zfV1%^IRpltRCL`iePK@dW8lVU1v*cSAi733?osgQ%hEMrk6SA*uAmC#7S9QuQ~sSC^(vJ6{R&n0sL561(#Yzmer}TkXx; zV|67@3nz74DW|4uxo6tWaE47!OIsv5amIm7Ra2T(Oa0QIeY*LM=Z`cVENdNL3$xD3 zi*XUncwTtVNW%DzShlZ=V|`-B@h_E2T(r$O7DG*oiVmg0QW?*71#aI_N@X${>v5GX z6v2Ksr!xI&*-VX`+s-0+SYW7IXaSP9Fe3dAP8ZW z?eS}f(6>kL+@vAW)b~hD558AbO2}`&Tbz(QU`W+@*Zoprnc!-f+CKjXU7bShUoFN8 z?5g^U@@ZJk!O z%(9gow%2B?bd0D?Yqr#SGMFwUrsh~15$#(%RI})M*+PTD1E&9g|yb z`4P8Ft|7zY@7}%RdUD(-Bdx@G9o^vANX2l}!%1sG{TJoo+l|E2RfuitO)wbx#I zZP!%w-;qh>D9#~X9Z#qeusJW#@Cqk_XGdZ~8{@ru=;H%gqbTy~evVEsx*>i&g2sOP z&!h?!dNVXxu8sTdm!>VBk^2G)l|_BQ1qfHfqMuXf$BOXD&^PpFwkL!?EW=#2puu}F zW%>EfdQ`Uevr-yS>qcQ%b!G+%@x3F_obd$^o%C?irPFXq&%Pc@+M5>>b>60*+>~4T ztiq>IkIM74R!{b#T(CpH!7HWl+Hx!KH7ZL8g-DLj1lS+@SS+XeT~hlI-Q8uMO6m(y z%Uc6ewxwshYT30bk0+IDt1eY0yNEB66p#{@xLFJ6 zOU$+Wz((G*AmS+_lJ23scFUBCuwg8F>)4TUArdcRRFp)-EfJFGY&W##C$PM7( zH}L-HJJRCz8V`JPjslj z>DSo*$Pj8G0@BUhpWRPjlO=jYp>w0uB&tZ=`&P6hG>_1jaZyf?a7J|tMpD`Hjt6IY z&0`nrpL7aSr{ls5(ypt-xnz38WR=$VFhbV}H^NMyLDmRM*1mtddkdcAXs9Wk9@J1% z`!q0c1RFZvzJ+zUFk0b!RP}rMu*3%xeGbMDp_Yedvb9JG+CuA47otU*2ht7RC4FPt zO+Ru(Vb*^VBq|(Toz&fY*i1xH;Ab#OGu-(8zghsuAfnRsh5`MH`;Irr=V_ac zDUZ)jf8wv|lN9{1LA)u;EB_hl!EwA`$)-NLv?L=X1xw*Vrx7%I;6mPmL}OQ?CZmSl-Nqo9RcSFjn#iIL5ih_FELnixT17ecz0F-tm@w;@Erb48x6Y^rq}pf zU{KSpUVT-LX8h(&n`VP#))ldRXcPG>97E#@Z6QJ>e4;st>o4Q*{2a^P9-a7^?r2WRm_iF+V9m7Kee19*jp#h3?oJ81$ zU*^JO=XD=0|E6G}O<3gYL2Nn#Qb)r1IBJuvQ*@KytaRE)-c8y@b&?}xv8hIEwE zPed>*t%@`MfJnMD(OGZLPdqyne?qy4FOKR-%!(msVshW)t~$&*@mEUxu|xL&YebWh zm_Rk4cmgK`CBWIBAUGYu5gFAFSY~+RzCZddZ4OpZp<^{EoNa|dMqunUA-(*$qzScPWrN~{Jy0fJxoho7JO8BF$n{;`#p`ja*N;c-My-!NGJavEoeUn3mDSZD z!NH5azU17GIaUy8nu*RS%mREj*3Z}P<^FGY`HE3DQQ%w4eDfQ-&nkf&-8FHC+*PXJA4{2at3x$}XA)^#oV#9&a z#7!hIpCitPob4 zh%)ja*iv^CC$3-29-n}iK*KaNe9pEn!oLRp9HnP(Z^fg*{l*Z)m*d~Td*J+Blc@bM zFy%GZZ+aRB=_V;}3hpAGaCoU$lvDpW?2qb3->5^kMpdD7BRQ$|D7Ylh!tKP`EcDlr zoqo^HPr>qiSvSlNodZ0X*x~OHYs4U18_%^xn0y;ujy;TJCr)8M64wa*=q^cm_SHPhL zp6r}>k^qTxVP}%=g^~+>gJ#aZ_J8UYbfu>bK2&?>VRGSN?IsfGb-=AA$MY$#mPsT! z7tvQEDPLPtRvNx7e9|RV;?4jx05D-t7M3~%@I|ocjkE8nOU0Nh-aFFe&E<=_R6Uf4 zRmDT#}TOnc1X?CbkkONvNs3^|~qxVL;RujbfEN9EkG~ zBQ!L`8Y9xghx?z=EC7SVxpiyZ&HGqg{>6KrMCz3__CK(G#ftU^z|0uuT&Z0eqzFem zw(9+Sp8kjDIG}bPju|5f-%3ne9N3Dl7-S(i0%DCPv~Z9h;`E+6crB3?!W#u%ndxnw zTI;u6vd9Z|m91yrj?!s}SrVPkXNZ#7N<|3+aW#1U8+VO|Hf-}neCeuK$G~Bxy7a$z z@Y-fJhMR;C2LA9luJkr;f&W__2?euDAA~bF$^H-#L;r`uT&wRbKn;48cl-A+Fo`0q zH;nAGeH6jdhouW2@XGacbz6C?n~-ISiD5Yf&UnLoOt>KzW2_Ov8kr&$bI(SDsOv5P zpLW0<VA|4~Pz(wHWv%u5xd;WdEh@*TN$s%R{21SV8(Wl3X+MpKzUeP>)Q0&lN zriN5OylAp+}*t=rJaK)3lA@UM9Trh+&0KTfZ-^w6?YqX4=Ro zXn={!xE?>wJ|*gRQADrF?YU9?po02Y+v0Hbv%wWlJKJUaYOmk8K`h!pR=@J*YjfCv z)H}Fe1h8UUV&VprGS`~@E2|=_t2RYE?Fi!QoD=ls1bt&tag)I|efX2w zS1%#GDM+Ve(UJn(lY)TvqtbnEB02yGe?tZgxJ zFudxE&aS9PNn5-RTw*us&HvJz zkL*>w!lLeC>(gKYaWg|espCQs*RrviF3i|P!0uJNafCL*O)icN1^3YyFQx}#F z%Fgi?_R^F5)dm0q;9ir1?RwLNWF#mOPKC_x_@7e3EgE$q9Kmul(K#k!60yk6jn&&{ z2g|JHo%PKDYA<7gCTdfdddb33j^U<3Gj_1JCrjD!p-roF&VDA!-VChRcpmewWMcaF zY+A>Ue?z02ADi5uJ!G1a8)_9&nILPI)@`}mnvvacQi?ROxPpul91?=1g`aCWIp3AK zbXDQhXUK5>yC{_5c&_oU6BB=+(t*ShZr3*(*V#jtB3@_-2a!)yu&?a9SgG_+#WFCk z8v^(^A5OMXmyJaHIpF`KkEzuO-0F8v06g_@(1rLBJHS_K1~1Ou9_)G3)Fh7GK2Rru z?4zbWocXu2=Lj7xVAKn~uog`d#BpB-~(vb!0RBow4eCHl~ng&sXk zN5bUl(Nix1gfU=-ySm@R1Y?(4{qfEW{uh5pc6jj9sZuAekcjQIXuJ~U+gTKn550xo zmHsOZLTIsgF)~4rR#j5Y}ePRUIz@-`*pZbk+6uBkwbO}jiR3I z$-}37Z7Tl*Q@1(_L?;PDoHqjb@Y?Ds-%jp?1+p7kHUIE@I!^|k-VMA6c=NKSj(z$G zuj*3&y#qE16uMH^FmmPMGKzIXm%p(OC#kzQP_*;rw$PAr#U{fx{(b>!E*4G3|K%!& zBn`uhmhFRp2si}dsGlF%Q|g?XZ&QXo-&}+}VIk`7@muxhW-H9S5J$6W{}{jp@h|1a)8N`06}s@-_k*49Q0{(t=VKyUBfx2Qpm965r|>QHt1 z{^l-s1)#0kfT=Xpu26N@vgtjB3L+H41*p^BE&DMoBwl=)bE%N+I<=$w8gV_Ds31kM z$|r*pQWjrax&)@+_7Z@>|HZ$TR;Yl=7jbl_loTCFU!W5@pZJ@EjTqca$go|pP4;T+ z<;$5G!E-3DN!ntpk51fx_Y1d1P{)JASbPNmrJt`aDSY=SVFO>7fkYLb`~pNyn7~we z^NaXyBLpZ={X)u|BxG>qHj2bWa7z`QJ)V9-_07V2_nKwgf_x@Wm@%_^z>yZ7>sn(w6ojmpWrFTCoM0kKIv z&G!4?(^7s0~nBd7z| zuCSNBK0Ep^KDRbXu&9QGZD8UBpqo<(3s%Yyhfy-gom|D-%r=@g$V{iP+WE;<2z(Kz zetoWxQC4Or;dPP1+hvq`yZ>VWfnl7Xf|Ogmb6p3ufTvpr25y{K#u^dK=0O3{%8_b$ z0v=p|8P~bFUK)h$-(dOF7GXk5%6;&FSSf>{kmB2GSs&Dc@kOB$D0UD0&*433btaL! z7+IJ2D&yj~<=yB$>vs9Wd>muG0{=t?Fl4jmF_y#h5YPA7IZuflNz8nJ_@gG7xoW(Lpx%2a=n zylL}hIC`Pz&NPBE|EO;;x~n`qJou?LWk+}KXg4nnQGg%`y&(AAhH$FWL|vy`$~T=M zt$$9vdUY4p7Dhx+LRV|}#RK9#BQ65^0mU1BVgFA=Ne9*OA36bQA&9>~{g4QYXozY- zI>21*24mkoCvMC%1V(I7SC1^W{U>h`(yI+U~pI`Km9V;v??ARJKi6!(nGaDHE z!v2~b@IZ&lJ%v*Z5oC|IWi4XN0^u$%F5Nm3;@&-b_tF$i;sj9D6bMRf=##4kbvkAjtUg#o=xj56~TM?p}ZifPO;52&$cj<&xMZ;OFOeK;zWn!U71gTe`Qzd<4N*Zh_5*b-7(F@IYmy%Cz`D z8p98@HOd8I)@(-HLI)!-o5LA3|Ga$gJ`P@Tunwp`%*jv9uqwdr@%-@4$h-BAb?D{E zvj!ddreE+r%U{==nSS#y(eI*V`*__)?LWaP%dQT8HBU`7=Ic(6fm_41$x`ug{tut_ z95Z~lK2`y(04uBTF5(+G9h0-^_x;>3Ats@ESwMQE*L(fvtE#JYXX`MU{|{|v#)4Fu z@jWvJ6eB1g0FIz9IC*c#?;i$T3s7ep=Ro21UlIfJXrL5{Y0-j#zQf_o93S-ZJvwqP z>=(lC&vY6ACqQ~hUTpPVVXg7$Ul!YMMqIu4&q;$=``NR5>Z(}}p6t6{O26PAb&uy> z`R;j>#COfv#kK3(Bj}?&jzqLg9jNkxTn}DEj(7h`+dSY?Rjry7z<0O|73|Qs)&Aw} zoQ$L;VG`DT6Rf9&g~ercx%+|1sj03D%K}73yfx``|Bxiv%a)d61PNja38L@I_c%$E zn>X*>w+{nDw}9I1FCQQp));OiHsj&WLlR4(<55$Pk~#@xD(bA^Y7d1h%q*}_?gGPB z6soSsXpoFV1RQeE#KdijA8F|2#^b zGP@qobYX9P?$Udkv3aYlCac*~ceDMGtP=XSl7G8q{rx)%H3 zyLA4zSEgUP>My@xa?*vd_0UZU#ua{7O8irzrvIJX}?igDt1@JDW+3*XQHRr~S0jS9{7BsY&vfHpN zvgE>rSFtmDOeZ6c7AN`eepiML7||QnB%$4xC5-KtvD9MQwp8ALD|>g!$@wDFLw41A zfS#TnJpZsKzNQ+r)&1wqHv&r;9f5EFz*4;gs4ntJ^u%!avhIPJ)d^JCNu|%t%|-9k zP@oYF2zmKz1Wu$mBV%KTD{mwvc|)0rN(t!|!@RPJxJtY{JOqOVC<℘z?CeQ4!vT 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�hLUjhxp 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 diff --git a/examples/demo02.svg b/examples/demo02.svg index a23c9f6..130922b 100644 --- a/examples/demo02.svg +++ b/examples/demo02.svg @@ -12,6 +12,7 @@ X1 + X1 @@ -258,6 +259,7 @@ X2 + X2 @@ -287,6 +289,7 @@ X3 + X3 @@ -316,6 +319,7 @@ X4 + X4 @@ -349,6 +353,7 @@ AUTOGENERATED_F_1 + Crimp ferrule @@ -394,6 +399,7 @@ AUTOGENERATED_F_2 + Crimp ferrule From 4eff1de6f75b4bfff2737e65dbd238305fa4dc89 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Sun, 17 Oct 2021 20:01:05 +0200 Subject: [PATCH 072/155] Generate gauge string inside Cable object --- src/wireviz/DataClasses.py | 18 +++++++++++++++++- src/wireviz/Harness.py | 14 +------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index 31a4ab8..75257fd 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -6,7 +6,7 @@ from pathlib import Path from typing import Dict, List, Optional, Tuple, Union from wireviz.wv_colors import COLOR_CODES, Color, ColorMode, Colors, ColorScheme -from wireviz.wv_helper import aspect_ratio, int2tuple +from wireviz.wv_helper import aspect_ratio, awg_equiv, int2tuple, mm2_equiv # Each type alias have their legal values described in comments - validation might be implemented in the future PlainText = str # Text not containing HTML tags nor newlines @@ -277,6 +277,22 @@ class Cable: def is_autogenerated(self): return self.name.startswith(AUTOGENERATED_PREFIX) + @property + def gauge_str(self): + if not self.gauge: + return None + actual_gauge = f"{self.gauge} {self.gauge_unit}" + equivalent_gauge = "" + if self.show_equiv: + # Only convert units we actually know about, i.e. currently + # mm2 and awg --- other units _are_ technically allowed, + # and passed through as-is. + if self.gauge_unit == "mm\u00B2": + equivalent_gauge = f" ({awg_equiv(self.gauge)} AWG)" + elif self.gauge_unit.upper() == "AWG": + equivalent_gauge = f" ({mm2_equiv(self.gauge)} mm\u00B2)" + return f"{actual_gauge}{equivalent_gauge}" + def __post_init__(self) -> None: if isinstance(self.image, dict): diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index d65a667..368a972 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -45,10 +45,8 @@ from wireviz.wv_gv_html import ( remove_links, ) from wireviz.wv_helper import ( - awg_equiv, flatten2d, is_arrow, - mm2_equiv, open_file_read, open_file_write, tuplelist2tsv, @@ -203,16 +201,6 @@ class Harness: html = [] - awg_fmt = "" - if cable.show_equiv: - # Only convert units we actually know about, i.e. currently - # mm2 and awg --- other units _are_ technically allowed, - # and passed through as-is. - if cable.gauge_unit == "mm\u00B2": - awg_fmt = f" ({awg_equiv(cable.gauge)} AWG)" - elif cable.gauge_unit.upper() == "AWG": - awg_fmt = f" ({mm2_equiv(cable.gauge)} mm\u00B2)" - # fmt: off rows = [[f'{html_bgcolor(cable.bgcolor_title)}{remove_links(cable.name)}' if cable.show_name else None], @@ -226,7 +214,7 @@ class Harness: cable.spn if not isinstance(cable.spn, list) else None))], [html_line_breaks(cable.type), f'{cable.wirecount}x' if cable.show_wirecount else None, - f'{cable.gauge} {cable.gauge_unit}{awg_fmt}' if cable.gauge else None, + cable.gauge_str, '+ S' if cable.shield else None, f'{cable.length} {cable.length_unit}' if cable.length > 0 else None, translate_color(cable.color, self.options.color_mode) if cable.color else None, From bb9b43c872c344c28c0fb318b1be3249c9e86d07 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Sun, 17 Oct 2021 20:43:38 +0200 Subject: [PATCH 073/155] WIP: refactor cable node generation --- src/wireviz/Harness.py | 11 ++ src/wireviz/wv_gv_html.py | 234 +++++++++++++++++++++++++++++--------- 2 files changed, 193 insertions(+), 52 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 368a972..2593d95 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -35,6 +35,7 @@ from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_gv_html import ( gv_connector_loops, gv_node_connector, + gv_node_cable, html_bgcolor, html_bgcolor_attr, html_caption, @@ -199,6 +200,16 @@ class Harness: for cable in self.cables.values(): + gv_html = gv_node_cable(cable, self.options, pad) + dot.node( + cable.name, + label=f"<\n{gv_html}\n>", + shape="box", + # style=style, + # fillcolor=translate_color(bgcolor, "HEX"), + ) + continue + html = [] # fmt: off diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 949a818..98acc6e 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -4,8 +4,8 @@ import re from itertools import zip_longest from typing import List, Optional, Union -from wireviz.DataClasses import Color, Connector, Options -from wireviz.wv_colors import translate_color +from wireviz.DataClasses import Cable, Color, Connector, Options +from wireviz.wv_colors import translate_color, get_color_hex from wireviz.wv_helper import pn_info_string, remove_links from wireviz.wv_table_util import * # TODO: explicitly import each needed tag later @@ -21,68 +21,26 @@ def gv_node_connector(connector: Connector, harness_options: Options) -> Table: # generate all rows to be shown in the node if connector.show_name: - str_name = [f"{remove_links(connector.name)}"] - if connector.bgcolor_title: - row_name_attribs = { - "bgcolor": translate_color(connector.bgcolor_title, "HEX") - } - row_name = [Td(str_name, attribs=row_name_attribs)] - else: - row_name = [str_name] + str_name = f"{remove_links(connector.name)}" + row_name = [colored_cell(str_name, connector.bgcolor_title)] else: row_name = [] - row_pn = [ - pn_info_string(HEADER_PN, None, connector.pn), - pn_info_string(HEADER_MPN, connector.manufacturer, connector.mpn), - pn_info_string(HEADER_SPN, connector.supplier, connector.spn), - ] - row_pn = [html_line_breaks(cell) for cell in row_pn] - - if connector.color: - colorbar_attribs = { - "bgcolor": translate_color(connector.color, "HEX"), - "width": 4, - } - colorbar_cell = Td("", attribs=colorbar_attribs) - else: - colorbar_cell = None + row_pn = par_number_cell_list(connector) row_info = [ html_line_breaks(connector.type), html_line_breaks(connector.subtype), f"{connector.pincount}-pin" if connector.show_pincount else None, translate_color(connector.color, harness_options.color_mode), - colorbar_cell, + colorbar_cell(connector.color), ] - # - # {html_size_attr(image)} - if connector.image and connector.image.caption: - # import pudb; pudb.set_trace() - row_image_attribs = html_size_attr_dict(connector.image) - row_image_attribs["balign"] = "left" - row_image_attribs["sides"] = "TLR" - if connector.image.bgcolor: - row_image_attribs["bgcolor"] = translate_color( - connector.image.bgcolor, "HEX" - ) - row_caption_attribs = {"balign": "left", "sides": "BLR"} - row_image = [Td(html_image_new(connector.image), attribs=row_image_attribs)] - row_image_caption = [ - Td( - html_caption_new(connector.image), - attribs=row_caption_attribs, - flat=True, - ) - ] - else: - row_image = [] - row_image_caption = [] - row_notes = [html_line_breaks(connector.notes)] + row_image, row_image_caption = image_and_caption_cells(connector) + # row_additional_component_table = get_additional_component_table(self, connector) row_additional_component_table = None + row_notes = [html_line_breaks(connector.notes)] if connector.style != "simple": pin_tuples = zip_longest( @@ -124,7 +82,9 @@ def gv_node_connector(connector: Connector, harness_options: Options) -> Table: if connector.bgcolor: tbl.attribs["bgcolor"] = translate_color(connector.bgcolor, "HEX") elif harness_options.bgcolor_connector: - tbl.attribs["bgcolor"] = translate_color(harness_options.bgcolor_connector, "HEX") + tbl.attribs["bgcolor"] = translate_color( + harness_options.bgcolor_connector, "HEX" + ) return tbl @@ -159,6 +119,176 @@ def gv_connector_loops(connector: Connector) -> List: return loop_edges +def gv_node_cable(cable: Cable, harness_options: Options, pad) -> Table: + + if cable.show_name: + str_name = f"{remove_links(cable.name)}" + row_name = [colored_cell(str_name, cable.bgcolor_title)] + else: + row_name = [] + + row_pn = par_number_cell_list(cable) + + row_info = [ + html_line_breaks(cable.type), + f"{cable.wirecount}x" if cable.show_wirecount else None, + f"{cable.gauge_str}" if cable.gauge else None, + "+ S" if cable.shield else None, + f"{cable.length} {cable.length_unit}" if cable.length > 0 else None, + translate_color(cable.color, self.options.color_mode) if cable.color else None, + html_colorbar(cable.color), + ] + + row_image, row_image_caption = image_and_caption_cells(cable) + + row_conductor_table = str(gv_conductor_table(cable, harness_options, pad)) + + # row_additional_component_table = get_additional_component_table(self, cable) + row_additional_component_table = None + row_notes = [html_line_breaks(cable.notes)] + + rows = [ + row_name, + row_pn, + row_info, + row_conductor_table, + row_image, + row_image_caption, + row_additional_component_table, + row_notes, + ] + + tbl = nested_table(rows) + + return tbl + + +def gv_conductor_table(cable, harness_options, pad) -> Table: + + rows = [] + rows.append(Tr(Td(" "))) + + for i, (connection_color, wirelabel) in enumerate( + zip_longest(cable.colors, cable.wirelabels), 1 + ): + + # row above the wire + wireinfo = [] + if cable.show_wirenumbers: + wireinfo.append(str(i)) + colorstr = translate_color(connection_color, harness_options.color_mode) + if colorstr: + wireinfo.append(colorstr) + if cable.wirelabels: + wireinfo.append(wirelabel if wirelabel is not None else "") + + cells_above = [ + Td(f""), + Td(":".join(wireinfo)), + Td(f""), + ] + rows.append(Tr(cells_above)) + + # the wire itself + rows.append(Tr(gv_wire_cell(i, connection_color, pad))) + + rows.append(Tr(Td(" "))) + + table_attribs = { + "border": 0, + "cellspacing": 0, + "cellborder": 0, + } + tbl = Table(rows, attribs=table_attribs) + + return tbl + +def gv_wire_cell(index, color, pad) -> Td: + bgcolors = ['#000000'] + get_color_hex(color, pad=pad) + ['#000000'] + wire_inner_rows = [] + for j, bgcolor in enumerate(bgcolors[::-1]): + wire_inner_cell_attribs = { + "colspan": 3, + "cellpadding": 0, + "height": 2, + "border": 0, + "bgcolor": bgcolor if bgcolor != "" else "BK", + } + wire_inner_rows.append(Tr(Td("", attribs=wire_inner_cell_attribs))) + wire_inner_table_attribs = {"cellspacing":0, "cellborder":0, "border":0} + wire_inner_table = Table(wire_inner_rows, wire_inner_table_attribs) + wire_outer_cell_attribs = { + "colspan": 3, + "border": 0, + "cellspacing": 0, + "port": f"w{index}", + "height": 2 * len(bgcolors), + } + wire_outer_cell = Td(wire_inner_table, attribs=wire_outer_cell_attribs) + + return wire_outer_cell + + + +def colored_cell(contents, bgcolor) -> Td: + if bgcolor: + attribs = {"bgcolor": translate_color(bgcolor, "HEX")} + else: + attribs = {} + return Td(contents, attribs=attribs) + + +def colorbar_cell(color) -> Td: + if color: + colorbar_attribs = { + "bgcolor": translate_color(color, "HEX"), + "width": 4, + } + return Td("", attribs=colorbar_attribs) + else: + return None + + +def image_and_caption_cells(component): + if component.image: + row_image_attribs = html_size_attr_dict(component.image) + row_image_attribs["balign"] = "left" + if component.image.bgcolor: + row_image_attribs["bgcolor"] = translate_color( + component.image.bgcolor, "HEX" + ) + if component.image.caption: + row_image_attribs["sides"] = "TLR" + row_image = [Td(html_image_new(component.image), attribs=row_image_attribs)] + + if component.image.caption: + row_caption_attribs = {"balign": "left", "sides": "BLR"} + row_image_caption = [ + Td( + html_caption_new(component.image), + attribs=row_caption_attribs, + flat=True, + ) + ] + else: + row_image_caption = None + return (row_image, row_image_caption) + else: + return (None, None) + + +def par_number_cell_list(component) -> List[Td]: + cell_contents = [ + pn_info_string(HEADER_PN, None, component.pn), + pn_info_string(HEADER_MPN, component.manufacturer, component.mpn), + pn_info_string(HEADER_SPN, component.supplier, component.spn), + ] + if any(cell_contents): + return [Td(html_line_breaks(cell)) for cell in cell_contents] + else: + return None + + def nested_table(rows_in: List[Tr]): outer_rows = [] for row in rows_in: From 0f6ed3ae0d51c363ec663ffa990e0e7dd62df792 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Mon, 18 Oct 2021 12:20:40 +0200 Subject: [PATCH 074/155] Implement HTML indentation --- src/wireviz/Harness.py | 2 +- src/wireviz/wv_gv_html.py | 17 ++++----- src/wireviz/wv_table_util.py | 73 +++++++++++++++--------------------- 3 files changed, 40 insertions(+), 52 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 2593d95..dbde05e 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -34,8 +34,8 @@ from wireviz.wv_bom import ( from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_gv_html import ( gv_connector_loops, - gv_node_connector, gv_node_cable, + gv_node_connector, html_bgcolor, html_bgcolor_attr, html_caption, diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 98acc6e..36de073 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -5,7 +5,7 @@ from itertools import zip_longest from typing import List, Optional, Union from wireviz.DataClasses import Cable, Color, Connector, Options -from wireviz.wv_colors import translate_color, get_color_hex +from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_helper import pn_info_string, remove_links from wireviz.wv_table_util import * # TODO: explicitly import each needed tag later @@ -90,9 +90,9 @@ def gv_node_connector(connector: Connector, harness_options: Options) -> Table: def gv_pin_row(pin_index, pin_name, pin_label, pin_color, connector): - cell_pin_left = Td(pin_name, attribs={"port": f"p{pin_index+1}l"}, flat=True) - cell_pin_label = Td(pin_label, flat=True, empty_is_none=True) - cell_pin_right = Td(pin_name, attribs={"port": f"p{pin_index+1}r"}, flat=True) + cell_pin_left = Td(pin_name, attribs={"port": f"p{pin_index+1}l"}) + cell_pin_label = Td(pin_label, empty_is_none=True) + cell_pin_right = Td(pin_name, attribs={"port": f"p{pin_index+1}r"}) cells = [ cell_pin_left if connector.ports_left else None, @@ -203,8 +203,9 @@ def gv_conductor_table(cable, harness_options, pad) -> Table: return tbl + def gv_wire_cell(index, color, pad) -> Td: - bgcolors = ['#000000'] + get_color_hex(color, pad=pad) + ['#000000'] + bgcolors = ["#000000"] + get_color_hex(color, pad=pad) + ["#000000"] wire_inner_rows = [] for j, bgcolor in enumerate(bgcolors[::-1]): wire_inner_cell_attribs = { @@ -215,7 +216,7 @@ def gv_wire_cell(index, color, pad) -> Td: "bgcolor": bgcolor if bgcolor != "" else "BK", } wire_inner_rows.append(Tr(Td("", attribs=wire_inner_cell_attribs))) - wire_inner_table_attribs = {"cellspacing":0, "cellborder":0, "border":0} + wire_inner_table_attribs = {"cellspacing": 0, "cellborder": 0, "border": 0} wire_inner_table = Table(wire_inner_rows, wire_inner_table_attribs) wire_outer_cell_attribs = { "colspan": 3, @@ -229,7 +230,6 @@ def gv_wire_cell(index, color, pad) -> Td: return wire_outer_cell - def colored_cell(contents, bgcolor) -> Td: if bgcolor: attribs = {"bgcolor": translate_color(bgcolor, "HEX")} @@ -267,7 +267,6 @@ def image_and_caption_cells(component): Td( html_caption_new(component.image), attribs=row_caption_attribs, - flat=True, ) ] else: @@ -301,7 +300,7 @@ def nested_table(rows_in: List[Tr]): inner_cells.append(cell) else: inner_cell_attribs = {"balign": "left"} - inner_cells.append(Td(cell, attribs=inner_cell_attribs, flat=True)) + inner_cells.append(Td(cell, attribs=inner_cell_attribs)) inner_table_attribs = { "border": 0, diff --git a/src/wireviz/wv_table_util.py b/src/wireviz/wv_table_util.py index b5a36e6..a071f17 100644 --- a/src/wireviz/wv_table_util.py +++ b/src/wireviz/wv_table_util.py @@ -4,6 +4,8 @@ from collections.abc import Iterable from dataclasses import dataclass, field from typing import Dict, List, Optional +indent_count = 1 + class Attribs(Dict): def __repr__(self): @@ -42,23 +44,40 @@ class Tag: def tagname(self): return type(self).__name__.lower() + @property + def auto_flat(self): + if self.flat: # force flat + return True + if not _is_iterable_not_str(self.contents): # catch str, int, float, ... + if not isinstance(self.contents, Tag): # avoid recursion + return not "\n" in str(self.contents) # flatten if single line + + def indent_lines(self, lines): + if self.auto_flat: + return lines + else: + indenter = " " * indent_count + return "\n".join(f"{indenter}{line}" for line in lines.split("\n")) + def get_contents(self): - separator = "" if self.flat else "\n" - if isinstance(self.contents, Iterable) and not isinstance(self.contents, str): - return separator.join([str(c) for c in self.contents if c is not None]) + separator = "" if self.auto_flat else "\n" + if _is_iterable_not_str(self.contents): + return separator.join( + [self.indent_lines(str(c)) for c in self.contents if c is not None] + ) elif self.contents is None: return "" - else: - return str(self.contents) + else: # str, int, float, etc. + return self.indent_lines(str(self.contents)) def __repr__(self): - separator = "" if self.flat else "\n" + separator = "" if self.auto_flat else "\n" if self.contents is None and self.empty_is_none: return "" else: html = [ f"<{self.tagname}{str(self.attribs)}>", - self.get_contents(), + f"{self.get_contents()}", f"", ] return separator.join(html) @@ -70,6 +89,11 @@ class TagSingleton(Tag): return f"<{self.tagname}{str(self.attribs)} />" +def _is_iterable_not_str(inp): + # str is iterable, but should be treated as not iterable + return isinstance(inp, Iterable) and not isinstance(inp, str) + + @dataclass class Br(TagSingleton): pass @@ -77,46 +101,11 @@ class Br(TagSingleton): class Td(Tag): pass - # contents: str = "" - # - # def __init__(self, contents, *args, **kwargs): - # self.contents = contents - # super().__init__(*args, **kwargs) - # - # def __repr__(self): - # html = [ - # f"", - # self.contents, - # f"

", - # ] - # return "\n".join(html) From c8690a99c9f83f6dafbe70157b953392efd65f05 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Mon, 18 Oct 2021 13:42:51 +0200 Subject: [PATCH 075/155] WIP --- src/wireviz/DataClasses.py | 8 +- src/wireviz/Harness.py | 13 +- src/wireviz/wv_bom.py | 2 +- src/wireviz/wv_gv_html.py | 358 ++++++++++++++--------------------- src/wireviz/wv_table_util.py | 6 +- 5 files changed, 156 insertions(+), 231 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index 75257fd..147aa84 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -138,7 +138,11 @@ class AdditionalComponent: @dataclass -class Connector: +class Component(): + pass + +@dataclass +class Connector(Component): name: Designator bgcolor: Optional[Color] = None bgcolor_title: Optional[Color] = None @@ -243,7 +247,7 @@ class Connector: @dataclass -class Cable: +class Cable(Component): name: Designator bgcolor: Optional[Color] = None bgcolor_title: Optional[Color] = None diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index dbde05e..b4e73d9 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -34,15 +34,8 @@ from wireviz.wv_bom import ( from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_gv_html import ( gv_connector_loops, - gv_node_cable, - gv_node_connector, - html_bgcolor, - html_bgcolor_attr, - html_caption, - html_colorbar, - html_image, + gv_node_component, html_line_breaks, - nested_html_table, remove_links, ) from wireviz.wv_helper import ( @@ -176,7 +169,7 @@ class Harness: for connector in self.connectors.values(): # generate connector node - gv_html = gv_node_connector(connector, self.options) + gv_html = gv_node_component(connector, self.options) dot.node( connector.name, label=f"<\n{gv_html}\n>", @@ -200,7 +193,7 @@ class Harness: for cable in self.cables.values(): - gv_html = gv_node_cable(cable, self.options, pad) + gv_html = gv_node_component(cable, self.options, pad) dot.node( cable.name, label=f"<\n{gv_html}\n>", diff --git a/src/wireviz/wv_bom.py b/src/wireviz/wv_bom.py index d28e3a1..3de45d8 100644 --- a/src/wireviz/wv_bom.py +++ b/src/wireviz/wv_bom.py @@ -6,7 +6,7 @@ from typing import Any, Dict, List, Optional, Tuple, Union from wireviz.DataClasses import AdditionalComponent, Cable, Color, Connector from wireviz.wv_colors import translate_color -from wireviz.wv_gv_html import html_bgcolor_attr, html_line_breaks +from wireviz.wv_gv_html import html_line_breaks from wireviz.wv_helper import clean_whitespace, pn_info_string BOM_COLUMNS_ALWAYS = ("id", "description", "qty", "unit", "designators") diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 36de073..cb78c67 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -4,7 +4,7 @@ import re from itertools import zip_longest from typing import List, Optional, Union -from wireviz.DataClasses import Cable, Color, Connector, Options +from wireviz.DataClasses import Cable, Color, Connector, Component, Options from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_helper import pn_info_string, remove_links from wireviz.wv_table_util import * # TODO: explicitly import each needed tag later @@ -14,63 +14,80 @@ HEADER_MPN = "MPN" HEADER_SPN = "SPN" -def gv_node_connector(connector: Connector, harness_options: Options) -> Table: +def gv_node_component(component: Component, harness_options: Options, pad=None) -> Table: # If no wires connected (except maybe loop wires)? - if not (connector.ports_left or connector.ports_right): - connector.ports_left = True # Use left side pins by default + if isinstance(component, Connector): + if not (component.ports_left or component.ports_right): + component.ports_left = True # Use left side pins by default # generate all rows to be shown in the node - if connector.show_name: - str_name = f"{remove_links(connector.name)}" - row_name = [colored_cell(str_name, connector.bgcolor_title)] + if component.show_name: + str_name = f"{remove_links(component.name)}" + row_name = [colored_cell(str_name, component.bgcolor_title)] else: row_name = [] - row_pn = par_number_cell_list(connector) + row_pn = par_number_cell_list(component) - row_info = [ - html_line_breaks(connector.type), - html_line_breaks(connector.subtype), - f"{connector.pincount}-pin" if connector.show_pincount else None, - translate_color(connector.color, harness_options.color_mode), - colorbar_cell(connector.color), - ] + if isinstance(component, Connector): + row_info = [ + html_line_breaks(component.type), + html_line_breaks(component.subtype), + f"{component.pincount}-pin" if component.show_pincount else None, + translate_color(component.color, harness_options.color_mode), + colorbar_cell(component.color), + ] + elif isinstance(component, Cable): + row_info = [ + html_line_breaks(component.type), + f"{component.wirecount}x" if component.show_wirecount else None, + f"{component.gauge_str}" if component.gauge else None, + "+ S" if component.shield else None, + f"{component.length} {component.length_unit}" if component.length > 0 else None, + translate_color(component.color, harness_options.color_mode), + colorbar_cell(component.color), + ] - row_image, row_image_caption = image_and_caption_cells(connector) + row_image, row_image_caption = image_and_caption_cells(component) # row_additional_component_table = get_additional_component_table(self, connector) row_additional_component_table = None - row_notes = [html_line_breaks(connector.notes)] + row_notes = [html_line_breaks(component.notes)] - if connector.style != "simple": - pin_tuples = zip_longest( - connector.pins, - connector.pinlabels, - connector.pincolors, - ) - pin_rows = [] - for pinindex, (pinname, pinlabel, pincolor) in enumerate(pin_tuples): - if connector.should_show_pin(pinname): - pin_rows.append( - gv_pin_row(pinindex, pinname, pinlabel, pincolor, connector) - ) + if isinstance(component, Connector): + # pin table + if component.style != "simple": + pin_tuples = zip_longest( + component.pins, + component.pinlabels, + component.pincolors, + ) - table_attribs = { - "border": 0, - "cellspacing": 0, - "cellpadding": 3, - "cellborder": 1, - } - row_connector_table = str(Table(pin_rows, attribs=table_attribs)) - else: - row_connector_table = None + pin_rows = [] + for pinindex, (pinname, pinlabel, pincolor) in enumerate(pin_tuples): + if component.should_show_pin(pinname): + pin_rows.append( + gv_pin_row(pinindex, pinname, pinlabel, pincolor, component) + ) + + table_attribs = { + "border": 0, + "cellspacing": 0, + "cellpadding": 3, + "cellborder": 1, + } + row_ports = str(Table(pin_rows, attribs=table_attribs)) + else: + row_ports = None + elif isinstance(component, Cable): + row_ports = str(gv_conductor_table(component, harness_options, pad)) rows = [ row_name, row_pn, row_info, - row_connector_table, + row_ports, row_image, row_image_caption, row_additional_component_table, @@ -79,12 +96,18 @@ def gv_node_connector(connector: Connector, harness_options: Options) -> Table: tbl = nested_table(rows) - if connector.bgcolor: - tbl.attribs["bgcolor"] = translate_color(connector.bgcolor, "HEX") - elif harness_options.bgcolor_connector: - tbl.attribs["bgcolor"] = translate_color( - harness_options.bgcolor_connector, "HEX" - ) + if component.bgcolor: + tbl.attribs["bgcolor"] = translate_color(component.bgcolor, "HEX") + else: + if isinstance(component, Connector) and harness_options.bgcolor_connector: + tbl.attribs["bgcolor"] = translate_color( + harness_options.bgcolor_connector, "HEX" + ) + elif isinstance(component, Cable) and harness_options.bgcolor_cable: + tbl.attribs["bgcolor"] = translate_color( + harness_options.bgcolor_cable, "HEX" + ) + return tbl @@ -119,50 +142,6 @@ def gv_connector_loops(connector: Connector) -> List: return loop_edges -def gv_node_cable(cable: Cable, harness_options: Options, pad) -> Table: - - if cable.show_name: - str_name = f"{remove_links(cable.name)}" - row_name = [colored_cell(str_name, cable.bgcolor_title)] - else: - row_name = [] - - row_pn = par_number_cell_list(cable) - - row_info = [ - html_line_breaks(cable.type), - f"{cable.wirecount}x" if cable.show_wirecount else None, - f"{cable.gauge_str}" if cable.gauge else None, - "+ S" if cable.shield else None, - f"{cable.length} {cable.length_unit}" if cable.length > 0 else None, - translate_color(cable.color, self.options.color_mode) if cable.color else None, - html_colorbar(cable.color), - ] - - row_image, row_image_caption = image_and_caption_cells(cable) - - row_conductor_table = str(gv_conductor_table(cable, harness_options, pad)) - - # row_additional_component_table = get_additional_component_table(self, cable) - row_additional_component_table = None - row_notes = [html_line_breaks(cable.notes)] - - rows = [ - row_name, - row_pn, - row_info, - row_conductor_table, - row_image, - row_image_caption, - row_additional_component_table, - row_notes, - ] - - tbl = nested_table(rows) - - return tbl - - def gv_conductor_table(cable, harness_options, pad) -> Table: rows = [] @@ -249,26 +228,45 @@ def colorbar_cell(color) -> Td: return None +# def html_image_new(image): +# from wireviz.DataClasses import Image +# if not image: +# return None +# image_tag = Img(attribs={"scale": image.scale, "src": image.src}) +# image_table = Table(Tr(Td(image_tag, attribs=html_size_attr_dict(image))), attribs={"border": 0, "cellspacing": 0, "cellborder": 0}) +# return image_table + def image_and_caption_cells(component): if component.image: - row_image_attribs = html_size_attr_dict(component.image) - row_image_attribs["balign"] = "left" - if component.image.bgcolor: - row_image_attribs["bgcolor"] = translate_color( - component.image.bgcolor, "HEX" - ) - if component.image.caption: - row_image_attribs["sides"] = "TLR" - row_image = [Td(html_image_new(component.image), attribs=row_image_attribs)] + # outer_cell_attribs = {} + # outer_cell_attribs["balign"] = "left" + # outer_cell_attribs["bgcolor"] = translate_color( + # component.image.bgcolor, "HEX" + # ) + # if component.image.caption: + # outer_cell_attribs["sides"] = "TLR" + + image_tag = Img(attribs={"scale": component.image.scale, "src": component.image.src}) + cell_attribs = html_size_attr_dict(component.image) + image_cell = Td(image_tag, attribs=cell_attribs) + image_row = Tr(image_cell) + image_table_attribs = { + "border": 0, + "cellspacing": 0, + "cellpadding": 0, + "cellborder": 1, + } + image_table = Table(image_row, attribs=image_table_attribs) + outer_cell = Td(image_table) + # return: + row_image = outer_cell if component.image.caption: - row_caption_attribs = {"balign": "left", "sides": "BLR"} - row_image_caption = [ - Td( - html_caption_new(component.image), - attribs=row_caption_attribs, - ) - ] + row_caption_attribs = {"balign": "left", "sides": "BLR", "id": "td_caption"} + row_image_caption = Td( + html_caption_new(component.image), + attribs=row_caption_attribs, + ) else: row_image_caption = None return (row_image, row_image_caption) @@ -288,12 +286,14 @@ def par_number_cell_list(component) -> List[Td]: return None -def nested_table(rows_in: List[Tr]): +def nested_table(rows_in: List[Tr]) -> Table: outer_rows = [] for row in rows_in: if isinstance(row, List) and len(row) > 0 and any(row): + # row is a nested list # remove rows which are none row_no_empty = [cell for cell in row if cell is not None] + # if row item is Td, append directly; else convert to Td inner_cells = [] for cell in row_no_empty: if isinstance(cell, Td): @@ -311,8 +311,13 @@ def nested_table(rows_in: List[Tr]): if len(inner_cells) > 0: inner_table = Table(Tr(inner_cells), attribs=inner_table_attribs) outer_rows.append(Tr(Td(inner_table))) - elif row is not None and any(row): - outer_rows.append(Tr(Td(row))) + elif row is not None: + if isinstance(row, Iterable) and not any(row): + continue + # row is a single item + # if item is Td, append directly; else convert to Td + cell = row if isinstance(row, Td) else Td(row) + outer_rows.append(Tr(cell)) if len(outer_rows) == 0: outer_rows = Tr(Td("")) # Generate empty cell to avoid GraphViz errors outer_table_attribs = {"border": 0, "cellspacing": 0, "cellpadding": 0} @@ -321,106 +326,25 @@ def nested_table(rows_in: List[Tr]): return outer_table -def nested_html_table( - rows: List[Union[str, List[Optional[str]], None]], table_attrs: str = "" -) -> str: - # input: list, each item may be scalar or list - # output: a parent table with one child table per parent item that is list, and one cell per parent item that is scalar - # purpose: create the appearance of one table, where cell widths are independent between rows - # attributes in any leading inside a list are injected into to the preceeding
tag - html = [] - html.append( - f'' - ) - - num_rows = 0 - for row in rows: - if isinstance(row, List): - if len(row) > 0 and any(row): - html.append(" ") - num_rows = num_rows + 1 - elif row is not None: - html.append(" ") - num_rows = num_rows + 1 - if num_rows == 0: # empty table - # generate empty cell to avoid GraphViz errors - html.append("") - html.append("
") - # fmt: off - html.append(' ') - # fmt: on - for cell in row: - if cell is not None: - # Inject attributes to the preceeding '.replace(">
tag where needed - # fmt: off - html.append(f' {cell}
") - html.append("
") - html.append(f" {row}") - html.append("
") - return html -def html_bgcolor_attr(color: Color) -> str: - """Return attributes for bgcolor or '' if no color.""" - return f' bgcolor="{translate_color(color, "HEX")}"' if color else "" +# def html_image(image): +# from wireviz.DataClasses import Image +# if not image: +# return None +# # The leading attributes belong to the preceeding tag. See where used below. +# html = f'{html_size_attr(image)}>' +# if image.fixedsize: +# # Close the preceeding tag and enclose the image cell in a table without +# # borders to avoid narrow borders when the fixed width < the node width. +# html = f"""> +# +# +#
+# """ +# return f""" str: - """Return
attributes prefix for bgcolor or '' if no color.""" - return f"" if color else "" - - -def html_colorbar(color: Color) -> str: - """Return attributes prefix for bgcolor and minimum width or None if no color.""" - return html_bgcolor(color, ' width="4"') if color else None - - -def html_image(image): - from wireviz.DataClasses import Image - - if not image: - return None - # The leading attributes belong to the preceeding tag. See where used below. - html = f'{html_size_attr(image)}>' - if image.fixedsize: - # Close the preceeding tag and enclose the image cell in a table without - # borders to avoid narrow borders when the fixed width < the node width. - html = f"""> - - -
- """ - return f"""' - if image.fixedsize: - # Close the preceeding tag and enclose the image cell in a table without - # borders to avoid narrow borders when the fixed width < the node width. - html = f""" - - -
{html}
- """ - return f"{html_bgcolor_attr(image.bgcolor)}{html}" - - -def html_caption(image): - from wireviz.DataClasses import Image - - return ( - f'{html_line_breaks(image.caption)}' - if image and image.caption - else None - ) def html_caption_new(image): @@ -429,19 +353,19 @@ def html_caption_new(image): return f"{html_line_breaks(image.caption)}" if image and image.caption else None -def html_size_attr(image): - from wireviz.DataClasses import Image - - # Return Graphviz HTML attributes to specify minimum or fixed size of a TABLE or TD object - return ( - ( - (f' width="{image.width}"' if image.width else "") - + (f' height="{image.height}"' if image.height else "") - + (' fixedsize="true"' if image.fixedsize else "") - ) - if image - else "" - ) +# def html_size_attr(image): +# from wireviz.DataClasses import Image +# +# # Return Graphviz HTML attributes to specify minimum or fixed size of a TABLE or TD object +# return ( +# ( +# (f' width="{image.width}"' if image.width else "") +# + (f' height="{image.height}"' if image.height else "") +# + (' fixedsize="true"' if image.fixedsize else "") +# ) +# if image +# else "" +# ) def html_size_attr_dict(image): diff --git a/src/wireviz/wv_table_util.py b/src/wireviz/wv_table_util.py index a071f17..a0177de 100644 --- a/src/wireviz/wv_table_util.py +++ b/src/wireviz/wv_table_util.py @@ -23,7 +23,7 @@ class Attribs(Dict): @dataclass class Tag: - contents: str + contents: str = None attribs: Attribs = field(default_factory=Attribs) flat: bool = False empty_is_none: bool = False @@ -99,6 +99,10 @@ class Br(TagSingleton): pass +class Img(TagSingleton): + pass + + class Td(Tag): pass From d993f5868591c1c2da8f9e7dc7ec2324781fe3f8 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Mon, 18 Oct 2021 17:23:15 +0200 Subject: [PATCH 076/155] More WIP --- src/wireviz/DataClasses.py | 3 +- src/wireviz/wv_gv_html.py | 229 +++++++++++++++++++---------------- src/wireviz/wv_table_util.py | 6 +- 3 files changed, 130 insertions(+), 108 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index 147aa84..b20f46d 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -138,9 +138,10 @@ class AdditionalComponent: @dataclass -class Component(): +class Component: pass + @dataclass class Connector(Component): name: Designator diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index cb78c67..c252398 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -4,7 +4,7 @@ import re from itertools import zip_longest from typing import List, Optional, Union -from wireviz.DataClasses import Cable, Color, Connector, Component, Options +from wireviz.DataClasses import Cable, Color, Component, Connector, Options from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_helper import pn_info_string, remove_links from wireviz.wv_table_util import * # TODO: explicitly import each needed tag later @@ -14,7 +14,9 @@ HEADER_MPN = "MPN" HEADER_SPN = "SPN" -def gv_node_component(component: Component, harness_options: Options, pad=None) -> Table: +def gv_node_component( + component: Component, harness_options: Options, pad=None +) -> Table: # If no wires connected (except maybe loop wires)? if isinstance(component, Connector): if not (component.ports_left or component.ports_right): @@ -23,14 +25,14 @@ def gv_node_component(component: Component, harness_options: Options, pad=None) # generate all rows to be shown in the node if component.show_name: str_name = f"{remove_links(component.name)}" - row_name = [colored_cell(str_name, component.bgcolor_title)] + line_name = colored_cell(str_name, component.bgcolor_title) else: - row_name = [] + line_name = None - row_pn = par_number_cell_list(component) + line_pn = part_number_str_list(component) if isinstance(component, Connector): - row_info = [ + line_info = [ html_line_breaks(component.type), html_line_breaks(component.subtype), f"{component.pincount}-pin" if component.show_pincount else None, @@ -38,22 +40,23 @@ def gv_node_component(component: Component, harness_options: Options, pad=None) colorbar_cell(component.color), ] elif isinstance(component, Cable): - row_info = [ + line_info = [ html_line_breaks(component.type), f"{component.wirecount}x" if component.show_wirecount else None, f"{component.gauge_str}" if component.gauge else None, "+ S" if component.shield else None, - f"{component.length} {component.length_unit}" if component.length > 0 else None, + f"{component.length} {component.length_unit}" + if component.length > 0 + else None, translate_color(component.color, harness_options.color_mode), colorbar_cell(component.color), ] - row_image, row_image_caption = image_and_caption_cells(component) - - # row_additional_component_table = get_additional_component_table(self, connector) - row_additional_component_table = None - row_notes = [html_line_breaks(component.notes)] + line_image, line_image_caption = image_and_caption_cells(component) + # line_additional_component_table = get_additional_component_table(self, connector) + line_additional_component_table = None + line_notes = [html_line_breaks(component.notes)] if isinstance(component, Connector): # pin table @@ -77,24 +80,26 @@ def gv_node_component(component: Component, harness_options: Options, pad=None) "cellpadding": 3, "cellborder": 1, } - row_ports = str(Table(pin_rows, attribs=table_attribs)) + line_ports = Table(pin_rows, attribs=table_attribs) else: - row_ports = None + line_ports = None elif isinstance(component, Cable): - row_ports = str(gv_conductor_table(component, harness_options, pad)) + line_ports = gv_conductor_table(component, harness_options, pad) - rows = [ - row_name, - row_pn, - row_info, - row_ports, - row_image, - row_image_caption, - row_additional_component_table, - row_notes, + lines = [ + line_name, + line_pn, + line_info, + line_ports, + line_image, + line_image_caption, + line_additional_component_table, + line_notes, ] - tbl = nested_table(rows) + cell_lists = [make_list_of_cells(line) for line in lines] + + tbl = nested_table(cell_lists) if component.bgcolor: tbl.attribs["bgcolor"] = translate_color(component.bgcolor, "HEX") @@ -108,10 +113,64 @@ def gv_node_component(component: Component, harness_options: Options, pad=None) harness_options.bgcolor_cable, "HEX" ) + return tbl + + +def nested_table(cell_lists: List[Td]) -> Table: + outer_table_attribs = { + "border": 0, + "cellspacing": 0, + "cellpadding": 0, + } + inner_table_attribs = { + "border": 0, + "cellspacing": 0, + "cellpadding": 3, + "cellborder": 1, + } + + rows = [] + for lst in cell_lists: + if len(lst) == 0: + continue # no cells in list + cells = [item for item in lst if item.contents is not None] + if len(cells) == 0: + continue # no cells in list that are not None + if ( + len(cells) == 1 + and isinstance(cells[0].contents, Table) + and not "!" in cells[0].contents.attribs.get("id", "") + ): + # cell content is already a table, no need to re-wrap it; + # unless explicitly asked to by a "!" in the ID field + # as used by image_and_caption_cells() + inner_table = cells[0].contents + else: + # nest cell content inside a table + inner_table = Table(Tr(cells), attribs=inner_table_attribs) + rows.append(Tr(Td(inner_table))) + if len(rows) == 0: # create dummy row to avoid GraphViz errors due to empty + rows = Tr(Td("")) + tbl = Table(rows, attribs=outer_table_attribs) return tbl +def make_list_of_cells(inp) -> List[Td]: + # inp may be List, + if isinstance(inp, List): + # ensure all list items are Td + list_out = [item if isinstance(item, Td) else Td(item) for item in inp] + return list_out + else: + if inp is None: + return [] + if isinstance(inp, Td): + return [inp] + else: + return [Td(inp)] + + def gv_pin_row(pin_index, pin_name, pin_label, pin_color, connector): cell_pin_left = Td(pin_name, attribs={"port": f"p{pin_index+1}l"}) cell_pin_label = Td(pin_label, empty_is_none=True) @@ -236,98 +295,58 @@ def colorbar_cell(color) -> Td: # image_table = Table(Tr(Td(image_tag, attribs=html_size_attr_dict(image))), attribs={"border": 0, "cellspacing": 0, "cellborder": 0}) # return image_table -def image_and_caption_cells(component): - if component.image: - # outer_cell_attribs = {} - # outer_cell_attribs["balign"] = "left" - # outer_cell_attribs["bgcolor"] = translate_color( - # component.image.bgcolor, "HEX" - # ) - # if component.image.caption: - # outer_cell_attribs["sides"] = "TLR" - image_tag = Img(attribs={"scale": component.image.scale, "src": component.image.src}) - cell_attribs = html_size_attr_dict(component.image) - image_cell = Td(image_tag, attribs=cell_attribs) - image_row = Tr(image_cell) - image_table_attribs = { - "border": 0, - "cellspacing": 0, - "cellpadding": 0, - "cellborder": 1, - } - image_table = Table(image_row, attribs=image_table_attribs) - outer_cell = Td(image_table) - # return: - row_image = outer_cell - - if component.image.caption: - row_caption_attribs = {"balign": "left", "sides": "BLR", "id": "td_caption"} - row_image_caption = Td( - html_caption_new(component.image), - attribs=row_caption_attribs, - ) - else: - row_image_caption = None - return (row_image, row_image_caption) - else: +def image_and_caption_cells(component: Component) -> (Td, Td): + if not component.image: return (None, None) + image_tag = Img( + attribs={"scale": component.image.scale, "src": component.image.src} + ) + image_cell_inner = Td(image_tag, flat=True) + if component.image.fixedsize: + # further nest the image in a table with width/height/fixedsize parameters, and place that table in a cell + inner_cell_attribs = html_size_attr_dict(component.image) + image_cell_inner.attribs = Attribs(inner_cell_attribs) + image_cell = Td( + Table( + Tr(image_cell_inner), + attribs={"border": 0, "cellspacing": 0, "cellborder": 0, "id": "!"}, + ) + ) + else: + image_cell = image_cell_inner -def par_number_cell_list(component) -> List[Td]: + outer_cell_attribs = {} + outer_cell_attribs["balign"] = "left" + if component.image.bgcolor: + outer_cell_attribs["bgcolor"] = translate_color(component.image.bgcolor, "HEX") + if component.image.caption: + outer_cell_attribs["sides"] = "TLR" + image_cell.attribs = Attribs(outer_cell_attribs) + + if component.image.caption: + caption_cell_attribs = {"balign": "left", "sides": "BLR", "id": "td_caption"} + caption_cell = Td( + html_caption_new(component.image), attribs=caption_cell_attribs + ) + else: + caption_cell = None + return (image_cell, caption_cell) + + +def part_number_str_list(component: Component) -> List[str]: cell_contents = [ pn_info_string(HEADER_PN, None, component.pn), pn_info_string(HEADER_MPN, component.manufacturer, component.mpn), pn_info_string(HEADER_SPN, component.supplier, component.spn), ] if any(cell_contents): - return [Td(html_line_breaks(cell)) for cell in cell_contents] + return [html_line_breaks(cell) for cell in cell_contents] else: return None -def nested_table(rows_in: List[Tr]) -> Table: - outer_rows = [] - for row in rows_in: - if isinstance(row, List) and len(row) > 0 and any(row): - # row is a nested list - # remove rows which are none - row_no_empty = [cell for cell in row if cell is not None] - # if row item is Td, append directly; else convert to Td - inner_cells = [] - for cell in row_no_empty: - if isinstance(cell, Td): - inner_cells.append(cell) - else: - inner_cell_attribs = {"balign": "left"} - inner_cells.append(Td(cell, attribs=inner_cell_attribs)) - - inner_table_attribs = { - "border": 0, - "cellspacing": 0, - "cellpadding": 3, - "cellborder": 1, - } - if len(inner_cells) > 0: - inner_table = Table(Tr(inner_cells), attribs=inner_table_attribs) - outer_rows.append(Tr(Td(inner_table))) - elif row is not None: - if isinstance(row, Iterable) and not any(row): - continue - # row is a single item - # if item is Td, append directly; else convert to Td - cell = row if isinstance(row, Td) else Td(row) - outer_rows.append(Tr(cell)) - if len(outer_rows) == 0: - outer_rows = Tr(Td("")) # Generate empty cell to avoid GraphViz errors - outer_table_attribs = {"border": 0, "cellspacing": 0, "cellpadding": 0} - outer_table = Table(outer_rows, attribs=outer_table_attribs) - - return outer_table - - - - # def html_image(image): # from wireviz.DataClasses import Image # if not image: @@ -345,8 +364,6 @@ def nested_table(rows_in: List[Tr]) -> Table: # return f"""", ] - return separator.join(html) + html_joined = separator.join(html) + return html_joined @dataclass From 75ad23ab428e6fe3b2d7d436b124de1d97e7ad86 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Mon, 18 Oct 2021 17:29:25 +0200 Subject: [PATCH 077/155] Remove old stuff, slightly simplify code --- src/wireviz/wv_gv_html.py | 105 +++++++++++--------------------------- 1 file changed, 29 insertions(+), 76 deletions(-) diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index c252398..9927501 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -116,6 +116,21 @@ def gv_node_component( return tbl +def make_list_of_cells(inp) -> List[Td]: + # inp may be List, + if isinstance(inp, List): + # ensure all list items are Td + list_out = [item if isinstance(item, Td) else Td(item) for item in inp] + return list_out + else: + if inp is None: + return [] + if isinstance(inp, Td): + return [inp] + else: + return [Td(inp)] + + def nested_table(cell_lists: List[Td]) -> Table: outer_table_attribs = { "border": 0, @@ -156,21 +171,6 @@ def nested_table(cell_lists: List[Td]) -> Table: return tbl -def make_list_of_cells(inp) -> List[Td]: - # inp may be List, - if isinstance(inp, List): - # ensure all list items are Td - list_out = [item if isinstance(item, Td) else Td(item) for item in inp] - return list_out - else: - if inp is None: - return [] - if isinstance(inp, Td): - return [inp] - else: - return [Td(inp)] - - def gv_pin_row(pin_index, pin_name, pin_label, pin_color, connector): cell_pin_left = Td(pin_name, attribs={"port": f"p{pin_index+1}l"}) cell_pin_label = Td(pin_label, empty_is_none=True) @@ -276,6 +276,18 @@ def colored_cell(contents, bgcolor) -> Td: return Td(contents, attribs=attribs) +def part_number_str_list(component: Component) -> List[str]: + cell_contents = [ + pn_info_string(HEADER_PN, None, component.pn), + pn_info_string(HEADER_MPN, component.manufacturer, component.mpn), + pn_info_string(HEADER_SPN, component.supplier, component.spn), + ] + if any(cell_contents): + return [html_line_breaks(cell) for cell in cell_contents] + else: + return None + + def colorbar_cell(color) -> Td: if color: colorbar_attribs = { @@ -287,15 +299,6 @@ def colorbar_cell(color) -> Td: return None -# def html_image_new(image): -# from wireviz.DataClasses import Image -# if not image: -# return None -# image_tag = Img(attribs={"scale": image.scale, "src": image.src}) -# image_table = Table(Tr(Td(image_tag, attribs=html_size_attr_dict(image))), attribs={"border": 0, "cellspacing": 0, "cellborder": 0}) -# return image_table - - def image_and_caption_cells(component: Component) -> (Td, Td): if not component.image: return (None, None) @@ -326,65 +329,15 @@ def image_and_caption_cells(component: Component) -> (Td, Td): image_cell.attribs = Attribs(outer_cell_attribs) if component.image.caption: - caption_cell_attribs = {"balign": "left", "sides": "BLR", "id": "td_caption"} caption_cell = Td( - html_caption_new(component.image), attribs=caption_cell_attribs + f"{html_line_breaks(component.image.caption)}", + attribs={"balign": "left", "sides": "BLR", "id": "td_caption"}, ) else: caption_cell = None return (image_cell, caption_cell) -def part_number_str_list(component: Component) -> List[str]: - cell_contents = [ - pn_info_string(HEADER_PN, None, component.pn), - pn_info_string(HEADER_MPN, component.manufacturer, component.mpn), - pn_info_string(HEADER_SPN, component.supplier, component.spn), - ] - if any(cell_contents): - return [html_line_breaks(cell) for cell in cell_contents] - else: - return None - - -# def html_image(image): -# from wireviz.DataClasses import Image -# if not image: -# return None -# # The leading attributes belong to the preceeding tag. See where used below. -# html = f'{html_size_attr(image)}>' -# if image.fixedsize: -# # Close the preceeding tag and enclose the image cell in a table without -# # borders to avoid narrow borders when the fixed width < the node width. -# html = f"""> -#
-# -#
-# """ -# return f""" Date: Mon, 18 Oct 2021 17:52:07 +0200 Subject: [PATCH 078/155] Outsource `gv_pin_table()`, simplify padding --- src/wireviz/DataClasses.py | 4 ++ src/wireviz/Harness.py | 30 ++------------ src/wireviz/wv_gv_html.py | 85 +++++++++++++++++++------------------- 3 files changed, 50 insertions(+), 69 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index b20f46d..7b238a3 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -60,6 +60,10 @@ class Options: color_mode: ColorMode = "SHORT" mini_bom_mode: bool = True template_separator: str = "." + _pad: int = 0 + # TODO: resolve template and image paths during rendering, not during YAML parsing + _template_paths: [List] = field(default_factory=list) + _image_paths: [List] = field(default_factory=list) def __post_init__(self): if not self.bgcolor_node: diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index b4e73d9..a7c2f4e 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -191,9 +191,11 @@ class Harness: for colorstr in cable.colors ) + self.options._pad = pad + for cable in self.cables.values(): - gv_html = gv_node_component(cable, self.options, pad) + gv_html = gv_node_component(cable, self.options) dot.node( cable.name, label=f"<\n{gv_html}\n>", @@ -205,32 +207,6 @@ class Harness: html = [] - # fmt: off - rows = [[f'{html_bgcolor(cable.bgcolor_title)}{remove_links(cable.name)}' - if cable.show_name else None], - [pn_info_string(HEADER_PN, None, - remove_links(cable.pn)) if not isinstance(cable.pn, list) else None, - html_line_breaks(pn_info_string(HEADER_MPN, - cable.manufacturer if not isinstance(cable.manufacturer, list) else None, - cable.mpn if not isinstance(cable.mpn, list) else None)), - html_line_breaks(pn_info_string(HEADER_SPN, - cable.supplier if not isinstance(cable.supplier, list) else None, - cable.spn if not isinstance(cable.spn, list) else None))], - [html_line_breaks(cable.type), - f'{cable.wirecount}x' if cable.show_wirecount else None, - cable.gauge_str, - '+ S' if cable.shield else None, - f'{cable.length} {cable.length_unit}' if cable.length > 0 else None, - translate_color(cable.color, self.options.color_mode) if cable.color else None, - html_colorbar(cable.color)], - '', - [html_image(cable.image)], - [html_caption(cable.image)]] - # fmt: on - - rows.extend(get_additional_component_table(self, cable)) - rows.append([html_line_breaks(cable.notes)]) - html.extend(nested_html_table(rows, html_bgcolor_attr(cable.bgcolor))) wirehtml = [] # conductor table diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 9927501..002c8ac 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -53,38 +53,17 @@ def gv_node_component( ] line_image, line_image_caption = image_and_caption_cells(component) - # line_additional_component_table = get_additional_component_table(self, connector) line_additional_component_table = None line_notes = [html_line_breaks(component.notes)] if isinstance(component, Connector): - # pin table if component.style != "simple": - pin_tuples = zip_longest( - component.pins, - component.pinlabels, - component.pincolors, - ) - - pin_rows = [] - for pinindex, (pinname, pinlabel, pincolor) in enumerate(pin_tuples): - if component.should_show_pin(pinname): - pin_rows.append( - gv_pin_row(pinindex, pinname, pinlabel, pincolor, component) - ) - - table_attribs = { - "border": 0, - "cellspacing": 0, - "cellpadding": 3, - "cellborder": 1, - } - line_ports = Table(pin_rows, attribs=table_attribs) + line_ports = gv_pin_table(component) else: line_ports = None elif isinstance(component, Cable): - line_ports = gv_conductor_table(component, harness_options, pad) + line_ports = gv_conductor_table(component, harness_options) lines = [ line_name, @@ -97,9 +76,7 @@ def gv_node_component( line_notes, ] - cell_lists = [make_list_of_cells(line) for line in lines] - - tbl = nested_table(cell_lists) + tbl = nested_table(lines) if component.bgcolor: tbl.attribs["bgcolor"] = translate_color(component.bgcolor, "HEX") @@ -131,19 +108,8 @@ def make_list_of_cells(inp) -> List[Td]: return [Td(inp)] -def nested_table(cell_lists: List[Td]) -> Table: - outer_table_attribs = { - "border": 0, - "cellspacing": 0, - "cellpadding": 0, - } - inner_table_attribs = { - "border": 0, - "cellspacing": 0, - "cellpadding": 3, - "cellborder": 1, - } - +def nested_table(lines: List[Td]) -> Table: + cell_lists = [make_list_of_cells(line) for line in lines] rows = [] for lst in cell_lists: if len(lst) == 0: @@ -162,16 +128,51 @@ def nested_table(cell_lists: List[Td]) -> Table: inner_table = cells[0].contents else: # nest cell content inside a table + inner_table_attribs = { + "border": 0, + "cellspacing": 0, + "cellpadding": 3, + "cellborder": 1, + } inner_table = Table(Tr(cells), attribs=inner_table_attribs) rows.append(Tr(Td(inner_table))) if len(rows) == 0: # create dummy row to avoid GraphViz errors due to empty rows = Tr(Td("")) + outer_table_attribs = { + "border": 0, + "cellspacing": 0, + "cellpadding": 0, + } tbl = Table(rows, attribs=outer_table_attribs) return tbl -def gv_pin_row(pin_index, pin_name, pin_label, pin_color, connector): +def gv_pin_table(component) -> Table: + pin_tuples = zip_longest( + component.pins, + component.pinlabels, + component.pincolors, + ) + + pin_rows = [] + for pinindex, (pinname, pinlabel, pincolor) in enumerate(pin_tuples): + if component.should_show_pin(pinname): + pin_rows.append( + gv_pin_row(pinindex, pinname, pinlabel, pincolor, component) + ) + + table_attribs = { + "border": 0, + "cellspacing": 0, + "cellpadding": 3, + "cellborder": 1, + } + + return Table(pin_rows, attribs=table_attribs) + + +def gv_pin_row(pin_index, pin_name, pin_label, pin_color, connector) -> Tr: cell_pin_left = Td(pin_name, attribs={"port": f"p{pin_index+1}l"}) cell_pin_label = Td(pin_label, empty_is_none=True) cell_pin_right = Td(pin_name, attribs={"port": f"p{pin_index+1}r"}) @@ -201,7 +202,7 @@ def gv_connector_loops(connector: Connector) -> List: return loop_edges -def gv_conductor_table(cable, harness_options, pad) -> Table: +def gv_conductor_table(cable, harness_options) -> Table: rows = [] rows.append(Tr(Td(" "))) @@ -228,7 +229,7 @@ def gv_conductor_table(cable, harness_options, pad) -> Table: rows.append(Tr(cells_above)) # the wire itself - rows.append(Tr(gv_wire_cell(i, connection_color, pad))) + rows.append(Tr(gv_wire_cell(i, connection_color, harness_options._pad))) rows.append(Tr(Td(" "))) From 05ad6b0ec7ecca95f1f30c19e7eeb71eb5cc6e3e Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Mon, 18 Oct 2021 18:08:09 +0200 Subject: [PATCH 079/155] Add TODOs --- src/wireviz/Harness.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index a7c2f4e..4b36d96 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -194,8 +194,11 @@ class Harness: self.options._pad = pad for cable in self.cables.values(): - + # generate cable node gv_html = gv_node_component(cable, self.options) + # TODO: PN info for bundles (per wire) + # shield + # dot.node( cable.name, label=f"<\n{gv_html}\n>", @@ -205,6 +208,8 @@ class Harness: ) continue + # TODO: connection edges + html = [] From 2999878f0d4b0cdea9987605f6ee3c4e4d5dcbc4 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Mon, 18 Oct 2021 18:20:19 +0200 Subject: [PATCH 080/155] Outsource `set_dot_basics()` and `apply_dot_tweaks()` --- src/wireviz/Harness.py | 90 ++----------------------------------- src/wireviz/wv_gv_html.py | 95 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 98 insertions(+), 87 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 4b36d96..1cc1ec6 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -33,10 +33,12 @@ from wireviz.wv_bom import ( ) from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_gv_html import ( + apply_dot_tweaks, gv_connector_loops, gv_node_component, html_line_breaks, remove_links, + set_dot_basics, ) from wireviz.wv_helper import ( flatten2d, @@ -145,27 +147,7 @@ class Harness: def create_graph(self) -> Graph: dot = Graph() - dot.body.append(f"// Graph generated by {APP_NAME} {__version__}") - dot.body.append(f"// {APP_URL}") - dot.attr( - "graph", - rankdir="LR", - ranksep="2", - bgcolor=wv_colors.translate_color(self.options.bgcolor, "HEX"), - nodesep="0.33", - fontname=self.options.fontname, - ) - dot.attr( - "node", - shape="none", - width="0", - height="0", - margin="0", # Actual size of the node is entirely determined by the label. - style="filled", - fillcolor=wv_colors.translate_color(self.options.bgcolor_node, "HEX"), - fontname=self.options.fontname, - ) - dot.attr("edge", style="bold", fontname=self.options.fontname) + set_dot_basics(dot, self.options) for connector in self.connectors.values(): # generate connector node @@ -212,7 +194,6 @@ class Harness: html = [] - wirehtml = [] # conductor table wirehtml.append('
') @@ -405,70 +386,7 @@ class Harness: fillcolor=translate_color(bgcolor, "HEX"), ) - def typecheck(name: str, value: Any, expect: type) -> None: - if not isinstance(value, expect): - raise Exception( - f"Unexpected value type of {name}: Expected {expect}, got {type(value)}\n{value}" - ) - - # TODO?: Differ between override attributes and HTML? - if self.tweak.override is not None: - typecheck("tweak.override", self.tweak.override, dict) - for k, d in self.tweak.override.items(): - typecheck(f"tweak.override.{k} key", k, str) - typecheck(f"tweak.override.{k} value", d, dict) - for a, v in d.items(): - typecheck(f"tweak.override.{k}.{a} key", a, str) - typecheck(f"tweak.override.{k}.{a} value", v, (str, type(None))) - - # Override generated attributes of selected entries matching tweak.override. - for i, entry in enumerate(dot.body): - if isinstance(entry, str): - # Find a possibly quoted keyword after leading TAB(s) and followed by [ ]. - match = re.match( - r'^\t*(")?((?(1)[^"]|[^ "])+)(?(1)") \[.*\]$', entry, re.S - ) - keyword = match and match[2] - if keyword in self.tweak.override.keys(): - for attr, value in self.tweak.override[keyword].items(): - if value is None: - entry, n_subs = re.subn( - f'( +)?{attr}=("[^"]*"|[^] ]*)(?(1)| *)', "", entry - ) - if n_subs < 1: - print( - f"Harness.create_graph() warning: {attr} not found in {keyword}!" - ) - elif n_subs > 1: - print( - f"Harness.create_graph() warning: {attr} removed {n_subs} times in {keyword}!" - ) - continue - - if len(value) == 0 or " " in value: - value = value.replace('"', r"\"") - value = f'"{value}"' - entry, n_subs = re.subn( - f'{attr}=("[^"]*"|[^] ]*)', f"{attr}={value}", entry - ) - if n_subs < 1: - # If attr not found, then append it - entry = re.sub(r"\]$", f" {attr}={value}]", entry) - elif n_subs > 1: - print( - f"Harness.create_graph() warning: {attr} overridden {n_subs} times in {keyword}!" - ) - - dot.body[i] = entry - - if self.tweak.append is not None: - if isinstance(self.tweak.append, list): - for i, element in enumerate(self.tweak.append, 1): - typecheck(f"tweak.append[{i}]", element, str) - dot.body.extend(self.tweak.append) - else: - typecheck("tweak.append", self.tweak.append, str) - dot.body.append(self.tweak.append) + apply_dot_tweaks(dot, self.tweak) for mate in self.mates: if mate.shape[0] == "<" and mate.shape[-1] == ">": diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 002c8ac..22acf00 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -2,8 +2,9 @@ import re from itertools import zip_longest -from typing import List, Optional, Union +from typing import Any, List, Optional, Union +from wireviz import APP_NAME, APP_URL, __version__ from wireviz.DataClasses import Cable, Color, Component, Connector, Options from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_helper import pn_info_string, remove_links @@ -356,3 +357,95 @@ def html_size_attr_dict(image): def html_line_breaks(inp): return remove_links(inp).replace("\n", "
") if isinstance(inp, str) else inp + + +def set_dot_basics(dot, options): + dot.body.append(f"// Graph generated by {APP_NAME} {__version__}") + dot.body.append(f"// {APP_URL}") + dot.attr( + "graph", + rankdir="LR", + ranksep="2", + bgcolor=translate_color(options.bgcolor, "HEX"), + nodesep="0.33", + fontname=options.fontname, + ) + dot.attr( + "node", + shape="none", + width="0", + height="0", + margin="0", # Actual size of the node is entirely determined by the label. + style="filled", + fillcolor=translate_color(options.bgcolor_node, "HEX"), + fontname=options.fontname, + ) + dot.attr("edge", style="bold", fontname=options.fontname) + + +def apply_dot_tweaks(dot, tweak): + def typecheck(name: str, value: Any, expect: type) -> None: + if not isinstance(value, expect): + raise Exception( + f"Unexpected value type of {name}: Expected {expect}, got {type(value)}\n{value}" + ) + + # TODO?: Differ between override attributes and HTML? + if tweak.override is not None: + typecheck("tweak.override", tweak.override, dict) + for k, d in tweak.override.items(): + typecheck(f"tweak.override.{k} key", k, str) + typecheck(f"tweak.override.{k} value", d, dict) + for a, v in d.items(): + typecheck(f"tweak.override.{k}.{a} key", a, str) + typecheck(f"tweak.override.{k}.{a} value", v, (str, type(None))) + + # Override generated attributes of selected entries matching tweak.override. + for i, entry in enumerate(dot.body): + if not isinstance(entry, str): + continue + # Find a possibly quoted keyword after leading TAB(s) and followed by [ ]. + match = re.match(r'^\t*(")?((?(1)[^"]|[^ "])+)(?(1)") \[.*\]$', entry, re.S) + keyword = match and match[2] + if not keyword in tweak.override.keys(): + continue + + for attr, value in tweak.override[keyword].items(): + if value is None: + entry, n_subs = re.subn( + f'( +)?{attr}=("[^"]*"|[^] ]*)(?(1)| *)', "", entry + ) + if n_subs < 1: + print( + f"Harness.create_graph() warning: {attr} not found in {keyword}!" + ) + elif n_subs > 1: + print( + f"Harness.create_graph() warning: {attr} removed {n_subs} times in {keyword}!" + ) + continue + + if len(value) == 0 or " " in value: + value = value.replace('"', r"\"") + value = f'"{value}"' + entry, n_subs = re.subn( + f'{attr}=("[^"]*"|[^] ]*)', f"{attr}={value}", entry + ) + if n_subs < 1: + # If attr not found, then append it + entry = re.sub(r"\]$", f" {attr}={value}]", entry) + elif n_subs > 1: + print( + f"Harness.create_graph() warning: {attr} overridden {n_subs} times in {keyword}!" + ) + + dot.body[i] = entry + + if tweak.append is not None: + if isinstance(tweak.append, list): + for i, element in enumerate(tweak.append, 1): + typecheck(f"tweak.append[{i}]", element, str) + dot.body.extend(tweak.append) + else: + typecheck("tweak.append", tweak.append, str) + dot.body.append(tweak.append) From a4a73f141418f013ca19aee684b255a4eb1f0cb9 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 19 Oct 2021 15:44:52 +0200 Subject: [PATCH 081/155] Make setting HTML tag attributes easier through `kwargs` --- src/wireviz/wv_gv_html.py | 106 +++++++++++------------------------ src/wireviz/wv_table_util.py | 62 +++++++++++--------- 2 files changed, 67 insertions(+), 101 deletions(-) diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 22acf00..541598e 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -79,17 +79,16 @@ def gv_node_component( tbl = nested_table(lines) - if component.bgcolor: - tbl.attribs["bgcolor"] = translate_color(component.bgcolor, "HEX") - else: - if isinstance(component, Connector) and harness_options.bgcolor_connector: - tbl.attribs["bgcolor"] = translate_color( - harness_options.bgcolor_connector, "HEX" - ) - elif isinstance(component, Cable) and harness_options.bgcolor_cable: - tbl.attribs["bgcolor"] = translate_color( - harness_options.bgcolor_cable, "HEX" - ) + tbl.update_attribs(bgcolor=translate_color(component.bgcolor, "HEX")) + + if isinstance(component, Connector) and harness_options.bgcolor_connector: + tbl.update_attribs( + bgcolor=translate_color(harness_options.bgcolor_connector, "HEX") + ) + elif isinstance(component, Cable) and harness_options.bgcolor_cable: + tbl.update_attribs( + bgcolor=translate_color(harness_options.bgcolor_cable, "HEX") + ) return tbl @@ -129,22 +128,13 @@ def nested_table(lines: List[Td]) -> Table: inner_table = cells[0].contents else: # nest cell content inside a table - inner_table_attribs = { - "border": 0, - "cellspacing": 0, - "cellpadding": 3, - "cellborder": 1, - } - inner_table = Table(Tr(cells), attribs=inner_table_attribs) + inner_table = Table( + Tr(cells), border=0, cellspacing=0, cellpadding=3, cellborder=1 + ) rows.append(Tr(Td(inner_table))) if len(rows) == 0: # create dummy row to avoid GraphViz errors due to empty
rows = Tr(Td("")) - outer_table_attribs = { - "border": 0, - "cellspacing": 0, - "cellpadding": 0, - } - tbl = Table(rows, attribs=outer_table_attribs) + tbl = Table(rows, border=0, cellspacing=0, cellpadding=0) return tbl @@ -163,20 +153,13 @@ def gv_pin_table(component) -> Table: gv_pin_row(pinindex, pinname, pinlabel, pincolor, component) ) - table_attribs = { - "border": 0, - "cellspacing": 0, - "cellpadding": 3, - "cellborder": 1, - } - - return Table(pin_rows, attribs=table_attribs) + return Table(pin_rows, border=0, cellspacing=0, cellpadding=3, cellborder=1) def gv_pin_row(pin_index, pin_name, pin_label, pin_color, connector) -> Tr: - cell_pin_left = Td(pin_name, attribs={"port": f"p{pin_index+1}l"}) - cell_pin_label = Td(pin_label, empty_is_none=True) - cell_pin_right = Td(pin_name, attribs={"port": f"p{pin_index+1}r"}) + cell_pin_left = Td(pin_name, port=f"p{pin_index+1}l") + cell_pin_label = Td(pin_label, delete_if_empty=True) + cell_pin_right = Td(pin_name, port=f"p{pin_index+1}r") cells = [ cell_pin_left if connector.ports_left else None, @@ -234,12 +217,7 @@ def gv_conductor_table(cable, harness_options) -> Table: rows.append(Tr(Td(" "))) - table_attribs = { - "border": 0, - "cellspacing": 0, - "cellborder": 0, - } - tbl = Table(rows, attribs=table_attribs) + tbl = Table(rows, border=0, cellspacing=0, cellborder=0) return tbl @@ -255,9 +233,8 @@ def gv_wire_cell(index, color, pad) -> Td: "border": 0, "bgcolor": bgcolor if bgcolor != "" else "BK", } - wire_inner_rows.append(Tr(Td("", attribs=wire_inner_cell_attribs))) - wire_inner_table_attribs = {"cellspacing": 0, "cellborder": 0, "border": 0} - wire_inner_table = Table(wire_inner_rows, wire_inner_table_attribs) + wire_inner_rows.append(Tr(Td("", **wire_inner_cell_attribs))) + wire_inner_table = Table(wire_inner_rows, cellspacing=0, cellborder=0, border=0) wire_outer_cell_attribs = { "colspan": 3, "border": 0, @@ -265,17 +242,13 @@ def gv_wire_cell(index, color, pad) -> Td: "port": f"w{index}", "height": 2 * len(bgcolors), } - wire_outer_cell = Td(wire_inner_table, attribs=wire_outer_cell_attribs) + wire_outer_cell = Td(wire_inner_table, **wire_outer_cell_attribs) return wire_outer_cell def colored_cell(contents, bgcolor) -> Td: - if bgcolor: - attribs = {"bgcolor": translate_color(bgcolor, "HEX")} - else: - attribs = {} - return Td(contents, attribs=attribs) + return Td(contents, bgcolor=translate_color(bgcolor, "HEX")) def part_number_str_list(component: Component) -> List[str]: @@ -292,11 +265,7 @@ def part_number_str_list(component: Component) -> List[str]: def colorbar_cell(color) -> Td: if color: - colorbar_attribs = { - "bgcolor": translate_color(color, "HEX"), - "width": 4, - } - return Td("", attribs=colorbar_attribs) + return Td("", bgcolor=translate_color(color, "HEX"), width=4) else: return None @@ -305,35 +274,26 @@ def image_and_caption_cells(component: Component) -> (Td, Td): if not component.image: return (None, None) - image_tag = Img( - attribs={"scale": component.image.scale, "src": component.image.src} - ) + image_tag = Img(scale=component.image.scale, src=component.image.src) image_cell_inner = Td(image_tag, flat=True) if component.image.fixedsize: # further nest the image in a table with width/height/fixedsize parameters, and place that table in a cell - inner_cell_attribs = html_size_attr_dict(component.image) - image_cell_inner.attribs = Attribs(inner_cell_attribs) + image_cell_inner.update_attribs(**html_size_attr_dict(component.image)) image_cell = Td( - Table( - Tr(image_cell_inner), - attribs={"border": 0, "cellspacing": 0, "cellborder": 0, "id": "!"}, - ) + Table(Tr(image_cell_inner), border=0, cellspacing=0, cellborder=0, id="!") ) else: image_cell = image_cell_inner - outer_cell_attribs = {} - outer_cell_attribs["balign"] = "left" - if component.image.bgcolor: - outer_cell_attribs["bgcolor"] = translate_color(component.image.bgcolor, "HEX") - if component.image.caption: - outer_cell_attribs["sides"] = "TLR" - image_cell.attribs = Attribs(outer_cell_attribs) + image_cell.update_attribs( + balign="left", + bgcolor=translate_color(component.image.bgcolor, "HEX"), + sides="TLR" if component.image.caption else None, + ) if component.image.caption: caption_cell = Td( - f"{html_line_breaks(component.image.caption)}", - attribs={"balign": "left", "sides": "BLR", "id": "td_caption"}, + f"{html_line_breaks(component.image.caption)}", balign="left", sides="BLR" ) else: caption_cell = None diff --git a/src/wireviz/wv_table_util.py b/src/wireviz/wv_table_util.py index aa23663..6de208c 100644 --- a/src/wireviz/wv_table_util.py +++ b/src/wireviz/wv_table_util.py @@ -16,29 +16,27 @@ class Attribs(Dict): for k, v in self.items(): if v is not None: html.append(f' {k}="{v}"') - else: - html.append(f" {k}") + # else: + # html.append(f" {k}") return "".join(html) @dataclass class Tag: - contents: str = None + contents = None attribs: Attribs = field(default_factory=Attribs) - flat: bool = False - empty_is_none: bool = False + flat: bool = None + delete_if_empty: bool = False - def __post_init__(self): - if self.attribs is None: - self.attribs = Attribs({}) - elif isinstance(self.attribs, Dict): - self.attribs = Attribs(self.attribs) - elif not isinstance(self.attribs, Attribs): - raise Exception( - "Tag.attribs must be of type None, Dict, or Attribs, " - f"but type {type(self.attribs).__name__} was given instead:\n" - f"{self.attribs}" - ) + def __init__(self, contents, flat=None, delete_if_empty=False, **kwargs): + self.contents = contents + self.flat = flat + self.delete_if_empty = delete_if_empty + self.attribs = Attribs({**kwargs}) + + def update_attribs(self, **kwargs): + for k, v in kwargs.items(): + self.attribs[k] = v @property def tagname(self): @@ -46,36 +44,41 @@ class Tag: @property def auto_flat(self): - if self.flat: # force flat - return True + if self.flat is not None: # user specified + return self.flat if not _is_iterable_not_str(self.contents): # catch str, int, float, ... if not isinstance(self.contents, Tag): # avoid recursion return not "\n" in str(self.contents) # flatten if single line - def indent_lines(self, lines): - if self.auto_flat: + @property + def is_empty(self): + return self.get_contents(force_flat=True) == "" + + def indent_lines(self, lines, force_flat=False): + if self.auto_flat or force_flat: return lines else: indenter = " " * indent_count return "\n".join(f"{indenter}{line}" for line in lines.split("\n")) - def get_contents(self): - separator = "" if self.auto_flat else "\n" + def get_contents(self, force_flat=False): + separator = "" if self.auto_flat or force_flat else "\n" if _is_iterable_not_str(self.contents): return separator.join( - [self.indent_lines(str(c)) for c in self.contents if c is not None] + [ + self.indent_lines(str(c), force_flat) + for c in self.contents + if c is not None + ] ) elif self.contents is None: return "" else: # str, int, float, etc. - return self.indent_lines(str(self.contents)) + return self.indent_lines(str(self.contents), force_flat) def __repr__(self): - # if self.flat: - # import pudb; pudb.set_trace() - separator = "" if self.auto_flat else "\n" - if self.contents is None and self.empty_is_none: + if self.delete_if_empty and self.is_empty: return "" else: html = [ @@ -89,6 +92,9 @@ class Tag: @dataclass class TagSingleton(Tag): + def __init__(self, **kwargs): + self.attribs = Attribs({**kwargs}) + def __repr__(self): return f"<{self.tagname}{str(self.attribs)} />" From fce56bca263aca4d327e465fcf8b2da070ce0569 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 19 Oct 2021 15:57:00 +0200 Subject: [PATCH 082/155] Fix and simplify bgcolor logic --- src/wireviz/wv_gv_html.py | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 541598e..b0bbb23 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -77,19 +77,15 @@ def gv_node_component( line_notes, ] - tbl = nested_table(lines) - - tbl.update_attribs(bgcolor=translate_color(component.bgcolor, "HEX")) - - if isinstance(component, Connector) and harness_options.bgcolor_connector: - tbl.update_attribs( - bgcolor=translate_color(harness_options.bgcolor_connector, "HEX") - ) + if component.bgcolor: + tbl_bgcolor = translate_color(component.bgcolor, "HEX") + elif isinstance(component, Connector) and harness_options.bgcolor_connector: + tbl_bgcolor = translate_color(harness_options.bgcolor_connector, "HEX") elif isinstance(component, Cable) and harness_options.bgcolor_cable: - tbl.update_attribs( - bgcolor=translate_color(harness_options.bgcolor_cable, "HEX") - ) + tbl_bgcolor = translate_color(harness_options.bgcolor_cable, "HEX") + tbl = nested_table(lines) + tbl.update_attribs(bgcolor=tbl_bgcolor) return tbl @@ -111,6 +107,7 @@ def make_list_of_cells(inp) -> List[Td]: def nested_table(lines: List[Td]) -> Table: cell_lists = [make_list_of_cells(line) for line in lines] rows = [] + for lst in cell_lists: if len(lst) == 0: continue # no cells in list @@ -132,10 +129,10 @@ def nested_table(lines: List[Td]) -> Table: Tr(cells), border=0, cellspacing=0, cellpadding=3, cellborder=1 ) rows.append(Tr(Td(inner_table))) + if len(rows) == 0: # create dummy row to avoid GraphViz errors due to empty
rows = Tr(Td("")) tbl = Table(rows, border=0, cellspacing=0, cellpadding=0) - return tbl @@ -152,8 +149,8 @@ def gv_pin_table(component) -> Table: pin_rows.append( gv_pin_row(pinindex, pinname, pinlabel, pincolor, component) ) - - return Table(pin_rows, border=0, cellspacing=0, cellpadding=3, cellborder=1) + tbl = Table(pin_rows, border=0, cellspacing=0, cellpadding=3, cellborder=1) + return tbl def gv_pin_row(pin_index, pin_name, pin_label, pin_color, connector) -> Tr: @@ -187,9 +184,8 @@ def gv_connector_loops(connector: Connector) -> List: def gv_conductor_table(cable, harness_options) -> Table: - rows = [] - rows.append(Tr(Td(" "))) + rows.append(Tr(Td(" "))) # spacer row on top for i, (connection_color, wirelabel) in enumerate( zip_longest(cable.colors, cable.wirelabels), 1 @@ -215,10 +211,11 @@ def gv_conductor_table(cable, harness_options) -> Table: # the wire itself rows.append(Tr(gv_wire_cell(i, connection_color, harness_options._pad))) - rows.append(Tr(Td(" "))) + # row below the wire + # TODO: PN stuff for bundles + rows.append(Tr(Td(" "))) # spacer row on bottom tbl = Table(rows, border=0, cellspacing=0, cellborder=0) - return tbl From 95631a44c69020853d9a4ac46dc7c1689686e823 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 19 Oct 2021 16:17:38 +0200 Subject: [PATCH 083/155] Reactivate cable edge generation --- src/wireviz/Harness.py | 185 +++++++++++++------------------------- src/wireviz/wv_gv_html.py | 26 ++++-- 2 files changed, 81 insertions(+), 130 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 1cc1ec6..c2639a2 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -188,117 +188,49 @@ class Harness: # style=style, # fillcolor=translate_color(bgcolor, "HEX"), ) - continue # TODO: connection edges - html = [] - wirehtml = [] - # conductor table - wirehtml.append('
') - wirehtml.append(" ") + # # for bundles, individual wires can have part information + # if cable.category == "bundle": + # # create a list of wire parameters + # wireidentification = [] + # if isinstance(cable.pn, list): + # wireidentification.append( + # pn_info_string( + # HEADER_PN, None, remove_links(cable.pn[i - 1]) + # ) + # ) + # manufacturer_info = pn_info_string( + # HEADER_MPN, + # cable.manufacturer[i - 1] + # if isinstance(cable.manufacturer, list) + # else None, + # cable.mpn[i - 1] if isinstance(cable.mpn, list) else None, + # ) + # supplier_info = pn_info_string( + # HEADER_SPN, + # cable.supplier[i - 1] + # if isinstance(cable.supplier, list) + # else None, + # cable.spn[i - 1] if isinstance(cable.spn, list) else None, + # ) + # if manufacturer_info: + # wireidentification.append(html_line_breaks(manufacturer_info)) + # if supplier_info: + # wireidentification.append(html_line_breaks(supplier_info)) + # # print parameters into a table row under the wire + # if len(wireidentification) > 0: + # # fmt: off + # wirehtml.append(' ") + # # fmt: on - for i, (connection_color, wirelabel) in enumerate( - zip_longest(cable.colors, cable.wirelabels), 1 - ): - wirehtml.append(" ") - wirehtml.append(f" ") - wirehtml.append(f" ") - wirehtml.append(f" ") - wirehtml.append(" ") - - # fmt: off - bgcolors = ['#000000'] + get_color_hex(connection_color, pad=pad) + ['#000000'] - wirehtml.append(f" ") - wirehtml.append(f' ") - wirehtml.append(" ") - # fmt: on - - # for bundles, individual wires can have part information - if cable.category == "bundle": - # create a list of wire parameters - wireidentification = [] - if isinstance(cable.pn, list): - wireidentification.append( - pn_info_string( - HEADER_PN, None, remove_links(cable.pn[i - 1]) - ) - ) - manufacturer_info = pn_info_string( - HEADER_MPN, - cable.manufacturer[i - 1] - if isinstance(cable.manufacturer, list) - else None, - cable.mpn[i - 1] if isinstance(cable.mpn, list) else None, - ) - supplier_info = pn_info_string( - HEADER_SPN, - cable.supplier[i - 1] - if isinstance(cable.supplier, list) - else None, - cable.spn[i - 1] if isinstance(cable.spn, list) else None, - ) - if manufacturer_info: - wireidentification.append(html_line_breaks(manufacturer_info)) - if supplier_info: - wireidentification.append(html_line_breaks(supplier_info)) - # print parameters into a table row under the wire - if len(wireidentification) > 0: - # fmt: off - wirehtml.append(' ") - # fmt: on - - if cable.shield: - wirehtml.append(" ") # spacer - wirehtml.append(" ") - wirehtml.append(" ") - wirehtml.append(" ") - wirehtml.append(" ") - wirehtml.append(" ") - if isinstance(cable.shield, str): - # shield is shown with specified color and black borders - shield_color_hex = wv_colors.get_color_hex(cable.shield)[0] - attributes = ( - f'height="6" bgcolor="{shield_color_hex}" border="2" sides="tb"' - ) - else: - # shield is shown as a thin black wire - attributes = f'height="2" bgcolor="#000000" border="0"' - # fmt: off - wirehtml.append(f' ') - # fmt: on - - wirehtml.append(" ") - wirehtml.append("
 
') + # wirehtml.append(' ') + # for attrib in wireidentification: + # wirehtml.append(f" ") + # wirehtml.append("
{attrib}
") + # wirehtml.append("
") - - wireinfo = [] - if cable.show_wirenumbers: - wireinfo.append(str(i)) - colorstr = wv_colors.translate_color( - connection_color, self.options.color_mode - ) - if colorstr: - wireinfo.append(colorstr) - if cable.wirelabels: - wireinfo.append(wirelabel if wirelabel is not None else "") - wirehtml.append(f' {":".join(wireinfo)}') - - wirehtml.append(f"
') - wirehtml.append(' ') - for j, bgcolor in enumerate(bgcolors[::-1]): # Reverse to match the curved wires when more than 2 colors - wirehtml.append(f' ') - wirehtml.append("
") - wirehtml.append("
') - wirehtml.append(' ') - for attrib in wireidentification: - wirehtml.append(f" ") - wirehtml.append("
{attrib}
") - wirehtml.append("
 
Shield
 
") - - html = [ - row.replace("", "\n".join(wirehtml)) for row in html - ] # connections for connection in cable.connections: @@ -316,11 +248,14 @@ class Harness: ) else: # it's a shield connection # shield is shown with specified color and black borders, or as a thin black wire otherwise + if isinstance(cable.shield, str): + shield_color_hex = wv_colors.get_color_hex(cable.shield)[0] + shield_color_str = ":".join(["#000000", shield_color_hex, "#000000"]) + else: + shield_color_str = "#000000" dot.attr( "edge", - color=":".join(["#000000", shield_color_hex, "#000000"]) - if isinstance(cable.shield, str) - else "#000000", + color=shield_color_str, ) if connection.from_pin is not None: # connect to left from_connector = self.connectors[connection.from_name] @@ -345,10 +280,10 @@ class Harness: from_string = ":".join(from_info) else: from_string = "" - html = [ - row.replace(f"", from_string) - for row in html - ] + # html = [ + # row.replace(f"", from_string) + # for row in html + # ] if connection.to_pin is not None: # connect to right to_connector = self.connectors[connection.to_name] to_pin_index = to_connector.pins.index(connection.to_pin) @@ -367,24 +302,24 @@ class Harness: to_string = ":".join(to_info) else: to_string = "" - html = [ - row.replace(f"", to_string) - for row in html - ] + # html = [ + # row.replace(f"", to_string) + # for row in html + # ] style, bgcolor = ( ("filled,dashed", self.options.bgcolor_bundle) if cable.category == "bundle" else ("filled", self.options.bgcolor_cable) ) - html = "\n".join(html) - dot.node( - cable.name, - label=f"<\n{html}\n>", - shape="box", - style=style, - fillcolor=translate_color(bgcolor, "HEX"), - ) + # html = "\n".join(html) + # dot.node( + # cable.name, + # label=f"<\n{html}\n>", + # shape="box", + # style=style, + # fillcolor=translate_color(bgcolor, "HEX"), + # ) apply_dot_tweaks(dot, self.tweak) diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index b0bbb23..a2f7d19 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -209,20 +209,36 @@ def gv_conductor_table(cable, harness_options) -> Table: rows.append(Tr(cells_above)) # the wire itself - rows.append(Tr(gv_wire_cell(i, connection_color, harness_options._pad))) + color_list = ["#000000"] + get_color_hex(connection_color, pad=harness_options._pad) + ["#000000"] + rows.append(Tr(gv_wire_cell(i, color_list))) # row below the wire # TODO: PN stuff for bundles + if cable.shield: + rows.append(Tr(Td(" "))) # spacer between wires and shield + # row above the shield + cells_above = [ + Td(""), + Td("Shield"), + Td(""), + ] + rows.append(Tr(cells_above)) + # thw shield itself + if isinstance(cable.shield, str): + color_list = ["#000000"] + get_color_hex(cable.shield) + ["#000000"] + else: + color_list = ["#000000"] + rows.append(Tr(gv_wire_cell("s", color_list))) + rows.append(Tr(Td(" "))) # spacer row on bottom tbl = Table(rows, border=0, cellspacing=0, cellborder=0) return tbl -def gv_wire_cell(index, color, pad) -> Td: - bgcolors = ["#000000"] + get_color_hex(color, pad=pad) + ["#000000"] +def gv_wire_cell(index, color_list) -> Td: wire_inner_rows = [] - for j, bgcolor in enumerate(bgcolors[::-1]): + for j, bgcolor in enumerate(color_list[::-1]): wire_inner_cell_attribs = { "colspan": 3, "cellpadding": 0, @@ -237,7 +253,7 @@ def gv_wire_cell(index, color, pad) -> Td: "border": 0, "cellspacing": 0, "port": f"w{index}", - "height": 2 * len(bgcolors), + "height": 2 * len(color_list), } wire_outer_cell = Td(wire_inner_table, **wire_outer_cell_attribs) From 6353a79a417b545401fc277e7c3f606c81daf234 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Tue, 19 Oct 2021 16:46:34 +0200 Subject: [PATCH 084/155] Outsource `gv_edge_wire()` --- src/wireviz/Harness.py | 154 ++++---------------------------------- src/wireviz/wv_gv_html.py | 119 ++++++++++++++++++++++++++++- 2 files changed, 133 insertions(+), 140 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index c2639a2..34b0802 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -35,6 +35,7 @@ from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_gv_html import ( apply_dot_tweaks, gv_connector_loops, + gv_edge_wire, gv_node_component, html_line_breaks, remove_links, @@ -153,10 +154,7 @@ class Harness: # generate connector node gv_html = gv_node_component(connector, self.options) dot.node( - connector.name, - label=f"<\n{gv_html}\n>", - shape="box", - style="filled", + connector.name, label=f"<\n{gv_html}\n>", shape="box", style="filled" ) # generate edges for connector loops if len(connector.loops) > 0: @@ -177,149 +175,25 @@ class Harness: for cable in self.cables.values(): # generate cable node - gv_html = gv_node_component(cable, self.options) # TODO: PN info for bundles (per wire) - # shield - # - dot.node( - cable.name, - label=f"<\n{gv_html}\n>", - shape="box", - # style=style, - # fillcolor=translate_color(bgcolor, "HEX"), - ) - - # TODO: connection edges - - - # # for bundles, individual wires can have part information - # if cable.category == "bundle": - # # create a list of wire parameters - # wireidentification = [] - # if isinstance(cable.pn, list): - # wireidentification.append( - # pn_info_string( - # HEADER_PN, None, remove_links(cable.pn[i - 1]) - # ) - # ) - # manufacturer_info = pn_info_string( - # HEADER_MPN, - # cable.manufacturer[i - 1] - # if isinstance(cable.manufacturer, list) - # else None, - # cable.mpn[i - 1] if isinstance(cable.mpn, list) else None, - # ) - # supplier_info = pn_info_string( - # HEADER_SPN, - # cable.supplier[i - 1] - # if isinstance(cable.supplier, list) - # else None, - # cable.spn[i - 1] if isinstance(cable.spn, list) else None, - # ) - # if manufacturer_info: - # wireidentification.append(html_line_breaks(manufacturer_info)) - # if supplier_info: - # wireidentification.append(html_line_breaks(supplier_info)) - # # print parameters into a table row under the wire - # if len(wireidentification) > 0: - # # fmt: off - # wirehtml.append('
') - # wirehtml.append(' ') - # for attrib in wireidentification: - # wirehtml.append(f" ") - # wirehtml.append("
{attrib}
") - # wirehtml.append("
') + # wirehtml.append(' ') + # for attrib in wireidentification: + # wirehtml.append(f" ") + # wirehtml.append("
{attrib}
") + # wirehtml.append("
just below the image cell: caption: Optional[MultilineHypertext] = None # See also HTML doc at https://graphviz.org/doc/info/shapes.html#html def __post_init__(self): + self.bgcolor = SingleColor(self.bgcolor) + if self.fixedsize is None: # Default True if any dimension specified unless self.scale also is specified. self.fixedsize = (self.width or self.height) and self.scale is None @@ -141,7 +156,10 @@ class AdditionalComponent: qty: float = 1 unit: Optional[str] = None qty_multiplier: Union[ConnectorMultiplier, CableMultiplier, None] = None - bgcolor: Optional[Color] = None + bgcolor: SingleColor = None + + def __post_init__(self): + self.bgcolor = SingleColor(self.bgcolor) @property def description(self) -> str: @@ -159,7 +177,7 @@ class PinClass: index: int id: str label: str - color: str + color: MultiColor parent: str # designator of parent connector _anonymous: bool = False # true for pins on autogenerated connectors _simple: bool = False # true for simple connector @@ -178,7 +196,7 @@ class WireClass: index: int id: str label: str - color: str + color: MultiColor parent: str # designator of parent cable/bundle # gauge: Gauge # pn: str @@ -203,8 +221,8 @@ class Connection: @dataclass class Connector(Component): name: Designator - bgcolor: Optional[Color] = None - bgcolor_title: Optional[Color] = None + bgcolor: SingleColor = None + bgcolor_title: SingleColor = None manufacturer: Optional[MultilineHypertext] = None mpn: Optional[MultilineHypertext] = None supplier: Optional[MultilineHypertext] = None @@ -219,8 +237,8 @@ class Connector(Component): notes: Optional[MultilineHypertext] = None pins: List[Pin] = field(default_factory=list) pinlabels: List[Pin] = field(default_factory=list) - pincolors: List[Color] = field(default_factory=list) - color: Optional[Color] = None + pincolors: List[str] = field(default_factory=list) + color: MultiColor = None show_name: Optional[bool] = None show_pincount: Optional[bool] = None hide_disconnected_pins: bool = False @@ -238,6 +256,10 @@ class Connector(Component): def __post_init__(self) -> None: + self.bgcolor = SingleColor(self.bgcolor) + self.bgcolor_title = SingleColor(self.bgcolor_title) + self.color = SingleColor(self.color) + if isinstance(self.image, dict): self.image = Image(**self.image) @@ -280,7 +302,7 @@ class Connector(Component): index=pin_index, id=pin_id, label=pin_label, - color=pin_color, + color=MultiColor(pin_color), parent=self.name, _anonymous=self.is_autogenerated, _simple=self.style == "simple", @@ -341,8 +363,8 @@ class Connector(Component): @dataclass class Cable(Component): name: Designator - bgcolor: Optional[Color] = None - bgcolor_title: Optional[Color] = None + bgcolor: SingleColor = None + bgcolor_title: SingleColor = None manufacturer: Union[MultilineHypertext, List[MultilineHypertext], None] = None mpn: Union[MultilineHypertext, List[MultilineHypertext], None] = None supplier: Union[MultilineHypertext, List[MultilineHypertext], None] = None @@ -355,14 +377,14 @@ class Cable(Component): show_equiv: bool = False length: float = 0 length_unit: Optional[str] = None - color: Optional[Color] = None + color: MultiColor = None wirecount: Optional[int] = None - shield: Union[bool, Color] = False + shield: Union[bool, MultiColor] = False image: Optional[Image] = None notes: Optional[MultilineHypertext] = None - colors: List[Colors] = field(default_factory=list) + colors: List[str] = field(default_factory=list) wirelabels: List[Wire] = field(default_factory=list) - color_code: Optional[ColorScheme] = None + color_code: Optional[str] = None show_name: Optional[bool] = None show_wirecount: bool = True show_wirenumbers: Optional[bool] = None @@ -393,6 +415,10 @@ class Cable(Component): def __post_init__(self) -> None: + self.bgcolor = SingleColor(self.bgcolor) + self.bgcolor_title = SingleColor(self.bgcolor_title) + self.color = SingleColor(self.color) + if isinstance(self.image, dict): self.image = Image(**self.image) @@ -441,21 +467,20 @@ class Cable(Component): if self.wirecount: # number of wires explicitly defined if self.colors: # use custom color palette (partly or looped if needed) - pass + self.colors = [ + self.colors[i % len(self.colors)] for i in range(self.wirecount) + ] elif self.color_code: # use standard color palette (partly or looped if needed) if self.color_code not in COLOR_CODES: raise Exception("Unknown color code") - self.colors = COLOR_CODES[self.color_code] + self.colors = [ + get_color_by_colorcode_index(self.color_code, i) + for i in range(self.wirecount) + ] else: # no colors defined, add dummy colors self.colors = [""] * self.wirecount - # make color code loop around if more wires than colors - if self.wirecount > len(self.colors): - m = self.wirecount // len(self.colors) + 1 - self.colors = self.colors * int(m) - # cut off excess after looping - self.colors = self.colors[: self.wirecount] else: # wirecount implicit in length of color list if not self.colors: raise Exception( @@ -491,7 +516,7 @@ class Cable(Component): index=wire_index, # TODO: wire_id id=wire_index + 1, # TODO: wire_id label=wire_label, - color=wire_color, + color=MultiColor(wire_color), parent=self.name, ) ) @@ -504,7 +529,9 @@ class Cable(Component): index=index_offset, id="s", label="Shield", - color=self.shield if isinstance(self.shield, str) else None, + color=MultiColor(self.shield) + if isinstance(self.shield, str) + else MultiColor(None), parent=self.name, ) ) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 8c6572f..e7a7603 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -5,6 +5,7 @@ from pathlib import Path from graphviz import Graph +import wireviz.wv_colors from wireviz.DataClasses import ( Arrow, ArrowWeight, @@ -152,7 +153,7 @@ class Harness: for connector in self.connectors.values(): # generate connector node - gv_html = gv_node_component(connector, self.options) + gv_html = gv_node_component(connector) bgcolor = calculate_node_bgcolor(connector, self.options) dot.node( connector.name, @@ -163,25 +164,27 @@ class Harness: ) # generate edges for connector loops if len(connector.loops) > 0: - dot.attr("edge", color="#000000:#ffffff:#000000") + dot.attr("edge", color="#000000") loops = gv_connector_loops(connector) for head, tail in loops: dot.edge(head, tail) # determine if there are double- or triple-colored wires in the harness; # if so, pad single-color wires to make all wires of equal thickness - pad = any( - len(colorstr) > 2 + multicolor_wires = [ + len(wire.color) > 1 for cable in self.cables.values() - for colorstr in cable.colors - ) - - self.options._pad = pad + for wire in cable.wire_objects + ] + if any(multicolor_wires): + wireviz.wv_colors.padding_amount = 3 + else: + wireviz.wv_colors.padding_amount = 1 for cable in self.cables.values(): # generate cable node # TODO: PN info for bundles (per wire) - gv_html = gv_node_component(cable, self.options) + gv_html = gv_node_component(cable) bgcolor = calculate_node_bgcolor(cable, self.options) style = "filled,dashed" if cable.category == "bundle" else "filled" dot.node( diff --git a/src/wireviz/wv_bom.py b/src/wireviz/wv_bom.py index 3de45d8..4e075a3 100644 --- a/src/wireviz/wv_bom.py +++ b/src/wireviz/wv_bom.py @@ -4,8 +4,7 @@ from dataclasses import asdict from itertools import groupby from typing import Any, Dict, List, Optional, Tuple, Union -from wireviz.DataClasses import AdditionalComponent, Cable, Color, Connector -from wireviz.wv_colors import translate_color +from wireviz.DataClasses import AdditionalComponent, Cable, Connector from wireviz.wv_gv_html import html_line_breaks from wireviz.wv_helper import clean_whitespace, pn_info_string @@ -99,7 +98,7 @@ def generate_bom(harness: "Harness") -> List[BOMEntry]: + (f", {connector.subtype}" if connector.subtype else "") + (f", {connector.pincount} pins" if connector.show_pincount else "") + ( - f", {translate_color(connector.color, harness.options.color_mode)}" + f", xxx" # {translate_color(connector.color, harness.options.color_mode)} if connector.color else "" ) @@ -132,7 +131,7 @@ def generate_bom(harness: "Harness") -> List[BOMEntry]: ) + (" shielded" if cable.shield else "") + ( - f", {translate_color(cable.color, harness.options.color_mode)}" + f", xxx" # {translate_color(cable.color, harness.options.color_mode)} if cable.color else "" ) @@ -154,7 +153,7 @@ def generate_bom(harness: "Harness") -> List[BOMEntry]: + (f", {cable.type}" if cable.type else "") + (f", {cable.gauge} {cable.gauge_unit}" if cable.gauge else "") + ( - f", {translate_color(color, harness.options.color_mode)}" + f", xxx" # {translate_color(color, harness.options.color_mode)} if color else "" ) @@ -236,7 +235,7 @@ def component_table_entry( type: str, qty: Union[int, float], unit: Optional[str] = None, - bgcolor: Optional[Color] = None, + bgcolor: Optional[str] = None, pn: Optional[str] = None, manufacturer: Optional[str] = None, mpn: Optional[str] = None, diff --git a/src/wireviz/wv_colors.py b/src/wireviz/wv_colors.py index 34d9241..be8fefb 100644 --- a/src/wireviz/wv_colors.py +++ b/src/wireviz/wv_colors.py @@ -1,6 +1,206 @@ # -*- coding: utf-8 -*- -from typing import Dict, List +from collections import namedtuple +from dataclasses import dataclass, field +from enum import Enum +from typing import List + +KnownColor = namedtuple("KnownColor", "html code_de full_en full_de") + +ColorOutputMode = Enum( + "ColorOutputMode", "EN_LOWER EN_UPPER DE_LOWER DE_UPPER HTML_LOWER HTML_UPPER" +) + +known_colors = { # v--------v--------- for future use + "BK": KnownColor("#000000", "sw", "black", "schwarz"), + "WH": KnownColor("#ffffff", "ws", "white", "weiß"), + "GY": KnownColor("#999999", "gr", "grey", "grau"), + "PK": KnownColor("#ff66cc", "rs", "pink", "rosa"), + "RD": KnownColor("#ff0000", "rt", "red", "rot"), + "OG": KnownColor("#ff8000", "or", "orange", "orange"), + "YE": KnownColor("#ffff00", "ge", "yellow", "gelb"), + "OL": KnownColor("#708000", "ol", "olive green", "olivgrün"), + "GN": KnownColor("#00ff00", "gn", "green", "grün"), + "TQ": KnownColor("#00ffff", "tk", "turquoise", "türkis"), + "LB": KnownColor("#a0dfff", "hb", "light blue", "hellblau"), + "BU": KnownColor("#0066ff", "bl", "blue", "blau"), + "VT": KnownColor("#8000ff", "vi", "violet", "violett"), + "BN": KnownColor("#895956", "br", "brown", "braun"), + "BG": KnownColor("#ceb673", "bg", "beige", "beige"), + "IV": KnownColor("#f5f0d0", "eb", "ivory", "elfenbein"), + "SL": KnownColor("#708090", "si", "slate", "schiefer"), + "CU": KnownColor("#d6775e", "ku", "copper", "Kupfer"), + "SN": KnownColor("#aaaaaa", "vz", "tin", "verzinkt"), + "SR": KnownColor("#84878c", "ag", "silver", "Silber"), + "GD": KnownColor("#ffcf80", "au", "gold", "Gold"), +} + +color_output_mode = ColorOutputMode.EN_UPPER + +padding_amount = 1 + + +def convert_case(inp): + if "_LOWER" in color_output_mode.name: + return inp.lower() + elif "_UPPER" in color_output_mode.name: + return inp.upper() + else: # currently not used + return inp + + +def get_color_by_colorcode_index(color_code: str, index: int) -> str: + num_colors_in_code = len(COLOR_CODES[color_code]) + actual_index = index % num_colors_in_code # wrap around if index is out of bounds + return COLOR_CODES[color_code][actual_index] + + # # make color code loop around if more wires than colors + # if self.wirecount > len(self.colors): + # m = self.wirecount // len(self.colors) + 1 + # self.colors = self.colors * int(m) + # # cut off excess after looping + # self.colors = self.colors[: self.wirecount] + + +@dataclass +class SingleColor: + _code_en: str + _html: str + + @property + def code_en(self): + return convert_case(self._code_en) if self._code_en else None + + @property + def code_de(self): + return ( + convert_case(known_colors[self._code_en.upper()].code_de) + if self._code_en + else None + ) + + @property + def html(self): + return convert_case(self._html) if self._code_en else None + + @property + def known(self): + return ( + self.code_en.upper() in known_colors.keys() if self._code_en else True + ) # ? + + def __init__(self, inp): + if inp is None: + self._html = None + self._code_en = None + elif isinstance(inp, int): + hex_str = f"#{inp:06x}" + self._html = hex_str + self._code_en = hex_str # do not perform reverse lookup + elif inp.upper() in known_colors.keys(): + inp_upper = inp.upper() + self._code_en = inp_upper + self._html = known_colors[inp_upper].html + else: # assume valid HTML color + self._html = inp + self._code_en = inp + + @property + def html_padded(self): + return ":".join([self.html] * padding_amount) + + def __bool__(self): + return self._code_en is not None + + def __str__(self): + if self._html is None: + return "" + elif self.known and "EN_" in color_output_mode.name: + return self.code_en + elif self.known and "DE_" in color_output_mode.name: + return self.code_de + else: + return self.html + + +@dataclass +class MultiColor: + colors: List[SingleColor] = field(default_factory=list) + + def __init__(self, inp): + self.colors = [] + if inp is None: + pass + elif isinstance(inp, List): # input is already a list + for item in inp: + if item is None: + pass + elif isinstance(item, SingleColor): + self.colors.append(item) + else: # string + self.colors.append(SingleColor(item)) + elif isinstance(inp, SingleColor): # single color + self.colors = [inp] + else: # split input into list + if ":" in str(inp): + self.colors = [SingleColor(item) for item in inp.split(":")] + else: + if isinstance(inp, int): + self.colors = [SingleColor(inp)] + elif len(inp) % 2 == 0: + items = [inp[i : i + 2] for i in range(0, len(inp), 2)] + known = [item.upper() in known_colors.keys() for item in items] + if all(known): + self.colors = [SingleColor(item) for item in items] + else: # assume it's a HTML color name + self.colors = [SingleColor(inp)] + else: # assume it's a HTML color name + self.colors = [SingleColor(inp)] + + def __len__(self): + return len(self.colors) + + def __bool__(self): + return len(self.colors) >= 1 + + def __str__(self): + if "EN_" in color_output_mode.name or "DE_" in color_output_mode.name: + joiner = "" if self.all_known else ":" + elif "HTML_" in color_output_mode.name: + joiner = ":" + else: + joiner = "???" + return joiner.join([str(color) for color in self.colors]) + + @property + def all_known(self): + return all([color.known for color in self.colors]) + + @property + def html(self): + return ":".join([color.html for color in self.colors]) + + @property + def html_padded_list(self): + # padding only properly works for padding_amount 1 or 3 + if padding_amount == 1: + out = [color.html for color in self.colors] + elif len(self) == 0: + out = [] + elif len(self) == 1: + out = [self.colors[0].html for i in range(3)] + elif len(self) == 2: + out = [self.colors[0].html, self.colors[1].html, self.colors[0].html] + elif len(self) == 3: + out = [color.html for color in self.colors] + else: + raise Exception(f"Padding not supported for len {len(selfq)}") + return [str(color) for color in out] + + @property + def html_padded(self): + return ":".join(self.html_padded_list) + COLOR_CODES = { # fmt: off @@ -38,166 +238,3 @@ COLOR_CODES = { "T568A": ["WHGN", "GN", "WHOG", "BU", "WHBU", "OG", "WHBN", "BN"], "T568B": ["WHOG", "OG", "WHGN", "BU", "WHBU", "GN", "WHBN", "BN"], } - -# Convention: Color names should be 2 letters long, to allow for multicolored wires - -_color_hex = { - "BK": "#000000", - "WH": "#ffffff", - "GY": "#999999", - "PK": "#ff66cc", - "RD": "#ff0000", - "OG": "#ff8000", - "YE": "#ffff00", - "OL": "#708000", # olive green - "GN": "#00ff00", - "TQ": "#00ffff", - "LB": "#a0dfff", # light blue - "BU": "#0066ff", - "VT": "#8000ff", - "BN": "#895956", - "BG": "#ceb673", # beige - "IV": "#f5f0d0", # ivory - "SL": "#708090", - "CU": "#d6775e", # Faux-copper look, for bare CU wire - "SN": "#aaaaaa", # Silvery look for tinned bare wire - "SR": "#84878c", # Darker silver for silvered wire - "GD": "#ffcf80", # Golden color for gold -} - -_color_full = { - "BK": "black", - "WH": "white", - "GY": "grey", - "PK": "pink", - "RD": "red", - "OG": "orange", - "YE": "yellow", - "OL": "olive green", - "GN": "green", - "TQ": "turquoise", - "LB": "light blue", - "BU": "blue", - "VT": "violet", - "BN": "brown", - "BG": "beige", - "IV": "ivory", - "SL": "slate", - "CU": "copper", - "SN": "tin", - "SR": "silver", - "GD": "gold", -} - -_color_ger = { - "BK": "sw", - "WH": "ws", - "GY": "gr", - "PK": "rs", - "RD": "rt", - "OG": "or", - "YE": "ge", - "OL": "ol", # olivgrün - "GN": "gn", - "TQ": "tk", - "LB": "hb", # hellblau - "BU": "bl", - "VT": "vi", - "BN": "br", - "BG": "bg", # beige - "IV": "eb", # elfenbeinfarben - "SL": "si", # Schiefer - "CU": "ku", # Kupfer - "SN": "vz", # verzinkt - "SR": "ag", # Silber - "GD": "au", # Gold -} - - -color_default = "#ffffff" - -_hex_digits = set("0123456789abcdefABCDEF") - - -# Literal type aliases below are commented to avoid requiring python 3.8 -Color = str # Two-letter color name = Literal[_color_hex.keys()] -Colors = str # One or more two-letter color names (Color) concatenated into one string -ColorMode = ( - str # = Literal['full', 'FULL', 'hex', 'HEX', 'short', 'SHORT', 'ger', 'GER'] -) -ColorScheme = str # Color scheme name = Literal[COLOR_CODES.keys()] - - -def get_color_hex(input: Colors, pad: bool = False) -> List[str]: - """Return list of hex colors from either a string of color names or :-separated hex colors.""" - if input is None or input == "": - return [color_default] - elif input[0] == "#": # Hex color(s) - output = input.split(":") - for i, c in enumerate(output): - if c[0] != "#" or not all(d in _hex_digits for d in c[1:]): - if c != input: - c += f" in input: {input}" - print(f"Invalid hex color: {c}") - output[i] = color_default - else: # Color name(s) - - def lookup(c: str) -> str: - try: - return _color_hex[c] - except KeyError: - if c != input: - c += f" in input: {input}" - print(f"Unknown color name: {c}") - return color_default - - output = [lookup(input[i : i + 2]) for i in range(0, len(input), 2)] - - if len(output) == 2: # Give wires with EXACTLY 2 colors that striped look. - output += output[:1] - elif pad and len(output) == 1: # Hacky style fix: Give single color wires - output *= 3 # a triple-up so that wires are the same size. - - return output - - -def get_color_translation(translate: Dict[Color, str], input: Colors) -> List[str]: - """Return list of colors translations from either a string of color names or :-separated hex colors.""" - - def from_hex(hex_input: str) -> str: - for color, hex in _color_hex.items(): - if hex == hex_input: - return translate[color] - return f'({",".join(str(int(hex_input[i:i+2], 16)) for i in range(1, 6, 2))})' - - return ( - [from_hex(h) for h in input.lower().split(":")] - if input[0] == "#" - else [translate.get(input[i : i + 2], "??") for i in range(0, len(input), 2)] - ) - - -def translate_color(input: Colors, color_mode: ColorMode) -> str: - if input == "": - return "" - if input is None: - return None - upper = color_mode.isupper() - if not (color_mode.isupper() or color_mode.islower()): - raise Exception("Unknown color mode capitalization") - - color_mode = color_mode.lower() - if color_mode == "full": - output = "/".join(get_color_translation(_color_full, input)) - elif color_mode == "hex": - output = ":".join(get_color_hex(input, pad=False)) - elif color_mode == "ger": - output = "".join(get_color_translation(_color_ger, input)) - elif color_mode == "short": - output = input - else: - raise Exception("Unknown color mode") - if upper: - return output.upper() - else: - return output.lower() diff --git a/src/wireviz/wv_colors_new.py b/src/wireviz/wv_colors_new.py deleted file mode 100644 index 24fdee9..0000000 --- a/src/wireviz/wv_colors_new.py +++ /dev/null @@ -1,199 +0,0 @@ -# -*- coding: utf-8 -*- - -from collections import namedtuple -from dataclasses import dataclass, field -from enum import Enum -from typing import List - -KnownColor = namedtuple("KnownColor", "html code_de full_en full_de") -ColorOutputMode = Enum("ColorOutputMode", "EN_LOWER EN_UPPER DE_LOWER DE_UPPER HTML_LOWER HTML_UPPER") - -known_colors = { - "BK": KnownColor("#000000", "sw", "black", "schwarz"), - "WH": KnownColor("#ffffff", "ws", "white", "weiß"), - "GY": KnownColor("#999999", "gr", "grey", "grau"), - "PK": KnownColor("#ff66cc", "rs", "pink", "rosa"), - "RD": KnownColor("#ff0000", "rt", "red", "rot"), - "OG": KnownColor("#ff8000", "or", "orange", "orange"), - "YE": KnownColor("#ffff00", "ge", "yellow", "gelb"), - "OL": KnownColor("#708000", "ol", "olive green", "olivgrün"), - "GN": KnownColor("#00ff00", "gn", "green", "grün"), - "TQ": KnownColor("#00ffff", "tk", "turquoise", "türkis"), - "LB": KnownColor("#a0dfff", "hb", "light blue", "hellblau"), - "BU": KnownColor("#0066ff", "bl", "blue", "blau"), - "VT": KnownColor("#8000ff", "vi", "violet", "violett"), - "BN": KnownColor("#895956", "br", "brown", "braun"), - "BG": KnownColor("#ceb673", "bg", "beige", "beige"), - "IV": KnownColor("#f5f0d0", "eb", "ivory", "elfenbein"), - "SL": KnownColor("#708090", "si", "slate", "schiefer"), - "CU": KnownColor("#d6775e", "ku", "copper", "Kupfer"), - "SN": KnownColor("#aaaaaa", "vz", "tin", "verzinkt"), - "SR": KnownColor("#84878c", "ag", "silver", "Silber"), - "GD": KnownColor("#ffcf80", "au", "gold", "Gold"), -} - -color_output_mode = ColorOutputMode.EN_UPPER -padding_amount = 1 - -def convert_case(inp): - if "_LOWER" in color_output_mode.name: - return inp.lower() - elif "_UPPER" in color_output_mode.name: - return inp.upper() - else: # currently not used - return inp - -@dataclass -class SingleColor(): - _code_en: str - _code_de: str - _html: str - - @property - def code_en(self): - return convert_case(self._code_en) - # repeat for _code_de, _html - - @property - def code_de(self): - return convert_case(self._code_de) - # repeat for _code_de, _html - - @property - def html(self): - return convert_case(self._html) - # repeat for _code_de, _html - - @property - def known(self): - return self.code_en.upper() in known_colors.keys() - - def __init__(self, inp): - if isinstance(inp, int): - hex_str = f"#{inp:06x}" - self._html = hex_str - self._code_en = hex_str # do not perform reverse lookup - self._code_de = hex_str - elif inp.upper() in known_colors.keys(): - inp_upper = inp.upper() - self._code_en = inp_upper - self._code_de = known_colors[inp_upper].code_de - self._html = known_colors[inp_upper].html - else: # assume valid HTML color - self._html = inp - self._code_en = inp - self._code_de = inp - - @property - def html_padded(self): - return ":".join([self.html] * padding_amount) - - def __str__(self): - if self.known and "EN_" in color_output_mode.name: - return self.code_en - elif self.known and "DE_" in color_output_mode.name: - return self.code_de - else: - return self.html - -@dataclass -class MultiColor(): - colors: List[SingleColor] = field(default_factory=list) - - def __init__(self, inp): - self.colors = [] - if isinstance(inp, List): # input is already a list - for item in inp: - if isinstance(item, SingleColor): - self.colors.append(item) - else: # string - self.colors.append(SingleColor(item)) - elif isinstance(inp, SingleColor): # single color - self.colors = [inp] - else: # split input into list - if ":" in str(inp): - self.colors = [SingleColor(item) for item in inp.split(":")] - else: - if isinstance(inp, int): - self.colors = [SingleColor(inp)] - elif len(inp) % 2 == 0: - items = [inp[i:i+2] for i in range(0, len(inp), 2)] - known = [item.upper() in known_colors.keys() for item in items] - if all(known): - self.colors = [SingleColor(item) for item in items] - else: # assume it's a HTML color name - self.colors = [SingleColor(inp)] - else: # assume it's a HTML color name - self.colors = [SingleColor(inp)] - - - def __len__(self): - return len(self.colors) - - def __str__(self): - if "EN_" in color_output_mode.name or "DE_" in color_output_mode.name: - joiner = "" if self.all_known else ":" - elif "HTML_" in color_output_mode.name: - joiner = ":" - else: - joiner = "???" - return joiner.join([str(color) for color in self.colors]) - - @property - def all_known(self): - return all([color.known for color in self.colors]) - - @property - def html(self): - return ":".join([color.html for color in self.colors]) - - @property - def html_padded(self): - if len(self) == 0: - out = [] - elif len(self) == 1: - out = [self.colors[0] for i in range(3)] - elif len(self) == 2: - out = [self.colors[0], self.colors[1], self.colors[0]] - elif len(self) == 3: - out = self.colors - else: - raise Exception(f"Padding not supported for len {len(selfq)}") - return ":".join([str(color) for color in out]) - -COLOR_CODES = { - # fmt: off - "DIN": [ - "WH", "BN", "GN", "YE", "GY", "PK", "BU", "RD", "BK", "VT", "GYPK", "RDBU", - "WHGN", "BNGN", "WHYE", "YEBN", "WHGY", "GYBN", "WHPK", "PKBN", "WHBU", "BNBU", - "WHRD", "BNRD", "WHBK", "BNBK", "GYGN", "YEGY", "PKGN", "YEPK", "GNBU", "YEBU", - "GNRD", "YERD", "GNBK", "YEBK", "GYBU", "PKBU", "GYRD", "PKRD", "GYBK", "PKBK", - "BUBK", "RDBK", "WHBNBK", "YEGNBK", "GYPKBK", "RDBUBK", "WHGNBK", "BNGNBK", - "WHYEBK", "YEBNBK", "WHGYBK", "GYBNBK", "WHPKBK", "PKBNBK", "WHBUBK", - "BNBUBK", "WHRDBK", "BNRDBK", - ], - # fmt: on - "IEC": ["BN", "RD", "OG", "YE", "GN", "BU", "VT", "GY", "WH", "BK"], - "BW": ["BK", "WH"], - # 25-pair color code - see also https://en.wikipedia.org/wiki/25-pair_color_code - # 5 major colors (WH,RD,BK,YE,VT) combined with 5 minor colors (BU,OG,GN,BN,SL). - # Each POTS pair tip (+) had major/minor color, and ring (-) had minor/major color. - # fmt: off - "TEL": [ # 25x2: Ring and then tip of each pair - "BUWH", "WHBU", "OGWH", "WHOG", "GNWH", "WHGN", "BNWH", "WHBN", "SLWH", "WHSL", - "BURD", "RDBU", "OGRD", "RDOG", "GNRD", "RDGN", "BNRD", "RDBN", "SLRD", "RDSL", - "BUBK", "BKBU", "OGBK", "BKOG", "GNBK", "BKGN", "BNBK", "BKBN", "SLBK", "BKSL", - "BUYE", "YEBU", "OGYE", "YEOG", "GNYE", "YEGN", "BNYE", "YEBN", "SLYE", "YESL", - "BUVT", "VTBU", "OGVT", "VTOG", "GNVT", "VTGN", "BNVT", "VTBN", "SLVT", "VTSL", - ], - "TELALT": [ # 25x2: Tip and then ring of each pair - "WHBU", "BU", "WHOG", "OG", "WHGN", "GN", "WHBN", "BN", "WHSL", "SL", - "RDBU", "BURD", "RDOG", "OGRD", "RDGN", "GNRD", "RDBN", "BNRD", "RDSL", "SLRD", - "BKBU", "BUBK", "BKOG", "OGBK", "BKGN", "GNBK", "BKBN", "BNBK", "BKSL", "SLBK", - "YEBU", "BUYE", "YEOG", "OGYE", "YEGN", "GNYE", "YEBN", "BNYE", "YESL", "SLYE", - "VTBU", "BUVT", "VTOG", "OGVT", "VTGN", "GNVT", "VTBN", "BNVT", "VTSL", "SLVT", - ], - # fmt: on - "T568A": ["WHGN", "GN", "WHOG", "BU", "WHBU", "OG", "WHBN", "BN"], - "T568B": ["WHOG", "OG", "WHGN", "BU", "WHBU", "GN", "WHBN", "BN"], -} diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 0daaf1d..16dad23 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -17,7 +17,6 @@ from wireviz.DataClasses import ( ShieldClass, WireClass, ) -from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_helper import pn_info_string, remove_links from wireviz.wv_table_util import * # TODO: explicitly import each needed tag later @@ -26,9 +25,7 @@ HEADER_MPN = "MPN" HEADER_SPN = "SPN" -def gv_node_component( - component: Component, harness_options: Options, pad=None -) -> Table: +def gv_node_component(component: Component) -> Table: # If no wires connected (except maybe loop wires)? if isinstance(component, Connector): if not (component.ports_left or component.ports_right): @@ -52,8 +49,8 @@ def gv_node_component( html_line_breaks(component.type), html_line_breaks(component.subtype), f"{component.pincount}-pin" if component.show_pincount else None, - translate_color(component.color, harness_options.color_mode), - colorbar_cell(component.color), + str(component.color) if component.color else None, + colorbar_cell(component.color) if component.color else None, ] elif isinstance(component, Cable): line_info = [ @@ -64,10 +61,12 @@ def gv_node_component( f"{component.length} {component.length_unit}" if component.length > 0 else None, - translate_color(component.color, harness_options.color_mode), - colorbar_cell(component.color), + str(component.color) if component.color else None, + colorbar_cell(component.color) if component.color else None, ] + x = colorbar_cell(component.color) if component.color else None + line_image, line_image_caption = image_and_caption_cells(component) # line_additional_component_table = get_additional_component_table(self, connector) line_additional_component_table = None @@ -79,7 +78,7 @@ def gv_node_component( else: line_ports = None elif isinstance(component, Cable): - line_ports = gv_conductor_table(component, harness_options) + line_ports = gv_conductor_table(component) lines = [ line_name, @@ -109,17 +108,17 @@ def calculate_node_bgcolor(component, harness_options): # assign component node bgcolor at the GraphViz node level # instead of at the HTML table level for better rendering of node outline if component.bgcolor: - return translate_color(component.bgcolor, "HEX") + return component.bgcolor.html elif isinstance(component, Connector) and harness_options.bgcolor_connector: - return translate_color(harness_options.bgcolor_connector, "HEX") + return harness_options.bgcolor_connector.html elif ( isinstance(component, Cable) and component.category == "bundle" and harness_options.bgcolor_bundle ): - return translate_color(harness_options.bgcolor_bundle, "HEX") + return harness_options.bgcolor_bundle.html elif isinstance(component, Cable) and harness_options.bgcolor_cable: - return translate_color(harness_options.bgcolor_cable, "HEX") + return harness_options.bgcolor_cable.html def make_list_of_cells(inp) -> List[Td]: @@ -170,31 +169,25 @@ def nested_table(lines: List[Td]) -> Table: def gv_pin_table(component) -> Table: - pin_tuples = zip_longest( - component.pins, - component.pinlabels, - component.pincolors, - ) - pin_rows = [] - for pinindex, (pinname, pinlabel, pincolor) in enumerate(pin_tuples): - if component.should_show_pin(pinname): - pin_rows.append( - gv_pin_row(pinindex, pinname, pinlabel, pincolor, component) - ) + for pin in component.pin_objects: + if component.should_show_pin(pin.id): # TODO remove True + pin_rows.append(gv_pin_row(pin, component)) tbl = Table(pin_rows, border=0, cellborder=1, cellpadding=3, cellspacing=0) return tbl -def gv_pin_row(pin_index, pin_name, pin_label, pin_color, connector) -> Tr: +def gv_pin_row(pin, connector) -> Tr: # ports in GraphViz are 1-indexed for more natural maping to pin/wire numbers - cell_pin_left = Td(pin_name, port=f"p{pin_index+1}l") - cell_pin_label = Td(pin_label, delete_if_empty=True) - cell_pin_right = Td(pin_name, port=f"p{pin_index+1}r") + cell_pin_left = Td(pin.id, port=f"p{pin.index+1}l") + cell_pin_label = Td(pin.label, delete_if_empty=True) + cell_pin_color = Td(str(pin.color), delete_if_empty=True) + cell_pin_right = Td(pin.id, port=f"p{pin.index+1}r") cells = [ cell_pin_left if connector.ports_left else None, cell_pin_label, + cell_pin_color, # TODO: generate proper color mini-table too cell_pin_right if connector.ports_right else None, ] return Tr(cells) @@ -217,7 +210,7 @@ def gv_connector_loops(connector: Connector) -> List: return loop_edges -def gv_conductor_table(cable, harness_options) -> Table: +def gv_conductor_table(cable) -> Table: rows = [] rows.append(Tr(Td(" "))) # spacer row on top @@ -233,7 +226,7 @@ def gv_conductor_table(cable, harness_options) -> Table: wireinfo = [] if cable.show_wirenumbers and not isinstance(wire, ShieldClass): wireinfo.append(str(wire.id)) - wireinfo.append(translate_color(wire.color, harness_options.color_mode)) + wireinfo.append(str(wire.color)) wireinfo.append(wire.label) ins, outs = [], [] @@ -252,7 +245,7 @@ def gv_conductor_table(cable, harness_options) -> Table: rows.append(Tr(cells_above)) # the wire itself - rows.append(Tr(gv_wire_cell(wire, padding=harness_options._pad))) + rows.append(Tr(gv_wire_cell(wire))) # row below the wire # TODO: PN stuff for bundles @@ -263,16 +256,17 @@ def gv_conductor_table(cable, harness_options) -> Table: return tbl -def gv_wire_cell(wire: Union[WireClass, ShieldClass], padding) -> Td: +def gv_wire_cell(wire: Union[WireClass, ShieldClass]) -> Td: + # import pudb; pudb.set_trace() if wire.color: - color_list = ["#000000"] + get_color_hex(wire.color, pad=padding) + ["#000000"] + color_list = ["#000000"] + wire.color.html_padded_list + ["#000000"] else: color_list = ["#000000"] wire_inner_rows = [] for j, bgcolor in enumerate(color_list[::-1]): wire_inner_cell_attribs = { - "bgcolor": bgcolor if bgcolor != "" else "BK", + "bgcolor": bgcolor if bgcolor != "" else "#000000", "border": 0, "cellpadding": 0, "colspan": 3, @@ -339,16 +333,9 @@ def wire_pn_stuff(): def gv_edge_wire(harness, cable, connection) -> (str, str, str): if connection.via.color: # check if it's an actual wire and not a shield - wire_color = get_color_hex(connection.via.color, pad=harness.options._pad) - color = ":".join(["#000000"] + wire_color + ["#000000"]) + color = f"#000000:{connection.via.color.html_padded}:#000000" else: # it's a shield connection - # shield is shown with specified color and black borders, or as a thin black wire otherwise - if connection.via.color: - shield_color_hex = get_color_hex(connection.via.color)[0] - shield_color_str = ":".join(["#000000", shield_color_hex, "#000000"]) - else: - shield_color_str = "#000000" - color = shield_color_str + color = "#000000" if connection.from_ is not None: # connect to left from_port_str = ( @@ -417,7 +404,7 @@ def gv_edge_mate(mate) -> (str, str, str, str): def colored_cell(contents, bgcolor) -> Td: - return Td(contents, bgcolor=translate_color(bgcolor, "HEX")) + return Td(contents, bgcolor=bgcolor.html) def part_number_str_list(component: Component) -> List[str]: @@ -433,10 +420,7 @@ def part_number_str_list(component: Component) -> List[str]: def colorbar_cell(color) -> Td: - if color: - return Td("", bgcolor=translate_color(color, "HEX"), width=4) - else: - return None + return Td("", bgcolor=color.html, width=4) def image_and_caption_cells(component: Component) -> (Td, Td): @@ -456,7 +440,7 @@ def image_and_caption_cells(component: Component) -> (Td, Td): image_cell.update_attribs( balign="left", - bgcolor=translate_color(component.image.bgcolor, "HEX"), + bgcolor=component.image.bgcolor.html, sides="TLR" if component.image.caption else None, ) @@ -495,7 +479,7 @@ def set_dot_basics(dot, options): "graph", rankdir="LR", ranksep="2", - bgcolor=translate_color(options.bgcolor, "HEX"), + bgcolor=options.bgcolor.html, nodesep="0.33", fontname=options.fontname, ) @@ -506,7 +490,7 @@ def set_dot_basics(dot, options): height="0", margin="0", # Actual size of the node is entirely determined by the label. style="filled", - fillcolor=translate_color(options.bgcolor_node, "HEX"), + fillcolor=options.bgcolor_node.html, fontname=options.fontname, ) dot.attr("edge", style="bold", fontname=options.fontname) diff --git a/src/wireviz/wv_html.py b/src/wireviz/wv_html.py index 1534266..8af39cb 100644 --- a/src/wireviz/wv_html.py +++ b/src/wireviz/wv_html.py @@ -79,7 +79,7 @@ def generate_html_output( replacements = { "": f"{APP_NAME} {__version__} - {APP_URL}", "": options.fontname, - "": wv_colors.translate_color(options.bgcolor, "hex"), + "": options.bgcolor.html, "": svgdata, "": bom_html, "": bom_html_reversed, From 8aa03c496fc027c3974fa14c126249eb77b5cf97 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Wed, 20 Oct 2021 21:04:28 +0200 Subject: [PATCH 096/155] Re-sort `wv_colors.py` --- src/wireviz/wv_colors.py | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/wireviz/wv_colors.py b/src/wireviz/wv_colors.py index be8fefb..95398de 100644 --- a/src/wireviz/wv_colors.py +++ b/src/wireviz/wv_colors.py @@ -5,12 +5,16 @@ from dataclasses import dataclass, field from enum import Enum from typing import List -KnownColor = namedtuple("KnownColor", "html code_de full_en full_de") +padding_amount = 1 ColorOutputMode = Enum( "ColorOutputMode", "EN_LOWER EN_UPPER DE_LOWER DE_UPPER HTML_LOWER HTML_UPPER" ) +color_output_mode = ColorOutputMode.EN_UPPER + +KnownColor = namedtuple("KnownColor", "html code_de full_en full_de") + known_colors = { # v--------v--------- for future use "BK": KnownColor("#000000", "sw", "black", "schwarz"), "WH": KnownColor("#ffffff", "ws", "white", "weiß"), @@ -35,10 +39,6 @@ known_colors = { # v--------v--------- for future use "GD": KnownColor("#ffcf80", "au", "gold", "Gold"), } -color_output_mode = ColorOutputMode.EN_UPPER - -padding_amount = 1 - def convert_case(inp): if "_LOWER" in color_output_mode.name: @@ -54,13 +54,6 @@ def get_color_by_colorcode_index(color_code: str, index: int) -> str: actual_index = index % num_colors_in_code # wrap around if index is out of bounds return COLOR_CODES[color_code][actual_index] - # # make color code loop around if more wires than colors - # if self.wirecount > len(self.colors): - # m = self.wirecount // len(self.colors) + 1 - # self.colors = self.colors * int(m) - # # cut off excess after looping - # self.colors = self.colors[: self.wirecount] - @dataclass class SingleColor: @@ -85,9 +78,8 @@ class SingleColor: @property def known(self): - return ( - self.code_en.upper() in known_colors.keys() if self._code_en else True - ) # ? + # treat None as a known color + return self.code_en.upper() in known_colors.keys() if self._code_en else True def __init__(self, inp): if inp is None: @@ -101,7 +93,7 @@ class SingleColor: inp_upper = inp.upper() self._code_en = inp_upper self._html = known_colors[inp_upper].html - else: # assume valid HTML color + else: # assume it's a valid HTML color name self._html = inp self._code_en = inp @@ -152,9 +144,9 @@ class MultiColor: known = [item.upper() in known_colors.keys() for item in items] if all(known): self.colors = [SingleColor(item) for item in items] - else: # assume it's a HTML color name + else: # assume it's a valud HTML color name self.colors = [SingleColor(inp)] - else: # assume it's a HTML color name + else: # assume it's a valid HTML color name self.colors = [SingleColor(inp)] def __len__(self): From 1a1478ff426c1a287a0347a5114e15cb1544bcb9 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Wed, 20 Oct 2021 21:05:56 +0200 Subject: [PATCH 097/155] Make green color darker --- src/wireviz/wv_colors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wireviz/wv_colors.py b/src/wireviz/wv_colors.py index 95398de..a813339 100644 --- a/src/wireviz/wv_colors.py +++ b/src/wireviz/wv_colors.py @@ -24,7 +24,7 @@ known_colors = { # v--------v--------- for future use "OG": KnownColor("#ff8000", "or", "orange", "orange"), "YE": KnownColor("#ffff00", "ge", "yellow", "gelb"), "OL": KnownColor("#708000", "ol", "olive green", "olivgrün"), - "GN": KnownColor("#00ff00", "gn", "green", "grün"), + "GN": KnownColor("#00aa00", "gn", "green", "grün"), "TQ": KnownColor("#00ffff", "tk", "turquoise", "türkis"), "LB": KnownColor("#a0dfff", "hb", "light blue", "hellblau"), "BU": KnownColor("#0066ff", "bl", "blue", "blau"), From dcc750cf5c077ff2debb4f50bc0953a55bd1ef05 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 12:05:00 +0200 Subject: [PATCH 098/155] Break longer lines not caught by `black` because they were unbroken strings or comments --- src/wireviz/DataClasses.py | 27 ++++++++++++++++++--------- src/wireviz/Harness.py | 12 ++++++++---- src/wireviz/wireviz.py | 17 ++++++++++++----- src/wireviz/wv_cli.py | 5 ++++- src/wireviz/wv_gv_html.py | 15 ++++++++++----- src/wireviz/wv_html.py | 3 ++- 6 files changed, 54 insertions(+), 25 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index a9497ac..fdd70ae 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -14,7 +14,8 @@ from wireviz.wv_colors import ( ) from wireviz.wv_helper import aspect_ratio, awg_equiv, mm2_equiv -# Each type alias have their legal values described in comments - validation might be implemented in the future +# Each type alias have their legal values described in comments +# - validation might be implemented in the future PlainText = str # Text not containing HTML tags nor newlines Hypertext = str # Text possibly including HTML hyperlinks that are removed in all outputs except HTML output MultilineHypertext = ( @@ -280,7 +281,8 @@ class Connector(Component): ) if not self.pincount: raise Exception( - "You need to specify at least one, pincount, pins, pinlabels, or pincolors" + "You need to specify at least one: " + "pincount, pins, pinlabels, or pincolors" ) # create default list for pins (sequential) if not specified @@ -318,7 +320,8 @@ class Connector(Component): for loop in self.loops: # TODO: check that pins to connect actually exist - # TODO: allow using pin labels in addition to pin numbers, just like when defining regular connections + # TODO: allow using pin labels in addition to pin numbers, + # just like when defining regular connections # TODO: include properties of wire used to create the loop if len(loop) != 2: raise Exception("Loops must be between exactly two pins!") @@ -427,13 +430,15 @@ class Cable(Component): g, u = self.gauge.split(" ") except Exception: raise Exception( - f"Cable {self.name} gauge={self.gauge} - Gauge must be a number, or number and unit separated by a space" + f"Cable {self.name} gauge={self.gauge} - " + "Gauge must be a number, or number and unit separated by a space" ) self.gauge = g if self.gauge_unit is not None: print( - f"Warning: Cable {self.name} gauge_unit={self.gauge_unit} is ignored because its gauge contains {u}" + f"Warning: Cable {self.name} gauge_unit={self.gauge_unit} " + f"is ignored because its gauge contains {u}" ) if u.upper() == "AWG": self.gauge_unit = u.upper() @@ -452,12 +457,14 @@ class Cable(Component): L = float(L) except Exception: raise Exception( - f"Cable {self.name} length={self.length} - Length must be a number, or number and unit separated by a space" + f"Cable {self.name} length={self.length} - " + "Length must be a number, or number and unit separated by a space" ) self.length = L if self.length_unit is not None: print( - f"Warning: Cable {self.name} length_unit={self.length_unit} is ignored because its length contains {u}" + f"Warning: Cable {self.name} length_unit={self.length_unit} is ignored " + f"because its length contains {u}" ) self.length_unit = u elif not any(isinstance(self.length, t) for t in [int, float]): @@ -484,7 +491,8 @@ class Cable(Component): else: # wirecount implicit in length of color list if not self.colors: raise Exception( - "Unknown number of wires. Must specify wirecount or colors (implicit length)" + "Unknown number of wires. " + "Must specify wirecount or colors (implicit length)" ) self.wirecount = len(self.colors) @@ -494,7 +502,8 @@ class Cable(Component): '"s" may not be used as a wire label for a shielded cable.' ) - # if lists of part numbers are provided check this is a bundle and that it matches the wirecount. + # if lists of part numbers are provided, + # check this is a bundle and that it matches the wirecount. for idfield in [self.manufacturer, self.mpn, self.supplier, self.spn, self.pn]: if isinstance(idfield, list): if self.category == "bundle": diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index e7a7603..d80efd4 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -88,9 +88,11 @@ class Harness: if pin in connector.pins and pin in connector.pinlabels: if connector.pins.index(pin) != connector.pinlabels.index(pin): raise Exception( - f"{name}:{pin} is defined both in pinlabels and pins, for different pins." + f"{name}:{pin} is defined both in pinlabels and pins, " + "for different pins." ) - # TODO: Maybe issue a warning if present in both lists but referencing the same pin? + # TODO: Maybe issue a warning if present in both lists + # but referencing the same pin? if pin in connector.pinlabels: if connector.pinlabels.count(pin) > 1: raise Exception(f"{name}:{pin} is defined more than once.") @@ -110,9 +112,11 @@ class Harness: if via_wire in cable.colors and via_wire in cable.wirelabels: if cable.colors.index(via_wire) != cable.wirelabels.index(via_wire): raise Exception( - f"{via_name}:{via_wire} is defined both in colors and wirelabels, for different wires." + f"{via_name}:{via_wire} is defined both in colors and wirelabels, " + "for different wires." ) - # TODO: Maybe issue a warning if present in both lists but referencing the same wire? + # TODO: Maybe issue a warning if present in both lists + # but referencing the same wire? if via_wire in cable.colors: if cable.colors.count(via_wire) > 1: raise Exception( diff --git a/src/wireviz/wireviz.py b/src/wireviz/wireviz.py index 6a5df85..45d30e1 100755 --- a/src/wireviz/wireviz.py +++ b/src/wireviz/wireviz.py @@ -93,7 +93,8 @@ def parse( output_file = output_dir / output_name if yaml_file: - # if reading from file, ensure that input file's parent directory is included in image_paths + # if reading from file, ensure that input file's parent directory + # is included in image_paths default_image_path = yaml_file.parent.resolve() if not default_image_path in [Path(x).resolve() for x in image_paths]: image_paths.append(default_image_path) @@ -128,7 +129,8 @@ def parse( if len(yaml_data[sec]) > 0: # section has contents if ty == dict: for key, attribs in yaml_data[sec].items(): - # The Image dataclass might need to open an image file with a relative path. + # The Image dataclass might need to open + # an image file with a relative path. image = attribs.get("image") if isinstance(image, dict): image_path = image["src"] @@ -164,12 +166,16 @@ def parse( autogenerated_designators[template] = ( autogenerated_designators.get(template, 0) + 1 ) - designator = f"{AUTOGENERATED_PREFIX}{template}_{autogenerated_designators[template]}" + designator = ( + f"{AUTOGENERATED_PREFIX}" + "{template}_{autogenerated_designators[template]}" + ) # check if redefining existing component to different template if designator in designators_and_templates: if designators_and_templates[designator] != template: raise Exception( - f"Trying to redefine {designator} from {designators_and_templates[designator]} to {template}" + f"Trying to redefine {designator}" + f" from {designators_and_templates[designator]} to {template}" ) else: designators_and_templates[designator] = template @@ -300,7 +306,8 @@ def parse( f"{template} is an unknown template/designator/arrow." ) - alternate_type() # entries in connection set must alternate between connectors and cables/arrows + # entries in connection set must alternate between connectors and cables/arrows + alternate_type() # transpose connection set list # before: one item per component, one subitem per connection in set diff --git a/src/wireviz/wv_cli.py b/src/wireviz/wv_cli.py index 7315072..c10600f 100644 --- a/src/wireviz/wv_cli.py +++ b/src/wireviz/wv_cli.py @@ -58,7 +58,10 @@ epilog += ", ".join([f"{key} ({value.upper()})" for key, value in format_codes.i "--output-name", default=None, type=str, - help="File name (without extension) to use for output files, if different from input file name.", + help=( + "File name (without extension) to use for output files, " + "if different from input file name." + ), ) @click.option( "-V", diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 16dad23..08b7d1f 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -430,7 +430,8 @@ def image_and_caption_cells(component: Component) -> (Td, Td): image_tag = Img(scale=component.image.scale, src=component.image.src) image_cell_inner = Td(image_tag, flat=True) if component.image.fixedsize: - # further nest the image in a table with width/height/fixedsize parameters, and place that table in a cell + # further nest the image in a table with width/height/fixedsize parameters, + # and place that table in a cell image_cell_inner.update_attribs(**html_size_attr_dict(component.image)) image_cell = Td( Table(Tr(image_cell_inner), border=0, cellborder=0, cellspacing=0, id="!") @@ -500,7 +501,8 @@ def apply_dot_tweaks(dot, tweak): def typecheck(name: str, value: Any, expect: type) -> None: if not isinstance(value, expect): raise Exception( - f"Unexpected value type of {name}: Expected {expect}, got {type(value)}\n{value}" + f"Unexpected value type of {name}: " + f"Expected {expect}, got {type(value)}\n{value}" ) # TODO?: Differ between override attributes and HTML? @@ -530,11 +532,13 @@ def apply_dot_tweaks(dot, tweak): ) if n_subs < 1: print( - f"Harness.create_graph() warning: {attr} not found in {keyword}!" + "Harness.create_graph() warning: " + f"{attr} not found in {keyword}!" ) elif n_subs > 1: print( - f"Harness.create_graph() warning: {attr} removed {n_subs} times in {keyword}!" + "Harness.create_graph() warning: " + f"{attr} removed {n_subs} times in {keyword}!" ) continue @@ -549,7 +553,8 @@ def apply_dot_tweaks(dot, tweak): entry = re.sub(r"\]$", f" {attr}={value}]", entry) elif n_subs > 1: print( - f"Harness.create_graph() warning: {attr} overridden {n_subs} times in {keyword}!" + "Harness.create_graph() warning: " + f"{attr} overridden {n_subs} times in {keyword}!" ) dot.body[i] = entry diff --git a/src/wireviz/wv_html.py b/src/wireviz/wv_html.py index 8af39cb..fb70d1b 100644 --- a/src/wireviz/wv_html.py +++ b/src/wireviz/wv_html.py @@ -25,7 +25,8 @@ def generate_html_output( # load HTML template templatename = metadata.get("template", {}).get("name") if templatename: - # if relative path to template was provided, check directory of YAML file first, fall back to built-in template directory + # if relative path to template was provided, + # check directory of YAML file first, fall back to built-in template directory templatefile = smart_file_resolve( f"{templatename}.html", [Path(filename).parent, Path(__file__).parent / "templates"], From b7f49b043cef4c882ae0e3ee12ce3568e3f58dc0 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 12:09:28 +0200 Subject: [PATCH 099/155] Make variable name more expressive --- src/wireviz/Harness.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index d80efd4..a3d8e41 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -175,12 +175,12 @@ class Harness: # determine if there are double- or triple-colored wires in the harness; # if so, pad single-color wires to make all wires of equal thickness - multicolor_wires = [ + wire_is_multicolor = [ len(wire.color) > 1 for cable in self.cables.values() for wire in cable.wire_objects ] - if any(multicolor_wires): + if any(wire_is_multicolor): wireviz.wv_colors.padding_amount = 3 else: wireviz.wv_colors.padding_amount = 1 From a1db161bb013173176373955625aab495608c88c Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 12:11:04 +0200 Subject: [PATCH 100/155] Apply dot tweaks last --- src/wireviz/Harness.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index a3d8e41..f3971c7 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -208,14 +208,14 @@ class Harness: if not (r1, r2) == (None, None): dot.edge(r1, r2) - apply_dot_tweaks(dot, self.tweak) - for mate in self.mates: color, dir, code_from, code_to = gv_edge_mate(mate) dot.attr("edge", color=color, style="dashed", dir=dir) dot.edge(code_from, code_to) + apply_dot_tweaks(dot, self.tweak) + return dot # cache for the GraphViz Graph object From 4e12f3dc33cd5589ba88b9d4cfa41e4147bc5d3a Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 12:21:00 +0200 Subject: [PATCH 101/155] Remove unused line --- src/wireviz/Harness.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index f3971c7..9d46fbc 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -252,10 +252,6 @@ class Harness: ) -> None: # graphical output graph = self.graph - svg_already_exists = Path( - f"{filename}.svg" - ).exists() # if SVG already exists, do not delete later - # graphical output for f in fmt: if f in ("png", "svg", "html"): if f == "html": # if HTML format is specified, From 9e1e97b1cbc89dd4d0863e6f9dd788a136d8d57b Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 17:15:02 +0200 Subject: [PATCH 102/155] Improve subclassing of components, prepare for BOM refactoring --- src/wireviz/DataClasses.py | 286 +++++++++++++++++++++++----------- src/wireviz/Harness.py | 106 ++++++++++--- src/wireviz/wireviz.py | 10 +- src/wireviz/wv_bom.py | 306 +++++-------------------------------- src/wireviz/wv_gv_html.py | 30 +--- src/wireviz/wv_helper.py | 11 -- 6 files changed, 341 insertions(+), 408 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index fdd70ae..749baf6 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -1,10 +1,12 @@ # -*- coding: utf-8 -*- +from collections import namedtuple from dataclasses import dataclass, field from enum import Enum from itertools import zip_longest from typing import Dict, List, Optional, Tuple, Union +from wireviz.wv_bom import BomHash, BomHashList, PartNumberInfo from wireviz.wv_colors import ( COLOR_CODES, ColorOutputMode, @@ -145,34 +147,6 @@ class Image: self.height = self.width / aspect_ratio(self.src) -@dataclass -class AdditionalComponent: - type: MultilineHypertext - subtype: Optional[MultilineHypertext] = None - manufacturer: Optional[MultilineHypertext] = None - mpn: Optional[MultilineHypertext] = None - supplier: Optional[MultilineHypertext] = None - spn: Optional[MultilineHypertext] = None - pn: Optional[Hypertext] = None - qty: float = 1 - unit: Optional[str] = None - qty_multiplier: Union[ConnectorMultiplier, CableMultiplier, None] = None - bgcolor: SingleColor = None - - def __post_init__(self): - self.bgcolor = SingleColor(self.bgcolor) - - @property - def description(self) -> str: - s = self.type.rstrip() + f", {self.subtype.rstrip()}" if self.subtype else "" - return s - - -@dataclass -class Component: - pass - - @dataclass class PinClass: index: int @@ -220,43 +194,144 @@ class Connection: @dataclass -class Connector(Component): - name: Designator - bgcolor: SingleColor = None - bgcolor_title: SingleColor = None - manufacturer: Optional[MultilineHypertext] = None - mpn: Optional[MultilineHypertext] = None - supplier: Optional[MultilineHypertext] = None - spn: Optional[MultilineHypertext] = None - pn: Optional[Hypertext] = None +class Component: + category: Optional[str] = None # currently only used by cables, to define bundles + type: Union[MultilineHypertext, List[MultilineHypertext]] = None + subtype: Union[MultilineHypertext, List[MultilineHypertext]] = None + + # part number + partnumbers: PartNumberInfo = None # filled by fill_partnumbers() + # the following are provided for user convenience and should not be accessed later. + # their contents are loaded into partnumbers during the child class __post_init__() + pn: str = None + manufacturer: str = None + mpn: str = None + supplier: str = None + spn: str = None + + ignore_in_bom: bool = False + bom_id: Optional[str] = None # to be filled after harness is built + + def fill_partnumbers(self): + self.partnumbers = PartNumberInfo( + self.pn, self.manufacturer, self.mpn, self.supplier, self.spn + ) + + @property + def bom_hash(self) -> BomHash: + def _force_list(inp): + if isinstance(inp, list): + return inp + else: + return [inp for i in range(len(self.colors))] + + if self.category == "bundle": + # create a temporary single item that includes the necessary fields, + # which may or may not be lists + _hash_list = BomHashList( + self.description, + self.unit, + self.partnumbers, + ) + # convert elements that are not lists, into lists + _hash_matrix = list(map(_force_list, [elem for elem in _hash_list])) + # transpose list of lists, convert to tuple for next step + _hash_matrix = list(map(tuple, zip(*_hash_matrix))) + # generate list of BomHashes + hash_list = [BomHash(*item) for item in _hash_matrix] + return hash_list + else: + return BomHash( + self.description, + self.unit, + self.partnumbers, + ) + + +@dataclass +class AdditionalComponent(Component): + qty: float = 1 + unit: Optional[str] = None + qty_multiplier: Union[ConnectorMultiplier, CableMultiplier, None] = None + designators: Optional[str] = None # used for components definedi in the + # additional_bom_items section within another component + bgcolor: SingleColor = None # ^ same here + + def __post_init__(self): + super().fill_partnumbers() + self.bgcolor = SingleColor(self.bgcolor) + + @property + def description(self) -> str: + s = self.type.rstrip() + f", {self.subtype.rstrip()}" if self.subtype else "" + return s + + +@dataclass +class GraphicalComponent(Component): # abstract class, for future use + bgcolor: Optional[SingleColor] = None + + +@dataclass +class TopLevelGraphicalComponent(GraphicalComponent): # abstract class + # component properties + designator: Designator = None + color: Optional[SingleColor] = None + image: Optional[Image] = None + additional_components: List[AdditionalComponent] = field(default_factory=list) + notes: Optional[MultilineHypertext] = None + # rendering options + bgcolor_title: Optional[SingleColor] = None + show_name: Optional[bool] = None + + +@dataclass +class Connector(TopLevelGraphicalComponent): + # connector-specific properties style: Optional[str] = None category: Optional[str] = None - type: Optional[MultilineHypertext] = None - subtype: Optional[MultilineHypertext] = None + loops: List[List[Pin]] = field(default_factory=list) + # pin information in particular pincount: Optional[int] = None - image: Optional[Image] = None - notes: Optional[MultilineHypertext] = None - pins: List[Pin] = field(default_factory=list) - pinlabels: List[Pin] = field(default_factory=list) - pincolors: List[str] = field(default_factory=list) - color: MultiColor = None - show_name: Optional[bool] = None + pins: List[Pin] = field(default_factory=list) # legacy + pinlabels: List[Pin] = field(default_factory=list) # legacy + pincolors: List[str] = field(default_factory=list) # legacy + pin_objects: List[PinClass] = field( + default_factory=list + ) # new, to replace the lists above + # rendering option show_pincount: Optional[bool] = None hide_disconnected_pins: bool = False - loops: List[List[Pin]] = field(default_factory=list) - ignore_in_bom: bool = False - additional_components: List[AdditionalComponent] = field(default_factory=list) - pin_objects: List[PinClass] = field(default_factory=list) @property def is_autogenerated(self): - return self.name.startswith(AUTOGENERATED_PREFIX) + import pudb + + pudb.set_trace() + return self.designator.startswith(AUTOGENERATED_PREFIX) + + @property + def description(self) -> str: + substrs = [ + "Connector", + self.type, + self.subtype, + self.pincount if self.show_pincount else None, + str(self.color) if self.color else None, + ] + return ", ".join([str(s) for s in substrs if s is not None and s != ""]) def should_show_pin(self, pin_name): return not self.hide_disconnected_pins or self.visible_pins.get(pin_name, False) + @property + def unit(self): # for compatibility with BOM hashing + return None # connectors do not support units. + def __post_init__(self) -> None: + super().fill_partnumbers() + self.bgcolor = SingleColor(self.bgcolor) self.bgcolor_title = SingleColor(self.bgcolor_title) self.color = SingleColor(self.color) @@ -305,7 +380,7 @@ class Connector(Component): id=pin_id, label=pin_label, color=MultiColor(pin_color), - parent=self.name, + parent=self.designator, _anonymous=self.is_autogenerated, _simple=self.style == "simple", ) @@ -333,9 +408,9 @@ class Connector(Component): def _check_if_unique_id(self, id): results = [pin for pin in self.pin_objects if pin.id == id] if len(results) == 0: - raise Exception(f"Pin ID {id} not found in {self.name}") + raise Exception(f"Pin ID {id} not found in {self.designator}") if len(results) > 1: - raise Exception(f"Pin ID {id} found more than once in {self.name}") + raise Exception(f"Pin ID {id} found more than once in {self.designator}") return True def get_pin_by_id(self, id): @@ -364,41 +439,36 @@ class Connector(Component): @dataclass -class Cable(Component): - name: Designator - bgcolor: SingleColor = None - bgcolor_title: SingleColor = None - manufacturer: Union[MultilineHypertext, List[MultilineHypertext], None] = None - mpn: Union[MultilineHypertext, List[MultilineHypertext], None] = None - supplier: Union[MultilineHypertext, List[MultilineHypertext], None] = None - spn: Union[MultilineHypertext, List[MultilineHypertext], None] = None - pn: Union[Hypertext, List[Hypertext], None] = None - category: Optional[str] = None - type: Optional[MultilineHypertext] = None +class Cable(TopLevelGraphicalComponent): + # cable-specific properties gauge: Optional[float] = None gauge_unit: Optional[str] = None - show_equiv: bool = False length: float = 0 length_unit: Optional[str] = None - color: MultiColor = None + color_code: Optional[str] = None + # wire information in particular wirecount: Optional[int] = None shield: Union[bool, MultiColor] = False - image: Optional[Image] = None - notes: Optional[MultilineHypertext] = None - colors: List[str] = field(default_factory=list) - wirelabels: List[Wire] = field(default_factory=list) - color_code: Optional[str] = None + colors: List[str] = field(default_factory=list) # legacy + wirelabels: List[Wire] = field(default_factory=list) # legacy + wire_objects: List[WireClass] = field( + default_factory=list + ) # new, to replace the lists above + # internal + _connections: List[Connection] = field(default_factory=list) + # rendering options show_name: Optional[bool] = None + show_equiv: bool = False show_wirecount: bool = True show_wirenumbers: Optional[bool] = None - ignore_in_bom: bool = False - additional_components: List[AdditionalComponent] = field(default_factory=list) - connections: List[Connection] = field(default_factory=list) - wire_objects: List[WireClass] = field(default_factory=list) @property def is_autogenerated(self): - return self.name.startswith(AUTOGENERATED_PREFIX) + return self.designator.startswith(AUTOGENERATED_PREFIX) + + @property + def unit(self): # for compatibility with parent class + return self.length_unit @property def gauge_str(self): @@ -416,8 +486,43 @@ class Cable(Component): equivalent_gauge = f" ({mm2_equiv(self.gauge)} mm\u00B2)" return f"{actual_gauge}{equivalent_gauge}" + @property + def description(self) -> str: + if self.category == "bundle": + desc_list = [] + for index, color in enumerate(self.colors): + substrs = [ + "Wire", + self.type, + self.subtype, + f"{self.gauge} {self.gauge_unit}" if self.gauge else None, + str(self.color) + if self.color + else None, # translate_color(self.color, harness.options.color_mode)] <- get harness.color_mode! + ] + desc_list.append( + ", ".join([s for s in substrs if s is not None and s != ""]) + ) + return desc_list + else: + substrs = [ + ("", "Cable"), + (", ", self.type), + (", ", self.subtype), + (", ", self.wirecount), + (" ", f"x {self.gauge} {self.gauge_unit}" if self.gauge else " wires"), + (" ", "shielded" if self.shield else None), + (", ", str(self.color) if self.color else None), + ] + desc = "".join( + [f"{s[0]}{s[1]}" for s in substrs if s[1] is not None and s[1] != ""] + ) + return desc + def __post_init__(self) -> None: + super().fill_partnumbers() + self.bgcolor = SingleColor(self.bgcolor) self.bgcolor_title = SingleColor(self.bgcolor_title) self.color = SingleColor(self.color) @@ -430,14 +535,14 @@ class Cable(Component): g, u = self.gauge.split(" ") except Exception: raise Exception( - f"Cable {self.name} gauge={self.gauge} - " + f"Cable {self.designator} gauge={self.gauge} - " "Gauge must be a number, or number and unit separated by a space" ) self.gauge = g if self.gauge_unit is not None: print( - f"Warning: Cable {self.name} gauge_unit={self.gauge_unit} " + f"Warning: Cable {self.designator} gauge_unit={self.gauge_unit} " f"is ignored because its gauge contains {u}" ) if u.upper() == "AWG": @@ -457,18 +562,18 @@ class Cable(Component): L = float(L) except Exception: raise Exception( - f"Cable {self.name} length={self.length} - " + f"Cable {self.designator} length={self.length} - " "Length must be a number, or number and unit separated by a space" ) self.length = L if self.length_unit is not None: print( - f"Warning: Cable {self.name} length_unit={self.length_unit} is ignored " + f"Warning: Cable {self.designator} length_unit={self.length_unit} is ignored " f"because its length contains {u}" ) self.length_unit = u elif not any(isinstance(self.length, t) for t in [int, float]): - raise Exception(f"Cable {self.name} length has a non-numeric value") + raise Exception(f"Cable {self.designator} length has a non-numeric value") elif self.length_unit is None: self.length_unit = "m" @@ -526,7 +631,7 @@ class Cable(Component): id=wire_index + 1, # TODO: wire_id label=wire_label, color=MultiColor(wire_color), - parent=self.name, + parent=self.designator, ) ) @@ -541,7 +646,7 @@ class Cable(Component): color=MultiColor(self.shield) if isinstance(self.shield, str) else MultiColor(None), - parent=self.name, + parent=self.designator, ) ) @@ -559,16 +664,19 @@ class Cable(Component): def get_wire_by_id(self, id): wire = [wire for wire in self.wire_objects if wire.id == id] if len(wire) == 0: - raise Exception(f"Wire ID {id} not found in {self.name}") + raise Exception(f"Wire ID {id} not found in {self.designator}") if len(wire) > 1: - raise Exception(f"Wire ID {id} found more than once in {self.name}") + raise Exception(f"Wire ID {id} found more than once in {self.designator}") return wire[0] - def connect( - self, from_pin_obj: [PinClass], via_wire_id: str, to_pin_obj: [PinClass] + def _connect( + self, + from_pin_obj: [PinClass], + via_wire_id: str, + to_pin_obj: [PinClass], ) -> None: via_wire_obj = self.get_wire_by_id(via_wire_id) - self.connections.append(Connection(from_pin_obj, via_wire_obj, to_pin_obj)) + self._connections.append(Connection(from_pin_obj, via_wire_obj, to_pin_obj)) def get_qty_multiplier(self, qty_multiplier: Optional[CableMultiplier]) -> float: if not qty_multiplier: diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 9d46fbc..abde2e9 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -1,12 +1,15 @@ # -*- coding: utf-8 -*- -from dataclasses import dataclass +from collections import defaultdict +from dataclasses import dataclass, field from pathlib import Path +from typing import List from graphviz import Graph import wireviz.wv_colors from wireviz.DataClasses import ( + AdditionalComponent, Arrow, ArrowWeight, Cable, @@ -19,7 +22,6 @@ from wireviz.DataClasses import ( Tweak, ) from wireviz.svgembed import embed_svg_images_file -from wireviz.wv_bom import bom_list, generate_bom from wireviz.wv_gv_html import ( apply_dot_tweaks, calculate_node_bgcolor, @@ -39,19 +41,29 @@ class Harness: metadata: Metadata options: Options tweak: Tweak + additional_bom_items: List[AdditionalComponent] = field(default_factory=list) def __post_init__(self): self.connectors = {} self.cables = {} self.mates = [] - self._bom = [] # Internal Cache for generated bom + self._bom = defaultdict(dict) self.additional_bom_items = [] - def add_connector(self, name: str, *args, **kwargs) -> None: - self.connectors[name] = Connector(name, *args, **kwargs) + def add_connector(self, designator: str, *args, **kwargs) -> None: + conn = Connector(designator=designator, *args, **kwargs) + self.connectors[designator] = conn + self._add_to_internal_bom(conn) - def add_cable(self, name: str, *args, **kwargs) -> None: - self.cables[name] = Cable(name, *args, **kwargs) + def add_cable(self, designator: str, *args, **kwargs) -> None: + cbl = Cable(designator=designator, *args, **kwargs) + self.cables[designator] = cbl + self._add_to_internal_bom(cbl) + + def add_additional_bom_item(self, item: dict) -> None: + new_item = AdditionalComponent(**item) + self.additional_bom_items.append(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: from_con = self.connectors[from_name] @@ -68,8 +80,65 @@ class Harness: arrow = Arrow(direction=parse_arrow_str(arrow_str), weight=ArrowWeight.SINGLE) self.mates.append(MateComponent(from_name, to_name, arrow)) - def add_bom_item(self, item: dict) -> None: - self.additional_bom_items.append(item) + def _add_to_internal_bom(self, item): + if item.ignore_in_bom: + return + + def _add(hash, designator=None, qty=1, category=None): + # generate entry + bom_entry = self._bom[hash] + # initialize missing fields + if not "qty" in bom_entry: + bom_entry["qty"] = 0 + if not "designators" in bom_entry: + bom_entry["designators"] = set() + # update fields + bom_entry["qty"] += qty + if designator: + if isinstance(designator, str): + bom_entry["designators"].add(designator) + else: + bom_entry["designators"].update(designator) + bom_entry["category"] = category + + if isinstance(item, Connector): + _add(item.bom_hash, designator=item.designator, category="connector") + for comp in item.additional_components: + if comp.ignore_in_bom: + continue + _add( + comp.bom_hash, + designator=item.designator, + qty=comp.qty, + category="connector/additional", + ) + elif isinstance(item, Cable): + _bom_hash = item.bom_hash + if isinstance(_bom_hash, list): + _cat = "bundle" + for subhash in _bom_hash: + _add(subhash, designator=item.designator, category=_cat) + else: + _cat = "cable" + _add(item.bom_hash, designator=item.designator, category=_cat) + for comp in item.additional_components: + if comp.ignore_in_bom: + continue + _add( + comp.bom_hash, + designator=item.designator, + qty=comp.qty, + category=f"{_cat}/additional", + ) + elif isinstance(item, AdditionalComponent): # additional component + _add( + item.bom_hash, + designator=item.designators, + qty=item.qty, + category="additional", + ) + else: + raise Exception(f"Unknown type of item:\n{item}") def connect( self, @@ -145,7 +214,7 @@ class Harness: else: to_pin_obj = None - self.cables[via_name].connect(from_pin_obj, via_wire, to_pin_obj) + self.cables[via_name]._connect(from_pin_obj, via_wire, to_pin_obj) if from_name in self.connectors: self.connectors[from_name].activate_pin(from_pin, Side.RIGHT) if to_name in self.connectors: @@ -160,7 +229,7 @@ class Harness: gv_html = gv_node_component(connector) bgcolor = calculate_node_bgcolor(connector, self.options) dot.node( - connector.name, + connector.designator, label=f"<\n{gv_html}\n>", bgcolor=bgcolor, shape="box", @@ -192,7 +261,7 @@ class Harness: bgcolor = calculate_node_bgcolor(cable, self.options) style = "filled,dashed" if cable.category == "bundle" else "filled" dot.node( - cable.name, + cable.designator, label=f"<\n{gv_html}\n>", bgcolor=bgcolor, shape="box", @@ -200,7 +269,7 @@ class Harness: ) # generate wire edges between component nodes and cable nodes - for connection in cable.connections: + for connection in cable._connections: color, l1, l2, r1, r2 = gv_edge_wire(self, cable, connection) dot.attr("edge", color=color) if not (l1, l2) == (None, None): @@ -268,7 +337,8 @@ class Harness: if "gv" in fmt: graph.save(filename=f"{filename}.gv") # BOM output - bomlist = bom_list(self.bom()) + # bomlist = bom_list(self.bom()) + bomlist = [[]] if "tsv" in fmt: open_file_write(f"{filename}.bom.tsv").write(tuplelist2tsv(bomlist)) if "csv" in fmt: @@ -288,7 +358,7 @@ class Harness: elif "svg" in fmt: Path(f"{filename}.tmp.svg").replace(f"{filename}.svg") - def bom(self): - if not self._bom: - self._bom = generate_bom(self) - return self._bom + # def bom(self): + # if not self._bom: + # self._bom = generate_bom(self) + # return self._bom diff --git a/src/wireviz/wireviz.py b/src/wireviz/wireviz.py index 45d30e1..a8c5e8b 100755 --- a/src/wireviz/wireviz.py +++ b/src/wireviz/wireviz.py @@ -168,7 +168,7 @@ def parse( ) designator = ( f"{AUTOGENERATED_PREFIX}" - "{template}_{autogenerated_designators[template]}" + f"{template}_{autogenerated_designators[template]}" ) # check if redefining existing component to different template if designator in designators_and_templates: @@ -288,7 +288,7 @@ def parse( # generate new connector instance from template check_type(designator, template, "connector") harness.add_connector( - name=designator, **template_connectors[template] + designator=designator, **template_connectors[template] ) elif designator in harness.cables: # existing cable instance @@ -296,7 +296,9 @@ def parse( elif template in template_cables.keys(): # generate new cable instance from template check_type(designator, template, "cable/arrow") - harness.add_cable(name=designator, **template_cables[template]) + harness.add_cable( + designator=designator, **template_cables[template] + ) elif is_arrow(designator): check_type(designator, template, "cable/arrow") @@ -366,7 +368,7 @@ def parse( if "additional_bom_items" in yaml_data: for line in yaml_data["additional_bom_items"]: - harness.add_bom_item(line) + harness.add_additional_bom_item(line) if output_formats: harness.output(filename=output_file, fmt=output_formats, view=False) diff --git a/src/wireviz/wv_bom.py b/src/wireviz/wv_bom.py index 4e075a3..f8a0c3b 100644 --- a/src/wireviz/wv_bom.py +++ b/src/wireviz/wv_bom.py @@ -1,277 +1,55 @@ # -*- coding: utf-8 -*- -from dataclasses import asdict -from itertools import groupby -from typing import Any, Dict, List, Optional, Tuple, Union +from collections import namedtuple +from dataclasses import dataclass +from enum import Enum +from typing import List, Optional, Union -from wireviz.DataClasses import AdditionalComponent, Cable, Connector -from wireviz.wv_gv_html import html_line_breaks -from wireviz.wv_helper import clean_whitespace, pn_info_string +BOM_HASH_FIELDS = "description unit partnumbers" +BomHash = namedtuple("BomHash", BOM_HASH_FIELDS) +BomHashList = namedtuple("BomHashList", BOM_HASH_FIELDS) -BOM_COLUMNS_ALWAYS = ("id", "description", "qty", "unit", "designators") -BOM_COLUMNS_OPTIONAL = ("pn", "manufacturer", "mpn", "supplier", "spn") -BOM_COLUMNS_IN_KEY = ("description", "unit") + BOM_COLUMNS_OPTIONAL +BomCategory = Enum( + "BomEntry", "CONNECTOR CABLE WIRE ADDITIONAL_INSIDE ADDITIONAL_OUTSIDE" +) -HEADER_PN = "P/N" -HEADER_MPN = "MPN" -HEADER_SPN = "SPN" +PartNumberInfo = namedtuple("PartNumberInfo", "pn manufacturer mpn supplier spn") -BOMKey = Tuple[str, ...] -BOMColumn = str # = Literal[*BOM_COLUMNS_ALWAYS, *BOM_COLUMNS_OPTIONAL] -BOMEntry = Dict[BOMColumn, Union[str, int, float, List[str], None]] +PART_NUMBER_HEADERS = PartNumberInfo( + pn="P/N", manufacturer=None, mpn="MPN", supplier=None, spn="SPN" +) -def optional_fields(part: Union[Connector, Cable, AdditionalComponent]) -> BOMEntry: - """Return part field values for the optional BOM columns as a dict.""" - part = asdict(part) - return {field: part.get(field) for field in BOM_COLUMNS_OPTIONAL} +@dataclass +class BomEntry: + hash: BomHash # includes description, part number info, + description: str + qty: Union[int, float] + unit: str + designators: List[str] + _category: BomCategory # for sorting -def get_additional_component_table( - harness: "Harness", component: Union[Connector, Cable] -) -> List[str]: - """Return a list of diagram node table row strings with additional components.""" - rows = [] - if component.additional_components: - rows.append(["Additional components"]) - for part in component.additional_components: - common_args = { - "qty": part.qty * component.get_qty_multiplier(part.qty_multiplier), - "unit": part.unit, - "bgcolor": part.bgcolor, - } - if harness.options.mini_bom_mode: - id = get_bom_index( - harness.bom(), - bom_entry_key({**asdict(part), "description": part.description}), - ) - rows.append( - component_table_entry( - f"#{id} ({part.type.rstrip()})", **common_args - ) - ) - else: - rows.append( - component_table_entry( - part.description, **common_args, **optional_fields(part) - ) - ) - return rows - - -def get_additional_component_bom(component: Union[Connector, Cable]) -> List[BOMEntry]: - """Return a list of BOM entries with additional components.""" - bom_entries = [] - for part in component.additional_components: - bom_entries.append( - { - "description": part.description, - "qty": part.qty * component.get_qty_multiplier(part.qty_multiplier), - "unit": part.unit, - "designators": component.name if component.show_name else None, - **optional_fields(part), - } - ) - return bom_entries - - -def bom_entry_key(entry: BOMEntry) -> BOMKey: - """Return a tuple of string values from the dict that must be equal to join BOM entries.""" - if "key" not in entry: - entry["key"] = tuple( - clean_whitespace(make_str(entry.get(c))) for c in BOM_COLUMNS_IN_KEY - ) - return entry["key"] - - -def generate_bom(harness: "Harness") -> List[BOMEntry]: - """Return a list of BOM entries generated from the harness.""" - from wireviz.Harness import Harness # Local import to avoid circular imports - - bom_entries = [] - # connectors - for connector in harness.connectors.values(): - if not connector.ignore_in_bom: - description = ( - "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", xxx" # {translate_color(connector.color, harness.options.color_mode)} - if connector.color - else "" - ) - ) - bom_entries.append( - { - "description": description, - "designators": connector.name if connector.show_name else None, - **optional_fields(connector), - } - ) - - # add connectors aditional components to bom - bom_entries.extend(get_additional_component_bom(connector)) - - # cables - # TODO: If category can have other non-empty values than 'bundle', maybe it should be part of description? - for cable in harness.cables.values(): - if not cable.ignore_in_bom: - if cable.category != "bundle": - # process cable as a single entity - description = ( - "Cable" - + (f", {cable.type}" if cable.type else "") - + (f", {cable.wirecount}") - + ( - f" x {cable.gauge} {cable.gauge_unit}" - if cable.gauge - else " wires" - ) - + (" shielded" if cable.shield else "") - + ( - f", xxx" # {translate_color(cable.color, harness.options.color_mode)} - if cable.color - else "" - ) - ) - bom_entries.append( - { - "description": description, - "qty": cable.length, - "unit": cable.length_unit, - "designators": cable.name if cable.show_name else None, - **optional_fields(cable), - } - ) - else: - # add each wire from the bundle to the bom - for index, color in enumerate(cable.colors): - description = ( - "Wire" - + (f", {cable.type}" if cable.type else "") - + (f", {cable.gauge} {cable.gauge_unit}" if cable.gauge else "") - + ( - f", xxx" # {translate_color(color, harness.options.color_mode)} - if color - else "" - ) - ) - bom_entries.append( - { - "description": description, - "qty": cable.length, - "unit": cable.length_unit, - "designators": cable.name if cable.show_name else None, - **{ - k: index_if_list(v, index) - for k, v in optional_fields(cable).items() - }, - } - ) - - # add cable/bundles aditional components to bom - bom_entries.extend(get_additional_component_bom(cable)) - - # add harness aditional components to bom directly, as they both are List[BOMEntry] - bom_entries.extend(harness.additional_bom_items) - - # remove line breaks if present and cleanup any resulting whitespace issues - bom_entries = [ - {k: clean_whitespace(v) for k, v in entry.items()} for entry in bom_entries +def partnumbers_to_list(partnumbers: PartNumberInfo) -> List[str]: + cell_contents = [ + pn_info_string(PART_NUMBER_HEADERS.pn, None, partnumbers.pn), + pn_info_string( + PART_NUMBER_HEADERS.mpn, partnumbers.manufacturer, partnumbers.mpn + ), + pn_info_string(PART_NUMBER_HEADERS.spn, partnumbers.supplier, partnumbers.spn), ] - - # deduplicate bom - bom = [] - for _, group in groupby(sorted(bom_entries, key=bom_entry_key), key=bom_entry_key): - group_entries = list(group) - designators = sum( - (make_list(entry.get("designators")) for entry in group_entries), [] - ) - total_qty = sum(entry.get("qty", 1) for entry in group_entries) - bom.append( - { - **group_entries[0], - "qty": round(total_qty, 3), - "designators": sorted(set(designators)), - } - ) - - # add an incrementing id to each bom entry - return [{**entry, "id": index} for index, entry in enumerate(bom, 1)] + if any(cell_contents): + return [html_line_breaks(cell) for cell in cell_contents] + else: + return None -def get_bom_index(bom: List[BOMEntry], target: BOMKey) -> int: - """Return id of BOM entry or raise exception if not found.""" - for entry in bom: - if bom_entry_key(entry) == target: - return entry["id"] - raise Exception("Internal error: No BOM entry found matching: " + "|".join(target)) - - -def bom_list(bom: List[BOMEntry]) -> List[List[str]]: - """Return list of BOM rows as lists of column strings with headings in top row.""" - keys = list(BOM_COLUMNS_ALWAYS) # Always include this fixed set of BOM columns. - for fieldname in BOM_COLUMNS_OPTIONAL: - # Include only those optional BOM columns that are in use. - if any(entry.get(fieldname) for entry in bom): - keys.append(fieldname) - # Custom mapping from internal name to BOM column headers. - # Headers not specified here are generated by capitilising the internal name. - bom_headings = { - "pn": HEADER_PN, - "mpn": HEADER_MPN, - "spn": HEADER_SPN, - } - return [ - [bom_headings.get(k, k.capitalize()) for k in keys] - ] + [ # Create header row with key names - [make_str(entry.get(k)) for k in keys] for entry in bom - ] # Create string list for each entry row - - -def component_table_entry( - type: str, - qty: Union[int, float], - unit: Optional[str] = None, - bgcolor: Optional[str] = None, - pn: Optional[str] = None, - manufacturer: Optional[str] = None, - mpn: Optional[str] = None, - supplier: Optional[str] = None, - spn: Optional[str] = None, -) -> str: - """Return a diagram node table row string with an additional component.""" - part_number_list = [ - pn_info_string(HEADER_PN, None, pn), - pn_info_string(HEADER_MPN, manufacturer, mpn), - pn_info_string(HEADER_SPN, supplier, spn), - ] - output = ( - f"{qty}" - + (f" {unit}" if unit else "") - + f" x {type}" - + ("
" if any(part_number_list) else "") - + (", ".join([pn for pn in part_number_list if pn])) - ) - # format the above output as left aligned text in a single visible cell - # indent is set to two to match the indent in the generated html table - return f""" - -
{html_line_breaks(output)}
""" - - -def index_if_list(value: Any, index: int) -> Any: - """Return the value indexed if it is a list, or simply the value otherwise.""" - return value[index] if isinstance(value, list) else value - - -def make_list(value: Any) -> list: - """Return value if a list, empty list if None, or single element list otherwise.""" - return value if isinstance(value, list) else [] if value is None else [value] - - -def make_str(value: Any) -> str: - """Return comma separated elements if a list, empty string if None, or value as a string otherwise.""" - return ", ".join(str(element) for element in make_list(value)) +def pn_info_string( + header: str, name: Optional[str], number: Optional[str] +) -> Optional[str]: + """Return the company name and/or the part number in one single string or None otherwise.""" + number = str(number).strip() if number is not None else "" + if name or number: + return f'{name if name else header}{": " + number if number else ""}' + else: + return None diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 08b7d1f..3e75a3d 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -14,16 +14,14 @@ from wireviz.DataClasses import ( MateComponent, MatePin, Options, + PartNumberInfo, ShieldClass, WireClass, ) -from wireviz.wv_helper import pn_info_string, remove_links +from wireviz.wv_bom import partnumbers_to_list +from wireviz.wv_helper import remove_links from wireviz.wv_table_util import * # TODO: explicitly import each needed tag later -HEADER_PN = "P/N" -HEADER_MPN = "MPN" -HEADER_SPN = "SPN" - def gv_node_component(component: Component) -> Table: # If no wires connected (except maybe loop wires)? @@ -33,12 +31,12 @@ def gv_node_component(component: Component) -> Table: # generate all rows to be shown in the node if component.show_name: - str_name = f"{remove_links(component.name)}" + str_name = f"{remove_links(component.designator)}" line_name = colored_cell(str_name, component.bgcolor_title) else: line_name = None - line_pn = part_number_str_list(component) + line_pn = partnumbers_to_list(component.partnumbers) is_simple_connector = ( isinstance(component, Connector) and component.style == "simple" @@ -204,8 +202,8 @@ def gv_connector_loops(connector: Connector) -> List: else: raise Exception("No side for loops") for loop in connector.loops: - head = f"{connector.name}:p{loop[0]}{loop_side}:{loop_dir}" - tail = f"{connector.name}:p{loop[1]}{loop_side}:{loop_dir}" + head = f"{connector.designator}:p{loop[0]}{loop_side}:{loop_dir}" + tail = f"{connector.designator}:p{loop[1]}{loop_side}:{loop_dir}" loop_edges.append((head, tail)) return loop_edges @@ -230,7 +228,7 @@ def gv_conductor_table(cable) -> Table: wireinfo.append(wire.label) ins, outs = [], [] - for conn in cable.connections: + for conn in cable._connections: if conn.via.id == wire.id: if conn.from_ is not None: ins.append(str(conn.from_)) @@ -407,18 +405,6 @@ def colored_cell(contents, bgcolor) -> Td: return Td(contents, bgcolor=bgcolor.html) -def part_number_str_list(component: Component) -> List[str]: - cell_contents = [ - pn_info_string(HEADER_PN, None, component.pn), - pn_info_string(HEADER_MPN, component.manufacturer, component.mpn), - pn_info_string(HEADER_SPN, component.supplier, component.spn), - ] - if any(cell_contents): - return [html_line_breaks(cell) for cell in cell_contents] - else: - return None - - def colorbar_cell(color) -> Td: return Td("", bgcolor=color.html, width=4) diff --git a/src/wireviz/wv_helper.py b/src/wireviz/wv_helper.py index fdc1e7a..f86dfa3 100644 --- a/src/wireviz/wv_helper.py +++ b/src/wireviz/wv_helper.py @@ -176,14 +176,3 @@ def smart_file_resolve(filename: str, possible_paths: (str, List[str])) -> Path: f"{filename} was not found in any of the following locations: \n" + "\n".join([str(x) for x in possible_paths]) ) - - -def pn_info_string( - header: str, name: Optional[str], number: Optional[str] -) -> Optional[str]: - """Return the company name and/or the part number in one single string or None otherwise.""" - number = str(number).strip() if number is not None else "" - if name or number: - return f'{name if name else header}{": " + number if number else ""}' - else: - return None From 7294bf18e1dba1fc795a38d4088f004ece7a1ab0 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 19:36:23 +0200 Subject: [PATCH 103/155] Clean up --- src/wireviz/DataClasses.py | 3 --- src/wireviz/wv_gv_html.py | 1 - 2 files changed, 4 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index 749baf6..ce48164 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -305,9 +305,6 @@ class Connector(TopLevelGraphicalComponent): @property def is_autogenerated(self): - import pudb - - pudb.set_trace() return self.designator.startswith(AUTOGENERATED_PREFIX) @property diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 3e75a3d..80f0de4 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -255,7 +255,6 @@ def gv_conductor_table(cable) -> Table: def gv_wire_cell(wire: Union[WireClass, ShieldClass]) -> Td: - # import pudb; pudb.set_trace() if wire.color: color_list = ["#000000"] + wire.color.html_padded_list + ["#000000"] else: From d9f0c3f07c9a2371b810008916477581cd1b8dc5 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 20:25:28 +0200 Subject: [PATCH 104/155] Include nested additional components in BOM --- src/wireviz/Harness.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index abde2e9..feb312f 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -54,11 +54,15 @@ class Harness: conn = Connector(designator=designator, *args, **kwargs) self.connectors[designator] = conn self._add_to_internal_bom(conn) + for addcom in conn.additional_components: + self._add_to_internal_bom(addcom) def add_cable(self, designator: str, *args, **kwargs) -> None: cbl = Cable(designator=designator, *args, **kwargs) self.cables[designator] = cbl self._add_to_internal_bom(cbl) + for addcom in cbl.additional_components: + self._add_to_internal_bom(addcom) def add_additional_bom_item(self, item: dict) -> None: new_item = AdditionalComponent(**item) From a59149b8a8fe318b4cb51cc5f5a3740b7d84c92e Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 20:25:42 +0200 Subject: [PATCH 105/155] do not add autogenerated designators to BOM --- src/wireviz/Harness.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index feb312f..dcb4efd 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -9,6 +9,7 @@ from graphviz import Graph import wireviz.wv_colors from wireviz.DataClasses import ( + AUTOGENERATED_PREFIX, AdditionalComponent, Arrow, ArrowWeight, @@ -98,10 +99,10 @@ class Harness: bom_entry["designators"] = set() # update fields bom_entry["qty"] += qty - if designator: + if designator and not designator.startswith(AUTOGENERATED_PREFIX): if isinstance(designator, str): bom_entry["designators"].add(designator) - else: + else: # list bom_entry["designators"].update(designator) bom_entry["category"] = category From 1cba27fba0a1694d42de5623603aef1d3e7d1ad0 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 20:58:52 +0200 Subject: [PATCH 106/155] Improve BOM generation (TODO: wires from a bundle) --- src/wireviz/DataClasses.py | 15 ++++++++------- src/wireviz/Harness.py | 31 ++++++++++++++++--------------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index ce48164..69c7316 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -14,7 +14,7 @@ from wireviz.wv_colors import ( SingleColor, get_color_by_colorcode_index, ) -from wireviz.wv_helper import aspect_ratio, awg_equiv, mm2_equiv +from wireviz.wv_helper import aspect_ratio, awg_equiv, mm2_equiv, remove_links # Each type alias have their legal values described in comments # - validation might be implemented in the future @@ -213,9 +213,10 @@ class Component: bom_id: Optional[str] = None # to be filled after harness is built def fill_partnumbers(self): - self.partnumbers = PartNumberInfo( - self.pn, self.manufacturer, self.mpn, self.supplier, self.spn - ) + partnos = [self.pn, self.manufacturer, self.mpn, self.supplier, self.spn] + partnos = [remove_links(entry) for entry in partnos] + partnos = tuple(partnos) + self.partnumbers = PartNumberInfo(*partnos) @property def bom_hash(self) -> BomHash: @@ -263,8 +264,8 @@ class AdditionalComponent(Component): @property def description(self) -> str: - s = self.type.rstrip() + f", {self.subtype.rstrip()}" if self.subtype else "" - return s + substrs = [self.type, self.subtype if self.subtype else ""] + return ", ".join(substrs) @dataclass @@ -313,7 +314,7 @@ class Connector(TopLevelGraphicalComponent): "Connector", self.type, self.subtype, - self.pincount if self.show_pincount else None, + f"{self.pincount} pins" if self.show_pincount else None, str(self.color) if self.color else None, ] return ", ".join([str(s) for s in substrs if s is not None and s != ""]) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index dcb4efd..d619a1c 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -14,6 +14,7 @@ from wireviz.DataClasses import ( Arrow, ArrowWeight, Cable, + Component, Connector, MateComponent, MatePin, @@ -55,15 +56,11 @@ class Harness: conn = Connector(designator=designator, *args, **kwargs) self.connectors[designator] = conn self._add_to_internal_bom(conn) - for addcom in conn.additional_components: - self._add_to_internal_bom(addcom) def add_cable(self, designator: str, *args, **kwargs) -> None: cbl = Cable(designator=designator, *args, **kwargs) self.cables[designator] = cbl self._add_to_internal_bom(cbl) - for addcom in cbl.additional_components: - self._add_to_internal_bom(addcom) def add_additional_bom_item(self, item: dict) -> None: new_item = AdditionalComponent(**item) @@ -85,7 +82,7 @@ class Harness: arrow = Arrow(direction=parse_arrow_str(arrow_str), weight=ArrowWeight.SINGLE) self.mates.append(MateComponent(from_name, to_name, arrow)) - def _add_to_internal_bom(self, item): + def _add_to_internal_bom(self, item: Component): if item.ignore_in_bom: return @@ -99,11 +96,15 @@ class Harness: bom_entry["designators"] = set() # update fields bom_entry["qty"] += qty - if designator and not designator.startswith(AUTOGENERATED_PREFIX): - if isinstance(designator, str): - bom_entry["designators"].add(designator) - else: # list - bom_entry["designators"].update(designator) + if designator is None: + designator_list = [] + elif isinstance(designator, list): + designator_list = designator + else: + designator_list = [designator] + for des in designator_list: + if des and not des.startswith(AUTOGENERATED_PREFIX): + bom_entry["designators"].add(des) bom_entry["category"] = category if isinstance(item, Connector): @@ -119,13 +120,13 @@ class Harness: ) elif isinstance(item, Cable): _bom_hash = item.bom_hash - if isinstance(_bom_hash, list): - _cat = "bundle" - for subhash in _bom_hash: - _add(subhash, designator=item.designator, category=_cat) + if item.category == "bundle": + _cat = "wire" + for wire in item.wire_objects: + _add(None, qty=item.length+.001, designator=item.designator, category="wire DUMMY") else: _cat = "cable" - _add(item.bom_hash, designator=item.designator, category=_cat) + _add(item.bom_hash, qty=item.length, designator=item.designator, category="cable") for comp in item.additional_components: if comp.ignore_in_bom: continue From cb07d51b2f42e23e7ca9b9d7272fbac89bb74bde Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 22:07:30 +0200 Subject: [PATCH 107/155] Prepare `harness.populate_bom()` --- src/wireviz/DataClasses.py | 7 ++++++- src/wireviz/Harness.py | 34 ++++++++++++++++++++++++++-------- src/wireviz/wireviz.py | 2 ++ src/wireviz/wv_bom.py | 2 ++ src/wireviz/wv_gv_html.py | 6 +----- src/wireviz/wv_helper.py | 4 ++++ src/wireviz/wv_html.py | 2 +- 7 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index 69c7316..70a2079 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -253,7 +253,7 @@ class Component: class AdditionalComponent(Component): qty: float = 1 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 # additional_bom_items section within another component bgcolor: SingleColor = None # ^ same here @@ -262,6 +262,10 @@ class AdditionalComponent(Component): super().fill_partnumbers() self.bgcolor = SingleColor(self.bgcolor) + @property + def qty_final(self): + return 999 + @property def description(self) -> str: substrs = [self.type, self.subtype if self.subtype else ""] @@ -424,6 +428,7 @@ class Connector(TopLevelGraphicalComponent): self.ports_right = True 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: return 1 elif qty_multiplier == "pincount": diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index d619a1c..1d722e7 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -55,17 +55,17 @@ class Harness: def add_connector(self, designator: str, *args, **kwargs) -> None: conn = Connector(designator=designator, *args, **kwargs) 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: cbl = Cable(designator=designator, *args, **kwargs) 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: new_item = AdditionalComponent(**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: from_con = self.connectors[from_name] @@ -115,7 +115,7 @@ class Harness: _add( comp.bom_hash, designator=item.designator, - qty=comp.qty, + qty=comp.qty_final, category="connector/additional", ) elif isinstance(item, Cable): @@ -123,29 +123,47 @@ class Harness: if item.category == "bundle": _cat = "wire" 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: _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: if comp.ignore_in_bom: continue _add( comp.bom_hash, designator=item.designator, - qty=comp.qty, + qty=comp.qty_final, category=f"{_cat}/additional", ) elif isinstance(item, AdditionalComponent): # additional component _add( item.bom_hash, designator=item.designators, - qty=item.qty, + qty=item.qty_final, category="additional", ) else: 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( self, from_name: str, diff --git a/src/wireviz/wireviz.py b/src/wireviz/wireviz.py index a8c5e8b..f36b12b 100755 --- a/src/wireviz/wireviz.py +++ b/src/wireviz/wireviz.py @@ -370,6 +370,8 @@ def parse( for line in yaml_data["additional_bom_items"]: harness.add_additional_bom_item(line) + harness.populate_bom() + if output_formats: harness.output(filename=output_file, fmt=output_formats, view=False) diff --git a/src/wireviz/wv_bom.py b/src/wireviz/wv_bom.py index f8a0c3b..9cc0fbe 100644 --- a/src/wireviz/wv_bom.py +++ b/src/wireviz/wv_bom.py @@ -5,6 +5,8 @@ from dataclasses import dataclass from enum import Enum from typing import List, Optional, Union +from wireviz.wv_helper import html_line_breaks + BOM_HASH_FIELDS = "description unit partnumbers" BomHash = namedtuple("BomHash", BOM_HASH_FIELDS) BomHashList = namedtuple("BomHashList", BOM_HASH_FIELDS) diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 80f0de4..7d63ca9 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -19,7 +19,7 @@ from wireviz.DataClasses import ( WireClass, ) 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 @@ -454,10 +454,6 @@ def html_size_attr_dict(image): return attr_dict -def html_line_breaks(inp): - return remove_links(inp).replace("\n", "
") if isinstance(inp, str) else inp - - def set_dot_basics(dot, options): dot.body.append(f"// Graph generated by {APP_NAME} {__version__}") dot.body.append(f"// {APP_URL}") diff --git a/src/wireviz/wv_helper.py b/src/wireviz/wv_helper.py index f86dfa3..f1b4993 100644 --- a/src/wireviz/wv_helper.py +++ b/src/wireviz/wv_helper.py @@ -100,6 +100,10 @@ def tuplelist2tsv(inp, header=None): return output +def html_line_breaks(inp): + return remove_links(inp).replace("\n", "
") if isinstance(inp, str) else inp + + def remove_links(inp): return ( re.sub(r"<[aA] [^>]*>([^<]*)", r"\1", inp) diff --git a/src/wireviz/wv_html.py b/src/wireviz/wv_html.py index fb70d1b..16a5d58 100644 --- a/src/wireviz/wv_html.py +++ b/src/wireviz/wv_html.py @@ -6,9 +6,9 @@ from typing import Dict, List, Union from wireviz import APP_NAME, APP_URL, __version__, wv_colors from wireviz.DataClasses import Metadata, Options -from wireviz.wv_gv_html import html_line_breaks from wireviz.wv_helper import ( flatten2d, + html_line_breaks, open_file_read, open_file_write, smart_file_resolve, From aa134fbf4e06747f7ee95d3c2bdd625592e51bb5 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 22:08:57 +0200 Subject: [PATCH 108/155] Change `description` to `type` in additional BOM item YAML --- tutorial/tutorial08.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/tutorial08.yml b/tutorial/tutorial08.yml index 1e5e4f2..84d5306 100644 --- a/tutorial/tutorial08.yml +++ b/tutorial/tutorial08.yml @@ -75,7 +75,7 @@ connections: additional_bom_items: - # define an additional item to add to the bill of materials (does not appear in graph) - description: Label, pinout information + type: Label, pinout information qty: 2 designators: - X2 From 38f92e72bb8c410b9563f22a479813250423c746 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 22:13:46 +0200 Subject: [PATCH 109/155] Define CLI epilog str in single statement --- src/wireviz/wv_cli.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/wireviz/wv_cli.py b/src/wireviz/wv_cli.py index c10600f..07aac12 100644 --- a/src/wireviz/wv_cli.py +++ b/src/wireviz/wv_cli.py @@ -23,9 +23,11 @@ format_codes = { "t": "tsv", } -epilog = "The -f or --format option accepts a string containing one or more of the " -epilog += "following characters to specify which file types to output:\n" -epilog += ", ".join([f"{key} ({value.upper()})" for key, value in format_codes.items()]) +epilog = ( + "The -f or --format option accepts a string containing one or more of the " + "following characters to specify which file types to output:\n" + f", ".join([f"{key} ({value.upper()})" for key, value in format_codes.items()]) +) @click.command(epilog=epilog, no_args_is_help=True) @@ -74,7 +76,7 @@ def wireviz(file, format, prepend, output_dir, output_name, version): """ Parses the provided FILE and generates the specified outputs. """ - print() + print() # blank line before execution print(f"{APP_NAME} {__version__}") if version: return # print version number only and exit @@ -145,7 +147,7 @@ def wireviz(file, format, prepend, output_dir, output_name, version): image_paths=list(image_paths), ) - print() + print() # blank line after execution if __name__ == "__main__": From 56e37b6f696da3b7d0f1f4fef6d1f36f626c13bb Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 22:47:47 +0200 Subject: [PATCH 110/155] Deprecate Python 3.7, add Python 3.10 --- .github/workflows/main.yml | 2 +- setup.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 301ac18..d539aa2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,7 +8,7 @@ jobs: strategy: max-parallel: 4 matrix: - python-version: [3.7, 3.8] + python-version: ["3.8", "3.10"] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} diff --git a/setup.py b/setup.py index 8cdd486..6ce5013 100644 --- a/setup.py +++ b/setup.py @@ -37,8 +37,9 @@ setup( "Development Status :: 4 - Beta", "Environment :: Console", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", "Topic :: Utilities", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", ], From 10cf62e166d66f4fd749d71055eaa6d550e52e51 Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Thu, 21 Oct 2021 22:41:24 +0200 Subject: [PATCH 111/155] Rename modules, adjust imports, move `build_examples.py` --- .github/workflows/main.yml | 4 +- src/wireviz/svgembed.py | 52 ----- src/wireviz/{ => tools}/build_examples.py | 7 +- src/wireviz/wireviz.py | 19 +- src/wireviz/wv_bom.py | 2 +- src/wireviz/wv_cli.py | 5 +- .../{DataClasses.py => wv_dataclasses.py} | 2 +- src/wireviz/{wv_gv_html.py => wv_graphviz.py} | 8 +- src/wireviz/{Harness.py => wv_harness.py} | 9 +- src/wireviz/wv_html.py | 209 +++++++++--------- src/wireviz/wv_output.py | 168 ++++++++++++++ src/wireviz/wv_table_util.py | 125 ----------- src/wireviz/{wv_helper.py => wv_utils.py} | 0 13 files changed, 299 insertions(+), 311 deletions(-) delete mode 100644 src/wireviz/svgembed.py rename src/wireviz/{ => tools}/build_examples.py (96%) rename src/wireviz/{DataClasses.py => wv_dataclasses.py} (99%) rename src/wireviz/{wv_gv_html.py => wv_graphviz.py} (99%) rename src/wireviz/{Harness.py => wv_harness.py} (98%) create mode 100644 src/wireviz/wv_output.py delete mode 100644 src/wireviz/wv_table_util.py rename src/wireviz/{wv_helper.py => wv_utils.py} (100%) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d539aa2..fe576b0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,11 +22,11 @@ jobs: python -m pip install --upgrade pip pip install . - name: Create Examples - run: PYTHONPATH=$(pwd)/src:$PYTHONPATH cd src/wireviz/ && python build_examples.py + run: PYTHONPATH=$(pwd)/src:$PYTHONPATH && python src/wireviz/tools/build_examples.py - name: Upload examples, demos, and tutorials uses: actions/upload-artifact@v2 with: name: examples-and-tutorials path: | examples/ - tutorial/ \ No newline at end of file + tutorial/ diff --git a/src/wireviz/svgembed.py b/src/wireviz/svgembed.py deleted file mode 100644 index ab6b9f1..0000000 --- a/src/wireviz/svgembed.py +++ /dev/null @@ -1,52 +0,0 @@ -# -*- coding: utf-8 -*- - -import base64 -import re -from pathlib import Path -from typing import Union - -mime_subtype_replacements = {"jpg": "jpeg", "tif": "tiff"} - - -def embed_svg_images(svg_in: str, base_path: Union[str, Path] = Path.cwd()) -> str: - images_b64 = {} # cache of base64-encoded images - - def image_tag(pre: str, url: str, post: str) -> str: - return f'' - - def replace(match: re.Match) -> str: - imgurl = match["URL"] - if not imgurl in images_b64: # only encode/cache every unique URL once - imgurl_abs = (Path(base_path) / imgurl).resolve() - image = imgurl_abs.read_bytes() - images_b64[imgurl] = base64.b64encode(image).decode("utf-8") - return image_tag( - match["PRE"] or "", - f"data:image/{get_mime_subtype(imgurl)};base64, {images_b64[imgurl]}", - match["POST"] or "", - ) - - pattern = re.compile( - image_tag(r"(?P
 [^>]*?)?", r'(?P[^"]*?)', r"(?P [^>]*?)?"),
-        re.IGNORECASE,
-    )
-    return pattern.sub(replace, svg_in)
-
-
-def get_mime_subtype(filename: Union[str, Path]) -> str:
-    mime_subtype = Path(filename).suffix.lstrip(".").lower()
-    if mime_subtype in mime_subtype_replacements:
-        mime_subtype = mime_subtype_replacements[mime_subtype]
-    return mime_subtype
-
-
-def embed_svg_images_file(
-    filename_in: Union[str, Path], overwrite: bool = True
-) -> None:
-    filename_in = Path(filename_in).resolve()
-    filename_out = filename_in.with_suffix(".b64.svg")
-    filename_out.write_text(
-        embed_svg_images(filename_in.read_text(), filename_in.parent)
-    )
-    if overwrite:
-        filename_out.replace(filename_in)
diff --git a/src/wireviz/build_examples.py b/src/wireviz/tools/build_examples.py
similarity index 96%
rename from src/wireviz/build_examples.py
rename to src/wireviz/tools/build_examples.py
index e54d0f5..5ce9fe4 100755
--- a/src/wireviz/build_examples.py
+++ b/src/wireviz/tools/build_examples.py
@@ -7,13 +7,12 @@ import sys
 from pathlib import Path
 
 script_path = Path(__file__).absolute()
-
-sys.path.insert(0, str(script_path.parent.parent))  # to find wireviz module
-from wv_helper import open_file_append, open_file_read, open_file_write
+sys.path.insert(0, str(script_path.parent.parent.parent))  # to find wireviz module
 
 from wireviz import APP_NAME, __version__, wireviz
+from wireviz.wv_utils import open_file_append, open_file_read, open_file_write
 
-dir = script_path.parent.parent.parent
+dir = script_path.parent.parent.parent.parent
 readme = "readme.md"
 groups = {
     "examples": {
diff --git a/src/wireviz/wireviz.py b/src/wireviz/wireviz.py
index f36b12b..4dd9b09 100755
--- a/src/wireviz/wireviz.py
+++ b/src/wireviz/wireviz.py
@@ -10,9 +10,9 @@ import yaml
 if __name__ == "__main__":
     sys.path.insert(0, str(Path(__file__).parent.parent))  # add src/wireviz to PATH
 
-from wireviz.DataClasses import AUTOGENERATED_PREFIX, Metadata, Options, Tweak
-from wireviz.Harness import Harness
-from wireviz.wv_helper import (
+from wireviz.wv_dataclasses import AUTOGENERATED_PREFIX, Metadata, Options, Tweak
+from wireviz.wv_harness import Harness
+from wireviz.wv_utils import (
     expand,
     get_single_key_and_value,
     is_arrow,
@@ -396,19 +396,12 @@ def parse(
 def _get_yaml_data_and_path(inp: Union[str, Path, Dict]) -> (Dict, Path):
     # determine whether inp is a file path, a YAML string, or a Dict
     if not isinstance(inp, Dict):  # received a str or a Path
-        try:
+        if isinstance(inp, Path) or (isinstance(inp, str) and not "\n" in inp):
             yaml_path = Path(inp).expanduser().resolve(strict=True)
-            # if no FileNotFoundError exception happens, get file contents
             yaml_str = open_file_read(yaml_path).read()
-        except (FileNotFoundError, OSError) as e:
-            # if inp is a long YAML string, Pathlib will raise OSError: [Errno 63]
-            # when trying to expand and resolve it as a path.
-            # Catch this error, but raise any others
-            if type(e) is OSError and e.errno != 63:
-                raise e
-            # file does not exist; assume inp is a YAML string
-            yaml_str = inp
+        else:
             yaml_path = None
+            yaml_str = inp
         yaml_data = yaml.safe_load(yaml_str)
     else:
         # received a Dict, use as-is
diff --git a/src/wireviz/wv_bom.py b/src/wireviz/wv_bom.py
index 9cc0fbe..0cb7a3e 100644
--- a/src/wireviz/wv_bom.py
+++ b/src/wireviz/wv_bom.py
@@ -5,7 +5,7 @@ from dataclasses import dataclass
 from enum import Enum
 from typing import List, Optional, Union
 
-from wireviz.wv_helper import html_line_breaks
+from wireviz.wv_utils import html_line_breaks
 
 BOM_HASH_FIELDS = "description unit partnumbers"
 BomHash = namedtuple("BomHash", BOM_HASH_FIELDS)
diff --git a/src/wireviz/wv_cli.py b/src/wireviz/wv_cli.py
index 07aac12..eb0f33c 100644
--- a/src/wireviz/wv_cli.py
+++ b/src/wireviz/wv_cli.py
@@ -11,7 +11,7 @@ if __name__ == "__main__":
 
 import wireviz.wireviz as wv
 from wireviz import APP_NAME, __version__
-from wireviz.wv_helper import open_file_read
+from wireviz.wv_utils import open_file_read
 
 format_codes = {
     "c": "csv",
@@ -23,10 +23,11 @@ format_codes = {
     "t": "tsv",
 }
 
+
 epilog = (
     "The -f or --format option accepts a string containing one or more of the "
     "following characters to specify which file types to output:\n"
-    f", ".join([f"{key} ({value.upper()})" for key, value in format_codes.items()])
+    + f", ".join([f"{key} ({value.upper()})" for key, value in format_codes.items()])
 )
 
 
diff --git a/src/wireviz/DataClasses.py b/src/wireviz/wv_dataclasses.py
similarity index 99%
rename from src/wireviz/DataClasses.py
rename to src/wireviz/wv_dataclasses.py
index 70a2079..9afaaf0 100644
--- a/src/wireviz/DataClasses.py
+++ b/src/wireviz/wv_dataclasses.py
@@ -14,7 +14,7 @@ from wireviz.wv_colors import (
     SingleColor,
     get_color_by_colorcode_index,
 )
-from wireviz.wv_helper import aspect_ratio, awg_equiv, mm2_equiv, remove_links
+from wireviz.wv_utils import aspect_ratio, awg_equiv, mm2_equiv, remove_links
 
 # Each type alias have their legal values described in comments
 # - validation might be implemented in the future
diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_graphviz.py
similarity index 99%
rename from src/wireviz/wv_gv_html.py
rename to src/wireviz/wv_graphviz.py
index 7d63ca9..e65ed2a 100644
--- a/src/wireviz/wv_gv_html.py
+++ b/src/wireviz/wv_graphviz.py
@@ -5,7 +5,8 @@ from itertools import zip_longest
 from typing import Any, List, Union
 
 from wireviz import APP_NAME, APP_URL, __version__
-from wireviz.DataClasses import (
+from wireviz.wv_bom import partnumbers_to_list
+from wireviz.wv_dataclasses import (
     ArrowDirection,
     ArrowWeight,
     Cable,
@@ -18,9 +19,8 @@ from wireviz.DataClasses import (
     ShieldClass,
     WireClass,
 )
-from wireviz.wv_bom import partnumbers_to_list
-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_html import Img, Table, Td, Tr
+from wireviz.wv_utils import html_line_breaks, remove_links
 
 
 def gv_node_component(component: Component) -> Table:
diff --git a/src/wireviz/Harness.py b/src/wireviz/wv_harness.py
similarity index 98%
rename from src/wireviz/Harness.py
rename to src/wireviz/wv_harness.py
index 1d722e7..7c4143e 100644
--- a/src/wireviz/Harness.py
+++ b/src/wireviz/wv_harness.py
@@ -8,7 +8,7 @@ from typing import List
 from graphviz import Graph
 
 import wireviz.wv_colors
-from wireviz.DataClasses import (
+from wireviz.wv_dataclasses import (
     AUTOGENERATED_PREFIX,
     AdditionalComponent,
     Arrow,
@@ -23,8 +23,7 @@ from wireviz.DataClasses import (
     Side,
     Tweak,
 )
-from wireviz.svgembed import embed_svg_images_file
-from wireviz.wv_gv_html import (
+from wireviz.wv_graphviz import (
     apply_dot_tweaks,
     calculate_node_bgcolor,
     gv_connector_loops,
@@ -34,8 +33,8 @@ from wireviz.wv_gv_html import (
     parse_arrow_str,
     set_dot_basics,
 )
-from wireviz.wv_helper import open_file_write, tuplelist2tsv
-from wireviz.wv_html import generate_html_output
+from wireviz.wv_output import embed_svg_images_file, generate_html_output
+from wireviz.wv_utils import open_file_write, tuplelist2tsv
 
 
 @dataclass
diff --git a/src/wireviz/wv_html.py b/src/wireviz/wv_html.py
index 16a5d58..1c4b750 100644
--- a/src/wireviz/wv_html.py
+++ b/src/wireviz/wv_html.py
@@ -1,120 +1,125 @@
 # -*- coding: utf-8 -*-
 
-import re
-from pathlib import Path
-from typing import Dict, List, Union
+from collections.abc import Iterable
+from dataclasses import dataclass, field
+from typing import Dict
 
-from wireviz import APP_NAME, APP_URL, __version__, wv_colors
-from wireviz.DataClasses import Metadata, Options
-from wireviz.wv_helper import (
-    flatten2d,
-    html_line_breaks,
-    open_file_read,
-    open_file_write,
-    smart_file_resolve,
-)
+indent_count = 1
 
 
-def generate_html_output(
-    filename: Union[str, Path],
-    bom_list: List[List[str]],
-    metadata: Metadata,
-    options: Options,
-):
+class Attribs(Dict):
+    def __repr__(self):
+        if len(self) == 0:
+            return ""
 
-    # load HTML template
-    templatename = metadata.get("template", {}).get("name")
-    if templatename:
-        # if relative path to template was provided,
-        # check directory of YAML file first, fall back to built-in template directory
-        templatefile = smart_file_resolve(
-            f"{templatename}.html",
-            [Path(filename).parent, Path(__file__).parent / "templates"],
-        )
-    else:
-        # fall back to built-in simple template if no template was provided
-        templatefile = Path(__file__).parent / "templates/simple.html"
+        html = []
+        for k, v in self.items():
+            if v is not None:
+                html.append(f' {k}="{v}"')
+            # else:
+            #     html.append(f" {k}")
+        return "".join(html)
 
-    html = open_file_read(templatefile).read()
 
-    # embed SVG diagram
-    with open_file_read(f"{filename}.tmp.svg") as file:
-        svgdata = re.sub(
-            "^<[?]xml [^?>]*[?]>[^<]*]*>",
-            "",
-            file.read(),
-            1,
-        )
+@dataclass
+class Tag:
+    contents = None
+    attribs: Attribs = field(default_factory=Attribs)
+    flat: bool = None
+    delete_if_empty: bool = False
 
-    # generate BOM table
-    bom = flatten2d(bom_list)
+    def __init__(self, contents, flat=None, delete_if_empty=False, **kwargs):
+        self.contents = contents
+        self.flat = flat
+        self.delete_if_empty = delete_if_empty
+        self.attribs = Attribs({**kwargs})
 
-    # generate BOM header (may be at the top or bottom of the table)
-    bom_header_html = "  
{item}
{item}
\n' + bom_header_html + "".join(bom_contents) + "
\n" - ) - bom_html_reversed = ( - '\n' - + "".join(list(reversed(bom_contents))) - + bom_header_html - + "
\n" - ) + @property + def auto_flat(self): + if self.flat is not None: # user specified + return self.flat + if not _is_iterable_not_str(self.contents): # catch str, int, float, ... + if not isinstance(self.contents, Tag): # avoid recursion + return not "\n" in str(self.contents) # flatten if single line - # prepare simple replacements - replacements = { - "": f"{APP_NAME} {__version__} - {APP_URL}", - "": options.fontname, - "": options.bgcolor.html, - "": svgdata, - "": bom_html, - "": bom_html_reversed, - "": "1", # TODO: handle multi-page documents - "": "1", # TODO: handle multi-page documents - } + @property + def is_empty(self): + return self.get_contents(force_flat=True) == "" - # prepare metadata replacements - if metadata: - for item, contents in metadata.items(): - if isinstance(contents, (str, int, float)): - replacements[f""] = html_line_breaks(str(contents)) - elif isinstance(contents, Dict): # useful for authors, revisions - for index, (category, entry) in enumerate(contents.items()): - if isinstance(entry, Dict): - replacements[f""] = str(category) - for entry_key, entry_value in entry.items(): - replacements[ - f"" - ] = html_line_breaks(str(entry_value)) + def indent_lines(self, lines, force_flat=False): + if self.auto_flat or force_flat: + return lines + else: + indenter = " " * indent_count + return "\n".join(f"{indenter}{line}" for line in lines.split("\n")) - replacements['"sheetsize_default"'] = '"{}"'.format( - metadata.get("template", {}).get("sheetsize", "") - ) - # include quotes so no replacement happens within