2016-08-19 14:09:51 +02:00
|
|
|
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
|
|
|
|
2016-03-29 00:26:58 +02:00
|
|
|
export default function generateSupport(slices, settings) {
|
2016-05-07 23:46:08 +02:00
|
|
|
console.log('generating support');
|
2016-03-29 00:26:58 +02:00
|
|
|
|
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,
|
2017-07-11 17:19:05 +02:00
|
|
|
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;
|
2016-03-29 00:26:58 +02:00
|
|
|
var supportDistanceLayers = Math.max(Math.ceil(supportDistanceY / layerHeight), 1);
|
|
|
|
|
2016-04-21 22:22:59 +02:00
|
|
|
var supportAreas = new Shape([], true);
|
2016-03-29 00:26:58 +02:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|