hyperbook 0.98.2 → 0.99.1

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.
@@ -0,0 +1,486 @@
1
+ {
2
+ "deviceName": "Craftbot Plus Pro",
3
+ "new": false,
4
+ "mode": "FDM",
5
+ "internal": 0,
6
+ "bedWidth": 255,
7
+ "bedDepth": 200,
8
+ "bedHeight": 2,
9
+ "maxHeight": 200,
10
+ "bedRound": false,
11
+ "bedBelt": false,
12
+ "deviceZMax": 0,
13
+ "originCenter": false,
14
+ "extrudeAbs": false,
15
+ "spindleMax": 0,
16
+ "gcodeFan": [
17
+ "M106 S{fan_speed}"
18
+ ],
19
+ "gcodeTrack": [
20
+ "M73 P{progress}"
21
+ ],
22
+ "gcodeLayer": [
23
+ ";; LAYER {layer} of {layers}",
24
+ "M117 Layer {layer} of {layers}"
25
+ ],
26
+ "gcodePre": [
27
+ "G21 ; set units to millimeters",
28
+ "G90 ; use absolute coordinates",
29
+ "M83 ; use relative distances for extruder",
30
+ "M106 S0 ; turn off cooling fan",
31
+ "G92 E0 ; zero the extruded length",
32
+ "G1 F1800 ; set feedrate",
33
+ "M104 S{temp} ; set extruder temp",
34
+ "M140 S{bed_temp} ; set bed temp",
35
+ "M190 S{bed_temp} ; wait for bed temp",
36
+ "M109 S{temp} ; wait for extruder temp",
37
+ "G28 ; home all axes",
38
+ "G1 Z15.0 F6000 ; move nozzle away from bed",
39
+ "G1 X0 Y0 ; move to origin",
40
+ "G1 Z0.3 ; lower nozzle to first layer height",
41
+ "G92 E0 ; zero the extruded length again",
42
+ "G1 E5 F50 ; purge a little filament",
43
+ "G92 E0 ; zero the extruded length again",
44
+ "M117 Printing..."
45
+ ],
46
+ "gcodePost": [
47
+ "M104 S0 ; turn off extruder",
48
+ "M140 S0 ; turn off bed",
49
+ "M106 S0 ; turn off fan",
50
+ "G1 E-1 F300 ; retract filament",
51
+ "G1 Z10 F3000 ; raise Z",
52
+ "G28 X Y ; home X and Y",
53
+ "M84 ; disable steppers",
54
+ "M117 Print Done"
55
+ ],
56
+ "gcodeProc": "",
57
+ "gcodeDwell": [],
58
+ "gcodeSpindle": [],
59
+ "gcodeChange": [],
60
+ "gcodeFExt": "gcode",
61
+ "gcodeSpace": true,
62
+ "gcodeStrip": false,
63
+ "gcodeLaserOn": [],
64
+ "gcodeLaserOff": [],
65
+ "extruders": [
66
+ {
67
+ "extFilament": 1.75,
68
+ "extNozzle": 0.4,
69
+ "extOffsetX": 0,
70
+ "extOffsetY": 0
71
+ }
72
+ ],
73
+ "fwRetract": false,
74
+ "profiles": [
75
+ {
76
+ "processName": "Craftbot Plus Pro 0.20mm Standard",
77
+ "sliceHeight": 0.2,
78
+ "sliceShells": 2,
79
+ "sliceShellOrder": "in-out",
80
+ "sliceLayerStart": "center",
81
+ "sliceFillAngle": 45,
82
+ "sliceFillOverlap": 0.35,
83
+ "sliceFillSparse": 0.1,
84
+ "sliceFillType": "hex",
85
+ "sliceAdaptive": false,
86
+ "sliceMinHeight": 0,
87
+ "sliceSupportDensity": 0.2,
88
+ "sliceSupportOffset": 0.4,
89
+ "sliceSupportGap": 0.5,
90
+ "sliceSupportSize": 6,
91
+ "sliceSupportArea": 0.25,
92
+ "sliceSupportExtra": 0,
93
+ "sliceSupportAngle": 60,
94
+ "sliceSupportNozzle": 0,
95
+ "sliceSolidMinArea": 1,
96
+ "sliceSolidLayers": 3,
97
+ "sliceBottomLayers": 3,
98
+ "sliceTopLayers": 4,
99
+ "firstLayerRate": 20,
100
+ "firstLayerPrintMult": 1,
101
+ "firstLayerYOffset": 0,
102
+ "firstLayerBrim": 0,
103
+ "firstLayerBeltLead": 200,
104
+ "firstLayerFanSpeed": 0,
105
+ "outputTemp": 205,
106
+ "outputBedTemp": 60,
107
+ "outputFanSpeed": 255,
108
+ "outputFeedrate": 40,
109
+ "outputFinishrate": 30,
110
+ "outputSeekrate": 150,
111
+ "outputShellMult": 1.05,
112
+ "outputFillMult": 1.1,
113
+ "outputSparseMult": 1.1,
114
+ "outputRetractDist": 1.2,
115
+ "outputRetractSpeed": 80,
116
+ "outputRetractWipe": 2,
117
+ "outputRetractDwell": 0,
118
+ "outputShortPoly": 50,
119
+ "outputMinSpeed": 1,
120
+ "outputCoastDist": 0,
121
+ "outputLayerRetract": false,
122
+ "zHopDistance": 0.12,
123
+ "antiBacklash": 0,
124
+ "sliceFillWidth": 1,
125
+ "sliceFillRate": 0,
126
+ "sliceSupportEnable": false,
127
+ "firstSliceHeight": 0.2,
128
+ "firstLayerFillRate": 35,
129
+ "firstLayerLineMult": 1,
130
+ "firstLayerNozzleTemp": 0,
131
+ "firstLayerBedTemp": 0,
132
+ "firstLayerBrimTrig": 0,
133
+ "firstLayerBrimGap": 0,
134
+ "outputRaft": false,
135
+ "outputRaftSpacing": 0.2,
136
+ "outputBrimCount": 0,
137
+ "outputBrimOffset": 2,
138
+ "outputPurgeTower": 0,
139
+ "outputInvertX": false,
140
+ "outputInvertY": false,
141
+ "arcTolerance": 0,
142
+ "ranges": [],
143
+ "outputLoops": 0,
144
+ "firstLayerBrimIn": 0,
145
+ "firstLayerBeltBump": 0,
146
+ "outputBeltFirst": false,
147
+ "sliceFillRepeat": 4,
148
+ "sliceLineWidth": 0,
149
+ "sliceSupportSpan": 5,
150
+ "sliceSupportOutline": true,
151
+ "firstLayerFlatten": 0,
152
+ "outputDraftShield": false,
153
+ "outputAvoidGaps": true,
154
+ "sliceDetectThin": "off",
155
+ "beltAnchor": 200
156
+ },
157
+ {
158
+ "processName": "Craftbot Plus Pro 0.20mm Fast",
159
+ "sliceHeight": 0.2,
160
+ "sliceShells": 2,
161
+ "sliceShellOrder": "in-out",
162
+ "sliceLayerStart": "center",
163
+ "sliceFillAngle": 45,
164
+ "sliceFillOverlap": 0.35,
165
+ "sliceFillSparse": 0.1,
166
+ "sliceFillType": "hex",
167
+ "sliceAdaptive": false,
168
+ "sliceMinHeight": 0,
169
+ "sliceSupportDensity": 0.2,
170
+ "sliceSupportOffset": 0.4,
171
+ "sliceSupportGap": 0.5,
172
+ "sliceSupportSize": 6,
173
+ "sliceSupportArea": 0.25,
174
+ "sliceSupportExtra": 0,
175
+ "sliceSupportAngle": 60,
176
+ "sliceSupportNozzle": 0,
177
+ "sliceSolidMinArea": 1,
178
+ "sliceSolidLayers": 3,
179
+ "sliceBottomLayers": 3,
180
+ "sliceTopLayers": 4,
181
+ "firstLayerRate": 20,
182
+ "firstLayerPrintMult": 1,
183
+ "firstLayerYOffset": 0,
184
+ "firstLayerBrim": 0,
185
+ "firstLayerBeltLead": 200,
186
+ "firstLayerFanSpeed": 0,
187
+ "outputTemp": 205,
188
+ "outputBedTemp": 60,
189
+ "outputFanSpeed": 255,
190
+ "outputFeedrate": 60,
191
+ "outputFinishrate": 40,
192
+ "outputSeekrate": 200,
193
+ "outputShellMult": 1.05,
194
+ "outputFillMult": 1.15,
195
+ "outputSparseMult": 1.15,
196
+ "outputRetractDist": 1.2,
197
+ "outputRetractSpeed": 80,
198
+ "outputRetractWipe": 2,
199
+ "outputRetractDwell": 0,
200
+ "outputShortPoly": 50,
201
+ "outputMinSpeed": 1,
202
+ "outputCoastDist": 0,
203
+ "outputLayerRetract": false,
204
+ "zHopDistance": 0.12,
205
+ "antiBacklash": 0,
206
+ "sliceFillWidth": 1,
207
+ "sliceFillRate": 0,
208
+ "sliceSupportEnable": false,
209
+ "firstSliceHeight": 0.2,
210
+ "firstLayerFillRate": 35,
211
+ "firstLayerLineMult": 1,
212
+ "firstLayerNozzleTemp": 0,
213
+ "firstLayerBedTemp": 0,
214
+ "firstLayerBrimTrig": 0,
215
+ "firstLayerBrimGap": 0,
216
+ "outputRaft": false,
217
+ "outputRaftSpacing": 0.2,
218
+ "outputBrimCount": 0,
219
+ "outputBrimOffset": 2,
220
+ "outputPurgeTower": 0,
221
+ "outputInvertX": false,
222
+ "outputInvertY": false,
223
+ "arcTolerance": 0,
224
+ "ranges": [],
225
+ "outputLoops": 0,
226
+ "firstLayerBrimIn": 0,
227
+ "firstLayerBeltBump": 0,
228
+ "outputBeltFirst": false,
229
+ "sliceFillRepeat": 4,
230
+ "sliceLineWidth": 0,
231
+ "sliceSupportSpan": 5,
232
+ "sliceSupportOutline": true,
233
+ "firstLayerFlatten": 0,
234
+ "outputDraftShield": false,
235
+ "outputAvoidGaps": true,
236
+ "sliceDetectThin": "off",
237
+ "beltAnchor": 200
238
+ },
239
+ {
240
+ "processName": "Craftbot Plus Pro 0.15mm Draft",
241
+ "sliceHeight": 0.15,
242
+ "sliceShells": 2,
243
+ "sliceShellOrder": "in-out",
244
+ "sliceLayerStart": "center",
245
+ "sliceFillAngle": 45,
246
+ "sliceFillOverlap": 0.35,
247
+ "sliceFillSparse": 0.1,
248
+ "sliceFillType": "hex",
249
+ "sliceAdaptive": false,
250
+ "sliceMinHeight": 0,
251
+ "sliceSupportDensity": 0.2,
252
+ "sliceSupportOffset": 0.4,
253
+ "sliceSupportGap": 0.5,
254
+ "sliceSupportSize": 6,
255
+ "sliceSupportArea": 0.25,
256
+ "sliceSupportExtra": 0,
257
+ "sliceSupportAngle": 60,
258
+ "sliceSupportNozzle": 0,
259
+ "sliceSolidMinArea": 1,
260
+ "sliceSolidLayers": 2,
261
+ "sliceBottomLayers": 2,
262
+ "sliceTopLayers": 3,
263
+ "firstLayerRate": 20,
264
+ "firstLayerPrintMult": 1,
265
+ "firstLayerYOffset": 0,
266
+ "firstLayerBrim": 0,
267
+ "firstLayerBeltLead": 200,
268
+ "firstLayerFanSpeed": 0,
269
+ "outputTemp": 205,
270
+ "outputBedTemp": 60,
271
+ "outputFanSpeed": 255,
272
+ "outputFeedrate": 60,
273
+ "outputFinishrate": 30,
274
+ "outputSeekrate": 200,
275
+ "outputShellMult": 0.92,
276
+ "outputFillMult": 1.1,
277
+ "outputSparseMult": 1.1,
278
+ "outputRetractDist": 1.2,
279
+ "outputRetractSpeed": 80,
280
+ "outputRetractWipe": 2,
281
+ "outputRetractDwell": 0,
282
+ "outputShortPoly": 50,
283
+ "outputMinSpeed": 1,
284
+ "outputCoastDist": 0,
285
+ "outputLayerRetract": false,
286
+ "zHopDistance": 0.12,
287
+ "antiBacklash": 0,
288
+ "sliceFillWidth": 1,
289
+ "sliceFillRate": 0,
290
+ "sliceSupportEnable": false,
291
+ "firstSliceHeight": 0.2,
292
+ "firstLayerFillRate": 35,
293
+ "firstLayerLineMult": 1,
294
+ "firstLayerNozzleTemp": 0,
295
+ "firstLayerBedTemp": 0,
296
+ "firstLayerBrimTrig": 0,
297
+ "firstLayerBrimGap": 0,
298
+ "outputRaft": false,
299
+ "outputRaftSpacing": 0.2,
300
+ "outputBrimCount": 0,
301
+ "outputBrimOffset": 2,
302
+ "outputPurgeTower": 0,
303
+ "outputInvertX": false,
304
+ "outputInvertY": false,
305
+ "arcTolerance": 0,
306
+ "ranges": [],
307
+ "outputLoops": 0,
308
+ "firstLayerBrimIn": 0,
309
+ "firstLayerBeltBump": 0,
310
+ "outputBeltFirst": false,
311
+ "sliceFillRepeat": 4,
312
+ "sliceLineWidth": 0.5,
313
+ "sliceSupportSpan": 5,
314
+ "sliceSupportOutline": true,
315
+ "firstLayerFlatten": 0,
316
+ "outputDraftShield": false,
317
+ "outputAvoidGaps": true,
318
+ "sliceDetectThin": "off",
319
+ "beltAnchor": 200
320
+ },
321
+ {
322
+ "processName": "Craftbot Plus Pro 0.30mm Standard 0.6mm",
323
+ "sliceHeight": 0.3,
324
+ "sliceShells": 2,
325
+ "sliceShellOrder": "in-out",
326
+ "sliceLayerStart": "center",
327
+ "sliceFillAngle": 45,
328
+ "sliceFillOverlap": 0.35,
329
+ "sliceFillSparse": 0.1,
330
+ "sliceFillType": "hex",
331
+ "sliceAdaptive": false,
332
+ "sliceMinHeight": 0,
333
+ "sliceSupportDensity": 0.2,
334
+ "sliceSupportOffset": 0.4,
335
+ "sliceSupportGap": 0.5,
336
+ "sliceSupportSize": 6,
337
+ "sliceSupportArea": 0.25,
338
+ "sliceSupportExtra": 0,
339
+ "sliceSupportAngle": 60,
340
+ "sliceSupportNozzle": 0,
341
+ "sliceSolidMinArea": 1,
342
+ "sliceSolidLayers": 3,
343
+ "sliceBottomLayers": 2,
344
+ "sliceTopLayers": 3,
345
+ "firstLayerRate": 20,
346
+ "firstLayerPrintMult": 1,
347
+ "firstLayerYOffset": 0,
348
+ "firstLayerBrim": 0,
349
+ "firstLayerBeltLead": 200,
350
+ "firstLayerFanSpeed": 0,
351
+ "outputTemp": 215,
352
+ "outputBedTemp": 65,
353
+ "outputFanSpeed": 255,
354
+ "outputFeedrate": 40,
355
+ "outputFinishrate": 25,
356
+ "outputSeekrate": 150,
357
+ "outputShellMult": 1.05,
358
+ "outputFillMult": 1.1,
359
+ "outputSparseMult": 1.1,
360
+ "outputRetractDist": 2,
361
+ "outputRetractSpeed": 80,
362
+ "outputRetractWipe": 2,
363
+ "outputRetractDwell": 0,
364
+ "outputShortPoly": 50,
365
+ "outputMinSpeed": 1,
366
+ "outputCoastDist": 0,
367
+ "outputLayerRetract": false,
368
+ "zHopDistance": 0.12,
369
+ "antiBacklash": 0,
370
+ "sliceFillWidth": 1,
371
+ "sliceFillRate": 0,
372
+ "sliceSupportEnable": false,
373
+ "firstSliceHeight": 0.3,
374
+ "firstLayerFillRate": 35,
375
+ "firstLayerLineMult": 1,
376
+ "firstLayerNozzleTemp": 0,
377
+ "firstLayerBedTemp": 0,
378
+ "firstLayerBrimTrig": 0,
379
+ "firstLayerBrimGap": 0,
380
+ "outputRaft": false,
381
+ "outputRaftSpacing": 0.2,
382
+ "outputBrimCount": 0,
383
+ "outputBrimOffset": 2,
384
+ "outputPurgeTower": 0,
385
+ "outputInvertX": false,
386
+ "outputInvertY": false,
387
+ "arcTolerance": 0,
388
+ "ranges": [],
389
+ "outputLoops": 0,
390
+ "firstLayerBrimIn": 0,
391
+ "firstLayerBeltBump": 0,
392
+ "outputBeltFirst": false,
393
+ "sliceFillRepeat": 4,
394
+ "sliceLineWidth": 0,
395
+ "sliceSupportSpan": 5,
396
+ "sliceSupportOutline": true,
397
+ "firstLayerFlatten": 0,
398
+ "outputDraftShield": false,
399
+ "outputAvoidGaps": true,
400
+ "sliceDetectThin": "off",
401
+ "beltAnchor": 200
402
+ },
403
+ {
404
+ "processName": "Craftbot Plus Pro 0.40mm Superdraft 0.6mm",
405
+ "sliceHeight": 0.4,
406
+ "sliceShells": 1,
407
+ "sliceShellOrder": "in-out",
408
+ "sliceLayerStart": "center",
409
+ "sliceFillAngle": 45,
410
+ "sliceFillOverlap": 0.35,
411
+ "sliceFillSparse": 0.2,
412
+ "sliceFillType": "hex",
413
+ "sliceAdaptive": false,
414
+ "sliceMinHeight": 0,
415
+ "sliceSupportDensity": 0.15,
416
+ "sliceSupportOffset": 0.4,
417
+ "sliceSupportGap": 0.5,
418
+ "sliceSupportSize": 8,
419
+ "sliceSupportArea": 0.25,
420
+ "sliceSupportExtra": 0,
421
+ "sliceSupportAngle": 60,
422
+ "sliceSupportNozzle": 0,
423
+ "sliceSolidMinArea": 1,
424
+ "sliceSolidLayers": 2,
425
+ "sliceBottomLayers": 1,
426
+ "sliceTopLayers": 2,
427
+ "firstLayerRate": 25,
428
+ "firstLayerPrintMult": 1,
429
+ "firstLayerYOffset": 0,
430
+ "firstLayerBrim": 0,
431
+ "firstLayerBeltLead": 200,
432
+ "firstLayerFanSpeed": 0,
433
+ "outputTemp": 220,
434
+ "outputBedTemp": 70,
435
+ "outputFanSpeed": 200,
436
+ "outputFeedrate": 80,
437
+ "outputFinishrate": 40,
438
+ "outputSeekrate": 200,
439
+ "outputShellMult": 1.1,
440
+ "outputFillMult": 1.2,
441
+ "outputSparseMult": 1.2,
442
+ "outputRetractDist": 2,
443
+ "outputRetractSpeed": 80,
444
+ "outputRetractWipe": 2,
445
+ "outputRetractDwell": 0,
446
+ "outputShortPoly": 50,
447
+ "outputMinSpeed": 1,
448
+ "outputCoastDist": 0,
449
+ "outputLayerRetract": false,
450
+ "zHopDistance": 0,
451
+ "antiBacklash": 0,
452
+ "sliceFillWidth": 1,
453
+ "sliceFillRate": 0,
454
+ "sliceSupportEnable": false,
455
+ "firstSliceHeight": 0.4,
456
+ "firstLayerFillRate": 40,
457
+ "firstLayerLineMult": 1,
458
+ "firstLayerNozzleTemp": 0,
459
+ "firstLayerBedTemp": 0,
460
+ "firstLayerBrimTrig": 0,
461
+ "firstLayerBrimGap": 0,
462
+ "outputRaft": false,
463
+ "outputRaftSpacing": 0.2,
464
+ "outputBrimCount": 0,
465
+ "outputBrimOffset": 2,
466
+ "outputPurgeTower": 0,
467
+ "outputInvertX": false,
468
+ "outputInvertY": false,
469
+ "arcTolerance": 0,
470
+ "ranges": [],
471
+ "outputLoops": 0,
472
+ "firstLayerBrimIn": 0,
473
+ "firstLayerBeltBump": 0,
474
+ "outputBeltFirst": false,
475
+ "sliceFillRepeat": 2,
476
+ "sliceLineWidth": 0,
477
+ "sliceSupportSpan": 8,
478
+ "sliceSupportOutline": false,
479
+ "firstLayerFlatten": 0,
480
+ "outputDraftShield": false,
481
+ "outputAvoidGaps": true,
482
+ "sliceDetectThin": "off",
483
+ "beltAnchor": 200
484
+ }
485
+ ]
486
+ }
@@ -0,0 +1,30 @@
1
+ .directive-kirimoto {
2
+ border: 1px solid var(--color-spacer);
3
+ border-radius: 8px;
4
+ overflow: hidden;
5
+ display: flex;
6
+ flex-direction: column;
7
+ height: var(--kirimoto-height, calc(100vh - 60px));
8
+ }
9
+
10
+ .directive-kirimoto iframe {
11
+ flex: 1;
12
+ min-height: 0;
13
+ width: 100%;
14
+ border: none;
15
+ }
16
+
17
+ .directive-kirimoto .menu {
18
+ display: flex;
19
+ border-top: 1px solid var(--color-spacer);
20
+ }
21
+
22
+ .directive-kirimoto .menu button {
23
+ flex: 1;
24
+ font-size: 0.9rem;
25
+ padding: 0.4rem 0.2rem;
26
+ background: var(--color-nav);
27
+ color: var(--color-text);
28
+ border: none;
29
+ cursor: pointer;
30
+ }
@@ -34436,12 +34436,68 @@ void main() {
34436
34436
  }
