Spaces:
Configuration error
Configuration error
| import os | |
| import time | |
| import sys | |
| import subprocess | |
| from watchdog.observers import Observer | |
| from watchdog.events import FileSystemEventHandler | |
| PYTHON_EXE = sys.executable | |
| ENGINE = os.path.join(os.path.dirname(__file__), "genmake_crystal_engine.py") | |
| INPUT_DIR = os.path.join(os.path.dirname(__file__), "GenMake_Input") | |
| READY_DIR = os.path.join(os.path.dirname(__file__), "GenMake_XCS_Ready") | |
| os.makedirs(INPUT_DIR, exist_ok=True) | |
| os.makedirs(READY_DIR, exist_ok=True) | |
| def wait_until_stable(path, timeout=40): | |
| last = -1 | |
| for _ in range(timeout): | |
| try: | |
| s = os.path.getsize(path) | |
| if s > 0 and s == last: | |
| return True | |
| last = s | |
| except OSError: | |
| pass | |
| time.sleep(1) | |
| return False | |
| class Handler(FileSystemEventHandler): | |
| def on_created(self, event): | |
| if event.is_directory: | |
| return | |
| src = event.src_path | |
| if not src.lower().endswith((".jpg", ".jpeg", ".png")): | |
| return | |
| print("\nNew image:", src) | |
| if not wait_until_stable(src): | |
| print("File not stable; skipping:", src) | |
| return | |
| # Default production settings (tune once you test crystals) | |
| product = "block_50x50x80" | |
| quality = "medium" | |
| cmd = [ | |
| PYTHON_EXE, ENGINE, src, | |
| "--product", product, | |
| "--quality", quality, | |
| "--fp16", | |
| "--face_crop", | |
| ] | |
| print("Running:", " ".join(cmd)) | |
| r = subprocess.run(cmd, capture_output=True, text=True) | |
| if r.stdout: | |
| print(r.stdout) | |
| if r.returncode != 0: | |
| print("ERROR:\n", r.stderr) | |
| return | |
| # Find newest GenMake output folder and copy GLB to Ready folder | |
| out_dir = os.path.join(os.path.dirname(__file__), "GenMake_Output") | |
| newest = None | |
| if os.path.isdir(out_dir): | |
| folders = [os.path.join(out_dir, f) for f in os.listdir(out_dir)] | |
| folders = [f for f in folders if os.path.isdir(f)] | |
| if folders: | |
| newest = max(folders, key=os.path.getmtime) | |
| if newest: | |
| glb = os.path.join(newest, "GenMake_EngraveReady.glb") | |
| if os.path.exists(glb): | |
| base = os.path.splitext(os.path.basename(src))[0] | |
| dest = os.path.join(READY_DIR, f"{base}_{product}.glb") | |
| if os.path.exists(dest): | |
| os.remove(dest) | |
| os.replace(glb, dest) | |
| print("READY:", dest) | |
| # Clean input | |
| try: | |
| os.remove(src) | |
| print("Input cleaned.") | |
| except Exception as e: | |
| print("Could not delete input:", e) | |
| observer = Observer() | |
| observer.schedule(Handler(), INPUT_DIR, recursive=False) | |
| observer.start() | |
| print("GenMake Watchdog running.") | |
| print("Drop photos into:", INPUT_DIR) | |
| print("GLB output appears in:", READY_DIR) | |
| print("Press CTRL+C to stop.\n") | |
| try: | |
| while True: | |
| time.sleep(1) | |
| except KeyboardInterrupt: | |
| observer.stop() | |
| observer.join() |