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/VIEWER.md +2 -1
- package/dist/gcode_parse.js +118 -76
- package/dist/index.js +4903 -4163
- package/dist/model_loaders-DxlFNFOu.js +196 -0
- package/dist/model_loaders.js +9 -6
- package/dist/parse_3mf-BZISF3eW.js +327 -0
- package/dist/parse_3mf.worker.js +1 -1
- package/dist/toolpath.js +117 -195
- package/dist/toolpath_palette-B8xEl-qa.js +89 -0
- package/package.json +1 -1
- package/types/gcode.d.ts +27 -1
- package/types/viewer.d.ts +3 -1
- package/dist/model_loaders-aHV5ix50.js +0 -188
- package/dist/parse_3mf-jEUAw8JM.js +0 -300
package/dist/toolpath.js
CHANGED
|
@@ -1,92 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
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(
|
|
85
|
-
function
|
|
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,
|
|
89
|
-
e[n] =
|
|
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
|
|
98
|
-
const n = Array.isArray(t) ? t : [], r = n.length, o = Number(e) > 0 ? Number(e) :
|
|
99
|
-
let
|
|
100
|
-
for (let
|
|
101
|
-
const U = it(n[
|
|
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
|
-
|
|
104
|
-
|
|
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
|
|
107
|
-
let A = !1, S = 0, I = 1 / 0, T = 1 / 0,
|
|
108
|
-
for (let
|
|
109
|
-
const U = n[
|
|
110
|
-
for (let
|
|
111
|
-
const k =
|
|
112
|
-
if (Number.isFinite(X + Z + q + G + Y + H) || (A = !0),
|
|
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[
|
|
118
|
-
Number.isFinite(vt) && (
|
|
119
|
-
const
|
|
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
|
|
122
|
-
b[
|
|
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 >
|
|
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
|
|
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:
|
|
136
|
-
nV:
|
|
137
|
-
nSeg:
|
|
57
|
+
segIndex: p,
|
|
58
|
+
nV: i,
|
|
59
|
+
nSeg: y,
|
|
138
60
|
layerSegPrefix: f,
|
|
139
61
|
travelPos: g,
|
|
140
|
-
travelPrefix:
|
|
141
|
-
nTrav:
|
|
62
|
+
travelPrefix: h,
|
|
63
|
+
nTrav: l,
|
|
142
64
|
movePos: C,
|
|
143
|
-
moveKind:
|
|
144
|
-
movePrefix:
|
|
65
|
+
moveKind: a,
|
|
66
|
+
movePrefix: c,
|
|
145
67
|
layerCount: r,
|
|
146
68
|
maxAbs: S,
|
|
147
69
|
hasNaN: A,
|
|
148
|
-
typeLengths:
|
|
149
|
-
bbox:
|
|
150
|
-
meta: { vType: _, vTool:
|
|
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
|
|
161
|
-
|
|
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,
|
|
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
|
|
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)),
|
|
176
|
-
let f = 0,
|
|
177
|
-
for (let
|
|
178
|
-
t.moveKind[
|
|
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
|
|
102
|
+
const c = s + o - 1;
|
|
181
103
|
return {
|
|
182
|
-
point: [t.movePos[
|
|
104
|
+
point: [t.movePos[c * 3], t.movePos[c * 3 + 1], t.movePos[c * 3 + 2]],
|
|
183
105
|
segCount: f,
|
|
184
|
-
travCount:
|
|
185
|
-
onTravel: t.moveKind[
|
|
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
|
|
201
|
-
const o = e.vType[n],
|
|
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
|
|
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,
|
|
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
|
|
221
|
-
const b = r.vTool ? r.vTool[
|
|
222
|
-
return
|
|
223
|
-
} : (
|
|
224
|
-
for (let
|
|
225
|
-
return { color:
|
|
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
|
|
228
|
-
const
|
|
229
|
-
for (let
|
|
230
|
-
const
|
|
231
|
-
|
|
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(
|
|
234
|
-
for (let
|
|
235
|
-
const
|
|
236
|
-
|
|
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:
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
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
|
-
]),
|
|
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,
|
|
339
|
-
t.push(n, r, o, n, o,
|
|
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
|
|
344
|
-
const { nSeg: n, nV: r, position: o, hwa:
|
|
345
|
-
for (let
|
|
346
|
-
const
|
|
347
|
-
|
|
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
|
|
350
|
-
|
|
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
|
-
|
|
353
|
-
const
|
|
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:
|
|
277
|
+
fragmentShader: Wt,
|
|
356
278
|
glslVersion: t.GLSL3,
|
|
357
279
|
side: t.DoubleSide,
|
|
358
|
-
uniforms: { uLayerLo: { value: 0 }, uLayerHi: { value: Math.max(0,
|
|
359
|
-
}),
|
|
360
|
-
|
|
361
|
-
const
|
|
362
|
-
|
|
363
|
-
const
|
|
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 = (
|
|
366
|
-
const A = Math.max(0,
|
|
367
|
-
|
|
368
|
-
const T =
|
|
369
|
-
|
|
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,
|
|
372
|
-
mesh:
|
|
293
|
+
return C(0, c - 1), {
|
|
294
|
+
mesh: O,
|
|
373
295
|
travLines: g,
|
|
374
296
|
setLayerRange: C,
|
|
375
|
-
setVisibleLayers: (
|
|
376
|
-
setTravelVisible: (
|
|
377
|
-
g.visible = !!
|
|
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: (
|
|
382
|
-
if (!(!
|
|
383
|
-
for (let
|
|
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
|
-
|
|
310
|
+
p.dispose(), M.dispose(), N.dispose(), z.dispose();
|
|
389
311
|
},
|
|
390
312
|
nSeg: n,
|
|
391
|
-
layerCount:
|
|
313
|
+
layerCount: c
|
|
392
314
|
};
|
|
393
315
|
}
|
|
394
316
|
export {
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
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
|
-
|
|
323
|
+
jt as buildSegmentData,
|
|
402
324
|
qt as computeColors,
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
325
|
+
Nt as hexToRgb,
|
|
326
|
+
Rt as layerMoveCount,
|
|
327
|
+
Jt as makeToolpath,
|
|
406
328
|
Zt as moveCursor,
|
|
407
329
|
ot as packColor,
|
|
408
|
-
|
|
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.
|
|
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: {
|
|
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
|