feat: a sketch text's height, place and angle can be expressions (#1453)
A sketch text's height, place (x and y) and angle can each be an expression over the design's parameters, and the text follows parameter changes, undo and reopening. Closes #1362. Co-authored-by: NOWN-DEV <NOWN-DEV@users.noreply.github.com>
This commit is contained in:
1 parent
e20cf1858a
commit
b6806b16cf
23 files changed
+751
-70
No files matched your search
@@ -2792,6 +2792,7 @@ impl Document {
|
||||
}
|
||||
if let FeatureKind::Sketch { sketch, .. } = &f.kind {
|
||||
used.extend(sketch.constraints.iter().filter_map(|c| c.param.clone()));
|
||||
used.extend(sketch.text_exprs().into_iter().flat_map(|(_, e)| expr::references(e)));
|
||||
}
|
||||
}
|
||||
for p in &self.params {
|
||||
@@ -2990,6 +2991,39 @@ impl Document {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Give the texts of a sketch the numbers their expressions come to (in place): a text's
|
||||
/// height, place and angle that were typed as expressions. A text's outlines are rebuilt from
|
||||
/// its numbers when the sketch's links are refreshed, so this comes before that. A number
|
||||
/// typed as a number is left as it is.
|
||||
pub fn apply_text_values(&self, vals: &std::collections::BTreeMap<String, expr::Value>, sk: &mut Sketch) -> Result<()> {
|
||||
use crate::eval::val;
|
||||
for link in &mut sk.links {
|
||||
let solidcraft_sketch::LinkSource::Text { at, height, angle, exprs, .. } = &mut link.source else { continue };
|
||||
let number = |e: &Option<String>, kind: Kind, what: &str| -> Result<Option<f64>> {
|
||||
match e {
|
||||
None => Ok(None),
|
||||
Some(e) => val(vals, e, kind).map(Some).map_err(|error| DocError::Expr(format!("{what}: {error}"))),
|
||||
}
|
||||
};
|
||||
if let Some(v) = number(&exprs.x, Kind::Length, "text X")? {
|
||||
at.x = v;
|
||||
}
|
||||
if let Some(v) = number(&exprs.y, Kind::Length, "text Y")? {
|
||||
at.y = v;
|
||||
}
|
||||
if let Some(v) = number(&exprs.height, Kind::Length, "text height")? {
|
||||
*height = v;
|
||||
}
|
||||
if let Some(v) = number(&exprs.angle, Kind::Angle, "text angle")? {
|
||||
*angle = v;
|
||||
}
|
||||
if exprs.height.is_some() && !(*height > 1e-6 && *height < 1e5) {
|
||||
return Err(DocError::Invalid("a text's height must be positive".into()));
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Apply parameter values to a sketch's dimensions and solve it. `stored` are the values
|
||||
/// its geometry is solved for (the stored sketch's): what the solve cannot reach in one
|
||||
/// jump it reaches by stepping the changed values from there, and an edit that would turn
|
||||
|
||||
Reference in new issue
Block a user