Doodle3D-Slicer/src/sliceActions/shapesToSlices.js
2018-04-17 14:17:28 +02:00

47 lines
1.4 KiB
JavaScript

import Shape from 'clipper-js';
import Slice from './helpers/Slice.js';
import { PRECISION, MIN_AREA } from '../constants.js';
export default function shapesToSlices(shapes) {
const sliceLayers = [];
for (let layer = 0; layer < shapes.length; layer ++) {
let { fillShapes, lineShapesOpen, lineShapesClosed } = shapes[layer];
fillShapes = new Shape(fillShapes, true, true, true, true)
.fixOrientation()
.simplify('pftNonZero')
.clean(1)
.thresholdArea(MIN_AREA / Math.pow(PRECISION, 2))
.seperateShapes();
lineShapesClosed = new Shape(lineShapesClosed, true, true, true, true)
.clean(1);
lineShapesOpen = new Shape(lineShapesOpen, false, true, true, true);
// .clean(1);
// TODO
// Enable cleaning when https://sourceforge.net/p/jsclipper/tickets/24/ is fixed
const slice = new Slice();
for (let i = 0; i < fillShapes.length; i ++) {
const fillShape = fillShapes[i];
if (fillShape.paths.length === 0) continue;
slice.add(fillShape, true);
if (lineShapesClosed.paths.length > 0) lineShapesClosed = lineShapesClosed.difference(fillShape);
if (lineShapesOpen.paths.length > 0) lineShapesOpen = lineShapesOpen.difference(fillShape);
}
if (lineShapesClosed.paths.length > 0) slice.add(lineShapesClosed, false);
if (lineShapesOpen.paths.length > 0) slice.add(lineShapesOpen, false);
sliceLayers.push(slice);
}
return sliceLayers;
}