forked from 1b-agent/opencadstudio-upstream
Keep the transformed length when an axis-constrained entity re-aligns
The temporary end-point pin of a transformed Horizontal/Vertical entity is paired with the length the transform left it, so a scaled vertical line stays scaled while a rotated one stays vertical at its rotated length. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
5ac6dc279b
commit
b45e8bce1f
1 file changed
+33
@@ -2434,6 +2434,39 @@ fn solve_scope(
|
|||||||
})
|
})
|
||||||
.flatten();
|
.flatten();
|
||||||
let pinned = axis_pin.unwrap_or(*reference);
|
let pinned = axis_pin.unwrap_or(*reference);
|
||||||
|
// The re-aligned entity keeps the length the transform gave it (a
|
||||||
|
// scaled vertical line stays scaled), not its pre-edit length.
|
||||||
|
if axis_pin.is_some() {
|
||||||
|
let segment = reference
|
||||||
|
.segment_index()
|
||||||
|
.or_else(|| {
|
||||||
|
constraints.iter().find_map(|c| {
|
||||||
|
c.refs
|
||||||
|
.iter()
|
||||||
|
.find(|r| r.entity == reference.entity)
|
||||||
|
.and_then(|r| r.segment_index())
|
||||||
|
})
|
||||||
|
});
|
||||||
|
let line = resolve_ref(document, &mut sys, &mut cache, *reference).and_then(|geometry| {
|
||||||
|
match (&geometry, segment) {
|
||||||
|
(EntityGeom::Polyline { .. }, Some(index)) => geometry.line_segment(index),
|
||||||
|
(EntityGeom::Line(line) | EntityGeom::Ray(line) | EntityGeom::XLine(line), _) => {
|
||||||
|
Some(*line)
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if let Some(line) = line {
|
||||||
|
let length = {
|
||||||
|
let store = sys.store();
|
||||||
|
let dx = store.get(line.p2.x) - store.get(line.p1.x);
|
||||||
|
let dy = store.get(line.p2.y) - store.get(line.p1.y);
|
||||||
|
(dx * dx + dy * dy).sqrt()
|
||||||
|
};
|
||||||
|
let target = sys.add_param(length, true);
|
||||||
|
sys.add_constraint(Rc::new(P2PDistance::new(line.p1, line.p2, target)));
|
||||||
|
}
|
||||||
|
}
|
||||||
let temporary = ParametricConstraint {
|
let temporary = ParametricConstraint {
|
||||||
id: ConstraintId::MAX,
|
id: ConstraintId::MAX,
|
||||||
kind: ConstraintKind::Fixed,
|
kind: ConstraintKind::Fixed,
|
||||||
|
|||||||
Reference in new issue
Block a user