Skip to main content

geop_core_topology/argument_validation/
pcurve_start_and_end.rs

1use geop_core_geometry::{nurb_curve::NurbCurve2D, nurb_surface::NurbSurface3D};
2use geop_core_math::{
3    geop_error::{GeopError, GeopResult},
4    scalars::Scalar,
5    vector::Vector3,
6};
7
8pub fn validate_pcurve_start_and_end<S: Scalar>(
9    surface: &NurbSurface3D<S>,
10    pcurve: &NurbCurve2D<S>,
11    start: &Vector3<S>,
12    end: &Vector3<S>,
13) -> GeopResult<()> {
14    // Validate pcurve start and end
15    let (t0, t1) = pcurve.domain();
16    let pcurve_start = pcurve.evaluate(t0)?;
17    let pcurve_start_3d = surface.evaluate(pcurve_start[0], pcurve_start[1])?;
18    if !pcurve_start_3d.could_be_equal(&start) {
19        return Err(GeopError::new(format!(
20            "pcurve {pcurve} start point {pcurve_start_3d:?} does not match the given 3D point {start:?} (pcurve start uv {pcurve_start:?})"
21        )));
22    }
23    let pcurve_end = pcurve.evaluate(t1)?;
24    let pcurve_end_3d = surface.evaluate(pcurve_end[0], pcurve_end[1])?;
25    if !pcurve_end_3d.could_be_equal(&end) {
26        return Err(GeopError::new(format!(
27            "pcurve {pcurve} end point {pcurve_end_3d:?} does not match the given 3D point {end:?} (pcurve end uv {pcurve_end:?})"
28        )));
29    }
30    Ok(())
31}