From 3b455377baa860ef15c1b246e2c644eb3d223fa1 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Tue, 28 Jul 2015 12:28:05 +0200 Subject: [PATCH] Improved hole detection algorithm --- example/app.js | 2 +- example/index.html | 32 ++++++++++++------------- src/slicer.js | 59 +++++++++++++++++++++++++--------------------- 3 files changed, 49 insertions(+), 44 deletions(-) diff --git a/example/app.js b/example/app.js index 39d3680..bc1eb1b 100644 --- a/example/app.js +++ b/example/app.js @@ -13,7 +13,7 @@ setTimeout(() => { var slicer = new SLICER.Slicer(); //var slicer = new SLICER.SlicerWorker(); - slicer.setGeometry(geometry); + slicer.setGeometry(geometry.clone()); slicer.onfinish = function (gCode) { document.getElementById('gcode').innerHTML = gCode.replace(/(?:\r\n|\r|\n)/g, '
'); }; diff --git a/example/index.html b/example/index.html index d993002..1117bf4 100644 --- a/example/index.html +++ b/example/index.html @@ -1,27 +1,27 @@ - + - Doodle3D Slicer + Doodle3D Slicer - + - - + + - + - + - + -

+

- + \ No newline at end of file diff --git a/src/slicer.js b/src/slicer.js index fbcc213..1a022b6 100644 --- a/src/slicer.js +++ b/src/slicer.js @@ -41,9 +41,8 @@ export default class { geometry.applyMatrix(matrix); } - geometry.computeBoundingBox(); - geometry.computeFaceNormals(); geometry.mergeVertices(); + geometry.computeFaceNormals(); this.geometry = geometry; @@ -290,20 +289,17 @@ export default class { } } - sliceParts.sort(function (a, b) { - return b.area() - a.area(); + sliceParts.sort((a, b) => { + return b.boundSize() - a.boundSize(); }); var slice = new Slice(); - for (var i = 0; i < sliceParts.length; i ++) { - var slicePart1 = sliceParts[i]; + for (var slicePart1 of sliceParts) { if (slicePart1.closed) { var merge = false; - for (var j = 0; j < slice.parts.length; j ++) { - var slicePart2 = slice.parts[j].intersect; - + for (var slicePart2 of slice.parts) { if (slicePart2.closed && slicePart2.intersect(slicePart1).length > 0) { slicePart2.join(slicePart1); merge = true; @@ -469,35 +465,37 @@ export default class { var supportMargin = settings.config["supportMargin"] * scale; var plateSize = settings.config["supportPlateSize"] * scale; var supportDistanceY = settings.config["supportDistanceY"]; - var supportDistanceLayers = Math.ceil(supportDistanceY / layerHeight); + var supportDistanceLayers = Math.max(Math.ceil(supportDistanceY / layerHeight), 1); var nozzleDiameter = settings.config["nozzleDiameter"] * scale; var supportAreas = new Paths([], true); for (var layer = slices.length - 1 - supportDistanceLayers; layer >= 0; layer --) { + var currentSlice = slices[layer]; + if (supportAreas.length > 0) { if (layer >= supportDistanceLayers) { - //var sliceSkin = slices[layer - supportDistanceLayers].getOutline(); - var sliceSkin = slices[layer].getOutline(); - sliceSkin = sliceSkin.offset(supportMargin); + var sliceSkin = slices[layer - supportDistanceLayers].getOutline(); + sliceSkin = sliceSkin; - supportAreas = supportAreas.difference(sliceSkin); + var supportAreasSlimmed = supportAreas.difference(sliceSkin.offset(supportMargin)); + if (supportAreasSlimmed.length === 0) { + supportAreas = supportAreas.difference(sliceSkin); + } + else { + supportAreas = supportAreasSlimmed; + } } - var currentSlice = slices[layer]; - - if (layer === 0) { - supportAreas = supportAreas.offset(plateSize).difference(sliceSkin); - - var template = this._getFillTemplate(supportAreas.bounds(), nozzleDiameter, true, false); - - currentSlice.support = template.intersect(supportAreas); + + var supportTemplate = this._getFillTemplate(supportAreas.bounds(), supportGridSize, true, true); + var supportFill = supportTemplate.intersect(supportAreas); + if (supportFill.length === 0 || true) { + currentSlice.support = supportAreas.clone(); } else { - var supportTemplate = this._getFillTemplate(supportAreas.bounds(), supportGridSize, true, true); - - currentSlice.support = supportTemplate.intersect(supportAreas).join(supportAreas.clone()); + currentSlice.support = supportFill; } } @@ -506,19 +504,26 @@ export default class { var slice = slices[layer + supportDistanceLayers]; for (var i = 0; i < slice.parts.length; i ++) { var slicePart = slice.parts[i]; - var outerLine = slicePart.outerLine; + + if (slicePart.intersect.closed) { + var outerLine = slicePart.outerLine; + } + else { + var outerLine = slicePart.intersect.offset(supportAcceptanceMargin); + } var overlap = supportSkin.offset(supportAcceptanceMargin).intersect(outerLine); var overhang = outerLine.difference(overlap); if (overlap.length === 0 || overhang.length > 0) { - supportAreas = supportAreas.union(overhang.offset(supportAcceptanceMargin).intersect(outerLine)); + supportAreas = supportAreas.join(overhang); } } } this.progress.generatedSupport = true; this._updateProgress(settings); + } _optimizePaths (slices, settings) {