Thanks @erkexzcx.
This commit is contained in:
1 parent
daf618c344
commit
a422fb1a4b
10 files changed
+120
-14
No files matched your search
@@ -42,6 +42,14 @@ pub enum PlaneRef {
|
||||
Origin { name: String },
|
||||
/// An explicit plane (e.g. picked from a planar face).
|
||||
Custom { plane: Plane },
|
||||
/// An explicit plane whose origin is given as length expressions
|
||||
/// (`{origin: ["half", 0, 0], normal: [1, 0, 0]}`), so it follows parameter changes.
|
||||
Placed {
|
||||
#[serde(with = "point_expr")]
|
||||
origin: PointExpr,
|
||||
x_dir: Vec3,
|
||||
y_dir: Vec3,
|
||||
},
|
||||
/// Another plane offset along its normal by an expression.
|
||||
Offset { base: Box<PlaneRef>, distance: String },
|
||||
/// Another plane rotated about a line (in world coordinates) by an angle expression.
|
||||
@@ -2938,6 +2946,15 @@ impl Document {
|
||||
PlaneRef::Custom { plane } | PlaneRef::Face { plane, .. } => {
|
||||
Plane::new(plane.origin, plane.x, plane.y).ok_or_else(|| DocError::Invalid("degenerate plane".into()))
|
||||
}
|
||||
PlaneRef::Placed { origin, x_dir, y_dir } => {
|
||||
let [x, y, z] = origin;
|
||||
let o =
|
||||
Vec3::new(Self::eval_in(vals, x, Kind::Length)?, Self::eval_in(vals, y, Kind::Length)?, Self::eval_in(vals, z, Kind::Length)?);
|
||||
if ![o.x, o.y, o.z].iter().all(|c| c.is_finite() && c.abs() < 1e9) {
|
||||
return Err(DocError::Invalid("the plane's origin is out of range".into()));
|
||||
}
|
||||
Plane::new(o, *x_dir, *y_dir).ok_or_else(|| DocError::Invalid("degenerate plane".into()))
|
||||
}
|
||||
PlaneRef::Offset { base, distance } => {
|
||||
let b = self.resolve_plane_in(vals, base, depth + 1, st)?;
|
||||
Ok(b.offset(Self::eval_in(vals, distance, Kind::Length)?))
|
||||
|
||||
Reference in new issue
Block a user