three-slicer-viewer 0.3.0 → 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/README.md +4 -4
- package/TOOLPATH_SPEC.md +2 -2
- package/VIEWER.md +66 -1
- package/dist/components.js +102 -111
- package/dist/gcode_parse.js +190 -146
- package/dist/index.js +5060 -4324
- package/dist/model_loaders-DxlFNFOu.js +196 -0
- package/dist/model_loaders.js +15 -181
- package/dist/parse_3mf-BZISF3eW.js +327 -0
- package/dist/parse_3mf.worker.js +1 -1
- package/dist/shadow_host-CQ3LirzD.js +16 -0
- package/dist/sl1_encode.worker.js +1 -1
- package/dist/{sl1_write-CvrNejbW.js → sl1_write-BovHbg3k.js} +66 -65
- package/dist/sla_reconstruct-CRZ3TrI1.js +178 -0
- package/dist/sla_reconstruct.worker.js +1 -1
- package/dist/sla_slice.worker.js +22 -21
- package/dist/theme-2oyfMuvf.js +97 -0
- package/dist/toolpath.js +138 -213
- package/dist/toolpath_encoding-BuYs95qZ.js +23 -0
- package/dist/toolpath_palette-B8xEl-qa.js +89 -0
- package/dist/viewer_defaults-B7UUZ582.js +28 -0
- package/package.json +30 -5
- package/src/settings/index.js +2 -0
- package/src/settings/kernel_defaults.js +144 -0
- package/src/settings/settings_core.js +114 -131
- package/types/gcode.d.ts +27 -1
- package/types/settings.d.ts +12 -0
- package/types/viewer.d.ts +3 -1
- package/dist/parse_3mf-CQ5rAX6P.js +0 -299
- package/dist/sla_reconstruct-CXkYhux2.js +0 -176
package/dist/gcode_parse.js
CHANGED
|
@@ -1,190 +1,234 @@
|
|
|
1
|
-
|
|
1
|
+
import { D as Lt, a as Nt } from "./viewer_defaults-B7UUZ582.js";
|
|
2
|
+
import { R as t, e as Z } from "./toolpath_encoding-BuYs95qZ.js";
|
|
3
|
+
import { T as ft } from "./toolpath_palette-B8xEl-qa.js";
|
|
4
|
+
const F = 1e-6, Rt = 254, It = /^(filament|extruder)_colour\s*=\s*(.*)$/i, ut = (i) => i.split(/[;,]/).map((r) => {
|
|
5
|
+
const s = /^"?#?([0-9a-f]{6})(?:[0-9a-f]{2})?"?$/i.exec(r.trim());
|
|
6
|
+
return s ? "#" + s[1].toUpperCase() : null;
|
|
7
|
+
}), At = (i) => "#" + ft[i % ft.length].map((r) => Math.round(r * 255).toString(16).padStart(2, "0")).join("");
|
|
8
|
+
function gt(i, r) {
|
|
9
|
+
let s = [];
|
|
10
|
+
Array.isArray(i?.colors) && (s = i.colors);
|
|
11
|
+
const g = r ?? [], u = Math.max(s.length, g.length, i?.filament_mm_by_tool?.length ?? 0);
|
|
12
|
+
return Array.from({ length: u }, (m, c) => s[c] || g[c] || At(c));
|
|
13
|
+
}
|
|
14
|
+
function wt(i, r) {
|
|
15
|
+
return dt(i.gcode, gt(i.stats, r));
|
|
16
|
+
}
|
|
17
|
+
function dt(i, r) {
|
|
18
|
+
const s = String(i ?? ""), g = [r].flat().filter(Boolean);
|
|
19
|
+
if (!g.length || /^;\s*filament_colour\s*=/mi.test(s)) return s;
|
|
20
|
+
const u = "; filament_colour = " + g.join(";") + `
|
|
21
|
+
`, m = s.lastIndexOf(`
|
|
22
|
+
; CONFIG_BLOCK_END`);
|
|
23
|
+
if (m >= 0) return s.slice(0, m + 1) + u + s.slice(m + 1);
|
|
24
|
+
let c = `
|
|
25
|
+
`;
|
|
26
|
+
return (!s || s.endsWith(`
|
|
27
|
+
`)) && (c = ""), s + c + u;
|
|
28
|
+
}
|
|
29
|
+
const St = {
|
|
2
30
|
// OrcaSlicer / PrusaSlicer ;TYPE: names
|
|
3
|
-
"outer wall":
|
|
4
|
-
"external perimeter":
|
|
5
|
-
"inner wall":
|
|
6
|
-
perimeter:
|
|
7
|
-
"internal perimeter":
|
|
8
|
-
"overhang wall":
|
|
9
|
-
"overhang perimeter":
|
|
10
|
-
"sparse infill":
|
|
11
|
-
"internal infill":
|
|
12
|
-
"solid infill":
|
|
13
|
-
"internal solid infill":
|
|
14
|
-
"top solid infill":
|
|
15
|
-
"top surface":
|
|
16
|
-
"bottom surface":
|
|
17
|
-
skirt:
|
|
18
|
-
brim:
|
|
19
|
-
"skirt/brim":
|
|
20
|
-
support:
|
|
21
|
-
"support material":
|
|
22
|
-
"support material interface":
|
|
23
|
-
"support interface":
|
|
24
|
-
"support transition":
|
|
25
|
-
raft:
|
|
26
|
-
"gap fill":
|
|
27
|
-
"gap infill":
|
|
28
|
-
"thin wall":
|
|
29
|
-
bridge:
|
|
30
|
-
"bridge infill":
|
|
31
|
-
"internal bridge":
|
|
32
|
-
"internal bridge infill":
|
|
33
|
-
ironing:
|
|
34
|
-
"prime tower":
|
|
35
|
-
"wipe tower":
|
|
36
|
-
custom:
|
|
31
|
+
"outer wall": t.WALL,
|
|
32
|
+
"external perimeter": t.WALL,
|
|
33
|
+
"inner wall": t.WALL,
|
|
34
|
+
perimeter: t.WALL,
|
|
35
|
+
"internal perimeter": t.WALL,
|
|
36
|
+
"overhang wall": t.WALL,
|
|
37
|
+
"overhang perimeter": t.WALL,
|
|
38
|
+
"sparse infill": t.SPARSE,
|
|
39
|
+
"internal infill": t.SPARSE,
|
|
40
|
+
"solid infill": t.SOLID,
|
|
41
|
+
"internal solid infill": t.SOLID,
|
|
42
|
+
"top solid infill": t.SOLID,
|
|
43
|
+
"top surface": t.SOLID,
|
|
44
|
+
"bottom surface": t.SOLID,
|
|
45
|
+
skirt: t.SKIRT,
|
|
46
|
+
brim: t.SKIRT,
|
|
47
|
+
"skirt/brim": t.SKIRT,
|
|
48
|
+
support: t.SUPPORT,
|
|
49
|
+
"support material": t.SUPPORT,
|
|
50
|
+
"support material interface": t.SUPPORT,
|
|
51
|
+
"support interface": t.SUPPORT,
|
|
52
|
+
"support transition": t.SUPPORT,
|
|
53
|
+
raft: t.RAFT,
|
|
54
|
+
"gap fill": t.GAP,
|
|
55
|
+
"gap infill": t.GAP,
|
|
56
|
+
"thin wall": t.THIN,
|
|
57
|
+
bridge: t.BRIDGE,
|
|
58
|
+
"bridge infill": t.BRIDGE,
|
|
59
|
+
"internal bridge": t.BRIDGE,
|
|
60
|
+
"internal bridge infill": t.BRIDGE,
|
|
61
|
+
ironing: t.IRONING,
|
|
62
|
+
"prime tower": t.PRIME,
|
|
63
|
+
"wipe tower": t.PRIME,
|
|
64
|
+
custom: t.WALL,
|
|
37
65
|
// Cura ;TYPE: names
|
|
38
|
-
"wall-outer":
|
|
39
|
-
"wall-inner":
|
|
40
|
-
fill:
|
|
41
|
-
skin:
|
|
42
|
-
"support-interface":
|
|
43
|
-
"prime-tower":
|
|
44
|
-
},
|
|
45
|
-
["skirt/brim",
|
|
46
|
-
["skirt",
|
|
47
|
-
["walls",
|
|
48
|
-
["thin-wall",
|
|
49
|
-
["gap-fill",
|
|
50
|
-
["bridge",
|
|
51
|
-
["ironing",
|
|
52
|
-
["support",
|
|
53
|
-
["prime tower",
|
|
54
|
-
["wipe_tower_real",
|
|
55
|
-
],
|
|
56
|
-
1:
|
|
57
|
-
2:
|
|
58
|
-
3:
|
|
59
|
-
4:
|
|
60
|
-
5:
|
|
61
|
-
6:
|
|
62
|
-
7:
|
|
63
|
-
8:
|
|
64
|
-
9:
|
|
65
|
-
10:
|
|
66
|
-
11:
|
|
67
|
-
12:
|
|
68
|
-
13:
|
|
69
|
-
14:
|
|
70
|
-
15:
|
|
71
|
-
16:
|
|
72
|
-
17:
|
|
66
|
+
"wall-outer": t.WALL,
|
|
67
|
+
"wall-inner": t.WALL,
|
|
68
|
+
fill: t.SPARSE,
|
|
69
|
+
skin: t.SOLID,
|
|
70
|
+
"support-interface": t.SUPPORT,
|
|
71
|
+
"prime-tower": t.PRIME
|
|
72
|
+
}, Pt = [
|
|
73
|
+
["skirt/brim", t.SKIRT],
|
|
74
|
+
["skirt", t.SKIRT],
|
|
75
|
+
["walls", t.WALL],
|
|
76
|
+
["thin-wall", t.THIN],
|
|
77
|
+
["gap-fill", t.GAP],
|
|
78
|
+
["bridge", t.BRIDGE],
|
|
79
|
+
["ironing", t.IRONING],
|
|
80
|
+
["support", t.SUPPORT],
|
|
81
|
+
["prime tower", t.PRIME],
|
|
82
|
+
["wipe_tower_real", t.PRIME]
|
|
83
|
+
], Et = (i, r) => i === r || r.length < i.length && " (:/".includes(i[r.length]) && i.startsWith(r), Ot = {
|
|
84
|
+
1: t.WALL,
|
|
85
|
+
2: t.WALL,
|
|
86
|
+
3: t.WALL,
|
|
87
|
+
4: t.SPARSE,
|
|
88
|
+
5: t.SOLID,
|
|
89
|
+
6: t.SOLID,
|
|
90
|
+
7: t.SOLID,
|
|
91
|
+
8: t.IRONING,
|
|
92
|
+
9: t.BRIDGE,
|
|
93
|
+
10: t.BRIDGE,
|
|
94
|
+
11: t.GAP,
|
|
95
|
+
12: t.SKIRT,
|
|
96
|
+
13: t.SKIRT,
|
|
97
|
+
14: t.SUPPORT,
|
|
98
|
+
15: t.SUPPORT,
|
|
99
|
+
16: t.SUPPORT,
|
|
100
|
+
17: t.PRIME
|
|
73
101
|
};
|
|
74
|
-
function
|
|
75
|
-
const
|
|
76
|
-
let
|
|
77
|
-
const
|
|
78
|
-
let
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
102
|
+
function Gt(i, r = {}) {
|
|
103
|
+
const s = Math.PI / 4 * (r.filamentDiameter > 0 ? r.filamentDiameter : Lt) ** 2, g = r.defaultLayerHeight > 0 ? r.defaultLayerHeight : Nt;
|
|
104
|
+
let u = 0, m = 0, c = 0, b = 0, _ = !0, W = !0, d = 0, w = t.WALL, y = 0, R = null;
|
|
105
|
+
const E = [];
|
|
106
|
+
let D = !1, x = !0, K = NaN, q = 0, X = 0, $ = 0;
|
|
107
|
+
const v = /* @__PURE__ */ new Set([0]), H = [];
|
|
108
|
+
let z = [], k = [], j = !1;
|
|
109
|
+
const V = () => {
|
|
110
|
+
w = t.WALL, y = 0;
|
|
111
|
+
}, U = (o, a = !1) => {
|
|
112
|
+
R = { z: o, p: [], w: [] }, E.push(R), x = !1, K = NaN, (a || !j) && V();
|
|
113
|
+
}, mt = () => E.length > 1 ? E[E.length - 2].z : 0, J = (o, a, S, P, A, n, e) => {
|
|
114
|
+
const p = Math.hypot(P - o, A - a, n - S);
|
|
115
|
+
if (!(p < F))
|
|
116
|
+
if (e > F) {
|
|
117
|
+
$ += e, H[d] = (H[d] ?? 0) + e, x ? U(Number.isNaN(K) ? n : K) : !D && n > R.z + 1e-3 && U(n);
|
|
118
|
+
const h = Z(w, d);
|
|
119
|
+
R.p.push(o, a, S, h, P, A, n, h);
|
|
120
|
+
const f = Math.max(0.02, R.z - mt() || g), L = y > 0 ? y : e * s / (p * f) + f * (1 - Math.PI / 4);
|
|
121
|
+
R.w.push(Math.min(3, Math.max(0.05, L))), q++;
|
|
122
|
+
} else R && (R.p.push(o, a, S, Z(t.TRAVEL, d), P, A, n, Z(t.TRAVEL, d)), R.w.push(0), X++);
|
|
91
123
|
};
|
|
92
|
-
for (const
|
|
124
|
+
for (const o of i.split(`
|
|
93
125
|
`)) {
|
|
94
|
-
const
|
|
95
|
-
if (
|
|
96
|
-
const
|
|
97
|
-
if (
|
|
98
|
-
|
|
126
|
+
const a = o.indexOf(";"), S = (a < 0 ? o : o.slice(0, a)).trim(), P = a < 0 ? "" : o.slice(a + 1).trim();
|
|
127
|
+
if (P && !S) {
|
|
128
|
+
const e = P.toLowerCase(), p = It.exec(P);
|
|
129
|
+
if (p) {
|
|
130
|
+
p[1].toLowerCase() === "filament" ? z = ut(p[2]) : k = ut(p[2]);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (e.startsWith("type:")) {
|
|
134
|
+
w = St[e.slice(5).trim()] ?? t.WALL, j = !0;
|
|
99
135
|
continue;
|
|
100
136
|
}
|
|
101
|
-
if (
|
|
102
|
-
|
|
137
|
+
if (e.startsWith("_extrusion_role:")) {
|
|
138
|
+
w = Ot[parseInt(e.slice(16), 10)] ?? t.WALL, j = !0;
|
|
103
139
|
continue;
|
|
104
140
|
}
|
|
105
|
-
if (
|
|
106
|
-
const
|
|
107
|
-
|
|
141
|
+
if (e.startsWith("width:")) {
|
|
142
|
+
const L = parseFloat(e.slice(6));
|
|
143
|
+
y = L > 0 ? L : 0;
|
|
108
144
|
continue;
|
|
109
145
|
}
|
|
110
|
-
if (
|
|
111
|
-
|
|
146
|
+
if (e.startsWith("layer_change") || e.startsWith("layer:")) {
|
|
147
|
+
D = !0, x = !0, V();
|
|
112
148
|
continue;
|
|
113
149
|
}
|
|
114
|
-
if (
|
|
115
|
-
const
|
|
116
|
-
|
|
150
|
+
if (e.startsWith("z:")) {
|
|
151
|
+
const L = parseFloat(e.slice(2));
|
|
152
|
+
x && L > 0 && (D = !0, U(L));
|
|
117
153
|
continue;
|
|
118
154
|
}
|
|
119
|
-
const
|
|
120
|
-
if (
|
|
121
|
-
|
|
155
|
+
const h = /^layer \d+ z([-\d.]+)/.exec(e);
|
|
156
|
+
if (h) {
|
|
157
|
+
D = !0, U(parseFloat(h[1]), !0);
|
|
122
158
|
continue;
|
|
123
159
|
}
|
|
124
|
-
const
|
|
125
|
-
|
|
160
|
+
const f = Pt.find(([L]) => Et(e, L));
|
|
161
|
+
f && (w = f[1]);
|
|
126
162
|
continue;
|
|
127
163
|
}
|
|
128
|
-
if (!
|
|
129
|
-
const
|
|
130
|
-
if (
|
|
131
|
-
|
|
164
|
+
if (!S) continue;
|
|
165
|
+
const A = S.split(/\s+/), n = A[0].toUpperCase();
|
|
166
|
+
if (n === "G90") {
|
|
167
|
+
_ = !0;
|
|
132
168
|
continue;
|
|
133
169
|
}
|
|
134
|
-
if (
|
|
135
|
-
|
|
170
|
+
if (n === "G91") {
|
|
171
|
+
_ = !1;
|
|
136
172
|
continue;
|
|
137
173
|
}
|
|
138
|
-
if (
|
|
139
|
-
|
|
174
|
+
if (n === "M82") {
|
|
175
|
+
W = !0;
|
|
140
176
|
continue;
|
|
141
177
|
}
|
|
142
|
-
if (
|
|
143
|
-
|
|
178
|
+
if (n === "M83") {
|
|
179
|
+
W = !1;
|
|
144
180
|
continue;
|
|
145
181
|
}
|
|
146
|
-
if (/^T\d+$/.test(
|
|
147
|
-
|
|
182
|
+
if (/^T\d+$/.test(n)) {
|
|
183
|
+
const e = parseInt(n.slice(1), 10);
|
|
184
|
+
e <= Rt && (d = e, v.add(d));
|
|
148
185
|
continue;
|
|
149
186
|
}
|
|
150
|
-
if (
|
|
151
|
-
let
|
|
152
|
-
for (let
|
|
153
|
-
const
|
|
154
|
-
Number.isNaN(
|
|
187
|
+
if (n === "G92" || n === "G0" || n === "G1" || n === "G2" || n === "G3") {
|
|
188
|
+
let e = NaN, p = NaN, h = NaN, f = NaN, L = 0, tt = 0;
|
|
189
|
+
for (let I = 1; I < A.length; I++) {
|
|
190
|
+
const l = A[I][0], N = parseFloat(A[I].slice(1));
|
|
191
|
+
Number.isNaN(N) || (l === "X" || l === "x" ? e = N : l === "Y" || l === "y" ? p = N : l === "Z" || l === "z" ? h = N : l === "E" || l === "e" ? f = N : l === "I" || l === "i" ? L = N : (l === "J" || l === "j") && (tt = N));
|
|
155
192
|
}
|
|
156
|
-
if (
|
|
157
|
-
Number.isNaN(
|
|
193
|
+
if (n === "G92") {
|
|
194
|
+
Number.isNaN(e) || (u = e), Number.isNaN(p) || (m = p), Number.isNaN(h) || (c = h), Number.isNaN(f) || (b = f);
|
|
158
195
|
continue;
|
|
159
196
|
}
|
|
160
|
-
const
|
|
161
|
-
if (
|
|
162
|
-
const
|
|
163
|
-
let
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
const
|
|
167
|
-
let
|
|
168
|
-
for (let
|
|
169
|
-
const
|
|
170
|
-
|
|
197
|
+
const C = Number.isNaN(e) ? u : _ ? e : u + e, B = Number.isNaN(p) ? m : _ ? p : m + p, Y = Number.isNaN(h) ? c : _ ? h : c + h, et = Number.isNaN(f) ? 0 : W ? f - b : f;
|
|
198
|
+
if (n === "G2" || n === "G3") {
|
|
199
|
+
const I = u + L, l = m + tt, N = Math.hypot(u - I, m - l), G = Math.atan2(m - l, u - I);
|
|
200
|
+
let O = Math.atan2(B - l, C - I);
|
|
201
|
+
const nt = n === "G3";
|
|
202
|
+
nt && O <= G + F && (O += 2 * Math.PI), !nt && O >= G - F && (O -= 2 * Math.PI);
|
|
203
|
+
const M = Math.max(1, Math.min(360, Math.ceil(Math.abs(O - G) * N / 0.3)));
|
|
204
|
+
let it = u, rt = m, ot = c;
|
|
205
|
+
for (let T = 1; T <= M; T++) {
|
|
206
|
+
const st = G + (O - G) * T / M, at = T === M ? C : I + N * Math.cos(st), lt = T === M ? B : l + N * Math.sin(st), ct = c + (Y - c) * T / M;
|
|
207
|
+
J(it, rt, ot, at, lt, ct, et / M), it = at, rt = lt, ot = ct;
|
|
171
208
|
}
|
|
172
209
|
} else
|
|
173
|
-
|
|
174
|
-
|
|
210
|
+
J(u, m, c, C, B, Y, et);
|
|
211
|
+
u = C, m = B, c = Y, Number.isNaN(f) || (b = W ? f : b + f);
|
|
175
212
|
}
|
|
176
213
|
}
|
|
214
|
+
const pt = Math.max(z.length, k.length), Q = Array.from({ length: pt }, (o, a) => k[a] || z[a] || null), ht = Array.from({ length: Math.max(...v) + 1 }, (o, a) => H[a] || 0);
|
|
177
215
|
return {
|
|
178
|
-
layers:
|
|
216
|
+
layers: E.map((o) => ({ z: o.z, paths: Float32Array.from(o.p), widths: Float32Array.from(o.w) })),
|
|
179
217
|
stats: {
|
|
180
|
-
layers:
|
|
218
|
+
layers: E.length,
|
|
181
219
|
path_segments: q,
|
|
182
|
-
travel_segments:
|
|
183
|
-
filament_mm:
|
|
184
|
-
tools: [...
|
|
220
|
+
travel_segments: X,
|
|
221
|
+
filament_mm: $,
|
|
222
|
+
tools: [...v].sort((o, a) => o - a),
|
|
223
|
+
// The kernel's own stat name, so the Filament-view switch and the stats card's per-tool split work unchanged.
|
|
224
|
+
filament_mm_by_tool: ht,
|
|
225
|
+
...Q.some(Boolean) && { colors: Q }
|
|
185
226
|
}
|
|
186
227
|
};
|
|
187
228
|
}
|
|
188
229
|
export {
|
|
189
|
-
|
|
230
|
+
wt as exportedGcode,
|
|
231
|
+
Gt as parseGcode,
|
|
232
|
+
gt as resultToolColors,
|
|
233
|
+
dt as withFilamentColours
|
|
190
234
|
};
|