2026-09-26 18:05:21 +08:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
"""Assemble the single-file viewer: three.js (inline, no CDN) + mesh data + 2D sheets."""
|
|
|
|
|
import io
|
|
|
|
|
import json
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
sys.stdout.reconfigure(encoding="utf-8")
|
|
|
|
|
except Exception:
|
|
|
|
|
pass
|
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
2026-09-27 00:28:49 +08:00
|
|
|
from armcore import WEB, DOCS, WORKSPACE
|
2026-09-26 18:05:21 +08:00
|
|
|
SRC = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
|
|
2026-09-27 04:48:49 +08:00
|
|
|
import time
|
|
|
|
|
|
2026-09-27 00:28:49 +08:00
|
|
|
def rebuild_viewer():
|
2026-09-27 04:48:49 +08:00
|
|
|
print("=" * 80, flush=True)
|
|
|
|
|
print("【第五阶段 5/5】打包单文件三维交互查看器 (机器人手臂3D查看器.html)...", flush=True)
|
|
|
|
|
print("=" * 80, flush=True)
|
|
|
|
|
t0 = time.time()
|
|
|
|
|
print(" - 读取 Three.js 离线 3D 渲染内核...", end="", flush=True)
|
2026-09-27 00:28:49 +08:00
|
|
|
three = io.open(WEB + "/three_inline.js", encoding="utf-8").read()
|
|
|
|
|
assert len(three) > 400000, len(three)
|
2026-09-27 04:48:49 +08:00
|
|
|
print(f" 完成 ({len(three)/1024:.0f} KB) ✓", flush=True)
|
|
|
|
|
|
|
|
|
|
print(" - 读取几何网格与关节运动学数据...", end="", flush=True)
|
2026-09-27 00:28:49 +08:00
|
|
|
data = io.open(WEB + "/mesh_arm.json", encoding="utf-8").read()
|
|
|
|
|
sheets = io.open(WEB + "/sheets.jsdata", encoding="utf-8").read()
|
|
|
|
|
trv = io.open(DOCS + "/travel.json", encoding="utf-8").read() if os.path.exists(
|
|
|
|
|
DOCS + "/travel.json") else "[]"
|
2026-09-28 01:00:04 +08:00
|
|
|
screws = io.open(DOCS + "/screws.json", encoding="utf-8").read() if os.path.exists(
|
|
|
|
|
DOCS + "/screws.json") else "[]"
|
2026-09-28 12:08:41 +08:00
|
|
|
ik_solver = io.open(WEB + "/arm-ik-solver.js", encoding="utf-8").read()
|
|
|
|
|
ik_glue = io.open(WEB + "/ik-glue.js", encoding="utf-8").read()
|
2026-09-27 00:28:49 +08:00
|
|
|
tpl = io.open(SRC + "/viewer_tpl.html", encoding="utf-8").read()
|
2026-09-27 04:48:49 +08:00
|
|
|
print(f" 完成 ({len(data)/1024:.0f} KB) ✓", flush=True)
|
|
|
|
|
|
|
|
|
|
print(" - 打包生成全内置单文件 HTML...", end="", flush=True)
|
2026-09-27 00:28:49 +08:00
|
|
|
out = (tpl.replace("/*__THREE__*/", three)
|
|
|
|
|
.replace("/*__DATA__*/", data)
|
|
|
|
|
.replace("/*__SHEETS__*/", sheets)
|
2026-09-28 01:00:04 +08:00
|
|
|
.replace("/*__TRAVEL__*/", trv)
|
2026-09-28 12:08:41 +08:00
|
|
|
.replace("/*__SCREWS__*/", screws)
|
|
|
|
|
.replace("/*__IKSOLVER__*/", ik_solver)
|
|
|
|
|
.replace("/*__IKGLUE__*/", ik_glue))
|
2026-09-27 00:28:49 +08:00
|
|
|
assert "/*__" not in out, [l for l in out.split("\n") if "/*__" in l][:3]
|
|
|
|
|
dst = WEB + "/机器人手臂3D查看器.html"
|
|
|
|
|
io.open(dst, "w", encoding="utf-8").write(out)
|
|
|
|
|
io.open(WEB + "/index.html", "w", encoding="utf-8").write(out)
|
|
|
|
|
io.open(WORKSPACE + "/机器人手臂3D查看器.html", "w", encoding="utf-8").write(out)
|
2026-09-27 04:48:49 +08:00
|
|
|
sz_mb = os.path.getsize(dst) / 1e6
|
|
|
|
|
print(f" 完成 ({sz_mb:.2f} MB, 耗时: {time.time()-t0:.2f}s) ✓", flush=True)
|
|
|
|
|
print(f"-> 3D查看器已更新至: {dst} 与 根目录/机器人手臂3D查看器.html\n", flush=True)
|
2026-09-27 00:28:49 +08:00
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
rebuild_viewer()
|
|
|
|
|
os._exit(0)
|
|
|
|
|
|