1pub mod appearance;
4pub mod args;
5pub mod array;
6pub mod assert;
7pub mod axis_or_reference;
8pub mod chamfer;
9pub mod clone;
10pub mod constraints;
11pub mod csg;
12pub mod edge;
13pub mod extrude;
14pub mod fillet;
15pub mod helix;
16pub mod loft;
17pub mod math;
18pub mod mirror;
19pub mod patterns;
20pub mod planes;
21pub mod revolve;
22pub mod segment;
23pub mod shapes;
24pub mod shell;
25pub mod sketch;
26pub mod sweep;
27pub mod transform;
28pub mod utils;
29
30use anyhow::Result;
31pub use args::Args;
32
33use crate::{
34 errors::KclError,
35 execution::{ExecState, KclValue, types::PrimitiveType},
36};
37
38pub type StdFn = fn(
39 &mut ExecState,
40 Args,
41) -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<KclValue, KclError>> + Send + '_>>;
42
43#[derive(Clone, Debug, PartialEq, Eq)]
44pub struct StdFnProps {
45 pub name: String,
46 pub include_in_feature_tree: bool,
47}
48
49impl StdFnProps {
50 fn default(name: &str) -> Self {
51 Self {
52 name: name.to_owned(),
53 include_in_feature_tree: false,
54 }
55 }
56
57 fn include_in_feature_tree(mut self) -> Self {
58 self.include_in_feature_tree = true;
59 self
60 }
61}
62
63pub(crate) fn std_fn(path: &str, fn_name: &str) -> (crate::std::StdFn, StdFnProps) {
64 match (path, fn_name) {
65 ("math", "cos") => (
66 |e, a| Box::pin(crate::std::math::cos(e, a)),
67 StdFnProps::default("std::math::cos"),
68 ),
69 ("math", "sin") => (
70 |e, a| Box::pin(crate::std::math::sin(e, a)),
71 StdFnProps::default("std::math::sin"),
72 ),
73 ("math", "tan") => (
74 |e, a| Box::pin(crate::std::math::tan(e, a)),
75 StdFnProps::default("std::math::tan"),
76 ),
77 ("math", "acos") => (
78 |e, a| Box::pin(crate::std::math::acos(e, a)),
79 StdFnProps::default("std::math::acos"),
80 ),
81 ("math", "asin") => (
82 |e, a| Box::pin(crate::std::math::asin(e, a)),
83 StdFnProps::default("std::math::asin"),
84 ),
85 ("math", "atan") => (
86 |e, a| Box::pin(crate::std::math::atan(e, a)),
87 StdFnProps::default("std::math::atan"),
88 ),
89 ("math", "atan2") => (
90 |e, a| Box::pin(crate::std::math::atan2(e, a)),
91 StdFnProps::default("std::math::atan2"),
92 ),
93 ("math", "sqrt") => (
94 |e, a| Box::pin(crate::std::math::sqrt(e, a)),
95 StdFnProps::default("std::math::sqrt"),
96 ),
97
98 ("math", "abs") => (
99 |e, a| Box::pin(crate::std::math::abs(e, a)),
100 StdFnProps::default("std::math::abs"),
101 ),
102 ("math", "rem") => (
103 |e, a| Box::pin(crate::std::math::rem(e, a)),
104 StdFnProps::default("std::math::rem"),
105 ),
106 ("math", "round") => (
107 |e, a| Box::pin(crate::std::math::round(e, a)),
108 StdFnProps::default("std::math::round"),
109 ),
110 ("math", "floor") => (
111 |e, a| Box::pin(crate::std::math::floor(e, a)),
112 StdFnProps::default("std::math::floor"),
113 ),
114 ("math", "ceil") => (
115 |e, a| Box::pin(crate::std::math::ceil(e, a)),
116 StdFnProps::default("std::math::ceil"),
117 ),
118 ("math", "min") => (
119 |e, a| Box::pin(crate::std::math::min(e, a)),
120 StdFnProps::default("std::math::min"),
121 ),
122 ("math", "max") => (
123 |e, a| Box::pin(crate::std::math::max(e, a)),
124 StdFnProps::default("std::math::max"),
125 ),
126 ("math", "pow") => (
127 |e, a| Box::pin(crate::std::math::pow(e, a)),
128 StdFnProps::default("std::math::pow"),
129 ),
130 ("math", "log") => (
131 |e, a| Box::pin(crate::std::math::log(e, a)),
132 StdFnProps::default("std::math::log"),
133 ),
134 ("math", "log2") => (
135 |e, a| Box::pin(crate::std::math::log2(e, a)),
136 StdFnProps::default("std::math::log2"),
137 ),
138 ("math", "log10") => (
139 |e, a| Box::pin(crate::std::math::log10(e, a)),
140 StdFnProps::default("std::math::log10"),
141 ),
142 ("math", "ln") => (
143 |e, a| Box::pin(crate::std::math::ln(e, a)),
144 StdFnProps::default("std::math::ln"),
145 ),
146 ("math", "legLen") => (
147 |e, a| Box::pin(crate::std::math::leg_length(e, a)),
148 StdFnProps::default("std::math::legLen"),
149 ),
150 ("math", "legAngX") => (
151 |e, a| Box::pin(crate::std::math::leg_angle_x(e, a)),
152 StdFnProps::default("std::math::legAngX"),
153 ),
154 ("math", "legAngY") => (
155 |e, a| Box::pin(crate::std::math::leg_angle_y(e, a)),
156 StdFnProps::default("std::math::legAngY"),
157 ),
158 ("sketch", "circle") => (
159 |e, a| Box::pin(crate::std::shapes::circle(e, a)),
160 StdFnProps::default("std::sketch::circle"),
161 ),
162 ("sketch", "ellipse") => (
163 |e, a| Box::pin(crate::std::shapes::ellipse(e, a)),
164 StdFnProps::default("std::sketch::ellipse").include_in_feature_tree(),
165 ),
166 ("prelude", "helix") => (
167 |e, a| Box::pin(crate::std::helix::helix(e, a)),
168 StdFnProps::default("std::helix").include_in_feature_tree(),
169 ),
170 ("transform", "mirror2d") => (
171 |e, a| Box::pin(crate::std::mirror::mirror_2d(e, a)),
172 StdFnProps::default("std::transform::mirror2d").include_in_feature_tree(),
173 ),
174 ("transform", "translate") => (
175 |e, a| Box::pin(crate::std::transform::translate(e, a)),
176 StdFnProps::default("std::transform::translate").include_in_feature_tree(),
177 ),
178 ("transform", "rotate") => (
179 |e, a| Box::pin(crate::std::transform::rotate(e, a)),
180 StdFnProps::default("std::transform::rotate").include_in_feature_tree(),
181 ),
182 ("transform", "scale") => (
183 |e, a| Box::pin(crate::std::transform::scale(e, a)),
184 StdFnProps::default("std::transform::scale").include_in_feature_tree(),
185 ),
186 ("prelude", "offsetPlane") => (
187 |e, a| Box::pin(crate::std::planes::offset_plane(e, a)),
188 StdFnProps::default("std::offsetPlane").include_in_feature_tree(),
189 ),
190 ("prelude", "assert") => (
191 |e, a| Box::pin(crate::std::assert::assert(e, a)),
192 StdFnProps::default("std::assert"),
193 ),
194 ("prelude", "assertIs") => (
195 |e, a| Box::pin(crate::std::assert::assert_is(e, a)),
196 StdFnProps::default("std::assertIs"),
197 ),
198 ("solid", "fillet") => (
199 |e, a| Box::pin(crate::std::fillet::fillet(e, a)),
200 StdFnProps::default("std::solid::fillet").include_in_feature_tree(),
201 ),
202 ("solid", "chamfer") => (
203 |e, a| Box::pin(crate::std::chamfer::chamfer(e, a)),
204 StdFnProps::default("std::solid::chamfer").include_in_feature_tree(),
205 ),
206 ("solid", "shell") => (
207 |e, a| Box::pin(crate::std::shell::shell(e, a)),
208 StdFnProps::default("std::solid::shell").include_in_feature_tree(),
209 ),
210 ("solid", "hollow") => (
211 |e, a| Box::pin(crate::std::shell::hollow(e, a)),
212 StdFnProps::default("std::solid::hollow").include_in_feature_tree(),
213 ),
214 ("solid", "union") => (
215 |e, a| Box::pin(crate::std::csg::union(e, a)),
216 StdFnProps::default("std::solid::union").include_in_feature_tree(),
217 ),
218 ("solid", "intersect") => (
219 |e, a| Box::pin(crate::std::csg::intersect(e, a)),
220 StdFnProps::default("std::solid::intersect").include_in_feature_tree(),
221 ),
222 ("solid", "subtract") => (
223 |e, a| Box::pin(crate::std::csg::subtract(e, a)),
224 StdFnProps::default("std::solid::subtract").include_in_feature_tree(),
225 ),
226 ("solid", "patternTransform") => (
227 |e, a| Box::pin(crate::std::patterns::pattern_transform(e, a)),
228 StdFnProps::default("std::solid::patternTransform").include_in_feature_tree(),
229 ),
230 ("solid", "patternLinear3d") => (
231 |e, a| Box::pin(crate::std::patterns::pattern_linear_3d(e, a)),
232 StdFnProps::default("std::solid::patternLinear3d").include_in_feature_tree(),
233 ),
234 ("solid", "patternCircular3d") => (
235 |e, a| Box::pin(crate::std::patterns::pattern_circular_3d(e, a)),
236 StdFnProps::default("std::solid::patternCircular3d").include_in_feature_tree(),
237 ),
238 ("solid", "appearance") => (
239 |e, a| Box::pin(crate::std::appearance::appearance(e, a)),
240 StdFnProps::default("std::solid::appearance").include_in_feature_tree(),
241 ),
242 ("array", "map") => (
243 |e, a| Box::pin(crate::std::array::map(e, a)),
244 StdFnProps::default("std::array::map"),
245 ),
246 ("array", "reduce") => (
247 |e, a| Box::pin(crate::std::array::reduce(e, a)),
248 StdFnProps::default("std::array::reduce"),
249 ),
250 ("array", "push") => (
251 |e, a| Box::pin(crate::std::array::push(e, a)),
252 StdFnProps::default("std::array::push"),
253 ),
254 ("array", "pop") => (
255 |e, a| Box::pin(crate::std::array::pop(e, a)),
256 StdFnProps::default("std::array::pop"),
257 ),
258 ("array", "concat") => (
259 |e, a| Box::pin(crate::std::array::concat(e, a)),
260 StdFnProps::default("std::array::concat"),
261 ),
262 ("prelude", "clone") => (
263 |e, a| Box::pin(crate::std::clone::clone(e, a)),
264 StdFnProps::default("std::clone").include_in_feature_tree(),
265 ),
266 ("sketch", "conic") => (
267 |e, a| Box::pin(crate::std::sketch::conic(e, a)),
268 StdFnProps::default("std::sketch::conic").include_in_feature_tree(),
269 ),
270 ("sketch", "parabolic") => (
271 |e, a| Box::pin(crate::std::sketch::parabolic(e, a)),
272 StdFnProps::default("std::sketch::parabolic").include_in_feature_tree(),
273 ),
274 ("sketch", "parabolicPoint") => (
275 |e, a| Box::pin(crate::std::sketch::parabolic_point(e, a)),
276 StdFnProps::default("std::sketch::parabolicPoint"),
277 ),
278 ("sketch", "hyperbolic") => (
279 |e, a| Box::pin(crate::std::sketch::hyperbolic(e, a)),
280 StdFnProps::default("std::sketch::hyperbolic").include_in_feature_tree(),
281 ),
282 ("sketch", "hyperbolicPoint") => (
283 |e, a| Box::pin(crate::std::sketch::hyperbolic_point(e, a)),
284 StdFnProps::default("std::sketch::hyperbolicPoint"),
285 ),
286 ("sketch", "elliptic") => (
287 |e, a| Box::pin(crate::std::sketch::elliptic(e, a)),
288 StdFnProps::default("std::sketch::elliptic").include_in_feature_tree(),
289 ),
290 ("sketch", "ellipticPoint") => (
291 |e, a| Box::pin(crate::std::sketch::elliptic_point(e, a)),
292 StdFnProps::default("std::sketch::ellipticPoint"),
293 ),
294 ("sketch", "rectangle") => (
295 |e, a| Box::pin(crate::std::shapes::rectangle(e, a)),
296 StdFnProps::default("std::sketch::rectangle"),
297 ),
298 ("sketch", "planeOf") => (
299 |e, a| Box::pin(crate::std::planes::plane_of(e, a)),
300 StdFnProps::default("std::sketch::planeOf"),
301 ),
302 ("sketch", "extrude") => (
303 |e, a| Box::pin(crate::std::extrude::extrude(e, a)),
304 StdFnProps::default("std::sketch::extrude").include_in_feature_tree(),
305 ),
306 ("sketch", "patternTransform2d") => (
307 |e, a| Box::pin(crate::std::patterns::pattern_transform_2d(e, a)),
308 StdFnProps::default("std::sketch::patternTransform2d"),
309 ),
310 ("sketch", "revolve") => (
311 |e, a| Box::pin(crate::std::revolve::revolve(e, a)),
312 StdFnProps::default("std::sketch::revolve").include_in_feature_tree(),
313 ),
314 ("sketch", "sweep") => (
315 |e, a| Box::pin(crate::std::sweep::sweep(e, a)),
316 StdFnProps::default("std::sketch::sweep").include_in_feature_tree(),
317 ),
318 ("sketch", "loft") => (
319 |e, a| Box::pin(crate::std::loft::loft(e, a)),
320 StdFnProps::default("std::sketch::loft").include_in_feature_tree(),
321 ),
322 ("sketch", "polygon") => (
323 |e, a| Box::pin(crate::std::shapes::polygon(e, a)),
324 StdFnProps::default("std::sketch::polygon"),
325 ),
326 ("sketch", "circleThreePoint") => (
327 |e, a| Box::pin(crate::std::shapes::circle_three_point(e, a)),
328 StdFnProps::default("std::sketch::circleThreePoint"),
329 ),
330 ("sketch", "getCommonEdge") => (
331 |e, a| Box::pin(crate::std::edge::get_common_edge(e, a)),
332 StdFnProps::default("std::sketch::getCommonEdge"),
333 ),
334 ("sketch", "getNextAdjacentEdge") => (
335 |e, a| Box::pin(crate::std::edge::get_next_adjacent_edge(e, a)),
336 StdFnProps::default("std::sketch::getNextAdjacentEdge"),
337 ),
338 ("sketch", "getOppositeEdge") => (
339 |e, a| Box::pin(crate::std::edge::get_opposite_edge(e, a)),
340 StdFnProps::default("std::sketch::revolve"),
341 ),
342 ("sketch", "getPreviousAdjacentEdge") => (
343 |e, a| Box::pin(crate::std::edge::get_previous_adjacent_edge(e, a)),
344 StdFnProps::default("std::sketch::getPreviousAdjacentEdge"),
345 ),
346 ("sketch", "patternLinear2d") => (
347 |e, a| Box::pin(crate::std::patterns::pattern_linear_2d(e, a)),
348 StdFnProps::default("std::sketch::patternLinear2d"),
349 ),
350 ("sketch", "patternCircular2d") => (
351 |e, a| Box::pin(crate::std::patterns::pattern_circular_2d(e, a)),
352 StdFnProps::default("std::sketch::patternCircular2d"),
353 ),
354 ("sketch", "segEnd") => (
355 |e, a| Box::pin(crate::std::segment::segment_end(e, a)),
356 StdFnProps::default("std::sketch::segEnd"),
357 ),
358 ("sketch", "segEndX") => (
359 |e, a| Box::pin(crate::std::segment::segment_end_x(e, a)),
360 StdFnProps::default("std::sketch::segEndX"),
361 ),
362 ("sketch", "segEndY") => (
363 |e, a| Box::pin(crate::std::segment::segment_end_y(e, a)),
364 StdFnProps::default("std::sketch::segEndY"),
365 ),
366 ("sketch", "segStart") => (
367 |e, a| Box::pin(crate::std::segment::segment_start(e, a)),
368 StdFnProps::default("std::sketch::segStart"),
369 ),
370 ("sketch", "segStartX") => (
371 |e, a| Box::pin(crate::std::segment::segment_start_x(e, a)),
372 StdFnProps::default("std::sketch::segStartX"),
373 ),
374 ("sketch", "segStartY") => (
375 |e, a| Box::pin(crate::std::segment::segment_start_y(e, a)),
376 StdFnProps::default("std::sketch::segStartY"),
377 ),
378 ("sketch", "lastSegX") => (
379 |e, a| Box::pin(crate::std::segment::last_segment_x(e, a)),
380 StdFnProps::default("std::sketch::lastSegX"),
381 ),
382 ("sketch", "lastSegY") => (
383 |e, a| Box::pin(crate::std::segment::last_segment_y(e, a)),
384 StdFnProps::default("std::sketch::lastSegY"),
385 ),
386 ("sketch", "segLen") => (
387 |e, a| Box::pin(crate::std::segment::segment_length(e, a)),
388 StdFnProps::default("std::sketch::segLen"),
389 ),
390 ("sketch", "segAng") => (
391 |e, a| Box::pin(crate::std::segment::segment_angle(e, a)),
392 StdFnProps::default("std::sketch::segAng"),
393 ),
394 ("sketch", "tangentToEnd") => (
395 |e, a| Box::pin(crate::std::segment::tangent_to_end(e, a)),
396 StdFnProps::default("std::sketch::tangentToEnd"),
397 ),
398 ("sketch", "profileStart") => (
399 |e, a| Box::pin(crate::std::sketch::profile_start(e, a)),
400 StdFnProps::default("std::sketch::profileStart"),
401 ),
402 ("sketch", "profileStartX") => (
403 |e, a| Box::pin(crate::std::sketch::profile_start_x(e, a)),
404 StdFnProps::default("std::sketch::profileStartX"),
405 ),
406 ("sketch", "profileStartY") => (
407 |e, a| Box::pin(crate::std::sketch::profile_start_y(e, a)),
408 StdFnProps::default("std::sketch::profileStartY"),
409 ),
410 ("sketch", "startSketchOn") => (
411 |e, a| Box::pin(crate::std::sketch::start_sketch_on(e, a)),
412 StdFnProps::default("std::sketch::startSketchOn").include_in_feature_tree(),
413 ),
414 ("sketch", "startProfile") => (
415 |e, a| Box::pin(crate::std::sketch::start_profile(e, a)),
416 StdFnProps::default("std::sketch::startProfile"),
417 ),
418 ("sketch", "involuteCircular") => (
419 |e, a| Box::pin(crate::std::sketch::involute_circular(e, a)),
420 StdFnProps::default("std::sketch::involuteCircular"),
421 ),
422 ("sketch", "line") => (
423 |e, a| Box::pin(crate::std::sketch::line(e, a)),
424 StdFnProps::default("std::sketch::line"),
425 ),
426 ("sketch", "xLine") => (
427 |e, a| Box::pin(crate::std::sketch::x_line(e, a)),
428 StdFnProps::default("std::sketch::xLine"),
429 ),
430 ("sketch", "yLine") => (
431 |e, a| Box::pin(crate::std::sketch::y_line(e, a)),
432 StdFnProps::default("std::sketch::yLine"),
433 ),
434 ("sketch", "angledLine") => (
435 |e, a| Box::pin(crate::std::sketch::angled_line(e, a)),
436 StdFnProps::default("std::sketch::angledLine"),
437 ),
438 ("sketch", "angledLineThatIntersects") => (
439 |e, a| Box::pin(crate::std::sketch::angled_line_that_intersects(e, a)),
440 StdFnProps::default("std::sketch::angledLineThatIntersects"),
441 ),
442 ("sketch", "close") => (
443 |e, a| Box::pin(crate::std::sketch::close(e, a)),
444 StdFnProps::default("std::sketch::close"),
445 ),
446 ("sketch", "arc") => (
447 |e, a| Box::pin(crate::std::sketch::arc(e, a)),
448 StdFnProps::default("std::sketch::arc"),
449 ),
450 ("sketch", "tangentialArc") => (
451 |e, a| Box::pin(crate::std::sketch::tangential_arc(e, a)),
452 StdFnProps::default("std::sketch::tangentialArc"),
453 ),
454 ("sketch", "bezierCurve") => (
455 |e, a| Box::pin(crate::std::sketch::bezier_curve(e, a)),
456 StdFnProps::default("std::sketch::bezierCurve"),
457 ),
458 ("sketch", "subtract2d") => (
459 |e, a| Box::pin(crate::std::sketch::subtract_2d(e, a)),
460 StdFnProps::default("std::sketch::subtract2d").include_in_feature_tree(),
461 ),
462 ("appearance", "hexString") => (
463 |e, a| Box::pin(crate::std::appearance::hex_string(e, a)),
464 StdFnProps::default("std::appearance::hexString"),
465 ),
466 ("sketch2", "parallel") => (
467 |e, a| Box::pin(crate::std::constraints::parallel(e, a)),
468 StdFnProps::default("std::sketch2::parallel").include_in_feature_tree(),
469 ),
470 (module, fn_name) => {
471 panic!("No implementation found for {module}::{fn_name}, please add it to this big match statement")
472 }
473 }
474}
475
476pub(crate) fn std_ty(path: &str, fn_name: &str) -> (PrimitiveType, StdFnProps) {
477 match (path, fn_name) {
478 ("types", "Sketch") => (PrimitiveType::Sketch, StdFnProps::default("std::types::Sketch")),
479 ("types", "Solid") => (PrimitiveType::Solid, StdFnProps::default("std::types::Solid")),
480 ("types", "Plane") => (PrimitiveType::Plane, StdFnProps::default("std::types::Plane")),
481 ("types", "Face") => (PrimitiveType::Face, StdFnProps::default("std::types::Face")),
482 ("types", "Helix") => (PrimitiveType::Helix, StdFnProps::default("std::types::Helix")),
483 ("types", "Edge") => (PrimitiveType::Edge, StdFnProps::default("std::types::Edge")),
484 ("types", "Axis2d") => (PrimitiveType::Axis2d, StdFnProps::default("std::types::Axis2d")),
485 ("types", "Axis3d") => (PrimitiveType::Axis3d, StdFnProps::default("std::types::Axis3d")),
486 ("types", "TaggedEdge") => (PrimitiveType::TaggedEdge, StdFnProps::default("std::types::TaggedEdge")),
487 ("types", "TaggedFace") => (PrimitiveType::TaggedFace, StdFnProps::default("std::types::TaggedFace")),
488 _ => unreachable!(),
489 }
490}
491
492const DEFAULT_TOLERANCE_MM: f64 = 0.0000001;