| @@ -15,6 +15,10 @@ class UserException(Exception): | |||||
| pass | pass | ||||
| def eprint(*args, **kwargs): | |||||
| print(*args, file=sys.stderr, **kwargs) | |||||
| def find(f, array): | def find(f, array): | ||||
| for a in array: | for a in array: | ||||
| if f(a): | if f(a): | ||||
| @@ -144,9 +148,9 @@ void init(Plugin* p) { | |||||
| with open(os.path.join(plugin_dir, ".gitignore"), "w") as f: | with open(os.path.join(plugin_dir, ".gitignore"), "w") as f: | ||||
| f.write(git_ignore) | f.write(git_ignore) | ||||
| print(f"Created template plugin in {plugin_dir}") | |||||
| eprint(f"Created template plugin in {plugin_dir}") | |||||
| os.system(f"cd {plugin_dir} && git init") | os.system(f"cd {plugin_dir} && git init") | ||||
| print(f"You may use `make`, `make clean`, `make dist`, `make install`, etc in the {plugin_dir} directory.") | |||||
| eprint(f"You may use `make`, `make clean`, `make dist`, `make install`, etc in the {plugin_dir} directory.") | |||||
| def create_manifest(slug, plugin_dir="."): | def create_manifest(slug, plugin_dir="."): | ||||
| @@ -183,8 +187,8 @@ def create_manifest(slug, plugin_dir="."): | |||||
| # Dump JSON | # Dump JSON | ||||
| with open(manifest_filename, "w") as f: | with open(manifest_filename, "w") as f: | ||||
| json.dump(manifest, f, indent=" ") | json.dump(manifest, f, indent=" ") | ||||
| print("") | |||||
| print(f"Manifest written to {manifest_filename}") | |||||
| eprint("") | |||||
| eprint(f"Manifest written to {manifest_filename}") | |||||
| def create_module(slug, panel_filename=None, source_filename=None): | def create_module(slug, panel_filename=None, source_filename=None): | ||||
| @@ -200,7 +204,7 @@ def create_module(slug, panel_filename=None, source_filename=None): | |||||
| # Check if module manifest exists | # Check if module manifest exists | ||||
| module_manifest = find(lambda m: m['slug'] == slug, manifest['modules']) | module_manifest = find(lambda m: m['slug'] == slug, manifest['modules']) | ||||
| if module_manifest: | if module_manifest: | ||||
| print(f"Module {slug} already exists in plugin.json. Edit this file to modify the module manifest.") | |||||
| eprint(f"Module {slug} already exists in plugin.json. Edit this file to modify the module manifest.") | |||||
| else: | else: | ||||
| # Add module to manifest | # Add module to manifest | ||||
| @@ -221,14 +225,14 @@ def create_module(slug, panel_filename=None, source_filename=None): | |||||
| with open(manifest_filename, "w") as f: | with open(manifest_filename, "w") as f: | ||||
| json.dump(manifest, f, indent=" ") | json.dump(manifest, f, indent=" ") | ||||
| print(f"Added {slug} to {manifest_filename}") | |||||
| eprint(f"Added {slug} to {manifest_filename}") | |||||
| # Check filenames | # Check filenames | ||||
| if panel_filename and source_filename: | |||||
| if panel_filename: | |||||
| if not os.path.exists(panel_filename): | if not os.path.exists(panel_filename): | ||||
| raise UserException(f"Panel not found at {panel_filename}.") | raise UserException(f"Panel not found at {panel_filename}.") | ||||
| if os.path.exists(source_filename): | |||||
| if source_filename and os.path.exists(source_filename): | |||||
| if input_default(f"{source_filename} already exists. Overwrite? (y/n)", "n").lower() != "y": | if input_default(f"{source_filename} already exists. Overwrite? (y/n)", "n").lower() != "y": | ||||
| return | return | ||||
| @@ -237,18 +241,9 @@ def create_module(slug, panel_filename=None, source_filename=None): | |||||
| components = panel_to_components(tree) | components = panel_to_components(tree) | ||||
| # Write source | |||||
| source = components_to_source(components, slug) | |||||
| with open(source_filename, "w") as f: | |||||
| f.write(source) | |||||
| print(f"Source file generated at {source_filename}") | |||||
| # Append model to plugin.hpp | |||||
| identifier = str_to_identifier(slug) | |||||
| # Tell user to add model to plugin.hpp and plugin.cpp | # Tell user to add model to plugin.hpp and plugin.cpp | ||||
| print(f""" | |||||
| identifier = str_to_identifier(slug) | |||||
| eprint(f""" | |||||
| To enable the module, add | To enable the module, add | ||||
| extern Model* model{identifier}; | extern Model* model{identifier}; | ||||
| @@ -259,6 +254,16 @@ to plugin.hpp, and add | |||||
| to the init() function in plugin.cpp.""") | to the init() function in plugin.cpp.""") | ||||
| # Write source | |||||
| source = components_to_source(components, slug) | |||||
| if source_filename: | |||||
| with open(source_filename, "w") as f: | |||||
| f.write(source) | |||||
| eprint(f"Source file generated at {source_filename}") | |||||
| else: | |||||
| print(source) | |||||
| def panel_to_components(tree): | def panel_to_components(tree): | ||||
| ns = { | ns = { | ||||
| @@ -332,7 +337,7 @@ def panel_to_components(tree): | |||||
| c['cx'] = round(cx, 3) | c['cx'] = round(cx, 3) | ||||
| c['cy'] = round(cy, 3) | c['cy'] = round(cy, 3) | ||||
| else: | else: | ||||
| print(f"Element in components layer is not rect, circle, or ellipse: {el}") | |||||
| eprint(f"Element in components layer is not rect, circle, or ellipse: {el}") | |||||
| continue | continue | ||||
| # Get color | # Get color | ||||
| @@ -348,7 +353,7 @@ def panel_to_components(tree): | |||||
| color_match = re.search(r'fill:\S*(#[0-9a-fA-F]{6})', style) | color_match = re.search(r'fill:\S*(#[0-9a-fA-F]{6})', style) | ||||
| color = color_match.group(1) | color = color_match.group(1) | ||||
| if not color: | if not color: | ||||
| print(f"Cannot get color of component: {el}") | |||||
| eprint(f"Cannot get color of component: {el}") | |||||
| continue | continue | ||||
| color = color.lower() | color = color.lower() | ||||
| @@ -372,7 +377,7 @@ def panel_to_components(tree): | |||||
| components['lights'] = sorted(components['lights'], key=top_left_sort) | components['lights'] = sorted(components['lights'], key=top_left_sort) | ||||
| components['widgets'] = sorted(components['widgets'], key=top_left_sort) | components['widgets'] = sorted(components['widgets'], key=top_left_sort) | ||||
| print(f"Found {len(components['params'])} params, {len(components['inputs'])} inputs, {len(components['outputs'])} outputs, {len(components['lights'])} lights, and {len(components['widgets'])} custom widgets in \"components\" layer.") | |||||
| eprint(f"Found {len(components['params'])} params, {len(components['inputs'])} inputs, {len(components['outputs'])} outputs, {len(components['lights'])} lights, and {len(components['widgets'])} custom widgets in \"components\" layer.") | |||||
| return components | return components | ||||
| @@ -555,7 +560,7 @@ createmodule <module slug> [panel file] [source file] | |||||
| See https://vcvrack.com/manual/PanelTutorial.html for creating SVG panel files. | See https://vcvrack.com/manual/PanelTutorial.html for creating SVG panel files. | ||||
| """ | """ | ||||
| print(text) | |||||
| eprint(text) | |||||
| def parse_args(args): | def parse_args(args): | ||||
| @@ -572,7 +577,7 @@ def parse_args(args): | |||||
| elif cmd == 'createmanifest': | elif cmd == 'createmanifest': | ||||
| create_manifest(*args) | create_manifest(*args) | ||||
| else: | else: | ||||
| print(f"Command not found: {cmd}") | |||||
| eprint(f"Command not found: {cmd}") | |||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||
| @@ -581,5 +586,5 @@ if __name__ == "__main__": | |||||
| except KeyboardInterrupt: | except KeyboardInterrupt: | ||||
| pass | pass | ||||
| except UserException as e: | except UserException as e: | ||||
| print(e) | |||||
| eprint(e) | |||||
| sys.exit(1) | sys.exit(1) | ||||