diff --git a/.gitignore b/.gitignore index 6875798..00989a1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,12 @@ *.DS_Store -jspm_packages/* +jspm_packages -node_modules/* +node_modules + +lib + +module bundle.js diff --git a/src/Slicer.js b/src/Slicer.js index 4da1f01..d100150 100644 --- a/src/Slicer.js +++ b/src/Slicer.js @@ -4,7 +4,7 @@ import SlicerWorker from './slicerWorker.js!worker'; export function sliceMesh(settings, mesh, sync = false, onProgress) { if (typeof mesh === 'undefined' || !mesh.isMesh) { - throw new Error('Provide mesh is not intance of THREE.Mesh'); + throw new Error('Provided mesh is not intance of THREE.Mesh'); } mesh.updateMatrix(); @@ -23,6 +23,10 @@ export function sliceGeometry(settings, geometry, matrix, sync = false, onProgre throw new Error('Geometry is not an instance of BufferGeometry or Geometry'); } + if (geometry.faces.length === 0) { + throw new Error('Geometry does not contain any data'); + } + if (matrix) { geometry.applyMatrix(matrix); } @@ -42,7 +46,11 @@ function sliceAsync(settings, geometry, onProgress) { return new Promise((resolve, reject) => { // create the slicer worker const slicerWorker = new SlicerWorker(); - slicerWorker.onerror = reject; + + slicerWorker.onerror = error => { + slicerWorker.terminate(); + reject(error); + }; // listen to messages send from worker slicerWorker.addEventListener('message', (event) => { @@ -63,11 +71,12 @@ function sliceAsync(settings, geometry, onProgress) { }); // send geometry and settings to worker to start the slicing progress + geometry = geometry.toJSON(); slicerWorker.postMessage({ message: 'SLICE', data: { settings, - geometry: geometry.toJSON() + geometry } }); }); diff --git a/src/sliceActions/addBrim.js b/src/sliceActions/addBrim.js index 9812598..da66540 100644 --- a/src/sliceActions/addBrim.js +++ b/src/sliceActions/addBrim.js @@ -15,11 +15,10 @@ export default function addBrim(slices, settings) { const [firstLayer] = slices; - firstLayer.brim = firstLayer.parts.reduce((brim, { shape }) => { + firstLayer.brim = firstLayer.parts.reduce((brim, { shape }) => ( brim.join(shape.offset(brimOffset, { ...offsetOptions, endType: shape.closed ? 'etClosedPolygon' : 'etOpenRound' - })); - return brim; - }, new Shape([], true)).simplify('pftNonZero'); + })) + ), new Shape([], true)).simplify('pftNonZero'); } diff --git a/src/sliceActions/optimizePaths.js b/src/sliceActions/optimizePaths.js index cc5fec5..5a478b4 100644 --- a/src/sliceActions/optimizePaths.js +++ b/src/sliceActions/optimizePaths.js @@ -21,12 +21,8 @@ export default function optimizePaths(slices, settings) { for (let i = 0; i < slice.parts.length; i ++) { const part = slice.parts[i]; - let bounds; - if (part.shape.closed) { - bounds = part.outerLine.shapeBounds(); - } else { - bounds = part.shape.shapeBounds(); - } + const shape = part.shape.closed ? part.outerLine : part.shape; + const bounds = shape.shapeBounds(); const top = bounds.top - start.y; const bottom = start.y - bounds.bottom; @@ -41,7 +37,7 @@ export default function optimizePaths(slices, settings) { } } - const part = slice.parts.splice(closestPart, 1)[0]; + const [part] = slice.parts.splice(closestPart, 1); parts.push(part); if (part.shape.closed) {