use axiolid_core::{Point2, Point3, Scalar, Vec3};
use crate::NodeId;
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TrimSelector {
Parameter(Scalar),
Point2(Point2),
Point3(Point3),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TrimmingPreference {
Parameter,
Cartesian,
Unspecified,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Transition {
Discontinuous,
Continuous,
ContinuousSameGradient,
ContinuousSameGradientSameCurvature,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct CurveSegment {
pub curve: NodeId,
pub same_sense: bool,
pub transition: Transition,
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq)]
pub enum CurveRelation {
Composite { segments: Vec<CurveSegment> },
Trimmed {
basis: NodeId,
start: Vec<TrimSelector>,
end: Vec<TrimSelector>,
sense_agreement: bool,
preference: TrimmingPreference,
},
Offset {
basis: NodeId,
distance: Scalar,
reference_direction: Option<Vec3>,
},
SurfaceCurve {
curve_3d: NodeId,
associated_geometry: Vec<NodeId>,
master: MasterRepresentation,
},
ParameterCurve {
basis_surface: NodeId,
reference_curve: NodeId,
},
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MasterRepresentation {
Curve3d,
ParameterCurve,
Both,
Unspecified,
}
impl CurveRelation {
pub(crate) fn references(&self, out: &mut Vec<NodeId>) {
match self {
Self::Composite { segments } => out.extend(segments.iter().map(|item| item.curve)),
Self::Trimmed { basis, .. } | Self::Offset { basis, .. } => out.push(*basis),
Self::SurfaceCurve {
curve_3d,
associated_geometry,
..
} => {
out.push(*curve_3d);
out.extend(associated_geometry.iter().copied());
}
Self::ParameterCurve {
basis_surface,
reference_curve,
} => out.extend([*basis_surface, *reference_curve]),
}
}
}