浏览代码

3d:端口改为后端5182/前端5183;新增 run.sh 与环境依赖检测;模块2重命名为 -one 并默认优先加载

18922397810 2 周之前
父节点
当前提交
85dc8b5093

+ 9 - 4
3d/README.md

@@ -40,20 +40,25 @@ cd 3d/frontend && npm install
 
 ```bash
 # 终端 1:服务端
-python3 3d/backend/run.py --reload         # http://127.0.0.1:8000
+python3 3d/backend/run.py --reload         # http://127.0.0.1:5182
+# 若 python3 被解析成系统解释器(zsh 命令缓存),改用:
+bash 3d/backend/run.sh --reload
 
 # 终端 2:客户端
 cd 3d/frontend
-npm run dev                                # http://127.0.0.1:5173
+npm run dev                                # http://127.0.0.1:5183
 ```
 
-Vite 已把 `/api`、`/models` 代理到 `http://127.0.0.1:8000`(见 `vite.config.ts`)。
+> 排查:`which python3` 若显示 `/usr/bin/python3` 之类的系统解释器,执行 `hash -r`(zsh)或重开终端;
+> `run.sh` 会优先使用当前 conda/venv 环境(`$CONDA_PREFIX/bin/python`),不受 PATH 缓存影响。
+
+Vite 已把 `/api`、`/models` 代理到 `http://127.0.0.1:5182`(见 `vite.config.ts`)。
 
 ## 生产模式(单端口)
 
 ```bash
 cd 3d/frontend && npm run build            # 产物:3d/frontend/dist
-python3 3d/backend/run.py --host 0.0.0.0 --port 8000
+python3 3d/backend/run.py --host 0.0.0.0 --port 5182
 ```
 
 FastAPI 托管 `frontend/dist`,非 `/api`、`/models` 的路径回退 `index.html`。

+ 30 - 4
3d/backend/run.py

@@ -2,7 +2,7 @@
 """启动 3D 服务端。
 
 用法:
-    python3 3d/backend/run.py                 # 默认 127.0.0.1:8000
+    python3 3d/backend/run.py                 # 默认 127.0.0.1:5182
     python3 3d/backend/run.py --port 9100 --reload
 """
 
@@ -10,15 +10,41 @@ import argparse
 import sys
 from pathlib import Path
 
-import uvicorn
+BASE_DIR = Path(__file__).resolve().parent
+sys.path.insert(0, str(BASE_DIR))
 
-sys.path.insert(0, str(Path(__file__).resolve().parent))
+
+def _require_dependencies() -> None:
+    missing = [name for name in ("fastapi", "uvicorn") if _importable(name) is None]
+    if not missing:
+        return
+    req = BASE_DIR / "requirements.txt"
+    sys.stderr.write(
+        "\n[启动失败] 当前 Python 缺少依赖: " + ", ".join(missing) + "\n"
+        f"  当前解释器: {sys.executable}\n"
+        f"  版本: {sys.version.split()[0]}\n"
+        f"  安装依赖: {sys.executable} -m pip install -r {req}\n"
+        "\n提示:如果 `python3` 指向系统解释器(如 /usr/bin/python3),\n"
+        "请先激活项目环境(conda activate compressor-wave),\n"
+        "或用 conda run -n compressor-wave python3 3d/backend/run.py 运行。\n",
+    )
+    raise SystemExit(1)
+
+
+def _importable(name: str):
+    try:
+        return __import__(name)
+    except ImportError:
+        return None
 
 
 def main() -> None:
+    _require_dependencies()
+    import uvicorn
+
     parser = argparse.ArgumentParser(description="压缩机 3D 部件查看服务")
     parser.add_argument("--host", default="127.0.0.1")
-    parser.add_argument("--port", type=int, default=8000)
+    parser.add_argument("--port", type=int, default=5182)
     parser.add_argument("--reload", action="store_true")
     args = parser.parse_args()
 

+ 32 - 0
3d/backend/run.sh

