forked from 1b-agent/opencadstudio-upstream
Add dynamic input for grip-based geometry editing (#1138)
This commit is contained in:
1 parent
5ffbf598a9
commit
d47e3234d8
9 files changed
+378
-39
No files matched your search
+20
-1
@@ -365,13 +365,32 @@ impl crate::entities::traits::Grippable for Arc {
|
||||
point: glam::DVec3,
|
||||
) -> Option<f64> {
|
||||
use crate::scene::model::object::GripMenuAction as A;
|
||||
if !matches!(action, A::Lengthen) || self.radius <= 1.0e-9 {
|
||||
if self.radius <= 1.0e-9 {
|
||||
return None;
|
||||
}
|
||||
let (x, y, _) = crate::scene::view::transform::wcs_point_to_ocs(
|
||||
(point.x, point.y, point.z),
|
||||
(self.normal.x, self.normal.y, self.normal.z),
|
||||
);
|
||||
if matches!(action, A::Radius) && grip_id == 3 {
|
||||
let radius = ((x - self.center.x).powi(2) + (y - self.center.y).powi(2)).sqrt();
|
||||
return (radius > 1.0e-9).then_some(radius);
|
||||
}
|
||||
if matches!(action, A::ArcLength) && grip_id == 3 {
|
||||
let sweep = (self.end_angle - self.start_angle).rem_euclid(TAU);
|
||||
let middle_angle = self.start_angle + sweep * 0.5;
|
||||
let middle_x = self.center.x + self.radius * middle_angle.cos();
|
||||
let middle_y = self.center.y + self.radius * middle_angle.sin();
|
||||
let tangent_x = -middle_angle.sin();
|
||||
let tangent_y = middle_angle.cos();
|
||||
let delta = (x - middle_x) * tangent_x + (y - middle_y) * tangent_y;
|
||||
let length = self.radius * sweep + delta;
|
||||
return (length > 1.0e-9 && length < self.radius * TAU - 1.0e-9)
|
||||
.then_some(length);
|
||||
}
|
||||
if !matches!(action, A::Lengthen) {
|
||||
return None;
|
||||
}
|
||||
let cursor_angle = (y - self.center.y).atan2(x - self.center.x);
|
||||
let current_sweep = (self.end_angle - self.start_angle).rem_euclid(TAU);
|
||||
let desired_sweep = match grip_id {
|
||||
|
||||
Reference in new issue
Block a user