kittycad_modeling_cmds/
def_enum.rs

1use kittycad_modeling_cmds_macros::define_modeling_cmd_enum;
2use schemars::JsonSchema;
3use serde::{Deserialize, Serialize};
4
5pub use self::each_cmd::*;
6use crate::{self as kittycad_modeling_cmds};
7
8define_modeling_cmd_enum! {
9    pub mod each_cmd {
10        use std::collections::HashSet;
11
12        use crate::{self as kittycad_modeling_cmds};
13        use kittycad_modeling_cmds_macros::{ModelingCmdVariant};
14        use parse_display_derive::{Display, FromStr};
15        use schemars::JsonSchema;
16        use serde::{Deserialize, Serialize};
17        use uuid::Uuid;
18        use crate::shared::CameraViewState;
19
20        use crate::{
21            format::{OutputFormat2d, OutputFormat3d},
22            id::ModelingCmdId,
23            length_unit::LengthUnit,
24            shared::{
25                Angle,
26                ComponentTransform,
27                RelativeTo,
28                CutType,
29                CutStrategy,
30                CameraMovement,
31                ExtrudedFaceInfo, ExtrudeMethod,
32                AnnotationOptions, AnnotationType, CameraDragInteractionType, Color, DistanceType, EntityType,
33                PathComponentConstraintBound, PathComponentConstraintType, PathSegment, PerspectiveCameraParameters,
34                Point2d, Point3d, ExtrudeReference, SceneSelectionType, SceneToolType, Opposite,
35            },
36            units,
37        };
38
39        /// Mike says this usually looks nice.
40        fn default_animation_seconds() -> f64 {
41            0.4
42        }
43
44        /// Default empty uuid vector.
45        fn default_uuid_vector() -> Vec<Uuid> {
46            Vec::new()
47        }
48
49        /// Evaluates the position of a path in one shot (engine utility for kcl executor)
50        #[derive(
51            Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant,
52        )]
53        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
54        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
55        pub struct EngineUtilEvaluatePath {
56            /// The path in json form (the serialized result of the kcl Sketch/Path object
57            pub path_json: String,
58
59            /// The evaluation parameter (path curve parameter in the normalized domain [0, 1])
60            pub t: f64,
61        }
62
63        /// Start a new path.
64        #[derive(
65            Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant,
66        )]
67        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
68        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
69        pub struct StartPath {}
70
71        /// Move the path's "pen".
72        /// If you're in sketch mode, these coordinates are in the local coordinate system,
73        /// not the world's coordinate system.
74        /// For example, say you're sketching on the plane {x: (1,0,0), y: (0,1,0), origin: (0, 0, 50)}.
75        /// In other words, the plane 50 units above the default XY plane. Then, moving the pen
76        /// to (1, 1, 0) with this command uses local coordinates. So, it would move the pen to
77        /// (1, 1, 50) in global coordinates.
78        #[derive(
79            Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant,
80        )]
81        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
82        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
83        pub struct MovePathPen {
84            /// The ID of the command which created the path.
85            pub path: ModelingCmdId,
86            /// Where the path's pen should be.
87            pub to: Point3d<LengthUnit>,
88        }
89
90        /// Extend a path by adding a new segment which starts at the path's "pen".
91        /// If no "pen" location has been set before (via `MovePen`), then the pen is at the origin.
92        #[derive(
93            Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant,
94        )]
95        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
96        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
97        pub struct ExtendPath {
98            /// The ID of the command which created the path.
99            pub path: ModelingCmdId,
100            /// Segment to append to the path.
101            /// This segment will implicitly begin at the current "pen" location.
102            pub segment: PathSegment,
103            /// Optional label to associate with the new path segment.
104            #[serde(default, skip_serializing_if = "Option::is_none")]
105            pub label: Option<String>,
106        }
107
108        /// Command for extruding a solid 2d.
109        #[derive(
110            Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant,
111        )]
112        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
113        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
114        pub struct Extrude {
115            /// Which sketch to extrude.
116            /// Must be a closed 2D solid.
117            pub target: ModelingCmdId,
118            /// How far off the plane to extrude
119            pub distance: LengthUnit,
120            /// Which IDs should the new faces have?
121            /// If this isn't given, the engine will generate IDs.
122            #[serde(default)]
123            pub faces: Option<ExtrudedFaceInfo>,
124            /// Should the extrusion also extrude in the opposite direction?
125            /// If so, this specifies its distance.
126            #[serde(default)]
127            pub opposite: Opposite<LengthUnit>,
128            /// Should the extrusion create a new object or be part of the existing object.
129            #[serde(default)]
130            pub extrude_method: ExtrudeMethod,
131        }
132
133        /// Command for extruding a solid 2d to a reference geometry.
134        #[derive(
135            Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant,
136        )]
137        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
138        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
139        pub struct ExtrudeToReference {
140            /// Which sketch to extrude.
141            /// Must be a closed 2D solid.
142            pub target: ModelingCmdId,
143            /// Reference to extrude to.
144            /// Extrusion occurs along the target's normal until it is as close to the reference as possible.
145            pub reference: ExtrudeReference,
146            /// Which IDs should the new faces have?
147            /// If this isn't given, the engine will generate IDs.
148            #[serde(default)]
149            pub faces: Option<ExtrudedFaceInfo>,
150            /// Should the extrusion create a new object or be part of the existing object.
151            #[serde(default)]
152            pub extrude_method: ExtrudeMethod,
153        }
154
155        fn default_twist_extrude_section_interval() -> Angle {
156            Angle::from_degrees(15.0)
157        }
158
159        /// Command for twist extruding a solid 2d.
160        #[derive(
161            Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant,
162        )]
163        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
164        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
165        pub struct TwistExtrude {
166            /// Which sketch to extrude.
167            /// Must be a closed 2D solid.
168            pub target: ModelingCmdId,
169            /// How far off the plane to extrude
170            pub distance: LengthUnit,
171            /// Which IDs should the new faces have?
172            /// If this isn't given, the engine will generate IDs.
173            #[serde(default)]
174            pub faces: Option<ExtrudedFaceInfo>,
175            /// Center to twist about (relative to 2D sketch)
176            #[serde(default)]
177            pub center_2d: Point2d<f64>,
178            /// Total rotation of the section
179            pub total_rotation_angle: Angle,
180            ///Angle step interval (converted to whole number degrees and bounded between 4° and 90°)
181            #[serde(default = "default_twist_extrude_section_interval")]
182            pub angle_step_size: Angle,
183            ///The twisted surface loft tolerance
184            pub tolerance: LengthUnit,
185        }
186
187        /// Extrude the object along a path.
188        #[derive(
189            Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
190        )]
191        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
192        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
193        pub struct Sweep {
194            /// Which sketch to sweep.
195            /// Must be a closed 2D solid.
196            pub target: ModelingCmdId,
197            /// Path along which to sweep.
198            pub trajectory: ModelingCmdId,
199            /// If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components.
200            pub sectional: bool,
201            /// The maximum acceptable surface gap computed between the revolution surface joints. Must be positive (i.e. greater than zero).
202            pub tolerance: LengthUnit,
203            /// What is this sweep relative to?
204            #[serde(default)]
205            pub relative_to: RelativeTo,
206        }
207
208        /// Command for revolving a solid 2d.
209        #[derive(
210            Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant,
211        )]
212        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
213        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
214        pub struct Revolve {
215            /// Which sketch to revolve.
216            /// Must be a closed 2D solid.
217            pub target: ModelingCmdId,
218            /// The origin of the extrusion axis
219            pub origin: Point3d<LengthUnit>,
220            /// The axis of the extrusion (taken from the origin)
221            pub axis: Point3d<f64>,
222            /// If true, the axis is interpreted within the 2D space of the solid 2D's plane
223            pub axis_is_2d: bool,
224            /// The signed angle of revolution (in degrees, must be <= 360 in either direction)
225            pub angle: Angle,
226            /// The maximum acceptable surface gap computed between the revolution surface joints. Must be positive (i.e. greater than zero).
227            pub tolerance: LengthUnit,
228            /// Should the revolution also revolve in the opposite direction along the given axis?
229            /// If so, this specifies its angle.
230            #[serde(default)]
231            pub opposite: Opposite<Angle>,
232        }
233
234        /// Command for shelling a solid3d face
235        #[derive(
236            Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant,
237        )]
238        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
239        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
240        pub struct Solid3dShellFace {
241            /// Which Solid3D is being shelled.
242            pub object_id: Uuid,
243            /// Which faces to remove, leaving only the shell.
244            pub face_ids: Vec<Uuid>,
245            /// How thick the shell should be.
246            /// Smaller values mean a thinner shell.
247            pub shell_thickness: LengthUnit,
248            /// If true, the Solid3D is made hollow instead of removing the selected faces
249            #[serde(default)]
250            pub hollow: bool,
251        }
252
253        /// Command for revolving a solid 2d about a brep edge
254        #[derive(
255            Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant,
256        )]
257        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
258        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
259        pub struct RevolveAboutEdge {
260            /// Which sketch to revolve.
261            /// Must be a closed 2D solid.
262            pub target: ModelingCmdId,
263            /// The edge to use as the axis of revolution, must be linear and lie in the plane of the solid
264            pub edge_id: Uuid,
265            /// The signed angle of revolution (in degrees, must be <= 360 in either direction)
266            pub angle: Angle,
267            /// The maximum acceptable surface gap computed between the revolution surface joints. Must be positive (i.e. greater than zero).
268            pub tolerance: LengthUnit,
269            /// Should the revolution also revolve in the opposite direction along the given axis?
270            /// If so, this specifies its angle.
271            #[serde(default)]
272            pub opposite: Opposite<Angle>,
273        }
274
275        /// Command for lofting sections to create a solid
276        #[derive(
277            Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant
278        )]
279        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
280        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
281        pub struct Loft {
282            /// The closed section curves to create a lofted solid from.
283            /// Currently, these must be Solid2Ds
284            pub section_ids: Vec<Uuid>,
285            /// Degree of the interpolation. Must be greater than zero.
286            /// For example, use 2 for quadratic, or 3 for cubic interpolation in the V direction.
287            pub v_degree: std::num::NonZeroU32,
288            /// Attempt to approximate rational curves (such as arcs) using a bezier.
289            /// This will remove banding around interpolations between arcs and non-arcs.  It may produce errors in other scenarios
290            /// Over time, this field won't be necessary.
291            pub bez_approximate_rational: bool,
292            /// This can be set to override the automatically determined topological base curve, which is usually the first section encountered.
293            pub base_curve_index: Option<u32>,
294            /// Tolerance
295            pub tolerance: LengthUnit,
296        }
297
298
299        /// Closes a path, converting it to a 2D solid.
300        #[derive(
301            Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant,
302        )]
303        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
304        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
305        pub struct ClosePath {
306            /// Which path to close.
307            pub path_id: Uuid,
308        }
309
310        /// Camera drag started.
311        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
312        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
313        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
314        pub struct CameraDragStart {
315            /// The type of camera drag interaction.
316            pub interaction: CameraDragInteractionType,
317            /// The initial mouse position.
318            pub window: Point2d,
319        }
320
321        /// Camera drag continued.
322        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
323        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
324        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
325        pub struct CameraDragMove {
326            /// The type of camera drag interaction.
327            pub interaction: CameraDragInteractionType,
328            /// The current mouse position.
329            pub window: Point2d,
330            /// Logical timestamp. The client should increment this
331            /// with every event in the current mouse drag. That way, if the
332            /// events are being sent over an unordered channel, the API
333            /// can ignore the older events.
334            pub sequence: Option<u32>,
335        }
336
337        /// Camera drag ended
338        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
339        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
340        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
341        pub struct CameraDragEnd {
342            /// The type of camera drag interaction.
343            pub interaction: CameraDragInteractionType,
344            /// The final mouse position.
345            pub window: Point2d,
346        }
347
348        /// Gets the default camera's camera settings
349        #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
350        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
351        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
352        pub struct DefaultCameraGetSettings {}
353
354        /// Gets the default camera's view state
355        #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
356        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
357        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
358        pub struct DefaultCameraGetView {}
359
360        /// Sets the default camera's view state
361        #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
362        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
363        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
364        pub struct DefaultCameraSetView {
365            /// Camera view state
366            pub view: CameraViewState,
367        }
368
369        /// Change what the default camera is looking at.
370        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
371        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
372        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
373        pub struct DefaultCameraLookAt {
374            /// Where the camera is positioned
375            pub vantage: Point3d,
376            /// What the camera is looking at. Center of the camera's field of vision
377            pub center: Point3d,
378            /// Which way is "up", from the camera's point of view.
379            pub up: Point3d,
380            /// Logical timestamp. The client should increment this
381            /// with every event in the current mouse drag. That way, if the
382            /// events are being sent over an unordered channel, the API
383            /// can ignore the older events.
384            pub sequence: Option<u32>,
385        }
386
387        /// Change what the default camera is looking at.
388        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
389        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
390        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
391        pub struct DefaultCameraPerspectiveSettings {
392            /// Where the camera is positioned
393            pub vantage: Point3d,
394            /// What the camera is looking at. Center of the camera's field of vision
395            pub center: Point3d,
396            /// Which way is "up", from the camera's point of view.
397            pub up: Point3d,
398            /// The field of view angle in the y direction, in degrees.
399            pub fov_y: Option<f32>,
400            /// The distance to the near clipping plane.
401            pub z_near: Option<f32>,
402            /// The distance to the far clipping plane.
403            pub z_far: Option<f32>,
404            /// Logical timestamp. The client should increment this
405            /// with every event in the current mouse drag. That way, if the
406            /// events are being sent over an unordered channel, the API
407            /// can ignore the older events.
408            pub sequence: Option<u32>,
409        }
410
411        /// Adjust zoom of the default camera.
412        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
413        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
414        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
415        pub struct DefaultCameraZoom {
416            /// Move the camera forward along the vector it's looking at,
417            /// by this magnitudedefaultCameraZoom.
418            /// Basically, how much should the camera move forward by.
419            pub magnitude: f32,
420        }
421
422        /// Export a sketch to a file.
423        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
424        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
425        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
426        pub struct Export2d {
427            /// IDs of the entities to be exported.
428            pub entity_ids: Vec<Uuid>,
429            /// The file format to export to.
430            pub format: OutputFormat2d,
431        }
432
433        /// Export the scene to a file.
434        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
435        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
436        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
437        pub struct Export3d {
438            /// IDs of the entities to be exported. If this is empty, then all entities are exported.
439            pub entity_ids: Vec<Uuid>,
440            /// The file format to export to.
441            pub format: OutputFormat3d,
442        }
443
444        /// Export the scene to a file.
445        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
446        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
447        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
448        pub struct Export {
449            /// IDs of the entities to be exported. If this is empty, then all entities are exported.
450            pub entity_ids: Vec<Uuid>,
451            /// The file format to export to.
452            pub format: OutputFormat3d,
453        }
454
455        /// What is this entity's parent?
456        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
457        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
458        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
459        pub struct EntityGetParentId {
460            /// ID of the entity being queried.
461            pub entity_id: Uuid,
462        }
463
464        /// How many children does the entity have?
465        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
466        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
467        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
468        pub struct EntityGetNumChildren {
469            /// ID of the entity being queried.
470            pub entity_id: Uuid,
471        }
472
473        /// What is the UUID of this entity's n-th child?
474        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
475        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
476        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
477        pub struct EntityGetChildUuid {
478            /// ID of the entity being queried.
479            pub entity_id: Uuid,
480            /// Index into the entity's list of children.
481            pub child_index: u32,
482        }
483
484        /// What are all UUIDs of this entity's children?
485        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
486        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
487        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
488        pub struct EntityGetAllChildUuids {
489            /// ID of the entity being queried.
490            pub entity_id: Uuid,
491        }
492
493        /// What are all UUIDs of all the paths sketched on top of this entity?
494        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
495        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
496        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
497        pub struct EntityGetSketchPaths {
498            /// ID of the entity being queried.
499            pub entity_id: Uuid,
500        }
501
502        /// What is the distance between these two entities?
503        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
504        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
505        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
506        pub struct EntityGetDistance {
507            /// ID of the first entity being queried.
508            pub entity_id1: Uuid,
509            /// ID of the second entity being queried.
510            pub entity_id2: Uuid,
511            /// Type of distance to be measured.
512            pub distance_type: DistanceType,
513        }
514
515        /// Create a pattern using this entity by specifying the transform for each desired repetition.
516        /// Transformations are performed in the following order (first applied to last applied): scale, rotate, translate.
517        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
518        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
519        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
520        pub struct EntityClone {
521            /// ID of the entity being cloned.
522            pub entity_id: Uuid,
523        }
524
525        /// Create a pattern using this entity by specifying the transform for each desired repetition.
526        /// Transformations are performed in the following order (first applied to last applied): scale, rotate, translate.
527        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
528        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
529        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
530        pub struct EntityLinearPatternTransform {
531            /// ID of the entity being copied.
532            pub entity_id: Uuid,
533            /// How to transform each repeated solid.
534            /// The 0th transform will create the first copy of the entity.
535            /// The total number of (optional) repetitions equals the size of this list.
536            #[serde(default)]
537            pub transform: Vec<crate::shared::Transform>,
538            /// Alternatively, you could set this key instead.
539            /// If you want to use multiple transforms per item.
540            /// If this is non-empty then the `transform` key must be empty, and vice-versa.
541            #[serde(default)]
542            pub transforms: Vec<Vec<crate::shared::Transform>>,
543        }
544
545        /// Create a linear pattern using this entity.
546        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
547        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
548        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
549        pub struct EntityLinearPattern {
550            /// ID of the entity being copied.
551            pub entity_id: Uuid,
552            /// Axis along which to make the copies.
553            /// For Solid2d patterns, the z component is ignored.
554            pub axis: Point3d<f64>,
555            /// Number of repetitions to make.
556            pub num_repetitions: u32,
557            /// Spacing between repetitions.
558            pub spacing: LengthUnit,
559        }
560        /// Create a circular pattern using this entity.
561        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
562        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
563        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
564        pub struct EntityCircularPattern {
565            /// ID of the entity being copied.
566            pub entity_id: Uuid,
567            /// Axis around which to make the copies.
568            /// For Solid2d patterns, this is ignored.
569            pub axis: Point3d<f64>,
570            /// Point around which to make the copies.
571            /// For Solid2d patterns, the z component is ignored.
572            pub center: Point3d<LengthUnit>,
573            /// Number of repetitions to make.
574            pub num_repetitions: u32,
575            /// Arc angle (in degrees) to place repetitions along.
576            pub arc_degrees: f64,
577            /// Whether or not to rotate the objects as they are copied.
578            pub rotate_duplicates: bool,
579        }
580
581        /// Create a helix using the input cylinder and other specified parameters.
582        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
583        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
584        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
585        pub struct EntityMakeHelix {
586            /// ID of the cylinder.
587            pub cylinder_id: Uuid,
588            /// Number of revolutions.
589            pub revolutions: f64,
590            /// Start angle.
591            #[serde(default)]
592            pub start_angle: Angle,
593            /// Is the helix rotation clockwise?
594            pub is_clockwise: bool,
595            /// Length of the helix. If None, the length of the cylinder will be used instead.
596            pub length: Option<LengthUnit>,
597        }
598
599        /// Create a helix using the specified parameters.
600        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
601        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
602        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
603        pub struct EntityMakeHelixFromParams {
604            /// Radius of the helix.
605            pub radius: LengthUnit,
606            /// Length of the helix.
607            pub length: LengthUnit,
608            /// Number of revolutions.
609            pub revolutions: f64,
610            /// Start angle.
611            #[serde(default)]
612            pub start_angle: Angle,
613            /// Is the helix rotation clockwise?
614            pub is_clockwise: bool,
615            /// Center of the helix at the base of the helix.
616            pub center: Point3d<LengthUnit>,
617            /// Axis of the helix. The helix will be created around and in the direction of this axis.
618            pub axis: Point3d<f64>,
619        }
620
621        /// Create a helix using the specified parameters.
622        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
623        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
624        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
625        pub struct EntityMakeHelixFromEdge {
626            /// Radius of the helix.
627            pub radius: LengthUnit,
628            /// Length of the helix. If None, the length of the edge will be used instead.
629            pub length: Option<LengthUnit>,
630            /// Number of revolutions.
631            pub revolutions: f64,
632            /// Start angle.
633            #[serde(default)]
634            pub start_angle: Angle,
635            /// Is the helix rotation clockwise?
636            pub is_clockwise: bool,
637            /// Edge about which to make the helix.
638            pub edge_id: Uuid,
639        }
640
641        /// Mirror the input entities over the specified axis. (Currently only supports sketches)
642        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
643        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
644        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
645        pub struct EntityMirror {
646            /// ID of the mirror entities.
647            pub ids: Vec<Uuid>,
648            /// Axis to use as mirror.
649            pub axis: Point3d<f64>,
650            /// Point through which the mirror axis passes.
651            pub point: Point3d<LengthUnit>,
652        }
653
654        /// Mirror the input entities over the specified edge. (Currently only supports sketches)
655        #[derive(
656            Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant,
657        )]
658        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
659        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
660        pub struct EntityMirrorAcrossEdge {
661            /// ID of the mirror entities.
662            pub ids: Vec<Uuid>,
663            /// The edge to use as the mirror axis, must be linear and lie in the plane of the solid
664            pub edge_id: Uuid,
665        }
666
667        /// Modifies the selection by simulating a "mouse click" at the given x,y window coordinate
668        /// Returns ID of whatever was selected.
669        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
670        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
671        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
672        pub struct SelectWithPoint {
673            /// Where in the window was selected
674            pub selected_at_window: Point2d,
675            /// What entity was selected?
676            pub selection_type: SceneSelectionType,
677        }
678
679        /// Adds one or more entities (by UUID) to the selection.
680        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
681        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
682        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
683        pub struct SelectAdd {
684            /// Which entities to select
685            pub entities: Vec<Uuid>,
686        }
687
688        /// Removes one or more entities (by UUID) from the selection.
689        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
690        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
691        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
692        pub struct SelectRemove {
693            /// Which entities to unselect
694            pub entities: Vec<Uuid>,
695        }
696
697        /// Removes all of the Objects in the scene
698        #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
699        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
700        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
701        pub struct SceneClearAll {}
702
703        /// Replaces current selection with these entities (by UUID).
704        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
705        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
706        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
707        pub struct SelectReplace {
708            /// Which entities to select
709            pub entities: Vec<Uuid>,
710        }
711
712        /// Changes the current highlighted entity to whichever one is at the given window coordinate.
713        /// If there's no entity at this location, clears the highlight.
714        #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
715        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
716        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
717        pub struct HighlightSetEntity {
718            /// Coordinates of the window being clicked
719            pub selected_at_window: Point2d,
720            /// Logical timestamp. The client should increment this
721            /// with every event in the current mouse drag. That way, if the
722            /// events are being sent over an unordered channel, the API
723            /// can ignore the older events.
724            pub sequence: Option<u32>,
725        }
726
727        /// Changes the current highlighted entity to these entities.
728        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
729        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
730        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
731        pub struct HighlightSetEntities {
732            /// Highlight these entities.
733            pub entities: Vec<Uuid>,
734        }
735
736        /// Create a new annotation
737        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
738        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
739        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
740        pub struct NewAnnotation {
741            /// What should the annotation contain?
742            pub options: AnnotationOptions,
743            /// If true, any existing drawables within the obj will be replaced (the object will be reset)
744            pub clobber: bool,
745            /// What type of annotation to create.
746            pub annotation_type: AnnotationType,
747        }
748
749        /// Update an annotation
750        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
751        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
752        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
753        pub struct UpdateAnnotation {
754            /// Which annotation to update
755            pub annotation_id: Uuid,
756            /// If any of these fields are set, they will overwrite the previous options for the
757            /// annotation.
758            pub options: AnnotationOptions,
759        }
760
761        /// Changes visibility of scene-wide edge lines on brep solids
762        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
763        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
764        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
765        pub struct EdgeLinesVisible {
766            /// Whether or not the edge lines should be hidden.
767            pub hidden: bool,
768        }
769
770        /// Hide or show an object
771        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
772        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
773        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
774        pub struct ObjectVisible {
775            /// Which object to change
776            pub object_id: Uuid,
777            /// Whether or not the object should be hidden.
778            pub hidden: bool,
779        }
780
781        /// Bring an object to the front of the scene
782        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
783        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
784        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
785        pub struct ObjectBringToFront {
786            /// Which object to change
787            pub object_id: Uuid,
788        }
789
790        /// Set the material properties of an object
791        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
792        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
793        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
794        pub struct ObjectSetMaterialParamsPbr {
795            /// Which object to change
796            pub object_id: Uuid,
797            /// Color of the new material
798            pub color: Color,
799            /// Metalness of the new material
800            pub metalness: f32,
801            /// Roughness of the new material
802            pub roughness: f32,
803            /// Ambient Occlusion of the new material
804            pub ambient_occlusion: f32,
805        }
806        /// What type of entity is this?
807        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
808        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
809        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
810        pub struct GetEntityType {
811            /// ID of the entity being queried.
812            pub entity_id: Uuid,
813        }
814
815        /// Gets all faces which use the given edge.
816        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
817        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
818        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
819        pub struct Solid3dGetAllEdgeFaces {
820            /// Which object is being queried.
821            pub object_id: Uuid,
822            /// Which edge you want the faces of.
823            pub edge_id: Uuid,
824        }
825
826        /// Add a hole to a Solid2d object before extruding it.
827        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
828        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
829        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
830        pub struct Solid2dAddHole {
831            /// Which object to add the hole to.
832            pub object_id: Uuid,
833            /// The id of the path to use as the inner profile (hole).
834            pub hole_id: Uuid,
835        }
836
837        /// Gets all edges which are opposite the given edge, across all possible faces.
838        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
839        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
840        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
841        pub struct Solid3dGetAllOppositeEdges {
842            /// Which object is being queried.
843            pub object_id: Uuid,
844            /// Which edge you want the opposites of.
845            pub edge_id: Uuid,
846            /// If given, only faces parallel to this vector will be considered.
847            pub along_vector: Option<Point3d<f64>>,
848        }
849
850        /// Gets the edge opposite the given edge, along the given face.
851        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
852        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
853        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
854        pub struct Solid3dGetOppositeEdge {
855            /// Which object is being queried.
856            pub object_id: Uuid,
857            /// Which edge you want the opposite of.
858            pub edge_id: Uuid,
859            /// Which face is used to figure out the opposite edge?
860            pub face_id: Uuid,
861        }
862
863        /// Gets the next adjacent edge for the given edge, along the given face.
864        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
865        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
866        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
867        pub struct Solid3dGetNextAdjacentEdge {
868            /// Which object is being queried.
869            pub object_id: Uuid,
870            /// Which edge you want the opposite of.
871            pub edge_id: Uuid,
872            /// Which face is used to figure out the opposite edge?
873            pub face_id: Uuid,
874        }
875
876        /// Gets the previous adjacent edge for the given edge, along the given face.
877        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
878        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
879        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
880        pub struct Solid3dGetPrevAdjacentEdge {
881            /// Which object is being queried.
882            pub object_id: Uuid,
883            /// Which edge you want the opposite of.
884            pub edge_id: Uuid,
885            /// Which face is used to figure out the opposite edge?
886            pub face_id: Uuid,
887        }
888
889        /// Gets the shared edge between these two faces if it exists
890        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
891        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
892        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
893        pub struct Solid3dGetCommonEdge {
894            /// Which object is being queried.
895            pub object_id: Uuid,
896            /// The faces being queried
897            pub face_ids: [Uuid; 2]
898        }
899
900        /// Fillets the given edge with the specified radius.
901        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
902        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
903        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
904        pub struct Solid3dFilletEdge {
905            /// Which object is being filletted.
906            pub object_id: Uuid,
907            /// Which edge you want to fillet.
908            #[serde(default)]
909            pub edge_id: Option<Uuid>,
910            /// Which edges you want to fillet.
911            #[serde(default)]
912            pub edge_ids: Vec<Uuid>,
913            /// The radius of the fillet. Measured in length (using the same units that the current sketch uses). Must be positive (i.e. greater than zero).
914            pub radius: LengthUnit,
915            /// The maximum acceptable surface gap computed between the filleted surfaces. Must be positive (i.e. greater than zero).
916            pub tolerance: LengthUnit,
917            /// How to apply the cut.
918            #[serde(default)]
919            pub cut_type: CutType,
920            /// Which cutting algorithm to use.
921            #[serde(default)]
922            pub strategy: CutStrategy,
923            /// What IDs should the resulting faces have?
924            /// If you've only passed one edge ID, its ID will
925            /// be the command ID used to send this command, and this
926            /// field should be empty.
927            /// If you've passed `n` IDs (to fillet `n` edges), then
928            /// this should be length `n-1`, and the first edge will use
929            /// the command ID used to send this command.
930            #[serde(default)]
931            pub extra_face_ids: Vec<Uuid>,
932        }
933
934        /// Determines whether a brep face is planar and returns its surface-local planar axes if so
935        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
936        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
937        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
938        pub struct FaceIsPlanar {
939            /// Which face is being queried.
940            pub object_id: Uuid,
941        }
942
943        /// Determines a position on a brep face evaluated by parameters u,v
944        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
945        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
946        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
947        pub struct FaceGetPosition {
948            /// Which face is being queried.
949            pub object_id: Uuid,
950
951            /// The 2D parameter-space u,v position to evaluate the surface at
952            pub uv: Point2d<f64>,
953        }
954
955        ///Obtains the surface "center of mass"
956        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
957        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
958        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
959        pub struct FaceGetCenter {
960            /// Which face is being queried.
961            pub object_id: Uuid,
962        }
963
964        /// Determines the gradient (dFdu, dFdv) + normal vector on a brep face evaluated by parameters u,v
965        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
966        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
967        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
968        pub struct FaceGetGradient {
969            /// Which face is being queried.
970            pub object_id: Uuid,
971
972            /// The 2D parameter-space u,v position to evaluate the surface at
973            pub uv: Point2d<f64>,
974        }
975
976        /// Send object to front or back.
977        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
978        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
979        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
980        pub struct SendObject {
981            /// Which object is being changed.
982            pub object_id: Uuid,
983            /// Bring to front = true, send to back = false.
984            pub front: bool,
985        }
986        /// Set opacity of the entity.
987        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
988        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
989        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
990        pub struct EntitySetOpacity {
991            /// Which entity is being changed.
992            pub entity_id: Uuid,
993            /// How transparent should it be?
994            /// 0 or lower is totally transparent.
995            /// 1 or greater is totally opaque.
996            pub opacity: f32,
997        }
998
999        /// Fade entity in or out.
1000        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1001        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1002        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1003        pub struct EntityFade {
1004            /// Which entity is being changed.
1005            pub entity_id: Uuid,
1006            /// Fade in = true, fade out = false.
1007            pub fade_in: bool,
1008            /// How many seconds the animation should take.
1009            #[serde(default = "default_animation_seconds")]
1010            pub duration_seconds: f64,
1011        }
1012
1013        /// Make a new plane
1014        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1015        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1016        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1017        pub struct MakePlane {
1018            /// Origin of the plane
1019            pub origin: Point3d<LengthUnit>,
1020            /// What should the plane's X axis be?
1021            pub x_axis: Point3d<f64>,
1022            /// What should the plane's Y axis be?
1023            pub y_axis: Point3d<f64>,
1024            /// What should the plane's span/extent?
1025            /// When rendered visually, this is both the
1026            /// width and height along X and Y axis respectively.
1027            pub size: LengthUnit,
1028            /// If true, any existing drawables within the obj will be replaced (the object will be reset)
1029            pub clobber: bool,
1030            /// If true, the plane will be created but hidden initially.
1031            pub hide: Option<bool>,
1032        }
1033
1034        /// Set the color of a plane.
1035        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1036        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1037        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1038        pub struct PlaneSetColor {
1039            /// Which plane is being changed.
1040            pub plane_id: Uuid,
1041            /// What color it should be.
1042            pub color: Color,
1043        }
1044
1045        /// Set the current tool.
1046        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1047        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1048        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1049        pub struct SetTool {
1050            /// What tool should be active.
1051            pub tool: SceneToolType,
1052        }
1053
1054        /// Send a mouse move event
1055        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1056        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1057        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1058        pub struct MouseMove {
1059            /// Where the mouse is
1060            pub window: Point2d,
1061            /// Logical timestamp. The client should increment this
1062            /// with every event in the current mouse drag. That way, if the
1063            /// events are being sent over an unordered channel, the API
1064            /// can ignore the older events.
1065            pub sequence: Option<u32>,
1066        }
1067
1068        /// Send a mouse click event
1069        /// Updates modified/selected entities.
1070        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1071        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1072        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1073        pub struct MouseClick {
1074            /// Where the mouse is
1075            pub window: Point2d,
1076        }
1077
1078        /// Disable sketch mode.
1079        /// If you are sketching on a face, be sure to not disable sketch mode until you have extruded.
1080        /// Otherwise, your object will not be fused with the face.
1081        #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1082        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1083        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1084        pub struct SketchModeDisable {}
1085
1086        /// Get the plane for sketch mode.
1087        #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1088        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1089        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1090        pub struct GetSketchModePlane {}
1091
1092        /// Get the plane for sketch mode.
1093        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1094        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1095        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1096        pub struct CurveSetConstraint {
1097            /// Which curve to constrain.
1098            pub object_id: Uuid,
1099            /// Which constraint to apply.
1100            pub constraint_bound: PathComponentConstraintBound,
1101            /// What part of the curve should be constrained.
1102            pub constraint_type: PathComponentConstraintType,
1103        }
1104
1105        /// Sketch on some entity (e.g. a plane, a face).
1106        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1107        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1108        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1109        pub struct EnableSketchMode {
1110            /// Which entity to sketch on.
1111            pub entity_id: Uuid,
1112            /// Should the camera use orthographic projection?
1113            /// In other words, should an object's size in the rendered image stay constant regardless of its distance from the camera.
1114            pub ortho: bool,
1115            /// Should we animate or snap for the camera transition?
1116            pub animated: bool,
1117            /// Should the camera move at all?
1118            pub adjust_camera: bool,
1119            /// If provided, ensures that the normal of the sketch plane must be aligned with this supplied normal
1120            /// (otherwise the camera position will be used to infer the normal to point towards the viewer)
1121            pub planar_normal: Option<Point3d<f64>>,
1122        }
1123
1124        /// Sets whether or not changes to the scene or its objects will be done as a "dry run"
1125        /// In a dry run, successful commands won't actually change the model.
1126        /// This is useful for catching errors before actually making the change.
1127        #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1128        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1129        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1130        pub struct EnableDryRun {}
1131
1132        /// Sets whether or not changes to the scene or its objects will be done as a "dry run"
1133        /// In a dry run, successful commands won't actually change the model.
1134        /// This is useful for catching errors before actually making the change.
1135        #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1136        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1137        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1138        pub struct DisableDryRun {}
1139
1140        /// Set the background color of the scene.
1141        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1142        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1143        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1144        pub struct SetBackgroundColor {
1145            /// The color to set the background to.
1146            pub color: Color,
1147        }
1148
1149        /// Set the properties of the tool lines for the scene.
1150        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1151        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1152        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1153        pub struct SetCurrentToolProperties {
1154            /// The color to set the tool line to.
1155            pub color: Option<Color>,
1156        }
1157
1158        /// Set the default system properties used when a specific property isn't set.
1159        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1160        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1161        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1162        pub struct SetDefaultSystemProperties {
1163            /// The default system color.
1164            pub color: Option<Color>,
1165        }
1166
1167        /// Get type of the given curve.
1168        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1169        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1170        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1171        pub struct CurveGetType {
1172            /// Which curve to query.
1173            pub curve_id: Uuid,
1174        }
1175
1176        /// Get control points of the given curve.
1177        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1178        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1179        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1180        pub struct CurveGetControlPoints {
1181            /// Which curve to query.
1182            pub curve_id: Uuid,
1183        }
1184
1185        /// Project an entity on to a plane.
1186        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1187        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1188        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1189        pub struct ProjectEntityToPlane {
1190            /// Which entity to project (vertex or edge).
1191            pub entity_id: Uuid,
1192            /// Which plane to project entity_id onto.
1193            pub plane_id: Uuid,
1194            /// If true: the projected points are returned in the plane_id's coordinate system,
1195            /// else: the projected points are returned in the world coordinate system.
1196            pub use_plane_coords: bool,
1197        }
1198
1199        /// Project a list of points on to a plane.
1200        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1201        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1202        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1203        pub struct ProjectPointsToPlane {
1204            /// The id of the plane used for the projection.
1205            pub plane_id: Uuid,
1206            /// The list of points that will be projected.
1207            pub points: Vec<Point3d<f64>>,
1208            /// If true: the projected points are returned in the plane_id's coordinate sysetm.
1209            /// else: the projected points are returned in the world coordinate system.
1210            pub use_plane_coords: bool,
1211        }
1212
1213        /// Enum containing the variety of image formats snapshots may be exported to.
1214        #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema, FromStr, Display)]
1215        #[serde(rename_all = "snake_case")]
1216        #[display(style = "snake_case")]
1217        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1218        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1219        #[cfg_attr(feature = "python", pyo3::pyclass, pyo3_stub_gen::derive::gen_stub_pyclass_enum)]
1220        pub enum ImageFormat {
1221            /// .png format
1222            Png,
1223            /// .jpeg format
1224            Jpeg,
1225        }
1226
1227        /// Take a snapshot of the current view.
1228        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1229        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1230        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1231        pub struct TakeSnapshot {
1232            /// What image format to return.
1233            pub format: ImageFormat,
1234        }
1235
1236        /// Add a gizmo showing the axes.
1237        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1238        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1239        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1240        pub struct MakeAxesGizmo {
1241            /// If true, axes gizmo will be placed in the corner of the screen.
1242            /// If false, it will be placed at the origin of the scene.
1243            pub gizmo_mode: bool,
1244            /// If true, any existing drawables within the obj will be replaced (the object will be reset)
1245            pub clobber: bool,
1246        }
1247
1248        /// Query the given path.
1249        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1250        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1251        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1252        pub struct PathGetInfo {
1253            /// Which path to query
1254            pub path_id: Uuid,
1255        }
1256
1257        /// Obtain curve ids for vertex ids
1258        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1259        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1260        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1261        pub struct PathGetCurveUuidsForVertices {
1262            /// Which path to query
1263            pub path_id: Uuid,
1264
1265            /// IDs of the vertices for which to obtain curve ids from
1266            pub vertex_ids: Vec<Uuid>,
1267        }
1268
1269        /// Obtain curve id by index
1270        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1271        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1272        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1273        pub struct PathGetCurveUuid {
1274            /// Which path to query
1275            pub path_id: Uuid,
1276
1277            /// IDs of the vertices for which to obtain curve ids from
1278            pub index: u32,
1279        }
1280
1281        /// Obtain vertex ids for a path
1282        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1283        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1284        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1285        pub struct PathGetVertexUuids {
1286            /// Which path to query
1287            pub path_id: Uuid,
1288        }
1289
1290        /// Obtain the sketch target id (if the path was drawn in sketchmode) for a path
1291        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1292        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1293        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1294        pub struct PathGetSketchTargetUuid {
1295            /// Which path to query
1296            pub path_id: Uuid,
1297        }
1298
1299        /// Start dragging the mouse.
1300        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1301        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1302        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1303        pub struct HandleMouseDragStart {
1304            /// The mouse position.
1305            pub window: Point2d,
1306        }
1307
1308        /// Continue dragging the mouse.
1309        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1310        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1311        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1312        pub struct HandleMouseDragMove {
1313            /// The mouse position.
1314            pub window: Point2d,
1315            /// Logical timestamp. The client should increment this
1316            /// with every event in the current mouse drag. That way, if the
1317            /// events are being sent over an unordered channel, the API
1318            /// can ignore the older events.
1319            pub sequence: Option<u32>,
1320        }
1321
1322        /// Stop dragging the mouse.
1323        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1324        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1325        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1326        pub struct HandleMouseDragEnd {
1327            /// The mouse position.
1328            pub window: Point2d,
1329        }
1330
1331        /// Remove scene objects.
1332        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1333        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1334        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1335        pub struct RemoveSceneObjects {
1336            /// Objects to remove.
1337            pub object_ids: HashSet<Uuid>,
1338        }
1339
1340        /// Utility method. Performs both a ray cast and projection to plane-local coordinates.
1341        /// Returns the plane coordinates for the given window coordinates.
1342        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1343        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1344        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1345        pub struct PlaneIntersectAndProject {
1346            /// The plane you're intersecting against.
1347            pub plane_id: Uuid,
1348            /// Window coordinates where the ray cast should be aimed.
1349            pub window: Point2d,
1350        }
1351
1352        /// Find the start and end of a curve.
1353        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1354        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1355        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1356        pub struct CurveGetEndPoints {
1357            /// ID of the curve being queried.
1358            pub curve_id: Uuid,
1359        }
1360
1361        /// Reconfigure the stream.
1362        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1363        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1364        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1365        pub struct ReconfigureStream {
1366            /// Width of the stream.
1367            pub width: u32,
1368            /// Height of the stream.
1369            pub height: u32,
1370            /// Frames per second.
1371            pub fps: u32,
1372            /// Video feed's constant bitrate (CBR)
1373            #[serde(default)]
1374            pub bitrate: Option<u32>,
1375        }
1376
1377        /// Import files to the current model.
1378        #[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1379        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1380        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1381        pub struct ImportFiles {
1382            /// Files to import.
1383            pub files: Vec<super::ImportFile>,
1384            /// Input file format.
1385            pub format: crate::format::InputFormat3d,
1386        }
1387
1388        /// Set the units of the scene.
1389        /// For all following commands, the units will be interpreted as the given units.
1390        /// Any previously executed commands will not be affected or have their units changed.
1391        /// They will remain in the units they were originally executed in.
1392        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1393        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1394        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1395        pub struct SetSceneUnits {
1396            /// Which units the scene uses.
1397            pub unit: units::UnitLength,
1398        }
1399
1400        /// Get the mass of entities in the scene or the default scene.
1401        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1402        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1403        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1404        pub struct Mass {
1405            /// IDs of the entities to get the mass of. If this is empty, then the default scene is included in
1406            /// the mass.
1407            pub entity_ids: Vec<Uuid>,
1408            /// The material density.
1409            pub material_density: f64,
1410            /// The material density unit.
1411            pub material_density_unit: units::UnitDensity,
1412            /// The output unit for the mass.
1413            pub output_unit: units::UnitMass,
1414        }
1415
1416        /// Get the density of entities in the scene or the default scene.
1417        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1418        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1419        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1420        pub struct Density {
1421            /// IDs of the entities to get the density of. If this is empty, then the default scene is included in
1422            /// the density.
1423            pub entity_ids: Vec<Uuid>,
1424            /// The material mass.
1425            pub material_mass: f64,
1426            /// The material mass unit.
1427            pub material_mass_unit: units::UnitMass,
1428            /// The output unit for the density.
1429            pub output_unit: units::UnitDensity,
1430        }
1431
1432        /// Get the volume of entities in the scene or the default scene.
1433        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1434        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1435        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1436        pub struct Volume {
1437            /// IDs of the entities to get the volume of. If this is empty, then the default scene is included in
1438            /// the volume.
1439            pub entity_ids: Vec<Uuid>,
1440            /// The output unit for the volume.
1441            pub output_unit: units::UnitVolume,
1442        }
1443
1444        /// Get the center of mass of entities in the scene or the default scene.
1445        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1446        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1447        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1448        pub struct CenterOfMass {
1449            /// IDs of the entities to get the center of mass of. If this is empty, then the default scene is included in
1450            /// the center of mass.
1451            pub entity_ids: Vec<Uuid>,
1452            /// The output unit for the center of mass.
1453            pub output_unit: units::UnitLength,
1454        }
1455
1456        /// Get the surface area of entities in the scene or the default scene.
1457        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1458        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1459        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1460        pub struct SurfaceArea {
1461            /// IDs of the entities to get the surface area of. If this is empty, then the default scene is included in
1462            /// the surface area.
1463            pub entity_ids: Vec<Uuid>,
1464            /// The output unit for the surface area.
1465            pub output_unit: units::UnitArea,
1466        }
1467
1468        /// Focus the default camera upon an object in the scene.
1469        #[derive(
1470            Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1471        )]
1472        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1473        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1474        pub struct DefaultCameraFocusOn {
1475            /// UUID of object to focus on.
1476            pub uuid: Uuid,
1477        }
1478        /// When you select some entity with the current tool, what should happen to the entity?
1479        #[derive(
1480            Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1481        )]
1482        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1483        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1484        pub struct SetSelectionType {
1485            /// What type of selection should occur when you select something?
1486            pub selection_type: SceneSelectionType,
1487        }
1488
1489        /// What kind of entities can be selected?
1490        #[derive(
1491            Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1492        )]
1493        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1494        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1495        pub struct SetSelectionFilter {
1496            /// If vector is empty, clear all filters.
1497            /// If vector is non-empty, only the given entity types will be selectable.
1498            pub filter: Vec<EntityType>,
1499        }
1500
1501        /// Use orthographic projection.
1502        #[derive(
1503            Clone, Debug, Default, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1504        )]
1505        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1506        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1507        pub struct DefaultCameraSetOrthographic {}
1508
1509        /// Use perspective projection.
1510        #[derive(
1511            Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1512        )]
1513        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1514        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1515        pub struct DefaultCameraSetPerspective {
1516            /// If this is not given, use the same parameters as last time the perspective camera was used.
1517            pub parameters: Option<PerspectiveCameraParameters>,
1518        }
1519
1520        ///Updates the camera to center to the center of the current selection
1521        ///(or the origin if nothing is selected)
1522        #[derive(
1523            Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1524        )]
1525        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1526        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1527        pub struct DefaultCameraCenterToSelection {
1528            /// Dictates whether or not the camera position should be adjusted during this operation
1529            /// If no movement is requested, the camera will orbit around the new center from its current position
1530            #[serde(default)]
1531            pub camera_movement: CameraMovement,
1532        }
1533
1534        ///Updates the camera to center to the center of the current scene's bounds
1535        #[derive(
1536            Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1537        )]
1538        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1539        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1540        pub struct DefaultCameraCenterToScene {
1541            /// Dictates whether or not the camera position should be adjusted during this operation
1542            /// If no movement is requested, the camera will orbit around the new center from its current position
1543            #[serde(default)]
1544            pub camera_movement: CameraMovement,
1545        }
1546
1547        /// Fit the view to the specified object(s).
1548        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1549        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1550        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1551        pub struct ZoomToFit {
1552            /// Which objects to fit camera to; if empty, fit to all non-default objects. Defaults to empty vector.
1553            #[serde(default = "default_uuid_vector")]
1554            pub object_ids: Vec<Uuid>,
1555            /// How much to pad the view frame by, as a fraction of the object(s) bounding box size.
1556            /// Negative padding will crop the view of the object proportionally.
1557            /// e.g. padding = 0.2 means the view will span 120% of the object(s) bounding box,
1558            /// and padding = -0.2 means the view will span 80% of the object(s) bounding box.
1559            #[serde(default)]
1560            pub padding: f32,
1561            /// Whether or not to animate the camera movement.
1562            #[serde(default)]
1563            pub animated: bool,
1564        }
1565
1566        /// Looks along the normal of the specified face (if it is planar!), and fits the view to it.
1567        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1568        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1569        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1570        pub struct OrientToFace {
1571            /// Which face to orient camera to. If the face is not planar, no action will occur.
1572            pub face_id: Uuid,
1573            /// How much to pad the view frame by, as a fraction of the face bounding box size.
1574            /// Negative padding will crop the view of the face proportionally.
1575            /// e.g. padding = 0.2 means the view will span 120% of the face bounding box,
1576            /// and padding = -0.2 means the view will span 80% of the face bounding box.
1577            #[serde(default)]
1578            pub padding: f32,
1579            /// Whether or not to animate the camera movement. (Animation is currently not supported.)
1580            #[serde(default)]
1581            pub animated: bool,
1582        }
1583
1584        /// Fit the view to the scene with an isometric view.
1585        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1586        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1587        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1588        pub struct ViewIsometric {
1589            /// How much to pad the view frame by, as a fraction of the object(s) bounding box size.
1590            /// Negative padding will crop the view of the object proportionally.
1591            /// e.g. padding = 0.2 means the view will span 120% of the object(s) bounding box,
1592            /// and padding = -0.2 means the view will span 80% of the object(s) bounding box.
1593            #[serde(default = "f32::default")]
1594            pub padding: f32,
1595        }
1596
1597        /// Get a concise description of all of an extrusion's faces.
1598        #[derive(Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1599        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1600        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1601        pub struct Solid3dGetExtrusionFaceInfo {
1602            /// The Solid3d object whose extrusion is being queried.
1603            pub object_id: Uuid,
1604            /// Any edge that lies on the extrusion base path.
1605            pub edge_id: Uuid,
1606        }
1607
1608        /// Get a concise description of all of solids edges.
1609        #[derive(Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1610        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1611        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1612        pub struct Solid3dGetAdjacencyInfo {
1613            /// The Solid3d object whose info is being queried.
1614            pub object_id: Uuid,
1615            /// Any edge that lies on the extrusion base path.
1616            pub edge_id: Uuid,
1617        }
1618
1619
1620        /// Clear the selection
1621        #[derive(Clone, Debug, Default, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1622        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1623        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1624        pub struct SelectClear {}
1625
1626        /// Find all IDs of selected entities
1627        #[derive(Clone, Debug, Default, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1628        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1629        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1630        pub struct SelectGet {}
1631
1632        /// Get the number of objects in the scene
1633        #[derive(
1634            Clone, Debug, Default, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1635        )]
1636        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1637        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1638        pub struct GetNumObjects {}
1639
1640        ///Set the transform of an object.
1641        #[derive(
1642            Clone, Debug, Deserialize, PartialEq, JsonSchema, Serialize, ModelingCmdVariant,
1643        )]
1644        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1645        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1646        pub struct SetObjectTransform
1647        {
1648            /// Id of the object whose transform is to be set.
1649            pub object_id: Uuid,
1650            /// List of transforms to be applied to the object.
1651            pub transforms: Vec<ComponentTransform>,
1652        }
1653
1654        /// Create a new solid from combining other smaller solids.
1655        /// In other words, every part of the input solids will be included in the output solid.
1656        #[derive(
1657            Clone, Debug, Deserialize, PartialEq, JsonSchema, Serialize, ModelingCmdVariant,
1658        )]
1659        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1660        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1661        pub struct BooleanUnion
1662        {
1663            /// Which solids to union together.
1664            /// Cannot be empty.
1665            pub solid_ids: Vec<Uuid>,
1666            /// The maximum acceptable surface gap computed between the joined solids. Must be positive (i.e. greater than zero).
1667            pub tolerance: LengthUnit,
1668        }
1669
1670        /// Create a new solid from intersecting several other solids.
1671        /// In other words, the part of the input solids where they all overlap will be the output solid.
1672        #[derive(
1673            Clone, Debug, Deserialize, PartialEq, JsonSchema, Serialize, ModelingCmdVariant,
1674        )]
1675        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1676        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1677        pub struct BooleanIntersection
1678        {
1679            /// Which solids to intersect together
1680            pub solid_ids: Vec<Uuid>,
1681            /// The maximum acceptable surface gap computed between the joined solids. Must be positive (i.e. greater than zero).
1682            pub tolerance: LengthUnit,
1683        }
1684
1685        /// Create a new solid from subtracting several other solids.
1686        /// The 'target' is what will be cut from.
1687        /// The 'tool' is what will be cut out from 'target'.
1688        #[derive(
1689            Clone, Debug, Deserialize, PartialEq, JsonSchema, Serialize, ModelingCmdVariant,
1690        )]
1691        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1692        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1693        pub struct BooleanSubtract
1694        {
1695            /// Geometry to cut out from.
1696            pub target_ids: Vec<Uuid>,
1697            /// Will be cut out from the 'target'.
1698            pub tool_ids: Vec<Uuid>,
1699            /// The maximum acceptable surface gap computed between the target and the solids cut out from it. Must be positive (i.e. greater than zero).
1700            pub tolerance: LengthUnit,
1701        }
1702
1703        /// Make a new path by offsetting an object by a given distance.
1704        /// The new path's ID will be the ID of this command.
1705        #[derive(Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1706        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1707        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1708        pub struct MakeOffsetPath {
1709            /// The object that will be offset (can be a path, sketch, or a solid)
1710            pub object_id: Uuid,
1711            /// If the object is a solid, this is the ID of the face to base the offset on.
1712            /// If given, and `object_id` refers to a solid, then this face on the solid will be offset.
1713            /// If given but `object_id` doesn't refer to a solid, responds with an error.
1714            /// If not given, then `object_id` itself will be offset directly.
1715            #[serde(default)]
1716            pub face_id: Option<Uuid>,
1717            /// The distance to offset the path (positive for outset, negative for inset)
1718            pub offset: LengthUnit,
1719        }
1720
1721        /// Add a hole to a closed path by offsetting it a uniform distance inward.
1722        #[derive(Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1723        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1724        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1725        pub struct AddHoleFromOffset {
1726            /// The closed path to add a hole to.
1727            pub object_id: Uuid,
1728            /// The distance to offset the path (positive for outset, negative for inset)
1729            pub offset: LengthUnit,
1730        }
1731
1732        /// Align the grid with a plane or a planar face.
1733        #[derive(Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1734        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1735        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1736        pub struct SetGridReferencePlane {
1737            /// The grid to be moved.
1738            pub grid_id: Uuid,
1739            /// The plane or face that the grid will be aligned to.
1740            /// If a face, it must be planar to succeed.
1741            pub reference_id: Uuid,
1742        }
1743
1744        /// Set the scale of the grid lines in the video feed.
1745        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1746        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1747        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1748        pub struct SetGridScale {
1749            /// Distance between grid lines represents this much distance.
1750            pub value: f32,
1751            /// Which units the `value` field uses.
1752            pub units: units::UnitLength,
1753        }
1754        /// Set the grid lines to auto scale. The grid will get larger the further you zoom out,
1755        /// and smaller the more you zoom in.
1756        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1757        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1758        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1759        pub struct SetGridAutoScale {
1760        }
1761    }
1762}
1763
1764impl ModelingCmd {
1765    /// Is this command safe to run in an engine batch?
1766    pub fn is_safe_to_batch(&self) -> bool {
1767        use ModelingCmd::*;
1768        matches!(
1769            self,
1770            MovePathPen(_)
1771                | ExtendPath(_)
1772                | Extrude(_)
1773                | Revolve(_)
1774                | Solid3dFilletEdge(_)
1775                | ClosePath(_)
1776                | UpdateAnnotation(_)
1777                | ObjectVisible(_)
1778                | ObjectBringToFront(_)
1779                | Solid2dAddHole(_)
1780                | SendObject(_)
1781                | EntitySetOpacity(_)
1782                | PlaneSetColor(_)
1783                | SetTool(_)
1784        )
1785    }
1786}
1787
1788/// File to import into the current model.
1789/// If you are sending binary data for a file, be sure to send the WebSocketRequest as
1790/// binary/bson, not text/json.
1791#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, Eq, PartialEq)]
1792#[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1793#[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1794pub struct ImportFile {
1795    /// The file's full path, including file extension.
1796    pub path: String,
1797    /// The raw bytes of the file
1798    #[serde(
1799        serialize_with = "serde_bytes::serialize",
1800        deserialize_with = "serde_bytes::deserialize"
1801    )]
1802    pub data: Vec<u8>,
1803}