printbench 0.4.4 → 0.4.5

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
@@ -85,7 +85,7 @@ function onExported(payload: PrintBenchExportedPayload) {
85
85
  | `selectedPartIds` | `string[]` | — | 受控选中。传入后画布点击只触发 `select-part`,由宿主回写 |
86
86
  | `partColors` | `Record<string, string>` | — | 受控零件色,`#RRGGBB`,key 为零件 `id` |
87
87
  | `diagnosisZIndex` | `number` | `100` | 诊断浮层 `z-index`。也可在外层设 CSS 变量 `--printbench-diagnosis-z` |
88
- | `features` | `{ numeric?, primitives?, split?, drafts?, extras?, importUnit? }` | 全 `false` | 进阶能力。缺省精简:左栏仅导入 / 零件 / 导出 / 快照。未开 `drafts` 时不读不写自动草稿。未开 `importUnit` 时导入不弹单位确认,直接用文件声明单位或设置里的默认单位。 |
88
+ | `features` | `{ numeric?, primitives?, split?, drafts?, extras?, importUnit?, hideEmpty?, hideStatusBar?, hidePanelModeToggle?, … }` | 能力项默认 `false` | 进阶能力。缺省精简:左栏仅导入 / 零件 / 导出 / 快照。未开 `drafts` 时不读不写自动草稿。未开 `importUnit` 时导入不弹单位确认。`hideEmpty` / `hideStatusBar` / `hidePanelModeToggle` 为 `true` 时分别隐藏空画布提示、底栏状态条、零件栏悬浮/通栏切换按钮。 |
89
89
 
90
90
 
91
91
  嵌入预览示例(宿主列表 + 色板 + 自定义导出):
@@ -3303,7 +3303,7 @@ function mI(g, B) {
3303
3303
  o !== w && (r[o] = w);
3304
3304
  };
3305
3305
  for (let b = 0; b < C; b++) {
3306
- const d = B[b * 3], o = B[b * 3 + 1], w = B[b * 3 + 2], M = g[d * 3], l = g[d * 3 + 1], L = g[d * 3 + 2], m = g[o * 3], H = g[o * 3 + 1], v = g[o * 3 + 2], V = g[w * 3], $ = g[w * 3 + 1], DA = g[w * 3 + 2], IA = m - M, sA = H - l, NA = v - L, EI = V - M, yA = $ - l, gA = DA - L, UA = sA * gA - NA * yA, QA = NA * EI - IA * gA, YA = IA * yA - sA * EI, vA = 0.5 * Math.hypot(UA, QA, YA);
3306
+ const d = B[b * 3], o = B[b * 3 + 1], w = B[b * 3 + 2], M = g[d * 3], l = g[d * 3 + 1], L = g[d * 3 + 2], m = g[o * 3], H = g[o * 3 + 1], v = g[o * 3 + 2], V = g[w * 3], $ = g[w * 3 + 1], DA = g[w * 3 + 2], gA = m - M, sA = H - l, NA = v - L, EI = V - M, yA = $ - l, CA = DA - L, UA = sA * CA - NA * yA, QA = NA * EI - gA * CA, YA = gA * yA - sA * EI, vA = 0.5 * Math.hypot(UA, QA, YA);
3307
3307
  vA < 1e-12 && a++, D += vA, Q += M * UA + l * QA + L * YA;
3308
3308
  for (const [iI, HA] of [[d, o], [o, w], [w, d]]) {
3309
3309
  const XA = rQ(iI, HA);
@@ -3368,7 +3368,7 @@ const VA = Ug("printbench-project", () => {
3368
3368
  const y = KA(i, t), h = H.value[y]?.trim();
3369
3369
  return h || $(i, t);
3370
3370
  })
3371
- ), IA = AA(
3371
+ ), gA = AA(
3372
3372
  () => A.value.map((i) => {
3373
3373
  if (i.kind === "primary")
3374
3374
  return C.value.find((t) => t.id === i.meshId)?.appearance;
@@ -3379,14 +3379,14 @@ const VA = Ug("printbench-project", () => {
3379
3379
  index: t,
3380
3380
  name: DA.value[t] ?? `零件 ${t + 1}`
3381
3381
  }))
3382
- ), EI = AA(() => A.value.map((i, t) => gA(t))), yA = AA(() => {
3382
+ ), EI = AA(() => A.value.map((i, t) => CA(t))), yA = AA(() => {
3383
3383
  const i = {};
3384
3384
  return A.value.forEach((t, y) => {
3385
- const h = gA(y);
3385
+ const h = CA(y);
3386
3386
  h && (i[KA(t, y)] = IC(h));
3387
3387
  }), i;
3388
3388
  });
3389
- function gA(i) {
3389
+ function CA(i) {
3390
3390
  const t = A.value[i];
3391
3391
  if (!t) return;
3392
3392
  const y = KA(t, i), h = C.value.find((u) => u.id === y);
@@ -3479,7 +3479,7 @@ const VA = Ug("printbench-project", () => {
3479
3479
  }
3480
3480
  };
3481
3481
  }
3482
- function CA() {
3482
+ function IA() {
3483
3483
  a.value = {
3484
3484
  meshes: C.value.map(cI),
3485
3485
  roots: nA(A.value)
@@ -3544,7 +3544,7 @@ const VA = Ug("printbench-project", () => {
3544
3544
  kind: "primary",
3545
3545
  meshId: j.id,
3546
3546
  transform: [...xA]
3547
- })), Q.value = [nA(A.value)], D.value = 0, s.value = -1, n.value = [], o.value = [], CA(), await P(), $A();
3547
+ })), Q.value = [nA(A.value)], D.value = 0, s.value = -1, n.value = [], o.value = [], IA(), await P(), $A();
3548
3548
  }
3549
3549
  async function WI(i, t) {
3550
3550
  const y = oA();
@@ -3556,7 +3556,7 @@ const VA = Ug("printbench-project", () => {
3556
3556
  kind: "primary",
3557
3557
  meshId: j.id,
3558
3558
  transform: [...xA]
3559
- })), Q.value = [nA(A.value)], D.value = 0, s.value = -1, n.value = [], o.value = [], CA(), await P(), $A();
3559
+ })), Q.value = [nA(A.value)], D.value = 0, s.value = -1, n.value = [], o.value = [], IA(), await P(), $A();
3560
3560
  } catch (h) {
3561
3561
  throw y.toast("fail", h instanceof Error ? h.message : "导入失败"), A.value.length && P(), h;
3562
3562
  } finally {
@@ -3713,13 +3713,13 @@ const VA = Ug("printbench-project", () => {
3713
3713
  op: y,
3714
3714
  a: PA(A.value[i]),
3715
3715
  b: PA(A.value[t])
3716
- }, u = gA(i), q = A.value.filter((j, X) => X !== i && X !== t);
3716
+ }, u = CA(i), q = A.value.filter((j, X) => X !== i && X !== t);
3717
3717
  q.push(h), A.value = q, s.value = q.length - 1, u && (m.value = { ...m.value, [h.id]: [u[0], u[1], u[2]] }), await P();
3718
3718
  }
3719
3719
  async function UI(i) {
3720
3720
  if (i.length < 2) return;
3721
3721
  eA();
3722
- const t = i.map((q) => PA(A.value[q])), y = A.value.filter((q, j) => !i.includes(j)), h = gA(i[0]), u = OA("merge");
3722
+ const t = i.map((q) => PA(A.value[q])), y = A.value.filter((q, j) => !i.includes(j)), h = CA(i[0]), u = OA("merge");
3723
3723
  y.push({ kind: "merge", id: u, nodes: t }), h && (m.value = { ...m.value, [u]: [h[0], h[1], h[2]] }), A.value = y, s.value = y.length - 1, await P();
3724
3724
  }
3725
3725
  async function YI() {
@@ -3731,7 +3731,7 @@ const VA = Ug("printbench-project", () => {
3731
3731
  oA().toast("info", "当前零件没有可拆分的连通分量");
3732
3732
  return;
3733
3733
  }
3734
- const h = gA(i);
3734
+ const h = CA(i);
3735
3735
  eA(), A.value.splice(i, 1), y.forEach((u, q) => {
3736
3736
  const j = {
3737
3737
  id: OA("mesh"),
@@ -3829,7 +3829,7 @@ const VA = Ug("printbench-project", () => {
3829
3829
  } catch (wA) {
3830
3830
  return q.toast("fail", wA instanceof Error ? wA.message : "切面拆件失败"), !1;
3831
3831
  }
3832
- const qA = gA(i), lI = t.length === 1;
3832
+ const qA = CA(i), lI = t.length === 1;
3833
3833
  return eA(), A.value.splice(i, 1), JA.forEach((wA, mA) => {
3834
3834
  const AI = {
3835
3835
  id: OA("mesh"),
@@ -3943,7 +3943,7 @@ const VA = Ug("printbench-project", () => {
3943
3943
  selectedNode: v,
3944
3944
  partNames: DA,
3945
3945
  visibility: vA,
3946
- appearances: IA,
3946
+ appearances: gA,
3947
3947
  printColors: EI,
3948
3948
  partColorsById: yA,
3949
3949
  partIds: sA,
@@ -3985,7 +3985,7 @@ const VA = Ug("printbench-project", () => {
3985
3985
  setSelectionByPartIds: YA,
3986
3986
  setPartColor: UA,
3987
3987
  applyPartColorsHex: QA,
3988
- printColorAt: gA,
3988
+ printColorAt: CA,
3989
3989
  snapshot: XI,
3990
3990
  restore: zI,
3991
3991
  tryRestoreDraft: $I,
@@ -4630,6 +4630,8 @@ const lo = {
4630
4630
  extras: !0,
4631
4631
  importUnit: !0,
4632
4632
  hideEmpty: !1,
4633
+ hideStatusBar: !1,
4634
+ hidePanelModeToggle: !1,
4633
4635
  leftPanelMode: "float",
4634
4636
  actionButtons: "icon-text"
4635
4637
  };
@@ -4642,6 +4644,8 @@ function dQ(g) {
4642
4644
  extras: !!g?.extras,
4643
4645
  importUnit: !!g?.importUnit,
4644
4646
  hideEmpty: !!g?.hideEmpty,
4647
+ hideStatusBar: !!g?.hideStatusBar,
4648
+ hidePanelModeToggle: !!g?.hidePanelModeToggle,
4645
4649
  leftPanelMode: g?.leftPanelMode === "dock" ? "dock" : "float",
4646
4650
  actionButtons: g?.actionButtons === "icon" || g?.actionButtons === "text" ? g.actionButtons : "icon-text"
4647
4651
  };
@@ -4872,10 +4876,10 @@ function uQ(g) {
4872
4876
  }
4873
4877
  async function Y() {
4874
4878
  const M = B.fileName.replace(/\.[^.]+$/, "") || "printbench", l = 1 / Sg[n.value], L = B.evaluated.map((V, $) => {
4875
- const DA = B.pendingDisplayMatrix($), IA = DA ? Ig(V.positions, DA) : V.positions;
4879
+ const DA = B.pendingDisplayMatrix($), gA = DA ? Ig(V.positions, DA) : V.positions;
4876
4880
  return {
4877
4881
  ...V,
4878
- positions: l === 1 ? IA : Float32Array.from(IA, (sA) => sA * l)
4882
+ positions: l === 1 ? gA : Float32Array.from(gA, (sA) => sA * l)
4879
4883
  };
4880
4884
  }), m = RI(L);
4881
4885
  r.value = 55;
@@ -5021,7 +5025,7 @@ function HQ(g) {
5021
5025
  const NA = await f(l, L);
5022
5026
  H = NA.blob, v = NA.width, V = NA.height, a.value = l;
5023
5027
  }
5024
- const $ = GQ(B.fileName, l), DA = oC(l), IA = {
5028
+ const $ = GQ(B.fileName, l), DA = oC(l), gA = {
5025
5029
  action: M,
5026
5030
  format: l,
5027
5031
  fileName: $,
@@ -5031,15 +5035,15 @@ function HQ(g) {
5031
5035
  height: V
5032
5036
  };
5033
5037
  if (A.value)
5034
- return Q.onSnapshot?.(IA), I.toast("ok", `已生成 ${$}`), d(), IA;
5038
+ return Q.onSnapshot?.(gA), I.toast("ok", `已生成 ${$}`), d(), gA;
5035
5039
  if (M === "download")
5036
- return b(H, $), Q.onSnapshot?.(IA), I.toast("ok", `已下载 ${$}`), d(), IA;
5040
+ return b(H, $), Q.onSnapshot?.(gA), I.toast("ok", `已下载 ${$}`), d(), gA;
5037
5041
  const sA = await tC(
5038
5042
  H,
5039
5043
  { fileName: $, format: l },
5040
5044
  { endpoint: C.value }
5041
5045
  );
5042
- return Q.onSnapshot?.(IA), I.toast("ok", sA.id ? `已上传 ${$} · ${sA.id}` : `已上传 ${$}`), d(), IA;
5046
+ return Q.onSnapshot?.(gA), I.toast("ok", sA.id ? `已上传 ${$} · ${sA.id}` : `已上传 ${$}`), d(), gA;
5043
5047
  } catch (H) {
5044
5048
  if (H instanceof ug)
5045
5049
  return I.toast("info", H.message), null;
@@ -5885,7 +5889,8 @@ const dA = /* @__PURE__ */ aA({
5885
5889
  }, [
5886
5890
  E("div", $E, [
5887
5891
  E("span", Ai, "零件树 · " + x(k(A).partNames.length), 1),
5888
- E("button", {
5892
+ g.features.hidePanelModeToggle ? p("", !0) : (R(), U("button", {
5893
+ key: 0,
5889
5894
  class: "panel-toggle",
5890
5895
  type: "button",
5891
5896
  title: g.panelMode === "float" ? "切换为通栏" : "切换为悬浮",
@@ -5897,7 +5902,7 @@ const dA = /* @__PURE__ */ aA({
5897
5902
  fill: "currentColor"
5898
5903
  }, null, 8, Ci)
5899
5904
  ]))
5900
- ], 8, Ii),
5905
+ ], 8, Ii)),
5901
5906
  E("button", {
5902
5907
  class: "panel-toggle",
5903
5908
  type: "button",
@@ -5951,7 +5956,7 @@ const dA = /* @__PURE__ */ aA({
5951
5956
  type: "button",
5952
5957
  title: "导入",
5953
5958
  "aria-label": "导入",
5954
- disabled: g.observe,
5959
+ disabled: g.observe || g.splitMode,
5955
5960
  onClick: o[2] || (o[2] = (w) => C("import"))
5956
5961
  }, [
5957
5962
  r.value ? (R(), U("svg", si, [
@@ -5967,7 +5972,7 @@ const dA = /* @__PURE__ */ aA({
5967
5972
  type: "button",
5968
5973
  title: "导出",
5969
5974
  "aria-label": "导出",
5970
- disabled: !g.hasModel,
5975
+ disabled: !g.hasModel || g.splitMode,
5971
5976
  onClick: o[3] || (o[3] = (w) => C("export"))
5972
5977
  }, [
5973
5978
  r.value ? (R(), U("svg", ni, [
@@ -5983,7 +5988,7 @@ const dA = /* @__PURE__ */ aA({
5983
5988
  type: "button",
5984
5989
  title: "复原到导入时的状态",
5985
5990
  "aria-label": "复原",
5986
- disabled: !g.hasModel || g.geomLocked,
5991
+ disabled: !g.hasModel || g.geomLocked || g.splitMode,
5987
5992
  onClick: o[4] || (o[4] = (w) => C("restore"))
5988
5993
  }, [
5989
5994
  r.value ? (R(), U("svg", Mi, [
@@ -5999,7 +6004,7 @@ const dA = /* @__PURE__ */ aA({
5999
6004
  type: "button",
6000
6005
  title: "修复",
6001
6006
  "aria-label": "修复",
6002
- disabled: !g.hasModel || g.observe,
6007
+ disabled: !g.hasModel || g.observe || g.splitMode,
6003
6008
  onClick: o[5] || (o[5] = (w) => C("repair"))
6004
6009
  }, [
6005
6010
  r.value ? (R(), U("svg", bi, [
@@ -6015,7 +6020,7 @@ const dA = /* @__PURE__ */ aA({
6015
6020
  type: "button",
6016
6021
  title: "复制",
6017
6022
  "aria-label": "复制",
6018
- disabled: !g.hasModel || !K.value || g.geomLocked,
6023
+ disabled: !g.hasModel || !K.value || g.geomLocked || g.splitMode,
6019
6024
  onClick: o[6] || (o[6] = (w) => k(A).duplicatePart(k(A).selected))
6020
6025
  }, [
6021
6026
  r.value ? (R(), U("svg", Ui, [
@@ -6031,7 +6036,7 @@ const dA = /* @__PURE__ */ aA({
6031
6036
  type: "button",
6032
6037
  title: "删除",
6033
6038
  "aria-label": "删除",
6034
- disabled: !g.hasModel || !K.value || g.geomLocked,
6039
+ disabled: !g.hasModel || !K.value || g.geomLocked || g.splitMode,
6035
6040
  onClick: e
6036
6041
  }, [
6037
6042
  r.value ? (R(), U("svg", Li, [
@@ -6602,11 +6607,11 @@ const dA = /* @__PURE__ */ aA({
6602
6607
  let f = null;
6603
6608
  const Y = S(!1), J = S(!1), b = S(!1), d = S(-1), o = S("difference"), w = S(1), M = S(!1), l = S(0);
6604
6609
  S(0.5);
6605
- const L = S(null), m = S([]), H = S(""), v = S(!1), V = S(0), $ = S(null), DA = S({ x: 0, y: 0, z: 0, rx: 0, ry: 0, rz: 0, sx: 1, sy: 1, sz: 1 }), IA = S(!1), sA = S(!0), NA = S("float"), EI = S(!1), yA = S(null), gA = S(null), UA = S(!1), QA = S(!1), YA = S(0), vA = S(0), iI = S(0), HA = S("sphere"), XA = S(0), eA = S(0), wI = S(!1);
6610
+ const L = S(null), m = S([]), H = S(""), v = S(!1), V = S(0), $ = S(null), DA = S({ x: 0, y: 0, z: 0, rx: 0, ry: 0, rz: 0, sx: 1, sy: 1, sz: 1 }), gA = S(!1), sA = S(!0), NA = S("float"), EI = S(!1), yA = S(null), CA = S(null), UA = S(!1), QA = S(!1), YA = S(0), vA = S(0), iI = S(0), HA = S("sphere"), XA = S(0), eA = S(0), wI = S(!1);
6606
6611
  let tA = null, SI = null, zA = !1;
6607
- const P = AA(() => I.roots.length > 0), _I = AA(() => I.diagnosis?.bbox.min[1] ?? 0), cI = AA(() => I.diagnosis?.bbox.max[1] ?? 10), CA = AA(() => dQ(n.value));
6612
+ const P = AA(() => I.roots.length > 0), _I = AA(() => I.diagnosis?.bbox.min[1] ?? 0), cI = AA(() => I.diagnosis?.bbox.max[1] ?? 10), IA = AA(() => dQ(n.value));
6608
6613
  GA(
6609
- () => CA.value.leftPanelMode,
6614
+ () => IA.value.leftPanelMode,
6610
6615
  (F) => {
6611
6616
  NA.value = F;
6612
6617
  },
@@ -6632,7 +6637,7 @@ const dA = /* @__PURE__ */ aA({
6632
6637
  onLoaded: () => {
6633
6638
  V.value = I.diagnosis?.bbox.max[1] ?? 0, l.value = I.diagnosis?.bbox.min[1] ?? 0;
6634
6639
  },
6635
- confirmUnit: () => CA.value.importUnit
6640
+ confirmUnit: () => IA.value.importUnit
6636
6641
  }), { exportOpen: PI, exportFmt: UI, exportUnit: YI, exportProgress: sg, openExport: tg, confirmExport: rg, exportFile: Ng } = uQ({
6637
6642
  onBlocking: (F) => Hg(F),
6638
6643
  onRepair: () => pI()
@@ -6677,7 +6682,7 @@ const dA = /* @__PURE__ */ aA({
6677
6682
  }
6678
6683
  function j() {
6679
6684
  if (e.value) {
6680
- if (e.value.setGridVisible(C.state.showGrid), e.value.setLights(C.state.showLights), e.value.clipping = v.value, e.value.setClipHeight(V.value), e.value.setTransformSnap(IA.value), e.value.syncMeshes(
6685
+ if (e.value.setGridVisible(C.state.showGrid), e.value.setLights(C.state.showLights), e.value.clipping = v.value, e.value.setClipHeight(V.value), e.value.setTransformSnap(gA.value), e.value.syncMeshes(
6681
6686
  I.evaluated,
6682
6687
  I.partNames,
6683
6688
  I.visibility,
@@ -6717,7 +6722,7 @@ const dA = /* @__PURE__ */ aA({
6717
6722
  C.state.showBbox,
6718
6723
  v.value,
6719
6724
  V.value,
6720
- IA.value,
6725
+ gA.value,
6721
6726
  FA.value
6722
6727
  ],
6723
6728
  () => j(),
@@ -6852,11 +6857,11 @@ const dA = /* @__PURE__ */ aA({
6852
6857
  }, 80));
6853
6858
  };
6854
6859
  }
6855
- if (window.addEventListener("keydown", mA), window.addEventListener("keyup", AI), window.addEventListener("beforeunload", () => I.scheduleAutosave()), I.setAutosaveEnabled(CA.value.drafts), !EA.value && CA.value.drafts) {
6860
+ if (window.addEventListener("keydown", mA), window.addEventListener("keyup", AI), window.addEventListener("beforeunload", () => I.scheduleAutosave()), I.setAutosaveEnabled(IA.value.drafts), !EA.value && IA.value.drafts) {
6856
6861
  const c = await iC();
6857
6862
  c?.roots?.length && await A.ask("发现未完成草稿", "检测到上次编辑的项目草稿,是否恢复?") && await I.restore(c);
6858
6863
  }
6859
- !EA.value && CA.value.extras && !C.state.skipTour && (d.value = 0);
6864
+ !EA.value && IA.value.extras && !C.state.skipTour && (d.value = 0);
6860
6865
  try {
6861
6866
  await I.ensureKernel(), r.onReady?.();
6862
6867
  } catch {
@@ -6870,10 +6875,10 @@ const dA = /* @__PURE__ */ aA({
6870
6875
  function mA(F) {
6871
6876
  if (A.busy) return;
6872
6877
  if (F.key === "Shift" && e.value?.setTransformSnap(!0), (F.ctrlKey || F.metaKey) && F.key.toLowerCase() === "z" && (F.preventDefault(), F.shiftKey ? I.redo() : I.undo()), (F.ctrlKey || F.metaKey) && F.key.toLowerCase() === "y" && (F.preventDefault(), I.redo()), (F.ctrlKey || F.metaKey) && F.key.toLowerCase() === "s") {
6873
- if (F.preventDefault(), !CA.value.drafts) return;
6878
+ if (F.preventDefault(), !IA.value.drafts) return;
6874
6879
  I.scheduleAutosave(), A.toast("ok", "草稿已保存到本地");
6875
6880
  }
6876
- if (!(F.target instanceof HTMLElement && ["INPUT", "TEXTAREA", "SELECT"].includes(F.target.tagName)) && F.key.toLowerCase() === "p" && !F.ctrlKey && !F.metaKey && !EA.value && CA.value.extras) {
6881
+ if (!(F.target instanceof HTMLElement && ["INPUT", "TEXTAREA", "SELECT"].includes(F.target.tagName)) && F.key.toLowerCase() === "p" && !F.ctrlKey && !F.metaKey && !EA.value && IA.value.extras) {
6877
6882
  A.setWorkspaceMode(A.workspaceMode === "preview" ? "edit" : "preview");
6878
6883
  return;
6879
6884
  }
@@ -6887,13 +6892,13 @@ const dA = /* @__PURE__ */ aA({
6887
6892
  A.setWorkspaceMode("edit");
6888
6893
  return;
6889
6894
  }
6890
- e.value?.detachGizmo(), e.value?.clearPreview(), M.value = !1, I.measureMode = "off", m.value = [], H.value = "", e.value?.setMeasureDraft([]), gA.value = null, yA.value = null;
6895
+ e.value?.detachGizmo(), e.value?.clearPreview(), M.value = !1, I.measureMode = "off", m.value = [], H.value = "", e.value?.setMeasureDraft([]), CA.value = null, yA.value = null;
6891
6896
  }
6892
6897
  F.key.toLowerCase() === "f" && !F.ctrlKey && e.value?.fit(), e.value && P.value && !QA.value && !FA.value && I.selected >= 0 && I.selectedIds.length && e.value.attachGizmo(I.selected, I.transformMode);
6893
6898
  }
6894
6899
  }
6895
6900
  function AI(F) {
6896
- F.key === "Shift" && !IA.value && e.value?.setTransformSnap(!1);
6901
+ F.key === "Shift" && !gA.value && e.value?.setTransformSnap(!1);
6897
6902
  }
6898
6903
  async function LI() {
6899
6904
  RA.value || !P.value || await A.ask("复原模型", "导入之后的修改都会丢掉,模型回到刚导入时的状态。", {
@@ -6916,7 +6921,7 @@ const dA = /* @__PURE__ */ aA({
6916
6921
  UA.value = !1, e.value?.setCompareBefore(null), e.value?.setCompareAfterTint(!1), T ? $.value = null : I.undo(), j();
6917
6922
  }
6918
6923
  function oI() {
6919
- if (!CA.value.split || RA.value || !P.value || !e.value) return;
6924
+ if (!IA.value.split || RA.value || !P.value || !e.value) return;
6920
6925
  if (QA.value) {
6921
6926
  Mg();
6922
6927
  return;
@@ -6977,7 +6982,7 @@ const dA = /* @__PURE__ */ aA({
6977
6982
  zA = !1;
6978
6983
  return;
6979
6984
  }
6980
- if (gA.value = null, !e.value || !K.value) return;
6985
+ if (CA.value = null, !e.value || !K.value) return;
6981
6986
  const c = q(F);
6982
6987
  if (QA.value) {
6983
6988
  const kA = e.value.pickSplitPlane(c.nx, c.ny);
@@ -7043,7 +7048,7 @@ const dA = /* @__PURE__ */ aA({
7043
7048
  function MC(F) {
7044
7049
  if (F.preventDefault(), FA.value || !e.value || !K.value) return;
7045
7050
  const c = q(F), T = e.value.pick(c.nx, c.ny)?.index ?? I.selected;
7046
- gA.value = { x: F.clientX, y: F.clientY, i: T }, I.setSelection([T], F.ctrlKey);
7051
+ CA.value = { x: F.clientX, y: F.clientY, i: T }, I.setSelection([T], F.ctrlKey);
7047
7052
  }
7048
7053
  function hC() {
7049
7054
  const F = m.value;
@@ -7149,7 +7154,7 @@ const dA = /* @__PURE__ */ aA({
7149
7154
  L.value && navigator.clipboard.writeText(L.value), A.toast("ok", "已复制错误信息");
7150
7155
  }
7151
7156
  return GA(
7152
- () => CA.value.drafts,
7157
+ () => IA.value.drafts,
7153
7158
  (F) => I.setAutosaveEnabled(F),
7154
7159
  { immediate: !0 }
7155
7160
  ), GA(
@@ -7190,11 +7195,11 @@ const dA = /* @__PURE__ */ aA({
7190
7195
  "has-model": P.value,
7191
7196
  nx: DA.value,
7192
7197
  "geom-locked": RA.value,
7193
- features: CA.value,
7198
+ features: IA.value,
7194
7199
  observe: FA.value,
7195
7200
  "clip-on": v.value,
7196
- "snap-on": IA.value,
7197
- "onUpdate:snapOn": c[2] || (c[2] = (N) => IA.value = N),
7201
+ "snap-on": gA.value,
7202
+ "onUpdate:snapOn": c[2] || (c[2] = (N) => gA.value = N),
7198
7203
  "bool-op": o.value,
7199
7204
  "onUpdate:boolOp": c[3] || (c[3] = (N) => o.value = N),
7200
7205
  "bool-b": w.value,
@@ -7218,7 +7223,7 @@ const dA = /* @__PURE__ */ aA({
7218
7223
  onSettings: c[9] || (c[9] = (N) => Y.value = !0),
7219
7224
  onHelp: c[10] || (c[10] = (N) => J.value = !0),
7220
7225
  onSelect: dC,
7221
- onPartMenu: c[11] || (c[11] = (N) => gA.value = N),
7226
+ onPartMenu: c[11] || (c[11] = (N) => CA.value = N),
7222
7227
  onApplyNumeric: RC,
7223
7228
  onAddPrim: fC,
7224
7229
  onPreviewBool: KC,
@@ -7245,9 +7250,9 @@ const dA = /* @__PURE__ */ aA({
7245
7250
  ref_key: "canvasRef",
7246
7251
  ref: G
7247
7252
  }, null, 512),
7248
- !P.value && !CA.value.hideEmpty && !EA.value ? (R(), U("div", go, [...c[36] || (c[36] = [
7253
+ !P.value && !IA.value.hideEmpty && !EA.value ? (R(), U("div", go, [...c[36] || (c[36] = [
7249
7254
  E("h2", null, "拖入 GLB / STL / OBJ / 3MF 开始", -1),
7250
- E("p", null, "也可从网络地址导入。解析在浏览器内完成。导入 → 修复 → 导出可打印文件。", -1),
7255
+ E("p", null, "也可从网络地址导入,解析在浏览器内完成。", -1),
7251
7256
  E("div", { class: "steps" }, [
7252
7257
  E("div", null, [
7253
7258
  E("b", null, "1"),
@@ -7259,7 +7264,7 @@ const dA = /* @__PURE__ */ aA({
7259
7264
  ]),
7260
7265
  E("div", null, [
7261
7266
  E("b", null, "3"),
7262
- _(" 导出 STL / 3MF")
7267
+ _(" 导出模型")
7263
7268
  ])
7264
7269
  ], -1)
7265
7270
  ])])) : p("", !0),
@@ -7290,7 +7295,7 @@ const dA = /* @__PURE__ */ aA({
7290
7295
  class: "marquee",
7291
7296
  style: Bg({ left: yA.value.x + "px", top: yA.value.y + "px", width: yA.value.w + "px", height: yA.value.h + "px" })
7292
7297
  }, null, 4)) : p("", !0),
7293
- CA.value.extras && d.value >= 0 ? (R(), U("div", ao, [
7298
+ IA.value.extras && d.value >= 0 ? (R(), U("div", ao, [
7294
7299
  d.value === 0 ? (R(), U("p", eo, "第一步:导入模型。对话框期间先按毫米预览包围盒,确认单位后再缩放。")) : d.value === 1 ? (R(), U("p", Fo, "第二步:点诊断条目飞到缺陷;必要时「修复」并看红绿对拍。")) : (R(), U("p", wo, "第三步:校验通过后导出二进制 STL 或 3MF,交给切片软件(Cura / PrusaSlicer 等)。")),
7295
7300
  E("div", co, [
7296
7301
  E("button", {
@@ -7313,13 +7318,13 @@ const dA = /* @__PURE__ */ aA({
7313
7318
  "active-defect": $.value,
7314
7319
  onFly: Hg
7315
7320
  }, null, 8, ["open", "active-defect"])),
7316
- EA.value ? p("", !0) : (R(), z($D, { key: 2 })),
7317
- gA.value && !FA.value ? (R(), z(Io, {
7321
+ !EA.value && !IA.value.hideStatusBar ? (R(), z($D, { key: 2 })) : p("", !0),
7322
+ CA.value && !FA.value ? (R(), z(Io, {
7318
7323
  key: 3,
7319
- x: gA.value.x,
7320
- y: gA.value.y,
7321
- index: gA.value.i,
7322
- onClose: c[16] || (c[16] = (N) => gA.value = null)
7324
+ x: CA.value.x,
7325
+ y: CA.value.y,
7326
+ index: CA.value.i,
7327
+ onClose: c[16] || (c[16] = (N) => CA.value = null)
7323
7328
  }, null, 8, ["x", "y", "index"])) : p("", !0),
7324
7329
  k(ZI) && k(tI) ? (R(), z($Q, {
7325
7330
  key: 4,
@@ -7336,7 +7341,7 @@ const dA = /* @__PURE__ */ aA({
7336
7341
  onPick: k(ag),
7337
7342
  onImportUrl: k(eg)
7338
7343
  }, null, 8, ["url", "onPick", "onImportUrl"])) : p("", !0),
7339
- CA.value.importUnit && k(VI) ? (R(), z(vQ, {
7344
+ IA.value.importUnit && k(VI) ? (R(), z(vQ, {
7340
7345
  key: 6,
7341
7346
  "file-name": k(Dg)?.name,
7342
7347
  unit: k(dI),
@@ -7364,23 +7369,23 @@ const dA = /* @__PURE__ */ aA({
7364
7369
  onClose: c[24] || (c[24] = (N) => PI.value = !1),
7365
7370
  onDownload: k(rg)
7366
7371
  }, null, 8, ["format", "unit", "progress", "onDownload"])) : p("", !0),
7367
- CA.value.extras && Y.value ? (R(), z(YE, {
7372
+ IA.value.extras && Y.value ? (R(), z(YE, {
7368
7373
  key: 9,
7369
7374
  onClose: c[25] || (c[25] = (N) => Y.value = !1)
7370
7375
  })) : p("", !0),
7371
- CA.value.extras && J.value ? (R(), z(lE, {
7376
+ IA.value.extras && J.value ? (R(), z(lE, {
7372
7377
  key: 10,
7373
7378
  onClose: c[26] || (c[26] = (N) => J.value = !1),
7374
7379
  onReplayTour: c[27] || (c[27] = (N) => d.value = 0)
7375
7380
  })) : p("", !0),
7376
- CA.value.extras && b.value ? (R(), z(qE, {
7381
+ IA.value.extras && b.value ? (R(), z(qE, {
7377
7382
  key: 11,
7378
7383
  printable: wI.value,
7379
7384
  "onUpdate:printable": c[28] || (c[28] = (N) => wI.value = N),
7380
7385
  onClose: c[29] || (c[29] = (N) => b.value = !1),
7381
7386
  onDownload: SC
7382
7387
  }, null, 8, ["printable"])) : p("", !0),
7383
- CA.value.drafts && k($I) ? (R(), z(PE, {
7388
+ IA.value.drafts && k($I) ? (R(), z(PE, {
7384
7389
  key: 12,
7385
7390
  name: k(i),
7386
7391
  "onUpdate:name": c[30] || (c[30] = (N) => HI(i) ? i.value = N : null),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "printbench",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "description": "Browser-based 3D print model workbench (Vue 3 + three.js + Manifold)",
5
5
  "type": "module",
6
6
  "main": "./dist/printbench.js",