From 83f543b62bbf6f37347d30a7ad649ddb32fbe46a Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Tue, 18 Jul 2017 16:55:27 +0200 Subject: [PATCH 01/12] fix isFlat check --- src/sliceActions/calculateLayersIntersections.js | 4 ++-- src/sliceActions/createLines.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sliceActions/calculateLayersIntersections.js b/src/sliceActions/calculateLayersIntersections.js index 76b0e9f..114bc2b 100644 --- a/src/sliceActions/calculateLayersIntersections.js +++ b/src/sliceActions/calculateLayersIntersections.js @@ -9,9 +9,9 @@ export default function calculateLayersIntersections(lines, settings) { const layerIntersectionPoints = Array.from(Array(numLayers)).map(() => []); for (let lineIndex = 0; lineIndex < lines.length; lineIndex ++) { - const line = lines[lineIndex].line; + const { line, isFlat } = lines[lineIndex]; - if (line.isFlat) continue; + if (isFlat) continue; const min = Math.ceil(Math.min(line.start.y, line.end.y) / layerHeight); const max = Math.floor(Math.max(line.start.y, line.end.y) / layerHeight); diff --git a/src/sliceActions/createLines.js b/src/sliceActions/createLines.js index 188f1c3..5a6e3fc 100644 --- a/src/sliceActions/createLines.js +++ b/src/sliceActions/createLines.js @@ -25,7 +25,7 @@ export default function createLines(geometry, settings) { const lookupB = lineLookup[`${face.c}_${face.b}`]; const lookupC = lineLookup[`${face.a}_${face.c}`]; - const isFlat = face.normal.y !== 1 && face.normal.y !== -1; + const isFlat = face.normal.y > 0.999 || face.normal.y < -0.999; // only add unique lines // returns index of said line From 73f0433e0030b79dff21a4831e81942273770ae2 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 19 Jul 2017 11:02:14 +0200 Subject: [PATCH 02/12] wrap progress in object So data could be extended in the future --- README.md | 2 +- example/save.js | 2 +- src/slicerWorker.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c813056..6a2a04a 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ const geometry = new THREE.TorusGeometry(20, 10, 30, 30); const slicer = new SLICER.Slicer(); slicer.setGeometry(geometry); const gcode = await slicer.slice(settings) - .progress(({ done, total, action }) => { + .progress(({ progress: { done, total, action } }) => { const percentage = `${(done / total * 100).toFixed()}%` console.log(action, percentage); }); diff --git a/example/save.js b/example/save.js index 353ef0d..9524c6c 100644 --- a/example/save.js +++ b/example/save.js @@ -17,7 +17,7 @@ jsonLoader.load('models/airplane.json', async geometry => { const slicer = new Slicer().setGeometry(geometry); const gcode = await slicer.slice(settings) - .progress(({ done, total, action }) => { + .progress(({ progress: { done, total, action } }) => { const percentage = `${(done / total * 100).toFixed()}%` document.write(`

${action}, ${percentage}

`); }); diff --git a/src/slicerWorker.js b/src/slicerWorker.js index a761bd4..369e4b3 100644 --- a/src/slicerWorker.js +++ b/src/slicerWorker.js @@ -6,7 +6,7 @@ const loader = new THREE.JSONLoader(); const onProgress = progress => { self.postMessage({ message: 'PROGRESS', - data: progress + data: { progress } }); } From 1e16c741a02ed996ef1e333b2c6aec7f26fd80a0 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 19 Jul 2017 11:02:42 +0200 Subject: [PATCH 03/12] move helper classes to helper folder --- src/{ => sliceActions/helpers}/GCode.js | 0 src/{ => sliceActions/helpers}/Slice.js | 0 src/sliceActions/shapesToSlices.js | 2 +- src/sliceActions/slicesToGCode.js | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) rename src/{ => sliceActions/helpers}/GCode.js (100%) rename src/{ => sliceActions/helpers}/Slice.js (100%) diff --git a/src/GCode.js b/src/sliceActions/helpers/GCode.js similarity index 100% rename from src/GCode.js rename to src/sliceActions/helpers/GCode.js diff --git a/src/Slice.js b/src/sliceActions/helpers/Slice.js similarity index 100% rename from src/Slice.js rename to src/sliceActions/helpers/Slice.js diff --git a/src/sliceActions/shapesToSlices.js b/src/sliceActions/shapesToSlices.js index 615d242..f77eaee 100644 --- a/src/sliceActions/shapesToSlices.js +++ b/src/sliceActions/shapesToSlices.js @@ -1,5 +1,5 @@ import Shape from 'Doodle3D/clipper-js'; -import Slice from '../Slice.js'; +import Slice from './helpers/Slice.js'; import { CLEAN_DELTA, PRECISION } from '../constants.js'; diff --git a/src/sliceActions/slicesToGCode.js b/src/sliceActions/slicesToGCode.js index 7268ae3..407619a 100644 --- a/src/sliceActions/slicesToGCode.js +++ b/src/sliceActions/slicesToGCode.js @@ -1,4 +1,4 @@ -import GCode from '../GCode.js'; +import GCode from './helpers/GCode.js'; export default function slicesToGCode(slices, settings) { const gcode = new GCode(settings); From 3b4dbc0d4ab28976e440e1d1f930fed09855d42c Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 19 Jul 2017 11:03:16 +0200 Subject: [PATCH 04/12] fix settings deconstructing --- src/sliceActions/generateSupport.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sliceActions/generateSupport.js b/src/sliceActions/generateSupport.js index 2a1a01e..6996450 100644 --- a/src/sliceActions/generateSupport.js +++ b/src/sliceActions/generateSupport.js @@ -9,9 +9,9 @@ export default function generateSupport(slices, settings) { layerHeight, support: { gridSize: supportGridSize, - margin: AcceptanceMargin, + margin: supportMargin, plateSize: plateSize, - distanceY: DistanceY + distanceY: supportDistanceY }, nozzleDiameter } = settings; @@ -62,10 +62,10 @@ export default function generateSupport(slices, settings) { var outerLine = slicePart.outerLine; } else { - var outerLine = slicePart.intersect.offset(supportAcceptanceMargin); + var outerLine = slicePart.intersect.offset(supportMargin); } - var overlap = supportSkin.offset(supportAcceptanceMargin).intersect(outerLine); + var overlap = supportSkin.offset(supportMargin).intersect(outerLine); var overhang = outerLine.difference(overlap); if (overlap.length === 0 || overhang.length > 0) { From fdbb1469ee80b5ae278411d06e99d79960886f60 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 19 Jul 2017 11:04:13 +0200 Subject: [PATCH 05/12] format settings deconstructing --- src/sliceActions/addBrim.js | 4 +++- src/sliceActions/calculateLayersIntersections.js | 5 ++++- src/sliceActions/generateInnerLines.js | 6 +++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/sliceActions/addBrim.js b/src/sliceActions/addBrim.js index 33d2475..9812598 100644 --- a/src/sliceActions/addBrim.js +++ b/src/sliceActions/addBrim.js @@ -8,7 +8,9 @@ const offsetOptions = { }; export default function addBrim(slices, settings) { - let { brim: { offset: brimOffset } } = settings; + let { + brim: { offset: brimOffset } + } = settings; brimOffset /= PRECISION; const [firstLayer] = slices; diff --git a/src/sliceActions/calculateLayersIntersections.js b/src/sliceActions/calculateLayersIntersections.js index 114bc2b..78c2f21 100644 --- a/src/sliceActions/calculateLayersIntersections.js +++ b/src/sliceActions/calculateLayersIntersections.js @@ -1,7 +1,10 @@ import * as THREE from 'three'; export default function calculateLayersIntersections(lines, settings) { - const { layerHeight, dimensions: { z: dimensionsZ } } = settings; + const { + layerHeight, + dimensions: { z: dimensionsZ } + } = settings; const numLayers = Math.floor(dimensionsZ / layerHeight); diff --git a/src/sliceActions/generateInnerLines.js b/src/sliceActions/generateInnerLines.js index a25550d..a829a43 100644 --- a/src/sliceActions/generateInnerLines.js +++ b/src/sliceActions/generateInnerLines.js @@ -9,7 +9,11 @@ const offsetOptions = { export default function generateInnerLines(slices, settings) { // need to scale up everything because of clipper rounding errors - let { layerHeight, nozzleDiameter, shell: { thickness: shellThickness } } = settings; + let { + layerHeight, + nozzleDiameter, + shell: { thickness: shellThickness } + } = settings; nozzleDiameter /= PRECISION; shellThickness /= PRECISION; const nozzleRadius = nozzleDiameter / 2; From 44197dd5e437e1179817b6fd42bbbf016cf29997 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 19 Jul 2017 11:50:23 +0200 Subject: [PATCH 06/12] remove unnecessary new key word --- src/slicerWorker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slicerWorker.js b/src/slicerWorker.js index 369e4b3..ff1797e 100644 --- a/src/slicerWorker.js +++ b/src/slicerWorker.js @@ -16,7 +16,7 @@ self.addEventListener('message', (event) => { case 'SLICE': { const { geometry: JSONGeometry, settings } = data; - const { geometry } = new loader.parse(JSONGeometry.data); + const { geometry } = loader.parse(JSONGeometry.data); const gcode = slice(geometry, settings, onProgress); From 8e45881a4528852e5c34b3c10b658db63cdafd7b Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 19 Jul 2017 17:33:55 +0200 Subject: [PATCH 07/12] pre calculate outer lines --- src/sliceActions/generateInfills.js | 4 ++-- src/sliceActions/generateOutlines.js | 12 ++++++++++++ src/sliceActions/generateSupport.js | 4 ++-- src/sliceActions/helpers/Slice.js | 6 ------ src/sliceActions/slice.js | 3 +++ 5 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 src/sliceActions/generateOutlines.js diff --git a/src/sliceActions/generateInfills.js b/src/sliceActions/generateInfills.js index f9ec418..e959475 100644 --- a/src/sliceActions/generateInfills.js +++ b/src/sliceActions/generateInfills.js @@ -26,8 +26,8 @@ export default function generateInfills(slices, settings) { let surroundingLayer; if (layer - bottomSkinCount >= 0 && layer + topSkinCount < slices.length) { - const downSkin = slices[layer - bottomSkinCount].getOutline(); - const upSkin = slices[layer + topSkinCount].getOutline(); + const downSkin = slices[layer - bottomSkinCount].outline; + const upSkin = slices[layer + topSkinCount].outline; surroundingLayer = upSkin.intersect(downSkin); } diff --git a/src/sliceActions/generateOutlines.js b/src/sliceActions/generateOutlines.js new file mode 100644 index 0000000..d98ccdf --- /dev/null +++ b/src/sliceActions/generateOutlines.js @@ -0,0 +1,12 @@ +import Shape from 'Doodle3D/clipper-js'; + +export default function calculateOutlines(slices, settings) { + for (let layer = 0; layer < slices.length; layer ++) { + const slice = slices[layer]; + + slice.outline = slice.parts.reduce((shape, part) => { + if (part.outerLine) shape.join(part.outerLine); + return shape; + }, new Shape([], true)); + } +} diff --git a/src/sliceActions/generateSupport.js b/src/sliceActions/generateSupport.js index 6996450..d8d2e37 100644 --- a/src/sliceActions/generateSupport.js +++ b/src/sliceActions/generateSupport.js @@ -30,7 +30,7 @@ export default function generateSupport(slices, settings) { if (supportAreas.length > 0) { if (layer >= supportDistanceLayers) { - var sliceSkin = slices[layer - supportDistanceLayers].getOutline(); + var sliceSkin = slices[layer - supportDistanceLayers].outline; sliceSkin = sliceSkin; var supportAreasSlimmed = supportAreas.difference(sliceSkin.offset(supportMargin)); @@ -52,7 +52,7 @@ export default function generateSupport(slices, settings) { } } - var supportSkin = slices[layer + supportDistanceLayers - 1].getOutline(); + var supportSkin = slices[layer + supportDistanceLayers - 1].outline; var slice = slices[layer + supportDistanceLayers]; for (var i = 0; i < slice.parts.length; i ++) { diff --git a/src/sliceActions/helpers/Slice.js b/src/sliceActions/helpers/Slice.js index c9a1ea3..4e1002e 100644 --- a/src/sliceActions/helpers/Slice.js +++ b/src/sliceActions/helpers/Slice.js @@ -4,12 +4,6 @@ export default class { constructor() { this.parts = []; } - getOutline() { - return this.parts.reduce((shape, part) => { - if (part.outerLine) shape.join(part.outerLine); - return shape; - }, new Shape([], true)); - } add(shape) { const part = { shape }; diff --git a/src/sliceActions/slice.js b/src/sliceActions/slice.js index 2042875..d34d7c2 100644 --- a/src/sliceActions/slice.js +++ b/src/sliceActions/slice.js @@ -2,6 +2,7 @@ import calculateLayersIntersections from './calculateLayersIntersections.js'; import createLines from './createLines.js'; import generateInfills from './generateInfills.js'; import generateInnerLines from './generateInnerLines.js'; +import generateOutlines from './generateOutlines.js'; import generateSupport from './generateSupport.js'; import intersectionsToShapes from './intersectionsToShapes.js'; import addBrim from './addBrim.js'; @@ -45,6 +46,8 @@ export default function(geometry, settings, onProgress) { updateProgress('Generating inner lines'); generateInnerLines(slices, settings); + updateProgress('Generating out lines'); + generateOutlines(slices, settings); updateProgress('Generating infills'); generateInfills(slices, settings); updateProgress('Generating support'); From 3f140d7f03a4cf9bc4ddc6d1bb5c6c663adb5623 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 19 Jul 2017 17:36:03 +0200 Subject: [PATCH 08/12] don't catch result of void detectOpenClosed function --- src/sliceActions/slice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sliceActions/slice.js b/src/sliceActions/slice.js index d34d7c2..62a89a1 100644 --- a/src/sliceActions/slice.js +++ b/src/sliceActions/slice.js @@ -28,7 +28,7 @@ export default function(geometry, settings, onProgress) { const lines = createLines(geometry, settings); updateProgress('Detecting open vs closed shapes'); - const openClosed = detectOpenClosed(lines); + detectOpenClosed(lines); updateProgress('Calculating layer intersections'); const { From 8c57e16998a1861e67752628fab886865eb73cea Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 19 Jul 2017 17:36:20 +0200 Subject: [PATCH 09/12] cleanup Slicer --- src/Slicer.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/Slicer.js b/src/Slicer.js index 280a6df..f3f802d 100644 --- a/src/Slicer.js +++ b/src/Slicer.js @@ -7,9 +7,7 @@ export default class { setMesh(mesh) { mesh.updateMatrix(); - this.setGeometry(mesh.geometry, mesh.matrix); - - return this; + return this.setGeometry(mesh.geometry, mesh.matrix); } setGeometry(geometry, matrix) { if (geometry.isBufferGeometry) { @@ -20,7 +18,7 @@ export default class { throw new Error('Geometry is not an instance of BufferGeometry or Geometry'); } - if (matrix) { + if (typeof matrix !== 'undefined') { geometry.applyMatrix(matrix); } @@ -32,13 +30,16 @@ export default class { return slice(this.geometry, settings, onprogress); } slice(settings) { - const slicerWorker = new SlicerWorker(); - - const geometry = this.geometry.toJSON(); + if (!this.geometry) { + throw new Error('Geometry is not set, use Slicer.setGeometry or Slicer.setMesh first'); + } return new ProgressPromise((resolve, reject, progress) => { + // create the slicer worker + const slicerWorker = new SlicerWorker(); slicerWorker.onerror = reject; + // listen to messages send from worker slicerWorker.addEventListener('message', (event) => { const { message, data } = event.data; switch (message) { @@ -54,6 +55,8 @@ export default class { } }); + // send geometry and settings to worker to start the slicing progress + const geometry = this.geometry.toJSON(); slicerWorker.postMessage({ message: 'SLICE', data: { geometry, settings } From c390cc335ad5655fb401062169d064f22d3440a0 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 19 Jul 2017 17:37:40 +0200 Subject: [PATCH 10/12] increase total stages because step is added --- src/sliceActions/slice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sliceActions/slice.js b/src/sliceActions/slice.js index 62a89a1..e0d63e1 100644 --- a/src/sliceActions/slice.js +++ b/src/sliceActions/slice.js @@ -14,7 +14,7 @@ import applyPrecision from './applyPrecision.js'; import removePrecision from './removePrecision.js'; export default function(geometry, settings, onProgress) { - const totalStages = 11; + const totalStages = 12; let current = -1; const updateProgress = (action) => { current ++; From e4880106f1f4232380cce45c0183cd1f056cc2b7 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 19 Jul 2017 20:54:21 +0200 Subject: [PATCH 11/12] remove progress promise @mith @peteruithoven --- README.md | 9 ++++----- jspm.config.js | 1 - package.json | 1 - src/Slicer.js | 7 +++---- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 6a2a04a..5f45975 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,8 @@ const geometry = new THREE.TorusGeometry(20, 10, 30, 30); const slicer = new SLICER.Slicer(); slicer.setGeometry(geometry); -const gcode = await slicer.slice(settings) - .progress(({ progress: { done, total, action } }) => { - const percentage = `${(done / total * 100).toFixed()}%` - console.log(action, percentage); - }); +const gcode = await slicer.slice(settings, ({ progress: { done, total, action } }) => { + const percentage = `${(done / total * 100).toFixed()}%` + console.log(action, percentage); +})); ``` diff --git a/jspm.config.js b/jspm.config.js index 39be6b7..fccd3c9 100644 --- a/jspm.config.js +++ b/jspm.config.js @@ -151,7 +151,6 @@ SystemJS.config({ ], map: { "three": "npm:three@0.83.0", - "progress-promise": "npm:progress-promise@0.0.6", "text": "github:systemjs/plugin-text@0.0.11", "js-yaml": "npm:js-yaml@3.9.0", "clipper-js": "github:Doodle3D/clipper-js@1.0.2", diff --git a/package.json b/package.json index 45167f8..c46dbe3 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ "clipper-js": "github:Doodle3D/clipper-js@1.0.2", "js-yaml": "npm:js-yaml@^3.9.0", "json": "github:systemjs/plugin-json@^0.1.2", - "progress-promise": "npm:progress-promise@^0.0.6", "text": "github:systemjs/plugin-text@^0.0.11", "three": "npm:three@0.83.0", "worker": "github:casperlamboo/plugin-worker@master" diff --git a/src/Slicer.js b/src/Slicer.js index f3f802d..fe5b951 100644 --- a/src/Slicer.js +++ b/src/Slicer.js @@ -1,7 +1,6 @@ import * as THREE from 'three'; import slice from './sliceActions/slice.js'; import SlicerWorker from './slicerWorker.js!worker'; -import ProgressPromise from 'progress-promise'; export default class { setMesh(mesh) { @@ -29,12 +28,12 @@ export default class { sliceSync(settings, onprogress) { return slice(this.geometry, settings, onprogress); } - slice(settings) { + slice(settings, onprogress) { if (!this.geometry) { throw new Error('Geometry is not set, use Slicer.setGeometry or Slicer.setMesh first'); } - return new ProgressPromise((resolve, reject, progress) => { + return new Promise((resolve, reject) => { // create the slicer worker const slicerWorker = new SlicerWorker(); slicerWorker.onerror = reject; @@ -49,7 +48,7 @@ export default class { break; } case 'PROGRESS': { - progress(data); + onprogress(data); break; } } From d7a525f75b01bf70f88c4e83ce885d976b3b50ea Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 19 Jul 2017 20:54:39 +0200 Subject: [PATCH 12/12] camel casing --- src/Slicer.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Slicer.js b/src/Slicer.js index fe5b951..c80959b 100644 --- a/src/Slicer.js +++ b/src/Slicer.js @@ -25,10 +25,10 @@ export default class { return this; } - sliceSync(settings, onprogress) { - return slice(this.geometry, settings, onprogress); + sliceSync(settings, onProgress) { + return slice(this.geometry, settings, onProgress); } - slice(settings, onprogress) { + slice(settings, onProgress) { if (!this.geometry) { throw new Error('Geometry is not set, use Slicer.setGeometry or Slicer.setMesh first'); } @@ -48,7 +48,7 @@ export default class { break; } case 'PROGRESS': { - onprogress(data); + onProgress(data); break; } }