From 7906bfe43d6f391e3c08977fdc32906eec7c9e22 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 24 Jan 2018 12:39:34 +0100 Subject: [PATCH 1/5] remove weird code --- src/sliceActions/slicesToGCode.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sliceActions/slicesToGCode.js b/src/sliceActions/slicesToGCode.js index 14070b1..209ce9b 100644 --- a/src/sliceActions/slicesToGCode.js +++ b/src/sliceActions/slicesToGCode.js @@ -62,11 +62,11 @@ export default function slicesToGCode(slices, settings) { const unRetract = isOuterShell; const profile = isOuterShell ? profiles.outerShell : profiles.innerShell; - pathToGCode(outline, combing && true, gcode, shell, false, unRetract, z, profile); + pathToGCode(outline, combing, gcode, shell, false, unRetract, z, profile); } - pathToGCode(outline, combing && true, gcode, part.outerFill, false, false, z, profiles.outerInfill); - pathToGCode(outline, combing && true, gcode, part.innerFill, true, false, z, profiles.innerInfill); + pathToGCode(outline, combing, gcode, part.outerFill, false, false, z, profiles.outerInfill); + pathToGCode(outline, combing, gcode, part.innerFill, true, false, z, profiles.innerInfill); } else { const retract = !(slice.parts.length === 1 && typeof slice.support === 'undefined'); pathToGCode(null, false, gcode, part.shape, retract, retract, z, profiles.outerShell); From 5b934f0e71275ab3341f6fbe23686bbdd1e005e3 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 24 Jan 2018 12:39:56 +0100 Subject: [PATCH 2/5] rename infill density to density --- src/sliceActions/generateInfills.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sliceActions/generateInfills.js b/src/sliceActions/generateInfills.js index 6d854aa..fd04edc 100644 --- a/src/sliceActions/generateInfills.js +++ b/src/sliceActions/generateInfills.js @@ -5,7 +5,7 @@ import Shape from 'clipper-js'; export default function generateInfills(slices, settings) { let { layerHeight, - innerInfill: { density: infillDensity }, + innerInfill: { density }, thickness: { top: topThickness, bottom: bottomThickness @@ -13,11 +13,11 @@ export default function generateInfills(slices, settings) { nozzleDiameter } = settings; - infillDensity /= 100; + density /= 100; nozzleDiameter /= PRECISION; - const bidirectionalInfill = infillDensity < 0.8; - const infillGridSize = nozzleDiameter * (bidirectionalInfill ? 2 : 1) / infillDensity; + const bidirectionalInfill = density < 0.8; + const infillGridSize = nozzleDiameter * (bidirectionalInfill ? 2 : 1) / density; const bottomSkinCount = Math.ceil(bottomThickness / layerHeight); const topSkinCount = Math.ceil(topThickness / layerHeight); From 88291ba5499c0759ab731160e7fe3b86938a6654 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 24 Jan 2018 12:50:41 +0100 Subject: [PATCH 3/5] implement support #33 --- src/interface/Settings.js | 17 +++++++ src/settings/default.yml | 5 +- src/sliceActions/generateSupport.js | 73 ++++++++--------------------- src/sliceActions/optimizePaths.js | 2 +- src/sliceActions/slicesToGCode.js | 2 +- 5 files changed, 41 insertions(+), 58 deletions(-) diff --git a/src/interface/Settings.js b/src/interface/Settings.js index ec94401..5c7fb5e 100644 --- a/src/interface/Settings.js +++ b/src/interface/Settings.js @@ -166,6 +166,14 @@ class Settings extends React.Component { case 'settings.brim.flowRate': case 'settings.firstLayer.speed': case 'settings.firstLayer.flowRate': + case 'settings.support.enabled': + case 'settings.support.speed': + case 'settings.support.distanceY': + case 'settings.support.density': + case 'settings.support.minArea': + case 'settings.support.margin': + case 'settings.support.speed': + case 'settings.support.flowRate': if (!localStorage.active) return this.openAddPrinterDialog(); if (value === null) { @@ -357,6 +365,15 @@ class Settings extends React.Component { +

Support

+ + + + + + + +

First layer

diff --git a/src/settings/default.yml b/src/settings/default.yml index b3c42ec..d38ba24 100644 --- a/src/settings/default.yml +++ b/src/settings/default.yml @@ -22,11 +22,10 @@ travel: speed: 200.0 support: enabled: false - acceptanceMargin: 1.5 + minArea: 2 distanceY: 0.4 - gridSize: 6.0 + density: 5.0 margin: 2.0 - plateSize: 4.0 flowRate: 0.8 speed: 40.0 innerShell: diff --git a/src/sliceActions/generateSupport.js b/src/sliceActions/generateSupport.js index 8e9e0c3..3f1f767 100644 --- a/src/sliceActions/generateSupport.js +++ b/src/sliceActions/generateSupport.js @@ -7,70 +7,37 @@ export default function generateSupport(slices, settings) { let { layerHeight, - support: { - gridSize: supportGridSize, - margin: supportMargin, - plateSize: plateSize, - distanceY: supportDistanceY - }, + support: { density, margin, minArea, distanceY }, nozzleDiameter } = settings; - supportGridSize /= PRECISION; - supportMargin /= PRECISION; - plateSize /= PRECISION; + density /= 100; + margin /= PRECISION; nozzleDiameter /= PRECISION; - var supportDistanceLayers = Math.max(Math.ceil(supportDistanceY / layerHeight), 1); - var supportAreas = new Shape([], true); + const bidirectionalInfill = density < 0.8; + const infillGridSize = nozzleDiameter * 2 / density; + const supportDistanceLayers = Math.max(Math.ceil(distanceY / layerHeight), 1); - for (var layer = slices.length - 1 - supportDistanceLayers; layer >= 0; layer --) { - var currentSlice = slices[layer]; + let supportArea = new Shape([], true); - if (supportAreas.length > 0) { + for (let layer = slices.length - 1 - supportDistanceLayers; layer >= supportDistanceLayers; layer --) { + const currentLayer = slices[layer + supportDistanceLayers - 1]; + const upSkin = slices[layer + supportDistanceLayers]; + const downSkin = slices[layer - supportDistanceLayers]; - if (layer >= supportDistanceLayers) { - var sliceSkin = slices[layer - supportDistanceLayers].outline; - sliceSkin = sliceSkin; + const neededSupportArea = upSkin.outline.difference(currentLayer.outline.offset(margin)); - var supportAreasSlimmed = supportAreas.difference(sliceSkin.offset(supportMargin)); - if (supportAreasSlimmed.area() < 100.0) { - supportAreas = supportAreas.difference(sliceSkin); - } - else { - supportAreas = supportAreasSlimmed; - } - } - - var supportTemplate = getFillTemplate(supportAreas.bounds(), supportGridSize, true, true); - var supportFill = supportTemplate.intersect(supportAreas); - if (supportFill.length === 0) { - currentSlice.support = supportAreas.clone(); - } - else { - currentSlice.support = supportFill; - } + if (neededSupportArea.totalArea() * Math.pow(PRECISION, 2) > minArea) { + supportArea = supportArea.union(neededSupportArea); } + if (downSkin) supportArea = supportArea.difference(downSkin.outline.offset(margin)); - var supportSkin = slices[layer + supportDistanceLayers - 1].outline; + const even = (layer % 2 === 0); + const bounds = supportArea.shapeBounds(); + const innerFillTemplate = getFillTemplate(bounds, infillGridSize, bidirectionalInfill || even, bidirectionalInfill || !even); - var slice = slices[layer + supportDistanceLayers]; - for (var i = 0; i < slice.parts.length; i ++) { - var slicePart = slice.parts[i]; - - if (slicePart.intersect.closed) { - var outerLine = slicePart.outerLine; - } - else { - var outerLine = slicePart.intersect.offset(supportMargin); - } - - var overlap = supportSkin.offset(supportMargin).intersect(outerLine); - var overhang = outerLine.difference(overlap); - - if (overlap.length === 0 || overhang.length > 0) { - supportAreas = supportAreas.join(overhang); - } - } + slices[layer].support = supportArea.clone().join(supportArea.intersect(innerFillTemplate)); + slices[layer].supportOutline = supportArea; } } diff --git a/src/sliceActions/optimizePaths.js b/src/sliceActions/optimizePaths.js index 18043ef..cde3fb3 100644 --- a/src/sliceActions/optimizePaths.js +++ b/src/sliceActions/optimizePaths.js @@ -74,7 +74,7 @@ export default function optimizePaths(slices, settings) { slice.parts = parts; - if (typeof slice.support !== 'undefined' && slice.support.length > 0) { + if (typeof slice.support !== 'undefined' && slice.support.paths.length > 0) { slice.support = optimizeShape(slice.support, start); start.copy(slice.support.lastPoint(true)); } diff --git a/src/sliceActions/slicesToGCode.js b/src/sliceActions/slicesToGCode.js index 209ce9b..e794499 100644 --- a/src/sliceActions/slicesToGCode.js +++ b/src/sliceActions/slicesToGCode.js @@ -74,7 +74,7 @@ export default function slicesToGCode(slices, settings) { } if (typeof slice.support !== 'undefined') { - pathToGCode(null, false, gcode, slice.support, true, true, z, profiles.support); + pathToGCode(slice.supportOutline, combing, gcode, slice.support, true, true, z, profiles.support); } } From 70aa39d89f351a37a90cc9f96497b66f4160dbc5 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 24 Jan 2018 13:59:39 +0100 Subject: [PATCH 4/5] support infill is always bidirectional --- src/sliceActions/generateSupport.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/sliceActions/generateSupport.js b/src/sliceActions/generateSupport.js index 3f1f767..76181de 100644 --- a/src/sliceActions/generateSupport.js +++ b/src/sliceActions/generateSupport.js @@ -15,7 +15,6 @@ export default function generateSupport(slices, settings) { margin /= PRECISION; nozzleDiameter /= PRECISION; - const bidirectionalInfill = density < 0.8; const infillGridSize = nozzleDiameter * 2 / density; const supportDistanceLayers = Math.max(Math.ceil(distanceY / layerHeight), 1); @@ -33,9 +32,8 @@ export default function generateSupport(slices, settings) { } if (downSkin) supportArea = supportArea.difference(downSkin.outline.offset(margin)); - const even = (layer % 2 === 0); const bounds = supportArea.shapeBounds(); - const innerFillTemplate = getFillTemplate(bounds, infillGridSize, bidirectionalInfill || even, bidirectionalInfill || !even); + const innerFillTemplate = getFillTemplate(bounds, infillGridSize, true, true); slices[layer].support = supportArea.clone().join(supportArea.intersect(innerFillTemplate)); slices[layer].supportOutline = supportArea; From 5cef2777fbf0cf386a5d3c82f42c5af9d239534a Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 24 Jan 2018 14:00:49 +0100 Subject: [PATCH 5/5] save precision squared in const --- src/sliceActions/generateSupport.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sliceActions/generateSupport.js b/src/sliceActions/generateSupport.js index 76181de..2c8393b 100644 --- a/src/sliceActions/generateSupport.js +++ b/src/sliceActions/generateSupport.js @@ -2,6 +2,8 @@ import getFillTemplate from './getFillTemplate.js'; import Shape from 'clipper-js'; import { PRECISION } from '../constants.js'; +const PRECISION_SQUARED = Math.pow(PRECISION, 2); + export default function generateSupport(slices, settings) { if (!settings.support.enabled) return; @@ -27,7 +29,7 @@ export default function generateSupport(slices, settings) { const neededSupportArea = upSkin.outline.difference(currentLayer.outline.offset(margin)); - if (neededSupportArea.totalArea() * Math.pow(PRECISION, 2) > minArea) { + if (neededSupportArea.totalArea() * PRECISION_SQUARED > minArea) { supportArea = supportArea.union(neededSupportArea); } if (downSkin) supportArea = supportArea.difference(downSkin.outline.offset(margin));