flash555588_ai-model-workbench/README.zh-CN.md
2026-06-28 00:35:20 +08:00

31 KiB
Raw Blame History

AI Model Workbench

一个以本地优先和知识库整合为核心的 Obsidian 3D 查看插件,可在本地 WebGL 视口中查看常见 3D 资产、标注关键部位并将模型整理为可链接的知识笔记。单模型预览GLB、GLTF、STL、PLY、OBJ默认走 Babylon.js 兼容模式Three.js 作为显式启用的可选预览路线保留;文件视图 workbench 可以选择启用实验性 Three.js GLB/GLTF 路径,并保留 Babylon.js 自动回退;3dgrid 与 SPLAT 仍保留在 Babylon.js 能力路径上。

AI Model Workbench

English | 简体中文

preview

醒目提示STEP/STP 是“转换支持”,不是直接渲染。 STEP 文件需要在 Obsidian 桌面端配置本地 Python + CadQuery/OCCT 转换器后才能转成 GLB 预览。 移动端不能执行 STEP 转换;大型或复杂 PCB/装配体 STEP 首次打开可能很慢,也可能因为本地 CAD 环境缺失而失败。 如果需要稳定打开,建议先转换为 GLB或先在插件设置里的转换器诊断中确认环境可用。


目录


功能特性

  • 直接预览 GLB/GLTF、STL、OBJ、PLY默认走 Babylon.js 兼容模式Three.js 可显式启用)
  • 可选转换 CAD、FBX、3MF、DAE 等资产到 GLB
  • 混合预览路由单模型预览GLB/GLTF/STL/PLY/OBJ默认走 Babylon.js 兼容模式,可在设置中显式启用 Three.js
  • 内联与文件视图:实时预览、代码块、直接文件查看
  • 网格系统:在单个视口中渲染多个模型,支持预设布局
  • 3D 标注:点击模型表面添加带标签和颜色的书签,支持深度遮挡
  • 知识笔记:从已加载的模型生成结构化 Markdown并自动注册捕获到的零件候选用于跨模型复用识别
  • 快照功能:复制、保存或下载渲染预览为 PNG
  • 国际化:英文和简体中文,自动检测系统语言
  • 桌面端支持Windows、macOS、Linux 上的 Obsidian Desktop
  • 移动端支持iOS、iPadOS、Android 支持直读格式和简化后的工作台布局

警告与风险

  • STEP/STP 和 CAD 文件不是直接渲染格式。 它们必须先在桌面端转换。 Python 依赖缺失、CAD 几何不兼容、装配体过大或转换超时,都可能导致无法预览, 即使插件本身已经正确安装。
  • 本地转换器是外部桌面工具。 它们会在你的电脑上解析模型文件。 请只处理可信模型,明确配置转换器命令路径,并在打开未知 CAD、FBX、3MF、DAE 或 SLDPRT 资产前先查看转换器诊断。
  • 大型模型可能拖慢 Obsidian。 大型 GLB 和转换后的 STEP/PCB 装配体可能占用大量 CPU、GPU、内存和磁盘 I/O导致界面卡顿、WebGL 上下文丢失,或首次打开耗时数分钟。 建议降低渲染质量/缩放,一次只打开一个重模型,并优先使用预先转换好的 GLB。
  • 生成的副文件可能很大,也可能包含敏感信息。 转换后的 GLB、截图、报告、索引和 JSON sidecar 可能包含文件名、装配体名称、部件 ID、尺寸、几何摘要和预览图。 请有意识地设置辅助文件夹;如果需要,记得从同步工具或 Git 中排除这些文件。
  • 不同渲染路线可能显示不一致。 Babylon.js 兼容模式最稳。Three.js 快速路径可能更快, 但某些资产的颜色、拾取、测量或工具栏行为可能不同。排查显示问题时,可以关闭 “转换 GLB 的 Three 快速路径”,或切回兼容模式。
  • 移动端只支持直读预览。 移动端可以查看 GLB/GLTF/STL/OBJ/PLY 和已经转换好的 GLB 但不能运行本地转换工具,也不能执行转换器诊断。
  • 远程草稿是可选能力,也应按敏感数据处理。 插件默认本地优先;如果配置了远程草稿, 根据隐私设置,请求中仍可能包含经过裁剪的模型名、部件名、数量、尺寸、标签和笔记引用。

当前版本

