mirror of
https://github.com/Doodle3D/Doodle3D-Slicer.git
synced 2024-07-08 11:40:43 +02:00
72 lines
2.4 KiB
JavaScript
72 lines
2.4 KiB
JavaScript
|
import getFillTemplate from './getFillTemplate.js';
|
||
|
import Paths from '../paths.js';
|
||
|
|
||
|
export default function generateSupport(slices, settings) {
|
||
|
console.log("generating support");
|
||
|
|
||
|
// need to scale up everything because of clipper rounding errors
|
||
|
var scale = 100;
|
||
|
|
||
|
var layerHeight = settings.config["layerHeight"];
|
||
|
var supportGridSize = settings.config["supportGridSize"] * scale;
|
||
|
var supportAcceptanceMargin = settings.config["supportAcceptanceMargin"] * scale;
|
||
|
var supportMargin = settings.config["supportMargin"] * scale;
|
||
|
var plateSize = settings.config["supportPlateSize"] * scale;
|
||
|
var supportDistanceY = settings.config["supportDistanceY"];
|
||
|
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();
|
||
|
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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|