Doodle3D-Slicer/src/sliceActions/generateSupport.js

79 lines
2.3 KiB
JavaScript
Raw Normal View History

import getFillTemplate from './getFillTemplate.js';
2016-04-21 22:22:59 +02:00
import Shape from 'Doodle3D/clipper-js';
2016-04-23 00:24:01 +02:00
import { PRECISION } from '../constants.js';
2016-03-29 08:49:35 +02:00
export default function generateSupport(slices, settings) {
2016-05-07 23:46:08 +02:00
console.log('generating support');
2017-07-18 11:39:38 +02:00
if (!settings.support.enabled) return;
2016-05-06 19:58:39 +02:00
2016-03-29 08:49:35 +02:00
let {
layerHeight,
support: {
gridSize: supportGridSize,
margin: AcceptanceMargin,
plateSize: plateSize,
distanceY: DistanceY
},
2016-03-29 08:49:35 +02:00
nozzleDiameter
2017-07-18 11:39:38 +02:00
} = settings;
2016-03-29 08:49:35 +02:00
2016-04-23 00:24:01 +02:00
supportGridSize /= PRECISION;
supportMargin /= PRECISION;
plateSize /= PRECISION;
nozzleDiameter /= PRECISION;
var supportDistanceLayers = Math.max(Math.ceil(supportDistanceY / layerHeight), 1);
2016-04-21 22:22:59 +02:00
var supportAreas = new Shape([], 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();
sliceSkin = sliceSkin;
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;
}
}
var supportSkin = slices[layer + supportDistanceLayers - 1].getOutline();
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(supportAcceptanceMargin);
}
var overlap = supportSkin.offset(supportAcceptanceMargin).intersect(outerLine);
var overhang = outerLine.difference(overlap);
if (overlap.length === 0 || overhang.length > 0) {
supportAreas = supportAreas.join(overhang);
}
}
}
}