forked from 1b-agent/opencadstudio-upstream
style: apply cargo fmt across workspace
This commit is contained in:
1 parent
85710e5454
commit
9cf9ff2c5c
531 files changed
+57740
-33906
No files matched your search
+198
-117
@@ -29,8 +29,8 @@ use codec::{CadDocument, EntityType, Handle};
|
||||
use crate::command::{CadCommand, CmdResult, WorkingPlane};
|
||||
use crate::entities::curve::lwpolyline_world_xy;
|
||||
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||
use glam::DVec3;
|
||||
use crate::t;
|
||||
use glam::DVec3;
|
||||
|
||||
// ── Ribbon definition ──────────────────────────────────────────────────────
|
||||
|
||||
@@ -64,9 +64,9 @@ pub fn explode_polyline_segments(entity: &EntityType) -> Vec<EntityType> {
|
||||
pub fn explode_entity(entity: &EntityType, document: &CadDocument) -> Vec<EntityType> {
|
||||
match entity {
|
||||
EntityType::Line(line) => {
|
||||
let Some(association) = codec::entities::CenterMarkAssociation::read(
|
||||
&line.common.extended_data,
|
||||
) else {
|
||||
let Some(association) =
|
||||
codec::entities::CenterMarkAssociation::read(&line.common.extended_data)
|
||||
else {
|
||||
return vec![];
|
||||
};
|
||||
crate::scene::centermark::mark_segments(&association)
|
||||
@@ -121,10 +121,7 @@ pub fn explode_entity(entity: &EntityType, document: &CadDocument) -> Vec<Entity
|
||||
|
||||
/// Explode every entity; one piece list per input, input order preserved,
|
||||
/// empty lists kept. Used by benchmarks and regression tests.
|
||||
pub fn explode_batch(
|
||||
items: &[(Handle, &EntityType)],
|
||||
doc: &CadDocument,
|
||||
) -> Vec<Vec<EntityType>> {
|
||||
pub fn explode_batch(items: &[(Handle, &EntityType)], doc: &CadDocument) -> Vec<Vec<EntityType>> {
|
||||
items.iter().map(|(_, e)| explode_entity(e, doc)).collect()
|
||||
}
|
||||
|
||||
@@ -460,9 +457,7 @@ fn dim_geom_entities(
|
||||
dim_common: &codec::entities::EntityCommon,
|
||||
) -> Vec<EntityType> {
|
||||
let mut entities = Vec::new();
|
||||
let point = |value: [f32; 3]| {
|
||||
Vector3::new(value[0] as f64, value[1] as f64, value[2] as f64)
|
||||
};
|
||||
let point = |value: [f32; 3]| Vector3::new(value[0] as f64, value[1] as f64, value[2] as f64);
|
||||
for (points, common) in [
|
||||
(geometry.ext_lines.as_slice(), ext_common),
|
||||
(geometry.dim_lines.as_slice(), dim_common),
|
||||
@@ -504,7 +499,11 @@ fn dim_terminator(
|
||||
let (px, py) = (-dy, dx);
|
||||
// Point at `along` (down the dim line from the tip) and `perp` (sideways).
|
||||
let pt = |along: f64, perp: f64| {
|
||||
Vector3::new(tip.x + dx * along + px * perp, tip.y + dy * along + py * perp, tip.z)
|
||||
Vector3::new(
|
||||
tip.x + dx * along + px * perp,
|
||||
tip.y + dy * along + py * perp,
|
||||
tip.z,
|
||||
)
|
||||
};
|
||||
let mut out: Vec<EntityType> = Vec::new();
|
||||
let tri = |a: Vector3, b: Vector3, c: Vector3, out: &mut Vec<EntityType>| {
|
||||
@@ -515,7 +514,11 @@ fn dim_terminator(
|
||||
};
|
||||
match arrow {
|
||||
A::None => {}
|
||||
A::Triangle { size, filled, size_mul } => {
|
||||
A::Triangle {
|
||||
size,
|
||||
filled,
|
||||
size_mul,
|
||||
} => {
|
||||
let size = (*size * *size_mul) as f64;
|
||||
let hw = size / 6.0;
|
||||
let (l, r) = (pt(size, hw), pt(size, -hw));
|
||||
@@ -651,17 +654,41 @@ fn dim_center_mark(
|
||||
let v = |x: f64, y: f64| Vector3::new(x, y, center.z);
|
||||
// Central "+" mark.
|
||||
let mut out = vec![
|
||||
dim_seg(v(center.x - mag, center.y), v(center.x + mag, center.y), common),
|
||||
dim_seg(v(center.x, center.y - mag), v(center.x, center.y + mag), common),
|
||||
dim_seg(
|
||||
v(center.x - mag, center.y),
|
||||
v(center.x + mag, center.y),
|
||||
common,
|
||||
),
|
||||
dim_seg(
|
||||
v(center.x, center.y - mag),
|
||||
v(center.x, center.y + mag),
|
||||
common,
|
||||
),
|
||||
];
|
||||
// Negative DIMCEN adds centre LINES: four radial strokes spanning the edge.
|
||||
if dimcen < 0.0 && radius > mag + 1e-6 {
|
||||
let inner = (radius - mag).max(0.0);
|
||||
let outer = radius + mag;
|
||||
out.push(dim_seg(v(center.x + inner, center.y), v(center.x + outer, center.y), common));
|
||||
out.push(dim_seg(v(center.x - inner, center.y), v(center.x - outer, center.y), common));
|
||||
out.push(dim_seg(v(center.x, center.y + inner), v(center.x, center.y + outer), common));
|
||||
out.push(dim_seg(v(center.x, center.y - inner), v(center.x, center.y - outer), common));
|
||||
out.push(dim_seg(
|
||||
v(center.x + inner, center.y),
|
||||
v(center.x + outer, center.y),
|
||||
common,
|
||||
));
|
||||
out.push(dim_seg(
|
||||
v(center.x - inner, center.y),
|
||||
v(center.x - outer, center.y),
|
||||
common,
|
||||
));
|
||||
out.push(dim_seg(
|
||||
v(center.x, center.y + inner),
|
||||
v(center.x, center.y + outer),
|
||||
common,
|
||||
));
|
||||
out.push(dim_seg(
|
||||
v(center.x, center.y - inner),
|
||||
v(center.x, center.y - outer),
|
||||
common,
|
||||
));
|
||||
}
|
||||
out
|
||||
}
|
||||
@@ -697,7 +724,13 @@ fn dim_arc_segs_with_sweep(
|
||||
) -> Vec<EntityType> {
|
||||
use std::f64::consts::PI;
|
||||
let steps = 12usize.max((sweep.abs() / (PI / 36.0)).ceil() as usize);
|
||||
let pt = |a: f64| Vector3::new(center.x + radius * a.cos(), center.y + radius * a.sin(), center.z);
|
||||
let pt = |a: f64| {
|
||||
Vector3::new(
|
||||
center.x + radius * a.cos(),
|
||||
center.y + radius * a.sin(),
|
||||
center.z,
|
||||
)
|
||||
};
|
||||
let mut out = Vec::new();
|
||||
let mut prev = pt(start);
|
||||
for i in 1..=steps {
|
||||
@@ -750,11 +783,16 @@ fn dim_metrics(dim: &Dimension, doc: &CadDocument) -> DimMetrics {
|
||||
.map(|s| if s.dimscale > 1e-6 { s.dimscale } else { 1.0 })
|
||||
.unwrap_or(1.0);
|
||||
use crate::scene::convert::tessellate::{arrow_from_block, ArrowKind};
|
||||
let dimasz = style.map(|s| s.dimasz * scale).unwrap_or(0.18 * scale).max(1e-6);
|
||||
let dimasz = style
|
||||
.map(|s| s.dimasz * scale)
|
||||
.unwrap_or(0.18 * scale)
|
||||
.max(1e-6);
|
||||
let dimtsz = style.map(|s| s.dimtsz * scale).unwrap_or(0.0);
|
||||
let asz = dimasz as f32;
|
||||
let (arrow1, arrow2) = if dimtsz > 1e-9 {
|
||||
let t = ArrowKind::Tick { size: dimtsz as f32 };
|
||||
let t = ArrowKind::Tick {
|
||||
size: dimtsz as f32,
|
||||
};
|
||||
(t.clone(), t)
|
||||
} else if let Some(s) = style {
|
||||
if matches!(dim, Dimension::Radius(_) | Dimension::LargeRadial(_)) {
|
||||
@@ -763,19 +801,35 @@ fn dim_metrics(dim: &Dimension, doc: &CadDocument) -> DimMetrics {
|
||||
} else if matches!(dim, Dimension::Diameter(_)) {
|
||||
use crate::entities::dim_override as ov;
|
||||
let data = &dim.base().common.extended_data;
|
||||
let first = ov::handle(data, ov::DIMBLK1)
|
||||
.unwrap_or(if s.dimsah { s.dimblk1 } else { s.dimblk });
|
||||
let second = ov::handle(data, ov::DIMBLK2)
|
||||
.unwrap_or(if s.dimsah { s.dimblk2 } else { s.dimblk });
|
||||
(arrow_from_block(doc, first, asz), arrow_from_block(doc, second, asz))
|
||||
let first = ov::handle(data, ov::DIMBLK1).unwrap_or(if s.dimsah {
|
||||
s.dimblk1
|
||||
} else {
|
||||
s.dimblk
|
||||
});
|
||||
let second = ov::handle(data, ov::DIMBLK2).unwrap_or(if s.dimsah {
|
||||
s.dimblk2
|
||||
} else {
|
||||
s.dimblk
|
||||
});
|
||||
(
|
||||
arrow_from_block(doc, first, asz),
|
||||
arrow_from_block(doc, second, asz),
|
||||
)
|
||||
} else if s.dimsah {
|
||||
(arrow_from_block(doc, s.dimblk1, asz), arrow_from_block(doc, s.dimblk2, asz))
|
||||
(
|
||||
arrow_from_block(doc, s.dimblk1, asz),
|
||||
arrow_from_block(doc, s.dimblk2, asz),
|
||||
)
|
||||
} else {
|
||||
let a = arrow_from_block(doc, s.dimblk, asz);
|
||||
(a.clone(), a)
|
||||
}
|
||||
} else {
|
||||
let a = ArrowKind::Triangle { size: asz, filled: true, size_mul: 1.0 };
|
||||
let a = ArrowKind::Triangle {
|
||||
size: asz,
|
||||
filled: true,
|
||||
size_mul: 1.0,
|
||||
};
|
||||
(a.clone(), a)
|
||||
};
|
||||
DimMetrics {
|
||||
@@ -808,7 +862,11 @@ fn dim_metrics(dim: &Dimension, doc: &CadDocument) -> DimMetrics {
|
||||
/// A DIMCLR* of 0 (ByBlock) or 256 (ByLayer) keeps the dimension's own colour
|
||||
/// so the block inherits it; a specific ACI overrides. DIMLW* < 0 (ByBlock /
|
||||
/// ByLayer) keeps the dimension's lineweight.
|
||||
fn dim_common(base: &codec::entities::EntityCommon, clr: i16, lw: i16) -> codec::entities::EntityCommon {
|
||||
fn dim_common(
|
||||
base: &codec::entities::EntityCommon,
|
||||
clr: i16,
|
||||
lw: i16,
|
||||
) -> codec::entities::EntityCommon {
|
||||
let mut c = base.clone();
|
||||
c.handle = Handle::NULL;
|
||||
if clr != 0 && clr != 256 {
|
||||
@@ -865,8 +923,16 @@ fn angular_block_segs(
|
||||
return out;
|
||||
}
|
||||
// Extension lines run flush from each measured ray point out to the arc.
|
||||
let e1 = Vector3::new(vertex.x + a1.cos() * radius, vertex.y + a1.sin() * radius, vertex.z);
|
||||
let e2 = Vector3::new(vertex.x + a2.cos() * radius, vertex.y + a2.sin() * radius, vertex.z);
|
||||
let e1 = Vector3::new(
|
||||
vertex.x + a1.cos() * radius,
|
||||
vertex.y + a1.sin() * radius,
|
||||
vertex.z,
|
||||
);
|
||||
let e2 = Vector3::new(
|
||||
vertex.x + a2.cos() * radius,
|
||||
vertex.y + a2.sin() * radius,
|
||||
vertex.z,
|
||||
);
|
||||
out.push(dim_seg(p1, e1, ext_c));
|
||||
out.push(dim_seg(p2, e2, ext_c));
|
||||
let mut sweep = a2 - a1;
|
||||
@@ -874,13 +940,7 @@ fn angular_block_segs(
|
||||
while sweep <= 0.0 {
|
||||
sweep += 2.0 * PI;
|
||||
}
|
||||
out.extend(dim_arc_segs_with_sweep(
|
||||
vertex,
|
||||
radius,
|
||||
a1,
|
||||
sweep,
|
||||
dim_c,
|
||||
));
|
||||
out.extend(dim_arc_segs_with_sweep(vertex, radius, a1, sweep, dim_c));
|
||||
} else {
|
||||
out.extend(dim_arc_segs(vertex, radius, a1, a2, dim_c));
|
||||
}
|
||||
@@ -894,8 +954,20 @@ fn angular_block_segs(
|
||||
}
|
||||
}
|
||||
let sgn = if sweep >= 0.0 { 1.0 } else { -1.0 };
|
||||
out.extend(dim_terminator(e1, -a1.sin() * sgn, a1.cos() * sgn, &met.arrow1, dim_c));
|
||||
out.extend(dim_terminator(e2, a2.sin() * sgn, -a2.cos() * sgn, &met.arrow2, dim_c));
|
||||
out.extend(dim_terminator(
|
||||
e1,
|
||||
-a1.sin() * sgn,
|
||||
a1.cos() * sgn,
|
||||
&met.arrow1,
|
||||
dim_c,
|
||||
));
|
||||
out.extend(dim_terminator(
|
||||
e2,
|
||||
a2.sin() * sgn,
|
||||
-a2.cos() * sgn,
|
||||
&met.arrow2,
|
||||
dim_c,
|
||||
));
|
||||
out
|
||||
}
|
||||
|
||||
@@ -960,12 +1032,9 @@ fn norm2(dx: f64, dy: f64, fx: f64, fy: f64) -> (f64, f64) {
|
||||
|
||||
fn explode_dimension(dim: &Dimension, doc: &CadDocument) -> Vec<EntityType> {
|
||||
if let Dimension::Arc(arc) = dim {
|
||||
if let Some((local_arc, normal)) =
|
||||
crate::entities::dimension::arc_dimension_in_ocs(arc)
|
||||
{
|
||||
let (x_axis, y_axis) = crate::scene::view::transform::ocs_axes((
|
||||
normal.x, normal.y, normal.z,
|
||||
));
|
||||
if let Some((local_arc, normal)) = crate::entities::dimension::arc_dimension_in_ocs(arc) {
|
||||
let (x_axis, y_axis) =
|
||||
crate::scene::view::transform::ocs_axes((normal.x, normal.y, normal.z));
|
||||
let plane = WorkingPlane::new(
|
||||
DVec3::ZERO,
|
||||
DVec3::new(x_axis.0, x_axis.1, x_axis.2),
|
||||
@@ -981,9 +1050,8 @@ fn explode_dimension(dim: &Dimension, doc: &CadDocument) -> Vec<EntityType> {
|
||||
if let Some((local_radial, normal)) =
|
||||
crate::entities::dimension::large_radial_dimension_in_ocs(radial)
|
||||
{
|
||||
let (x_axis, y_axis) = crate::scene::view::transform::ocs_axes((
|
||||
normal.x, normal.y, normal.z,
|
||||
));
|
||||
let (x_axis, y_axis) =
|
||||
crate::scene::view::transform::ocs_axes((normal.x, normal.y, normal.z));
|
||||
let plane = WorkingPlane::new(
|
||||
DVec3::ZERO,
|
||||
DVec3::new(x_axis.0, x_axis.1, x_axis.2),
|
||||
@@ -1037,30 +1105,39 @@ fn explode_dimension(dim: &Dimension, doc: &CadDocument) -> Vec<EntityType> {
|
||||
// halves are suppressed. When the arrows don't fit between the extension
|
||||
// lines (gap < 2·DIMASZ, arrows only) they flip to the outside with short
|
||||
// stubs unless DIMSOXD — matching the live fit logic. DIM-ARROWS-OUTSIDE.
|
||||
let push_dim_line = |result: &mut Vec<EntityType>, d1: Vector3, d2: Vector3, ux: f64, uy: f64| {
|
||||
let ticks = met.dimtsz > 1e-9;
|
||||
if !(met.dimsd1 && met.dimsd2) {
|
||||
let dle = if ticks { met.dimdle } else { 0.0 };
|
||||
let a = v3(d1.x - ux * dle, d1.y - uy * dle, d1.z);
|
||||
let b = v3(d2.x + ux * dle, d2.y + uy * dle, d2.z);
|
||||
result.push(make_seg(&a, &b, &dim_c));
|
||||
}
|
||||
let gap = ((d2.x - d1.x).powi(2) + (d2.y - d1.y).powi(2)).sqrt();
|
||||
let outside = !ticks && met.dimasz > 1e-6 && gap < 2.0 * met.dimasz;
|
||||
if outside {
|
||||
// Arrow bodies extend outward (tips still at the origins).
|
||||
result.extend(dim_terminator(d1, -ux, -uy, &met.arrow1, &dim_c));
|
||||
result.extend(dim_terminator(d2, ux, uy, &met.arrow2, &dim_c));
|
||||
if !met.dimsoxd {
|
||||
let stub = 2.0 * met.dimasz;
|
||||
result.push(make_seg(&v3(d1.x - ux * stub, d1.y - uy * stub, d1.z), &d1, &dim_c));
|
||||
result.push(make_seg(&d2, &v3(d2.x + ux * stub, d2.y + uy * stub, d2.z), &dim_c));
|
||||
let push_dim_line =
|
||||
|result: &mut Vec<EntityType>, d1: Vector3, d2: Vector3, ux: f64, uy: f64| {
|
||||
let ticks = met.dimtsz > 1e-9;
|
||||
if !(met.dimsd1 && met.dimsd2) {
|
||||
let dle = if ticks { met.dimdle } else { 0.0 };
|
||||
let a = v3(d1.x - ux * dle, d1.y - uy * dle, d1.z);
|
||||
let b = v3(d2.x + ux * dle, d2.y + uy * dle, d2.z);
|
||||
result.push(make_seg(&a, &b, &dim_c));
|
||||
}
|
||||
} else {
|
||||
result.extend(dim_terminator(d1, ux, uy, &met.arrow1, &dim_c));
|
||||
result.extend(dim_terminator(d2, -ux, -uy, &met.arrow2, &dim_c));
|
||||
}
|
||||
};
|
||||
let gap = ((d2.x - d1.x).powi(2) + (d2.y - d1.y).powi(2)).sqrt();
|
||||
let outside = !ticks && met.dimasz > 1e-6 && gap < 2.0 * met.dimasz;
|
||||
if outside {
|
||||
// Arrow bodies extend outward (tips still at the origins).
|
||||
result.extend(dim_terminator(d1, -ux, -uy, &met.arrow1, &dim_c));
|
||||
result.extend(dim_terminator(d2, ux, uy, &met.arrow2, &dim_c));
|
||||
if !met.dimsoxd {
|
||||
let stub = 2.0 * met.dimasz;
|
||||
result.push(make_seg(
|
||||
&v3(d1.x - ux * stub, d1.y - uy * stub, d1.z),
|
||||
&d1,
|
||||
&dim_c,
|
||||
));
|
||||
result.push(make_seg(
|
||||
&d2,
|
||||
&v3(d2.x + ux * stub, d2.y + uy * stub, d2.z),
|
||||
&dim_c,
|
||||
));
|
||||
}
|
||||
} else {
|
||||
result.extend(dim_terminator(d1, ux, uy, &met.arrow1, &dim_c));
|
||||
result.extend(dim_terminator(d2, -ux, -uy, &met.arrow2, &dim_c));
|
||||
}
|
||||
};
|
||||
|
||||
match dim {
|
||||
Dimension::Aligned(d) => {
|
||||
@@ -1089,7 +1166,9 @@ fn explode_dimension(dim: &Dimension, doc: &CadDocument) -> Vec<EntityType> {
|
||||
if !met.dimse2 {
|
||||
result.push(make_seg(&e2a, &e2b, &ext_c));
|
||||
}
|
||||
let ml = ((d2.x - d1.x).powi(2) + (d2.y - d1.y).powi(2)).sqrt().max(1e-12);
|
||||
let ml = ((d2.x - d1.x).powi(2) + (d2.y - d1.y).powi(2))
|
||||
.sqrt()
|
||||
.max(1e-12);
|
||||
let (ux, uy) = ((d2.x - d1.x) / ml, (d2.y - d1.y) / ml);
|
||||
push_dim_line(&mut result, d1, d2, ux, uy);
|
||||
}
|
||||
@@ -1125,7 +1204,9 @@ fn explode_dimension(dim: &Dimension, doc: &CadDocument) -> Vec<EntityType> {
|
||||
if !met.dimse2 {
|
||||
result.push(make_seg(&e2a, &e2b, &ext_c));
|
||||
}
|
||||
let ml = ((d2.x - d1.x).powi(2) + (d2.y - d1.y).powi(2)).sqrt().max(1e-12);
|
||||
let ml = ((d2.x - d1.x).powi(2) + (d2.y - d1.y).powi(2))
|
||||
.sqrt()
|
||||
.max(1e-12);
|
||||
let (ux, uy) = ((d2.x - d1.x) / ml, (d2.y - d1.y) / ml);
|
||||
push_dim_line(&mut result, d1, d2, ux, uy);
|
||||
}
|
||||
@@ -1148,7 +1229,11 @@ fn explode_dimension(dim: &Dimension, doc: &CadDocument) -> Vec<EntityType> {
|
||||
let anchor = dim_text_anchor(base, center, point);
|
||||
let ld = norm2(anchor.x - point.x, anchor.y - point.y, 1.0, 0.0);
|
||||
let leader = if d.leader_length.abs() > 1e-9 {
|
||||
v3(point.x + ld.0 * d.leader_length, point.y + ld.1 * d.leader_length, point.z)
|
||||
v3(
|
||||
point.x + ld.0 * d.leader_length,
|
||||
point.y + ld.1 * d.leader_length,
|
||||
point.z,
|
||||
)
|
||||
} else {
|
||||
anchor
|
||||
};
|
||||
@@ -1168,16 +1253,8 @@ fn explode_dimension(dim: &Dimension, doc: &CadDocument) -> Vec<EntityType> {
|
||||
let (ux, uy) = ((edge.x - far.x) / len, (edge.y - far.y) / len);
|
||||
let ticks = met.dimtsz > 1e-9;
|
||||
let extension = if ticks { met.dimdle } else { 0.0 };
|
||||
let edge_outer = v3(
|
||||
edge.x + ux * extension,
|
||||
edge.y + uy * extension,
|
||||
edge.z,
|
||||
);
|
||||
let far_outer = v3(
|
||||
far.x - ux * extension,
|
||||
far.y - uy * extension,
|
||||
far.z,
|
||||
);
|
||||
let edge_outer = v3(edge.x + ux * extension, edge.y + uy * extension, edge.z);
|
||||
let far_outer = v3(far.x - ux * extension, far.y - uy * extension, far.z);
|
||||
if !met.dimsd1 {
|
||||
result.push(make_seg(&edge_outer, ¢er, &dim_c));
|
||||
}
|
||||
@@ -1215,13 +1292,12 @@ fn explode_dimension(dim: &Dimension, doc: &CadDocument) -> Vec<EntityType> {
|
||||
+ (first.y - second.y).powi(2)
|
||||
+ (first.z - second.z).powi(2)
|
||||
};
|
||||
let (leader_tip, suppressed, fallback) = if distance_squared(anchor, edge)
|
||||
<= distance_squared(anchor, far)
|
||||
{
|
||||
(edge, met.dimsd1, (ux, uy))
|
||||
} else {
|
||||
(far, met.dimsd2, (-ux, -uy))
|
||||
};
|
||||
let (leader_tip, suppressed, fallback) =
|
||||
if distance_squared(anchor, edge) <= distance_squared(anchor, far) {
|
||||
(edge, met.dimsd1, (ux, uy))
|
||||
} else {
|
||||
(far, met.dimsd2, (-ux, -uy))
|
||||
};
|
||||
if !suppressed && d.leader_length.abs() > 1e-9 {
|
||||
let ld = norm2(
|
||||
anchor.x - leader_tip.x,
|
||||
@@ -1320,8 +1396,7 @@ fn explode_dimension(dim: &Dimension, doc: &CadDocument) -> Vec<EntityType> {
|
||||
}
|
||||
}
|
||||
|
||||
let symbol_points =
|
||||
crate::entities::dimension::baked_arc_length_symbol_points(dim, doc, 1.0);
|
||||
let symbol_points = crate::entities::dimension::baked_arc_length_symbol_points(dim, doc, 1.0);
|
||||
if symbol_points.len() > 1 {
|
||||
let text_c = dim_common(&base.common, met.dimclrt, -2);
|
||||
for pair in symbol_points.windows(2) {
|
||||
@@ -1378,8 +1453,7 @@ fn sync_dimension_base_points_and_collect_pending(doc: &mut CadDocument) -> Vec<
|
||||
Dimension::Angular2Ln(_) => None,
|
||||
};
|
||||
let base = dimension.base();
|
||||
let needs_sync =
|
||||
definition_point.filter(|point| *point != base.definition_point);
|
||||
let needs_sync = definition_point.filter(|point| *point != base.definition_point);
|
||||
let block_missing = base.block_name.trim().is_empty()
|
||||
|| !existing_blocks.contains(&base.block_name.to_ascii_lowercase());
|
||||
Some((base.common.handle, needs_sync, block_missing))
|
||||
@@ -1670,7 +1744,10 @@ mod tests {
|
||||
// block_name cleared → the dimension is pending again.
|
||||
match doc.get_entity(handle) {
|
||||
Some(EntityType::Dimension(d)) => {
|
||||
assert!(d.base().block_name.trim().is_empty(), "block_name must be cleared");
|
||||
assert!(
|
||||
d.base().block_name.trim().is_empty(),
|
||||
"block_name must be cleared"
|
||||
);
|
||||
}
|
||||
_ => panic!("dimension missing"),
|
||||
}
|
||||
@@ -1693,7 +1770,10 @@ mod tests {
|
||||
Some(EntityType::Dimension(d)) => d.base().block_name.clone(),
|
||||
_ => panic!("dimension missing"),
|
||||
};
|
||||
assert!(!rebaked.trim().is_empty(), "re-bake must assign a new block");
|
||||
assert!(
|
||||
!rebaked.trim().is_empty(),
|
||||
"re-bake must assign a new block"
|
||||
);
|
||||
}
|
||||
|
||||
// Collect the line segments baked into the dimension's `*D` block.
|
||||
@@ -1761,7 +1841,10 @@ mod tests {
|
||||
.entities()
|
||||
.filter(|e| matches!(e, EntityType::Solid(s) if s.common.owner_handle == rec.handle))
|
||||
.count();
|
||||
assert_eq!(solids, 2, "expected 2 filled (SOLID) arrowheads, got {solids}");
|
||||
assert_eq!(
|
||||
solids, 2,
|
||||
"expected 2 filled (SOLID) arrowheads, got {solids}"
|
||||
);
|
||||
}
|
||||
|
||||
/// The line segments EXPLODE turns the dimension into.
|
||||
@@ -1842,7 +1925,10 @@ mod tests {
|
||||
.entities()
|
||||
.filter(|e| matches!(e, EntityType::Line(l) if l.common.owner_handle == rec.handle))
|
||||
.count();
|
||||
assert!(lines > 5, "angular bake must include arc chords, got {lines} lines");
|
||||
assert!(
|
||||
lines > 5,
|
||||
"angular bake must include arc chords, got {lines} lines"
|
||||
);
|
||||
}
|
||||
|
||||
// Diameter endpoints stay equidistant from the circle center.
|
||||
@@ -1868,12 +1954,9 @@ mod tests {
|
||||
let connects = |expected: Vector3| {
|
||||
segments.iter().any(|(a, b)| {
|
||||
let near = |p: &Vector3, q: &Vector3| {
|
||||
(p.x - q.x).abs() < 1e-6
|
||||
&& (p.y - q.y).abs() < 1e-6
|
||||
&& (p.z - q.z).abs() < 1e-6
|
||||
(p.x - q.x).abs() < 1e-6 && (p.y - q.y).abs() < 1e-6 && (p.z - q.z).abs() < 1e-6
|
||||
};
|
||||
(near(a, &expected) && near(b, ¢er))
|
||||
|| (near(b, &expected) && near(a, ¢er))
|
||||
(near(a, &expected) && near(b, ¢er)) || (near(b, &expected) && near(a, ¢er))
|
||||
})
|
||||
};
|
||||
assert!(connects(edge), "near diameter half missing");
|
||||
@@ -1986,22 +2069,16 @@ mod tests {
|
||||
doc.add_entity(EntityType::Dimension(Dimension::Linear(d)))
|
||||
.unwrap();
|
||||
|
||||
let path = std::env::temp_dir().join(format!(
|
||||
"ocs_dim_rt_{}.{ext}",
|
||||
std::process::id()
|
||||
));
|
||||
crate::io::save_as_version(&doc, &path, codec::DxfVersion::AC1032)
|
||||
.expect("save");
|
||||
let path =
|
||||
std::env::temp_dir().join(format!("ocs_dim_rt_{}.{ext}", std::process::id()));
|
||||
crate::io::save_as_version(&doc, &path, codec::DxfVersion::AC1032).expect("save");
|
||||
let loaded = crate::io::load_file(&path).expect("load");
|
||||
let _ = std::fs::remove_file(&path);
|
||||
|
||||
let mut seen = std::collections::HashSet::new();
|
||||
for e in loaded.entities() {
|
||||
if !seen.insert(e.common().handle) {
|
||||
failures.push(format!(
|
||||
"{ext}: duplicate handle {:?}",
|
||||
e.common().handle
|
||||
));
|
||||
failures.push(format!("{ext}: duplicate handle {:?}", e.common().handle));
|
||||
}
|
||||
}
|
||||
let dims: Vec<_> = loaded
|
||||
@@ -2041,6 +2118,10 @@ mod tests {
|
||||
}
|
||||
}
|
||||
}
|
||||
assert!(failures.is_empty(), "round-trip failures:\n{}", failures.join("\n"));
|
||||
assert!(
|
||||
failures.is_empty(),
|
||||
"round-trip failures:\n{}",
|
||||
failures.join("\n")
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user