34437
34437
  return { vertices, faces, colors };
34438
34438
  };
34439
+ var splitByColor = (vertices, faces, colorCount) => {
34440
+ const groups = Array.from({ length: colorCount }, () => ({ faceIndices: [] }));
34441
+ faces.forEach((face, faceIdx) => {
34442
+ groups[face.colorIndex].faceIndices.push(faceIdx);
34443
+ });
34444
+ return groups.filter((g) => g.faceIndices.length > 0).map(({ faceIndices }, groupIdx) => {
34445
+ const oldToNew = /* @__PURE__ */ new Map();
34446
+ const groupVertices = [];
34447
+ for (const faceIdx of faceIndices) {
34448
+ for (const vIdx of faces[faceIdx].vertices) {
34449
+ if (!oldToNew.has(vIdx)) {
34450
+ oldToNew.set(vIdx, groupVertices.length);
34451
+ groupVertices.push(vertices[vIdx]);
34452
+ }
34453
+ }
34454
+ }
34455
+ const groupFaces = faceIndices.map((faceIdx) => ({
34456
+ ...faces[faceIdx],
34457
+ vertices: faces[faceIdx].vertices.map((vIdx) => oldToNew.get(vIdx))
34458
+ }));
34459
+ return { vertices: groupVertices, faces: groupFaces };
34460
+ });
34461
+ };
34439
34462
  var exportIndexedPolyhedronTo3mf = (polyhedron) => {
34440
- const objectUuid = createUuid();
34441
34463
  const buildUuid = createUuid();
34442
34464
  const extruderIndexByColorIndex = polyhedron.colors.map(
34443
34465
  (_, idx) => idx % PAINT_COLOR_MAP.length
34444
34466
  );
34467
+ const materialsId = 1;
34468
+ const components = splitByColor(polyhedron.vertices, polyhedron.faces, polyhedron.colors.length);
34469
+ const objectXmls = components.map((comp, compIdx) => {
34470
+ const objectId = compIdx + 2;
34471
+ const objectUuid = createUuid();
34472
+ const colorIndex = comp.faces[0]?.colorIndex ?? 0;
34473
+ const paintColor = PAINT_COLOR_MAP[extruderIndexByColorIndex[colorIndex]];
34474
+ return [
34475
+ `<object id="${objectId}" name="OpenSCAD Model ${compIdx + 1}" type="model" p:UUID="${objectUuid}" pid="${materialsId}" pindex="${colorIndex}">`,
34476
+ "<mesh>",
34477
+ "<vertices>",
34478
+ ...comp.vertices.map(
34479
+ (vertex2) => `<vertex x="${vertex2.x}" y="${vertex2.y}" z="${vertex2.z}" />`
34480
+ ),
34481
+ "</vertices>",
34482
+ "<triangles>",
34483
+ ...comp.faces.map((face) => {
34484
+ const [v1, v2, v3] = face.vertices;
34485
+ const attrs = [`v1="${v1}"`, `v2="${v2}"`, `v3="${v3}"`];
34486
+ if (paintColor) {
34487
+ attrs.push(`paint_color="${paintColor}"`);
34488
+ }
34489
+ return `<triangle ${attrs.join(" ")} />`;
34490
+ }),
34491
+ "</triangles>",
34492
+ "</mesh>",
34493
+ "</object>"
34494
+ ].join("\n");
34495
+ });
34496
+ const buildItems = components.map((_, compIdx) => {
34497
+ const objectId = compIdx + 2;
34498
+ const objectUuid = createUuid();
34499
+ return `<item objectid="${objectId}" p:UUID="${objectUuid}"/>`;
34500
+ });
34445
34501
  const modelXml = [
34446
34502
  '<?xml version="1.0" encoding="utf-8"?>',
34447
34503
  '<model unit="millimeter" xml:lang="en-US" xmlns="http://schemas.microsoft.com/3dmanufacturing/core/2015/02" xmlns:p="http://schemas.microsoft.com/3dmanufacturing/production/2015/06">',
@@ -34449,37 +34505,15 @@ void main() {
34449
34505
  '<meta name="slic3rpe:Version3mf" value="1"/>',
34450
34506
  '<meta name="slic3rpe:MmPaintingVersion" value="1"/>',
34451
34507
  "<resources>",
34452
- '<basematerials id="2">',
34508
+ `<basematerials id="${materialsId}">`,
34453
34509
  ...polyhedron.colors.map(
34454
34510
  (color, i) => `<base name="color_${i}" displaycolor="${colorToDisplayColor(color)}"/>`
34455
34511
  ),
34456
34512
  "</basematerials>",
34457
- `<object id="1" name="OpenSCAD Model" type="model" p:UUID="${objectUuid}" pid="2" pindex="0">`,
34458
- "<mesh>",
34459
- "<vertices>",
34460
- ...polyhedron.vertices.map(
34461
- (vertex2) => `<vertex x="${vertex2.x}" y="${vertex2.y}" z="${vertex2.z}" />`
34462
- ),
34463
- "</vertices>",
34464
- "<triangles>",
34465
- ...polyhedron.faces.map((face) => {
34466
- const [v1, v2, v3] = face.vertices;
34467
- const attrs = [`v1="${v1}"`, `v2="${v2}"`, `v3="${v3}"`];
34468
- if (face.colorIndex > 0) {
34469
- attrs.push(`pid="2"`, `p1="${face.colorIndex}"`);
34470
- }
34471
- const paintColor = PAINT_COLOR_MAP[extruderIndexByColorIndex[face.colorIndex]];
34472
- if (paintColor) {
34473
- attrs.push(`paint_color="${paintColor}"`);
34474
- }
34475
- return `<triangle ${attrs.join(" ")} />`;
34476
- }),
34477
- "</triangles>",
34478
- "</mesh>",
34479
- "</object>",
34513
+ ...objectXmls,
34480
34514
  "</resources>",
34481
34515
  `<build p:UUID="${buildUuid}">`,
34482
- `<item objectid="1" p:UUID="${objectUuid}"/>`,
34516
+ ...buildItems,
34483
34517
  "</build>",
34484
34518
  "</model>"
34485
34519
  ].join("\n");