use super::id::{
Curve2dId, CurveId, Direction2dId, DirectionId, Placement1dId, Placement2dId, Placement3dId,
Point2dId, PointId, SurfaceId,
};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Point3 {
pub x: f64,
pub y: f64,
pub z: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Direction3 {
pub x: f64,
pub y: f64,
pub z: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Axis1Placement {
pub location: PointId,
pub axis: DirectionId,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Axis2Placement3d {
pub location: PointId,
pub axis: Option<DirectionId>,
pub ref_direction: Option<DirectionId>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Surface {
Plane(Plane3),
Cylinder(CylindricalSurface),
Sphere(SphericalSurface),
Cone(ConicalSurface),
Torus(ToroidalSurface),
Revolution(SurfaceOfRevolution),
Extrusion(SurfaceOfLinearExtrusion),
Nurbs(NurbsSurface),
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Plane3 {
pub position: Placement3dId,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct CylindricalSurface {
pub position: Placement3dId,
pub radius: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ConicalSurface {
pub position: Placement3dId,
pub radius: f64,
pub semi_angle: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ToroidalSurface {
pub position: Placement3dId,
pub major_radius: f64,
pub minor_radius: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct SphericalSurface {
pub position: Placement3dId,
pub radius: f64,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Curve {
Line(Line3),
Circle(Circle3),
Ellipse(Ellipse3),
Nurbs(NurbsCurve),
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Circle3 {
pub position: Placement3dId,
pub radius: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Ellipse3 {
pub position: Placement3dId,
pub semi_axis_1: f64,
pub semi_axis_2: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Line3 {
pub point: PointId,
pub direction: DirectionId,
pub magnitude: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum CurveForm {
PolylineForm,
CircularArc,
EllipticArc,
ParabolicArc,
HyperbolicArc,
#[default]
Unspecified,
}
impl CurveForm {
#[must_use]
pub fn from_step_enum(s: &str) -> Self {
match s {
"POLYLINE_FORM" => Self::PolylineForm,
"CIRCULAR_ARC" => Self::CircularArc,
"ELLIPTIC_ARC" => Self::EllipticArc,
"PARABOLIC_ARC" => Self::ParabolicArc,
"HYPERBOLIC_ARC" => Self::HyperbolicArc,
_ => Self::Unspecified,
}
}
#[must_use]
pub fn as_step_enum(self) -> &'static str {
match self {
Self::PolylineForm => "POLYLINE_FORM",
Self::CircularArc => "CIRCULAR_ARC",
Self::EllipticArc => "ELLIPTIC_ARC",
Self::ParabolicArc => "PARABOLIC_ARC",
Self::HyperbolicArc => "HYPERBOLIC_ARC",
Self::Unspecified => "UNSPECIFIED",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum SurfaceForm {
PlaneSurf,
CylindricalSurf,
ConicalSurf,
SphericalSurf,
ToroidalSurf,
SurfOfRevolution,
RuledSurf,
GeneralisedCone,
QuadricSurf,
SurfOfLinearExtrusion,
#[default]
Unspecified,
}
impl SurfaceForm {
#[must_use]
pub fn from_step_enum(s: &str) -> Self {
match s {
"PLANE_SURF" => Self::PlaneSurf,
"CYLINDRICAL_SURF" => Self::CylindricalSurf,
"CONICAL_SURF" => Self::ConicalSurf,
"SPHERICAL_SURF" => Self::SphericalSurf,
"TOROIDAL_SURF" => Self::ToroidalSurf,
"SURF_OF_REVOLUTION" => Self::SurfOfRevolution,
"RULED_SURF" => Self::RuledSurf,
"GENERALISED_CONE" => Self::GeneralisedCone,
"QUADRIC_SURF" => Self::QuadricSurf,
"SURF_OF_LINEAR_EXTRUSION" => Self::SurfOfLinearExtrusion,
_ => Self::Unspecified,
}
}
#[must_use]
pub fn as_step_enum(self) -> &'static str {
match self {
Self::PlaneSurf => "PLANE_SURF",
Self::CylindricalSurf => "CYLINDRICAL_SURF",
Self::ConicalSurf => "CONICAL_SURF",
Self::SphericalSurf => "SPHERICAL_SURF",
Self::ToroidalSurf => "TOROIDAL_SURF",
Self::SurfOfRevolution => "SURF_OF_REVOLUTION",
Self::RuledSurf => "RULED_SURF",
Self::GeneralisedCone => "GENERALISED_CONE",
Self::QuadricSurf => "QUADRIC_SURF",
Self::SurfOfLinearExtrusion => "SURF_OF_LINEAR_EXTRUSION",
Self::Unspecified => "UNSPECIFIED",
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct NurbsCurve {
pub degree: u32,
pub control_points: Vec<PointId>,
pub weights: Option<Vec<f64>>,
pub knot_multiplicities: Vec<i64>,
pub knots: Vec<f64>,
pub closed: bool,
pub form: CurveForm,
}
#[derive(Debug, Clone, PartialEq)]
pub struct NurbsSurface {
pub u_degree: u32,
pub v_degree: u32,
pub control_points: Vec<Vec<PointId>>,
pub weights: Option<Vec<Vec<f64>>>,
pub u_knot_multiplicities: Vec<i64>,
pub v_knot_multiplicities: Vec<i64>,
pub u_knots: Vec<f64>,
pub v_knots: Vec<f64>,
pub u_closed: bool,
pub v_closed: bool,
pub form: SurfaceForm,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct SurfaceOfRevolution {
pub swept_curve: CurveId,
pub axis_placement: Placement1dId,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct SurfaceOfLinearExtrusion {
pub swept_curve: CurveId,
pub extrusion_direction: DirectionId,
pub depth: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Point2 {
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Direction2 {
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Axis2Placement2d {
pub location: Point2dId,
pub ref_direction: Option<Direction2dId>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Curve2d {
Line(Line2),
Circle(Circle2),
Ellipse(Ellipse2),
Nurbs(NurbsCurve2d),
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Line2 {
pub point: Point2dId,
pub direction: Direction2dId,
pub magnitude: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Circle2 {
pub position: Placement2dId,
pub radius: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Ellipse2 {
pub position: Placement2dId,
pub semi_axis_1: f64,
pub semi_axis_2: f64,
}
#[derive(Debug, Clone, PartialEq)]
pub struct NurbsCurve2d {
pub degree: u32,
pub control_points: Vec<Point2dId>,
pub weights: Option<Vec<f64>>,
pub knot_multiplicities: Vec<i64>,
pub knots: Vec<f64>,
pub closed: bool,
pub form: CurveForm,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Pcurve {
pub basis_surface: SurfaceId,
pub curve_2d: Curve2dId,
}