From a59c92e262181465af052c8fa407ee47008aab0a Mon Sep 17 00:00:00 2001 From: Eshaan Date: Sun, 21 Dec 2025 07:58:56 -0600 Subject: [PATCH 1/3] Added Feature Studio tutorial to resources sidebar and resource's index --- docs/resources/featurestudio.md | 1 + docs/resources/index.md | 2 ++ mkdocs.yml | 1 + 3 files changed, 4 insertions(+) create mode 100644 docs/resources/featurestudio.md diff --git a/docs/resources/featurestudio.md b/docs/resources/featurestudio.md new file mode 100644 index 000000000..0519ecba6 --- /dev/null +++ b/docs/resources/featurestudio.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/resources/index.md b/docs/resources/index.md index 2053573d5..caa8964ca 100644 --- a/docs/resources/index.md +++ b/docs/resources/index.md @@ -17,4 +17,6 @@ A collection of resources to support your workflow in Onshape, relevant to FRC. [**Featurescript Help**](featurescript-help.md "Featurescript Help Page"): Some tutorials on how to add and update featurescripts. +[**Using Feature Studio**](featurestudio.md "Feature Studio Tutorial Page"): The basics of Feature Studio +
\ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 2326024ae..5f27fe12f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -365,6 +365,7 @@ nav: - KrayonCAD: resources/krayonCAD.md - Featurescript List: resources/featurescripts.md - Featurescript Help: resources/featurescript-help.md + - Feature Studio Tutorial: resources/featurestudio.md - Design Challenges: - Overview: resources/design-challenges/overview.md From a44d475212d2a4a124ddbc0a5ae64af6713e7325 Mon Sep 17 00:00:00 2001 From: Eshaan Date: Wed, 24 Dec 2025 10:00:28 -0600 Subject: [PATCH 2/3] added documentation for how to use feature studio --- docs/resources/featurestudio.md | 235 +++++++++++++++++- .../images/featurestudio/annotated-input.webp | Bin 0 -> 2660 bytes .../featurestudio/featurestudio-ex1.gif | Bin 0 -> 13750 bytes .../featurestudio/featurestudio-ex2.gif | Bin 0 -> 25717 bytes .../featurestudio/featurestudio-ex3.gif | Bin 0 -> 29000 bytes .../featurestudio/no-annotation-input.webp | Bin 0 -> 5530 bytes 6 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 docs/resources/images/featurestudio/annotated-input.webp create mode 100644 docs/resources/images/featurestudio/featurestudio-ex1.gif create mode 100644 docs/resources/images/featurestudio/featurestudio-ex2.gif create mode 100644 docs/resources/images/featurestudio/featurestudio-ex3.gif create mode 100644 docs/resources/images/featurestudio/no-annotation-input.webp diff --git a/docs/resources/featurestudio.md b/docs/resources/featurestudio.md index 0519ecba6..fe8fef581 100644 --- a/docs/resources/featurestudio.md +++ b/docs/resources/featurestudio.md @@ -1 +1,234 @@ - \ No newline at end of file +## Syntax + +### Variables and Constants +In Feature Studio, you can define a variable with `var name = value`. Later in code, when you use name, it will use the value associated with it. Additionally, if the value is assigned once and never changed, you can change the declaration to `const name = value`. + +### Functions +A function is a block of code that is easily reusable and preforms a specific task. To define a function, you type `function myFunctionName()`. If you need to pass things into the function, you can use the syntax `function myFunctionName(var1 is Type)`. To execute the function, you can call it with the syntax `myFunctionName(var1)` + +### Common Patterns +Typically, variable names are expected to be in camelCase(ex: var1, thisIsVar1, i, j). Boolean variables should be prefixed with do(ex: doFlip, doFillEntirePart). + +Top-level constants should be in UPPERCASE_WITH_UNDERSCORES(ex: INCHES_TO_FEET, PI, E). Only do this if you know this value will never change. Also, code should always adhere to the DRY(Don't Repeat Yourself) principle. Take the following code for instance: + +```ts +const circle1 = 3.14159 * 3 * 3; +const circle2 = 3.14159 * 7 * 7; +``` + +This code correctly calculates the area of 2 circles, but it is hard to read. We have unnecessarily repeated the PI * R^2 formula. This could be reformatted as: + +```ts +const PI = 3.14159; + +function calcCircleArea(radius is number){ + return PI * radius * radius; +} + +const circle1 = calcCircleArea(3); +const circle2 = calcCircleArea(7); +``` + +### Creating a Featurescript +After creating a new document, click the plus icon on the bottom left. Create a Feature Studio. Next, click on the New Feature button on the top left. It will insert the following code: + +```ts +annotation { "Feature Type Name" : "My Feature", "Feature Type Description" : "" } +export const myFeature = defineFeature(function(context is Context, id is Id, definition is map) + precondition + { + // Define the parameters of the feature type + } + { + // Define the function's action + }); +``` + +Let's go line-by-line through this code. + +`annotation {...}` is talked about in depth later in the course. In short, it tells the UI what to display. + +`export const myFeature =` exports the feature so Onshape can discover it. + +`defineFeature(function(context is Context, id is Id, definition is map){` calls defineFeature and passes it your code. `context` contains the geometry, `id` is a unique id for this feature, `definition` contains user-supplied values + +`precondition{` contains the code that tells Onshape what inputs your featurescript needs. + +`{` contains the code that tells onshape what to do. + +To run your code, use the shortcut `ctrl+s` or click the commit button, then navigate to the Part Studio tab and type your featurescript name into the search bar. +## Precondition Body + +### Annotation +The `annotation{...}` syntax helps the user to attach extra information to the next statement that does not change the program's core logic, but provides metadata that Onshape can use. It takes in a map object(`{"key": "value"}`). Here are some of the most common keys: + +- `"Name"`: Display name for a variable +- `"Filter"`: Specifies predicates for a feature script input. +- `UIHint"`: Changes the default display of an input. Can be any of [these](https://cad.onshape.com/FsDoc/library.html#UIHint) +- `"Feature Type Name"`: Display name for a feature +- `"Default"` sets a default value for an input. + +### Predicates + +Predicates are used to restrict user input by controlling what kinds of entities a user is allowed to select. There are three commonly used types of predicates: [EntityType](https://cad.onshape.com/FsDoc/library.html#EntityType), [GeometryType](https://cad.onshape.com/FsDoc/library.html#GeometryType), and [SketchObject](https://cad.onshape.com/FsDoc/library.html#SketchObject). To use these predicates, you can combine them with logical operators(and: `&&`, or: `||`, not: `!`). + +```ts +//the user can only select cylindrical faces +annotation{ + ... + "Filter": EntityType.FACE && GeometryType.CYLINDER + ... +} +``` + +### Geometry Validation + +Another way to guarantee that the user is selecting only valid inputs is with the `is___`-type functions. For example, `isInteger` guarantees that the value passed into it is an integer by throwing an error if its not. Likewise, the `isAngle` function will ensure that its parameter is an angle. This is slightly different from a predicate, however, because predicates enforce their restriction at compile time; if your predicate specifies a face, you must select a face because onshape will literally not let you select anything else. With these functions, you can still type in invalid values, but the feature script will throw an error. + +### User Input + +To get user input, you must specify in the `definition` variable what type of input you want. For example, if you wanted to take in a message to display to the user, you would state `definition.specialMessage is string`. This tells onshape that it should a field called specialMessage and have it take in a string. + +
![alt text](../images/featurestudio/no-annotation-input.webp)
+ +Even though it works, it is not pretty. Many users expect to see Special Message for an input field label, not specialMessage. Additionally, it could be hard to for the user to know what that field even does. This is where annotations come into play. With `annotation{}`, we can tell onshape to display `Special Message` and tell it what description to display. Here is the complete code for the featurescript: + +```ts +FeatureScript 2837; +import(path : "onshape/std/common.fs", version : "2837.0"); + +annotation { "Feature Type Name" : "My Feature", "Feature Type Description" : "" } +export const myFeature = defineFeature(function(context is Context, id is Id, definition is map) + precondition + { + annotation { "Name" : "Special Message", "Description" : "Text to engrave into selected face"} + definition.specialMessage is string; + } + { + // Define the function's action + }); +``` +
![alt text](../images/featurestudio/annotated-input.webp)
+ +Clicking the Feature Parameters button on the top left(has a p and is to the right of the New Feature button) will allow you to automatically insert many different types of inputs. + +## Function Body + +### Queries + +Queries contain IDs for geometry. Onshape does this so that even if the geometry changes, the Query will still evaluate to the correct geometry. Queries can give you access to many different types of functions. For example, `qAdjacent` will find all adjacent elements to a query. Most functions will only return one query even if there are multiple geometry elements selected. This is because queries are allowed to contain multiple different geometry elements. To split them up, you can use `qEvaluate` to turn it into a list of queries. Common query methods include: + +- `qAdjacent` +- `qSubtraction` / `qUnion` +- `qNthElement` +- `areQueriesEquivalent` + +All of their documentation/use cases are available [here](https://cad.onshape.com/FsDoc); + +### IDs +Every operation in Feature Studio must have a unique ID. The `id` variable is given to your featurescript at runtime that you should append before each assigned ID. ID's are stored hierarchically and each routine should have a unique ID prefix. The `+` operator tells Onshape to make a new level. Take for instance the following pseudocode: + +```ts +// create a sketch with ID `rect1ID` +const rect1ID = id+"r"+1 +createRect(rect1ID); + +// extrude the sketch identified by `rect1ID` +const extrude1ID = id+"e"+1 +extrude(extrude1ID, rect1ID); +``` +This creates a valid hierarchy. Each parent element is comprised of unique children. When Onshape executes this, it looks like this: + +
![](../images/featurestudio/featurestudio-ex1.gif){width=80%}
+ +Now, lets look at an example of what an invalid hierarchy would look like. + +```ts +// create a sketch with ID `rect1ID` +const rect1ID = id+"r"+1 +createRect(rect1ID); + +// extrude the sketch identified by `rect1ID` +const extrude1ID = id+"e"+1 +extrude(extrude1ID, rect1ID); + +// create a sketch with ID `rect2ID` +const rect2ID = id+"r"+2 +createRect(rect2ID); + +// extrude the sketch identified by `rect2ID` +const extrude2ID = id+"e"+2 +extrude(extrude2ID, rect2ID); +``` + +It's hierarchy looks like this. + +
![](../images/featurestudio/featurestudio-ex2.gif){width=80%}
+ +Notice how there the order of creation is id->r, id->e, id->r. Onshape does not allow two nonconsecutive levels with the same name. However, as one final example, let's look at what onshape DOES allow. + +```ts +// create a sketch with ID `rect1ID` +const rect1ID = id+"r"+1 +createRect(rect1ID); + +// create a sketch with ID `rect2ID` +const rect2ID = id+"r"+2 +createRect(rect2ID); + +// extrude the sketch identified by `rect1ID` +const extrude1ID = id+"e"+1 +extrude(extrude1ID, rect1ID); + +// extrude the sketch identified by `rect2ID` +const extrude2ID = id+"e"+2 +extrude(extrude2ID, rect2ID); +``` + +
![](../images/featurestudio/featurestudio-ex3.gif){width=80%}
+ +Onshape allows this even though the "r" level is repeated because they are consecutive, unlike the previous example. Notice how previously the order was id->r, id->e, id->r, id->e, whereas this one was id->r, id->r, id->e, id->e. + +### Sketches + +To create a sketch, use the `newSketch(context, "id", {"face": queryOfPlanarFace})`, or if you only have a `Plane` object, use `newSketch(context, "id", {"face": planeObject})`. Planes can be created with the `plane(origin, normal, x)` function. To draw on the plane use functions prefixed with `sk`, such as: + +- `skCircle` +- `skEllipse` +- `skBezier` +- `skRectangle` +- `skConstraint` + +As always, all descriptions of these function are available on the [documentation](https://cad.onshape.com/FsDoc). + +To finish a sketch, use the `skSolve(sketch)` function. + +To do any operations on a sketch, get it's associated query with the function `qSketchRegion` + +### Operations + +Operations modify or create geometry in the Part Studio. The take in queries to produce modified bodies. Almost all operations are prefixed with `op`. The most common operations are: + +- `opExtrude` +- `opRevolve` +- `opBoolean` +- `opFillet` +- `opTransform` +- `opPattern` + +Every `op___` function has a detailed signature and examples in the [Standard Library Documentation](https://cad.onshape.com/FsDoc). + +### Debugging + +Often when making featurescripts, you run into errors that occur during runtime. To help with this, onshape has exposed the `debug` function. Given a context and a variable, it will print it out and highlight it if it can. You can also optionally specify a color. For example, if you wanted to find all adjacent elements to a face, but for some reason it wasn't returning what you wanted, you could highlight the face like this: + +```ts +... +const face = qNthElement(qEverything(EntityType.FACE), 0); +debug(context, face); +//optionally specify color: `debug(context, face, DebugColor.BLACK)` +``` + +## Additional Resources + +Don't forget every method has detailed descriptions in the [Standard Library Documentation](https://cad.onshape.com/FsDoc). \ No newline at end of file diff --git a/docs/resources/images/featurestudio/annotated-input.webp b/docs/resources/images/featurestudio/annotated-input.webp new file mode 100644 index 0000000000000000000000000000000000000000..039afd19df94bcca893d7159bf53e01b71e3f153 GIT binary patch literal 2660 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 literal 0 HcmV?d00001 diff --git a/docs/resources/images/featurestudio/featurestudio-ex2.gif b/docs/resources/images/featurestudio/featurestudio-ex2.gif new file mode 100644 index 0000000000000000000000000000000000000000..8189c4b80db350deac0930115c077dd7446e0c0e GIT binary patch literal 25717 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 literal 0 HcmV?d00001 diff --git a/docs/resources/images/featurestudio/featurestudio-ex3.gif b/docs/resources/images/featurestudio/featurestudio-ex3.gif new file mode 100644 index 0000000000000000000000000000000000000000..f58205e00171e56e7dd81f460aa24b6153306744 GIT binary patch literal 29000 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

}Hq2jcgmc#6y*@QDY8`%V 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 M$A1jSOB@IQJH6l-C;$Ke literal 0 HcmV?d00001 diff --git a/docs/resources/images/featurestudio/no-annotation-input.webp b/docs/resources/images/featurestudio/no-annotation-input.webp new file mode 100644 index 0000000000000000000000000000000000000000..9b4c0784839364b2154ece718019b96f43bdeaf2 GIT binary patch literal 5530 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 Date: Thu, 25 Dec 2025 14:35:34 -0600 Subject: [PATCH 3/3] added some clarifications --- docs/resources/featurestudio.md | 19 ++++++++++++------- docs/resources/index.md | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/docs/resources/featurestudio.md b/docs/resources/featurestudio.md index fe8fef581..440cfc382 100644 --- a/docs/resources/featurestudio.md +++ b/docs/resources/featurestudio.md @@ -1,3 +1,6 @@ +!!! note + For many teams, writing your own FeatureScripts is not necessary. There are plenty of pre-made FeatureScripts addressed [here]() + ## Syntax ### Variables and Constants @@ -29,7 +32,7 @@ const circle1 = calcCircleArea(3); const circle2 = calcCircleArea(7); ``` -### Creating a Featurescript +### Creating a FeatureScript After creating a new document, click the plus icon on the bottom left. Create a Feature Studio. Next, click on the New Feature button on the top left. It will insert the following code: ```ts @@ -52,11 +55,11 @@ Let's go line-by-line through this code. `defineFeature(function(context is Context, id is Id, definition is map){` calls defineFeature and passes it your code. `context` contains the geometry, `id` is a unique id for this feature, `definition` contains user-supplied values -`precondition{` contains the code that tells Onshape what inputs your featurescript needs. +`precondition{` contains the code that tells Onshape what inputs your FeatureScript needs. `{` contains the code that tells onshape what to do. -To run your code, use the shortcut `ctrl+s` or click the commit button, then navigate to the Part Studio tab and type your featurescript name into the search bar. +To run your code, use the shortcut `ctrl+s` or click the commit button, then navigate to the Part Studio tab and type your FeatureScript name into the search bar. ## Precondition Body ### Annotation @@ -116,7 +119,7 @@ Clicking the Feature Parameters button on the top left(has a p and is to the rig ### Queries -Queries contain IDs for geometry. Onshape does this so that even if the geometry changes, the Query will still evaluate to the correct geometry. Queries can give you access to many different types of functions. For example, `qAdjacent` will find all adjacent elements to a query. Most functions will only return one query even if there are multiple geometry elements selected. This is because queries are allowed to contain multiple different geometry elements. To split them up, you can use `qEvaluate` to turn it into a list of queries. Common query methods include: +Queries contain IDs for geometry. Onshape does this so that even if the geometry changes, the Query will still evaluate to the correct geometry. Queries can give you access to many different types of functions. For example, `qAdjacent` will find all adjacent elements to a query. Most functions will only return one query even if there are multiple geometry elements selected. This is because queries are allowed to contain multiple different geometry elements. To split them up, you can use `qEvaluate` to turn it into a list of queries. Common query functions include: - `qAdjacent` - `qSubtraction` / `qUnion` @@ -126,7 +129,7 @@ Queries contain IDs for geometry. Onshape does this so that even if the geometry All of their documentation/use cases are available [here](https://cad.onshape.com/FsDoc); ### IDs -Every operation in Feature Studio must have a unique ID. The `id` variable is given to your featurescript at runtime that you should append before each assigned ID. ID's are stored hierarchically and each routine should have a unique ID prefix. The `+` operator tells Onshape to make a new level. Take for instance the following pseudocode: +Every operation in Feature Studio must have a unique ID. The `id` variable is given to your FeatureScript at runtime that you should append before each assigned ID. ID's are stored hierarchically and each routine should have a unique ID prefix. The `+` operator tells Onshape to make a new level. Take for instance the following pseudocode: ```ts // create a sketch with ID `rect1ID` @@ -189,6 +192,8 @@ extrude(extrude2ID, rect2ID); Onshape allows this even though the "r" level is repeated because they are consecutive, unlike the previous example. Notice how previously the order was id->r, id->e, id->r, id->e, whereas this one was id->r, id->r, id->e, id->e. +There are additional examples + explanations [here](https://cad.onshape.com/FsDoc/library.html#Id); + ### Sketches To create a sketch, use the `newSketch(context, "id", {"face": queryOfPlanarFace})`, or if you only have a `Plane` object, use `newSketch(context, "id", {"face": planeObject})`. Planes can be created with the `plane(origin, normal, x)` function. To draw on the plane use functions prefixed with `sk`, such as: @@ -220,7 +225,7 @@ Every `op___` function has a detailed signature and examples in the [Standard Li ### Debugging -Often when making featurescripts, you run into errors that occur during runtime. To help with this, onshape has exposed the `debug` function. Given a context and a variable, it will print it out and highlight it if it can. You can also optionally specify a color. For example, if you wanted to find all adjacent elements to a face, but for some reason it wasn't returning what you wanted, you could highlight the face like this: +Often when making FeatureScripts, you run into errors that occur during runtime. To help with this, onshape has exposed the `debug` function. Given a context and a variable, it will print it out and highlight it if it can. You can also optionally specify a color. For example, if you wanted to find all adjacent elements to a face, but for some reason it wasn't returning what you wanted, you could highlight the face like this: ```ts ... @@ -231,4 +236,4 @@ debug(context, face); ## Additional Resources -Don't forget every method has detailed descriptions in the [Standard Library Documentation](https://cad.onshape.com/FsDoc). \ No newline at end of file +Don't forget every function has detailed descriptions in the [Standard Library Documentation](https://cad.onshape.com/FsDoc). \ No newline at end of file diff --git a/docs/resources/index.md b/docs/resources/index.md index caa8964ca..d88fd7d40 100644 --- a/docs/resources/index.md +++ b/docs/resources/index.md @@ -17,6 +17,6 @@ A collection of resources to support your workflow in Onshape, relevant to FRC. [**Featurescript Help**](featurescript-help.md "Featurescript Help Page"): Some tutorials on how to add and update featurescripts. -[**Using Feature Studio**](featurestudio.md "Feature Studio Tutorial Page"): The basics of Feature Studio +[**Writing FeatureScripts**](featurestudio.md "FeatureScript Tutorial Page"): The basics of Feature Studio
\ No newline at end of file