forked from 1b-agent/opencadstudio-upstream
Show stored spline tangent values
This commit is contained in:
1 parent
14b98231f5
commit
45c9cfd2ab
1 file changed
+6
-59
+6
-59
@@ -532,51 +532,6 @@ fn convert_to_fit_method(spline: &mut Spline) -> bool {
|
||||
uses_fit_method(spline)
|
||||
}
|
||||
|
||||
fn tangent_is_set(tangent: &acadrust::types::Vector3) -> bool {
|
||||
tangent.x * tangent.x + tangent.y * tangent.y + tangent.z * tangent.z > 1e-18
|
||||
}
|
||||
|
||||
/// Stored or kernel-derived fit-curve end tangents.
|
||||
fn effective_fit_tangents(
|
||||
spline: &Spline,
|
||||
) -> (acadrust::types::Vector3, acadrust::types::Vector3) {
|
||||
let begin_set = tangent_is_set(&spline.begin_tangent);
|
||||
let end_set = tangent_is_set(&spline.end_tangent);
|
||||
if begin_set && end_set {
|
||||
return (spline.begin_tangent, spline.end_tangent);
|
||||
}
|
||||
|
||||
let derived = crate::entities::curve::spline_curve(spline).and_then(|planar| {
|
||||
let KernelCurve::Nurbs(curve) = &planar.curve else {
|
||||
return None;
|
||||
};
|
||||
let (start, end) = curve.domain();
|
||||
Some((
|
||||
planar.plane.vector_at(curve.derivative_at_knot(start)),
|
||||
planar.plane.vector_at(curve.derivative_at_knot(end)),
|
||||
))
|
||||
});
|
||||
|
||||
let Some((derived_begin, derived_end)) = derived else {
|
||||
return (spline.begin_tangent, spline.end_tangent);
|
||||
};
|
||||
let vector = |value: [f64; 3]| {
|
||||
acadrust::types::Vector3::new(value[0], value[1], value[2])
|
||||
};
|
||||
(
|
||||
if begin_set {
|
||||
spline.begin_tangent
|
||||
} else {
|
||||
vector(derived_begin)
|
||||
},
|
||||
if end_set {
|
||||
spline.end_tangent
|
||||
} else {
|
||||
vector(derived_end)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
fn grips(spline: &Spline) -> Vec<GripDef> {
|
||||
let fit_method = uses_fit_method(spline);
|
||||
let derived_control = control_vertices(spline);
|
||||
@@ -627,7 +582,6 @@ fn properties(spline: &Spline) -> Vec<PropSection> {
|
||||
_ => "Custom",
|
||||
};
|
||||
let current = crate::scene::view::dispatch::prop_current_vertex();
|
||||
let (effective_begin_tangent, effective_end_tangent) = effective_fit_tangents(spline);
|
||||
let mut data_points = if show_fit {
|
||||
let count = spline.fit_points.len();
|
||||
let index = current.min(count.saturating_sub(1));
|
||||
@@ -760,32 +714,32 @@ fn properties(spline: &Spline) -> Vec<PropSection> {
|
||||
edit_scalar(
|
||||
t!("Start tangent vector X").as_ref(),
|
||||
"start_tan_x",
|
||||
effective_begin_tangent.x,
|
||||
spline.begin_tangent.x,
|
||||
),
|
||||
edit_scalar(
|
||||
t!("Start tangent vector Y").as_ref(),
|
||||
"start_tan_y",
|
||||
effective_begin_tangent.y,
|
||||
spline.begin_tangent.y,
|
||||
),
|
||||
edit_scalar(
|
||||
t!("Start tangent vector Z").as_ref(),
|
||||
"start_tan_z",
|
||||
effective_begin_tangent.z,
|
||||
spline.begin_tangent.z,
|
||||
),
|
||||
edit_scalar(
|
||||
t!("End tangent vector X").as_ref(),
|
||||
"end_tan_x",
|
||||
effective_end_tangent.x,
|
||||
spline.end_tangent.x,
|
||||
),
|
||||
edit_scalar(
|
||||
t!("End tangent vector Y").as_ref(),
|
||||
"end_tan_y",
|
||||
effective_end_tangent.y,
|
||||
spline.end_tangent.y,
|
||||
),
|
||||
edit_scalar(
|
||||
t!("End tangent vector Z").as_ref(),
|
||||
"end_tan_z",
|
||||
effective_end_tangent.z,
|
||||
spline.end_tangent.z,
|
||||
),
|
||||
]);
|
||||
}
|
||||
@@ -864,7 +818,6 @@ fn apply_geom_prop(spline: &mut Spline, field: &str, value: &str) {
|
||||
{
|
||||
return;
|
||||
}
|
||||
let (effective_begin_tangent, effective_end_tangent) = effective_fit_tangents(spline);
|
||||
let Some(v) = parse_f64(value) else { return };
|
||||
let control_index = crate::scene::view::dispatch::prop_current_vertex()
|
||||
.min(spline.control_points.len().saturating_sub(1));
|
||||
@@ -919,9 +872,6 @@ fn apply_geom_prop(spline: &mut Spline, field: &str, value: &str) {
|
||||
}
|
||||
}
|
||||
"start_tan_x" | "start_tan_y" | "start_tan_z" => {
|
||||
if !tangent_is_set(&spline.begin_tangent) {
|
||||
spline.begin_tangent = effective_begin_tangent;
|
||||
}
|
||||
match field {
|
||||
"start_tan_x" => spline.begin_tangent.x = v,
|
||||
"start_tan_y" => spline.begin_tangent.y = v,
|
||||
@@ -930,9 +880,6 @@ fn apply_geom_prop(spline: &mut Spline, field: &str, value: &str) {
|
||||
}
|
||||
}
|
||||
"end_tan_x" | "end_tan_y" | "end_tan_z" => {
|
||||
if !tangent_is_set(&spline.end_tangent) {
|
||||
spline.end_tangent = effective_end_tangent;
|
||||
}
|
||||
match field {
|
||||
"end_tan_x" => spline.end_tangent.x = v,
|
||||
"end_tan_y" => spline.end_tangent.y = v,
|
||||
|
||||
Reference in new issue
Block a user