added gcode class, removed gulp

gulp didn’t make any more sense to use because it is build modulair
This commit is contained in:
casperlamboo 2015-06-05 09:56:58 +02:00
parent 67362c4ba8
commit 38bf3c74f3
15 changed files with 379 additions and 1472 deletions

1319
build/d3d.js vendored

File diff suppressed because it is too large Load Diff

1
build/d3d.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -1,27 +0,0 @@
'use strict';
var gulp = require('gulp');
var rename = require('gulp-rename');
var uglify = require('gulp-uglify');
var concat = require('gulp-concat');
var watch = require('gulp-watch');
var files = [
"src/utils.js",
"src/box.js",
"src/printer.js",
"src/paths.js",
"src/slicer.js"
];
var destination = 'build/';
gulp.task('default', function () {
return gulp.src(files)
// .pipe(watch(files))
.pipe(concat('d3d.js'))
.pipe(gulp.dest(destination))
.pipe(uglify())
.pipe(rename({extname: '.min.js'}))
.pipe(gulp.dest(destination));
});

View File

@ -26,6 +26,10 @@ $(document).ready(function () {
listSliceTest.append("<li><a href='slice_test.html#192.168.5.1'>Wired Printer</a></li>"); listSliceTest.append("<li><a href='slice_test.html#192.168.5.1'>Wired Printer</a></li>");
listSliceWebworker.append("<li><a href='webworker_test.html#192.168.5.1'>Wired Printer</a></li>"); listSliceWebworker.append("<li><a href='webworker_test.html#192.168.5.1'>Wired Printer</a></li>");
listDoodle.append("<li><a href='doodle.html#" + window.location.host + ":3000'>Node Server</a></li>");
listSliceTest.append("<li><a href='slice_test.html#" + window.location.host + ":3000'>Node Server</a></li>");
listSliceWebworker.append("<li><a href='webworker_test.html#" + window.location.host + ":3000'>Node Server</a></li>");
/* /*
printers.push({ printers.push({
name: "wired box", name: "wired box",

BIN
models/ultimaker_robot.stl Executable file

Binary file not shown.

View File

@ -5,7 +5,7 @@
"printer.dimensions.y": 200, "printer.dimensions.y": 200,
"printer.dimensions.z": 200, "printer.dimensions.z": 200,
"printer.endcode": "M107 ;fan off\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;disable axes / steppers\nG90 ;absolute positioning\nM104 S{preheatTemp}\n{if heatedBed}M140 S{preheatBedTemp}\nM117 Done ;display message (20 characters to clear whole screen)", "printer.endcode": "M107 ;fan off\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;disable axes / steppers\nG90 ;absolute positioning\nM104 S{preheatTemp}\n{if heatedBed}M140 S{preheatBedTemp}\nM117 Done ;display message (20 characters to clear whole screen)",
"printer.filamentThickness": 2.89, "printer.filamentThickness": 2.85,
"printer.heatedbed": false, "printer.heatedbed": false,
"printer.heatup.bed.temperature": 70, "printer.heatup.bed.temperature": 70,
"printer.heatup.enabled": true, "printer.heatup.enabled": true,
@ -13,5 +13,35 @@
"printer.nozzleDiameter": 0.4, "printer.nozzleDiameter": 0.4,
"printer.startcode": ";Generated with Doodle3D (default)\nM109 S{printingTemp} ;set target temperature \n{if heatedBed}M190 S{printingBedTemp} ;set target bed temperature\nG21 ;metric values\nG91 ;relative positioning\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG92 E0 ;zero the extruded length again\nG1 F9000\nG90 ;absolute positioning\nM117 Printing Doodle... ;display message (20 characters to clear whole screen)", "printer.startcode": ";Generated with Doodle3D (default)\nM109 S{printingTemp} ;set target temperature \n{if heatedBed}M190 S{printingBedTemp} ;set target bed temperature\nG21 ;metric values\nG91 ;relative positioning\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG92 E0 ;zero the extruded length again\nG1 F9000\nG90 ;absolute positioning\nM117 Printing Doodle... ;display message (20 characters to clear whole screen)",
"printer.type": "ultimaker" "printer.type": "ultimaker"
},
"ultimaker2": {
"printer.baudrate": "115200",
"printer.dimensions.x": 223,
"printer.dimensions.y": 223,
"printer.dimensions.z": 205,
"printer.endcode": "M107 ;fan off\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+5.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 ;home the printer\nM84 ;disable axes / steppers\nG90 ;absolute positioning\nM104 S{preheatTemp}\n{if heatedBed}M140 S{preheatBedTemp}\nM117 Done ;display message (20 characters to clear whole screen)",
"printer.filamentThickness": 2.85,
"printer.heatedbed": true,
"printer.heatup.bed.temperature": 70,
"printer.heatup.enabled": true,
"printer.heatup.temperature": 180,
"printer.nozzleDiameter": 0.4,
"printer.startcode": ";Generated with Doodle3D (ultimaker2)\nM109 S{printingTemp} ;set target temperature \n{if heatedBed}M190 S{printingBedTemp} ;set target bed temperature\nG21 ;metric values\nG90 ;absolute positioning\nM107 ;start with the fan off\nG28 ; home to endstops\nG1 Z15 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\nM117 Printing Doodle... ;display message (20 characters to clear whole screen)",
"printer.type": "ultimaker2"
},
"ultimaker2go": {
"printer.baudrate": "115200",
"printer.dimensions.x": 120,
"printer.dimensions.y": 120,
"printer.dimensions.z": 115,
"printer.endcode": "M107 ;fan off\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+5.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 ;home the printer\nM84 ;disable axes / steppers\nG90 ;absolute positioning\nM104 S{preheatTemp}\n{if heatedBed}M140 S{preheatBedTemp}\nM117 Done ;display message (20 characters to clear whole screen)",
"printer.filamentThickness": 2.85,
"printer.heatedbed": false,
"printer.heatup.bed.temperature": 70,
"printer.heatup.enabled": true,
"printer.heatup.temperature": 180,
"printer.nozzleDiameter": 0.4,
"printer.startcode": ";Generated with Doodle3D (ultimaker2)\nM109 S{printingTemp} ;set target temperature \n{if heatedBed}M190 S{printingBedTemp} ;set target bed temperature\nG21 ;metric values\nG90 ;absolute positioning\nM107 ;start with the fan off\nG28 ; home to endstops\nG1 Z15 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\nM117 Printing Doodle... ;display message (20 characters to clear whole screen)",
"printer.type": "ultimaker2g0"
} }
} }

View File

@ -12,7 +12,7 @@
"printer.retraction.minDistance": 5.0, "printer.retraction.minDistance": 5.0,
"printer.shellThickness": 0.4, "printer.shellThickness": 0.4,
"printer.speed": 50.0, "printer.speed": 50.0,
"printer.temperature": 230.0, "printer.temperature": 210.0,
"printer.topThickness": 0.8, "printer.topThickness": 0.8,
"printer.travelSpeed": 200.0 "printer.travelSpeed": 200.0
} }

View File

@ -12,6 +12,7 @@
<script src="src/box.js"></script> <script src="src/box.js"></script>
<script src="src/printer.js"></script> <script src="src/printer.js"></script>
<script src="src/paths.js"></script> <script src="src/paths.js"></script>
<script src="src/gcode.js"></script>
<script src="src/slicer.js"></script> <script src="src/slicer.js"></script>
<style> <style>
@ -36,7 +37,7 @@ function init () {
var loader = new THREE.STLLoader(); var loader = new THREE.STLLoader();
loader.load("models/dom.stl", function (geometry) { loader.load("models/dom.stl", function (geometry) {
//var geometry = new THREE.BoxGeometry(10, 10, 10, 1, 1, 1); var geometry = new THREE.BoxGeometry(10, 10, 10, 1, 1, 1);
//var geometry = new THREE.SphereGeometry(10, 20, 10); //var geometry = new THREE.SphereGeometry(10, 20, 10);
//var geometry = new THREE.TorusGeometry(20, 10, 30, 30); //var geometry = new THREE.TorusGeometry(20, 10, 30, 30);
/* /*

View File

@ -105,7 +105,8 @@ D3D.Box.prototype.printBatch = function () {
this.setPrinterPrint({ this.setPrinterPrint({
"start": ((this.currentBatch === 0) ? true : false), "start": ((this.currentBatch === 0) ? true : false),
"first": ((this.currentBatch === 0) ? true : false), "first": ((this.currentBatch === 0) ? true : false),
"gcode": gcode.join("\n") "gcode": gcode.join("\n"),
"last": ((this.printBatches.length === 0) ? true : false) //only for debug purposes
}, function (data) { }, function (data) {
console.log("batch sent: " + self.currentBatch, data); console.log("batch sent: " + self.currentBatch, data);
@ -120,28 +121,14 @@ D3D.Box.prototype.printBatch = function () {
self.updateState(); self.updateState();
}); });
}; };
D3D.Box.prototype.stopPrint = function () { D3D.Box.prototype.stopPrint = function (printer) {
"use strict"; "use strict";
this.printBatches = []; this.printBatches = [];
this.currentBatch = 0; this.currentBatch = 0;
var finishMove = [
"M107 ;fan off",
"G91 ;relative positioning",
"G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure",
"G1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more",
"G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way",
"M84 ;disable axes / steppers",
"G90 ;absolute positioning",
"M104 S180",
";M140 S70",
"M117 Done ;display message (20 characters to clear whole screen)"
];
this.setPrinterStop({ this.setPrinterStop({
//"gcode": {} "gcode": printer.getEndCode().join("\n")
"gcode": finishMove.join("\n")
}, function (data) { }, function (data) {
console.log("Printer stop command sent"); console.log("Printer stop command sent");
}); });

132
src/gcode.js Normal file
View File

@ -0,0 +1,132 @@
/******************************************************
*
* GCode
*
* Manages the gcode
*
******************************************************/
D3D.GCode = function () {
"use strict";
this.extruder = 0.0;
this.bottom = true;
this.isRetracted = false;
this.gcode = [];
this.nozzlePosition = new THREE.Vector2(0, 0);
};
D3D.GCode.prototype.setSettings = function (printer) {
"use strict";
this.settings = printer;
return this;
};
D3D.GCode.prototype.turnOnFan = function () {
"use strict";
this.gcode.push("M106");
};
D3D.GCode.prototype.moveTo = function (extrude, x, y, layer) {
"use strict";
var layerHeight = this.settings.config["printer.layerHeight"];
var firstLayerSlow = this.settings.config["printer.firstLayerSlow"];
var normalSpeed = this.settings.config["printer.speed"];
var bottomSpeed = this.settings.config["printer.bottomLayerSpeed"];
var normalSpeed = this.settings.config["printer.speed"];
var bottomSpeed = this.settings.config["printer.bottomLayerSpeed"];
var nozzleDiameter = this.settings.config["printer.nozzleDiameter"];
var filamentThickness = this.settings.config["printer.filamentThickness"];
var bottomFlowRate = this.settings.config["printer.bottomFlowRate"];
var normalFlowRate = this.settings.config["printer.normalFlowRate"];
var travelSpeed = this.settings.config["printer.travelSpeed"];
if (this.bottom) {
var speed = bottomSpeed * 60;
var flowRate = bottomFlowRate;
}
else {
var speed = normalSpeed * 60;
var flowRate = normalFlowRate;
}
var z = (layer + 1) * layerHeight;
if (extrude) {
var lineLength = this.nozzlePosition.distanceTo(new THREE.Vector2(x, y));
var filamentSurfaceArea = Math.pow((filamentThickness/2), 2) * Math.PI;
this.extruder += lineLength * nozzleDiameter * layerHeight / filamentSurfaceArea * flowRate;
this.gcode.push(
"G1" +
" X" + x.toFixed(3) +
" Y" + y.toFixed(3) +
((z !== this.lastZ) ? (" Z" + z.toFixed(3)) : "") +
((speed !== this.lastSpeed) ? (" F" + speed.toFixed(3)) : "") +
" E" + this.extruder.toFixed(3)
);
}
else {
var speed = travelSpeed * 60;
this.gcode.push(
"G0" +
" X" + x.toFixed(3) + " Y" + y.toFixed(3) + " Z" + z +
" F" + speed.toFixed(3)
);
}
this.lastSpeed = speed;
this.lastZ = z;
this.nozzlePosition = new THREE.Vector2(x, y);
};
D3D.GCode.prototype.unRetract = function () {
"use strict";
this.isRetracted = false;
var retractionAmount = this.settings.config["printer.retraction.amount"];
var retractionEnabled = this.settings.config["printer.retraction.enabled"];
var retractionMinDistance = this.settings.config["printer.retraction.minDistance"];
var retractionSpeed = this.settings.config["printer.retraction.speed"];
var speed = retractionSpeed * 60;
if (this.extruder > retractionMinDistance && retractionEnabled) {
this.gcode.push(
"G0" +
" E" + this.extruder.toFixed(3) +
" F" + (speed * 60).toFixed(3)
);
}
};
D3D.GCode.prototype.retract = function () {
"use strict";
this.isRetracted = true;
var retractionAmount = this.settings.config["printer.retraction.amount"];
var retractionEnabled = this.settings.config["printer.retraction.enabled"];
var retractionMinDistance = this.settings.config["printer.retraction.minDistance"];
var retractionSpeed = this.settings.config["printer.retraction.speed"];
var speed = retractionSpeed * 60;
if (this.extruder > retractionMinDistance && retractionEnabled) {
this.gcode.push(
"G0" +
" E" + (this.extruder - retractionAmount).toFixed(3) +
" F" + speed.toFixed(3)
);
}
this.lastSpeed = speed;
};
D3D.GCode.prototype.getFinal = function () {
"use strict";
return this.settings.getStartCode().concat(this.gcode, this.settings.getEndCode());
};

View File

@ -5,7 +5,7 @@
* *
******************************************************/ ******************************************************/
D3D.Printer = function (printerSettings, userSettings) { D3D.Printer = function () {
"use strict"; "use strict";
this.config = {}; this.config = {};
@ -33,6 +33,7 @@ D3D.Printer.prototype.getEndCode = function () {
"use strict"; "use strict";
var gcode = this.config["printer.endcode"]; var gcode = this.config["printer.endcode"];
gcode = this.subsituteVariables(gcode); gcode = this.subsituteVariables(gcode);
return gcode.split("\n"); return gcode.split("\n");

View File

@ -8,6 +8,8 @@ D3D.Slicer = function () {
"use strict"; "use strict";
this.progress = { this.progress = {
totalFaces: 0,
currentFace: 0,
totalLayers: 0, totalLayers: 0,
sliceLayer: 0, sliceLayer: 0,
dataLayer: 0, dataLayer: 0,
@ -51,13 +53,25 @@ D3D.Slicer.prototype.setMesh = function (geometry, matrix) {
return this; return this;
}; };
D3D.Slicer.prototype.updateProgress = function () { D3D.Slicer.prototype.updateProgress = function () {
'use strict';
var faces = this.progress.currentFace / (this.progress.totalFaces - 1);
var slice = this.progress.sliceLayer / (this.progress.totalLayers - 1);
var data = this.progress.dataLayer / (this.progress.totalLayers - 2);
var gcode = this.progress.gcodeLayer / (this.progress.totalLayers - 2);
this.progress.procent = (faces + slice + data + gcode) / 4;
if (this.onProgress !== undefined) { if (this.onProgress !== undefined) {
this.onProgress(this.progress); this.onProgress(this.progress);
} }
}; };
D3D.Slicer.prototype.createLines = function () { D3D.Slicer.prototype.createLines = function () {
"use strict"; "use strict";
this.progress.totalFaces = this.geometry.faces.length;
this.lines = []; this.lines = [];
var lineLookup = {}; var lineLookup = {};
@ -102,6 +116,9 @@ D3D.Slicer.prototype.createLines = function () {
this.lines[b].normals.push(normal); this.lines[b].normals.push(normal);
this.lines[c].normals.push(normal); this.lines[c].normals.push(normal);
} }
this.progress.currentFace = i;
this.updateProgress();
} }
}; };
D3D.Slicer.prototype.slice = function (layerHeight, height) { D3D.Slicer.prototype.slice = function (layerHeight, height) {
@ -129,7 +146,6 @@ D3D.Slicer.prototype.slice = function (layerHeight, height) {
//still error in first layer, so remove first layer & last layer //still error in first layer, so remove first layer & last layer
//see https://github.com/Doodle3D/Doodle3D-Slicer/issues/1 //see https://github.com/Doodle3D/Doodle3D-Slicer/issues/1
//for (var layer = 1; layer < layersIntersections.length-1; layer ++) {
for (var layer = 0; layer < layersIntersections.length; layer ++) { for (var layer = 0; layer < layersIntersections.length; layer ++) {
var layerIntersections = layersIntersections[layer]; var layerIntersections = layersIntersections[layer];
var y = layer * layerHeight; var y = layer * layerHeight;
@ -139,10 +155,15 @@ D3D.Slicer.prototype.slice = function (layerHeight, height) {
var index = layerIntersections[i]; var index = layerIntersections[i];
var line = this.lines[index].line; var line = this.lines[index].line;
if (line.start.y === line.end.y) {
var x = line.start.x;
var z = line.start.z;
}
else {
var alpha = (y - line.start.y) / (line.end.y - line.start.y); var alpha = (y - line.start.y) / (line.end.y - line.start.y);
var x = line.end.x * alpha + line.start.x * (1 - alpha); var x = line.end.x * alpha + line.start.x * (1 - alpha);
var z = line.end.z * alpha + line.start.z * (1 - alpha); var z = line.end.z * alpha + line.start.z * (1 - alpha);
}
intersections[index] = new THREE.Vector2(z, x); intersections[index] = new THREE.Vector2(z, x);
} }
@ -171,12 +192,12 @@ D3D.Slicer.prototype.slice = function (layerHeight, height) {
var normal = a.sub(b).normal().normalize(); var normal = a.sub(b).normal().normalize();
var faceNormal = faceNormals[Math.floor(j/2)]; var faceNormal = faceNormals[Math.floor(j/2)];
//if (normal.dot(faceNormal) > 0) { if (normal.dot(faceNormal) > 0) {
break; break;
//} }
//else { else {
// index = -1; index = -1;
//} }
} }
else { else {
index = -1; index = -1;
@ -383,6 +404,7 @@ D3D.Slicer.prototype.getFillTemplate = function (bounds, size, even, uneven) {
//return paths; //return paths;
return paths; return paths;
}; };
/*
D3D.Slicer.prototype.dataToGcode = function (data, printer) { D3D.Slicer.prototype.dataToGcode = function (data, printer) {
"use strict"; "use strict";
@ -418,19 +440,18 @@ D3D.Slicer.prototype.dataToGcode = function (data, printer) {
//TODO //TODO
//add retraction //add retraction
gcode.push([ gcode.push(
"G0", "G0" +
"X" + point.X.toFixed(3) + " Y" + point.Y.toFixed(3) + " Z" + z, " X" + point.X.toFixed(3) + " Y" + point.Y.toFixed(3) + " Z" + z +
"F" + (travelSpeed * 60) " F" + (travelSpeed * 60)
].join(" ")); );
if (extruder > retractionMinDistance && retractionEnabled && j === 0) { if (extruder > retractionMinDistance && retractionEnabled && j === 0) {
gcode.push([ gcode.push(
"G0", "G0" +
"E" + extruder.toFixed(3), " E" + extruder.toFixed(3) +
"F" + (retractionSpeed * 60).toFixed(3) " F" + (retractionSpeed * 60).toFixed(3)
].join(" ")); );
} }
} }
@ -441,12 +462,12 @@ D3D.Slicer.prototype.dataToGcode = function (data, printer) {
extruder += lineLength * nozzleDiameter * layerHeight / filamentSurfaceArea * flowRate; extruder += lineLength * nozzleDiameter * layerHeight / filamentSurfaceArea * flowRate;
gcode.push([ gcode.push(
"G1", "G1" +
"X" + point.X.toFixed(3) + " Y" + point.Y.toFixed(3) + " Z" + z, " X" + point.X.toFixed(3) + " Y" + point.Y.toFixed(3) + " Z" + z +
"F" + speed, " F" + speed +
"E" + extruder.toFixed(3) " E" + extruder.toFixed(3)
].join(" ")); );
} }
previousPoint = point; previousPoint = point;
@ -454,11 +475,11 @@ D3D.Slicer.prototype.dataToGcode = function (data, printer) {
} }
if (extruder > retractionMinDistance && retractionEnabled) { if (extruder > retractionMinDistance && retractionEnabled) {
gcode.push([ gcode.push(
"G0", "G0" +
"E" + (extruder - retractionAmount).toFixed(3), " E" + (extruder - retractionAmount).toFixed(3) +
"F" + (retractionSpeed * 60).toFixed(3) " F" + (retractionSpeed * 60).toFixed(3)
].join(" ")); );
} }
return gcode; return gcode;
@ -499,35 +520,60 @@ D3D.Slicer.prototype.dataToGcode = function (data, printer) {
return gcode; return gcode;
}; };
//only for debug purposes */
D3D.Slicer.prototype.drawPaths = function (printer, min, max) { D3D.Slicer.prototype.dataToGcode = function (data, printer) {
"use strict"; "use strict";
var layerHeight = printer.config["printer.layerHeight"]; var gcode = new D3D.GCode().setSettings(printer);
var dimensionsZ = printer.config["printer.dimensions.z"];
var slices = this.slice(layerHeight, dimensionsZ); function sliceToGcode (path, retract, unRetract) {
for (var i = 0; i < path.length; i ++) {
var shape = path[i];
var data = this.slicesToData(slices, printer); var length = path.closed ? (shape.length + 1) : shape.length;
var canvas = document.createElement("canvas"); for (var j = 0; j < length; j ++) {
canvas.width = 400; var point = shape[j % shape.length];
canvas.height = 400;
var context = canvas.getContext("2d");
for (var layer = min; layer < max; layer ++) { if (j === 0) {
var slice = data[layer % data.length]; gcode.moveTo(false, point.X, point.Y, layer);
if (unRetract) {
gcode.unRetract();
}
}
else {
gcode.moveTo(true, point.X, point.Y, layer);
}
}
}
if (retract) {
gcode.retract();
}
}
for (var layer = 0; layer < data.length; layer ++) {
var slice = data[layer];
if (layer === 1) {
gcode.turnOnFan();
gcode.bottom = false;
}
for (var i = 0; i < slice.length; i ++) { for (var i = 0; i < slice.length; i ++) {
var layerPart = slice[i]; var layerPart = slice[i];
layerPart.insets.draw(context, "blue"); sliceToGcode(layerPart.outerLayer, false, true);
layerPart.outerLayer.draw(context, "green"); sliceToGcode(layerPart.insets, false, false);
layerPart.fill.draw(context, "red"); sliceToGcode(layerPart.fill, true, false);
}
} }
return canvas; this.progress.gcodeLayer = layer;
this.updateProgress();
}
return gcode.getFinal();
}; };
D3D.Slicer.prototype.getGcode = function (printer) { D3D.Slicer.prototype.getGcode = function (printer) {
"use strict"; "use strict";
@ -535,7 +581,7 @@ D3D.Slicer.prototype.getGcode = function (printer) {
var layerHeight = printer.config["printer.layerHeight"]; var layerHeight = printer.config["printer.layerHeight"];
var dimensionsZ = printer.config["printer.dimensions.z"]; var dimensionsZ = printer.config["printer.dimensions.z"];
this.progress.totalLayers = Math.floor(this.geometry.boundingBox.max.y / layerHeight); this.progress.totalLayers = Math.floor(Math.min(this.geometry.boundingBox.max.y, dimensionsZ) / layerHeight);
this.progress.sliceLayer = 0; this.progress.sliceLayer = 0;
this.progress.dataLayer = 0; this.progress.dataLayer = 0;
this.progress.gcodeLayer = 0; this.progress.gcodeLayer = 0;

View File

@ -1,36 +1,40 @@
D3D.SlicerWorker = function () { D3D.SlicerWorker = function () {
"use strict"; 'use strict';
this.worker = new Worker('webworker/worker.js'); this.worker = new Worker('webworker/worker.js');
var progressBar = document.getElementById("progress-bar");
var scope = this; var scope = this;
this.worker.addEventListener('message', function (event) { this.worker.addEventListener('message', function (event) {
switch (event.data['cmd']) {
case 'PROGRESS':
if (scope.onprogress !== undefined) {
var progress = event.data['progress'];
switch (event.data["cmd"]) { scope.onprogress(progress);
case "PROGRESS": }
var progress = event.data["progress"];
var procent = (progress.sliceLayer + progress.dataLayer + progress.gcodeLayer) / (progress.totalLayers * 3 - 5);
progressBar.style.width = procent * 100 + "%";
break; break;
case "GCODE": case 'GCODE':
gcode = event.data["gcode"]; if (scope.onfinish !== undefined) {
var gcode = event.data['gcode'];
scope.onfinish(gcode);
}
break; break;
} }
}, false); }, false);
} }
D3D.SlicerWorker.prototype.setSettings = function (USER_SETTINGS, PRINTER_SETTINGS) { D3D.SlicerWorker.prototype.setSettings = function (USER_SETTINGS, PRINTER_SETTINGS) {
"use strict"; 'use strict';
this.worker.postMessage({ this.worker.postMessage({
"cmd": "SET_SETTINGS", 'cmd': 'SET_SETTINGS',
"USER_SETTINGS": USER_SETTINGS, 'USER_SETTINGS': USER_SETTINGS,
"PRINTER_SETTINGS": PRINTER_SETTINGS 'PRINTER_SETTINGS': PRINTER_SETTINGS
}); });
}; };
D3D.SlicerWorker.prototype.setMesh = function (mesh) { D3D.SlicerWorker.prototype.setMesh = function (mesh) {
"use strict"; 'use strict';
if (mesh.geometry instanceof THREE.Geometry) { if (mesh.geometry instanceof THREE.Geometry) {
var geometry = new THREE.BufferGeometry().fromGeometry(mesh.geometry); var geometry = new THREE.BufferGeometry().fromGeometry(mesh.geometry);
@ -49,25 +53,25 @@ D3D.SlicerWorker.prototype.setMesh = function (mesh) {
mesh.updateMatrix(); mesh.updateMatrix();
this.worker.postMessage({ this.worker.postMessage({
"cmd": "SET_MESH", 'cmd': 'SET_MESH',
"geometry": { 'geometry': {
"attributes": geometry.attributes, 'attributes': geometry.attributes,
"attributesKeys": geometry.attributesKeys 'attributesKeys': geometry.attributesKeys
}, },
"matrix": mesh.matrix.toArray() 'matrix': mesh.matrix.toArray()
}, buffers); }, buffers);
}; };
D3D.SlicerWorker.prototype.slice = function () { D3D.SlicerWorker.prototype.slice = function () {
"use strict"; 'use strict';
this.worker.postMessage({ this.worker.postMessage({
"cmd": "SLICE" 'cmd': 'SLICE'
}); });
}; };
D3D.SlicerWorker.prototype.close = function () { D3D.SlicerWorker.prototype.close = function () {
"use strict"; 'use strict';
this.worker.postMessage({ this.worker.postMessage({
"cmd": "CLOSE" 'cmd': 'CLOSE'
}); });
}; };

View File

@ -4,6 +4,7 @@ importScripts("../src/utils.js");
importScripts("../src/printer.js"); importScripts("../src/printer.js");
importScripts("../src/paths.js"); importScripts("../src/paths.js");
importScripts("../src/slicer.js"); importScripts("../src/slicer.js");
importScripts("../src/gcode.js");
var printer = new D3D.Printer(); var printer = new D3D.Printer();
var slicer = new D3D.Slicer(); var slicer = new D3D.Slicer();

View File

@ -1,53 +1,101 @@
<!DOCTYPE HTML> <!DOCTYPE HTML>
<html lang="en"> <html lang='en'>
<head> <head>
<script src="library/jquery.js"></script> <script src='library/jquery.js'></script>
<script src="library/three.js"></script> <script src='library/three.js'></script>
<script src="library/stl_loader.js"></script> <script src='library/stl_loader.js'></script>
<script src="src/utils.js"></script> <script src='src/utils.js'></script>
<script src="src/box.js"></script> <script src='src/box.js'></script>
<script src="src/slicerworker.js"></script> <script src='src/printer.js'></script>
<script src='src/slicerworker.js'></script>
<title>Doedel Drie Dee || Webworker Test</title> <title>Doedel Drie Dee || Webworker Test</title>
<style> <style>
canvas {border: 1px solid black;} canvas {border: 1px solid black;}
#progress {height: 20px; width: 200px; border: 1px solid black; overflow: hidden;} #progress {height: 20px; width: 200px; border: 1px solid black; overflow: hidden;}
#progress-bar {height: 20px; background-color: lightblue; width: 0%;} #progress_bar {height: 20px; background-color: lightblue; width: 0%;}
.block {border: 1px solid black; width: 400px; height: 400px; display: inline-block;}
#start_print {display: none;}
</style> </style>
</head> </head>
<body> <body>
<canvas id="3d-preview" height="400" width="400"></canvas> <canvas id='3d-preview' height='400' width='400'></canvas>
<canvas id="canvas" width="400" height="400"></canvas> <div class='block'>
<div id="progress"><div id="progress-bar"></div></div> <p>State: <span id='state'></span></p>
<p>Bed Temp: <span id='bed_temp'></span></p>
<p>Bed Target Temp: <span id='bed_target_temp'></span></p>
<p>Nozzle Temp: <span id='nozzle_temp'></span></p>
<p>Nozzle Target Temp: <span id='nozzle_target_temp'></span></p>
<p>Current Line: <span id='current_line'></span></p>
<p>Buffered Lines: <span id='buffered_lines'></span></p>
<p>Total Lines: <span id='total_lines'></span></p>
<p>Batches To Send: <span id='print_batches'></span></p>
<div id='progress'><div id='progress_bar'></div></div>
<button id="start_print">Start Print</button>
<button id="stop_print">Stop Print</button>
</div>
<script> <script>
var USER_SETTINGS, PRINTER_SETTINGS, doodleBox, gcode, slicerWorker; var USER_SETTINGS, PRINTER_SETTINGS, doodleBox, gcode, slicerWorker, printer;
function init () { function init () {
"use strict"; 'use strict';
var scene = createScene(); var scene = createScene();
var localIp = location.hash.substring(1); var localIp = location.hash.substring(1);
doodleBox = new D3D.Box(localIp); doodleBox = new D3D.Box(localIp);
printer = new D3D.Printer().updateConfig(USER_SETTINGS).updateConfig(PRINTER_SETTINGS['ultimaker2go']);
doodleBox.onupdate = function (data) {
document.getElementById('state').innerHTML = data.state;
document.getElementById('bed_temp').innerHTML = data.bed;
document.getElementById('bed_target_temp').innerHTML = data.bed_target;
document.getElementById('nozzle_temp').innerHTML = data.hotend;
document.getElementById('nozzle_target_temp').innerHTML = data.hotend_target;
document.getElementById('current_line').innerHTML = data.current_line;
document.getElementById('buffered_lines').innerHTML = data.buffered_lines;
document.getElementById('total_lines').innerHTML = data.total_lines;
document.getElementById('print_batches').innerHTML = doodleBox.printBatches.length;
};
document.getElementById('stop_print').onclick = function () {
doodleBox.stopPrint(printer);
};
var slicer = new D3D.SlicerWorker(); var slicer = new D3D.SlicerWorker();
slicer.setSettings(USER_SETTINGS, PRINTER_SETTINGS["ultimaker"]); slicer.setSettings(USER_SETTINGS, PRINTER_SETTINGS['ultimaker2go']);
var progressBar = document.getElementById('progress_bar');
slicer.onprogress = function (progress) {
progressBar.style.width = progress.procent * 100 + '%';
};
slicer.onfinish = function (_gcode) {
gcode = _gcode;
var button = document.getElementById('start_print');
button.style.display = 'initial';
button.onclick = function () {
doodleBox.print(gcode);
};
};
var loader = new THREE.STLLoader(); var loader = new THREE.STLLoader();
loader.load("models/dom.stl", function (geometry) { loader.load('models/pokemon/pikachu.stl', function (geometry) {
//var geometry = new THREE.TorusGeometry(20, 10, 30, 30).clone(); var geometry = new THREE.TorusGeometry(20, 10, 30, 30).clone();
var material = new THREE.MeshPhongMaterial({color: 0x00ff00, wireframe: false}); var material = new THREE.MeshPhongMaterial({color: 0x00ff00, wireframe: false});
var mesh = new THREE.Mesh(geometry, material); var mesh = new THREE.Mesh(geometry, material);
mesh.rotation.x = -Math.PI/2; mesh.rotation.x = -Math.PI/2;
mesh.scale.x = mesh.scale.y = mesh.scale.z = 1; mesh.scale.x = mesh.scale.y = mesh.scale.z = 0.5;
//mesh.position.y = -9.260265119962973e-17; mesh.position.y = -0.1;
mesh.position.x = 100; mesh.position.x = 60;
mesh.position.z = 100; mesh.position.z = 60;
scene.add(mesh); scene.add(mesh);
@ -61,7 +109,7 @@ function init () {
function createScene () { function createScene () {
var scene = new THREE.Scene(); var scene = new THREE.Scene();
var renderer = new THREE.WebGLRenderer({canvas: document.getElementById("3d-preview"), antialias: true}); var renderer = new THREE.WebGLRenderer({canvas: document.getElementById('3d-preview'), antialias: true});
renderer.setClearColor(0xffffff, 1); renderer.setClearColor(0xffffff, 1);
var camera = new THREE.PerspectiveCamera(75, renderer.domElement.width/renderer.domElement.height, 1, 10000); var camera = new THREE.PerspectiveCamera(75, renderer.domElement.width/renderer.domElement.height, 1, 10000);
@ -73,7 +121,7 @@ function createScene () {
var directionalLight = new THREE.PointLight(0xffffff, 0.5); var directionalLight = new THREE.PointLight(0xffffff, 0.5);
camera.add(directionalLight); camera.add(directionalLight);
applyMouseControls(renderer, camera, new THREE.Vector3(100, 0, 100), 1000); applyMouseControls(renderer, camera, new THREE.Vector3(50, 0, 50), 1000);
function applyMouseControls (renderer, camera, center, maxDistance) { function applyMouseControls (renderer, camera, center, maxDistance) {
var distance = 20; var distance = 20;
@ -90,9 +138,9 @@ function createScene () {
camera.lookAt(center); camera.lookAt(center);
} }
$(renderer.domElement).on("mousedown", function (e) { $(renderer.domElement).on('mousedown', function (e) {
moveCamera = true; moveCamera = true;
}).on("wheel", function (e) { }).on('wheel', function (e) {
var event = e.originalEvent; var event = e.originalEvent;
event.preventDefault(); event.preventDefault();
@ -101,9 +149,9 @@ function createScene () {
updateCamera(); updateCamera();
}); });
$(window).on("mouseup", function (e) { $(window).on('mouseup', function (e) {
moveCamera = false; moveCamera = false;
}).on("mousemove", function (e) { }).on('mousemove', function (e) {
var event = e.originalEvent; var event = e.originalEvent;
if (moveCamera === true) { if (moveCamera === true) {
@ -126,7 +174,7 @@ function createScene () {
} }
(function () { (function () {
"use strict"; 'use strict';
var loadedItems = 0; var loadedItems = 0;
function loaded () { function loaded () {
@ -136,11 +184,11 @@ function createScene () {
} }
} }
loadSettings("settings/user_settings.json", function (data) { loadSettings('settings/user_settings.json', function (data) {
USER_SETTINGS = data; USER_SETTINGS = data;
loaded(); loaded();
}); });
loadSettings("settings/printer_settings.json", function (data) { loadSettings('settings/printer_settings.json', function (data) {
PRINTER_SETTINGS = data; PRINTER_SETTINGS = data;
loaded(); loaded();
}); });