#!/usr/bin/env python3 """ Install Hermes Bridge into Houdini. Copies the Python panel to ~/houdini21.0/scripts/python/ and the shelf tool to ~/houdini21.0/toolbar/ Usage: python install.py [--houdini-dir ~/houdini21.0] """ import os import sys import shutil import argparse FILES = { "hermes_bridge_panel.py": "scripts/python/", "hermes_bridge.shelf": "toolbar/", } def get_houdini_dir(): """Auto-detect Houdini prefs directory.""" home = os.path.expanduser("~") for d in sorted(os.listdir(home), reverse=True): if d.startswith("houdini") and os.path.isdir(os.path.join(home, d)): return os.path.join(home, d) return os.path.join(home, "houdini21.0") def main(): parser = argparse.ArgumentParser(description="Install Hermes Bridge into Houdini") parser.add_argument( "--houdini-dir", default=get_houdini_dir(), help=f"Houdini preferences directory (default: {get_houdini_dir()})", ) args = parser.parse_args() src_dir = os.path.dirname(os.path.abspath(__file__)) for filename, subdir in FILES.items(): src = os.path.join(src_dir, filename) dst_dir = os.path.join(os.path.expanduser(args.houdini_dir), subdir) dst = os.path.join(dst_dir, filename) if not os.path.exists(src): print(f" SKIP {filename} — source not found") continue os.makedirs(dst_dir, exist_ok=True) shutil.copy2(src, dst) print(f" COPY {filename} -> {dst}") print(f"\nInstalled to {args.houdini_dir}") print("Restart Houdini — the shelf tool appears under 'Hermes Bridge'.") if __name__ == "__main__": main()