Revolve/Sweep multiple sketches at once (#5779)
* revolve multiple sketches at once Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * do the same for swweep Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * do the same for swweep Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com>
This commit is contained in:
@ -6,7 +6,7 @@ layout: manual
|
||||
|
||||
Extend a 2-dimensional sketch through a third dimension in order to create new 3-dimensional volume, or if extruded into an existing volume, cut into an existing solid.
|
||||
|
||||
|
||||
You can provide more than one sketch to extrude, and they will all be extruded in the same direction.
|
||||
|
||||
```js
|
||||
extrude(
|
||||
@ -20,7 +20,7 @@ extrude(
|
||||
|
||||
| Name | Type | Description | Required |
|
||||
|----------|------|-------------|----------|
|
||||
| `sketchSet` | [`SketchSet`](/docs/kcl/types/SketchSet) | Which sketches should be extruded | Yes |
|
||||
| `sketchSet` | [`SketchSet`](/docs/kcl/types/SketchSet) | Which sketch or set of sketches should be extruded | Yes |
|
||||
| `length` | [`number`](/docs/kcl/types/number) | How far to extrude the given sketches | Yes |
|
||||
|
||||
### Returns
|
||||
|
File diff suppressed because one or more lines are too long
@ -89138,7 +89138,7 @@
|
||||
{
|
||||
"name": "extrude",
|
||||
"summary": "Extend a 2-dimensional sketch through a third dimension in order to create new 3-dimensional volume, or if extruded into an existing volume, cut into an existing solid.",
|
||||
"description": "",
|
||||
"description": "You can provide more than one sketch to extrude, and they will all be extruded in the same direction.",
|
||||
"tags": [],
|
||||
"keywordArguments": true,
|
||||
"args": [
|
||||
@ -90844,7 +90844,7 @@
|
||||
},
|
||||
"required": true,
|
||||
"includeInSnippet": true,
|
||||
"description": "Which sketches should be extruded",
|
||||
"description": "Which sketch or set of sketches should be extruded",
|
||||
"labelRequired": false
|
||||
},
|
||||
{
|
||||
@ -254139,7 +254139,7 @@
|
||||
{
|
||||
"name": "revolve",
|
||||
"summary": "Rotate a sketch around some provided axis, creating a solid from its extent.",
|
||||
"description": "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.\n\nRevolve occurs around a local sketch axis rather than a global axis.",
|
||||
"description": "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.\n\nRevolve occurs around a local sketch axis rather than a global axis.\n\nYou can provide more than one sketch to revolve, and they will all be revolved around the same axis.",
|
||||
"tags": [],
|
||||
"keywordArguments": false,
|
||||
"args": [
|
||||
@ -255382,11 +255382,14 @@
|
||||
"labelRequired": true
|
||||
},
|
||||
{
|
||||
"name": "sketch",
|
||||
"type": "Sketch",
|
||||
"name": "sketchSet",
|
||||
"type": "SketchSet",
|
||||
"schema": {
|
||||
"$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema",
|
||||
"title": "Sketch",
|
||||
"title": "SketchSet",
|
||||
"description": "A sketch or a group of sketches.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"__meta",
|
||||
@ -255396,9 +255399,16 @@
|
||||
"originalId",
|
||||
"paths",
|
||||
"start",
|
||||
"type",
|
||||
"units"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"sketch"
|
||||
]
|
||||
},
|
||||
"id": {
|
||||
"description": "The id of the sketch (this will change when the engine's reference to it changes).",
|
||||
"type": "string",
|
||||
@ -255456,7 +255466,29 @@
|
||||
"$ref": "#/components/schemas/Metadata"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": [
|
||||
"object",
|
||||
"array"
|
||||
],
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/Sketch"
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"sketches"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"definitions": {
|
||||
"Axis2dOrEdgeReference": {
|
||||
"description": "A 2D axis or tagged edge.",
|
||||
@ -257166,10 +257198,13 @@
|
||||
],
|
||||
"returnValue": {
|
||||
"name": "",
|
||||
"type": "Solid",
|
||||
"type": "SolidSet",
|
||||
"schema": {
|
||||
"$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema",
|
||||
"title": "Solid",
|
||||
"title": "SolidSet",
|
||||
"description": "A solid or a group of solids.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"__meta",
|
||||
@ -257177,10 +257212,17 @@
|
||||
"height",
|
||||
"id",
|
||||
"sketch",
|
||||
"type",
|
||||
"units",
|
||||
"value"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"solid"
|
||||
]
|
||||
},
|
||||
"id": {
|
||||
"description": "The id of the solid.",
|
||||
"type": "string",
|
||||
@ -257243,7 +257285,29 @@
|
||||
"$ref": "#/components/schemas/Metadata"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": [
|
||||
"object",
|
||||
"array"
|
||||
],
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/Solid"
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"solids"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"definitions": {
|
||||
"ArtifactId": {
|
||||
"type": "string",
|
||||
@ -258850,7 +258914,8 @@
|
||||
"box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 20])\n |> line(end = [20, 0])\n |> line(end = [0, -20])\n |> close()\n |> extrude(length = 20)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle(center = [10, 10], radius = 4)\n |> revolve({ angle = -90, axis = 'y' }, %)",
|
||||
"box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 20])\n |> line(end = [20, 0])\n |> line(end = [0, -20], tag = $revolveAxis)\n |> close()\n |> extrude(length = 20)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle(center = [10, 10], radius = 4)\n |> revolve({\n angle = 90,\n axis = getOppositeEdge(revolveAxis)\n }, %)",
|
||||
"box = startSketchOn('XY')\n |> startProfileAt([0, 0], %)\n |> line(end = [0, 20])\n |> line(end = [20, 0])\n |> line(end = [0, -20], tag = $revolveAxis)\n |> close()\n |> extrude(length = 20)\n\nsketch001 = startSketchOn(box, \"END\")\n |> circle(center = [10, 10], radius = 4)\n |> revolve({\n angle = 90,\n axis = getOppositeEdge(revolveAxis),\n tolerance = 0.0001\n }, %)",
|
||||
"sketch001 = startSketchOn('XY')\n |> startProfileAt([10, 0], %)\n |> line(end = [5, -5])\n |> line(end = [5, 5])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\npart001 = revolve({\n axis = {\n custom = {\n axis = [0.0, 1.0],\n origin = [0.0, 0.0]\n }\n }\n}, sketch001)"
|
||||
"sketch001 = startSketchOn('XY')\n |> startProfileAt([10, 0], %)\n |> line(end = [5, -5])\n |> line(end = [5, 5])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\npart001 = revolve({\n axis = {\n custom = {\n axis = [0.0, 1.0],\n origin = [0.0, 0.0]\n }\n }\n}, sketch001)",
|
||||
"// Revolve two sketches around the same axis.\n\n\nsketch001 = startSketchOn('XY')\nprofile001 = startProfileAt([4, 8], sketch001)\n |> xLine(length = 3)\n |> yLine(length = -3)\n |> xLine(length = -3)\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\nprofile002 = startProfileAt([-5, 8], sketch001)\n |> xLine(length = 3)\n |> yLine(length = -3)\n |> xLine(length = -3)\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\nrevolve({ axis = \"X\" }, [profile001, profile002])"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -304862,16 +304927,19 @@
|
||||
{
|
||||
"name": "sweep",
|
||||
"summary": "Extrude a sketch along a path.",
|
||||
"description": "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 path. This is useful for creating more complex shapes that can't be created with a simple extrusion.",
|
||||
"description": "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 path. This is useful for creating more complex shapes that can't be created with a simple extrusion.\n\nYou can provide more than one sketch to sweep, and they will all be swept along the same path.",
|
||||
"tags": [],
|
||||
"keywordArguments": true,
|
||||
"args": [
|
||||
{
|
||||
"name": "sketch",
|
||||
"type": "Sketch",
|
||||
"name": "sketchSet",
|
||||
"type": "SketchSet",
|
||||
"schema": {
|
||||
"$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema",
|
||||
"title": "Sketch",
|
||||
"title": "SketchSet",
|
||||
"description": "A sketch or a group of sketches.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"__meta",
|
||||
@ -304881,9 +304949,16 @@
|
||||
"originalId",
|
||||
"paths",
|
||||
"start",
|
||||
"type",
|
||||
"units"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"sketch"
|
||||
]
|
||||
},
|
||||
"id": {
|
||||
"description": "The id of the sketch (this will change when the engine's reference to it changes).",
|
||||
"type": "string",
|
||||
@ -304941,7 +305016,29 @@
|
||||
"$ref": "#/components/schemas/Metadata"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": [
|
||||
"object",
|
||||
"array"
|
||||
],
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/Sketch"
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"sketches"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"definitions": {
|
||||
"Path": {
|
||||
"description": "A path.",
|
||||
@ -306536,7 +306633,7 @@
|
||||
},
|
||||
"required": true,
|
||||
"includeInSnippet": true,
|
||||
"description": "The sketch that should be swept in space",
|
||||
"description": "The sketch or set of sketches that should be swept in space",
|
||||
"labelRequired": false
|
||||
},
|
||||
{
|
||||
@ -311516,10 +311613,13 @@
|
||||
],
|
||||
"returnValue": {
|
||||
"name": "",
|
||||
"type": "Solid",
|
||||
"type": "SolidSet",
|
||||
"schema": {
|
||||
"$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema",
|
||||
"title": "Solid",
|
||||
"title": "SolidSet",
|
||||
"description": "A solid or a group of solids.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"__meta",
|
||||
@ -311527,10 +311627,17 @@
|
||||
"height",
|
||||
"id",
|
||||
"sketch",
|
||||
"type",
|
||||
"units",
|
||||
"value"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"solid"
|
||||
]
|
||||
},
|
||||
"id": {
|
||||
"description": "The id of the solid.",
|
||||
"type": "string",
|
||||
@ -311593,7 +311700,29 @@
|
||||
"$ref": "#/components/schemas/Metadata"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": [
|
||||
"object",
|
||||
"array"
|
||||
],
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/Solid"
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"solids"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"definitions": {
|
||||
"ArtifactId": {
|
||||
"type": "string",
|
||||
@ -313194,7 +313323,8 @@
|
||||
"deprecated": false,
|
||||
"examples": [
|
||||
"// Create a pipe using a sweep.\n\n\n// Create a path for the sweep.\nsweepPath = startSketchOn('XZ')\n |> startProfileAt([0.05, 0.05], %)\n |> line(end = [0, 7])\n |> tangentialArc({ offset = 90, radius = 5 }, %)\n |> line(end = [-3, 0])\n |> tangentialArc({ offset = -90, radius = 5 }, %)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn('XY')\n |> circle(center = [0, 0], radius = 2)\n |> hole(pipeHole, %)\n |> sweep(path = sweepPath)",
|
||||
"// Create a spring by sweeping around a helix path.\n\n\n// Create a helix around the Z axis.\nhelixPath = helix(\n angleStart = 0,\n ccw = true,\n revolutions = 4,\n length = 10,\n radius = 5,\n axis = 'Z',\n)\n\n// Create a spring by sweeping around the helix path.\nspringSketch = startSketchOn('YZ')\n |> circle(center = [0, 0], radius = 1)\n |> sweep(path = helixPath)"
|
||||
"// Create a spring by sweeping around a helix path.\n\n\n// Create a helix around the Z axis.\nhelixPath = helix(\n angleStart = 0,\n ccw = true,\n revolutions = 4,\n length = 10,\n radius = 5,\n axis = 'Z',\n)\n\n// Create a spring by sweeping around the helix path.\nspringSketch = startSketchOn('YZ')\n |> circle(center = [0, 0], radius = 1)\n |> sweep(path = helixPath)",
|
||||
"// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn('XY')\nrectangleSketch = startProfileAt([-200, 23.86], sketch001)\n |> angledLine([0, 73.47], %, $rectangleSegmentA001)\n |> angledLine([\n segAng(rectangleSegmentA001) - 90,\n 50.61\n ], %)\n |> angledLine([\n segAng(rectangleSegmentA001),\n -segLen(rectangleSegmentA001)\n ], %)\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn('YZ')\nsweepPath = startProfileAt([0, 0], sketch002)\n |> yLine(length = 231.81)\n |> tangentialArc({ radius = 80, offset = -90 }, %)\n |> xLine(length = 384.93)\n\nsweep([rectangleSketch, circleSketch], path = sweepPath)"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -178,13 +178,8 @@ impl KclErrorWithOutputs {
|
||||
path: self
|
||||
.filenames
|
||||
.get(&first_source_range.module_id())
|
||||
.ok_or_else(|| {
|
||||
anyhow::anyhow!(
|
||||
"Could not find filename for module id: {:?}",
|
||||
first_source_range.module_id()
|
||||
)
|
||||
})?
|
||||
.clone(),
|
||||
.cloned()
|
||||
.unwrap_or(ModulePath::Main),
|
||||
});
|
||||
let filename = source.path.to_string();
|
||||
let kcl_source = source.source.to_string();
|
||||
@ -192,11 +187,10 @@ impl KclErrorWithOutputs {
|
||||
let mut related = Vec::new();
|
||||
for source_range in source_ranges {
|
||||
let module_id = source_range.module_id();
|
||||
let source = self
|
||||
.source_files
|
||||
.get(&module_id)
|
||||
.cloned()
|
||||
.ok_or_else(|| anyhow::anyhow!("Could not find source file for module id: {:?}", module_id))?;
|
||||
let source = self.source_files.get(&module_id).cloned().unwrap_or(ModuleSource {
|
||||
source: code.to_string(),
|
||||
path: self.filenames.get(&module_id).cloned().unwrap_or(ModulePath::Main),
|
||||
});
|
||||
let error = self.error.override_source_ranges(vec![source_range]);
|
||||
let report = Report {
|
||||
error,
|
||||
|
@ -522,13 +522,6 @@ impl Args {
|
||||
FromArgs::from_args(self, 0)
|
||||
}
|
||||
|
||||
pub(crate) fn get_data_and_sketch<'a, T>(&'a self) -> Result<(T, Sketch), KclError>
|
||||
where
|
||||
T: serde::de::DeserializeOwned + FromArgs<'a>,
|
||||
{
|
||||
FromArgs::from_args(self, 0)
|
||||
}
|
||||
|
||||
pub(crate) fn get_data_and_sketch_set<'a, T>(&'a self) -> Result<(T, SketchSet), KclError>
|
||||
where
|
||||
T: serde::de::DeserializeOwned + FromArgs<'a>,
|
||||
|
@ -34,6 +34,9 @@ pub async fn extrude(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
|
||||
/// create new 3-dimensional volume, or if extruded into an existing volume,
|
||||
/// cut into an existing solid.
|
||||
///
|
||||
/// You can provide more than one sketch to extrude, and they will all be
|
||||
/// extruded in the same direction.
|
||||
///
|
||||
/// ```no_run
|
||||
/// example = startSketchOn('XZ')
|
||||
/// |> startProfileAt([0, 0], %)
|
||||
@ -82,7 +85,7 @@ pub async fn extrude(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
|
||||
keywords = true,
|
||||
unlabeled_first = true,
|
||||
args = {
|
||||
sketch_set = { docs = "Which sketches should be extruded"},
|
||||
sketch_set = { docs = "Which sketch or set of sketches should be extruded"},
|
||||
length = { docs = "How far to extrude the given sketches"},
|
||||
}
|
||||
}]
|
||||
|
@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{
|
||||
errors::{KclError, KclErrorDetails},
|
||||
execution::{ExecState, KclValue, Sketch, Solid},
|
||||
execution::{ExecState, KclValue, Sketch, SketchSet, SolidSet},
|
||||
std::{axis_or_reference::Axis2dOrEdgeReference, extrude::do_post_extrude, fillet::default_tolerance, Args},
|
||||
};
|
||||
|
||||
@ -28,12 +28,12 @@ pub struct RevolveData {
|
||||
pub tolerance: Option<f64>,
|
||||
}
|
||||
|
||||
/// Revolve a sketch around an axis.
|
||||
/// Revolve a sketch or set of sketches around an axis.
|
||||
pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result<KclValue, KclError> {
|
||||
let (data, sketch): (RevolveData, Sketch) = args.get_data_and_sketch()?;
|
||||
let (data, sketch_set): (RevolveData, SketchSet) = args.get_data_and_sketch_set()?;
|
||||
|
||||
let value = inner_revolve(data, sketch, exec_state, args).await?;
|
||||
Ok(KclValue::Solid { value })
|
||||
let value = inner_revolve(data, sketch_set, exec_state, args).await?;
|
||||
Ok(value.into())
|
||||
}
|
||||
|
||||
/// Rotate a sketch around some provided axis, creating a solid from its extent.
|
||||
@ -46,6 +46,9 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
|
||||
///
|
||||
/// 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.
|
||||
///
|
||||
/// ```no_run
|
||||
/// part001 = startSketchOn('XY')
|
||||
/// |> startProfileAt([4, 12], %)
|
||||
@ -174,16 +177,39 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result<KclValue,
|
||||
/// }
|
||||
/// }, sketch001)
|
||||
/// ```
|
||||
///
|
||||
/// ```no_run
|
||||
/// // Revolve two sketches around the same axis.
|
||||
///
|
||||
/// sketch001 = startSketchOn('XY')
|
||||
/// profile001 = startProfileAt([4, 8], sketch001)
|
||||
/// |> xLine(length = 3)
|
||||
/// |> yLine(length = -3)
|
||||
/// |> xLine(length = -3)
|
||||
/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
||||
/// |> close()
|
||||
///
|
||||
/// profile002 = startProfileAt([-5, 8], sketch001)
|
||||
/// |> xLine(length = 3)
|
||||
/// |> yLine(length = -3)
|
||||
/// |> xLine(length = -3)
|
||||
/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
||||
/// |> close()
|
||||
///
|
||||
/// revolve({
|
||||
/// axis = "X",
|
||||
/// }, [profile001, profile002])
|
||||
/// ```
|
||||
#[stdlib {
|
||||
name = "revolve",
|
||||
feature_tree_operation = true,
|
||||
}]
|
||||
async fn inner_revolve(
|
||||
data: RevolveData,
|
||||
sketch: Sketch,
|
||||
sketch_set: SketchSet,
|
||||
exec_state: &mut ExecState,
|
||||
args: Args,
|
||||
) -> Result<Box<Solid>, KclError> {
|
||||
) -> Result<SolidSet, KclError> {
|
||||
if let Some(angle) = data.angle {
|
||||
// Return an error if the angle is zero.
|
||||
// We don't use validate() here because we want to return a specific error message that is
|
||||
@ -198,8 +224,12 @@ async fn inner_revolve(
|
||||
|
||||
let angle = Angle::from_degrees(data.angle.unwrap_or(360.0));
|
||||
|
||||
let sketches: Vec<Sketch> = sketch_set.into();
|
||||
let mut solids = Vec::new();
|
||||
for sketch in &sketches {
|
||||
let id = exec_state.next_uuid();
|
||||
match data.axis {
|
||||
|
||||
match &data.axis {
|
||||
Axis2dOrEdgeReference::Axis(axis) => {
|
||||
let (axis, origin) = axis.axis_and_origin()?;
|
||||
args.batch_modeling_cmd(
|
||||
@ -230,5 +260,8 @@ async fn inner_revolve(
|
||||
}
|
||||
}
|
||||
|
||||
do_post_extrude(sketch, id.into(), 0.0, exec_state, args).await
|
||||
solids.push(do_post_extrude(sketch.clone(), id.into(), 0.0, exec_state, args.clone()).await?);
|
||||
}
|
||||
|
||||
Ok(solids.into())
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{
|
||||
errors::KclError,
|
||||
execution::{ExecState, Helix, KclValue, Sketch, Solid},
|
||||
execution::{ExecState, Helix, KclValue, Sketch, SketchSet, SolidSet},
|
||||
std::{extrude::do_post_extrude, fillet::default_tolerance, Args},
|
||||
};
|
||||
|
||||
@ -30,7 +30,7 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
|
||||
let tolerance = args.get_kw_arg_opt("tolerance")?;
|
||||
|
||||
let value = inner_sweep(sketch, path, sectional, tolerance, exec_state, args).await?;
|
||||
Ok(KclValue::Solid { value })
|
||||
Ok(value.into())
|
||||
}
|
||||
|
||||
/// Extrude a sketch along a path.
|
||||
@ -41,6 +41,9 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
|
||||
/// creating more complex shapes that can't be created with a simple
|
||||
/// extrusion.
|
||||
///
|
||||
/// You can provide more than one sketch to sweep, and they will all be
|
||||
/// swept along the same path.
|
||||
///
|
||||
/// ```no_run
|
||||
/// // Create a pipe using a sweep.
|
||||
///
|
||||
@ -94,40 +97,79 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result<KclValue, K
|
||||
/// |> circle( center = [0, 0], radius = 1)
|
||||
/// |> sweep(path = helixPath)
|
||||
/// ```
|
||||
///
|
||||
/// ```
|
||||
/// // Sweep two sketches along the same path.
|
||||
///
|
||||
/// sketch001 = startSketchOn('XY')
|
||||
/// rectangleSketch = startProfileAt([-200, 23.86], sketch001)
|
||||
/// |> angledLine([0, 73.47], %, $rectangleSegmentA001)
|
||||
/// |> angledLine([
|
||||
/// segAng(rectangleSegmentA001) - 90,
|
||||
/// 50.61
|
||||
/// ], %)
|
||||
/// |> angledLine([
|
||||
/// segAng(rectangleSegmentA001),
|
||||
/// -segLen(rectangleSegmentA001)
|
||||
/// ], %)
|
||||
/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
||||
/// |> close()
|
||||
///
|
||||
/// circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)
|
||||
///
|
||||
/// sketch002 = startSketchOn('YZ')
|
||||
/// sweepPath = startProfileAt([0, 0], sketch002)
|
||||
/// |> yLine(length = 231.81)
|
||||
/// |> tangentialArc({
|
||||
/// radius = 80,
|
||||
/// offset = -90,
|
||||
/// }, %)
|
||||
/// |> xLine(length = 384.93)
|
||||
///
|
||||
/// sweep([rectangleSketch, circleSketch], path = sweepPath)
|
||||
/// ```
|
||||
#[stdlib {
|
||||
name = "sweep",
|
||||
feature_tree_operation = true,
|
||||
keywords = true,
|
||||
unlabeled_first = true,
|
||||
args = {
|
||||
sketch = { docs = "The sketch that should be swept in space" },
|
||||
sketch_set = { docs = "The sketch or set of sketches that should be swept in space" },
|
||||
path = { docs = "The path to sweep the sketch along" },
|
||||
sectional = { docs = "If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components." },
|
||||
tolerance = { docs = "Tolerance for this operation" },
|
||||
}
|
||||
}]
|
||||
async fn inner_sweep(
|
||||
sketch: Sketch,
|
||||
sketch_set: SketchSet,
|
||||
path: SweepPath,
|
||||
sectional: Option<bool>,
|
||||
tolerance: Option<f64>,
|
||||
exec_state: &mut ExecState,
|
||||
args: Args,
|
||||
) -> Result<Box<Solid>, KclError> {
|
||||
) -> Result<SolidSet, KclError> {
|
||||
let trajectory = match path {
|
||||
SweepPath::Sketch(sketch) => sketch.id.into(),
|
||||
SweepPath::Helix(helix) => helix.value.into(),
|
||||
};
|
||||
|
||||
let sketches: Vec<Sketch> = sketch_set.into();
|
||||
let mut solids = Vec::new();
|
||||
for sketch in &sketches {
|
||||
let id = exec_state.next_uuid();
|
||||
args.batch_modeling_cmd(
|
||||
id,
|
||||
ModelingCmd::from(mcmd::Sweep {
|
||||
target: sketch.id.into(),
|
||||
trajectory: match path {
|
||||
SweepPath::Sketch(sketch) => sketch.id.into(),
|
||||
SweepPath::Helix(helix) => helix.value.into(),
|
||||
},
|
||||
trajectory,
|
||||
sectional: sectional.unwrap_or(false),
|
||||
tolerance: LengthUnit(tolerance.unwrap_or(default_tolerance(&args.ctx.settings.units))),
|
||||
}),
|
||||
)
|
||||
.await?;
|
||||
|
||||
do_post_extrude(sketch, id.into(), 0.0, exec_state, args).await
|
||||
solids.push(do_post_extrude(sketch.clone(), id.into(), 0.0, exec_state, args.clone()).await?);
|
||||
}
|
||||
|
||||
Ok(solids.into())
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
source: kcl/src/simulation_tests.rs
|
||||
source: kcl-lib/src/simulation_tests.rs
|
||||
description: Operations executed import_function_not_sketch.kcl
|
||||
---
|
||||
[
|
||||
@ -44,7 +44,7 @@ description: Operations executed import_function_not_sketch.kcl
|
||||
3
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
@ -325,7 +325,7 @@ description: Operations executed ball-bearing.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
@ -585,7 +585,7 @@ description: Operations executed ball-bearing.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
@ -833,7 +833,7 @@ description: Operations executed ball-bearing.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
@ -1845,7 +1845,7 @@ description: Operations executed car-wheel-assembly.kcl
|
||||
3
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
@ -1909,7 +1909,7 @@ description: Operations executed car-wheel-assembly.kcl
|
||||
3
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
@ -2851,7 +2851,7 @@ description: Operations executed car-wheel-assembly.kcl
|
||||
3
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
@ -3101,7 +3101,7 @@ description: Operations executed car-wheel-assembly.kcl
|
||||
6
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
@ -3540,7 +3540,7 @@ description: Operations executed car-wheel-assembly.kcl
|
||||
5
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
@ -3604,7 +3604,7 @@ description: Operations executed car-wheel-assembly.kcl
|
||||
7
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
@ -57,7 +57,7 @@ description: Operations executed french-press.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
@ -744,7 +744,7 @@ description: Operations executed french-press.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
@ -808,7 +808,7 @@ description: Operations executed french-press.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
@ -1340,7 +1340,7 @@ description: Operations executed french-press.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
@ -473,7 +473,7 @@ description: Operations executed gridfinity-baseplate-magnets.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
@ -473,7 +473,7 @@ description: Operations executed gridfinity-baseplate.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
@ -473,7 +473,7 @@ description: Operations executed gridfinity-bins-stacking-lip.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
@ -3012,7 +3012,7 @@ description: Operations executed gridfinity-bins-stacking-lip.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
@ -3346,7 +3346,7 @@ description: Operations executed gridfinity-bins-stacking-lip.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
@ -473,7 +473,7 @@ description: Operations executed gridfinity-bins.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
File diff suppressed because one or more lines are too long
@ -67,7 +67,7 @@ description: Operations executed pipe-flange-assembly.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
@ -1,5 +1,5 @@
|
||||
---
|
||||
source: kcl/src/simulation_tests.rs
|
||||
source: kcl-lib/src/simulation_tests.rs
|
||||
description: Operations executed pipe-with-bend.kcl
|
||||
---
|
||||
[
|
||||
@ -95,7 +95,7 @@ description: Operations executed pipe-with-bend.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
@ -44,7 +44,7 @@ description: Operations executed pipe.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
@ -125,7 +125,7 @@ description: Operations executed poopy-shoe.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
@ -3134,7 +3134,7 @@ description: Operations executed walkie-talkie.kcl
|
||||
7
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
BIN
rust/kcl-lib/tests/outputs/serial_test_example_revolve8.png
Normal file
BIN
rust/kcl-lib/tests/outputs/serial_test_example_revolve8.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 95 KiB |
BIN
rust/kcl-lib/tests/outputs/serial_test_example_sweep2.png
Normal file
BIN
rust/kcl-lib/tests/outputs/serial_test_example_sweep2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 91 KiB |
@ -125,7 +125,7 @@ description: Operations executed poop_chute.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
@ -81,7 +81,7 @@ description: Operations executed revolve_about_edge.kcl
|
||||
0
|
||||
]
|
||||
},
|
||||
"sketch": {
|
||||
"sketchSet": {
|
||||
"value": {
|
||||
"type": "Sketch",
|
||||
"value": {
|
||||
|
Reference in New Issue
Block a user