Command reference
Browse commands by their names and default keyboard shortcuts. Entries are organized by command group and panel; ungrouped commands follow by area.
For step-by-step instructions, start with the window tour, sketching guide or solid features guide. Practical command guides below explain prerequisites, options and examples in place. Entries without a practical guide link to an overview instead. Contribute a guide, tip, demo or model link.
Expand Automation details for the command ID and parameters used by scripts, the CLI and MCP. In that notation, ? marks an optional parameter and expr means a number or an expression with units.
This catalog is generated from solidcraft-cli commands by cargo xtask book (646 commands).
Practical guides:
- Extrude
- Revolve
- Sweep
- Box
- Cylinder
- Sphere
- Torus
- Cone
- Fillet
- Chamfer
- Rectangular Pattern
- Circular Pattern
- Mirror
- Hole
- Pipe
- Bounding Solid
- Offset Face
- Thread
- Shell
- Rib
- Web
- Emboss
- Flange
- Hem
SOLID › CREATE
Create Sketch
Command group: SOLID › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| plane | XY|XZ|YZ| construction plane name or id | {origin?: [x,y,z] numbers in mm, default [0,0,0] (not an expression), x_dir, y_dir}| {face: [world x,y,z], body?: exact world body, index?: face index, path?: complete occurrence ids, fixed?: bool} | Yes | sketch x, y along world +X, +Y on XY; +X, -Z on XZ; +Y, +Z on YZ; in world coordinates unless frame says otherwise; a named plane is the active component's own |
| offset | expr | No | |
| flip | bool | "x" | "y" | No | not on a face: sketch the plane from its other side, so the normal and the default extrude direction are reversed; a half turn about the plane's own x or y axis, true picks the one keeping the sketch's y axis upward; offset still moves along the unflipped normal |
| frame | world| component | No | default; which coordinates an explicit plane is in; the reply's `frame` says which, with a `note` when the active component is moved or turned |
| project_edges | bool | No | |
| activate_part | bool | No | default false; on a face of a body of another component than the active one: activate that component at the picked placement first, as component.activate would, and make the sketch there; it stays active afterwards and the reply's `activated` names it |
| name | No |
Automation details
Command ID: sketch.create
Parameters:
plane: XY|XZ|YZ (sketch x, y along world +X, +Y on XY; +X, -Z on XZ; +Y, +Z on YZ) | construction plane name or id | {origin?: [x,y,z] numbers in mm, default [0,0,0] (not an expression), x_dir, y_dir} (in world coordinates unless frame says otherwise; a named plane is the active component's own) | {face: [world x,y,z], body?: exact world body, index?: face index, path?: complete occurrence ids, fixed?: bool}; new face attachments require a unique certified source (a flat face of a sheet metal body attaches to its panel instead, in the flat pattern's coordinates), fixed:true explicitly freezes the selected plane; offset?: expr, flip?: bool | "x" | "y" (not on a face: sketch the plane from its other side, so the normal and the default extrude direction are reversed; a half turn about the plane's own x or y axis, true picks the one keeping the sketch's y axis upward; offset still moves along the unflipped normal), frame?: world (default) | component (which coordinates an explicit plane is in; the reply's `frame` says which, with a `note` when the active component is moved or turned), project_edges?: bool, activate_part?: bool (default false; on a face of a body of another component than the active one: activate that component at the picked placement first, as component.activate would, and make the sketch there; it stays active afterwards and the reply's `activated` names it), name?
Extrude
Command group: SOLID › CREATE
Default keyboard shortcut: E
Turn a flat sketch region into a solid, or add or remove material from an existing body. For example, a rectangle extruded 20 mm becomes a rectangular block.
Before you start
- For a solid extrusion, finish a sketch with at least one closed region. Select the region you want, rather than an individual edge or point.
- You can also select a planar face of an existing body instead of a sketch.
- To add or remove material, an existing body must meet the extrusion. Choose New Body when you want an independent piece.
- Thin Extrude uses sketch curves instead of filled regions; open chains are allowed. This is useful for a wall or a ring.
Options
| Choice | What it does | When to use it |
|---|---|---|
| Profiles | Chooses the filled sketch regions to extrude. A loop inside another loop makes a hole. | Select just the regions you need when a sketch contains several. |
| Distance | Sets how far the shape extends. Values can include units, such as 20 mm, or a named design parameter. | Make a part to a known size. |
| Reverse Direction | Sends the extrusion to the other side of the sketch. | The preview points away from the intended body. |
| Symmetric | Splits the entered total distance equally across the sketch plane. 10 mm extends 5 mm on each side. | Keep the sketch at the middle of a part. |
| Two Sides | Sets a separate distance on each side. | The sketch is between two unequal extensions. |
| Through All | Reaches through the target body. | Cut a hole that must stay open when the body becomes thicker. |
| To Object | Stops at a selected target face, vertex or point. An offset can stop before or beyond that target. | Let the end follow another part of the design. |
| Start | Starts at the sketch, at an offset from it, or from a selected object. | Leave a gap before the extrusion begins. |
| Taper Angle | Slopes the side walls. | Make drafted sides; reduce the angle if the profile’s narrow details cannot support it. |
| Operation | New Body makes a separate piece; Join adds material; Cut removes it; Intersect keeps only the overlap. | Choose the intended result explicitly when the automatic preview is not what you want. |
| Target bodies | Chooses which existing bodies take part in a join, cut or intersection. | Several bodies lie in the extrusion’s path. |
| Thin Extrude | Builds walls along curves; thickness and side control where the material lies. Two-sided walls can have different thicknesses. | Make ribs, walls or rings without drawing both wall boundaries. |
Try it: a 20 mm block
- Create a sketch on the XY plane and draw a closed rectangle.
- Finish the sketch and choose Extrude.
- Select the rectangular region, set Distance to 20 mm, and choose New Body.
- Check the preview’s direction and confirm. You should have one solid block.
- Edit the extrusion in the timeline to change its distance later.
Tips and common mistakes
- Do check the operation before confirming. Automatic operation can join an addition or cut into an existing body; it is not a promise of a separate part.
- Do use Through All for a cut that should follow later thickness changes.
- Don’t expect an open outline to make a filled solid. Close it, or choose Thin Extrude for a wall.
- Don’t assume a symmetric distance is the distance on each side. New symmetric extrusions use the total distance; older saved designs can retain their earlier convention.
- Taper with a two-sided or symmetric extent is not supported. A very steep taper can also be refused rather than creating an invalid result.
Examples and community resources
The bracket starts with a closed L-shaped profile; another extrusion removes the two holes. Its dimensions are controlled by design parameters.
| Resource | What to explore | Author and licence |
|---|---|---|
| Editable bracket recipe | A complete SolidCraft example using an extrusion, a fillet and a cut. | SolidCraft contributors; MIT OR Apache-2.0. |
Contribute a tip, demo, model or screenshot to add a reviewed resource beside this explanation.
See also
Revolve turns a profile around an axis. Sweep carries a profile along a path. Flange creates sheet metal with a thickness rule.
| Parameter | Type | Required | Description |
|---|---|---|---|
| distance | expr | Yes | or through_all: true |
| taper | angle expr | No | positive: outward, so the far end is larger along the extrusion direction; negative: inward, so the far end is smaller |
| corner | preserve_curvature|tangent|round | No | how a taper closes a sharp corner its offset opens: each wall continues as itself, a line's plane or an arc's cone, until it meets its neighbour; each continues straight along its end tangent; or an arc about the corner. Without it, each profile preserves curvature where every curve is a line or an arc and takes tangent where another curve has a corner, and the feature's warning says so; a corner rule given is kept, and refused where the kernel cannot build it |
| sketch | id|name | No | default: active or last sketch |
| profiles | all | [index] | [{curves: [ids]}]| [{point:[x,y]}] | No | the profile whose outer loop is made of exactly these curves, or pieces of them; found again on every recompute, so it follows parameter changes; islands inside are its holes; an error when no profile or several match; index and point picks are stored by their curves when that finds the same profile; a pick on a drawn profile that reference geometry, such as the projected outline of the face the sketch is on, cuts into regions takes the whole drawn profile |
| exact_regions | bool | No | each index or point pick is exactly the region it names, as the dialogs send |
| face | [x,y,z] | No | extrude a planar body face instead of a sketch profile |
| faces | [[x,y,z],…] | No | coplanar faces of one body |
| face_body | name | No | whose face, where faces of several bodies meet at the point |
| fixed | true | No | with face or faces: start on the face's plane as a fixed plane, which won't follow later changes to the face; for a face whose history can't keep an attachment, such as a converted mesh's |
| direction | positive|negative|symmetric | No | distance is total thickness, split evenly around the start plane |
| convention | total_distance|legacy_per_side | No | how a symmetric distance is read; default total_distance, split evenly around the start plane; legacy_per_side: the distance on each side, as older symmetric extrudes keep |
| distance2 | expr | No | Two Sides: a second distance on the side direction leaves free, the first side may be through_all or to; with direction: negative the first side goes against the normal and distance2 along it; a negative distance only turns its own side over |
| start_offset | expr | No | along the sketch normal, also with direction: negative |
| to | [x,y,z] | No | To Object: a face, vertex or point; to_offset?: expr past it |
| from | [x,y,z] | No | From Object: start at that face or point |
| operation | new|join|cut|intersect|auto | No | cut into a body, otherwise join existing solids; new in an empty component |
| touching | separate|one_body | No | what a join makes of pieces that share no face: separate, the default, makes each piece that touches another only along an edge or at a point a body of its own and keeps pieces that touch nothing in one body; one_body keeps every piece in one body |
| targets | [body] | No | Join from a face, or from a sketch on a body's face, defaults to that face's body; explicit targets or participants override |
| name | No | ||
| body_name | No | ||
| thin | true | No | Thin: a wall along sketch curves instead of the profiles |
| curves | [curve ids] | No | open chains and closed loops, joined where they meet end to end; default: every drawn curve of the sketch |
| thickness | expr | Yes | |
| side | center|inside|outside|two_sides | No | a closed loop's inside is the area it encloses, an open chain's the side it bends toward, a straight line's the left of its first curve as drawn; default center |
| thickness2 | expr | No | two_sides: the thickness outside |
Automation details
Command ID: solid.extrude
Parameters:
distance: expr (or through_all: true); taper?: angle expr (positive: outward, so the far end is larger along the extrusion direction; negative: inward, so the far end is smaller); corner?: preserve_curvature|tangent|round (how a taper closes a sharp corner its offset opens: each wall continues as itself, a line's plane or an arc's cone, until it meets its neighbour; each continues straight along its end tangent; or an arc about the corner. Without it, each profile preserves curvature where every curve is a line or an arc and takes tangent where another curve has a corner, and the feature's warning says so; a corner rule given is kept, and refused where the kernel cannot build it); sketch?: id|name (default: active or last sketch); profiles?: all | [index] | [{curves: [ids]}] (the profile whose outer loop is made of exactly these curves, or pieces of them; found again on every recompute, so it follows parameter changes; islands inside are its holes; an error when no profile or several match) | [{point:[x,y]}] (index and point picks are stored by their curves when that finds the same profile; a pick on a drawn profile that reference geometry, such as the projected outline of the face the sketch is on, cuts into regions takes the whole drawn profile); exact_regions?: bool (each index or point pick is exactly the region it names, as the dialogs send); default: every drawn profile, except that a loop inside another is its hole and a loop inside that hole is material again; face?: [x,y,z] (extrude a planar body face instead of a sketch profile); faces?: [[x,y,z],…] (coplanar faces of one body); face_body?: name (whose face, where faces of several bodies meet at the point); fixed?: true (with face or faces: start on the face's plane as a fixed plane, which won't follow later changes to the face; for a face whose history can't keep an attachment, such as a converted mesh's); direction?: positive|negative|symmetric (distance is total thickness, split evenly around the start plane); convention?: total_distance|legacy_per_side (how a symmetric distance is read; default total_distance, split evenly around the start plane; legacy_per_side: the distance on each side, as older symmetric extrudes keep); distance2?: expr (Two Sides: a second distance on the side direction leaves free, the first side may be through_all or to; with direction: negative the first side goes against the normal and distance2 along it; a negative distance only turns its own side over); start_offset?: expr (along the sketch normal, also with direction: negative); to?: [x,y,z] (To Object: a face, vertex or point; to_offset?: expr past it); from?: [x,y,z] (From Object: start at that face or point); operation?: new|join|cut|intersect|auto (cut into a body, otherwise join existing solids; new in an empty component); touching?: separate|one_body (what a join makes of pieces that share no face: separate, the default, makes each piece that touches another only along an edge or at a point a body of its own and keeps pieces that touch nothing in one body; one_body keeps every piece in one body); targets?: [body] (Join from a face, or from a sketch on a body's face, defaults to that face's body; explicit targets or participants override); name?; body_name?; thin?: true (Thin: a wall along sketch curves instead of the profiles) with curves?: [curve ids] (open chains and closed loops, joined where they meet end to end; default: every drawn curve of the sketch), thickness: expr, side?: center|inside|outside|two_sides (a closed loop's inside is the area it encloses, an open chain's the side it bends toward, a straight line's the left of its first curve as drawn; default center), thickness2?: expr (two_sides: the thickness outside); corners are mitred, crossing walls are one
Revolve
Command group: SOLID › CREATE
Turn a sketch profile around an axis to make a round part: a shaft, a pin, a pulley or a bushing. You draw the half-section the way it is drawn on a lathe print, and Revolve spins it.
Before you start
- Draw a closed profile of one side of the part: the half-section, from the centre line out.
- You need an axis to spin about: a sketch line, an origin axis, a construction axis, a straight edge, or a cylinder face.
- The profile must stay on one side of the axis. It can touch the axis but not cross it.
- A flat face of the part can also be used as the profile.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Profile | The closed area to spin. | The half-section of a stepped shaft. |
| Axis | The line it spins around. | The sketch line along the centre of the shaft, or the X axis. |
| Type | Angle spins by the angle you type. To Object spins until it reaches a face or point you pick in the To Object box, which replaces Direction and Angle. | Angle for most parts. |
| Direction | One Side spins one way. Two Sides spins a different angle each way. Symmetric splits the angle evenly both ways from the sketch. Shown for Type: Angle. | Symmetric for a 90° segment centred on the sketch. |
| Angle | How far to spin. | 360 deg for a full round part. |
| Angle 2 | The angle on the other side, for Two Sides. | 30 deg one way, 60 deg the other. |
| Operation | New Body, Join, Cut or Intersect. Cut removes material from an existing body. | Cut to turn a groove into an existing shaft. |
Try it: a stepped pin
- Start a sketch on the XY plane. If the document is in mm, type in after each value (for example 0.25in). Draw this closed outline from the origin along the X axis: up 0.25 in, over 1 in, up 0.125 in, over 0.5 in, down 0.375 in back to the X axis, and close it along the axis. Click Finish Sketch.
- Click Revolve. Click the profile.
- Click Axis, then click the sketch line along the X axis. Check the Axis box: if it reads Y, you picked the wrong axis and the preview comes out flat. Pick again.
- Leave Type on Angle, Direction on One Side, and Angle at 360 deg. Set Operation to New Body so the pin is its own part.
- Click OK. You have a pin 0.5 in diameter by 1 in long with a 0.75 in diameter head 0.5 in long.
- For a groove, start a new sketch on the XY plane (it runs through the pin’s centre line). Draw a rectangle that cuts into the shaft, with corners at (0.4 in, 0.20 in) and (0.5 in, 0.30 in), and click Finish Sketch. Revolve it with Operation set to Cut. For the Axis, click the sketch line along the X axis, or click the round side of the pin (not the flat end); its centre line is used. The result is a groove 0.1 in wide and 0.05 in deep.
Tips and common mistakes
- Do draw the centre line as part of the profile, or as a sketch line in the same sketch. Then picking the axis is one click and it moves with the sketch.
- Do use Direction: Symmetric for a partial revolve that should sit centred on the sketch plane.
- Don’t let the profile cross the axis. Keep the whole half-section on one side.
- Don’t draw the full section of the part. Draw one half only; Revolve makes the other half.
See also
Extrude pushes a profile straight instead of spinning it. Thread adds a thread to the revolved shaft. Chamfer breaks its edges.
| Parameter | Type | Required | Description |
|---|---|---|---|
| axis | sketch line id | x | y| X|Y|Z| {type: world, axis: X|Y|Z}| {sketch, curve}| construction axis name| {origin, dir}| {edge|face: [x,y,z]} | Yes | sketch axes; world; as returned by timeline.inspect; a line of another sketch, followed in that sketch; followed when edited; origin: numbers or length expressions, followed when parameters change; a straight or circular edge, or a cylinder, cone or torus face: about its axis, followed as the model changes |
| angle | expr | No | default 360 deg |
| angle2 | expr | No | Two Sides: the other side's angle |
| direction | symmetric | No | angle split either side, independent of axis direction |
| convention | sketch_normal|legacy_axis_start | No | default sketch_normal; legacy retains older angular starts |
| to | [x,y,z] | No | To Object: turn until that face, vertex or point |
| sketch | No | ||
| profiles | [x,y,z] | No | a planar body face as the profile |
| face | [x,y,z] | No | a planar body face as the profile |
| face_body | name | No | whose face, where faces of several bodies meet |
| fixed | true | No | the face's plane as a fixed plane, as solid.extrude's |
| operation | No | ||
| touching | No | ||
| targets | No | ||
| name | No | ||
| body_name | No |
Automation details
Command ID: solid.revolve
Parameters:
axis: sketch line id | x | y (sketch axes) | X|Y|Z (world) | {type: world, axis: X|Y|Z} (as returned by timeline.inspect) | {sketch, curve} (a line of another sketch, followed in that sketch) | construction axis name (followed when edited) | {origin, dir} (origin: numbers or length expressions, followed when parameters change) | {edge|face: [x,y,z]} (a straight or circular edge, or a cylinder, cone or torus face: about its axis, followed as the model changes); angle?: expr (default 360 deg); angle2?: expr (Two Sides: the other side's angle); direction?: symmetric (angle split either side, independent of axis direction); convention?: sketch_normal|legacy_axis_start (default sketch_normal; legacy retains older angular starts); to?: [x,y,z] (To Object: turn until that face, vertex or point); sketch?, profiles? | face: [x,y,z] (a planar body face as the profile) and face_body?: name (whose face, where faces of several bodies meet) and fixed?: true (the face's plane as a fixed plane, as solid.extrude's), operation?, touching?, targets?, name?, body_name?
Sweep
Command group: SOLID › CREATE
Drag a sketched profile along a path to make a solid of the same section all the way: bent flat bar or angle, a handle, a rail, or, with Cut, a groove that follows a curve, such as an O-ring face groove around a rounded-rectangle cover.
Before you start
- You need a profile sketch (a closed shape) and a path: either a second sketch of connected curves, or a chain of a part’s edges. An edge path needs no second sketch.
- Draw the profile on a plane square to the start of the path, touching the path. The profile then runs along the path from there.
- For a plain round tube or rod, Pipe is quicker: it needs only the path and a diameter, plus a wall thickness for a hollow tube. Without a wall it makes a solid rod.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Profile | The closed sketch shape to sweep. | A 0.5 in × 0.25 in rectangle for flat bar. |
| Path | The curves or edges the profile follows. | A line, an arc and a line for a bend. |
| Orientation | Turn with Path: the profile turns to stay square to the path, as bent bar does. Keep as Drawn: the profile keeps the direction it was drawn in. Follow Direction: the profile stays square to the path, and the Direction you pick fixes how it turns about the path. | Turn with Path for almost everything. |
| Direction | An axis, sketch line or straight edge, used only with Follow Direction. | The Z axis, to keep a profile upright on a path that climbs. |
| Rail, Second Rail | Guide curves the profile’s edge follows. With a rail, the profile turns and changes size to stay on it. Rails replace Orientation, Twist and End Scale; Rail Fit sets how they reshape the profile. | A curve that widens a handle toward one end. |
| Operation | New Body when the design has no body yet; otherwise it starts at Join. Cut takes the swept shape out of the part. | Cut for a groove. |
| Twist (Advanced) | Turns the profile by this angle from the start of the path to the end. It starts at 0 deg. | 90 deg for a twisted bar. |
| End Scale (Advanced) | The profile’s size at the end of the path, as a factor of its size at the start. It starts at 1. | 0.5 for a section that tapers to half. |
| Rail Fit (Advanced) | With a rail: Scale grows the whole profile evenly to meet the rail; Stretch stretches it only toward the rail. | Scale to keep the section’s proportions. |
Try it: bend a piece of flat bar
- Start a sketch on the XY plane. From the origin, draw a 3 in line along X, a tangent arc of 1 in radius turning 90°, and a 2 in line. Finish the sketch.
- Start a sketch on the YZ plane. Draw a 0.5 in × 0.25 in rectangle centered on the origin. Finish the sketch.
- Click Sweep. Click Profile and pick the rectangle. Click Path and pick the three path curves.
- Leave Orientation on Turn with Path and click OK. The bar follows the bend, square to the path all the way round.
Tips and common mistakes
- Do start the profile on the path, square to it. A profile away from the path sweeps offset from it.
- Do keep bend radii bigger than the profile’s half-width, or the inside of the bend folds into itself.
- Do use Cut for a groove of constant section along a curve, such as an O-ring face groove: sketch the groove’s section where the path starts and sweep it around.
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 0.5 in enters 12.7 mm.
See also
Pipe sweeps a round section with only a diameter. Extrude sweeps a profile along a straight line. Revolve sweeps it around an axis.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | profile sketch | Yes | |
| profiles | No | ||
| path_sketch | sketch | Yes | |
| path | [curve ids in order] | Yes | |
| path_body | body name | No | |
| path_edges | [points on its edges] | No | the path is a chain of that body's edges, instead of a sketch's curves |
| orientation | perpendicular| parallel| [x,y,z] | No | default: square to the path, turning with it; as drawn: the profile moves without turning; the path must keep crossing its plane; square to the path, its turn about the path fixed by this direction |
| twist | angle expr | No | the profile turns this much about the path over its length; within 4 turns |
| scale | expr | No | the profile's scale at the end, linear along the path; 0.01…100 |
| rails | [{sketch?: sketch (default path_sketch), curves: [curve ids in order]}] | No | guide rails, one or two, each meeting every plane square to the path once along it, from the end nearest the path's start: one rail turns the profile so its point where the rail starts stays on the rail and scales it with the rail's distance from the path; two rails carry it between them, its points where they start staying on both; rails take the default orientation, no twist and no scale, and a path without sharp corners |
| rail_fit | scale| stretch | No | default: the profile grows and shrinks evenly; only across to the rail, between the rails |
| operation | No | ||
| touching | No | ||
| targets | No | ||
| name | No | ||
| body_name | No |
Automation details
Command ID: solid.sweep
Parameters:
sketch: profile sketch; profiles?; path_sketch: sketch; path: [curve ids in order]; path_body?: body name; path_edges?: [points on its edges] (the path is a chain of that body's edges, instead of a sketch's curves); orientation?: perpendicular (default: square to the path, turning with it) | parallel (as drawn: the profile moves without turning; the path must keep crossing its plane) | [x,y,z] (square to the path, its turn about the path fixed by this direction); twist?: angle expr (the profile turns this much about the path over its length; within 4 turns); scale?: expr (the profile's scale at the end, linear along the path; 0.01…100); rails?: [{sketch?: sketch (default path_sketch), curves: [curve ids in order]}] (guide rails, one or two, each meeting every plane square to the path once along it, from the end nearest the path's start: one rail turns the profile so its point where the rail starts stays on the rail and scales it with the rail's distance from the path; two rails carry it between them, its points where they start staying on both; rails take the default orientation, no twist and no scale, and a path without sharp corners); rail_fit?: scale (default: the profile grows and shrinks evenly) | stretch (only across to the rail, between the rails); operation?, touching?, targets?, name?, body_name?
Loft
Command group: SOLID › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sections | [{sketch, profiles?} | {sketch, point: id} (an apex)] | Yes | 2…50, in order; matching hole counts, no holes at an apex |
| rails | [{sketch, curves: [ids in order]}] | No | one or two guide rails from the first section to the last, through every section's outline: the loft follows them between the sections; not with sections that have holes |
| rail_fit | scale|stretch | No | default scale: with one rail the sections grow evenly with the rail's distance from their middle, with two with the distance between the rails; stretch: only that way |
| operation | No | ||
| touching | No | ||
| targets | No | Join excludes hidden bodies from automatic targets; explicit targets or participants may include them | |
| name | No | ||
| body_name | No |
Automation details
Command ID: solid.loft
Parameters:
sections: [{sketch, profiles?} | {sketch, point: id} (an apex)] (2…50, in order; matching hole counts, no holes at an apex); rails?: [{sketch, curves: [ids in order]}] (one or two guide rails from the first section to the last, through every section's outline: the loft follows them between the sections; not with sections that have holes); rail_fit?: scale|stretch (default scale: with one rail the sections grow evenly with the rail's distance from their middle, with two with the distance between the rails; stretch: only that way); operation?, touching?, targets? (Join excludes hidden bodies from automatic targets; explicit targets or participants may include them), name?, body_name?
Box
Command group: SOLID › CREATE
Make a box from a length, width and height: a block of stock, a plate, a fixture base, or a block to cut features into. Place it by a corner or by its center, at a point you pick or at the X, Y and Z you type.
Before you start
- You don’t need a sketch or a body. A box can start a new design.
- Length runs along X, Width along Y and Height along Z.
- Placement decides what the point is: Corner puts one corner of the box there, Center puts the middle of the box there.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Point | A vertex, edge, face or point to place the box at. Leave it empty to use X, Y and Z. | A corner of another block, to stack a box on it. |
| Length, Width, Height | The size of the box along X, Y and Z. Each starts at 20 mm. | 3 in × 2 in × 0.75 in for a plate. |
| Placement | It starts at Corner. Corner: the point is the box’s low corner, and the box runs in +X, +Y and +Z from it. Center: the point is the middle of the box. | Corner at the origin so the part’s dimensions start from 0, 0, 0, like a work offset on a corner. Center for a part dimensioned from its middle. |
| X, Y, Z | Where the point is, when none is picked. | 0, 0, 0. |
| Operation | It starts at New Body. New Body makes a separate body. Join adds it to a body it touches. Cut takes it out. Intersect keeps only the material inside both. | New Body for a fresh block. Cut for a square pocket or step. |
Try it: make a plate from the corner
- In a new design, click Box.
- Set Length to 3 in, Width to 2 in and Height to 0.75 in.
- Set Placement to Corner and leave X, Y and Z at 0. Click OK.
- The plate’s corner sits at the origin, so every dimension on it reads from 0, 0, 0, the way you’d set a work offset on that corner.
Tips and common mistakes
- Do pick Corner or Center to match how the print dimensions the part. It makes later features easier to locate.
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 3 in enters 76.2 mm.
- Do use Extrude from a sketch when the outline isn’t a plain rectangle.
- Don’t confuse Length and Width when the part has a long side. Length runs along X.
See also
Cylinder makes a round blank the same way. Bounding Solid puts a box around a part you already have.
| Parameter | Type | Required | Description |
|---|---|---|---|
| length | expr | Yes | |
| width | expr | Yes | |
| height | expr | Yes | |
| corner | [x,y,z] | No | |
| center | [x,y,z] | No | numbers in mm or length expressions; default: the origin; a box placed by its center stays centred there when its size changes |
| operation | No | ||
| touching | No | ||
| targets | [body] | No | |
| name | No | ||
| body_name | No |
Automation details
Command ID: solid.box
Parameters:
length, width, height: expr; corner?: [x,y,z] | center?: [x,y,z] (numbers in mm or length expressions; default: the origin; a box placed by its center stays centred there when its size changes); operation?, touching?, targets?: [body], name?, body_name?
Cylinder
Command group: SOLID › CREATE
Make a cylinder from a diameter and a height: a round blank, a pin, or a boss standing on a face. Stand it on a face and locate it from two edges, the way a print dimensions it, and it can join the part. A cylinder on a face grows outward, so Cut only removes material where the cylinder overlaps the part; to cut into the part, leave Face empty and set the base below the face with X, Y and Z.
Before you start
- To stand the cylinder on a part, you need a flat face for it to stand on. With no face picked, it stands at the X, Y and Z you type, along the Z axis.
- Locate it from edges of that face the same way a print dimensions a boss from two edges. Pick an edge as Reference 1 and type its distance, then do the same for Reference 2. Both edges must be straight and must not be parallel to each other.
- Height runs from the face out along the face’s normal, away from the part.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Face | The flat face (or a vertex) the cylinder stands on. Leave it empty to place it by X, Y and Z. | The top face of a plate, for a boss. |
| Reference 1 and Distance 1 | An edge of the face, and how far the cylinder’s center is from it. | The left edge, 0.75 in. |
| Reference 2 and Distance 2 | A second edge, and how far the center is from it. | The front edge, 0.75 in. |
| Size | Whether you type a Diameter or a Radius. | Diameter, to match the print. |
| Diameter | The cylinder’s diameter (or Radius, if Size is set to Radius). It starts at 20 in the design’s unit. | 0.500 in for a boss. |
| Height | How long the cylinder is, from the face out. It starts at 20 in the design’s unit. | 0.25 in. |
| Placement, X, Y, Z | With no face picked, where the center of the cylinder’s base goes. | 0, 0, 0 to start a round blank at the origin. |
| Operation | It starts at New Body. New Body makes a separate body. Join adds it to the part. Cut takes it out of the part. Intersect keeps only the material inside both. | Join for a boss. New Body for a round blank or a pin. |
Try it: put a boss on a plate
- Make a 3 in × 2 in × 0.75 in block.
- Click Cylinder. Click Face and click the top face of the block.
- Click Reference 1, pick the left edge of the top face and set Distance 1 to 0.75 in. Click Reference 2, pick the front edge and set Distance 2 to 0.75 in.
- Set Diameter to 0.5 in and Height to 0.25 in. Set Operation to Join and click OK. A 0.500 in boss stands 0.25 in tall, 0.75 in from each edge.
Tips and common mistakes
- Do use Diameter when the print gives a diameter. Switching Size between Diameter and Radius converts the value for you.
- Do use New Body for a round blank or a dowel pin that is its own part, so it doesn’t merge with the part around it.
- Do use Hole for a drilled or tapped hole instead of a Cut cylinder. The hole carries its callout and tap drill.
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 0.5 in enters 12.7 mm.
See also
Hole locates a hole from edges the same way. Extrude makes a boss of any shape from a sketch. Thread adds a thread to the cylinder.
| Parameter | Type | Required | Description |
|---|---|---|---|
| radius | expr | Yes | |
| diameter | expr | Yes | |
| height | expr | Yes | |
| base | [x,y,z] | No | centre of the bottom: numbers in mm or length expressions; default: the origin |
| axis | X|Y|Z|[x,y,z] | No | default Z |
| references | [{edge: [x,y,z] on a straight edge of the face it stands on, distance: expr}] | No | at most two, as solid.hole's: the base centre goes that far from each edge's line, in the face's plane, and follows the edges; with a numeric base only |
| operation | No | ||
| touching | No | ||
| targets | [body] | No | |
| name | No | ||
| body_name | No |
Automation details
Command ID: solid.cylinder
Parameters:
radius | diameter, height: expr; base?: [x,y,z] (centre of the bottom: numbers in mm or length expressions; default: the origin); axis?: X|Y|Z|[x,y,z] (default Z); references?: [{edge: [x,y,z] on a straight edge of the face it stands on, distance: expr}] (at most two, as solid.hole's: the base centre goes that far from each edge's line, in the face's plane, and follows the edges; with a numeric base only); operation?, touching?, targets?: [body], name?, body_name?
Sphere
Command group: SOLID › CREATE
Make a ball from a diameter: a tooling ball, a ball end on a shaft, or, with Cut, a ball seat or detent pocket. Place its center at a point you pick or at the X, Y and Z you type.
Before you start
- You don’t need a sketch or a body. A sphere can start a new design.
- The point is always the center of the sphere.
- To cut a ball seat into a part, put the center on or near the face and use Cut. How deep the seat goes depends on how far the center sits below the face.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Point | A vertex, edge, face or point for the center. Leave it empty to use X, Y and Z. | The end of a shaft, for a ball end. |
| Size | Whether you type a Diameter or a Radius. | Diameter, to match a ball’s size. |
| Diameter | The sphere’s diameter (or Radius, if Size is set to Radius). It starts at 20 mm. | 0.500 in for a tooling ball. |
| Placement, X, Y, Z | Placement is always Center. X, Y and Z set the center when no point is picked. | 0, 0, 0. |
| Operation | It starts at New Body. New Body makes a separate body. Join adds it to a body it touches. Cut takes it out. Intersect keeps only the material inside both. | New Body for a ball. Cut for a ball seat or a detent pocket. |
Try it: cut a ball seat into a plate
- Make a 3 in × 2 in × 0.75 in block with its corner at the origin.
- Click Sphere. Set Diameter to 0.5 in.
- Set X to 1.5 in, Y to 1 in and Z to 0.75 in, so the center sits on the middle of the top face.
- Set Operation to Cut and click OK. A half-ball seat, 0.500 in across and 0.25 in deep, is cut into the top face.
Tips and common mistakes
- Do raise the center above the face for a shallower seat. With a 0.500 in ball and the center 0.1 in above the top face, the seat is 0.15 in deep and about 0.46 in across.
- Don’t put the center below the face for a ball seat. The pocket then goes deeper than half the ball and is narrower at the top than inside: an undercut a ball end mill can’t cut.
- Do use Diameter when the print gives a ball diameter. Switching Size converts the value for you.
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 0.5 in enters 12.7 mm.
- Don’t forget a ball seat cut this way is a full sphere shape. For a drilled seat with a drill point or a flat bottom, use Hole.
See also
Cylinder and Box place the same way. Revolve makes a ball end that blends into a turned profile.
| Parameter | Type | Required | Description |
|---|---|---|---|
| radius | expr | Yes | |
| diameter | expr | Yes | |
| center | [x,y,z] | No | numbers in mm or length expressions; default: the origin |
| operation | No | ||
| touching | No | ||
| targets | [body] | No | |
| name | No | ||
| body_name | No |
Automation details
Command ID: solid.sphere
Parameters:
radius | diameter: expr; center?: [x,y,z] (numbers in mm or length expressions; default: the origin); operation?, touching?, targets?: [body], name?, body_name?
Torus
Command group: SOLID › CREATE
Make a ring with a round section: an O-ring, a round handle, or, with Cut, a round-bottom groove around a shaft or boss. You set two radii and the center point.
Before you start
- You don’t need a sketch or a body. A torus can start a new design.
- The ring lies flat around the Z axis, centered on the point.
- Both sizes are radii, not diameters. Major radius runs from the center to the middle of the ring’s section. Minor radius is the radius of the section itself.
- To model an O-ring from its inside diameter (ID) and cross-section (CS): Major radius = ID ÷ 2 + CS ÷ 2, and Minor radius = CS ÷ 2.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Point | A vertex, edge, face or point for the center. Leave it empty to use X, Y and Z. | The center of a boss’s end face. |
| Major radius | From the center of the ring to the middle of its section. It starts at 20 mm. | 0.5625 in for an O-ring 1.000 in ID × 0.125 in CS. |
| Minor radius | The radius of the round section. It starts at 5 mm. Keep it smaller than Major radius. | 0.0625 in for a 0.125 in cross-section. |
| Placement, X, Y, Z | Placement is always Center. X, Y and Z set the center when no point is picked. | 0, 0, 0. |
| Operation | It starts at New Body. New Body makes a separate body. Join adds it to a body it touches. Cut takes it out. Intersect keeps only the material inside both. | New Body for an O-ring. Cut for a round-bottom groove. |
Try it: model an O-ring
- In a new design, click Torus.
- For an O-ring 1.000 in ID × 0.125 in CS, set Major radius to 0.5625 in and Minor radius to 0.0625 in.
- Leave X, Y and Z at 0 and Operation at New Body. Click OK.
- The ring lies flat around the Z axis: 1.000 in inside, 1.250 in outside, 0.125 in thick.
Tips and common mistakes
- Do halve the sizes on the print. An O-ring is called out by ID and cross-section diameter; the dialog wants radii.
- Don’t use a Cut torus for an O-ring gland. A standard gland has a flat bottom and square walls sized from the O-ring maker’s table; sketch it and use Revolve instead.
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 0.5625 in enters 14.2875 mm.
See also
Sphere, Cylinder and Box place the same way. Revolve turns any sketched section into a ring.
| Parameter | Type | Required | Description |
|---|---|---|---|
| major | expr | Yes | |
| minor | expr | Yes | radii |
| center | [x,y,z] | No | numbers in mm or length expressions; default: the origin |
| operation | No | ||
| touching | No | ||
| targets | [body] | No | |
| name | No | ||
| body_name | No |
Automation details
Command ID: solid.torus
Parameters:
major, minor: expr (radii); center?: [x,y,z] (numbers in mm or length expressions; default: the origin); operation?, touching?, targets?: [body], name?, body_name?
Cone
Command group: SOLID › CREATE
Make a cone or a tapered cylinder from two diameters and a height: a lathe center point, a tapered plug or pin, a spot-drill point, or a tapered boss. Its base circle sits at the X, Y and Z you type, and it runs up the Z axis.
Before you start
- You don’t need a sketch or a body. A cone can start a new design.
- Diameter is the base, at the X, Y and Z point. Top diameter is the other end, Height away along Z. A Top diameter of 0 makes a full cone that comes to a point.
- A negative Height runs the cone down from the base instead of up. Use it to point a cone into a part from its top face.
- To get a cone for an included angle: Height = (Diameter − Top diameter) ÷ 2 ÷ tan(half the angle). For a 60° point on a 1 in diameter, Height = 0.5 ÷ tan 30° = 0.866 in.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Diameter | The diameter of the base circle. It starts at 20 mm and must be more than 0. | 1 in for a 1 in shaft. |
| Top diameter | The diameter of the other end. It starts at 0, a point. More than 0 makes a tapered cylinder (a frustum). | 0 for a center point. 0.75 in for a plug that tapers from 1 in. |
| Height | How far the top is from the base, along Z. It starts at 20 mm. Negative runs it down. | 0.866 in for a 60° point on a 1 in diameter. |
| Placement, X, Y, Z | Placement is always Base Center: X, Y and Z set the center of the base circle. | 0, 0, 0. |
| Operation | It starts at New Body. New Body makes a separate body. Join adds it to a body it touches. Cut takes it out. Intersect keeps only the material inside both. | Join to put a point on the end of a shaft. Cut to cut a cone shape into a face. |
Try it: put a 60° point on a shaft
- Make a 1 in diameter, 3 in tall cylinder at the origin with Cylinder.
- Click Cone. Set Diameter to 1 in, Top diameter to 0 and Height to 0.866 in.
- Set Z to 3 in, so the base sits on the top of the shaft. Set Operation to Join and click OK.
- The shaft now ends in a 60° point, like a dead center.
Tips and common mistakes
- Do work out the Height from the included angle on the print. The dialog has no angle box; use the formula above.
- Do use Hole for a countersunk or counterbored hole. It sets the countersink angle and diameter for you.
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 0.866 in enters 21.9964 mm.
- Don’t set Diameter to 0. The base must have a size; put the point at the top with Top diameter 0 and use a negative Height if you need it to point down.
See also
Cylinder, Sphere and Box place the same way. Revolve turns any sketched profile, such as a Morse taper with a tang.
| Parameter | Type | Required | Description |
|---|---|---|---|
| radius | expr | Yes | |
| diameter | expr | Yes | |
| height | expr | Yes | the base circle, and the top's distance along the axis; a negative height goes the other way |
| top_radius | expr | No | the top circle; default 0: a full cone ending in an apex |
| top_diameter | expr | No | the top circle; default 0: a full cone ending in an apex |
| base | [x,y,z] | No | centre of the base circle: numbers in mm or length expressions; default: the origin |
| axis | X|Y|Z|[x,y,z] | No | default Z |
| operation | No | ||
| touching | No | ||
| targets | [body] | No | |
| name | No | ||
| body_name | No |
Automation details
Command ID: solid.cone
Parameters:
radius | diameter, height: expr (the base circle, and the top's distance along the axis; a negative height goes the other way); top_radius? | top_diameter?: expr (the top circle; default 0: a full cone ending in an apex); base?: [x,y,z] (centre of the base circle: numbers in mm or length expressions; default: the origin); axis?: X|Y|Z|[x,y,z] (default Z); operation?, touching?, targets?: [body], name?, body_name?
Rectangular Pattern
Command group: SOLID › CREATE
Repeat a hole, a pocket or a whole body in a row or a grid: a row of tapped holes along a rail, or a grid of vent slots. You pick what to copy, the direction, how many and the spacing.
Before you start
- Make one of the thing you want to repeat first, such as one hole in the corner of the grid.
- Choose what to copy with Object Type. Bodies copies whole solid bodies. Features repeats a step from the History, such as a Hole or a cut Extrude, on the same body.
- A sketch is neither. To repeat sketch curves, use the sketch’s own Rectangular Pattern, or extrude the sketch first.
- You need a direction for each row: an origin axis, a sketch line or a straight edge of the part.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Type | Rectangular, Circular or Path. The same dialog makes all three patterns. | Rectangular for rows and grids. |
| Object Type | Bodies copies whole bodies. Features repeats History steps. | Features for holes in one plate. |
| Objects or Features | What to repeat. With Features, pick the step in the History. | The Hole feature for the first hole. |
| Direction | The way the first row runs. | The X axis, or the long edge of the plate. |
| Quantity | How many along the first direction, counting the original. | 5 holes in the row. |
| Spacing | Centre-to-centre distance between neighbours in the first direction. | 1 in pitch. |
| Direction 2 | The way the second row runs. Leave it empty for a single row. | The Y axis for a grid. |
| Quantity 2 | How many along the second direction, counting the original. 1 means a single row. | 3 rows. |
| Spacing 2 | Centre-to-centre distance in the second direction. | 0.75 in. |
| Alignment and Alignment 2 (Features only) | Flip direction runs the copies the other way. Center puts copies on both sides of the original: an odd Quantity splits evenly, an even Quantity puts one extra copy on one side, and Flip moves the extra copy to the other side. Quantity 4 with Center gives copies at 0, +1, −1 and +2 spacings. | Flip when the row runs off the end of the part. |
Try it: a 5 × 3 grid of holes
- Make a 6 in × 4 in × 0.5 in plate. Sketch a rectangle from the origin: type 6 in, press Tab to jump to the other side, type 4 in. Then Extrude it 0.5 in.
- Add one 0.25 in through hole with Hole, 1 in in from each of the two edges at the origin corner.
- Click Rectangular Pattern. Set Object Type to Features and click the Hole step in the History.
- Click Direction, then the X axis (or the long edge of the plate). Set Quantity to 5 and Spacing to 1 in.
- Click Direction 2, then the Y axis. Set Quantity 2 to 3 and Spacing 2 to 1 in.
- Click OK. The plate has 15 holes on a 1 in grid.
Tips and common mistakes
- Do count the original in Quantity. Five holes in a row is Quantity 5, not 4.
- Do read Spacing as hole-to-hole pitch, the way the print dimensions it, not the total length of the row.
- Do pattern the Hole feature rather than the body when the holes are all in one part. Change the hole size once and every copy follows.
- Don’t forget to check Alignment if the copies land off the part. Flip direction or Center left on from an earlier pattern moves the whole grid.
- Don’t leave Quantity 2 at 1 and expect a grid. With Quantity 2 at 1 you get a single row even if Direction 2 is picked.
See also
Circular Pattern repeats around an axis, such as a bolt circle. Rectangular Pattern repeats curves inside a sketch. Hole makes the first hole to pattern.
| Parameter | Type | Required | Description |
|---|---|---|---|
| features | [names] | Yes | |
| bodies | [names] | Yes | |
| components | [names] | Yes | |
| dir1 | [x,y,z] | Yes | |
| count1 | Yes | ||
| spacing1 | Yes | ||
| dir2 | No | ||
| count2 | No | ||
| spacing2 | No | ||
| alignment | left|center|right | No | |
| alignment2 | left|center|right | No | default right; counts include the original |
| reversed | bool | No | |
| reversed2 | bool | No | Flip |
Automation details
Command ID: solid.pattern.rectangular
Parameters:
features: [names] | bodies: [names] | components: [names]; dir1: [x,y,z]; count1; spacing1; dir2?, count2?, spacing2?; alignment?, alignment2?: left|center|right (default right; counts include the original); reversed?, reversed2?: bool (Flip)
Circular Pattern
Command group: SOLID › CREATE
Repeat a hole, a boss or a whole body around an axis: the bolt circle on a flange, or spokes on a hub. You pick what to copy, the axis, how many and over what angle.
Before you start
- Make one of the thing you want to repeat first, such as one hole on the bolt circle. On a round face there are no straight edges to locate a hole from, so sketch a point where the hole goes and use Hole with Placement set to Multiple.
- Choose what to copy with Object Type. Bodies copies whole solid bodies. Features repeats a step from the History, such as a Hole or a cut Extrude, on the same body.
- A sketch is neither. To repeat sketch curves, use the sketch’s own Circular Pattern, or extrude the sketch first.
- You need an axis to turn about: an origin axis, a sketch line, a straight or circular edge, or a cylinder face such as the bore of the part.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Type | Rectangular, Circular or Path. The same dialog makes all three patterns. | Circular for a bolt circle. |
| Object Type | Bodies copies whole bodies. Features repeats History steps. | Features for holes in one part. Bodies for separate parts, such as loose spokes. |
| Objects or Features | What to repeat. With Features, pick the step in the History. | The Hole feature for one bolt hole. |
| Axis | The line the copies turn about. Clicking a round edge or a cylinder face uses its centre line. | The Z axis, or the face of the centre bore. |
| Quantity | How many in total, counting the original. | 6 for a 6-hole bolt circle. |
| Total angle | The angle the pattern covers. At 360 deg the copies are spaced evenly all the way round. Under 360 deg, the first and last copies sit at the two ends of the angle. | 360 deg for a full bolt circle. 90 deg with Quantity 4 puts holes at 0, 30, 60 and 90 deg. |
| Alignment (Features only) | Flip direction turns the pattern the other way. Center puts copies on both sides of the original: an odd Quantity splits evenly, an even Quantity puts one extra copy on one side, and Flip moves the extra copy to the other side. Quantity 4 over 90 deg with Center gives −30, 0, 30 and 60 deg. | Flip a partial pattern that went the wrong way around. |
Try it: a 6-hole bolt circle
- Make a flange: sketch a 4 in circle on the XY plane at the origin and Extrude it 0.5 in.
- Sketch a point on the top face, 1.5 in from the centre on the X axis (a 3 in bolt circle). Click Hole, set Placement to Multiple and pick the point. Set Diameter to 0.281 in and Extents to All, then click OK. The Hole must be finished so it shows in the History.
- Click Circular Pattern. Set Object Type to Features and click the Hole step in the History.
- Click Axis, then click the Z axis.
- Set Quantity to 6 and Total angle to 360 deg. Click OK. There are 6 holes, 60° apart.
- To make it 8 holes, edit the pattern and change Quantity to 8.
Tips and common mistakes
- Do pattern the Hole feature rather than the body when the holes are all in one part. Change the hole size once and every copy follows.
- Do count the original in Quantity. A 6-hole bolt circle is Quantity 6, not 5.
- Don’t use 360 deg for a partial pattern you want to end on a copy. Under 360 deg the angle is from the first copy to the last; at 360 deg the last would land on the first, so the copies are spaced evenly instead.
- Don’t pick the edge of the hole you are patterning as the Axis. That turns the hole about its own centre, so every copy lands on the original. Pick the Z axis or the centre bore.
- Don’t pick the sketch you drew the hole from. Pick the Hole step, or extrude the sketch first.
See also
Rectangular Pattern repeats in rows and columns. Circular Pattern repeats curves inside a sketch. Hole makes the first hole to pattern.
| Parameter | Type | Required | Description |
|---|---|---|---|
| features | [names] | Yes | |
| bodies | [names] | Yes | |
| components | [names] | Yes | |
| axis | X|Y|Z | construction axis name| {origin, dir}| {edge|face: [x,y,z]} | Yes | followed when edited; origin coordinates may be length expressions; the pattern follows them; a straight or circular edge, or a cylinder, cone or torus face: about its axis, followed as the model changes |
| count | Yes | ||
| angle | No | default 360 deg; partial arcs include both ends | |
| alignment | left|center|right | No | default right; original stays fixed |
| reversed | bool | No | Flip; selects the extra side for even centered counts |
Automation details
Command ID: solid.pattern.circular
Parameters:
features: [names] | bodies: [names] | components: [names]; axis: X|Y|Z | construction axis name (followed when edited) | {origin, dir} (origin coordinates may be length expressions; the pattern follows them) | {edge|face: [x,y,z]} (a straight or circular edge, or a cylinder, cone or torus face: about its axis, followed as the model changes); count; angle? (default 360 deg; partial arcs include both ends); alignment?: left|center|right (default right; original stays fixed); reversed?: bool (Flip; selects the extra side for even centered counts)
Pattern on Path
Command group: SOLID › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| features | [names] | Yes | |
| bodies | [names] | Yes | |
| path_sketch | sketch | Yes | |
| path | [curve ids in order] | Yes | |
| count | Yes | ||
| spacing | Yes | between instances | |
| distance | Yes | first to last | |
| orientation | identical|path | No | |
| flip | bool | No |
Automation details
Command ID: solid.pattern.path
Parameters:
features: [names] | bodies: [names]; path_sketch: sketch; path: [curve ids in order]; count; spacing (between instances) | distance (first to last); orientation?: identical|path; flip?: bool
Mirror
Command group: SOLID › CREATE
Copy bodies or features to the other side of a plane: model half of a symmetric part and mirror it, or make the left-hand version of a right-hand bracket.
Before you start
- Make the half (or the feature) you want to copy first.
- Choose what to copy with Object Type. Bodies copies whole solid bodies. Features repeats a step from the History, such as a Hole or a cut Extrude, on the other side of the same body.
- A sketch is neither. To mirror sketch curves, use the sketch’s own Mirror, or extrude the sketch first.
- You need a plane to mirror about: an origin plane (XY, XZ or YZ), a construction plane, or a flat face of the part.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Object Type | Bodies copies whole bodies. Features repeats History steps. | Features to put a second pocket on the other side of the centre line. Bodies to mirror half a part. |
| Objects or Features | What to mirror. The box is named Objects or Features to match Object Type. With Features, pick the steps in the History; you can pick more than one. | The half body, or two Hole steps at once. |
| Mirror Plane | The plane the copy is reflected across. | The YZ plane when the part is centred on the origin. |
| Operation (Bodies only) | New Body keeps the copy as its own body. Join merges it with the original into one body. | Join when you modelled half a part and want one solid. New Body for a left-hand and right-hand pair. |
Try it: model half, mirror the rest
- Sketch a 2 in × 1.5 in rectangle on the XY plane with one 1.5 in short edge on the Y axis, so the 2 in side runs along X, and Extrude it 0.5 in. This is the right half of a 4 in wide block.
- Click Mirror. Leave Object Type on Bodies and click the block.
- Click Mirror Plane, then click the YZ plane.
- Set Operation to Join. Click OK. The block is now 4 in wide and one body.
- Add a hole on one side, then Mirror again with Object Type set to Features and the Hole step picked. The hole appears at the same spot on the other side.
Tips and common mistakes
- Do draw symmetric parts centred on an origin plane. Then that plane is the mirror plane, and the halves line up.
- Do use Join when the halves touch and should be one part. With New Body you get two bodies sitting face to face.
- Do mirror the feature, not the body, when you just need the same hole or pocket on the other side. Change the original and the mirrored one follows.
- Don’t expect a mirrored copy to be the same part. A mirrored right-hand bracket is a left-hand bracket, and a mirrored right-hand thread is left-hand.
See also
Mirror mirrors curves inside a sketch. Rectangular Pattern and Circular Pattern repeat features more than once.
| Parameter | Type | Required | Description |
|---|---|---|---|
| features | [names] | Yes | |
| bodies | [names] | Yes | combine?: join with the original |
| plane | XY|XZ|YZ|construction plane name or id|{origin, normal}|{origin, x_dir, y_dir} | Yes | origin coordinates may be length expressions; the mirror follows them, or a construction plane |
Automation details
Command ID: solid.mirror
Parameters:
features: [names] | bodies: [names] (combine?: join with the original); plane: XY|XZ|YZ|construction plane name or id|{origin, normal}|{origin, x_dir, y_dir} (origin coordinates may be length expressions; the mirror follows them, or a construction plane)
Hole
Command group: SOLID › CREATE
Default keyboard shortcut: H
Put a hole in a solid body: a simple hole, a counterbore, a countersink or a tapped hole. You set the location, size, depth and drill point, the same things a print calls out.
Before you start
- You need a solid body with a face to drill into. The hole goes straight into the face. A single hole can go on a flat or curved face; locating it from edges needs a flat face.
- Locate the hole from edges of that face, the same way a print dimensions a hole from two edges. Pick an edge as Reference 1 and type its distance, then do the same for Reference 2. Both edges must be straight and must not be parallel to each other: pick one side edge and one front or back edge, not two opposite sides.
- To drill several holes at once, sketch a point for each hole on the face first. Then open Hole, set Placement to Multiple and select the points you want. Only the points you select get a hole.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Personal Presets | Saves the dialog settings under a name you choose (Save new), so you can reuse them. Presets are saved in your profile, so they carry over to every design. Rename and Delete manage saved presets. | Save a “1/4-20 blind” preset once and pick it for every tapped hole of that size. |
| Placement | Single drills one hole on the face you pick. Multiple drills a hole at each sketch point you select. | Single for one hole located from edges. Multiple for a bolt pattern laid out in a sketch. |
| Face | The face the hole is drilled into. | Click the top face of the part. |
| Reference 1 and Distance 1 | An edge of the face, and how far the hole center is from it. | The left edge, 0.75 in. |
| Reference 2 and Distance 2 | A second edge, and how far the hole center is from it. | The front edge, 0.75 in. |
| Extents | How the depth is set. Distance drills to the Depth you type. | Use Distance for a blind hole. |
| Hole Type | Simple is a straight hole. Counterbore and Countersink add a bore or a cone at the top. | Counterbore for a socket head cap screw. Countersink for a flat head screw: 82° for inch screws, 90° for metric. |
| Hole Tap Type | Simple is a plain drilled hole with a Diameter you type. Tapped drills the tap drill size and shows the thread settings. | Choose Tapped for any tapped hole. |
| Profile (Tapped) | The thread standard. | UNC for coarse inch threads, UNF for fine inch threads. |
| Size (Tapped) | The thread size, from a list. The Designation box shows the callout. | 1/4-20 UNC. |
| Tap drill diameter (Tapped) | The drill for the tapped hole. It fills in the standard tap drill for the size, the one on a tap drill chart (the app’s messages call it “the tap maker’s drill”), and you can type a different one. The app accepts drills from the smaller of the thread’s minor diameter and the standard tap drill, up to 5% over the standard tap drill, and says the allowed range if you go outside it. For a custom metric size with no entry in the app’s tap drill table, the app fills in major diameter minus pitch, the usual rule of thumb; check a tap drill chart. | 1/4-20 UNC fills in 0.201 in (a #7 drill); hover the box to see 5.105 mm. Typing 0.203 in (13/64) is accepted; 0.220 in is refused because too little thread would engage. |
| Full thread depth (Tapped) | On: the thread runs the full depth of the hole. Off: a Thread depth box appears. | Turn it off for a blind tapped hole. |
| Thread depth (Tapped) | How deep the full thread goes, separate from the drill Depth. | Drill 0.625 in deep with 0.50 in of thread, so a standard tap doesn’t bottom out. |
| Hand (Tapped) | Right or Left. | Right unless the print calls for LH. |
| Modeled (Tapped) | On: the thread groove is cut into the hole wall. Off: the thread is carried as a callout only. | Leave it off unless you need to see the thread or 3D print it. A modeled thread makes the part slower to rebuild. |
| End (Modeled on) | Square stops the thread sharp at the bottom. Fade runs it out over a length, the way a tap’s chamfered end leaves it. | Fade for a realistic blind tapped hole. |
| Drill Point | The bottom of the hole. Angle leaves a drill point. | Use Angle for a hole made with a twist drill. |
| Depth | How deep the hole goes. | Measured to the end of the full diameter, not the tip of the drill point. |
| Tip Angle | The angle of the drill point. Default is 118°. | 118° for a standard jobber drill. 135° for most carbide and split-point drills. |
| Diameter (Simple) | The drill size for a plain hole. | Type the drill size, such as 0.201 in. |
Try it: a 1/4-20 tapped hole 0.75 in from two edges
- Click New Sketch and choose the XY plane. Draw a 2-point rectangle from the origin, 3 in × 2 in. Click Finish Sketch.
- Click Extrude and set the distance to 0.75 in. Click OK.
- Click Hole, then click the top face.
- Click Reference 1, pick the left edge of the top face and set Distance 1 to 0.75 in. Click Reference 2, pick the front edge and set Distance 2 to 0.75 in.
- Set Hole Tap Type to Tapped, Profile to UNC and Size to 1/4-20 UNC. Check that Tap drill diameter shows 0.201 in.
- Turn off Full thread depth. Set Depth to 0.625 in and Thread depth to 0.50 in. Click OK.
Tips and common mistakes
- Do locate holes from edges the way the print dimensions them. When the part changes size, the holes keep their distances from those edges.
- Do use Tapped and pick the size from the list instead of typing a drill diameter. The hole then carries the thread callout, and the tap drill comes from a standard tap drill chart.
- Do check the Tap drill diameter before clicking OK. UNC and UNF sizes show it in inches; metric and pipe sizes show millimetres. If your shop runs a different drill, such as 0.203 in for 1/4-20 in steel, type it in. Hovering over the box shows the tap maker’s drill in millimetres and the accepted range, not the drill you typed.
- Don’t turn on Modeled just to show the hole is tapped. The callout already says it.
- Do turn off Full thread depth on blind tapped holes and set a Thread depth shorter than the drill Depth, so a standard tap doesn’t bottom out.
- Do type the unit with the number when the print is in another unit. In a millimetre design, typing 0.75 in enters 19.05 mm.
- Don’t expect every hole to work on sheet metal. Sheet metal holes must go straight into a flat panel; holes into the edge of the sheet, countersinks and drill points are refused there.
See also
Thread cuts a thread on any round face, including the outside of a shaft. Circular Pattern repeats a hole around a center for a bolt circle. Chamfer breaks the edge of a hole.
| Parameter | Type | Required | Description |
|---|---|---|---|
| position | [x,y,z] on a face| sketch + points: [sketch point ids]| sketch alone | Yes | numbers, or length expressions the hole follows; one hole each, perpendicular to the sketch, into the material on whichever side of the sketch plane it is; every sketch point: standalone points and circle centres |
| flip | bool | No | sketch points: drill to the other side |
| single | bool | No | with one sketch point: a Single hole that follows the point, drilled into the face there |
| direction | [x,y,z] | No | default: into the face, against its outward normal; where faces of several bodies meet there, the face of a body in `targets`; one that leaves the face is mirrored into it; ignored with sketch points unless single |
| diameter | Yes | a tapped hole, drilled with the tap maker's tabulated drill: ISO metric (a custom metric size: major minus pitch), UNC/UNF, G, Rp, Rc 1/16 to 4, NPT 1/16 to 3; a `diameter` given with it chooses another drill, from the thread's minor diameter to 5% over the tap maker's | |
| thread | Yes | a tapped hole, drilled with the tap maker's tabulated drill: ISO metric (a custom metric size: major minus pitch), UNC/UNF, G, Rp, Rc 1/16 to 4, NPT 1/16 to 3; a `diameter` given with it chooses another drill, from the thread's minor diameter to 5% over the tap maker's | |
| clearance | "M6" with fit?: close|normal|loose | Yes | ISO 273 |
| head | "ISO 4762"| "ISO 7380-1" | No | socket head; button head |
| head_gap | length | No | default 0.5 mm; an expression with parameters is kept, so the recess follows them |
| depth | No | default through all | |
| to | [x,y,z] | No | To Object: drill to that face or point |
| references | [{edge: [x,y,z] on a straight edge of the face, distance: expr}] | No | at most two; the centre goes that far from each edge's line, in the face's plane, and follows the edges; with a numeric position only |
| type | simple|drilled|counterbore|countersink | No | |
| tip_angle | No | ||
| cb_diameter | length | No | |
| cb_depth | length | No | |
| bridge | length | No | counterbore: two 3D-printing bridge layers this thick below its floor, a slot along X then a square; e.g. 0.2 mm |
| cs_diameter | No | ||
| cs_angle | No | ||
| hand | right|left | No | the tapped thread's hand; default right; needs thread |
| thread_depth | positive length independent of drill depth | No | default: full useful cylindrical wall; must fit that wall |
| modeled | bool | No | needs thread: the tapped thread cut into the wall, the groove between its teeth, as solid.thread's modelled one; default false: listed only |
| ease_out | expr|standard|short | No | modelled tapped threads: the inner end, towards the bottom, fades out over this length, ISO 3508's runout, standard 2.5 P, short 1.25 P; without it the groove stops square at thread_depth, or clear of a blind hole's bottom |
| targets | [body] | No | the bodies to drill; holes at the points of a sketch on a body's face default to that body, found along the holes' direction on it alone; explicit targets or participants override, ["*"] every body |
| old_surface_start | bool | No | sketch points: a point inside a body starts the hole at the body's surface whatever plane the sketch lies on, as designs saved before #11538 drilled; set on those holes, keeps them as they were when edited |
Automation details
Command ID: solid.hole
Parameters:
position: [x,y,z] on a face (numbers, or length expressions the hole follows) | sketch + points: [sketch point ids] (one hole each, perpendicular to the sketch, into the material on whichever side of the sketch plane it is) | sketch alone (every sketch point: standalone points and circle centres); flip?: bool (sketch points: drill to the other side); single?: bool (with one sketch point: a Single hole that follows the point, drilled into the face there); direction?: [x,y,z] (default: into the face, against its outward normal; where faces of several bodies meet there, the face of a body in `targets`; one that leaves the face is mirrored into it; ignored with sketch points unless single); diameter | thread (a tapped hole, drilled with the tap maker's tabulated drill: ISO metric (a custom metric size: major minus pitch), UNC/UNF, G, Rp, Rc 1/16 to 4, NPT 1/16 to 3; a `diameter` given with it chooses another drill, from the thread's minor diameter to 5% over the tap maker's) | clearance: "M6" with fit?: close|normal|loose (ISO 273); head?: "ISO 4762" (socket head) | "ISO 7380-1" (button head) (with clearance: a counterbore the screw's head sits in, so type defaults to counterbore; its diameter is the head's dk plus head_gap each side, its depth the head's k plus head_gap; a cb_diameter or cb_depth given keeps its value); head_gap?: length (default 0.5 mm; an expression with parameters is kept, so the recess follows them); depth? (default through all) | to?: [x,y,z] (To Object: drill to that face or point); references?: [{edge: [x,y,z] on a straight edge of the face, distance: expr}] (at most two; the centre goes that far from each edge's line, in the face's plane, and follows the edges; with a numeric position only); type?: simple|drilled|counterbore|countersink; tip_angle?; cb_diameter?, cb_depth?, bridge?: length (counterbore: two 3D-printing bridge layers this thick below its floor, a slot along X then a square; e.g. 0.2 mm); cs_diameter?, cs_angle?; thread?: "M6", "1/4-20 UNC", "G 1/4", "Rp 1/4", "Rc 1/4" or "1/4-18 NPT" (cosmetic unless modeled); hand?: right|left (the tapped thread's hand; default right; needs thread); thread_depth?: positive length independent of drill depth (default: full useful cylindrical wall; must fit that wall); modeled?: bool (needs thread: the tapped thread cut into the wall, the groove between its teeth, as solid.thread's modelled one; default false: listed only); ease_out?: expr|standard|short (modelled tapped threads: the inner end, towards the bottom, fades out over this length, ISO 3508's runout, standard 2.5 P, short 1.25 P; without it the groove stops square at thread_depth, or clear of a blind hole's bottom); targets?: [body] (the bodies to drill; holes at the points of a sketch on a body's face default to that body, found along the holes' direction on it alone; explicit targets or participants override, ["*"] every body); old_surface_start?: bool (sketch points: a point inside a body starts the hole at the body's surface whatever plane the sketch lies on, as designs saved before #11538 drilled; set on those holes, keeps them as they were when edited)
Pipe
Command group: SOLID › CREATE
Run a round tube or rod along a path of sketch curves: bent tubing, a coolant or hydraulic line, a handrail, or a wire. You give the outside diameter and, for a tube, the wall.
Before you start
- You need a sketch with the path drawn as connected curves: lines and arcs, end to end. The path is the tube’s centerline.
- Diameter is the outside diameter (OD). Leave Wall empty for a solid rod; type a wall for a tube.
- Lines meeting at a sharp corner give a mitred joint, like welded pipe. For bent tubing, draw each bend as an arc at the bender’s centerline radius.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Path | The sketch curves the tube follows. | A line, an arc and a line for a 90° bend. |
| Diameter | The outside diameter of the tube or rod. It starts at 5 in the design’s unit. | 0.375 in for 3/8 tube. |
| Wall | The wall thickness, measured in from the OD. Empty means solid. | 0.035 in. |
| Operation | New Body makes a separate body. Join adds it to a body it touches. Cut takes it out. Intersect keeps only the material inside both. | New Body for a tube. Cut for a round channel through a part. |
Try it: a bent 3/8 tube
- Start a sketch on the XY plane. Draw a 3 in line along X, a tangent arc of 1 in radius turning 90°, and a 2 in line along Y. Finish the sketch.
- Click Pipe. Click Path and pick the line, the arc and the second line. Path shows 3 selected.
- Set Diameter to 0.375 in and Wall to 0.035 in. Click OK.
- The tube is 3/8 in OD with a 0.035 in wall, bent 90° on a 1 in centerline radius.
Tips and common mistakes
- Do draw the path through the tube’s center, the way a tube bender’s centerline radius and lengths are given.
- Do keep an arc’s radius bigger than half the OD, or the inside of the bend folds into itself. Real tube needs much more, often 2 to 3 times the OD, so use the radius your bender’s die gives.
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 0.375 in enters 9.525 mm.
- Don’t leave gaps in the path. The curves must meet end to end.
See also
Sweep runs any section shape along a path. Cylinder makes a straight rod without a sketch.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path_sketch | sketch | Yes | |
| path | [curve ids in order] | Yes | |
| diameter | expr | Yes | |
| wall | expr | No | hollow |
| operation | No | ||
| targets | No | ||
| name | No | ||
| body_name | No |
Automation details
Command ID: solid.pipe
Parameters:
path_sketch: sketch; path: [curve ids in order]; diameter: expr; wall?: expr (hollow); operation?, targets?, name?, body_name?
Bounding Solid
Command group: SOLID › CREATE
Put a box around a part: the size of the raw stock it’s cut from. Margin adds cleanup stock on every side, the way you’d saw a blank oversize before squaring it up.
Before you start
- You need at least one body.
- The box is square to the design’s X, Y and Z axes, not to the part. Model the part square to the axes, or the box comes out bigger than the stock you’d really cut.
- The box is a new body, named Bounding, or Bounding (2) if the design already has a body named Bounding. The part itself is not changed.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Bodies (all if none) | The bodies to put the box around. A body selected when you start is picked for you. Clear it to use every body in the design. | Pick one part when the design has several. |
| Margin | Stock added on every side of the box. The overall size grows by twice the Margin in each direction. It starts at 2 in the design’s unit; set 0 for the part’s exact size. | 0.0625 in on each side to leave room to face and square up a sawn blank. |
Try it: size the stock for a plate
- Make a 3 in × 2 in × 0.75 in block.
- Click Bounding Solid. Bodies shows the part if it was selected; otherwise leave it empty. Set Margin to 0.0625 in. The yellow preview shows the box. Click OK.
- A new body, Bounding, covers the part. It is 3.125 in × 2.125 in × 0.875 in: the stock to order or saw.
- Hide the new body in the Browser to see the part again. It is Bounding, or Bounding (2) if the design already had a body named Bounding.
Tips and common mistakes
- Do remember the Margin is per side. For 1/8 in of total cleanup on each dimension, set Margin to 0.0625 in.
- Do round the stock up to a size you can buy. The box gives the smallest block that holds the part; standard bar and plate sizes are usually a little bigger.
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 0.0625 in enters 1.5875 mm.
- Don’t expect a box square to the part when the part sits at an angle to the axes. The box stays square to X, Y and Z.
- Don’t leave Bounding showing while you work. It covers the part; hide it in the Browser.
See also
Extrude makes the part from a sketch. Offset Face adds stock to a single face instead of the whole part.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | No | default: all |
| margin | expr | No | |
| name | No | ||
| body_name | No |
Automation details
Command ID: solid.bounding_solid
Parameters:
bodies?: [names] (default: all); margin?: expr; name?, body_name?
Thread
Command group: SOLID › CREATE
Put a thread on a round face: an external thread on a shaft or stud, or an internal thread in a bore. You pick the thread form and size, how far the thread runs, and how its ends are finished.
Before you start
- You need a body with a cylindrical face: the outside of a shaft for an external thread, or the wall of a bore for an internal one.
- Size the cylinder first. For an external thread, make the shaft the thread’s major diameter (12 mm for M12). For an internal thread, make the bore the tap drill size.
- Click the face near the end you want threaded. On a shaft with two free ends, that tells a limited-length thread where to start.
- For an ordinary tapped hole, including UNC and UNF, use Hole with Hole Tap Type set to Tapped instead. It drills the tap drill and keeps the thread callout on the hole.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Cylindrical face | The round face the thread goes on. | Click the outside of the shaft near the end to thread. |
| Form | The thread standard: ISO metric, Trapezoidal (ISO 2904), Acme (ASME B1.5), Buttress (DIN 513 or ASME B1.9), and the pipe threads Pipe G (ISO 228-1), Pipe Rp (ISO 7-1), Pipe taper R, Rc (ISO 7-1) and Pipe taper NPT (ASME B1.20.1). UNC and UNF are not in this list. | ISO metric for fasteners. Acme or Trapezoidal for lead screws. Buttress for a screw that takes load one way, like a vise screw. Pipe taper NPT for US tapered pipe threads. |
| Modeled | On: the thread groove is cut into the part. Off: the thread is carried as a callout only. | Leave it off unless you need to see the thread or 3D print it. A modeled thread makes the part slower to rebuild. |
| Automatic size | On by default: picks the standard size that fits the face you selected. | Leave it on when the shaft is a standard diameter. |
| Size and Pitch | The thread size from the standard’s table, and for metric threads the pitch. | M12 with the standard 1.75 mm pitch, or 1.25 mm for M12 fine. |
| Designation | The thread callout. You can type it directly. | M12, M12x1.25. |
| Hand | Right, Left, or Both. Pipe threads offer Right or Left only. | Right unless the print calls for LH. |
| Starts | Number of thread starts, 1 to 8. | 1 for fasteners. 2 or more for a fast-moving lead screw: each turn advances the pitch times the number of starts. |
| Steep Flank (Buttress only) | Which end the steep, load-carrying flank faces. | Point it toward the load. |
| Extent | Full runs the whole face. Length runs a set distance. Up to stops at a face or plane you pick. | Length for a threaded end on a longer shaft. Up to for a thread that stops at a shoulder. |
| Start end (optional) | Which end of the face the thread is measured from. Shown once Extent is Length or Up to. | Pick it when the thread starts at the wrong end. |
| Start (Ends) | None leaves the thread’s free end plain. Chamfer adds a lead-in chamfer and shows Chamfer Angle and Chamfer Depth; left blank, they use the ISO 4753 standard chamfer. | Chamfer the start of any thread that has to take a nut or go into a tapped hole by hand. |
| End (Ends) | Square stops the thread sharp. Fade runs it out over a length (ISO 3508 runout, 2.5 pitches standard). | Fade for a thread cut with a die or single-point tool that stops short of a shoulder. |
Try it: a threaded shaft end
- Sketch a 12 mm circle on the XY plane and extrude it 50 mm.
- Click Thread, then click the round face of the shaft near its top end.
- Check that Form is ISO metric and Automatic size picked M12 with a 1.75 mm pitch.
- Set Extent to Length and the length to 20 mm.
- Turn on Modeled to see the thread cut into the shaft.
- Under Ends, set Start to Chamfer. Leave Chamfer Angle and Chamfer Depth blank for the standard ISO 4753 chamfer.
- Click OK. The top 20 mm of the shaft carries an M12 thread with a lead-in chamfer.
Tips and common mistakes
- Do size the cylinder before threading it: major diameter for an external thread, tap drill size for an internal one.
- Do click the face near the end you want threaded, or pick Start end. Otherwise a Length thread can start at the wrong end.
- Do chamfer the start of an external thread. The shop will put one there anyway, and a nut starts on it in the model the same way it does on the part.
- Do leave room for runout before a shoulder. A thread can’t run full depth right up to a shoulder without a relief groove.
- Don’t turn on Modeled just to show the part is threaded. The callout already says it.
- Don’t look for UNC or UNF here. Inch fastener threads are only on Hole tapped holes for now; the inch forms in this list are Acme, ASME buttress and the pipe threads.
- Don’t mix up NPT and the ISO taper (R, Rc, often called BSPT). Both are tapered pipe threads, but the thread angle and pitch differ, and they don’t seal together.
See also
Hole makes tapped holes with the right tap drill, including UNC and UNF. Chamfer breaks an edge by hand. Revolve makes a turned part to thread.
| Parameter | Type | Required | Description |
|---|---|---|---|
| face | [x,y,z] on a cylindrical face | Yes | |
| form | metric|trapezoidal|acme|buttress|buttress_asme|bspp|rp|bspt|npt | No | default: the one `designation` names, else metric; square is refused: no current standard defines it |
| hand | right|left|both | No | default right; both: a right- and a left-handed groove crossing |
| old_auto_size | bool | No | an automatic size keeps the rule of designs saved before a hole was sized by its nominal diameter: a 12 mm hole is M14; set on those threads, keeps them as they were when edited |
| steep_flank | start|end | No | buttress only, default end: the steep flank of the screw's teeth faces the thread's end, the way its axis points |
| starts | 1..8 | No | lead = starts x pitch: that many grooves, each a turn's starts-th further round; a designation that gives the lead gives the starts |
| ease_out | expr|standard|short | No | modelled threads: the inner end, away from where the thread starts, fades out over this length (shorter than a turn too), its section moving out of the material as it turns; standard 2.5 P, short 1.25 P per ISO 3508; it lies past the full-form length, up to a shoulder's clearance; at a free end, inside the face; without it the groove stops square there, ending in its own profile; the start never fades: it runs off its free end, plain or chamfered (`tip`) |
| tip | none|start|both | No | modelled external threads: start chamfers the end the thread starts from, which must be free, both each free end the thread reaches, ISO 4753's chamfered end, the last teeth tapering into the cone; chamfer_angle?: angle expr to the axis, default 45 deg; chamfer_depth?: expr, radial from the major diameter, default for a metric thread down to the external minor diameter d3 = d - 1.226869 P (ISO 724), the largest ISO 4753 allows; other forms give it |
| extent | full|length|up_to | No | default: length when `length` is given, up_to when `up_to` is, else full: the whole face |
| length | expr | No | from the end the thread starts at |
| up_to | [x,y,z]| plane name or {origin, normal} | No | a point, such as on a shoulder face: the thread runs to its place along the axis; to where the plane crosses the axis |
| from | [x,y,z] near the end of the face the thread starts at | No | default: the face's only free end, the one with no material past it; else the end the `face` point lies within a third of the face of; a pick in the middle of a face whose ends are alike is refused |
| modeled | bool | No | default false |
Automation details
Command ID: solid.thread
Parameters:
face: [x,y,z] on a cylindrical face; form?: metric|trapezoidal|acme|buttress|buttress_asme|bspp|rp|bspt|npt (default: the one `designation` names, else metric; square is refused: no current standard defines it); designation?: the size, as its standard writes it: metric "M8", "M8x1", "M16xPh3P1.5" (ISO 68-1, ISO 261, ISO 965-1); trapezoidal "Tr20x4", "Tr40x14(P7)" (ISO 2904, ISO 2903); buttress "S20x4", "S40x14(P7)" (DIN 513, 3°/30°); acme "1/2-10 ACME" (ASME B1.5); buttress_asme "2.5-8 BUTT" (ASME B1.9, 7°/45°, basic profile; no size table); bspp "G 1/2" (ISO 228-1, 55° parallel); rp "Rp 1/2" (ISO 7-1's parallel internal thread, 55°, an R screws into it; internal only); bspt "R 1/2" external, "Rc 1/2" internal (ISO 7-1, 55°, taper 1 in 16); npt "1/2-14 NPT" (ASME B1.20.1, 60°, taper 1 in 16) — a taper thread starts at a free end (the pipe end or the hole mouth) with its standard diameter there, and an external one runs its standard length unless `length` or `up_to` says otherwise (default: the standard size that fits the face, a shaft its major diameter, a hole its nominal diameter (a 12 mm hole is M12) or else the size whose tap drill it is); hand?: right|left|both (default right; both: a right- and a left-handed groove crossing); old_auto_size?: bool (an automatic size keeps the rule of designs saved before a hole was sized by its nominal diameter: a 12 mm hole is M14; set on those threads, keeps them as they were when edited); steep_flank?: start|end (buttress only, default end: the steep flank of the screw's teeth faces the thread's end, the way its axis points); starts?: 1..8 (lead = starts x pitch: that many grooves, each a turn's starts-th further round; a designation that gives the lead gives the starts); ease_out?: expr|standard|short (modelled threads: the inner end, away from where the thread starts, fades out over this length (shorter than a turn too), its section moving out of the material as it turns; standard 2.5 P, short 1.25 P per ISO 3508; it lies past the full-form length, up to a shoulder's clearance; at a free end, inside the face; without it the groove stops square there, ending in its own profile; the start never fades: it runs off its free end, plain or chamfered (`tip`)); tip?: none|start|both (modelled external threads: start chamfers the end the thread starts from, which must be free, both each free end the thread reaches, ISO 4753's chamfered end, the last teeth tapering into the cone; chamfer_angle?: angle expr to the axis, default 45 deg; chamfer_depth?: expr, radial from the major diameter, default for a metric thread down to the external minor diameter d3 = d - 1.226869 P (ISO 724), the largest ISO 4753 allows; other forms give it); extent?: full|length|up_to (default: length when `length` is given, up_to when `up_to` is, else full: the whole face); length?: expr (from the end the thread starts at); up_to?: [x,y,z] (a point, such as on a shoulder face: the thread runs to its place along the axis) | plane name or {origin, normal} (to where the plane crosses the axis); from?: [x,y,z] near the end of the face the thread starts at (default: the face's only free end, the one with no material past it; else the end the `face` point lies within a third of the face of; a pick in the middle of a face whose ends are alike is refused); modeled?: bool (default false); continuous_flanks?: bool (default true; false keeps the historical half-turn faces and groove-before-chamfer construction). Cosmetic: the model is unchanged, model.threads lists it. Modeled: cuts the thread profile into the body: past a free end the groove runs out a pitch into the air (or through a chamfer); at a shoulder, a head or a blind hole's bottom it stops with its section clear of it, never cutting into it; a hole as wide as the thread or wider is narrowed to the thread's minor diameter first, and the reply's warning says so, unless its wall is open along the thread (a cross hole, a cut through the side, a slanted end), which is refused with the drill to use; a shaft thicker than the thread is refused with the size to make it, never turned down
Boundary Fill
Command group: SOLID › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| tools | [bodies] | Yes | |
| cells | [[x,y,z] a point inside each cell to fill (a cell: inside some tools, outside the rest)] | Yes | |
| operation | new|join|cut|intersect | No | |
| remove_tools | bool | No |
Automation details
Command ID: solid.boundary_fill
Parameters:
tools: [bodies]; cells: [[x,y,z] a point inside each cell to fill (a cell: inside some tools, outside the rest)]; operation?: new|join|cut|intersect; remove_tools?: bool
Coil
Command group: SOLID › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| diameter | Yes | ||
| section_size | Yes | ||
| section | circular|square | No | |
| section_position | inside|center|outside | No | |
| base | [x,y,z] | No | numbers in mm or length expressions; default: the origin |
| axis | X|Y|Z|[x,y,z] | No | default Z |
| start_angle | No | ||
| clockwise | bool | No | |
| sketch | No | a sketch; its plane is the section plane, so its placement sets the radius and start phase | |
| profiles | No | default: all; one closed profile without holes | |
| operation | No | ||
| targets | No | ||
| name | No | ||
| body_name | No |
Automation details
Command ID: solid.coil
Parameters:
diameter; two of revolutions (or turns), height, pitch; section_size; section?: circular|square; section_position?: inside|center|outside; base?: [x,y,z] (numbers in mm or length expressions; default: the origin); axis?: X|Y|Z|[x,y,z] (default Z); start_angle?; clockwise?: bool; sketch? (a sketch; its plane is the section plane, so its placement sets the radius and start phase), profiles? (default: all; one closed profile without holes); operation?, targets?, name?, body_name?
Rib
Command group: SOLID › CREATE
Add a thin wall along an open sketch line, filled out to the faces of the part: a gusset in the corner of an L-bracket, or a stiffening rib on a wall. You draw where the rib’s edge goes, and the rib fills from there to the part.
Before you start
- You need a body and a sketch with an open line (or chain of lines) for the rib’s outer edge. The line doesn’t have to touch the part, but the rib must have faces to fill to.
- For a gusset, sketch on a plane through the middle of the bracket, and draw the line across the corner from one leg to the other.
- With Direction on In plane, the rib fills from the line toward the part inside the sketch plane, and Thickness is across that plane.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Curves | The open sketch line or lines for the rib’s edge. | A diagonal line across the inside corner of an L-bracket. |
| Direction | In plane: the rib fills from the line within the sketch plane, Thickness across the plane. Normal: the rib grows along the sketch’s normal instead, Thickness across the line. | In plane for a gusset. |
| Thickness | How thick the rib is. It starts at 2 in the design’s unit. | 0.25 in for a gusset on a 0.25 in bracket. |
| Depth | How far the rib fills from the line. Empty means to the next face of the part. | Leave it empty for a gusset. |
| Flip | Fill toward the other side of the line. | Turn it on if the preview fills away from the corner. |
Try it: put a gusset in an L-bracket
- Make an L-bracket: on the XZ plane, sketch an L with 3 in legs and a 0.25 in thickness, then extrude it 2 in symmetric so the XZ plane runs through its middle.
- Start a sketch on the XZ plane. Draw a line across the inside corner, from 2 in up the vertical leg to 2 in out along the horizontal leg. Finish the sketch.
- Click Rib. Click Curves and pick the line. Leave Direction on In plane and set Thickness to 0.25 in.
- Check the preview fills toward the corner; if not, turn on Flip. Click OK. A 0.25 in gusset fills the corner, centered on the bracket.
Tips and common mistakes
- Do sketch an In plane rib on the plane where you want its middle. Half the thickness goes each way from that plane, so a rib sketched on an outside face hangs half off the part. With Normal, the rib grows out of the sketch plane instead, centered on the line: draw the line where the rib’s middle goes, on a plane at the rib’s edge.
- Do weigh Rib against a plain extrude. For one gusset on a machined part, a triangle sketched and extruded Symmetric works just as well. Rib pays off when the walls may change size (it fills to the new faces), when the faces it meets are curved or sloped, or when you need many ribs (Web).
- Do keep a machined rib’s thickness at least as big as the end mill that has to cut around it, and think about how the pocket beside it will be cut. A thin rib between deep pockets chatters.
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 0.25 in enters 6.35 mm.
- Don’t close the sketch line into a loop. A rib needs an open line; use Extrude for a closed shape.
See also
Web makes a grid of ribs from several lines at once. Fillet rounds the rib’s edges.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | [open curve ids, in order] | Yes | |
| curves | [open curve ids, in order] | Yes | |
| thickness | Yes | across the sketch plane, or across the curves when normal | |
| depth | No | default: to the next face | |
| flip | bool | No | fill to the other side |
| direction | in_plane|normal | No | grow across the sketch plane, the default, or along its normal |
Automation details
Command ID: solid.rib
Parameters:
sketch, curves: [open curve ids, in order]; thickness (across the sketch plane, or across the curves when normal); depth? (default: to the next face); flip?: bool (fill to the other side); direction?: in_plane|normal (grow across the sketch plane, the default, or along its normal)
Web
Command group: SOLID › CREATE
Add a grid of thin walls from several open sketch lines at once, each filled out to the faces of the part: the ribs of a waffle or isogrid pocket, dividers in a tray, or supports inside a housing. Each line becomes its own wall.
Before you start
- You need a body and a sketch of open lines, one for each wall. Lines can cross; each one makes its own wall.
- For walls standing in a pocket or tray, sketch the lines on the top face or a plane above the pocket and set Direction to Normal. The walls then grow down from the sketch to the floor, Thickness across each line.
- With Direction on In plane, each wall fills inside the sketch plane instead, as Rib does, with half the Thickness each side of the plane.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Curves | The open sketch lines, one wall per line. | Two crossing lines over a pocket. |
| Direction | In plane: each wall fills within the sketch plane, Thickness across the plane. Normal: each wall grows along the sketch’s normal, Thickness across its line. | Normal for walls standing in a pocket. |
| Thickness | How thick each wall is. It starts at 2 mm. | 0.080 in for the ribs of a lightened pocket. |
| Depth | How far each wall fills from the sketch. Empty means to the next face of the part. | Leave it empty to run the walls down to the floor. |
| Flip | Fill toward the other side of the sketch. | Turn it on if the preview grows away from the part. |
Try it: divide a tray into four
- Make a 4 in × 3 in × 1 in box and use Shell on its top face with a 0.1 in wall, so it’s an open tray.
- Start a sketch on the tray’s top rim plane. Draw one line across the middle lengthwise and one across the middle widthwise, each ending at the inside walls. Finish the sketch.
- Click Web. Click Curves and pick both lines. Set Direction to Normal and Thickness to 0.1 in. Leave Depth empty.
- Check the preview runs down into the tray; if not, turn on Flip. Click OK. The tray now has four pockets.
Tips and common mistakes
- Do make the walls between machined pockets at least as thick as you can hold without chatter, and check the end mill can reach the corners between them. The corner radius left is the cutter’s radius.
- Do use one Web for the whole grid. It’s one feature to change when the rib layout changes.
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 0.1 in enters 2.54 mm.
- Don’t close the lines into loops. Web needs open lines; for a pocket outline use Extrude with Cut.
See also
Rib makes a single wall the same way. Shell hollows the part first.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | [open curve ids] | Yes | |
| curves | [open curve ids] | Yes | one wall each |
| thickness | Yes | ||
| depth | No | default: to the next face | |
| flip | bool | No | |
| direction | in_plane|normal | No |
Automation details
Command ID: solid.web
Parameters:
sketch, curves: [open curve ids] (one wall each); thickness; depth? (default: to the next face); flip?: bool; direction?: in_plane|normal
Emboss
Command group: SOLID › CREATE
Raise sketch text or a logo out of a face, or sink it in: an engraved part number, a serial or rev letter, a logo, or raised lettering on a casting pattern. It works on flat faces, and straight-line outlines can wrap around a cylinder.
Before you start
- You need a body and a sketch with closed profiles to emboss, usually text made with the sketch’s Text tool. Sketch it on or parallel to the face it goes on.
- Deboss sinks the profiles into the face: that’s engraving. Emboss raises them out of it.
- Only profiles made of straight lines running along and around the cylinder (orthogonal lines, such as a rectangular label or flat) wrap around it, sketched on a plane tangent to it. Text with curves or diagonals doesn’t wrap; engrave it on a flat face instead. Pick the cylinder’s wall as the Target Face to say which one when there is more than one.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Profiles | The sketch profiles to emboss: the letters or the logo outline. | The text “PN 1234-A”. |
| Target Face (optional) | The face the profiles go on. Leave it empty to use the face under the sketch. | The outside of a shaft, to wrap a rectangular label area around it. |
| Depth | How deep the profiles sink in, or how high they stand out. It starts at 1 in the design’s unit. | 0.005 in to 0.010 in for engraving. |
| Type | Emboss raises the profiles out of the face. Deboss sinks them into it. It starts at Emboss. | Deboss for an engraved part number. |
Try it: engrave a part number
- Make a 3 in × 2 in × 0.75 in block.
- Start a sketch on the top face. Start the sketch’s Text tool: it’s in the sketch ribbon’s Create dropdown, between Centerline and Divide Curve, or press S and type Text. Write “PN 1234-A”, 0.25 in high, and finish the sketch.
- Click Emboss. Click Profiles and pick the letters. Each letter shape counts as its own profile, so Profiles shows several selected.
- Set Type to Deboss and Depth to 0.010 in. Click OK. The part number is engraved 0.010 in deep into the top face.
Tips and common mistakes
- Do use Deboss for markings on a machined part. Engraving takes one pass with an engraving tool; raised lettering means milling away everything around it.
- Do keep engraving shallow: 0.005 in to 0.010 in reads clearly and doesn’t take a small engraving tool too deep.
- Do pick a text height and font your engraving tool can cut. Strokes thinner than the tool’s tip get lost.
- Do change the Depth from its default. It starts at 1 in the design’s unit, far too deep for a marking.
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 0.010 in enters 0.254 mm.
See also
Extrude cuts or raises a profile to a set distance. Hole places drilled and tapped holes.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | Yes | ||
| profiles | No | ||
| depth | Yes | ||
| mode | emboss|deboss | No | |
| targets | No | ||
| face | world point [x,y,z] selecting a planar or complete exterior cylindrical wall | No | inferred when exactly one supported tangent cylinder matches the selected profiles |
Automation details
Command ID: solid.emboss
Parameters:
sketch, profiles?; depth; mode?: emboss|deboss; targets?; face?: world point [x,y,z] selecting a planar or complete exterior cylindrical wall (inferred when exactly one supported tangent cylinder matches the selected profiles)
Joint Origin
Command group: SOLID › CREATE
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | No | ||
| occurrence | id|name | No | default: from the pick, or the named face's component |
| path | [occurrence ids from the root] | No | the placement picked on, ending at the occurrence: a part in a sub-assembly placed more than once is then on that copy; default: the occurrence's first placement, or with no occurrence the placement nearest the pick |
| face | [x,y,z] | "<name>" | Yes | centre of a planar face |
| circle | [x,y,z] | "<name>" | Yes | centre of a round end: a point on its wall or rim, the end's centre, or the round face's name as model.faces lists it |
| edge | [x,y,z] | Yes | a point on an edge of a planar face: the edge's middle, z out of the face, y into it; on?: [x,y,z] a point on the face (default: the larger planar face beside the edge); corner?: [x,y,z] near one end: the corner there, x and y along its two edges into the face; found again by name, so it follows the face as it changes size; z?: [x,y,z] the frame's z instead of the face's normal, along the edge when it runs that way, x chosen from z: an edge or corner picked as it is, kept as a point where it can't be found by name |
| point | [x,y,z] | Yes | |
| z | [x,y,z] | No | |
| plane | "XY"|"XZ"|"YZ"|"o:<ids>/origin/<item>"|"<name>" | Yes | |
| axis | "X"|"Y"|"Z"|"o:<ids>/origin/<item>"|"<name>" | Yes | |
| body | the named face's body | No | |
| end | "<name>" | No | a circle's end: the face across its rim there; default the end nearer the pick |
Automation details
Command ID: joint.origin
Parameters:
name?, occurrence?: id|name (default: from the pick, or the named face's component), path?: [occurrence ids from the root] (the placement picked on, ending at the occurrence: a part in a sub-assembly placed more than once is then on that copy; default: the occurrence's first placement, or with no occurrence the placement nearest the pick), face: [x,y,z] | "<name>" (centre of a planar face) | circle: [x,y,z] | "<name>" (centre of a round end: a point on its wall or rim, the end's centre, or the round face's name as model.faces lists it) | edge: [x,y,z] (a point on an edge of a planar face: the edge's middle, z out of the face, y into it; on?: [x,y,z] a point on the face (default: the larger planar face beside the edge); corner?: [x,y,z] near one end: the corner there, x and y along its two edges into the face; found again by name, so it follows the face as it changes size; z?: [x,y,z] the frame's z instead of the face's normal, along the edge when it runs that way, x chosen from z: an edge or corner picked as it is, kept as a point where it can't be found by name) | point: [x,y,z], z?: [x,y,z] | plane: "XY"|"XZ"|"YZ"|"o:<ids>/origin/<item>"|"<name>" | axis: "X"|"Y"|"Z"|"o:<ids>/origin/<item>"|"<name>"; a circle's z?: [x,y,z] (a round edge's centre with the way out of it: its end by name when that is the frame it shows, else a point there); body?: the named face's body; end?: "<name>" (a circle's end: the face across its rim there; default the end nearer the pick); x?: [x,y,z] (a direction, world) | "<face name>" | {face: [x,y,z]} (the frame's x: a direction, a plane's normal, or the way to another hole's axis; keeps a round origin's turn; a point's x is a direction, laid square to its z, default: chosen from z alone). Faces are kept by name: the origin follows its face, and a circle its end, when the design changes
SOLID › INSERT
Insert Point Cloud
Command group: SOLID › INSERT
Read the solid features guide.
Automation details
Command ID: pointcloud.insert
Parameters:
path: .ply, .xyz or .pts file (its points join the design as a point cloud: drawn as points, never a body; a PLY's red, green and blue are its colours, its other properties can colour and filter it; its edge and face elements become segments and triangles, a segment with width and height properties drawn as a bead) → cloud, name, points, segments, triangles, source_points, bounds, warnings; name?; units?: mm|cm|m|in|ft (the file's length unit, default mm); max_points?: most points kept (default 5000000, at most 20000000; a larger file is thinned evenly); center?: bool (move the cloud so the middle of its base sits at the origin); point_size?: pixels (0.5…16, default 2); color_by?: file|single|height or a property's name (the file's colours, the default; one colour; a ramp by height, blue low to red high; or by any property of the file, a ramp over its values or a palette for whole numbers); color?: [r, g, b] 0…1 (the single colour; given alone it sets color_by single, null sets color_by file); color_range?: [low, high] the ramp runs between (design Z in mm by height), or null for the automatic range (by height all but the lowest and highest 2 % of the points; by a property the values it takes over what the filters keep); height_range?: the same as color_range; filters?: [{property, range: [low, high]} or {property, values: [whole numbers]} for a property with named values], or null (only what every filter keeps is shown)
Insert Fastener
Command group: SOLID › INSERT
Read the solid features guide.
Automation details
Command ID: parts.fastener
Parameters:
the Insert Part dialog's command (same as parts.insert): family, size, length?, at?|point?+direction? (from the shank's tip toward the head), flip?, name?
Insert STEP
Command group: SOLID › INSERT
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| folder | bool | No | default false; true: an import that brings more than one item into the history (its Import feature and the rigid joints holding its parts) goes into a new history folder named `Group #N` |
| name | No | the feature's and the component's | |
| up | z|y | No | default z: the file's axes are kept; y: the file has Y up, so the import's component is turned a quarter turn about X, Y becoming Z → stand_up: its occurrence |
| names | auto|solid|product|instance | No | default auto: keep meaningful solid names, replace placeholders with the nearest named product, else instance; solid: the solid's own name; product: the part's name; instance: the occurrence's name, else the product's |
| history | features|solids for a FreeCAD file | No | default features: its sketches and the Pad, Pocket, Revolution, Groove, Fillet, Chamfer and primitive features that use them are rebuilt as features in the new component, when every one can be and they build what the file holds → features_added, history: "features"; else, or with solids, the file's solids come in as an Import feature, and a warning says why the history was not rebuilt |
| matrix | [12 or 16 numbers] | No | where the new component's occurrence sits in the active component, after `up`: a rigid row-major 3x4 rotation-and-translation or 4x4 matrix, flat or as rows, as occurrence.move takes it; a scale, shear or mirror is refused before the file is read |
| tolerance | No | see occurrence.move |
Automation details
Command ID: file.insert_step
Parameters:
path: STEP, IGES, FreeCAD .FCStd or Rhino .3dm file (its bodies join the design as an Import base feature in a new component named after the file, placed in the active component; an assembly's products become nested components, a repeated part one component with an occurrence per placement, all held as one rigid group until component.unlock → component, component_name, occurrence, subcomponents?, rigid_joints?, group?: the folder); folder?: bool (default false; true: an import that brings more than one item into the history (its Import feature and the rigid joints holding its parts) goes into a new history folder named `Group #N`); name? (the feature's and the component's); up?: z|y (default z: the file's axes are kept; y: the file has Y up, so the import's component is turned a quarter turn about X, Y becoming Z → stand_up: its occurrence); names?: auto|solid|product|instance (default auto: keep meaningful solid names, replace placeholders with the nearest named product, else instance; solid: the solid's own name; product: the part's name; instance: the occurrence's name, else the product's); history?: features|solids for a FreeCAD file (default features: its sketches and the Pad, Pocket, Revolution, Groove, Fillet, Chamfer and primitive features that use them are rebuilt as features in the new component, when every one can be and they build what the file holds → features_added, history: "features"; else, or with solids, the file's solids come in as an Import feature, and a warning says why the history was not rebuilt); matrix?: [12 or 16 numbers] (where the new component's occurrence sits in the active component, after `up`: a rigid row-major 3x4 rotation-and-translation or 4x4 matrix, flat or as rows, as occurrence.move takes it; a scale, shear or mirror is refused before the file is read); tolerance? (see occurrence.move)
Insert Mesh
Command group: SOLID › INSERT
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | No | ||
| up | z|y for a glTF file | No | default y: glTF has Y up, so the import's component is turned a quarter turn about X, Y becoming Z → stand_up: its occurrence; z: the file's axes are kept |
| origin | bool | No | default false: the mesh keeps its file's coordinates; true: once read, scaled and stood up, the import's occurrence is moved so the box around its bodies is centred on X and Y of the active component with its lowest point on Z = 0 → moved_to_origin: [x, y, z], the shift made |
| crease_angle_degrees | 0..180 | No | 0 clears imported shading normals for the previous flat-shading behavior; positive angles regenerate angle-weighted normals across manifold edges below this crease angle; omitted keeps authored OBJ normals/smoothing groups, or flat shading when absent; geometry stays unchanged |
Automation details
Command ID: file.insert_mesh
Parameters:
path: .3mf, .stl, .obj, .ply (with faces), .glb or .gltf file (its meshes join the design as mesh bodies in a new component named after the file → component, component_name, occurrence; a glTF file's node tree becomes nested components held as one rigid group until component.unlock, a mesh placed again another occurrence, its materials the bodies' appearances, and its metres millimetres); name?; up?: z|y for a glTF file (default y: glTF has Y up, so the import's component is turned a quarter turn about X, Y becoming Z → stand_up: its occurrence; z: the file's axes are kept); units?: mm|cm|m|in|ft for an STL or OBJ file, or a PLY file with faces (default mm): the unit its coordinates are in, scaled to millimetres as the file is read (a 3MF or glTF file states its own). The design keeps the millimetre mesh and not the unit, so insert the file again to try another; origin?: bool (default false: the mesh keeps its file's coordinates; true: once read, scaled and stood up, the import's occurrence is moved so the box around its bodies is centred on X and Y of the active component with its lowest point on Z = 0 → moved_to_origin: [x, y, z], the shift made); crease_angle_degrees?: 0..180 (0 clears imported shading normals for the previous flat-shading behavior; positive angles regenerate angle-weighted normals across manifold edges below this crease angle; omitted keeps authored OBJ normals/smoothing groups, or flat shading when absent; geometry stays unchanged)
SOLID › MODIFY
Fillet
Command group: SOLID › MODIFY
Default keyboard shortcut: F
Round the edges of a solid: the “R.03 typ” or “break all edges R.015” callout on a print, or the corner radius left in a pocket by the end mill. You pick the edges and the radius.
Before you start
- You need a solid body with edges to round.
- Pick edges one at a time, or click a face to round every edge around it.
- Round the larger radii first. Do the vertical corners of a block before its top edges, so the small top round runs smoothly around the big corner.
- An inside corner on a milled part can’t be sharper than the cutter. Make inside radii a little larger than the end mill’s radius, so the tool doesn’t bury itself in the corner.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Edges | The edges to round. Click edges one by one, or click a face to take all of its edges. | The four vertical corners of a block, or the top face. |
| Radius | The radius of the round. A new fillet starts at 2 mm, shown in the design’s unit. | 0.03 in for a typical edge break. |
| Type | Constant radius: one radius all along the edge. Chord length: the width across the round stays the same whatever angle the faces meet at. Variable radius: a radius at each end, and more along the edge if you add them. Curvature continuous: a smoother section where it meets flat faces (G2). Spline: the radius follows control radii you set along the edge. | Constant radius for almost everything on a machined part. Variable radius for a round that has to grow along an edge. |
| Corners (Constant radius) | Shown when three or more of the picked edges meet at one corner, such as rounding every edge of a block in one Fillet. Tangent makes a rolling-ball corner. Curvature makes a smooth patch set back along each edge, with a Setback box. | Leave it on Tangent. That is the corner a ball end mill leaves. |
| Face limits (Constant radius) | What happens when the radius is too big for the faces beside an edge. Exact radius stops and says why. Largest radius rounds every edge with the largest radius that fits, and shows the Applied Radius. Narrowed radius keeps the radius and narrows the round only where the faces run out. | Leave it on Exact radius, so a radius that doesn’t fit is caught instead of quietly changed. |
| Turns (Constant radius) | Where two rounds turn around a sharp corner edge, such as the rounds along the base of a boss at its upright edges. Mitre runs the rounds on until they meet. Swept turns them around the corner edge. | Mitre unless you want the corner rolled around. |
| End Radius, Swap Ends, Mid Radius (Variable radius) | The radius at the far end of the first edge, which end gets the start radius, and extra radii along the edge (Add Mid Radius). Smooth radius change blends between them instead of running straight. | A round that goes from 0.06 in at one end to 0.25 in at the other. |
| Tangent chain | Follows the edge around smooth (tangent) bends, so one pick rounds the whole run. | Leave it on for edges that flow into an existing round. |
| Preview | Shows the round on the part while you set it up. | Leave it on. |
Try it: round the corners and break the top edges of a plate
- Make a 3 in × 2 in × 0.75 in block (sketch a rectangle, Extrude 0.75 in).
- Click Fillet and click the four vertical corner edges. Set Radius to 0.25 in and click OK.
- Click Fillet again and click the top face. Edges shows 8 selected: the four straight edges and the four rounded corners.
- Set Radius to 0.03 in and click OK. The top edge has a 0.03 in round all the way around.
Tips and common mistakes
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 0.03 in enters 0.762 mm.
- Do round all the edges of one size in a single Fillet. It’s one feature to change when the print changes.
- Do round the big corners before the small edge breaks. Done the other way, the small round has to turn a sharp corner and can fail or leave an odd shape.
- Don’t make a round bigger than the faces beside it allow. With Face limits on Exact radius, the dialog says “The radius is too large for the faces beside these edges” and OK stays grayed out; use a smaller radius, or set Face limits to Largest radius.
- Don’t model a round you’ll never see just to look finished. Every fillet adds rebuild time and can get in the way of later features.
See also
Chamfer bevels an edge instead of rounding it. Shell hollows a part after the outside edges are rounded.
| Parameter | Type | Required | Description |
|---|---|---|---|
| edges | [[x,y,z] point on edge | {body, index}] | Yes | |
| radius | expr | Yes | |
| tangent_chain | bool | No | default true: each picked edge's tangent chain is rounded with it; false: exactly the picked edges |
| body | the body the edges are on | No | without it, each point is looked up on every placed body, shown or hidden, and a point on edges of 2 bodies is refused, naming them |
| type | constant|curvature|chord|variable|spline | No | alias g2: curvature-continuous quintic between planar faces along straight edges, one planar end face at each end (including sloped ends); radius sets the equivalent circular setback, not constant curvature; exact fit only; radius is the width across; radius at the end nearest start, radius2 at the other; one end may be 0, where the round closes to the corner; the radius along the edge is a clamped B-spline from the end nearest start: radius is its first control radius, radii the rest, knots its knot vector from 0 to 1; one end may be 0 |
| radius2 | No | ||
| start | [x,y,z] | No | |
| radii | [expr, …] | No | |
| knots | [number, …] | No | |
| mid | [[position 0…1 from start, radius expr], …] | No | variable radii between the ends |
| smooth | bool | No | smooth instead of straight between the radii |
| corner | rolling|g2 | No | rolling, the default: the corners where three blended edges meet are pieces of the rolling ball's sphere, tangent to each blend; a curvature round's corners are always g2 patches, between its own sections; g2: each corner where three or more rounded edges meet, and every edge there is rounded, is set back (1.5 × the radius along each edge unless `setbacks` names it) and filled with a patch meeting the rounds and the faces round it to the second order (curvature-continuous seams, clear of the points where a round's section ends on a face), constant-radius exact fillets only, refused where it cannot be built |
| setbacks | [{vertex: [x,y,z], distance: expr}, …] | No | corner setbacks: the corner at the vertex nearest `vertex`, where every edge meeting it is rounded, starts its patch `distance` along each of those edges from the vertex, past where the rounds would meet (past the radius at a square corner), so the rounds blend through a larger patch; one distance for all of a corner's edges; constant-radius exact fillets only; with `corner: g2`, the G2 patch's corners |
| turn | mitre|swept | No | where two rounds turn round a sharp, straight, convex side edge square to both on a plane, such as the rounds along a boss's base at its upright edges: mitre, the default, runs them on to meet in a mitre; swept ends them at the side edge and fills the corner with their section revolved about it, a torus; swept takes type: constant, corner: rolling, no setbacks and fit: exact or reduce, and is refused with the reason where the rounds are unequal or the side edge is concave, curved or tangent |
| fit | exact|reduce|taper | No | exact, the default: a radius too large for the geometry around the edges is refused, naming the largest that fits; reduce: where it doesn't fit it is reduced to the largest that does, one radius for edges sharing a face; the smallest used is returned as `radius_applied`, each edge's as `radii_applied: [{edge: [x,y,z], radius}]`, and noted in the feature's warning; taper: along each straight edge between planar faces where it doesn't fit, the radius follows the room there as a smooth spline, down to 0 where a face closes to a point, noted in the feature's warning |
Automation details
Command ID: solid.fillet
Parameters:
edges: [[x,y,z] point on edge | {body, index}] ; radius: expr; tangent_chain?: bool (default true: each picked edge's tangent chain is rounded with it; false: exactly the picked edges); body?: the body the edges are on (without it, each point is looked up on every placed body, shown or hidden, and a point on edges of 2 bodies is refused, naming them); type?: constant|curvature (alias g2: curvature-continuous quintic between planar faces along straight edges, one planar end face at each end (including sloped ends); radius sets the equivalent circular setback, not constant curvature; exact fit only)|chord (radius is the width across)|variable (radius at the end nearest start, radius2 at the other; one end may be 0, where the round closes to the corner)|spline (the radius along the edge is a clamped B-spline from the end nearest start: radius is its first control radius, radii the rest, knots its knot vector from 0 to 1; one end may be 0); radius2?; start?: [x,y,z]; radii?: [expr, …]; knots?: [number, …]; mid?: [[position 0…1 from start, radius expr], …] (variable radii between the ends); smooth?: bool (smooth instead of straight between the radii); corner?: rolling|g2 (rolling, the default: the corners where three blended edges meet are pieces of the rolling ball's sphere, tangent to each blend; a curvature round's corners are always g2 patches, between its own sections; g2: each corner where three or more rounded edges meet, and every edge there is rounded, is set back (1.5 × the radius along each edge unless `setbacks` names it) and filled with a patch meeting the rounds and the faces round it to the second order (curvature-continuous seams, clear of the points where a round's section ends on a face), constant-radius exact fillets only, refused where it cannot be built); setbacks?: [{vertex: [x,y,z], distance: expr}, …] (corner setbacks: the corner at the vertex nearest `vertex`, where every edge meeting it is rounded, starts its patch `distance` along each of those edges from the vertex, past where the rounds would meet (past the radius at a square corner), so the rounds blend through a larger patch; one distance for all of a corner's edges; constant-radius exact fillets only; with `corner: g2`, the G2 patch's corners); turn?: mitre|swept (where two rounds turn round a sharp, straight, convex side edge square to both on a plane, such as the rounds along a boss's base at its upright edges: mitre, the default, runs them on to meet in a mitre; swept ends them at the side edge and fills the corner with their section revolved about it, a torus; swept takes type: constant, corner: rolling, no setbacks and fit: exact or reduce, and is refused with the reason where the rounds are unequal or the side edge is concave, curved or tangent); fit?: exact|reduce|taper (exact, the default: a radius too large for the geometry around the edges is refused, naming the largest that fits; reduce: where it doesn't fit it is reduced to the largest that does, one radius for edges sharing a face; the smallest used is returned as `radius_applied`, each edge's as `radii_applied: [{edge: [x,y,z], radius}]`, and noted in the feature's warning; taper: along each straight edge between planar faces where it doesn't fit, the radius follows the room there as a smooth spline, down to 0 where a face closes to a point, noted in the feature's warning)
Chamfer
Command group: SOLID › MODIFY
Cut a flat bevel along edges of a solid: the “break all edges” or “0.03 × 45°” callout on a print. You pick the edges and how the chamfer is sized.
Before you start
- You need a solid body with edges to chamfer.
- Pick edges one at a time, or click a face to chamfer every edge around it.
- Chamfer edges before you add other features that touch them. An edge that already meets a small chamfer or fillet has little room left, and a chamfer there can fail.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Edges | The edges to chamfer. Click edges one by one, or click a face to take all of its edges. | The four top edges of a block, or the top face. |
| Chamfer Type | Equal Distance: the same leg on both faces. That is a 45° chamfer only where the faces meet at 90°. Two Distances: a different leg on each face. Distance and Angle: one leg and an angle. | Equal Distance for a standard edge break on a square corner. Distance and Angle whenever the print gives an angle, like 0.06 × 30°, and for any chamfer on a sloped face. |
| Distance (Equal Distance) | The leg length on both faces. | 0.03 in for a typical edge break. |
| Distance 1 and Distance 2 (Two Distances) | The leg on each face. | 0.06 in by 0.03 in. |
| Distance 1 and Angle (Distance and Angle) | The leg on the first face, and the angle off that face. | 0.06 in at 45°. |
| Flip | Swaps which face the first distance is measured on. Shown for Two Distances and Distance and Angle. | Turn it on if the long leg ends up on the wrong face. |
| Tangent chain | Follows the edge around smooth (tangent) bends, such as a fillet, so one pick chamfers the whole run. | Leave it on for edges that flow into a fillet. |
| Preview | Shows the chamfer on the part while you set it up. | Leave it on. |
Try it: break the top edges of a plate
- Make a 3 in × 2 in × 0.75 in block (sketch a rectangle, Extrude 0.75 in).
- Click Chamfer and click the four top edges. Edges shows 4 selected.
- Set Chamfer Type to Equal Distance and Distance to 0.03 in.
- Click OK. All four top edges have a 0.03 × 45° chamfer.
- To change it, edit the chamfer and set Chamfer Type to Distance and Angle, Distance 1 to 0.06 in and Angle to 30. Use Flip to swap which face takes the 0.06 in leg.
Tips and common mistakes
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 0.03 in enters 0.762 mm.
- Do chamfer all the edges of one size in a single Chamfer. It’s one feature to change when the print changes.
- Don’t chamfer an edge right next to an existing small chamfer with a larger size. If the chamfer would run past the neighbouring face, the dialog says so; make the chamfer smaller or chamfer those edges together in one feature.
See also
Hole adds a countersink at the top of a hole. Fillet rounds an edge instead of beveling it.
| Parameter | Type | Required | Description |
|---|---|---|---|
| edges | [[x,y,z] | {body, index}] | Yes | |
| distance | expr | Yes | |
| tangent_chain | bool | No | default true: each picked edge's tangent chain is cut with it; false: exactly the picked edges |
| distance2 | expr | No | along the second face |
| angle | expr | No | from the first face |
| flip | bool | No | which face is first: by default the one facing up most |
| body | the body the edges are on | No | without it, each point is looked up on every placed body, shown or hidden, and a point on edges of 2 bodies is refused, naming them |
Automation details
Command ID: solid.chamfer
Parameters:
edges: [[x,y,z] | {body, index}] ; distance: expr; tangent_chain?: bool (default true: each picked edge's tangent chain is cut with it; false: exactly the picked edges); distance2?: expr (along the second face) | angle?: expr (from the first face); flip?: bool (which face is first: by default the one facing up most); body?: the body the edges are on (without it, each point is looked up on every placed body, shown or hidden, and a point on edges of 2 bodies is refused, naming them)
Combine
Command group: SOLID › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| target | body | Yes | |
| tools | [body] | Yes | |
| operation | join|cut|intersect | No | |
| touching | separate|one_body | No | what a join makes of pieces that share no face: separate, the default, makes each piece that touches another only along an edge or at a point a body of its own and keeps pieces that touch nothing in one body; one_body keeps every piece in one body |
| keep_tools | bool | No | |
| new_component | bool | No | the result goes into a new component; component_name? |
Automation details
Command ID: solid.combine
Parameters:
target: body; tools: [body]; operation?: join|cut|intersect; touching?: separate|one_body (what a join makes of pieces that share no face: separate, the default, makes each piece that touches another only along an edge or at a point a body of its own and keeps pieces that touch nothing in one body; one_body keeps every piece in one body); keep_tools?: bool; new_component?: bool (the result goes into a new component; component_name?)
Scale
Command group: SOLID › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | Yes | |
| factor | expr | Yes | |
| factors | [x, y, z] exprs | Yes | |
| origin | [x,y,z] | No |
Automation details
Command ID: solid.scale
Parameters:
bodies: [names]; factor: expr | factors: [x, y, z] exprs; origin?: [x,y,z]
Delete Face
Command group: SOLID › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| faces | [[x,y,z] points on the faces, or face names from model.faces] | Yes | |
| body | No | ||
| heal | bool | No | default true: the neighbouring planes close the gap, as when a rounded edge, hole or boss is taken off; false: the gap stays open and the faces left are a surface body |
Automation details
Command ID: face.delete
Parameters:
faces: [[x,y,z] points on the faces, or face names from model.faces]; body?; heal?: bool (default true: the neighbouring planes close the gap, as when a rounded edge, hole or boss is taken off; false: the gap stays open and the faces left are a surface body)
Offset Face
Command group: SOLID › MODIFY
Push faces of a solid in or out by a set distance, and the faces around them follow. Use it to add finish stock, open up a pocket or bore, make a pocket deeper or a wall thicker, without going back into the sketch.
Before you start
- You need a solid body. The faces can be flat or curved, such as the wall of a bore.
- A positive Distance pushes the face out of the material and adds stock. A negative Distance pulls it into the material and removes stock.
- On an inside wall, such as the side of a pocket or the wall of a bore, out of the material means into the opening. A negative Distance opens the pocket or bore up; a positive one closes it in.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Faces | The faces to move. You can pick more than one. | The floor of a pocket, or the wall of a bore. |
| Distance | How far each face moves, square to the face. Positive adds material, negative removes it. | 0.010 in to leave stock on a face for finishing. -0.005 in on a bore wall to open the bore 0.010 in on the diameter. |
Try it: deepen and widen a pocket
- Make a 3 in × 2 in × 0.75 in block and cut a 1 in × 1 in pocket 0.25 in deep into the top.
- Click Offset Face (in the Modify menu) and click the floor of the pocket. Set Distance to -0.125 in. The arrow points down into the part. Click OK. The pocket is now 0.375 in deep.
- Click Offset Face again and click one side wall of the pocket. Set Distance to -0.25 in. The arrow points into the material, away from the pocket. Click OK. The pocket is now 1.25 in wide that way.
Tips and common mistakes
- Do remember a bore moves on the radius. To open a bore 0.010 in on the diameter, offset its wall -0.005 in.
- Do watch the arrow before clicking OK. It shows which way the face will move.
- Do type the unit with the number when the print uses another unit. In a millimetre design, typing 0.010 in enters 0.254 mm.
- Do use Offset Face for a quick size change on a finished model, such as a stock allowance or a fit adjustment. If the size will change again, change the sketch or the feature instead, so the dimension lives where the print puts it.
See also
Extrude sets a depth when the feature is made. Shell sets a wall thickness for a whole hollow part. Hole sets a hole’s size from the start.
| Parameter | Type | Required | Description |
|---|---|---|---|
| faces | [[x,y,z] points on faces (planar or curved), or face names from model.faces] | Yes | |
| distance | expr | Yes | positive: outward |
| body | No |
Automation details
Command ID: solid.offset_face
Parameters:
faces: [[x,y,z] points on faces (planar or curved), or face names from model.faces]; distance: expr (positive: outward); body?
Shell
Command group: SOLID › MODIFY
Hollow out a solid to an even wall thickness, leaving the faces you pick open: a box with an open top, an enclosure, or a cup.
Before you start
- You need a solid body.
- Pick the faces to remove. They become the openings. Pick the top face of a block to get an open box.
- To make a closed hollow part with no openings, click the body instead of a face.
- Round or chamfer the edges around the opening after you shell, not before. Shell can fail on a round that runs into the opening.
Options
| Choice in the dialog | Meaning | Example or reason to choose it |
|---|---|---|
| Faces/Body | The faces to remove, or the body for a closed hollow part. | The top face of a block for an open box. |
| Thickness | The wall thickness. | 0.125 in for a small enclosure. |
| Direction | Inside keeps the outside size and builds the wall inward. Outside keeps the inside size and builds the wall outward. Both splits the wall across the original faces. | Inside when the outside size is on the print. Outside when the inside size matters, such as a pocket a part must fit in. |
| Tangent chain (under Options) | Also removes faces that run smoothly into the ones you picked, such as a fillet around the top edge. | On by default. Turn it off to remove only the faces you clicked. |
Try it: an open-top box
- Make a 4 in × 3 in × 2 in block (sketch a rectangle, Extrude 2 in).
- Click Shell and click the top face. Faces/Body shows 1 selected.
- Set Thickness to 0.125 in and Direction to Inside.
- Click OK. The block is an open box, still 4 in × 3 in × 2 in outside, with 0.125 in walls and floor.
- To try Outside, edit the shell and set Direction to Outside. The inside is now 4 in × 3 in and the outside grows by the wall.
Tips and common mistakes
- Do pick Direction from the dimension that matters. Inside holds the outside size, Outside holds the inside size.
- Do shell first and round the rim after. Shell then doesn’t have to follow the rounds.
- Don’t click the body when you want an opening. Clicking the body makes a closed hollow part with no way in.
See also
Fillet rounds the rim after you shell. Extrude makes the block to start from.
| Parameter | Type | Required | Description |
|---|---|---|---|
| faces | [[x,y,z] points on the faces to remove, or face names from model.faces; none: a closed hollow body] | Yes | |
| thickness | expr | Yes | |
| direction | inside|outside|both | No | |
| tangent_chain | bool | No | also open faces joined smoothly to the picked ones |
| body | No | needed with no faces when there are several bodies |
Automation details
Command ID: solid.shell
Parameters:
faces: [[x,y,z] points on the faces to remove, or face names from model.faces; none: a closed hollow body]; thickness: expr; direction?: inside|outside|both; tangent_chain?: bool (also open faces joined smoothly to the picked ones); body? (needed with no faces when there are several bodies)
Draft
Command group: SOLID › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| faces | [[x,y,z] points, or face names from model.faces] | Yes | |
| angle | expr | Yes | |
| neutral | XY|XZ|YZ|plane name|{origin, normal} | Yes | |
| pull | [x,y,z] | No | default: neutral plane normal |
| body | No |
Automation details
Command ID: solid.draft
Parameters:
faces: [[x,y,z] points, or face names from model.faces]; angle: expr; neutral: XY|XZ|YZ|plane name|{origin, normal}; pull?: [x,y,z] (default: neutral plane normal); body?
Split Face
Command group: SOLID › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| faces | [[x,y,z] points on the faces to split, or face names from model.faces] | Yes | |
| body | No |
Automation details
Command ID: solid.split_face
Parameters:
faces: [[x,y,z] points on the faces to split, or face names from model.faces]; body?; and the splitting tool: plane: XY|XZ|YZ|plane name|{origin, normal} — or tool: {body, point} (a face of a body, its surface extended) — or sketch: id or name (its curves, along the sketch's normal; each curve on its own, an open one extended past its ends) and loops?: bool (default false: true joins the curves end to end first, so a closed loop cuts along itself only)
Split Body
Command group: SOLID › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | name | Yes | |
| plane | XY|XZ|YZ|plane name|{origin, normal} — or tool: {body, point} | Yes | a face of a body, its surface extended |
| line | curve id | Yes | a straight sketch line, along the sketch's normal |
Automation details
Command ID: solid.split_body
Parameters:
body: name; plane: XY|XZ|YZ|plane name|{origin, normal} — or tool: {body, point} (a face of a body, its surface extended) — or sketch: id, line: curve id (a straight sketch line, along the sketch's normal)
Press Pull
Command group: SOLID › MODIFY
Default keyboard shortcut: Q
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| face | [x,y,z] and distance: expr | Yes | positive adds material, negative cuts |
| edges | [[x,y,z]…] and distance | Yes | a fillet |
| body | the body the face or edges are on | No | for edges, as for solid.fillet |
Automation details
Command ID: solid.press_pull
Parameters:
face: [x,y,z] and distance: expr (positive adds material, negative cuts), or edges: [[x,y,z]…] and distance (a fillet); body?: the body the face or edges are on (for edges, as for solid.fillet)
Move/Copy
Command group: SOLID › MODIFY
Default keyboard shortcut: M
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | Yes | |
| translate | [x,y,z] | No | length exprs or numbers, applied after rotation |
| axis | [x,y,z] | No | default: world Z with origin, else the body's component's Z, world Z at the root |
| angle | angle expr | No | |
| origin | [x,y,z] | No | length exprs or numbers in world coordinates; default: the body's component's origin, the world origin at the root |
| tolerance | matrix rotation tolerance | No | default 1e-9, at most 1e-3 |
| copy | bool | No | default false; true keeps originals and transforms copies |
| occurrences | [occurrence paths, root first] | No | only with copy: copies each component independently and transforms the copies in world space; reply lists them in occurrences |
| name | No | ||
| body_name | No | ||
| body_names | No |
Automation details
Command ID: solid.move
Parameters:
bodies: [names]; translate?: [x,y,z] (length exprs or numbers, applied after rotation); axis?: [x,y,z] (default: world Z with origin, else the body's component's Z, world Z at the root); angle?: angle expr; origin?: [x,y,z] (length exprs or numbers in world coordinates; default: the body's component's origin, the world origin at the root); matrix?: rigid row-major 3x4 or 4x4, flat or rows (instead of translate/axis/angle/origin); tolerance?: matrix rotation tolerance (default 1e-9, at most 1e-3); copy?: bool (default false; true keeps originals and transforms copies); occurrences?: [occurrence paths, root first] (only with copy: copies each component independently and transforms the copies in world space; reply lists them in occurrences); name?, body_name?, body_names?
Replace Face
Command group: SOLID › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| faces | [[x,y,z] points on planar faces, or face names from model.faces] | Yes | |
| target | plane | Yes | XY|XZ|YZ|construction plane|{origin, normal} |
| target_face | [x,y,z] on a parallel planar face | Yes | |
| body | No |
Automation details
Command ID: solid.replace_face
Parameters:
faces: [[x,y,z] points on planar faces, or face names from model.faces]; target: plane (XY|XZ|YZ|construction plane|{origin, normal}) | target_face: [x,y,z] on a parallel planar face; body?
Align
Command group: SOLID › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | Yes | |
| from | [x,y,z] | "origin" | {snap: vertex|edge_mid|face_center|circle_center, at: [x,y,z]} | Yes | |
| from_face | [x,y,z] | Yes | |
| from_plane | XY|XZ|YZ|construction or offset plane name or id|{origin, normal} | Yes | |
| to | Yes | the same | |
| to_face | [x,y,z] | Yes | |
| to_plane | Yes | a plane as from_plane; the point or face goes onto it along its normal, and the plane may move later: the bodies follow | |
| flip | bool | No | |
| axes | [x, y, z] | No | point-to-point only: which world axes the offset moves along; default all three, at least one true |
| angle | expr | No | a turn about the target's direction after the move |
Automation details
Command ID: solid.align
Parameters:
bodies: [names]; from: [x,y,z] | "origin" | {snap: vertex|edge_mid|face_center|circle_center, at: [x,y,z]} | from_face: [x,y,z] | from_plane: XY|XZ|YZ|construction or offset plane name or id|{origin, normal}; to: (the same) | to_face: [x,y,z] | to_plane: (a plane as from_plane; the point or face goes onto it along its normal, and the plane may move later: the bodies follow); from_frame / to_frame: a frame found again whenever the design changes, so the bodies follow it, in place of that side's point, face or plane: a joint origin as joint.create takes one ({face|circle|edge|point: [x,y,z]}, a face's name, a named joint origin) or {sketch, point|curve} (a sketch point, or a circle's, arc's or ellipse's centre, z along the sketch's normal), on the bodies' own component; faces, planes and frames also turn to meet; flip?: bool; axes?: [x, y, z] (point-to-point only: which world axes the offset moves along; default all three, at least one true); angle?: expr (a turn about the target's direction after the move)
Remove
Command group: SOLID › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | Yes | removed from here on in the timeline |
Automation details
Command ID: solid.remove
Parameters:
bodies: [names] (removed from here on in the timeline)
Compute All
Command group: SOLID › MODIFY
Read the solid features guide.
Automation details
Command ID: timeline.compute_all
No parameter description is provided by the command registry.
Delete
Command group: SOLID › MODIFY
Default keyboard shortcut: Delete
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| feature | id|name | Yes | |
| features | [id|name] | Yes | |
| groups | [timeline folder ids] | Yes | a folder goes with all its features, joints and nested folders; one undo step; a sketch takes its dependent features with it |
Automation details
Command ID: timeline.delete
Parameters:
feature: id|name | features: [id|name] | groups: [timeline folder ids] (a folder goes with all its features, joints and nested folders; one undo step; a sketch takes its dependent features with it) → deleted: [feature ids]; joints?: [joint ids]; groups?: [folder ids deleted]; failing?: [{feature, error}] (later features that worked and now fail)
Change Parameters
Command group: SOLID › MODIFY
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| expression | Yes | number or text | |
| unit | mm|cm|m|in|ft|deg|rad|""|text | No | new parameters default to their value's unit, a length the design's units; a text parameter's expression is its text, quotes round it optional: sketch texts' words are built from it |
| comment | No | ||
| favorite | bool | No | |
| new_name | rename | No | references follow; an expression `new = value` renames to `new` and sets value, or sets `new` when the expression is just `new` |
| delete | name | Yes | |
| changes | {name: expression, …} | Yes | existing parameters, checked together and rebuilt once, all or nothing |
Automation details
Command ID: parameters.change
Parameters:
name, expression (number or text), unit?: mm|cm|m|in|ft|deg|rad|""|text (new parameters default to their value's unit, a length the design's units; a text parameter's expression is its text, quotes round it optional: sketch texts' words are built from it), comment?, favorite?: bool, new_name?: rename (references follow; an expression `new = value` renames to `new` and sets value, or sets `new` when the expression is just `new`); or delete: name; or changes: {name: expression, …} (existing parameters, checked together and rebuilt once, all or nothing) → changed?: {name: value} (with changes), recomputed: features rebuilt, restored: features whose earlier result for the same inputs was reused (e.g. a value set back), switched?: [{feature, name, suppressed}] (the configuration rules that switch a feature's suppression and read a parameter whose value changed run in their order, as on activation; driven parameters and restrictions wait for a configuration edit or activation)
Physical Material
Command group: SOLID › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | Yes | |
| material | name | Yes | Steel, Aluminum, ABS Plastic, …, or one made with material.create; `material.list` |
Automation details
Command ID: material.assign
Parameters:
bodies: [names]; material: name (Steel, Aluminum, ABS Plastic, …, or one made with material.create; `material.list`)
Appearance
Command group: SOLID › MODIFY
Default keyboard shortcut: A
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | No | |
| faces | [[x,y,z] on faces] | No | body?: which body, default the nearest |
| components | [names or ids, or occurrence names] | No | |
| appearance | library name or stable starter.* ID | No | appearance.library |
| color | "#rrggbb" or [r, g, b] | Yes | 0–255 |
| opacity | No | 0–1, default 1 | |
| name | inert copied look label | No | requires color, mutually exclusive with appearance |
| pbr | {metallic:0..1, roughness:0.045..1, dielectric_ior:1..3} | No | requires color/appearance and opacity 1 |
Automation details
Command ID: appearance.assign
Parameters:
bodies?: [names]; faces?: [[x,y,z] on faces] (body?: which body, default the nearest); components?: [names or ids, or occurrence names]; appearance?: library name or stable starter.* ID (appearance.library) | color: "#rrggbb" or [r, g, b] (0–255), opacity? (0–1, default 1); name?: inert copied look label (requires color, mutually exclusive with appearance); pbr?: {metallic:0..1, roughness:0.045..1, dielectric_ior:1..3} (requires color/appearance and opacity 1); a starter ID or registered starter name resolves its recipe before color overrides; omitted pbr retains that response and pbr: null explicitly clears it. Unavailable glass recipes refuse through either selector. Other custom labels with an explicit color retain legacy scalar behavior. Neither appearance nor color (or color: null): clear, so the face follows its body, the body its component, the component its material
SOLID › CONSTRUCT
Offset Plane
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | No |
Automation details
Command ID: construct.plane.offset
Parameters:
base: XY|XZ|YZ|plane name, or a planar face {face: [x,y,z], body?, index?, path?}; offset: expr, or through: a point ref (vertex, sketch point, construction point) the plane goes through, parallel to base; name?
Plane at Angle
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| axis | X|Y|Z|construction axis name|{origin, dir} | {edge|face: [x,y,z]} | Yes | where it is now; a straight or circular edge, or a cylinder, cone or torus face: about its axis, followed as the model changes |
| angle | expr | Yes | |
| direction_only | bool | No | default false: turn about the axis as a line; true: project the axis direction onto base and turn about the line through pivot, or the base origin |
| pivot | point ref | No | only with direction_only; vertex, sketch point, construction point |
| name | No |
Automation details
Command ID: construct.plane.at_angle
Parameters:
base: XY|XZ|YZ|plane name, or a planar face {face: [x,y,z], body?, index?, path?}; axis: X|Y|Z|construction axis name (where it is now)|{origin, dir} | {edge|face: [x,y,z]} (a straight or circular edge, or a cylinder, cone or torus face: about its axis, followed as the model changes); angle: expr; direction_only?: bool (default false: turn about the axis as a line; true: project the axis direction onto base and turn about the line through pivot, or the base origin); pivot?: point ref (only with direction_only; vertex, sketch point, construction point); name?
Plane
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| refs | 1-3 refs in any order | Yes | |
| with | {the method's other parameters: offset, angle, t, name…} | No |
Automation details
Command ID: construct.plane
Parameters:
refs: 1-3 refs in any order; with?: {the method's other parameters: offset, angle, t, name…}. Builds with the first of the family's CONSTRUCT commands that takes the refs in its reference parameters (and every key of `with`). Returns method: the command used
Axis
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| refs | 1-3 refs in any order | Yes | |
| with | {the method's other parameters: offset, angle, t, name…} | No |
Automation details
Command ID: construct.axis
Parameters:
refs: 1-3 refs in any order; with?: {the method's other parameters: offset, angle, t, name…}. Builds with the first of the family's CONSTRUCT commands that takes the refs in its reference parameters (and every key of `with`). Returns method: the command used
Point
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| refs | 1-3 refs in any order | Yes | |
| with | {the method's other parameters: offset, angle, t, name…} | No |
Automation details
Command ID: construct.point
Parameters:
refs: 1-3 refs in any order; with?: {the method's other parameters: offset, angle, t, name…}. Builds with the first of the family's CONSTRUCT commands that takes the refs in its reference parameters (and every key of `with`). Returns method: the command used
Axis Through Cylinder/Cone/Torus
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| face | ref | Yes | a cylinder, cone or torus face, or a circular edge |
| name | No |
Automation details
Command ID: construct.axis.through_cylinder
Parameters:
face: ref (a cylinder, cone or torus face, or a circular edge); name?
Axis Perpendicular To Face
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| face | ref | Yes | |
| point | ref | Yes | the axis goes through it, square to the face |
| name | No |
Automation details
Command ID: construct.axis.normal_to_face
Parameters:
face: ref; point: ref (the axis goes through it, square to the face); name?
Axis Through Two Planes
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | plane or planar face refs | Yes | |
| b | plane or planar face refs | Yes | |
| name | No |
Automation details
Command ID: construct.axis.two_planes
Parameters:
a, b: plane or planar face refs; name?
Axis Through Two Points
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | point refs | Yes | |
| b | point refs | Yes | vertices, sketch points, points |
| name | No |
Automation details
Command ID: construct.axis.two_points
Parameters:
a, b: point refs (vertices, sketch points, points); name?
Axis Through Edge
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| edge | ref | Yes | a straight edge or sketch line |
| name | No |
Automation details
Command ID: construct.axis.edge
Parameters:
edge: ref (a straight edge or sketch line); name?
Point At Vertex
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| point | ref | Yes | vertex, sketch point, point |
| name | No |
Automation details
Command ID: construct.point.vertex
Parameters:
point: ref (vertex, sketch point, point); name?
Point Through Two Edges
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | edge or line refs | Yes | |
| b | edge or line refs | Yes | where they meet, or come closest |
| name | No |
Automation details
Command ID: construct.point.two_edges
Parameters:
a, b: edge or line refs (where they meet, or come closest); name?
Point Through Three Planes
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | plane or planar face refs | Yes | |
| b | plane or planar face refs | Yes | |
| c | plane or planar face refs | Yes | |
| name | No |
Automation details
Command ID: construct.point.three_planes
Parameters:
a, b, c: plane or planar face refs; name?
Point At Center Of Circle/Sphere/Torus
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| of | ref | Yes | circular edge, sketch circle or arc, sphere or torus face |
| name | No |
Automation details
Command ID: construct.point.center
Parameters:
of: ref (circular edge, sketch circle or arc, sphere or torus face); name?
Point At Edge And Plane
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| edge | edge or line ref | Yes | |
| plane | plane or planar face ref | Yes | |
| name | No |
Automation details
Command ID: construct.point.edge_plane
Parameters:
edge: edge or line ref; plane: plane or planar face ref; name?
Point Along Path
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | edge or sketch curve ref | Yes | |
| name | No |
Automation details
Command ID: construct.point.along_path
Parameters:
path: edge or sketch curve ref; t: expr, 0…1 along it (default 0.5); name?
Midplane
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | plane or planar face refs | Yes | |
| b | plane or planar face refs | Yes | halfway between; bisecting when they meet at an angle |
| name | No |
Automation details
Command ID: construct.plane.midplane
Parameters:
a, b: plane or planar face refs (halfway between; bisecting when they meet at an angle); name?
Plane Through Two Edges
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | straight edge or line refs in one plane | Yes | |
| b | straight edge or line refs in one plane | Yes | |
| name | No |
Automation details
Command ID: construct.plane.two_edges
Parameters:
a, b: straight edge or line refs in one plane; name?
Plane Through Axis And Point
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| point | off-axis point ref | Yes | |
| name | No |
Automation details
Command ID: construct.plane.axis_point
Parameters:
axis: origin axis, construction axis, straight edge or sketch line ref; point: off-axis point ref; name?
Plane Through Three Points
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | point refs | Yes | |
| b | point refs | Yes | |
| c | point refs | Yes | |
| name | No |
Automation details
Command ID: construct.plane.three_points
Parameters:
a, b, c: point refs; name?
Tangent Plane
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| face | ref | Yes | cylinder, cone, sphere or torus |
| at | [x,y,z] where it touches | No | default: the face pick |
| reference | plane or planar face ref | No | the plane touches where the face turns towards it: parallel to it, on the side of `at` |
| angle | expr | No | with reference, default 0 deg: turned that far about the face's axis; not on a sphere |
| name | No |
Automation details
Command ID: construct.plane.tangent
Parameters:
face: ref (cylinder, cone, sphere or torus); at?: [x,y,z] where it touches (default: the face pick); reference?: plane or planar face ref (the plane touches where the face turns towards it: parallel to it, on the side of `at`); angle?: expr (with reference, default 0 deg: turned that far about the face's axis; not on a sphere); name?
Plane Along Path
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | edge or sketch curve ref | Yes |
Automation details
Command ID: construct.plane.along_path
Parameters:
path: edge or sketch curve ref; t: expr, 0…1 along it (default 0.5); name? The plane is square to the path there
Perpendicular Plane
Command group: SOLID › CONSTRUCT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| plane | plane or planar face ref | Yes |
Automation details
Command ID: construct.plane.perpendicular
Parameters:
plane: plane or planar face ref; line: straight edge, sketch line or axis ref; name? The plane holds the line and is square to the plane
SOLID › ASSEMBLE
New Component
Command group: SOLID › ASSEMBLE
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | component id or name | No | |
| parent | component id or name | No | default: the active one |
| parent_path | exact parent placement | No | |
| activate | bool | No | default true |
| grounded | bool | No | default: true for the design's first part, false otherwise |
Automation details
Command ID: component.create
Parameters:
name?, parent?: component id or name (default: the active one); parent_path?: exact parent placement; activate?: bool (default true); grounded?: bool (default: true for the design's first part, false otherwise)
Insert Design
Command group: SOLID › ASSEMBLE
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | a .sc design | Yes |
Automation details
Command ID: component.insert_design
Parameters:
path: a .sc design → a new component linked to it, holding its solid bodies as placed in that design and a copy of its design properties; name? (default: the design's name); parent?: component id or name (default: the active one); translate?: [x,y,z] in mm from the destination parent's origin (default [0,0,0], also with reuse); reuse?: bool (default false): insert a free occurrence, reusing an existing link to the same file when available
Joint
Command group: SOLID › ASSEMBLE
Default keyboard shortcut: J
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | joint origins | Yes | |
| b | joint origins | Yes | {occurrence, face|circle|edge|point: [x,y,z] in world, or face|circle: "<face name>", plane: "XY"|"o:<ids>/origin/<item>"|"<name>", axis: "Z"|"o:<ids>/origin/<item>"|"<name>"; z? for a point, end?, x? as joint.origin} | origin name |
| values | [angles in deg or expressions, distances] | No | |
| limits | [[min, max] | null…] | No | |
| flip | bool | No | default false: the origins are mated, b's z against a's as two faces meet - two plane or axis datums mate aligned, each part keeping its side of the datum, and flip mates them; true: b's z along a's, so two origins given at one point with the same z and x stay as they are; a point origin without x takes its x from z, so give x on both, or use joint.as_built, to keep a turned part where it is |
| offset | mm or an expression | No | |
| angle | deg or an expression | No | an angle relation's tilt from mated; for other joints the default is none, or a half turn where that turns b less, so faces that already meet stay as they are |
| name | No |
Automation details
Command ID: joint.create
Parameters:
type: rigid|revolute|slider|cylindrical|pin_slot|planar|ball, or a relation: parallel|perpendicular|angle|point_on_plane|point_on_line|line_on_plane (ties only some directions or points, made where the parts are; several between two parts add up); a, b: joint origins ({occurrence, face|circle|edge|point: [x,y,z] in world, or face|circle: "<face name>", plane: "XY"|"o:<ids>/origin/<item>"|"<name>", axis: "Z"|"o:<ids>/origin/<item>"|"<name>"; z? for a point, end?, x? as joint.origin} | origin name); values?: [angles in deg or expressions, distances]; limits?: [[min, max] | null…]; flip?: bool (default false: the origins are mated, b's z against a's as two faces meet - two plane or axis datums mate aligned, each part keeping its side of the datum, and flip mates them; true: b's z along a's, so two origins given at one point with the same z and x stay as they are; a point origin without x takes its x from z, so give x on both, or use joint.as_built, to keep a turned part where it is); offset?: mm or an expression; angle?: deg or an expression (an angle relation's tilt from mated; for other joints the default is none, or a half turn where that turns b less, so faces that already meet stay as they are); name?; quiet?: bool (leave out dof and fixed). An expression (text) is kept with the joint and worked out again whenever the design changes, so the joint follows the parameters it names; a joint whose expression no longer works out (a parameter deleted) is left out of the solve with the reason in its errors
As-Built Joint
Command group: SOLID › ASSEMBLE
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| type | Yes | ||
| a | occurrence | Yes | |
| b | occurrence | Yes | stay where they are |
| at | joint origin | No | default: b's origin |
| name | No | ||
| limits | [[min, max] | null…] | No | |
| quiet | bool | No |
Automation details
Command ID: joint.as_built
Parameters:
type, a: occurrence, b: occurrence (stay where they are); at?: joint origin (default: b's origin) — the joint's frame; one on a or b is kept on its face or hole there, so the joint follows it as the design changes; name?; limits?: [[min, max] | null…]; quiet?: bool
Rigid Group
Command group: SOLID › ASSEMBLE
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| occurrences | [ids or names] | Yes | move together, as they are |
Automation details
Command ID: joint.rigid_group
Parameters:
occurrences: [ids or names] (move together, as they are)
Drive Joints
Command group: SOLID › ASSEMBLE
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| joint | id|name | Yes | |
| value | [angles in deg or expressions, distances] | Yes | values not given keep theirs; a value driven drops the expression joint.create gave it; clamped to the limits; the other joints of a closed loop follow, and the motion stops where the loop can no longer close → stopped_by_loop |
| values | [angles in deg or expressions, distances] | Yes | values not given keep theirs; a value driven drops the expression joint.create gave it; clamped to the limits; the other joints of a closed loop follow, and the motion stops where the loop can no longer close → stopped_by_loop |
| quiet | bool | No | leave out dof and fixed |
Automation details
Command ID: joint.drive
Parameters:
joint: id|name; value | values: [angles in deg or expressions, distances] (values not given keep theirs; a value driven drops the expression joint.create gave it; clamped to the limits; the other joints of a closed loop follow, and the motion stops where the loop can no longer close → stopped_by_loop); quiet?: bool (leave out dof and fixed) → values: [{name, value, unit: deg|mm, limits}] as joint.list gives them; requested: the values asked for, in the same form; held: [{name, requested, value, unit, why}] for each driven value that ended up elsewhere (a motion link sets it, as a screw's travel follows its turn; a limit; contact; a closed loop); moved: whether any occurrence moved; reason: why the joint can move nothing (suppressed: nothing is stored; its origins lost; its chain joined to nothing grounded → unconnected: the occurrence named; or, when nothing moved, the first held value's why); index?: zero-based coordinate to drive with value (the other coordinates follow); continuous?: bool (drag frame, suppress UI echo); stop_at_budget?: bool (default false: a contact check past its sample or work budget fails the drive; true: the drive stops at the last placement checked clear → stopped_by_budget {budget: samples|work|intersections, fraction})
Motion Link
Command group: SOLID › ASSEMBLE
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | joints | Yes | |
| b | joints | Yes | |
| ratio | Yes | b = ratio · a + offset | |
| offset | in b's units | No | deg for an angle, mm for a distance, or an expression |
| ia | value indices | No | |
| ib | value indices | No | default 0 |
Automation details
Command ID: joint.motion_link
Parameters:
a, b: joints; ratio (b = ratio · a + offset): b's units per a's (mm per deg for an angle driving a distance); offset?: in b's units (deg for an angle, mm for a distance, or an expression); ia?, ib?: value indices (default 0)
Gear
Command group: SOLID › ASSEMBLE
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| internal | bool | No | one is a ring gear: both turn the same way; by default b turns the other way |
| reverse | bool | No | |
| link | index | No | replace that motion link |
Automation details
Command ID: joint.gear
Parameters:
a, b: joints that turn (revolute), b driven by a; ra, rb: the gears' pitch radii (or tooth counts): mm, an expression, or {circle: [x,y,z], occurrence?}: the round face there, its radius (read again whenever the design changes, so the ratio follows edits); internal?: bool (one is a ring gear: both turn the same way; by default b turns the other way); reverse?: bool; link?: index (replace that motion link) → link, ratio (b's degrees per a's); b keeps where it is, also when the link replaces another (at the current pose)
Rack and Pinion
Command group: SOLID › ASSEMBLE
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| radius | the pinion's pitch radius | Yes | mm, an expression, or {circle: [x,y,z], occurrence?} |
| reverse | bool | No | |
| link | index | No | replace that motion link |
Automation details
Command ID: joint.rack_pinion
Parameters:
a, b: a joint that turns (revolute: the pinion) and one that slides (slider: the rack), in either order, b driven by a; radius: the pinion's pitch radius (mm, an expression, or {circle: [x,y,z], occurrence?}): the rack travels radius × the turn in radians; reverse?: bool; link?: index (replace that motion link) → link, ratio (mm per degree, or degrees per mm); b keeps where it is, also when the link replaces another (at the current pose)
Screw
Command group: SOLID › ASSEMBLE
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| pitch | travel per turn | Yes | mm or an expression |
| reverse | bool | No | a left-hand thread |
| link | index | No | replace that motion link |
Automation details
Command ID: joint.screw
Parameters:
joint: a cylindrical joint (its turn drives its travel) | a, b: a joint that turns and one that slides, b driven by a; pitch: travel per turn (mm or an expression); reverse?: bool (a left-hand thread); link?: index (replace that motion link) → link, ratio (mm per degree, or degrees per mm); b keeps where it is, also when the link replaces another (at the current pose)
Cam
Command group: SOLID › ASSEMBLE
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | the cam's joint | Yes | revolute |
| follower | knife|roller|flat | No | default knife; flat: a face square to a slider's line |
| radius | the roller's radius | No | mm, an expression or {circle: [x,y,z], occurrence?}: the roller's round face, which is its tip too |
| flip | bool | No | ride the cam from the other side than the one the follower is on now |
| link | index | No | replace that motion link |
Automation details
Command ID: joint.cam
Parameters:
a: the cam's joint (revolute); b: the follower's joint, a slider (a translating follower) or a revolute (an oscillating one), b driven by a; profile: {sketch: id|name, index?: the profile (default: the largest)} | {edges: [[x,y,z]…] (points on edges of the cam's bodies forming one closed loop, world), occurrence?}: the cam's outline, in a plane square to its axis, read again whenever the design changes; follower?: knife|roller|flat (default knife; flat: a face square to a slider's line); radius?: the roller's radius (mm, an expression or {circle: [x,y,z], occurrence?}: the roller's round face, which is its tip too); tip?: a joint origin where the follower touches: its knife's point or its roller's centre, such as {circle: [x,y,z]} on the roller (needed for an oscillating follower; a translating one's line runs through it, by default along its slider's axis); flip?: bool (ride the cam from the other side than the one the follower is on now); link?: index (replace that motion link) → link, lift: {min, max, rise, unit} (b's travel over a turn of the cam), reverse (the side it rides from), follower_offset (mm: how far a translating follower's line passes from the cam's axis); b keeps where it is, also when the link replaces another (at the current pose)
Constrain
Command group: SOLID › ASSEMBLE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| type | mate|flush|distance|concentric|insert|parallel|perpendicular|angle|tangent|point_on_axis | Yes | |
| offset | the gap | No | mm or an expression; needed for distance |
| angle | deg or an expression | No | needed for angle |
| flip | turn b over | No | |
| name | No | default: the rule and a number, Mate1 |
Automation details
Command ID: assembly.constraint.create
Parameters:
type: mate|flush|distance|concentric|insert|parallel|perpendicular|angle|tangent|point_on_axis; a, b: references, as joint.create's origins (a face or a datum plane for a plane, a circle or an axis for an axis, a point; b moves); offset?: the gap (mm or an expression; needed for distance); angle?: deg or an expression (needed for angle); flip?: turn b over; name? (default: the rule and a number, Mate1); quiet?. Kept as a joint of the kind the rule needs (mate and flush planar, distance planar or point on plane, concentric cylindrical, insert revolute, tangent line on plane, point on axis point on line), made where the parts are, so b moves no further than the rule needs → joint, name, dof, conflicts, fixed as joint.create
Enable Contact Sets
Command group: SOLID › ASSEMBLE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| enabled | bool | No | default true |
Automation details
Command ID: contact.enable_sets
Parameters:
enabled?: bool (default true) — driving joints and motion studies stop where bodies in one contact set would pass through each other
Enable All Contact
Command group: SOLID › ASSEMBLE
Read the solid features guide.
Automation details
Command ID: contact.enable_all
Parameters:
every occurrence takes part in contact (one set of all)
Disable Contact
Command group: SOLID › ASSEMBLE
Read the solid features guide.
Automation details
Command ID: contact.disable_all
Parameters:
contact off
New Contact Set
Command group: SOLID › ASSEMBLE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| occurrences | [ids or names] | Yes | two or more |
| name | No |
Automation details
Command ID: contact.create
Parameters:
occurrences: [ids or names] (two or more); name?
Motion Study
Command group: SOLID › ASSEMBLE
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | No | ||
| study | No | edit an existing one | |
| steps | No | timeline length, default 100 | |
| keys | [{joint, index?, points: [[step, value], …]}] | Yes | values: degrees for angles, mm for distances, or expressions |
Automation details
Command ID: motion.study
Parameters:
name?; study? (edit an existing one); steps? (timeline length, default 100); keys: [{joint, index?, points: [[step, value], …]}] (values: degrees for angles, mm for distances, or expressions)
Motion Trace
Command group: SOLID › ASSEMBLE
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| study | id|name | Yes | |
| joint | id|name with from and to | Yes | degrees for angles, mm for distances, or expressions |
Automation details
Command ID: motion.trace
Parameters:
occurrence: id|name, or an occurrence path [ids] (an instance inside sub-assemblies); point: [x,y,z] world point on it, where it is placed now; study: id|name, or joint: id|name with from and to (degrees for angles, mm for distances, or expressions) and index? (which value, default 0); samples? (2…500, default the study's steps + 1, or 100) - the point's path as the study plays or the joint is driven, closed loops following → points: [[x,y,z]…] world positions, samples (taken), stopped_at (the sample where the motion stopped short; the trace ends there), stopped_by_loop, stopped_by_contact (the design is not changed)
Exploded View
Command group: SOLID › ASSEMBLE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | No | ||
| scale | No | automatic: each occurrence pushed away from the assembly's centre by scale × its offset, default 1 | |
| moves | [{occurrence, translate: [x,y,z]}] | No | instead of automatic |
Automation details
Command ID: explode.create
Parameters:
name?; scale? (automatic: each occurrence pushed away from the assembly's centre by scale × its offset, default 1); moves?: [{occurrence, translate: [x,y,z]}] (instead of automatic)
SOLID › POSITION
Capture Position
Command group: SOLID › POSITION
Read the components and joints guide.
Automation details
Command ID: component.capture_position
Parameters:
keeps pending occurrence moves and saves every moving joint's values → captured, joints
Revert Position
Command group: SOLID › POSITION
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| occurrences | [ids] | No | default all |
Automation details
Command ID: component.revert_position
Parameters:
occurrences?: [ids] (default all); drops selected pending occurrence moves; with no occurrences the joints also go back to the values Capture Position saved (clamped to limits) → reverted, joints
SOLID › INSPECT
Interference
Command group: SOLID › INSPECT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | No | default: all, in world placement; a name that is no body is refused |
| budget_s | seconds | No | default 240, at most 86400: pairs not finished by then are listed in unchecked as "not checked: the time budget … ran out" and the call returns |
| exclude_pairs | [[a, b]] | No | pairs left out, such as a pin in its hole: each side a body's world name or an occurrence id|name, matching every body under it; pairs_excluded counts them |
Automation details
Command ID: inspect.interference
Parameters:
bodies?: [names] (default: all, in world placement; a name that is no body is refused); budget_s?: seconds (default 240, at most 86400: pairs not finished by then are listed in unchecked as "not checked: the time budget … ran out" and the call returns); exclude_pairs?: [[a, b]] (pairs left out, such as a pin in its hole: each side a body's world name or an occurrence id|name, matching every body under it; pairs_excluded counts them) → interferences: pairs that overlap with the overlap volume, area, bounding box and centre, and a_part, b_part: {component, path: [occurrence names], path_ids} where each body sits (also on unchecked pairs); unchecked: [{a, b, reason}], the pairs that could not be checked, with the reason, and each mesh body (STL, 3MF or OBJ import: not intersected) as {a: name, b: null, reason: "mesh body: not checked"}, so count: 0 is not read as no overlap (checked counts the solid bodies). Bodies are pruned by bounding box first, then by their display meshes (pairs whose meshes stay apart by more than their chord tolerances, neither inside the other, are clear without a boolean), so any number of bodies is fine; the pairs left are intersected exactly, in parallel on desktop, the slowest first; at most 20000 pairs whose boxes overlap are intersected per call (truncated: true and skipped_pairs: n say when more were left out). Also: pairs_candidate (boxes overlap), pairs_cleared (by the meshes), pairs_intersected, pairs_not_checked, pairs_excluded, budget_exceeded, threads (worker threads; 0: on the calling thread), boolean_ms and tessellate_ms (kernel time summed over the pairs), slowest: [{a, b, ms, boolean_ms, tessellate_ms}] and ms
Bill of Materials
Command group: SOLID › INSPECT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name | No | default the design |
| levels | flat| top | No | default: every part at any depth, counted through its subassemblies; the component's direct children, subassemblies as one row each |
| group_by | ["part_number"]| ["definition"] | No | default; components without a part number get a row per definition |
| group_children | true | No | a component with a part number is one row, the parts placed inside it listed under it as children: [{item, part_number, description, revision, each, count, definition}], not as rows of their own |
| path | write a .csv or .json file | No | children as items 1.1, 1.2… |
Automation details
Command ID: assembly.bom
Parameters:
component?: id or name (default the design); levels?: flat (default: every part at any depth, counted through its subassemblies) | top (the component's direct children, subassemblies as one row each); group_by?: ["part_number"] (default; components without a part number get a row per definition) | ["definition"]; group_children?: true (a component with a part number is one row, the parts placed inside it listed under it as children: [{item, part_number, description, revision, each, count, definition}], not as rows of their own); path?: write a .csv or .json file (children as items 1.1, 1.2…); format?: csv|json (default from the path). Each component's bom_type counts: phantom has no row (what it holds counts here), reference counts nowhere, purchased and inseparable are one row (in flat, an inseparable one's purchased parts are listed too, under it with group_children and a part number) → rows: [{item, part_number, description, revision, bom_type, count, definition, components, properties, children?}] sorted by part number, total_occurrences (children included)
Component Colors
Command group: SOLID › INSPECT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| enabled | bool | No | omitted: toggle |
Automation details
Command ID: inspect.colored_components
Parameters:
enabled?: bool (omitted: toggle); temporary component colours, without changing appearances
Measure
Command group: SOLID › INSPECT
Default keyboard shortcut: I
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | No | default all |
| names_only | bool | No | each world body's name and its definition's, nothing measured |
Automation details
Command ID: inspect.measure
Parameters:
bodies?: [names] (default all); names_only?: bool (each world body's name and its definition's, nothing measured) → closed per body; volume_mm3, center_of_mass, density_g_cm3 and mass_g only for closed, consistently oriented bodies; area, bbox and counts for all; total.open_bodies_skipped counts bodies excluded from volume/mass totals; or items: [1-2 selections] (face/edge: type, body, and point on it or index from model.faces/model.edges, or both) → length/area/volume; a face's perimeter_mm, with outer_perimeter_mm and inner_perimeter_mm on a flat face with holes; diameter, radius, circumference or arc_length/angle_deg of circles, arcs and cylinders; slot sizes; min (distance_mm, from, to), max, center_distance (centre to centre, or from an axis) and angle
Section Analysis
Command group: SOLID › INSPECT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| plane | XY|XZ|YZ | construction plane name or id | {origin, normal} | Yes | |
| offset | expr along the plane's normal | No | XY: +Z, XZ: +Y, YZ: +X |
| flip | bool | No | |
| hatch | bool | No | hatch the cut faces, in each body's colour; default true |
Automation details
Command ID: inspect.section
Parameters:
plane: XY|XZ|YZ | construction plane name or id | {origin, normal}; offset?: expr along the plane's normal (XY: +Z, XZ: +Y, YZ: +X); at?: expr, the cut's world coordinate on the named plane's axis (XY: Z, XZ: Y, YZ: X), instead of offset; flip?: bool; hatch?: bool (hatch the cut faces, in each body's colour; default true); or clear: true. Returns the cut's origin and normal, and for a named plane its axis and at
SOLID › CONFIGURE
Configure
Command group: SOLID › CONFIGURE
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| params | [parameter names] | No | |
| features | [feature names] | No | |
| materials | [body names] | No | |
| appearances | [body names] | No | columns to add; with no rows yet, a "Default" row takes the current values |
Automation details
Command ID: config.configure
Parameters:
params?: [parameter names]; features?: [feature names]; materials?: [body names]; appearances?: [body names] (columns to add; with no rows yet, a "Default" row takes the current values)
Display Configuration Table
Command group: SOLID › CONFIGURE
Read the parameters and expressions guide.
Automation details
Command ID: config.table
Parameters:
→ columns (param:<name> or suppress:<feature>), rows (each with its fixed id), the active row's name and whether the design still matches it
SKETCH › FINISH SKETCH
Finish Sketch
Command group: SKETCH › FINISH SKETCH
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| restore_marker | bool | No | default true |
Automation details
Command ID: sketch.finish
Parameters:
restore_marker?: bool (default true); false transfers the temporary marker directly to another editor without rebuilding the intervening timeline
Cancel Sketch
Command group: SKETCH › FINISH SKETCH
Read the sketching and constraints guide.
Automation details
Command ID: sketch.cancel
Parameters:
Leaves the sketch without keeping what changed since it was created or opened for editing: the design goes back to how it was then (a new sketch is removed), as one step that Undo brings back. Refused when the undo history no longer leads back to that point (use Undo instead). restore_marker?: bool (default true); false transfers the temporary marker to another editor
Finish with AutoConstrain
Command group: SKETCH › FINISH SKETCH
Read the sketching and constraints guide.
Automation details
Command ID: sketch.finish_auto_constrain
Parameters:
like AutoConstrain, then Finish Sketch
SKETCH › CREATE
Line
Command group: SKETCH › CREATE
Default keyboard shortcut: L
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| points | [[x,y] | "l1.end" | {at, ref}…] | Yes | x and y each a number or an expression over the design's parameters, "W / 2": such a point is fixed where it comes to and follows the parameters, while text naming no parameter, such as "5", is just that number, in the design's length unit (a JSON number is mm), and does not itself fix the point; likewise wherever a point argument also takes a point id |
| closed | bool | No | |
| construction | bool | No | |
| ids | [..] | No | |
| infer | bool | No | add horizontal/vertical |
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.line
Parameters:
points: [[x,y] | "l1.end" | {at, ref}…] (x and y each a number or an expression over the design's parameters, "W / 2": such a point is fixed where it comes to and follows the parameters, while text naming no parameter, such as "5", is just that number, in the design's length unit (a JSON number is mm), and does not itself fix the point; likewise wherever a point argument also takes a point id), closed?: bool, construction?: bool, ids?: [..], infer?: bool (add horizontal/vertical); connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
2-Point Rectangle
Command group: SKETCH › CREATE
Default keyboard shortcut: R
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| p0 | opposite corners [x,y] | Yes | |
| p1 | opposite corners [x,y] | Yes | a coordinate may be an expression over the design's parameters: the corner is fixed and follows them; text naming no parameter, such as "5", is just that number, in the design's length unit (a JSON number is mm), and does not itself fix the corner |
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.rectangle.two_point
Parameters:
p0, p1: opposite corners [x,y] (a coordinate may be an expression over the design's parameters: the corner is fixed and follows them; text naming no parameter, such as "5", is just that number, in the design's length unit (a JSON number is mm), and does not itself fix the corner); construction?. Returns sides {bottom, right, top, left} (line ids) and corners {bottom_left, bottom_right, top_right, top_left} (point ids); connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
3-Point Rectangle
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| p0 | first edge | Yes | |
| p1 | first edge | Yes | |
| p2 | point on the opposite edge | Yes | |
| construction | bool | No | |
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.rectangle.three_point
Parameters:
p0, p1: first edge; p2: point on the opposite edge; construction?: bool; connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Rounded Rectangle
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| p0 | opposite corners [x,y] | Yes | |
| p1 | opposite corners [x,y] | Yes | a coordinate may be an expression over the design's parameters: the corner is fixed and follows them, as in `sketch.rectangle.two_point`; text naming no parameter, such as "5", is just that number, in the design's length unit (a JSON number is mm), and does not itself fix the corner |
| radius | expr | Yes | the corner radius, less than half the shorter side |
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.rectangle.rounded
Parameters:
p0, p1: opposite corners [x,y] (a coordinate may be an expression over the design's parameters: the corner is fixed and follows them, as in `sketch.rectangle.two_point`; text naming no parameter, such as "5", is just that number, in the design's length unit (a JSON number is mm), and does not itself fix the corner); radius: expr (the corner radius, less than half the shorter side); construction?. A 2-point rectangle whose four corners are filleted alike: one radius dimension (`param`), the other arcs equal to it. Returns sides {bottom, right, top, left} (line ids) and arcs (the corner arcs: bottom-left, bottom-right, top-right, top-left), diagonal (construction, between the bottom-left and top-right arc centres) and centre (the point held at its midpoint); connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Center Rectangle
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| center | [x,y] | Yes | |
| corner | [x,y] | Yes | a coordinate may be an expression over the design's parameters: the point is fixed and follows them; text naming no parameter, such as "5", is just that number, in the design's length unit (a JSON number is mm), and does not itself fix the point |
| construction | bool | No | |
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.rectangle.center
Parameters:
center, corner: [x,y] (a coordinate may be an expression over the design's parameters: the point is fixed and follows them; text naming no parameter, such as "5", is just that number, in the design's length unit (a JSON number is mm), and does not itself fix the point); construction?: bool. Returns sides {bottom, right, top, left} (line ids) and corners {bottom_left, bottom_right, top_right, top_left} (point ids); connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Center Diameter Circle
Command group: SKETCH › CREATE
Default keyboard shortcut: C
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| center | [x,y] or point ref | Yes | a coordinate may be an expression over the design's parameters: the centre is fixed and follows them; text naming no parameter, such as "5", is just that number, in the design's length unit (a JSON number is mm), and does not itself fix the centre |
| radius | number or expression | Yes | an expression naming a parameter is a dimension driven by it; with `through` a point ref, that and the point both fix the radius |
| diameter | number or expression | Yes | an expression naming a parameter is a dimension driven by it; with `through` a point ref, that and the point both fix the radius |
| through | point ref | No | a point the circle passes through, kept on it: where the tool's second click snapped |
| construction | bool | No | |
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.circle.center
Parameters:
center: [x,y] or point ref (a coordinate may be an expression over the design's parameters: the centre is fixed and follows them; text naming no parameter, such as "5", is just that number, in the design's length unit (a JSON number is mm), and does not itself fix the centre), radius | diameter: number or expression (an expression naming a parameter is a dimension driven by it; with `through` a point ref, that and the point both fix the radius); through?: point ref (a point the circle passes through, kept on it: where the tool's second click snapped); construction?: bool; connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
2-Point Circle
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| p0 | diameter ends | Yes | |
| p1 | diameter ends | Yes | |
| construction | bool | No | |
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.circle.two_point
Parameters:
p0, p1: diameter ends; construction?: bool; connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
3-Point Circle
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| p0 | [x,y] or point ref | Yes | |
| p1 | [x,y] or point ref | Yes | |
| p2 | [x,y] or point ref | Yes | a referenced point stays on the circle |
| construction | bool | No | |
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.circle.three_point
Parameters:
p0, p1, p2: [x,y] or point ref (a referenced point stays on the circle); construction?: bool; connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
3-Point Arc
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| start | [x,y] or point ref | Yes | |
| end | [x,y] or point ref | Yes | |
| through | [x,y] or point ref | Yes | a referenced through point stays on the arc |
| construction | bool | No | |
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.arc.three_point
Parameters:
start, end, through: [x,y] or point ref (a referenced through point stays on the arc); construction?: bool; connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Center Point Arc
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| center | Yes | ||
| start | Yes | ||
| end | Yes | counter-clockwise from start; clockwise?: bool for clockwise | |
| center | Yes | ||
| start | Yes | ||
| sweep | signed degrees | Yes | |
| construction | bool | No | |
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.arc.center_point
Parameters:
center, start, end (counter-clockwise from start; clockwise?: bool for clockwise) | center, start, sweep: signed degrees; construction?: bool; connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Inscribed Polygon
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| center | Yes | ||
| radius | Yes | to vertices | |
| sides | Yes | ||
| angle | deg | No | |
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.polygon.inscribed
Parameters:
center, radius (to vertices), sides, angle?: deg; connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Circumscribed Polygon
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| center | Yes | ||
| radius | Yes | to edge midpoints | |
| sides | Yes | ||
| angle | deg | No | |
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.polygon.circumscribed
Parameters:
center, radius (to edge midpoints), sides, angle?: deg; connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Edge Polygon
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| p0 | Yes | ||
| p1 | one edge | Yes | |
| sides | Yes | ||
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.polygon.edge
Parameters:
p0, p1: one edge, sides; connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Center to Center Slot
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| p0 | Yes | ||
| p1 | arc centres | Yes | |
| width | Yes | ||
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.slot.center_to_center
Parameters:
p0, p1: arc centres, width; returns centre_line (construction, between the arc centres) and middle (the point held at its midpoint); connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Overall Slot
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| p0 | Yes | ||
| p1 | overall ends | Yes | |
| width | Yes | ||
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.slot.overall
Parameters:
p0, p1: overall ends, width; returns centre_line (construction, between the arc centres) and middle (the point held at its midpoint); connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Point
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | No | ||
| connect | bool | No | default true: a new point landing exactly on an existing point, the origin too, is made coincident with it |
Automation details
Command ID: sketch.point
Parameters:
point: [x,y] (each a number or an expression over the design's parameters: the point is then fixed where it comes to and follows them; text naming no parameter, such as "5", is just that number, in the design's length unit (a JSON number is mm), and does not itself fix the point) or a snap: "mid:<line>" (held at the line's midpoint), "on:<curve>:x,y" (on the curve near x,y), "x:<a>+<b>:x,y" (at the crossing of two curves near x,y), {vertex: [x,y,z]} or {on_edge: [x,y,z]} of the model; id?; connect?: bool (default true: a new point landing exactly on an existing point, the origin too, is made coincident with it). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Sketch Dimension
Command group: SKETCH › CREATE
Default keyboard shortcut: D
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| half_axes | bool | No | default true; false: with auto, the minor radius wherever text_at is, as before half-axes, which the Dimension tool sends with Draw ellipses with their axes off |
Automation details
Command ID: sketch.dimension
Parameters:
entities: [refs] (a line midpoint is "mid:line_id"; a model edge or vertex, {edge: [x,y,z], body?} or {vertex: [x,y,z], body?}, is projected into the sketch first and measured there: a point against the projected edge measures the distance to it), type?: auto|distance|horizontal|distance_x|vertical|distance_y|length|radius|diameter|major|minor|angle, value?: number or expression (default: current; a bare number is in the design's units, e.g. 2 means 2 in in an inch design; give a unit such as "50 mm" to override), or `name = expression` (e.g. "width = 40"; also `#name = expression`), which adds the user parameter `name` with that expression and dimensions with `name` (refused when the name is taken or reserved; the reply's `defined` names it); text_at?: [x, y]. Two points or a line off the axes: with auto, text_at across from them (between the perpendiculars through them, or a tenth of their distance past) is the distance between them; pulled further past an end, up or down from it horizontal, sideways vertical. Two midpoints: placing text above or below their bounding box measures horizontally, beside it vertically, anywhere else (inside it or past its corners) the distance between them. Two lines: the angle between them (acute, or 180° − it when the value is nearer that) unless text_at picks a sector. A line and a circle or arc: the distance from the line to its edge (the gap, or how far the edge reaches past a line that cuts it; 0 is tangent); dimension the centre point for the distance to the centre. A point and a circle or arc: the distance from the point to its edge (or how far within it a point inside lies). Two circles or arcs: the gap between their edges (or how far they overlap when they cross, or the narrowest gap between them when one lies inside the other), or the centre-to-centre distance when they are the two caps of a slot. An ellipse: a half-axis, the distance from the centre to an axis end (major or minor; with auto, text_at pulled across the major axis gives the major half-axis, pulled out past an end of it the minor one, the minor without text_at; previous_axis?: major|minor, the half-axis an earlier placement chose, kept while text_at is near the boundary between them; the reply's axis names the one chosen; with auto, when a driving dimension already holds one half-axis (or its whole axis), the other one, wherever text_at is; without its major axis line the major half-axis goes to the ellipse's own major end, without its minor axis line the minor half-axis is the minor radius); any other type, radius among them, the minor radius; an ellipse's axis line with auto: its length, the whole axis, wherever text_at is; half_axes?: bool (default true; false: with auto, the minor radius wherever text_at is, as before half-axes, which the Dimension tool sends with Draw ellipses with their axes off). An arc and one of its end points: the arc's length (type arc_length does it from the arc alone). A dimension the sketch already determines is refused (naming what determines it); if_redundant?: "driven" places it as a driven (reference) dimension instead. scale_sketch?: bool (the dimension tool sends the Sketch preference, on by default): when this is the sketch's first length dimension and nothing in the sketch fixes a size (no other driving length dimension, nothing fixed or projected), the whole sketch scales to the value instead of distorting: about the origin when the drawing is tied to it (joined to the origin, or constrained to a sketch axis), otherwise about the middle of the drawing, so it stays where it was drawn (#11043); scale_about_origin?: bool (default false; the dimension tool sends the Sketch preference) scales about the origin always, as before #11043. Returns measured in unit (mm or deg), and scaled: the factor when the sketch was scaled
Normal/Construction
Command group: SKETCH › CREATE
Default keyboard shortcut: X
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| curves | [ids] | Yes | |
| value | bool | No | default: construction unless all of them already are |
Automation details
Command ID: sketch.construction
Parameters:
curves: [ids], value?: bool (default: construction unless all of them already are)
Midpoint Line
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| end | [x,y] | Yes |
Automation details
Command ID: sketch.line.midpoint
Parameters:
mid: [x,y], point ref or snap ("mid:<line>", "on:<curve>:x,y", model vertex/edge); end: [x,y]; construction?. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Tangent Arc
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| start | end point of a line or arc | Yes | "l1.end" |
| end | [x,y] or an existing point's id | Yes | "l2.start": the arc ends on that point |
| curve | the curve to be tangent to | No | default: the one ending at start |
Automation details
Command ID: sketch.arc.tangent
Parameters:
start: end point of a line or arc ("l1.end"), end: [x,y] or an existing point's id ("l2.start": the arc ends on that point); curve?: the curve to be tangent to (default: the one ending at start). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
2-Tangent Circle
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| curves | [two lines/circles/arcs] | Yes | |
| radius | expr | Yes | |
| diameter | expr | Yes | |
| near | [x,y] | Yes | which of the solutions |
Automation details
Command ID: sketch.circle.two_tangent
Parameters:
curves: [two lines/circles/arcs], radius | diameter: expr, near: [x,y] (which of the solutions). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
3-Tangent Circle
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| curves | [three lines/circles/arcs] | Yes | |
| near | [x,y] | Yes | which of the solutions |
Automation details
Command ID: sketch.circle.three_tangent
Parameters:
curves: [three lines/circles/arcs], near: [x,y] (which of the solutions). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Center Point Slot
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| center | slot centre | Yes | |
| end | one arc centre | Yes | |
| width | Yes |
Automation details
Command ID: sketch.slot.center_point
Parameters:
center: slot centre, end: one arc centre, width; returns centre_line and middle. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Three Point Arc Slot
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| start | Yes | ||
| through | Yes | ||
| end | points on the centre arc | Yes | |
| width | Yes |
Automation details
Command ID: sketch.slot.arc_three_point
Parameters:
start, through, end: points on the centre arc, width; returns centre_arc and middle. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Center Point Arc Slot
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| center | Yes | ||
| start | centre arc start | Yes | |
| end | direction of the centre arc end | Yes | counter-clockwise |
| sweep | degrees | Yes | 0 < sweep < 360 |
| width | Yes |
Automation details
Command ID: sketch.slot.arc_center
Parameters:
center, start: centre arc start, end: direction of the centre arc end (counter-clockwise) or sweep: degrees (0 < sweep < 360), width; returns centre_arc and middle. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Ellipse
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| axes | bool | No | default true; false: the ellipse alone, as the Ellipse tool draws it with Draw ellipses with their axes off |
Automation details
Command ID: sketch.ellipse
Parameters:
center, major: end of the major axis [x,y], minor: a point the ellipse passes through on the minor side [x,y] | minor_radius. Also adds its major and minor axes as construction lines through the centre (their ends: the major end and the point opposite it, and the two ends of the minor axis on the ellipse), held by midpoint, perpendicular and point-on-curve constraints, so a half-axis is the distance from the centre to an axis end and an axis line's length is a full axis; axes?: bool (default true; false: the ellipse alone, as the Ellipse tool draws it with Draw ellipses with their axes off). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Fit Point Spline
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| points | [[x,y] or point refs…] | Yes | 2…500 |
Automation details
Command ID: sketch.spline.fit_point
Parameters:
points: [[x,y] or point refs…] (2…500): the spline passes through them; each fit point has an editable tangent handle whose direction and length control curvature, periodic?: boolean (default false); periodic cubic fit closes smoothly through at least 3 distinct samples. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Control Point Spline
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
Automation details
Command ID: sketch.spline.control_point
Parameters:
points: control points (2…500), cubic. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Control Point Spline (Degree 5)
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
Automation details
Command ID: sketch.spline.control_point_5
Parameters:
points: control points (2…500), degree 5. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Conic Curve
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| start | [x,y] or point refs | Yes | |
| end | [x,y] or point refs | Yes | |
| apex | [x,y] or point refs | Yes | |
| rho | 0…1 | No | default 0.5: parabola |
Automation details
Command ID: sketch.conic
Parameters:
start, end, apex: [x,y] or point refs; rho?: 0…1 (default 0.5: parabola). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Centerline
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| curves | [line ids] | Yes | |
| value | bool | No | default toggles |
Automation details
Command ID: sketch.centerline
Parameters:
curves: [line ids], value?: bool (default toggles): centerline line type (not in profiles; an axis)
Text
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| at | baseline start [x,y] | Yes | |
| height | capital height mm | No | default 5 |
| angle | deg | No |
Automation details
Command ID: sketch.text
Parameters:
text: string (\n breaks lines), or text_expression: the words built from text parameters (parameters.add with unit text), number parameters and quoted texts joined by + ("Label + '-L'", "'W' + Width"; a number parameter shows its value in the design's units, "85 mm", an angle in degrees, "30°"; number(Width) is the number alone and number(Width, 2) has 2 decimals): the text keeps it, its words follow the parameters (a parameter edit or a configuration row relabels it) and `exprs` returns it as `text`; at: baseline start [x,y], height?: capital height mm (default 5), angle?: deg; at's x and y, height and angle each take a number or an expression over the design's parameters as a string ("plate_width / 2", "label_size"): the text keeps the expression, follows the parameters, and returns it in `exprs`; an expression naming no parameter is the number it comes to, a bare number in one is in the design's units, font?: an installed font's family or full name, or a .ttf/.otf file path (~ and %VAR% expand; default: the built-in Liberation Sans), bold?, italic?: bool (an installed family's bold or italic face; italic without one is slanted), align?: left|center|right (the lines against `at`, or along the path), vertical_align?: baseline|top|middle|bottom (the block of lines against `at` or the path: the first line's baseline (default), its capitals' tops, halfway between those and the last line's baseline, or the bottom of the last line's descenders), letter_spacing?: extra mm between letters, line_spacing?: times the font's line distance (default 1), path?: a curve id of the sketch the baseline follows ("": none; `at` and `angle` then do not place the text; the curve becomes construction, a guide the letters stand on), reverse?: bool (the other way along the path). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Construction Line
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| through | second point | No | |
| curve | sketch references | No | |
| curve2 | sketch references | No | |
| angle | degrees from sketch X | No | |
| offset | positive length | No | parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at |
| solution | zero-based solution index | No |
Automation details
Command ID: sketch.construction_line
Parameters:
Construction line, free. at: point; through?: second point; curve?, curve2?: sketch references; angle?: degrees from sketch X; offset?: positive length (parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at) and a driving dimension at that value; near?: solution selector, and the side a line with a length runs towards; solution?: zero-based solution index; length?: a segment of this length from `at`, held by a length dimension, instead of an infinite line (horizontal, vertical, angle, parallel, perpendicular); construction?: false makes that segment a normal line. Tangents take circles/arcs, or an open spline/conic endpoint for tangent_at.. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Horizontal Construction Line
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| through | second point | No | |
| curve | sketch references | No | |
| curve2 | sketch references | No | |
| angle | degrees from sketch X | No | |
| offset | positive length | No | parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at |
| solution | zero-based solution index | No |
Automation details
Command ID: sketch.construction_line.horizontal
Parameters:
Construction line, horizontal. at: point; through?: second point; curve?, curve2?: sketch references; angle?: degrees from sketch X; offset?: positive length (parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at) and a driving dimension at that value; near?: solution selector, and the side a line with a length runs towards; solution?: zero-based solution index; length?: a segment of this length from `at`, held by a length dimension, instead of an infinite line (horizontal, vertical, angle, parallel, perpendicular); construction?: false makes that segment a normal line. Tangents take circles/arcs, or an open spline/conic endpoint for tangent_at.. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Vertical Construction Line
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| through | second point | No | |
| curve | sketch references | No | |
| curve2 | sketch references | No | |
| angle | degrees from sketch X | No | |
| offset | positive length | No | parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at |
| solution | zero-based solution index | No |
Automation details
Command ID: sketch.construction_line.vertical
Parameters:
Construction line, vertical. at: point; through?: second point; curve?, curve2?: sketch references; angle?: degrees from sketch X; offset?: positive length (parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at) and a driving dimension at that value; near?: solution selector, and the side a line with a length runs towards; solution?: zero-based solution index; length?: a segment of this length from `at`, held by a length dimension, instead of an infinite line (horizontal, vertical, angle, parallel, perpendicular); construction?: false makes that segment a normal line. Tangents take circles/arcs, or an open spline/conic endpoint for tangent_at.. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Construction Line at Angle
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| through | second point | No | |
| curve | sketch references | No | |
| curve2 | sketch references | No | |
| angle | degrees from sketch X | No | |
| offset | positive length | No | parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at |
| solution | zero-based solution index | No |
Automation details
Command ID: sketch.construction_line.angle
Parameters:
Construction line, angle. at: point; through?: second point; curve?, curve2?: sketch references; angle?: degrees from sketch X; offset?: positive length (parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at) and a driving dimension at that value; near?: solution selector, and the side a line with a length runs towards; solution?: zero-based solution index; length?: a segment of this length from `at`, held by a length dimension, instead of an infinite line (horizontal, vertical, angle, parallel, perpendicular); construction?: false makes that segment a normal line. Tangents take circles/arcs, or an open spline/conic endpoint for tangent_at.. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Parallel Construction Line
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| through | second point | No | |
| curve | sketch references | No | |
| curve2 | sketch references | No | |
| angle | degrees from sketch X | No | |
| offset | positive length | No | parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at |
| solution | zero-based solution index | No |
Automation details
Command ID: sketch.construction_line.parallel
Parameters:
Construction line, parallel. at: point; through?: second point; curve?, curve2?: sketch references; angle?: degrees from sketch X; offset?: positive length (parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at) and a driving dimension at that value; near?: solution selector, and the side a line with a length runs towards; solution?: zero-based solution index; length?: a segment of this length from `at`, held by a length dimension, instead of an infinite line (horizontal, vertical, angle, parallel, perpendicular); construction?: false makes that segment a normal line. Tangents take circles/arcs, or an open spline/conic endpoint for tangent_at.. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Perpendicular Construction Line
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| through | second point | No | |
| curve | sketch references | No | |
| curve2 | sketch references | No | |
| angle | degrees from sketch X | No | |
| offset | positive length | No | parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at |
| solution | zero-based solution index | No |
Automation details
Command ID: sketch.construction_line.perpendicular
Parameters:
Construction line, perpendicular. at: point; through?: second point; curve?, curve2?: sketch references; angle?: degrees from sketch X; offset?: positive length (parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at) and a driving dimension at that value; near?: solution selector, and the side a line with a length runs towards; solution?: zero-based solution index; length?: a segment of this length from `at`, held by a length dimension, instead of an infinite line (horizontal, vertical, angle, parallel, perpendicular); construction?: false makes that segment a normal line. Tangents take circles/arcs, or an open spline/conic endpoint for tangent_at.. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Tangent through External Point
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| through | second point | No | |
| curve | sketch references | No | |
| curve2 | sketch references | No | |
| angle | degrees from sketch X | No | |
| offset | positive length | No | parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at |
| solution | zero-based solution index | No |
Automation details
Command ID: sketch.construction_line.tangent_external
Parameters:
Construction line, tangent_external. at: point; through?: second point; curve?, curve2?: sketch references; angle?: degrees from sketch X; offset?: positive length (parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at) and a driving dimension at that value; near?: solution selector, and the side a line with a length runs towards; solution?: zero-based solution index; length?: a segment of this length from `at`, held by a length dimension, instead of an infinite line (horizontal, vertical, angle, parallel, perpendicular); construction?: false makes that segment a normal line. Tangents take circles/arcs, or an open spline/conic endpoint for tangent_at.. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Tangent at Curve Point
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| through | second point | No | |
| curve | sketch references | No | |
| curve2 | sketch references | No | |
| angle | degrees from sketch X | No | |
| offset | positive length | No | parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at |
| solution | zero-based solution index | No |
Automation details
Command ID: sketch.construction_line.tangent_at
Parameters:
Construction line, tangent_at. at: point; through?: second point; curve?, curve2?: sketch references; angle?: degrees from sketch X; offset?: positive length (parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at) and a driving dimension at that value; near?: solution selector, and the side a line with a length runs towards; solution?: zero-based solution index; length?: a segment of this length from `at`, held by a length dimension, instead of an infinite line (horizontal, vertical, angle, parallel, perpendicular); construction?: false makes that segment a normal line. Tangents take circles/arcs, or an open spline/conic endpoint for tangent_at.. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Common Tangent
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| through | second point | No | |
| curve | sketch references | No | |
| curve2 | sketch references | No | |
| angle | degrees from sketch X | No | |
| offset | positive length | No | parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at |
| solution | zero-based solution index | No |
Automation details
Command ID: sketch.construction_line.tangent_two
Parameters:
Construction line, tangent_two. at: point; through?: second point; curve?, curve2?: sketch references; angle?: degrees from sketch X; offset?: positive length (parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at) and a driving dimension at that value; near?: solution selector, and the side a line with a length runs towards; solution?: zero-based solution index; length?: a segment of this length from `at`, held by a length dimension, instead of an infinite line (horizontal, vertical, angle, parallel, perpendicular); construction?: false makes that segment a normal line. Tangents take circles/arcs, or an open spline/conic endpoint for tangent_at.. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Angle Bisector
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| through | second point | No | |
| curve | sketch references | No | |
| curve2 | sketch references | No | |
| angle | degrees from sketch X | No | |
| offset | positive length | No | parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at |
| solution | zero-based solution index | No |
Automation details
Command ID: sketch.construction_line.bisector
Parameters:
Construction line, bisector. at: point; through?: second point; curve?, curve2?: sketch references; angle?: degrees from sketch X; offset?: positive length (parallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at) and a driving dimension at that value; near?: solution selector, and the side a line with a length runs towards; solution?: zero-based solution index; length?: a segment of this length from `at`, held by a length dimension, instead of an infinite line (horizontal, vertical, angle, parallel, perpendicular); construction?: false makes that segment a normal line. Tangents take circles/arcs, or an open spline/conic endpoint for tangent_at.. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Divide Curve
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| curve | id | Yes | |
| curves | [ids] | Yes | each divided on its own |
Automation details
Command ID: sketch.point.divide
Parameters:
curve: id | curves: [ids] (each divided on its own); segments: whole number from 2 to 500. Places points that divide each curve into `segments` pieces of equal length along it (arc length): segments − 1 points on an open curve (line, arc, spline, conic), `segments` points on a closed one (a circle from its point on sketch +X, an ellipse from its major-axis end, a closed spline from its first point). Each point is constrained to its share of the curve's length, so it stays on the curve and keeps equal spacing as the curve changes; the curve is not changed. Infinite lines are refused. Returns points: [ids], per curve in order, and constraints: [ids]. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Equation Curve
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| x | x | Yes | t |
| y | y | Yes | t |
| explicit | true and y: f | Yes | x |
| alone | Yes | no x | |
| start | the range of t | Yes | |
| end | the range of t | Yes | or of x |
| tolerance | mm | No | default 0.01 |
| construction | bool | No | |
| variable_unit | "number" | No | default |
Automation details
Command ID: sketch.equation_curve
Parameters:
x: x(t), y: y(t): formulas of t in the design's expression language and parameters ("r * (cos(t) + t * sin(t))"); or explicit: true and y: f(x) alone (no x); start, end: the range of t (or of x): a number or an expression ("2 * pi", "360 deg" is 2·pi, a length is in the design's unit); tolerance?: mm (default 0.01): how far the curve may stray from the formulas (0.0001 to 10); construction?: bool; variable_unit?: "number" (default) or "range". The variable is a plain number: sin(t) reads it in radians; a result without a unit is in the design's length unit. With variable_unit "range" it is a length, so a ^ 2 / (4 * t) is a length when a is one: start and end must both be lengths, or one a length and the other a plain number, which is then in the design's unit. Makes a fit point spline through fixed points, as many as the tolerance needs (up to 500), closed smoothly when it ends where it starts; the points are placed again from the formulas whenever the parameters change. Returns curve, points (how many), closed, deviation (mm). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Sketch Constrainer
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| entities | [one or two sketch entity ids]: applies the constraint the geometry nearly has | Yes | horizontal/vertical, parallel, perpendicular, collinear, coincident, concentric, equal, tangent |
Automation details
Command ID: sketch.constrainer
Parameters:
entities: [one or two sketch entity ids]: applies the constraint the geometry nearly has (horizontal/vertical, parallel, perpendicular, collinear, coincident, concentric, equal, tangent)
Project
Command group: SKETCH › CREATE
Default keyboard shortcut: P
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| refs | [{edge: [x,y,z], body?} | {face: [x,y,z], body?} (its edge loops) | {body: name} (silhouette) | {vertex: [x,y,z], body?} | {sketch, curve} | {sketch, point} | {point: name} (a construction point) | "origin" | {axis: X|Y|Z|name} | {plane: XY|XZ|YZ|name}] | Yes | |
| projection_link | bool | No | default true |
| construction | bool | No | default the session's preference, off: the created curves are construction geometry |
Automation details
Command ID: sketch.project
Parameters:
refs: [{edge: [x,y,z], body?} | {face: [x,y,z], body?} (its edge loops) | {body: name} (silhouette) | {vertex: [x,y,z], body?} | {sketch, curve} | {sketch, point} | {point: name} (a construction point) | "origin" | {axis: X|Y|Z|name} | {plane: XY|XZ|YZ|name}]; projection_link?: bool (default true); construction?: bool (default the session's preference, off: the created curves are construction geometry). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Intersect
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| refs | [{body}, {face: [x,y,z], body?}, {edge: [x,y,z], body?}, {sketch, curve}]: section curves | Yes | or points |
| projection_link | bool | No | default true |
| construction | bool | No | default the session's preference, off: the created curves are construction geometry |
Automation details
Command ID: sketch.intersect
Parameters:
refs: [{body}, {face: [x,y,z], body?}, {edge: [x,y,z], body?}, {sketch, curve}]: section curves (or points) with the sketch plane; projection_link?: bool (default true); construction?: bool (default the session's preference, off: the created curves are construction geometry). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Include 3D Geometry
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| refs | like Project | Yes | edges, vertices, sketch curves and points |
| construction | bool | No | default the session's preference, off: the created curves are construction geometry |
Automation details
Command ID: sketch.include_3d
Parameters:
refs: like Project (edges, vertices, sketch curves and points); curves out of the sketch plane are flattened onto it; construction?: bool (default the session's preference, off: the created curves are construction geometry). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Project To Surface
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
Automation details
Command ID: sketch.project_to_surface
Parameters:
curves: [{sketch, curve}…] (curves of other sketches), face: [x,y,z] point on the target face, body?: projected along the active sketch's normal onto the face, as linked 3D curves. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Intersection Curve
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
Automation details
Command ID: sketch.intersection_curve
Parameters:
a, b: {body} | {face: [x,y,z], body?} | {sketch, curve} (a curve of another sketch, standing in for its extrusion along that sketch's normal): where they meet, as linked 3D curves. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Spun Profile
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
Automation details
Command ID: sketch.spun_profile
Parameters:
body: name, axis: a line of the active sketch (curve id) | X|Y|Z: the body's outline revolved about the axis, in the sketch plane. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Isoparametric Curve
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| face | [x,y,z] point on the face | Yes | the curve passes through it |
| body | No | ||
| direction | u|v|[x,y,z] | No | default u |
Automation details
Command ID: sketch.isoparametric_curve
Parameters:
face: [x,y,z] point on the face (the curve passes through it), body?, direction?: u|v|[x,y,z] (default u): linked 3D curve. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Fit Curves to Mesh Section
Command group: SKETCH › CREATE
Read the sketching and constraints guide.
Automation details
Command ID: sketch.fit_curves_to_section
Parameters:
body: name (a mesh or solid body): its section with the sketch plane, fitted with lines and arcs, as normal (unlinked) geometry. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
SKETCH › CONSTRAINTS
Horizontal/Vertical
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| line | id | Yes | |
| points | [a, b] | Yes | point ids or {midpoint: line_id}; accepted midpoints reuse or create a point with a Midpoint constraint |
| mode | horizontal|vertical | No |
Automation details
Command ID: sketch.constraint.horizontal_vertical
Parameters:
line: id | points: [a, b] (point ids or {midpoint: line_id}; accepted midpoints reuse or create a point with a Midpoint constraint); mode?: horizontal|vertical
Coincident
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
Automation details
Command ID: sketch.constraint.coincident
Parameters:
a, b: points (or a line's middle as {midpoint: line}, which becomes a point tied there), a point and a curve or sketch axis (x / y: the sketch's own axes, unless a curve has that id; an axis becomes a linked construction line on it, reported in created), or two distinct lines (joins their closest endpoints), or two circles/arcs (the second lies on the first: concentric and equal, `constraints` lists both); any of them may be a model edge {edge: [x,y,z], body?} or vertex {vertex: [x,y,z], body?}, projected into the sketch first (reported in created)
Tangent
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
Automation details
Command ID: sketch.constraint.tangent
Parameters:
a, b: curves or sketch axes (x / y: the sketch's own axes, unless a curve has that id; an axis becomes a linked construction line on it, reported in created), or the end point of a line or an arc: that end then lies on the other curve (or on the other end point), and its curve is tangent there, in one step (`constraints` lists both); any of them may be a model edge {edge: [x,y,z], body?} or vertex {vertex: [x,y,z], body?}, projected into the sketch first (reported in created)
Equal
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | lines or circles/arcs | Yes | |
| b | lines or circles/arcs | Yes |
Automation details
Command ID: sketch.constraint.equal
Parameters:
a, b: lines or circles/arcs; or curves: [2 to 200 lines or circles/arcs], each made equal to the first, in one step; any of them may be a model edge {edge: [x,y,z], body?} or vertex {vertex: [x,y,z], body?}, projected into the sketch first (reported in created)
Parallel
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | lines or sketch axes | Yes | |
| b | lines or sketch axes | Yes | x / y: the sketch's own axes, unless a curve has that id; an axis becomes a linked construction line on it, reported in created |
Automation details
Command ID: sketch.constraint.parallel
Parameters:
a, b: lines or sketch axes (x / y: the sketch's own axes, unless a curve has that id; an axis becomes a linked construction line on it, reported in created); any of them may be a model edge {edge: [x,y,z], body?} or vertex {vertex: [x,y,z], body?}, projected into the sketch first (reported in created)
Perpendicular
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | lines or sketch axes | Yes | |
| b | lines or sketch axes | Yes | x / y: the sketch's own axes, unless a curve has that id; an axis becomes a linked construction line on it, reported in created |
Automation details
Command ID: sketch.constraint.perpendicular
Parameters:
a, b: lines or sketch axes (x / y: the sketch's own axes, unless a curve has that id; an axis becomes a linked construction line on it, reported in created); any of them may be a model edge {edge: [x,y,z], body?} or vertex {vertex: [x,y,z], body?}, projected into the sketch first (reported in created)
Fix/Unfix
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| entity | point or curve | Yes | |
| entities | [points and curves] | Yes | |
| fixed | bool | No | default: fix them all unless all are fixed, then unfix |
Automation details
Command ID: sketch.constraint.fix
Parameters:
entity: point or curve | entities: [points and curves]; fixed?: bool (default: fix them all unless all are fixed, then unfix)
MidPoint
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
Automation details
Command ID: sketch.constraint.midpoint
Parameters:
point, line | a, b in pick order: a point and a line (either way round), or two lines whose midpoints meet (the first stays, the second moves); any of them may be a model edge {edge: [x,y,z], body?} or vertex {vertex: [x,y,z], body?}, projected into the sketch first (reported in created)
Concentric
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
Automation details
Command ID: sketch.constraint.concentric
Parameters:
a, b: two circles/arcs, or a circle/arc and a sketch point (including origin), in either order; the point and the curve's centre become coincident; any of them may be a model edge {edge: [x,y,z], body?} or vertex {vertex: [x,y,z], body?}, projected into the sketch first (reported in created)
Collinear
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | lines or sketch axes | Yes | |
| b | lines or sketch axes | Yes | x / y: the sketch's own axes, unless a curve has that id; an axis becomes a linked construction line on it, reported in created |
Automation details
Command ID: sketch.constraint.collinear
Parameters:
a, b: lines or sketch axes (x / y: the sketch's own axes, unless a curve has that id; an axis becomes a linked construction line on it, reported in created); any of them may be a model edge {edge: [x,y,z], body?} or vertex {vertex: [x,y,z], body?}, projected into the sketch first (reported in created)
Symmetry
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | two points or two curves | Yes | |
| b | two points or two curves | Yes | lines mirror their ends, circles/arcs their centres |
Automation details
Command ID: sketch.constraint.symmetry
Parameters:
a, b: two points or two curves (lines mirror their ends, circles/arcs their centres); line: symmetry line id, or x / y for the sketch's own axes (a curve with that id wins; an axis becomes a linked construction line on it, reported in created); or point (or a point id as line, "origin" too): symmetric about that point, each pair joined by a construction line it is the midpoint of; any of them may be a model edge {edge: [x,y,z], body?} or vertex {vertex: [x,y,z], body?}, projected into the sketch first (reported in created)
Curvature
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | two curves sharing an end point | Yes | |
| b | two curves sharing an end point | Yes | curvature continuous, G2 |
Automation details
Command ID: sketch.constraint.curvature
Parameters:
a, b: two curves sharing an end point (curvature continuous, G2)
Polygon
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| lines | [line ids] of a closed chain: equal sides with every corner on one circle | Yes | a regular polygon |
Automation details
Command ID: sketch.constraint.polygon
Parameters:
lines: [line ids] of a closed chain: equal sides with every corner on one circle (a regular polygon)
AutoConstrain
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
Automation details
Command ID: sketch.auto_constrain
Parameters:
tolerance?: mm (default 0.01), angle_tolerance?: deg (default 1), dimensions?: bool (default true): infer constraints, then dimension until fully constrained
AutoConstrain from Datum
Command group: SKETCH › CONSTRAINTS
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| datum | point ref | Yes | default origin |
Automation details
Command ID: sketch.auto_constrain_from_datum
Parameters:
datum: point ref (default origin); like AutoConstrain with positions measured from the datum
SKETCH › MODIFY
Blend Curve
Command group: SKETCH › MODIFY
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| a | Yes | ||
| b | end points of two curves | Yes | "l1.end", "a2.start" |
| continuity | g1|g2|g3|g4 | No | default g1: a tangent spline; g2…g4 match the reference curves' curvature, curvature rate and 4th derivative as well, as one Bézier of degree 5, 7 or 9 |
Automation details
Command ID: sketch.blend_curve
Parameters:
a, b: end points of two curves ("l1.end", "a2.start"), continuity?: g1|g2|g3|g4 (default g1: a tangent spline; g2…g4 match the reference curves' curvature, curvature rate and 4th derivative as well, as one Bézier of degree 5, 7 or 9). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Fillet
Command group: SKETCH › MODIFY
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| point | corner shared by two curves | Yes | "l1.end" |
| points | [corners]| a | Yes | all rounded alike: one radius, the rest equal; a corner is a point reference or {a, b}, the two curves meeting there |
| b | two lines or arcs meeting at a corner | Yes | two lines that share no end are first brought to where they meet: the nearer end of a line that stops short moves there, and a line that runs past is cut there, losing its shorter piece |
| radius | expr | Yes |
Automation details
Command ID: sketch.fillet
Parameters:
point: corner shared by two curves ("l1.end") | points: [corners] (all rounded alike: one radius, the rest equal; a corner is a point reference or {a, b}, the two curves meeting there) | a, b: two lines or arcs meeting at a corner (two lines that share no end are first brought to where they meet: the nearer end of a line that stops short moves there, and a line that runs past is cut there, losing its shorter piece); radius: expr. A corner that dimensions or constraints measure to stays as a virtual sharp corner on both curves' extensions (`virtual_corners`; the moved ones in `moved_to_virtual_corner`). An ellipse's axis line is never a side of a corner (also for the chamfers). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Equal Distance Chamfer
Command group: SKETCH › MODIFY
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| point | [corners]| a | Yes | every corner cut alike; a corner is a point reference or {a, b} |
| points | [corners]| a | Yes | every corner cut alike; a corner is a point reference or {a, b} |
| b | a corner of two lines | Yes | two that share no end are first brought to where they meet, as in sketch.fillet |
Automation details
Command ID: sketch.chamfer.equal_distance
Parameters:
point | points: [corners] (every corner cut alike; a corner is a point reference or {a, b}) | a, b: a corner of two lines (two that share no end are first brought to where they meet, as in sketch.fillet); distance. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Distance and Angle Chamfer
Command group: SKETCH › MODIFY
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| point | [corners]| a | Yes | every corner cut alike; a corner is a point reference or {a, b}, and a point's `a` is the first of its two lines in curve order |
| points | [corners]| a | Yes | every corner cut alike; a corner is a point reference or {a, b}, and a point's `a` is the first of its two lines in curve order |
| b | a corner of two lines | Yes | two that share no end are first brought to where they meet, as in sketch.fillet |
| distance | along a | Yes | |
| angle | deg from a | Yes |
Automation details
Command ID: sketch.chamfer.distance_angle
Parameters:
point | points: [corners] (every corner cut alike; a corner is a point reference or {a, b}, and a point's `a` is the first of its two lines in curve order) | a, b: a corner of two lines (two that share no end are first brought to where they meet, as in sketch.fillet); distance: along a, angle: deg from a. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Two Distance Chamfer
Command group: SKETCH › MODIFY
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| point | [corners]| a | Yes | every corner cut alike; a corner is a point reference or {a, b}, and a point's `a` is the first of its two lines in curve order |
| points | [corners]| a | Yes | every corner cut alike; a corner is a point reference or {a, b}, and a point's `a` is the first of its two lines in curve order |
| b | a corner of two lines | Yes | two that share no end are first brought to where they meet, as in sketch.fillet |
| distance | along a | Yes | |
| distance2 | along b | Yes |
Automation details
Command ID: sketch.chamfer.two_distance
Parameters:
point | points: [corners] (every corner cut alike; a corner is a point reference or {a, b}, and a point's `a` is the first of its two lines in curve order) | a, b: a corner of two lines (two that share no end are first brought to where they meet, as in sketch.fillet); distance: along a, distance2: along b. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Offset
Command group: SKETCH › MODIFY
Default keyboard shortcut: O
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| flip | bool reverses the primary side | No |
Automation details
Command ID: sketch.offset
Parameters:
curves: [ids], distance: number in mm or length expression (creates an editable dimension; positive = left of the chain, or toward `side`), side?: [x,y], chain?: bool (default true: the connected chain, including ends that only coincide). A corner is trimmed back to the crossing when the offset runs past it, and extended until the offset curves intersect when the corner falls short; direction?: one_side|symmetric (default one_side) or symmetric?: bool (the same distance each way; no `side`, whose job it takes over), distance2?: positive length expression (Two Sides: an independent distance the other way, as for `solid.extrude`). Each side is its own offset association, listed in `sides`; flip?: bool reverses the primary side; `param`/`param2` name the driving dimensions; instances?: whole number or unitless expression, 1…100 (default 1): each instance after the first offsets the instance before it by the same distance again, so instance n stands n distances from the curves picked. Every instance of a side is driven by that side's own dimension, and each entry of `sides` names its `instance`; an instance the shape cannot take refuses the whole command. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Trim
Command group: SKETCH › MODIFY
Default keyboard shortcut: T
Read the sketching and constraints guide.
Automation details
Command ID: sketch.trim
Parameters:
curve: id, at: [x,y] (the piece to remove: between the nearest intersections around it). Trimming a line source or its single-line offset releases linked extents (offset_released: curve ids), retaining their driving normal-distance dimensions and parallel relations. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Extend
Command group: SKETCH › MODIFY
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| curve | id | Yes | |
| at | [x,y] near the end to extend | Yes | a line runs on to the nearest curve, or the previewed reach when nothing is in the way; an arc grows along its circle and closes into a whole circle when nothing stops it |
| curves | [id, id] | Yes | two lines or arcs of this sketch, grown until they meet and joined there |
| at | [[x,y],[x,y]] | No | one point per curve: the end to grow; default the end nearest the meeting point |
Automation details
Command ID: sketch.extend
Parameters:
curve: id, at: [x,y] near the end to extend (a line runs on to the nearest curve, or the previewed reach when nothing is in the way; an arc grows along its circle and closes into a whole circle when nothing stops it) | curves: [id, id] (two lines or arcs of this sketch, grown until they meet and joined there), at?: [[x,y],[x,y]] (one point per curve: the end to grow; default the end nearest the meeting point). `curve` and `curves` exclude each other; the two-curve form returns moved: the meeting point's id
Break
Command group: SKETCH › MODIFY
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| curve | id | Yes | |
| at | [x,y] | Yes | split at intersections; at a point where the curve ends and another curve meets, the curve gets its own end there and the two are no longer joined |
| points | [[x,y]…] | Yes | 1…1000 positions projected onto the curve; duplicates are merged |
Automation details
Command ID: sketch.break
Parameters:
curve: id, at: [x,y] (split at intersections; at a point where the curve ends and another curve meets, the curve gets its own end there and the two are no longer joined) | points: [[x,y]…] (1…1000 positions projected onto the curve; duplicates are merged). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Sketch Scale
Command group: SKETCH › MODIFY
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| entities | [curve/point ids] | Yes | |
| base | [x,y] or point ref | Yes | |
| factor | number | Yes |
Automation details
Command ID: sketch.scale
Parameters:
entities: [curve/point ids], base: [x,y] or point ref, factor: number; the driving length and radius dimensions wholly inside the selection scale too (a formula becomes `(formula) * factor`)
Transform
Command group: SKETCH › MODIFY
Default keyboard shortcut: G
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| entities | [curve/point ids] | Yes | |
| factor | number | No | scale |
| angle | degrees | No | turn |
| center | [x,y] or point ref | No | what scales and turns stay put; default [0,0] |
| translate | [dx,dy] | No | applied last |
Automation details
Command ID: sketch.transform
Parameters:
entities: [curve/point ids], factor?: number (scale), angle?: degrees (turn), center?: [x,y] or point ref (what scales and turns stay put; default [0,0]), translate?: [dx,dy] (applied last); scales, turns and moves in one step
Move/Copy Sketch Entities
Command group: SKETCH › MODIFY
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| entities | [ids] | Yes | |
| translate | [dx,dy] | No | |
| angle | deg | No | |
| center | [x,y] | No | |
| copy | bool | No | |
| rotate_constraints | bool | No | default true; false keeps constraints unchanged |
Automation details
Command ID: sketch.move
Parameters:
entities: [ids], translate?: [dx,dy], angle?: deg, center?: [x,y], copy?: bool, rotate_constraints?: bool (default true; false keeps constraints unchanged); a rotation turns the constraints tied to the sketch axes when all their geometry moves (horizontal and vertical relations and dimensions swap at odd quarter turns and stay at half turns, line angles turn with the line) and removes the horizontal and vertical ones that cannot hold at other angles; picking a text outline or linked point transforms its whole text source once, and copies remain editable text; copy also accepts drawn 3D curves, preserving exact arcs and height above the sketch plane; a turned rectangle keeps its shape: parallel and perpendicular relations replace the horizontal and vertical ones lost; returns `released`: the constraints tying the moved geometry to what stays that the move let go, as {id, kind}, and `added`: the relations put in their place, as {id, kind}. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
SKETCH › INSERT
Insert DXF
Command group: SKETCH › INSERT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | ASCII DXF | Yes | blocks expanded |
| text | ASCII DXF | Yes | blocks expanded |
| align | "origin"| "center" | No | default: `at` is where the file's origin goes; `at` is where the drawing's middle goes and it turns and scales about it |
| tolerance | mm within which ends join | No | default 0.0001 |
| fixed | bool | No | a Fix constraint on every point the drawing adds, as sketch.constraint.fix puts one; a circle's or ellipse's radius stays free; default false |
| plane | No | when no sketch is active, a new sketch on it; default XY |
Automation details
Command ID: sketch.insert_dxf
Parameters:
path | text: ASCII DXF (blocks expanded); at?: [x,y] offset, scale? | width? | height?: mm, the size of the drawn geometry's bounds before rotation, aspect kept (win over scale); angle?: degrees, about the drawing's origin (or its centre); align?: "origin" (default: `at` is where the file's origin goes) | "center" (`at` is where the drawing's middle goes and it turns and scales about it); tolerance?: mm within which ends join (default 0.0001); fixed?: bool (a Fix constraint on every point the drawing adds, as sketch.constraint.fix puts one; a circle's or ellipse's radius stays free; default false); plane?: (when no sketch is active, a new sketch on it; default XY). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Insert SVG
Command group: SKETCH › INSERT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | SVG | Yes | |
| text | SVG | Yes | |
| size_from | "geometry"| "viewbox" | No | default: width and height are the bounds of the drawn geometry; the SVG sheet: its viewBox, else its width and height; a drawing smaller than its sheet then comes out smaller than width or height say |
| align | "origin"| "center" | No | default: `at` is where the file's origin goes; `at` is where the drawing's (or sheet's) middle goes and it turns and scales about it |
| tolerance | mm within which ends join | No | default 0.0001 |
| fixed | bool | No | every point it adds gets a Fix constraint, so the drawing stays where it is put |
| plane | No | when no sketch is active, a new sketch on it; default XY |
Automation details
Command ID: sketch.insert_svg
Parameters:
path | text: SVG; at?: [x,y] offset, scale? | width? | height?: mm, the drawing's size before rotation, aspect kept (win over scale); size_from?: "geometry" (default: width and height are the bounds of the drawn geometry) | "viewbox" (the SVG sheet: its viewBox, else its width and height; a drawing smaller than its sheet then comes out smaller than width or height say); angle?: degrees, about the drawing's origin (or its centre); align?: "origin" (default: `at` is where the file's origin goes) | "center" (`at` is where the drawing's (or sheet's) middle goes and it turns and scales about it); tolerance?: mm within which ends join (default 0.0001); fixed?: bool (every point it adds gets a Fix constraint, so the drawing stays where it is put); plane?: (when no sketch is active, a new sketch on it; default XY). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Canvas
Command group: SKETCH › INSERT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | Yes | base64 PNG or JPEG | |
| data | Yes | base64 PNG or JPEG | |
| plane | XY|XZ|YZ|{face: [x,y,z]}|… | No | default XY |
| center | [x,y] on the plane | No | |
| at | [x,y,z] | No | |
| width | mm | No | default 100 |
| angle | deg | No | |
| opacity | 0…1 | No | default 0.5 |
| flip | No | ||
| name | No |
Automation details
Command ID: canvas.insert
Parameters:
path | data (base64 PNG or JPEG); plane?: XY|XZ|YZ|{face: [x,y,z]}|… (default XY); center?: [x,y] on the plane, or at?: [x,y,z]; width?: mm (default 100); angle?: deg; opacity?: 0…1 (default 0.5); flip?; name?
Decal
Command group: SKETCH › INSERT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | Yes | ||
| data | Yes | ||
| width | mm | No | |
| angle | deg | No | |
| opacity | No | default 1 |
Automation details
Command ID: canvas.decal
Parameters:
path | data; face: [x,y,z] on a planar face (the image is centred there), or the picked face as sketch.create's plane takes it ({face, body, index, path?}); width?: mm; angle?: deg; opacity?: (default 1)
Edit Canvas
Command group: SKETCH › INSERT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| canvas | id or name | Yes | |
| center | No | ||
| width | No | ||
| angle | deg | No | |
| opacity | No | ||
| flip | No | ||
| visible | No | ||
| name | No | ||
| locked | No | a locked canvas refuses center, width, angle, flip, Calibrate and Delete |
Automation details
Command ID: canvas.edit
Parameters:
canvas: id or name; center?, width?, angle?: deg, opacity?, flip?, visible?, name?, locked? (a locked canvas refuses center, width, angle, flip, Calibrate and Delete)
SKETCH › INSPECT
Curvature Comb Analysis
Command group: SKETCH › INSPECT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| curves | [sketch curve ids] | No | sketch?: id|name, default active |
| edges | [[x,y,z] points on body edges: the edge whose exact curve passes nearest] | No | |
| faces | [[x,y,z] points on faces] with count?: isoparametric curves each way | No | default 4; combs along the face's iso grid |
| scale | comb length per unit curvature | No | default auto: the longest tooth a fifth of the combs' size |
Automation details
Command ID: inspect.curvature_comb
Parameters:
curves?: [sketch curve ids] (sketch?: id|name, default active) | edges?: [[x,y,z] points on body edges: the edge whose exact curve passes nearest] | faces?: [[x,y,z] points on faces] with count?: isoparametric curves each way (default 4; combs along the face's iso grid); density?: teeth per curve, 2…2000 (default 40; on an edge or an iso curve exactly that many, evenly spaced along its parameter); scale?: comb length per unit curvature (default auto: the longest tooth a fifth of the combs' size); length?: a multiplier on the automatic scale, 0.01…100 (default 1; ignored with `scale`); add?: true keeps the combs shown and adds these, every comb again at one scale (with nothing picked it draws those shown again with this call's options, or turns the analysis on with none); clear?: true turns the analysis off. Every comb of a call shares one scale, so tooth lengths compare across curves; the viewport draws them. The curvature is exact: from each sketch curve, edge curve (line, circle, ellipse, B-spline, NURBS, intersection curve) or face surface's own derivatives, never from the display mesh; a face's teeth are the surface's normal curvature along each iso curve, along the surface normal. → combs: [{curve, teeth: [[foot, tip]], envelope: [tip], max_curvature, min_radius}] (those shown, with `add`), scale
Minimum Radius Analysis
Command group: SKETCH › INSPECT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| curves | [sketch curve ids] | No | sketch? |
| edges | [[x,y,z]…] | No | |
| faces | [[x,y,z]…] | No | default: every face of every body |
Automation details
Command ID: inspect.minimum_radius
Parameters:
curves?: [sketch curve ids] (sketch?) | edges?: [[x,y,z]…] | faces?: [[x,y,z]…] (default: every face of every body); the smallest radius of curvature of each and where it is
Isocurve Analysis
Command group: SKETCH › INSPECT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| faces | [[x,y,z]…] points on faces | Yes | 1…100 |
| add | true keeps the faces already shown | No | |
| clear | true turns the analysis off. | No |
Automation details
Command ID: inspect.isocurve
Parameters:
faces: [[x,y,z]…] points on faces (1…100); count?: whole number of curves each way, 1…100 (default 8); add?: true keeps the faces already shown; clear?: true turns the analysis off. → each face's isoparametric curves, u = const and v = const of its surface, evenly spaced across it and cut to its trims, as points (`curves`) and per face (`faces`); the viewport draws them
Center of Mass
Command group: SKETCH › INSPECT
Read the sketching and constraints guide.
Automation details
Command ID: inspect.center_of_mass
Parameters:
bodies?: [names] (default all): the centre of mass (uniform density) of each and of all together, from the exact mass properties `inspect.measure` takes → center, volume, bodies: [{body, center, volume}], skipped: [{body, reason}] (bodies that enclose no volume or could not be measured)
Zebra Analysis
Command group: SKETCH › INSPECT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| stripes | number across the view | No | default 12 |
| clear | true turns the analysis off | No |
Automation details
Command ID: inspect.zebra
Parameters:
stripes?: number across the view (default 12); clear?: true turns the analysis off
Draft Analysis
Command group: SKETCH › INSPECT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| pull | [x,y,z] direction | No | default Z |
| angle | degrees | No | default 1 |
| clear | true turns the analysis off | No |
Automation details
Command ID: inspect.draft
Parameters:
pull?: [x,y,z] direction (default Z); angle?: degrees (default 1); clear?: true turns the analysis off
Environment Map Analysis
Command group: SKETCH › INSPECT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| clear | true turns the analysis off | No |
Automation details
Command ID: inspect.environment_map
Parameters:
clear?: true turns the analysis off
Accessibility Analysis
Command group: SKETCH › INSPECT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| direction | [x,y,z] the tool comes from | No | default Z, from above |
| clear | true turns the analysis off | No |
Automation details
Command ID: inspect.accessibility
Parameters:
direction?: [x,y,z] the tool comes from (default Z, from above); clear?: true turns the analysis off
Curvature Map Analysis
Command group: SKETCH › INSPECT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| radius | mm shown red | No | default: a tenth of the model's size |
| clear | true turns the analysis off | No |
Automation details
Command ID: inspect.curvature_map
Parameters:
radius?: mm shown red (default: a tenth of the model's size); clear?: true turns the analysis off
Inspect Sketch
Command group: SKETCH › INSPECT
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | id|name | No | default active |
Automation details
Command ID: sketch.inspect
Parameters:
sketch?: id|name (default active)
SKETCH › PATTERN
Mirror
Command group: SKETCH › PATTERN
Read the sketching and constraints guide.
Automation details
Command ID: sketch.mirror
Parameters:
entities: [curve/point ids], line: straight curve id, x / y for a sketch axis, or {axis: X|Y|Z} for an origin axis (the mirror line is the axis's projection into the sketch plane; an axis perpendicular to the plane is refused) (symmetry constraints are added). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Circular Pattern
Command group: SKETCH › PATTERN
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| alignment | left|center|right | No | default right |
| reversed | bool | No | default false |
Automation details
Command ID: sketch.pattern.circular
Parameters:
entities: [ids], center: [x,y] or point ref, count: 2…500 (number or unitless expression, retained through edits), angle?: total deg, number or expression (default 360); alignment?: left|center|right (default right); reversed?: bool (default false). Quantity includes the original. Center balances copies around it; reversed flips the direction and extra side for even totals. Partial arcs span angle with angle/(count-1) spacing; full turns use angle/count. Adds associative pattern constraints; a coordinate center creates a constrainable point. Returns pattern and center ids. pattern?: existing pattern id to edit (omitted values retained; surviving instance ids retained). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Rectangular Pattern
Command group: SKETCH › PATTERN
Read the sketching and constraints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| entities | [ids] | Yes | |
| count | Yes | ||
| spacing | Yes | ||
| count2 | No | ||
| spacing2 | No | ||
| spacings | length numbers or expressions | Yes | |
| direction | sketch line ids | No | |
| direction2 | sketch line ids | No | live references |
| dir | [x,y] vectors | No | |
| dir2 | [x,y] vectors | No | defaults: sketch x, perpendicular to direction 1 |
| alignment | No | ||
| alignment2 | left|center|right | No | default right |
| reversed2 | bool | No | default false |
Automation details
Command ID: sketch.pattern.rectangular
Parameters:
entities: [ids], count, spacing; count2?, spacing2?; counts: positive integer numbers or expressions, at most 500 instances total; spacings: length numbers or expressions; direction?, direction2?: sketch line ids (live references); dir?, dir2?: [x,y] vectors (defaults: sketch x, perpendicular to direction 1); alignment?, alignment2?: left|center|right (default right). Signed spacings reverse each direction. reversed?, reversed2?: bool (default false); reverses placement and the extra side of even centered totals. Quantities include the original. Adds associative pattern constraints. Returns pattern id. pattern?: existing pattern id to edit (omitted values retained; surviving instance ids retained). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
SURFACE › INSPECT
Continuity Analysis
Command group: SURFACE › INSPECT
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | name | No | default: the visible bodies |
| edges | [x,y,z] points or {"index": i} | No | default: every edge of the body; a pick must match one body |
| gap_tolerance_mm | No | default 0.001 | |
| angle_tolerance_deg | No | default 1 | |
| curvature_tolerance_per_mm | No | default 0.01 | |
| curvature_change_tolerance_per_mm2 | No | default 0.001 | |
| curvature_change_rate_tolerance_per_mm3 | No | default 0.0001 | |
| add | true keeps the seams already shaded and adds these | No | measuring an edge again replaces it |
| clear | true turns the analysis off. | No |
Automation details
Command ID: inspect.continuity
Parameters:
body?: name (default: the visible bodies); edges?: [x,y,z] points or {"index": i} (default: every edge of the body; a pick must match one body); samples?: 3…257 stations along each edge, ends included (default 33); gap_tolerance_mm? (default 0.001), angle_tolerance_deg? (default 1), curvature_tolerance_per_mm? (default 0.01), curvature_change_tolerance_per_mm2? (default 0.001), curvature_change_rate_tolerance_per_mm3? (default 0.0001); add?: true keeps the seams already shaded and adds these (measuring an edge again replaces it); clear?: true turns the analysis off. → each edge's worst gap (G0), normal angle (G1), curvature jump (G2), jump of the curvature's change across the seam dκ/ds (G3) and of that change's rate d²κ/ds² (G4), from the faces' exact derivatives, as {value, at: [x,y,z], edge_fraction}; its order (g0…g4: the highest every station meets within the tolerances, null where the faces do not meet), its verdict (smooth: g2 or better, curvature_jump, sharp or gap) and a summary; the seams are shaded in the viewport
SURFACE › CREATE
Boundary Surface
Command group: SURFACE › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| curves | [2 to 4 sketch curve ids in loop order] | Yes | each one ends where the next begins and the last where the first does; two: the patch spans between them and leaves each boundary along the tangent across it; three or four: the flat patch of the loop, three collapsing the side opposite the first curve to the corner there |
| continuity | g0|g1|g2|g3 | [one per curve] | No | default g1: how much of the surface across each boundary the patch repeats — a sketch curve's own plane, so g1 and up hold exactly and g0 lets the middle bow |
| crown | number -0.9…3 | No | default 0: how full the middle is, without touching a boundary; two curves only |
| operation | new|join | No | default new; join sews the surface into the body of its first edge curve, a solid when it closes the gap |
| body_name | No | a surface body |
Automation details
Command ID: surface.boundary
Parameters:
Either a loop of one sketch's curves — sketch?: id|name (default: the sketch being edited); curves: [2 to 4 sketch curve ids in loop order] (each one ends where the next begins and the last where the first does; two: the patch spans between them and leaves each boundary along the tangent across it; three or four: the flat patch of the loop, three collapsing the side opposite the first curve to the corner there); continuity?: g0|g1|g2|g3 | [one per curve] (default g1: how much of the surface across each boundary the patch repeats — a sketch curve's own plane, so g1 and up hold exactly and g0 lets the middle bow); crown?: number -0.9…3 (default 0: how full the middle is, without touching a boundary; two curves only); samples?: 8…512 stations per boundary (default 25) — or a curve network — u: [curve] (two or more one way: the surface lofts through them), v?: [curve] (crossing every u-curve once: two each way give a Coons patch, more a Gordon surface through every curve; a curve that misses another by more than 0.01 mm is refused, naming the pair), each curve "id" (a curve of `sketch`) | {sketch?: id|name, curves: [ids meeting end to end]} (planar or 3D sketch curves) | {body: name, edges: [[x,y,z]] (points on a chain of its edges), continuity?: g0|g1|g2 (default g0; g1 the surface leaves tangent to the face beside a surface's open edges, g2 with its curvature too; on curves of one direction only)} | {point: [x,y,z]} (a side collapsed to a point: a three-sided patch); operation?: new|join (default new; join sews the surface into the body of its first edge curve, a solid when it closes the gap). name?, body_name? (a surface body)
Patch
Command group: SURFACE › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | id|name and profiles? | No | planar patches of sketch regions |
| profiles_3d | [indices] | Yes | the sketch's planar 3D-sketch loops, each patched in its own plane, as listed by sketch.inspect |
| edges | [[x,y,z]] | Yes | points on a closed loop of a body's edges: one face on them, planar when the loop is, else a smooth B-spline surface |
| continuity | g0|g1|g2|g3|g4 | No | edges only, default g0: how the patch meets the faces beside the loop — g1 their tangent planes, g2 also their curvature across the edges, g3 also its rate of change, g4 the change of that rate |
| points | [[x,y,z]] | No | edges only, up to 64: points the patch passes through |
| crown | number −0.9…3 | No | default 0: only a fitted patch, whose middle becomes fuller by this many times the loop's size — the bump vanishes on the loop, so the face still meets the picked edges and the continuity across them; a loop that is planar and g0 is the exact plane whatever the crown; with points, crown needs a g1 or higher edge |
| name | No | ||
| body_name | No |
Automation details
Command ID: surface.patch
Parameters:
sketch?: id|name and profiles? (planar patches of sketch regions) or profiles_3d: [indices] (the sketch's planar 3D-sketch loops, each patched in its own plane, as listed by sketch.inspect) | edges: [[x,y,z]] (points on a closed loop of a body's edges: one face on them, planar when the loop is, else a smooth B-spline surface) and body?; continuity?: g0|g1|g2|g3|g4 (edges only, default g0: how the patch meets the faces beside the loop — g1 their tangent planes, g2 also their curvature across the edges, g3 also its rate of change, g4 the change of that rate) or [{edge: [x,y,z], g: g0|g1|g2|g3|g4}] (those edges so, the rest g0) or {all, edges}; points?: [[x,y,z]] (edges only, up to 64: points the patch passes through); crown?: number −0.9…3 (default 0: only a fitted patch, whose middle becomes fuller by this many times the loop's size — the bump vanishes on the loop, so the face still meets the picked edges and the continuity across them; a loop that is planar and g0 is the exact plane whatever the crown; with points, crown needs a g1 or higher edge); name?, body_name?
Thicken
Command group: SURFACE › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [surface names] | Yes | |
| thickness | expr | Yes | negative: against the normal |
| symmetric | bool | No | |
| operation | new|join|cut|intersect | No | |
| targets | No |
Automation details
Command ID: surface.thicken
Parameters:
bodies: [surface names]; thickness: expr (negative: against the normal); symmetric?: bool; operation?: new|join|cut|intersect; targets?
Surface Extrude
Command group: SURFACE › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | id|name | No | |
| curves | [curve ids] | No | open or closed chains of curves meeting end to end |
| distance | expr | Yes | |
| direction | positive|negative|symmetric | No | symmetric: distance is the total, split evenly around the start plane, as solid.extrude |
| convention | total_distance|legacy_per_side | No | as solid.extrude; default total_distance; legacy_per_side: the distance on each side, as older symmetric surface extrudes keep |
| distance2 | expr | No | |
| start_offset | expr | No | |
| name | No | ||
| body_name | No | a surface body: walls only, no caps |
Automation details
Command ID: surface.extrude
Parameters:
sketch?: id|name; curves?: [curve ids] (open or closed chains of curves meeting end to end) and/or profiles? (their boundaries; the default when no curves are given); distance: expr; direction?: positive|negative|symmetric (symmetric: distance is the total, split evenly around the start plane, as solid.extrude); convention?: total_distance|legacy_per_side (as solid.extrude; default total_distance; legacy_per_side: the distance on each side, as older symmetric surface extrudes keep); distance2?: expr; start_offset?: expr; name?, body_name? (a surface body: walls only, no caps)
Surface Revolve
Command group: SURFACE › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | id|name | No | |
| curves | [curve ids] and/or profiles? | No | as surface.extrude |
| axis | sketch line id|x|y|X|Y|Z|{type: world, axis: X|Y|Z}|{sketch, curve}|construction axis name|{origin, dir}| {edge|face: [x,y,z]} | Yes | a line of another sketch, followed in that sketch; origin: numbers or length expressions, followed when parameters change; a straight or circular edge, or a cylinder, cone or torus face: about its axis, followed as the model changes |
| angle | expr | No | default 360 deg |
| angle2 | expr | No | the other side |
| symmetric | bool | No | |
| name | No | ||
| body_name | No | a surface body, no caps; a solid where a full turn closes it |
Automation details
Command ID: surface.revolve
Parameters:
sketch?: id|name; curves?: [curve ids] and/or profiles? (as surface.extrude); axis: sketch line id|x|y|X|Y|Z|{type: world, axis: X|Y|Z}|{sketch, curve} (a line of another sketch, followed in that sketch)|construction axis name|{origin, dir} (origin: numbers or length expressions, followed when parameters change) | {edge|face: [x,y,z]} (a straight or circular edge, or a cylinder, cone or torus face: about its axis, followed as the model changes); angle?: expr (default 360 deg); angle2?: expr (the other side); symmetric?: bool; name?, body_name? (a surface body, no caps; a solid where a full turn closes it)
Surface Sweep
Command group: SURFACE › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | id|name | No | |
| curves | [curve ids] and/or profiles? | No | as surface.extrude |
| path_sketch | sketch | Yes | |
| path | [curve ids in order] | Yes | a path with corners, or 3D curves, gives ruled walls mitred at the corners |
| path_body | body name | No | |
| path_edges | [points on its edges] | No | the path is a chain of that body's edges, instead of a sketch's curves |
| orientation | No | ||
| twist | No | ||
| scale | No | ||
| rails | No | ||
| rail_fit | No | as solid.sweep | |
| name | No | ||
| body_name | No | a surface body, no caps |
Automation details
Command ID: surface.sweep
Parameters:
sketch?: id|name; curves?: [curve ids] and/or profiles? (as surface.extrude); path_sketch: sketch; path: [curve ids in order] (a path with corners, or 3D curves, gives ruled walls mitred at the corners); path_body?: body name; path_edges?: [points on its edges] (the path is a chain of that body's edges, instead of a sketch's curves); orientation?, twist?, scale?, rails?, rail_fit? (as solid.sweep); name?, body_name? (a surface body, no caps)
Surface Loft
Command group: SURFACE › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sections | [{sketch, curves?: [curve ids], profiles?} | {body, edges: [[x,y,z]]}] | Yes | 2…50 in order; each one chain: a profile without holes, or curves meeting end to end; all open or all closed; a body edge chain takes the face the chain bounds as the surface the end repeats |
| continuity | [g0|g1|g2|g3, g0|g1|g2|g3] | No | each end, default g0: how much of the surface at the first and last section the loft repeats — the tangent plane, the curvature, or how that curvature changes |
| crown | [number, number] | No | default 0: how full each end leaves, -0.9 flattest to 3 fullest |
| rails | No | ||
| rail_fit | No | as solid.loft; sketch sections only, both ends g0 | |
| name | No | ||
| body_name | No | a surface body: ruled between two sections, smooth through three or more; no caps |
Automation details
Command ID: surface.loft
Parameters:
sections: [{sketch, curves?: [curve ids], profiles?} | {body, edges: [[x,y,z]]}] (2…50 in order; each one chain: a profile without holes, or curves meeting end to end; all open or all closed; a body edge chain takes the face the chain bounds as the surface the end repeats); continuity?: [g0|g1|g2|g3, g0|g1|g2|g3] (each end, default g0: how much of the surface at the first and last section the loft repeats — the tangent plane, the curvature, or how that curvature changes); crown?: [number, number] (default 0: how full each end leaves, -0.9 flattest to 3 fullest); rails?, rail_fit? (as solid.loft; sketch sections only, both ends g0); name?, body_name? (a surface body: ruled between two sections, smooth through three or more; no caps)
Offset Surface
Command group: SURFACE › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| faces | [[x,y,z]] | Yes | points on the faces |
| body | No | ||
| distance | expr | Yes | signed, along the faces' normals; 0 copies the faces |
| chain | bool | No | each pick's whole smooth chain of faces |
| tolerance | expr | No | how far a fitted face may stray, default 0.01 mm |
Automation details
Command ID: surface.offset
Parameters:
faces: [[x,y,z]] (points on the faces); body?; distance: expr (signed, along the faces' normals; 0 copies the faces); chain?: bool (each pick's whole smooth chain of faces); tolerance?: expr (how far a fitted face may stray, default 0.01 mm). Planes and cylinders move exactly; other faces are fitted. A new surface body (a solid where its faces close)
Ruled Surface
Command group: SURFACE › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | Yes | ||
| edges | [[x,y,z]] | Yes | points on a chain of its edges, open or closed |
| distance | expr | Yes | how far the strip reaches |
| mode | normal|tangent|angle|direction | No | default normal: along the normal of the face beside each edge; tangent: continuing it |
| angle | expr | No | angle mode: from `direction`, else from the face's normal, turned away from the face; 90 deg from the normal is tangent |
| direction | [x,y,z] | No | direction mode: the rulings; angle mode: the reference, e.g. a pull direction for a draft |
| face | [x,y,z] | No | a point on the face the directions come from; default: the face beside the most picked edges |
| flip | bool | No | the other side |
| corners | mitre|round | No | sharp corners of the chain; inside corners are always cut back |
Automation details
Command ID: surface.ruled
Parameters:
body; edges: [[x,y,z]] (points on a chain of its edges, open or closed); distance: expr (how far the strip reaches); mode?: normal|tangent|angle|direction (default normal: along the normal of the face beside each edge; tangent: continuing it); angle?: expr (angle mode: from `direction`, else from the face's normal, turned away from the face; 90 deg from the normal is tangent); direction?: [x,y,z] (direction mode: the rulings; angle mode: the reference, e.g. a pull direction for a draft); face?: [x,y,z] (a point on the face the directions come from; default: the face beside the most picked edges); flip?: bool (the other side); corners?: mitre|round (sharp corners of the chain; inside corners are always cut back); far?: [null|[[x,y,z]]] (per chain edge, the interior control points of a free strip's far curve, as the default curve's handles list them; null: the default). A constant ruling, or one keeping its angle to an arc's axis, gives an exact plane, cylinder or cone; where the rulings turn freely along an edge, the strip is the exact ruled surface to a far curve of its own (from corner to corner, fair, near the rulings' ends). A new surface body
Blend Surface
Command group: SURFACE › CREATE
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| from | {body, edges: [[x,y,z]]} | Yes | |
| to | {body, edges: [[x,y,z]]} | Yes | points on the edges of one chain of each body: two picks on the same edge is that one edge, more chain up |
| continuity | [g0|g1|g2|g3, g0|g1|g2|g3] | No | each end, default g1: how much of the surface at the picked edges the blend repeats — the tangent plane, the curvature, or how that curvature changes |
| bulge | [number, number] | No | default 0: how full each end leaves, -0.9 flattest to 3 fullest |
| align | [[x,y,z], [x,y,z]] | No | a point each end leaves towards, when the faces at the picks do not say |
| seam | [[x,y,z], [x,y,z]] | No | a point on each chain its stations start from: two closed chains otherwise pair the way that keeps the blend from twisting; an open chain starts at the end nearer its point; a closed chain blends only to a closed chain |
| stitch | bool | No | sew the blend onto its two bodies where the boundaries meet, replacing them |
| name | No | ||
| body_name | No |
Automation details
Command ID: surface.blend
Parameters:
from, to: {body, edges: [[x,y,z]]} (points on the edges of one chain of each body: two picks on the same edge is that one edge, more chain up); continuity?: [g0|g1|g2|g3, g0|g1|g2|g3] (each end, default g1: how much of the surface at the picked edges the blend repeats — the tangent plane, the curvature, or how that curvature changes); bulge?: [number, number] (default 0: how full each end leaves, -0.9 flattest to 3 fullest); align?: [[x,y,z], [x,y,z]] (a point each end leaves towards, when the faces at the picks do not say); seam?: [[x,y,z], [x,y,z]] (a point on each chain its stations start from: two closed chains otherwise pair the way that keeps the blend from twisting; an open chain starts at the end nearer its point; a closed chain blends only to a closed chain); stitch?: bool (sew the blend onto its two bodies where the boundaries meet, replacing them); name?, body_name?
SURFACE › MODIFY
Stitch
Command group: SURFACE › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | Yes | surfaces sewn into the first; a solid when they close |
| tolerance | expr | No | default: tight |
Automation details
Command ID: surface.stitch
Parameters:
bodies: [names] (surfaces sewn into the first; a solid when they close); tolerance?: expr (default: tight)
Extend
Command group: SURFACE › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | surface name | Yes | |
| edges | [[x,y,z]] | Yes | points on boundary edges to push out |
| distance | expr | Yes | unless up_to |
| mode | natural| tangent| curvature | No | the surface itself continued: a B-spline's end spans continued, which keeps planes and surfaces of revolution on themselves; the default; the face continued tangent to its surface across the edge, G1; continued keeping the surface's curvature across the edge too, G2 |
| up_to | plane| {body, point}| "bounds" | No | XY|XZ|YZ|plane name|{origin, normal}; a face, its surface extended; natural: back to the surface's own bounds, undoing a trim |
| neighbours | bool | No | default true: the edges next to an extended edge are lengthened to meet it; false: the extension's sides run square to the edge |
Automation details
Command ID: surface.extend
Parameters:
body: surface name; edges: [[x,y,z]] (points on boundary edges to push out); distance: expr (unless up_to); mode?: natural (the surface itself continued: a B-spline's end spans continued, which keeps planes and surfaces of revolution on themselves; the default) | tangent (the face continued tangent to its surface across the edge, G1) | curvature (continued keeping the surface's curvature across the edge too, G2); up_to?: plane (XY|XZ|YZ|plane name|{origin, normal}) | {body, point} (a face, its surface extended) | "bounds" (natural: back to the surface's own bounds, undoing a trim); neighbours?: bool (default true: the edges next to an extended edge are lengthened to meet it; false: the extension's sides run square to the edge)
Trim
Command group: SURFACE › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | surface name | Yes | |
| plane | XY|XZ|YZ|plane name|{origin, normal} or tool: {body, point} | Yes | a face, its surface extended |
| curves | {sketch, curves?: [curve ids] (chains of curves meeting end to end; default every curve), direction?: normal|[x,y,z] (swept onto the surface along the sketch's normal, the default, or this direction)} | Yes | |
| keep | [x,y,z] | Yes | a point on the side to keep |
| keep_with | [x,y,z] or [[x,y,z], …] | Yes | what to keep of it |
| extend | bool | No | a surface that stops short of the other is extended to meet it |
| stitch | bool | No | the kept pieces sewn into `body`; `with` is then gone |
Automation details
Command ID: surface.trim
Parameters:
body: surface name; plane: XY|XZ|YZ|plane name|{origin, normal} or tool: {body, point} (a face, its surface extended) or curves: {sketch, curves?: [curve ids] (chains of curves meeting end to end; default every curve), direction?: normal|[x,y,z] (swept onto the surface along the sketch's normal, the default, or this direction)}; keep: [x,y,z] (a point on the side to keep) or [[x,y,z], ...] (points on the regions to keep: the pieces that hang together once cut). Mutual trim: with: another surface (one face each; leave out plane, tool and curves), keep_with: [x,y,z] or [[x,y,z], ...] (what to keep of it); each is cut where the other's surface (extended) meets it; extend?: bool (a surface that stops short of the other is extended to meet it); stitch?: bool (the kept pieces sewn into `body`; `with` is then gone)
Untrim
Command group: SURFACE › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| face | {body, point} | Yes | |
| holes | all|[[x,y,z]] | No | points on the inner loops to remove; default: all |
| outer | bool | No | restore the outer boundary to the surface's natural bounds: a free-form surface's own, an analytic surface's span of the face |
| in_place | bool | No | untrim a surface body's face where it is; a solid's face is always copied out |
Automation details
Command ID: surface.untrim
Parameters:
face: {body, point}; holes?: all|[[x,y,z]] (points on the inner loops to remove; default: all); outer?: bool (restore the outer boundary to the surface's natural bounds: a free-form surface's own, an analytic surface's span of the face); in_place?: bool (untrim a surface body's face where it is; a solid's face is always copied out). A surface body; the face keeps its name
Unstitch
Command group: SURFACE › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | Yes | ||
| faces | [[x,y,z]] | No | points on the faces to take out, each its own surface body; the rest stay together under the body's name; default: every face its own surface body |
Automation details
Command ID: surface.unstitch
Parameters:
body; faces?: [[x,y,z]] (points on the faces to take out, each its own surface body; the rest stay together under the body's name; default: every face its own surface body). A solid comes apart into surfaces
Reverse Normal
Command group: SURFACE › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | Yes | a surface | |
| faces | [[x,y,z]] | No | points on the faces to turn over; default: all of them |
Automation details
Command ID: surface.reverse_normal
Parameters:
body (a surface); faces?: [[x,y,z]] (points on the faces to turn over; default: all of them)
Fair Surface
Command group: SURFACE › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | surface name | Yes | |
| faces | [[x,y,z]] points on the faces to fair | No | default: every face |
| strength | number | No | 0..1 of the full fairing step, default 1 |
| iterations | number | No | 1..1000 steps, default 1 |
| keep_edges | bool | No | default true: hold the boundary row and the row next to it, so a face keeps meeting its neighbours in position and in tangent |
| name | No |
Automation details
Command ID: surface.fair
Parameters:
body: surface name; faces?: [[x,y,z]] points on the faces to fair (default: every face); strength?: number (0..1 of the full fairing step, default 1); iterations?: number (1..1000 steps, default 1); keep_edges?: bool (default true: hold the boundary row and the row next to it, so a face keeps meeting its neighbours in position and in tangent); tolerance?: expr mm (how far a control vertex may move, default 0.001 of the body's size). Moves the interior control vertices of each B-spline face to flatten its curvature variation while the boundary stays put: the face keeps its edges and the body its shape within the tolerance, and the warning in the reply carries the energy before and after; name?
Surface Fillet
Command group: SURFACE › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| planned | a | Yes | |
| b | {body, point} | Yes | two faces of separate bodies that meet or cross; the points pick the side the ball rolls on |
| radius | expr | Yes | |
| trim | both|first|none | No |
Automation details
Command ID: surface.fillet
Parameters:
planned: a, b: {body, point} (two faces of separate bodies that meet or cross; the points pick the side the ball rolls on); radius: expr; trim?: both|first|none
Match Surface
Command group: SURFACE › MODIFY
Read the solid features guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | surface name | Yes | the body whose face is rebuilt |
| faces | [[x,y,z]] | No | points on that face, default: the body's first |
| target | body name | Yes | the body the seam must meet |
| edges | [[x,y,z]] | Yes | points on one edge chain of the target: the rebuilt boundary takes its place |
| order | g1|g2|g3 | No | default g2: position and tangent plane, the curvature too, or how that curvature changes along the seam |
Automation details
Command ID: surface.match
Parameters:
body: surface name (the body whose face is rebuilt); faces?: [[x,y,z]] (points on that face, default: the body's first); target: body name (the body the seam must meet); edges: [[x,y,z]] (points on one edge chain of the target: the rebuilt boundary takes its place); order?: g1|g2|g3 (default g2: position and tangent plane, the curvature too, or how that curvature changes along the seam). The far boundary stays where it was and the body keeps its name
SHEET METAL › CREATE
Flange
Command group: SHEET METAL › CREATE
Create a sheet metal base, bend an existing edge into a wall, or build a contour from an open sketch. The sheet metal rule supplies the material thickness and bend settings so the folded and flat versions describe the same part.
Before you start
| Flange type | What you need to select | Result |
|---|---|---|
| Base | A closed region in a finished sketch. | A new flat sheet metal body. |
| Edge | One or more supported edges of an existing sheet metal body. | Bent walls along those edges. A sketch is not required for this mode. |
| Contour | An open chain of straight sketch lines. | A sheet following that outline, extended by the chosen distance. |
Choose or create a Sheet Metal Rule before building the part. To work from an ordinary solid plate, use Convert to Sheet Metal first. An arbitrary solid edge does not become a sheet metal edge just by selecting Flange.
Options
| Choice | Meaning |
|---|---|
| Type | Base, Edge or Contour. The selection determines which input is appropriate. |
| Rule | Sets thickness, bend radius, K-factor and the gaps/reliefs that keep bends manufacturable. Change thickness in the rule, not as a flange height. |
| Height | Sets the edge flange’s height. Check the height reference and preview when matching a drawing dimension. |
| Angle | Sets how far the edge bends; 90° makes a right-angle wall. |
| Per-edge angle and height | Lets selected edges in one feature have different dimensions. Empty values use the common setting. |
| Position | Places the flange relative to the selected edge. The preview shows which material remains inside or outside the original outline. |
| Flip | Bends toward the other side of the sheet. |
| Corner Relief Shape and size | Use the rule’s setting or override relief between edge flanges of this feature. These overrides are not available for base or contour flanges. |
| Distance | Sets the length of a contour flange’s extrusion along the open sketch. |
Try it: two sides of a tray
- Set a sheet rule with 1.5 mm thickness and 1.5 mm bend radius.
- Draw and finish an 80 × 50 mm rectangular sketch.
- Choose Flange, select the rectangle’s region and make a Base flange.
- Choose Flange again, select an edge and set its height to 20 mm.
- Add another 20 mm flange on the opposite edge. Check the bend directions before confirming each feature.
- Use Create Flat Pattern to inspect the developed part and bend lines.
Tips and common mistakes
- Do use one edge flange feature for adjoining walls whose shared corners should close together. Flanges made as separate features keep their own ends.
- Do inspect warnings and the flat pattern; a relief that cannot fit may be left out with a warning.
- Don’t confuse height with sheet thickness. The rule owns thickness.
- Don’t select a sketch point for an edge flange: choose an edge of the sheet. For a base flange, select a closed sketch region instead.
Examples and community resources
| Resource | What to explore | Author and licence |
|---|---|---|
| Editable sheet metal demo | The rule, base sketch and two edge flanges used in this illustration. | SolidCraft contributors; MIT OR Apache-2.0. |
Contribute a tip, demo, model or screenshot, explaining the edge or region that must be selected.
See also
Hem returns an edge back toward the sheet. Fold bends a sheet along a chosen line. Sheet Metal Rules controls thickness and bend settings. Create Flat Pattern shows the developed part.
| Parameter | Type | Required | Description |
|---|---|---|---|
| base | sketch + profiles? | Yes | rule?, flip? |
| contour | sketch + curves | Yes | open chain of lines and tangent arcs |
| angle | No | default 90 deg | |
| radius | No | default: rule | |
| height_from | outer|inner|tangent | No | where the height is measured from: the outer virtual sharp (default), the inner virtual sharp, or past 90 deg the line square to the flange touching the bend's outside (tangent; up to 90 deg the outer sharp) |
| position | inside|outside|middle|material_outside|tangent | No | where the bend starts: the outer virtual sharp on the edge (default), the bend starting at the edge (bend_outside is the same), half way, the inner virtual sharp on the edge, or the bend's outer face tangent to the edge's face (below 90 deg the bend's end on that face) |
| flip | No | ||
| body | No | ||
| corner_relief_shape | notch|round|rectangular|tear and corner_relief? | No | size across |
| type | base|edge|contour | No | default from the inputs |
Automation details
Command ID: sheet.flange
Parameters:
base: sketch + profiles? (rule?, flip?) | contour: sketch + curves (open chain of lines and tangent arcs) + distance (rule?, flip?, reverse?) | edge: edges: [[x,y,z] on top/bottom edges, or {point: [x,y,z], angle?, height?, segments?} for an edge with its own angle and height, or split into 1…64 segments [{from, to, angle?, height?, flip?}] that tile the stretch the sheet still has there (from, to are fractions 0…1 of it, first from 0, last to 1; consecutive segments that match make one bend)] + height (along the flange, to its far edge), angle? (default 90 deg), radius? (default: rule), height_from?: outer|inner|tangent (where the height is measured from: the outer virtual sharp (default), the inner virtual sharp, or past 90 deg the line square to the flange touching the bend's outside (tangent; up to 90 deg the outer sharp)), position?: inside|outside|middle|material_outside|tangent (where the bend starts: the outer virtual sharp on the edge (default), the bend starting at the edge (bend_outside is the same), half way, the inner virtual sharp on the edge, or the bend's outer face tangent to the edge's face (below 90 deg the bend's end on that face)), flip?, body?, corner_relief_shape?: notch|round|rectangular|tear and corner_relief? (size across): the relief at the corners these flanges make (default: the rule's); then?: [{angle?, height, flip?}] further bends (at most 16), each a flange on the far edge of the one before, flip: true turns that bend the other way (edge only); type?: base|edge|contour (default from the inputs); name?, body_name? (the new body). Thickness, K-factor and bend radius come from the rule (sheet.manage_rules); passing them here is refused, and so is the corner relief on a base or contour flange
Path Flange
Command group: SHEET METAL › CREATE
Read the sheet metal guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| edge | [x,y,z] on a top or bottom edge of the sheet | Yes | |
| radius | No | default: rule |
Automation details
Command ID: sheet.path_flange
Parameters:
edge: [x,y,z] on a top or bottom edge of the sheet; sketch + curves: an open chain of sketch lines drawn on a plane across that edge, from the edge out (each line one flange as long as the line, to the outer face from the virtual sharp; each corner one bend, turning the way the lines turn); radius? (default: rule); body?. One feature, one body
Perforate
Command group: SHEET METAL › CREATE
Read the sheet metal guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| diameter | expr | Yes | |
| pitch | expr | Yes | |
| margin | expr | No | clear of edges, cut-outs, bends and the outline; default: the diameter |
| pattern | staggered| square | No | 60°, default |
| body | No |
Automation details
Command ID: sheet.perforate
Parameters:
diameter, pitch: expr; margin?: expr (clear of edges, cut-outs, bends and the outline; default: the diameter); pattern?: staggered (60°, default) | square; body?; sketch? + profiles? (the outline: closed profiles of a sketch on a face of the sheet; holes only inside them, out of their inner loops) - a perforation field over the whole flat sheet or inside the outline: holes in the flat pattern (perforations), the DXF (layer PERFORATION) and the measured volume, not cut into the B-rep (#732)
Hem
Command group: SHEET METAL › CREATE
Fold a sheet metal edge back through a half turn to form a return. Use a hem when you need a doubled-over edge, rather than an upright wall.
Before you start
- You need an existing sheet metal body and a supported free sheet edge. Make a base flange or convert a suitable solid plate first.
- Select the edge, not a sketch line, face or point. Hem does not require a new sketch. A bend along a line inside the sheet uses Fold instead.
- Leave room for the return so it does not run into another wall or return.
Options
| Choice | Meaning |
|---|---|
| Edges | The sheet edges to turn back. Check that the preview changes the intended edge. |
| Length | The return’s length, measured to its outer face. It is not the thickness of the sheet. |
| Gap | Controls the inner radius of the return bend. Leave it empty to use the sheet rule’s hem setting. |
| Flip | Turns the return toward the other side of the sheet. |
Try it: a returned edge
- Create an 80 × 50 mm base flange in 1.5 mm sheet.
- Choose Hem and select a free 80 mm edge of the sheet.
- Set Length to 8 mm and Gap to 1.5 mm.
- Check which side receives the return; use Flip if necessary, then confirm.
- Inspect Create Flat Pattern to see the material needed for the bend.
Tips and common mistakes
- Do check the bend in the preview: an edge returning toward another feature needs enough clearance.
- Don’t draw a sketch line to tell Hem where to bend. Its input is an existing sheet edge; use Fold for a bend line through a panel.
- Don’t use Hem for an ordinary right-angle wall. That is an edge Flange.
Examples and community resources
| Resource | What to explore | Author and licence |
|---|---|---|
| Editable hem demo | The sheet rule, base flange and 8 mm return used in this illustration. | SolidCraft contributors; MIT OR Apache-2.0. |
Contribute a tip, demo, model or screenshot, explaining the selected edge and dimensions.
See also
Flange makes a base sheet or an angled wall. Fold bends along a line in the sheet. Sheet Metal Rules sets the default hem gap. Create Flat Pattern shows the developed part and bend lines.
| Parameter | Type | Required | Description |
|---|---|---|---|
| edges | [[x,y,z] on sheet edges] | Yes | |
| length | Yes | to the outer face | |
| gap | No | inner radius, default: rule | |
| flip | No | ||
| body | No |
Automation details
Command ID: sheet.hem
Parameters:
edges: [[x,y,z] on sheet edges]; length (to the outer face); gap? (inner radius, default: rule); flip?; body?
Fold
Command group: SHEET METAL › CREATE
Read the sheet metal guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| line | sketch + curve | Yes | a sketch line on the sheet's base face; followed when the sketch changes |
| points | [[x,y,z], [x,y,z]] | Yes | |
| angle | No | default 90 deg | |
| radius | No | default: rule | |
| position | centerline|start|end|mould | No | where the line sits in the bend, default centerline |
| fixed | [x,y,z] on the side that stays | No | default: the larger side |
| flip | No | fold the other way | |
| body | No |
Automation details
Command ID: sheet.fold
Parameters:
line: sketch + curve (a sketch line on the sheet's base face; followed when the sketch changes) or points: [[x,y,z], [x,y,z]]; angle? (default 90 deg); radius? (default: rule); position?: centerline|start|end|mould (where the line sits in the bend, default centerline); fixed?: [x,y,z] on the side that stays (default: the larger side); flip? (fold the other way); body?
Convert to Sheet Metal
Command group: SHEET METAL › CREATE
Read the sheet metal guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | Yes | ||
| rule | No | ||
| bends | [[x,y,z] on sharp edges] | No | a solid or a shelled body: `face` is the fixed face and the flat faces reached from it across these edges become the sheet; a shell keeps its thickness, a solid takes the rule's inward; edges between two of those faces that are no bends are cut open with the rule's gap; a point in the middle of a chamfer between two faces, or on a bend modelled with its radius (a cylinder between two flat faces tangent to it, either skin), makes it one bend of the rule's radius at their virtual sharp; the faces' holes become cut-outs and their engravings, up to half the thickness deep, pockets |
Automation details
Command ID: sheet.convert
Parameters:
body; face: [x,y,z] on its large flat face (a plate of even thickness; recesses in one face up to half the thickness deep, such as an engraved label, become pockets of the sheet), or that face's name from model.faces; rule?; bends?: [[x,y,z] on sharp edges] (a solid or a shelled body: `face` is the fixed face and the flat faces reached from it across these edges become the sheet; a shell keeps its thickness, a solid takes the rule's inward; edges between two of those faces that are no bends are cut open with the rule's gap; a point in the middle of a chamfer between two faces, or on a bend modelled with its radius (a cylinder between two flat faces tangent to it, either skin), makes it one bend of the rule's radius at their virtual sharp; the faces' holes become cut-outs and their engravings, up to half the thickness deep, pockets)
Create Flat Pattern
Command group: SHEET METAL › CREATE
Read the sheet metal guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | No |
Automation details
Command ID: sheet.flat_pattern
Parameters:
body? → flat size, outline loops and cut-outs (flat coordinates, as point lists), cutout_shapes (the same cut-outs exactly, in the same order: {circle: {center, radius}} for a round hole, else {segments: [{line: [a, b]} | {arc: {center, radius, start_deg, sweep_deg}} | {polyline: [...]}]}), pockets (with their own cutout_shapes), bend lines and the bend table
SHEET METAL › MODIFY
Unfold
Command group: SHEET METAL › MODIFY
Read the sheet metal guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | No | default: the last sheet body |
Automation details
Command ID: sheet.unfold
Parameters:
body? (default: the last sheet body) — all bends
Refold
Command group: SHEET METAL › MODIFY
Read the sheet metal guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | No | default: the last unfolded sheet |
Automation details
Command ID: sheet.refold
Parameters:
body? (default: the last unfolded sheet)
Sheet Metal Rules
Command group: SHEET METAL › MODIFY
Read the sheet metal guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | new or existing | |
| thickness | No | ||
| k_factor | No | ||
| bend_radius | No | ||
| relief_width | No | ||
| relief_depth | No | ||
| corner_relief | No | ||
| hem_gap | No | ||
| gap | No | expressions; `Thickness` is the rule's; gap: between flanges that meet at a corner, whose ends are closed toward each other at any angle | |
| corner_relief_shape | notch|round|rectangular|tear | No | what is cut where two bends meet at a corner of the base: round and rectangular a relief `corner_relief` across; tear none, each bend's end is cut straight from the corner to its flange's end; default notch |
| angle_display | bend|included | No | how the DXF bend notes read the bend angles: the bend angle, default, or the included angle left between the bend's sides, 180° less it; the bend table gives both, and a flange's `angle` is always the bend angle |
| active | bool | No | |
| delete | bool | No |
Automation details
Command ID: sheet.manage_rules
Parameters:
name (new or existing); thickness?, k_factor?, bend_radius?, relief_width?, relief_depth?, corner_relief?, hem_gap?, gap? (expressions; `Thickness` is the rule's; gap: between flanges that meet at a corner, whose ends are closed toward each other at any angle); corner_relief_shape?: notch|round|rectangular|tear (what is cut where two bends meet at a corner of the base: round and rectangular a relief `corner_relief` across; tear none, each bend's end is cut straight from the corner to its flange's end; default notch); angle_display?: bend|included (how the DXF bend notes read the bend angles: the bend angle, default, or the included angle left between the bend's sides, 180° less it; the bend table gives both, and a flange's `angle` is always the bend angle); active?: bool; delete?: bool
WELDMENTS › CREATE
Frame Member
Command group: WELDMENTS › CREATE
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | the frame sketch | Yes | id or name; 2D or 3D |
| lines | [curve ids] | No | one member each; default: every straight line drawn in the sketch: not construction, not projected or otherwise linked, not of no length |
| anchor | origin|center|centroid|top_left|top|top_right|left|right|bottom_left|bottom|bottom_right | No | the profile point that sits on each line, default origin |
| locate | [x,y] | No | the profile point that sits on each line, in mm from the profile's own origin: a bar's or an angle's bottom-left corner, a channel's web back at mid-height, the centre of other profiles; takes precedence over `anchor` and keeps the member attached at that point when the profile size changes |
| angle | angle expr | No | the profile turned about the line; default 0: its y as near world up as the line allows, a vertical member's x along world X |
| mirror | bool | No | the profile mirrored across its y axis |
| name | No | ||
| body_name | No | what the members are named after, then numbered: `Rail`, `Rail (2)`…; default the size's name, `RSC 203x89`, the profile's description, `Rect Tube 40x40x3`, or the profile sketch's name |
Automation details
Command ID: frame.member
Parameters:
sketch: the frame sketch (id or name; 2D or 3D); lines?: [curve ids] (one member each; default: every straight line drawn in the sketch: not construction, not projected or otherwise linked, not of no length); profile: {kind: bar|round_bar|rect_tube|round_tube|angle|channel|i_beam, …its dimensions: each a number in the design's units or a length expression over its parameters ("tube_wall", "2 in"); a channel's flange_slope is an angle (a number of degrees)} (frame.profile.list gives each kind's dimensions and an example; dimensions left out take defaults from the profile's size) | {size: a standard steel size by name, such as "RSC 203x89", "PFC 200x90x30", "RSA 50x50x5", "SHS 100x100x5", "RHS 200x100x6.3" or "CHS 42.4x3.2" (frame.profile.list lists them), alone: it brings its dimensions} | profile_sketch: a sketch whose profile is the section, in its own x and y around its origin, with profiles?: picks as solid.extrude takes them (default: its material, nested loops alternating, so two circles make a tube); anchor?: origin|center|centroid|top_left|top|top_right|left|right|bottom_left|bottom|bottom_right (the profile point that sits on each line, default origin); locate?: [x,y] (the profile point that sits on each line, in mm from the profile's own origin: a bar's or an angle's bottom-left corner, a channel's web back at mid-height, the centre of other profiles; takes precedence over `anchor` and keeps the member attached at that point when the profile size changes); angle?: angle expr (the profile turned about the line; default 0: its y as near world up as the line allows, a vertical member's x along world X); mirror?: bool (the profile mirrored across its y axis); name?; body_name? (what the members are named after, then numbered: `Rail`, `Rail (2)`…; default the size's name, `RSC 203x89`, the profile's description, `Rect Tube 40x40x3`, or the profile sketch's name); names?: {line id: name} (names to keep, as Edit Feature keeps them). One body per line, from its start to its end; each member keeps its name when other lines are added or deleted. Returns the feature and the bodies it made
End Cap
Command group: WELDMENTS › CREATE
| Parameter | Type | Required | Description |
|---|---|---|---|
| thickness | length in design units or a parameter expression | Yes | |
| ratio | the inset as a share of the thickness | No | give offset or ratio, not both; neither: the plate is flush with the outside of the profile |
| chamfer | corner chamfer length along each edge from the corner | No | default 0; a rounded corner needs at least its rounding |
Automation details
Command ID: frame.end_cap
Parameters:
faces: [{face:[x,y,z],body,index,path?}] planar end faces of frame members, picked in world mm (1–256); thickness: length in design units or a parameter expression; offset?: inset of the plate from the outside of the profile, a length; ratio?: the inset as a share of the thickness (give offset or ratio, not both; neither: the plate is flush with the outside of the profile); chamfer?: corner chamfer length along each edge from the corner (default 0; a rounded corner needs at least its rounding); direction?: outward|inward (default outward: past the end; inward: the member is cut back by the thickness and the cap takes its place). One separate body per face, named `<member> End Cap`; the plate is the profile's outer outline on a closed section (tube, pipe, bar), its outside on an open one (angle, channel, beam, slotted extrusion): the edges on the rectangle round the profile with their rounds and chamfers, inward stretches closed along the rectangle. Common name/body_names fields supported.
PLASTIC › CREATE
Boss
Command group: PLASTIC › CREATE
Read the plastic parts guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| position | [x,y,z] on a face | Yes | |
| direction | No | default: out of the face | |
| diameter | Yes | ||
| height | Yes | ||
| hole_diameter | No | ||
| hole_depth | No | default: to the face | |
| draft | No | angle | |
| fillet | No | root radius | |
| ribs | No | count | |
| rib_thickness | No | ||
| rib_length | No | out from the wall | |
| rib_offset | No | below the top | |
| body | No |
Automation details
Command ID: plastic.boss
Parameters:
position: [x,y,z] on a face; direction? (default: out of the face); diameter, height; hole_diameter?, hole_depth? (default: to the face); draft? (angle), fillet? (root radius); ribs? (count), rib_thickness?, rib_length? (out from the wall), rib_offset? (below the top); body?
Lip
Command group: PLASTIC › CREATE
Read the plastic parts guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| face | [x,y,z] on the rim face of a shelled body | Yes | |
| width | Yes | ||
| height | Yes | ||
| type | lip|groove | No | |
| gap | No | groove clearance | |
| side | inside|outside | No | which rim edge |
| body | No |
Automation details
Command ID: plastic.lip
Parameters:
face: [x,y,z] on the rim face of a shelled body; width, height; type?: lip|groove; gap? (groove clearance); side?: inside|outside (which rim edge); body?
Snap Fit
Command group: PLASTIC › CREATE
Read the plastic parts guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| position | [x,y,z] on a face | Yes | |
| direction | No | default: out of the face | |
| hook | [x,y,z] | Yes | the catch's direction |
| length | Yes | ||
| thickness | Yes | ||
| width | Yes | ||
| catch_depth | Yes | ||
| catch_length | Yes | ||
| base_height | No | extends the base below the face | |
| new_body | bool | No | make a separate body instead of joining |
| body | No |
Automation details
Command ID: plastic.snap_fit
Parameters:
position: [x,y,z] on a face; direction? (default: out of the face); hook: [x,y,z] (the catch's direction); length, thickness, width, catch_depth, catch_length; base_height? (extends the base below the face); new_body?: bool (make a separate body instead of joining); body?
Rest
Command group: PLASTIC › CREATE
Read the plastic parts guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| position | [x,y,z] on a face | Yes | the rest's centre |
| direction | No | default: out of the face | |
| width | Yes | round: the diameter | |
| length | No | a rectangle, along `along` | |
| along | [x,y,z] | No | |
| height | Yes | ||
| draft | No | angle; default: the body's plastic rule | |
| thickness | No | wall of a hollow rest | |
| body | No |
Automation details
Command ID: plastic.rest
Parameters:
position: [x,y,z] on a face (the rest's centre); direction? (default: out of the face); width (round: the diameter); length? (a rectangle, along `along`); along?: [x,y,z]; height; draft? (angle; default: the body's plastic rule); thickness? (wall of a hollow rest); body?
PLASTIC › SETUP
Manage Plastic Rules
Command group: PLASTIC › SETUP
Read the plastic parts guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | library or new rule; a new one starts from `from`, default ABS (1.5mm) | |
| from | No | ||
| material | No | ||
| thickness | No | ||
| nominal_radius | No | ||
| clearance | No | ||
| knife_edge | No | ||
| reveal_height | No | ||
| thickness_variation | No | ||
| draft | No | ||
| max_thickness | No | ||
| min_thickness | No | ||
| min_draft | No | expressions; `Thickness` is the rule's | |
| active | bool | No | rule for bodies without one |
| delete | bool | No | a design rule; a library rule goes back to the library values |
Automation details
Command ID: plastic.manage_rules
Parameters:
name (library or new rule; a new one starts from `from`, default ABS (1.5mm)); from?; material?; thickness?, nominal_radius?, clearance?, knife_edge?, reveal_height?, thickness_variation?, draft?, max_thickness?, min_thickness?, min_draft? (expressions; `Thickness` is the rule's); active?: bool (rule for bodies without one); delete?: bool (a design rule; a library rule goes back to the library values)
Assign Plastic Rule
Command group: PLASTIC › SETUP
Read the plastic parts guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | Yes | |
| rule | name | Yes | empty: no rule |
Automation details
Command ID: plastic.assign_rule
Parameters:
bodies: [names]; rule: name (empty: no rule) — plastic features on these bodies take its draft and clearance as defaults
Other commands: sketch
Edit Sketch
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | id or name | Yes | |
| restore_marker | nonnegative timeline position | No | |
| null | Yes | end |
Automation details
Command ID: sketch.edit
Parameters:
sketch: id or name; restore_marker?: nonnegative timeline position, null (end) or false. A position or null: temporarily roll to this sketch and restore that position on Finish or Cancel; Finish groups the edit into one Undo step. Omitted: the same with the current position when features come after the sketch, so they rebuild once at Finish rather than after every sketch command. false: leave the timeline in place (later features rebuild after every sketch command)
Draw Dimensioned Sketch Geometry
Automation details
Command ID: sketch.draw.dimensioned
Parameters:
command: sketch creation command, params: object, dimensions: object of role to numeric or expression value, or `name = expression` (also `#name = expression`), which defines the user parameter `name` as sketch.dimension does (the reply's `defined` lists the names) (optional with as_drawn or locate), as_drawn?: bool (also dimension every other role of the shape at its size as drawn; a radius or diameter given takes the place of the other, as an edge polygon's side length does its radius, a circle otherwise takes its diameter, and a size the sketch already determines, such as the angle of a line inferred horizontal, is left out), locate?: bool (then place the shape from the sketch origin until nothing of it is left free: horizontal and vertical distances from the origin to its points, centres first, each kept only where it removes freedom, so a shape anchored to the origin or to placed geometry gets none; a point on an axis goes onto that axis instead of a 0 distance; the reply's located lists them); creates geometry and all driving dimensions atomically in one undo step. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Delete Sketch Entities
| Parameter | Type | Required | Description |
|---|---|---|---|
| entities | [curve, point or constraint ids] | Yes |
Automation details
Command ID: sketch.delete
Parameters:
entities: [curve, point or constraint ids]
Drag Sketch Point
| Parameter | Type | Required | Description |
|---|---|---|---|
| point | ref | Yes | |
| to | [x,y] | Yes |
Automation details
Command ID: sketch.move_point
Parameters:
point: ref, to: [x,y]
Move Sketch Points
| Parameter | Type | Required | Description |
|---|---|---|---|
| moves | [{point: ref | near: [x,y], to: [x,y]}] | Yes | each point to its own target; `near`: the sketch point closest to it, refused when none lies within `tolerance` or two are as close |
| tolerance | mm | No | default 0.1 |
| sketch | No |
Automation details
Command ID: sketch.move_points
Parameters:
moves: [{point: ref | near: [x,y], to: [x,y]}] (each point to its own target; `near`: the sketch point closest to it, refused when none lies within `tolerance` or two are as close), tolerance?: mm (default 0.1); sketch? → moved: [{point, to, at, reached}] (`at`: where it ended up after the one solve; `reached`: whether that is `to`)
Drag Sketch Geometry
Automation details
Command ID: sketch.drag
Parameters:
entity: point or curve, from: [x,y] where it was grabbed, to: [x,y], live?: bool: points and the material point grabbed on a line move toward `to` within the design constraints. When exact placement is impossible, bounded feasible steps minimize cursor distance. Splines slide by to - from; a circle or arc grabbed on its edge takes the radius to `to`. `with?`: [point or curve ids] moves the rest of a selection with the entity as one translation (circles keep their radii). Long moves retain the solution branch; arcs cannot sweep through their starts. Returns `reached`: progress projected onto the requested move (0..1), `at`: the grabbed position for the next frame, and `retry`: budget-limited progress can continue in another frame. `live: true` shares a work budget across held-solve decomposition and cursor correction; ordinary recovery and the final model evaluation retain their existing limits, not a wall-clock deadline. Later features stay stale until `sketch.drag_end`; `dof` stays from before the drag
End Sketch Drag
Automation details
Command ID: sketch.drag_end
Parameters:
constraint?: {command: a sketch.constraint.* id, params}: ends a drag made of `sketch.drag` `live: true` frames: adds the constraint it let go on (not kept if it over-constrains the sketch), then evaluates the whole model once; returns the constraint's result and the sketch's solved state and degrees of freedom
Move Dimension Text
| Parameter | Type | Required | Description |
|---|---|---|---|
| dimension | constraint id or parameter name | Yes | |
| at | [x,y] text centre | Yes | sketch coordinates |
| reset | true | Yes | default place |
Automation details
Command ID: sketch.dimension_text
Parameters:
dimension: constraint id or parameter name; at: [x,y] text centre (sketch coordinates) | reset: true (default place)
Sketch Palette Options
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | id|name | No | default active |
Automation details
Command ID: sketch.options
Parameters:
sketch?: id|name (default active); any of show_profile, show_points, show_dimensions, show_constraints, show_projected, show_construction, grid, snap, slice, sketch_3d: bool. Returns them all
Chain
| Parameter | Type | Required | Description |
|---|---|---|---|
| curve | id: the curves joined to it end to end | Yes | what a double-click selects |
Automation details
Command ID: sketch.chain
Parameters:
curve: id: the curves joined to it end to end (what a double-click selects)
Solve Sketch
Automation details
Command ID: sketch.solve
Parameters:
reports the solver status and degrees of freedom
Add Spline Point
Automation details
Command ID: sketch.spline.insert_point
Parameters:
curve: fit point spline id, at: [x,y]: a fit point is inserted where the curve passes nearest to it, between its neighbours (the curve still runs through it and all its old points; constraints on them stay); end?: start|end: `at` becomes the spline's new first or last point instead, and the curve runs on to it (refused when that end is joined to other geometry). Control point splines take no new points yet. Returns point: the new point's id
Remove Spline Point
Automation details
Command ID: sketch.spline.remove_point
Parameters:
curve: spline id, point: one of its points (a point id, or the curve's start or end such as s1.end): the spline runs through (or over) its other points only, and the point goes with the constraints on it unless another curve uses it. Fit point, control point and closed splines. Refused for a closed spline's closing point, for an end joined to other geometry or held by a constraint, when fewer than 2 points would be left (3 on a closed spline), and for a projected, offset or patterned spline. Returns curve, point: the point's id, deleted: whether the point went too
Add Tangent Handles
Automation details
Command ID: sketch.spline.handles
Parameters:
curve: fit point spline id: gives it a tangent handle at each fit point (a free point joined to it by a construction line) where the curve already runs, so its shape does not change until a handle is moved; moving a fit point moves the handles nobody has turned with it. In the app a selected spline shows its handles and the first drag of one adds them. Refused for a spline that has handles already, a control point, projected, offset, patterned or equation spline. Returns curve, handles: the handle point ids in fit point order
Reset Tangent Handles
Automation details
Command ID: sketch.spline.reset_handles
Parameters:
curve: fit point spline id: removes its tangent handles (the handle points, their construction lines and the constraints on them), so the curve runs through its fit points as if the handles had never been moved; selected, it shows them again where they start. Refused for a spline without tangent handles. Returns curve, removed: the removed handle point ids in fit point order
Reverse Spline Direction
| Parameter | Type | Required | Description |
|---|---|---|---|
| curve | spline id | Yes | fit point, control point or closed |
Automation details
Command ID: sketch.spline.reverse
Parameters:
curve: spline id (fit point, control point or closed): its last point becomes its first and the curve runs the other way along the same path; its points and the constraints on them stay. Refused for a projected spline and for one an offset uses or makes. Returns curve
Infinite Line
| Parameter | Type | Required | Description |
|---|---|---|---|
| curves | [line ids] | Yes | |
| value | bool | No | default toggles |
Automation details
Command ID: sketch.infinite
Parameters:
curves: [line ids], value?: bool (default toggles): infinite line type (#1359): construction geometry drawn across the whole view through the line's two points; off, a normal line
Edit Text
| Parameter | Type | Required | Description |
|---|---|---|---|
| live | bool: one frame of an interactive change | No | the sketch is solved, the features after it stay as they were until `sketch.drag_end` |
Automation details
Command ID: sketch.edit_text
Parameters:
link: the text's link id (or entity: one of its curves), text? or text_expression? (as in sketch.text; typed words replace the expression), at?, height?, angle?: deg (numbers or expressions as in sketch.text; a number replaces an expression, and so does moving the text), font?: family or file path (empty: the built-in font), bold?, italic?: bool (an installed family's bold or italic face; italic without one is slanted), align?: left|center|right (the lines against `at`, or along the path), vertical_align?: baseline|top|middle|bottom (the block of lines against `at` or the path: the first line's baseline (default), its capitals' tops, halfway between those and the last line's baseline, or the bottom of the last line's descenders), letter_spacing?: extra mm between letters, line_spacing?: times the font's line distance (default 1), path?: a curve id of the sketch the baseline follows ("": none; `at` and `angle` then do not place the text; the curve becomes construction, a guide the letters stand on), reverse?: bool (the other way along the path) (each kept when left out); or edits: [{link or entity, text?, at?, …}]: several texts changed together, the design rebuilt once (all or nothing; returns edits: each one's result); live?: bool: one frame of an interactive change (the sketch is solved, the features after it stay as they were until `sketch.drag_end`). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Edit Equation Curve
| Parameter | Type | Required | Description |
|---|---|---|---|
| curve | an equation curve's id | Yes |
Automation details
Command ID: sketch.equation_curve.edit
Parameters:
curve: an equation curve's id; x?, y?, explicit?, start?, end?, tolerance?, variable_unit?: as in sketch.equation_curve, each kept when left out (explicit: true drops x; false needs x). The points are chosen again for the new formulas; the curve's start point (and the end point of an open curve) keeps its id, so geometry joined there stays joined. Returns curve, points, closed, deviation
Toggle Driven Dimension
| Parameter | Type | Required | Description |
|---|---|---|---|
| constraint | dimension id | Yes | |
| driven | bool | No | default toggles |
Automation details
Command ID: sketch.toggle_driven
Parameters:
constraint: dimension id, driven?: bool (default toggles); a driving dimension gets a parameter with its current value
Toggle Radius / Diameter
| Parameter | Type | Required | Description |
|---|---|---|---|
| constraint | a circle's or an arc's radius or diameter dimension id | Yes | |
| diameter | bool | No | default: the other one |
| sketch | id|name | No | default: the one being edited |
Automation details
Command ID: sketch.toggle_diameter
Parameters:
constraint: a circle's or an arc's radius or diameter dimension id; diameter?: bool (default: the other one); sketch?: id|name (default: the one being edited). The circle stays the same size: its parameter is halved or doubled (a plain value is rewritten, an expression becomes `(e) / 2` or `2 * (e)`); refused when anything else uses that parameter
Constraint Glyphs
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | id | No | |
| name | every constraint with where to draw its glyph | Yes | sketch coordinates |
Automation details
Command ID: sketch.glyphs
Parameters:
sketch?: id|name: every constraint with where to draw its glyph (sketch coordinates)
Snap Inference
| Parameter | Type | Required | Description |
|---|---|---|---|
| at | [x,y] | Yes | |
| from | [x,y] | No | previous click |
| radius | mm | No | snap distance, default 1 |
Automation details
Command ID: sketch.snap
Parameters:
at: [x,y], from?: [x,y] (previous click), radius?: mm (snap distance, default 1): what a click there would snap to and infer
Drawing Size
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | SVG or DXF | Yes | by `format`: "svg" | "dxf", default by the file name, else SVG |
| text | SVG or DXF | Yes | by `format`: "svg" | "dxf", default by the file name, else SVG |
Automation details
Command ID: sketch.drawing_bounds
Parameters:
path | text: SVG or DXF (by `format`: "svg" | "dxf", default by the file name, else SVG); returns min, max, width and height of the drawn geometry in the file's own size, and for an SVG with a viewBox (or width and height) its sheet: {min, max, width, height}
Save As DXF
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | id|name | No | default active |
| path | file to write | No | else the DXF text is returned |
| units | "design" | "in" | "inch" | "mm" | "cm" | "m" | "ft" | No | default mm |
| layer | profile layer name | No | default "0" |
| layers | "single" | "roles" | No | default "single": all on `layer`; "roles": outer on "OUTLINE", holes on "CUT" |
| join | bool | No | default false: R12 LINE/ARC; true: closed loops as LWPOLYLINE with arc bulges |
Automation details
Command ID: sketch.export_dxf
Parameters:
sketch?: id|name (default active); path?: file to write (else the DXF text is returned); units?: "design" | "in" | "inch" | "mm" | "cm" | "m" | "ft" (default mm); layer?: profile layer name (default "0"); layers?: "single" | "roles" (default "single": all on `layer`; "roles": outer on "OUTLINE", holes on "CUT"); join?: bool (default false: R12 LINE/ARC; true: closed loops as LWPOLYLINE with arc bulges)
Loose Ends
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | id|name | No | default active |
| untied | [{point, curve, at, touches: {point}|{curve}}] ends that touch another curve only by position | Yes | the profile closes now, but nothing keeps it closed when a dimension changes |
Automation details
Command ID: sketch.loose_ends
Parameters:
sketch?: id|name (default active): the ends of profile curves (not construction, projected or text) that can make a profile fail. open: [{point, curve, at}] ends that touch no other profile curve (no profile runs through them); untied: [{point, curve, at, touches: {point}|{curve}}] ends that touch another curve only by position (the profile closes now, but nothing keeps it closed when a dimension changes)
Tie Loose Ends
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | id|name | No | default active |
Automation details
Command ID: sketch.loose_ends.tie
Parameters:
sketch?: id|name (default active); points?: [point ids] (default: every untied end): ties each untied end to what it touches, coincident with another curve's end or on another curve. Returns constraints: [ids added], and the untied ends left
3D Line
Automation details
Command ID: sketch.line3d
Parameters:
points: [[x,y,z]…] world points (2 or more): one 3D line per segment, joined end to end (needs 3D Sketch on). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
3D Spline
| Parameter | Type | Required | Description |
|---|---|---|---|
| points | [[x,y,z]…] world fit points | Yes | 2 or more |
Automation details
Command ID: sketch.spline3d
Parameters:
points: [[x,y,z]…] world fit points (2 or more): a smooth 3D curve through them (needs 3D Sketch on). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
3D Arc
Automation details
Command ID: sketch.arc3d
Parameters:
start, through, end: [x,y,z] world points: an exact circular arc through them, from start through through to end (needs 3D Sketch on). Stored exactly (centre, radius, angles), so path consumers can treat it as a true arc. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
3D Point
| Parameter | Type | Required | Description |
|---|---|---|---|
| point | [x,y,z] world point | Yes | needs 3D Sketch on |
Automation details
Command ID: sketch.point3d
Parameters:
point: [x,y,z] world point (needs 3D Sketch on). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Move 3D Point
| Parameter | Type | Required | Description |
|---|---|---|---|
| wire | drawn 3D curve or point id | Yes | |
| index | fit point | No | default 0 |
| to | [x,y,z] | Yes | |
| by | [dx,dy,dz] | Yes |
Automation details
Command ID: sketch.move3d
Parameters:
wire: drawn 3D curve or point id, index?: fit point (default 0), to: [x,y,z] | by: [dx,dy,dz]; points joined to it move too
Break Offset Association
| Parameter | Type | Required | Description |
|---|---|---|---|
| curve | derived offset curve id | Yes | retains geometry and makes its points editable |
Automation details
Command ID: sketch.offset.break
Parameters:
curve: derived offset curve id (retains geometry and makes its points editable)
Trim Along Path
Automation details
Command ID: sketch.trim.path
Parameters:
points: [[x,y]…] (2…2000 positions: a path drawn across the sketch). Every piece the path crosses is removed as `sketch.trim` removes the piece at that crossing, in the order the path crosses them; a piece crossed again after it is gone is not trimmed twice; eligible single-line offset outputs are trimmed while preserving their distance; projected geometry, infinite lines, other offset outputs and pieces trim refuses are passed over (why in `skipped`). dry_run?: bool (report without changing the design). One undo step → trimmed: [each trim's result], removed: [[[x,y]…]] (each removed piece as a polyline). Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Break Link
| Parameter | Type | Required | Description |
|---|---|---|---|
| link | link id | No | j1 |
| entities | [curve or point ids]: linked geometry becomes normal sketch geometry | No |
Automation details
Command ID: sketch.break_link
Parameters:
link?: link id (j1) | entities?: [curve or point ids]: linked geometry becomes normal sketch geometry
Auto-Project Edges on Reference
| Parameter | Type | Required | Description |
|---|---|---|---|
| value | bool | No | default toggles |
Automation details
Command ID: sketch.auto_project
Parameters:
value?: bool (default toggles): project a face's edges when a sketch is created on it
Redefine Sketch Plane
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | id or name | Yes | |
| plane | as sketch.create | Yes | |
| frame | as sketch.create | No | |
| author_path | exact owner occurrence ids | No |
Automation details
Command ID: sketch.redefine
Parameters:
sketch: id or name; plane: as sketch.create; frame?: as sketch.create; author_path?: exact owner occurrence ids; explicitly rebinds or freezes the plane while preserving geometry and dimension names
Copy Sketch Entities
| Parameter | Type | Required | Description |
|---|---|---|---|
| entities | [curve or point ids] | No | default: the selected sketch geometry |
Automation details
Command ID: sketch.copy
Parameters:
entities?: [curve or point ids] (default: the selected sketch geometry); the constraints and dimensions among them come along
Cut Sketch Entities
Automation details
Command ID: sketch.cut
Parameters:
entities?: [curve or point ids] (default: the selected sketch geometry): copies them as sketch.copy does, then deletes them (one undo step)
Paste Sketch Entities
| Parameter | Type | Required | Description |
|---|---|---|---|
| at | [x, y] | No | sketch point the copy's centre goes to |
| translate | [x, y] | No | |
| sketch | target | No | default: the active sketch |
Automation details
Command ID: sketch.paste
Parameters:
at?: [x, y] (sketch point the copy's centre goes to) | translate?: [x, y]; without either, offset from the original in its own sketch and at the same coordinates in another; sketch?: target (default: the active sketch)
Replace Sketch
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | the sketch to replace | No | default: the active sketch |
| from | the sketch whose contents take its place | Yes | id or name |
Automation details
Command ID: sketch.replace
Parameters:
sketch?: the sketch to replace (default: the active sketch); from: the sketch whose contents take its place (id or name); file?: a design file `from` is in (default: this design). The sketch keeps its plane, place in the timeline and the features built on it; its curves, points, constraints, dimensions and texts become a copy of `from`'s, at the same sketch coordinates (one undo step)
Other commands: canvas
Calibrate Canvas
| Parameter | Type | Required | Description |
|---|---|---|---|
| canvas | id or name | Yes | |
| a | two points on the canvas plane [x,y] | Yes | |
| b | two points on the canvas plane [x,y] | Yes | |
| distance | their true distance | Yes | mm |
Automation details
Command ID: canvas.calibrate
Parameters:
canvas: id or name; a, b: two points on the canvas plane [x,y]; distance: their true distance (mm): scales the image about a
Straighten Canvas
| Parameter | Type | Required | Description |
|---|---|---|---|
| canvas | id or name | Yes | |
| a | two points on the canvas plane [x,y] along a line of the image | Yes | |
| b | two points on the canvas plane [x,y] along a line of the image | Yes |
Automation details
Command ID: canvas.straighten
Parameters:
canvas: id or name; a, b: two points on the canvas plane [x,y] along a line of the image; angle?: deg, the direction that line should have (0 horizontal, the default; 90 vertical): turns the image about a, the shorter way
Delete Canvas
| Parameter | Type | Required | Description |
|---|---|---|---|
| canvas | id or name | Yes |
Automation details
Command ID: canvas.delete
Parameters:
canvas: id or name
Canvas to Sketch
| Parameter | Type | Required | Description |
|---|---|---|---|
| canvas | id or name | No | default: the last canvas |
Automation details
Command ID: canvas.to_sketch
Parameters:
canvas?: id or name (default: the last canvas); name?: the new sketch's name. Traces the canvas image (dark drawing on a light background, or the reverse) into a new sketch on the canvas plane, lying exactly on the image: lines, splines and holes
Other commands: pointcloud
Edit Point Cloud
| Parameter | Type | Required | Description |
|---|---|---|---|
| cloud | id or name | Yes | |
| name | No | ||
| visible | No | ||
| point_size | pixels | No | 0.5…16 |
| color_by | file|single|height or a property's name | No | the file's colours, the default; one colour; a ramp by height, blue low to red high; or by any property of the file, a ramp over its values or a palette for whole numbers |
| color | [r, g, b] 0…1 | No | the single colour; given alone it sets color_by single, null sets color_by file |
| height_range | the same as color_range | No | |
| units | mm|cm|m|in|ft | No | the file's length unit: the points are scaled from the unit they came in as |
| matrix | [12 or 16 numbers] | No | where the cloud sits: a rigid row-major 3x4 or 4x4 matrix, as occurrence.move takes it |
| tolerance | No |
Automation details
Command ID: pointcloud.edit
Parameters:
cloud: id or name; name?; visible?; point_size?: pixels (0.5…16); color_by?: file|single|height or a property's name (the file's colours, the default; one colour; a ramp by height, blue low to red high; or by any property of the file, a ramp over its values or a palette for whole numbers); color?: [r, g, b] 0…1 (the single colour; given alone it sets color_by single, null sets color_by file); color_range?: [low, high] the ramp runs between (design Z in mm by height), or null for the automatic range (by height all but the lowest and highest 2 % of the points; by a property the values it takes over what the filters keep); height_range?: the same as color_range; units?: mm|cm|m|in|ft (the file's length unit: the points are scaled from the unit they came in as); matrix?: [12 or 16 numbers] (where the cloud sits: a rigid row-major 3x4 or 4x4 matrix, as occurrence.move takes it); tolerance?; filters?: [{property, range: [low, high]} or {property, values: [whole numbers]} for a property with named values], or null (only what every filter keeps is shown) → cloud
Reload Point Cloud
| Parameter | Type | Required | Description |
|---|---|---|---|
| cloud | id or name | Yes | its file is read again from where it was inserted; name, placement, units, colouring and the filters on properties it still has are kept; read under the limit it was inserted with, so a file that grew is thinned only past that limit |
Automation details
Command ID: pointcloud.reload
Parameters:
cloud: id or name (its file is read again from where it was inserted; name, placement, units, colouring and the filters on properties it still has are kept; read under the limit it was inserted with, so a file that grew is thinned only past that limit) → cloud, points, segments, triangles, warnings
Delete Point Cloud
| Parameter | Type | Required | Description |
|---|---|---|---|
| cloud | id or name | Yes |
Automation details
Command ID: pointcloud.delete
Parameters:
cloud: id or name → deleted
Point Clouds
Automation details
Command ID: pointcloud.list
Parameters:
→ clouds: [{cloud, name, file, source (the file's path, read again by pointcloud.reload), points, segments, triangles, source_points, units, visible, point_size, color_by (file, single, height or a property's name), color, colored, properties: [{name, integer, span, names}], filters, color_range (the ramp's now, exact over what the filters keep), height_range (the ramp's own range or the automatic one by height), height_auto, bounds: [[x,y,z], [x,y,z]] in the design, matrix}]
Other commands: inspect
View Analysis
| Parameter | Type | Required | Description |
|---|---|---|---|
| off | true turns the view analysis on now off. | No |
Automation details
Command ID: inspect.analysis
Parameters:
off?: true turns the view analysis on now off. → active: the command id of the view analysis on (inspect.zebra, inspect.draft, inspect.curvature_map, inspect.environment_map, inspect.accessibility, inspect.continuity, inspect.isocurve or inspect.curvature_comb), or null. One is on at a time: turning one on turns the one on before off. Read-only without `off`
Clearance
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | No | default: every solid body, in world placement, but those in `against`; mesh bodies are not measured |
| against | [names] | No | only pairs with one body in `bodies` and the other here |
| min_volume | mm³ | No | default 0.01: smaller overlaps count as contact |
| clearance | mm | No | default 0: report pairs closer than this |
| nearest | n | No | each body of `bodies` gets its n nearest others |
| skip_within | "occurrence"| "component"| null | No | pairs of bodies of one occurrence; pairs of bodies inside one placed component, its subcomponents included |
| tolerance | mm | No | default 1e-6: a gap below it is contact, 0 |
Automation details
Command ID: inspect.clearance
Parameters:
bodies?: [names] (default: every solid body, in world placement, but those in `against`; mesh bodies are not measured); against?: [names] (only pairs with one body in `bodies` and the other here); min_volume?: mm³ (default 0.01: smaller overlaps count as contact); clearance?: mm (default 0: report pairs closer than this); nearest?: n (each body of `bodies` gets its n nearest others); skip_within?: "occurrence" (pairs of bodies of one occurrence) | "component" (pairs of bodies inside one placed component, its subcomponents included) | null; tolerance?: mm (default 1e-6: a gap below it is contact, 0) → overlaps: [{a, b, volume_mm3, area_mm2, bbox, center}]; near: [{a, b, distance_mm, from, to, overlap_mm3?: a contact's shared volume below min_volume, exact?: false when measured on the meshes}], nearest by body (the same for pairs that overlap: 0); nearest: {body: [{body, distance_mm}]}; unchecked: [{a, b, reason}] (pairs whose overlap could not be worked out; each mesh body, STL/3MF/OBJ import, is not measured and is listed as {a: name, b: null, reason: "mesh body: not checked"}, also when named in `bodies` or `against`; the result's `bodies` counts the solid bodies only); pairs_checked; pairs_reused (of those, measured by an earlier call: neither body changed or moved since); pairs_pruned (ruled out by their boxes); ms. Distances are measured on the exact faces and edges, the meshes only rule pairs out
Parameter Sweep
| Parameter | Type | Required | Description |
|---|---|---|---|
| parameter | name | Yes | |
| values | [number | expression]| from | Yes | at most 200 |
| to | numbers | Yes | |
| steps | No | default 10, at most 199: steps + 1 values |
Automation details
Command ID: inspect.parameter_sweep
Parameters:
parameter: name; values: [number | expression] (at most 200) | from, to: numbers, steps? (default 10, at most 199: steps + 1 values) → for each value, in a copy of the design (the design itself is not changed): {value, ms (the rebuild), ok, failed: [{feature, name, error}], warned: [{feature, name, warning}] (features that build at the current value and fail or warn at this one), joints_lost: [{joint, name, origin?: a|b, why}], joints_flipped: [{joint, name, origin: a|b, degrees}] (an origin's z turned more than 90° on its own part from where it is now), sketches_flipped: [{sketch, name, degrees}] (the sketch plane's normal turned more than 90°), sketches_failed: [{sketch, name, failing, folded}] (a solve that fails, or keeps a triangle's turn or an offset's side only by flipping it)} (or {value, ms, ok: false, error} where the parameter takes no such value); summary: {values, ok, slowest_ms, failed, joints_lost, joints_flipped, sketches_flipped, sketches_failed} (how many values show each)
Compare Parameter Variants
Automation details
Command ID: inspect.parameter_variants
Parameters:
variants: [{name, set: {parameter: number | expression}}] (1 to 12; up to 16 existing parameters each). Rebuild each set together in a separate copy of the open design. Returns baseline and ordered results with volume, mass, body counts and rebuild regressions. No edits are kept.
Compare Bodies
| Parameter | Type | Required | Description |
|---|---|---|---|
| tolerance | mm | No | 0.001 to 10, default 0.01 |
| max_regions | No | default 50 | |
| color | true | {only_in_a?, only_in_b?: "#rrggbb"} | No | colours the faces that hold a region, red where only a has material and green where only b has: the faces mostly beyond the tolerance, else the one with the largest share; an undo step |
Automation details
Command ID: inspect.compare
Parameters:
a, b: body names (default: the two selected bodies, or the design's only two), in world placement; tolerance?: mm (0.001 to 10, default 0.01): surfaces closer than this agree; spacing?: mm (default 0.5): the largest piece of a face sampled as one point, coarser for a body that would need more than max_points? (default 8 million, up to 50 million) samples; max_regions? (default 50); color?: true | {only_in_a?, only_in_b?: "#rrggbb"} (colours the faces that hold a region, red where only a has material and green where only b has: the faces mostly beyond the tolerance, else the one with the largest share; an undo step) → a, b: volume_mm3, area_mm2, center_of_mass, bbox; difference: b − a; deviation: a_to_b, b_to_a (max_mm, mean_mm, at, area_beyond_mm2); regions, largest first: side (only_in_a | only_in_b), volume_mm3, center and bbox (measured_by: "boolean": exact, the pieces of a − b or b − a there, measured as inspect.measure does; "not measured": the cut could not be made, so volume_mm3 and center are null and not_measured says why, never an estimate), area_mm2, max_deviation_mm, at, faces_a, faces_b (face indices, as model.faces lists them); identical; verdict; warnings (a body whose surface does not enclose what it measures, lines left out, a cut that could not be made). The regions are found from the two surfaces, so near-identical bodies compare too
Compare Picture
| Parameter | Type | Required | Description |
|---|---|---|---|
| reference | path to a PNG or JPEG the model should match | Yes | |
| crop_px | [x, y, w, h] in pixels | No | |
| crop_fraction | [x, y, w, h] as fractions 0..1 of the picture | No | to take one view off a board |
| overlay | false leaves the overlay PNG out | No |
Automation details
Command ID: inspect.compare_picture
Parameters:
reference: path to a PNG or JPEG the model should match; view?/camera?/bodies?/rows? as inspect.silhouette; crop_px?: [x, y, w, h] in pixels, or crop_fraction?: [x, y, w, h] as fractions 0..1 of the picture (to take one view off a board); part_fills_crop?: false — with true the crop box is the part itself and no background search runs, for a crop that tightly frames the part; fit?: "width" | "height" | "both" (default "width"): one uniform scale, taken from the named dimension ("both" claims both and scales by width, reporting aspect_mismatch when the shapes differ); overlay?: false leaves the overlay PNG out → overlap (0..1), edges: top|bottom|left|right in mm at nine stations (positive where the model reaches past the picture, null where a station misses one of the two), the grid and its mm_per_px, and overlay_png (red model, blue picture) as base64 PNG. The compare is outline only: holes are not compared — both the picture's and the model's holes are filled
Silhouette
| Parameter | Type | Required | Description |
|---|---|---|---|
| view | front|back|left|right|top|bottom|iso | No | default front |
| camera | {target: [x,y,z], yaw, pitch, distance, fov?} | No | mm, radians; fov 0 means parallel |
| bodies | [world body names] | No | default visible bodies, named hidden bodies included |
| rows | mask height in pixels | No | default 240, clamped to 16..1024 |
Automation details
Command ID: inspect.silhouette
Parameters:
view?: front|back|left|right|top|bottom|iso (default front); or camera?: {target: [x,y,z], yaw, pitch, distance, fov?} (mm, radians; fov 0 means parallel); bodies?: [world body names] (default visible bodies, named hidden bodies included); rows?: mask height in pixels (default 240, clamped to 16..1024) → tightly framed run-length mask, box_mm, mm_per_px, right/up, projection, body and triangle counts
Other commands: solid
Cell Grid
| Parameter | Type | Required | Description |
|---|---|---|---|
| size | expr | Yes | a cell's inscribed diameter |
| web | expr | Yes | the wall between cells |
| depth | expr | Yes | or through_all: true |
| shape | hexagon|square|triangle|circle|polygon | No | default hexagon |
| sides | expr | No | polygon cells, 3 to 64; default 8 |
| dot_grid | hexagonal|square | No | where circle and polygon cells sit; default hexagonal |
| angle | expr | No | the grid's rotation about the anchor; angle 45 deg with square cells gives a diamond layout |
| anchor | [x,y,z] | No | a cell's centre, projected onto the sketch plane; default the sketch origin: grids with the same anchor, angle, size and web line up |
| clip | whole|snap|free | No | cells the field's edge crosses: only whole cells; cells cut along the grid's own lines; cells trimmed to the edge as drawn; default snap |
| direction | positive|negative|symmetric | No | default positive |
| sketch | id|name | No | default: active or last sketch; its closed profiles hold the field: a loop inside another is a keep-out |
| profiles | as solid.extrude | No | |
| targets | [body] | No | |
| mode | cut | No | the only mode so far |
Automation details
Command ID: solid.cell_grid
Parameters:
size: expr (a cell's inscribed diameter); web: expr (the wall between cells); depth: expr (or through_all: true); shape?: hexagon|square|triangle|circle|polygon (default hexagon); sides?: expr (polygon cells, 3 to 64; default 8); dot_grid?: hexagonal|square (where circle and polygon cells sit; default hexagonal); angle?: expr (the grid's rotation about the anchor; angle 45 deg with square cells gives a diamond layout); anchor?: [x,y,z] (a cell's centre, projected onto the sketch plane; default the sketch origin: grids with the same anchor, angle, size and web line up); clip?: whole|snap|free (cells the field's edge crosses: only whole cells; cells cut along the grid's own lines; cells trimmed to the edge as drawn; default snap); direction?: positive|negative|symmetric (default positive); sketch?: id|name (default: active or last sketch; its closed profiles hold the field: a loop inside another is a keep-out); profiles?: as solid.extrude; targets?: [body]; mode?: cut (the only mode so far); name?. Cuts at most 250 cells in one operation; not for sheet metal (use sheet.perforate). The faces cut have no stable names yet
Other commands: mesh
Convert Mesh
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | mesh body name | No | default: the selected mesh body |
| name | No |
Automation details
Command ID: mesh.convert
Parameters:
body?: mesh body name (default: the selected mesh body); tolerance?: length expression (default 0.05 mm): rebuild a closed mesh as an editable solid — a constant-section part as planar and cylindrical faces, any other closed mesh as the faceted solid its triangles describe — with a parametric timeline feature in the mesh body's owning component (the active component must be that component or an ancestor; otherwise activate the named component first); the active component is unchanged; name?
Other commands: model
Read Body Mesh
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | finite positive chord tolerance in mm | Yes | |
| tolerance | finite positive chord tolerance in mm | No | default 0.05 |
Automation details
Command ID: model.mesh
Parameters:
body, tolerance?: finite positive chord tolerance in mm (default 0.05); evaluated component-local mesh, at most 8192 vertices and 16384 triangles; no files or model changes
List Edges
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | name | Yes |
Automation details
Command ID: model.edges
Parameters:
body: name
List Faces
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | name | Yes |
Automation details
Command ID: model.faces
Parameters:
body: name → per face: index, name (what face.delete, sheet.convert `face`, solid.shell … take in place of a point), exact, area, centroid (not always on the face), plane_normal, point (a point on the face that picks it), cylinder? ({origin, axis, radius} of a cylindrical face), sheet_face? (a folded sheet's face: `sheet:<body>:<panel>:<side>`, panel base or a flange's tag F<feature>.<k>, side top | bottom | rim.<edge> | bend.inner | bend.outer; taken wherever a face name is, and it holds while sizes change and flanges come and go)
List Threads
Automation details
Command ID: model.threads
No parameter description is provided by the command registry.
List Body Features
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | name | No | a placed copy's name means the body it shows; default every body |
Automation details
Command ID: model.body_features
Parameters:
body?: name (a placed copy's name means the body it shows; default every body) → bodies: [{body, features: [{id, name}]}], in timeline order the feature that created each body, every later one that changed it, and those of bodies consumed into it. Read-only
Other commands: plugin
Inspect Plugin
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | plugin package folder | Yes |
Automation details
Command ID: plugin.inspect
Parameters:
path: plugin package folder; returns inert manifest and approval hash covering manifest and component; runs no plugin code
Install Plugin
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | plugin .zip | Yes | |
| replace | bool | No | required to replace an installed plugin of the same id |
| dry_run | bool | No |
Automation details
Command ID: plugin.install
Parameters:
path: plugin .zip, replace?: bool (required to replace an installed plugin of the same id), dry_run?: bool; checks the .zip (one plugin, safe paths, size caps, manifest) and unpacks it into the plugins folder; runs no plugin code
List Plugins
Automation details
Command ID: plugin.list
Parameters:
List inspected and installed plugin manifests, namespaced entries, declared effects and input schemas; no plugin code runs
Run Plugin
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | Yes | ||
| approval | exact hash from plugin.inspect after reviewing permissions | Yes | |
| entry | Yes | ||
| params | JSON | No |
Automation details
Command ID: plugin.run
Parameters:
path, approval: exact hash from plugin.inspect after reviewing permissions, entry, params?: JSON; explicit native Wasm component execution, one undo step; errors discard all edits
Other commands: sheet
List Sheet Metal Rules
Automation details
Command ID: sheet.rules
Parameters:
→ rules with their expressions and values, and the active one
Export Flat Pattern as DXF
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | No | ||
| path | No | ||
| curves | exact|arcs | No | default exact: an ellipse as ELLIPSE, splines, text outlines and other Béziers as SPLINE; arcs: tangent arcs and lines within 0.001 mm, for machines that read only those |
| text | cut|etch | No | default cut: letters that text cut through the sheet are cut contours on layer TEXT; etch: single contours on layer ETCH and the sheet keeps its material there; text machined to a depth is always on ETCH |
| bend_notes | bool | No | default false: a note beside each bend line on layer BEND_NOTES, `B1 UP 90%%d R1`, its angle the included angle when the body's rule has angle_display: included |
| note_height | mm | No | default 3 |
| bend_lines | bool | No | default true; false leaves BEND_UP and BEND_DOWN out, for a cutter that would cut them |
| layers | roles|single | No | default roles, the layers below; single: every entity on layer 0 |
| per_body | bool | No | a file for every sheet body, `<path>-<body>.dxf`, or their DXF texts without a path → files: [{body, path | dxf, bends}]; not with `body` |
Automation details
Command ID: sheet.export_dxf
Parameters:
body?, path?, curves?: exact|arcs (default exact: an ellipse as ELLIPSE, splines, text outlines and other Béziers as SPLINE; arcs: tangent arcs and lines within 0.001 mm, for machines that read only those), text?: cut|etch (default cut: letters that text cut through the sheet are cut contours on layer TEXT; etch: single contours on layer ETCH and the sheet keeps its material there; text machined to a depth is always on ETCH), bend_notes?: bool (default false: a note beside each bend line on layer BEND_NOTES, `B1 UP 90%%d R1`, its angle the included angle when the body's rule has angle_display: included), note_height?: mm (default 3), bend_lines?: bool (default true; false leaves BEND_UP and BEND_DOWN out, for a cutter that would cut them), layers?: roles|single (default roles, the layers below; single: every entity on layer 0), per_body?: bool (a file for every sheet body, `<path>-<body>.dxf`, or their DXF texts without a path → files: [{body, path | dxf, bends}]; not with `body`) → DXF (AutoCAD 2000, mm): layers OUTLINE (the outer contour), CUT (what is cut out inside it), TEXT or ETCH (letters), BEND_UP and BEND_DOWN (dashed centre lines), BEND_NOTES, POCKET_<BOTTOM|TOP|INTERNAL>_Z<from>_TO_<to>_MM (one per side and depth) and PERFORATION; inner contours come before the outline
Export Bend Table
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | No | ||
| format | csv|json | No | default csv |
| path | No |
Automation details
Command ID: sheet.export_bend_table
Parameters:
body?, format?: csv|json (default csv), path? → bend table in mm and degrees, including rule and flat centre-line coordinates; angle_deg is the bend angle and included_angle_deg the angle left between the bend's sides (180° less it); a bend that cut-outs split has a row for each piece
Other commands: plastic
List Plastic Rules
Automation details
Command ID: plastic.rules
Parameters:
→ rules with their expressions and values, the active rule and the rules assigned to bodies
Other commands: frame
Profile Library
Automation details
Command ID: frame.profile.list
Parameters:
family?: RSC|PFC|RSA|SHS|RHS|CHS (list only that family's sizes). Returns kinds: [{kind, label, required, optional, example}]: the built-in profiles, each SolidCraft's own parametric definition; and sizes: [{family, kind, standard, source, names, additional?}]: the standard steel sizes by name, each family with the published table its dimensions come from (frame.profile.properties with {profile: {size}} gives a size's dimensions and section)
Profile Properties
| Parameter | Type | Required | Description |
|---|---|---|---|
| profile | {kind: bar|round_bar|rect_tube|round_tube|angle|channel|i_beam, …its dimensions: each a number in the design's units or a length expression over its parameters ("tube_wall", "2 in"); a channel's flange_slope is an angle (a number of degrees)}| {size: a standard steel size by name, such as "RSC 203x89", "PFC 200x90x30", "RSA 50x50x5", "SHS 100x100x5", "RHS 200x100x6.3" or "CHS 42.4x3.2" (frame.profile.list lists them), alone: it brings its dimensions} | Yes | frame.profile.list gives each kind's dimensions and an example; dimensions left out take defaults from the profile's size |
Automation details
Command ID: frame.profile.properties
Parameters:
profile: {kind: bar|round_bar|rect_tube|round_tube|angle|channel|i_beam, …its dimensions: each a number in the design's units or a length expression over its parameters ("tube_wall", "2 in"); a channel's flange_slope is an angle (a number of degrees)} (frame.profile.list gives each kind's dimensions and an example; dimensions left out take defaults from the profile's size) | {size: a standard steel size by name, such as "RSC 203x89", "PFC 200x90x30", "RSA 50x50x5", "SHS 100x100x5", "RHS 200x100x6.3" or "CHS 42.4x3.2" (frame.profile.list lists them), alone: it brings its dimensions}; density?: kg/m³ (adds mass_per_m, kg/m). Returns profile (every default filled in), area (mm²), centroid [x,y] (mm, from the bounding box centre), ixx, iyy, ixy (mm⁴ about the centroid), width, height
Insert Profile
| Parameter | Type | Required | Description |
|---|---|---|---|
| profile | {kind: bar|round_bar|rect_tube|round_tube|angle|channel|i_beam, …its dimensions: each a number in the design's units or a length expression over its parameters ("tube_wall", "2 in"); a channel's flange_slope is an angle (a number of degrees)}| {size: a standard steel size by name, such as "RSC 203x89", "PFC 200x90x30", "RSA 50x50x5", "SHS 100x100x5", "RHS 200x100x6.3" or "CHS 42.4x3.2" (frame.profile.list lists them), alone: it brings its dimensions} | Yes | frame.profile.list gives each kind's dimensions and an example; dimensions left out take defaults from the profile's size |
| at | [x,y] | No | sketch mm, default the origin |
| anchor | origin|center|centroid|top_left|top|top_right|left|right|bottom_left|bottom|bottom_right | No | the profile point placed on `at`: its origin, the default and a built-in profile's centre, its bounding box's centre, its centroid, or a corner or edge middle of its bounding box |
| fixed | bool | No | default true: the curves are locked, so solving the sketch keeps the shape |
| sketch | id|name | No | default: the sketch being edited |
Automation details
Command ID: frame.profile.insert
Parameters:
profile: {kind: bar|round_bar|rect_tube|round_tube|angle|channel|i_beam, …its dimensions: each a number in the design's units or a length expression over its parameters ("tube_wall", "2 in"); a channel's flange_slope is an angle (a number of degrees)} (frame.profile.list gives each kind's dimensions and an example; dimensions left out take defaults from the profile's size) | {size: a standard steel size by name, such as "RSC 203x89", "PFC 200x90x30", "RSA 50x50x5", "SHS 100x100x5", "RHS 200x100x6.3" or "CHS 42.4x3.2" (frame.profile.list lists them), alone: it brings its dimensions}; at?: [x,y] (sketch mm, default the origin); anchor?: origin|center|centroid|top_left|top|top_right|left|right|bottom_left|bottom|bottom_right (the profile point placed on `at`: its origin, the default and a built-in profile's centre, its bounding box's centre, its centroid, or a corner or edge middle of its bounding box); angle?: radians, counter-clockwise; fixed?: bool (default true: the curves are locked, so solving the sketch keeps the shape); sketch?: id|name (default: the sketch being edited). Returns the section as frame.profile.properties does. Returns created: {points, curves, constraints, dimensions}: the ids of what it added (stable and never reused: usable right away in sketch.dimension, sketch.constraint.*, sketch.delete…)
Other commands: component
Cycle Component Color
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name | Yes |
Automation details
Command ID: component.cycle_color
Parameters:
component: id or name; saves the next identification colour and turns Component Colors on; shared by every instance, separate from appearances
Hide Component History
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name | Yes |
Automation details
Command ID: component.hide_history
Parameters:
component: id or name; keeps the component's features in the design but leaves them out of the History bar (#10393)
Show Component History
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name | Yes |
Automation details
Command ID: component.show_history
Parameters:
component: id or name; puts a component's features back in the History bar after Hide Component History (#10393)
Create Components from Bodies
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | Yes |
Automation details
Command ID: component.from_bodies
Parameters:
bodies: [names] → one new component per body, named after it
Activate Component
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name | Yes | 0 or "root" for the design |
| occurrence | exact placement used to author shared geometry | No | |
| path | exact placement used to author shared geometry | No |
Automation details
Command ID: component.activate
Parameters:
component: id or name (0 or "root" for the design); occurrence?, path?: exact placement used to author shared geometry
Edit in Place
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name of a linked component | Yes | |
| path | its placement | No | occurrence ids, default its first |
Automation details
Command ID: component.edit_in_place
Parameters:
component: id or name of a linked component; path?: its placement (occurrence ids, default its first) → in the app window: open the design it links in a tab of its own with the assembly drawn around it (component.finish_edit goes back); fails when it is not linked, the assembly has no file yet, something is open or running in it, or the file is missing, on a network location not allowed yet or open in another SolidCraft; asked during the agent's turn it opens once the turn ends (queued: true); elsewhere it only checks
Finish Edit
Read the components and joints guide.
Automation details
Command ID: component.finish_edit
Parameters:
no parameters → in the app window: go back from the linked design edited in place to its assembly, which reads it again; fails while the design has unsaved changes (run file.save first) or something is open in it; asked during the agent's turn it finishes once the turn ends (queued: true); elsewhere nothing changes
List Components
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| compact | bool | No | counts of bodies, features, sketches and construction planes instead of their names; occurrences leave out identity transforms; children as occurrence ids |
| bodies | bool | No | with compact: body names, not their count |
Automation details
Command ID: component.list
Parameters:
compact?: bool (counts of bodies, features, sketches and construction planes instead of their names; occurrences leave out identity transforms; children as occurrence ids); bodies?: bool (with compact: body names, not their count)
Component Physical Properties
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name | No | default active |
| descendants | bool | No | default true |
Automation details
Command ID: component.properties
Parameters:
component?: id or name (default active); descendants?: bool (default true); about?: [x, y, z] (mm). Measures the first placement, or all placements for root, including pending moves; material-aware mass and center of mass in world coordinates; volume, density, mass, center of mass and inertia_g_mm2 (the inertia tensor about the body's center of mass, world axes, from its tessellation) only for closed, consistently oriented bodies; total.open_bodies_skipped counts open bodies excluded from volume/mass totals; total.first_moment_g_mm (mass × center of mass), inertia_g_mm2 about the total center of mass, principal_moments_g_mm2 (smallest first) and principal_axes (unit, right-handed); with about, total.inertia_about {point, inertia_g_mm2}
Rename Component
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | Yes | ||
| name | Yes |
Automation details
Command ID: component.rename
Parameters:
component, name
Delete Component
Read the components and joints guide.
Automation details
Command ID: component.delete
Parameters:
component: deletes it, its subcomponents, occurrences and features
Unlock Contents
Read the components and joints guide.
Automation details
Command ID: component.unlock
Parameters:
component: removes the rigid joints that hold its contents together (an imported assembly's rigid group), so its parts move and take joints one by one → joints (the ids removed)
Move Bodies to Component
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | Yes | |
| component | Yes | ||
| component_path | its placement to place them by | No | default: its only one, else the active one; a component placed more than once gets them in every instance |
| from_path | the placement of their component they move from | No | default: its only one, else its first, where its bodies have their own names |
Automation details
Command ID: component.move_bodies
Parameters:
bodies: [names], component; component_path?: its placement to place them by (default: its only one, else the active one; a component placed more than once gets them in every instance); from_path?: the placement of their component they move from (default: its only one, else its first, where its bodies have their own names)
Paste Bodies
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names, as the Browser shows them: a body seen in another placement of its component (Cube (B:2)) is copied from there] | Yes | |
| component | where the copies go | No | default: the active one |
| component_path | its placement to place them by | No | default: its only one, else the active one; a component placed more than once gets them in every instance |
Automation details
Command ID: component.copy_bodies
Parameters:
bodies: [names, as the Browser shows them: a body seen in another placement of its component (`Cube (B:2)`) is copied from there]; component?: where the copies go (default: the active one); component_path?: its placement to place them by (default: its only one, else the active one; a component placed more than once gets them in every instance). Each copy stays where its body is in the world; the copies' names come back as `bodies`
Paste from Another Design
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | where it goes | No | default: the active one |
Automation details
Command ID: component.paste_from_design
Parameters:
component?: where it goes (default: the active one); component_path?: its placement (default: the active one, else its only one). Pastes what was copied in another design, at the same world coordinates: its bodies as imported bodies (no history) in one Import feature, or its components as independent copies with their history, appearances, joints and motion (as `component.paste_new`); the user parameters they use come along, renamed `w_2` when taken. A component that uses what isn't in it (another body, sketch or parameter) is refused, saying what. Returns `bodies` and `feature`, or the pasted components' `paths`
Move Sketches to Component
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketches | [ids or names] | Yes | a number is an id; a string is an exact name, then an id |
| component | Yes |
Automation details
Command ID: component.move_sketches
Parameters:
sketches: [ids or names] (a number is an id; a string is an exact name, then an id), component; the sketches keep their own coordinates (component.move_features keeps them where they are in the world), except that a sketch on an exactly attached face stays where it is on the face
Move Sketches to Their Parts
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketches | [ids or names] | No | default: every sketch in the design |
Automation details
Command ID: component.move_sketches.to_parts
Parameters:
sketches?: [ids or names] (default: every sketch in the design) → moved, stayed, sketches [{sketch, name, component, part}], kept [{sketch, name, code, reason}]. Each sketch whose plane is an exactly attached face of a part's body goes to that part, as component.move_sketches moves it, and stays where it is on the face; the others (on an origin, construction or fixed plane, on a body of the design itself, or already in their part) stay where they are. One undo step
Move Features to Component
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| features | [ids or names] | Yes | sketches too |
| component | where they go | No | default: the active one |
Automation details
Command ID: component.move_features
Parameters:
features: [ids or names] (sketches too); component?: where they go (default: the active one) → moved, component, bodies. Ids, names and timeline order stay; the geometry stays where it is in the world; the bodies the features made move with them. Refused while the timeline is rolled back, for a component placed more than once, and for a move that would break a feature (nothing changes)
Paste New
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| occurrence | selected source placement | No | |
| path | selected source placement | No | |
| parent | component the copy goes in | No | default: the source placement's; not the component or one inside it |
| in_place | as occurrence.copy | No | |
| parent_path | as occurrence.copy | No | |
| translate | [x,y,z] | No |
Automation details
Command ID: component.paste_new
Parameters:
component: independently copy its nested definition graph and history, materials and styles; occurrence?, path?: selected source placement; parent?: component the copy goes in (default: the source placement's; not the component or one inside it); in_place?, parent_path?: as occurrence.copy; translate?: [x,y,z]. Reassigned external bodies become base geometry; retained external links and omitted boundary joints are reported
Update Links
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name | No | default: every linked component |
Automation details
Command ID: component.update_links
Parameters:
component?: id or name (default: every linked component); components?: a list of ids or names, which goes on past a design it cannot read (that one keeps its bodies, is named in failed and gets a warning) — reads the linked designs again and replaces their bodies where they changed, as one undo step; → updated, unchanged, failed ([{component, name, error}]), warnings (also joints whose faces are gone or that no longer solve)
Relink Source
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name of a linked component | Yes |
Automation details
Command ID: component.relink
Parameters:
component: id or name of a linked component; path: a saved design (.sc or .json) — replaces the source and linked bodies for all its occurrences, preserving identities and placements; occurrence?: one of its placements — when it has others, only that placement comes to show the design, as a placement of the component already linked to it or of a new one under the same parent, keeping its position and joints (component is then the one it shows, previous_component the one it showed); returns path, previous_path, warnings, joint_errors and joint_conflicts
Break Link
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name of a linked component — keeps its bodies as they are and forgets the design file | Yes |
Automation details
Command ID: component.break_link
Parameters:
component: id or name of a linked component — keeps its bodies as they are and forgets the design file
Extract to File
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name of a component that is not linked | Yes | |
| path | the .sc design to write | Yes |
Automation details
Command ID: component.extract
Parameters:
component: id or name of a component that is not linked; path: the .sc design to write → its history, subcomponents and their joints move to that design, and the component becomes linked to it (as component.insert_design makes it); returns path, file, feature, bodies, notices (what stays behind), warnings and copies (components that build the same bodies: see component.replace_with_link)
Find Identical Copies
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name of a linked component | Yes |
Automation details
Command ID: component.copies
Parameters:
component: id or name of a linked component → copies: [{component, name}], the components not linked whose own history builds the same bodies
Replace with Link
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| with | a linked component | Yes | |
| path | a .sc design | Yes | its link here, else a new linked component |
Automation details
Command ID: component.replace_with_link
Parameters:
component or components: [ids or names] of components that are not linked; with: a linked component, or path: a .sc design (its link here, else a new linked component) → each component's history goes and its placements become placements of the linked component; refused when its bodies are not the same as the link's; returns component, name, replaced and warnings
List Links
Read the components and joints guide.
Automation details
Command ID: component.links
Parameters:
→ linked components: component, name, path, file (resolved), found (null when the file is on a network location not allowed, or names a device: it is not looked for), changed (whether the file is no longer what this design last read: Update Links reads it again; null when not found or the link is older than this record), then host (the network location); state (missing, unreadable, not_allowed: a network location not allowed or outside the folders this agent may use) and reason when the file can't be reached
Part Properties
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name | Yes | 0 or "root": the design's own properties |
Automation details
Command ID: component.metadata
Parameters:
component: id or name (0 or "root": the design's own properties) → component, name, part_number, description, revision, bom_type (components only), metadata (as saved, other tools' keys too), properties: {name: text}
Change Part Properties
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id or name | Yes | not the root: use document.metadata.set |
| part_number | text | No | |
| description | text | No | |
| revision | text | No | empty or null removes |
| bom_type | normal|phantom|reference|purchased|inseparable | No | empty or null: normal |
| values | {key: value} | No | SolidCraft's keys, as document.metadata's properties lists them, bom_type, or a reverse-DNS key holding an object |
Automation details
Command ID: component.metadata.set
Parameters:
component: id or name (not the root: use document.metadata.set); part_number?, description?, revision?: text (empty or null removes); bom_type?: normal|phantom|reference|purchased|inseparable (empty or null: normal); values?: {key: value} (SolidCraft's keys, as document.metadata's properties lists them, bom_type, or a reverse-DNS key holding an object); properties?: {name: text, …} (free properties; empty or null removes). All or nothing, one undo step → component, metadata, properties, changed: [keys]
Other commands: occurrence
Occurrence Physical Properties
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| occurrence | id or name | Yes | |
| path | [occurrence ids] | No | required if nested under multiple instances |
| descendants | bool | No | default true |
Automation details
Command ID: occurrence.properties
Parameters:
occurrence: id or name; path?: [occurrence ids] (required if nested under multiple instances); descendants?: bool (default true); about?: [x, y, z] (mm). Physical properties of this placement in world coordinates, including pending moves; volume, density, mass, center of mass and inertia_g_mm2 only for closed, consistently oriented bodies; total.open_bodies_skipped counts open bodies excluded from volume/mass totals; total inertia as in component.properties
Paste (Instance)
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | Yes | or occurrence | |
| path | validates selected occurrence | No | |
| parent | component | No | default: the same parent |
| translate | [x,y,z] | No |
Automation details
Command ID: occurrence.copy
Parameters:
component (or occurrence): what to place again; path?: validates selected occurrence; parent?: component (default: the same parent); translate?: [x,y,z]; in_place?: bool (default false: the selected transform within the parent; true: where the selected placement is in the world, translate in world axes; a parent placed more than once is placed by parent_path?, else the active placement, and every instance gets the copy). Copies the selected effective transform, including pending moves
Move Occurrence
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| occurrence | Yes | ||
| path | exact placement | No | |
| space | local|world | No | default local |
| translate | [x,y,z] | No | numbers or length expressions: an occurrence moved by expressions that name parameters keeps them and moves with them when the parameters change, along the axes the move was given in; other moves of it stay; a parameter they use can't be deleted, and a renamed one carries into them |
| axis | [x,y,z] | No | |
| angle | radians or "30 deg" | No | |
| origin | [x,y,z] | No | |
| to | {position: [x,y,z], axis?: [x,y,z], angle?} or to_matrix?: [12 or 16 numbers] | No | absolute placement: where it goes in space, not a move; not with translate/axis/angle/origin/matrix |
| matrix | [12 or 16 numbers] | No | instead of translate/axis/angle/origin: a rigid move as a row-major 3x4 rotation-and-translation or 4x4 matrix, flat or as rows; one that is a rotation only up to rounding is orthonormalised, a scale, shear or mirror is refused |
| tolerance | largest accepted |RᵀR − I| | No | default 1e-9, at most 1e-3 |
| capture | bool | No | default true; false keeps it pending until Capture Position |
| move_grounded | bool | No | default false: a grounded occurrence refuses; true moves it and it stays grounded |
Automation details
Command ID: occurrence.move
Parameters:
occurrence; path?: exact placement; space?: local|world (default local); translate?: [x,y,z] (numbers or length expressions: an occurrence moved by expressions that name parameters keeps them and moves with them when the parameters change, along the axes the move was given in; other moves of it stay; a parameter they use can't be deleted, and a renamed one carries into them); axis?: [x,y,z], angle?: radians or "30 deg", origin?: [x,y,z]; to?: {position: [x,y,z], axis?: [x,y,z], angle?} or to_matrix?: [12 or 16 numbers] (absolute placement: where it goes in space, not a move; not with translate/axis/angle/origin/matrix); matrix?: [12 or 16 numbers] (instead of translate/axis/angle/origin: a rigid move as a row-major 3x4 rotation-and-translation or 4x4 matrix, flat or as rows; one that is a rotation only up to rounding is orthonormalised, a scale, shear or mirror is refused); tolerance?: largest accepted |RᵀR − I| (default 1e-9, at most 1e-3); capture?: bool (default true; false keeps it pending until Capture Position); move_grounded?: bool (default false: a grounded occurrence refuses; true moves it and it stays grounded). Nested occurrence definitions remain shared. Replies {occurrence, transform, pending}; when joints hold it to something fixed and put it back, transform is where it is and the reply adds reverted: true and a warning naming the joint
Drag Occurrence
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| at | [x,y,z] world point on it | Yes | |
| point | [x,y,z] where it goes | Yes |
Automation details
Command ID: occurrence.drag
Parameters:
occurrence or path: exact placement; at: [x,y,z] world point on it; point: [x,y,z] where it goes. Moves the placement by point - at (with any chain of joints it is in that is joined to nothing grounded) and captures its position; other pending moves stay pending. Shared definitions move in all placements. Grounded parts and parts joints hold to something fixed are refused (joint.reach moves those)
Align Occurrence
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| occurrence | placements to move together | No | |
| occurrences | placements to move together | No | |
| path | placements to move together | No | |
| paths | placements to move together | No | |
| from | Yes | ||
| from_face | Yes | ||
| from_plane | Yes | ||
| to | Yes | ||
| to_face | Yes | ||
| to_plane | Yes | ||
| flip | bool | No | |
| capture | bool | No | default true |
| move_grounded | bool | No | default false |
Automation details
Command ID: occurrence.align
Parameters:
occurrence?, occurrences?, path?, paths?: placements to move together; from | from_face | from_plane; to | to_face | to_plane; flip?: bool; capture?: bool (default true); move_grounded?: bool (default false). Moves only the chosen occurrence placements in world coordinates without changing shared component geometry; a placement inside a component placed more than once moves in every placement of it, and the reply's `shared` lists those paths
Ground
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| occurrence | Yes | ||
| grounded | bool | No | default toggles |
Automation details
Command ID: occurrence.ground
Parameters:
occurrence; grounded?: bool (default toggles)
Move to Component
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| occurrence | Yes | ||
| path | exact placement | No | |
| parent | component id or name | Yes | 0 or "root" for the design |
| parent_path | the parent's placement to place it by | No | default: its only one, else the active one; every instance of the parent gets it |
Automation details
Command ID: occurrence.reparent
Parameters:
occurrence; path?: exact placement; parent: component id or name (0 or "root" for the design); parent_path?: the parent's placement to place it by (default: its only one, else the active one; every instance of the parent gets it). The placement keeps its world position; a move that would break a feature is refused
Other commands: browser
Move to Component
Read the window tour.
Automation details
Command ID: browser.reparent
Parameters:
Moves placements, features and bodies into a component. occurrences?: [ids or paths], features?: [ids or names], bodies?: [names], component?: where they go (default: the active one), component_path?: its placement → component, occurrences, features, bodies (what moved). One undo step, all or nothing: placements move first (taking what they hold), then features (taking the bodies they made), then the bodies still elsewhere (a body transfer, which leaves its features behind)
New Group
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| folder | bodies|sketches|construction | No | |
| component | id | No | default 0 |
| parent | group id | No | the new group nests in it, taking its component and folder; at most 8 levels |
| name | No | ||
| items | [keys] | No | they leave other groups |
Automation details
Command ID: browser.group
Parameters:
folder?: bodies|sketches|construction; component?: id (default 0); parent?: group id (the new group nests in it, taking its component and folder; at most 8 levels); name?; items?: [keys] (they leave other groups)
Ungroup
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| group | id | Yes | its items and child groups go up to the group that holds it, or the folder |
Automation details
Command ID: browser.ungroup
Parameters:
group: id (its items and child groups go up to the group that holds it, or the folder)
Rename Group
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| group | id | Yes | |
| name | Yes |
Automation details
Command ID: browser.rename_group
Parameters:
group: id, name
Move Browser Items
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| folder | [keys (strings) and group ids (numbers)] | Yes | |
| component | [keys (strings) and group ids (numbers)] | No | |
| items | [keys (strings) and group ids (numbers)] | Yes | |
| group | id | No | into it; omit for the folder's top level |
| before | key or group id | No | position in it; default the end |
Automation details
Command ID: browser.move
Parameters:
folder, component?, items: [keys (strings) and group ids (numbers)]; group?: id (into it; omit for the folder's top level); before?: key or group id (position in it; default the end). A group cannot go into itself or past 8 levels
Order Browser Items
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| folder | bodies|sketches|construction|components | Yes | |
| component | No | ||
| order | [keys (strings) and top-level group ids (numbers)] | Yes | display order; for `components`, the ids of the components placed in it |
Automation details
Command ID: browser.order
Parameters:
folder: bodies|sketches|construction|components, component?, order: [keys (strings) and top-level group ids (numbers)] (display order; for `components`, the ids of the components placed in it)
Show/Hide
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| visible | bool | Yes | |
| items | [sketch id or name | body name | construction name | joint name | O|X|Y|Z|XY|XZ|YZ] | No | |
| joints | [joint id or name] | No | their glyphs; they still constrain and move parts |
| features | [feature id or name] | No | the bodies they made; path?: [occurrence ids] for only that placement's |
| folder | bodies|sketches|construction|origin|joints|all | No | all of it; showing also shows its browser folders and groups, and `all` takes in the occurrence hides too |
| tree_folders | [browser folder or group key: c0/bodies, o:4/sketches, o:4/origin, c0/g7, c0/joints, c0/canvases, c0/point_clouds] | No | the folder or group itself: its items keep their own state; component origin items use o:4/origin/XY etc. in items |
| paths | [[occurrence ids]] | No | exact placements and descendants |
| isolate | bool | No | with paths or items of bodies, and visible:true: everything else is hidden, other placements as placements |
Automation details
Command ID: browser.visibility
Parameters:
visible: bool; items?: [sketch id or name | body name | construction name | joint name | O|X|Y|Z|XY|XZ|YZ]; or joints?: [joint id or name] (their glyphs; they still constrain and move parts); or features?: [feature id or name] (the bodies they made; path?: [occurrence ids] for only that placement's); or folder?: bodies|sketches|construction|origin|joints|all (all of it; showing also shows its browser folders and groups, and `all` takes in the occurrence hides too); or tree_folders?: [browser folder or group key: c0/bodies, o:4/sketches, o:4/origin, c0/g7, c0/joints, c0/canvases, c0/point_clouds] (the folder or group itself: its items keep their own state; component origin items use o:4/origin/XY etc. in items); or paths?: [[occurrence ids]] (exact placements and descendants), isolate?: bool (with paths or items of bodies, and visible:true: everything else is hidden, other placements as placements). Saved with the design and undone like any other change (the camera is not)
Expand All
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | [occurrence ids] | No | that placement and its descendants |
| component | id | No | that component's own folders |
Automation details
Command ID: browser.expand_all
Parameters:
path?: [occurrence ids] (that placement and its descendants); component?: id (that component's own folders); omit both for the whole tree, including folders that start closed (Origin, Named Views, Features). Display only: open/closed rows are not saved in the design and are not an undo step → open, open_by_default, closed_by_default
Collapse All
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | [occurrence ids] | No | that placement's branch |
| component | id | No |
Automation details
Command ID: browser.collapse_all
Parameters:
path?: [occurrence ids] (that placement's branch); component?: id; omit both for the whole tree: every placement, folder and group at every level. The row it starts from (the design row for the whole tree) stays open, so its first level remains visible. Display only; not an undo step → open, open_by_default, closed_by_default
Other commands: joint
Reach Point
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| occurrence | id|name | Yes | |
| point | [x,y,z] | Yes | where its point goes, world |
| at | [x,y,z] | No | its point, in the world where it is now; default: the centre of its bodies' box |
| z | [x,y,z] | No | the way its axis then points |
| axis | [x,y,z] | No | that axis, in the world now; default: its own z |
| joints | [ids or names] | No | only these move toward the point; the other joints of a closed loop they are in follow |
| quiet | bool | No |
Automation details
Command ID: joint.reach
Parameters:
occurrence: id|name; point: [x,y,z] (where its point goes, world); at?: [x,y,z] (its point, in the world where it is now; default: the centre of its bodies' box); z?: [x,y,z] (the way its axis then points); axis?: [x,y,z] (that axis, in the world now; default: its own z); joints?: [ids or names] (only these move toward the point; the other joints of a closed loop they are in follow); quiet?: bool; continuous?: bool (a frame of a drag: the answer says continuous, and the app's command line doesn't echo it). Moves the values of the joints on its chain from where they are to the nearest pose, within their limits, through motion links, keeping closed loops closed as joint.drive does (contact sets are not checked) → reached; error_mm (and error_deg with z): how close it got; point: where its point is; values: [{joint, name, values}] of the joints that moved, as joint.list gives them; moved; stopped_by_limit: [{joint, value, limit: min|max}]: the limits it rests on short of the point; stopped_by_loop: {joint}: the closed loop that stopped it (its chain alone gets closer); reason: why nothing can move
Joint Limits
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| joint | Yes | ||
| index | value index | No | default 0 |
| min | No | ||
| max | No | omit both to clear |
Automation details
Command ID: joint.limits
Parameters:
joint; index?: value index (default 0); min?, max? (omit both to clear)
Edit Joint
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| joint | Yes | ||
| a | joint origins as joint.create takes them | No | |
| b | joint origins as joint.create takes them | No | a side left out keeps its place; the two must stay on different occurrences |
| type | No | ||
| flip | No | ||
| offset | No | ||
| angle | No | a number, or an expression the joint then follows | |
| suppressed | No | ||
| name | No |
Automation details
Command ID: joint.edit
Parameters:
joint; a?, b?: joint origins as joint.create takes them (a side left out keeps its place; the two must stay on different occurrences); type?, flip?, offset?, angle? (a number, or an expression the joint then follows), suppressed?, name?; the joint re-solves, keeping its limits and expressions (a relation's values start again where its parts are); an edit that places it again (not a rename alone) meets a loop it closes as joint.create does, turning an angle a half turn where only that meets it
Delete Joint
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| joint | id|name | Yes | or origin: name, link: index |
Automation details
Command ID: joint.delete
Parameters:
joint: id|name (or origin: name, link: index)
List Joints
Read the components and joints guide.
Automation details
Command ID: joint.list
Parameters:
→ joints (type, occurrences, values, limits; expressions: {offset?, angle?, values?} when they were typed as expressions), origins, links, degrees of freedom, conflicts, floating: [{occurrences, joints}] (joint chains joined to nothing grounded: the solver places none of them, so driving them moves nothing)
Inspect Joint
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| joint | id|name | No | default: every joint |
Automation details
Command ID: joint.inspect
Parameters:
joint?: id|name (default: every joint) → joints: [{id, name, type, suppressed, visible, flip, offset (mm), angle (deg), values: as joint.list gives them, dofs, expressions?: {offset?, angle?, values?}, a, b: {occurrence, occurrence_name, component, component_name, path (occurrence names from the top, `/` between), snap (as saved: type, pick, face, end, edge, corner, x, point, z, in the component's coordinates), references: [{role: face|end|x|edge|corner, name, role_in_feature?: (top, side:c1…), feature?: {id, name, type} (the feature that made the face; error when it is gone), sketch?: {id, name, curve, curve_type} (a face swept from a sketch curve), faces?: [an edge's two faces], unverified?: a name saved before exact names}], resolves, frame?: {origin, z, x} in the world, error?: why the origin is lost}, links: [{index, role: driver|driven, …as joint.list}], errors, conflicts}] (reads only: nothing changes)
Solve Joints
Read the components and joints guide.
Automation details
Command ID: joint.solve
Parameters:
re-place the occurrences from the joints → conflicts, errors, dof
Sweep Joint
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| joint | id|name | Yes | |
| from | its value the sweep runs between | Yes | |
| to | its value the sweep runs between | Yes | degrees for angles, mm for distances, or expressions |
| index | No | which value, default 0 | |
| step | No | between samples, in the joint's unit; default: fine enough that no part passes through another between two | |
| refine | mm | No | the first contact is bisected until no part moves more than this between the last clear value and the touching one; default 0.01 |
| occurrences | [ids or names] | No | checked against each other; default every occurrence |
| against | [ids or names] | No | the parts that stay: each of `occurrences` only against these |
| contact_sets | true | No | the pairs of the design's contact sets |
| exclude_pairs | [[a, b]] | No | occurrences by id or name: pairs of bodies under a and b are not checked, such as a pin in its hole |
| budget_s | seconds | No | at most 86400; past them the sweep stops with what it found; its work is then not capped. Without it the work caps, 4096 samples, 64 bisection steps and 500 million triangle tests, stop it the same way |
| report_gaps | bool | No | the nearest gap at every sample, default false |
| apply | bool | No | leave the design where the sweep stopped; default false: the design is not changed |
Automation details
Command ID: joint.sweep
Parameters:
joint: id|name; from, to: its value the sweep runs between (degrees for angles, mm for distances, or expressions); index? (which value, default 0); step? (between samples, in the joint's unit; default: fine enough that no part passes through another between two); refine?: mm (the first contact is bisected until no part moves more than this between the last clear value and the touching one; default 0.01); occurrences?: [ids or names] (checked against each other; default every occurrence), with against?: [ids or names] (the parts that stay: each of `occurrences` only against these), or contact_sets?: true (the pairs of the design's contact sets); exclude_pairs?: [[a, b]] (occurrences by id or name: pairs of bodies under a and b are not checked, such as a pin in its hole); budget_s?: seconds (at most 86400; past them the sweep stops with what it found; its work is then not capped. Without it the work caps, 4096 samples, 64 bisection steps and 500 million triangle tests, stop it the same way); report_gaps?: bool (the nearest gap at every sample, default false); apply?: bool (leave the design where the sweep stopped; default false: the design is not changed) → stopped_at (the last value clear of contact, or where a loop or limit stopped it; null: it reached `to`), stopped_by: {a, b, at: [x,y,z] (where they touch, world), a_part, b_part: {component, path: [occurrence names], path_ids} (where each touching body sits)} | "loop" | "limit" | "budget" (stopped_at: the last value checked clear) | null, samples: [{value, min_gap_mm?, pair?, parts?}], min_gap? (report_gaps: {part: {mm, at_value, to}}, the nearest each part came to another), unit, gap_method ("mesh": distances between the tessellations), gap_tolerance_mm (how far those can be off: 0 when every face is flat), pairs (checked), touching_at_start: [[a, b]] (pairs already touching at `from`, such as parts joined face to face or a door on its frame: these stop it only once they pass into each other deeper than they start), touching_parts (where their bodies sit), budget_s, budget_exceeded, budget_ran_out: "time" | "samples" | "bisections" (a contact reported less refined than `refine`) | "intersections" | "work" | null, applied. The parts are tested at the samples and through the bisection; the motion is on a copy (closed loops follow, contact sets do not stop it)
Find Joint Limits
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| joint | id|name | Yes | |
| index | No | one value; default every value | |
| refine | No | ||
| step | No | ||
| occurrences | No | ||
| against | No | ||
| contact_sets | No | ||
| exclude_pairs | No | as joint.sweep |
Automation details
Command ID: joint.find_limits
Parameters:
joint: id|name; index? (one value; default every value); refine?, step?, occurrences?, against?, contact_sets?, exclude_pairs? (as joint.sweep) → values: [{index, dof, unit, value (now), min, max, min_by, max_by, range}], each value swept both ways from where it is, its own limits ignored, closed loops following; each side stops at the first contact (bisected to `refine`), where a loop cannot close, or at another limit (another value's, or another joint's through a motion link): min_by/max_by {a, b, at} | "loop" | "limit" | "budget" (its work ran out: the last value checked clear) | "turn" (an angle with no contact within a turn: a turn from the other side, or ±180° from now when nothing is met at all) | "range" (a distance with no contact within the parts' reach: min/max null); touching_at_start, overlapping_at_start: [{a, b, depth_mm}] (already passing into each other: they stop it only going deeper), refine_mm, gap_method, gap_tolerance_mm, pairs (0: no two parts to check, so nothing is swept). The design is not changed
Other commands: assembly
Edit Constraint
| Parameter | Type | Required | Description |
|---|---|---|---|
| constraint | id|name | Yes | a joint made with assembly.constraint.create |
| type | a rule as assembly.constraint.create takes it | No | the references it has must fit it; the gap carries over |
| offset | the gap | No | mm or an expression |
| angle | an angle rule's angle | No | |
| flip | true turns b over | No | from the new rule's way after a type change, else from how it faces now |
| name | No | ||
| suppressed | No |
Automation details
Command ID: assembly.constraint.edit
Parameters:
constraint: id|name (a joint made with assembly.constraint.create); type?: a rule as assembly.constraint.create takes it (the references it has must fit it; the gap carries over); offset?: the gap (mm or an expression); angle?: an angle rule's angle; flip?: true turns b over (from the new rule's way after a type change, else from how it faces now); name?; suppressed?; quiet?. Changed as joint.edit changes a joint: its values start again where its parts are → conflicts, errors, dof, fixed as joint.edit
Mass Properties
Automation details
Command ID: assembly.mass_properties
Parameters:
no parameters → occurrences: [{occurrence (0: the design's own bodies), name, component, path, group, fixed, frame {origin, x, y, z}, bodies: [{name, material, density_g_cm3, closed, volume_mm3, mass_kg}], open_bodies_skipped, mass}], groups: [{group, occurrences, fixed, frame_occurrence, frame, mass}] (occurrences an unsuppressed rigid joint ties together, and a nested occurrence no joint places with its parent; fixed: holds the design or a grounded occurrence), warnings. mass: {mass_kg, center_of_mass_mm (world), center_of_mass_local_mm, inertia_world_kg_mm2, inertia_local_kg_mm2 (about the centre of mass, in world and frame axes)} or null when massless. Read-only; pending moves count; each body at its material's density (the default material's when none is assigned)
Other commands: contact
Edit Contact Set
| Parameter | Type | Required | Description |
|---|---|---|---|
| set | id|name | Yes | |
| occurrences | No | ||
| name | No | ||
| suppressed | bool | No | |
| delete | bool | No |
Automation details
Command ID: contact.edit
Parameters:
set: id|name; occurrences?; name?; suppressed?: bool; delete?: bool
List Contact Sets
Automation details
Command ID: contact.list
Parameters:
→ sets, enabled, all
Check Contact
Automation details
Command ID: contact.check
Parameters:
→ pairs in contact sets that pass through each other now
Other commands: motion
Play Motion Study
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| study | id|name | Yes | |
| step | Yes | 0…steps | |
| quiet | bool | No | positions of only the occurrences that moved |
Automation details
Command ID: motion.play
Parameters:
study: id|name; step (0…steps) — sets the joints to the study's values there (contact sets stop them); quiet?: bool (positions of only the occurrences that moved) → values: [{joint, values: [{name, value, unit}]}], positions, moved: whether any occurrence moved, unmoved: [{joint, name, reason}] (keyed joints that can move nothing, such as a chain joined to nothing grounded)
Export Motion Study
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| study | Yes | ||
| samples | No | default steps + 1 | |
| path | No | .json or .csv |
Automation details
Command ID: motion.export
Parameters:
study; samples? (default steps + 1); path? (.json or .csv) → occurrence positions per step (the design is not changed)
Export Motion Animation
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| study | id|name | Yes | |
| joint | id|name with from and to | Yes | degrees for angles, mm for distances, or expressions |
| view | id|name | Yes | an exploded view, coming apart from the assembled placement |
| samples | No | frames, 2…1000; default the study's steps + 1, 100 for a joint, 41 for a view or 81 with back | |
| width | No | ||
| height | No | 16…4096 pixels, default 800 × 500 | |
| camera | {target, yaw, pitch, roll?, distance, fov?, up?} | No | ui.camera's reply; fields left out keep the default view: view.apply's camera, or the home view framing the model, for a view both assembled and exploded |
| fps | No | 1…50, default 20 |
Automation details
Command ID: motion.export_animation
Parameters:
study: id|name, or joint: id|name with from and to (degrees for angles, mm for distances, or expressions) and index?, or view: id|name (an exploded view, coming apart from the assembled placement) with back? (default false; true: back together too, exploded at the middle frame of an odd count); path: a .gif file, or a folder for PNG frames (frame-0001.png, frame-0002.png, …); samples? (frames, 2…1000; default the study's steps + 1, 100 for a joint, 41 for a view or 81 with back); width?, height? (16…4096 pixels, default 800 × 500); camera?: {target, yaw, pitch, roll?, distance, fov?, up?} (ui.camera's reply; fields left out keep the default view: view.apply's camera, or the home view framing the model, for a view both assembled and exploded); fps? (1…50, default 20); grid?, axes? (default true: the ground grid and the origin's axes) - draws the study as it plays, the joint as it is driven or the view as it explodes, with the headless renderer → path, format, frames, width, height, fps (GIF), bytes, renderer, stopped_at, stopped_by_loop, stopped_by_contact (the design is not changed, nor its placements)
Keep Motion Trace
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| study | id|name | Yes | |
| joint | id|name with from and to | Yes | degrees for angles, mm for distances, or expressions |
| name | No | default Motion TraceN | |
| auto_update | bool | No | default true |
| point_ref | joint origin snap - keeps the trace as a root 3D sketch spline | No |
Automation details
Command ID: motion.trace.keep
Parameters:
occurrence: id|name, or an occurrence path [ids] (an instance inside sub-assemblies); point: [x,y,z] world point on it, where it is placed now; study: id|name, or joint: id|name with from and to (degrees for angles, mm for distances, or expressions) and index? (which value, default 0); samples? (2…500, default the study's steps + 1, or 100) - the point's path as the study plays or the joint is driven, closed loops following; name? (default Motion TraceN); auto_update?: bool (default true); point_ref?: joint origin snap - keeps the trace as a root 3D sketch spline. Associative curves follow mechanism and driving-input edits; false keeps a fixed curve. point_ref retains a geometry snap; otherwise point is retained in component coordinates → sketch, name, curves, points
Edit Motion Trace
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sketch | id|name | Yes | |
| index | No | ||
| samples | No | 2…500 | |
| auto_update | false to detach | No |
Automation details
Command ID: motion.trace.edit
Parameters:
sketch: id|name; joint? with from and to, or study?; index?; samples? (2…500); auto_update?: false to detach. Edits a saved associative trace's driving conditions in one undo step
Plot Motion Study
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| study | id|name | Yes | |
| joints | [id|name] | No | default: every joint that moves |
| samples | No | 3…1000, default the study's steps + 1 |
Automation details
Command ID: motion.plot
Parameters:
study: id|name; joints?: [id|name] (default: every joint that moves); occurrence? and point? (a point of a part to follow, as motion.trace takes them); samples? (3…1000, default the study's steps + 1); duration?: seconds the whole study takes, 0.001 or more (velocities and accelerations then per second, else per step) → step: [the study step of each sample], time?: [s], joints: [{joint, name, index, dof, unit, value, velocity, acceleration, velocity_unit, acceleration_unit}] (degrees for angles, mm for distances; angles unwrapped), point?: {occurrence, position: [[x,y,z]…], velocity, acceleration (vectors), speed, acceleration_norm, unit, velocity_unit, acceleration_unit}, samples (taken), stopped_at, stopped_by_loop, stopped_by_contact. The study plays as motion.play plays it, each sample driven from the one before, on a copy (the design is not changed); velocities and accelerations are finite differences between samples (central, one-sided at the ends)
Motion Interference
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| study | id|name | Yes | |
| occurrences | [ids or names] | No | two or more, checked against each other; default every occurrence |
| against | [ids or names] | No | then each of `occurrences` is checked only against these, such as an arm against the parts it must miss |
| contact_sets | true | No | the pairs of the design's contact sets |
| exclude_pairs | [[a, b]] | No | occurrences by id or name: pairs of bodies under a and b are not checked |
| samples | No | 2…1000, default the study's steps + 1 |
Automation details
Command ID: motion.interference
Parameters:
study: id|name; occurrences?: [ids or names] (two or more, checked against each other; default every occurrence), with against?: [ids or names] (then each of `occurrences` is checked only against these, such as an arm against the parts it must miss), or contact_sets?: true (the pairs of the design's contact sets); exclude_pairs?: [[a, b]] (occurrences by id or name: pairs of bodies under a and b are not checked); samples? (2…1000, default the study's steps + 1); budget_s?: seconds (above 0, at most 86400; default a fixed work budget): the time the check may take instead, looked at between samples, for a mechanism such as a gear train that needs longer → collisions: [{a, b, first_step, last_step, steps: [[from, to]…] (the step ranges where they overlap), volume_mm3 (the most volume they share at a sample, worked out exactly from the bodies), deepest_step (the first sample sharing that volume), not_measured (null, or why the volume was not worked out at every sample they overlap, such as a budget it ran past: then volume_mm3 and deepest_step are null, never an estimate), depth_mm (how far into each other at most: an estimate from points of the bodies' contact meshes, not exact)}], clear (every sample checked and none collide; never while truncated), pairs (checked), samples (taken), truncated (the work budget, or budget_s, ran out; checked_to: the last step checked), budget_s (when given), stopped_at, stopped_by_loop. The study plays as motion.play plays it but contact sets do not stop it, on a copy (the design is not changed). Parts are tested at the samples only: one that passes wholly through another between two samples is missed
List Motion Studies
Read the components and joints guide.
Automation details
Command ID: motion.list
No parameter description is provided by the command registry.
Delete Motion Study
Read the components and joints guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| study | Yes |
Automation details
Command ID: motion.delete
Parameters:
study
Other commands: explode
Show Exploded View
| Parameter | Type | Required | Description |
|---|---|---|---|
| view | id|name | Yes | or none: back to the assembled placement |
Automation details
Command ID: explode.show
Parameters:
view: id|name (or none: back to the assembled placement) — shown only; the design keeps its placements
List Exploded Views
Automation details
Command ID: explode.list
No parameter description is provided by the command registry.
Delete Exploded View
| Parameter | Type | Required | Description |
|---|---|---|---|
| view | Yes |
Automation details
Command ID: explode.delete
Parameters:
view
Other commands: layout
Apply Layout
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | apply preset to current workspace through retained runtime | Yes | |
| expected_revision | apply preset to current workspace through retained runtime | No |
Automation details
Command ID: layout.apply
Parameters:
name, expected_revision?: apply preset to current workspace through retained runtime
Inspect Layout
Automation details
Command ID: layout.get
Parameters:
{}: committed state and registered workspace summaries
Reset Layout
| Parameter | Type | Required | Description |
|---|---|---|---|
| expected_revision | restore current workspace's registered default | No |
Automation details
Command ID: layout.reset
Parameters:
expected_revision?: restore current workspace's registered default
Save Layout
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| replace | false | No | overwrite accepted for compatibility |
| expected_revision | save complete envelope in injected catalogue | No |
Automation details
Command ID: layout.save
Parameters:
name, replace?: false (overwrite accepted for compatibility), expected_revision?: save complete envelope in injected catalogue
Select Layout Workspace
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspace | atomically remember outgoing and replace with destination | Yes | |
| expected_revision | atomically remember outgoing and replace with destination | No |
Automation details
Command ID: layout.workspace.select
Parameters:
workspace, expected_revision?: atomically remember outgoing and replace with destination
Other commands: panel
Run Panel Header Action
Automation details
Command ID: panel.action
Parameters:
target or legacy id, action, expected_revision?: invoke a registered owning-controller action
Activate Panel Tab
Automation details
Command ID: panel.activate
Parameters:
target or legacy id, expected_revision?: activate open tab without focus
Close Panel
Automation details
Command ID: panel.close
Parameters:
target or legacy id, expected_revision?: explicit guarded close
Collapse Panel Section
Automation details
Command ID: panel.collapse
Parameters:
target or legacy id, collapsed, expected_revision?
Dismiss Panel Peek
| Parameter | Type | Required | Description |
|---|---|---|---|
| expected_revision | dismiss temporary collapsed-panel presentation | No |
Automation details
Command ID: panel.dismiss
Parameters:
expected_revision?: dismiss temporary collapsed-panel presentation
Float Panel
Automation details
Command ID: panel.float
Parameters:
target or legacy id, destination: new_section with floating location, expected_revision?
Focus Panel
Automation details
Command ID: panel.focus
Parameters:
target or legacy id, expected_revision?: reopen retained state, activate and request focus
Focus Next Panel
| Parameter | Type | Required | Description |
|---|---|---|---|
| expected_revision | resolve the focused shared panel control in the live host | No |
Automation details
Command ID: panel.focus.next
Parameters:
expected_revision?: resolve the focused shared panel control in the live host
Focus Previous Panel
| Parameter | Type | Required | Description |
|---|---|---|---|
| expected_revision | resolve the focused shared panel control in the live host | No |
Automation details
Command ID: panel.focus.previous
Parameters:
expected_revision?: resolve the focused shared panel control in the live host
List Panels
Automation details
Command ID: panel.list
Parameters:
{}: committed state, active tabs, capabilities, availability and registered kinds
Move Panel
Automation details
Command ID: panel.move
Parameters:
target or legacy id, destination: new_section, join_tab or relative, activate?: false, expected_revision?
Move Panel to Next Zone
| Parameter | Type | Required | Description |
|---|---|---|---|
| expected_revision | resolve the focused shared panel control in the live host | No |
Automation details
Command ID: panel.move.next_zone
Parameters:
expected_revision?: resolve the focused shared panel control in the live host
Redock Native Panel Section
| Parameter | Type | Required | Description |
|---|---|---|---|
| target | native_host | Yes | |
| expected_revision | native close redocks without cancelling content | No |
Automation details
Command ID: panel.native_close
Parameters:
target: native_host, expected_revision?: native close redocks without cancelling content
Open Panel
| Parameter | Type | Required | Description |
|---|---|---|---|
| kind | Yes | ||
| instance | Yes | ||
| destination | required for new instance | No | |
| expected_revision | No |
Automation details
Command ID: panel.open
Parameters:
kind, instance, destination?: required for new instance, expected_revision?
Peek Collapsed Panel
Automation details
Command ID: panel.peek
Parameters:
target or legacy id, expected_revision?: transient presentation without resizing
Pop Out Panel
Automation details
Command ID: panel.popout
Parameters:
target or legacy id, destination: new_section with window location, expected_revision?: web lowers to floating
Reset Panel Sash
| Parameter | Type | Required | Description |
|---|---|---|---|
| first | reset adjacent dock pair to registered default ratio | Yes | |
| second | reset adjacent dock pair to registered default ratio | Yes | |
| expected_revision | reset adjacent dock pair to registered default ratio | No |
Automation details
Command ID: panel.reset_pair
Parameters:
first, second, expected_revision?: reset adjacent dock pair to registered default ratio
Resize Panel Section
Automation details
Command ID: panel.resize
Parameters:
target or legacy id, size: {width,height}, thickness_only?: false by default; true changes Bottom height or side column width and ignores the other valid size component, expected_revision?
Resize Panel Sash
| Parameter | Type | Required | Description |
|---|---|---|---|
| first | conserve adjacent dock pair extent | Yes | |
| second | conserve adjacent dock pair extent | Yes | |
| first_size | conserve adjacent dock pair extent | Yes | |
| second_size | conserve adjacent dock pair extent | Yes | |
| expected_revision | conserve adjacent dock pair extent | No |
Automation details
Command ID: panel.resize_pair
Parameters:
first, second, first_size, second_size, expected_revision?: conserve adjacent dock pair extent
Resize Panel Sash Down
Default keyboard shortcut: Down
| Parameter | Type | Required | Description |
|---|---|---|---|
| expected_revision | resolve the focused shared panel control in the live host | No |
Automation details
Command ID: panel.sash.down
Parameters:
expected_revision?: resolve the focused shared panel control in the live host
Resize Panel Sash Left
Default keyboard shortcut: Left
| Parameter | Type | Required | Description |
|---|---|---|---|
| expected_revision | resolve the focused shared panel control in the live host | No |
Automation details
Command ID: panel.sash.left
Parameters:
expected_revision?: resolve the focused shared panel control in the live host
Reset Focused Panel Sash
| Parameter | Type | Required | Description |
|---|---|---|---|
| expected_revision | resolve the focused shared panel control in the live host | No |
Automation details
Command ID: panel.sash.reset
Parameters:
expected_revision?: resolve the focused shared panel control in the live host
Resize Panel Sash Right
Default keyboard shortcut: Right
| Parameter | Type | Required | Description |
|---|---|---|---|
| expected_revision | resolve the focused shared panel control in the live host | No |
Automation details
Command ID: panel.sash.right
Parameters:
expected_revision?: resolve the focused shared panel control in the live host
Resize Panel Sash Up
Default keyboard shortcut: Up
| Parameter | Type | Required | Description |
|---|---|---|---|
| expected_revision | resolve the focused shared panel control in the live host | No |
Automation details
Command ID: panel.sash.up
Parameters:
expected_revision?: resolve the focused shared panel control in the live host
Toggle Focused Panel
| Parameter | Type | Required | Description |
|---|---|---|---|
| expected_revision | resolve the focused shared panel control in the live host | No |
Automation details
Command ID: panel.toggle
Parameters:
expected_revision?: resolve the focused shared panel control in the live host
Other commands: config
Configuration Column
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| param | No | target name | |
| feature | No | target name | |
| material | No | target name | |
| appearance | No | target name | |
| delete | bool | No |
Automation details
Command ID: config.column
Parameters:
param? | feature? | material? | appearance? (target name); delete?: bool
Configuration Row
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | a row's name, or its id from config.table | |
| from | No | row to copy, by name or id; default current values | |
| values | {column key: expression, suppression, material name, appearance name or Look object} | No | |
| rename | No | ||
| delete | bool | No |
Automation details
Command ID: config.row
Parameters:
name (a row's name, or its id from config.table); from? (row to copy, by name or id; default current values); values?: {column key: expression, suppression, material name, appearance name or Look object}; rename?; delete?: bool
Activate Configuration
Read the parameters and expressions guide.
Automation details
Command ID: config.activate
Parameters:
row: a row's name, or its id from config.table — sets its parameter values and suppressions
Preview Configuration
Read the parameters and expressions guide.
Automation details
Command ID: config.preview
Parameters:
row: a row's name, or its id from config.table — validates a rebuild without changing the design or history
Configuration Rule
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| rule | {id,name,enabled,condition,effect} | No | |
| rules | [rule…] | No | added or replaced together, then the rows checked once |
Automation details
Command ID: config.rule
Parameters:
rule?: {id,name,enabled,condition,effect}; rules?: [rule…] (added or replaced together, then the rows checked once); id? + delete?; id? + index? (ordered move)
Configuration Rules
Read the parameters and expressions guide.
Automation details
Command ID: config.rules
Parameters:
ordered typed rules, rows and active state
Other commands: parts
Standard Parts
| Parameter | Type | Required | Description |
|---|---|---|---|
| family | No |
Automation details
Command ID: parts.library
Parameters:
family? → families (name, standard, system: metric|inch, sizes, lengths) and, with family, each size's dimensions (mm)
Insert Part
| Parameter | Type | Required | Description |
|---|---|---|---|
| family | Yes | socket_head_cap_screw | button_head_cap_screw | countersunk_socket_screw | hex_bolt | hex_nut | washer | set_screw | dowel_pin | bearing | hex_cap_screw_inch | hex_nut_inch | washer_sae | washer_uss | |
| size | Yes | "M6", "608" for bearings, "1/2-13 UNC" for inch screws and nuts, "1/2" for inch washers | |
| length | No | mm, inch parts too; screws, bolts, set screws, pins; default a standard length near 2.5 d | |
| flip | bool | No | default false: turned over, head into the material with at, +z against direction with point |
| name | No |
Automation details
Command ID: parts.insert
Parameters:
family (socket_head_cap_screw | button_head_cap_screw | countersunk_socket_screw | hex_bolt | hex_nut | washer | set_screw | dowel_pin | bearing | hex_cap_screw_inch | hex_nut_inch | washer_sae | washer_uss); size ("M6", "608" for bearings, "1/2-13 UNC" for inch screws and nuts, "1/2" for inch washers); length? (mm, inch parts too; screws, bolts, set screws, pins; default a standard length near 2.5 d); at?: [x,y,z] on a hole's rim or wall (the part seats on the hole's face with a rigid joint, head on the picked face and shank into the hole, whichever way the face points) or on a flat face (seated at that point, head out of the face), or a list of them (one component, placed and seated once per pick) | point?: [x,y,z] with direction?: [x,y,z] (no joint: the part's seating plane, under a head or the bottom of a nut, washer or bearing, the top of a set screw, pin or countersunk head, goes to point, and direction is its +z, from the shank's tip toward the head; default [0,0,1], head up, shank down -z); flip?: bool (default false: turned over, head into the material with at, +z against direction with point); name? → component, occurrence, joint?, directions (each placement's head direction in the world, the one chosen), and with at: occurrences, joints (one per pick, in pick order)
Change Part Size
| Parameter | Type | Required | Description |
|---|---|---|---|
| component | id|name of an inserted part | Yes | |
| size | No |
Automation details
Command ID: parts.resize
Parameters:
component: id|name of an inserted part; size?; length? — rebuilds it (joints keep it seated)
Other commands: body
Rename Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | its name | Yes | |
| bodies | several body names | Yes | each in turn gets the first of name, name (2), name (3)… that no other body has |
| name | the new name | Yes | features that use the bodies follow |
Automation details
Command ID: body.rename
Parameters:
body: its name, or bodies: several body names (each in turn gets the first of name, name (2), name (3)… that no other body has), name: the new name (features that use the bodies follow)
Repair Part
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | its name | Yes | a part the modelling kernel refuses, or an open part that should be a solid |
| gap | expr | No | default 0.2 mm, at most 1 mm: free edges that pair up within it are sewn, each sewn edge carrying its own gap as its tolerance |
| patch_holes | bool | No | default false: loops of free edges left are patched, in the plane of the faces around them where those are that plane, else tangent to them, and sewn in; otherwise the reply offers the patches |
| name | No |
Automation details
Command ID: body.repair
Parameters:
body: its name (a part the modelling kernel refuses, or an open part that should be a solid); gap?: expr (default 0.2 mm, at most 1 mm: free edges that pair up within it are sewn, each sewn edge carrying its own gap as its tolerance); patch_holes?: bool (default false: loops of free edges left are patched, in the plane of the faces around them where those are that plane, else tangent to them, and sewn in; otherwise the reply offers the patches); name? → the feature, and repair: what changed face by face (rebuilt and refused faces, sewn gaps, holes with their surface.patch), faces and largest edge tolerance before and after, closed, modelling, volume. Refused with why when nothing applies
Print Face
Default keyboard shortcut: Ctrl+B
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | its name | Yes |
Automation details
Command ID: body.print_face
Parameters:
body: its name; point?: [x, y, z] on a flat face of it, in mm (omit to clear) → {body, face?}: marks the face a slicer export (file.send_to_slicer, file.save_mesh with slicer, file.open_in_easyprint), or an STL or 3MF export with lay_on_print_faces (file.export, file.export_stl, file.export_3mf, file.save_mesh), lays the body on: turned so the face points down at Z = 0, the centre of mass over the origin. One per body, replacing the last; flat faces of solid bodies only. A print face that is gone or no longer flat is reported in the export's warnings, and the body exported as it lies
Other commands: document
Change Design Units
| Parameter | Type | Required | Description |
|---|---|---|---|
| units | mm|cm|m|in|ft | Yes | display and unit-less parameters; values keep their meaning |
Automation details
Command ID: document.units
Parameters:
units: mm|cm|m|in|ft (display and unit-less parameters; values keep their meaning)
Design Properties
Automation details
Command ID: document.metadata
Parameters:
→ metadata: the design's metadata object as saved (other tools' keys too); properties: each of SolidCraft's design properties (project, part number, revision…), its text or null (absent, or not text)
Change Design Properties
Automation details
Command ID: document.metadata.set
Parameters:
key and value, or values: {key: value, …} (all or nothing, one undo step). SolidCraft's keys, the ones document.metadata's properties lists, take text ("" or null removes); another tool's data goes under its reverse-DNS key such as com.example.tool (an object; null removes) → metadata, changed: [keys]
Remove Design Property
| Parameter | Type | Required | Description |
|---|---|---|---|
| key | [keys] | Yes | |
| keys | [keys] | Yes | any key, also one another tool wrote |
Automation details
Command ID: document.metadata.remove
Parameters:
key, or keys: [keys] (any key, also one another tool wrote) → metadata, removed: [keys that were there]
Inspect Design
| Parameter | Type | Required | Description |
|---|---|---|---|
| measure | bool | No | include body measurements |
| sketch_counts | bool | No | each sketch also gives its plane and its number of points and constraints |
| timeline | true| "summary"| false | No | default; each feature as id, name, type, with error, warning, suppressed and rolled_back only when set; left out |
| bodies | true| "names"| false | No | default; only the body names, nothing measured; left out |
Automation details
Command ID: document.inspect
Parameters:
measure?: bool (include body measurements); sketch_counts?: bool (each sketch also gives its plane and its number of points and constraints); timeline?: true (default) | "summary" (each feature as id, name, type, with error, warning, suppressed and rolled_back only when set) | false (left out); bodies?: true (default) | "names" (only the body names, nothing measured) | false (left out)
Design Revision
Automation details
Command ID: document.revision
Parameters:
→ document_id (this open design's id: kept while it stays open, another for each design started or opened), revision (moves whenever the design, what is hidden or a component's uncaptured position changes, never on a selection or a view; from one counter for the whole run, so it never repeats). Read-only
Other commands: view
New Named View
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | No | ||
| camera | {target: [x,y,z], yaw, pitch, distance, fov?} | Yes | replaces a view of the same name |
Automation details
Command ID: view.save
Parameters:
name?; camera: {target: [x,y,z], yaw, pitch, distance, fov?} (replaces a view of the same name)
Rename Named View
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| view | name | Yes | |
| name | Yes |
Automation details
Command ID: view.rename
Parameters:
view: name, name
Delete Named View
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| view | name | Yes |
Automation details
Command ID: view.delete
Parameters:
view: name
List Named Views
Read the window tour.
Automation details
Command ID: view.list
No parameter description is provided by the command registry.
Restore Named View
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| view | front|back|top|bottom|left|right|iso|home| a named view's name | No | frames the model |
| camera | {target: [x,y,z], yaw, pitch, distance, fov?, roll?} | No | radians, mm, about the up axis; yaw: heading of the line of sight, 0 along +Y (Front), π/2 along +X (Left), π (Back), −π/2 (Right); pitch: the eye's elevation, within ±π/2, π/2 = Top; roll defaults to 0, turns the picture clockwise, must be finite and is clamped to ±π; the View angles readout shows these in degrees; up is refused: the up axis comes from the design settings |
Automation details
Command ID: view.apply
Parameters:
view?: front|back|top|bottom|left|right|iso|home (frames the model) | a named view's name; or camera?: {target: [x,y,z], yaw, pitch, distance, fov?, roll?} (radians, mm, about the up axis; yaw: heading of the line of sight, 0 along +Y (Front), π/2 along +X (Left), π (Back), −π/2 (Right); pitch: the eye's elevation, within ±π/2, π/2 = Top; roll defaults to 0, turns the picture clockwise, must be finite and is clamped to ±π; the View angles readout shows these in degrees; up is refused: the up axis comes from the design settings) → camera. The viewport (and the MCP screenshot) moves there. View state: not saved, not an undo step
Viewport Status Details
Read the window tour.
Automation details
Command ID: view.status_details
Parameters:
no parameters → current effect settings/detail capabilities and retained per-seam Continuity diagnostics, with current geometry validity; read-only, no evaluation
Viewport Status Items
Read the window tour.
Automation details
Command ID: view.status_items
Parameters:
no parameters → {items}; persistent viewport effects, oldest slot first, with structured settings and executable clear requests; read-only, no model evaluation
Fit
Default keyboard shortcut: F6
Read the window tour.
Automation details
Command ID: view.fit
Parameters:
no parameters → frame the active canvas or selection; display only
Home View
Read the window tour.
Automation details
Command ID: view.home
Parameters:
no parameters → home orientation framing the active canvas; display only
Navigation Tool
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| tool | orbit|pan|zoom|none | Yes |
Automation details
Command ID: view.tool
Parameters:
tool: orbit|pan|zoom|none → tool; latch a camera tool, none releases it
Drag to Zoom
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| on | bool | No | omitted: toggle |
Automation details
Command ID: view.tool.zoom
Parameters:
on?: bool (omitted: toggle) → on?; latch the Zoom tool for left-button drags. A shortcut assigned in the UI zooms while held
Continuous Orbit
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| on | bool | No | omitted: toggle |
Automation details
Command ID: view.spin
Parameters:
on?: bool (omitted: toggle) → on?; continuous orbit until the next click or key
Visual Style
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| style | shaded_with_edges|shaded|wireframe|shaded_with_hidden_edges | Yes |
Automation details
Command ID: view.visual_style
Parameters:
style: shaded_with_edges|shaded|wireframe|shaded_with_hidden_edges → style, index (0..3 in that order)
Grid
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| on | bool | No | omitted: toggle |
Automation details
Command ID: view.grid
Parameters:
on?: bool (omitted: toggle) → on?; show the viewport grid
Ground Shadow
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| on | bool | No | omitted: toggle |
Automation details
Command ID: view.ground_shadow
Parameters:
on?: bool (omitted: toggle) → on?; show the ground shadow
Navigation Bar
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| visible | bool | No | omitted: toggle |
Automation details
Command ID: view.navigation_bar
Parameters:
visible?: bool (omitted: toggle) → visible?; show the navigation bar (window setting)
Custom View Navigator
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| style | axes|cube|custom | No | |
| body | body name|null | No | |
| texture | themed|modeled | No | |
| arrows | bool | No | |
| home | bool | No |
Automation details
Command ID: view.navigator
Parameters:
style?: axes|cube|custom; body?: body name|null; texture?: themed|modeled; arrows?, home?: bool → the navigator as set; the app's view navigator, never saved in the design; never opens a dialog (a toolbar start opens the Custom View Navigator panel)
Ribbon Tabs Only
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| on | bool | No | omitted: switch |
Automation details
Command ID: view.ribbon_tabs_only
Parameters:
on?: bool (omitted: switch) → on?; fold the ribbon to its tab row, a tab click shows its panels over the view (window setting)
Render Focus View
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| on | bool | Yes |
Automation details
Command ID: view.render_focus
Parameters:
on: bool → {on}; per-window UI state, never saved in the design; headless validation only
Render Frame Guides
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| aspect | 16:9|3:2|1:1|4:5|9:16|custom | No |
Automation details
Command ID: view.render_frame
Parameters:
aspect?: 16:9|3:2|1:1|4:5|9:16|custom; thirds?, safe_area?, centre_mark?: bool. At least one field. Validated transient overlay request, echoed headlessly; never saves guides, changes output size, evaluates geometry or opens a dialog
Render Browser
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| open | bool | Yes | |
| by_look | bool | No | |
| search | bool | No | |
| query | string | No | up to 1024 bytes |
Automation details
Command ID: view.render_browser
Parameters:
open: bool; or by_look?: bool; search?: bool; query?: string (up to 1024 bytes) → validated transient Browser controls; never edits the design or opens a dialog
Render Inspector
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| visible | bool | Yes |
Automation details
Command ID: view.render_inspector
Parameters:
visible: bool → {visible}; per-document Inspector visibility; never edits the design or opens a dialog
Pause or Resume Live Render
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| paused | bool | Yes |
Automation details
Command ID: view.render_live
Parameters:
paused: bool → {paused}; pause or resume this document's live Render preview; headless validation only, never saves settings or changes a final image
Render selection
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| kind | nothing|environment|lighting|light|shot|output|wear|sampling|effects|check | Yes | |
| id | bounded nonempty string for light/shot | No |
Automation details
Command ID: view.render_select
Parameters:
kind: nothing|environment|lighting|light|shot|output|wear|sampling|effects|check; id?: bounded nonempty string for light/shot → validated transient Browser focus; never edits the design or opens a dialog
Render Stage
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| stage | look|light|frame|output | Yes |
Automation details
Command ID: view.render_stage
Parameters:
stage: look|light|frame|output → {stage}; per-document UI state, never edits or evaluates the design; headless validation only
Shots Strip
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| visible | bool | Yes |
Automation details
Command ID: view.shots_strip
Parameters:
visible: bool → {visible}; Render Shots strip UI preference. Headless echo only, no document edits or undo
Move Render Dock
Command group: RENDER › SCENE
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| panel | inspector|browser | Yes | |
| side | left|right | Yes |
Automation details
Command ID: view.render_dock
Parameters:
panel: inspector|browser; side: left|right → {panel, side}; Render dock UI preference; headless echo only, no document edits or undo
Workspace layout
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| mode | floating|compact | Yes |
Automation details
Command ID: view.layout
Parameters:
mode: floating|compact → validated workspace layout; display only, never opens a dialog
History layout
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| width | 1..1000000 | No | |
| dock | bottom|left|under_browser|browser | No | browser: the history in the browser, no timeline |
| collapsed | bool | No |
Automation details
Command ID: view.history_layout
Parameters:
width?: 1..1000000; dock?: bottom|left|under_browser|browser (browser: the history in the browser, no timeline); collapsed?: bool → validated layout request; display only, never opens a dialog
Graphics Preset
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| preset | performance|quality | Yes |
Automation details
Command ID: view.graphics_preset
Parameters:
preset: performance|quality → preset, enabled, display_quality, supersampling, supersampling_adaptive; Quality: AO, Fine, adaptive 2x SSAA; Performance: no AO, Normal, no SSAA
Ambient Occlusion
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| enabled | bool | Yes |
Automation details
Command ID: view.ambient_occlusion
Parameters:
enabled: bool → enabled; apply soft contact shading in the GPU viewport
Origin Axes Across the Whole View
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| enabled | bool | Yes |
Automation details
Command ID: view.origin_axes_across_view
Parameters:
enabled: bool → enabled; extend the origin axes across the view, or keep the short axes when false; display only, never opens a dialog
Perspective view
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| enabled | bool | Yes |
Automation details
Command ID: view.perspective
Parameters:
enabled: bool → enabled; draw the view in perspective, or orthographic when false; a sketch being edited is always shown orthographic
View Angles
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| enabled | bool | Yes |
Automation details
Command ID: view.angle_readout
Parameters:
enabled: bool → enabled; show the view's pitch, yaw and roll (degrees, as view.apply's camera in radians) and Ortho or Persp under the orientation gizmo; display only, never opens a dialog
Navigate View
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| camera | Camera | Yes | |
| direction | [x,y,z] in the camera's up-axis frame | No | |
| action | left|right|up|down|clockwise|counterclockwise|home|fit | Yes | |
| degrees | 0..180 | No | how far left|right|up|down turn; default 90 |
| fit | bool | No | frame the whole model from the new direction as well, as home does; default false |
| motion | pan|orbit|zoom | Yes | |
| delta | [dx,dy] | No | pixels, each ±10000 |
| free_orbit | bool | No | orbit through poles, default false |
| viewport | [width,height] | No | 1..1000000, required for pan or pivot |
| pivot | [x,y,z] | No | |
| factor | 0.05..20 | No | required for zoom |
| anchor | [x,y,z] | No |
Automation details
Command ID: view.navigate
Parameters:
camera: Camera; direction?: [x,y,z] in the camera's up-axis frame; or action: left|right|up|down|clockwise|counterclockwise|home|fit, degrees?: 0..180 (how far left|right|up|down turn; default 90), fit?: bool (frame the whole model from the new direction as well, as home does; default false); or motion: pan|orbit|zoom, delta?: [dx,dy] (pixels, each ±10000), free_orbit?: bool (orbit through poles, default false), viewport?: [width,height] (1..1000000, required for pan or pivot), pivot?: [x,y,z], factor?: 0.05..20 (required for zoom), anchor?: [x,y,z] → camera, fit, continuous?
Normal to Selection
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| camera | Camera | No | default: current session camera or home view |
Automation details
Command ID: view.normal_to
Parameters:
camera?: Camera (default: current session camera or home view) → camera; Look At the first selected planar face or plane, centered on the picked point; repeat while aligned to flip the side; preserves scale and projection
Front View
Default keyboard shortcut: Ctrl+1
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| camera | Camera | No | default: current session camera or home view |
Automation details
Command ID: view.front
Parameters:
camera?: Camera (default: current session camera or home view) → camera; turns to that standard view as the view cube does, keeping target, distance and projection
Back View
Default keyboard shortcut: Ctrl+2
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| camera | Camera | No | default: current session camera or home view |
Automation details
Command ID: view.back
Parameters:
camera?: Camera (default: current session camera or home view) → camera; turns to that standard view as the view cube does, keeping target, distance and projection
Left View
Default keyboard shortcut: Ctrl+3
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| camera | Camera | No | default: current session camera or home view |
Automation details
Command ID: view.left
Parameters:
camera?: Camera (default: current session camera or home view) → camera; turns to that standard view as the view cube does, keeping target, distance and projection
Right View
Default keyboard shortcut: Ctrl+4
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| camera | Camera | No | default: current session camera or home view |
Automation details
Command ID: view.right
Parameters:
camera?: Camera (default: current session camera or home view) → camera; turns to that standard view as the view cube does, keeping target, distance and projection
Top View
Default keyboard shortcut: Ctrl+5
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| camera | Camera | No | default: current session camera or home view |
Automation details
Command ID: view.top
Parameters:
camera?: Camera (default: current session camera or home view) → camera; turns to that standard view as the view cube does, keeping target, distance and projection
Bottom View
Default keyboard shortcut: Ctrl+6
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| camera | Camera | No | default: current session camera or home view |
Automation details
Command ID: view.bottom
Parameters:
camera?: Camera (default: current session camera or home view) → camera; turns to that standard view as the view cube does, keeping target, distance and projection
Isometric View
Default keyboard shortcut: Ctrl+7
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| camera | Camera | No | default: current session camera or home view |
Automation details
Command ID: view.isometric
Parameters:
camera?: Camera (default: current session camera or home view) → camera; turns to that standard view as the view cube does, keeping target, distance and projection
Next Tab
Default keyboard shortcut: Ctrl+Tab
Read the window tour.
Automation details
Command ID: view.next_tab
Parameters:
no parameters → step: 1; the window shows the design tab to the right of the shown one (after the last, the first); never edits the design or opens a dialog
Previous Tab
Default keyboard shortcut: Ctrl+Shift+Tab
Read the window tour.
Automation details
Command ID: view.previous_tab
Parameters:
no parameters → step: -1; the window shows the design tab to the left of the shown one (before the first, the last); never edits the design or opens a dialog
Other commands: note
Add Note
| Parameter | Type | Required | Description |
|---|---|---|---|
| anchor | [x,y,z] | No | the point in model space, mm; without it, where the selection points, or the origin |
| text | the note | Yes | may span lines |
| hidden | bool | No | saved but not drawn |
Automation details
Command ID: note.add
Parameters:
anchor?: [x,y,z] (the point in model space, mm; without it, where the selection points, or the origin); text: the note (may span lines); hidden?: bool (saved but not drawn) → note: id
Edit Note
| Parameter | Type | Required | Description |
|---|---|---|---|
| note | id | Yes | |
| text | the new text | No | |
| anchor | [x,y,z] | No | move the anchor |
| hidden | bool | No | show or hide |
Automation details
Command ID: note.update
Parameters:
note: id; text?: the new text; anchor?: [x,y,z] (move the anchor); hidden?: bool (show or hide) → note: id
Delete Note
| Parameter | Type | Required | Description |
|---|---|---|---|
| note | id | Yes |
Automation details
Command ID: note.delete
Parameters:
note: id → deleted: id
List Notes
Automation details
Command ID: note.list
Parameters:
→ notes: [{id, anchor: [x,y,z], text, hidden}] in creation order
Other commands: selection
Delete
| Parameter | Type | Required | Description |
|---|---|---|---|
| items | [selection items] | No | |
| components | [ids or names] | No | |
| occurrences | [ids or names] | No | |
| canvases | [ids or names] | No | |
| point_clouds | [ids or names] | No | |
| joints | [ids or names] | No | |
| dry_run | bool | No |
Automation details
Command ID: selection.delete
Parameters:
items?: [selection items]; components?, occurrences?, canvases?, point_clouds?, joints?: [ids or names]; dry_run?: bool → deleted, deleted_joints, would_fail, skipped (one undo step)
Get Selection
| Parameter | Type | Required | Description |
|---|---|---|---|
| detail | bool | No | default true: resolve each item's geometry |
Automation details
Command ID: selection.get
Parameters:
detail?: bool (default true: resolve each item's geometry) → {count, items: [{kind (= type: body|face|edge|vertex|feature|sketch_curve|sketch_point|sketch_midpoint|sketch_constraint|profile|plane|axis|construction_point|occurrence…), the selection's own fields as select.set takes them (body, index, point, id, sketch, path…), and with detail: face: name (persistent face name), name_exact, surface ({type: plane|cylinder|cone|sphere|torus|other, normal/point, origin/axis/radius…}), area_mm2, planar; edge: name (persistent edge name), curve (line|circle|arc|other), length_mm, start, end, center/axis/radius for round edges; body: volume_mm3, feature, visible; any body item: component {id, name} and occurrence_path in an assembly; sketch items: sketch (its id, as select.set takes it), sketch_name, entity (line|circle|arc|point|midpoint|…), position for points and midpoints}]}; read-only, [] when nothing is selected
Other commands: ui
Toggle Assistant
Default keyboard shortcut: Ctrl+Shift+A
Automation details
Command ID: ui.assistant
Parameters:
Show or hide Assistant in the app. Headless calls are refused without changing the design
Search Commands
Default keyboard shortcut: S
Automation details
Command ID: ui.palette
Parameters:
Open command search in the app. Headless calls are refused without changing the design
Show/Hide Selection
Default keyboard shortcut: V
Automation details
Command ID: ui.toggle_visibility
Parameters:
Show or hide what is selected in the app. Headless calls are refused without changing the design; browser.visibility takes explicit items
Other commands: edit
Undo
Default keyboard shortcut: Ctrl+Z
Automation details
Command ID: edit.undo
No parameter description is provided by the command registry.
Redo
Default keyboard shortcut: Ctrl+Y
Automation details
Command ID: edit.redo
No parameter description is provided by the command registry.
Repeat Last Command
Default keyboard shortcut: Shift+R
Automation details
Command ID: edit.repeat
Parameters:
Starts the last tool or dialog started in the app again, with its defaults (a toolbar click, not a replay of its values). Only the app has a tool to start: called here it is refused, and changes nothing
Checkpoint
Automation details
Command ID: edit.checkpoint
Parameters:
→ {checkpoint: id}: remember the design, active sketch and undo history (restore with edit.restore_checkpoint; the last 16 are kept, the oldest dropped first)
Restore Checkpoint
| Parameter | Type | Required | Description |
|---|---|---|---|
| checkpoint | id | Yes |
Automation details
Command ID: edit.restore_checkpoint
Parameters:
checkpoint: id; forget?: bool (true = drop it without going back). Goes back to it, undo history included. Restoring uses it and every later checkpoint up: take a new one to go back again. Forgetting drops only it
Other commands: timeline
Play History
Command group: INSPECT › HISTORY
| Parameter | Type | Required | Description |
|---|---|---|---|
| action | toggle|play|stop | No | default toggle |
Automation details
Command ID: timeline.play
Parameters:
action?: toggle|play|stop (default toggle) → action: validated display request; the connected UI plays from the marker to the end with a half-second pause per rebuilt step. Headless callers only validate the request; no dialog, document edit or animation clock is created
Rename
| Parameter | Type | Required | Description |
|---|---|---|---|
| feature | id|name | Yes | |
| name | Yes | references to it follow |
Automation details
Command ID: timeline.rename
Parameters:
feature: id|name, name (references to it follow)
New Feature Folder
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | No | ||
| features | [id|name] | No | |
| joints | [id|name] | No | |
| groups | [folder ids] | No | |
| parent | folder id | No | features and joints leave any other timeline folder |
Automation details
Command ID: timeline.group
Parameters:
name?; features?: [id|name]; joints?: [id|name]; groups?: [folder ids]; parent?: folder id (features and joints leave any other timeline folder)
Remove Feature Folders
| Parameter | Type | Required | Description |
|---|---|---|---|
| group | id | Yes | |
| groups | [ids] | Yes | features and joints remain in the timeline |
Automation details
Command ID: timeline.ungroup
Parameters:
group: id | groups: [ids] (features and joints remain in the timeline)
Rename Feature Folder
| Parameter | Type | Required | Description |
|---|---|---|---|
| group | id | Yes | |
| name | Yes | renames the folder holding features and joints |
Automation details
Command ID: timeline.rename_group
Parameters:
group: id, name (renames the folder holding features and joints)
Move Features to Folder
| Parameter | Type | Required | Description |
|---|---|---|---|
| features | [id|name] | No | |
| joints | [id|name] | No | |
| groups | [ids] | No | |
| group | id | No | omit or null to move to the timeline root |
Automation details
Command ID: timeline.move_to_group
Parameters:
features?: [id|name], joints?: [id|name], groups?: [ids], group?: id (omit or null to move to the timeline root)
Move Timeline Items
| Parameter | Type | Required | Description |
|---|---|---|---|
| features | [id|name] | No | |
| groups | [folder ids] | No | |
| group | folder id | No | |
| position | insertion slot | Yes | |
| active | bool | No | true = the moved contents end up before the history marker, false = behind it; other features keep their state |
Automation details
Command ID: timeline.move_many
Parameters:
features?: [id|name], groups?: [folder ids], group?: folder id, position: insertion slot, active?: bool (true = the moved contents end up before the history marker, false = behind it; other features keep their state); atomically changes folder membership and moves all selected contents as one block
Move Timeline Marker
Automation details
Command ID: timeline.rollback
Parameters:
position: number of features to keep active, or "end" (omit = end)
Roll History Marker
Automation details
Command ID: timeline.roll_to
Parameters:
position: number of features to keep active, or "end" (omit = end) | feature: id|name (the marker goes right after it)
Reorder Feature
| Parameter | Type | Required | Description |
|---|---|---|---|
| feature | id|name | Yes | |
| position | its new index | Yes | |
| active | bool | No | true = it ends up before the history marker, false = behind it; other features keep their state |
Automation details
Command ID: timeline.reorder
Parameters:
feature: id|name, position: its new index, active?: bool (true = it ends up before the history marker, false = behind it; other features keep their state); refused when a feature that worked would fail, unless allow_errors?: bool (default false): then made, and broken: [{feature, error}] lists the features it broke → feature, position: its index now, from: its index before, moved: bool, note?: why nothing moved, or that a position past the end meant the last slot
Reorder Features
| Parameter | Type | Required | Description |
|---|---|---|---|
| features | [id|name] | Yes | |
| position | insertion slot in the current history | Yes | |
| active | bool | No | as timeline.reorder's |
Automation details
Command ID: timeline.reorder_many
Parameters:
features: [id|name], position: insertion slot in the current history; selected features keep their relative order; active?: bool (as timeline.reorder's); refused when a feature that worked would fail, unless allow_errors?: bool (default false): then made, and broken: [{feature, error}] lists the features it broke
Edit Feature
| Parameter | Type | Required | Description |
|---|---|---|---|
| feature | id|name | Yes | |
| command | the feature's command id | Yes | |
| params | its parameters | Yes | the feature is rebuilt in place |
Automation details
Command ID: timeline.redefine
Parameters:
feature: id|name, command: the feature's command id, params: its parameters (the feature is rebuilt in place) → feature, recomputed, restored, rolled_back: bool (the feature is after the history marker, so the edit is not built yet; `note` then says so), warning?
Feature Dependents
| Parameter | Type | Required | Description |
|---|---|---|---|
| feature | id|name | Yes |
Automation details
Command ID: timeline.dependents
Parameters:
feature: id|name → features deleted with it, and features that would fail without it
Suppress Feature
| Parameter | Type | Required | Description |
|---|---|---|---|
| feature | id|name | Yes | |
| features | [id|name] | Yes | |
| groups | [timeline folder ids] | Yes | every feature and joint in those folders and their nested folders; one undo step |
| suppressed | bool | No | default toggles: features and joints are all suppressed unless all of them already are, then all are unsuppressed |
Automation details
Command ID: timeline.suppress
Parameters:
feature: id|name | features: [id|name] | groups: [timeline folder ids] (every feature and joint in those folders and their nested folders; one undo step), suppressed?: bool (default toggles: features and joints are all suppressed unless all of them already are, then all are unsuppressed) → feature: id (or features: [ids]; groups: [ids] and joints: [ids] when groups are given), suppressed
Edit Feature
| Parameter | Type | Required | Description |
|---|---|---|---|
| feature | id|name | Yes | |
| set | {fields to change, merged into the feature's definition as timeline.inspect returns it, e.g. {"extent": {"distance": "30"}} (extrude), {"angle": "90 deg"} (revolve); a dotted key names a nested field ({"plane.distance": "8 mm"} = {"plane": {"distance": "8 mm"}}); expressions are text, or a number in mm or degrees} | Yes |
Automation details
Command ID: timeline.edit
Parameters:
feature: id|name, set: {fields to change, merged into the feature's definition as timeline.inspect returns it, e.g. {"extent": {"distance": "30"}} (extrude), {"angle": "90 deg"} (revolve); a dotted key names a nested field ({"plane.distance": "8 mm"} = {"plane": {"distance": "8 mm"}}); expressions are text, or a number in mm or degrees} → recomputed: features rebuilt, restored: features whose earlier result for the same inputs was reused
Inspect Feature
| Parameter | Type | Required | Description |
|---|---|---|---|
| group | folder id | Yes |
Automation details
Command ID: timeline.inspect
Parameters:
group: folder id → group, name, parent, features, joints; or feature: id|name → type, definition (the fields timeline.edit's set changes, with their current values), inputs: [{label, param, expression, unit}] (named inputs parameters.change can also set), error, warning
Copy Features
| Parameter | Type | Required | Description |
|---|---|---|---|
| features | [ids or names] | Yes | in timeline order on paste |
Automation details
Command ID: timeline.copy
Parameters:
features: [ids or names] (in timeline order on paste)
Paste Features
| Parameter | Type | Required | Description |
|---|---|---|---|
| translate | [x,y,z] | No | moves the copies' geometry |
| component | where the copies go | No | default: the active one |
| component_path | its placement | No | default: the active one, else its only one |
| from_design | true to paste sketch features from the host's cross-design clipboard snapshot | No |
Automation details
Command ID: timeline.paste
Parameters:
translate?: [x,y,z] (moves the copies' geometry); component?: where the copies go (default: the active one), component_path?: its placement (default: the active one, else its only one); the copies go at the marker, each where its original is in the world (copies into their own component keep its coordinates); body transfers are left out; from_design?: true to paste sketch features from the host's cross-design clipboard snapshot
Add Recorded Feature
| Parameter | Type | Required | Description |
|---|---|---|---|
| feature | a feature as the design file and timeline.inspect hold it | Yes | {type, name?, id?, …}; the name is kept even when another feature has it, the id is kept and refused when another feature has it, so later steps can refer to them |
| params | [{name, expression, unit?, comment?}] | No | the model parameters its sketch dimensions use |
Automation details
Command ID: timeline.add
Parameters:
feature: a feature as the design file and timeline.inspect hold it ({type, name?, id?, …}; the name is kept even when another feature has it, the id is kept and refused when another feature has it, so later steps can refer to them); params?: [{name, expression, unit?, comment?}] (the model parameters its sketch dimensions use); the feature goes at the marker → feature, name, error, warning
Export Command Script
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | write the script to this file | No |
Automation details
Command ID: timeline.export_script
Parameters:
path?: write the script to this file → script: {commands: [...]} that rebuilds the design (solidcraft-cli eval/run), steps, omitted: what the script leaves out (appearances, folders, views, configurations, print-face assignments); components and assemblies are not supported yet
Other commands: select
Select
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| items | [{type: body|edge|face|feature|sketch_curve|sketch_point|profile, …}] | Yes | |
| add | bool | No |
Automation details
Command ID: select.set
Parameters:
items: [{type: body|edge|face|feature|sketch_curve|sketch_point|profile, …}], add?: bool; face/edge: body plus point [x,y,z] in world mm or index (both also accepted); a point uses Measure's pick tolerance, an index supplies a point on the item; invalid partial picks leave the selection unchanged
Selection filter
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| mode | body|face|component | Yes |
Automation details
Command ID: select.filter
Parameters:
mode: body|face|component → validated UI pick granularity; headless echo only, no document edits or undo
Clear Selection
Read the window tour.
Automation details
Command ID: select.clear
No parameter description is provided by the command registry.
Select Same Look
Read the window tour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | world body name | No | |
| face | face index | No |
Automation details
Command ID: select.same_look
Parameters:
body?: world body name, face?: face index; defaults to the current body/face selection → selects objects using the resolved appearance
Other commands: parameters
List Parameters
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| favorites | bool | No | only favourites |
| filter | all|user|sketch|feature|favorites | No |
Automation details
Command ID: parameters.list
Parameters:
favorites?: bool (only favourites), filter?: all|user|sketch|feature|favorites → parameters (name, expression, unit, value (mm/deg in every reply), display_value (in its own unit), source, feature/input, comment, favorite, uses, used_by, error) and cycles
Add User Parameter
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| expression | Yes | ||
| unit | as parameters.change | No | text: a text parameter, its expression the text |
| comment | No | ||
| favorite | bool | No |
Automation details
Command ID: parameters.add
Parameters:
name, expression, unit?: as parameters.change (text: a text parameter, its expression the text), comment?, favorite?: bool
Rename Parameter
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| new_name | Yes | expressions, feature inputs and dimensions that use it follow |
Automation details
Command ID: parameters.rename
Parameters:
name, new_name (expressions, feature inputs and dimensions that use it follow)
Delete Parameter
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | refused while something uses it; the error lists the users |
Automation details
Command ID: parameters.delete
Parameters:
name (refused while something uses it; the error lists the users)
Favorite Parameter
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | bool | Yes | |
| favorite | bool | No | default true |
Automation details
Command ID: parameters.favorite
Parameters:
name, favorite?: bool (default true)
Move Parameter
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | another user parameter | Yes | |
| before | another user parameter | Yes | |
| after | another user parameter | Yes |
Automation details
Command ID: parameters.move
Parameters:
name, before | after: another user parameter; the user parameter is listed just before or after it
Comment Parameter
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| comment | Yes |
Automation details
Command ID: parameters.comment
Parameters:
name, comment
Parameter Users
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes |
Automation details
Command ID: parameters.users
Parameters:
name → users (parameters, feature inputs, dimensions) and the features it drives
Parameter Graph
Read the parameters and expressions guide.
Automation details
Command ID: parameters.graph
Parameters:
→ nodes, edges [user, used] (users include Feature:<name>), cycles, errors
Export Parameters
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| format | csv|json | No | default csv, or from the path |
| path | write to a file | No |
Automation details
Command ID: parameters.export
Parameters:
format?: csv|json (default csv, or from the path), path?: write to a file → text
Import Parameters
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| text | CSV | Yes | header with name, expression, unit?, comment? |
Automation details
Command ID: parameters.import
Parameters:
text: CSV (header with name, expression, unit?, comment?) or JSON [{name, expression, unit?, comment?}] | path; all or nothing
Complete Expression
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| prefix | the text before the cursor | No |
Automation details
Command ID: parameters.complete
Parameters:
prefix?: the text before the cursor → word, suggestions [{text, kind: parameter|function|unit|constant, detail}]
Other commands: expr
Evaluate Expression
Read the parameters and expressions guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| expression | length|angle|unitless | Yes | |
| kind | length|angle|unitless | No | or unit?: mm|in|deg…; text: the text a text parameter would hold, as `text` |
Automation details
Command ID: expr.evaluate
Parameters:
expression, kind?: length|angle|unitless (or unit?: mm|in|deg…; text: the text a text parameter would hold, as `text`) → ok, value (mm/rad), display_value, references, error
Other commands: file
New Design
Default keyboard shortcut: Ctrl+N
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | No |
Automation details
Command ID: file.new
Parameters:
name?
Save
Default keyboard shortcut: Ctrl+S
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | No | default: current file; a name that opens as another kind of file, such as .step, .stl or .dxf, is refused: file.export writes those | |
| format | container|json | No | default: json for .json, otherwise container |
| compression | fast|compact | No | default: fast |
| cache | bool | No | the evaluated model, so the design opens without rebuilding; default: true |
| preview | bool | No | saved display meshes, default: false |
| overwrite | bool | No | replace the design's file even though another program or computer changed it since it was opened or saved; without it that save is refused |
| sign | bool | No | the app's own Save only: sign the save with GnuPG, appending a provenance record; container only; a script or agent is refused |
| signing_key | fingerprint or user id | No | default: GnuPG's default signing key |
Automation details
Command ID: file.save
Parameters:
path? (default: current file; a name that opens as another kind of file, such as .step, .stl or .dxf, is refused: file.export writes those); format?: container|json (default: json for .json, otherwise container); compression?: fast|compact (default: fast); cache?: bool (the evaluated model, so the design opens without rebuilding; default: true); preview?: bool (saved display meshes, default: false); overwrite?: bool (replace the design's file even though another program or computer changed it since it was opened or saved; without it that save is refused); sign?: bool (the app's own Save only: sign the save with GnuPG, appending a provenance record; container only; a script or agent is refused); signing_key?: fingerprint or user id (default: GnuPG's default signing key) → signature: {method, fingerprint, user_id?} when signed
Save As
Default keyboard shortcut: Ctrl+Shift+S
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | Yes | a design file name, .sc as a rule; one that opens as another kind of file, such as .step, .stl or .dxf, is refused: file.export writes those | |
| format | container|json | No | default: json for .json, otherwise container |
| compression | fast|compact | No | default: fast |
| cache | bool | No | the evaluated model, so the design opens without rebuilding; default: true |
| preview | bool | No | saved display meshes, default: false |
| overwrite | bool | No | as file.save, when `path` is the design's own file |
| sign | bool and signing_key? | No | as file.save, and likewise only from the app's own Save |
Automation details
Command ID: file.save_as
Parameters:
path (a design file name, .sc as a rule; one that opens as another kind of file, such as .step, .stl or .dxf, is refused: file.export writes those); format?: container|json (default: json for .json, otherwise container); compression?: fast|compact (default: fast); cache?: bool (the evaluated model, so the design opens without rebuilding; default: true); preview?: bool (saved display meshes, default: false); overwrite?: bool (as file.save, when `path` is the design's own file); sign?: bool and signing_key? (as file.save, and likewise only from the app's own Save)
Verify Signature
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | No | default: the design's current file |
Automation details
Command ID: file.verify
Parameters:
path? (default: the design's current file) → {path, status, reason?, truncated, records: [{method, key_id, user_id?, author?, created?, format, covered}]}: status is unsigned, valid, not_covered (signed earlier, saved since without a key), invalid or unsupported
Signing Keys
Read the import and export guide.
Automation details
Command ID: file.gpg_keys
Parameters:
→ {available, keys: [{fingerprint, key_id, user_id, on_card}]}: the GnuPG secret keys a save can sign with (desktop only)
Export
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | Yes | ||
| format | stl|stla|obj|step|3mf|3mf-tagged|glb|urdf|json | No | default from extension; 3mf-tagged: 3MF whose triangles carry their B-rep face, at full precision, for meshing and analysis tools; docs/formats/3mf-face-tags.md; obj: the colours of the bodies go in a material library (`.mtl`) written next to the mesh file; glb: binary glTF in metres with Y up, each body placed and named, its colours, metallic and roughness as materials; a transparent body or face, or a body a render setup gives an image texture or optics, is refused; urdf: the whole assembly as a robot, with STL meshes written next to it; docs/urdf.md |
| bodies | [names] | No | JSON and URDF export the complete design |
| quality | standard|fine|finest | No | STL, OBJ, 3MF and GLB: how closely the mesh follows curved faces, a chord tolerance of 2e-4, 5e-5 or 1e-5 of each body's size; default standard |
| objects | body|component | No | 3MF only: one object per body, the default, or one object for each placed component with two or more bodies, with those bodies as its parts, so a slicer loads them as one object with parts |
| lay_on_print_faces | bool | No | STL and 3MF only, default false: each body with a print face (body.print_face) is written laid on it, as a slicer export lays it → print_faces: the bodies laid, warnings: each body that has a print face but was written as it lies |
Automation details
Command ID: file.export
Parameters:
path; format?: stl|stla|obj|step|3mf|3mf-tagged|glb|urdf|json (default from extension; 3mf-tagged: 3MF whose triangles carry their B-rep face, at full precision, for meshing and analysis tools; docs/formats/3mf-face-tags.md; obj: the colours of the bodies go in a material library (`.mtl`) written next to the mesh file; glb: binary glTF in metres with Y up, each body placed and named, its colours, metallic and roughness as materials; a transparent body or face, or a body a render setup gives an image texture or optics, is refused; urdf: the whole assembly as a robot, with STL meshes written next to it; docs/urdf.md); bodies?: [names] (JSON and URDF export the complete design); urdf only: mesh_prefix? (before each mesh file name, e.g. package://robot/meshes/), effort? (default 1000), velocity? (default 10); quality?: standard|fine|finest (STL, OBJ, 3MF and GLB: how closely the mesh follows curved faces, a chord tolerance of 2e-4, 5e-5 or 1e-5 of each body's size; default standard); objects?: body|component (3MF only: one object per body, the default, or one object for each placed component with two or more bodies, with those bodies as its parts, so a slicer loads them as one object with parts); lay_on_print_faces?: bool (STL and 3MF only, default false: each body with a print face (body.print_face) is written laid on it, as a slicer export lays it → print_faces: the bodies laid, warnings: each body that has a print face but was written as it lies)
Export STEP
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | Yes | ||
| bodies | [names] | No | default: every body; a design with components then exports as a STEP assembly |
Automation details
Command ID: file.export_step
Parameters:
path; bodies?: [names] (default: every body; a design with components then exports as a STEP assembly) → {path, bytes, format}: STEP, whatever the path's extension
Export STL
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | Yes | ||
| bodies | [names] | No | default: every body |
| quality | standard|fine|finest | No | default standard |
| lay_on_print_faces | bool | No | default false: as file.export |
Automation details
Command ID: file.export_stl
Parameters:
path; bodies?: [names] (default: every body); quality?: standard|fine|finest (default standard); lay_on_print_faces?: bool (default false: as file.export) → {path, bytes, format, print_faces?, warnings?}: binary STL, whatever the path's extension
Export 3MF
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | Yes | ||
| bodies | [names] | No | default: every body |
| quality | standard|fine|finest | No | default standard |
| objects | body|component | No | as file.export |
| lay_on_print_faces | bool | No | default false: as file.export |
Automation details
Command ID: file.export_3mf
Parameters:
path; bodies?: [names] (default: every body); quality?: standard|fine|finest (default standard); objects?: body|component (as file.export); lay_on_print_faces?: bool (default false: as file.export) → {path, bytes, format, print_faces?, warnings?}: 3MF, whatever the path's extension
Export OBJ
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | Yes | ||
| bodies | [names] | No | default: every body |
| quality | standard|fine|finest | No | default standard |
Automation details
Command ID: file.export_obj
Parameters:
path; bodies?: [names] (default: every body); quality?: standard|fine|finest (default standard) → {path, bytes, format, files}: OBJ, with the colours of the bodies in a material library (`.mtl`) next to it
Export URDF
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | Yes | ||
| mesh_prefix | No | ||
| effort | No | default 1000 | |
| velocity | No | default 10 |
Automation details
Command ID: file.export_urdf
Parameters:
path; mesh_prefix?; effort? (default 1000); velocity? (default 10) → {path, format, files, links, joints, warnings}: the whole assembly as a robot, with STL meshes written next to it; docs/urdf.md
Save As Mesh
Command group: INSERT › FILES
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | Yes | ||
| format | stl|3mf|3mf-tagged | No | default from the extension, else stl; 3mf-tagged: docs/formats/3mf-face-tags.md |
| bodies | [names] | No | default: all |
| ascii | bool | No | STL |
| single_instance | bool | No | default true; see file.send_to_slicer |
| quality | standard|fine|finest | No | STL, OBJ and 3MF: how closely the mesh follows curved faces, a chord tolerance of 2e-4, 5e-5 or 1e-5 of each body's size; default standard |
| objects | body|component | No | 3MF only: one object per body, the default, or one object for each placed component with two or more bodies, with those bodies as its parts, so a slicer loads them as one object with parts |
| lay_on_print_faces | bool | No | default false: each body with a print face (body.print_face) is saved laid on it; a file sent to `slicer` is laid on them whatever this says |
Automation details
Command ID: file.save_mesh
Parameters:
path; format?: stl|3mf|3mf-tagged (default from the extension, else stl; 3mf-tagged: docs/formats/3mf-face-tags.md); bodies?: [names] (default: all); ascii?: bool (STL); slicer?: id or name from file.slicers, the program path it lists, or a program the user added under Custom… (send the saved file there, through the same steps as file.send_to_slicer: a slicer that has to be started first is waited for; may be deprecated later in favour of file.send_to_slicer or a Send to App workflow, kept for scripts); single_instance?: bool (default true; see file.send_to_slicer); quality?: standard|fine|finest (STL, OBJ and 3MF: how closely the mesh follows curved faces, a chord tolerance of 2e-4, 5e-5 or 1e-5 of each body's size; default standard); objects?: body|component (3MF only: one object per body, the default, or one object for each placed component with two or more bodies, with those bodies as its parts, so a slicer loads them as one object with parts); lay_on_print_faces?: bool (default false: each body with a print face (body.print_face) is saved laid on it; a file sent to `slicer` is laid on them whatever this says)
Send to Slicer
Command group: INSERT › FILES
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| bodies | [names] | No | default: the selected bodies |
| wait | block|return|no | No | default block: a slicer that drops a file at a cold start is started alone and the call waits up to 10 s for it to be ready, then sends; return: start it and answer {starting}; no: send now |
| single_instance | bool | No | default true: PrusaSlicer, SuperSlicer and Cura load the file in the window that is open |
| format | 3mf|stl|3mf-tagged | No | default 3mf, in millimetres; STL if that can't be written |
Automation details
Command ID: file.send_to_slicer
Parameters:
slicer: id or name from file.slicers, or a program the user added under Custom…; bodies?: [names] (default: the selected bodies); wait?: block|return|no (default block: a slicer that drops a file at a cold start is started alone and the call waits up to 10 s for it to be ready, then sends; return: start it and answer {starting}; no: send now); single_instance?: bool (default true: PrusaSlicer, SuperSlicer and Cura load the file in the window that is open); format?: 3mf|stl|3mf-tagged (default 3mf, in millimetres; STL if that can't be written) → saves the bodies in this user's slicer folder and opens the file in the slicer. The file name stays the same for the same design and bodies, so sending again replaces it (use the slicer's Reload from disk)
Open with EasyPrint
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| consent | bool | Yes | required: true only once the user has agreed to upload the model to Printables' servers; it stays there for 30 minutes and opening it needs a Printables sign-in |
| bodies | [names] | No | default: the selected bodies |
| format | 3mf|stl | No | default 3mf, in millimetres |
Automation details
Command ID: file.open_in_easyprint
Parameters:
consent: bool (required: true only once the user has agreed to upload the model to Printables' servers; it stays there for 30 minutes and opening it needs a Printables sign-in); bodies?: [names] (default: the selected bodies); format?: 3mf|stl (default 3mf, in millimetres) → uploads the bodies to EasyPrint, Printables' slicer in the browser, and opens it in the browser. 100 MB at most. Works in the desktop app and the browser build; the CLI has no way to upload yet
Installed Slicers
Read the import and export guide.
Automation details
Command ID: file.slicers
Parameters:
→ the slicers found on this machine: [{id, name, program, icon?}]; pass an id, a name or the program path as file.send_to_slicer's or file.save_mesh's `slicer`
Clear Reused Imports
Read the import and export guide.
Automation details
Command ID: file.import_cache_clear
Parameters:
→ removed: number of local cached imports deleted; leaves open designs and remembered stand-up answers unchanged
Export Current View as DXF
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| camera | Camera | Yes | current view |
| hidden | omit|dashed | No | default omit |
| tolerance | 0.0001..1 mm | No | curve chord tolerance, default 0.01 |
| curves | lines|arcs | No | lines, default, writes the short lines the view is built from; arcs writes visible circles and arcs as CIRCLE and ARC |
| zero | target|origin | No | where the drawing's 0,0 is: the camera target, default, or the model origin as seen from the camera |
| path | .dxf file | No | else returns dxf text |
Automation details
Command ID: file.export_view_dxf
Parameters:
camera: Camera (current view); hidden?: omit|dashed (default omit); tolerance?: 0.0001..1 mm (curve chord tolerance, default 0.01); curves?: lines|arcs (lines, default, writes the short lines the view is built from; arcs writes visible circles and arcs as CIRCLE and ARC); zero?: target|origin (where the drawing's 0,0 is: the camera target, default, or the model origin as seen from the camera); path?: .dxf file (else returns dxf text). Visible placed bodies and shown sketches' profile curves (no construction geometry, points, dimensions or constraints); 2D LINE/LWPOLYLINE entities on VISIBLE/HIDDEN layers (sketch curves on SKETCH), mm; finished sketches are hidden behind bodies, the active sketch is drawn on top; perspective projected onto the camera target plane; no viewport crop or overlays.
Other commands: doc
Open
Default keyboard shortcut: Ctrl+O
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| units | for an STL or OBJ file | No | see file.insert_mesh |
| origin | bool for a mesh file | No | see file.insert_mesh |
| reuse_import | bool | No | STEP/IGES: reuse an unchanged import from the local saved-model cache, default true; false recomputes without reading or writing the cache; → import_reused: bool, content_sha256: exact source digest |
| history | features|solids for a FreeCAD file | No | see file.insert_step |
| components | bool | No | default true |
| silkscreen | bool | No | default true: the silk shapes and text |
| color | "#rrggbb" or [r, g, b] | No | board substrate colour |
| representation | mesh|brep | No | the board itself; default brep: a solid whose faces can be picked |
| read_only | bool | No | a design: saving to its own file is refused, file.save_as keeps the changes elsewhere |
| verify | bool | No | default false: a design's signature is checked and reported, `signature` |
Automation details
Command ID: doc.open
Parameters:
path: .sc design (or a .solidcraft design from an earlier release), .dxf/.svg drawing (opens as a new, unsaved design with an XY sketch, using sketch.insert_dxf/sketch.insert_svg units and defaults), or a .step/.stp/.igs/.fcstd/.3dm/.3mf/.stl/.obj/.glb/.gltf/.kicad_pro/.kicad_pcb file (STEP, IGES, FreeCAD, Rhino, 3MF, STL, OBJ, glTF or KiCad PCB; opens as a new design holding the file as a component named after it, as file.insert_step and file.insert_mesh make), or a .ply/.xyz/.pts point cloud (opens as a new design holding it, as pointcloud.insert makes; its `units` and `max_points` as there); up?: z|y for a STEP, IGES, FreeCAD, Rhino or glTF file (see file.insert_step and file.insert_mesh); names?: auto|solid|product|instance for a STEP, IGES, FreeCAD or Rhino file (see file.insert_step); units?: for an STL or OBJ file (see file.insert_mesh); origin?: bool for a mesh file (see file.insert_mesh); folder?: bool for a STEP, IGES, FreeCAD or Rhino file (see file.insert_step); reuse_import?: bool (STEP/IGES: reuse an unchanged import from the local saved-model cache, default true; false recomputes without reading or writing the cache; → import_reused: bool, content_sha256: exact source digest); history?: features|solids for a FreeCAD file (see file.insert_step); for a KiCad PCB: thickness?: board thickness in mm (default from the board); components?: bool (default true); copper?: "overlay" (default: flat copper just above the board), "none" (leave the traces out) or "mesh" (modelled with thickness; true also means mesh; pads are included whenever copper is enabled); silkscreen?: bool (default true: the silk shapes and text); color?: "#rrggbb" or [r, g, b] (board substrate colour); representation?: mesh|brep (the board itself; default brep: a solid whose faces can be picked); read_only?: bool (a design: saving to its own file is refused, file.save_as keeps the changes elsewhere); verify?: bool (default false: a design's signature is checked and reported, `signature`) → open_elsewhere: {host, user, app, opened} when another SolidCraft has the design open (its lock file is fresh); newer_file: {format, reads_up_to, unknown_changes, not_understood, notice} and warnings when a newer SolidCraft saved it: it opens all the same, and what this version can't read is named there and kept by saving
Recoverable Designs
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| dir | No | default: the recovery folder |
Automation details
Command ID: doc.recovery_list
Parameters:
dir? (default: the recovery folder) → designs autosaved by apps that crashed or closed with unsaved changes
Recover Design
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | Yes | from doc.recovery_list | |
| dir | No | ||
| discard | bool | No | delete the entry once open |
| unsaved | Yes |
Automation details
Command ID: doc.recover
Parameters:
id (from doc.recovery_list); dir?; discard?: bool (delete the entry once open) — opens it with its file path, unsaved
Discard Recovered Design
Read the import and export guide.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | true | Yes | |
| all | true | Yes | |
| dir | No |
Automation details
Command ID: doc.recovery_discard
Parameters:
id, or all: true; dir?
Other commands: appearance
Copy Look
Default keyboard shortcut: Ctrl+Alt+C
| Parameter | Type | Required | Description |
|---|---|---|---|
| target | appearance.chain target | Yes |
Automation details
Command ID: appearance.copy
Parameters:
target: appearance.chain target. Copies its resolved look to a transient session clipboard. No document change or dialogs.
Paste Look
Default keyboard shortcut: Ctrl+Alt+V
Automation details
Command ID: appearance.paste
Parameters:
bodies/faces/components: appearance.assign targets. Applies the copied look atomically in one undo step; no dialogs.
Favorite Look
| Parameter | Type | Required | Description |
|---|---|---|---|
| look | appearance.assign look | Yes | |
| favorite | bool | Yes |
Automation details
Command ID: appearance.favorite
Parameters:
look: appearance.assign look; favorite: bool → validated look and preference request; UI library preference only, no document change or dialogs.
Appearance Chain
| Parameter | Type | Required | Description |
|---|---|---|---|
| target | {body: name} | {body: name, face: zero-based model.faces index} | {component: name or id} | Yes |
Automation details
Command ID: appearance.chain
Parameters:
target: {body: name} | {body: name, face: zero-based model.faces index} | {component: name or id}; a placed copy's name (`KB (K:2)`, `K:2`) means the body or component it shows. Returns steps [{step: face|body|component|material, look: {name,color,opacity,pbr?} or null}] in precedence order and active (step or null). Component material is the common default look of its directly owned bodies, null if mixed/empty. Imported paint is a display fallback outside the four steps. Read-only; no dialogs
Replace Appearance
| Parameter | Type | Required | Description |
|---|---|---|---|
| from | library name | saved look {name,color,opacity,pbr?} | Yes | copy appearance.list in_design |
Automation details
Command ID: appearance.replace
Parameters:
from: library name | saved look {name,color,opacity,pbr?} (copy appearance.list in_design); to: library name | assignment look {appearance? | color, name?, opacity?, pbr?} (appearance.assign rules; no clear). Matches the full look including name and PBR. scope?: {bodies?: [names], components?: [names or ids]} (a placed copy's name means the body or component it shows), at most 10000 targets; body scope includes face overrides, component scope selects only the component override. Omitted scope means all overrides, including hidden/suppressed ones; physical defaults are unchanged. Duplicate targets count once. Returns count of rewritten overrides; zero adds no history. One undo step, atomic; no dialogs. Designs above 100000 overrides refuse
Appearance Library
Automation details
Command ID: appearance.library
Parameters:
→ 20 legacy scalar appearances, six opaque PBR finishes and 40 starter recipes with IDs, categories, provenance, requirements and availability; six starter glass recipes are unavailable
List Appearances
| Parameter | Type | Required | Description |
|---|---|---|---|
| body | name | No | or a placed copy's, `KB (K:2)`: the body it shows |
Automation details
Command ID: appearance.list
Parameters:
body?: name (or a placed copy's, `KB (K:2)`: the body it shows) → assigned appearances; with body, its resolved look and its faces' (face index, look)
Paint Appearance
Default keyboard shortcut: B
Automation details
Command ID: appearance.paint
Parameters:
appearance or color/name/opacity/pbr: appearance.assign look parameters; validates and returns look for ui.start paint. done?: true ends the UI tool. Programmatic calls never open UI.
Pick Up Appearance
Default keyboard shortcut: I
| Parameter | Type | Required | Description |
|---|---|---|---|
| target | appearance.chain target | No |
Automation details
Command ID: appearance.pick_up
Parameters:
target?: appearance.chain target; returns its resolved look, or requests the UI sampling tool when omitted. Programmatic calls never open UI.
Other commands: material
List Materials
Automation details
Command ID: material.list
Parameters:
→ built-in and design-owned materials (user: true, look, optional physical_card/physical_validation/density_comparison). Read-only; candidate engineering records do not certify sources or supply a solver
New Physical Material
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | not a built-in material's | |
| density_g_cm3 | Yes | ||
| appearance | library name | No | appearance.library |
| color | "#rrggbb" or [r, g, b] | No | 0–255 |
| opacity | No | 0–1 | |
| pbr | {metallic:0..1, roughness:0.045..1, dielectric_ior:1..3} | No | opaque only, needs color/appearance |
| pbr | null selects scalar shading | Yes |
Automation details
Command ID: material.create
Parameters:
name (not a built-in material's); density_g_cm3: (0, 1000]; appearance?: library name (appearance.library) | color?: "#rrggbb" or [r, g, b] (0–255), opacity? (0–1), pbr?: {metallic:0..1, roughness:0.045..1, dielectric_ior:1..3} (opaque only, needs color/appearance): the default look. A named appearance keeps its preset response when pbr is omitted; pbr: null selects scalar shading. Optical edits do not change density. physical_card?: validated SI candidate record (null/omitted means unknown); card density never changes assigned density. Assign it with material.assign
Edit Physical Material
| Parameter | Type | Required | Description |
|---|---|---|---|
| material | a material defined in this design | Yes | |
| name | No | bodies and configuration cells follow | |
| density_g_cm3 | No | ||
| appearance | No | ||
| color | No | ||
| opacity | No | ||
| pbr | No | as material.create; color: null clears the look |
Automation details
Command ID: material.edit
Parameters:
material: a material defined in this design; name? (bodies and configuration cells follow); density_g_cm3?; appearance? | color?, opacity?, pbr? (as material.create; color: null clears the look). physical_card?: validated SI candidate record (omitted retains, null clears). Omitted appearance/color retains the entire current look
Inspect Physical Material
Automation details
Command ID: material.inspect
Parameters:
material: built-in or design-owned name. Returns assigned density, default appearance, optional physical_card, validation and density comparison. Read-only; missing engineering data remains unknown and card density does not change mass
Delete Physical Material
| Parameter | Type | Required | Description |
|---|---|---|---|
| material | a material defined in this design | Yes | |
| replace | material for the bodies and configuration cells that use it | No | without it, a material in use is refused |
Automation details
Command ID: material.delete
Parameters:
material: a material defined in this design; replace?: material for the bodies and configuration cells that use it (without it, a material in use is refused)
Validate Physical Material Data
Automation details
Command ID: material.properties.validate
Parameters:
card: schema_version 1 engineering material card in SI units. Returns numerical consistency, derived isotropic moduli, missing conditions and sources needing review. Read-only; does not assign/save properties or provide an analysis solver. See docs/physical-material-cards.md
Directional Elastic Modulus
| Parameter | Type | Required | Description |
|---|---|---|---|
| card | schema_version 1 engineering material card | Yes |
Automation details
Command ID: material.properties.directional
Parameters:
card: schema_version 1 engineering material card; direction: three finite nonzero-vector components in the card's material-local axes. Returns normalized direction, Young modulus in Pa and source/condition review. Read-only constitutive query; no structural solver, persistence or body-axis assignment. See docs/physical-material-cards.md
Other commands: engine
List Commands
Automation details
Command ID: engine.commands
No parameter description is provided by the command registry.
Describe Command
Automation details
Command ID: engine.describe
Parameters:
command: a command id. Returns {id, label, params, input, output} (and param_warnings in the warn parameter-check mode): the command's parameter documentation and, once the command has a typed contract, the JSON Schemas (2020-12) of its parameters and of a successful result (null otherwise). Read-only.
Other commands: library
Inspect Local Library
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | v1/v2 library JSON | Yes |
Automation details
Command ID: library.inspect
Parameters:
path: v1/v2 library JSON; returns validated catalog and exact entry revisions, without changing the design
Export Design Library
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | .json | Yes |
Automation details
Command ID: library.export
Parameters:
path: .json; id? (default user.local), name?, provenance?, overwrite? false, format? solidcraft-library/2 (default) | solidcraft-library/1 (refuses PBR/cards). Copies assigned looks and design-local physical definitions; never changes the design
Apply Local Library Entry
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | Yes | ||
| entry | qualified ID | Yes | |
| revision | exact content SHA-256 | Yes | |
| targets | {bodies?, faces?: [{body,point}], components?} | No | |
| name | physical material name on import | No |
Automation details
Command ID: library.apply
Parameters:
path, entry: qualified ID, revision: exact content SHA-256; targets?: {bodies?, faces?: [{body,point}], components?}; name?: physical material name on import. Copies values in one undo step; material conflicts are explicit
Other commands: settings
Settings Profiles
Automation details
Command ID: settings.profile.list
Parameters:
→ profiles: [name], active: name|null; handled by the app
Save Settings Profile
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | 1..64 characters | Yes |
Automation details
Command ID: settings.profile.save
Parameters:
name: 1..64 characters → name; keeps the current input and interface settings under `name` (replacing a profile of that name) and makes it the active one
Apply Settings Profile
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes |
Automation details
Command ID: settings.profile.apply
Parameters:
name → name, applied, skipped: [preference]; switches every setting the profile holds at once
Rename Settings Profile
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | 1..64 characters | Yes | |
| to | 1..64 characters | Yes |
Automation details
Command ID: settings.profile.rename
Parameters:
name, to: 1..64 characters → name
Delete Settings Profile
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes |
Automation details
Command ID: settings.profile.delete
Parameters:
name → deleted
Export Settings Profile
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | file | Yes | |
| path | file | No |
Automation details
Command ID: settings.profile.export
Parameters:
name, path?: file → profile (a `solidcraft-profile/1` document), written to `path` when given; never opens a dialog
Import Settings Profile
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | file | Yes | |
| profile | solidcraft-profile/1 document | Yes | |
| name | 1..64 characters | No |
Automation details
Command ID: settings.profile.import
Parameters:
path: file | profile: `solidcraft-profile/1` document, name?: 1..64 characters → name; adds the profile without switching to it
Other commands: diagnostics
Crash Reports
Automation details
Command ID: diagnostics.crash_reports
Parameters:
limit?: number (default 20). Lists this computer's crash reports, newest first: {dir, reports: [{id, kind, time, message, command, count, version, path, replayable}]}. kind: command_panic | panic | kernel_panic_recovered | unclean_exit. Read one with diagnostics.crash_report; reproduce it with `solidcraft-cli crashes replay <id>`
Crash Report
Automation details
Command ID: diagnostics.crash_report
Parameters:
id: report id. The whole report: message, location, backtrace, app version and commit, system, the command that crashed and the recent ones, notes, and design_path / replay_path when the crash can be replayed (`solidcraft-cli run <replay_path> --in <design_path>`)
Delete Crash Reports
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | one report | No | default: all |
Automation details
Command ID: diagnostics.crash_reports.clear
Parameters:
id?: one report (default: all). Returns {deleted}
Profile
| Parameter | Type | Required | Description |
|---|---|---|---|
| enabled | bool | No | start or stop recording |
| reset | bool | No | forget what was recorded |
| top | rows | No | default 20, 0: all |
Automation details
Command ID: diagnostics.profile
Parameters:
enabled?: bool (start or stop recording); reset?: bool (forget what was recorded); top?: rows (default 20, 0: all); trace?: path (write the recorded spans as a Chrome trace-event file, for chrome://tracing or Perfetto). Returns what was recorded before enabled and reset apply: {compiled, enabled, wall_ms, spans, dropped, by_category: [{category, self_ms, share}], rows: [{category, name, count, total_ms, self_ms, max_ms}], rows_total, trace?}, the rows the most self time first. Categories: solidcore (the kernel's calls), kernel, feature (one per feature computed, by its type), doc, command, import (STEP/IGES stages), io. Self time is a span's time less the spans inside it; total counts its outermost run only. Recording also starts with SOLIDCRAFT_PROFILE=1, the CLI's --profile and the app's preference; off, it costs nothing measurable. Read-only
Validation
Automation details
Command ID: diagnostics.validation
Parameters:
mode?: each_step | each_feature | off (default: leave it). When the kernel's full check runs on the features computed from now on: after every sweep, boolean and blend (each_step), once on the bodies each feature makes or changes (each_feature, the default; a body it refuses still fails its feature, with the check's reason), or never (off, experimental). Results already there stand until their features are computed again (timeline.compute_all). The app's preference of the same name sets it. Returns {mode, previous}
Crash Test
Automation details
Command ID: diagnostics.crash_test
Parameters:
mode: panic | kernel | worker | worker_raw | abort. Checks that crash reports work: panic = an internal error in this command (caught; the design is unchanged), kernel = one inside the geometry kernel (caught), worker / worker_raw = one on a Rayon worker, caught inside / outside the kernel's guard, abort = the app ends at once (reported at the next start). Only when the SOLIDCRAFT_CRASH_TEST environment variable is set
Other commands: render
Import Surface Maps
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| set | typed CPU raytrace or GPU path setup patch | No | |
| frame | world-mm origin/u/v physical repeat vectors | Yes | |
| maps | explicit base_color_srgb/normal_opengl/roughness_linear/metallic_linear {path,expected_sha256?} | Yes | |
| provenance | {author,source,license} | Yes | |
| normal_strength | 1 | No | |
| flip_v | false | No | |
| replace | false | No |
Automation details
Command ID: render.surface.import
Parameters:
name; set?: typed CPU raytrace or GPU path setup patch; body_index and body_name from render.scene; frame: world-mm origin/u/v physical repeat vectors; maps: explicit base_color_srgb/normal_opengl/roughness_linear/metallic_linear {path,expected_sha256?}; provenance:{author,source,license}; normal_strength?:1; flip_v?:false; replace?:false. Captures exact PNG/JPEG bytes and saves definition-local binding in one undo. CPU maps require noninterlaced 8-bit PNG. Saved designs reopen without the source files.
List Embedded Surface Images
Automation details
Command ID: render.texture.list
Parameters:
No parameters. Lists bounded design-owned texture digests, byte counts, dimensions, declared provenance and referencing setups; never returns image bytes or source filesystem paths.
Remove Embedded Surface Image
Automation details
Command ID: render.texture.remove
Parameters:
sha256: exact embedded image digest. Refuses while any saved setup uses the image, listing its users. Removing an unused image is one undo step.
Set Render Environment
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| set | numerical setup patch | No |
Automation details
Command ID: render.environment.set
Parameters:
name; set?: numerical setup patch; rotation_deg?: finite degrees within +/-1000000, wrapped to [-180,180); intensity?: finite linear intensity 0..64 CPU HDR/constant or 0..100 CPU/GPU Sky and GPU HDR. Edits the existing HDR, sky or constant environment in one undo, without selecting a source, moving the camera or starting a render. Absent environments and raster refuse.
Set Render Light
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| settings | full unsaved RenderSetup | No | |
| expected_revision | u64 | No |
Automation details
Command ID: render.lights.set
Parameters:
name; id except add; settings?: full unsaved RenderSetup; expected_revision?:u64; set for set/add: kind directional/point/spot/area, intensity_ev, temperature_k, softness, azimuth_deg, elevation_deg, distance_mm, size_mm, aim_at, width_mm, height_mm, position_mm, direction, edge_u_mm, edge_v_mm, radiance, colour, reference_distance_mm, minimum_distance_mm. Validated finite light edit in one undo. Existing family caps and backend support apply; refusal is atomic. Names remain defaults.
Add Light
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| settings | full unsaved RenderSetup | No | |
| expected_revision | u64 | No |
Automation details
Command ID: render.lights.add
Parameters:
name; id except add; settings?: full unsaved RenderSetup; expected_revision?:u64; set for set/add: kind directional/point/spot/area, intensity_ev, temperature_k, softness, azimuth_deg, elevation_deg, distance_mm, size_mm, aim_at, width_mm, height_mm, position_mm, direction, edge_u_mm, edge_v_mm, radiance, colour, reference_distance_mm, minimum_distance_mm. Validated finite light edit in one undo. Existing family caps and backend support apply; refusal is atomic. Names remain defaults.
Duplicate Render Light
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| settings | full unsaved RenderSetup | No | |
| expected_revision | u64 | No |
Automation details
Command ID: render.lights.duplicate
Parameters:
name; id except add; settings?: full unsaved RenderSetup; expected_revision?:u64; set for set/add: kind directional/point/spot/area, intensity_ev, temperature_k, softness, azimuth_deg, elevation_deg, distance_mm, size_mm, aim_at, width_mm, height_mm, position_mm, direction, edge_u_mm, edge_v_mm, radiance, colour, reference_distance_mm, minimum_distance_mm. Validated finite light edit in one undo. Existing family caps and backend support apply; refusal is atomic. Names remain defaults.
Remove Render Light
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| settings | full unsaved RenderSetup | No | |
| expected_revision | u64 | No |
Automation details
Command ID: render.lights.remove
Parameters:
name; id except add; settings?: full unsaved RenderSetup; expected_revision?:u64; set for set/add: kind directional/point/spot/area, intensity_ev, temperature_k, softness, azimuth_deg, elevation_deg, distance_mm, size_mm, aim_at, width_mm, height_mm, position_mm, direction, edge_u_mm, edge_v_mm, radiance, colour, reference_distance_mm, minimum_distance_mm. Validated finite light edit in one undo. Existing family caps and backend support apply; refusal is atomic. Names remain defaults.
List Render Lights
| Parameter | Type | Required | Description |
|---|---|---|---|
| setup | saved setup name OR settings?: complete RenderSetup snapshot | No |
Automation details
Command ID: render.lights.list
Parameters:
setup?: saved setup name OR settings?: complete RenderSetup snapshot; neither uses defaults. Returns {lights:[{id,kind,name,name_key,number,implicit,intensity,colour,...spatial fields}]}. IDs are kind:zero-based-source-slot, stable across numerical edits but not family changes/reordering/removal/rig replacement; point and spot share punctual slots. Includes implicit default/preset lights. GPU RGB radiance is factored as colour * intensity; area edges are full world-mm vectors. Read-only, no host, camera change, save, render, model evaluation or undo. See docs/render-settings.md.
Layered Surface Aging
Automation details
Command ID: render.aging.describe
Parameters:
Empty object. Read-only original Rust/patina/dust/grime/scratch/chip/fading presets and exact GPU aging contract. UI activation opens the shared Aging tab; edits remain a saved render draft, never engineering geometry or material-property mutation.
Lens and Creative Effects
Automation details
Command ID: render.effects.describe
Parameters:
Empty object. Read-only original photographic/creative filter defaults and constraints. UI activation opens shared Effects controls. Saved finishing and exact-master regrading preserve raw EXR bytes; no physical lens or branded-film calibration is implied.
Save Clear Coat
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| set | numerical setup patch | No | |
| expected_revision | Yes | ||
| coat | {weight:0..1,roughness:0.045..1,ior:1..3} | Yes | |
| replace | false | No |
Automation details
Command ID: render.coat.bind
Parameters:
name; set?: numerical setup patch; body_index/body_name: exact render.scene identity; expected_revision; coat:{weight:0..1,roughness:0.045..1,ior:1..3}; replace?:false. Stores up to the existing 64 target bound as stable definition/feature/component/occurrence bindings for CPU/GPU. Even zero-weight coats require opaque targets. Same-target Glass refuses. One undo; no geometry, engineering material or appearance mutation.
Remove Clear Coat
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| target | exact saved definition/feature/component/occurrence_path | Yes |
Automation details
Command ID: render.coat.unbind
Parameters:
name; target: exact saved definition/feature/component/occurrence_path; expected_revision. Removes only that stable coat assignment in one undo, without device or file access.
Save Optical Binding
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | CPU or GPU setup | Yes | |
| set | complete numerical setup patch | No | |
| expected_revision | Yes | ||
| optics | {ior,absorption_per_mm:[r,g,b],boundary:closed_mesh|closed_box|thin_sheet,thickness_mm,shadow_transmission,subsurface?:{scattering_per_mm,anisotropy},model?:{roughness:0..1,dispersion?:{abbe_number:5..200},thin_film?:{ior:1..3,thickness_nm:0..100000}}} | Yes |
Automation details
Command ID: render.optics.bind
Parameters:
name: CPU or GPU setup; set?: complete numerical setup patch; body_index and body_name: exact captured target; expected_revision; optics:{ior,absorption_per_mm:[r,g,b],boundary:closed_mesh|closed_box|thin_sheet,thickness_mm,shadow_transmission,subsurface?:{scattering_per_mm,anisotropy},model?:{roughness:0..1,dispersion?:{abbe_number:5..200},thin_film?:{ior:1..3,thickness_nm:0..100000}}}; replace?:false. The optional model adds isotropic rough transmission, three-band dispersion and one lossless coherent film. CPU models require explicit Path; rough sheets require straight transmitted shadows off. See docs/render-glass-material-models.md. Stores stable definition/feature/occurrence identity in one undo without modifying engineering geometry/materials. CPU Path consumes at most 128 certified optical targets; the legacy non-Path producer retains eight. Without options.path, sheets and axis-aligned boxes retain the existing transport. Explicit progressive options.path enables exact closed-mesh certification, bounded nested convex-parent media, Beer/Snell/Fresnel and thin transmitted shadows; touching or unproven boundaries and closed transmitted-shadow connections refuse explicitly. Existing subsurface parameters may be consumed on certified closed Path media with denoising explicitly off; scalar free-flight/HG walks and separate Beer absorption are supported without refracting-boundary next-event approximation. A zero scattering rate preserves transport. GPU nested media require separate job.options.nested_media and producer certification. Unresolved or incompatible targets refuse atomically.
Remove Optical Binding
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | saved setup | Yes | |
| target | exact saved definition/feature/component/occurrence_path | Yes |
Automation details
Command ID: render.optics.unbind
Parameters:
name: saved setup; target: exact saved definition/feature/component/occurrence_path; expected_revision. Removes only that optical assignment in one undo without a device or file access.
Regrade Linear Master
| Parameter | Type | Required | Description |
|---|---|---|---|
| job | exact completed JobId | No | default selected result |
Automation details
Command ID: render.result.regrade
Parameters:
job?: exact completed JobId (default selected result); presentation: {exposure_ev?,tone_map?,finishing?,backdrop?,background?,transparent_background?}. Queues cancellable nondestructive PNG presentation from that retained native FLOAT32 master, not from PNG. Captured geometry/camera/lighting and source EXR remain unchanged; no path tracing, denoising, external EXR import or automatic file writes. Returns a distinct job with source identity and original-master digest. Existing frame retention and export rules still apply.
Set Render Camera
Automation details
Command ID: render.camera.set
Parameters:
camera: complete Render Camera snapshot (target, yaw, pitch, distance, fov; roll defaults to 0 and up to z). Validates the same finite mm/radian bounds as saved render intent, preserves explicit roll/up and changes only transient view state. No model evaluation, setup save, renderer, dirty flag or undo step. Design view.apply retains its separate up-axis policy.
Inspect Render Camera
Automation details
Command ID: render.camera.get
Parameters:
No parameters. Returns the explicitly defined current view camera, or null if the session has no camera override. No camera is fitted, no job is started and no saved setup or engineering document is changed.
Frame Render Subject
Automation details
Command ID: render.camera.fit
Parameters:
aspect?: the picture's width over its height, 0.000001 to 1000000 (default 1). Fits the current camera to the visible product bounds through the shared Camera::fit contract, moving back for a picture taller than wide so its sides hold the product too; changes only view state, not a saved setup, rendering job, stage or engineering geometry.
Review Native Studio
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | NATIVE-STUDIO-001..025 | Yes | |
| name | Yes | ||
| set | typed CPU/GPU setup patch | No |
Automation details
Command ID: render.preset.resolve
Parameters:
id: NATIVE-STUDIO-001..025; name; set?: typed CPU/GPU setup patch; expected_revision?:u64. Resolves original built-in HDR/rig/passive ground with conservative geometry clearance, returns all replacements and preserved fields without mutation. Unbound SCENE-* concepts are not accepted.
Apply Native Studio
Automation details
Command ID: render.preset.apply
Parameters:
Same reviewed input as render.preset.resolve, expected_revision required, replace_lighting_and_environment:true and replace_stage:true when an existing stage would change. Re-resolves the complete candidate and publishes one undo or no mutation; camera, optical bindings, geometry and engineering materials are preserved.
Review Fixed Sampling Budget
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | Q-* | Yes |
Automation details
Command ID: render.quality.prepare
Parameters:
id: Q-*; variant:fixed_samples_png for the existing GPU projection, or cpu_progressive_png for Q-001/002/003 CPU cost budgets; acknowledge_omissions:true. Optional cpu:{minimum_budget:compact|studio|workstation,adaptive?:captured AdaptiveSampling} selects the smallest existing profile admitting pilots plus production without lowering minimum_budget. CPU budgets use authored sizes, 16/32/64 production samples and seed21026; preserve transport depth, denoise, optics and effects. Read-only numerical projections, not convergence/time guarantees or complete quality acceptance. Never switches executor, adopts fixed CPU sampling or mutates a shot.
Duplicate Render Shot
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | u64 | Yes | |
| new_name | u64 | Yes | |
| expected_revision | u64 | Yes |
Automation details
Command ID: render.shot.duplicate
Parameters:
name, new_name, expected_revision:u64. Copies exact saved setup and resource references in one undo. Existing destinations refuse; captured jobs and camera navigation are unchanged.
Rename Render Shot
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | u64 | Yes | |
| new_name | u64 | Yes | |
| expected_revision | u64 | Yes |
Automation details
Command ID: render.shot.rename
Parameters:
name, new_name, expected_revision:u64. Renames exact saved setup in one undo; an existing destination or stale review refuses.
Remove Render Shot
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | u64 | Yes | |
| expected_revision | u64 | Yes |
Automation details
Command ID: render.shot.remove
Parameters:
name, expected_revision:u64. Removes only that saved setup in one undo; retains resources, geometry and captured results.
Inspect Original Surface Map
Automation details
Command ID: render.library.preview
Parameters:
id: SURF-*. Returns bounded hash-verified original base-color PNG bytes and source-map fidelity label, not a rendered material thumbnail. No external paths, rendering or document edits.
Prepare Physical Reference
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | named built-in physical profile | Yes | |
| name | proposed new material label | Yes | |
| acknowledge_reference | true | Yes |
Automation details
Command ID: render.library.physical.prepare
Parameters:
id: named built-in physical profile, name: proposed new material label, acknowledge_reference:true. Read-only loss-aware creation plan using native ValidatedCard admission and one point density; returns source receipts, extended fields and omissions. Does not execute material.create, assign bodies or infer effective-part physics.
Save Render Ground
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | typed raytrace setup | Yes | |
| set | setup patch | No | |
| margin_fraction | 0.25 | No | |
| gap_mm | 0.1 | No | |
| reflectance_linear | [0.18,0.18,0.18] | No | |
| replace_stage | false | No |
Automation details
Command ID: render.stage.ground
Parameters:
name: typed raytrace setup, set?: setup patch, margin_fraction?:0.25, gap_mm?:0.1, reflectance_linear?:[0.18,0.18,0.18], replace_stage?:false. Fits one finite passive ground below the visible product once and saves its physical transforms in one undo. Product AABB separation is rechecked on every render.
Save Physical Render Background
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | typed raytrace setup | Yes | |
| set | setup patch | No | |
| kind | floor_wall or cyclorama | Yes | |
| reflectance_linear | [0.18,0.18,0.18] | No | |
| expected_revision | reviewed revision | Yes | |
| replace_stage | false | No |
Automation details
Command ID: render.stage.backdrop
Parameters:
name: typed raytrace setup, set?: setup patch, kind: floor_wall or cyclorama, reflectance_linear?: [0.18,0.18,0.18], expected_revision: reviewed revision, replace_stage?:false. Fits a finite floor/wall or a 24-strip polygonal cyclorama behind the visible subject using the saved camera azimuth; world +Z up and a minimum one-mm stage envelope. Preserves subject geometry, lighting, output, pose and engineering materials; one undo and rechecked product separation. Not an infinite/analytically smooth/terrain background.
Remove Render Stage
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | setup | Yes | |
| set | setup patch | No |
Automation details
Command ID: render.stage.clear
Parameters:
name: setup, set?: setup patch. Removes saved render-only panels atomically; CAD geometry and lighting are unchanged.
Save Surface Binding
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | CPU or GPU setup | Yes | |
| set | setup patch | No | |
| surface | same input as render.library.surface.prepare | Yes |
Automation details
Command ID: render.library.surface.bind
Parameters:
name: CPU or GPU setup; set?: setup patch; surface: same input as render.library.surface.prepare; replace?: false. Pins exact source hashes and definition/feature/occurrence identity with local-mm mapping in one undo. No paths, mesh ordinals or physical material changes.
Remove Surface Binding
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | setup | Yes | |
| target | saved definition/feature/component/occurrence_path | Yes | |
| set | setup patch | No |
Automation details
Command ID: render.library.surface.unbind
Parameters:
name: setup, target: saved definition/feature/component/occurrence_path, set?: setup patch. Removes only that explicit binding in one undo; no device or current geometry required.
Retain Displayed Render Result
Automation details
Command ID: render.result.pin
Parameters:
job?: completed JobId (default selected result), or null to clear selection. Selects within the eight retained completed results; oldest is evicted first. Preserves exact export bytes and original host memory accounting. No design/undo change; preview or foreign jobs refuse.
Find Render Library Targets
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | exact-name substring | No | |
| offset | 0 | No |
Automation details
Command ID: render.library.targets
Parameters:
query?: exact-name substring; offset?:0; limit?:128 (1..128). Returns a bounded page of captured body ordinals/names, revision and scene bounds. Settles the model through ordinary command handling; never returns a large mesh payload.
Browse Render Library
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | bounded search | No | |
| availability | all/usable/specification/blocked | No | |
| offset | 0 | No |
Automation details
Command ID: render.library.list
Parameters:
kind?: surfaces, selene_appearances, hdr, rigs, scenes, materials, lighting, environments, quality, native_scenes, selene_shots or capabilities; query?: bounded search; availability?: all/usable/specification/blocked; offset?:0; limit?:48 (1..128). Returns source status and explicit implemented projections separately. No device, file IO or design change.
Inspect Render Library Resource
Automation details
Command ID: render.library.describe
Parameters:
kind, id: exact authored resource. Returns original specification, runtime projection variants and explicit omissions. A concept is not an executable preset.
Apply Library Opaque Appearance
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | SURF-* or SELENE-AP-* | Yes | |
| variant | uniform_opaque | Yes | required |
Automation details
Command ID: render.library.appearance.apply
Parameters:
id: SURF-* or SELENE-AP-*; variant: uniform_opaque (required); bodies: 1..256 exact body names. Applies the original scalar baseline through ordinary appearance assignment in one undo, preserving physical properties. Spatial maps and advanced target effects are explicitly excluded.
Apply Built-in HDR Environment
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | HDR-* | Yes | |
| name | saved setup | Yes | |
| set | typed CPU/GPU setup patch | No | |
| rotation_rad | authored rotation | No | native origin offset is explicit in the reply |
| intensity | 1 | No | |
| samples | 16 for CPU | No |
Automation details
Command ID: render.library.environment.apply
Parameters:
id: HDR-*; name: saved setup; set?: typed CPU/GPU setup patch; rotation_rad?: authored rotation (native origin offset is explicit in the reply); intensity?:1; samples?:16 for CPU; replace_environment?:false. Hash-verifies and embeds original bytes, saves one atomic undo without external files or a render device. An HDR-owned sun cannot duplicate an analytic sun.
Prepare Authored Surface Maps
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | SURF-* | Yes | |
| origin | [0,0,0] | No | |
| plane | xy/yz/zx | No | |
| scale | 1 | No |
Automation details
Command ID: render.library.surface.prepare
Parameters:
id: SURF-*; body_index and body_name from render.scene; origin?:[0,0,0]; plane?:xy/yz/zx; scale?:1; rotation_rad?:0 (positive around the plane normal). Returns an explicit GPU temporary planar binding and a source usable by saved CPU/GPU surface.bind, with source hashes, original millimetre scale, image-up normal orientation and absolute base-color semantics. No document change; height/displacement and true anisotropy are not included.
Prepare Authored Studio Lights
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | RIG-* | Yes |
Automation details
Command ID: render.library.studio.prepare
Parameters:
id: RIG-*; variant: complete for emitter-only rigs, emitters_only for rigs with passive cards; center_mm and subject_extent_mm required. Converts exact rectangular half-edges and solar direction/radius. Optional name and typed CPU set return the complete CPU projection and explicit indirect-lighting adoption plan; authored radiance beyond CPU intensity64 refuses without scaling. Blocked calibration and external-sun rigs refuse. Returns a geometry-clearance review requirement; does not create cards or modify the scene.
Apply Authored Studio Lights
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | Yes | ||
| set | typed CPU/GPU setup patch | No | |
| expected_revision | u64 | No | |
| enable_indirect | false | No | explicit CPU Sun adoption after review |
Automation details
Command ID: render.library.studio.apply
Parameters:
rig: id, variant, center_mm and subject_extent_mm; name; set?: typed CPU/GPU setup patch; expected_revision?:u64; enable_indirect?:false (explicit CPU Sun adoption after review); replace_lighting_and_environment:true required. Saves the explicit rig projection in one undo, removing prior lighting/environment only with that confirmation. Subject clearance still needs review; passive cards are never silently omitted.
Inspect HDR Source
| Parameter | Type | Required | Description |
|---|---|---|---|
| path | scoped Radiance HDR file | Yes |
Automation details
Command ID: render.hdr.inspect
Parameters:
path: scoped Radiance HDR file; validates the complete bounded source and returns sha256, width, height, encoded_bytes and primaries without saving or rendering
Save Render Settings with HDR
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | typed CPU/GPU setup patch with hdr/environment unset | Yes | |
| set | typed CPU/GPU setup patch with hdr/environment unset | Yes | |
| path | scoped HDR | Yes | |
| expected_sha256 | digest returned by render.hdr.inspect | No | changed sources refuse |
| rotation_rad | 0 | No | |
| intensity | 1 | No | |
| samples | 1/4/16/64 for CPU only | No | default16 |
Automation details
Command ID: render.settings.capture_hdr
Parameters:
name, set: typed CPU/GPU setup patch with hdr/environment unset; path: scoped HDR; expected_sha256?: digest returned by render.hdr.inspect (changed sources refuse); rotation_rad?:0, intensity?:1; samples?:1/4/16/64 for CPU only (default16); assume_linear_srgb?:false for GPU only. Captures immutable bytes and saves resource plus setup atomically in one undo, without a host; returns name/setup/resource metadata, never source bytes
Check Render Request
| Parameter | Type | Required | Description |
|---|---|---|---|
| setup | saved name OR settings?: full RenderSetup | No | |
| progressive | false | No | registered GPU path, CPU integrator/LED options are mutually exclusive |
| texture_filtering | false | No | GPU |
| max_depth | 1..64 | No | |
| seed | u32 for progressive | No | |
| environment | {path: scoped HDR, expected_sha256?: inspected digest, rotation_radians: 0, intensity: 1, samples: 16} OR {resource: saved HDR digest, rotation_radians, intensity, samples} | No |
Automation details
Command ID: render.preflight
Parameters:
setup?: saved name OR settings?: full RenderSetup. A typed job selects raster/cpu_raytrace/gpu_path and its numerical options plus embedded HDR before dispatch; only replace and transient studio_weights may accompany it. Without job, the legacy runtime controls below remain available. See docs/render-settings.md. studio_weights?: three finite 0..1 visibility weights for raster or implicit GPU studio sources only; never saved. integrator?: raster (default) or raytrace; progressive?: false (registered GPU path, CPU integrator/LED options are mutually exclusive); texture_filtering?: false (GPU); CPU raytrace.texture_filtering?: false. Explicitly enables ray-footprint mip and bounded anisotropic map filtering on GPU, and bounded anisotropic filtering on CPU. GPU filtering off retains bilinear LOD0; CPU filtering off retains isotropic mip selection, using the coarsest available mip when footprint data is unavailable. samples?: 1..65536; max_depth?: 1..64; seed?: u32 for progressive; raytrace?: bounded runtime progressive/primary_samples/lights/punctual_lights/area_lights/area_samples/seed/exposure_ev/shadows/reflections/anisotropic_faces/emissions/surface_effects/dielectrics/environment options, only with raytrace. CPU raytrace.lens?: {aperture_radius_mm:0..10000000,focus_distance_mm:0.000001..1000000000}; positive aperture requires explicit CPU progressive sampling and a bounded perspective camera; absent/zero keeps the original CPU ray stream. See docs/render-thin-lens.md. CPU raytrace.volume?: one HomogeneousVolume box with world-mm min_mm/max_mm, extinction_per_mm:0..1000, RGB scattering_albedo:0..1 and anisotropy:-0.95..0.95. Positive extinction requires explicit Indirect lighting and cannot combine with Glass/SSS or surface Denoise. Physical eye/pupil prefixes and the orthographic line/box union preserve camera/model framing under existing ray/profile caps. See docs/render-cpu-volume.md. CPU raytrace.sun? uses the shared finite-disk Sun contract; raytrace.sky? uses {gradient,rotation_rad,intensity}. Both require explicit Indirect lighting, and gradient Sky excludes a constant/HDR environment. Their medium NEE uses the HG response/PDF and physical light source; see docs/render-cpu-celestial.md. CPU transparent_background?:false exports straight-alpha primary geometry coverage for fixed/progressive sampling; body/face opacity must remain 1, and active bloom/backdrop/photographic effects require opaque output. CPU raytrace.output?: {tone_map,finishing,backdrop,linear_exr}; shared presentation supports up to 8192 per side and 33554432 output pixels, CPU exposure remains raytrace.exposure_ev; raw FLOAT32 EXR is retained only at final completion. CPU raytrace.budget?: compact (legacy default), studio or workstation; see docs/render-cpu-resource-profiles.md for explicit image/geometry/memory/work limits. CPU raytrace.progressive?: {samples_per_pixel:1..profile limit, seed:u32}; requires primary_samples:1 and selected reflections.samples:1; area/LED sources and certified planar anisotropy/thin-sheet/axis-aligned-box dielectric continuations share the existing bounded transport and compatibility checks. See docs/render-cpu-progressive.md; environment?: {path: scoped HDR, expected_sha256?: inspected digest, rotation_radians: 0, intensity: 1, samples: 16} OR {resource: saved HDR digest, rotation_radians, intensity, samples}; embedded resources cannot combine with path/hash; explicit sRGB/D65 HDR primaries required. Opaque CPU preview with selected mirror/rough-specular reflections and certified planar anisotropy. HDR with rough reflections or anisotropy requires fully metallic selected bodies and all effective faces; unsupported combinations refuse. Optional raytrace.path:{max_depth:1..64} enables CPU diffuse/specular GI with matched rectangle/HDR light and BSDF MIS plus certified closed-mesh Glass. It requires explicit progressive camera sampling, primary_samples:1 and traced shadows; selected reflections and certified anisotropy refuse before HDR IO without changing intent. CPU Path dielectric subsurface?:{scattering_per_mm:0..100,anisotropy:-0.95..0.95} enables homogeneous free-flight/HG walks inside certified closed media; positive rates require denoising off. Contained light connections include scattering survival; closed refractive light connections and combining Glass with external volume remain unsupported. Absent path keeps the old certified thin_sheet/closed_box producer and refuses subsurface intent explicitly. See docs/render-cpu-general-glass.md and render-raytrace-dielectrics.md. CPU emissions are visible radiance and may light neighbors through sampled Path continuation, without mesh-emitter next-event sampling; surface_effects change roughness/shading normals without geometry changes. led_strip?: continuous world-mm LED rectangle recipe; led_samples?: 1/4/16/64 for the whole strip, default16. At most8directional+8punctual+4rectangle/LED sources; shared area N. See docs/render-light-union.md. transparent_background?: false; replace?: false. With progressive:true, raytrace instead accepts GPU dielectrics/clear_coats/textures; environment instead accepts tagged hdr/embedded_hdr/sky with rotation_rad/intensity; file hdr supports expected_sha256, embedded_hdr uses a document resource digest. See docs/render-hdr-resources.md. GPU lens, studio lighting, tone_map, denoise, clamp_indirect?: 0.000001..1000000 (biased; caps each contribution from the first bounce on, keeping its hue; see docs/render-path.md), bounded finishing/backdrop and linear_exr retention are also available. CPU raytrace and GPU top-level controls accept supersampling:1|2 (default 1; doubles internal width and height at 2, averages scene-linear premultiplied samples before tone mapping, exports selected dimensions), denoise_settings:{passes:1..3,strength:0..1,firefly_suppression:bool,optical_filter:bool}, and denoise_diagnostics:false. Optical filtering defaults to true for eligible mirror/glass guides; optical_filter:false restores legacy opaque-only display denoising. Guides and diagnostics retain their independent eligibility policy and conservative highlight protection. CPU raytrace.threads:0..64 selects bounded automatic workers at 0 (default), serial work at 1 or an explicit count from 2 through 64. Resource checks include internal image buffers and worker scratch. See docs/render-quality-controls.md. Both path tracers accept optional metal_energy_compensation: true for rough isotropic metals (inside CPU raytrace or top-level GPU). Both methods accept optional caustics {photons:1..1048576,radius_mm:0.000001..1000000,max_depth:1..64,seed:u32,area_lights?:false,environment?:false,guided_emission?:false,refresh_per_pass?:false} (inside CPU raytrace; top-level GPU). Optical assignments accept optional model {roughness:0..1,dispersion?:{abbe_number:5..200},thin_film?:{ior:1..3,thickness_nm:0..100000}}. CPU advanced models require Path; rough sheets require straight transmitted shadows off. See docs/render-glass-material-models.md. GPU adaptive?: {pilot_samples:16..256,min_samples:16..samples,relative_error:0..1,absolute_error:0.000001..1000000,coverage_error:0.001..0.25} allocates independent production budgets; pilots are discarded, not a certified error guarantee. transmission_samples?:1|2|4 stratifies the first Fresnel branch with extra path cost. volume?:{min_mm:[x,y,z],max_mm:[x,y,z],extinction_per_mm:0..1000,scattering_albedo:[r,g,b],anisotropy:-0.95..0.95} is one finite homogeneous world-mm medium; active media require explicit lighting/environment and refuse glass, denoise and multiple transmission strata. These fields also persist in GPU job.options. See docs/render-materials/TRANSPORT-MASTER-BATCH-2026-10-23.md; see docs/render-transmission.md, render-environment.md, render-runtime-textures.md, render-thin-lens.md, render-studio-lighting.md and render-denoise.md. Optional CPU raytracing requires a raytrace-cpu build and native host, checked before scene capture. Stale geometry is rejected. See docs/render-jobs.md
Render Image
Command group: RENDER › IMAGE
Default keyboard shortcut: R
Automation details
Command ID: render.start
Parameters:
Same request as render.preflight. Captures an immutable product scene and queues a bounded image job. Returns its session-scoped job identity, captured scene_generation and progress. Does not change the design. See docs/render-jobs.md
Render Progress
Automation details
Command ID: render.status
Parameters:
job?: {session, serial, generation}. Non-blocking progress, errors and captured frame metadata with queue:{running,waiting,job,shot,error}. Without job returns queue only. Advances an explicitly started render.batch through render.start as jobs finish; never pumps render work. Preview is separate from the exportable final image.
Cancel Render
Automation details
Command ID: render.cancel
Parameters:
job?: {session, serial, generation}, default the active render.batch job. Requests cooperative cancellation and drops its waiting shots; completed jobs remain completed. Late cancelled frames cannot be published.
Copy Render Image
| Parameter | Type | Required | Description |
|---|---|---|---|
| job | completed JobId | No | default selected result |
Automation details
Command ID: render.result.copy
Parameters:
job?: completed JobId (default selected result). Validates the retained PNG for app clipboard copying (max 4096 per side, 4194304 pixels); headless returns frame metadata only. Never copies a provisional image or starts a job.
Export Render Image
Automation details
Command ID: render.export
Parameters:
job?: {session, serial, generation} (default selected result), path: destination matching format?: png (default), exr or denoise_mask (PNG extension), overwrite?: false. Guide masks require denoise_diagnostics captured during rendering; their separate bytes, dimensions and SHA are returned under denoise_mask, while frame identifies the parent colour result. EXR requires an opt-in raw linear master retained by that completed CPU or GPU job; never converts PNG pixels. Exports a retained completed image atomically; an existing destination is preserved on failure. See docs/render-jobs.md
Render Backends
Automation details
Command ID: render.backends
Parameters:
No parameters. Returns {schema_version: 1, default_backend: builtin, backends: [{id, label, availability, executors: [{id, availability, profiles, limits, scratch}]}]}. Metadata only; does not start rendering or probe a GPU. See docs/render-backends.md
Render Settings
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | saved setup | No |
Automation details
Command ID: render.settings.get
Parameters:
name?: saved setup. Without name returns {setups, defaults}; with name returns {name, setup}. Does not evaluate the model or apply a camera. See docs/render-settings.md
Save Render Settings
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | setup name | Yes | |
| set | object of fields to replace | Yes | backend, mode, camera, width, height, format, exposure_ev, environment_rotation, environment_intensity, background, job, surfaces, optics, coats, stage |
Automation details
Command ID: render.settings.set
Parameters:
name: setup name, set: object of fields to replace (backend, mode, camera, width, height, format, exposure_ev, environment_rotation, environment_intensity, background, job, surfaces, optics, coats, stage). job?: typed active raster/cpu_raytrace/gpu_path configuration with optional validated embedded HDR reference; omitted preserves, null clears, object replaces the complete job. Creates from defaults and saves without a host, validates atomically, one undo step; identical edits are no-ops. See docs/render-settings.md
Inspect Render Scene
Command group: RENDER › SCENE
Automation details
Command ID: render.scene
Parameters:
No parameters. Authoritative product-scene metadata, without modelling overlays or mesh payloads. Explicitly settles stale geometry; does not render an image. See docs/render-workspace.md
Apply Render Camera
Automation details
Command ID: render.settings.apply
Parameters:
name: saved setup. Applies its existing Camera snapshot including roll/up as view state, without modifying the document or starting a render.
Copy Render Check Report
Automation details
Command ID: render.preflight.copy
Parameters:
text: nonempty report, at most 65536 bytes. Validated clipboard request; headless echo only, never renders or edits a design.
Select Render Result
Automation details
Command ID: render.result.select
Parameters:
index: integer 0..7, oldest first; must be retained. Selects a completed result as transient per-document view state; echoes index.
Discard Render Result
Automation details
Command ID: render.result.discard
Parameters:
index: integer 0..7, oldest first; must be retained. Drops only that transient result, selecting the newest remaining result if necessary; echoes index.
Set Render Output Size
| Parameter | Type | Required | Description |
|---|---|---|---|
| width | 1..16384 | Yes | |
| height | 1..16384 | Yes | |
| custom | bool | No |
Automation details
Command ID: render.output.size
Parameters:
width, height: 1..16384; custom?: bool. Validated Render output draft request; headless echo only, no design edits or job. The UI separately limits new selections to 8192 per side, 33554432 output pixels and the selected rendering profile.
View Render Image
| Parameter | Type | Required | Description |
|---|---|---|---|
| view | model|image|fit|actual|denoise_mask | Yes |
Automation details
Command ID: render.result.view
Parameters:
view: model|image|fit|actual|denoise_mask. Guide-mask view requires a selected completed result captured with denoising diagnostics. Validated result canvas request; headless echo only, never starts a job.
Close Render Image
Default keyboard shortcut: Escape
Automation details
Command ID: render.result.close
Parameters:
No parameters. Return to Model Preview; headless echo only, never cancels a job.
Solo Light
Command group: RENDER SCENE › LIGHTS
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | kind:slot light address | No | |
| solo | bool | Yes |
Automation details
Command ID: render.lights.solo
Parameters:
id?: kind:slot light address; solo:bool. Enabling requires an id; false clears solo. Validates and echoes per-document UI view state. Never saves settings, evaluates geometry, opens an editor or changes history.
Mute Light
Command group: RENDER SCENE › LIGHTS
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | kind:slot light address | Yes |
Automation details
Command ID: render.lights.mute
Parameters:
id: kind:slot light address; mute:bool. Validates and echoes per-document UI view state, applied to live preview and captured render copies only. Never changes saved settings or history.
Compare Images
Command group: RENDER › RESULT
Automation details
Command ID: render.compare
Parameters:
left, right: live or retained result index 0..7 (oldest first), distinct and retained; OR off:true. Validated per-document comparison view request; headless echo, no rendering or design/history change.
Move Render Comparison Divider
Automation details
Command ID: render.compare.divider
Parameters:
position: finite number, clamped to 0.05..0.95. Transient comparison divider request; headless echo only.
Render All Shots
Command group: RENDER › BATCH
Automation details
Command ID: render.batch
Parameters:
request?: render.start parameters, shared across all saved shots except camera. Default: first saved setup in name order. Captures up to 32 shot cameras and queues sequentially through render.start; returns {queued:n}. Refuses active renders, no shots or stale geometry. render.status (also with {}) and the UI tick advance the queue; Cancel on the active job drops waiting shots. No design/history/revision change.