printbench 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,56 +1,38 @@
1
1
  # PrintBench
2
2
 
3
- 纯浏览器 3D 打印模型工作台(Vue 3 + three.js + Manifold)。在本地解析、体检、修复网格,再导出给切片软件。几何处理在浏览器内完成,审核报告默认不上传后端。
3
+ 纯浏览器 3D 打印模型工作台(Vue 3 + three.js + Manifold)。在浏览器内解析、体检、修复网格,再导出给切片软件。几何处理在本地完成,审核报告默认不上传。
4
4
 
5
- 开发服务路径为 `/print-bench/`(根路径会重定向到该前缀)。
5
+ 可作为 **Vue 3 组件** 嵌入其它项目。需现代浏览器(WebGL、Web Worker、WASM)。
6
6
 
7
- ## 环境
8
-
9
- - Node.js(建议 20+)
10
- - 现代浏览器(需 WebGL、Web Worker、WASM)
7
+ ## 安装
11
8
 
12
9
  ```bash
13
- npm install
14
- npm run dev # 打开提示的地址,进入 /print-bench/
15
- npm run build # 产出 SPA 静态资源(写入 dist/)
16
- npm run build:lib # 产出可被宿主安装的库(写入 dist/,与 SPA 互斥覆盖)
17
- npm run preview # 预览 SPA 构建结果
18
- npm test
10
+ npm install printbench
19
11
  ```
20
12
 
21
- 静态部署时,站点 `base` 为 `/print-bench/`,需按该子路径托管。
22
-
23
- ## 作为 npm 库嵌入(独立 Vue 宿主)
13
+ Peer 依赖(宿主需自行安装,大版本对齐):
24
14
 
25
- 本仓可打成 ESM 组件包,供其它 Vue 3 项目引用。
15
+ - `vue` ^3.5
16
+ - `pinia` ^3
26
17
 
27
- ### 1. 构建产物
28
-
29
- ```bash
30
- npm run build:lib
31
- ```
18
+ `three`、`manifold-3d` 等运行时依赖会随本包安装。请在宿主中注册 Pinia(`app.use(createPinia())`)。
32
19
 
33
- 产出:`dist/printbench.js`(内含内联 Worker + WASM)、`dist/printbench.css`、`dist/printbench.d.ts`。
20
+ ### Vite 宿主
34
21
 
35
- Worker 与 `manifold.wasm` 都打进主包,宿主 Vite 不再请求 `/@fs/.../manifold.worker.js` 或 `/@fs/.../manifold.wasm`。
22
+ 开发时建议排除预打包:
36
23
 
37
- ### 2. 宿主安装
38
-
39
- 联调(同机独立仓库):
40
-
41
- ```json
42
- {
43
- "dependencies": {
44
- "printbench": "file:../PrintBench",
45
- "vue": "^3.5.0",
46
- "pinia": "^3.0.0"
47
- }
48
- }
24
+ ```ts
25
+ // vite.config.ts
26
+ export default defineConfig({
27
+ optimizeDeps: {
28
+ exclude: ['printbench', 'manifold-3d'],
29
+ },
30
+ })
49
31
  ```
50
32
 
51
- 安装前请先在本仓执行 `npm run build:lib`。正式环境改为私有 npm 版本号即可。
33
+ 改配置后删除 `node_modules/.vite` 再重启 `dev`。
52
34
 
53
- ### 3. 宿主使用
35
+ ## 使用
54
36
 
55
37
  ```ts
56
38
  import { createApp } from 'vue'
@@ -63,11 +45,23 @@ createApp(App).use(createPinia()).mount('#app')
63
45
  ```
64
46
 
65
47
  ```vue
48
+ <script setup lang="ts">
49
+ import { PrintBench } from 'printbench'
50
+ import type { PrintBenchExportedPayload } from 'printbench'
51
+ import 'printbench/style.css'
52
+
53
+ function onExported(payload: PrintBenchExportedPayload) {
54
+ // payload.action: 'download' | 'upload'
55
+ // payload.blob / payload.fileName / payload.format / payload.unit
56
+ }
57
+ </script>
58
+
66
59
  <template>
67
60
  <PrintBench
68
61
  height="100vh"
69
62
  upload-url="https://api.example.com/api/printbench/exports"
70
63
  :model-url="modelUrl"
64
+ :custom-export="false"
71
65
  @ready="onReady"
72
66
  @error="onError"
73
67
  @exported="onExported"
@@ -76,149 +70,77 @@ createApp(App).use(createPinia()).mount('#app')
76
70
  </template>
