This commit is contained in:
2024-03-11 00:43:31 +01:00
parent 00cfdfd46e
commit 608c2b08ec
9 changed files with 181 additions and 31 deletions

View File

@@ -101,9 +101,9 @@
{@const visible = showSlices >= i / $layers.length}
{@const color = new Color(0, i / $layers.length, 0.2)}
{#if type === LayerType.Line}
<T.LineSegments {geometry} {visible}>
<T.Line {geometry} {visible}>
<T.LineBasicMaterial {color} />
</T.LineSegments>
</T.Line>
{:else if type === LayerType.Surface}
<T.Mesh {geometry} {visible}>
<T.MeshMatcapMaterial {color} side={DoubleSide} />

27
src/lib/slicer/newFile.ts Normal file
View File

@@ -0,0 +1,27 @@
import { BufferGeometry, BufferGeometryLoader, Float32BufferAttribute } from 'three';
import { type WorkerEvent } from './worker-data';
import init, { slice } from 'bampy';
addEventListener('message', async (event: MessageEvent<WorkerEvent>) => {
if (event.data.type === 'slice') {
const geometry = new BufferGeometryLoader().parse(event.data.data.stl);
if (geometry.index !== null) {
geometry.toNonIndexed();
}
await init();
const result = slice({
positions: geometry.attributes.position.array as Float32Array,
layerHeight: event.data.data.layerHeight,
maxAngle: event.data.data.maxNonPlanarAngle
});
for (const layer of result.rings) {
const geometry = new BufferGeometry();
geometry.setAttribute('position', new Float32BufferAttribute(layer, 3));
self.postMessage({
type: 'layer',
data: { type: LayerType.Line, geometry: layerGeometry.toJSON() }
} satisfies LayerMessage);
}
}
});

View File

@@ -1,5 +1,11 @@
import { BufferGeometryLoader } from 'three';
import { type SliceArguments, type ProgressMessage, type WorkerEvent } from './worker-data';
import { BufferGeometry, BufferGeometryLoader, Float32BufferAttribute } from 'three';
import {
type SliceArguments,
type ProgressMessage,
type WorkerEvent,
type LayerMessage,
LayerType
} from './worker-data';
import init, { slice } from 'bampy';
addEventListener('message', async (event: MessageEvent<WorkerEvent>) => {
@@ -9,11 +15,20 @@ addEventListener('message', async (event: MessageEvent<WorkerEvent>) => {
geometry.toNonIndexed();
}
await init();
slice(
geometry.attributes.position.array as Float32Array,
event.data.data.layerHeight,
event.data.data.maxNonPlanarAngle
);
const result = slice({
positions: geometry.attributes.position.array as Float32Array,
layerHeight: event.data.data.layerHeight,
maxAngle: event.data.data.maxNonPlanarAngle
});
for (const layer of result.rings) {
const geometry = new BufferGeometry();
geometry.setAttribute('position', new Float32BufferAttribute(layer, 3));
self.postMessage({
type: 'layer',
data: { type: LayerType.Line, geometry: geometry.toJSON() }
} satisfies LayerMessage);
}
}
});