Doodle3D-Slicer/src/gcode.js
2017-06-22 13:21:18 +02:00

165 lines
3.5 KiB
JavaScript

import THREE from 'three.js';
export default class {
constructor () {
this.gcode = '';
this.current = {};
this.extruder = 0.0;
this.bottom = true;
this.isRetracted = false;
this.isFanOn = false;
this._nozzlePosition = new THREE.Vector2(0, 0);
}
_addGCode (command) {
var str = '';
var first = true;
for (var i in command) {
if (first) {
str = i + command[i];
first = false;
}
else if (this.current[i] !== command[i]) {
str += ' ' + i + command[i];
this.current[i] = command[i];
}
}
this.gcode += str + '\n';
}
setSettings (settings) {
this.settings = settings;
return this;
}
turnFanOn (fanSpeed) {
this.isFanOn = true;
var gcode = {
'M': 106
}
if (fanSpeed !== undefined) {
gcode['S'] = fanSpeed;
}
this._addGCode(gcode);
return this;
}
turnFanOff () {
this.isFanOn = false;
this._addGCode({
'M': 107
});
return this;
}
moveTo (x, y, layer) {
var layerHeight = this.settings.config['layerHeight'];
var travelSpeed = this.settings.config['travelSpeed'];
var z = (layer + 1) * layerHeight;
var speed = travelSpeed * 60;
this._addGCode({
'G': 0,
'X': x.toFixed(3), 'Y': y.toFixed(3), 'Z': z.toFixed(3),
'F': speed.toFixed(3)
});
this._nozzlePosition.set(x, y);
return this;
}
lineTo (x, y, layer, type) {
var newNozzlePosition = new THREE.Vector2(x, y);
var layerHeight = this.settings.config['layerHeight'];
var nozzleDiameter = this.settings.config['nozzleDiameter'];
var filamentThickness = this.settings.config['filamentThickness'];
var travelSpeed = this.settings.config['travelSpeed'];
var profile = this.settings.config[(this.bottom ? 'bottom' : type)];
var speed = profile['speed'] * 60;
var flowRate = profile['flowRate'];
var z = (layer + 1) * layerHeight;
var lineLength = this._nozzlePosition.distanceTo(newNozzlePosition);
var filamentSurfaceArea = Math.pow((filamentThickness / 2), 2) * Math.PI;
this.extruder += lineLength * nozzleDiameter * layerHeight / filamentSurfaceArea * flowRate;
this._addGCode({
'G': 1,
'X': x.toFixed(3), 'Y': y.toFixed(3), 'Z': z.toFixed(3),
'F': speed.toFixed(3),
'E': this.extruder.toFixed(3)
});
this._nozzlePosition.copy(newNozzlePosition);
return this;
}
unRetract () {
var retractionEnabled = this.settings.config['retractionEnabled'];
var retractionMinDistance = this.settings.config['retractionMinDistance'];
var retractionSpeed = this.settings.config['retractionSpeed'];
if (this.isRetracted && retractionEnabled) {
this.isRetracted = false;
var speed = retractionSpeed * 60;
if (this.extruder > retractionMinDistance) {
this._addGCode({
'G': 0,
'E': this.extruder.toFixed(3),
'F': speed.toFixed(3)
});
}
}
return this;
}
retract () {
var retractionAmount = this.settings.config['retractionAmount'];
var retractionEnabled = this.settings.config['retractionEnabled'];
var retractionMinDistance = this.settings.config['retractionMinDistance'];
var retractionSpeed = this.settings.config['retractionSpeed'];
if (!this.isRetracted && retractionEnabled) {
this.isRetracted = true;
var speed = retractionSpeed * 60;
if (this.extruder > retractionMinDistance && retractionEnabled) {
this._addGCode({
'G': 0,
'E': (this.extruder - retractionAmount).toFixed(3),
'F': speed.toFixed(3)
});
}
}
return this;
}
getGCode () {
return this.settings.startCode() + this.gcode + this.settings.endCode();
}
}