0.7.0 是面向大型本地模型工作流的兼容性、性能和支持边界版本。它保留 Babylon.js 兼容模式作为单模型预览默认路线,新增“转换 GLB 的 Three 快速路径”开关,允许用户自定义转换副文件位置,并把 STEP/CAD 转换、大型装配体、生成副文件、移动端限制和远程草稿隐私风险写入入口文档。

发布亮点:

  • Babylon.js 兼容模式仍是单模型预览默认路线Three.js 继续作为显式启用的可选路线。
  • STEP/FBX/3MF/DAE 等转换后的 GLB 可以通过独立开关使用 Three.js 快速路径,并在失败时静默回退到 Babylon.js。
  • 转换副文件可以放到用户指定的辅助文件夹,不再只能放在 Obsidian 配置目录下。
  • 直接文件视图、3dgrid、测量、相机缩放和大型模型加载路径获得更多稳定性与性能优化。
  • README 已集中补充 STEP/CAD 转换限制、外部转换器风险、大模型资源压力、生成副文件、渲染路线差异、移动端限制和远程草稿隐私提醒。

完整 0.7.0 发布日志见 docs/release-notes/0.7.0.mdCHANGELOG.md,历史版本见 docs/release-notes/0.6.1.mddocs/release-notes/0.6.0.md


平台支持矩阵

能力 Windows / macOS / Linux iOS / iPadOS / Android
直读格式GLB、GLTF、OBJ、STL、PLY 支持 支持
直接文件查看 支持 支持
直读格式的内联嵌入 / 实时预览 支持 支持
工作台布局 完整桌面布局 简化单列移动布局
本地转换CAD、FBX、3MF、DAE、SLDPRT 支持 不支持
转换器诊断与本地 CLI 自检 支持 不支持
已生成的 .ai3d-converted.glb 资产 支持 支持

快速入门

  1. 通过 Obsidian、发布版下载或本地构建安装插件。
  2. 把一个受支持的模型文件放进 vault例如 model.glb
  3. 在任意笔记中这样嵌入:
![[model.glb]]
![[model.glb|400x300]]

你也可以直接在文件列表中点击受支持的模型文件,打开直接文件视图。


安装

选择一种安装方式,然后使用 快速入门 中的嵌入语法。

前提

  • Obsidian 1.5.0 或更高版本
  • 需要 Windows、macOS 或 Linux 上的 Obsidian Desktop 才能使用本地转换工具
  • 你电脑上的本地 Obsidian vault 文件夹
  • vault 里的插件目录:
<vault>/.obsidian/plugins/ai-model-workbench/

无论用哪种方式安装,最终都要把下面这三个文件放进这个目录:

文件 大小 说明
main.js ~3.9 MB 插件运行时 bundle
manifest.json ~1 KB Obsidian 插件清单
styles.css ~40 KB 插件样式

直接渲染在桌面端和移动端都可用。CAD、FBX、3MF、DAE 的本地转换工具只适用于桌面系统。

方式 A从源码构建

  1. 克隆仓库并构建插件:
git clone https://github.com/flash555588/ai-model-workbench.git
cd ai-model-workbench
npm install
npm run build
  1. 把构建产物安装到 vault
# 安装到仓库自带的测试 vault
npm run install:vault

# 或安装到你自己的 vault
npm run install:vault -- --vault "C:\path\to\your-vault"

安装脚本会把 main.jsmanifest.jsonstyles.css 复制到 .obsidian/plugins/ai-model-workbench/,并在 community-plugins.json 中启用 ai-model-workbench

  1. 如果 Obsidian 已经打开,重新加载应用,或在“设置 > 社区插件”中禁用再启用 AI Model Workbench

手动备选:创建 <vault>/.obsidian/plugins/ai-model-workbench/,把 main.jsmanifest.jsonstyles.css 复制进去,然后在 Obsidian 中启用 AI Model Workbench

方式 B下载发布版

  1. Releases 下载 main.jsmanifest.jsonstyles.css
  2. 如果 <vault>/.obsidian/plugins/ai-model-workbench/ 还不存在,先创建它。
  3. 把这三个文件放进这个文件夹里。
  4. 在 Obsidian 的“设置 > 社区插件”中启用 AI Model Workbench

方式 C开发用符号链接

  1. 先确认 <vault>/.obsidian/plugins/ 已经存在。
  2. 创建一个名为 ai-model-workbench 的符号链接,指向当前仓库。

