"""Command-line entry point for the wired3d viewer package. Usage: python -m wired3d_viewer view # write a standalone HTML viewer python -m wired3d_viewer serve [port] # start the drag-and-drop server After ``pip install -e .`` the same commands are available as:: wired3d view wired3d serve [port] Submodules are imported lazily inside each handler so that ``view``/``serve`` only pull in plotly/numpy when actually used. """ import argparse def main(argv: list[str] | None = None) -> None: """Parse argv and dispatch to the viewer or server. Inputs: argv -- optional argument list (defaults to ``sys.argv[1:]``). Output: None. Runs the chosen subcommand. """ parser = argparse.ArgumentParser( prog="wired3d_viewer", description="Interactive 3D viewer for Beckhoff 5-axis DED NC toolpaths.", ) sub = parser.add_subparsers(dest="command", required=True) p_view = sub.add_parser( "view", help="render an NC file to a standalone HTML viewer") p_view.add_argument("nc_file", help="path to the .nc file to visualise") p_serve = sub.add_parser( "serve", help="start the drag-and-drop web server") p_serve.add_argument( "port", nargs="?", type=int, default=8765, help="TCP port to listen on (default 8765)") args = parser.parse_args(argv) if args.command == "view": from .viewer import main as view_main view_main(args.nc_file) elif args.command == "serve": from .server import main as serve_main serve_main(args.port) if __name__ == "__main__": main()