| @@ -276,8 +276,10 @@ def panel_to_components(tree): | |||
| # Get components layer | |||
| group = root.find(".//svg:g[@inkscape:label='components']", ns) | |||
| # Illustrator uses `id` for the group name. | |||
| # Illustrator uses `data-name` (in Unique object ID mode) or `id` (in Layer Names object ID mode) for the group name. | |||
| # Don't test with `not group` since Elements with no subelements are falsy. | |||
| if group is None: | |||
| group = root.find(".//svg:g[@data-name='components']", ns) | |||
| if group is None: | |||
| group = root.find(".//svg:g[@id='components']", ns) | |||
| if group is None: | |||
| @@ -295,10 +297,18 @@ def panel_to_components(tree): | |||
| # Get name | |||
| name = el.get('{' + ns['inkscape'] + '}label') | |||
| # Illustrator names | |||
| if not name: | |||
| name = el.get('data-name') | |||
| if not name: | |||
| name = el.get('id') | |||
| if not name: | |||
| name = "" | |||
| # Split name and component class name | |||
| names = name.split('#', 1) | |||
| name = names[0] | |||
| if len(names) >= 2: | |||
| c['cls'] = names[1] | |||
| name = str_to_identifier(name).upper() | |||
| c['name'] = name | |||
| @@ -324,27 +334,33 @@ def panel_to_components(tree): | |||
| continue | |||
| # Get color | |||
| color = None | |||
| # Get color from fill attribute | |||
| fill = el.get('fill') | |||
| style = el.get('style') | |||
| if fill: | |||
| color_match = re.search(r'#(.{6})', fill) | |||
| color = color_match.group(1).lower() | |||
| elif style: | |||
| color_match = re.search(r'fill:\S*#(.{6});', style) | |||
| color = color_match.group(1).lower() | |||
| else: | |||
| color = fill | |||
| # Get color from CSS fill style | |||
| if not color: | |||
| style = el.get('style') | |||
| if style: | |||
| color_match = re.search(r'fill:\S*(#.{6});', style) | |||
| color = color_match.group(1) | |||
| if not color: | |||
| print(f"Cannot get color of component: {el}") | |||
| continue | |||
| if color == 'ff0000': | |||
| print(color) | |||
| color = color.lower() | |||
| if color == '#ff0000' or color == '#f00' or color == 'red': | |||
| components['params'].append(c) | |||
| if color == '00ff00': | |||
| if color == '#00ff00' or color == '#0f0' or color == 'lime': | |||
| components['inputs'].append(c) | |||
| if color == '0000ff': | |||
| if color == '#0000ff' or color == '#00f' or color == 'blue': | |||
| components['outputs'].append(c) | |||
| if color == 'ff00ff': | |||
| if color == '#ff00ff' or color == '#f0f' or color == 'magenta': | |||
| components['lights'].append(c) | |||
| if color == 'ffff00': | |||
| if color == '#ffff00' or color == '#ff0' or color == 'yellow': | |||
| components['widgets'].append(c) | |||
| # Sort components | |||
| @@ -453,10 +469,10 @@ struct {identifier}Widget : ModuleWidget {{ | |||
| for c in components['params']: | |||
| if 'x' in c: | |||
| source += f""" | |||
| addParam(createParam<RoundBlackKnob>(mm2px(Vec({c['x']}, {c['y']})), module, {identifier}::{c['name']}_PARAM));""" | |||
| addParam(createParam<{c.get('cls', 'RoundBlackKnob')}>(mm2px(Vec({c['x']}, {c['y']})), module, {identifier}::{c['name']}_PARAM));""" | |||
| else: | |||
| source += f""" | |||
| addParam(createParamCentered<RoundBlackKnob>(mm2px(Vec({c['cx']}, {c['cy']})), module, {identifier}::{c['name']}_PARAM));""" | |||
| addParam(createParamCentered<{c.get('cls', 'RoundBlackKnob')}>(mm2px(Vec({c['cx']}, {c['cy']})), module, {identifier}::{c['name']}_PARAM));""" | |||
| # Inputs | |||
| if len(components['inputs']) > 0: | |||
| @@ -464,10 +480,10 @@ struct {identifier}Widget : ModuleWidget {{ | |||
| for c in components['inputs']: | |||
| if 'x' in c: | |||
| source += f""" | |||
| addInput(createInput<PJ301MPort>(mm2px(Vec({c['x']}, {c['y']})), module, {identifier}::{c['name']}_INPUT));""" | |||
| addInput(createInput<{c.get('cls', 'PJ301MPort')}>(mm2px(Vec({c['x']}, {c['y']})), module, {identifier}::{c['name']}_INPUT));""" | |||
| else: | |||
| source += f""" | |||
| addInput(createInputCentered<PJ301MPort>(mm2px(Vec({c['cx']}, {c['cy']})), module, {identifier}::{c['name']}_INPUT));""" | |||
| addInput(createInputCentered<{c.get('cls', 'PJ301MPort')}>(mm2px(Vec({c['cx']}, {c['cy']})), module, {identifier}::{c['name']}_INPUT));""" | |||
| # Outputs | |||
| if len(components['outputs']) > 0: | |||
| @@ -475,10 +491,10 @@ struct {identifier}Widget : ModuleWidget {{ | |||
| for c in components['outputs']: | |||
| if 'x' in c: | |||
| source += f""" | |||
| addOutput(createOutput<PJ301MPort>(mm2px(Vec({c['x']}, {c['y']})), module, {identifier}::{c['name']}_OUTPUT));""" | |||
| addOutput(createOutput<{c.get('cls', 'PJ301MPort')}>(mm2px(Vec({c['x']}, {c['y']})), module, {identifier}::{c['name']}_OUTPUT));""" | |||
| else: | |||
| source += f""" | |||
| addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec({c['cx']}, {c['cy']})), module, {identifier}::{c['name']}_OUTPUT));""" | |||
| addOutput(createOutputCentered<{c.get('cls', 'PJ301MPort')}>(mm2px(Vec({c['cx']}, {c['cy']})), module, {identifier}::{c['name']}_OUTPUT));""" | |||
| # Lights | |||
| if len(components['lights']) > 0: | |||
| @@ -486,10 +502,10 @@ struct {identifier}Widget : ModuleWidget {{ | |||
| for c in components['lights']: | |||
| if 'x' in c: | |||
| source += f""" | |||
| addChild(createLight<MediumLight<RedLight>>(mm2px(Vec({c['x']}, {c['y']})), module, {identifier}::{c['name']}_LIGHT));""" | |||
| addChild(createLight<{c.get('cls', 'MediumLight<RedLight>')}>(mm2px(Vec({c['x']}, {c['y']})), module, {identifier}::{c['name']}_LIGHT));""" | |||
| else: | |||
| source += f""" | |||
| addChild(createLightCentered<MediumLight<RedLight>>(mm2px(Vec({c['cx']}, {c['cy']})), module, {identifier}::{c['name']}_LIGHT));""" | |||
| addChild(createLightCentered<{c.get('cls', 'MediumLight<RedLight>')}>(mm2px(Vec({c['cx']}, {c['cy']})), module, {identifier}::{c['name']}_LIGHT));""" | |||
| # Widgets | |||
| if len(components['widgets']) > 0: | |||
| @@ -498,10 +514,10 @@ struct {identifier}Widget : ModuleWidget {{ | |||
| if 'x' in c: | |||
| source += f""" | |||
| // mm2px(Vec({c['width']}, {c['height']})) | |||
| addChild(createWidget<Widget>(mm2px(Vec({c['x']}, {c['y']}))));""" | |||
| addChild(createWidget<{c.get('cls', 'Widget')}>(mm2px(Vec({c['x']}, {c['y']}))));""" | |||
| else: | |||
| source += f""" | |||
| addChild(createWidgetCentered<Widget>(mm2px(Vec({c['cx']}, {c['cy']}))));""" | |||
| addChild(createWidgetCentered<{c.get('cls', 'Widget')}>(mm2px(Vec({c['cx']}, {c['cy']}))));""" | |||
| source += f""" | |||
| }} | |||