use super::args::TyF64;
use crate::KclError;
use crate::errors::KclErrorDetails;
use crate::execution::Plane;
use crate::execution::Segment;
use crate::execution::SegmentKind;
use crate::execution::Sketch;
use crate::execution::Solid;
use crate::execution::TagIdentifier;
use crate::std::fillet::EdgeReference;
use crate::std::sketch::FaceTag;
#[derive(Debug, Clone, PartialEq)]
pub enum Axis2dOrEdgeReference {
Axis { direction: [TyF64; 2], origin: [TyF64; 2] },
Edge(EdgeReference),
}
impl Axis2dOrEdgeReference {
pub fn from_segment(segment: &Segment) -> Result<Self, KclError> {
match &segment.kind {
SegmentKind::Line { .. } => Ok(Self::Edge(EdgeReference::Uuid(segment.id))),
SegmentKind::Point { .. } => Err(KclError::new_type(KclErrorDetails {
source_ranges: segment.meta.iter().map(|meta| meta.source_range).collect(),
backtrace: Default::default(),
message: "Cannot use a point as an axis".to_owned(),
})),
SegmentKind::Arc { .. } => Err(KclError::new_type(KclErrorDetails {
source_ranges: segment.meta.iter().map(|meta| meta.source_range).collect(),
backtrace: Default::default(),
message: "Cannot use an arc as an axis".to_owned(),
})),
SegmentKind::Circle { .. } => Err(KclError::new_type(KclErrorDetails {
source_ranges: segment.meta.iter().map(|meta| meta.source_range).collect(),
backtrace: Default::default(),
message: "Cannot use a circle as an axis".to_owned(),
})),
}
}
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Clone, PartialEq)]
pub enum Axis3dOrEdgeReference {
Axis { direction: [TyF64; 3], origin: [TyF64; 3] },
Edge(EdgeReference),
}
impl Axis3dOrEdgeReference {
pub fn from_segment(segment: &Segment) -> Result<Self, KclError> {
match &segment.kind {
SegmentKind::Line { .. } => Ok(Self::Edge(EdgeReference::Uuid(segment.id))),
SegmentKind::Point { .. } => Err(KclError::new_type(KclErrorDetails {
source_ranges: segment.meta.iter().map(|meta| meta.source_range).collect(),
backtrace: Default::default(),
message: "Cannot use a point as an axis".to_owned(),
})),
SegmentKind::Arc { .. } => Err(KclError::new_type(KclErrorDetails {
source_ranges: segment.meta.iter().map(|meta| meta.source_range).collect(),
backtrace: Default::default(),
message: "Cannot use an arc as an axis".to_owned(),
})),
SegmentKind::Circle { .. } => Err(KclError::new_type(KclErrorDetails {
source_ranges: segment.meta.iter().map(|meta| meta.source_range).collect(),
backtrace: Default::default(),
message: "Cannot use a circle as an axis".to_owned(),
})),
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum Axis2dOrPoint2d {
Axis { direction: [TyF64; 2], origin: [TyF64; 2] },
Point([TyF64; 2]),
}
impl Axis2dOrPoint2d {
pub fn to_point2d(&self) -> [TyF64; 2] {
match self {
Axis2dOrPoint2d::Axis { direction, origin: _ } => direction.clone(),
Axis2dOrPoint2d::Point(point) => point.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum Axis3dOrPoint3d {
Axis { direction: [TyF64; 3], origin: [TyF64; 3] },
Point([TyF64; 3]),
}
impl Axis3dOrPoint3d {
pub fn to_point3d(&self) -> [TyF64; 3] {
match self {
Axis3dOrPoint3d::Axis { direction, origin: _ } => direction.clone(),
Axis3dOrPoint3d::Point(point) => point.clone(),
}
}
pub fn axis_origin(&self) -> Option<[TyF64; 3]> {
match self {
Axis3dOrPoint3d::Axis { origin, .. } => Some(origin.clone()),
Axis3dOrPoint3d::Point(..) => None,
}
}
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Clone, PartialEq)]
pub enum Point3dAxis3dOrGeometryReference {
Point([TyF64; 3]),
Axis { direction: [TyF64; 3], origin: [TyF64; 3] },
Plane(Box<Plane>),
Edge(EdgeReference),
Face(FaceTag),
Sketch(Box<Sketch>),
Solid(Box<Solid>),
TaggedEdgeOrFace(TagIdentifier),
}