Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 34 additions & 8 deletions examples/jsm/loaders/GCodeLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ class GCodeLoader extends Loader {
*/
parse( data ) {

let state = { x: 0, y: 0, z: 0, e: 0, f: 0, extruding: false, relative: false };
let state = { x: 0, y: 0, z: 0, e: 0, f: 0, extruding: false, relative: false, extrusionOverride: false, extrusionRelative: false };
const layers = [];

let currentLayer = undefined;
Expand Down Expand Up @@ -147,6 +147,14 @@ class GCodeLoader extends Loader {

}

function absoluteExtrusion( v1, v2 ) {

const relative = state.extrusionOverride ? state.extrusionRelative : state.relative;

return relative ? v1 + v2 : v2;

}

const lines = data.replace( /;.+/g, '' ).split( '\n' );

for ( let i = 0; i < lines.length; i ++ ) {
Expand All @@ -172,13 +180,13 @@ class GCodeLoader extends Loader {
//G0/G1 – Linear Movement
if ( cmd === 'G0' || cmd === 'G1' ) {

const line = {
x: args.x !== undefined ? absolute( state.x, args.x ) : state.x,
y: args.y !== undefined ? absolute( state.y, args.y ) : state.y,
z: args.z !== undefined ? absolute( state.z, args.z ) : state.z,
e: args.e !== undefined ? absolute( state.e, args.e ) : state.e,
f: args.f !== undefined ? absolute( state.f, args.f ) : state.f,
};
const line = Object.assign( {}, state ); // clone state

if ( args.x !== undefined ) line.x = absolute( state.x, args.x );
if ( args.y !== undefined ) line.y = absolute( state.y, args.y );
if ( args.z !== undefined ) line.z = absolute( state.z, args.z );
if ( args.e !== undefined ) line.e = absoluteExtrusion( state.e, args.e );
if ( args.f !== undefined ) line.f = absolute( state.f, args.f );

//Layer change detection is or made by watching Z, it's made by watching when we extrude at a new Z position
if ( delta( state.e, line.e ) > 0 ) {
Expand Down Expand Up @@ -206,11 +214,29 @@ class GCodeLoader extends Loader {
//G90: Set to Absolute Positioning
state.relative = false;

// reset M82/M83 extrusion override
state.extrusionOverride = false;

} else if ( cmd === 'G91' ) {

//G91: Set to state.relative Positioning
state.relative = true;

// reset M82/M83 extrusion override
state.extrusionOverride = false;

} else if ( cmd === 'M82' ) {

//M82: Override G91 and put the E axis into absolute mode independent of the other axes
state.extrusionOverride = true;
state.extrusionRelative = false;

} else if ( cmd === 'M83' ) {

//M83: Overrides G90 and put the E axis into relative mode independent of the other axes
state.extrusionOverride = true;
state.extrusionRelative = true;

} else if ( cmd === 'G92' ) {

//G92: Set Position
Expand Down
39 changes: 39 additions & 0 deletions examples/models/gcode/test_m82.gcode
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
M82
G92
G0 Z1
G1 X10 Y0 E0
G1 X9.95004165278026 Y0.998334166468282 E0.1
G1 X9.80066577841242 Y1.98669330795061 E0.2
G1 X9.55336489125606 Y2.9552020666134 E0.3
G1 X9.21060994002885 Y3.89418342308651 E0.4
G1 X8.77582561890373 Y4.79425538604203 E0.5
G1 X8.25335614909678 Y5.64642473395035 E0.6
G1 X7.64842187284489 Y6.44217687237691 E0.7
G1 X6.96706709347165 Y7.17356090899523 E0.8
G1 X6.21609968270664 Y7.83326909627483 E0.9
G1 X5.4030230586814 Y8.41470984807897 E1
G1 X4.53596121425577 Y8.91207360061435 E1.1
G1 X3.62357754476674 Y9.32039085967226 E1.2
G1 X2.67498828624587 Y9.63558185417193 E1.3
G1 X1.69967142900241 Y9.8544972998846 E1.4
G1 X0.707372016677029 Y9.97494986604054 E1.5
G1 X-0.291995223012888 Y9.99573603041505 E1.6
G1 X-1.28844494295525 Y9.91664810452469 E1.7
G1 X-2.27202094693087 Y9.73847630878195 E1.8
G1 X-3.23289566863503 Y9.46300087687414 E1.9
G1 X-4.16146836547142 Y9.09297426825682 E2
G1 X-5.04846104599858 Y8.63209366648874 E2.1
G1 X-5.88501117255346 Y8.0849640381959 E2.2
G1 X-6.66276021279824 Y7.4570521217672 E2.3
G1 X-7.37393715541245 Y6.75463180551151 E2.4
G1 X-8.01143615546934 Y5.98472144103957 E2.5
G1 X-8.56888753368947 Y5.15501371821464 E2.6
G1 X-9.04072142017061 Y4.2737988023383 E2.7
G1 X-9.42222340668658 Y3.34988150155905 E2.8
G1 X-9.70958165149591 Y2.39249329213982 E2.9
G1 X-9.89992496600445 Y1.41120008059867 E3
G1 X-9.99135150273279 Y0.415806624332905 E3.1
G1 X-9.98294775794753 Y-0.583741434275801 E3.2
G1 X-9.87479769908865 Y-1.57745694143248 E3.3
G1 X-9.66798192579461 Y-2.55541102026831 E3.4
G1 X-9.36456687290796 Y-3.5078322768962 E3.5
39 changes: 39 additions & 0 deletions examples/models/gcode/test_m83.gcode
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
M83
G92
G0 Z1
G1 X10 Y0 E0
G1 X9.95004165278026 Y0.998334166468282 E0.1
G1 X9.80066577841242 Y1.98669330795061 E0.1
G1 X9.55336489125606 Y2.9552020666134 E0.1
G1 X9.21060994002885 Y3.89418342308651 E0.1
G1 X8.77582561890373 Y4.79425538604203 E0.1
G1 X8.25335614909678 Y5.64642473395035 E0.1
G1 X7.64842187284489 Y6.44217687237691 E0.1
G1 X6.96706709347165 Y7.17356090899523 E0.1
G1 X6.21609968270664 Y7.83326909627483 E0.1
G1 X5.4030230586814 Y8.41470984807897 E0.1
G1 X4.53596121425577 Y8.91207360061435 E0.1
G1 X3.62357754476674 Y9.32039085967226 E0.1
G1 X2.67498828624587 Y9.63558185417193 E0.1
G1 X1.69967142900241 Y9.8544972998846 E0.1
G1 X0.707372016677029 Y9.97494986604054 E0.1
G1 X-0.291995223012888 Y9.99573603041505 E0.1
G1 X-1.28844494295525 Y9.91664810452469 E0.1
G1 X-2.27202094693087 Y9.73847630878195 E0.1
G1 X-3.23289566863503 Y9.46300087687414 E0.1
G1 X-4.16146836547142 Y9.09297426825682 E0.1
G1 X-5.04846104599858 Y8.63209366648874 E0.1
G1 X-5.88501117255346 Y8.0849640381959 E0.1
G1 X-6.66276021279824 Y7.4570521217672 E0.1
G1 X-7.37393715541245 Y6.75463180551151 E0.1
G1 X-8.01143615546934 Y5.98472144103957 E0.1
G1 X-8.56888753368947 Y5.15501371821464 E0.1
G1 X-9.04072142017061 Y4.2737988023383 E0.1
G1 X-9.42222340668658 Y3.34988150155905 E0.1
G1 X-9.70958165149591 Y2.39249329213982 E0.1
G1 X-9.89992496600445 Y1.41120008059867 E0.1
G1 X-9.99135150273279 Y0.415806624332905 E0.1
G1 X-9.98294775794753 Y-0.583741434275801 E0.1
G1 X-9.87479769908865 Y-1.57745694143248 E0.1
G1 X-9.66798192579461 Y-2.55541102026831 E0.1
G1 X-9.36456687290796 Y-3.5078322768962 E0.1
72 changes: 61 additions & 11 deletions examples/webgl_loader_gcode.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,27 @@

import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { GCodeLoader } from 'three/addons/loaders/GCodeLoader.js';
import { GUI } from 'three/addons/libs/lil-gui.module.min.js';

let camera, scene, renderer;
let camera, scene, renderer, controls, loader;

let model;

const params = {
asset: 'benchy'
};

const assets = [
'benchy',
'test_m82',
'test_m83',
];

const positions = [
new THREE.Vector3( - 100, - 20, 100 ),
new THREE.Vector3( 0, 0, 0 ),
new THREE.Vector3( 0, 0, 0 ),
];

init();
render();
Expand All @@ -40,28 +59,59 @@

scene = new THREE.Scene();

const loader = new GCodeLoader();
loader.load( 'models/gcode/benchy.gcode', function ( object ) {

object.position.set( - 100, - 20, 100 );
scene.add( object );

render();

} );
loader = new GCodeLoader();
loadAsset( params.asset );

renderer = new THREE.WebGLRenderer( { antialias: true } );
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );

const controls = new OrbitControls( camera, renderer.domElement );
controls = new OrbitControls( camera, renderer.domElement );
controls.addEventListener( 'change', render ); // use if there is no animation loop
controls.minDistance = 10;
controls.maxDistance = 100;

window.addEventListener( 'resize', resize );

const gui = new GUI();


gui.add( params, 'asset', assets ).onChange( function ( value ) {

if ( model ) {

model.traverse( function ( object ) {

if ( object.material ) object.material.dispose();
if ( object.geometry ) object.geometry.dispose();

} );

scene.remove( model );

}

loadAsset( value );

} );

gui.open();


}

function loadAsset( asset ) {

loader.load( 'models/gcode/' + asset + '.gcode', function ( object ) {

model = object;
model.position.copy( positions[ assets.indexOf( asset ) ] );
scene.add( model );
controls.reset();

} );

}

function resize() {
Expand Down