Doodle3D-Slicer/src/Slicer.js

66 lines
1.7 KiB
JavaScript
Raw Normal View History

2017-07-18 12:38:03 +02:00
import * as THREE from 'three';
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 {
2017-05-13 14:48:48 +02:00
setMesh(mesh) {
mesh.updateMatrix();
2017-07-19 17:36:20 +02:00
return this.setGeometry(mesh.geometry, mesh.matrix);
2017-05-13 14:48:48 +02:00
}
setGeometry(geometry, matrix) {
2017-07-17 15:22:13 +02:00
if (geometry.isBufferGeometry) {
2017-05-13 14:48:48 +02:00
geometry = new THREE.Geometry().fromBufferGeometry(geometry);
2017-07-17 15:22:13 +02:00
} else if (geometry.isGeometry) {
2017-05-13 14:48:48 +02:00
geometry = geometry.clone();
} else {
throw new Error('Geometry is not an instance of BufferGeometry or Geometry');
}
2017-07-19 17:36:20 +02:00
if (typeof matrix !== 'undefined') {
2017-05-13 14:48:48 +02:00
geometry.applyMatrix(matrix);
}
this.geometry = geometry;
return this;
}
2017-07-19 20:54:39 +02:00
sliceSync(settings, onProgress) {
return slice(this.geometry, settings, onProgress);
2017-05-13 14:48:48 +02:00
}
2017-07-19 20:54:39 +02:00
slice(settings, onProgress) {
2017-07-19 17:36:20 +02:00
if (!this.geometry) {
throw new Error('Geometry is not set, use Slicer.setGeometry or Slicer.setMesh first');
}
2017-05-13 14:48:48 +02:00
return new Promise((resolve, reject) => {
2017-07-19 17:36:20 +02:00
// create the slicer worker
const slicerWorker = new SlicerWorker();
2017-05-13 14:48:48 +02:00
slicerWorker.onerror = reject;
2017-07-19 17:36:20 +02:00
// listen to messages send from worker
2017-05-13 14:48:48 +02:00
slicerWorker.addEventListener('message', (event) => {
const { message, data } = event.data;
switch (message) {
case 'SLICE': {
slicerWorker.terminate();
resolve(data.gcode);
break;
}
2017-07-04 14:19:07 +02:00
case 'PROGRESS': {
2017-07-19 20:54:39 +02:00
onProgress(data);
2017-07-18 12:26:30 +02:00
break;
2017-07-04 14:19:07 +02:00
}
2017-05-13 14:48:48 +02:00
}
});
2017-07-19 17:36:20 +02:00
// send geometry and settings to worker to start the slicing progress
const geometry = this.geometry.toJSON();
2017-05-13 14:48:48 +02:00
slicerWorker.postMessage({
message: 'SLICE',
2017-07-18 11:39:38 +02:00
data: { geometry, settings }
2017-05-13 14:48:48 +02:00
});
});
}
2015-07-26 15:32:10 +02:00
}