WindowsPowerShell

New-Item -ItemType SymbolicLink `
  -Path "C:\path\to\your-vault\.obsidian\plugins\ai-model-workbench" `
  -Target "C:\path\to\ai-model-workbench"

macOS / Linux

ln -s /path/to/ai-model-workbench \
  /path/to/your-vault/.obsidian/plugins/ai-model-workbench
  1. 如果还没装依赖,先在当前仓库运行一次 npm install
  2. 开发时运行 npm run dev
  3. 在 Obsidian 的“设置 > 社区插件”中启用 AI Model Workbench

安装后

如果 Obsidian 已经打开,请重新加载应用,或在“设置 > 社区插件”中禁用再启用 AI Model Workbench。然后把受支持的模型文件放进 vault并使用 快速入门 中的嵌入语法。


安全与隐私

AI Model Workbench 不收集遥测数据,不会主动回传,也不会运行后台网络同步。模型预览读取的是已经存在于 Obsidian vault 中的本地文件OBJ 的 MTL 材质和纹理引用会从 vault 内解析,而不是从网络下载。

打包后的 Babylon.js 运行时包含面向 Web 应用的通用 URL 加载工具。该插件会把 vault 文件字节以 data URL 传给 Babylon覆盖 OBJ MTL 加载逻辑以避免远程请求,并在运行时显式拒绝 http(s) / ws(s) 资产与脚本 URL同时关闭 Babylon 对这类请求的重试钩子。可选的转换器诊断和格式转换只会在用户主动操作后运行,并且只在桌面端调用本地工具。

知识笔记生成默认保持本地-only。如果你配置了可选远程草稿服务插件只会向你填写的 POST /draft-note 端点发送被允许的证据 payload。当前客户端拒绝上传原始模型几何摘要和预览图引用必须分别显式开启后才会包含在请求中。

发布资产仅限 Obsidian 会下载的三个文件:main.jsmanifest.jsonstyles.css。GitHub Actions 会从源码构建这些文件,并为它们发布 artifact attestation便于验证来源。


资金与赞助

AI Model Workbench 的插件包中不包含赞助提示、付款流程或加密货币钱包地址。


格式支持

直接渲染(无需外部工具)

格式 扩展名 特性
GLB / GLTF .glb .gltf PBR 材质、动画、纹理、场景层级;.gltf 会解析 vault 内相对路径的 .bin 与纹理
STL .stl 二进制格式、逐面颜色VisCAM/SolidView
OBJ .obj MTL 材质、库内相对路径纹理解析、同目录大小写兜底
PLY .ply ASCII/二进制、顶点颜色、点云支持

当前打包版本临时关闭 SPLAT 预览,直到其加载器替换为纯本地实现。

SPLAT 说明与规划

  • 当前状态:社区发布版暂时关闭 SPLAT 预览GLB、GLTF、STL、OBJ、PLY 以及现有本地转换路线不受影响。
  • 原因:现阶段 Babylon 上游 SPLAT/SPZ loader 仍带有动态脚本与远程模块回退路径。插件运行时已经拒绝远程请求,但发布版希望进一步把这类加载路径从最终产物中剥离,降低审核和静态扫描风险。
  • 未来规划:第一步恢复纯本地 .splat 直读;第二步在 Windows 和大场景下完成静止/空闲渲染稳定性优化后再重新开放;第三步再单独评估 .spz,只有在解码依赖可以完整本地打包并通过审查时才会重新启用。

转换(需要外部工具)

STEP/STP 注意: STEP 只支持通过本地转换生成 GLB 后预览。 它不是浏览器/WebGL 原生直读格式,是否可用取决于插件设置中显示的桌面端转换器环境。

格式 扩展名 转换器 输出
STEP .step .stp Python + CadQuery/OCCT GLB
IGES .iges .igs Python + CadQuery/OCCT GLB
BREP .brep Python + CadQuery/OCCT GLB
SLDPRT .sldprt FreeCAD GLB
3MF .3mf Python + trimesh GLB
DAE .dae Python + trimesh GLB
FBX .fbx FBX2glTF GLB

格式特性矩阵

特性 GLB/GLTF STL OBJ PLY FBX转换后 CAD
网格
点云
材质 PBR 基础 MTL 基础 基础
纹理 嵌入式 外部
颜色 顶点 顶点 面(STEP)
动画

使用方法

