printbench 0.8.4 → 0.8.7

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
@@ -90,17 +90,18 @@ function onExported(payload: PrintBenchExportedPayload) {
90
90
  | `modelUrl` | `string` | — | 挂载后按 URL 自动导入模型(需 CORS) |
91
91
  | `uploadUrl` | `string` | — | 「一键上传」的 POST 地址;未设则无法上传 |
92
92
  | `customExport` | `boolean` | `false` | 为 `true` 时,下载 / 一键上传只生成文件并触发 `exported` 或 `snapshot`(用 `action` 区分),不本地下载、不 POST |
93
- | `mode` | `'edit' | 'preview'` | `'edit'` | `preview` 为嵌入几何只读:隐藏工作台壳,画布可旋转与点选零件,不能改网格。画布左上角默认提供灯光模式下拉(标准照明 / 摄影棚 / 环境光照 / 跟随头灯),可用 `features.hidePreviewLighting` 隐藏 |
93
+ | `mode` | `'edit' | 'preview'` | `'edit'` | `preview` 为嵌入几何只读:隐藏工作台壳,画布可旋转与点选零件,不能改网格。画布左上角默认提供灯光模式下拉(标准照明 / 摄影棚 / 环境光照 / 展台照明 / 跟随头灯),可用 `features.hidePreviewLighting` 隐藏 |
94
94
  | `selectedPartIds` | `string[]` | — | 受控选中。传入后画布点击只触发 `select-part`,由宿主回写 |
95
95
  | `partColors` | `Record<string, string>` | — | 受控零件色,`#RRGGBB`,key 为零件 `id` |
96
- | `bedSizeMm` | `{ x, y, z }` | — | 宿主默认打印床体积(mm:X/Z 床面,Y 高度)。挂载时写入设置一次,之后仍可在布局区/设置中修改 |
96
+ | `upAxis` | `'z-up' \| 'y-up'` | — | 宿主默认世界坐标系(新安装默认 `z-up`)。挂载时写入设置一次;之后可在设置中切换(需确认,会重定向已加载模型) |
97
+ | `bedSizeMm` | `{ x, y, z }` | — | 宿主默认打印床体积(mm:高度为 up 轴分量,Z-up 时 z 为高、xy 为床面)。挂载时写入设置一次,之后仍可在布局区/设置中修改 |
97
98
  | `showBedVolume` | `boolean` | — | 宿主默认是否显示打印床线框。挂载时写入设置一次,之后仍可开关(未传时默认隐藏) |
98
99
  | `showGrid` | `boolean` | `true` | 宿主默认是否显示地面网格。挂载时写入设置一次 |
99
100
  | `gridAutoFit` | `boolean` | — | 宿主默认网格是否随模型包围盒放大(设置默认 `true`)。挂载时若传入则写入一次;固定尺寸时请设 `false` |
100
- | `gridSizeMm` | `{ x, y, z }` | — | 宿主默认固定网格尺寸(mm,边长取 max(X,Z),20 格)。挂载时写入一次;若未同时传 `gridAutoFit`,会自动设为固定尺寸(`gridAutoFit: false`) |
101
+ | `gridSizeMm` | `{ x, y, z }` | — | 宿主默认固定网格尺寸(mm,边长取床面两轴 max,20 格)。挂载时写入一次;若未同时传 `gridAutoFit`,会自动设为固定尺寸(`gridAutoFit: false`) |
101
102
  | `diagnosisZIndex` | `number` | `100` | 诊断浮层 `z-index`。也可在外层设 CSS 变量 `--printbench-diagnosis-z` |
102
103
  | `annotations` | `Annotation[]` \| `AnnotationDocument` \| `string` | — | 模型批注(世界坐标 mm)。需同时打开 `features.annotations` 才能编辑;详见下方「批注」 |
103
- | `features` | `{ numeric?, primitives?, split?, autoSplit?, drafts?, extras?, restore?, layout?, importUnit?, hideEmpty?, hideTour?, hideStatusBar?, hidePanelModeToggle?, hidePreviewLighting?, annotations?, … }` | 能力项默认 `false` | 进阶能力。缺省精简:左栏仅导入 / 零件 / 导出 / 快照。未开 `drafts` 时不读不写自动草稿。导入单位优先用文件声明,否则按包围盒尺寸推测 mm/cm/m 再换算到内部毫米;开 `importUnit` 时可再确认。`split` 为切面拆件;`autoSplit` 为「自动拆件」按钮(默认隐藏,需显式打开)。`restore` 为「复原到导入状态」按钮(默认隐藏,宿主需显式打开;完整工作台预设已开启)。`layout` 打开贴地 / 镜像 / 目标尺寸缩放 / 选面朝下与打印床体积。`annotations` 打开模型批注(默认关闭,`PRINTBENCH_FULL_FEATURES` 也不含该项)。`hideEmpty` / `hideTour` / `hideStatusBar` / `hidePanelModeToggle` / `hidePreviewLighting` 为 `true` 时分别隐藏空画布提示、首次引导 Tour(可与 `extras` 同开)、底栏状态条、零件栏悬浮/通栏切换按钮、预览模式左上角灯光模式控件(默认显示)。 |
104
+ | `features` | `{ numeric?, primitives?, split?, autoSplit?, drafts?, extras?, restore?, layout?, importUnit?, hideEmpty?, hideTour?, hideStatusBar?, hidePanelModeToggle?, hidePreviewLighting?, annotations?, annotationPanel?, … }` | 能力项默认 `false` | 进阶能力。缺省精简:左栏仅导入 / 零件 / 导出 / 快照。未开 `drafts` 时不读不写自动草稿。导入单位优先用文件声明,否则按包围盒尺寸推测 mm/cm/m 再换算到内部毫米;开 `importUnit` 时可再确认。`split` 为切面拆件;`autoSplit` 为「自动拆件」按钮(默认隐藏,需显式打开)。`restore` 为「复原到导入状态」按钮(默认隐藏,宿主需显式打开;完整工作台预设已开启)。`layout` 打开贴地 / 镜像 / 目标尺寸缩放 / 选面朝下与打印床体积。`annotations` 打开批注能力(画布标记、放置、prop/事件与 ref API;默认关闭,`PRINTBENCH_FULL_FEATURES` 也不含)。`annotationPanel` 控制右栏自带批注 Tab(依赖 `annotations`;省略时随 `annotations` 开启,设 `false` 可自建宿主 UI)。`hideEmpty` / `hideTour` / `hideStatusBar` / `hidePanelModeToggle` / `hidePreviewLighting` 为 `true` 时分别隐藏空画布提示、首次引导 Tour(可与 `extras` 同开)、底栏状态条、零件栏悬浮/通栏切换按钮、预览模式左上角灯光模式控件(默认显示)。 |
104
105
 
105
106
 
106
107
  嵌入预览示例(宿主列表 + 色板 + 自定义导出 + 按轴/最长边缩放):
@@ -174,7 +175,7 @@ async function upload() {
174
175
  </template>
175
176
  ```
176
177
 
177
- `mode="preview"` 时插件不显示导出 / 快照按钮。宿主用 `ref.exportFile()` / `ref.exportSnapshot()` 只要文件:`customExport` 为 true 时不本地下载、不 POST,返回 `blob` 后由宿主保存或上传。工作台左栏导出与快照仍可用 `uploadUrl` 走插件上传。预览画布左上角默认显示灯光模式(与设置中同一套:`neutral` 标准照明、`studio` 摄影棚、`ibl` 环境光照、`headlamp` 跟随头灯);宿主可设 `:features="{ hidePreviewLighting: true }"` 隐藏该控件。
178
+ `mode="preview"` 时插件不显示导出 / 快照按钮。宿主用 `ref.exportFile()` / `ref.exportSnapshot()` 只要文件:`customExport` 为 true 时不本地下载、不 POST,返回 `blob` 后由宿主保存或上传。工作台左栏导出与快照仍可用 `uploadUrl` 走插件上传。预览画布左上角默认显示灯光模式(与设置中同一套:`neutral` 标准照明、`studio` 摄影棚、`ibl` 环境光照、`sandbox` 展台照明、`headlamp` 跟随头灯)以及「原始法线」开关;宿主可设 `:features="{ hidePreviewLighting: true }"` 隐藏该控件。`sandbox`(展台照明)为蓝灰全景背景 + IBL,低仰角暖主光与冷轮廓光,环境光只做补光,适合验收预览。「原始法线」(设置项 `useAuthorNormals`,默认关闭)与灯光模式独立:开启时优先用导入的平滑法线做预览,无可用法线时静默回退重算,不影响打印。
178
179
 
179
180
  `exportFile` 的 `longestEdgeMm` 与导出对话框「目标边长」一致:按内部毫米将参考边(默认最长边,或 `scaleAxis` 指定的 X/Y/Z)缩到该值后再换算 `unit` 写出。省略则不缩放。默认 `scaleBasis: 'model'`(按整模 AABB 算统一比例);`partIds` 只过滤写出内容,不改变比例,分件后仍可组装。`scaleBasis: 'exportSet'` 则按写出集合自身 AABB 缩放。
180
181
 
@@ -189,14 +190,18 @@ async function upload() {
189
190
  | -------------------- | ------------------------------------------------- | -------------------------------------------------- |
190
191
  | `ready` | — | 几何内核就绪 |
191
192
  | `error` | `string` | 可展示错误 |
192
- | `exported` | `{ action, format, fileName, blob, unit, size, longestEdgeMm?, scaleAxis?, scaleBasis?, partIds?, modelSize?, groundCenter?, axis? }` | 网格导出完成。`size` 为本次 blob 内网格包围盒;分件且按整模缩放时带 `modelSize`;`groundCenter: true` 表示已贴地居中 |
193
+ | `exported` | `{ action, format, fileName, blob, unit, size, longestEdgeMm?, scaleAxis?, scaleBasis?, partIds?, modelSize?, groundCenter?, axis }` | 网格导出完成。`size` 为本次 blob 内网格包围盒;`axis` 为当前世界 up(`z-up`/`y-up`);分件且按整模缩放时带 `modelSize`;`groundCenter: true` 表示已贴地居中 |
193
194
  | `snapshot` | `{ action, format, fileName, blob, mime, width, height }` | 模型快照完成。`format` 为 `'png'` \| `'jpeg'` |
194
195
  | `report` | 审核报告对象 | 下载 JSON / HTML 审核报告时触发 |
195
196
  | `parts` | `{ id, index, name, initialSize, size, unit }[]` | 零件列表;`size` 为当前尺寸,`initialSize` 为导入时尺寸(无则为 `null`) |
196
- | `bbox` | `{ min, max, size, initialSize, unit, parts }` | 整模包围盒(含 `initialSize`)并附带同上的 `parts` |
197
+ | `bbox` | `{ min, max, size, initialSize, unit, axis, parts }` | 整模包围盒(含 `initialSize`)并附带同上的 `parts`;`axis` 为当前世界 up(`z-up`/`y-up`),`size` 始终为世界 XYZ |
197
198
  | `select-part` | `{ id, index, additive }` | 画布或零件树点选 |
198
199
  | `part-colors-change` | `Record<string, string>` | 工作台内改色时抛出(嵌入预览以 `partColors` 为准) |
199
200
  | `annotations-change` | `{ schema, version, unit, coordinateSpace, fileName?, generatedAt, annotations, reason }` | 批注新增 / 修改 / 删除时抛出(`reason`: `add` \| `update` \| `remove`)。仅在 `features.annotations` 开启时触发 |
201
+ | `annotation-select` | `string \| null` | 当前选中批注变化(列表、画布标记或 ref API);关闭批注能力时不触发 |
202
+ | `annotation-mode-change` | `'off' \| 'place'` | 放置模式进出(含 Esc 取消与放置成功);仅在 `features.annotations` 开启时触发 |
203
+ | `annotation-click` | `string` | 点击画布标注点(随后仍会选中并飞到锚点) |
204
+ | `annotation-hover` | `string \| null` | 鼠标经过画布标注点;离开全部标记时为 `null` |
200
205
 
201
206
 
202
207
  `exported` 的 `format` 为 `'stl' | '3mf' | 'glb'`;多零件 STL 时 `fileName` 为 zip,`blob` 为打包后的文件。GLB 为单文件,零件色写入材质。
@@ -208,33 +213,179 @@ async function upload() {
208
213
 
209
214
  | 方法 | 说明 |
210
215
  | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
211
- | `exportFile(options?)` | 不打开插件对话框。`action` / `format` / `unit` 同上;`longestEdgeMm` + `scaleAxis?` 等比缩放;`scaleBasis`: `'model'`(默认,整模比例)\| `'exportSet'`;`partIds` 只导出指定零件;`groundCenter: true` 导出时贴地且 XZ 居中于原点(不改工作台);`silent: true` 跳过确认。成功返回与 `exported` 相同的 payload。 |
216
+ | `exportFile(options?)` | 不打开插件对话框。`action` / `format` / `unit` 同上;`longestEdgeMm` + `scaleAxis?` 等比缩放;`scaleBasis`: `'model'`(默认,整模比例)\| `'exportSet'`;`partIds` 只导出指定零件;`groundCenter: true` 导出时贴地且床面居中于原点(不改工作台);坐标帧跟随当前 `upAxis`(payload 含 `axis`);`silent: true` 跳过确认。成功返回与 `exported` 相同的 payload。 |
212
217
  | `exportSnapshot(options?)` | 按当前视角截取模型图(不含网格、手柄、切面)。`action`: `'download'` \| `'upload'`;`format`: `'png'`(默认)\| `'jpeg'`;`quality` 仅 JPEG。成功返回与 `snapshot` 相同的 payload。`customExport` 时不本地下载、不 POST。 |
213
218
  | `autoSplit(options?)` | 多零件接触面自动装配(≥2 件)。检测接触后一端保留凸起、一端挖槽,再加卡扣。`connector`: `'ballSnap'` \| `'sphere'` \| `'square'`(默认 `ballSnap` 爪扣);`connectorSize` 可选;`silent: true` 时不弹修复确认,未封闭则返回 `{ ok: false, needsRepair: true, repairPartNames }`。成功 `{ ok: true }`。 |
214
219
  | `getPartBounds()` | 同步返回与 `@parts` 相同结构的零件列表(含 `initialSize` / `size`)。无模型时为 `[]`。 |
215
- | `getBBox()` | 同步返回与 `@bbox` 相同结构的整模载荷(含 `parts`)。尚无诊断包围盒时为 `null`。 |
220
+ | `getBBox()` | 同步返回与 `@bbox` 相同结构的整模载荷(含 `parts` / `axis`)。尚无诊断包围盒时为 `null`。 |
216
221
  | `getAnnotations()` | 返回 `AnnotationDocument`(`schema: 'printbench.annotations'`)。功能关闭时仍会规范化 `annotations` prop 后返回,便于宿主随时开启。 |
217
222
  | `exportAnnotations()` | 上面文档的格式化 JSON 字符串。 |
218
223
  | `setAnnotations(input)` | 用数组 / 文档 / JSON 字符串替换批注列表。 |
219
224
  | `addAnnotation(input)` | 以编程方式添加一条批注,返回新 `Annotation`;功能未开启时返回 `null`。 |
225
+ | `setAnnotationMode(mode)` | `'off'` \| `'place'`:进入 / 退出画布放置模式(下一次点模型表面会钉一条批注)。 |
226
+ | `getAnnotationMode()` | 当前放置模式。 |
227
+ | `selectAnnotation(id)` | 选中批注,或传 `null` 清空;不飞相机。 |
228
+ | `getSelectedAnnotationId()` | 当前选中批注 id。 |
229
+ | `updateAnnotation(id, patch)` | 更新标题 / 说明 / 级别 / 状态等;未开启或找不到时返回 `null`。 |
230
+ | `removeAnnotation(id)` | 删除批注。 |
231
+ | `flyToAnnotation(id)` | 选中并飞到该批注锚点。 |
220
232
 
221
233
  ### 批注(默认关闭)
222
234
 
223
- 批注是**独立旁路数据**:只做锚点渲染与 JSON 序列化,不进入网格、不进入 STL / 3MF / GLB 导出,也不影响诊断结果。默认隐藏,需显式开启:
235
+ 批注是**独立旁路数据**:只做锚点渲染与 JSON 序列化,不进入网格、不进入 STL / 3MF / GLB 导出,也不影响诊断结果。默认隐藏,需显式开启。
236
+
237
+ 能力与自带 UI 分开配置:
238
+
239
+ | 开关 | 作用 |
240
+ | ---- | ---- |
241
+ | `features.annotations` | 画布标记、放置模式、`annotations` prop / 事件、ref API |
242
+ | `features.annotationPanel` | 右栏「检查」里的自带批注 Tab(依赖上一行)。**省略时随 `annotations` 开启**;设 `false` 可只用宿主自定义 UI |
243
+
244
+ #### 示例 1:自带面板(默认行为)
245
+
246
+ 开启批注能力后,右栏出现「检查」页签(诊断 / 批注)。省略 `annotationPanel` 时默认同开。
224
247
 
225
248
  ```vue
226
- <PrintBench
227
- :features="{ annotations: true }"
228
- :annotations="notes"
229
- @annotations-change="notes = $event"
230
- />
249
+ <script setup lang="ts">
250
+ import { ref } from 'vue'
251
+ import { PrintBench } from 'printbench'
252
+ import type { PrintBenchAnnotationsPayload } from 'printbench'
253
+
254
+ /** 受控回写:原样赋回不会回环 */
255
+ const notes = ref<PrintBenchAnnotationsPayload | undefined>()
256
+ </script>
257
+
258
+ <template>
259
+ <PrintBench
260
+ :features="{ annotations: true }"
261
+ :annotations="notes"
262
+ @annotations-change="notes = $event"
263
+ />
264
+ </template>
265
+ ```
266
+
267
+ 用户可在面板内点「放置批注」→ 点模型表面标注;支持级别、标题、说明与已解决标记。也可随时用 `ref` 读写:
268
+
269
+ ```ts
270
+ import type { PrintBenchExpose } from 'printbench'
271
+
272
+ const bench = ref<PrintBenchExpose | null>(null) // 绑到 <PrintBench ref="bench" />
273
+
274
+ bench.value?.exportAnnotations() // JSON 字符串
275
+ bench.value?.setAnnotations(savedDoc) // 整表替换(数组 / 文档 / JSON 字符串均可)
276
+ bench.value?.addAnnotation({
277
+ position: [12.5, 8, -3.25],
278
+ normal: [0, 0, 1],
279
+ partId: 'mesh_xxx',
280
+ title: '壁厚不足',
281
+ body: '建议加厚至 1.2mm',
282
+ severity: 'yellow',
283
+ })
284
+ ```
285
+
286
+ #### 示例 2:自定义宿主 UI
287
+
288
+ 关掉自带 Tab,保留画布标记与 API,由宿主渲染列表 / 编辑器。
289
+
290
+ ```vue
291
+ <script setup lang="ts">
292
+ import { computed, ref } from 'vue'
293
+ import { PrintBench } from 'printbench'
294
+ import type {
295
+ PrintBenchAnnotationMode,
296
+ PrintBenchAnnotationsPayload,
297
+ PrintBenchExpose,
298
+ } from 'printbench'
299
+
300
+ const bench = ref<PrintBenchExpose | null>(null)
301
+ const notes = ref<PrintBenchAnnotationsPayload | undefined>()
302
+ const selectedId = ref<string | null>(null)
303
+ const hoveredId = ref<string | null>(null)
304
+ const mode = ref<PrintBenchAnnotationMode>('off')
305
+
306
+ const list = computed(() => notes.value?.annotations ?? [])
307
+ const selected = computed(() => list.value.find((a) => a.id === selectedId.value) ?? null)
308
+ const placing = computed(() => mode.value === 'place')
309
+
310
+ function togglePlace() {
311
+ bench.value?.setAnnotationMode(placing.value ? 'off' : 'place')
312
+ }
313
+
314
+ function openNote(id: string) {
315
+ bench.value?.flyToAnnotation(id) // 选中并飞到锚点
316
+ }
317
+
318
+ function saveTitle(title: string) {
319
+ if (!selectedId.value) return
320
+ bench.value?.updateAnnotation(selectedId.value, { title })
321
+ }
322
+
323
+ function markResolved() {
324
+ if (!selectedId.value || !selected.value) return
325
+ const next = selected.value.status === 'resolved' ? 'open' : 'resolved'
326
+ bench.value?.updateAnnotation(selectedId.value, { status: next })
327
+ }
328
+
329
+ function removeSelected() {
330
+ if (!selectedId.value) return
331
+ bench.value?.removeAnnotation(selectedId.value)
332
+ }
333
+ </script>
334
+
335
+ <template>
336
+ <div class="host-review">
337
+ <PrintBench
338
+ ref="bench"
339
+ :features="{ annotations: true, annotationPanel: false }"
340
+ :annotations="notes"
341
+ @annotations-change="notes = $event"
342
+ @annotation-select="selectedId = $event"
343
+ @annotation-mode-change="mode = $event"
344
+ @annotation-click="openNote"
345
+ @annotation-hover="hoveredId = $event"
346
+ />
347
+
348
+ <aside>
349
+ <button type="button" @click="togglePlace">
350
+ {{ placing ? '点击模型放置…(Esc 取消)' : '放置批注' }}
351
+ </button>
352
+ <p v-if="hoveredId">悬停:{{ hoveredId }}</p>
353
+
354
+ <button
355
+ v-for="a in list"
356
+ :key="a.id"
357
+ type="button"
358
+ :class="{ active: a.id === selectedId }"
359
+ @click="openNote(a.id)"
360
+ >
361
+ {{ a.title }}
362
+ <span v-if="a.status === 'resolved'">已解决</span>
363
+ <span v-if="a.orphaned">零件已失效</span>
364
+ </button>
365
+
366
+ <div v-if="selected">
367
+ <input
368
+ :value="selected.title"
369
+ @change="saveTitle(($event.target as HTMLInputElement).value)"
370
+ />
371
+ <button type="button" @click="markResolved">
372
+ {{ selected.status === 'resolved' ? '重新打开' : '标记已解决' }}
373
+ </button>
374
+ <button type="button" @click="removeSelected">删除</button>
375
+ </div>
376
+ </aside>
377
+ </div>
378
+ </template>
231
379
  ```
232
380
 
233
- 开启后右栏出现「检查」页签(诊断 / 批注),可点「放置批注」后在模型表面点上标注,支持级别、标题、说明与已解决标记。
381
+ 要点:
382
+ - `@annotation-mode-change` 同步放置态(含 Esc 取消、放置成功后回到 `off`)
383
+ - `@annotation-click` / `@annotation-hover` 响应画布标记手势;`@annotation-select` 覆盖列表与 API 选中
384
+ - `annotationPanel: false` 时放置成功**不会**弹出右栏诊断浮层
234
385
 
235
- 锚点使用**内部毫米世界坐标**(Y 轴向上)加 `partId`、命中面法线;零件被移动 / 旋转 / 镜像后仍可按 `partId` 重新挂接,`partId` 消失(拆件 / 布尔 / 合并)时标记为 `orphaned` 并保留原位置显示。
386
+ #### 数据格式
236
387
 
237
- JSON 结构:
388
+ 锚点使用**内部毫米世界坐标**(与当前 `upAxis` 一致,默认 Z 轴向上)加 `partId`、命中面法线;零件被移动 / 旋转 / 镜像后仍可按 `partId` 重新挂接,`partId` 消失(拆件 / 布尔 / 合并)时标记为 `orphaned` 并保留原位置显示。
238
389
 
239
390
  ```json
240
391
  {
@@ -248,7 +399,7 @@ JSON 结构:
248
399
  {
249
400
  "id": "note_ab12cd34",
250
401
  "position": [12.5, 8.0, -3.25],
251
- "normal": [0, 1, 0],
402
+ "normal": [0, 0, 1],
252
403
  "partId": "mesh_xxx",
253
404
  "partName": "外壳",
254
405
  "title": "批注 1",
@@ -289,7 +440,7 @@ JSON 结构:
289
440
  | --- | ------------------------------------------------------ |
290
441
  | 左栏 | 导入、导出、快照、零件树、上色、移动/旋转/缩放;`features` 打开后才有数值变换、布局(贴地/镜像/缩放/选面朝下)、基本体、拆件、草稿与观察工具 |
291
442
  | 画布 | 轨道旋转缩放;双击或 **F** 自适应;**复位视角** 回默认相机;开启 `layout` 后可在布局区/设置中显示打印床线框(默认隐藏) |
292
- | 右栏 | 诊断与测量浮层(右上,默认 `z-index: 100`),默认收起;开启 `features.annotations` 后标题变为「检查」,多出「批注」页签 |
443
+ | 右栏 | 诊断与测量浮层(右上,默认 `z-index: 100`),默认收起;开启 `features.annotationPanel`(默认随 `annotations`)后标题变为「检查」,多出「批注」页签 |
293
444
  | 底栏 | 包围盒、内部单位 mm、体积、文件名;超床时提示超出轴 |
294
445
 
295
446
 
@@ -318,9 +469,9 @@ JSON 结构:
318
469
  | Ctrl | 多选、框选 |
319
470
 
320
471
 
321
- 草稿保存在浏览器本地,仅当 `features.drafts` 为 true 时读写并提示恢复。设置含默认导入单位、默认导出格式、场景光照开关、灯光模式(标准照明 / 摄影棚 / 环境光照 / 跟随头灯,默认标准照明)、最小壁厚、打印床尺寸(默认 220×220×250 mm,Y 为高度)。地面网格默认开启,初始 200 mm / 20 格并随模型包围盒放大(`showGrid` / `gridAutoFit` 默认 `true`);勾选「自定义网格尺寸」或宿主传 `gridSizeMm` 后可填 XYZ(边长取 max(X,Z))且不再随模型放大。打印床线框默认隐藏,可在布局区或设置中打开;宿主可用 props `bedSizeMm` / `showBedVolume` / `showGrid` / `gridAutoFit` / `gridSizeMm` 提供初始默认值(只写入一次,不锁定控件)。
472
+ 草稿保存在浏览器本地,仅当 `features.drafts` 为 true 时读写并提示恢复。设置含**坐标系**(默认 **Z-up**,可切回 Y-up;切换前确认并对已加载模型做坐标重定向)、默认导入单位、默认导出格式、场景光照开关、灯光模式(标准照明 / 摄影棚 / 环境光照 / 展台照明 / 跟随头灯,默认标准照明)、原始法线预览开关(默认关)、最小壁厚、打印床尺寸(默认 220×220×250 mm,Z-up 时 Z 为高度)。地面网格默认开启,初始 200 mm / 20 格并随模型包围盒放大(`showGrid` / `gridAutoFit` 默认 `true`);勾选「自定义网格尺寸」或宿主传 `gridSizeMm` 后可填 XYZ(边长取床面两轴 max)且不再随模型放大。打印床线框默认隐藏,可在布局区或设置中打开;宿主可用 props `upAxis` / `bedSizeMm` / `showBedVolume` / `showGrid` / `gridAutoFit` / `gridSizeMm` 提供初始默认值(只写入一次,不锁定控件)。旧版无 `upAxis` 的本地设置按 **Y-up** 兼容,避免升级后草稿静默错位。
322
473
 
323
- 开启 `features.layout` 后:贴地将零件落到 Y=0;镜像相对包围盒中心;「缩放到」按最长边或指定轴等比缩放并自动贴地;「选面朝下」点击表面使该面朝下并贴地。超出打印床时底栏提示;显示床线框时超界会变为警示色。
474
+ 开启 `features.layout` 后:贴地将零件落到 up=0;镜像相对包围盒中心;「缩放到」按最长边或指定轴等比缩放并自动贴地;「选面朝下」点击表面使该面朝下并贴地。超出打印床时底栏提示;显示床线框时超界会变为警示色。
324
475
 
325
476
  ## 开发本仓库
326
477