From fadbea5dfe2bf0cfafd1dbfc0836493672339350 Mon Sep 17 00:00:00 2001 From: MarekSpodBiedry <73122968+MarekSpodBiedry@users.noreply.github.com> Date: Sat, 10 Oct 2026 18:12:16 +0200 Subject: [PATCH] Keep elevations when EXPLODE splits a 3D polyline (#88) (#138) --- crates/engine/src/cmd/modify.rs | 5 ++++- crates/engine/src/cmd/modify2_tests.rs | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/crates/engine/src/cmd/modify.rs b/crates/engine/src/cmd/modify.rs index feb087fd..600cea77 100644 --- a/crates/engine/src/cmd/modify.rs +++ b/crates/engine/src/cmd/modify.rs @@ -891,7 +891,10 @@ pub(crate) fn explode_kind(d: &cadcraft_doc::Drawing, e: &Entity) -> Option Some( p.points .windows(2) - .filter_map(|w| Some(Entity { handle: Handle(0), common: e.common.clone(), kind: line(w.first()?.xy(), w.get(1)?.xy()) })) + .filter_map(|w| { + let kind = EntityKind::Line(cadcraft_doc::Line { a: *w.first()?, b: *w.get(1)? }); + Some(Entity { handle: Handle(0), common: e.common.clone(), kind }) + }) .collect(), ), EntityKind::MText(m) => Some( diff --git a/crates/engine/src/cmd/modify2_tests.rs b/crates/engine/src/cmd/modify2_tests.rs index addb479f..f7f547ea 100644 --- a/crates/engine/src/cmd/modify2_tests.rs +++ b/crates/engine/src/cmd/modify2_tests.rs @@ -606,3 +606,21 @@ fn textedit_json_and_command_line() { assert!(s.running.is_none()); assert!(matches!(kind(&s, &t), EntityKind::Text(x) if x.value == "hello world")); } + +#[test] +fn explode_polyline3d_keeps_elevations() { + let mut s = Session::new(); + let p = h(&s.execute("3dpoly", &json!({"points": [[0, 0, 5], [1, 0, 6], [1, 1, 7]]})).unwrap()); + s.execute("explode", &json!({"handles": [p]})).unwrap(); + let lines: Vec<(f64, f64)> = s + .doc() + .unwrap() + .model + .iter() + .filter_map(|e| match &e.kind { + EntityKind::Line(l) => Some((l.a.z, l.b.z)), + _ => None, + }) + .collect(); + assert_eq!(lines, vec![(5.0, 6.0), (6.0, 7.0)]); +}