README 只保留常用入口,完整工作流和复制即用语法已拆到独立文档:

  • 使用指南:预览入口、直接文件视图、标注、测量、截图、知识笔记、部件证据、转换、性能建议和排查。
  • 常见用法语法Wikilink、3d3dgrid、常用字段、支持扩展名和快捷键。

快速示例:

![[model.glb]]
![[model.glb|400x300]]
```3d
model.glb
```
```3dgrid
{
  "models": [
    { "path": "v1.step" },
    { "path": "v2.step" }
  ],
  "preset": "compare"
}
```

如果要做模型审阅,请直接从 Obsidian 文件列表打开受支持的模型文件。直接文件视图是标注、测量、截图、部件证据和知识笔记生成的主要入口。


设置选项

设置项 默认值 说明
语言 自动 界面语言(英文 / 简体中文 / 自动检测)
标注预览模式 plain-text 控制已保存标注内容在只读预览中的渲染方式
AI 草稿模式 仅本地证据 默认保持本地生成;配置远程服务后才请求远程草稿
草稿服务 URL 接收 POST /draft-note 的服务基础地址
预览兼容模式 兼容优先 控制新的单模型 GLB 预览路径启用范围
实验性 Three 工作台 仅对直读 GLB/GLTF 文件视图尝试 Three.js workbench失败时自动回退 Babylon.js
画布高度 400 预览高度(像素)
自动旋转 启动时启用旋转动画
自动旋转速度 0.5 旋转速度0.1-2.0
渲染质量 质量预设(低/中/高)
渲染缩放 1.0 分辨率倍数0.25-2.0
快照文件夹 Media/3D Previews 导出文件夹
快照命名 model-name 导出 PNG 快照时的文件命名方式
报告文件夹 Analysis/3D Reports 知识笔记文件夹
部件笔记文件夹 Parts/3D Components 保存生成的部件笔记草稿
日志级别 warn 控制台日志详细程度

转换器设置

设置项 说明
启用 CAD 转换器 通过 CadQuery 启用 STEP/IGES/BREP
启用 SLDPRT 转换器 通过 FreeCAD 启用 SolidWorks
启用网格转换器 通过 trimesh 启用 3MF/DAE
启用 OBJ2GLTF 转换器 可选,通过 obj2gltf 标准化 OBJ
启用 FBX2glTF 转换器 通过 FBX2glTF 启用 FBX 转换
Python 命令路径CAD 用) 覆盖 STEP/IGES/BREP 转换使用的 Python 可执行文件
FreeCADCmd 路径SLDPRT 用) 覆盖 .sldprt 转换使用的 FreeCAD 可执行文件
obj2gltf 命令路径 覆盖 obj2gltf CLI 路径
FBX2glTF 命令路径 覆盖 FBX2glTF CLI 路径
Python 命令路径3MF/DAE 用) 覆盖 3MF/DAE 转换使用的 Python 可执行文件
转换器命令诊断 显示插件当前实际会使用的可执行文件路径,并为 Python 环境和转换器命令运行轻量自检

可移植性与诊断

渲染层本身具备较好的跨平台可移植性GLB、OBJ、STL、PLY 以及已经生成好的 .ai3d-converted.glb,只要 Obsidian Desktop 能提供 WebGL 就可以显示。

在 iOS、iPadOS 和 Android 上,插件现已支持 GLB、GLTF、OBJ、STL、PLY 等直读格式。CAD、FBX、3MF、DAE、SLDPRT 这类需要本地转换器的路线仍然只支持桌面端,因为它们依赖外部 CLI 工具和 Python 环境。

转换层的可移植性较弱,因为它依赖每台机器本地安装的工具和 Python 环境。当 CAD 或网格格式加载失败时,优先看插件设置里的转换器诊断面板。它会同时检查插件最终解析到的可执行文件路径,以及当前 Python 环境能否导入所需依赖,或原生命令行转换器是否能够启动。

如果你是在这个仓库里继续开发,请先看 docs/cross-platform-development.md 里的项目级实现准则。

尤其在 macOS 上,系统自带的 /usr/bin/python3 往往存在,但并不包含 CAD 依赖。如果诊断面板显示使用的是这个路径且自检失败,应安装一个独立的 Python 环境,并在插件设置里显式填入那个解释器路径。


外部依赖

仅 CAD、FBX 和网格转换需要外部工具。直接格式无需任何外部工具。

Python + CadQuerySTEP、IGES、BREP

# 安装
pip install cadquery trimesh

按你的系统使用对应的 Python 命令验证:

  • Windowspy -c "import cadquery; print('OK')"
  • macOS / Linuxpython3 -c "import cadquery; print('OK')"

如果诊断面板在 macOS 上解析到 /usr/bin/python3 且导入检查失败,请安装独立 Python例如 Homebrew Python在那个环境里安装 cadquerytrimesh,然后把该解释器路径填入插件设置。

FreeCADSLDPRT

按平台安装 FreeCAD

  • Windowsfreecad.org/downloads 安装
  • macOS安装官方 app或使用 brew install --cask freecad
  • Linux安装发行版提供的 FreeCAD 包,并确保 freecadcmd 可用

插件会优先使用显式设置值和环境变量,其次检查常见的用户管理安装位置,再检查 PATH最后再回退到下面这些系统级安装位置提示

  • Windows%LOCALAPPDATA%\Programs\FreeCAD*\bin\FreeCADCmd.exe
  • macOS/Applications/FreeCAD.app/Contents/MacOS/FreeCADCmd/usr/local/bin/FreeCADCmd/opt/homebrew/bin/FreeCADCmd
  • Linux/usr/bin/freecadcmd

Python + trimesh3MF、DAE

pip install trimesh numpy networkx pycollada

自动发现:使用与 CadQuery 相同的 Python 发现逻辑。

覆盖方式:环境变量 AI3D_ASSIMP_CMD

obj2gltfOBJ可选

插件已经内置 OBJ 加载器。obj2gltf 是可选替代方案,可用于生成更标准的 GLB 输出。

安装

npm install -g obj2gltf

解析顺序:插件会优先使用显式设置值和环境变量,其次检查常见的用户管理安装位置,再检查 PATH最后再回退到系统级提示位置例如 Windows 下的 obj2gltf.cmd,以及 macOS / Linux 下标准位置中的 obj2gltf,如 /usr/local/bin/obj2gltf/opt/homebrew/bin/obj2gltf

启用:设置 > 启用 OBJ2GLTF 转换器,或设置 obj2gltf 命令路径。

FBX2glTFFBX

FBX 文件通过本地 FBX2glTF 二进制转换为 GLB。旧的社区 FBX 加载器没有打包进插件,因为它当前版本面向 Babylon.js 8而本插件使用 Babylon.js 9。

安装

下载或自行构建适用于你平台的 FBX2glTF,并将二进制文件放到可发现的位置。

解析顺序:插件会优先使用显式设置值和环境变量,其次检查常见的用户管理安装位置,再检查 PATH最后再回退到下面这些系统级安装位置提示

C:\Program Files\FBX2glTF\FBX2glTF-windows-x64.exe
C:\Program Files\FBX2glTF\FBX2glTF.exe
/usr/local/bin/FBX2glTF
/opt/homebrew/bin/FBX2glTF
/usr/local/bin/fbx2gltf

启用:设置 > 启用 FBX2glTF 转换器,或设置 FBX2glTF 命令路径。

环境变量

变量 用途
AI3D_FREECAD_CMD CadQuery 的 Python 命令
AI3D_FREECADCMD FreeCADCmd 路径
AI3D_ASSIMP_CMD trimesh 的 Python 命令
AI3D_OBJ2GLTF_CMD obj2gltf 命令路径
AI3D_FBX2GLTF_CMD FBX2glTF 命令路径

兼容旧配置时仍接受历史别名 AI3D_FREECMDCMD,但新配置应统一使用 AI3D_FREECADCMD


技术细节

架构

