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 } 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..e0d63e1 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'; @@ -13,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 ++; @@ -27,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 { @@ -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'); 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);