Doodle3D-Slicer/src/Slicer.js

72 lines
2.2 KiB
JavaScript
Raw Normal View History

2015-07-26 15:32:10 +02:00
import THREE from 'three.js';
2016-07-19 14:32:48 +02:00
import EventDispatcher from 'EventDispatcher';
import calculateLayersIntersections from './sliceActions/calculateLayersIntersections.js';
import createLines from './sliceActions/createLines.js';
import generateInfills from './sliceActions/generateInfills.js';
import generateInnerLines from './sliceActions/generateInnerLines.js';
import generateSupport from './sliceActions/generateSupport.js';
import intersectionsToShapes from './sliceActions/intersectionsToShapes.js';
2016-05-06 19:52:31 +02:00
import addBrim from './sliceActions/addBrim.js';
import optimizePaths from './sliceActions/optimizePaths.js';
import shapesToSlices from './sliceActions/shapesToSlices.js';
import slicesToGCode from './sliceActions/slicesToGCode.js';
import applyPrecision from './sliceActions/applyPrecision.js';
import removePrecision from './sliceActions/removePrecision.js';
2015-07-26 15:32:10 +02:00
2016-03-29 00:35:53 +02:00
export default class extends EventDispatcher {
2016-07-19 14:28:03 +02:00
setMesh(mesh) {
2015-07-26 15:32:10 +02:00
mesh.updateMatrix();
2015-07-26 15:32:10 +02:00
this.setGeometry(mesh.geometry, mesh.matrix);
2015-07-26 15:32:10 +02:00
return this;
}
2016-07-19 14:28:03 +02:00
setGeometry(geometry, matrix) {
2016-07-19 14:26:06 +02:00
if (geometry instanceof THREE.BufferGeometry) {
2015-07-26 15:32:10 +02:00
geometry = new THREE.Geometry().fromBufferGeometry(geometry);
2016-07-19 14:26:06 +02:00
} else if (geometry instanceof THREE.Geometry) {
2015-07-26 15:32:10 +02:00
geometry = geometry.clone();
2016-05-09 11:17:49 +02:00
} else {
2016-07-19 14:25:48 +02:00
throw 'Geometry is not an instance of BufferGeometry or Geometry';
2015-07-26 15:32:10 +02:00
}
2015-06-16 10:28:26 +02:00
2015-07-26 15:32:10 +02:00
if (matrix instanceof THREE.Matrix4) {
geometry.applyMatrix(matrix);
}
2015-06-16 10:28:26 +02:00
2015-07-26 15:32:10 +02:00
geometry.mergeVertices();
2015-07-28 12:28:05 +02:00
geometry.computeFaceNormals();
2015-07-26 15:32:10 +02:00
this.geometry = geometry;
2015-06-16 10:28:26 +02:00
2015-07-26 15:32:10 +02:00
return this;
2015-06-16 10:28:26 +02:00
}
2016-07-19 14:28:03 +02:00
slice(settings) {
2015-07-29 11:18:18 +02:00
// get unique lines from geometry;
2016-04-23 09:56:36 +02:00
const lines = createLines(this.geometry, settings);
2015-04-24 16:12:48 +02:00
2016-04-21 22:14:22 +02:00
const {
layerIntersectionIndexes,
layerIntersectionPoints
} = calculateLayersIntersections(lines, settings);
2016-04-21 22:14:22 +02:00
const shapes = intersectionsToShapes(layerIntersectionIndexes, layerIntersectionPoints, lines, settings);
2015-07-29 11:18:18 +02:00
applyPrecision(shapes);
2016-04-21 22:14:22 +02:00
const slices = shapesToSlices(shapes, settings);
2015-07-29 11:18:18 +02:00
generateInnerLines(slices, settings);
generateInfills(slices, settings);
2016-05-06 19:58:39 +02:00
generateSupport(slices, settings);
2016-05-06 19:52:31 +02:00
addBrim(slices, settings);
optimizePaths(slices, settings);
removePrecision(slices);
const gcode = slicesToGCode(slices, settings);
2015-06-11 14:34:30 +02:00
2016-04-21 22:50:02 +02:00
this.dispatchEvent({ type: 'finish', gcode });
return gcode;
2015-07-26 15:32:10 +02:00
}
}