feat(properties): show Thickness in the General group
Thickness (DXF 39) is a General-group property in the palette, but it is stored per-entity, so it was previously shown (inconsistently) only in the Geometry section of a few entities. Surface it in General for every entity type that carries an extrusion thickness (arc, circle, line, lwpolyline, point, polyface mesh, 2D polyline, shape, 2D solid, text) via entity_thickness / set_entity_thickness, routed through apply_common_prop. Removes the now-duplicate Thickness rows (and dead apply arms) from the arc/circle/shape/solid Geometry sections so it is never shown twice. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
ab0a4f790c
commit
726984e3a5
6 changed files with 64 additions and 17 deletions
|
|
@ -170,7 +170,6 @@ fn properties(arc: &Arc) -> Vec<PropSection> {
|
||||||
edit("Normal X", "normal_x", arc.normal.x),
|
edit("Normal X", "normal_x", arc.normal.x),
|
||||||
edit("Normal Y", "normal_y", arc.normal.y),
|
edit("Normal Y", "normal_y", arc.normal.y),
|
||||||
edit("Normal Z", "normal_z", arc.normal.z),
|
edit("Normal Z", "normal_z", arc.normal.z),
|
||||||
edit("Thickness", "thickness", arc.thickness),
|
|
||||||
],
|
],
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
|
@ -189,7 +188,6 @@ fn apply_geom_prop(arc: &mut Arc, field: &str, value: &str) {
|
||||||
"normal_x" => arc.normal.x = v,
|
"normal_x" => arc.normal.x = v,
|
||||||
"normal_y" => arc.normal.y = v,
|
"normal_y" => arc.normal.y = v,
|
||||||
"normal_z" => arc.normal.z = v,
|
"normal_z" => arc.normal.z = v,
|
||||||
"thickness" => arc.thickness = v,
|
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,6 @@ fn properties(circle: &Circle) -> Vec<PropSection> {
|
||||||
edit("Normal X", "normal_x", circle.normal.x),
|
edit("Normal X", "normal_x", circle.normal.x),
|
||||||
edit("Normal Y", "normal_y", circle.normal.y),
|
edit("Normal Y", "normal_y", circle.normal.y),
|
||||||
edit("Normal Z", "normal_z", circle.normal.z),
|
edit("Normal Z", "normal_z", circle.normal.z),
|
||||||
edit("Thickness", "thickness", circle.thickness),
|
|
||||||
],
|
],
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
|
@ -155,7 +154,6 @@ fn apply_geom_prop(circle: &mut Circle, field: &str, value: &str) {
|
||||||
"normal_x" => circle.normal.x = v,
|
"normal_x" => circle.normal.x = v,
|
||||||
"normal_y" => circle.normal.y = v,
|
"normal_y" => circle.normal.y = v,
|
||||||
"normal_z" => circle.normal.z = v,
|
"normal_z" => circle.normal.z = v,
|
||||||
"thickness" => circle.thickness = v,
|
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -144,7 +144,6 @@ impl PropertyEditable for Shape {
|
||||||
edit("Rotation", "shp_rot", self.rotation.to_degrees()),
|
edit("Rotation", "shp_rot", self.rotation.to_degrees()),
|
||||||
edit("Width Factor", "shp_xs", self.relative_x_scale),
|
edit("Width Factor", "shp_xs", self.relative_x_scale),
|
||||||
edit("Oblique Angle", "shp_ob", self.oblique_angle.to_degrees()),
|
edit("Oblique Angle", "shp_ob", self.oblique_angle.to_degrees()),
|
||||||
edit("Thickness", "shp_th", self.thickness),
|
|
||||||
edit("Normal X", "shp_nx", self.normal.x),
|
edit("Normal X", "shp_nx", self.normal.x),
|
||||||
edit("Normal Y", "shp_ny", self.normal.y),
|
edit("Normal Y", "shp_ny", self.normal.y),
|
||||||
edit("Normal Z", "shp_nz", self.normal.z),
|
edit("Normal Z", "shp_nz", self.normal.z),
|
||||||
|
|
@ -168,7 +167,6 @@ impl PropertyEditable for Shape {
|
||||||
"shp_rot" => self.rotation = v.to_radians(),
|
"shp_rot" => self.rotation = v.to_radians(),
|
||||||
"shp_xs" if v.abs() > 1e-9 => self.relative_x_scale = v,
|
"shp_xs" if v.abs() > 1e-9 => self.relative_x_scale = v,
|
||||||
"shp_ob" => self.oblique_angle = v.to_radians(),
|
"shp_ob" => self.oblique_angle = v.to_radians(),
|
||||||
"shp_th" => self.thickness = v,
|
|
||||||
"shp_nx" => self.normal.x = v,
|
"shp_nx" => self.normal.x = v,
|
||||||
"shp_ny" => self.normal.y = v,
|
"shp_ny" => self.normal.y = v,
|
||||||
"shp_nz" => self.normal.z = v,
|
"shp_nz" => self.normal.z = v,
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,6 @@ impl PropertyEditable for Solid {
|
||||||
edit("Point 4 Y", "sl_p4y", self.fourth_corner.y),
|
edit("Point 4 Y", "sl_p4y", self.fourth_corner.y),
|
||||||
edit("Point 4 Z", "sl_p4z", self.fourth_corner.z),
|
edit("Point 4 Z", "sl_p4z", self.fourth_corner.z),
|
||||||
ro("Elevation", "sl_elev", format!("{:.4}", elevation)),
|
ro("Elevation", "sl_elev", format!("{:.4}", elevation)),
|
||||||
edit("Thickness", "sl_thick", self.thickness),
|
|
||||||
],
|
],
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
|
@ -139,7 +138,6 @@ impl PropertyEditable for Solid {
|
||||||
"sl_p4x" => self.fourth_corner.x = v,
|
"sl_p4x" => self.fourth_corner.x = v,
|
||||||
"sl_p4y" => self.fourth_corner.y = v,
|
"sl_p4y" => self.fourth_corner.y = v,
|
||||||
"sl_p4z" => self.fourth_corner.z = v,
|
"sl_p4z" => self.fourth_corner.z = v,
|
||||||
"sl_thick" => self.thickness = v,
|
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
30
src/scene/cache/properties.rs
vendored
30
src/scene/cache/properties.rs
vendored
|
|
@ -23,7 +23,7 @@ pub fn general_section(entity: &EntityType) -> PropSection {
|
||||||
})
|
})
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
|
|
||||||
PropSection {
|
let mut section = PropSection {
|
||||||
title: "General".into(),
|
title: "General".into(),
|
||||||
props: vec![
|
props: vec![
|
||||||
Property {
|
Property {
|
||||||
|
|
@ -78,16 +78,28 @@ pub fn general_section(entity: &EntityType) -> PropSection {
|
||||||
field: "hyperlink",
|
field: "hyperlink",
|
||||||
value: PropValue::ReadOnly(hyperlink),
|
value: PropValue::ReadOnly(hyperlink),
|
||||||
},
|
},
|
||||||
Property {
|
|
||||||
label: "Invisible".into(),
|
|
||||||
field: "invisible",
|
|
||||||
value: PropValue::BoolToggle {
|
|
||||||
field: "invisible",
|
|
||||||
value: common.invisible,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
// Thickness (DXF 39) is a General-group property, but only the entity
|
||||||
|
// types that carry an extrusion thickness expose it (line, circle, arc,
|
||||||
|
// polyline, text, 2D solid, …). Show it right after Hyperlink for those.
|
||||||
|
if let Some(t) = crate::scene::view::dispatch::entity_thickness(entity) {
|
||||||
|
section
|
||||||
|
.props
|
||||||
|
.push(crate::entities::common::edit_prop("Thickness", "thickness", t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
section.props.push(Property {
|
||||||
|
label: "Invisible".into(),
|
||||||
|
field: "invisible",
|
||||||
|
value: PropValue::BoolToggle {
|
||||||
|
field: "invisible",
|
||||||
|
value: common.invisible,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
section
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The "3D Visualization" group (Material + Shadow display), common to every
|
/// The "3D Visualization" group (Material + Shadow display), common to every
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,49 @@ pub fn apply_common_prop(entity: &mut EntityType, field: &str, value: &str) {
|
||||||
.set_transparency(Transparency::new(alpha));
|
.set_transparency(Transparency::new(alpha));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
"thickness" => {
|
||||||
|
if let Ok(v) = value.trim().parse::<f64>() {
|
||||||
|
set_entity_thickness(entity, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The extrusion thickness (DXF 39) of the entities that carry one, or `None`
|
||||||
|
/// for entity types that have none. Thickness is a per-entity field but is
|
||||||
|
/// surfaced in the General group (as in a standard properties palette), so
|
||||||
|
/// this bridges the two.
|
||||||
|
pub fn entity_thickness(entity: &EntityType) -> Option<f64> {
|
||||||
|
Some(match entity {
|
||||||
|
EntityType::Arc(e) => e.thickness,
|
||||||
|
EntityType::Circle(e) => e.thickness,
|
||||||
|
EntityType::Line(e) => e.thickness,
|
||||||
|
EntityType::LwPolyline(e) => e.thickness,
|
||||||
|
EntityType::Point(e) => e.thickness,
|
||||||
|
EntityType::PolyfaceMesh(e) => e.thickness,
|
||||||
|
EntityType::Polyline2D(e) => e.thickness,
|
||||||
|
EntityType::Shape(e) => e.thickness,
|
||||||
|
EntityType::Solid(e) => e.thickness,
|
||||||
|
EntityType::Text(e) => e.thickness,
|
||||||
|
_ => return None,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set the extrusion thickness on the entity types that carry one; no-op for
|
||||||
|
/// the rest.
|
||||||
|
pub fn set_entity_thickness(entity: &mut EntityType, v: f64) {
|
||||||
|
match entity {
|
||||||
|
EntityType::Arc(e) => e.thickness = v,
|
||||||
|
EntityType::Circle(e) => e.thickness = v,
|
||||||
|
EntityType::Line(e) => e.thickness = v,
|
||||||
|
EntityType::LwPolyline(e) => e.thickness = v,
|
||||||
|
EntityType::Point(e) => e.thickness = v,
|
||||||
|
EntityType::PolyfaceMesh(e) => e.thickness = v,
|
||||||
|
EntityType::Polyline2D(e) => e.thickness = v,
|
||||||
|
EntityType::Shape(e) => e.thickness = v,
|
||||||
|
EntityType::Solid(e) => e.thickness = v,
|
||||||
|
EntityType::Text(e) => e.thickness = v,
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue