Doodle3D-Slicer/src/slicer.js

544 lines
15 KiB
JavaScript
Raw Normal View History

2015-04-24 16:12:48 +02:00
/******************************************************
*
* Slicer
*
******************************************************/
D3D.Slicer = function () {
2015-04-24 16:12:48 +02:00
"use strict";
2015-05-29 13:51:18 +02:00
this.progress = {
totalFaces: 0,
currentFace: 0,
2015-05-29 13:51:18 +02:00
totalLayers: 0,
sliceLayer: 0,
dataLayer: 0,
gcodeLayer: 0
};
2015-04-24 16:12:48 +02:00
};
D3D.Slicer.prototype.setMesh = function (geometry, matrix) {
"use strict";
2015-05-15 15:07:47 +02:00
//convert buffergeometry to geometry;
2015-05-29 13:51:18 +02:00
if (geometry instanceof THREE.BufferGeometry) {
geometry = new THREE.Geometry().fromBufferGeometry(geometry);
}
2015-05-15 15:07:47 +02:00
//apply mesh matrix on geometry;
geometry.mergeVertices();
2015-06-12 15:58:26 +02:00
geometry.applyMatrix(matrix);
geometry.computeBoundingBox();
2015-06-12 15:58:26 +02:00
geometry.computeFaceNormals();
this.geometry = geometry;
2015-05-15 15:07:47 +02:00
//get unique lines from geometry;
this.createLines();
return this;
};
2015-05-29 13:51:18 +02:00
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;
2015-05-29 13:51:18 +02:00
if (this.onProgress !== undefined) {
2015-05-29 13:51:18 +02:00
this.onProgress(this.progress);
}
};
D3D.Slicer.prototype.createLines = function () {
2015-05-01 14:09:45 +02:00
"use strict";
2015-04-24 16:12:48 +02:00
this.progress.totalFaces = this.geometry.faces.length;
this.lines = [];
var lineLookup = {};
2015-04-24 16:12:48 +02:00
var self = this;
function addLine (a, b) {
2015-06-09 11:08:06 +02:00
var index = lineLookup[b + "_" + a];
2015-04-24 16:12:48 +02:00
if (index === undefined) {
index = self.lines.length;
lineLookup[a + "_" + b] = index;
2015-04-24 16:12:48 +02:00
self.lines.push({
2015-05-07 14:09:36 +02:00
line: new THREE.Line3(self.geometry.vertices[a], self.geometry.vertices[b]),
connects: [],
2015-05-29 13:51:18 +02:00
normals: []
});
}
return index;
2015-05-07 11:04:48 +02:00
}
2015-04-24 16:12:48 +02:00
for (var i = 0; i < this.geometry.faces.length; i ++) {
var face = this.geometry.faces[i];
2015-05-13 12:12:15 +02:00
if (face.normal.y !== 1 && face.normal.y !== -1) {
var normal = new THREE.Vector2().set(face.normal.z, face.normal.x).normalize();
2015-05-13 12:12:15 +02:00
//check for only adding unique lines
//returns index of said line
var a = addLine(face.a, face.b);
var b = addLine(face.b, face.c);
var c = addLine(face.c, face.a);
//set connecting lines (based on face)
this.lines[a].connects.push(b, c);
this.lines[b].connects.push(c, a);
this.lines[c].connects.push(a, b);
this.lines[a].normals.push(normal);
this.lines[b].normals.push(normal);
this.lines[c].normals.push(normal);
}
this.progress.currentFace = i;
this.updateProgress();
2015-04-24 16:12:48 +02:00
}
};
2015-05-20 19:10:18 +02:00
D3D.Slicer.prototype.slice = function (layerHeight, height) {
2015-04-24 16:12:48 +02:00
"use strict";
2015-06-11 14:34:30 +02:00
2015-06-09 11:08:06 +02:00
var numLayers = height / layerHeight;
2015-04-24 16:12:48 +02:00
var layersIntersections = [];
2015-06-12 15:58:26 +02:00
for (var layer = 0; layer < numLayers; layer ++) {
layersIntersections[layer] = [];
}
2015-05-20 19:10:18 +02:00
for (var lineIndex = 0; lineIndex < this.lines.length; lineIndex ++) {
2015-05-26 11:44:15 +02:00
var line = this.lines[lineIndex].line;
2015-05-26 11:44:15 +02:00
var min = Math.ceil(Math.min(line.start.y, line.end.y) / layerHeight);
var max = Math.floor(Math.max(line.start.y, line.end.y) / layerHeight);
2015-05-13 12:12:15 +02:00
for (var layerIndex = min; layerIndex <= max; layerIndex ++) {
2015-06-09 11:08:06 +02:00
if (layerIndex >= 0 && layerIndex < numLayers) {
2015-05-20 19:10:18 +02:00
layersIntersections[layerIndex].push(lineIndex);
}
}
}
2015-04-24 16:12:48 +02:00
var slices = [];
//still error in first layer, so remove first layer & last layer
//see https://github.com/Doodle3D/Doodle3D-Slicer/issues/1
2015-06-13 20:09:44 +02:00
for (var layer = 1; layer < layersIntersections.length; layer ++) {
var layerIntersections = layersIntersections[layer];
2015-06-12 15:58:26 +02:00
2015-06-12 21:19:56 +02:00
if (layerIntersections.length > 0) {
2015-04-24 16:12:48 +02:00
2015-06-12 21:19:56 +02:00
var y = layer * layerHeight;
2015-06-12 21:19:56 +02:00
var intersections = [];
for (var i = 0; i < layerIntersections.length; i ++) {
var index = layerIntersections[i];
var line = this.lines[index].line;
2015-06-12 15:58:26 +02:00
2015-06-12 21:19:56 +02:00
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 x = line.end.x * alpha + line.start.x * (1 - alpha);
var z = line.end.z * alpha + line.start.z * (1 - alpha);
}
intersections[index] = new THREE.Vector2(z, x);
2015-04-24 16:12:48 +02:00
2015-06-12 21:19:56 +02:00
}
2015-04-24 16:12:48 +02:00
2015-06-12 21:19:56 +02:00
var done = [];
var sliceParts = [];
for (var i = 0; i < layerIntersections.length; i ++) {
var index = layerIntersections[i];
2015-04-24 16:12:48 +02:00
2015-06-12 21:19:56 +02:00
if (done.indexOf(index) === -1) {
var shape = [];
2015-04-24 16:12:48 +02:00
2015-06-12 21:19:56 +02:00
while (index !== -1) {
var intersection = intersections[index];
shape.push({X: intersection.x, Y: intersection.y});
2015-04-24 16:12:48 +02:00
2015-06-12 21:19:56 +02:00
var connects = this.lines[index].connects;
var faceNormals = this.lines[index].normals;
for (var j = 0; j < connects.length; j ++) {
index = connects[j];
2015-06-09 11:08:06 +02:00
2015-06-12 21:19:56 +02:00
if (intersections[index] !== undefined && done.indexOf(index) === -1) {
done.push(index);
2015-06-12 21:19:56 +02:00
var a = new THREE.Vector2(intersection.x, intersection.y);
var b = intersections[index];
2015-06-12 21:19:56 +02:00
var faceNormal = faceNormals[Math.floor(j/2)];
2015-06-09 11:08:06 +02:00
2015-06-12 21:19:56 +02:00
if (a.distanceTo(b) === 0 || faceNormal.equals(new THREE.Vector2(0, 0))) {
connects = connects.concat(this.lines[index].connects);
faceNormals = faceNormals.concat(this.lines[index].normals);
index = -1;
2015-06-09 11:08:06 +02:00
}
else {
2015-06-12 21:19:56 +02:00
var normal = a.sub(b).normal().normalize();
if (normal.dot(faceNormal) >= 0) {
//if (true) {
break;
}
else {
index = -1;
}
2015-06-09 11:08:06 +02:00
}
}
2015-06-12 21:19:56 +02:00
else {
index = -1;
}
2015-04-24 16:12:48 +02:00
}
}
2015-06-12 21:19:56 +02:00
//think this check is not nescesary, always higher as 0
if (shape.length > 1) {
var part = new D3D.Paths([shape]).clean(0.01);
sliceParts.push(part);
}
2015-04-24 16:12:48 +02:00
}
}
2015-06-12 21:19:56 +02:00
var slice = new D3D.Slice();
2015-06-09 11:08:06 +02:00
2015-06-12 21:19:56 +02:00
for (var i = 0; i < sliceParts.length; i ++) {
var slicePart1 = sliceParts[i];
var merge = false;
2015-05-13 13:18:37 +02:00
2015-06-12 21:19:56 +02:00
for (var j = 0; j < slice.parts.length; j ++) {
var slicePart2 = slice.parts[j].intersect;
2015-05-13 17:37:52 +02:00
2015-06-12 21:19:56 +02:00
if (slicePart2.intersect(slicePart1).length > 0) {
slicePart2.join(slicePart1);
merge = true;
break;
}
}
if (!merge) {
slice.addIntersect(slicePart1);
2015-05-13 17:37:52 +02:00
}
}
2015-06-12 21:19:56 +02:00
slices.push(slice);
2015-05-29 13:51:18 +02:00
2015-06-12 21:19:56 +02:00
this.progress.sliceLayer = layer;
this.updateProgress();
}
2015-04-24 16:12:48 +02:00
}
return slices;
};
2015-05-01 10:06:52 +02:00
D3D.Slicer.prototype.slicesToData = function (slices, printer) {
2015-04-30 20:34:57 +02:00
"use strict";
2015-04-30 18:26:34 +02:00
var scale = 100;
2015-06-11 15:42:38 +02:00
var layerHeight = printer.config["layerHeight"];
var nozzleDiameter = printer.config["nozzleDiameter"] * scale;
var shellThickness = printer.config["shellThickness"] * scale;
2015-06-12 21:19:56 +02:00
var fillGridSize = printer.config["fillGridSize"] * scale;
2015-06-11 15:42:38 +02:00
var brimOffset = printer.config["brimOffset"] * scale;
var bottomThickness = printer.config["bottomThickness"];
var topThickness = printer.config["topThickness"];
var useSupport = printer.config["supportUse"];
2015-06-12 21:19:56 +02:00
var supportGridSize = printer.config["supportGridSize"] * scale;
var supportAcceptanceMargin = printer.config["supportAcceptanceMargin"] * scale;
2015-06-11 15:42:38 +02:00
var supportMargin = printer.config["supportMargin"] * scale;
var plateSize = printer.config["supportPlateSize"] * scale;
var supportDistanceY = printer.config["supportDistanceY"];
var supportDistanceLayers = Math.ceil(supportDistanceY / layerHeight);
2015-05-18 13:53:49 +02:00
var bottomSkinCount = Math.ceil(bottomThickness/layerHeight);
var topSkinCount = Math.ceil(topThickness/layerHeight);
2015-05-20 19:10:18 +02:00
var nozzleRadius = nozzleDiameter / 2;
2015-05-01 11:03:07 +02:00
2015-05-15 11:14:44 +02:00
var lowFillTemplate = this.getFillTemplate({
left: this.geometry.boundingBox.min.z * scale,
top: this.geometry.boundingBox.min.x * scale,
right: this.geometry.boundingBox.max.z * scale,
bottom: this.geometry.boundingBox.max.x * scale
2015-06-12 21:19:56 +02:00
}, fillGridSize, true, true);
2015-04-24 16:12:48 +02:00
2015-06-11 14:34:30 +02:00
console.log("generating outer lines and inner lines");
2015-04-24 16:12:48 +02:00
for (var layer = 0; layer < slices.length; layer ++) {
var slice = slices[layer];
2015-06-09 21:58:22 +02:00
2015-06-11 14:34:30 +02:00
for (var i = 0; i < slice.parts.length; i ++) {
var part = slice.parts[i];
2015-06-09 21:58:22 +02:00
2015-06-11 14:34:30 +02:00
var outerLine = part.intersect.clone().scaleUp(scale).offset(-nozzleRadius);
2015-06-09 21:58:22 +02:00
2015-06-11 14:34:30 +02:00
if (outerLine.length > 0) {
part.outerLine = outerLine;
2015-06-09 21:58:22 +02:00
for (var offset = nozzleDiameter; offset <= shellThickness; offset += nozzleDiameter) {
2015-06-11 14:34:30 +02:00
var innerLine = outerLine.offset(-offset);
2015-06-09 21:58:22 +02:00
2015-06-11 14:34:30 +02:00
if (innerLine.length > 0) {
part.innerLines.push(innerLine);
}
else {
break;
}
2015-06-09 21:58:22 +02:00
}
}
}
}
2015-06-11 14:34:30 +02:00
console.log("generating infills");
for (var layer = 0; layer < slices.length; layer ++) {
var slice = slices[layer];
2015-05-13 17:37:52 +02:00
2015-06-11 14:34:30 +02:00
var downSkin = (layer - bottomSkinCount >= 0) ? slices[layer - bottomSkinCount].getOutline() : new D3D.Paths([], true);
var upSkin = (layer + topSkinCount < slices.length) ? slices[layer + topSkinCount].getOutline() : new D3D.Paths([], true);
var surroundingLayer = (downSkin.length === 0 || upSkin.length === 0) ? new D3D.Paths([], true) : upSkin.intersect(downSkin);
2015-04-30 18:26:34 +02:00
2015-06-11 14:34:30 +02:00
for (var i = 0; i < slice.parts.length; i ++) {
var part = slice.parts[i];
var outerLine = part.outerLine;
2015-04-24 16:12:48 +02:00
2015-06-11 14:34:30 +02:00
if (outerLine.length > 0) {
var inset = ((part.innerLines.length > 0) ? part.innerLines[part.innerLines.length - 1] : outerLine);
var fillArea = inset.offset(-nozzleRadius);
2015-05-18 13:53:49 +02:00
var highFillArea = fillArea.difference(surroundingLayer);
var lowFillArea = fillArea.difference(highFillArea);
2015-04-30 20:34:57 +02:00
2015-05-18 13:53:49 +02:00
var fill = new D3D.Paths([], false);
2015-05-13 12:12:15 +02:00
2015-05-18 13:53:49 +02:00
if (lowFillTemplate.length > 0) {
2015-06-11 14:34:30 +02:00
part.fill.join(lowFillTemplate.intersect(lowFillArea));
2015-05-18 13:53:49 +02:00
}
2015-04-30 20:34:57 +02:00
2015-05-18 13:53:49 +02:00
if (highFillArea.length > 0) {
var bounds = highFillArea.bounds();
var even = (layer % 2 === 0);
2015-05-20 19:10:18 +02:00
var highFillTemplate = this.getFillTemplate(bounds, nozzleDiameter, even, !even);
2015-06-11 14:34:30 +02:00
part.fill.join(highFillTemplate.intersect(highFillArea));
2015-05-18 13:53:49 +02:00
}
}
2015-04-30 20:34:57 +02:00
}
2015-05-29 13:51:18 +02:00
this.progress.dataLayer = layer;
this.updateProgress();
2015-04-30 18:26:34 +02:00
}
2015-06-09 21:58:22 +02:00
if (useSupport) {
2015-06-11 14:34:30 +02:00
console.log("generating support");
2015-06-09 21:58:22 +02:00
var supportTemplate = this.getFillTemplate({
left: this.geometry.boundingBox.min.z * scale,
top: this.geometry.boundingBox.min.x * scale,
right: this.geometry.boundingBox.max.z * scale,
bottom: this.geometry.boundingBox.max.x * scale
2015-06-12 21:19:56 +02:00
}, supportGridSize, true, true);
2015-05-12 11:29:01 +02:00
2015-06-09 21:58:22 +02:00
var supportAreas = new D3D.Paths([], true);
2015-05-12 11:29:01 +02:00
2015-06-11 14:34:30 +02:00
for (var layer = slices.length - 1 - supportDistanceLayers; layer >= 0; layer --) {
2015-06-13 20:09:44 +02:00
if (supportAreas.length > 1) {
if (layer >= supportDistanceLayers) {
2015-06-11 14:34:30 +02:00
var sliceSkin = slices[layer - supportDistanceLayers].getOutline();
sliceSkin = sliceSkin.offset(supportMargin);
supportAreas = supportAreas.difference(sliceSkin);
2015-06-09 21:58:22 +02:00
}
2015-04-24 16:12:48 +02:00
2015-06-11 14:34:30 +02:00
var currentSlice = slices[layer];
2015-04-24 16:12:48 +02:00
if (layer === 0) {
supportAreas = supportAreas.offset(plateSize).difference(sliceSkin);
2015-05-13 17:37:52 +02:00
var template = this.getFillTemplate(supportAreas.bounds(), nozzleDiameter, true, false);
2015-04-24 16:12:48 +02:00
2015-06-11 14:34:30 +02:00
currentSlice.support = template.intersect(supportAreas);
2015-04-24 16:12:48 +02:00
}
else {
2015-06-11 14:34:30 +02:00
currentSlice.support = supportTemplate.intersect(supportAreas).join(supportAreas.clone());
}
}
2015-04-24 16:12:48 +02:00
2015-06-11 14:34:30 +02:00
var supportSkin = slices[layer + supportDistanceLayers - 1].getOutline();
2015-05-26 11:44:15 +02:00
2015-06-11 14:34:30 +02:00
var slice = slices[layer + supportDistanceLayers];
for (var i = 0; i < slice.parts.length; i ++) {
var slicePart = slice.parts[i];
var outerLine = slicePart.outerLine;
2015-06-09 21:58:22 +02:00
2015-06-12 21:19:56 +02:00
var overlap = supportSkin.offset(supportAcceptanceMargin).intersect(outerLine);
2015-06-11 14:34:30 +02:00
var overhang = outerLine.difference(overlap);
2015-04-30 18:26:34 +02:00
if (overlap.length === 0 || overhang.length > 0) {
2015-06-11 14:34:30 +02:00
//var supportArea = outerLine.difference(supportSkin.intersect(outerLine));
//supportAreas = supportAreas.union(supportArea);
//supportAreas = supportAreas.union(overhang);
2015-06-12 21:19:56 +02:00
supportAreas = supportAreas.union(overhang.offset(supportAcceptanceMargin).intersect(outerLine));
2015-06-09 21:58:22 +02:00
}
}
}
}
2015-04-30 18:26:34 +02:00
2015-06-11 14:34:30 +02:00
console.log("opimize paths");
2015-06-09 21:58:22 +02:00
var start = new THREE.Vector2(0, 0);
2015-04-30 18:26:34 +02:00
2015-06-11 14:34:30 +02:00
for (var layer = 0; layer < slices.length; layer ++) {
var slice = slices[layer];
2015-04-30 18:26:34 +02:00
2015-06-11 14:34:30 +02:00
if (layer === 0) {
slice.brim = slice.getOutline().offset(brimOffset);
}
2015-05-13 17:37:52 +02:00
2015-06-11 14:34:30 +02:00
var start = slice.optimizePaths(start);
for (var i = 0; i < slice.parts.length; i ++) {
var part = slice.parts[i];
2015-05-29 13:51:18 +02:00
2015-06-11 14:34:30 +02:00
part.outerLine.scaleDown(scale);
for (var j = 0; j < part.innerLines.length; j ++) {
var innerLine = part.innerLines[j];
innerLine.scaleDown(scale);
2015-06-09 21:58:22 +02:00
}
2015-06-11 14:34:30 +02:00
part.fill.scaleDown(scale);
}
if (slice.support !== undefined) {
slice.support.scaleDown(scale);
}
if (slice.brim !== undefined) {
slice.brim.scaleDown(scale);
2015-06-09 21:58:22 +02:00
}
2015-04-24 16:12:48 +02:00
}
2015-06-09 21:58:22 +02:00
2015-06-11 14:34:30 +02:00
return slices;
2015-06-09 21:58:22 +02:00
};
2015-04-24 16:12:48 +02:00
2015-06-09 21:58:22 +02:00
D3D.Slicer.prototype.getFillTemplate = function (bounds, size, even, uneven) {
"use strict";
2015-05-19 19:04:20 +02:00
2015-06-09 21:58:22 +02:00
var paths = new D3D.Paths([], false);
if (even) {
for (var length = Math.floor(bounds.left/size)*size; length <= Math.ceil(bounds.right/size)*size; length += size) {
paths.push([{X: length, Y: bounds.top}, {X: length, Y: bounds.bottom}]);
}
}
if (uneven) {
for (var length = Math.floor(bounds.top/size)*size; length <= Math.floor(bounds.bottom/size)*size; length += size) {
paths.push([{X: bounds.left, Y: length}, {X: bounds.right, Y: length}]);
}
}
//return paths;
return paths;
2015-05-01 10:06:52 +02:00
};
2015-06-09 11:08:06 +02:00
D3D.Slicer.prototype.dataToGCode = function (data, printer) {
2015-05-01 12:15:46 +02:00
"use strict";
var gcode = new D3D.GCode().setSettings(printer);
2015-05-01 12:15:46 +02:00
2015-06-11 15:42:38 +02:00
function sliceToGCode (path, retract, unRetract, type) {
2015-06-12 15:58:26 +02:00
for (var i = 0; i < path.length; i ++) {
var shape = path[i];
2015-05-01 12:15:46 +02:00
var length = path.closed ? (shape.length + 1) : shape.length;
2015-05-01 12:15:46 +02:00
for (var j = 0; j < length; j ++) {
var point = shape[j % shape.length];
2015-05-01 14:09:45 +02:00
if (j === 0) {
2015-06-11 15:42:38 +02:00
gcode.moveTo(point.X, point.Y, layer);
if (unRetract) {
gcode.unRetract();
}
}
else {
2015-06-11 15:42:38 +02:00
gcode.lineTo(point.X, point.Y, layer, type);
}
}
}
if (retract) {
gcode.retract();
}
}
for (var layer = 0; layer < data.length; layer ++) {
var slice = data[layer];
if (layer === 1) {
2015-06-09 11:08:06 +02:00
gcode.turnFanOn();
gcode.bottom = false;
}
2015-05-01 12:15:46 +02:00
2015-06-11 14:34:30 +02:00
if (slice.brim !== undefined) {
2015-06-11 15:42:38 +02:00
sliceToGCode(slice.brim, true, true, "brim");
2015-06-11 14:34:30 +02:00
}
2015-05-13 17:37:52 +02:00
2015-06-11 14:34:30 +02:00
for (var i = 0; i < slice.parts.length; i ++) {
var part = slice.parts[i];
2015-06-09 21:58:22 +02:00
2015-06-11 15:42:38 +02:00
sliceToGCode(part.outerLine, false, true, "outerLine");
2015-06-12 15:58:26 +02:00
2015-06-11 14:34:30 +02:00
for (var j = 0; j < part.innerLines.length; j ++) {
var innerLine = part.innerLines[j];
2015-06-11 15:42:38 +02:00
sliceToGCode(innerLine, false, false, "innerLine");
2015-06-09 21:58:22 +02:00
}
2015-06-12 15:58:26 +02:00
2015-06-11 15:42:38 +02:00
sliceToGCode(part.fill, true, false, "fill");
2015-06-11 14:34:30 +02:00
}
if (slice.support !== undefined) {
2015-06-11 15:42:38 +02:00
sliceToGCode(slice.support, true, true, "support");
2015-05-13 17:37:52 +02:00
}
this.progress.gcodeLayer = layer;
this.updateProgress();
2015-05-01 12:15:46 +02:00
}
2015-06-09 11:08:06 +02:00
return gcode.getGCode();
2015-05-01 12:15:46 +02:00
};
2015-06-09 11:08:06 +02:00
D3D.Slicer.prototype.getGCode = function (printer) {
2015-05-01 10:06:52 +02:00
"use strict";
2015-06-11 15:42:38 +02:00
var layerHeight = printer.config["layerHeight"];
var dimensionsZ = printer.config["dimensionsZ"];
2015-05-01 10:06:52 +02:00
this.progress.totalLayers = Math.floor(Math.min(this.geometry.boundingBox.max.y, dimensionsZ) / layerHeight);
2015-05-29 13:51:18 +02:00
this.progress.sliceLayer = 0;
this.progress.dataLayer = 0;
this.progress.gcodeLayer = 0;
2015-05-07 18:14:10 +02:00
var start = new Date().getTime();
2015-05-20 19:10:18 +02:00
var slices = this.slice(layerHeight, dimensionsZ);
2015-05-07 18:14:10 +02:00
var end = new Date().getTime();
console.log("Slicing: " + (end - start) + "ms");
2015-05-20 19:10:18 +02:00
start = new Date().getTime();
2015-06-11 14:34:30 +02:00
this.slicesToData(slices, printer);
2015-05-20 19:10:18 +02:00
end = new Date().getTime();
2015-05-07 18:14:10 +02:00
console.log("Data: " + (end - start) + "ms");
2015-05-20 19:10:18 +02:00
start = new Date().getTime();
2015-06-11 14:34:30 +02:00
var gcode = this.dataToGCode(slices, printer);
2015-05-20 19:10:18 +02:00
end = new Date().getTime();
2015-05-07 18:14:10 +02:00
console.log("Gcode: " + (end - start) + "ms");
2015-04-24 16:12:48 +02:00
return gcode;
};