src/
├── main.ts                    # 插件生命周期、命令
├── domain/
│   ├── models.ts              # 共享接口
│   └── constants.ts           # 默认设置、扩展名
├── store/
│   ├── create-store.ts        # 自定义 store 原语
│   └── plugin-store.ts        # Obsidian saveData 桥接
├── render/
│   ├── preview/               # 渲染器无关抽象层
│   │   ├── types.ts           # ModelPreview、AnnotationPreview、WorkbenchPreview 接口
│   │   ├── routing.ts         # Three/Babylon 路由决策
│   │   ├── factory.ts         # 渲染器动态导入工厂
│   │   ├── selection.ts       # 预览选择与日志
│   │   ├── annotations.ts     # AnnotationManager标注叠层 + 遮挡)
│   │   ├── geometry.ts        # 渲染器无关向量运算
│   │   ├── bounds.ts          # 包围盒工具
│   │   ├── camera-fit.ts      # 相机适配算法
│   │   ├── disassembly.ts     # 拆解控制器(适配器模式)
│   │   ├── explode.ts         # 爆炸视图(适配器模式)
│   │   ├── report.ts          # Markdown 报告生成
│   │   └── summary.ts         # 模型/零件摘要创建
│   ├── three/                 # Three.js 渲染器
│   │   ├── scene.ts           # ThreeModelPreview 类GLB/GLTF/STL/PLY/OBJ
│   │   ├── loaders.ts         # 格式专用加载器,含 vault MTL 解析
│   │   ├── disassembly.ts     # ThreeDisassemblyAdapter
│   │   └── explode.ts         # ThreeExplodeAdapter
│   ├── babylon/               # Babylon.js 渲染器
│   │   ├── scene.ts           # BabylonModelPreview 类
│   │   ├── grid.ts            # GridRenderer 类
│   │   ├── loaders/
│   │   │   ├── stl-loader.ts  # 自定义二进制 STL 解析器
│   │   │   ├── ply-loader.ts  # 自定义 ASCII/二进制 PLY 解析器
│   │   │   └── register.ts    # Babylon SceneLoader 插件
│   │   └── presets/           # 网格布局预设
├── io/
│   ├── formats/
│   │   └── registry.ts        # 格式能力注册表
│   ├── conversion/
│   │   ├── manager.ts         # 转换编排
│   │   └── adapters/          # 转换器实现
│   └── model-pipeline.ts      # 格式路由逻辑
└── view/
    ├── workbench/             # 主工作台 UI
    ├── inline/                # 代码块、实时预览
    └── direct-view.ts         # 直接文件打开

模型导入管线

┌─────────────────────────────────────────────────────────────┐
│  1. 格式检测                                                │
│     └─ getFormatCapability(ext) → { family, strategy }      │
│                                                             │
│  2. 来源准备                                                │
│     ├─ strategy: "direct" → prepareDirectLoad()             │
│     └─ strategy: "convert" → convertForPreview()            │
│                                                             │
│  3. 预览路由决策                                            │
│     ├─ GLB/GLTF/STL/PLY/OBJ 单模型 → Three.js               │
│     └─ 3dgrid、保守 workbench、fallback → Babylon           │
│                                                             │
│  4. 渲染器加载                                              │
│     ├─ Three.js → loadThreeGLTF/STL/PLY/OBJ                 │
│     └─ Babylon.js → SceneLoader 或直接 STL/PLY buffers      │
└─────────────────────────────────────────────────────────────┘

为什么 STL/PLY fallback 使用直接缓冲区加载

Three.js 是 STL 和 PLY 单模型预览的默认路径Babylon.js 仍然负责 3dgrid、保守 workbench 和 fallback 路线。Babylon.js v9 的 SceneLoader 存在一个 bug自定义插件在通过 SceneLoader.ImportMeshAsync() 加载时,接收到的是 data URL 字符串而非 ArrayBuffer。内置加载器GLTF、OBJ不受影响。

解决方案STL 和 PLY 解析器直接使用原始 ArrayBuffer 调用,完全绕过 SceneLoader。

转换缓存

  • 位置:与源文件相同目录
  • 格式{filename}.ai3d-converted.glb
  • 验证:检查转换器身份、缓存键、文件存在性
  • 失效:转换器设置更改时自动失效
  • 手动清除:命令面板 > "Clear Conversion Cache"

已知限制

问题 受影响格式 解决方法
需要外部转换器 FBX 安装并启用 FBX2glTF
需要外部工具 STEP/IGES/BREP/SLDPRT 安装 Python + CadQuery 或 FreeCAD
纹理路径解析 OBJ 将纹理放在 OBJ/MTL 同一目录;缺失纹理会显示非阻塞资源提示
外部资源路径解析 GLTF .bin 和纹理保留在 vault 中,并按 .gltf 引用的相对路径放置
转换超时 SLDPRT 复杂装配体有 10 分钟超时

部署指南

前置要求

  • Node.js >= 18
  • npm >= 9
  • Obsidian >= 1.5.0

构建命令

