forked from 1b-agent/opencadstudio-upstream
Dimensional constraints: dynamic dimension persistence, lock mark, display variables, DIMCONSTRAINT
The dynamic dimension of a dimensional constraint is now linked in the drawing file (AcDbAssocDependency + AcDbAssocDimDependencyBody on the constraint node), reread on load, hidden by DCHIDE/DYNCONSTRAINTDISPLAY and never plotted; it carries a lock mark before its text. New CONSTRAINTNAMEFORMAT and DYNCONSTRAINTDISPLAY variables and the DIMCONSTRAINT option front end. A transformed entity whose own end points a driving dimension measures keeps only the first constraint point, so a scaled line returns to its dimension value. Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
1 parent
72fd3fd35b
commit
971abe64a4
12 files changed
+433
-24
No files matched your search
@@ -6295,6 +6295,45 @@ fn dimension_text_is_outside(dim: &Dimension, style: Option<&DimStyle>) -> bool
|
||||
}
|
||||
}
|
||||
|
||||
/// Where a dynamic dimension's lock mark sits: just before the text on its
|
||||
/// baseline, with the direction that points away from the text.
|
||||
pub(crate) fn dynamic_dimension_lock_anchor(
|
||||
document: &CadDocument,
|
||||
dim: &Dimension,
|
||||
anno_scale: f64,
|
||||
) -> Option<(Vector3, Vector3)> {
|
||||
let style_name = &dim.base().style_name;
|
||||
let source_style = document.dim_styles.iter().find(|s| {
|
||||
s.name.eq_ignore_ascii_case(style_name)
|
||||
|| (style_name.trim().is_empty() && s.name.eq_ignore_ascii_case("Standard"))
|
||||
});
|
||||
let effective_style = source_style.map(|style| resolved_dimension_style(style, dim, document));
|
||||
let style = effective_style.as_ref();
|
||||
let dim_scale = style
|
||||
.map(|s| if s.dimscale > 1e-6 { s.dimscale } else { anno_scale })
|
||||
.unwrap_or(1.0);
|
||||
let text_height = style.map(|s| s.dimtxt * dim_scale).unwrap_or(2.5);
|
||||
let value = dimension_text_value(dim, style)?;
|
||||
let stack_scale = style.map(dimtfac_or_one).unwrap_or(1.0);
|
||||
let half_width = text_cells(&value, stack_scale) * text_height * CELL_WIDTH * 0.5;
|
||||
let pos = dimension_text_pos_f64(dim, style, text_height, dim_scale);
|
||||
let rot = if dim.base().text_rotation.abs() > 1e-9 {
|
||||
dim.base().text_rotation
|
||||
} else {
|
||||
dimension_text_natural_rotation(dim)
|
||||
};
|
||||
let (sr, cr) = rot.sin_cos();
|
||||
let outward = Vector3::new(-cr, -sr, 0.0);
|
||||
Some((
|
||||
Vector3::new(
|
||||
pos.x + outward.x * half_width,
|
||||
pos.y + outward.y * half_width,
|
||||
pos.z,
|
||||
),
|
||||
outward,
|
||||
))
|
||||
}
|
||||
|
||||
fn dimension_text_natural_rotation(dim: &Dimension) -> f64 {
|
||||
let angle = match dim {
|
||||
Dimension::Linear(d) => d.rotation,
|
||||
|
||||
Reference in new issue
Block a user