diff --git a/Cargo.lock b/Cargo.lock index 932743ea3..ff290b9e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -885,7 +885,7 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cadkernel" version = "0.1.0" -source = "git+https://github.com/HakanSeven12/cadkernel.git?rev=7f18223c66c1fde2e2a2c16e61259655d173bf4f#7f18223c66c1fde2e2a2c16e61259655d173bf4f" +source = "git+https://github.com/HakanSeven12/cadkernel.git?rev=e831220b3a4bed5292625f4e6b7b2dc6f1191cba#e831220b3a4bed5292625f4e6b7b2dc6f1191cba" dependencies = [ "acadrust", "cavalier_contours", diff --git a/Cargo.toml b/Cargo.toml index 67c9ecdbc..31a5743cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ rfd = "0.17" clap = { version = "4", features = ["derive", "string"] } env_logger = "0.11" acadrust = { git = "https://github.com/HakanSeven12/cadcodec.git", rev = "62628c41670a914d1598a14faafc3c6e3aa4a270", features = ["serde"] } -cadkernel = { git = "https://github.com/HakanSeven12/cadkernel.git", rev = "7f18223c66c1fde2e2a2c16e61259655d173bf4f", features = ["acis", "offset"] } +cadkernel = { git = "https://github.com/HakanSeven12/cadkernel.git", rev = "e831220b3a4bed5292625f4e6b7b2dc6f1191cba", features = ["acis", "offset"] } dwg-thumbnailer = { path = "crates/dwg-thumbnailer" } flate2 = "1" image = { version = "0.25", default-features = false, features = ["png", "jpeg", "bmp", "tiff"] } diff --git a/crates/ocs_doc_api/Cargo.toml b/crates/ocs_doc_api/Cargo.toml index 7367ecb8d..a88a05f67 100644 --- a/crates/ocs_doc_api/Cargo.toml +++ b/crates/ocs_doc_api/Cargo.toml @@ -15,7 +15,7 @@ thiserror = "1" # Host adapters convert ObjectId to acadrust handles; kernel handles stay local. acadrust = { git = "https://github.com/HakanSeven12/cadcodec.git", rev = "62628c41670a914d1598a14faafc3c6e3aa4a270", features = ["serde"], optional = true } -cadkernel = { git = "https://github.com/HakanSeven12/cadkernel.git", rev = "7f18223c66c1fde2e2a2c16e61259655d173bf4f", features = ["acis", "offset"], optional = true } +cadkernel = { git = "https://github.com/HakanSeven12/cadkernel.git", rev = "e831220b3a4bed5292625f4e6b7b2dc6f1191cba", features = ["acis", "offset"], optional = true } ocs_plugin_api = { path = "../ocs_plugin_api", optional = true, features = ["host"] } [build-dependencies] diff --git a/src/app/command_driver.rs b/src/app/command_driver.rs index 43b0740d8..f21d641fa 100644 --- a/src/app/command_driver.rs +++ b/src/app/command_driver.rs @@ -5814,8 +5814,8 @@ fn resample_widths(source: &[(f64, f64)], count: usize) -> Vec<(f64, f64)> { mod thicken_tests { use super::*; use acadrust::entities::{Surface, SurfaceKind}; - use cadkernel::geom2d::{Circle, Curve}; - use cadkernel::space::Plane; + use cadkernel::geom2d::{Circle, Curve, NurbsCurve}; + use cadkernel::space::{Parameterization, Plane}; #[test] fn thicken_preserves_sources_and_round_trips_results_with_one_undo() { @@ -5857,4 +5857,53 @@ mod thicken_tests { assert!(app.tabs[i].scene.document.solid_history_operation(result).is_some()); assert_eq!(serde_json::to_value(app.tabs[i].scene.document.get_entity(source).unwrap()).unwrap(), original); } + + #[test] + fn thicken_creates_a_solid_from_a_free_form_surface() { + let mut app = OpenCADStudio::new_for_test(); + app.automation_op(r#"{"op":"new"}"#); + let profile = NurbsCurve::interpolate( + &[[0.0, 0.0], [0.7, 0.15], [1.3, -0.1], [2.0, 0.0]], + None, + None, + Parameterization::Chord, + ) + .unwrap(); + let body = cadkernel::brep::extrude_surface( + Plane::XY, + &[Curve::Nurbs(profile)], + [0.0, 0.0, 2.0], + ) + .unwrap(); + let source = app.add_surface_model( + acadrust::EntityType::Surface(Surface::new(SurfaceKind::Generic)), + body, + ); + let i = app.active_tab; + + let _ = app.apply_cmd_result(CmdResult::ThickenEntities { + handles: vec![source], + distance: 0.15, + }); + + let solids = app.tabs[i] + .scene + .document + .entities() + .filter_map(|entity| { + matches!(entity, acadrust::EntityType::Solid3D(_)) + .then_some(entity.common().handle) + }) + .collect::>(); + assert_eq!(solids.len(), 1); + let solid = &app.tabs[i].scene.solid_models[&solids[0]]; + assert!(solid.validate().is_empty()); + assert!(solid.edges.iter().all(|(_, edge)| edge.coedges.len() == 2)); + assert!(app.tabs[i] + .scene + .document + .solid_history_operation(solids[0]) + .is_some()); + assert!(app.tabs[i].scene.document.get_entity(source).is_some()); + } }