casperlamboo 2015-06-15 17:22:36 +02:00
parent f7e9309e6d
commit a70ba60854
3 changed files with 250 additions and 15 deletions

2
.gitignore vendored
View File

@ -21,3 +21,5 @@ src/oldcode.js
test.html test.html
print_manager.html print_manager.html
testdata.json

View File

@ -23,12 +23,15 @@ D3D.Slicer.prototype.setMesh = function (geometry, matrix) {
if (geometry instanceof THREE.BufferGeometry) { if (geometry instanceof THREE.BufferGeometry) {
geometry = new THREE.Geometry().fromBufferGeometry(geometry); geometry = new THREE.Geometry().fromBufferGeometry(geometry);
} }
else {
geometry = geometry.clone();
}
//apply mesh matrix on geometry; //apply mesh matrix on geometry;
geometry.mergeVertices();
geometry.applyMatrix(matrix); geometry.applyMatrix(matrix);
geometry.computeBoundingBox(); geometry.computeBoundingBox();
geometry.computeFaceNormals(); geometry.computeFaceNormals();
geometry.mergeVertices();
this.geometry = geometry; this.geometry = geometry;
@ -82,7 +85,7 @@ D3D.Slicer.prototype.createLines = function () {
var face = this.geometry.faces[i]; var face = this.geometry.faces[i];
if (face.normal.y !== 1 && face.normal.y !== -1) { if (face.normal.y !== 1 && face.normal.y !== -1) {
var normal = new THREE.Vector2().set(face.normal.z, face.normal.x).normalize(); var normal = new THREE.Vector2(face.normal.z, face.normal.x).normalize();
//check for only adding unique lines //check for only adding unique lines
//returns index of said line //returns index of said line
@ -107,6 +110,8 @@ D3D.Slicer.prototype.createLines = function () {
D3D.Slicer.prototype.slice = function (layerHeight, height) { D3D.Slicer.prototype.slice = function (layerHeight, height) {
"use strict"; "use strict";
var testData = [];
var numLayers = height / layerHeight; var numLayers = height / layerHeight;
var layersIntersections = []; var layersIntersections = [];
@ -132,6 +137,8 @@ D3D.Slicer.prototype.slice = function (layerHeight, height) {
for (var layer = 1; layer < layersIntersections.length; layer ++) { for (var layer = 1; layer < layersIntersections.length; layer ++) {
var layerIntersections = layersIntersections[layer]; var layerIntersections = layersIntersections[layer];
var testPoints = [];
if (layerIntersections.length > 0) { if (layerIntersections.length > 0) {
var y = layer * layerHeight; var y = layer * layerHeight;
@ -152,6 +159,13 @@ D3D.Slicer.prototype.slice = function (layerHeight, height) {
} }
intersections[index] = new THREE.Vector2(z, x); intersections[index] = new THREE.Vector2(z, x);
testPoints.push({
x: z,
y: x,
connects: this.lines[index].connects,
index: index,
normals: this.lines[index].normals
});
} }
var done = []; var done = [];
@ -163,23 +177,26 @@ D3D.Slicer.prototype.slice = function (layerHeight, height) {
var shape = []; var shape = [];
while (index !== -1) { while (index !== -1) {
done.push(index);
var intersection = intersections[index]; var intersection = intersections[index];
shape.push({X: intersection.x, Y: intersection.y}); shape.push({X: intersection.x, Y: intersection.y});
var connects = this.lines[index].connects; var connects = this.lines[index].connects.clone();
var faceNormals = this.lines[index].normals; var faceNormals = this.lines[index].normals.clone();
for (var j = 0; j < connects.length; j ++) { for (var j = 0; j < connects.length; j ++) {
index = connects[j]; index = connects[j];
if (intersections[index] !== undefined && done.indexOf(index) === -1) { if (intersections[index] !== undefined && done.indexOf(index) === -1) {
done.push(index);
var a = new THREE.Vector2(intersection.x, intersection.y); var a = new THREE.Vector2(intersection.x, intersection.y);
var b = intersections[index]; var b = intersections[index];
var faceNormal = faceNormals[Math.floor(j/2)]; var faceNormal = faceNormals[Math.floor(j/2)];
if (a.distanceTo(b) === 0 || faceNormal.equals(new THREE.Vector2(0, 0))) { if (a.distanceTo(b) === 0 || faceNormal.length() === 0) {
done.push(index);
connects = connects.concat(this.lines[index].connects); connects = connects.concat(this.lines[index].connects);
faceNormals = faceNormals.concat(this.lines[index].normals); faceNormals = faceNormals.concat(this.lines[index].normals);
index = -1; index = -1;
@ -187,8 +204,7 @@ D3D.Slicer.prototype.slice = function (layerHeight, height) {
else { else {
var normal = a.sub(b).normal().normalize(); var normal = a.sub(b).normal().normalize();
if (normal.dot(faceNormal) >= 0) { if (normal.dot(faceNormal) > 0) {
//if (true) {
break; break;
} }
else { else {
@ -202,8 +218,8 @@ D3D.Slicer.prototype.slice = function (layerHeight, height) {
} }
} }
if (shape.length > 1) { var part = new D3D.Paths([shape]).clean(0.01);
var part = new D3D.Paths([shape]).clean(0.01); if (part.length > 0) {
sliceParts.push(part); sliceParts.push(part);
} }
} }
@ -231,10 +247,20 @@ D3D.Slicer.prototype.slice = function (layerHeight, height) {
slices.push(slice); slices.push(slice);
if (layer === 222) {
testData.push({
testPoints: testPoints,
pathData: slice.parts
});
}
this.progress.sliceLayer = layer; this.progress.sliceLayer = layer;
this.updateProgress(); this.updateProgress();
} }
} }
console.log(JSON.stringify(testData));
return slices; return slices;
}; };
D3D.Slicer.prototype.slicesToData = function (slices, printer) { D3D.Slicer.prototype.slicesToData = function (slices, printer) {
@ -393,7 +419,7 @@ D3D.Slicer.prototype.slicesToData = function (slices, printer) {
slice.brim = slice.getOutline().offset(brimOffset); slice.brim = slice.getOutline().offset(brimOffset);
} }
var start = slice.optimizePaths(start); start = slice.optimizePaths(start);
for (var i = 0; i < slice.parts.length; i ++) { for (var i = 0; i < slice.parts.length; i ++) {
var part = slice.parts[i]; var part = slice.parts[i];
@ -423,8 +449,8 @@ D3D.Slicer.prototype.getFillTemplate = function (bounds, size, even, uneven) {
var paths = new D3D.Paths([], false); var paths = new D3D.Paths([], false);
if (even) { if (even) {
var left = Math.floor(bounds.left/size)*size; var left = Math.floor(bounds.left / size) * size;
var right = Math.ceil(bounds.right/size)*size; var right = Math.ceil(bounds.right / size) * size;
for (var length = left; length <= right; length += size) { for (var length = left; length <= right; length += size) {
paths.push([ paths.push([
@ -434,8 +460,8 @@ D3D.Slicer.prototype.getFillTemplate = function (bounds, size, even, uneven) {
} }
} }
if (uneven) { if (uneven) {
var top = Math.floor(bounds.top/size)*size; var top = Math.floor(bounds.top / size) * size;
var bottom = Math.floor(bounds.bottom/size)*size; var bottom = Math.floor(bounds.bottom / size) * size;
for (var length = top; length <= bottom; length += size) { for (var length = top; length <= bottom; length += size) {
paths.push([ paths.push([

View File

@ -0,0 +1,207 @@
Sidebar.Printer = function ( editor ) {
var USER_SETTINGS, PRINTER_SETTINGS, selectedPrinter;
function settingsLoaded () {
printer.updateConfig(USER_SETTINGS);
var options = {};
for (var i in PRINTER_SETTINGS) {
options[i] = i;
}
printerType.setOptions(options);
}
var container = new UI.CollapsiblePanel();
container.setCollapsed( editor.config.getKey( 'ui/sidebar/printer/collapsed' ) );
container.onCollapsedChange( function ( boolean ) {
editor.config.setKey( 'ui/sidebar/printer/collapsed', boolean );
} );
var printer = new D3D.Printer();
var localIp = location.hash.substring(1);
var doodleBox = new D3D.Box(localIp).init();
container.addStatic( new UI.Text( 'PRINTER' ) );
container.add( new UI.Break() );
function createRow (name) {
var row = new UI.Panel();
row.add( new UI.Text( name ).setWidth( '150px' ) );
var fill = new UI.Text( '' ).setWidth( '90px' );
row.add(fill);
container.add(row);
return fill;
}
var state = createRow('State');
var bedTemperature = createRow('Bed Temperature');
var bedTargetTemperature = createRow('Bed Target Temperature');
var nozzleTemperature = createRow('Nozzle Temperature');
var nozzleTargetTemperature = createRow('Nozzle Target Temperature');
var currentLine = createRow('Current Line');
var bufferedLines = createRow('Buffered Lines');
var totalLines = createRow('Total Lines');
var printBatches = createRow('Print Batches');
doodleBox.onupdate = function (data) {
state.setValue(data["state"]);
bedTemperature.setValue(data["bed"]);
bedTargetTemperature.setValue(data["bed_target"]);
nozzleTemperature.setValue(data["hotend"]);
nozzleTargetTemperature.setValue(data["hotend_target"]);
currentLine.setValue(data["current_line"]);
bufferedLines.setValue(data["buffered_lines"]);
totalLines.setValue(data["total_lines"]);
printBatches.setValue(doodleBox.printBatches.length);
};
var printerTypeRow = new UI.Panel();
var printerType = new UI.Select().setWidth( '150px' );
printerType.onChange( function () {
var type = printerType.getValue();
selectedPrinter = type;
printer.updateConfig(PRINTER_SETTINGS[selectedPrinter]);
} );
printerTypeRow.add( new UI.Text( 'Printer' ).setWidth( '90px' ) );
printerTypeRow.add( printerType );
container.add( printerTypeRow );
var progress = createRow("Progress");
var slice = new UI.Button( 'Slice' );
slice.onClick( function () {
if (selectedPrinter === undefined) {
alert("No Printer Selected");
return;
}
var geometryCombined = new THREE.Geometry();
for (var i = 0; i < editor.scene.children.length; i ++) {
var child = editor.scene.children[i];
if (child instanceof THREE.Mesh) {
var mesh = child;
mesh.updateMatrix();
var geometry = mesh.geometry.clone();
geometry.applyMatrix(mesh.matrix);
if (geometry instanceof THREE.BufferGeometry) {
geometry = new THREE.Geometry().fromBufferGeometry(geometry);
}
geometryCombined.merge(geometry);
}
}
geometryCombined.computeBoundingBox();
var mesh = new THREE.Mesh(geometryCombined, new THREE.MeshBasicMaterial);
mesh.position.y = -geometryCombined.boundingBox.min.y;
var slicer = new D3D.SlicerWorker();
slicer.onprogress = function (_progress) {
progress.setValue(Math.round(_progress.procent * 100) + "%");
};
slicer.onfinish = function (gcode) {
var print = new UI.Button( 'Start Print' );
print.onClick( function () {
doodleBox.print(gcode);
} );
container.add( print );
var download = new UI.Button( 'Download GCode' );
download.onClick( function () {
downloadFile("gcode.gcode", gcode);
} );
container.add( download );
};
slicer.setSettings(USER_SETTINGS, PRINTER_SETTINGS[selectedPrinter]);
slicer.setMesh(mesh);
slicer.slice();
slicer.close();
} );
container.add( slice );
var stop = new UI.Button( 'Stop Print' );
stop.onClick( function () {
if (selectedPrinter === undefined) {
alert("No Printer Selected");
return;
}
doodleBox.stopPrint(printer);
} );
container.add( stop );
container.add( new UI.Break() );
(function () {
'use strict';
var loadedItems = 0;
function loaded () {
loadedItems ++;
if (loadedItems === 2) {
//finish loading
settingsLoaded();
}
}
$.ajax({
url: '../../settings/user_settings.json',
dataType: 'json',
success: function (response) {
USER_SETTINGS = response;
loaded();
}
});
$.ajax({
url: '../../settings/printer_settings.json',
dataType: 'json',
success: function (response) {
PRINTER_SETTINGS = response;
loaded();
}
});
})();
return container;
}