Doodle3D-Slicer/src/Slicer.js

63 lines
1.3 KiB
JavaScript
Raw Normal View History

2017-01-18 13:30:57 +01:00
import 'three.js';
2016-08-19 14:46:02 +02:00
import slice from './sliceActions/slice.js';
2016-10-13 14:22:04 +02:00
import SlicerWorker from './slicerWorker.js!worker';
2015-07-26 15:32:10 +02:00
export default class {
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) {
2017-01-18 13:30:57 +01:00
if (geometry.type === 'BufferGeometry') {
geometry = new THREE.Geometry().fromBufferGeometry(geometry);
} else if (geometry.type === 'Geometry') {
geometry = geometry.clone();
} else {
throw new Error('Geometry is not an instance of BufferGeometry or Geometry');
}
if (matrix) {
geometry.applyMatrix(matrix);
}
2015-06-16 10:28:26 +02:00
2015-07-26 15:32:10 +02:00
geometry.mergeVertices();
2017-01-18 13:30:57 +01: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-08-19 15:12:20 +02:00
sliceSync(settings) {
return slice(this.geometry, settings);
}
slice(settings) {
2016-10-13 14:22:04 +02:00
const slicerWorker = new SlicerWorker();
2016-08-19 15:12:20 +02:00
const geometry = this.geometry.toJSON();
const { config } = settings;
return new Promise((resolve, reject) => {
2016-10-13 14:22:04 +02:00
slicerWorker.onerror = reject;
2016-08-19 15:12:20 +02:00
2016-10-13 14:22:04 +02:00
slicerWorker.addEventListener('message', (event) => {
2016-08-19 15:12:20 +02:00
const { message, data } = event.data;
switch (message) {
case 'SLICE': {
2016-10-13 14:22:04 +02:00
slicerWorker.terminate();
2016-08-19 15:12:20 +02:00
resolve(data.gcode);
2016-08-27 10:02:17 +02:00
break;
2016-08-19 14:46:02 +02:00
}
2016-08-19 15:12:20 +02:00
}
});
2016-08-19 14:46:02 +02:00
2016-10-13 14:22:04 +02:00
slicerWorker.postMessage({
2016-08-19 15:12:20 +02:00
message: 'SLICE',
data: { geometry, config }
2016-08-19 14:46:02 +02:00
});
2016-08-19 15:12:20 +02:00
});
2015-07-26 15:32:10 +02:00
}
}