forked from 1b-agent/opencadstudio-upstream
Resolve fit-only spatial splines before order elevation
This commit is contained in:
1 parent
ed6e962b78
commit
29cd7fa82b
1 file changed
+18
-4
@@ -109,10 +109,24 @@ impl SplineditCommand {
|
|||||||
let current = usize::try_from(source.degree).ok()?;
|
let current = usize::try_from(source.degree).ok()?;
|
||||||
if degree <= current || degree > 25 { return None; }
|
if degree <= current || degree > 25 { return None; }
|
||||||
let weights = if source.weights.is_empty() { vec![1.0; source.control_points.len()] } else { source.weights.clone() };
|
let weights = if source.weights.is_empty() { vec![1.0; source.control_points.len()] } else { source.weights.clone() };
|
||||||
let curve = cadkernel::space::NurbsCurve3::new_strict(current,
|
let curve = if source.control_points.is_empty() && source.fit_points.len() >= 2 {
|
||||||
source.control_points.iter().map(|point| [point.x, point.y, point.z]).collect(),
|
use cadkernel::space::{NurbsCurve3, Parameterization};
|
||||||
source.knots.clone(), weights)?
|
let points: Vec<_> = source.fit_points.iter().map(|point| [point.x, point.y, point.z]).collect();
|
||||||
.with_periodicity(source.flags.closed || source.flags.periodic)
|
let parameterization = match source.knot_parameterization {
|
||||||
|
1 => Parameterization::Centripetal, 2 => Parameterization::Uniform, _ => Parameterization::Chord,
|
||||||
|
};
|
||||||
|
let tangent = |point: &Vector3| (point.x != 0.0 || point.y != 0.0 || point.z != 0.0).then_some([point.x, point.y, point.z]);
|
||||||
|
if source.flags.closed || source.flags.periodic {
|
||||||
|
NurbsCurve3::interpolate_periodic(&points, parameterization)?
|
||||||
|
} else {
|
||||||
|
NurbsCurve3::interpolate_fit(&points, tangent(&source.begin_tangent), tangent(&source.end_tangent), parameterization)?
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cadkernel::space::NurbsCurve3::new_strict(current,
|
||||||
|
source.control_points.iter().map(|point| [point.x, point.y, point.z]).collect(),
|
||||||
|
source.knots.clone(), weights)?
|
||||||
|
};
|
||||||
|
let curve = curve.with_periodicity(source.flags.closed || source.flags.periodic)
|
||||||
.elevated(degree - current)?
|
.elevated(degree - current)?
|
||||||
.compact_knots(source.control_tolerance.max(1e-9))?;
|
.compact_knots(source.control_tolerance.max(1e-9))?;
|
||||||
let mut result = source.clone();
|
let mut result = source.clone();
|
||||||
|
|||||||
Reference in new issue
Block a user