npm install           # 安装依赖
npm run dev           # 开发构建(监听模式)
npm run build         # 生产构建
npm run typecheck     # TypeScript 类型检查
npm run verify:preview  # 定向浏览器预览冒烟验证
npm run verify:preview:success  # 完整预览路由成功套件
npm run verify:obsidian  # Obsidian 应用端到端冒烟验证
npm run verify:release   # 发布资产版本/hash/体积检查
npm run verify:settings  # 旧 data.json/default settings 迁移检查
npm run verify:remote-draft  # 远程草稿隐私/客户端行为检查
npm run verify:knowledge-index  # 知识索引链接和刷新回归检查
npm run verify:diagnostics  # 脱敏诊断报告回归检查

预览验证

在提交预览相关改动前,建议运行 npm run verify:preview:success。如果只想检查当前默认路径,npm run verify:preview 仍然可用。验证脚本会自动识别 Windows、macOS 和 Linux 上常见的 Chrome、Edge、Chromium 与 Brave只有使用自定义浏览器路径时才需要设置 PLAYWRIGHT_CHROMIUM_EXECUTABLE。完整成功套件会启动一个临时的 Playwright 验证页面,加载 models/rubiks-cube-3x3.glb,并验证:

  • 默认 simple GLB 预览
  • 默认 direct-edit GLB 预览
  • 默认 readonly saved-pin GLB 预览
  • “仅阅读场景”档位的路由行为
  • “兼容优先”回退档位的路由行为
  • workbench Babylon 回退路由和实验性 Three.js workbench 能力探针
  • STLPLYOBJ 直读格式预览路由
  • helper toolbar 交互、聚焦模式、旋转时标注遮挡刷新、选中部件导出、性能快照,以及滚轮不带动页面滚动

如果验证失败,脚本会把截图以及包含预览状态和浏览器消息的日志保存到 .tmp/preview-failures/

Obsidian 验证

在 macOS 且已安装 Obsidian 时,发布前运行 npm run verify:obsidian。脚本会在 /tmp/ai-model-workbench-verify-vault 下创建临时测试库,安装当前打包插件,通过远程调试端口打开测试笔记,按需信任临时 vault确认 GLB/STL 预览 canvas 已加载,检查未启用 FBX2glTF 时的 FBX 转换反馈,然后打开真实 GLB 文件视图并启用实验性 Three workbench检查 backend 选择、聚焦/分解控件、面板爆炸控件、标注模式和知识笔记生成。

如果想在验证结束后删除临时库,使用 npm run verify:obsidian -- --clean。在 macOS 上clean 流程会先退出 Obsidian并从 Obsidian 配置中注销该临时库,再删除 /tmp 目录,避免开发者控制台继续刷旧路径的 ENOENT

知识笔记验证

修改生成报告、零件草稿或模型索引行为后,运行 npm run verify:knowledge-index。脚本会用一个极小的 Obsidian shim 打包知识笔记 helper构建代表性的模型索引刷新 AI 托管区,并确认用户手写笔记不会被覆盖。

构建输出

ai-model-workbench/
├── main.js           # ~3.8 MB压缩后的插件运行时 bundle
├── manifest.json     # 插件清单
├── styles.css        # 插件样式
└── src/              # 源代码

发布流程

发布由 GitHub Actions 的 Release workflow 完成。推送一个与 manifest.json 版本匹配的 tag例如 0.7.0,或手动运行该 workflow。它只上传 main.jsmanifest.jsonstyles.css,会删除不受支持的 release asset校验资产体积与 SHA-256 hash在存在版本发布日志时自动写入 release notes并为发布文件生成 GitHub artifact attestation。发布完成后可运行 npm run verify:obsidian -- --release-tag 0.7.0,从 GitHub release 下载资产并安装到临时 Obsidian vault 做实机验证。

发布 Token 安全

发布优先使用 GitHub Actions 或 GitHub CLI 浏览器登录。Token 安全清单和 PAT 泄露处理流程见 SECURITY.md

包体积优化

渲染运行时是当前包体积的主要来源。项目通过以下方式控制输出体积:

  • 子路径导入(@babylonjs/core/Engines/engine.js)而非桶导入
  • Tree-shaking 移除未使用的功能
  • esbuild 进行快速、优化的打包

由于当前发布包同时包含 Babylon 和 Three 的预览路径,最终体积会随着路由覆盖面变化而波动。以上构建输出更适合作为当前参考值,而不是固定上限。


致谢

感谢 LinuxDo 社区(https://linux.do的支持