holder: explicit Render button + progress UI + longer render timeout

- Replace debounced auto-render-on-param-change with an explicit Render
  button. Param changes mark the button "dirty" (accent ring); user clicks
  Render to drive a render. A Cancel button (AbortController) appears
  while a render is in flight.
- Add indeterminate progress bar with elapsed-time counter in the status
  panel. Real OpenSCAD --progress streaming can come later.
- Bump OPENSCAD_TIMEOUT default 60s -> 300s and gunicorn --timeout
  120s -> 300s. The 60s cap was misclassified by the frontend as
  "OpenSCAD not installed" because the error string contained the word
  "openscad" -- which the JS matched too greedily.
- Frontend error classifier now distinguishes "binary not found",
  "timed out", and "geometry empty" cases and only shows the
  install-OpenSCAD hint for the real not-found case.
This commit is contained in:
wenil
2026-05-25 11:22:04 +03:00
parent 1fadef0b3f
commit af3ed092dc
5 changed files with 109 additions and 21 deletions
+1 -1
View File
@@ -28,7 +28,7 @@ from typing import Any
APP_DIR = Path(__file__).resolve().parent
SCAD_FILE = APP_DIR / "scad" / "hex_cell.scad"
OPENSCAD_BIN = os.environ.get("OPENSCAD_BIN", "openscad")
RENDER_TIMEOUT = int(os.environ.get("OPENSCAD_TIMEOUT", "60"))
RENDER_TIMEOUT = int(os.environ.get("OPENSCAD_TIMEOUT", "300"))
def openscad_available() -> bool: