three-slicer-viewer 0.3.1 → 0.3.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/dist/toolpath.js CHANGED
@@ -1,92 +1,14 @@
1
- import { U as St, b as It, a as kt } from "./viewer_defaults-B7UUZ582.js";
2
- import { r as bt, S as nt, R as et, t as Tt } from "./toolpath_encoding-BuYs95qZ.js";
3
- import { T as Pt } from "./theme-2oyfMuvf.js";
4
- const O = {
5
- 0: [0.35, 0.38, 0.44],
6
- // travel
7
- 1: [0.98, 0.45, 0.16],
8
- // wall
9
- 2: [0.36, 0.72, 0.94],
10
- // sparse infill
11
- 3: [0.2, 0.55, 0.86],
12
- // solid infill
13
- 4: [0.62, 0.66, 0.72],
14
- // skirt / brim
15
- 5: [0.5, 0.54, 0.6],
16
- // support
17
- 6: [0.42, 0.46, 0.52],
18
- // raft
19
- 7: [0.96, 0.76, 0.22],
20
- // gap fill
21
- 8: [0.88, 0.55, 0.3],
22
- // thin wall
23
- 9: [0.3, 0.8, 0.62],
24
- // bridge
25
- 10: [0.8, 0.42, 0.72],
26
- // ironing
27
- 11: [0.58, 0.5, 0.88]
28
- // prime tower
29
- }, Ot = {
30
- 0: "Travel",
31
- 1: "Wall",
32
- 2: "Sparse",
33
- 3: "Solid",
34
- 4: "Skirt",
35
- 5: "Support",
36
- 6: "Raft",
37
- 7: "Gap",
38
- 8: "Thin",
39
- 9: "Bridge",
40
- 10: "Ironing",
41
- 11: "Prime"
42
- }, gt = [
43
- [0.9, 0.26, 0.3],
44
- [0.27, 0.6, 0.93],
45
- [0.36, 0.78, 0.42],
46
- [0.98, 0.72, 0.2],
47
- [0.72, 0.42, 0.9],
48
- [0.2, 0.78, 0.8],
49
- [0.95, 0.5, 0.72],
50
- [0.6, 0.6, 0.64]
51
- ];
52
- function Lt(t) {
53
- const e = /^#?([0-9a-f]{6})$/i.exec(String(t ?? "").trim());
54
- if (!e) return Lt(St);
55
- const n = parseInt(e[1], 16);
56
- return [(n >> 16 & 255) / 255, (n >> 8 & 255) / 255, (n & 255) / 255];
57
- }
58
- function ot(t) {
59
- const e = (n) => Math.max(0, Math.min(255, Math.round((Number(n) || 0) * 255)));
60
- return e(t?.[0]) * 65536 + e(t?.[1]) * 256 + e(t?.[2]);
61
- }
62
- const xt = [
63
- [0.043, 0.173, 0.478],
64
- [0.055, 0.325, 0.639],
65
- [0.067, 0.478, 0.8],
66
- [0.078, 0.631, 0.961],
67
- [0.118, 0.749, 0.804],
68
- [0.157, 0.867, 0.647],
69
- [0.376, 0.902, 0.4],
70
- [0.667, 0.898, 0.157],
71
- [0.988, 0.976, 0.012],
72
- [0.988, 0.663, 0.012],
73
- [0.58, 0.149, 0.086]
74
- ];
75
- function _t(t, e, n, r = xt) {
76
- const o = r.length - 1;
77
- if (o < 0) return [0, 0, 0];
78
- if (!Number.isFinite(t) || !Number.isFinite(e) || !Number.isFinite(n) || n <= e || t <= e) return r[0];
79
- if (t >= n) return r[o];
80
- const i = (t - e) / (n - e) * o, f = Math.min(o - 1, Math.floor(i)), u = i - f, l = r[f], m = r[f + 1];
81
- return [l[0] + (m[0] - l[0]) * u, l[1] + (m[1] - l[1]) * u, l[2] + (m[2] - l[2]) * u];
82
- }
1
+ import { a as V, b as Mt, p as ot, h as Nt, T as bt, r as St, D as It } from "./toolpath_palette-B8xEl-qa.js";
2
+ import { b as kt, a as Tt } from "./viewer_defaults-B7UUZ582.js";
3
+ import { r as gt, S as nt, R as et, t as Pt } from "./toolpath_encoding-BuYs95qZ.js";
4
+ import { T as Vt } from "./theme-2oyfMuvf.js";
83
5
  const rt = {};
