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, CutTypeV2,
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            /// Color of the backface
806            #[serde(default, skip_serializing_if = "Option::is_none")]
807            pub backface_color: Option<Color>,
808        }
809        /// What type of entity is this?
810        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
811        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
812        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
813        pub struct GetEntityType {
814            /// ID of the entity being queried.
815            pub entity_id: Uuid,
816        }
817
818        /// Gets all faces which use the given edge.
819        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
820        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
821        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
822        pub struct Solid3dGetAllEdgeFaces {
823            /// Which object is being queried.
824            pub object_id: Uuid,
825            /// Which edge you want the faces of.
826            pub edge_id: Uuid,
827        }
828
829        /// Add a hole to a Solid2d object before extruding it.
830        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
831        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
832        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
833        pub struct Solid2dAddHole {
834            /// Which object to add the hole to.
835            pub object_id: Uuid,
836            /// The id of the path to use as the inner profile (hole).
837            pub hole_id: Uuid,
838        }
839
840        /// Gets all edges which are opposite the given edge, across all possible faces.
841        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
842        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
843        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
844        pub struct Solid3dGetAllOppositeEdges {
845            /// Which object is being queried.
846            pub object_id: Uuid,
847            /// Which edge you want the opposites of.
848            pub edge_id: Uuid,
849            /// If given, only faces parallel to this vector will be considered.
850            pub along_vector: Option<Point3d<f64>>,
851        }
852
853        /// Gets the edge opposite the given edge, along the given face.
854        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
855        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
856        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
857        pub struct Solid3dGetOppositeEdge {
858            /// Which object is being queried.
859            pub object_id: Uuid,
860            /// Which edge you want the opposite of.
861            pub edge_id: Uuid,
862            /// Which face is used to figure out the opposite edge?
863            pub face_id: Uuid,
864        }
865
866        /// Gets the next adjacent edge for the given edge, along the given face.
867        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
868        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
869        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
870        pub struct Solid3dGetNextAdjacentEdge {
871            /// Which object is being queried.
872            pub object_id: Uuid,
873            /// Which edge you want the opposite of.
874            pub edge_id: Uuid,
875            /// Which face is used to figure out the opposite edge?
876            pub face_id: Uuid,
877        }
878
879        /// Gets the previous adjacent edge for the given edge, along the given face.
880        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
881        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
882        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
883        pub struct Solid3dGetPrevAdjacentEdge {
884            /// Which object is being queried.
885            pub object_id: Uuid,
886            /// Which edge you want the opposite of.
887            pub edge_id: Uuid,
888            /// Which face is used to figure out the opposite edge?
889            pub face_id: Uuid,
890        }
891
892        /// Gets the shared edge between these two faces if it exists
893        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
894        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
895        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
896        pub struct Solid3dGetCommonEdge {
897            /// Which object is being queried.
898            pub object_id: Uuid,
899            /// The faces being queried
900            pub face_ids: [Uuid; 2]
901        }
902
903        /// Fillets the given edge with the specified radius.
904        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
905        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
906        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
907        pub struct Solid3dFilletEdge {
908            /// Which object is being filletted.
909            pub object_id: Uuid,
910            /// Which edge you want to fillet.
911            #[serde(default)]
912            pub edge_id: Option<Uuid>,
913            /// Which edges you want to fillet.
914            #[serde(default)]
915            pub edge_ids: Vec<Uuid>,
916            /// 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).
917            pub radius: LengthUnit,
918            /// The maximum acceptable surface gap computed between the filleted surfaces. Must be positive (i.e. greater than zero).
919            pub tolerance: LengthUnit,
920            /// How to apply the cut.
921            #[serde(default)]
922            pub cut_type: CutType,
923            /// Which cutting algorithm to use.
924            #[serde(default)]
925            pub strategy: CutStrategy,
926            /// What IDs should the resulting faces have?
927            /// If you've only passed one edge ID, its ID will
928            /// be the command ID used to send this command, and this
929            /// field should be empty.
930            /// If you've passed `n` IDs (to fillet `n` edges), then
931            /// this should be length `n-1`, and the first edge will use
932            /// the command ID used to send this command.
933            #[serde(default)]
934            pub extra_face_ids: Vec<Uuid>,
935        }
936
937        /// Cut the list of given edges with the given cut parameters.
938        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
939        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
940        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
941        pub struct Solid3dCutEdges {
942            /// Which object is being cut.
943            pub object_id: Uuid,
944            /// Which edges you want to cut.
945            #[serde(default)]
946            pub edge_ids: Vec<Uuid>,
947            /// The cut type and information required to perform the cut.
948            pub cut_type: CutTypeV2,
949            /// The maximum acceptable surface gap computed between the cut surfaces. Must be
950            /// positive (i.e. greater than zero).
951            pub tolerance: LengthUnit,
952            /// Which cutting algorithm to use.
953            #[serde(default)]
954            pub strategy: CutStrategy,
955            /// What IDs should the resulting faces have?
956            /// If you've only passed one edge ID, its ID will
957            /// be the command ID used to send this command, and this
958            /// field should be empty.
959            /// If you've passed `n` IDs (to cut `n` edges), then
960            /// this should be length `n-1`, and the first edge will use
961            /// the command ID used to send this command.
962            #[serde(default)]
963            pub extra_face_ids: Vec<Uuid>,
964        }
965
966        /// Determines whether a brep face is planar and returns its surface-local planar axes if so
967        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
968        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
969        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
970        pub struct FaceIsPlanar {
971            /// Which face is being queried.
972            pub object_id: Uuid,
973        }
974
975        /// Determines a position on a brep face evaluated by parameters u,v
976        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
977        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
978        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
979        pub struct FaceGetPosition {
980            /// Which face is being queried.
981            pub object_id: Uuid,
982
983            /// The 2D parameter-space u,v position to evaluate the surface at
984            pub uv: Point2d<f64>,
985        }
986
987        ///Obtains the surface "center of mass"
988        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
989        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
990        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
991        pub struct FaceGetCenter {
992            /// Which face is being queried.
993            pub object_id: Uuid,
994        }
995
996        /// Determines the gradient (dFdu, dFdv) + normal vector on a brep face evaluated by parameters u,v
997        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
998        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
999        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1000        pub struct FaceGetGradient {
1001            /// Which face is being queried.
1002            pub object_id: Uuid,
1003
1004            /// The 2D parameter-space u,v position to evaluate the surface at
1005            pub uv: Point2d<f64>,
1006        }
1007
1008        /// Send object to front or back.
1009        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1010        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1011        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1012        pub struct SendObject {
1013            /// Which object is being changed.
1014            pub object_id: Uuid,
1015            /// Bring to front = true, send to back = false.
1016            pub front: bool,
1017        }
1018        /// Set opacity of the entity.
1019        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1020        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1021        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1022        pub struct EntitySetOpacity {
1023            /// Which entity is being changed.
1024            pub entity_id: Uuid,
1025            /// How transparent should it be?
1026            /// 0 or lower is totally transparent.
1027            /// 1 or greater is totally opaque.
1028            pub opacity: f32,
1029        }
1030
1031        /// Fade entity in or out.
1032        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1033        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1034        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1035        pub struct EntityFade {
1036            /// Which entity is being changed.
1037            pub entity_id: Uuid,
1038            /// Fade in = true, fade out = false.
1039            pub fade_in: bool,
1040            /// How many seconds the animation should take.
1041            #[serde(default = "default_animation_seconds")]
1042            pub duration_seconds: f64,
1043        }
1044
1045        /// Make a new plane
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 MakePlane {
1050            /// Origin of the plane
1051            pub origin: Point3d<LengthUnit>,
1052            /// What should the plane's X axis be?
1053            pub x_axis: Point3d<f64>,
1054            /// What should the plane's Y axis be?
1055            pub y_axis: Point3d<f64>,
1056            /// What should the plane's span/extent?
1057            /// When rendered visually, this is both the
1058            /// width and height along X and Y axis respectively.
1059            pub size: LengthUnit,
1060            /// If true, any existing drawables within the obj will be replaced (the object will be reset)
1061            pub clobber: bool,
1062            /// If true, the plane will be created but hidden initially.
1063            pub hide: Option<bool>,
1064        }
1065
1066        /// Set the color of a plane.
1067        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1068        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1069        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1070        pub struct PlaneSetColor {
1071            /// Which plane is being changed.
1072            pub plane_id: Uuid,
1073            /// What color it should be.
1074            pub color: Color,
1075        }
1076
1077        /// Set the current tool.
1078        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1079        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1080        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1081        pub struct SetTool {
1082            /// What tool should be active.
1083            pub tool: SceneToolType,
1084        }
1085
1086        /// Send a mouse move event
1087        #[derive(Debug, Clone, 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 MouseMove {
1091            /// Where the mouse is
1092            pub window: Point2d,
1093            /// Logical timestamp. The client should increment this
1094            /// with every event in the current mouse drag. That way, if the
1095            /// events are being sent over an unordered channel, the API
1096            /// can ignore the older events.
1097            pub sequence: Option<u32>,
1098        }
1099
1100        /// Send a mouse click event
1101        /// Updates modified/selected entities.
1102        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1103        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1104        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1105        pub struct MouseClick {
1106            /// Where the mouse is
1107            pub window: Point2d,
1108        }
1109
1110        /// Disable sketch mode.
1111        /// If you are sketching on a face, be sure to not disable sketch mode until you have extruded.
1112        /// Otherwise, your object will not be fused with the face.
1113        #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1114        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1115        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1116        pub struct SketchModeDisable {}
1117
1118        /// Get the plane for sketch mode.
1119        #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1120        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1121        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1122        pub struct GetSketchModePlane {}
1123
1124        /// Get the plane for sketch mode.
1125        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1126        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1127        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1128        pub struct CurveSetConstraint {
1129            /// Which curve to constrain.
1130            pub object_id: Uuid,
1131            /// Which constraint to apply.
1132            pub constraint_bound: PathComponentConstraintBound,
1133            /// What part of the curve should be constrained.
1134            pub constraint_type: PathComponentConstraintType,
1135        }
1136
1137        /// Sketch on some entity (e.g. a plane, a face).
1138        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1139        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1140        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1141        pub struct EnableSketchMode {
1142            /// Which entity to sketch on.
1143            pub entity_id: Uuid,
1144            /// Should the camera use orthographic projection?
1145            /// In other words, should an object's size in the rendered image stay constant regardless of its distance from the camera.
1146            pub ortho: bool,
1147            /// Should we animate or snap for the camera transition?
1148            pub animated: bool,
1149            /// Should the camera move at all?
1150            pub adjust_camera: bool,
1151            /// If provided, ensures that the normal of the sketch plane must be aligned with this supplied normal
1152            /// (otherwise the camera position will be used to infer the normal to point towards the viewer)
1153            pub planar_normal: Option<Point3d<f64>>,
1154        }
1155
1156        /// Sets whether or not changes to the scene or its objects will be done as a "dry run"
1157        /// In a dry run, successful commands won't actually change the model.
1158        /// This is useful for catching errors before actually making the change.
1159        #[derive(Debug, Clone, Default, 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 EnableDryRun {}
1163
1164        /// Sets whether or not changes to the scene or its objects will be done as a "dry run"
1165        /// In a dry run, successful commands won't actually change the model.
1166        /// This is useful for catching errors before actually making the change.
1167        #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1168        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1169        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1170        pub struct DisableDryRun {}
1171
1172        /// Set the background color of the scene.
1173        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1174        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1175        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1176        pub struct SetBackgroundColor {
1177            /// The color to set the background to.
1178            pub color: Color,
1179        }
1180
1181        /// Set the properties of the tool lines for the scene.
1182        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1183        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1184        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1185        pub struct SetCurrentToolProperties {
1186            /// The color to set the tool line to.
1187            pub color: Option<Color>,
1188        }
1189
1190        /// Set the default system properties used when a specific property isn't set.
1191        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1192        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1193        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1194        pub struct SetDefaultSystemProperties {
1195            /// The default system color.
1196            pub color: Option<Color>,
1197        }
1198
1199        /// Get type of the given curve.
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 CurveGetType {
1204            /// Which curve to query.
1205            pub curve_id: Uuid,
1206        }
1207
1208        /// Get control points of the given curve.
1209        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1210        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1211        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1212        pub struct CurveGetControlPoints {
1213            /// Which curve to query.
1214            pub curve_id: Uuid,
1215        }
1216
1217        /// Project an entity on to a plane.
1218        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1219        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1220        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1221        pub struct ProjectEntityToPlane {
1222            /// Which entity to project (vertex or edge).
1223            pub entity_id: Uuid,
1224            /// Which plane to project entity_id onto.
1225            pub plane_id: Uuid,
1226            /// If true: the projected points are returned in the plane_id's coordinate system,
1227            /// else: the projected points are returned in the world coordinate system.
1228            pub use_plane_coords: bool,
1229        }
1230
1231        /// Project a list of points on to a plane.
1232        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1233        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1234        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1235        pub struct ProjectPointsToPlane {
1236            /// The id of the plane used for the projection.
1237            pub plane_id: Uuid,
1238            /// The list of points that will be projected.
1239            pub points: Vec<Point3d<f64>>,
1240            /// If true: the projected points are returned in the plane_id's coordinate sysetm.
1241            /// else: the projected points are returned in the world coordinate system.
1242            pub use_plane_coords: bool,
1243        }
1244
1245        /// Enum containing the variety of image formats snapshots may be exported to.
1246        #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema, FromStr, Display)]
1247        #[serde(rename_all = "snake_case")]
1248        #[display(style = "snake_case")]
1249        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1250        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1251        #[cfg_attr(feature = "python", pyo3::pyclass, pyo3_stub_gen::derive::gen_stub_pyclass_enum)]
1252        pub enum ImageFormat {
1253            /// .png format
1254            Png,
1255            /// .jpeg format
1256            Jpeg,
1257        }
1258
1259        /// Take a snapshot of the current view.
1260        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1261        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1262        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1263        pub struct TakeSnapshot {
1264            /// What image format to return.
1265            pub format: ImageFormat,
1266        }
1267
1268        /// Add a gizmo showing the axes.
1269        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1270        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1271        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1272        pub struct MakeAxesGizmo {
1273            /// If true, axes gizmo will be placed in the corner of the screen.
1274            /// If false, it will be placed at the origin of the scene.
1275            pub gizmo_mode: bool,
1276            /// If true, any existing drawables within the obj will be replaced (the object will be reset)
1277            pub clobber: bool,
1278        }
1279
1280        /// Query the given path.
1281        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1282        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1283        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1284        pub struct PathGetInfo {
1285            /// Which path to query
1286            pub path_id: Uuid,
1287        }
1288
1289        /// Obtain curve ids for vertex ids
1290        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1291        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1292        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1293        pub struct PathGetCurveUuidsForVertices {
1294            /// Which path to query
1295            pub path_id: Uuid,
1296
1297            /// IDs of the vertices for which to obtain curve ids from
1298            pub vertex_ids: Vec<Uuid>,
1299        }
1300
1301        /// Obtain curve id by index
1302        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1303        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1304        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1305        pub struct PathGetCurveUuid {
1306            /// Which path to query
1307            pub path_id: Uuid,
1308
1309            /// IDs of the vertices for which to obtain curve ids from
1310            pub index: u32,
1311        }
1312
1313        /// Obtain vertex ids for a path
1314        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1315        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1316        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1317        pub struct PathGetVertexUuids {
1318            /// Which path to query
1319            pub path_id: Uuid,
1320        }
1321
1322        /// Obtain the sketch target id (if the path was drawn in sketchmode) for a path
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 PathGetSketchTargetUuid {
1327            /// Which path to query
1328            pub path_id: Uuid,
1329        }
1330
1331        /// Start dragging the mouse.
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 HandleMouseDragStart {
1336            /// The mouse position.
1337            pub window: Point2d,
1338        }
1339
1340        /// Continue dragging the mouse.
1341        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1342        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1343        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1344        pub struct HandleMouseDragMove {
1345            /// The mouse position.
1346            pub window: Point2d,
1347            /// Logical timestamp. The client should increment this
1348            /// with every event in the current mouse drag. That way, if the
1349            /// events are being sent over an unordered channel, the API
1350            /// can ignore the older events.
1351            pub sequence: Option<u32>,
1352        }
1353
1354        /// Stop dragging the mouse.
1355        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1356        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1357        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1358        pub struct HandleMouseDragEnd {
1359            /// The mouse position.
1360            pub window: Point2d,
1361        }
1362
1363        /// Remove scene objects.
1364        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1365        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1366        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1367        pub struct RemoveSceneObjects {
1368            /// Objects to remove.
1369            pub object_ids: HashSet<Uuid>,
1370        }
1371
1372        /// Utility method. Performs both a ray cast and projection to plane-local coordinates.
1373        /// Returns the plane coordinates for the given window coordinates.
1374        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1375        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1376        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1377        pub struct PlaneIntersectAndProject {
1378            /// The plane you're intersecting against.
1379            pub plane_id: Uuid,
1380            /// Window coordinates where the ray cast should be aimed.
1381            pub window: Point2d,
1382        }
1383
1384        /// Find the start and end of a curve.
1385        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1386        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1387        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1388        pub struct CurveGetEndPoints {
1389            /// ID of the curve being queried.
1390            pub curve_id: Uuid,
1391        }
1392
1393        /// Reconfigure the stream.
1394        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1395        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1396        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1397        pub struct ReconfigureStream {
1398            /// Width of the stream.
1399            pub width: u32,
1400            /// Height of the stream.
1401            pub height: u32,
1402            /// Frames per second.
1403            pub fps: u32,
1404            /// Video feed's constant bitrate (CBR)
1405            #[serde(default)]
1406            pub bitrate: Option<u32>,
1407        }
1408
1409        /// Import files to the current model.
1410        #[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1411        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1412        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1413        pub struct ImportFiles {
1414            /// Files to import.
1415            pub files: Vec<super::ImportFile>,
1416            /// Input file format.
1417            pub format: crate::format::InputFormat3d,
1418        }
1419
1420        /// Set the units of the scene.
1421        /// For all following commands, the units will be interpreted as the given units.
1422        /// Any previously executed commands will not be affected or have their units changed.
1423        /// They will remain in the units they were originally executed in.
1424        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1425        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1426        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1427        pub struct SetSceneUnits {
1428            /// Which units the scene uses.
1429            pub unit: units::UnitLength,
1430        }
1431
1432        /// Get the mass 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 Mass {
1437            /// IDs of the entities to get the mass of. If this is empty, then the default scene is included in
1438            /// the mass.
1439            pub entity_ids: Vec<Uuid>,
1440            /// The material density.
1441            pub material_density: f64,
1442            /// The material density unit.
1443            pub material_density_unit: units::UnitDensity,
1444            /// The output unit for the mass.
1445            pub output_unit: units::UnitMass,
1446        }
1447
1448        /// Get the density of entities in the scene or the default scene.
1449        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1450        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1451        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1452        pub struct Density {
1453            /// IDs of the entities to get the density of. If this is empty, then the default scene is included in
1454            /// the density.
1455            pub entity_ids: Vec<Uuid>,
1456            /// The material mass.
1457            pub material_mass: f64,
1458            /// The material mass unit.
1459            pub material_mass_unit: units::UnitMass,
1460            /// The output unit for the density.
1461            pub output_unit: units::UnitDensity,
1462        }
1463
1464        /// Get the volume of entities in the scene or the default scene.
1465        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1466        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1467        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1468        pub struct Volume {
1469            /// IDs of the entities to get the volume of. If this is empty, then the default scene is included in
1470            /// the volume.
1471            pub entity_ids: Vec<Uuid>,
1472            /// The output unit for the volume.
1473            pub output_unit: units::UnitVolume,
1474        }
1475
1476        /// Get the center of mass of entities in the scene or the default scene.
1477        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1478        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1479        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1480        pub struct CenterOfMass {
1481            /// IDs of the entities to get the center of mass of. If this is empty, then the default scene is included in
1482            /// the center of mass.
1483            pub entity_ids: Vec<Uuid>,
1484            /// The output unit for the center of mass.
1485            pub output_unit: units::UnitLength,
1486        }
1487
1488        /// Get the surface area of entities in the scene or the default scene.
1489        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1490        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1491        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1492        pub struct SurfaceArea {
1493            /// IDs of the entities to get the surface area of. If this is empty, then the default scene is included in
1494            /// the surface area.
1495            pub entity_ids: Vec<Uuid>,
1496            /// The output unit for the surface area.
1497            pub output_unit: units::UnitArea,
1498        }
1499
1500        /// Focus the default camera upon an object in the scene.
1501        #[derive(
1502            Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1503        )]
1504        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1505        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1506        pub struct DefaultCameraFocusOn {
1507            /// UUID of object to focus on.
1508            pub uuid: Uuid,
1509        }
1510        /// When you select some entity with the current tool, what should happen to the entity?
1511        #[derive(
1512            Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1513        )]
1514        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1515        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1516        pub struct SetSelectionType {
1517            /// What type of selection should occur when you select something?
1518            pub selection_type: SceneSelectionType,
1519        }
1520
1521        /// What kind of entities can be 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 SetSelectionFilter {
1528            /// If vector is empty, clear all filters.
1529            /// If vector is non-empty, only the given entity types will be selectable.
1530            pub filter: Vec<EntityType>,
1531        }
1532
1533        /// Get the ids of a given entity type.
1534        #[derive(
1535            Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1536        )]
1537        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1538        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1539        pub struct SceneGetEntityIds {
1540            /// The entity types to be queried.
1541            pub filter: Vec<EntityType>,
1542            /// Skip the first n returned ids. If multiple filters are provided, this skip will
1543            /// apply to each filter individually.
1544            pub skip: u32,
1545            /// Take n ids after any ids skipped. This value must be greater than zero and not
1546            /// exceed 1000. If multiple filters are provided, this take will apply to each filter
1547            /// individually. If there are fewer than `take` items of the provided filter type then the
1548            /// returned list's length will be the smaller value.
1549            #[schemars(range(min = 1, max = 1000))]
1550            pub take: u32,
1551        }
1552
1553        /// Use orthographic projection.
1554        #[derive(
1555            Clone, Debug, Default, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1556        )]
1557        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1558        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1559        pub struct DefaultCameraSetOrthographic {}
1560
1561        /// Use perspective projection.
1562        #[derive(
1563            Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1564        )]
1565        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1566        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1567        pub struct DefaultCameraSetPerspective {
1568            /// If this is not given, use the same parameters as last time the perspective camera was used.
1569            pub parameters: Option<PerspectiveCameraParameters>,
1570        }
1571
1572        ///Updates the camera to center to the center of the current selection
1573        ///(or the origin if nothing is selected)
1574        #[derive(
1575            Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1576        )]
1577        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1578        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1579        pub struct DefaultCameraCenterToSelection {
1580            /// Dictates whether or not the camera position should be adjusted during this operation
1581            /// If no movement is requested, the camera will orbit around the new center from its current position
1582            #[serde(default)]
1583            pub camera_movement: CameraMovement,
1584        }
1585
1586        ///Updates the camera to center to the center of the current scene's bounds
1587        #[derive(
1588            Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1589        )]
1590        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1591        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1592        pub struct DefaultCameraCenterToScene {
1593            /// Dictates whether or not the camera position should be adjusted during this operation
1594            /// If no movement is requested, the camera will orbit around the new center from its current position
1595            #[serde(default)]
1596            pub camera_movement: CameraMovement,
1597        }
1598
1599        /// Fit the view to the specified object(s).
1600        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1601        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1602        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1603        pub struct ZoomToFit {
1604            /// Which objects to fit camera to; if empty, fit to all non-default objects. Defaults to empty vector.
1605            #[serde(default = "default_uuid_vector")]
1606            pub object_ids: Vec<Uuid>,
1607            /// How much to pad the view frame by, as a fraction of the object(s) bounding box size.
1608            /// Negative padding will crop the view of the object proportionally.
1609            /// e.g. padding = 0.2 means the view will span 120% of the object(s) bounding box,
1610            /// and padding = -0.2 means the view will span 80% of the object(s) bounding box.
1611            #[serde(default)]
1612            pub padding: f32,
1613            /// Whether or not to animate the camera movement.
1614            #[serde(default)]
1615            pub animated: bool,
1616        }
1617
1618        /// Looks along the normal of the specified face (if it is planar!), and fits the view to it.
1619        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1620        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1621        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1622        pub struct OrientToFace {
1623            /// Which face to orient camera to. If the face is not planar, no action will occur.
1624            pub face_id: Uuid,
1625            /// How much to pad the view frame by, as a fraction of the face bounding box size.
1626            /// Negative padding will crop the view of the face proportionally.
1627            /// e.g. padding = 0.2 means the view will span 120% of the face bounding box,
1628            /// and padding = -0.2 means the view will span 80% of the face bounding box.
1629            #[serde(default)]
1630            pub padding: f32,
1631            /// Whether or not to animate the camera movement. (Animation is currently not supported.)
1632            #[serde(default)]
1633            pub animated: bool,
1634        }
1635
1636        /// Fit the view to the scene with an isometric view.
1637        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1638        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1639        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1640        pub struct ViewIsometric {
1641            /// How much to pad the view frame by, as a fraction of the object(s) bounding box size.
1642            /// Negative padding will crop the view of the object proportionally.
1643            /// e.g. padding = 0.2 means the view will span 120% of the object(s) bounding box,
1644            /// and padding = -0.2 means the view will span 80% of the object(s) bounding box.
1645            #[serde(default = "f32::default")]
1646            pub padding: f32,
1647        }
1648
1649        /// Get a concise description of all of an extrusion's faces.
1650        #[derive(Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1651        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1652        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1653        pub struct Solid3dGetExtrusionFaceInfo {
1654            /// The Solid3d object whose extrusion is being queried.
1655            pub object_id: Uuid,
1656            /// Any edge that lies on the extrusion base path.
1657            pub edge_id: Uuid,
1658        }
1659
1660        /// Get a concise description of all of solids edges.
1661        #[derive(Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1662        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1663        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1664        pub struct Solid3dGetAdjacencyInfo {
1665            /// The Solid3d object whose info is being queried.
1666            pub object_id: Uuid,
1667            /// Any edge that lies on the extrusion base path.
1668            pub edge_id: Uuid,
1669        }
1670
1671
1672        /// Clear the selection
1673        #[derive(Clone, Debug, Default, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1674        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1675        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1676        pub struct SelectClear {}
1677
1678        /// Find all IDs of selected entities
1679        #[derive(Clone, Debug, Default, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1680        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1681        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1682        pub struct SelectGet {}
1683
1684        /// Get the number of objects in the scene
1685        #[derive(
1686            Clone, Debug, Default, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant,
1687        )]
1688        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1689        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1690        pub struct GetNumObjects {}
1691
1692        ///Set the transform of an object.
1693        #[derive(
1694            Clone, Debug, Deserialize, PartialEq, JsonSchema, Serialize, ModelingCmdVariant,
1695        )]
1696        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1697        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1698        pub struct SetObjectTransform
1699        {
1700            /// Id of the object whose transform is to be set.
1701            pub object_id: Uuid,
1702            /// List of transforms to be applied to the object.
1703            pub transforms: Vec<ComponentTransform>,
1704        }
1705
1706        /// Create a new solid from combining other smaller solids.
1707        /// In other words, every part of the input solids will be included in the output solid.
1708        #[derive(
1709            Clone, Debug, Deserialize, PartialEq, JsonSchema, Serialize, ModelingCmdVariant,
1710        )]
1711        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1712        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1713        pub struct BooleanUnion
1714        {
1715            /// Which solids to union together.
1716            /// Cannot be empty.
1717            pub solid_ids: Vec<Uuid>,
1718            /// The maximum acceptable surface gap computed between the joined solids. Must be positive (i.e. greater than zero).
1719            pub tolerance: LengthUnit,
1720        }
1721
1722        /// Create a new solid from intersecting several other solids.
1723        /// In other words, the part of the input solids where they all overlap will be the output solid.
1724        #[derive(
1725            Clone, Debug, Deserialize, PartialEq, JsonSchema, Serialize, ModelingCmdVariant,
1726        )]
1727        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1728        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1729        pub struct BooleanIntersection
1730        {
1731            /// Which solids to intersect together
1732            pub solid_ids: Vec<Uuid>,
1733            /// The maximum acceptable surface gap computed between the joined solids. Must be positive (i.e. greater than zero).
1734            pub tolerance: LengthUnit,
1735        }
1736
1737        /// Create a new solid from subtracting several other solids.
1738        /// The 'target' is what will be cut from.
1739        /// The 'tool' is what will be cut out from 'target'.
1740        #[derive(
1741            Clone, Debug, Deserialize, PartialEq, JsonSchema, Serialize, ModelingCmdVariant,
1742        )]
1743        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1744        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1745        pub struct BooleanSubtract
1746        {
1747            /// Geometry to cut out from.
1748            pub target_ids: Vec<Uuid>,
1749            /// Will be cut out from the 'target'.
1750            pub tool_ids: Vec<Uuid>,
1751            /// The maximum acceptable surface gap computed between the target and the solids cut out from it. Must be positive (i.e. greater than zero).
1752            pub tolerance: LengthUnit,
1753        }
1754
1755        /// Make a new path by offsetting an object by a given distance.
1756        /// The new path's ID will be the ID of this command.
1757        #[derive(Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1758        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1759        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1760        pub struct MakeOffsetPath {
1761            /// The object that will be offset (can be a path, sketch, or a solid)
1762            pub object_id: Uuid,
1763            /// If the object is a solid, this is the ID of the face to base the offset on.
1764            /// If given, and `object_id` refers to a solid, then this face on the solid will be offset.
1765            /// If given but `object_id` doesn't refer to a solid, responds with an error.
1766            /// If not given, then `object_id` itself will be offset directly.
1767            #[serde(default)]
1768            pub face_id: Option<Uuid>,
1769            /// The distance to offset the path (positive for outset, negative for inset)
1770            pub offset: LengthUnit,
1771        }
1772
1773        /// Add a hole to a closed path by offsetting it a uniform distance inward.
1774        #[derive(Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1775        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1776        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1777        pub struct AddHoleFromOffset {
1778            /// The closed path to add a hole to.
1779            pub object_id: Uuid,
1780            /// The distance to offset the path (positive for outset, negative for inset)
1781            pub offset: LengthUnit,
1782        }
1783
1784        /// Align the grid with a plane or a planar face.
1785        #[derive(Clone, Debug, PartialEq, Deserialize, JsonSchema, Serialize, ModelingCmdVariant)]
1786        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1787        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1788        pub struct SetGridReferencePlane {
1789            /// The grid to be moved.
1790            pub grid_id: Uuid,
1791            /// The plane or face that the grid will be aligned to.
1792            /// If a face, it must be planar to succeed.
1793            pub reference_id: Uuid,
1794        }
1795
1796        /// Set the scale of the grid lines in the video feed.
1797        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1798        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1799        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1800        pub struct SetGridScale {
1801            /// Distance between grid lines represents this much distance.
1802            pub value: f32,
1803            /// Which units the `value` field uses.
1804            pub units: units::UnitLength,
1805        }
1806
1807        /// Set the grid lines to auto scale. The grid will get larger the further you zoom out,
1808        /// and smaller the more you zoom in.
1809        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1810        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1811        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1812        pub struct SetGridAutoScale {
1813        }
1814
1815        /// Render transparent surfaces more accurately, but this might make rendering slower.
1816        /// Because it can interfere with runtime performance, it defaults to false.
1817        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, ModelingCmdVariant)]
1818        #[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1819        #[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1820        pub struct SetOrderIndependentTransparency {
1821            /// Enables or disables OIT.
1822            /// If not given, toggles it.
1823            pub enabled: Option<bool>,
1824        }
1825    }
1826}
1827
1828impl ModelingCmd {
1829    /// Is this command safe to run in an engine batch?
1830    pub fn is_safe_to_batch(&self) -> bool {
1831        use ModelingCmd::*;
1832        matches!(
1833            self,
1834            MovePathPen(_)
1835                | ExtendPath(_)
1836                | Extrude(_)
1837                | Revolve(_)
1838                | Solid3dFilletEdge(_)
1839                | ClosePath(_)
1840                | UpdateAnnotation(_)
1841                | ObjectVisible(_)
1842                | ObjectBringToFront(_)
1843                | Solid2dAddHole(_)
1844                | SendObject(_)
1845                | EntitySetOpacity(_)
1846                | PlaneSetColor(_)
1847                | SetTool(_)
1848        )
1849    }
1850}
1851
1852/// File to import into the current model.
1853/// If you are sending binary data for a file, be sure to send the WebSocketRequest as
1854/// binary/bson, not text/json.
1855#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, Eq, PartialEq)]
1856#[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
1857#[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
1858pub struct ImportFile {
1859    /// The file's full path, including file extension.
1860    pub path: String,
1861    /// The raw bytes of the file
1862    #[serde(
1863        serialize_with = "serde_bytes::serialize",
1864        deserialize_with = "serde_bytes::deserialize"
1865    )]
1866    pub data: Vec<u8>,
1867}