diff --git a/src/entities/lwpolyline.rs b/src/entities/lwpolyline.rs index 1a30d12b6..c1a5a3b26 100644 --- a/src/entities/lwpolyline.rs +++ b/src/entities/lwpolyline.rs @@ -662,9 +662,12 @@ impl crate::entities::traits::Transformable for LwPolyline { /// UTM-scale coordinates — building them in absolute f32 collapsed the band into /// a string of squares far from the origin. pub(crate) fn wide_fills(pl: &acadrust::entities::LwPolyline) -> ([f64; 2], Vec>) { - // The stored width is applied to EACH side of the centreline (not halved), - // so `polyline_segment_fill`'s ±offset spans the full width on either side. - let hw_const = pl.constant_width as f32; + // Codes 43 / 40 / 41 store the band's FULL width, and + // `polyline_segment_fill` offsets ±hw about the centreline — so halve it. + // Feeding the stored width in whole draws every wide polyline twice as wide + // as the file asks for, which on a donut (a closed 2-vertex bulge-1 polyline) + // shows up as a disc 1.5× its real radius. + let hw_const = pl.constant_width as f32 * 0.5; let verts = &pl.vertices; let n = verts.len(); if n < 2 { @@ -677,12 +680,12 @@ pub(crate) fn wide_fills(pl: &acadrust::entities::LwPolyline) -> ([f64; 2], Vec< let v0 = &verts[i]; let v1 = &verts[(i + 1) % n]; let hw0 = if v0.start_width > 1e-9 { - v0.start_width as f32 + v0.start_width as f32 * 0.5 } else { hw_const }; let hw1 = if v0.end_width > 1e-9 { - v0.end_width as f32 + v0.end_width as f32 * 0.5 } else { hw_const }; diff --git a/src/entities/polyline.rs b/src/entities/polyline.rs index ff8ae5fae..48ab13c1c 100644 --- a/src/entities/polyline.rs +++ b/src/entities/polyline.rs @@ -770,8 +770,9 @@ impl Transformable for Polyline3D { /// relative to (the first vertex). See `lwpolyline::wide_fills` — offsets are /// f32 from `origin` so the band stays precise at UTM-scale coordinates. pub(crate) fn wide_fills(pl: &acadrust::entities::Polyline2D) -> ([f64; 2], Vec>) { - // Width is applied full to each side of the centreline (not halved). - let hw_default = pl.start_width.max(pl.end_width) as f32; + // The stored widths are the band's FULL width and `polyline_segment_fill` + // offsets ±hw about the centreline — halve them. See `lwpolyline::wide_fills`. + let hw_default = pl.start_width.max(pl.end_width) as f32 * 0.5; let verts = &pl.vertices; let n = verts.len(); if n < 2 { @@ -784,12 +785,12 @@ pub(crate) fn wide_fills(pl: &acadrust::entities::Polyline2D) -> ([f64; 2], Vec< let v0 = &verts[i]; let v1 = &verts[(i + 1) % n]; let hw0 = if v0.start_width > 1e-9 { - v0.start_width as f32 + v0.start_width as f32 * 0.5 } else { hw_default }; let hw1 = if v0.end_width > 1e-9 { - v0.end_width as f32 + v0.end_width as f32 * 0.5 } else { hw_default };