|
17 | 17 | MatePin, |
18 | 18 | Metadata, |
19 | 19 | Options, |
20 | | - Tweak, |
21 | 20 | Side, |
| 21 | + Tweak, |
22 | 22 | ) |
23 | 23 | from wireviz.svgembed import embed_svg_images_file |
24 | 24 | from wireviz.wv_bom import ( |
|
29 | 29 | component_table_entry, |
30 | 30 | generate_bom, |
31 | 31 | get_additional_component_table, |
| 32 | + make_list, |
32 | 33 | pn_info_string, |
33 | 34 | ) |
34 | 35 | from wireviz.wv_colors import get_color_hex, translate_color |
@@ -78,12 +79,42 @@ def __post_init__(self): |
78 | 79 | self._bom = [] # Internal Cache for generated bom |
79 | 80 | self.additional_bom_items = [] |
80 | 81 |
|
| 82 | + def extend_tweak(self, node: Union[Connector, Cable]) -> None: |
| 83 | + """Extend self.tweak with node.tweak after replacing placeholders.""" |
| 84 | + if node.tweak: |
| 85 | + ph = node.tweak.placeholder |
| 86 | + # An empty string is a legal value to avoid the global placeholder |
| 87 | + if ph is None: # This must therefore be a test for None! |
| 88 | + ph = self.tweak.placeholder # Use the global placeholder |
| 89 | + # Create function rph() to replace any placeholder with node name |
| 90 | + rph = (lambda s: s.replace(ph, node.name)) if ph else lambda s: s |
| 91 | + n_override = node.tweak.override or {} |
| 92 | + s_override = self.tweak.override or {} |
| 93 | + for id, n_dict in n_override.items(): |
| 94 | + id = rph(id) |
| 95 | + s_dict = s_override.get(id, {}) |
| 96 | + for k, v in n_dict.items(): |
| 97 | + k, v = rph(k), rph(v) |
| 98 | + if k in s_dict and v != s_dict[k]: |
| 99 | + raise ValueError( |
| 100 | + f"{node.name}.tweak.override.{id}.{k} conflicts with another" |
| 101 | + ) |
| 102 | + s_dict[k] = v |
| 103 | + s_override[id] = s_dict or None # Will never be None? |
| 104 | + self.tweak.override = s_override or None |
| 105 | + self.tweak.append = ( |
| 106 | + make_list(self.tweak.append) |
| 107 | + + [rph(v) for v in make_list(node.tweak.append)] |
| 108 | + ) or None |
| 109 | + |
81 | 110 | def add_connector(self, name: str, *args, **kwargs) -> None: |
82 | 111 | check_old(f"Connector '{name}'", OLD_CONNECTOR_ATTR, kwargs) |
83 | 112 | self.connectors[name] = Connector(name, *args, **kwargs) |
| 113 | + self.extend_tweak(self.connectors[name]) |
84 | 114 |
|
85 | 115 | def add_cable(self, name: str, *args, **kwargs) -> None: |
86 | 116 | self.cables[name] = Cable(name, *args, **kwargs) |
| 117 | + self.extend_tweak(self.cables[name]) |
87 | 118 |
|
88 | 119 | def add_mate_pin(self, from_name, from_pin, to_name, to_pin, arrow_type) -> None: |
89 | 120 | self.mates.append(MatePin(from_name, from_pin, to_name, to_pin, arrow_type)) |
|
0 commit comments