diff --git a/library/clipper.js b/library/clipper.js index eb844d7..b0420e9 100755 --- a/library/clipper.js +++ b/library/clipper.js @@ -2876,8 +2876,8 @@ }; ClipperLib.ClipperBase.prototype.AddPaths = function (ppg, polyType, closed) { - // console.warn("-------------------------------------------"); - // console.warn(JSON.stringify(ppg)); + // console.log("-------------------------------------------"); + // console.log(JSON.stringify(ppg)); var result = false; for (var i = 0, ilen = ppg.length; i < ilen; ++i) if (this.AddPath(ppg[i], polyType, closed)) @@ -3100,7 +3100,7 @@ if (this.m_ExecuteLocked) return false; if (this.m_HasOpenPaths) - //ClipperLib.Error("Error: PolyTree struct is need for open path clipping."); + ClipperLib.Error("Error: PolyTree struct is need for open path clipping."); this.m_ExecuteLocked = true; ClipperLib.Clear(solution); this.m_SubjFillType = subjFillType; @@ -3185,7 +3185,7 @@ if (this.m_Scanbeam === null) break; var topY = this.PopScanbeam(); - //console.warn("botY:" + botY + ", topY:" + topY); + //console.log("botY:" + botY + ", topY:" + topY); if (!this.ProcessIntersections(botY, topY)) return false; this.ProcessEdgesAtTopOfScanbeam(topY); @@ -4747,7 +4747,7 @@ return; //prepare for sorting ... var e = this.m_ActiveEdges; - //console.warn(JSON.stringify(JSON.decycle( e ))); + //console.log(JSON.stringify(JSON.decycle( e ))); this.m_SortedEdges = e; while (e !== null) { @@ -4766,13 +4766,13 @@ { var eNext = e.NextInSEL; var pt = new ClipperLib.IntPoint(); - //console.warn("e.Curr.X: " + e.Curr.X + " eNext.Curr.X" + eNext.Curr.X); + //console.log("e.Curr.X: " + e.Curr.X + " eNext.Curr.X" + eNext.Curr.X); if (e.Curr.X > eNext.Curr.X) { if (!this.IntersectPoint(e, eNext, pt) && e.Curr.X > eNext.Curr.X + 1) { - //console.warn("e.Curr.X: "+JSON.stringify(JSON.decycle( e.Curr.X ))); - //console.warn("eNext.Curr.X+1: "+JSON.stringify(JSON.decycle( eNext.Curr.X+1))); + //console.log("e.Curr.X: "+JSON.stringify(JSON.decycle( e.Curr.X ))); + //console.log("eNext.Curr.X+1: "+JSON.stringify(JSON.decycle( eNext.Curr.X+1))); ClipperLib.Error("Intersection error"); } if (pt.Y > botY) @@ -6469,7 +6469,7 @@ if (solution.length > 0) solution.splice(0, 1); } - //console.warn(JSON.stringify(solution)); + //console.log(JSON.stringify(solution)); } else // function (polytree, delta) { diff --git a/models/d20.stl b/models/d20.stl new file mode 100644 index 0000000..2546bd9 Binary files /dev/null and b/models/d20.stl differ diff --git a/models/pikachu.stl b/models/pikachu.stl new file mode 100644 index 0000000..77ccc67 Binary files /dev/null and b/models/pikachu.stl differ diff --git a/slice_test.html b/slice_test.html index 6c540b9..8f66ec4 100644 --- a/slice_test.html +++ b/slice_test.html @@ -30,7 +30,6 @@ canvas {border: 1px solid black;} //geimplimenteerd worden in de doodlebox? var printerConfig = { "printer.baudrate": "115200", //wat is dit? - "printer.bed.temperature": 70, "printer.bottomFlowRate": 1.0, "printer.bottomLayerSpeed": 35, "printer.dimensions.x": 200, @@ -69,7 +68,7 @@ var printerConfig = { var printer = new D3D.Printer(printerConfig); var localIp = location.hash.substring(1); -var doodleBox = new D3D.Box(localIp); +//var doodleBox = new D3D.Box(localIp); //var printer = doodleBox.printer; var scene = new THREE.Scene(); @@ -79,47 +78,20 @@ renderer.setClearColor(0xffffff, 1); var camera = new THREE.PerspectiveCamera(75, renderer.domElement.width/renderer.domElement.height, 1, 10000); +var light = new THREE.AmbientLight(0x404040); +scene.add(light ); + +var directionalLight = new THREE.DirectionalLight(0xffffff, 0.5); +directionalLight.position.set(0, 1, 1); +scene.add(directionalLight); + applyMouseControls(renderer, camera, new THREE.Vector3(100, 0, 100), 1000); -var geometry = (function () { - "use strict"; - - var circle = new THREE.Shape(); - circle.absarc(0, 0, 100, 0, Math.PI*2, false); - - var hole = new THREE.Path(); - hole.absarc(0, 0, 15, 0, Math.PI*2, true ); - - circle.holes.push(hole); - - var matrix = new THREE.Matrix4(); - matrix.makeRotationX(Math.PI*1.5); - - var geometry = new THREE.ExtrudeGeometry(circle, { - amount: 3, - bevelEnabled: false, - steps: 1 - }); - geometry.applyMatrix(matrix); - - return geometry; -})(); - -var material = new THREE.MeshBasicMaterial({color: 0x000000, wireframe: true}); -var geometry = new THREE.TorusGeometry(20, 10, 30, 30); -var geometry = new THREE.BoxGeometry(10, 10, 10, 1, 1, 1); -//var geometry = new THREE.SphereGeometry(10, 10, 10); -var mesh = new THREE.Mesh(geometry, material); -mesh.position.x = 100; -mesh.position.z = 100; -//scene.add(mesh); - var loader = new THREE.STLLoader(); loader.load("models/stanford_bunny.stl", function (geometry) { //var geometry = new THREE.BoxGeometry(10, 10, 10, 1, 1, 1); //var geometry = new THREE.SphereGeometry(10, 10, 10); //var geometry = new THREE.TorusGeometry(20, 10, 30, 30); - /* var geometry = (function () { "use strict"; @@ -146,6 +118,7 @@ loader.load("models/stanford_bunny.stl", function (geometry) { })(); */ + var material = new THREE.MeshPhongMaterial({color: 0x00ff00}); var mesh = new THREE.Mesh(geometry, material); mesh.rotation.x = -Math.PI/2; @@ -154,11 +127,6 @@ loader.load("models/stanford_bunny.stl", function (geometry) { mesh.position.z = 100; //mesh.position.y = -2; - ///* - //mesh.rotation.x = -Math.PI/2; - //mesh is lifted a little bit... - //mesh.position.y = 26.5; - //*/ scene.add(mesh); var slicer = new D3D.Slicer().setMesh(mesh); @@ -166,7 +134,7 @@ loader.load("models/stanford_bunny.stl", function (geometry) { var canvas = document.getElementById("canvas"); var context = canvas.getContext("2d"); - var img = slicer.drawPaths(printer, 7, 8); + var img = slicer.drawPaths(printer, 0, 1); context.drawImage(img, 0, 0); gcode = slicer.getGcode(printer); diff --git a/src/slicer.js b/src/slicer.js index 4949f5a..d82ee9c 100644 --- a/src/slicer.js +++ b/src/slicer.js @@ -14,8 +14,6 @@ D3D.Slicer = function () { "use strict"; - - this.lines = []; }; D3D.Slicer.prototype.setMesh = function (mesh) { "use strict"; @@ -44,7 +42,8 @@ D3D.Slicer.prototype.setMesh = function (mesh) { mesh.updateMatrix(); geometry.applyMatrix(mesh.matrix); geometry.computeFaceNormals(); - + geometry.computeBoundingBox(); + this.geometry = geometry; //get unique lines from geometry; @@ -62,7 +61,7 @@ D3D.Slicer.prototype.createLines = function () { function addLine (a, b) { //think lookup can only be b_a, a_b is only possible when face is flipped - var index = lineLookup[a + "_" + b] || lineLookup[b + "_" + a]; + var index = lineLookup[b + "_" + a] || lineLookup[a + "_" + b]; if (index === undefined) { index = self.lines.length; @@ -82,8 +81,8 @@ D3D.Slicer.prototype.createLines = function () { for (var i = 0; i < this.geometry.faces.length; i ++) { var face = this.geometry.faces[i]; - //if (face.normal.y !== 1 && face.normal.y !== -1) { - var normal = new THREE.Vector2().set(face.normal.x, face.normal.z).normalize(); + if (face.normal.y !== 1 && face.normal.y !== -1) { + var normal = new THREE.Vector2().set(face.normal.z, face.normal.x).normalize(); //check for only adding unique lines //returns index of said line @@ -99,7 +98,7 @@ D3D.Slicer.prototype.createLines = function () { this.lines[a].normals.push(normal); this.lines[b].normals.push(normal); this.lines[c].normals.push(normal); - //} + } } }; D3D.Slicer.prototype.slice = function (height, step) { @@ -126,6 +125,7 @@ D3D.Slicer.prototype.slice = function (height, step) { var slices = []; for (var layer = 1; layer < layersIntersections.length-1; layer ++) { + //for (var layer = 0; layer < layersIntersections.length; layer ++) { var layerIntersections = layersIntersections[layer]; var y = layer*step; @@ -138,11 +138,11 @@ D3D.Slicer.prototype.slice = function (height, step) { 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(x, z); + intersections[index] = new THREE.Vector2(z, x); } var done = []; - var slice = new D3D.Paths([], true); + var slice = []; for (var i = 0; i < layerIntersections.length; i ++) { var index = layerIntersections[i]; @@ -327,6 +327,7 @@ D3D.Slicer.prototype.slicesToData = function (slices, printer) { else { fill = fill.optimizePath(outerLayer.lastPoint()); } + if (fill.length > 0) { start = fill.lastPoint(); } @@ -353,12 +354,12 @@ D3D.Slicer.prototype.getFillTemplate = function (bounds, size, even, uneven) { var paths = new D3D.Paths([], false); if (even) { - for (var length = Math.floor(bounds.left); length <= Math.ceil(bounds.right); length += size) { + 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); length <= Math.floor(bounds.bottom); length += size) { + 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}]); } } @@ -525,13 +526,6 @@ D3D.Slicer.prototype.getGcode = function (printer) { console.log("Data: " + (end - start) + "ms"); - //return data; - - //TODO - //make the path more optimized for 3d printers - //make the printer follow the shortest path from line to line - //see https://github.com/Ultimaker/CuraEngine#gcode-generation - var start = new Date().getTime(); var gcode = this.dataToGcode(data, printer); var end = new Date().getTime();