From 9dc4e08f7766ad515f60349bb50ae3ae6d65fb04 Mon Sep 17 00:00:00 2001 From: ramox81 <184937705+ramox81@users.noreply.github.com> Date: Mon, 24 Aug 2026 14:10:14 +0300 Subject: [PATCH] Align dimension property editability --- src/app/properties.rs | 21 +-------- src/entities/common.rs | 27 ++++++++++++ src/entities/dim_override.rs | 30 +++++++------ src/entities/dimension.rs | 82 +++++++++++++++++++++++++----------- 4 files changed, 105 insertions(+), 55 deletions(-) diff --git a/src/app/properties.rs b/src/app/properties.rs index 7b5e481c0..15672cd1c 100644 --- a/src/app/properties.rs +++ b/src/app/properties.rs @@ -2409,18 +2409,7 @@ fn set_row_value( /// The lineweight dropdown options (named defaults + the standard millimetre /// steps), matching the labels `dim_lineweight_label` produces. pub(crate) fn lineweight_options() -> Vec { - let mut v = vec![ - "ByLayer".to_string(), - "ByBlock".to_string(), - "Default".to_string(), - ]; - for lw in [ - 0, 5, 9, 13, 15, 18, 20, 25, 30, 35, 40, 50, 53, 60, 70, 80, 90, 100, 106, 120, 140, 158, - 200, 211, - ] { - v.push(format!("{:.2} mm", lw as f64 / 100.0)); - } - v + crate::entities::common::lineweight_options() } /// Inverse of `dim_lineweight_label`: a lineweight label → DIMLWD enum value. @@ -2546,13 +2535,7 @@ fn leader_arrow_label( /// DIMLWD lineweight enum → label. fn dim_lineweight_label(dimlwd: i16) -> String { - match dimlwd { - -1 => "ByLayer".to_string(), - -2 => "ByBlock".to_string(), - -3 => "Default".to_string(), - v if v >= 0 => format!("{:.2} mm", v as f64 / 100.0), - _ => "Default".to_string(), - } + crate::entities::common::lineweight_label(dimlwd) } /// Human-readable INSUNITS name (DXF group 70 unit codes). diff --git a/src/entities/common.rs b/src/entities/common.rs index f8417b75f..cf6bda3c2 100644 --- a/src/entities/common.rs +++ b/src/entities/common.rs @@ -573,6 +573,33 @@ pub fn edit_scalar_prop(label: &str, field: &'static str, value: f64) -> Propert } } +/// Standard lineweight choices shared by entity-specific Properties rows. +pub fn lineweight_options() -> Vec { + let mut options = vec![ + "ByLayer".to_string(), + "ByBlock".to_string(), + "Default".to_string(), + ]; + for value in [ + 0, 5, 9, 13, 15, 18, 20, 25, 30, 35, 40, 50, 53, 60, 70, 80, 90, 100, 106, 120, + 140, 158, 200, 211, + ] { + options.push(format!("{:.2} mm", value as f64 / 100.0)); + } + options +} + +/// DIMLWD/DIMLWE lineweight value displayed by a Properties dropdown. +pub fn lineweight_label(value: i16) -> String { + match value { + -1 => "ByLayer".to_string(), + -2 => "ByBlock".to_string(), + -3 => "Default".to_string(), + value if value >= 0 => format!("{:.2} mm", value as f64 / 100.0), + _ => "Default".to_string(), + } +} + pub fn ro_prop(label: &str, field: &'static str, value: impl Into) -> Property { Property { label: label.into(), diff --git a/src/entities/dim_override.rs b/src/entities/dim_override.rs index 688430736..f7bca09ad 100644 --- a/src/entities/dim_override.rs +++ b/src/entities/dim_override.rs @@ -331,28 +331,34 @@ pub fn set_property( ) -> bool { let trimmed = value.trim(); let handle_field = match field { - "dim_arrowhead_1" => Some((DIMBLK1, true)), - "dim_arrowhead_2" => Some((DIMBLK2, true)), - "dim_linetype" => Some((DIMLTYPE, false)), - "dim_ext_linetype_1" => Some((DIMLTEX1, false)), - "dim_ext_linetype_2" => Some((DIMLTEX2, false)), + "dim_arrowhead_1" => Some(DIMBLK1), + "dim_arrowhead_2" => Some(DIMBLK2), + "dim_linetype" => Some(DIMLTYPE), + "dim_ext_linetype_1" => Some(DIMLTEX1), + "dim_ext_linetype_2" => Some(DIMLTEX2), + "dim_text_style" => Some(DIMTXSTY), _ => None, }; - if let Some((code, block)) = handle_field { - let resolved = if block { - (trimmed != "Closed filled") + if let Some(code) = handle_field { + let resolved = match field { + "dim_arrowhead_1" | "dim_arrowhead_2" => (trimmed != "Closed filled") .then(|| { doc.block_records .iter() .find(|record| record.name == trimmed) .map(|record| record.handle) }) - .flatten() - } else { - doc.line_types + .flatten(), + "dim_text_style" => doc + .text_styles + .iter() + .find(|style| style.name == trimmed) + .map(|style| style.handle), + _ => doc + .line_types .iter() .find(|line_type| line_type.name == trimmed) - .map(|line_type| line_type.handle) + .map(|line_type| line_type.handle), }; set(doc, handle, code, resolved.map(XDataValue::Handle)); return true; diff --git a/src/entities/dimension.rs b/src/entities/dimension.rs index 2b1708e62..d5e9c4d1b 100644 --- a/src/entities/dimension.rs +++ b/src/entities/dimension.rs @@ -8,7 +8,8 @@ use glam::{DVec3, Vec3}; use crate::command::EntityTransform; use crate::entities::common::{ - center_grip, edit_angle_prop as edit_angle, edit_prop as edit, parse_f64, ro_prop as ro, square_grip, + center_grip, edit_angle_prop as edit_angle, edit_prop as edit, lineweight_label, + lineweight_options, parse_f64, ro_prop as ro, square_grip, }; use crate::entities::traits::{Grippable, PropertyEditable, Transformable}; use crate::scene::model::object::{GripApply, GripDef, PropSection}; @@ -1461,39 +1462,22 @@ pub fn style_sections( PropSection { title: t!("Lines & Arrows").into_owned(), props: vec![ - ro(t!("Arrow size").as_ref(), "dim_arrow_size", f(s.dimasz)), ro( - t!("Arrowhead 1").as_ref(), + t!("Arrow 1").as_ref(), "dim_arrowhead_1", block_name(document, s.dimblk1, &s.dimblk1_name), ), ro( - t!("Arrowhead 2").as_ref(), + t!("Arrow 2").as_ref(), "dim_arrowhead_2", block_name(document, s.dimblk2, &s.dimblk2_name), ), - ro( - t!("Dimension linetype").as_ref(), - "dim_linetype", - linetype_name(document, s.dimltex_handle), - ), - ro( - t!("Extension linetype 1").as_ref(), - "dim_ext_linetype_1", - linetype_name(document, s.dimltex1_handle), - ), - ro( - t!("Extension linetype 2").as_ref(), - "dim_ext_linetype_2", - linetype_name(document, s.dimltex2_handle), - ), - ro(t!("Dim line color").as_ref(), "dim_line_color", s.dimclrd.to_string()), + ro(t!("Arrow size").as_ref(), "dim_arrow_size", f(s.dimasz)), ro( t!("Dim line lineweight").as_ref(), "dim_line_lineweight", s.dimlwd.to_string(), ), - ro(t!("Ext line color").as_ref(), "dim_ext_line_color", s.dimclre.to_string()), ro( t!("Ext line lineweight").as_ref(), "dim_ext_line_lineweight", @@ -1501,17 +1485,34 @@ pub fn style_sections( ), ro(t!("Dim line 1").as_ref(), "dim_line_1", onoff(!s.dimsd1)), ro(t!("Dim line 2").as_ref(), "dim_line_2", onoff(!s.dimsd2)), + ro(t!("Dim line color").as_ref(), "dim_line_color", s.dimclrd.to_string()), + ro( + t!("Dim line linetype").as_ref(), + "dim_linetype", + linetype_name(document, s.dimltex_handle), + ), + ro(t!("Dim line ext").as_ref(), "dim_line_ext", f(s.dimdle)), + ro( + t!("Ext line 1 linetype").as_ref(), + "dim_ext_linetype_1", + linetype_name(document, s.dimltex1_handle), + ), + ro( + t!("Ext line 2 linetype").as_ref(), + "dim_ext_linetype_2", + linetype_name(document, s.dimltex2_handle), + ), ro(t!("Ext line 1").as_ref(), "dim_ext_line_1", onoff(!s.dimse1)), ro(t!("Ext line 2").as_ref(), "dim_ext_line_2", onoff(!s.dimse2)), - ro(t!("Dim line ext").as_ref(), "dim_line_ext", f(s.dimdle)), - ro(t!("Ext line ext").as_ref(), "dim_ext_line_ext", f(s.dimexe)), - ro(t!("Ext line offset").as_ref(), "dim_ext_line_offset", f(s.dimexo)), ro(t!("Ext line fixed").as_ref(), "dim_ext_line_fixed", yn(s.dimfxlon)), ro( t!("Ext line fixed length").as_ref(), "dim_ext_line_fixed_length", f(s.dimfxl), ), + ro(t!("Ext line color").as_ref(), "dim_ext_line_color", s.dimclre.to_string()), + ro(t!("Ext line ext").as_ref(), "dim_ext_line_ext", f(s.dimexe)), + ro(t!("Ext line offset").as_ref(), "dim_ext_line_offset", f(s.dimexo)), ], }, PropSection { @@ -1726,6 +1727,17 @@ pub fn style_sections( }, &["Bottom", "Middle", "Top"], ), + "dim_line_lineweight" | "dim_ext_line_lineweight" => { + let inherited = if property.field == "dim_line_lineweight" { + s.dimlwd + } else { + s.dimlwe + }; + crate::scene::model::object::PropValue::Choice { + selected: lineweight_label(number.unwrap_or(inherited)), + options: lineweight_options(), + } + } _ => crate::scene::model::object::PropValue::EditText(value), }; } @@ -1785,6 +1797,12 @@ pub fn style_sections( .map(|line_type| line_type.name.clone()) .filter(|name| !name.is_empty()) .collect(); + let text_style_options: Vec = document + .text_styles + .iter() + .map(|style| style.name.clone()) + .filter(|name| !name.is_empty()) + .collect(); for property in sections .iter_mut() .flat_map(|section| section.props.iter_mut()) @@ -1822,6 +1840,22 @@ pub fn style_sections( selected: current, options: linetype_options.clone(), }; + } else if property.field == "dim_text_style" { + if let Some(handle) = crate::entities::dim_override::handle( + data, + crate::entities::dim_override::DIMTXSTY, + ) { + current = document + .text_styles + .iter() + .find(|style| style.handle == handle) + .map(|style| style.name.clone()) + .unwrap_or(current); + } + property.value = crate::scene::model::object::PropValue::Choice { + selected: current, + options: text_style_options.clone(), + }; } } sections