diff --git a/Cargo.lock b/Cargo.lock index 6f98f2df8..8114161f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -878,7 +878,7 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cadkernel" version = "0.1.0" -source = "git+https://github.com/HakanSeven12/cadkernel.git?rev=efc77f5#efc77f5d18375467c3cc2c256a22759bb5f9cb54" +source = "git+https://github.com/HakanSeven12/cadkernel.git?rev=b8ec104#b8ec104e86060fe7d5c698870915b5388569649b" dependencies = [ "acadrust", "cavalier_contours", diff --git a/Cargo.toml b/Cargo.toml index db3cb1712..d726fa92b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,7 +28,7 @@ rfd = "0.17" clap = { version = "4", features = ["derive"] } env_logger = "0.11" acadrust = { git = "https://github.com/HakanSeven12/cadcodec.git", rev = "931c4ab", features = ["serde"] } -cadkernel = { git = "https://github.com/HakanSeven12/cadkernel.git", rev = "efc77f5", features = ["acis", "offset"] } +cadkernel = { git = "https://github.com/HakanSeven12/cadkernel.git", rev = "b8ec104", 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/src/entities/lwpolyline.rs b/src/entities/lwpolyline.rs index 11fc3488a..49f370bbe 100644 --- a/src/entities/lwpolyline.rs +++ b/src/entities/lwpolyline.rs @@ -1053,32 +1053,20 @@ impl crate::entities::traits::MassPropsCalc for acadrust::entities::LwPolyline { cy: 0.0, }; } - // Shoelace area + perimeter - let mut area_sum = 0.0f64; - let mut perimeter = 0.0f64; - let mut cx_sum = 0.0f64; - let mut cy_sum = 0.0f64; - let n_segs = if p.is_closed { n } else { n - 1 }; - for idx in 0..n_segs { - let v0 = &p.vertices[idx]; - let v1 = &p.vertices[(idx + 1) % n]; - let x0 = v0.location.x; - let y0 = v0.location.y; - let x1 = v1.location.x; - let y1 = v1.location.y; - area_sum += x0 * y1 - x1 * y0; - perimeter += ((x1 - x0).powi(2) + (y1 - y0).powi(2)).sqrt(); - cx_sum += (x0 + x1) * (x0 * y1 - x1 * y0); - cy_sum += (y0 + y1) * (x0 * y1 - x1 * y0); - } - let area = (area_sum / 2.0).abs(); - let (cx, cy) = if area > 1e-12 { - (cx_sum / (6.0 * area), cy_sum / (6.0 * area)) - } else { - let sx: f64 = p.vertices.iter().map(|v| v.location.x).sum::() / n as f64; - let sy: f64 = p.vertices.iter().map(|v| v.location.y).sum::() / n as f64; - (sx, sy) - }; + // Kernel measurement includes bulges and closes open curves only for area. + let curve = crate::entities::curve::lwpolyline_curve(p) + .expect("an LwPolyline with at least two vertices has a planar curve"); + let area = curve.curve.enclosed_area().abs(); + let perimeter = curve.length(); + let (cx, cy) = curve + .curve + .enclosed_centroid() + .map(|point| (point[0], point[1])) + .unwrap_or_else(|| { + let x = p.vertices.iter().map(|v| v.location.x).sum::() / n as f64; + let y = p.vertices.iter().map(|v| v.location.y).sum::() / n as f64; + (x, y) + }); crate::entities::traits::MassProps { area, perimeter,