77
71
  ```
78
72
 
79
- | props | 说明 |
80
- |-------|------|
81
- | `uploadUrl` | 导出上传地址;优先于构建时的 `VITE_UPLOAD_URL` |
82
- | `modelUrl` | 挂载后自动按 URL 导入模型 |
83
- | `height` | 根容器高度,默认 `100%` |
84
-
85
- | emits | 说明 |
86
- |-------|------|
87
- | `ready` | 几何内核就绪 |
88
- | `error` | 可展示错误信息 |
89
- | `exported` | `{ format, fileName, blob, unit, axis? }` |
90
- | `report` | 审核报告对象(下载 JSON/HTML 时触发) |
73
+ ### Props
91
74
 
92
- peer:`vue`、`pinia`。运行时依赖(`three`、`manifold-3d` 等)随本包装入 `dependencies`,由 npm 安装传递。
75
+ | 属性 | 类型 | 默认 | 说明 |
76
+ |------|------|------|------|
77
+ | `height` | `string` | `'100%'` | 根容器高度 |
78
+ | `modelUrl` | `string` | — | 挂载后按 URL 自动导入模型(需 CORS) |
79
+ | `uploadUrl` | `string` | — | 「一键上传」的 POST 地址;未设则无法上传 |
80
+ | `customExport` | `boolean` | `false` | 为 `true` 时,下载 / 一键上传只生成文件并触发 `exported`(用 `action` 区分),不本地下载、不 POST |
93
81
 
94
- 宿主 Vite 建议排除预打包(避免改写 `printbench.js` 的 `import.meta.url`):
95
-
96
- ```ts
97
- optimizeDeps: {
98
- exclude: ['printbench', 'manifold-3d'],
99
- },
100
- ```
82
+ ### Events
101
83
 
102
- Worker 与 WASM 已内联,npm 与 `file:` 都不应再请求独立的 `manifold.worker.js` / `manifold.wasm`。
84
+ | 事件 | 负载 | 说明 |
85
+ |------|------|------|
86
+ | `ready` | — | 几何内核就绪 |
87
+ | `error` | `string` | 可展示错误 |
88
+ | `exported` | `{ action, format, fileName, blob, unit, axis? }` | 导出完成。`action` 为 `'download'`(下载)或 `'upload'`(一键上传) |
89
+ | `report` | 审核报告对象 | 下载 JSON / HTML 审核报告时触发 |
103
90
 
104
- ## 推荐流程
91
+ `exported` 的 `format` 为 `'stl' | '3mf'`;多零件 STL 时 `fileName` 为 zip,`blob` 为打包后的文件。
105
92
 
106
- 1. **导入模型** → 确认单位(看底栏包围盒)
107
- 2. **看右侧诊断** → 点条目飞到缺陷;需要时 **一键修复**(红绿对拍后确认)
108
- 3. **导出** STL / 3MF → 在切片软件(Cura、PrusaSlicer 等)里按毫米(或导出时所选单位)解释坐标
93
+ 「一键上传」以 `multipart/form-data` POST,字段为 `file` 与 `meta`(JSON:fileName、format、unit 等)。
109
94
 
110
- 存在红色阻断项时无法导出,会定位到对应缺陷。黄色警告可选择继续,但可能影响打印质量。
95
+ ## 工作台能力
111
96
 
112
- ## 导入
97
+ 推荐流程:导入模型并确认单位 → 看右侧诊断,必要时一键修复 → 导出 STL / 3MF 给切片软件(坐标按毫米或导出时所选单位解释)。
113
98
 
114
- 支持 **GLB / GLTF / STL / OBJ / 3MF**,以及含上述模型的 **ZIP**,单文件约 **500MB** 上限。可:
99
+ 有红色阻断项时无法导出。黄色警告可继续,但可能影响打印质量。
115
100
 
116
- - 顶栏 **导入** → 从本地选择
117
- - 拖入画布,或粘贴文件
118
- - 填写 **http(s) 直链**(粘贴链接也会打开导入框)
101
+ ### 导入
119
102
 
120
- 导入后先按毫米预览包围盒,再在对话框里选真实单位(mm / cm / m)。选错会差 10–1000 倍。3MF 会读取文件内的 model unit。动画、材质不进入打印网格。
103
+ 支持 **GLB / GLTF / STL / OBJ / 3MF**,以及含上述模型的 **ZIP**,单文件约 **500MB**。可从本地选择、拖入画布、粘贴文件,或填写 http(s) 直链(需 CORS;GitHub `blob` 会改成 raw)。
121
104
 
122
- **网络地址**:须目标服务器允许浏览器跨域(CORS)。GitHub 的 `blob` 链接会自动改成 `raw.githubusercontent.com`。无 CORS 时请下载到本地再导入。
105
+ 导入后按毫米预览包围盒,再选真实单位(mm / cm / m)。3MF 会读文件内 model unit。动画、材质不进入打印网格。
123
106
 
124
- ## 界面
107
+ ### 界面
125
108
 
126
109
  | 区域 | 作用 |
127
110
  |------|------|
128
- | 顶栏 | 见下节「顶栏菜单」 |
129
- | 左栏 | 零件树与编辑工具;标题栏按钮可收起/展开(默认展开) |
130
- | 画布 | 轨道旋转缩放;双击或 **F** 按模型自适应;**复位视角** 回到默认相机;未导入时显示引导 |
131
- | 右栏 | 诊断与测量;标题栏按钮可收起/展开(默认展开) |
111
+ | 顶栏 | 导入、撤销/重做、修复、导出、显示模式、测量、草稿、设置、帮助 |
112
+ | 左栏 | 零件树与编辑(布尔、拆件、切底座等),可收起 |
113
+ | 画布 | 轨道旋转缩放;双击或 **F** 自适应;**复位视角** 回默认相机 |
114
+ | 右栏 | 诊断与测量,可收起 |
132
115
  | 底栏 | 包围盒、内部单位 mm、体积、文件名 |
133
116
 
134
- 首次打开可走三步引导;**帮助** 里可重看。发现本地草稿时会询问是否恢复。未导入模型时,除导入、草稿、设置、帮助外,顶栏多数按钮不可用。
135
-
136
- ## 顶栏菜单
137
-
138
- 从左到右大致是:进文件 → 看模型 → 量尺寸 → 修复与导出;最右侧是草稿、设置、帮助。左栏的零件树、布尔、切底座等不在顶栏。
139
-
140
- **文件与历史**
141
-
142
- | 项 | 说明 |
143
- |----|------|
144
- | 导入 | 本地文件或 http(s) 地址;拖放、粘贴文件或链接也可 |
145
- | 撤销 / 重做 | 操作树历史(Ctrl+Z / Ctrl+Y) |
146
- | 一键修复 | 对当前模型修复,画布红/绿对拍,确认才保留 |
147
- | 导出 | 红级诊断会拦截;黄级可选择继续。对话框内可下载 STL/3MF,或一键上传 |
148
- | 审核报告 | 体积、包围盒、校验与测量;可下 JSON/HTML;无红级时可本地标「可打印」 |
149
-
150
- **观察(不改网格)**
151
-
152
- | 项 | 说明 |
153
- |----|------|
154
- | 复位视角 | 相机回到默认朝向与距离,不改零件姿态。画布 **双击** 或 **F** 是按模型自适应取景,与复位不同 |
155
- | 实体 / 线框 / 半透明 / 法线 | 仅改变显示,不改变几何 |
156
- | 壁厚热力图 | 按设置中的最小壁厚给顶点着色,便于看薄壁 |
157
- | 剖切 | 画布出现高度滑条,按 Y 切开看内部。与左栏 **切割 +Y**(真裁掉底座)不是同一功能 |
117
+ ### 导出
158
118
 
159
- **测量**
119
+ - **STL**:二进制;无单位字段,切片软件需与导出单位一致(推荐毫米)。单零件 `.stl`,多零件 `.zip`(每件一个 STL)
120
+ - **3MF**:自带毫米单位;每零件单独 object
160
121
 
161
- 关 / 长度 / 角度 / 半径。在模型上点吸附点(顶点、边中点、面心)。选「长度」时出现 **目标 mm**,用来算偏差。结果列在右栏。**Esc** 退出测量。
162
-
163
- **右侧(随时可用)**
164
-
165
- | 项 | 说明 |
166
- |----|------|
167
- | 草稿 | 命名保存 / 打开 / 删除;Ctrl+S 另有自动草稿 |
168
- | 设置 | 默认导入单位、默认导出格式、网格/灯光/包围盒、最小壁厚 |
169
- | 帮助 | 教程与快捷键,可重看引导 |
170
-
171
- ## 变换与零件
172
-
173
- - 工具 **1 / 2 / 3**:移动、旋转、缩放;画布上拖手柄
174
- - **打印拆件**:左栏放置切面,移动/旋转后确认。沿同一平面拆成两块(默认锯缝 0 mm)。可选球形/方形卡扣:正侧挖卯、负侧加榫,原位互补对插。须先是封闭实体;与「拆分碎片」不同
175
- - **轴向吸附(Shift)**:移动 1 mm、旋转 15°、缩放 0.1;勾选则常开
176
- - **数值变换**:位移(mm)、欧拉角(度,XYZ 序)、缩放;点「应用数值」写入当前零件
177
- - **Ctrl** 点选 / 框选;右键菜单:显隐、复制、删除、合并所选
178
- - 可添加立方体 / 圆柱 / 球 / 棱柱,再做并集、差集、交集(先预览,再确认精算)
179
-
180
- ## 诊断与修复
181
-
182
- 导入后自动体检(封闭、流形、薄壁等)。点诊断飞到开边、薄壁等位置。
183
-
184
- **一键修复**:红为修复前、绿为修复后,确认才保留。破洞过多可先 **拆分碎片** 或 **简化对拍**。
185
-
186
- **打印拆件**:左栏放置切面并确认,Manifold 按平面裁成两块(可设锯缝)。可选球形/方形卡扣(切口互补对插)。须水密。与顶栏剖切、切底座不是同一功能。
187
-
188
- **切底座 / 切割 +Y**:按给定高度用 +Y 平面裁掉下方,便于贴床。
189
-
190
- **简化对拍**:降低面数,红绿对比后确认或撤销。
191
-
192
- 顶栏 **剖切** 只改显示,不改网格。**壁厚热力图** 按设置里的最小壁厚着色。
193
-
194
- ## 测量
195
-
196
- 见上文「顶栏菜单 · 测量」。结果列在右栏。
197
-
198
- ## 导出与审核
199
-
200
- - **STL**:二进制;轴向与当前导入或编辑后的网格一致。单个零件为 `.stl`;多个零件打包为 `.zip`(每件一个 STL),再导入可保持零件个数。STL 无单位字段,切片软件需与导出单位一致(推荐毫米)
201
- - **3MF**:自带毫米单位;每个零件单独写成 object,导入时按对象拆开
202
- - **一键上传**:生成与下载相同的文件后,以 `multipart/form-data` POST 到服务端预留接口(字段 `file`、`meta` JSON)。配置环境变量 `VITE_UPLOAD_URL`(参见 `.env.example`)后生效;未配置时提示接口已预留。
203
-
204
- **审核报告**:体积、包围盒、校验与测量;可下载 JSON / HTML。无红级阻断时可本地标记为可打印。上传走同一预留接口。
205
-
206
- ## 草稿与设置
207
-
208
- - **Ctrl+S**:自动草稿到浏览器本地
209
- - **草稿**:命名保存 / 打开 / 删除
210
- - **设置**:默认导入单位、默认导出格式、网格/灯光/包围盒、最小壁厚(mm)
211
-
212
- ## 快捷键
122
+ ### 快捷键
213
123
 
214
124
  | 按键 | 作用 |
215
125
  |------|------|
216
126
  | Ctrl+Z / Ctrl+Y | 撤销 / 重做 |
217
- | Ctrl+S | 保存自动草稿 |
127
+ | Ctrl+S | 保存自动草稿(IndexedDB) |
218
128
  | 1 / 2 / 3 | 移动 / 旋转 / 缩放 |
219
129
  | Esc | 取消手柄、预览、测量 |
220
- | F | 按模型自适应视角(与「复位视角」不同) |
130
+ | F | 按模型自适应视角 |
221
131
  | Shift | 变换吸附 |
222
132
  | Ctrl | 多选、框选 |
223
133
 
224
- 出错时可复制错误信息;模型仍可尝试继续导出。
134
+ 草稿保存在浏览器本地。设置含默认导入单位、默认导出格式、网格/灯光、最小壁厚。
135
+
136
+ ## 开发本仓库
137
+
138
+ ```bash
139
+ npm install
140
+ npm run dev # 完整站,路径 /print-bench/
141
+ npm run build # SPA 静态资源(写入 dist/)
142
+ npm run build:lib # npm 库产物(写入 dist/,与 SPA 互斥覆盖)
143
+ npm test
144
+ ```
145
+
146
+ 发布前请使用 `npm run build:lib`,不要用 SPA 的 `build` 覆盖 `dist/`。
@@ -1,6 +1,9 @@
1
1
  import type { DefineComponent } from 'vue'
2
2
 
3
+ export type PrintBenchExportAction = 'download' | 'upload'
4
+
3
5
  export interface PrintBenchExportedPayload {
6
+ action: PrintBenchExportAction
4
7
  format: 'stl' | '3mf'
5
8
  fileName: string
6
9
  blob: Blob
@@ -20,9 +23,10 @@ export interface PrintBenchProps {
20
23
  uploadUrl?: string
21
24
  modelUrl?: string
22
25
  height?: string
26
+ customExport?: boolean
23
27
  }
24
28
 
25
29
  declare const PrintBench: DefineComponent<PrintBenchProps>
26
30
  export { PrintBench }
27
31
  export default PrintBench
28
- export type { ReviewReport }
32
+ export type { PrintBenchExportAction, PrintBenchExportedPayload, ReviewReport }