From 6e2cef6a521fb7b1a23b9923d003e5bc0d9cffd7 Mon Sep 17 00:00:00 2001 From: Jacob Philpott Date: Thu, 11 Dec 2025 12:30:54 +0300 Subject: [PATCH] Add GCodeExporter and external example for Polyslice G-code slicer (#32502) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: jgphilpott <4128208+jgphilpott@users.noreply.github.com> Co-authored-by: Michael Herzog --- examples/files.json | 1 + examples/misc_exporter_gcode.html | 298 +++++++++++++++++++ examples/screenshots/misc_exporter_gcode.jpg | Bin 0 -> 19989 bytes examples/tags.json | 1 + 4 files changed, 300 insertions(+) create mode 100644 examples/misc_exporter_gcode.html create mode 100644 examples/screenshots/misc_exporter_gcode.jpg diff --git a/examples/files.json b/examples/files.json index 99d4bc835b326d..d60578596a4750 100644 --- a/examples/files.json +++ b/examples/files.json @@ -554,6 +554,7 @@ "misc_controls_trackball", "misc_controls_transform", "misc_exporter_draco", + "misc_exporter_gcode", "misc_exporter_gltf", "misc_exporter_obj", "misc_exporter_ply", diff --git a/examples/misc_exporter_gcode.html b/examples/misc_exporter_gcode.html new file mode 100644 index 00000000000000..1224269cec194f --- /dev/null +++ b/examples/misc_exporter_gcode.html @@ -0,0 +1,298 @@ + + + + three.js webgl - exporter - GCode + + + + + +
+ three.js webgl - exporter - GCode +
Slice 3D models to G-code for 3D printing +
Watch the Demo Video +
+ + + + + + + diff --git a/examples/screenshots/misc_exporter_gcode.jpg b/examples/screenshots/misc_exporter_gcode.jpg new file mode 100644 index 0000000000000000000000000000000000000000..85bf3f80ce2a4a78a504324e77364aa4730df278 GIT binary patch literal 19989 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