2025-05-11 19:32:33 +12:00
|
|
|
/// Sketching is the foundational activity for most KCL programs. A sketch is a two-dimensional
|
|
|
|
/// drawing made from paths or shapes. A sketch is always drawn on a surface (either an abstract
|
|
|
|
/// plane of a face of a solid). A sketch can be made into a solid by extruding it (or revolving, etc.).
|
|
|
|
///
|
|
|
|
/// This module contains functions for creating and manipulating sketches, and making them into solids.
|
|
|
|
|
2025-03-24 21:55:24 +13:00
|
|
|
@no_std
|
2025-05-06 08:44:03 +12:00
|
|
|
@settings(defaultLengthUnit = mm, kclVersion = 1.0)
|
2025-03-24 21:55:24 +13:00
|
|
|
|
|
|
|
/// Construct a 2-dimensional circle, of the specified radius, centered at
|
|
|
|
/// the provided (x, y) origin point.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// exampleSketch = startSketchOn(-XZ)
|
|
|
|
/// |> circle(center = [0, 0], radius = 10)
|
|
|
|
///
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
2025-04-25 16:01:35 -05:00
|
|
|
/// |> startProfile(at = [-15, 0])
|
2025-03-24 21:55:24 +13:00
|
|
|
/// |> line(end = [30, 0])
|
|
|
|
/// |> line(end = [0, 30])
|
|
|
|
/// |> line(end = [-30, 0])
|
|
|
|
/// |> close()
|
2025-04-26 15:31:51 -05:00
|
|
|
/// |> subtract2d(tool = circle(center = [0, 15], radius = 5))
|
2025-03-24 21:55:24 +13:00
|
|
|
///
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
/// ```
|
|
|
|
@(impl = std_rust)
|
|
|
|
export fn circle(
|
|
|
|
/// Sketch to extend, or plane or surface to sketch on.
|
|
|
|
@sketch_or_surface: Sketch | Plane | Face,
|
|
|
|
/// The center of the circle.
|
|
|
|
center: Point2d,
|
|
|
|
/// The radius of the circle.
|
2025-04-14 05:58:19 -04:00
|
|
|
radius: number(Length),
|
2025-03-24 21:55:24 +13:00
|
|
|
/// Create a new tag which refers to this circle.
|
|
|
|
tag?: tag,
|
|
|
|
): Sketch {}
|
2025-04-03 22:44:52 +13:00
|
|
|
|
2025-05-06 16:09:59 +12:00
|
|
|
/// Rotate a sketch around some provided axis, creating a solid from its extent.
|
2025-04-03 22:44:52 +13:00
|
|
|
///
|
2025-05-06 16:09:59 +12:00
|
|
|
/// This, like extrude, is able to create a 3-dimensional solid from a
|
|
|
|
/// 2-dimensional sketch. However, unlike extrude, this creates a solid
|
|
|
|
/// by using the extent of the sketch as its revolved around an axis rather
|
|
|
|
/// than using the extent of the sketch linearly translated through a third
|
|
|
|
/// dimension.
|
2025-04-03 22:44:52 +13:00
|
|
|
///
|
2025-05-06 16:09:59 +12:00
|
|
|
/// Revolve occurs around a local sketch axis rather than a global axis.
|
|
|
|
///
|
|
|
|
/// You can provide more than one sketch to revolve, and they will all be
|
|
|
|
/// revolved around the same axis.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// part001 = startSketchOn(XY)
|
|
|
|
/// |> startProfile(at = [4, 12])
|
|
|
|
/// |> line(end = [2, 0])
|
|
|
|
/// |> line(end = [0, -6])
|
|
|
|
/// |> line(end = [4, -6])
|
|
|
|
/// |> line(end = [0, -6])
|
|
|
|
/// |> line(end = [-3.75, -4.5])
|
|
|
|
/// |> line(end = [0, -5.5])
|
|
|
|
/// |> line(end = [-2, 0])
|
|
|
|
/// |> close()
|
|
|
|
/// |> revolve(axis = Y) // default angle is 360
|
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// // A donut shape.
|
|
|
|
/// sketch001 = startSketchOn(XY)
|
|
|
|
/// |> circle( center = [15, 0], radius = 5 )
|
|
|
|
/// |> revolve(
|
|
|
|
/// angle = 360,
|
|
|
|
/// axis = Y,
|
|
|
|
/// )
|
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// part001 = startSketchOn(XY)
|
|
|
|
/// |> startProfile(at = [4, 12])
|
|
|
|
/// |> line(end = [2, 0])
|
|
|
|
/// |> line(end = [0, -6])
|
|
|
|
/// |> line(end = [4, -6])
|
|
|
|
/// |> line(end = [0, -6])
|
|
|
|
/// |> line(end = [-3.75, -4.5])
|
|
|
|
/// |> line(end = [0, -5.5])
|
|
|
|
/// |> line(end = [-2, 0])
|
|
|
|
/// |> close()
|
|
|
|
/// |> revolve(axis = Y, angle = 180)
|
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// part001 = startSketchOn(XY)
|
|
|
|
/// |> startProfile(at = [4, 12])
|
|
|
|
/// |> line(end = [2, 0])
|
|
|
|
/// |> line(end = [0, -6])
|
|
|
|
/// |> line(end = [4, -6])
|
|
|
|
/// |> line(end = [0, -6])
|
|
|
|
/// |> line(end = [-3.75, -4.5])
|
|
|
|
/// |> line(end = [0, -5.5])
|
|
|
|
/// |> line(end = [-2, 0])
|
|
|
|
/// |> close()
|
|
|
|
/// |> revolve(axis = Y, angle = 180)
|
|
|
|
///
|
|
|
|
/// part002 = startSketchOn(part001, face = END)
|
|
|
|
/// |> startProfile(at = [4.5, -5])
|
|
|
|
/// |> line(end = [0, 5])
|
|
|
|
/// |> line(end = [5, 0])
|
|
|
|
/// |> line(end = [0, -5])
|
|
|
|
/// |> close()
|
|
|
|
/// |> extrude(length = 5)
|
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// box = startSketchOn(XY)
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
/// |> line(end = [0, 20])
|
|
|
|
/// |> line(end = [20, 0])
|
|
|
|
/// |> line(end = [0, -20])
|
|
|
|
/// |> close()
|
|
|
|
/// |> extrude(length = 20)
|
|
|
|
///
|
|
|
|
/// sketch001 = startSketchOn(box, face = END)
|
|
|
|
/// |> circle( center = [10,10], radius = 4 )
|
|
|
|
/// |> revolve(
|
|
|
|
/// angle = -90,
|
|
|
|
/// axis = Y
|
|
|
|
/// )
|
|
|
|
/// ```
|
2025-04-03 22:44:52 +13:00
|
|
|
///
|
|
|
|
/// ```
|
2025-05-06 16:09:59 +12:00
|
|
|
/// box = startSketchOn(XY)
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
/// |> line(end = [0, 20])
|
|
|
|
/// |> line(end = [20, 0])
|
|
|
|
/// |> line(end = [0, -20], tag = $revolveAxis)
|
|
|
|
/// |> close()
|
|
|
|
/// |> extrude(length = 20)
|
2025-04-03 22:44:52 +13:00
|
|
|
///
|
2025-05-06 16:09:59 +12:00
|
|
|
/// sketch001 = startSketchOn(box, face = END)
|
|
|
|
/// |> circle( center = [10,10], radius = 4 )
|
|
|
|
/// |> revolve(
|
|
|
|
/// angle = 90,
|
|
|
|
/// axis = getOppositeEdge(revolveAxis)
|
|
|
|
/// )
|
2025-04-03 22:44:52 +13:00
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// ```
|
2025-05-06 16:09:59 +12:00
|
|
|
/// box = startSketchOn(XY)
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
/// |> line(end = [0, 20])
|
|
|
|
/// |> line(end = [20, 0])
|
|
|
|
/// |> line(end = [0, -20], tag = $revolveAxis)
|
|
|
|
/// |> close()
|
|
|
|
/// |> extrude(length = 20)
|
2025-04-03 22:44:52 +13:00
|
|
|
///
|
2025-05-06 16:09:59 +12:00
|
|
|
/// sketch001 = startSketchOn(box, face = END)
|
|
|
|
/// |> circle( center = [10,10], radius = 4 )
|
|
|
|
/// |> revolve(
|
|
|
|
/// angle = 90,
|
|
|
|
/// axis = getOppositeEdge(revolveAxis),
|
|
|
|
/// tolerance = 0.0001
|
|
|
|
/// )
|
2025-04-03 22:44:52 +13:00
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// ```
|
2025-05-06 16:09:59 +12:00
|
|
|
/// sketch001 = startSketchOn(XY)
|
|
|
|
/// |> startProfile(at = [10, 0])
|
|
|
|
/// |> line(end = [5, -5])
|
|
|
|
/// |> line(end = [5, 5])
|
|
|
|
/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
|
|
/// |> close()
|
|
|
|
///
|
|
|
|
/// part001 = revolve(
|
|
|
|
/// sketch001,
|
|
|
|
/// axis = {
|
|
|
|
/// direction = [0.0, 1.0],
|
|
|
|
/// origin = [0.0, 0.0]
|
|
|
|
/// }
|
|
|
|
/// )
|
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// // Revolve two sketches around the same axis.
|
|
|
|
///
|
|
|
|
/// sketch001 = startSketchOn(XY)
|
|
|
|
/// profile001 = startProfile(sketch001, at = [4, 8])
|
|
|
|
/// |> xLine(length = 3)
|
|
|
|
/// |> yLine(length = -3)
|
|
|
|
/// |> xLine(length = -3)
|
|
|
|
/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
|
|
/// |> close()
|
|
|
|
///
|
|
|
|
/// profile002 = startProfile(sketch001, at = [-5, 8])
|
|
|
|
/// |> xLine(length = 3)
|
|
|
|
/// |> yLine(length = -3)
|
|
|
|
/// |> xLine(length = -3)
|
|
|
|
/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
|
|
/// |> close()
|
|
|
|
///
|
|
|
|
/// revolve(
|
|
|
|
/// [profile001, profile002],
|
|
|
|
/// axis = X,
|
|
|
|
/// )
|
|
|
|
/// ```
|
2025-04-03 22:44:52 +13:00
|
|
|
///
|
2025-05-06 16:09:59 +12:00
|
|
|
/// ```
|
|
|
|
/// // Revolve around a path that has not been extruded.
|
|
|
|
///
|
|
|
|
/// profile001 = startSketchOn(XY)
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
/// |> line(end = [0, 20], tag = $revolveAxis)
|
|
|
|
/// |> line(end = [20, 0])
|
|
|
|
/// |> line(end = [0, -20])
|
|
|
|
/// |> close(%)
|
2025-04-03 22:44:52 +13:00
|
|
|
///
|
2025-05-06 16:09:59 +12:00
|
|
|
/// sketch001 = startSketchOn(XY)
|
|
|
|
/// |> circle(center = [-10, 10], radius = 4)
|
|
|
|
/// |> revolve(angle = 90, axis = revolveAxis)
|
2025-04-03 22:44:52 +13:00
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// ```
|
2025-05-06 16:09:59 +12:00
|
|
|
/// // Revolve around a path that has not been extruded or closed.
|
|
|
|
///
|
|
|
|
/// profile001 = startSketchOn(XY)
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
/// |> line(end = [0, 20], tag = $revolveAxis)
|
|
|
|
/// |> line(end = [20, 0])
|
2025-04-03 22:44:52 +13:00
|
|
|
///
|
2025-05-06 16:09:59 +12:00
|
|
|
/// sketch001 = startSketchOn(XY)
|
|
|
|
/// |> circle(center = [-10, 10], radius = 4)
|
|
|
|
/// |> revolve(angle = 90, axis = revolveAxis)
|
2025-04-03 22:44:52 +13:00
|
|
|
/// ```
|
2025-04-04 12:55:21 -07:00
|
|
|
///
|
|
|
|
/// ```
|
2025-05-06 16:09:59 +12:00
|
|
|
/// // Symmetrically revolve around a path.
|
2025-04-04 12:55:21 -07:00
|
|
|
///
|
2025-05-06 16:09:59 +12:00
|
|
|
/// profile001 = startSketchOn(XY)
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
/// |> line(end = [0, 20], tag = $revolveAxis)
|
|
|
|
/// |> line(end = [20, 0])
|
|
|
|
///
|
|
|
|
/// sketch001 = startSketchOn(XY)
|
|
|
|
/// |> circle(center = [-10, 10], radius = 4)
|
|
|
|
/// |> revolve(angle = 90, axis = revolveAxis, symmetric = true)
|
|
|
|
/// ```
|
2025-04-04 12:55:21 -07:00
|
|
|
///
|
2025-05-06 16:09:59 +12:00
|
|
|
/// ```
|
|
|
|
/// // Bidirectional revolve around a path.
|
|
|
|
///
|
|
|
|
/// profile001 = startSketchOn(XY)
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
/// |> line(end = [0, 20], tag = $revolveAxis)
|
|
|
|
/// |> line(end = [20, 0])
|
|
|
|
///
|
|
|
|
/// sketch001 = startSketchOn(XY)
|
|
|
|
/// |> circle(center = [-10, 10], radius = 4)
|
|
|
|
/// |> revolve(angle = 90, axis = revolveAxis, bidirectionalAngle = 50)
|
2025-04-04 12:55:21 -07:00
|
|
|
/// ```
|
2025-04-03 22:44:52 +13:00
|
|
|
@(impl = std_rust)
|
2025-05-06 16:09:59 +12:00
|
|
|
export fn revolve(
|
|
|
|
/// The sketch or set of sketches that should be revolved
|
2025-04-03 22:44:52 +13:00
|
|
|
@sketches: [Sketch; 1+],
|
2025-05-06 16:09:59 +12:00
|
|
|
/// Axis of revolution.
|
2025-04-03 22:44:52 +13:00
|
|
|
axis: Axis2d | Edge,
|
2025-05-06 16:09:59 +12:00
|
|
|
/// Angle to revolve (in degrees). Default is 360.
|
|
|
|
angle?: number(Angle),
|
|
|
|
/// Tolerance for the revolve operation.
|
|
|
|
tolerance?: number(Length),
|
|
|
|
/// If true, the extrusion will happen symmetrically around the sketch. Otherwise, the extrusion will happen on only one side of the sketch.
|
|
|
|
symmetric?: bool,
|
|
|
|
/// If specified, will also revolve in the opposite direction to 'angle' to the specified angle. If 'symmetric' is true, this value is ignored.
|
|
|
|
bidirectionalAngle?: number(Angle),
|
|
|
|
/// A named tag for the face at the start of the revolve, i.e. the original sketch.
|
|
|
|
tagStart?: tag,
|
|
|
|
/// A named tag for the face at the end of the revolve.
|
|
|
|
tagEnd?: tag,
|
|
|
|
): Solid {}
|