From e6dc146882da630cc0d26da2bd7d765e5947b80d Mon Sep 17 00:00:00 2001 From: Visa Tuominen Date: Mon, 8 Aug 2022 14:11:10 +0300 Subject: [PATCH 01/10] Loop index by name, add loop_color to Connector --- src/wireviz/DataClasses.py | 1 + src/wireviz/Harness.py | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index 6b7462abf..d27aa906d 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -142,6 +142,7 @@ class Connector: hide_disconnected_pins: bool = False autogenerate: bool = False loops: List[List[Pin]] = field(default_factory=list) + loop_color: Optional[Color] = "WH" ignore_in_bom: bool = False additional_components: List[AdditionalComponent] = field(default_factory=list) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 2f9eb641c..af02399d3 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -178,7 +178,8 @@ def create_graph(self) -> Graph: fillcolor=translate_color(self.options.bgcolor_connector, "HEX")) if len(connector.loops) > 0: - dot.attr('edge', color='#000000:#ffffff:#000000') + loop_color_hex = translate_color(connector.loop_color, "hex") + dot.attr('edge', color=f'#000000:{loop_color_hex}:#000000') if connector.ports_left: loop_side = 'l' loop_dir = 'w' @@ -188,8 +189,14 @@ def create_graph(self) -> Graph: 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}') + if type(loop[0]) == str: + i_loop_0 = connector.pins.index(loop[0]) + i_loop_1 = connector.pins.index(loop[1]) + else: + i_loop_0 = loop[0] + i_loop_1 = loop[1] + dot.edge(f'{connector.name}:p{i_loop_0}{loop_side}:{loop_dir}', + f'{connector.name}:p{i_loop_1}{loop_side}:{loop_dir}') # determine if there are double- or triple-colored wires in the harness; From a544fb01bae80d7ef83b0295a4821be40b206298 Mon Sep 17 00:00:00 2001 From: Visa Tuominen Date: Mon, 8 Aug 2022 14:12:14 +0300 Subject: [PATCH 02/10] add loop_color, note name or index for loops --- docs/syntax.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/syntax.md b/docs/syntax.md index 8da04aeea..01ae27735 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -85,6 +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 + # Accepts pin numbers or names + loop_color: # Color for loop wiring # auto-generation autogenerate: # optional; defaults to false; see below From 32fb674e836efd96770bd240ac8c465aadab0c52 Mon Sep 17 00:00:00 2001 From: Visa Tuominen Date: Mon, 8 Aug 2022 15:47:58 +0300 Subject: [PATCH 03/10] match loop index by value, add newlines to header --- src/wireviz/Harness.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index af02399d3..415319337 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -93,8 +93,8 @@ def connect(self, from_name: str, from_pin: (int, str), via_name: str, via_wire: def create_graph(self) -> Graph: dot = Graph() - dot.body.append(f'// Graph generated by {APP_NAME} {__version__}') - dot.body.append(f'// {APP_URL}') + dot.body.append(f'// Graph generated by {APP_NAME} {__version__}\n') + dot.body.append(f'// {APP_URL}\n') dot.attr('graph', rankdir='LR', ranksep='2', bgcolor=wv_colors.translate_color(self.options.bgcolor, "HEX"), @@ -189,13 +189,9 @@ def create_graph(self) -> Graph: else: raise Exception('No side for loops') for loop in connector.loops: - if type(loop[0]) == str: - i_loop_0 = connector.pins.index(loop[0]) - i_loop_1 = connector.pins.index(loop[1]) - else: - i_loop_0 = loop[0] - i_loop_1 = loop[1] - dot.edge(f'{connector.name}:p{i_loop_0}{loop_side}:{loop_dir}', + i_loop_0 = connector.pins.index(loop[0])+1 + i_loop_1 = connector.pins.index(loop[1])+1 + dot.edge(f'{connector.name}:p{i_loop_0}{loop_side}:{loop_dir}', f'{connector.name}:p{i_loop_1}{loop_side}:{loop_dir}') From 514c26fcc7c9c31721836706c0070eea882edf66 Mon Sep 17 00:00:00 2001 From: Visa Tuominen Date: Tue, 9 Aug 2022 16:14:04 +0300 Subject: [PATCH 04/10] check pin counts before finding index --- src/wireviz/Harness.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 415319337..5fa1c5442 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -189,10 +189,16 @@ def create_graph(self) -> Graph: else: raise Exception('No side for loops') for loop in connector.loops: - i_loop_0 = connector.pins.index(loop[0])+1 - i_loop_1 = connector.pins.index(loop[1])+1 - dot.edge(f'{connector.name}:p{i_loop_0}{loop_side}:{loop_dir}', - f'{connector.name}:p{i_loop_1}{loop_side}:{loop_dir}') + loop_pins = [] + for pin in loop: + if connector.pins.count(pin) == 1: + loop_pins.append(connector.pins.index(pin)+1) + elif connector.pinlabels.count(pin) == 1: + loop_pins.append(connector.pinlabels.index(pin)+1) + else: + raise Exception(f"Didn't find exactly one {connector.name}:{pin} to loop into") + dot.edge(f'{connector.name}:p{loop_pins[0]}{loop_side}:{loop_dir}', + f'{connector.name}:p{loop_pins[1]}{loop_side}:{loop_dir}') # determine if there are double- or triple-colored wires in the harness; From 304b8df0bef98fa2a89d7520473e680a1c6403a4 Mon Sep 17 00:00:00 2001 From: Visa Tuominen Date: Mon, 15 Aug 2022 12:11:28 +0300 Subject: [PATCH 05/10] Check that pins exist, make visible when "hide disconnected" is active --- src/wireviz/DataClasses.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index d27aa906d..ab1e25679 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -142,7 +142,6 @@ class Connector: hide_disconnected_pins: bool = False autogenerate: bool = False loops: List[List[Pin]] = field(default_factory=list) - loop_color: Optional[Color] = "WH" ignore_in_bom: bool = False additional_components: List[AdditionalComponent] = field(default_factory=list) @@ -179,11 +178,13 @@ def __post_init__(self) -> None: self.show_pincount = self.style != 'simple' # hide pincount for simple (1 pin) connectors by default 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: include properties of wire used to create the loop - if len(loop) != 2: - raise Exception('Loops must be between exactly two pins!') + # check that pins to connect actually exist + if type(loop) == dict: + loop = list(loop.values())[0] + for pin in loop: + if not ((self.pins.count(pin) == 1) or (self.pinlabels.count == 1)): + raise Exception(f"Didn't find exactly one {self.name}:{pin} to loop into") + self.activate_pin(pin) for i, item in enumerate(self.additional_components): if isinstance(item, dict): From adb3ce8fe2ab266650b39f3d0a57635be62c1d6e Mon Sep 17 00:00:00 2001 From: Visa Tuominen Date: Mon, 15 Aug 2022 12:12:34 +0300 Subject: [PATCH 06/10] Multiple different colored loops --- src/wireviz/Harness.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index 5fa1c5442..dc15c7cbf 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -178,8 +178,6 @@ def create_graph(self) -> Graph: fillcolor=translate_color(self.options.bgcolor_connector, "HEX")) if len(connector.loops) > 0: - loop_color_hex = translate_color(connector.loop_color, "hex") - dot.attr('edge', color=f'#000000:{loop_color_hex}:#000000') if connector.ports_left: loop_side = 'l' loop_dir = 'w' @@ -187,18 +185,34 @@ def create_graph(self) -> Graph: loop_side = 'r' loop_dir = 'e' else: - raise Exception('No side for loops') + raise Exception('No side for loops') + + color_iter = iter(wv_colors.COLOR_CODES["DIN"]) for loop in connector.loops: + if type(loop) == dict: + color = list(loop.keys())[0] + loop = loop[color] + else: + color = next(color_iter) + loop_color_hex = translate_color(color, "hex") + dot.attr('edge', color=f'#000000:{loop_color_hex}:#000000') loop_pins = [] for pin in loop: - if connector.pins.count(pin) == 1: + if pin in connector.pins: loop_pins.append(connector.pins.index(pin)+1) - elif connector.pinlabels.count(pin) == 1: + elif pin in connector.pinlabels: loop_pins.append(connector.pinlabels.index(pin)+1) else: - raise Exception(f"Didn't find exactly one {connector.name}:{pin} to loop into") - dot.edge(f'{connector.name}:p{loop_pins[0]}{loop_side}:{loop_dir}', - f'{connector.name}:p{loop_pins[1]}{loop_side}:{loop_dir}') + raise Exception(f"Didn't find exactly one {connector.name}:{pin} to loop into") + first = True + for found in loop_pins: + if first: + first = False + prev = found + else: + dot.edge(f'{connector.name}:p{prev}{loop_side}:{loop_dir}', + f'{connector.name}:p{found}{loop_side}:{loop_dir}') + prev = found # determine if there are double- or triple-colored wires in the harness; From bb4a0b5edb8f9568baa4d05bece4b49738736409 Mon Sep 17 00:00:00 2001 From: Visa Tuominen Date: Tue, 16 Aug 2022 13:44:13 +0300 Subject: [PATCH 07/10] bugfix: didn't pass pinlabel to count() --- src/wireviz/DataClasses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index ab1e25679..46cb996e7 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -182,7 +182,7 @@ def __post_init__(self) -> None: if type(loop) == dict: loop = list(loop.values())[0] for pin in loop: - if not ((self.pins.count(pin) == 1) or (self.pinlabels.count == 1)): + if not ((self.pins.count(pin) == 1) or (self.pinlabels.count(pin) == 1)): raise Exception(f"Didn't find exactly one {self.name}:{pin} to loop into") self.activate_pin(pin) From a50090344160b450388b6a2b233323c138b146aa Mon Sep 17 00:00:00 2001 From: Visa Tuominen Date: Tue, 16 Aug 2022 14:32:06 +0300 Subject: [PATCH 08/10] add `loop_side` to Connector --- src/wireviz/DataClasses.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index 46cb996e7..0cdd3a14e 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -142,6 +142,7 @@ class Connector: hide_disconnected_pins: bool = False autogenerate: bool = False loops: List[List[Pin]] = field(default_factory=list) + loop_side: Optional[str] = None ignore_in_bom: bool = False additional_components: List[AdditionalComponent] = field(default_factory=list) From f37838710e6b1271068fa97471b9d85fe45aab59 Mon Sep 17 00:00:00 2001 From: Visa Tuominen Date: Tue, 16 Aug 2022 14:32:46 +0300 Subject: [PATCH 09/10] loop_side --- src/wireviz/Harness.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index dc15c7cbf..b95f01883 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -122,6 +122,21 @@ def create_graph(self) -> Graph: # 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. + loop_side = 'l' + + # Make sure loop direction has connectors :) + if connector.loop_side: + if connector.loop_side.lower() in ["l", "left"]: + loop_side = 'l' + connector.ports_left = True + elif connector.loop_side.lower() in ["r", "right"]: + loop_side = 'r' + connector.ports_right = True + else: + raise Exception("Invalid loop direction!") + # if not specified, default to direction of other connections + else: + loop_side = "l" if connector.ports_left else "r" html = [] @@ -178,15 +193,11 @@ def create_graph(self) -> Graph: fillcolor=translate_color(self.options.bgcolor_connector, "HEX")) if len(connector.loops) > 0: - if connector.ports_left: - loop_side = 'l' + if loop_side == 'l': loop_dir = 'w' - elif connector.ports_right: - loop_side = 'r' + elif loop_side == 'r': loop_dir = 'e' - else: - raise Exception('No side for loops') - + color_iter = iter(wv_colors.COLOR_CODES["DIN"]) for loop in connector.loops: if type(loop) == dict: From 1a58bbe170a97a6e62e297a1530c3adcb47bf671 Mon Sep 17 00:00:00 2001 From: Visa Tuominen Date: Fri, 19 Aug 2022 15:05:39 +0300 Subject: [PATCH 10/10] reverse pin draw order --- src/wireviz/DataClasses.py | 2 ++ src/wireviz/Harness.py | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index 0cdd3a14e..4204abc4e 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -135,6 +135,8 @@ class Connector: notes: Optional[MultilineHypertext] = None pins: List[Pin] = field(default_factory=list) pinlabels: List[Pin] = field(default_factory=list) + reverse_pins: bool = False + shell: bool = False pincolors: List[Color] = field(default_factory=list) color: Optional[Color] = None show_name: Optional[bool] = None diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index b95f01883..03a29f020 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -161,7 +161,12 @@ def create_graph(self) -> Graph: pinhtml = [] pinhtml.append('') - for pinindex, (pinname, pinlabel, pincolor) in enumerate(zip_longest(connector.pins, connector.pinlabels, connector.pincolors)): + pin_index_list = enumerate(zip_longest(connector.pins, connector.pinlabels, connector.pincolors)) + + if connector.reverse_pins: + pin_index_list = reversed(list(pin_index_list)) + + for pinindex, (pinname, pinlabel, pincolor) in pin_index_list: if connector.hide_disconnected_pins and not connector.visible_pins.get(pinname, False): continue pinhtml.append(' ')