84
- for (const t of Object.keys(O)) rt[t] = ot(O[t]);
85
- function Vt(t) {
6
+ for (const t of Object.keys(V)) rt[t] = ot(V[t]);
7
+ function _t(t) {
86
8
  const e = new Float32Array(t.length);
87
9
  for (let n = 0; n < t.length; n++) {
88
- const r = Number(t[n]?.z) || 0, o = n > 0 && Number(t[n - 1]?.z) || 0, i = n > 0 ? r - o : r;
89
- e[n] = i > 1e-6 ? i : kt;
10
+ const r = Number(t[n]?.z) || 0, o = n > 0 && Number(t[n - 1]?.z) || 0, s = n > 0 ? r - o : r;
11
+ e[n] = s > 1e-6 ? s : Tt;
90
12
  }
91
13
  return e;
92
14
  }
@@ -94,60 +16,60 @@ const it = (t) => t?.paths?.length ? t.paths : null, wt = (t) => {
94
16
  const e = it(t);
95
17
  return e ? Math.floor(e.length / nt) : 0;
96
18
  };
97
- function Rt(t, e) {
98
- const n = Array.isArray(t) ? t : [], r = n.length, o = Number(e) > 0 ? Number(e) : It, i = Vt(n), f = new Uint32Array(r + 1), u = new Uint32Array(r + 1), l = new Uint32Array(r + 1);
99
- let m = 0, c = 0, h = 0;
100
- for (let y = 0; y < r; y++) {
101
- const U = it(n[y]), w = wt(n[y]);
19
+ function jt(t, e) {
20
+ const n = Array.isArray(t) ? t : [], r = n.length, o = Number(e) > 0 ? Number(e) : kt, s = _t(n), f = new Uint32Array(r + 1), h = new Uint32Array(r + 1), c = new Uint32Array(r + 1);
21
+ let y = 0, l = 0, u = 0;
22
+ for (let v = 0; v < r; v++) {
23
+ const U = it(n[v]), w = wt(n[v]);
102
24
  for (let D = 0; D < w; D++)
103
- bt(U[D * nt + 3]) === et.TRAVEL ? c++ : m++;
104
- h += w, f[y + 1] = m, u[y + 1] = c, l[y + 1] = h;
25
+ gt(U[D * nt + 3]) === et.TRAVEL ? l++ : y++;
26
+ u += w, f[v + 1] = y, h[v + 1] = l, c[v + 1] = u;
105
27
  }
106
- const a = m * 2, b = new Float32Array(a * 4), x = new Float32Array(a * 4), v = new Uint32Array(a * 2), _ = new Uint8Array(a), F = new Uint8Array(a), V = new Float32Array(a), M = new Float32Array(a), W = new Int32Array(a), g = new Float32Array(c * 6), C = new Float32Array(h * 3), s = new Uint8Array(h), p = new Float64Array(16);
107
- let A = !1, S = 0, I = 1 / 0, T = 1 / 0, z = 1 / 0, $ = -1 / 0, J = -1 / 0, Q = -1 / 0, L = 0, st = 0, lt = 0, B = 0;
108
- for (let y = 0; y < r; y++) {
109
- const U = n[y], w = it(U), D = wt(U), ct = U?.widths, E = i[y], ft = E / 2;
110
- for (let j = 0; j < D; j++) {
111
- const k = j * nt, X = w[k], Z = w[k + 1], q = w[k + 2], G = w[k + 4], Y = w[k + 5], H = w[k + 6], ut = w[k + 3] | 0, R = bt(ut), Nt = Tt(ut);
112
- if (Number.isFinite(X + Z + q + G + Y + H) || (A = !0), s[B] = R === et.TRAVEL ? 0 : 1, C[B * 3] = G, C[B * 3 + 1] = Y, C[B * 3 + 2] = H, B++, R === et.TRAVEL) {
28
+ const i = y * 2, b = new Float32Array(i * 4), x = new Float32Array(i * 4), p = new Uint32Array(i * 2), _ = new Uint8Array(i), M = new Uint8Array(i), O = new Float32Array(i), N = new Float32Array(i), z = new Int32Array(i), g = new Float32Array(l * 6), C = new Float32Array(u * 3), a = new Uint8Array(u), m = new Float64Array(16);
29
+ let A = !1, S = 0, I = 1 / 0, T = 1 / 0, W = 1 / 0, J = -1 / 0, Q = -1 / 0, $ = -1 / 0, L = 0, st = 0, lt = 0, B = 0;
30
+ for (let v = 0; v < r; v++) {
31
+ const U = n[v], w = it(U), D = wt(U), ct = U?.widths, E = s[v], ft = E / 2;
32
+ for (let R = 0; R < D; R++) {
33
+ const k = R * nt, X = w[k], Z = w[k + 1], q = w[k + 2], G = w[k + 4], Y = w[k + 5], H = w[k + 6], ut = w[k + 3] | 0, j = gt(ut), xt = Pt(ut);
34
+ if (Number.isFinite(X + Z + q + G + Y + H) || (A = !0), a[B] = j === et.TRAVEL ? 0 : 1, C[B * 3] = G, C[B * 3 + 1] = Y, C[B * 3 + 2] = H, B++, j === et.TRAVEL) {
113
35
  const d = lt * 6;
114
36
  g[d] = X, g[d + 1] = Z, g[d + 2] = q, g[d + 3] = G, g[d + 4] = Y, g[d + 5] = H, lt++;
115
37
  continue;
116
38
  }
117
- const tt = ct ? Number(ct[j]) : NaN, mt = Number.isFinite(tt) && tt > 0 ? tt : o, ht = G - X, pt = Y - Z, Ft = Math.atan2(pt, ht), vt = Math.hypot(ht, pt, H - q);
118
- Number.isFinite(vt) && (p[R] += vt);
119
- const Mt = rt[R] ?? rt[1];
39
+ const tt = ct ? Number(ct[R]) : NaN, mt = Number.isFinite(tt) && tt > 0 ? tt : o, ht = G - X, pt = Y - Z, Ct = Math.atan2(pt, ht), vt = Math.hypot(ht, pt, H - q);
40
+ Number.isFinite(vt) && (m[j] += vt);
41
+ const Ft = rt[j] ?? rt[1];
120
42
  for (const [d, P, yt] of [[X, Z, q], [G, Y, H]]) {
121
- const N = L * 4;
122
- b[N] = d, b[N + 1] = P, b[N + 2] = yt - ft, b[N + 3] = 0, x[N] = E, x[N + 1] = mt, x[N + 2] = Ft, x[N + 3] = Mt, v[L * 2] = st, v[L * 2 + 1] = y, _[L] = R, F[L] = Nt, V[L] = mt, M[L] = E, W[L] = y, L++;
43
+ const F = L * 4;
44
+ b[F] = d, b[F + 1] = P, b[F + 2] = yt - ft, b[F + 3] = 0, x[F] = E, x[F + 1] = mt, x[F + 2] = Ct, x[F + 3] = Ft, p[L * 2] = st, p[L * 2 + 1] = v, _[L] = j, M[L] = xt, O[L] = mt, N[L] = E, z[L] = v, L++;
123
45
  const K = yt - ft;
124
- d < I && (I = d), d > $ && ($ = d), P < T && (T = P), P > J && (J = P), K < z && (z = K), K > Q && (Q = K);
46
+ d < I && (I = d), d > J && (J = d), P < T && (T = P), P > Q && (Q = P), K < W && (W = K), K > $ && ($ = K);
125
47
  const dt = Math.max(Math.abs(d), Math.abs(P), Math.abs(K));
126
48
  dt > S && (S = dt);
127
49
  }
128
50
  st++;
129
51
  }
130
52
  }
131
- const Ct = a > 0 && Number.isFinite(I) ? { min: [I, T, z], max: [$, J, Q] } : null;
53
+ const Lt = i > 0 && Number.isFinite(I) ? { min: [I, T, W], max: [J, Q, $] } : null;
132
54
  return {
133
55
  position: b,
134
56
  hwa: x,
135
- segIndex: v,
136
- nV: a,
137
- nSeg: m,
57
+ segIndex: p,
58
+ nV: i,
59
+ nSeg: y,
138
60
  layerSegPrefix: f,
139
61
  travelPos: g,
140
- travelPrefix: u,
141
- nTrav: c,
62
+ travelPrefix: h,
63
+ nTrav: l,
142
64
  movePos: C,
143
- moveKind: s,
144
- movePrefix: l,
65
+ moveKind: a,
66
+ movePrefix: c,
145
67
  layerCount: r,
146
68
  maxAbs: S,
147
69
  hasNaN: A,
148
- typeLengths: p,
149
- bbox: Ct,
150
- meta: { vType: _, vTool: F, vWidth: V, vHeight: M, vLayer: W }
70
+ typeLengths: m,
71
+ bbox: Lt,
72
+ meta: { vType: _, vTool: M, vWidth: O, vHeight: N, vLayer: z }
151
73
  };
152
74
  }
153
75
  function Kt(t) {
@@ -157,13 +79,13 @@ function Kt(t) {
157
79
  if (n <= 0) return [];
158
80
  const r = [];
159
81
  for (let o = 0; o < 16; o++) {
160
- const i = Number(e[o]) || 0;
161
- i <= 0 || r.push({ type: o, label: Ot[o] ?? String(o), pct: i / n * 100, color: O[o] ?? O[1] });
82
+ const s = Number(e[o]) || 0;
83
+ s <= 0 || r.push({ type: o, label: Mt[o] ?? String(o), pct: s / n * 100, color: V[o] ?? V[1] });
162
84
  }
163
- return r.sort((o, i) => i.pct - o.pct);
85
+ return r.sort((o, s) => s.pct - o.pct);
164
86
  }
165
87
  const at = (t, e) => e >= 0 && e < t.layerCount ? t.movePrefix[e + 1] - t.movePrefix[e] : 0;
166
- function jt(t, e) {
88
+ function Rt(t, e) {
167
89
  return at(t, e);
168
90
  }
169
91
  function Xt(t, e, n) {
@@ -172,17 +94,17 @@ function Xt(t, e, n) {
172
94
  return e;
173
95
  }
174
96
  function Zt(t, e, n) {
175
- const r = at(t, e), o = Math.max(0, Math.min(Number(n) || 0, r)), i = e >= 0 && e < t.layerCount ? t.movePrefix[e] : 0;
176
- let f = 0, u = 0;
177
- for (let m = 0; m < o; m++)
178
- t.moveKind[i + m] === 0 ? u++ : f++;
97
+ const r = at(t, e), o = Math.max(0, Math.min(Number(n) || 0, r)), s = e >= 0 && e < t.layerCount ? t.movePrefix[e] : 0;
98
+ let f = 0, h = 0;
99
+ for (let y = 0; y < o; y++)
100
+ t.moveKind[s + y] === 0 ? h++ : f++;
179
101
  if (o === 0) return { point: null, segCount: 0, travCount: 0, onTravel: !1 };
180
- const l = i + o - 1;
102
+ const c = s + o - 1;
181
103
  return {
182
- point: [t.movePos[l * 3], t.movePos[l * 3 + 1], t.movePos[l * 3 + 2]],
104
+ point: [t.movePos[c * 3], t.movePos[c * 3 + 1], t.movePos[c * 3 + 2]],
183
105
  segCount: f,
184
- travCount: u,
185
- onTravel: t.moveKind[l] === 0
106
+ travCount: h,
107
+ onTravel: t.moveKind[c] === 0
186
108
  };
187
109
  }
188
110
  const At = [
@@ -197,8 +119,8 @@ const At = [
197
119
  // extruder index is a label, and a heatmap over it would imply tool 2 sits "between" tools 1 and 3.
198
120
  { key: "filament", label: "Filament", cont: !1, unit: "" }
199
121
  ];
200
- function Wt(t, e, n, r) {
201
- const o = e.vType[n], i = e.vLayer[n], f = i === 0;
122
+ function Ot(t, e, n, r) {
123
+ const o = e.vType[n], s = e.vLayer[n], f = s === 0;
202
124
  switch (t) {
203
125
  case "height":
204
126
  return e.vHeight[n];
@@ -207,7 +129,7 @@ function Wt(t, e, n, r) {
207
129
  case "speed":
208
130
  return f ? r.firstLayerSpeed : r.speedByType[o] ?? r.speedByType[1];
209
131
  case "fan":
210
- return i < r.closeFanLayers ? 0 : o === 9 ? 100 : r.fanNormal;
132
+ return s < r.closeFanLayers ? 0 : o === 9 ? 100 : r.fanNormal;
211
133
  case "temp":
212
134
  return f ? r.tempFirst : r.tempNormal;
213
135
  default:
@@ -215,27 +137,27 @@ function Wt(t, e, n, r) {
215
137
  }
216
138
  }
217
139
  function qt(t, e, n) {
218
- const { meta: r, nV: o } = t, i = new Float32Array(o * 4), f = At.find((c) => c.key === e) || At[0];
140
+ const { meta: r, nV: o } = t, s = new Float32Array(o * 4), f = At.find((l) => l.key === e) || At[0];
219
141
  if (!f.cont) {
220
- const c = (n?.toolColors ?? []).map(Lt), h = f.key === "filament" ? (a) => {
221
- const b = r.vTool ? r.vTool[a] : 0;
222
- return c[b] || gt[b % gt.length];
223
- } : (a) => O[r.vType[a]] || O[1];
224
- for (let a = 0; a < o; a++) i[a * 4] = ot(h(a));
225
- return { color: i, min: 0, max: 0, viewType: e, label: f.label, unit: f.unit, cont: !1 };
142
+ const l = (n?.toolColors ?? []).map((i) => i && Nt(i)), u = f.key === "filament" ? (i) => {
143
+ const b = r.vTool ? r.vTool[i] : 0;
144
+ return l[b] || bt[b % bt.length];
145
+ } : (i) => V[r.vType[i]] || V[1];
146
+ for (let i = 0; i < o; i++) s[i * 4] = ot(u(i));
147
+ return { color: s, min: 0, max: 0, viewType: e, label: f.label, unit: f.unit, cont: !1 };
226
148
  }
227
- let u = 1 / 0, l = -1 / 0;
228
- const m = new Float32Array(o);
229
- for (let c = 0; c < o; c++) {
230
- const h = Wt(e, r, c, n), a = Number.isFinite(h) ? h : 0;
231
- m[c] = a, a < u && (u = a), a > l && (l = a);
149
+ let h = 1 / 0, c = -1 / 0;
150
+ const y = new Float32Array(o);
151
+ for (let l = 0; l < o; l++) {
152
+ const u = Ot(e, r, l, n), i = Number.isFinite(u) ? u : 0;
153
+ y[l] = i, i < h && (h = i), i > c && (c = i);
232
154
  }
233
- Number.isFinite(u) || (u = 0, l = 1);
234
- for (let c = 0; c < o; c++) {
235
- const h = _t(m[c], u, l, xt);
236
- i[c * 4] = ot(h);
155
+ Number.isFinite(h) || (h = 0, c = 1);
156
+ for (let l = 0; l < o; l++) {
157
+ const u = St(y[l], h, c, It);
158
+ s[l * 4] = ot(u);
237
159
  }
238
- return { color: i, min: u, max: l, viewType: e, label: f.label, unit: f.unit, cont: !0 };
160
+ return { color: s, min: h, max: c, viewType: e, label: f.label, unit: f.unit, cont: !0 };
239
161
  }
240
162
  const zt = `
241
163
  precision highp float;
@@ -297,7 +219,7 @@ void main() {
297
219
  vColor = unpackColor(iColor);
298
220
  gl_Position = projectionMatrix * modelViewMatrix * vec4(world, 1.0);
299
221
  }
300
- `, Bt = `
222
+ `, Wt = `
301
223
  precision highp float;
302
224
 
303
225
  in vec3 vColor;
@@ -313,7 +235,7 @@ void main() {
313
235
  float lambert = max(dot(n, normalize(vec3(0.35, 0.35, 1.0))), 0.0);
314
236
  fragColor = vec4(vColor * (0.55 + 0.45 * lambert), 1.0);
315
237
  }
316
- `, Ut = new Float32Array([
238
+ `, Bt = new Float32Array([
317
239
  0,
318
240
  0,
319
241
  0,
@@ -332,80 +254,80 @@ void main() {
332
254
  1,
333
255
  3
334
256
  // end ring
335
- ]), Dt = (() => {
257
+ ]), Ut = (() => {
336
258
  const t = [];
337
259
  for (let e = 0; e < 4; e++) {
338
- const n = e, r = (e + 1) % 4, o = 4 + (e + 1) % 4, i = 4 + e;
339
- t.push(n, r, o, n, o, i);
260
+ const n = e, r = (e + 1) % 4, o = 4 + (e + 1) % 4, s = 4 + e;
261
+ t.push(n, r, o, n, o, s);
340
262
  }
341
263
  return t;
342
264
  })();
343
- function $t(t, e) {
344
- const { nSeg: n, nV: r, position: o, hwa: i, travelPos: f, travelPrefix: u, layerCount: l, meta: m } = e, c = new Float32Array(n * 3), h = new Float32Array(n * 3), a = new Float32Array(n * 2), b = new Float32Array(n), x = new Float32Array(n);
345
- for (let s = 0; s < n; s++) {
346
- const p = s * 2 * 4, A = (s * 2 + 1) * 4;
347
- c[s * 3] = o[p], c[s * 3 + 1] = o[p + 1], c[s * 3 + 2] = o[p + 2], h[s * 3] = o[A], h[s * 3 + 1] = o[A + 1], h[s * 3 + 2] = o[A + 2], a[s * 2] = i[p], a[s * 2 + 1] = i[p + 1], b[s] = i[p + 3], x[s] = m.vLayer[s * 2];
265
+ function Jt(t, e) {
266
+ const { nSeg: n, nV: r, position: o, hwa: s, travelPos: f, travelPrefix: h, layerCount: c, meta: y } = e, l = new Float32Array(n * 3), u = new Float32Array(n * 3), i = new Float32Array(n * 2), b = new Float32Array(n), x = new Float32Array(n);
267
+ for (let a = 0; a < n; a++) {
268
+ const m = a * 2 * 4, A = (a * 2 + 1) * 4;
269
+ l[a * 3] = o[m], l[a * 3 + 1] = o[m + 1], l[a * 3 + 2] = o[m + 2], u[a * 3] = o[A], u[a * 3 + 1] = o[A + 1], u[a * 3 + 2] = o[A + 2], i[a * 2] = s[m], i[a * 2 + 1] = s[m + 1], b[a] = s[m + 3], x[a] = y.vLayer[a * 2];
348
270
  }
349
- const v = new t.InstancedBufferGeometry();
350
- v.setAttribute("tpl", new t.BufferAttribute(Ut, 2)), v.setIndex(Dt), v.setAttribute("iStart", new t.InstancedBufferAttribute(c, 3)), v.setAttribute("iEnd", new t.InstancedBufferAttribute(h, 3)), v.setAttribute("iHW", new t.InstancedBufferAttribute(a, 2));
271
+ const p = new t.InstancedBufferGeometry();
272
+ p.setAttribute("tpl", new t.BufferAttribute(Bt, 2)), p.setIndex(Ut), p.setAttribute("iStart", new t.InstancedBufferAttribute(l, 3)), p.setAttribute("iEnd", new t.InstancedBufferAttribute(u, 3)), p.setAttribute("iHW", new t.InstancedBufferAttribute(i, 2));
351
273
  const _ = new t.InstancedBufferAttribute(b, 1);
352
- v.setAttribute("iColor", _), v.setAttribute("iLayer", new t.InstancedBufferAttribute(x, 1)), v.instanceCount = n, v.boundingSphere = new t.Sphere(new t.Vector3(0, 0, 0), (e.maxAbs || 1) * 2);
353
- const F = new t.RawShaderMaterial({
274
+ p.setAttribute("iColor", _), p.setAttribute("iLayer", new t.InstancedBufferAttribute(x, 1)), p.instanceCount = n, p.boundingSphere = new t.Sphere(new t.Vector3(0, 0, 0), (e.maxAbs || 1) * 2);
275
+ const M = new t.RawShaderMaterial({
354
276
  vertexShader: zt,
355
- fragmentShader: Bt,
277
+ fragmentShader: Wt,
356
278
  glslVersion: t.GLSL3,
357
279
  side: t.DoubleSide,
358
- uniforms: { uLayerLo: { value: 0 }, uLayerHi: { value: Math.max(0, l - 1) } }
359
- }), V = new t.Mesh(v, F);
360
- V.frustumCulled = !1;
361
- const M = new t.BufferGeometry();
362
- M.setAttribute("position", new t.BufferAttribute(f, 3));
363
- const W = new t.LineBasicMaterial({ color: Pt.travel, transparent: !0, opacity: 0.6 }), g = new t.LineSegments(M, W);
280
+ uniforms: { uLayerLo: { value: 0 }, uLayerHi: { value: Math.max(0, c - 1) } }
281
+ }), O = new t.Mesh(p, M);
282
+ O.frustumCulled = !1;
283
+ const N = new t.BufferGeometry();
284
+ N.setAttribute("position", new t.BufferAttribute(f, 3));
285
+ const z = new t.LineBasicMaterial({ color: Vt.travel, transparent: !0, opacity: 0.6 }), g = new t.LineSegments(N, z);
364
286
  g.visible = !1, g.frustumCulled = !1;
365
- const C = (s, p) => {
366
- const A = Math.max(0, l - 1), S = Math.max(0, Math.min(s | 0, A)), I = Math.max(S, Math.min(p | 0, A));
367
- F.uniforms.uLayerLo.value = S, F.uniforms.uLayerHi.value = I;
368
- const T = u[S] * 2, z = u[I + 1] * 2;
369
- M.setDrawRange(T, Math.max(0, z - T));
287
+ const C = (a, m) => {
288
+ const A = Math.max(0, c - 1), S = Math.max(0, Math.min(a | 0, A)), I = Math.max(S, Math.min(m | 0, A));
289
+ M.uniforms.uLayerLo.value = S, M.uniforms.uLayerHi.value = I;
290
+ const T = h[S] * 2, W = h[I + 1] * 2;
291
+ N.setDrawRange(T, Math.max(0, W - T));
370
292
  };
371
- return C(0, l - 1), {
372
- mesh: V,
293
+ return C(0, c - 1), {
294
+ mesh: O,
373
295
  travLines: g,
374
296
  setLayerRange: C,
375
- setVisibleLayers: (s) => C(0, (s | 0) - 1),
376
- setTravelVisible: (s) => {
377
- g.visible = !!s;
297
+ setVisibleLayers: (a) => C(0, (a | 0) - 1),
298
+ setTravelVisible: (a) => {
299
+ g.visible = !!a;
378
300
  },
379
301
  /** color is Float32Array(nV*4) with the packed value in .r — computeColors' output shape. One instance
380
302
  * takes the colour of its first vertex; the two agree, since a segment is one colour. */
381
- setColors: (s) => {
382
- if (!(!s || s.length < r * 4)) {
383
- for (let p = 0; p < n; p++) b[p] = s[p * 2 * 4];
303
+ setColors: (a) => {
304
+ if (!(!a || a.length < r * 4)) {
305
+ for (let m = 0; m < n; m++) b[m] = a[m * 2 * 4];
384
306
  _.needsUpdate = !0;
385
307
  }
386
308
  },
387
309
  dispose: () => {
388
- v.dispose(), F.dispose(), M.dispose(), W.dispose();
310
+ p.dispose(), M.dispose(), N.dispose(), z.dispose();
389
311
  },
390
312
  nSeg: n,
391
- layerCount: l
313
+ layerCount: c
392
314
  };
393
315
  }
394
316
  export {
395
- xt as DEFAULT_RANGES_COLORS,
396
- gt as TOOL_COLOR,
397
- O as TYPE_COLOR,
398
- Ot as TYPE_LABEL,
399
- Dt as VERTEX_DATA,
317
+ It as DEFAULT_RANGES_COLORS,
318
+ bt as TOOL_COLOR,
319
+ V as TYPE_COLOR,
320
+ Mt as TYPE_LABEL,
321
+ Ut as VERTEX_DATA,
400
322
  At as VIEW_TYPES,
401
- Rt as buildSegmentData,
323
+ jt as buildSegmentData,
402
324
  qt as computeColors,
403
- Lt as hexToRgb,
404
- jt as layerMoveCount,
405
- $t as makeToolpath,
325
+ Nt as hexToRgb,
326
+ Rt as layerMoveCount,
327
+ Jt as makeToolpath,
406
328
  Zt as moveCursor,
407
329
  ot as packColor,
408
- _t as rangeColorAt,
330
+ St as rangeColorAt,
409
331
  Kt as roleRatios,
410
332
  Xt as topMoveLayer
411
333
  };
@@ -0,0 +1,89 @@
1
+ import { U as f } from "./viewer_defaults-B7UUZ582.js";
2
+ const N = {
3
+ 0: [0.35, 0.38, 0.44],
4
+ // travel
5
+ 1: [0.98, 0.45, 0.16],
6
+ // wall
7
+ 2: [0.36, 0.72, 0.94],
8
+ // sparse infill
9
+ 3: [0.2, 0.55, 0.86],
10
+ // solid infill
11
+ 4: [0.62, 0.66, 0.72],
12
+ // skirt / brim
13
+ 5: [0.5, 0.54, 0.6],
14
+ // support
15
+ 6: [0.42, 0.46, 0.52],
16
+ // raft
17
+ 7: [0.96, 0.76, 0.22],
18
+ // gap fill
19
+ 8: [0.88, 0.55, 0.3],
20
+ // thin wall
21
+ 9: [0.3, 0.8, 0.62],
22
+ // bridge
23
+ 10: [0.8, 0.42, 0.72],
24
+ // ironing
25
+ 11: [0.58, 0.5, 0.88]
26
+ // prime tower
27
+ }, T = {
28
+ 0: "Travel",
29
+ 1: "Wall",
30
+ 2: "Sparse",
31
+ 3: "Solid",
32
+ 4: "Skirt",
33
+ 5: "Support",
34
+ 6: "Raft",
35
+ 7: "Gap",
36
+ 8: "Thin",
37
+ 9: "Bridge",
38
+ 10: "Ironing",
39
+ 11: "Prime"
40
+ }, b = [
41
+ [0.9, 0.26, 0.3],
42
+ [0.27, 0.6, 0.93],
43
+ [0.36, 0.78, 0.42],
44
+ [0.98, 0.72, 0.2],
45
+ [0.72, 0.42, 0.9],
46
+ [0.2, 0.78, 0.8],
47
+ [0.95, 0.5, 0.72],
48
+ [0.6, 0.6, 0.64]
49
+ ];
50
+ function m(r) {
51
+ const n = /^#?([0-9a-f]{6})$/i.exec(String(r ?? "").trim());
52
+ if (!n) return m(f);
53
+ const t = parseInt(n[1], 16);
54
+ return [(t >> 16 & 255) / 255, (t >> 8 & 255) / 255, (t & 255) / 255];
55
+ }
56
+ function R(r) {
57
+ const n = (t) => Math.max(0, Math.min(255, Math.round((Number(t) || 0) * 255)));
58
+ return n(r?.[0]) * 65536 + n(r?.[1]) * 256 + n(r?.[2]);
59
+ }
60
+ const O = [
61
+ [0.043, 0.173, 0.478],
62
+ [0.055, 0.325, 0.639],
63
+ [0.067, 0.478, 0.8],
64
+ [0.078, 0.631, 0.961],
65
+ [0.118, 0.749, 0.804],
66
+ [0.157, 0.867, 0.647],
67
+ [0.376, 0.902, 0.4],
68
+ [0.667, 0.898, 0.157],
69
+ [0.988, 0.976, 0.012],
70
+ [0.988, 0.663, 0.012],
71
+ [0.58, 0.149, 0.086]
72
+ ];
73
+ function S(r, n, t, i = O) {
74
+ const o = i.length - 1;
75
+ if (o < 0) return [0, 0, 0];
76
+ if (!Number.isFinite(r) || !Number.isFinite(n) || !Number.isFinite(t) || t <= n || r <= n) return i[0];
77
+ if (r >= t) return i[o];
78
+ const c = (r - n) / (t - n) * o, a = Math.min(o - 1, Math.floor(c)), u = c - a, s = i[a], e = i[a + 1];
79
+ return [s[0] + (e[0] - s[0]) * u, s[1] + (e[1] - s[1]) * u, s[2] + (e[2] - s[2]) * u];
80
+ }
81
+ export {
82
+ O as D,
83
+ b as T,
84
+ N as a,
85
+ T as b,
86
+ m as h,
87
+ R as p,
88
+ S as r
89
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "three-slicer-viewer",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "The three-slicer viewer without the slicer — model loading, G-code parsing, GPU toolpath rendering and the settings transforms, under MIT. Plug a slicer in through the `slicer` prop.",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/types/gcode.d.ts CHANGED
@@ -11,9 +11,35 @@ export interface GcodeLayer {
11
11
 
12
12
  export interface ParseGcodeResult {
13
13
  layers: GcodeLayer[]
14
- stats: { layers: number; path_segments: number; travel_segments: number; tools: number[] }
14
+ stats: {
15
+ layers: number; path_segments: number; travel_segments: number; filament_mm: number
16
+ /** Tool ids that extruded or were selected. Firmware opcodes above T254 (Bambu's T1000, T255, …) are not tools. */
17
+ tools: number[]
18
+ /** Filament length (mm of E) per tool id — the kernel's own stat name. */
19
+ filament_mm_by_tool: number[]
20
+ /** The file's own palette per tool (`; filament_colour` / `; extruder_colour`), null where it names none. */
21
+ colors?: (string | null)[]
22
+ }
15
23
  }
16
24
 
25
+ /**
26
+ * A result's colour list, one entry per tool: its own palette (`stats.colors`), then the session palette, then the
27
+ * categorical stand-in for a tool neither names. What the toolpath is drawn in and what an export states.
28
+ */
29
+ export function resultToolColors(
30
+ stats: { colors?: (string | null)[]; filament_mm_by_tool?: number[] } | null | undefined,
31
+ sessionColors?: string[] | null,
32
+ ): string[]
33
+
34
+ /** A result's G-code as it is saved: `withFilamentColours` over `resultToolColors`. */
35
+ export function exportedGcode(
36
+ result: { gcode: string; stats?: { colors?: (string | null)[]; filament_mm_by_tool?: number[] } },
37
+ sessionColors?: string[] | null,
38
+ ): string
39
+
40
+ /** Appends `; filament_colour = …` unless the text already states a palette. */
41
+ export function withFilamentColours(gcode: string, colors: (string | null | undefined)[]): string
42
+
17
43
  export interface ParseGcodeOptions {
18
44
  /** Used to derive bead width from E when the file has no ;WIDTH: comments. Default 1.75. */
19
45
  filamentDiameter?: number
package/types/viewer.d.ts CHANGED
@@ -81,8 +81,10 @@ export interface ViewportProps {
81
81
  /**
82
82
  * G-code text to render instead of a slice result. Parsed into the same layer stream the kernel produces and
83
83
  * shown on the selected plate; the kernel is never started. While it is set, auto re-slice leaves that plate alone.
84
+ * A `{ plateIndex: text }` map puts each text on its own (0-based) plate, adding plates as needed — the shape an
85
+ * opened `.gcode.3mf` takes. This prop wins over a `.gcode.3mf` the user opens while it is set.
84
86
  */
85
- gcode?: string | null
87
+ gcode?: string | Record<number, string> | null
86
88
  /**
87
89
  * An `.sl1` archive rendered as a raster preview — the SLA half of {@link ViewportProps.gcode}'s contract: it
88
90
  * lands on the selected plate and the kernel is never started. Set both and the G-code wins; one plate holds