Skip to content

Commit 38c8d47

Browse files
authored
Merge branch 'develop' into fix/webggl-errors
2 parents 04479a8 + 425922a commit 38c8d47

15 files changed

Lines changed: 164273 additions & 1141 deletions

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,13 @@ Join us on <a href="https://discord.gg/w2bsGRE6S4">discord</a>
1616

1717
## Demo
1818

19-
Click to see the interactive demo:
19+
### Minimal demo
20+
<img width="433" alt="image" src="https://github.com/user-attachments/assets/3b52c7a9-d1c9-41c5-9c41-570e12825aaf" />
21+
22+
try it out: https://codepen.io/remcoder/pen/PwYVXBg
23+
24+
### Batteries included
25+
Click to see the [full-fledged demo](https://gcode-preview.web.app/):
2026

2127
[<img title="click to see the demo" width="320" alt="image" src="https://github.com/user-attachments/assets/4e663193-0a01-4fe2-864b-a8ffb18cbcd8">](https://gcode-preview.web.app/)
2228

demo/gcodes/3DBenchy.gcode

Lines changed: 163473 additions & 0 deletions
Large diffs are not rendered by default.

demo/index.html

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636

3737
<div class="p-1" v-if="model">
3838
<!-- <div>{{layerCount + ' layers'}} / {{fileSize}}</div> -->
39-
<div><a :href="model?.original">{{model?.name ?? fileName}}</a> <br>
40-
<span class="is-size-8">by {{model?.designer}}</span></div>
39+
<div><a :href="model?.original">{{model?.name}}</a> <br>
40+
<span v-if="model?.designer" class="is-size-8">by {{model?.designer}}</span></div>
4141

4242
<div class="license is-size-8">{{model?.license}}</div>
4343
</div>
@@ -243,9 +243,8 @@ <h1 class="text-center m-3 mb-5">GCode Preview
243243
<div class="absolute left bottom m-3 has-text-grey slide-in-up">Drop a gcode file to preview it</div>
244244
<div class="wrapper">
245245
<canvas class="preview" :class="{ 'dragging': settings.dragging }"
246-
@dragover.prevent="dragOver"
247-
@dragleave.prevent="dragLeave"
248-
@drop.prevent="drop"></canvas>
246+
@update.prevent="update"
247+
></canvas>
249248
</div>
250249
</div>
251250
<script type="importmap">

demo/js/app.js

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import { createApp, ref, watch, onMounted, watchEffect } from 'vue';
22
import { presets } from './presets.js';
33
import * as GCodePreview from 'gcode-preview';
44
import { defaultSettings } from './default-settings.js';
5-
import { debounce, humanFileSize, readFile } from './utils.js';
5+
import { debounce, humanFileSize } from './utils.js';
66

7-
const defaultPreset = 'arcs';
7+
const defaultPreset = 'benchy';
88
const preferDarkMode = window.matchMedia('(prefers-color-scheme: dark)');
99
const initialBackgroundColor = preferDarkMode.matches ? '#141414' : '#eee';
1010
const statsContainer = () => document.querySelector('.sidebar');
@@ -20,7 +20,6 @@ export const app = (window.app = createApp({
2020
const thumbnail = ref(null);
2121
const layerCount = ref(0);
2222
const fileSize = ref(0);
23-
const fileName = ref('');
2423
const model = ref(null);
2524
const dragging = ref(false);
2625
const settings = ref(Object.assign({}, defaultSettings));
@@ -36,19 +35,12 @@ export const app = (window.app = createApp({
3635

3736
const removeColor = () => settings.value.colors.pop();
3837

39-
const dragOver = (event) => {
40-
event.dataTransfer.dropEffect = 'copy';
41-
dragging.value = true;
42-
};
43-
44-
const dragLeave = () => (dragging.value = false);
45-
46-
const drop = (event) => {
47-
dragging.value = false;
48-
const file = event.dataTransfer.files[0];
49-
fileName.value = file.name;
50-
model.value = null;
51-
loadDroppedFile(file);
38+
const update = async (evt) => {
39+
model.value = {
40+
name: evt.detail.filename
41+
};
42+
applyDevMode(enableDevMode.value); // HACK: force dev mode to update UI
43+
updateUI();
5244
};
5345

5446
// Update UI with current preview settings
@@ -105,6 +97,8 @@ export const app = (window.app = createApp({
10597

10698
Object.assign(settings.value, currentSettings);
10799
preview.endLayer = countLayers;
100+
101+
applyDevMode(enableDevMode.value);
108102
};
109103

110104
const loadGCodeFromServer = async (filename) => {
@@ -137,34 +131,27 @@ export const app = (window.app = createApp({
137131
preview.render();
138132
return;
139133
}
140-
await preview.renderAnimated(preview.job.paths.length / 60);
134+
await preview.renderAnimated();
141135
} else {
142136
preview.render();
143137
}
144138
});
145139
};
146140

147-
const loadDroppedFile = async (file) => {
148-
fileSize.value = humanFileSize(file.size);
149-
const content = await readFile(file);
150-
applyDevMode(enableDevMode.value); // HACK
151-
startLoadingProgressive(content);
152-
applyDevMode(enableDevMode.value);
153-
updateUI();
154-
};
155-
156141
const selectPreset = async (presetName) => {
157142
const canvas = document.querySelector('canvas.preview');
158143
const preset = presets[presetName];
159-
fileName.value = preset.file.split('/').pop();
160144
model.value = preset.model;
161145
const options = Object.assign(
162146
{
163147
canvas,
164148
backgroundColor: initialBackgroundColor
165149
},
166150
defaultSettings,
167-
preset
151+
preset,
152+
{
153+
droppable: true
154+
}
168155
);
169156

170157
// reset previous state
@@ -182,7 +169,7 @@ export const app = (window.app = createApp({
182169
observer = new ResizeObserver(() => preview.resize());
183170
observer.observe(canvas);
184171

185-
applyDevMode(enableDevMode.value);
172+
applyDevMode(enableDevMode.value); // HACK: force dev mode to update UI
186173

187174
await loadGCodeFromServer(preset.file);
188175
applyDevMode(enableDevMode.value);
@@ -245,21 +232,18 @@ export const app = (window.app = createApp({
245232
thumbnail,
246233
layerCount,
247234
fileSize,
248-
fileName,
249235
model,
250236
dragging,
251237
settings,
252238
enableDevMode,
253239
selectTab,
254240
addColor,
255241
removeColor,
256-
dragOver,
257-
dragLeave,
258-
drop,
242+
// drop,
243+
update,
259244
resetUI: updateUI,
260245
loadGCodeFromServer,
261246
startLoadingProgressive,
262-
loadDroppedFile,
263247
selectPreset
264248
};
265249
}

demo/js/presets.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,23 @@
11
export const presets = {
2+
benchy: {
3+
title: '3DBenchy',
4+
file: 'gcodes/3DBenchy.gcode',
5+
model: {
6+
name: '3DBenchy',
7+
designer: 'CreativeTools',
8+
license: 'CC0 - public domain',
9+
original: 'https://www.thingiverse.com/thing:763622'
10+
},
11+
extrusionWidth: 0.45,
12+
lineHeight: 0.2,
13+
extrusionColor: ['#95dfa1'],
14+
travelColor: 'red',
15+
buildVolume: {
16+
x: 180,
17+
y: 180,
18+
z: 0
19+
}
20+
},
221
mach3: {
322
title: 'CNC tool path',
423
file: 'gcodes/mach3.gcode',

demo/js/utils.js

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,3 @@ export function humanFileSize(size) {
1919
var i = Math.floor(Math.log(size) / Math.log(1024));
2020
return (size / Math.pow(1024, i)).toFixed(2) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];
2121
}
22-
23-
export function readFile(file) {
24-
return new Promise((resolve) => {
25-
const reader = new FileReader();
26-
reader.onload = (e) => {
27-
resolve(e.target.result);
28-
};
29-
reader.readAsText(file);
30-
});
31-
}

examples/index.html

Lines changed: 0 additions & 7 deletions
This file was deleted.

examples/simple.html

Lines changed: 0 additions & 56 deletions
This file was deleted.

examples/stream.html

Lines changed: 0 additions & 88 deletions
This file was deleted.

0 commit comments

Comments
 (0)