From 43b4ab90cb59138ba5afbddeccc9b87bcc412d18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thea=20Sch=C3=B6bl?= Date: Mon, 11 Mar 2024 19:59:40 +0100 Subject: [PATCH] fixes --- bampy/src/slicer/base_slices.rs | 9 ++---- bampy/src/slicer/slice_rings.rs | 50 ++++++++++++++++++++++++--------- src/lib/components/App.svelte | 8 +++++- src/lib/components/Scene.svelte | 3 +- 4 files changed, 48 insertions(+), 22 deletions(-) diff --git a/bampy/src/slicer/base_slices.rs b/bampy/src/slicer/base_slices.rs index 6f6f54e..e3c994a 100644 --- a/bampy/src/slicer/base_slices.rs +++ b/bampy/src/slicer/base_slices.rs @@ -1,13 +1,10 @@ -use bvh::bvh::BvhNode; - -use crate::console_log; - use super::{ line::Line3, mesh::Mesh, slice_rings::{find_slice_rings, SliceRing}, SlicerOptions, }; +use bvh::bvh::BvhNode; #[derive(Debug)] pub struct BaseSlice { @@ -20,9 +17,9 @@ pub struct BaseSlice { pub fn create_slices(options: &SlicerOptions, slicable: &Mesh) -> Vec { let layer_count = f64::floor(slicable.aabb.max.z / options.layer_height) as usize; let mut rings = vec![]; + let mut layer_index = 0; for i in 0..layer_count { - console_log!("Layer {}", i); let layer = i as f64 * options.layer_height; let mut base_slice = BaseSlice { z: layer, @@ -62,7 +59,7 @@ pub fn create_slices(options: &SlicerOptions, slicable: &Mesh) -> Vec>, } -pub fn find_slice_rings(mut slice: BaseSlice) -> Vec { +pub fn find_slice_rings(mut slice: BaseSlice, layer_index: &mut u32) -> Vec { let mut rings = vec![]; while let Some(line) = slice.lines.pop() { if relative_eq!(line.start, line.end) { @@ -23,13 +24,16 @@ pub fn find_slice_rings(mut slice: BaseSlice) -> Vec { }; let mut right_start = ring.points[0]; let mut right = ring.points[1]; + let mut sum_of_edges = (right.x - right_start.x) * (right.y + right_start.y); let mut previous_len = usize::MAX; - while relative_ne!(ring.points[0], right) { + let mut done = false; + + while !done { if previous_len == slice.lines.len() { console_log!( - "Error: Could not find a ring for slice at z = {}, d = {}, {} items left.", - slice.z, + "Error: Could not close ring {}, d = {}, {} items left.", + layer_index, ring.points[0].metric_distance(&right), slice.lines.len() ); @@ -38,24 +42,42 @@ pub fn find_slice_rings(mut slice: BaseSlice) -> Vec { previous_len = slice.lines.len(); slice.lines.retain_mut(|line| { + if done { + return true; + } + + macro_rules! add { + ( $point:expr ) => { + if !relative_eq!($point, right_start) { + right_start = right; + right = $point; + ring.points.push(right); + sum_of_edges = (right.x - right_start.x) * (right.y + right_start.y); + done = relative_eq!(ring.points[0], right); + } + }; + } + let s = relative_eq!(line.start, right); let e = relative_eq!(line.end, right); - if s && !e && !relative_eq!(line.end, right_start) { - ring.points.push(line.end); - right_start = right; - right = line.end; + if s && !e { + add!(line.end); false - } else if e && !s && !relative_eq!(line.start, right_start) { - ring.points.push(line.start); - right_start = right; - right = line.start; + } else if e && !s { + add!(line.start); false } else { true } }) } - rings.push(ring) + + // The end point is duplicate, so not part of the winding order calculation. + if sum_of_edges < 0.0 { + ring.points.reverse(); + } + rings.push(ring); + *layer_index += 1; } rings diff --git a/src/lib/components/App.svelte b/src/lib/components/App.svelte index 4a6bbd8..4077f03 100644 --- a/src/lib/components/App.svelte +++ b/src/lib/components/App.svelte @@ -6,14 +6,16 @@ let progress: Writable; let showSlices = 1; + let maxZ = 0; let progressLayer: Writable; - +
+
@@ -31,6 +33,10 @@ height: 80%; } + input[type='number'] { + width: 60px; + } + .controls { display: flex; flex-direction: column; diff --git a/src/lib/components/Scene.svelte b/src/lib/components/Scene.svelte index 214f397..461159b 100644 --- a/src/lib/components/Scene.svelte +++ b/src/lib/components/Scene.svelte @@ -58,6 +58,7 @@ export let progress = writable(undefined); export let progressLayer = writable(0); export let showSlices = 1; + export let maxZ = 0; export let maxNonPlanarAngle = MathUtils.degToRad(20); export let bedNormal = new Vector3(0, 0, 1); @@ -98,7 +99,7 @@ /> {#each $layers as { geometry, type }, i} - {@const visible = showSlices >= i / $layers.length} + {@const visible = maxZ !== 0 ? i === maxZ : showSlices >= i / $layers.length} {@const color = new Color(Math.random() * 0xffffff)} {#if type === LayerType.Line}