diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index d14e4459..617e59d9 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -23,6 +23,7 @@ PlainText # = Literal['wirecount', 'terminations', 'length', 'total_length'] ) ImageScale = PlainText # = Literal['false', 'true', 'width', 'height', 'both'] +ImagePosition = PlainText # = Literal['below', 'above', 'left', 'right'] # Type combinations Pin = Union[int, PlainText] # Pin identifier @@ -86,6 +87,7 @@ class Image: height: Optional[int] = None fixedsize: Optional[bool] = None bgcolor: Optional[Color] = None + position: Optional[ImagePosition] = None # Contents of the text cell just below the image cell: caption: Optional[MultilineHypertext] = None # See also HTML doc at https://graphviz.org/doc/info/shapes.html#html diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index c4af2364..5f826c4e 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -191,6 +191,12 @@ def create_graph(self) -> Graph: connector.ports_left = True # Use left side pins. html = [] + + image_rows = [] + if connector.image and connector.image.position != 'above': + image_rows = [[html_image(connector.image)], + [html_caption(connector.image)]] + # fmt: off rows = [[f'{html_bgcolor(connector.bgcolor_title)}{remove_links(connector.name)}' if connector.show_name else None], @@ -199,16 +205,23 @@ def create_graph(self) -> Graph: html_line_breaks(pn_info_string(HEADER_SPN, connector.supplier, connector.spn))], [html_line_breaks(connector.type), html_line_breaks(connector.subtype), - f'{connector.pincount}-pin' if connector.show_pincount else None, + f'{connector.pincount}-pin' if connector.show_pincount else None], + [html_caption(connector.image) if connector.image and connector.image.position == 'above' else None, + html_image(connector.image) if connector.image and connector.image.position == 'above' 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)]] + '' if connector.style != 'simple' else None] # fmt: on + imagetable='' + if connector.image: + if connector.image.position == 'below' or connector.image.position is None: + rows += image_rows + else: + imagetable = ''.join(nested_html_table(image_rows, html_bgcolor_attr(connector.bgcolor))) 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": @@ -217,11 +230,16 @@ def create_graph(self) -> Graph: '' ) - for pinindex, (pinname, pinlabel, pincolor) in enumerate( - zip_longest( + firstpin = True + pincount = len(connector.pins) + if len(connector.pinlabels) > pincount: + pincount = len(connector.pinlabels) + if len(connector.pincolors) > pincount: + pincount = len(connector.pincolors) + + 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) @@ -229,6 +247,11 @@ def create_graph(self) -> Graph: continue pinhtml.append(" ") + + if firstpin and connector.image and connector.image.position == 'left': + firstpin = False + pinhtml.append(f'') + if connector.ports_left: pinhtml.append(f' ') if pinlabel: @@ -248,6 +271,11 @@ def create_graph(self) -> Graph: if connector.ports_right: pinhtml.append(f' ') + + if firstpin and connector.image and connector.image.position == 'right': + firstpin = False + pinhtml.append( + f'') pinhtml.append(" ") pinhtml.append("
{imagetable}{pinname}{pinname}{imagetable}
") @@ -713,3 +741,4 @@ def bom(self): if not self._bom: self._bom = generate_bom(self) return self._bom +