118 lines
2.3 KiB
Bash
Executable file
118 lines
2.3 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# 20260305 ChatGPT
|
|
# $Header$
|
|
#
|
|
# Copy/paste examples:
|
|
# chmod 755 viewglb
|
|
# ./viewglb '/home/jlpoole/work/Voron/test2/Voron-2/STLs/Z_Drive/[a]_belt_tensioner_a_x2.stl.glb'
|
|
|
|
FILE="$1"
|
|
|
|
if [ -z "$FILE" ]; then
|
|
echo "Usage: $0 /path/to/file.glb" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -f "$FILE" ]; then
|
|
echo "ERROR: file not found: $FILE" >&2
|
|
exit 1
|
|
fi
|
|
|
|
DIR=$(dirname "$FILE")
|
|
BASE=$(basename "$FILE")
|
|
VIEWER="__glbviewer__.html"
|
|
LOG="/tmp/viewglb_httpserver.log"
|
|
|
|
urlencode() {
|
|
python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1]))' "$1"
|
|
}
|
|
|
|
find_free_port() {
|
|
python3 - <<'PY'
|
|
import socket
|
|
s = socket.socket()
|
|
s.bind(('127.0.0.1', 0))
|
|
print(s.getsockname()[1])
|
|
s.close()
|
|
PY
|
|
}
|
|
|
|
PORT=$(find_free_port)
|
|
BASE_URL=$(urlencode "$BASE")
|
|
|
|
cd "$DIR" || exit 1
|
|
|
|
cat >"$VIEWER" <<EOF
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>$BASE</title>
|
|
</head>
|
|
<body style="margin:0;background:#222;overflow:hidden;">
|
|
|
|
<div style="
|
|
position:absolute;
|
|
bottom:10px;
|
|
left:50%;
|
|
transform:translateX(-50%);
|
|
z-index:10;
|
|
padding:6px 12px;
|
|
background:rgba(0,0,0,0.65);
|
|
color:#fff;
|
|
font-family:monospace;
|
|
font-size:14px;
|
|
border-radius:4px;
|
|
max-width:80vw;
|
|
white-space:nowrap;
|
|
overflow:hidden;
|
|
text-overflow:ellipsis;
|
|
">$BASE</div>
|
|
|
|
<script type="module" src="https://salemdata.us/lib/model-viewer.min.js"></script>
|
|
|
|
<model-viewer src="$BASE_URL"
|
|
camera-controls
|
|
auto-rotate
|
|
style="width:100vw;height:100vh;">
|
|
</model-viewer>
|
|
|
|
</body>
|
|
</html>
|
|
EOF
|
|
|
|
python3 -m http.server "$PORT" >"$LOG" 2>&1 &
|
|
SERVER=$!
|
|
|
|
# wait up to ~5 seconds for server readiness
|
|
READY=0
|
|
for _i in 1 2 3 4 5 6 7 8 9 10; do
|
|
if ! kill -0 "$SERVER" 2>/dev/null; then
|
|
echo "ERROR: http.server exited early." >&2
|
|
echo "See log: $LOG" >&2
|
|
rm -f "$VIEWER"
|
|
exit 1
|
|
fi
|
|
|
|
if curl -s "http://127.0.0.1:$PORT/$VIEWER" >/dev/null 2>&1; then
|
|
READY=1
|
|
break
|
|
fi
|
|
|
|
sleep 0.5
|
|
done
|
|
|
|
if [ "$READY" -ne 1 ]; then
|
|
echo "ERROR: server did not become ready on port $PORT" >&2
|
|
echo "See log: $LOG" >&2
|
|
kill "$SERVER" 2>/dev/null
|
|
rm -f "$VIEWER"
|
|
exit 1
|
|
fi
|
|
|
|
firefox-bin "http://127.0.0.1:$PORT/$VIEWER" >/dev/null 2>&1 &
|
|
|
|
read -p "Press Enter to stop server..."
|
|
|
|
kill "$SERVER" 2>/dev/null
|
|
rm -f "$VIEWER"
|