@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+# 启动 3D 服务端(自动选用当前 conda/venv 环境的解释器,避免 PATH 缓存到系统 python)。
+#
+# 用法:
+#   bash 3d/backend/run.sh                 # 默认 127.0.0.1:5182
+#   bash 3d/backend/run.sh --reload
+#   bash 3d/backend/run.sh --port 5182
+set -e
+
+DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+ROOT="$(cd "$DIR/../.." && pwd)"
+
+pick_python() {
+  if [ -n "${CONDA_PREFIX:-}" ] && [ -x "$CONDA_PREFIX/bin/python" ]; then
+    echo "$CONDA_PREFIX/bin/python"
+    return
+  fi
+  if [ -x "$ROOT/.venv/bin/python" ]; then
+    echo "$ROOT/.venv/bin/python"
+    return
+  fi
+  command -v python || command -v python3
+}
+
+PY="$(pick_python)"
+
+if ! "$PY" -c "import fastapi, uvicorn" >/dev/null 2>&1; then
+  echo "[run.sh] 解释器 $PY 缺少依赖,正在安装 requirements.txt ..." >&2
+  "$PY" -m pip install -r "$DIR/requirements.txt"
+fi
+
+exec "$PY" "$DIR/run.py" "$@"

+ 1 - 1
3d/docs/建模与GLB转换指南.md

@@ -90,7 +90,7 @@ CAD Exchanger SDK / Datakit CrossManager:一条命令 STEP→GLB,保留部
 
 ## 六、交付自检清单
 
-打开网页(`python3 3d/backend/run.py`,默认 http://127.0.0.1:8000)后逐项确认:
+打开网页(`python3 3d/backend/run.py`,默认 http://127.0.0.1:5182)后逐项确认:
 
 - [ ] 顶部下拉能选到你的模型
 - [ ] 部件列表数量、名称与你 CAD 里的零件对应

+ 1 - 1
3d/frontend/src/composables/useThreeViewer.ts

@@ -26,7 +26,7 @@ export function useThreeViewer(container: Ref<HTMLElement | null>): void {
       viewer.activateView(0)
       viewerStore.activeView = 0
       await partsStore.applySavedState(name)
-      if (/^压缩机2326/.test(name) && /模块2/.test(name)) {
+      if (/^压缩机2326/.test(name) && /one/.test(name)) {
         const target = partsStore.parts.find(
           (p) => p.label === '三维立体_1687' || p.name === '三维立体_1687',
         )

+ 3 - 3
3d/frontend/vite.config.ts

@@ -4,11 +4,11 @@ import vue from '@vitejs/plugin-vue'
 export default defineConfig({
   plugins: [vue()],
   server: {
-    port: 5173,
+    port: 5183,
     allowedHosts: ['2frps.roadbyway.com'],
     proxy: {
-      '/api': 'http://127.0.0.1:8000',
-      '/models': 'http://127.0.0.1:8000',
+      '/api': 'http://127.0.0.1:5182',
+      '/models': 'http://127.0.0.1:5182',
     },
   },
   build: {

3d/models/压缩机2326-3000_模块2.glb → 3d/models/压缩机2326-3000-one.glb


+ 4 - 4
README.md

@@ -58,13 +58,13 @@ npm run build
 python3 -m pip install -r 3d/backend/requirements.txt
 cd 3d/frontend && npm install
 
-# 开发:服务端 + 客户端(Vite 代理 /api、/models 到 8000)
-python3 3d/backend/run.py --reload
-cd 3d/frontend && npm run dev            # http://127.0.0.1:5173
+# 开发:服务端 + 客户端(Vite 代理 /api、/models 到 5182)
+python3 3d/backend/run.py --reload       # http://127.0.0.1:5182
+cd 3d/frontend && npm run dev            # http://127.0.0.1:5183
 
 # 生产:构建后由 FastAPI 单端口托管
 cd 3d/frontend && npm run build
-python3 3d/backend/run.py                # http://127.0.0.1:8000
+python3 3d/backend/run.py                # http://127.0.0.1:5182
 ```
 
 详见 `3d/README.md`。