From 123a937ce6d4ae9e4fee3f1d5de3af6d314ce3c7 Mon Sep 17 00:00:00 2001 From: Andrew Varga Date: Tue, 16 Sep 2025 19:22:48 +0200 Subject: [PATCH 1/5] use new id strategy for initial segment's edge ids (this is all thats needed to work with the new engine's new id generation --- rust/kcl-lib/src/execution/artifact.rs | 19 +++++-- rust/kcl-lib/src/execution/id_generator.rs | 60 +++++++++++++++++++++- rust/kcl-lib/src/execution/mod.rs | 2 +- rust/kcl-lib/src/std/extrude.rs | 19 ++++--- 4 files changed, 87 insertions(+), 13 deletions(-) diff --git a/rust/kcl-lib/src/execution/artifact.rs b/rust/kcl-lib/src/execution/artifact.rs index 7b24a94702a..a3a98606916 100644 --- a/rust/kcl-lib/src/execution/artifact.rs +++ b/rust/kcl-lib/src/execution/artifact.rs @@ -12,7 +12,7 @@ use uuid::Uuid; use crate::{ KclError, NodePath, SourceRange, errors::KclErrorDetails, - execution::ArtifactId, + execution::{ArtifactId, id_generator::EngineIdGenerator}, parsing::ast::types::{Node, Program}, }; @@ -594,6 +594,8 @@ pub(super) fn build_artifact_graph( fill_in_node_paths(exec_artifact, ast, item_count); } + let mut id_generator = EngineIdGenerator::new(Uuid::new_v4()); + for artifact_command in artifact_commands { if let ModelingCmd::EnableSketchMode(EnableSketchMode { entity_id, .. }) = artifact_command.command { current_plane_id = Some(entity_id); @@ -610,6 +612,9 @@ pub(super) fn build_artifact_graph( if let ModelingCmd::SketchModeDisable(_) = artifact_command.command { current_plane_id = None; } + if let ModelingCmd::StartPath(_) = artifact_command.command { + id_generator = EngineIdGenerator::new(artifact_command.cmd_id); + } let flattened_responses = flatten_modeling_command_responses(responses); let artifact_updates = artifacts_to_update( @@ -620,7 +625,13 @@ pub(super) fn build_artifact_graph( ast, item_count, exec_artifacts, + &id_generator, )?; + + if let ModelingCmd::ExtendPath(_) = artifact_command.command { + id_generator.next_edge(); + } + for artifact in artifact_updates { // Merge with existing artifacts. merge_artifact_into_map(&mut map, artifact); @@ -741,6 +752,7 @@ fn artifacts_to_update( ast: &Node, cached_body_items: usize, exec_artifacts: &IndexMap, + id_generator: &EngineIdGenerator, ) -> Result, KclError> { let uuid = artifact_command.cmd_id; let response = responses.get(&uuid); @@ -881,8 +893,9 @@ fn artifacts_to_update( ), }); let mut return_arr = Vec::new(); + let curve_id = id_generator.get_curve_id(); return_arr.push(Artifact::Segment(Segment { - id, + id: curve_id, path_id, surface_id: None, edge_ids: Vec::new(), @@ -893,7 +906,7 @@ fn artifacts_to_update( let path = artifacts.get(&path_id); if let Some(Artifact::Path(path)) = path { let mut new_path = path.clone(); - new_path.seg_ids = vec![id]; + new_path.seg_ids = vec![curve_id]; return_arr.push(Artifact::Path(new_path)); } if let Some(OkModelingCmdResponse::ClosePath(close_path)) = response { diff --git a/rust/kcl-lib/src/execution/id_generator.rs b/rust/kcl-lib/src/execution/id_generator.rs index 4fb1d089008..223229791f9 100644 --- a/rust/kcl-lib/src/execution/id_generator.rs +++ b/rust/kcl-lib/src/execution/id_generator.rs @@ -1,6 +1,6 @@ //! A generator for ArtifactIds that can be stable across executions. -use crate::execution::ModuleId; +use crate::execution::{ArtifactId, ModuleId}; const NAMESPACE_KCL: uuid::Uuid = uuid::uuid!("8bda3118-75eb-58c7-a866-bef1dcb495e7"); @@ -32,6 +32,64 @@ impl IdGenerator { } } +const ENGINE_NAMESPACE_KCL: uuid::Uuid = uuid::uuid!("22b85cda-1c8d-57c4-88b5-3fd71846f31e"); +pub struct EngineIdGenerator { + base: uuid::Uuid, // this is the sketch id, aka ClosePath's path_id, aka object uuid in engine + path_index: u32, // zero based index of the segment/curve/edge in the path. +} + +impl EngineIdGenerator { + pub fn new(base: uuid::Uuid) -> Self { + Self { base, path_index: 0 } + } + + pub fn next_edge(&mut self) { + self.path_index += 1; + } + + // aka edge/segment id + pub fn get_curve_id(&self) -> ArtifactId { + self.generate_path_id("") // "path_0" + } + + // aka wall_id + pub fn get_face_id(&self) -> ArtifactId { + self.generate_path_id("face") // "path_0_face" + } + + pub fn get_opposite_edge_id(&self) -> ArtifactId { + self.generate_path_id("opp") // "path_0_opp" + } + + pub fn get_adjacent_edge_id(&self) -> ArtifactId { + self.generate_path_id("adj") // "path_0_adj" + } + + pub fn get_start_cap_id(&self) -> ArtifactId { + self.generate_id("face_bottom") // "path_0_face_bottom" + } + + pub fn get_end_cap_id(&self) -> ArtifactId { + self.generate_id("face_top") // "path_0_face_bottom" + } + + fn generate_path_id(&self, suffix: &str) -> ArtifactId { + let path_modifier = format!("path_{}", self.path_index); + let modifier = if suffix.is_empty() { + path_modifier + } else { + format!("{}_{}", path_modifier, suffix) + }; + self.generate_id(&modifier) + } + + fn generate_id(&self, modifier: &str) -> ArtifactId { + let name = format!("{}_{}", self.base, modifier); + let uuid = uuid::Uuid::new_v5(&ENGINE_NAMESPACE_KCL, name.as_bytes()); + ArtifactId::new(uuid) + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/rust/kcl-lib/src/execution/mod.rs b/rust/kcl-lib/src/execution/mod.rs index 85677fbd935..256a82ee4aa 100644 --- a/rust/kcl-lib/src/execution/mod.rs +++ b/rust/kcl-lib/src/execution/mod.rs @@ -11,7 +11,7 @@ pub use cache::{bust_cache, clear_mem_cache}; pub use cad_op::Group; pub use cad_op::Operation; pub use geometry::*; -pub use id_generator::IdGenerator; +pub use id_generator::{EngineIdGenerator, IdGenerator}; pub(crate) use import::PreImportedGeometry; use indexmap::IndexMap; pub use kcl_value::{KclObjectFields, KclValue}; diff --git a/rust/kcl-lib/src/std/extrude.rs b/rust/kcl-lib/src/std/extrude.rs index 9c8a53941a8..cec357c25e3 100644 --- a/rust/kcl-lib/src/std/extrude.rs +++ b/rust/kcl-lib/src/std/extrude.rs @@ -22,7 +22,8 @@ use super::{DEFAULT_TOLERANCE_MM, args::TyF64, utils::point_to_mm}; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ - ArtifactId, ExecState, ExtrudeSurface, GeoMeta, KclValue, ModelingCmdMeta, Path, Sketch, SketchSurface, Solid, + ArtifactId, EngineIdGenerator, ExecState, ExtrudeSurface, GeoMeta, KclValue, ModelingCmdMeta, Path, Sketch, + SketchSurface, Solid, types::{PrimitiveType, RuntimeType}, }, parsing::ast::types::TagNode, @@ -349,13 +350,15 @@ pub(crate) async fn do_post_extrude<'a>( } else { // The "get extrusion face info" API call requires *any* edge on the sketch being extruded. // So, let's just use the first one. - let Some(any_edge_id) = sketch.paths.first().map(|edge| edge.get_base().geo_meta.id) else { - return Err(KclError::new_type(KclErrorDetails::new( - "Expected a non-empty sketch".to_owned(), - vec![args.source_range], - ))); - }; - any_edge_id + + EngineIdGenerator::new(sketch.id).get_curve_id().into() + // let Some(any_edge_id) = sketch.paths.first().map(|edge| edge.get_base().geo_meta.id) else { + // return Err(KclError::new_type(KclErrorDetails::new( + // "Expected a non-empty sketch".to_owned(), + // vec![args.source_range], + // ))); + // }; + // any_edge_id }; let mut sketch = sketch.clone(); From c908cb20243e1265f981eedc2fa6a27329b72445 Mon Sep 17 00:00:00 2001 From: Andrew Varga Date: Tue, 16 Sep 2025 23:33:01 +0200 Subject: [PATCH 2/5] add separate branch in post_exture for new id generation, no artifact graph generation for walls yet --- rust/kcl-lib/src/std/clone.rs | 1 + rust/kcl-lib/src/std/extrude.rs | 141 ++++++++++++++++++-------------- rust/kcl-lib/src/std/loft.rs | 1 + rust/kcl-lib/src/std/revolve.rs | 1 + rust/kcl-lib/src/std/sweep.rs | 1 + 5 files changed, 85 insertions(+), 60 deletions(-) diff --git a/rust/kcl-lib/src/std/clone.rs b/rust/kcl-lib/src/std/clone.rs index 6a021906651..1a693539d97 100644 --- a/rust/kcl-lib/src/std/clone.rs +++ b/rust/kcl-lib/src/std/clone.rs @@ -154,6 +154,7 @@ async fn fix_tags_and_references( exec_state, args, None, + false, ) .await?; diff --git a/rust/kcl-lib/src/std/extrude.rs b/rust/kcl-lib/src/std/extrude.rs index cec357c25e3..b52d112a19a 100644 --- a/rust/kcl-lib/src/std/extrude.rs +++ b/rust/kcl-lib/src/std/extrude.rs @@ -309,6 +309,7 @@ async fn inner_extrude( exec_state, &args, None, + true ) .await?, ); @@ -333,6 +334,7 @@ pub(crate) async fn do_post_extrude<'a>( exec_state: &mut ExecState, args: &Args, edge_id: Option, + generate_predictive_ids: bool, ) -> Result { // Bring the object to the front of the scene. // See: https://github.com/KittyCAD/modeling-app/issues/806 @@ -343,77 +345,96 @@ pub(crate) async fn do_post_extrude<'a>( ) .await?; - let any_edge_id = if let Some(edge_id) = sketch.mirror { - edge_id - } else if let Some(id) = edge_id { - id - } else { - // The "get extrusion face info" API call requires *any* edge on the sketch being extruded. - // So, let's just use the first one. - - EngineIdGenerator::new(sketch.id).get_curve_id().into() - // let Some(any_edge_id) = sketch.paths.first().map(|edge| edge.get_base().geo_meta.id) else { - // return Err(KclError::new_type(KclErrorDetails::new( - // "Expected a non-empty sketch".to_owned(), - // vec![args.source_range], - // ))); - // }; - // any_edge_id - }; + let mut face_id_map: HashMap> = Default::default(); + let start_cap_id: Option; + let end_cap_id: Option; let mut sketch = sketch.clone(); sketch.is_closed = true; - // If we were sketching on a face, we need the original face id. - if let SketchSurface::Face(ref face) = sketch.on { - // If we are creating a new body we need to preserve its new id. - if extrude_method != ExtrudeMethod::New { - sketch.id = face.solid.sketch.id; + if generate_predictive_ids { + let mut id_generator = EngineIdGenerator::new(sketch.id); + start_cap_id = Some(id_generator.get_start_cap_id().into()); + end_cap_id = Some(id_generator.get_end_cap_id().into()); + + // TODO Note we're skipping the last one, because 3 segments have 4 paths in sketch. + for _ in 0..sketch.paths.len() - 1 { + face_id_map.insert(id_generator.get_curve_id().into(), Some(id_generator.get_face_id().into())); + id_generator.next_edge(); } - } + } else { + let any_edge_id = if let Some(edge_id) = sketch.mirror { + edge_id + } else if let Some(id) = edge_id { + id + } else { + // The "get extrusion face info" API call requires *any* edge on the sketch being extruded. + // So, let's just use the first one. + + EngineIdGenerator::new(sketch.id).get_curve_id().into() + // let Some(any_edge_id) = sketch.paths.first().map(|edge| edge.get_base().geo_meta.id) else { + // return Err(KclError::new_type(KclErrorDetails::new( + // "Expected a non-empty sketch".to_owned(), + // vec![args.source_range], + // ))); + // }; + // any_edge_id + }; - let solid3d_info = exec_state - .send_modeling_cmd( - args.into(), - ModelingCmd::from(mcmd::Solid3dGetExtrusionFaceInfo { - edge_id: any_edge_id, - object_id: sketch.id, - }), - ) - .await?; + // If we were sketching on a face, we need the original face id. + if let SketchSurface::Face(ref face) = sketch.on { + // If we are creating a new body we need to preserve its new id. + if extrude_method != ExtrudeMethod::New { + sketch.id = face.solid.sketch.id; + } + } - let face_infos = if let OkWebSocketResponseData::Modeling { - modeling_response: OkModelingCmdResponse::Solid3dGetExtrusionFaceInfo(data), - } = solid3d_info - { - data.faces - } else { - vec![] - }; + let solid3d_info = exec_state + .send_modeling_cmd( + args.into(), + ModelingCmd::from(mcmd::Solid3dGetExtrusionFaceInfo { + edge_id: any_edge_id, + object_id: sketch.id, + }), + ) + .await?; + + #[cfg(target_arch = "wasm32")] + web_sys::console::warn_1(&format!("*** solid3d_info: {solid3d_info:#?}").into()); - // Only do this if we need the artifact graph. - #[cfg(feature = "artifact-graph")] - { - // Getting the ids of a sectional sweep does not work well and we cannot guarantee that - // any of these call will not just fail. - if !sectional { - exec_state - .batch_modeling_cmd( - args.into(), - ModelingCmd::from(mcmd::Solid3dGetAdjacencyInfo { - object_id: sketch.id, - edge_id: any_edge_id, - }), - ) - .await?; + let face_infos = if let OkWebSocketResponseData::Modeling { + modeling_response: OkModelingCmdResponse::Solid3dGetExtrusionFaceInfo(data), + } = solid3d_info + { + data.faces + } else { + vec![] + }; + + // Only do this if we need the artifact graph. + #[cfg(feature = "artifact-graph")] + { + // Getting the ids of a sectional sweep does not work well and we cannot guarantee that + // any of these call will not just fail. + if !sectional { + exec_state + .batch_modeling_cmd( + args.into(), + ModelingCmd::from(mcmd::Solid3dGetAdjacencyInfo { + object_id: sketch.id, + edge_id: any_edge_id, + }), + ) + .await?; + } } + + let faces = analyze_faces(exec_state, args, face_infos).await; + face_id_map = faces.sides; + start_cap_id = faces.start_cap_id; + end_cap_id = faces.end_cap_id; } - let Faces { - sides: face_id_map, - start_cap_id, - end_cap_id, - } = analyze_faces(exec_state, args, face_infos).await; // Iterate over the sketch.value array and add face_id to GeoMeta let no_engine_commands = args.ctx.no_engine_commands().await; let mut new_value: Vec = Vec::with_capacity(sketch.paths.len() + sketch.inner_paths.len() + 2); diff --git a/rust/kcl-lib/src/std/loft.rs b/rust/kcl-lib/src/std/loft.rs index ec830dcbcde..74014356bf1 100644 --- a/rust/kcl-lib/src/std/loft.rs +++ b/rust/kcl-lib/src/std/loft.rs @@ -104,6 +104,7 @@ async fn inner_loft( exec_state, &args, None, + false, ) .await?, )) diff --git a/rust/kcl-lib/src/std/revolve.rs b/rust/kcl-lib/src/std/revolve.rs index dc032f2dbc9..bcd04a28f5c 100644 --- a/rust/kcl-lib/src/std/revolve.rs +++ b/rust/kcl-lib/src/std/revolve.rs @@ -208,6 +208,7 @@ async fn inner_revolve( exec_state, &args, edge_id, + false, ) .await?, ); diff --git a/rust/kcl-lib/src/std/sweep.rs b/rust/kcl-lib/src/std/sweep.rs index 8e0d19fe6b5..8cef87d761e 100644 --- a/rust/kcl-lib/src/std/sweep.rs +++ b/rust/kcl-lib/src/std/sweep.rs @@ -108,6 +108,7 @@ async fn inner_sweep( exec_state, &args, None, + false, ) .await?, ); From d344c3de2576f14e57922d5a27dfbff5aeb62859 Mon Sep 17 00:00:00 2001 From: Andrew Varga Date: Wed, 17 Sep 2025 10:55:07 +0200 Subject: [PATCH 3/5] wall generation start --- rust/kcl-lib/src/execution/artifact.rs | 40 ++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/rust/kcl-lib/src/execution/artifact.rs b/rust/kcl-lib/src/execution/artifact.rs index a3a98606916..294c8c50869 100644 --- a/rust/kcl-lib/src/execution/artifact.rs +++ b/rust/kcl-lib/src/execution/artifact.rs @@ -1030,7 +1030,47 @@ fn artifacts_to_update( inner_path_artifact.sweep_id = Some(id); return_arr.push(Artifact::Path(inner_path_artifact)) } + + if let ModelingCmd::Extrude(kcmc::Extrude { target, distance, faces, opposite, extrude_method }) = cmd { + #[cfg(target_arch = "wasm32")] + web_sys::console::warn_1(&format!("*** cmd: {cmd:#?}").into()); + + #[cfg(target_arch = "wasm32")] + web_sys::console::warn_1(&format!("*** path: {path:#?}").into()); + + // TODO build up the artifact graph here. + + // Note: target.0 === path.id + let mut id_generator = EngineIdGenerator::new(target.0); + for _ in 0..path.seg_ids.len() { + // create wall artifacts + let wall_id = id_generator.get_face_id(); + let curve_id = id_generator.get_curve_id(); + + let wall_artifact = Artifact::Wall(Wall { + id: wall_id, + seg_id: curve_id, + edge_cut_edge_ids: Vec::new(), + sweep_id: path.sweep_id, + path_ids: Vec::new(), + face_code_ref: path.code_ref.clone(), + cmd_id: artifact_command.cmd_id, + }); + return_arr.push(wall_artifact); + + id_generator.next_edge(); + } + // for _ in 0..sketch.paths.len() { + // face_id_map.insert(id_generator.get_curve_id().into(), Some(id_generator.get_face_id().into())); + // let curve_id = id_generator.get_curve_id(); + // id_generator.next_edge(); + + // #[cfg(target_arch = "wasm32")] + // web_sys::console::warn_1(&format!("*** curve_id: {curve_id:#?}").into()); + // } + } } + return Ok(return_arr); } ModelingCmd::Loft(loft_cmd) => { From 3f98c2b0d367bee0dcd4816518b3cb03df0cf2f2 Mon Sep 17 00:00:00 2001 From: Andrew Varga Date: Wed, 17 Sep 2025 20:38:34 +0200 Subject: [PATCH 4/5] generate artifact graph for extrude --- rust/kcl-lib/src/execution/artifact.rs | 143 +++++++++++++++++---- rust/kcl-lib/src/execution/id_generator.rs | 7 + rust/kcl-lib/src/std/extrude.rs | 7 +- 3 files changed, 127 insertions(+), 30 deletions(-) diff --git a/rust/kcl-lib/src/execution/artifact.rs b/rust/kcl-lib/src/execution/artifact.rs index 294c8c50869..7dd3dffc494 100644 --- a/rust/kcl-lib/src/execution/artifact.rs +++ b/rust/kcl-lib/src/execution/artifact.rs @@ -1010,14 +1010,15 @@ fn artifacts_to_update( }; let mut return_arr = Vec::new(); let target = ArtifactId::from(target); - return_arr.push(Artifact::Sweep(Sweep { + let mut sweep = Sweep { id, sub_type, path_id: target, surface_ids: Vec::new(), edge_ids: Vec::new(), code_ref, - })); + }; + let path = artifacts.get(&target); if let Some(Artifact::Path(path)) = path { let mut new_path = path.clone(); @@ -1031,46 +1032,110 @@ fn artifacts_to_update( return_arr.push(Artifact::Path(inner_path_artifact)) } - if let ModelingCmd::Extrude(kcmc::Extrude { target, distance, faces, opposite, extrude_method }) = cmd { - #[cfg(target_arch = "wasm32")] - web_sys::console::warn_1(&format!("*** cmd: {cmd:#?}").into()); - - #[cfg(target_arch = "wasm32")] - web_sys::console::warn_1(&format!("*** path: {path:#?}").into()); - - // TODO build up the artifact graph here. - + if let ModelingCmd::Extrude(kcmc::Extrude { .. }) = cmd { // Note: target.0 === path.id let mut id_generator = EngineIdGenerator::new(target.0); - for _ in 0..path.seg_ids.len() { - // create wall artifacts - let wall_id = id_generator.get_face_id(); + let sweep_id = id; // command id is the sweep id + + let start_cap_id = id_generator.get_start_cap_id(); + let end_cap_id = id_generator.get_end_cap_id(); + + // Go through segments and add walls, opposite and adj edges + for index in 0..path.seg_ids.len() - 1 { + let face_id = id_generator.get_face_id(); + let next_face_id = id_generator.get_next_face_id(path.seg_ids.len() as u32); let curve_id = id_generator.get_curve_id(); - + let opposite_edge_id = id_generator.get_opposite_edge_id(); + + let adjacent_edge_id = id_generator.get_adjacent_edge_id(); + let wall_artifact = Artifact::Wall(Wall { - id: wall_id, + id: face_id, seg_id: curve_id, - edge_cut_edge_ids: Vec::new(), - sweep_id: path.sweep_id, + edge_cut_edge_ids: vec![opposite_edge_id, adjacent_edge_id], + sweep_id, path_ids: Vec::new(), - face_code_ref: path.code_ref.clone(), + face_code_ref: find_sketch_on_face_code_ref(exec_artifacts, face_id), cmd_id: artifact_command.cmd_id, }); return_arr.push(wall_artifact); + sweep.surface_ids.push(face_id); + + return_arr.push(Artifact::SweepEdge(SweepEdge { + id: opposite_edge_id, + sub_type: SweepEdgeSubType::Opposite, + seg_id: curve_id, + cmd_id: artifact_command.cmd_id, + index, + sweep_id, + common_surface_ids: vec![face_id, end_cap_id], + })); + + return_arr.push(Artifact::SweepEdge(SweepEdge { + id: adjacent_edge_id, + sub_type: SweepEdgeSubType::Adjacent, + seg_id: curve_id, + cmd_id: artifact_command.cmd_id, + index, + sweep_id, + common_surface_ids: vec![face_id, next_face_id], + })); + + // Add opposite and adjacent edges to segment, sweep and wall. + if let Some(Artifact::Segment(segment)) = artifacts.get(&curve_id) { + let mut new_segment = segment.clone(); + new_segment.edge_ids = vec![opposite_edge_id, adjacent_edge_id]; + new_segment.common_surface_ids = vec![face_id, end_cap_id]; + return_arr.push(Artifact::Segment(new_segment)); + } + + sweep.edge_ids.push(opposite_edge_id); + sweep.edge_ids.push(adjacent_edge_id); + + // TODO is this ever used? + // if let Some(artifact) = artifacts.get(&edge_id) { + // match artifact { + // Artifact::SweepEdge(_sweep_edge) => { + + // // let mut new_sweep_edge = sweep_edge.clone(); + // // new_sweep_edge.common_surface_ids = + // // original_info.faces.iter().map(|face| ArtifactId::new(*face)).collect(); + // // return_arr.push(Artifact::SweepEdge(new_sweep_edge)); + // } + // _ => {} + // }; + // }; id_generator.next_edge(); } - // for _ in 0..sketch.paths.len() { - // face_id_map.insert(id_generator.get_curve_id().into(), Some(id_generator.get_face_id().into())); - // let curve_id = id_generator.get_curve_id(); - // id_generator.next_edge(); - - // #[cfg(target_arch = "wasm32")] - // web_sys::console::warn_1(&format!("*** curve_id: {curve_id:#?}").into()); - // } + + // Add end caps + + return_arr.push(Artifact::Cap(Cap { + id: start_cap_id, + sub_type: CapSubType::Start, + edge_cut_edge_ids: Vec::new(), + sweep_id, + path_ids: Vec::new(), + face_code_ref: find_sketch_on_face_code_ref(exec_artifacts, start_cap_id), + cmd_id: artifact_command.cmd_id, + })); + sweep.surface_ids.push(start_cap_id); + + return_arr.push(Artifact::Cap(Cap { + id: end_cap_id, + sub_type: CapSubType::End, + edge_cut_edge_ids: Vec::new(), + sweep_id, + path_ids: Vec::new(), + face_code_ref: find_sketch_on_face_code_ref(exec_artifacts, end_cap_id), + cmd_id: artifact_command.cmd_id, + })); + sweep.surface_ids.push(end_cap_id); } } - + return_arr.push(Artifact::Sweep(sweep)); + return Ok(return_arr); } ModelingCmd::Loft(loft_cmd) => { @@ -1518,3 +1583,25 @@ fn artifacts_to_update( Ok(Vec::new()) } + +// Find sketch_on_face_code_ref (code from Solid3dGetExtrusionFaceInfo handling) +fn find_sketch_on_face_code_ref(exec_artifacts: &IndexMap, face_id: ArtifactId) -> CodeRef { + let extra_artifact = exec_artifacts.values().find(|a| { + if let Artifact::StartSketchOnFace(s) = a { + s.face_id == face_id + } else if let Artifact::StartSketchOnPlane(s) = a { + s.plane_id == face_id + } else { + false + } + }); + let sketch_on_face_code_ref = extra_artifact + .and_then(|a| match a { + Artifact::StartSketchOnFace(s) => Some(s.code_ref.clone()), + Artifact::StartSketchOnPlane(s) => Some(s.code_ref.clone()), + _ => None, + }) + // TODO: If we didn't find it, it's probably a bug. + .unwrap_or_default(); + sketch_on_face_code_ref +} diff --git a/rust/kcl-lib/src/execution/id_generator.rs b/rust/kcl-lib/src/execution/id_generator.rs index 223229791f9..48baaa4aaa9 100644 --- a/rust/kcl-lib/src/execution/id_generator.rs +++ b/rust/kcl-lib/src/execution/id_generator.rs @@ -57,6 +57,13 @@ impl EngineIdGenerator { self.generate_path_id("face") // "path_0_face" } + pub fn get_next_face_id(&self, num_segments: u32) -> ArtifactId { + let index = (self.path_index + 1) % num_segments; + let path_modifier = format!("path_{}", index); + let modifier = format!("{}_{}", path_modifier, "face"); + self.generate_id(&modifier) + } + pub fn get_opposite_edge_id(&self) -> ArtifactId { self.generate_path_id("opp") // "path_0_opp" } diff --git a/rust/kcl-lib/src/std/extrude.rs b/rust/kcl-lib/src/std/extrude.rs index 485ad8c92bf..f8cf76b1fd9 100644 --- a/rust/kcl-lib/src/std/extrude.rs +++ b/rust/kcl-lib/src/std/extrude.rs @@ -314,7 +314,7 @@ async fn inner_extrude( exec_state, &args, None, - true + true, ) .await?, ); @@ -364,7 +364,10 @@ pub(crate) async fn do_post_extrude<'a>( // TODO Note we're skipping the last one, because 3 segments have 4 paths in sketch. for _ in 0..sketch.paths.len() - 1 { - face_id_map.insert(id_generator.get_curve_id().into(), Some(id_generator.get_face_id().into())); + face_id_map.insert( + id_generator.get_curve_id().into(), + Some(id_generator.get_face_id().into()), + ); id_generator.next_edge(); } } else { From be20d0430770ccbe4d8b2d8eda14de1209a1bedc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 19 Sep 2025 09:29:24 +0000 Subject: [PATCH 5/5] Update snapshots --- ...y-Grid-turned-on-1-Google-Chrome-linux.png | Bin 40768 -> 31780 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-on-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Grid-visibility-Grid-turned-on-1-Google-Chrome-linux.png index b089d0703dab084ab1e228979d09494f99087d62..84eb3784c1f1cb46baf2782f82af24a2ee248acc 100644 GIT binary patch literal 31780 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 literal 40768 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