use std::collections::BTreeMap;
use crate::ids::{
BodyId, CurveId, EdgeId, FaceId, FeatureInputTopologyId, HistoricalBodyId, HistoricalEdgeId,
HistoricalFaceId, SubdId, VertexId,
};
use crate::math::{Point3, Vector3};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(
Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, JsonSchema,
)]
#[serde(transparent)]
pub struct FeatureId(pub String);
impl FeatureId {
pub fn as_str(&self) -> &str {
&self.0
}
}
impl std::fmt::Display for FeatureId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.0)
}
}
impl<S: Into<String>> From<S> for FeatureId {
fn from(value: S) -> Self {
Self(value.into())
}
}
#[derive(
Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, JsonSchema,
)]
#[serde(transparent)]
pub struct ConfigurationId(pub String);
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(untagged)]
pub enum ConfigurationBodies {
Resolved(Vec<BodyId>),
#[default]
Unresolved,
}
impl ConfigurationBodies {
pub fn resolved(&self) -> Option<&[BodyId]> {
match self {
Self::Resolved(value) => Some(value),
Self::Unresolved => None,
}
}
pub fn is_unresolved(&self) -> bool {
matches!(self, Self::Unresolved)
}
pub fn iter(&self) -> std::slice::Iter<'_, BodyId> {
self.resolved().unwrap_or_default().iter()
}
pub fn len(&self) -> usize {
self.resolved().map_or(0, <[BodyId]>::len)
}
pub fn is_empty(&self) -> bool {
self.resolved().is_some_and(<[BodyId]>::is_empty)
}
}
impl PartialEq<Vec<BodyId>> for ConfigurationBodies {
fn eq(&self, other: &Vec<BodyId>) -> bool {
self.resolved() == Some(other.as_slice())
}
}
impl<'a> IntoIterator for &'a ConfigurationBodies {
type Item = &'a BodyId;
type IntoIter = std::slice::Iter<'a, BodyId>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct DesignConfiguration {
pub id: ConfigurationId,
#[serde(default)]
pub ordinal: u32,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub active: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source_index: Option<u32>,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub material: Option<String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub properties: BTreeMap<String, String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub parameter_overrides: BTreeMap<ParameterId, String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub suppressed_features: Vec<FeatureId>,
#[serde(default, skip_serializing_if = "ConfigurationBodies::is_unresolved")]
pub bodies: ConfigurationBodies,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub parameter_values: BTreeMap<ParameterId, ParameterValue>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub feature_states: BTreeMap<FeatureId, ConfigurationFeatureState>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub native_ref: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ConfigurationFeatureState {
#[serde(default)]
pub suppressed: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub dependencies: Vec<FeatureId>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub outputs: Vec<BodyId>,
pub definition: FeatureDefinition,
}
#[derive(
Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, JsonSchema,
)]
#[serde(transparent)]
pub struct ParameterId(pub String);
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct DesignParameter {
pub id: ParameterId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub owner: Option<FeatureId>,
#[serde(default)]
pub ordinal: u32,
pub name: String,
pub expression: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub display: Option<DimensionDisplay>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub value: Option<ParameterValue>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub dependencies: Vec<ParameterId>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub properties: BTreeMap<String, String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pmi: Option<ParameterPmi>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub native_ref: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ParameterPmi {
pub subtype: PmiDimensionSubtype,
pub precision: i64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub display_text: Option<String>,
pub basic: bool,
pub inspection: bool,
pub reference_only: bool,
pub native_ref: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "native_kind", rename_all = "snake_case")]
pub enum PmiDimensionSubtype {
Linear,
Angle,
Diameter,
Radial,
Native(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum DimensionDisplay {
Diameter,
Radius,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum ParameterValue {
Length(Length),
Angle(Angle),
Real(f64),
Integer(i64),
Boolean(bool),
String(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(transparent)]
pub struct Length(pub f64);
#[derive(Debug, Clone, Copy, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(transparent)]
pub struct Angle(pub f64);
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Feature {
pub id: FeatureId,
pub ordinal: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default)]
pub suppressed: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent: Option<FeatureId>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub dependencies: Vec<FeatureId>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub source_properties: BTreeMap<String, String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source_tag: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source_text: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub source_content: Vec<FeatureSourceContent>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub outputs: Vec<BodyId>,
pub definition: FeatureDefinition,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub native_ref: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct FeatureInputTopology {
pub id: FeatureInputTopologyId,
pub input_of: FeatureId,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub bodies: Vec<HistoricalBodyId>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub faces: Vec<HistoricalFaceId>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub edges: Vec<HistoricalEdgeId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub native_ref: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum FeatureSourceContent {
Text(String),
Parameter(ParameterId),
Feature(FeatureId),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "definition", rename_all = "snake_case")]
pub enum FeatureDefinition {
TreeNode {
role: FeatureTreeNodeRole,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
children: Vec<FeatureId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
active_child: Option<FeatureId>,
},
BaseFeature {
bodies: BodySelection,
},
InsertBodies {
bodies: BodySelection,
},
Form {
cages: Vec<SubdId>,
},
CosmeticThread {
face: FaceSelection,
#[serde(default, skip_serializing_if = "Option::is_none")]
diameter: Option<Length>,
#[serde(default, skip_serializing_if = "Option::is_none")]
extent: Option<CosmeticThreadExtent>,
},
DatumPrincipalPlane {
plane: PrincipalPlane,
},
DatumPlane {
origin: Point3,
normal: Vector3,
u_axis: Vector3,
},
DatumPlaneUnresolved,
DatumOffsetPlane {
#[serde(default, skip_serializing_if = "Option::is_none")]
reference: Option<FeatureId>,
distance: Length,
},
DatumAxis {
origin: Point3,
direction: Vector3,
},
DatumPoint {
position: Point3,
},
DatumPointUnresolved,
PointGeometry {
position: Point3,
},
LineSegment {
start: Point3,
end: Point3,
},
CircularArc {
center: Point3,
normal: Vector3,
radius: Length,
start_angle: Angle,
end_angle: Angle,
},
EllipticArc {
center: Point3,
normal: Vector3,
major_axis: Vector3,
major_radius: Length,
minor_radius: Length,
start_angle: Angle,
end_angle: Angle,
},
Polyline {
points: Vec<Point3>,
closed: bool,
},
RegularPolygonCurve {
sides: u32,
circumradius: Length,
},
PlanarPatch {
length: Length,
width: Length,
},
FaceFromShapes {
sources: BodySelection,
face_maker_class: String,
},
DatumCoordinateSystem {
origin: Point3,
x_axis: Vector3,
y_axis: Vector3,
z_axis: Vector3,
},
DatumCoordinateSystemUnresolved,
Block {
dimensions: Option<[Length; 3]>,
placement: Option<crate::transform::Transform>,
},
EquationCurve {
parameter: String,
x_expression: String,
y_expression: String,
z_expression: String,
start: f64,
end: f64,
},
ProjectedCurve {
source: PathRef,
target_faces: FaceSelection,
#[serde(default)]
direction: CurveProjectionDirection,
#[serde(default, skip_serializing_if = "Option::is_none")]
bidirectional: Option<bool>,
},
ProjectOnSurface {
sources: PathRef,
support_face: FaceSelection,
direction: Vector3,
mode: SurfaceProjectionMode,
height: Length,
offset: Length,
},
CompositeCurve {
segments: Vec<PathRef>,
#[serde(default)]
closed: bool,
},
Helix {
axis_origin: Point3,
axis_direction: Vector3,
radius: Length,
pitch: Length,
revolutions: f64,
#[serde(default)]
start_angle: Angle,
clockwise: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
radial_growth: Option<Length>,
#[serde(default, skip_serializing_if = "Option::is_none")]
cone_angle: Option<Angle>,
#[serde(default, skip_serializing_if = "Option::is_none")]
segment_turns: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
construction_style: Option<HelixConstructionStyle>,
},
HelixNativeAxis {
axis_native_ref: String,
#[serde(alias = "radius")]
axial_rise: Length,
#[serde(alias = "height")]
pitch: Length,
revolutions: f64,
start_angle: Angle,
clockwise: bool,
},
Coil {
construction: CoilConstruction,
result: CoilResult,
},
Sphere {
center: Point3,
radius: Length,
op: BooleanOp,
},
Torus {
center: Point3,
axis: Vector3,
major_radius: Length,
minor_radius: Length,
op: BooleanOp,
},
Wrap {
profile: ProfileRef,
face: FaceSelection,
mode: WrapMode,
#[serde(default, skip_serializing_if = "Option::is_none")]
depth: Option<Length>,
},
Sketch {
#[serde(default)]
space: SketchSpace,
#[serde(default, skip_serializing_if = "Option::is_none")]
sketch: Option<crate::sketches::SketchId>,
},
SpatialSketch {
#[serde(default, skip_serializing_if = "Option::is_none")]
sketch: Option<crate::sketches::SpatialSketchId>,
},
SketchBlockDefinition {
#[serde(default, skip_serializing_if = "Option::is_none")]
sketch: Option<crate::sketches::SketchId>,
},
SketchBlockInstance {
#[serde(default, skip_serializing_if = "Option::is_none")]
block: Option<FeatureId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
placement: Option<crate::transform::Transform>,
},
StoredGeometry,
ExtractBody {
source: BodySelection,
},
DerivedGeometry {
source: FeatureId,
},
ImportedGeometry {
path: String,
format: GeometryImportFormat,
},
Primitive {
solid: PrimitiveSolid,
op: BooleanOp,
},
Extrude {
profile: ProfileRef,
#[serde(default, skip_serializing_if = "ExtrudeDirection::is_profile_normal")]
direction: ExtrudeDirection,
#[serde(default)]
start: ExtrudeStart,
extent: ExtrudeExtent,
op: BooleanOp,
#[serde(default, skip_serializing_if = "Option::is_none")]
direction_source: Option<ExtrusionDirectionSource>,
#[serde(default, skip_serializing_if = "Option::is_none")]
solid: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
face_maker: Option<ExtrusionFaceMaker>,
#[serde(default, skip_serializing_if = "Option::is_none")]
inner_wire_taper: Option<InnerWireTaper>,
#[serde(default, skip_serializing_if = "Option::is_none")]
length_along_profile_normal: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
allow_multi_profile_faces: Option<bool>,
},
Revolve {
construction: RevolutionConstruction,
op: BooleanOp,
},
Sweep {
#[serde(default, skip_serializing_if = "Option::is_none")]
profile: Option<ProfileRef>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
sections: Vec<ProfileRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
path: Option<PathRef>,
mode: SweepMode,
#[serde(default, skip_serializing_if = "Option::is_none")]
orientation: Option<SweepOrientation>,
#[serde(default, skip_serializing_if = "Option::is_none")]
transition: Option<SweepTransition>,
#[serde(default, skip_serializing_if = "Option::is_none")]
transformation: Option<SweepTransformation>,
#[serde(default)]
path_tangent: bool,
#[serde(default)]
linearize: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
twist: Option<Angle>,
#[serde(default, skip_serializing_if = "Option::is_none")]
scale: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
allow_multi_profile_faces: Option<bool>,
},
HelicalSweep {
construction: HelicalSweepConstruction,
op: BooleanOp,
},
Binder {
sources: Vec<BinderSource>,
construction: BinderConstruction,
},
LoftUnresolved,
FreeformSurfaceUnresolved,
Loft {
#[serde(alias = "profiles")]
sections: Vec<LoftSection>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
guides: Vec<PathRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
centerline: Option<PathRef>,
op: BooleanOp,
#[serde(default)]
closed: bool,
#[serde(default = "default_true")]
solid: bool,
#[serde(default)]
ruled: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
max_degree: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
check_compatibility: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
allow_multi_profile_faces: Option<bool>,
},
Rib {
construction: RibConstruction,
op: BooleanOp,
},
SheetMetalBaseFlange {
profile: ProfileRef,
thickness: Length,
side: SheetMetalThicknessSide,
},
Fillet {
groups: Vec<FilletGroup>,
},
FaceBlend {
first_faces: FaceSelection,
second_faces: FaceSelection,
radius: RadiusSpec,
},
Chamfer {
groups: Vec<ChamferGroup>,
#[serde(default)]
flip_direction: bool,
},
Shell {
removed_faces: FaceSelection,
#[serde(default, skip_serializing_if = "Option::is_none")]
thickness: Option<Length>,
#[serde(default, skip_serializing_if = "Option::is_none")]
outward: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
mode: Option<ShellMode>,
#[serde(default, skip_serializing_if = "Option::is_none")]
join: Option<ShellJoin>,
#[serde(default, skip_serializing_if = "Option::is_none")]
resolve_intersections: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
allow_self_intersections: Option<bool>,
},
OffsetShape {
source: BodySelection,
distance: Length,
mode: ShellMode,
join: ShellJoin,
resolve_intersections: bool,
allow_self_intersections: bool,
fill: bool,
planar: bool,
},
Compound {
members: BodySelection,
},
RefineShape {
source: BodySelection,
},
ReverseShape {
source: BodySelection,
},
RuledBetweenCurves {
first: PathRef,
second: PathRef,
orientation: RuledCurveOrientation,
},
SectionShape {
first: BodySelection,
second: BodySelection,
approximate: bool,
},
MirrorShape {
source: BodySelection,
plane_origin: Point3,
plane_normal: Vector3,
#[serde(default, skip_serializing_if = "Option::is_none")]
plane_reference: Option<FaceSelection>,
},
Thicken {
faces: FaceSelection,
#[serde(default, skip_serializing_if = "Option::is_none")]
thickness: Option<Length>,
#[serde(default, skip_serializing_if = "Option::is_none")]
side: Option<ThickenSide>,
},
OffsetSurface {
faces: FaceSelection,
distance: Option<Length>,
},
KnitSurface {
faces: FaceSelection,
merge_entities: Option<bool>,
create_solid: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
gap_tolerance: Option<Length>,
},
SewBodies {
bodies: BodySelection,
gap_tolerance: Option<Length>,
},
FilledSurface {
boundary: SurfaceBoundary,
support_faces: FaceSelection,
#[serde(default, skip_serializing_if = "Option::is_none")]
continuity: Option<SurfaceContinuity>,
#[serde(default, skip_serializing_if = "Option::is_none")]
merge_result: Option<bool>,
},
BoundarySurfaceUnresolved,
TrimSurface {
faces: FaceSelection,
tool: PathRef,
keep: TrimRegion,
},
ExtendSurface {
faces: FaceSelection,
distance: Option<Length>,
method: SurfaceExtension,
},
RuledSurface {
edges: EdgeSelection,
support_faces: FaceSelection,
mode: RuledSurfaceMode,
},
Draft {
faces: FaceSelection,
neutral_plane: FaceSelection,
pull_direction: Option<Vector3>,
angle: Option<Angle>,
outward: Option<bool>,
},
DraftUnresolved,
Combine {
target: BodySelection,
tools: BodySelection,
op: BooleanOp,
},
BoundaryFill {
tools: BodySelection,
cells: Vec<BodySelection>,
},
CutWithSurface {
targets: BodySelection,
tools: FaceSelection,
reverse: bool,
},
TrimBodies {
targets: BodySelection,
tools: BodySelection,
keep: BodyTrimSide,
},
SplitBody {
targets: BodySelection,
tools: FaceSelection,
},
DeleteBody {
bodies: BodySelection,
mode: BodyRetentionMode,
},
DeleteFace {
faces: FaceSelection,
heal: bool,
},
ReplaceFace {
targets: FaceSelection,
replacements: FaceSelection,
},
MoveFace {
faces: FaceSelection,
motion: FaceMotion,
},
MoveBody {
bodies: BodySelection,
translation: Vector3,
#[serde(default, skip_serializing_if = "Option::is_none")]
rotation: Option<AxisAngle>,
#[serde(default)]
copies: u32,
},
Dome {
faces: FaceSelection,
#[serde(default, skip_serializing_if = "Option::is_none")]
height: Option<Length>,
#[serde(default, skip_serializing_if = "Option::is_none")]
elliptical: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
reverse: Option<bool>,
},
Flex {
#[serde(default, skip_serializing_if = "Option::is_none")]
axis: Option<Vector3>,
mode: FlexMode,
},
Scale {
bodies: BodySelection,
#[serde(default, skip_serializing_if = "Option::is_none")]
center: Option<ScaleCenter>,
factors: ScaleFactors,
},
Hole {
#[serde(default, skip_serializing_if = "Option::is_none")]
profile: Option<ProfileRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
profile_filter: Option<HoleProfileFilter>,
#[serde(default, skip_serializing_if = "Option::is_none")]
face: Option<FaceSelection>,
#[serde(default, skip_serializing_if = "Option::is_none")]
position: Option<Point3>,
#[serde(default, skip_serializing_if = "Option::is_none")]
direction: Option<Vector3>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
placements: Vec<HolePlacement>,
kind: HoleKind,
#[serde(default, skip_serializing_if = "Option::is_none")]
exit_kind: Option<HoleKind>,
#[serde(default, skip_serializing_if = "Option::is_none")]
diameter: Option<Length>,
#[serde(default, skip_serializing_if = "Option::is_none")]
extent: Option<Termination>,
#[serde(default, skip_serializing_if = "Option::is_none")]
bottom: Option<HoleBottom>,
#[serde(default, skip_serializing_if = "Option::is_none")]
taper_angle: Option<Angle>,
#[serde(default, skip_serializing_if = "Option::is_none")]
specification: Option<Box<HoleSpecification>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
allow_multi_profile_faces: Option<bool>,
},
Pattern {
seeds: Vec<PatternSeed>,
pattern: PatternKind,
},
PostProcess {
operation: Box<FeatureDefinition>,
refine: bool,
fuzzy_tolerance: FuzzyTolerance,
},
Native {
kind: String,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
parameters: BTreeMap<String, String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
properties: BTreeMap<String, String>,
},
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum ExtrudeDirection {
#[default]
ProfileNormal,
ReversedProfileNormal,
Explicit(Vector3),
}
impl ExtrudeDirection {
pub fn is_profile_normal(&self) -> bool {
matches!(self, Self::ProfileNormal)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum HolePlacement {
Directed {
position: Point3,
direction: Vector3,
},
Axis {
origin: Point3,
axis: Vector3,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum PatternSeed {
Feature(FeatureId),
Faces(FaceSelection),
Bodies(BodySelection),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum GeometryImportFormat {
Step,
Iges,
Brep,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum FuzzyTolerance {
KernelDefault,
Automatic,
Explicit(f64),
}
const fn default_true() -> bool {
true
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ShellMode {
Skin,
Pipe,
BothSides,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ShellJoin {
Arc,
Tangent,
Intersection,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum RuledCurveOrientation {
Automatic,
Forward,
Reversed,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum PrimitiveSolid {
Box {
length: Length,
width: Length,
height: Length,
},
Cylinder {
radius: Length,
height: Length,
angle: Angle,
},
Cone {
radius1: Length,
radius2: Length,
height: Length,
angle: Angle,
},
Sphere {
radius: Length,
latitude1: Angle,
latitude2: Angle,
longitude: Angle,
},
Ellipsoid {
x_radius: Length,
y_radius: Length,
z_radius: Length,
latitude1: Angle,
latitude2: Angle,
longitude: Angle,
},
Torus {
major_radius: Length,
minor_radius: Length,
latitude1: Angle,
latitude2: Angle,
longitude: Angle,
},
Prism {
sides: u32,
circumradius: Length,
height: Length,
},
Wedge {
xmin: Length,
ymin: Length,
zmin: Length,
x2min: Length,
z2min: Length,
xmax: Length,
ymax: Length,
zmax: Length,
x2max: Length,
z2max: Length,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct RevolutionConstruction {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub profile: Option<ProfileRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub axis: Option<RevolutionAxis>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extent: Option<RevolveExtent>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub axis_reference: Option<PathRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub solid: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub face_maker_class: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fuse_order: Option<RevolutionFuseOrder>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub allow_multi_profile_faces: Option<bool>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum RevolutionFuseOrder {
BaseFirst,
FeatureFirst,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct RevolutionAxis {
pub origin: Point3,
pub direction: Vector3,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct RibConstruction {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub profile: Option<ProfileRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub direction: Option<Vector3>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub thickness: Option<Length>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub side: Option<RibSide>,
#[serde(default)]
pub draft: RibDraft,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum RibSide {
OneSided,
Centered,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "angle", rename_all = "snake_case")]
pub enum RibDraft {
#[default]
Unresolved,
None,
Angle(Angle),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum FeatureTreeNodeRole {
Annotations,
AmbientLight,
Comments,
CrossSections,
DesignBinder,
Details,
DissectedProfile,
DirectionalLight,
Equations,
ExplodedViews,
Favorites,
FeatureFolder,
History,
LightsAndCameras,
Markups,
ModelOrigin,
PointLight,
Materials,
Notes,
SelectionSets,
Sensors,
SheetMetal,
SolidBodies,
SpotLight,
SurfaceBodies,
Tables,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum CosmeticThreadExtent {
Blind {
length: Length,
},
Through,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum PrincipalPlane {
Front,
Top,
Right,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SketchSpace {
Unresolved,
#[default]
Planar,
Spatial,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum BodyTrimSide {
Unresolved,
Forward,
Reverse,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(untagged)]
pub enum CurveProjectionDirection {
Vector(Vector3),
State(CurveProjectionDirectionState),
}
impl Default for CurveProjectionDirection {
fn default() -> Self {
Self::State(CurveProjectionDirectionState::TargetNormal)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum CurveProjectionDirectionState {
Unresolved,
TargetNormal,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum BodyRetentionMode {
Unresolved,
DeleteSelected,
KeepSelected,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum WrapMode {
Emboss,
Deboss,
Scribe,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SurfaceContinuity {
Contact,
Tangent,
Curvature,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum SurfaceBoundary {
Edges(EdgeSelection),
Path(PathRef),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum TrimRegion {
Unresolved,
Inside,
Outside,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SurfaceExtension {
Unresolved,
Natural,
Linear,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum RuledSurfaceMode {
Normal {
distance: Length,
},
Tangent {
distance: Length,
},
Direction {
direction: Vector3,
distance: Length,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum ScaleCenter {
Centroid,
ModelOrigin,
Point(Point3),
Native(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ScaleFactors {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub uniform: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub x: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub y: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub z: Option<f64>,
}
impl ScaleFactors {
#[must_use]
pub fn resolved(self) -> Option<Vector3> {
if let Some(factor) = self.uniform {
return Some(Vector3::new(factor, factor, factor));
}
Some(Vector3::new(self.x?, self.y?, self.z?))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ThickenSide {
Forward,
Reverse,
Both,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SheetMetalThicknessSide {
Forward,
Reverse,
Symmetric,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum EdgeSelection {
Unresolved,
All,
Edges(Vec<EdgeId>),
Resolved {
edges: Vec<EdgeId>,
native: String,
},
Historical {
state: FeatureInputTopologyId,
edges: Vec<HistoricalEdgeId>,
native: String,
},
HistoricalPartial {
state: FeatureInputTopologyId,
edges: Vec<HistoricalEdgeId>,
unresolved: Vec<String>,
native: String,
},
Generated {
edges: Vec<GeneratedEdgeRef>,
native: String,
},
Native(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct GeneratedEdgeRef {
pub feature: FeatureId,
pub local_id: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct GeneratedFaceRef {
pub feature: FeatureId,
pub local_id: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct GeneratedVertexRef {
pub feature: FeatureId,
pub local_id: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum VertexSelection {
Unresolved,
Generated {
vertex: GeneratedVertexRef,
native: String,
},
Native(String),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum FaceSelection {
Unresolved,
Faces(Vec<FaceId>),
Resolved {
faces: Vec<FaceId>,
native: String,
},
Historical {
state: FeatureInputTopologyId,
faces: Vec<HistoricalFaceId>,
native: String,
},
HistoricalPartial {
state: FeatureInputTopologyId,
faces: Vec<HistoricalFaceId>,
unresolved: Vec<String>,
native: String,
},
Generated {
faces: Vec<GeneratedFaceRef>,
native: String,
},
Native(String),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum BodySelection {
Unresolved,
Bodies(Vec<BodyId>),
Resolved {
bodies: Vec<BodyId>,
native: String,
},
Historical {
state: FeatureInputTopologyId,
bodies: Vec<HistoricalBodyId>,
native: String,
},
Generated {
bodies: Vec<GeneratedBodyRef>,
native: String,
},
Local {
bodies: Vec<String>,
native: String,
},
Native(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct GeneratedBodyRef {
pub feature: FeatureId,
pub local_id: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum FaceMotion {
Offset {
distance: Length,
},
Translate {
direction: Vector3,
distance: Length,
},
Rotate {
axis_origin: Point3,
axis_dir: Vector3,
angle: Angle,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct AxisAngle {
pub origin: Point3,
pub direction: Vector3,
pub angle: Angle,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, Default)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum ExtrudeStart {
#[default]
ProfilePlane,
OffsetProfilePlane {
offset: Length,
},
FromFace {
face: FaceSelection,
#[serde(default, skip_serializing_if = "Option::is_none")]
offset: Option<Length>,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum Termination {
Unresolved,
Blind {
length: Length,
},
ThroughAll,
ThroughNext,
ToFirst,
ToLast,
ToFace {
face: FaceSelection,
#[serde(default, skip_serializing_if = "Option::is_none")]
offset: Option<Length>,
},
ToVertex {
vertex: VertexSelection,
},
OffsetFromFace {
face: FaceSelection,
offset: Length,
},
ToShape {
target: FaceSelection,
},
Angle {
angle: Angle,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ExtrudeSide {
pub termination: Termination,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub draft: Option<Angle>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub offset: Option<Length>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum ExtrudeExtent {
OneSided {
side: ExtrudeSide,
},
TwoSided {
first: ExtrudeSide,
second: ExtrudeSide,
},
Symmetric {
side: ExtrudeSide,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum RevolveExtent {
OneSided {
termination: Termination,
},
TwoSided {
first: Termination,
second: Termination,
},
Symmetric {
termination: Termination,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum ExtrusionDirectionSource {
Custom,
Edge {
reference: PathRef,
},
ProfileNormal,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ExtrusionFaceMaker {
pub class: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mode: Option<u32>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum InnerWireTaper {
Inverted,
SameAsOuter,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HelixConstructionStyle {
Legacy,
Corrected,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SurfaceProjectionMode {
All,
Faces,
Edges,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum BooleanOp {
Unresolved,
Join,
Cut,
Intersect,
NewBody,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct CoilConstruction {
pub placement: CoilPlacement,
pub diameter: Length,
pub extent: CoilExtent,
pub section: CoilSection,
pub section_placement: CoilSectionPlacement,
pub clockwise: bool,
pub taper: Angle,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum CoilPlacement {
Explicit {
origin: Point3,
axis: Vector3,
radial: Vector3,
},
Native {
native_ref: String,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum CoilExtent {
RevolutionsHeight {
revolutions: f64,
height: Length,
},
RevolutionsPitch {
revolutions: f64,
pitch: Length,
},
HeightPitch {
height: Length,
pitch: Length,
},
Spiral {
revolutions: f64,
radial_pitch: Length,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum CoilSection {
Circular {
diameter: Length,
},
Square {
size: Length,
},
ExternalTriangle {
size: Length,
},
InternalTriangle {
size: Length,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum CoilSectionPlacement {
Inside,
Center,
Outside,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum CoilResult {
NewBody,
Boolean {
operation: BooleanOp,
targets: BodySelection,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "mode", rename_all = "snake_case")]
pub enum SweepMode {
Unresolved,
Solid {
op: BooleanOp,
},
Surface,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct SketchProfileBoundaryUse {
pub entity: crate::sketches::SketchEntityId,
pub parameter_range: [f64; 2],
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub reversed: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(untagged)]
pub enum SketchProfileRegion {
Loops {
outer: u32,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
holes: Vec<u32>,
},
Trimmed {
outer_boundary: Vec<SketchProfileBoundaryUse>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
hole_boundaries: Vec<Vec<SketchProfileBoundaryUse>>,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum SweepOrientation {
CorrectedFrenet,
Fixed,
Frenet,
Auxiliary {
path: PathRef,
tangent: bool,
curvilinear: bool,
},
Binormal {
direction: Vector3,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SweepTransition {
Transformed,
RightCorner,
RoundCorner,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SweepTransformation {
Constant,
MultiSection,
Linear,
SShape,
Interpolation,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct HelicalSweepConstruction {
pub profile: ProfileRef,
pub axis_origin: Point3,
pub axis_direction: Vector3,
pub law: HelicalSweepLaw,
pub pitch: Length,
pub height: Length,
pub turns: f64,
pub radial_growth: Length,
pub cone_angle: Angle,
pub left_handed: bool,
pub reversed: bool,
pub tolerance: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub allow_multi_profile_faces: Option<bool>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HelicalSweepLaw {
PitchHeightAngle,
PitchTurnsAngle,
HeightTurnsAngle,
HeightTurnsGrowth,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct BinderSource {
pub target: BinderTarget,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub subelements: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum BinderTarget {
Feature {
feature: FeatureId,
},
External {
document: String,
object: String,
},
Native {
reference: String,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum BinderConstruction {
Shape {
trace_support: bool,
},
SubShape {
lifecycle: BinderLifecycle,
placement: BinderPlacement,
copy_on_change: BinderCopyOnChange,
claim_children: bool,
fuse: bool,
make_face: bool,
partial_load: bool,
refine: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
offset: Option<BinderOffset>,
#[serde(default, skip_serializing_if = "Option::is_none")]
context: Option<BinderTarget>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum BinderLifecycle {
Synchronized,
Frozen,
Detached,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum BinderPlacement {
Relative,
Global,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum BinderCopyOnChange {
Disabled,
Enabled,
Mutated,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct BinderOffset {
pub distance: Length,
pub join: BinderOffsetJoin,
pub fill: bool,
pub open_result: bool,
pub intersection: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum BinderOffsetJoin {
Arcs,
Tangent,
Intersection,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum ProfileRef {
Unresolved(String),
Native(String),
Sketch(crate::sketches::SketchId),
SketchProfiles {
sketch: crate::sketches::SketchId,
profiles: Vec<u32>,
},
SketchRegions {
sketch: crate::sketches::SketchId,
regions: Vec<SketchProfileRegion>,
},
SketchSelection {
sketch: crate::sketches::SketchId,
selections: Vec<String>,
},
SpatialSketchProfiles {
sketch: crate::sketches::SpatialSketchId,
profiles: Vec<u32>,
},
SpatialSketchSelection {
sketch: crate::sketches::SpatialSketchId,
selections: Vec<String>,
},
HistoricalFaces {
state: FeatureInputTopologyId,
faces: Vec<HistoricalFaceId>,
native: Vec<String>,
},
Feature(FeatureId),
Generated {
curves: Vec<GeneratedCurveRef>,
native: String,
},
Faces(Vec<FaceId>),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(untagged)]
pub enum LoftSection {
Profile(ProfileRef),
Point(LoftPointSection),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum LoftPointSection {
#[serde(rename = "native_point")]
Native(String),
Point(Point3),
Vertex(VertexId),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct GeneratedCurveRef {
pub feature: FeatureId,
pub local_id: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum PathRef {
Unresolved(String),
Native(String),
Sketch(crate::sketches::SketchId),
SpatialSketchSelection {
sketch: crate::sketches::SpatialSketchId,
selections: Vec<String>,
},
Edges(Vec<EdgeId>),
Curves(Vec<CurveId>),
HistoricalEdges {
state: FeatureInputTopologyId,
edges: Vec<HistoricalEdgeId>,
native: String,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum RadiusSpec {
Unresolved {
#[serde(default, skip_serializing_if = "Option::is_none")]
form: Option<RadiusForm>,
},
Constant {
radius: Length,
},
Chordal {
chord_length: Length,
},
Variable {
points: Vec<VariableRadius>,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct FilletGroup {
pub edges: EdgeSelection,
pub radius: RadiusSpec,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tangency_weight: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ChamferGroup {
pub edges: EdgeSelection,
pub spec: ChamferSpec,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum RadiusForm {
Constant,
Chordal,
Variable,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct VariableRadius {
pub parameter: f64,
pub radius: Length,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum ChamferSpec {
Unresolved {
#[serde(default, skip_serializing_if = "Option::is_none")]
form: Option<ChamferForm>,
},
Distance {
distance: Length,
},
TwoDistances {
first: Length,
second: Length,
},
DistanceAngle {
distance: Length,
angle: Angle,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ChamferForm {
Distance,
TwoDistances,
DistanceAngle,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum HoleKind {
Unresolved {
#[serde(default, skip_serializing_if = "Option::is_none")]
form: Option<HoleForm>,
#[serde(default, skip_serializing_if = "Option::is_none")]
counterbore_diameter: Option<Length>,
#[serde(default, skip_serializing_if = "Option::is_none")]
counterbore_depth: Option<Length>,
#[serde(default, skip_serializing_if = "Option::is_none")]
countersink_diameter: Option<Length>,
#[serde(default, skip_serializing_if = "Option::is_none")]
countersink_angle: Option<Angle>,
},
Simple,
Chamfer {
diameter: Length,
angle: Angle,
},
SimpleDrilled {
drill_point_angle: Angle,
},
Counterbore {
diameter: Length,
depth: Length,
},
CounterboreDrilled {
diameter: Length,
depth: Length,
drill_point_angle: Angle,
},
Countersink {
diameter: Length,
angle: Angle,
},
Threaded {
major_diameter: Length,
thread_depth: Length,
#[serde(default, skip_serializing_if = "Option::is_none")]
pitch: Option<Length>,
drill_point_angle: Angle,
},
Counterdrill {
diameter: Length,
depth: Length,
angle: Angle,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct HoleProfileFilter {
pub points: bool,
pub circles: bool,
pub arcs: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum HoleBottom {
Flat,
Angled {
included_angle: Angle,
depth_to_tip: bool,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct HoleSpecification {
pub standard: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub designation: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub class: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fit: Option<String>,
pub threaded: bool,
pub modeled: bool,
pub cosmetic: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pitch: Option<Length>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub major_diameter: Option<Length>,
pub hand: ThreadHand,
pub depth: HoleThreadDepth,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub clearance: Option<Length>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ThreadHand {
Right,
Left,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum HoleThreadDepth {
HoleDepth,
Blind {
depth: Length,
},
TappedStandard,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HoleForm {
Chamfer,
Counterbore,
Counterdrill,
Countersink,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum FlexMode {
Unresolved {
#[serde(default, skip_serializing_if = "Option::is_none")]
form: Option<FlexForm>,
#[serde(default, skip_serializing_if = "Option::is_none")]
angle: Option<Angle>,
#[serde(default, skip_serializing_if = "Option::is_none")]
factor: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
distance: Option<Length>,
},
Bending {
angle: Angle,
},
Twisting {
angle: Angle,
},
Tapering {
factor: f64,
},
Stretching {
distance: Length,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum FlexForm {
Bending,
Twisting,
Tapering,
Stretching,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum PatternKind {
Unresolved {
#[serde(default, skip_serializing_if = "Option::is_none")]
form: Option<PatternForm>,
},
Linear {
#[serde(default, skip_serializing_if = "Option::is_none")]
direction: Option<Vector3>,
spacing: Length,
count: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
second: Option<LinearPatternDirection>,
},
LinearOffsets {
#[serde(default, skip_serializing_if = "Option::is_none")]
direction: Option<Vector3>,
offsets: Vec<Length>,
},
Circular {
axis_origin: Point3,
axis_dir: Vector3,
angle: Angle,
count: u32,
},
CircularAngles {
axis_origin: Point3,
axis_dir: Vector3,
angles: Vec<Angle>,
},
CurveDriven {
#[serde(default, skip_serializing_if = "Option::is_none")]
path: Option<PathRef>,
spacing: Length,
count: u32,
},
Mirror {
plane_origin: Point3,
plane_normal: Vector3,
},
Scale {
center: PatternScaleCenter,
final_factor: f64,
count: u32,
},
Composite {
stages: Vec<PatternStage>,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum PatternScaleCenter {
FirstSeedCentroid,
Point(Point3),
Native(String),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct PatternStage {
pub pattern: Box<PatternKind>,
pub combination: PatternStageCombination,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum PatternStageCombination {
Initialize,
CartesianProduct,
AlignedSlices,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct LinearPatternDirection {
pub direction: Vector3,
pub spacing: Length,
pub count: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum PatternForm {
Linear,
Circular,
CurveDriven,
Mirror,
Scale,
Composite,
}