Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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:

SOLID › CREATE

Create Sketch

Command group: SOLID › CREATE

Read the solid features guide.

ParameterTypeRequiredDescription
planeXY|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}Yessketch 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
offsetexprNo
flipbool | "x" | "y"Nonot 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
frameworld| componentNodefault; 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_edgesboolNo
activate_partboolNodefault 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
nameNo
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

ChoiceWhat it doesWhen to use it
ProfilesChooses 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.
DistanceSets 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 DirectionSends the extrusion to the other side of the sketch.The preview points away from the intended body.
SymmetricSplits 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 SidesSets a separate distance on each side.The sketch is between two unequal extensions.
Through AllReaches through the target body.Cut a hole that must stay open when the body becomes thicker.
To ObjectStops 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.
StartStarts at the sketch, at an offset from it, or from a selected object.Leave a gap before the extrusion begins.
Taper AngleSlopes the side walls.Make drafted sides; reduce the angle if the profile’s narrow details cannot support it.
OperationNew 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 bodiesChooses which existing bodies take part in a join, cut or intersection.Several bodies lie in the extrusion’s path.
Thin ExtrudeBuilds 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

  1. Create a sketch on the XY plane and draw a closed rectangle.
  2. Finish the sketch and choose Extrude.
  3. Select the rectangular region, set Distance to 20 mm, and choose New Body.
  4. Check the preview’s direction and confirm. You should have one solid block.
  5. 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.

ResourceWhat to exploreAuthor and licence
Editable bracket recipeA 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.

ParameterTypeRequiredDescription
distanceexprYesor through_all: true
taperangle exprNopositive: outward, so the far end is larger along the extrusion direction; negative: inward, so the far end is smaller
cornerpreserve_curvature|tangent|roundNohow 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
sketchid|nameNodefault: active or last sketch
profilesall | [index] | [{curves: [ids]}]| [{point:[x,y]}]Nothe 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_regionsboolNoeach index or point pick is exactly the region it names, as the dialogs send
face[x,y,z]Noextrude a planar body face instead of a sketch profile
faces[[x,y,z],…]Nocoplanar faces of one body
face_bodynameNowhose face, where faces of several bodies meet at the point
fixedtrueNowith 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
directionpositive|negative|symmetricNodistance is total thickness, split evenly around the start plane
conventiontotal_distance|legacy_per_sideNohow 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
distance2exprNoTwo 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_offsetexprNoalong the sketch normal, also with direction: negative
to[x,y,z]NoTo Object: a face, vertex or point; to_offset?: expr past it
from[x,y,z]NoFrom Object: start at that face or point
operationnew|join|cut|intersect|autoNocut into a body, otherwise join existing solids; new in an empty component
touchingseparate|one_bodyNowhat 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]NoJoin from a face, or from a sketch on a body's face, defaults to that face's body; explicit targets or participants override
nameNo
body_nameNo
thintrueNoThin: a wall along sketch curves instead of the profiles
curves[curve ids]Noopen chains and closed loops, joined where they meet end to end; default: every drawn curve of the sketch
thicknessexprYes
sidecenter|inside|outside|two_sidesNoa 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
thickness2exprNotwo_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 dialogMeaningExample or reason to choose it
ProfileThe closed area to spin.The half-section of a stepped shaft.
AxisThe line it spins around.The sketch line along the centre of the shaft, or the X axis.
TypeAngle 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.
DirectionOne 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.
AngleHow far to spin.360 deg for a full round part.
Angle 2The angle on the other side, for Two Sides.30 deg one way, 60 deg the other.
OperationNew 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

  1. 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.
  2. Click Revolve. Click the profile.
  3. 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.
  4. 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.
  5. 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.
  6. 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.

ParameterTypeRequiredDescription
axissketch 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]}Yessketch 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
angleexprNodefault 360 deg
angle2exprNoTwo Sides: the other side's angle
directionsymmetricNoangle split either side, independent of axis direction
conventionsketch_normal|legacy_axis_startNodefault sketch_normal; legacy retains older angular starts
to[x,y,z]NoTo Object: turn until that face, vertex or point
sketchNo
profiles[x,y,z]Noa planar body face as the profile
face[x,y,z]Noa planar body face as the profile
face_bodynameNowhose face, where faces of several bodies meet
fixedtrueNothe face's plane as a fixed plane, as solid.extrude's
operationNo
touchingNo
targetsNo
nameNo
body_nameNo
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 dialogMeaningExample or reason to choose it
ProfileThe closed sketch shape to sweep.A 0.5 in × 0.25 in rectangle for flat bar.
PathThe curves or edges the profile follows.A line, an arc and a line for a bend.
OrientationTurn 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.
DirectionAn 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 RailGuide 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.
OperationNew 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

  1. 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.
  2. Start a sketch on the YZ plane. Draw a 0.5 in × 0.25 in rectangle centered on the origin. Finish the sketch.
  3. Click Sweep. Click Profile and pick the rectangle. Click Path and pick the three path curves.
  4. 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.

ParameterTypeRequiredDescription
sketchprofile sketchYes
profilesNo
path_sketchsketchYes
path[curve ids in order]Yes
path_bodybody nameNo
path_edges[points on its edges]Nothe path is a chain of that body's edges, instead of a sketch's curves
orientationperpendicular| parallel| [x,y,z]Nodefault: 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
twistangle exprNothe profile turns this much about the path over its length; within 4 turns
scaleexprNothe profile's scale at the end, linear along the path; 0.01…100
rails[{sketch?: sketch (default path_sketch), curves: [curve ids in order]}]Noguide 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_fitscale| stretchNodefault: the profile grows and shrinks evenly; only across to the rail, between the rails
operationNo
touchingNo
targetsNo
nameNo
body_nameNo
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.

ParameterTypeRequiredDescription
sections[{sketch, profiles?} | {sketch, point: id} (an apex)]Yes2…50, in order; matching hole counts, no holes at an apex
rails[{sketch, curves: [ids in order]}]Noone 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_fitscale|stretchNodefault 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
operationNo
touchingNo
targetsNoJoin excludes hidden bodies from automatic targets; explicit targets or participants may include them
nameNo
body_nameNo
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 dialogMeaningExample or reason to choose it
PointA 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, HeightThe size of the box along X, Y and Z. Each starts at 20 mm.3 in × 2 in × 0.75 in for a plate.
PlacementIt 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, ZWhere the point is, when none is picked.0, 0, 0.
OperationIt 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

  1. In a new design, click Box.
  2. Set Length to 3 in, Width to 2 in and Height to 0.75 in.
  3. Set Placement to Corner and leave X, Y and Z at 0. Click OK.
  4. 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.

ParameterTypeRequiredDescription
lengthexprYes
widthexprYes
heightexprYes
corner[x,y,z]No
center[x,y,z]Nonumbers in mm or length expressions; default: the origin; a box placed by its center stays centred there when its size changes
operationNo
touchingNo
targets[body]No
nameNo
body_nameNo
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 dialogMeaningExample or reason to choose it
FaceThe 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 1An edge of the face, and how far the cylinder’s center is from it.The left edge, 0.75 in.
Reference 2 and Distance 2A second edge, and how far the center is from it.The front edge, 0.75 in.
SizeWhether you type a Diameter or a Radius.Diameter, to match the print.
DiameterThe 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.
HeightHow long the cylinder is, from the face out. It starts at 20 in the design’s unit.0.25 in.
Placement, X, Y, ZWith no face picked, where the center of the cylinder’s base goes.0, 0, 0 to start a round blank at the origin.
OperationIt 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

  1. Make a 3 in × 2 in × 0.75 in block.
  2. Click Cylinder. Click Face and click the top face of the block.
  3. 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.
  4. 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.

ParameterTypeRequiredDescription
radiusexprYes
diameterexprYes
heightexprYes
base[x,y,z]Nocentre of the bottom: numbers in mm or length expressions; default: the origin
axisX|Y|Z|[x,y,z]Nodefault Z
references[{edge: [x,y,z] on a straight edge of the face it stands on, distance: expr}]Noat 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
operationNo
touchingNo
targets[body]No
nameNo
body_nameNo
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 dialogMeaningExample or reason to choose it
PointA 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.
SizeWhether you type a Diameter or a Radius.Diameter, to match a ball’s size.
DiameterThe 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, ZPlacement is always Center. X, Y and Z set the center when no point is picked.0, 0, 0.
OperationIt 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

  1. Make a 3 in × 2 in × 0.75 in block with its corner at the origin.
  2. Click Sphere. Set Diameter to 0.5 in.
  3. 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.
  4. 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.

ParameterTypeRequiredDescription
radiusexprYes
diameterexprYes
center[x,y,z]Nonumbers in mm or length expressions; default: the origin
operationNo
touchingNo
targets[body]No
nameNo
body_nameNo
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 dialogMeaningExample or reason to choose it
PointA 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 radiusFrom 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 radiusThe 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, ZPlacement is always Center. X, Y and Z set the center when no point is picked.0, 0, 0.
OperationIt 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

  1. In a new design, click Torus.
  2. 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.
  3. Leave X, Y and Z at 0 and Operation at New Body. Click OK.
  4. 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.

ParameterTypeRequiredDescription
majorexprYes
minorexprYesradii
center[x,y,z]Nonumbers in mm or length expressions; default: the origin
operationNo
touchingNo
targets[body]No
nameNo
body_nameNo
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 dialogMeaningExample or reason to choose it
DiameterThe diameter of the base circle. It starts at 20 mm and must be more than 0.1 in for a 1 in shaft.
Top diameterThe 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.
HeightHow 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, ZPlacement is always Base Center: X, Y and Z set the center of the base circle.0, 0, 0.
OperationIt 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

  1. Make a 1 in diameter, 3 in tall cylinder at the origin with Cylinder.
  2. Click Cone. Set Diameter to 1 in, Top diameter to 0 and Height to 0.866 in.
  3. Set Z to 3 in, so the base sits on the top of the shaft. Set Operation to Join and click OK.
  4. 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.

ParameterTypeRequiredDescription
radiusexprYes
diameterexprYes
heightexprYesthe base circle, and the top's distance along the axis; a negative height goes the other way
top_radiusexprNothe top circle; default 0: a full cone ending in an apex
top_diameterexprNothe top circle; default 0: a full cone ending in an apex
base[x,y,z]Nocentre of the base circle: numbers in mm or length expressions; default: the origin
axisX|Y|Z|[x,y,z]Nodefault Z
operationNo
touchingNo
targets[body]No
nameNo
body_nameNo
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 dialogMeaningExample or reason to choose it
TypeRectangular, Circular or Path. The same dialog makes all three patterns.Rectangular for rows and grids.
Object TypeBodies copies whole bodies. Features repeats History steps.Features for holes in one plate.
Objects or FeaturesWhat to repeat. With Features, pick the step in the History.The Hole feature for the first hole.
DirectionThe way the first row runs.The X axis, or the long edge of the plate.
QuantityHow many along the first direction, counting the original.5 holes in the row.
SpacingCentre-to-centre distance between neighbours in the first direction.1 in pitch.
Direction 2The way the second row runs. Leave it empty for a single row.The Y axis for a grid.
Quantity 2How many along the second direction, counting the original. 1 means a single row.3 rows.
Spacing 2Centre-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

  1. 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.
  2. Add one 0.25 in through hole with Hole, 1 in in from each of the two edges at the origin corner.
  3. Click Rectangular Pattern. Set Object Type to Features and click the Hole step in the History.
  4. Click Direction, then the X axis (or the long edge of the plate). Set Quantity to 5 and Spacing to 1 in.
  5. Click Direction 2, then the Y axis. Set Quantity 2 to 3 and Spacing 2 to 1 in.
  6. 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.

ParameterTypeRequiredDescription
features[names]Yes
bodies[names]Yes
components[names]Yes
dir1[x,y,z]Yes
count1Yes
spacing1Yes
dir2No
count2No
spacing2No
alignmentleft|center|rightNo
alignment2left|center|rightNodefault right; counts include the original
reversedboolNo
reversed2boolNoFlip
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 dialogMeaningExample or reason to choose it
TypeRectangular, Circular or Path. The same dialog makes all three patterns.Circular for a bolt circle.
Object TypeBodies copies whole bodies. Features repeats History steps.Features for holes in one part. Bodies for separate parts, such as loose spokes.
Objects or FeaturesWhat to repeat. With Features, pick the step in the History.The Hole feature for one bolt hole.
AxisThe 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.
QuantityHow many in total, counting the original.6 for a 6-hole bolt circle.
Total angleThe 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

  1. Make a flange: sketch a 4 in circle on the XY plane at the origin and Extrude it 0.5 in.
  2. 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.
  3. Click Circular Pattern. Set Object Type to Features and click the Hole step in the History.
  4. Click Axis, then click the Z axis.
  5. Set Quantity to 6 and Total angle to 360 deg. Click OK. There are 6 holes, 60° apart.
  6. 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.

ParameterTypeRequiredDescription
features[names]Yes
bodies[names]Yes
components[names]Yes
axisX|Y|Z | construction axis name| {origin, dir}| {edge|face: [x,y,z]}Yesfollowed 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
countYes
angleNodefault 360 deg; partial arcs include both ends
alignmentleft|center|rightNodefault right; original stays fixed
reversedboolNoFlip; 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.

ParameterTypeRequiredDescription
features[names]Yes
bodies[names]Yes
path_sketchsketchYes
path[curve ids in order]Yes
countYes
spacingYesbetween instances
distanceYesfirst to last
orientationidentical|pathNo
flipboolNo
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 dialogMeaningExample or reason to choose it
Object TypeBodies 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 FeaturesWhat 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 PlaneThe 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

  1. 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.
  2. Click Mirror. Leave Object Type on Bodies and click the block.
  3. Click Mirror Plane, then click the YZ plane.
  4. Set Operation to Join. Click OK. The block is now 4 in wide and one body.
  5. 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.

ParameterTypeRequiredDescription
features[names]Yes
bodies[names]Yescombine?: join with the original
planeXY|XZ|YZ|construction plane name or id|{origin, normal}|{origin, x_dir, y_dir}Yesorigin 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 dialogMeaningExample or reason to choose it
Personal PresetsSaves 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.
PlacementSingle 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.
FaceThe face the hole is drilled into.Click the top face of the part.
Reference 1 and Distance 1An edge of the face, and how far the hole center is from it.The left edge, 0.75 in.
Reference 2 and Distance 2A second edge, and how far the hole center is from it.The front edge, 0.75 in.
ExtentsHow the depth is set. Distance drills to the Depth you type.Use Distance for a blind hole.
Hole TypeSimple 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 TypeSimple 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 PointThe bottom of the hole. Angle leaves a drill point.Use Angle for a hole made with a twist drill.
DepthHow deep the hole goes.Measured to the end of the full diameter, not the tip of the drill point.
Tip AngleThe 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

  1. Click New Sketch and choose the XY plane. Draw a 2-point rectangle from the origin, 3 in × 2 in. Click Finish Sketch.
  2. Click Extrude and set the distance to 0.75 in. Click OK.
  3. Click Hole, then click the top face.
  4. 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.
  5. 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.
  6. 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.

ParameterTypeRequiredDescription
position[x,y,z] on a face| sketch + points: [sketch point ids]| sketch aloneYesnumbers, 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
flipboolNosketch points: drill to the other side
singleboolNowith one sketch point: a Single hole that follows the point, drilled into the face there
direction[x,y,z]Nodefault: 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
diameterYesa 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
threadYesa 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|looseYesISO 273
head"ISO 4762"| "ISO 7380-1"Nosocket head; button head
head_gaplengthNodefault 0.5 mm; an expression with parameters is kept, so the recess follows them
depthNodefault through all
to[x,y,z]NoTo Object: drill to that face or point
references[{edge: [x,y,z] on a straight edge of the face, distance: expr}]Noat 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
typesimple|drilled|counterbore|countersinkNo
tip_angleNo
cb_diameterlengthNo
cb_depthlengthNo
bridgelengthNocounterbore: two 3D-printing bridge layers this thick below its floor, a slot along X then a square; e.g. 0.2 mm
cs_diameterNo
cs_angleNo
handright|leftNothe tapped thread's hand; default right; needs thread
thread_depthpositive length independent of drill depthNodefault: full useful cylindrical wall; must fit that wall
modeledboolNoneeds thread: the tapped thread cut into the wall, the groove between its teeth, as solid.thread's modelled one; default false: listed only
ease_outexpr|standard|shortNomodelled 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]Nothe 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_startboolNosketch 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 dialogMeaningExample or reason to choose it
PathThe sketch curves the tube follows.A line, an arc and a line for a 90° bend.
DiameterThe outside diameter of the tube or rod. It starts at 5 in the design’s unit.0.375 in for 3/8 tube.
WallThe wall thickness, measured in from the OD. Empty means solid.0.035 in.
OperationNew 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

  1. 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.
  2. Click Pipe. Click Path and pick the line, the arc and the second line. Path shows 3 selected.
  3. Set Diameter to 0.375 in and Wall to 0.035 in. Click OK.
  4. 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.

ParameterTypeRequiredDescription
path_sketchsketchYes
path[curve ids in order]Yes
diameterexprYes
wallexprNohollow
operationNo
targetsNo
nameNo
body_nameNo
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 dialogMeaningExample 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.
MarginStock 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

  1. Make a 3 in × 2 in × 0.75 in block.
  2. 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.
  3. A new body, Bounding, covers the part. It is 3.125 in × 2.125 in × 0.875 in: the stock to order or saw.
  4. 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.

ParameterTypeRequiredDescription
bodies[names]Nodefault: all
marginexprNo
nameNo
body_nameNo
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 dialogMeaningExample or reason to choose it
Cylindrical faceThe round face the thread goes on.Click the outside of the shaft near the end to thread.
FormThe 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.
ModeledOn: 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 sizeOn by default: picks the standard size that fits the face you selected.Leave it on when the shaft is a standard diameter.
Size and PitchThe 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.
DesignationThe thread callout. You can type it directly.M12, M12x1.25.
HandRight, Left, or Both. Pipe threads offer Right or Left only.Right unless the print calls for LH.
StartsNumber 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.
ExtentFull 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

  1. Sketch a 12 mm circle on the XY plane and extrude it 50 mm.
  2. Click Thread, then click the round face of the shaft near its top end.
  3. Check that Form is ISO metric and Automatic size picked M12 with a 1.75 mm pitch.
  4. Set Extent to Length and the length to 20 mm.
  5. Turn on Modeled to see the thread cut into the shaft.
  6. Under Ends, set Start to Chamfer. Leave Chamfer Angle and Chamfer Depth blank for the standard ISO 4753 chamfer.
  7. 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.

ParameterTypeRequiredDescription
face[x,y,z] on a cylindrical faceYes
formmetric|trapezoidal|acme|buttress|buttress_asme|bspp|rp|bspt|nptNodefault: the one `designation` names, else metric; square is refused: no current standard defines it
handright|left|bothNodefault right; both: a right- and a left-handed groove crossing
old_auto_sizeboolNoan 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_flankstart|endNobuttress only, default end: the steep flank of the screw's teeth faces the thread's end, the way its axis points
starts1..8Nolead = starts x pitch: that many grooves, each a turn's starts-th further round; a designation that gives the lead gives the starts
ease_outexpr|standard|shortNomodelled 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`)
tipnone|start|bothNomodelled 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
extentfull|length|up_toNodefault: length when `length` is given, up_to when `up_to` is, else full: the whole face
lengthexprNofrom the end the thread starts at
up_to[x,y,z]| plane name or {origin, normal}Noa 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 atNodefault: 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
modeledboolNodefault 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.

ParameterTypeRequiredDescription
tools[bodies]Yes
cells[[x,y,z] a point inside each cell to fill (a cell: inside some tools, outside the rest)]Yes
operationnew|join|cut|intersectNo
remove_toolsboolNo
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.

ParameterTypeRequiredDescription
diameterYes
section_sizeYes
sectioncircular|squareNo
section_positioninside|center|outsideNo
base[x,y,z]Nonumbers in mm or length expressions; default: the origin
axisX|Y|Z|[x,y,z]Nodefault Z
start_angleNo
clockwiseboolNo
sketchNoa sketch; its plane is the section plane, so its placement sets the radius and start phase
profilesNodefault: all; one closed profile without holes
operationNo
targetsNo
nameNo
body_nameNo
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 dialogMeaningExample or reason to choose it
CurvesThe open sketch line or lines for the rib’s edge.A diagonal line across the inside corner of an L-bracket.
DirectionIn 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.
ThicknessHow 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.
DepthHow far the rib fills from the line. Empty means to the next face of the part.Leave it empty for a gusset.
FlipFill 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

  1. 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.
  2. 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.
  3. Click Rib. Click Curves and pick the line. Leave Direction on In plane and set Thickness to 0.25 in.
  4. 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.

ParameterTypeRequiredDescription
sketch[open curve ids, in order]Yes
curves[open curve ids, in order]Yes
thicknessYesacross the sketch plane, or across the curves when normal
depthNodefault: to the next face
flipboolNofill to the other side
directionin_plane|normalNogrow 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 dialogMeaningExample or reason to choose it
CurvesThe open sketch lines, one wall per line.Two crossing lines over a pocket.
DirectionIn 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.
ThicknessHow thick each wall is. It starts at 2 mm.0.080 in for the ribs of a lightened pocket.
DepthHow 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.
FlipFill 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

  1. 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.
  2. 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.
  3. Click Web. Click Curves and pick both lines. Set Direction to Normal and Thickness to 0.1 in. Leave Depth empty.
  4. 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.

ParameterTypeRequiredDescription
sketch[open curve ids]Yes
curves[open curve ids]Yesone wall each
thicknessYes
depthNodefault: to the next face
flipboolNo
directionin_plane|normalNo
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 dialogMeaningExample or reason to choose it
ProfilesThe 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.
DepthHow 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.
TypeEmboss 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

  1. Make a 3 in × 2 in × 0.75 in block.
  2. 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.
  3. Click Emboss. Click Profiles and pick the letters. Each letter shape counts as its own profile, so Profiles shows several selected.
  4. 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.

ParameterTypeRequiredDescription
sketchYes
profilesNo
depthYes
modeemboss|debossNo
targetsNo
faceworld point [x,y,z] selecting a planar or complete exterior cylindrical wallNoinferred 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.

ParameterTypeRequiredDescription
nameNo
occurrenceid|nameNodefault: from the pick, or the named face's component
path[occurrence ids from the root]Nothe 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>"Yescentre of a planar face
circle[x,y,z] | "<name>"Yescentre 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]Yesa 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
bodythe named face's bodyNo
end"<name>"Noa 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.

ParameterTypeRequiredDescription
folderboolNodefault 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`
nameNothe feature's and the component's
upz|yNodefault 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
namesauto|solid|product|instanceNodefault 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
historyfeatures|solids for a FreeCAD fileNodefault 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]Nowhere 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
toleranceNosee 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.

ParameterTypeRequiredDescription
nameNo
upz|y for a glTF fileNodefault 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
originboolNodefault 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_degrees0..180No0 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 dialogMeaningExample or reason to choose it
EdgesThe 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.
RadiusThe 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.
TypeConstant 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 chainFollows the edge around smooth (tangent) bends, so one pick rounds the whole run.Leave it on for edges that flow into an existing round.
PreviewShows 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

  1. Make a 3 in × 2 in × 0.75 in block (sketch a rectangle, Extrude 0.75 in).
  2. Click Fillet and click the four vertical corner edges. Set Radius to 0.25 in and click OK.
  3. Click Fillet again and click the top face. Edges shows 8 selected: the four straight edges and the four rounded corners.
  4. 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.

ParameterTypeRequiredDescription
edges[[x,y,z] point on edge | {body, index}]Yes
radiusexprYes
tangent_chainboolNodefault true: each picked edge's tangent chain is rounded with it; false: exactly the picked edges
bodythe body the edges are onNowithout 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
typeconstant|curvature|chord|variable|splineNoalias 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
radius2No
start[x,y,z]No
radii[expr, …]No
knots[number, …]No
mid[[position 0…1 from start, radius expr], …]Novariable radii between the ends
smoothboolNosmooth instead of straight between the radii
cornerrolling|g2Norolling, 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}, …]Nocorner 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
turnmitre|sweptNowhere 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
fitexact|reduce|taperNoexact, 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 dialogMeaningExample or reason to choose it
EdgesThe 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 TypeEqual 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°.
FlipSwaps 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 chainFollows 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.
PreviewShows the chamfer on the part while you set it up.Leave it on.

Try it: break the top edges of a plate

  1. Make a 3 in × 2 in × 0.75 in block (sketch a rectangle, Extrude 0.75 in).
  2. Click Chamfer and click the four top edges. Edges shows 4 selected.
  3. Set Chamfer Type to Equal Distance and Distance to 0.03 in.
  4. Click OK. All four top edges have a 0.03 × 45° chamfer.
  5. 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.

ParameterTypeRequiredDescription
edges[[x,y,z] | {body, index}]Yes
distanceexprYes
tangent_chainboolNodefault true: each picked edge's tangent chain is cut with it; false: exactly the picked edges
distance2exprNoalong the second face
angleexprNofrom the first face
flipboolNowhich face is first: by default the one facing up most
bodythe body the edges are onNowithout 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.

ParameterTypeRequiredDescription
targetbodyYes
tools[body]Yes
operationjoin|cut|intersectNo
touchingseparate|one_bodyNowhat 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_toolsboolNo
new_componentboolNothe 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.

ParameterTypeRequiredDescription
bodies[names]Yes
factorexprYes
factors[x, y, z] exprsYes
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.

ParameterTypeRequiredDescription
faces[[x,y,z] points on the faces, or face names from model.faces]Yes
bodyNo
healboolNodefault 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 dialogMeaningExample or reason to choose it
FacesThe faces to move. You can pick more than one.The floor of a pocket, or the wall of a bore.
DistanceHow 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

  1. 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.
  2. 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.
  3. 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.

ParameterTypeRequiredDescription
faces[[x,y,z] points on faces (planar or curved), or face names from model.faces]Yes
distanceexprYespositive: outward
bodyNo
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 dialogMeaningExample or reason to choose it
Faces/BodyThe faces to remove, or the body for a closed hollow part.The top face of a block for an open box.
ThicknessThe wall thickness.0.125 in for a small enclosure.
DirectionInside 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

  1. Make a 4 in × 3 in × 2 in block (sketch a rectangle, Extrude 2 in).
  2. Click Shell and click the top face. Faces/Body shows 1 selected.
  3. Set Thickness to 0.125 in and Direction to Inside.
  4. Click OK. The block is an open box, still 4 in × 3 in × 2 in outside, with 0.125 in walls and floor.
  5. 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.

ParameterTypeRequiredDescription
faces[[x,y,z] points on the faces to remove, or face names from model.faces; none: a closed hollow body]Yes
thicknessexprYes
directioninside|outside|bothNo
tangent_chainboolNoalso open faces joined smoothly to the picked ones
bodyNoneeded 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.

ParameterTypeRequiredDescription
faces[[x,y,z] points, or face names from model.faces]Yes
angleexprYes
neutralXY|XZ|YZ|plane name|{origin, normal}Yes
pull[x,y,z]Nodefault: neutral plane normal
bodyNo
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.

ParameterTypeRequiredDescription
faces[[x,y,z] points on the faces to split, or face names from model.faces]Yes
bodyNo
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.

ParameterTypeRequiredDescription
bodynameYes
planeXY|XZ|YZ|plane name|{origin, normal} — or tool: {body, point}Yesa face of a body, its surface extended
linecurve idYesa 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.

ParameterTypeRequiredDescription
face[x,y,z] and distance: exprYespositive adds material, negative cuts
edges[[x,y,z]…] and distanceYesa fillet
bodythe body the face or edges are onNofor 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.

ParameterTypeRequiredDescription
bodies[names]Yes
translate[x,y,z]Nolength exprs or numbers, applied after rotation
axis[x,y,z]Nodefault: world Z with origin, else the body's component's Z, world Z at the root
angleangle exprNo
origin[x,y,z]Nolength exprs or numbers in world coordinates; default: the body's component's origin, the world origin at the root
tolerancematrix rotation toleranceNodefault 1e-9, at most 1e-3
copyboolNodefault false; true keeps originals and transforms copies
occurrences[occurrence paths, root first]Noonly with copy: copies each component independently and transforms the copies in world space; reply lists them in occurrences
nameNo
body_nameNo
body_namesNo
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.

ParameterTypeRequiredDescription
faces[[x,y,z] points on planar faces, or face names from model.faces]Yes
targetplaneYesXY|XZ|YZ|construction plane|{origin, normal}
target_face[x,y,z] on a parallel planar faceYes
bodyNo
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.

ParameterTypeRequiredDescription
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_planeXY|XZ|YZ|construction or offset plane name or id|{origin, normal}Yes
toYesthe same
to_face[x,y,z]Yes
to_planeYesa plane as from_plane; the point or face goes onto it along its normal, and the plane may move later: the bodies follow
flipboolNo
axes[x, y, z]Nopoint-to-point only: which world axes the offset moves along; default all three, at least one true
angleexprNoa 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.

ParameterTypeRequiredDescription
bodies[names]Yesremoved 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.

ParameterTypeRequiredDescription
featureid|nameYes
features[id|name]Yes
groups[timeline folder ids]Yesa 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.

ParameterTypeRequiredDescription
nameYes
expressionYesnumber or text
unitmm|cm|m|in|ft|deg|rad|""|textNonew 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
commentNo
favoriteboolNo
new_namerenameNoreferences follow; an expression `new = value` renames to `new` and sets value, or sets `new` when the expression is just `new`
deletenameYes
changes{name: expression, …}Yesexisting 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.

ParameterTypeRequiredDescription
bodies[names]Yes
materialnameYesSteel, 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.

ParameterTypeRequiredDescription
bodies[names]No
faces[[x,y,z] on faces]Nobody?: which body, default the nearest
components[names or ids, or occurrence names]No
appearancelibrary name or stable starter.* IDNoappearance.library
color"#rrggbb" or [r, g, b]Yes0–255
opacityNo0–1, default 1
nameinert copied look labelNorequires color, mutually exclusive with appearance
pbr{metallic:0..1, roughness:0.045..1, dielectric_ior:1..3}Norequires 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.

ParameterTypeRequiredDescription
nameNo
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.

ParameterTypeRequiredDescription
axisX|Y|Z|construction axis name|{origin, dir} | {edge|face: [x,y,z]}Yeswhere it is now; a straight or circular edge, or a cylinder, cone or torus face: about its axis, followed as the model changes
angleexprYes
direction_onlyboolNodefault 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
pivotpoint refNoonly with direction_only; vertex, sketch point, construction point
nameNo
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.

ParameterTypeRequiredDescription
refs1-3 refs in any orderYes
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.

ParameterTypeRequiredDescription
refs1-3 refs in any orderYes
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.

ParameterTypeRequiredDescription
refs1-3 refs in any orderYes
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.

ParameterTypeRequiredDescription
facerefYesa cylinder, cone or torus face, or a circular edge
nameNo
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.

ParameterTypeRequiredDescription
facerefYes
pointrefYesthe axis goes through it, square to the face
nameNo
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.

ParameterTypeRequiredDescription
aplane or planar face refsYes
bplane or planar face refsYes
nameNo
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.

ParameterTypeRequiredDescription
apoint refsYes
bpoint refsYesvertices, sketch points, points
nameNo
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.

ParameterTypeRequiredDescription
edgerefYesa straight edge or sketch line
nameNo
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.

ParameterTypeRequiredDescription
pointrefYesvertex, sketch point, point
nameNo
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.

ParameterTypeRequiredDescription
aedge or line refsYes
bedge or line refsYeswhere they meet, or come closest
nameNo
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.

ParameterTypeRequiredDescription
aplane or planar face refsYes
bplane or planar face refsYes
cplane or planar face refsYes
nameNo
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.

ParameterTypeRequiredDescription
ofrefYescircular edge, sketch circle or arc, sphere or torus face
nameNo
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.

ParameterTypeRequiredDescription
edgeedge or line refYes
planeplane or planar face refYes
nameNo
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.

ParameterTypeRequiredDescription
pathedge or sketch curve refYes
nameNo
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.

ParameterTypeRequiredDescription
aplane or planar face refsYes
bplane or planar face refsYeshalfway between; bisecting when they meet at an angle
nameNo
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.

ParameterTypeRequiredDescription
astraight edge or line refs in one planeYes
bstraight edge or line refs in one planeYes
nameNo
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.

ParameterTypeRequiredDescription
pointoff-axis point refYes
nameNo
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.

ParameterTypeRequiredDescription
apoint refsYes
bpoint refsYes
cpoint refsYes
nameNo
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.

ParameterTypeRequiredDescription
facerefYescylinder, cone, sphere or torus
at[x,y,z] where it touchesNodefault: the face pick
referenceplane or planar face refNothe plane touches where the face turns towards it: parallel to it, on the side of `at`
angleexprNowith reference, default 0 deg: turned that far about the face's axis; not on a sphere
nameNo
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.

ParameterTypeRequiredDescription
pathedge or sketch curve refYes
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.

ParameterTypeRequiredDescription
planeplane or planar face refYes
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.

ParameterTypeRequiredDescription
namecomponent id or nameNo
parentcomponent id or nameNodefault: the active one
parent_pathexact parent placementNo
activateboolNodefault true
groundedboolNodefault: 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.

ParameterTypeRequiredDescription
patha .sc designYes
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.

ParameterTypeRequiredDescription
ajoint originsYes
bjoint originsYes{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
flipboolNodefault 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
offsetmm or an expressionNo
angledeg or an expressionNoan 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
nameNo
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.

ParameterTypeRequiredDescription
typeYes
aoccurrenceYes
boccurrenceYesstay where they are
atjoint originNodefault: b's origin
nameNo
limits[[min, max] | null…]No
quietboolNo
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.

ParameterTypeRequiredDescription
occurrences[ids or names]Yesmove 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.

ParameterTypeRequiredDescription
jointid|nameYes
value[angles in deg or expressions, distances]Yesvalues 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]Yesvalues 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
quietboolNoleave 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})

Command group: SOLID › ASSEMBLE

Read the components and joints guide.

ParameterTypeRequiredDescription
ajointsYes
bjointsYes
ratioYesb = ratio · a + offset
offsetin b's unitsNodeg for an angle, mm for a distance, or an expression
iavalue indicesNo
ibvalue indicesNodefault 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.

ParameterTypeRequiredDescription
internalboolNoone is a ring gear: both turn the same way; by default b turns the other way
reverseboolNo
linkindexNoreplace 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.

ParameterTypeRequiredDescription
radiusthe pinion's pitch radiusYesmm, an expression, or {circle: [x,y,z], occurrence?}
reverseboolNo
linkindexNoreplace 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.

ParameterTypeRequiredDescription
pitchtravel per turnYesmm or an expression
reverseboolNoa left-hand thread
linkindexNoreplace 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.

ParameterTypeRequiredDescription
athe cam's jointYesrevolute
followerknife|roller|flatNodefault knife; flat: a face square to a slider's line
radiusthe roller's radiusNomm, an expression or {circle: [x,y,z], occurrence?}: the roller's round face, which is its tip too
flipboolNoride the cam from the other side than the one the follower is on now
linkindexNoreplace 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.

ParameterTypeRequiredDescription
typemate|flush|distance|concentric|insert|parallel|perpendicular|angle|tangent|point_on_axisYes
offsetthe gapNomm or an expression; needed for distance
angledeg or an expressionNoneeded for angle
flipturn b overNo
nameNodefault: 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.

ParameterTypeRequiredDescription
enabledboolNodefault 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.

ParameterTypeRequiredDescription
occurrences[ids or names]Yestwo or more
nameNo
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.

ParameterTypeRequiredDescription
nameNo
studyNoedit an existing one
stepsNotimeline length, default 100
keys[{joint, index?, points: [[step, value], …]}]Yesvalues: 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.

ParameterTypeRequiredDescription
studyid|nameYes
jointid|name with from and toYesdegrees 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.

ParameterTypeRequiredDescription
nameNo
scaleNoautomatic: each occurrence pushed away from the assembly's centre by scale × its offset, default 1
moves[{occurrence, translate: [x,y,z]}]Noinstead 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.

ParameterTypeRequiredDescription
occurrences[ids]Nodefault 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.

ParameterTypeRequiredDescription
bodies[names]Nodefault: all, in world placement; a name that is no body is refused
budget_ssecondsNodefault 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]]Nopairs 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.

ParameterTypeRequiredDescription
componentid or nameNodefault the design
levelsflat| topNodefault: every part at any depth, counted through its subassemblies; the component's direct children, subassemblies as one row each
group_by["part_number"]| ["definition"]Nodefault; components without a part number get a row per definition
group_childrentrueNoa 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
pathwrite a .csv or .json fileNochildren 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.

ParameterTypeRequiredDescription
enabledboolNoomitted: 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.

ParameterTypeRequiredDescription
bodies[names]Nodefault all
names_onlyboolNoeach 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.

ParameterTypeRequiredDescription
planeXY|XZ|YZ | construction plane name or id | {origin, normal}Yes
offsetexpr along the plane's normalNoXY: +Z, XZ: +Y, YZ: +X
flipboolNo
hatchboolNohatch 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.

ParameterTypeRequiredDescription
params[parameter names]No
features[feature names]No
materials[body names]No
appearances[body names]Nocolumns 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.

ParameterTypeRequiredDescription
restore_markerboolNodefault 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.

ParameterTypeRequiredDescription
points[[x,y] | "l1.end" | {at, ref}…]Yesx 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
closedboolNo
constructionboolNo
ids[..]No
inferboolNoadd horizontal/vertical
connectboolNodefault 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.

ParameterTypeRequiredDescription
p0opposite corners [x,y]Yes
p1opposite corners [x,y]Yesa 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
connectboolNodefault 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.

ParameterTypeRequiredDescription
p0first edgeYes
p1first edgeYes
p2point on the opposite edgeYes
constructionboolNo
connectboolNodefault 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.

ParameterTypeRequiredDescription
p0opposite corners [x,y]Yes
p1opposite corners [x,y]Yesa 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
radiusexprYesthe corner radius, less than half the shorter side
connectboolNodefault 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.

ParameterTypeRequiredDescription
center[x,y]Yes
corner[x,y]Yesa 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
constructionboolNo
connectboolNodefault 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.

ParameterTypeRequiredDescription
center[x,y] or point refYesa 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
radiusnumber or expressionYesan expression naming a parameter is a dimension driven by it; with `through` a point ref, that and the point both fix the radius
diameternumber or expressionYesan expression naming a parameter is a dimension driven by it; with `through` a point ref, that and the point both fix the radius
throughpoint refNoa point the circle passes through, kept on it: where the tool's second click snapped
constructionboolNo
connectboolNodefault 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.

ParameterTypeRequiredDescription
p0diameter endsYes
p1diameter endsYes
constructionboolNo
connectboolNodefault 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.

ParameterTypeRequiredDescription
p0[x,y] or point refYes
p1[x,y] or point refYes
p2[x,y] or point refYesa referenced point stays on the circle
constructionboolNo
connectboolNodefault 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.

ParameterTypeRequiredDescription
start[x,y] or point refYes
end[x,y] or point refYes
through[x,y] or point refYesa referenced through point stays on the arc
constructionboolNo
connectboolNodefault 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.

ParameterTypeRequiredDescription
centerYes
startYes
endYescounter-clockwise from start; clockwise?: bool for clockwise
centerYes
startYes
sweepsigned degreesYes
constructionboolNo
connectboolNodefault 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.

ParameterTypeRequiredDescription
centerYes
radiusYesto vertices
sidesYes
angledegNo
connectboolNodefault 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.

ParameterTypeRequiredDescription
centerYes
radiusYesto edge midpoints
sidesYes
angledegNo
connectboolNodefault 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.

ParameterTypeRequiredDescription
p0Yes
p1one edgeYes
sidesYes
connectboolNodefault 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.

ParameterTypeRequiredDescription
p0Yes
p1arc centresYes
widthYes
connectboolNodefault 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.

ParameterTypeRequiredDescription
p0Yes
p1overall endsYes
widthYes
connectboolNodefault 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.

ParameterTypeRequiredDescription
idNo
connectboolNodefault 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.

ParameterTypeRequiredDescription
half_axesboolNodefault 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.

ParameterTypeRequiredDescription
curves[ids]Yes
valueboolNodefault: 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.

ParameterTypeRequiredDescription
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.

ParameterTypeRequiredDescription
startend point of a line or arcYes"l1.end"
end[x,y] or an existing point's idYes"l2.start": the arc ends on that point
curvethe curve to be tangent toNodefault: 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.

ParameterTypeRequiredDescription
curves[two lines/circles/arcs]Yes
radiusexprYes
diameterexprYes
near[x,y]Yeswhich 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.

ParameterTypeRequiredDescription
curves[three lines/circles/arcs]Yes
near[x,y]Yeswhich 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.

ParameterTypeRequiredDescription
centerslot centreYes
endone arc centreYes
widthYes
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.

ParameterTypeRequiredDescription
startYes
throughYes
endpoints on the centre arcYes
widthYes
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.

ParameterTypeRequiredDescription
centerYes
startcentre arc startYes
enddirection of the centre arc endYescounter-clockwise
sweepdegreesYes0 < sweep < 360
widthYes
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.

ParameterTypeRequiredDescription
axesboolNodefault 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.

ParameterTypeRequiredDescription
points[[x,y] or point refs…]Yes2…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.

ParameterTypeRequiredDescription
start[x,y] or point refsYes
end[x,y] or point refsYes
apex[x,y] or point refsYes
rho0…1Nodefault 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.

ParameterTypeRequiredDescription
curves[line ids]Yes
valueboolNodefault 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.

ParameterTypeRequiredDescription
atbaseline start [x,y]Yes
heightcapital height mmNodefault 5
angledegNo
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.

ParameterTypeRequiredDescription
throughsecond pointNo
curvesketch referencesNo
curve2sketch referencesNo
angledegrees from sketch XNo
offsetpositive lengthNoparallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at
solutionzero-based solution indexNo
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.

ParameterTypeRequiredDescription
throughsecond pointNo
curvesketch referencesNo
curve2sketch referencesNo
angledegrees from sketch XNo
offsetpositive lengthNoparallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at
solutionzero-based solution indexNo
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.

ParameterTypeRequiredDescription
throughsecond pointNo
curvesketch referencesNo
curve2sketch referencesNo
angledegrees from sketch XNo
offsetpositive lengthNoparallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at
solutionzero-based solution indexNo
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.

ParameterTypeRequiredDescription
throughsecond pointNo
curvesketch referencesNo
curve2sketch referencesNo
angledegrees from sketch XNo
offsetpositive lengthNoparallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at
solutionzero-based solution indexNo
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.

ParameterTypeRequiredDescription
throughsecond pointNo
curvesketch referencesNo
curve2sketch referencesNo
angledegrees from sketch XNo
offsetpositive lengthNoparallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at
solutionzero-based solution indexNo
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.

ParameterTypeRequiredDescription
throughsecond pointNo
curvesketch referencesNo
curve2sketch referencesNo
angledegrees from sketch XNo
offsetpositive lengthNoparallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at
solutionzero-based solution indexNo
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.

ParameterTypeRequiredDescription
throughsecond pointNo
curvesketch referencesNo
curve2sketch referencesNo
angledegrees from sketch XNo
offsetpositive lengthNoparallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at
solutionzero-based solution indexNo
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.

ParameterTypeRequiredDescription
throughsecond pointNo
curvesketch referencesNo
curve2sketch referencesNo
angledegrees from sketch XNo
offsetpositive lengthNoparallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at
solutionzero-based solution indexNo
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.

ParameterTypeRequiredDescription
throughsecond pointNo
curvesketch referencesNo
curve2sketch referencesNo
angledegrees from sketch XNo
offsetpositive lengthNoparallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at
solutionzero-based solution indexNo
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.

ParameterTypeRequiredDescription
throughsecond pointNo
curvesketch referencesNo
curve2sketch referencesNo
angledegrees from sketch XNo
offsetpositive lengthNoparallel: distance from the reference line; horizontal: distance from sketch X; vertical: distance from sketch Y; the side follows at
solutionzero-based solution indexNo
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.

ParameterTypeRequiredDescription
curveidYes
curves[ids]Yeseach 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.

ParameterTypeRequiredDescription
xxYest
yyYest
explicittrue and y: fYesx
aloneYesno x
startthe range of tYes
endthe range of tYesor of x
tolerancemmNodefault 0.01
constructionboolNo
variable_unit"number"Nodefault
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.

ParameterTypeRequiredDescription
entities[one or two sketch entity ids]: applies the constraint the geometry nearly hasYeshorizontal/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.

ParameterTypeRequiredDescription
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_linkboolNodefault true
constructionboolNodefault 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.

ParameterTypeRequiredDescription
refs[{body}, {face: [x,y,z], body?}, {edge: [x,y,z], body?}, {sketch, curve}]: section curvesYesor points
projection_linkboolNodefault true
constructionboolNodefault 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.

ParameterTypeRequiredDescription
refslike ProjectYesedges, vertices, sketch curves and points
constructionboolNodefault 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.

ParameterTypeRequiredDescription
face[x,y,z] point on the faceYesthe curve passes through it
bodyNo
directionu|v|[x,y,z]Nodefault 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.

ParameterTypeRequiredDescription
lineidYes
points[a, b]Yespoint ids or {midpoint: line_id}; accepted midpoints reuse or create a point with a Midpoint constraint
modehorizontal|verticalNo
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.

ParameterTypeRequiredDescription
alines or circles/arcsYes
blines or circles/arcsYes
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.

ParameterTypeRequiredDescription
alines or sketch axesYes
blines or sketch axesYesx / 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.

ParameterTypeRequiredDescription
alines or sketch axesYes
blines or sketch axesYesx / 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.

ParameterTypeRequiredDescription
entitypoint or curveYes
entities[points and curves]Yes
fixedboolNodefault: 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.

ParameterTypeRequiredDescription
alines or sketch axesYes
blines or sketch axesYesx / 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.

ParameterTypeRequiredDescription
atwo points or two curvesYes
btwo points or two curvesYeslines 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.

ParameterTypeRequiredDescription
atwo curves sharing an end pointYes
btwo curves sharing an end pointYescurvature 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.

ParameterTypeRequiredDescription
lines[line ids] of a closed chain: equal sides with every corner on one circleYesa 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.

ParameterTypeRequiredDescription
datumpoint refYesdefault 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.

ParameterTypeRequiredDescription
aYes
bend points of two curvesYes"l1.end", "a2.start"
continuityg1|g2|g3|g4Nodefault 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.

ParameterTypeRequiredDescription
pointcorner shared by two curvesYes"l1.end"
points[corners]| aYesall rounded alike: one radius, the rest equal; a corner is a point reference or {a, b}, the two curves meeting there
btwo lines or arcs meeting at a cornerYestwo 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
radiusexprYes
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.

ParameterTypeRequiredDescription
point[corners]| aYesevery corner cut alike; a corner is a point reference or {a, b}
points[corners]| aYesevery corner cut alike; a corner is a point reference or {a, b}
ba corner of two linesYestwo 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.

ParameterTypeRequiredDescription
point[corners]| aYesevery 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]| aYesevery 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
ba corner of two linesYestwo that share no end are first brought to where they meet, as in sketch.fillet
distancealong aYes
angledeg from aYes
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.

ParameterTypeRequiredDescription
point[corners]| aYesevery 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]| aYesevery 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
ba corner of two linesYestwo that share no end are first brought to where they meet, as in sketch.fillet
distancealong aYes
distance2along bYes
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.

ParameterTypeRequiredDescription
flipbool reverses the primary sideNo
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.

ParameterTypeRequiredDescription
curveidYes
at[x,y] near the end to extendYesa 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]Yestwo lines or arcs of this sketch, grown until they meet and joined there
at[[x,y],[x,y]]Noone 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.

ParameterTypeRequiredDescription
curveidYes
at[x,y]Yessplit 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]…]Yes1…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.

ParameterTypeRequiredDescription
entities[curve/point ids]Yes
base[x,y] or point refYes
factornumberYes
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.

ParameterTypeRequiredDescription
entities[curve/point ids]Yes
factornumberNoscale
angledegreesNoturn
center[x,y] or point refNowhat scales and turns stay put; default [0,0]
translate[dx,dy]Noapplied 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.

ParameterTypeRequiredDescription
entities[ids]Yes
translate[dx,dy]No
angledegNo
center[x,y]No
copyboolNo
rotate_constraintsboolNodefault 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.

ParameterTypeRequiredDescription
pathASCII DXFYesblocks expanded
textASCII DXFYesblocks expanded
align"origin"| "center"Nodefault: `at` is where the file's origin goes; `at` is where the drawing's middle goes and it turns and scales about it
tolerancemm within which ends joinNodefault 0.0001
fixedboolNoa 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
planeNowhen 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.

ParameterTypeRequiredDescription
pathSVGYes
textSVGYes
size_from"geometry"| "viewbox"Nodefault: 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"Nodefault: `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
tolerancemm within which ends joinNodefault 0.0001
fixedboolNoevery point it adds gets a Fix constraint, so the drawing stays where it is put
planeNowhen 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.

ParameterTypeRequiredDescription
pathYesbase64 PNG or JPEG
dataYesbase64 PNG or JPEG
planeXY|XZ|YZ|{face: [x,y,z]}|…Nodefault XY
center[x,y] on the planeNo
at[x,y,z]No
widthmmNodefault 100
angledegNo
opacity0…1Nodefault 0.5
flipNo
nameNo
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.

ParameterTypeRequiredDescription
pathYes
dataYes
widthmmNo
angledegNo
opacityNodefault 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.

ParameterTypeRequiredDescription
canvasid or nameYes
centerNo
widthNo
angledegNo
opacityNo
flipNo
visibleNo
nameNo
lockedNoa 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.

ParameterTypeRequiredDescription
curves[sketch curve ids]Nosketch?: 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 wayNodefault 4; combs along the face's iso grid
scalecomb length per unit curvatureNodefault 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.

ParameterTypeRequiredDescription
curves[sketch curve ids]Nosketch?
edges[[x,y,z]…]No
faces[[x,y,z]…]Nodefault: 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.

ParameterTypeRequiredDescription
faces[[x,y,z]…] points on facesYes1…100
addtrue keeps the faces already shownNo
cleartrue 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.

ParameterTypeRequiredDescription
stripesnumber across the viewNodefault 12
cleartrue turns the analysis offNo
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.

ParameterTypeRequiredDescription
pull[x,y,z] directionNodefault Z
angledegreesNodefault 1
cleartrue turns the analysis offNo
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.

ParameterTypeRequiredDescription
cleartrue turns the analysis offNo
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.

ParameterTypeRequiredDescription
direction[x,y,z] the tool comes fromNodefault Z, from above
cleartrue turns the analysis offNo
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.

ParameterTypeRequiredDescription
radiusmm shown redNodefault: a tenth of the model's size
cleartrue turns the analysis offNo
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.

ParameterTypeRequiredDescription
sketchid|nameNodefault 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.

ParameterTypeRequiredDescription
alignmentleft|center|rightNodefault right
reversedboolNodefault 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.

ParameterTypeRequiredDescription
entities[ids]Yes
countYes
spacingYes
count2No
spacing2No
spacingslength numbers or expressionsYes
directionsketch line idsNo
direction2sketch line idsNolive references
dir[x,y] vectorsNo
dir2[x,y] vectorsNodefaults: sketch x, perpendicular to direction 1
alignmentNo
alignment2left|center|rightNodefault right
reversed2boolNodefault 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.

ParameterTypeRequiredDescription
bodynameNodefault: the visible bodies
edges[x,y,z] points or {"index": i}Nodefault: every edge of the body; a pick must match one body
gap_tolerance_mmNodefault 0.001
angle_tolerance_degNodefault 1
curvature_tolerance_per_mmNodefault 0.01
curvature_change_tolerance_per_mm2Nodefault 0.001
curvature_change_rate_tolerance_per_mm3Nodefault 0.0001
addtrue keeps the seams already shaded and adds theseNomeasuring an edge again replaces it
cleartrue 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.

ParameterTypeRequiredDescription
curves[2 to 4 sketch curve ids in loop order]Yeseach 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
continuityg0|g1|g2|g3 | [one per curve]Nodefault 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
crownnumber -0.9…3Nodefault 0: how full the middle is, without touching a boundary; two curves only
operationnew|joinNodefault new; join sews the surface into the body of its first edge curve, a solid when it closes the gap
body_nameNoa 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.

ParameterTypeRequiredDescription
sketchid|name and profiles?Noplanar patches of sketch regions
profiles_3d[indices]Yesthe sketch's planar 3D-sketch loops, each patched in its own plane, as listed by sketch.inspect
edges[[x,y,z]]Yespoints on a closed loop of a body's edges: one face on them, planar when the loop is, else a smooth B-spline surface
continuityg0|g1|g2|g3|g4Noedges 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]]Noedges only, up to 64: points the patch passes through
crownnumber −0.9…3Nodefault 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
nameNo
body_nameNo
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.

ParameterTypeRequiredDescription
bodies[surface names]Yes
thicknessexprYesnegative: against the normal
symmetricboolNo
operationnew|join|cut|intersectNo
targetsNo
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.

ParameterTypeRequiredDescription
sketchid|nameNo
curves[curve ids]Noopen or closed chains of curves meeting end to end
distanceexprYes
directionpositive|negative|symmetricNosymmetric: distance is the total, split evenly around the start plane, as solid.extrude
conventiontotal_distance|legacy_per_sideNoas solid.extrude; default total_distance; legacy_per_side: the distance on each side, as older symmetric surface extrudes keep
distance2exprNo
start_offsetexprNo
nameNo
body_nameNoa 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.

ParameterTypeRequiredDescription
sketchid|nameNo
curves[curve ids] and/or profiles?Noas surface.extrude
axissketch 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]}Yesa 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
angleexprNodefault 360 deg
angle2exprNothe other side
symmetricboolNo
nameNo
body_nameNoa 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.

ParameterTypeRequiredDescription
sketchid|nameNo
curves[curve ids] and/or profiles?Noas surface.extrude
path_sketchsketchYes
path[curve ids in order]Yesa path with corners, or 3D curves, gives ruled walls mitred at the corners
path_bodybody nameNo
path_edges[points on its edges]Nothe path is a chain of that body's edges, instead of a sketch's curves
orientationNo
twistNo
scaleNo
railsNo
rail_fitNoas solid.sweep
nameNo
body_nameNoa 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.

ParameterTypeRequiredDescription
sections[{sketch, curves?: [curve ids], profiles?} | {body, edges: [[x,y,z]]}]Yes2…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]Noeach 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]Nodefault 0: how full each end leaves, -0.9 flattest to 3 fullest
railsNo
rail_fitNoas solid.loft; sketch sections only, both ends g0
nameNo
body_nameNoa 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.

ParameterTypeRequiredDescription
faces[[x,y,z]]Yespoints on the faces
bodyNo
distanceexprYessigned, along the faces' normals; 0 copies the faces
chainboolNoeach pick's whole smooth chain of faces
toleranceexprNohow 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.

ParameterTypeRequiredDescription
bodyYes
edges[[x,y,z]]Yespoints on a chain of its edges, open or closed
distanceexprYeshow far the strip reaches
modenormal|tangent|angle|directionNodefault normal: along the normal of the face beside each edge; tangent: continuing it
angleexprNoangle 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]Nodirection mode: the rulings; angle mode: the reference, e.g. a pull direction for a draft
face[x,y,z]Noa point on the face the directions come from; default: the face beside the most picked edges
flipboolNothe other side
cornersmitre|roundNosharp 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.

ParameterTypeRequiredDescription
from{body, edges: [[x,y,z]]}Yes
to{body, edges: [[x,y,z]]}Yespoints 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]Noeach 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]Nodefault 0: how full each end leaves, -0.9 flattest to 3 fullest
align[[x,y,z], [x,y,z]]Noa point each end leaves towards, when the faces at the picks do not say
seam[[x,y,z], [x,y,z]]Noa 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
stitchboolNosew the blend onto its two bodies where the boundaries meet, replacing them
nameNo
body_nameNo
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.

ParameterTypeRequiredDescription
bodies[names]Yessurfaces sewn into the first; a solid when they close
toleranceexprNodefault: 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.

ParameterTypeRequiredDescription
bodysurface nameYes
edges[[x,y,z]]Yespoints on boundary edges to push out
distanceexprYesunless up_to
modenatural| tangent| curvatureNothe 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_toplane| {body, point}| "bounds"NoXY|XZ|YZ|plane name|{origin, normal}; a face, its surface extended; natural: back to the surface's own bounds, undoing a trim
neighboursboolNodefault 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.

ParameterTypeRequiredDescription
bodysurface nameYes
planeXY|XZ|YZ|plane name|{origin, normal} or tool: {body, point}Yesa 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]Yesa point on the side to keep
keep_with[x,y,z] or [[x,y,z], …]Yeswhat to keep of it
extendboolNoa surface that stops short of the other is extended to meet it
stitchboolNothe 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.

ParameterTypeRequiredDescription
face{body, point}Yes
holesall|[[x,y,z]]Nopoints on the inner loops to remove; default: all
outerboolNorestore the outer boundary to the surface's natural bounds: a free-form surface's own, an analytic surface's span of the face
in_placeboolNountrim 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.

ParameterTypeRequiredDescription
bodyYes
faces[[x,y,z]]Nopoints 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.

ParameterTypeRequiredDescription
bodyYesa surface
faces[[x,y,z]]Nopoints 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.

ParameterTypeRequiredDescription
bodysurface nameYes
faces[[x,y,z]] points on the faces to fairNodefault: every face
strengthnumberNo0..1 of the full fairing step, default 1
iterationsnumberNo1..1000 steps, default 1
keep_edgesboolNodefault true: hold the boundary row and the row next to it, so a face keeps meeting its neighbours in position and in tangent
nameNo
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.

ParameterTypeRequiredDescription
plannedaYes
b{body, point}Yestwo faces of separate bodies that meet or cross; the points pick the side the ball rolls on
radiusexprYes
trimboth|first|noneNo
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.

ParameterTypeRequiredDescription
bodysurface nameYesthe body whose face is rebuilt
faces[[x,y,z]]Nopoints on that face, default: the body's first
targetbody nameYesthe body the seam must meet
edges[[x,y,z]]Yespoints on one edge chain of the target: the rebuilt boundary takes its place
orderg1|g2|g3Nodefault 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 typeWhat you need to selectResult
BaseA closed region in a finished sketch.A new flat sheet metal body.
EdgeOne or more supported edges of an existing sheet metal body.Bent walls along those edges. A sketch is not required for this mode.
ContourAn 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

ChoiceMeaning
TypeBase, Edge or Contour. The selection determines which input is appropriate.
RuleSets thickness, bend radius, K-factor and the gaps/reliefs that keep bends manufacturable. Change thickness in the rule, not as a flange height.
HeightSets the edge flange’s height. Check the height reference and preview when matching a drawing dimension.
AngleSets how far the edge bends; 90° makes a right-angle wall.
Per-edge angle and heightLets selected edges in one feature have different dimensions. Empty values use the common setting.
PositionPlaces the flange relative to the selected edge. The preview shows which material remains inside or outside the original outline.
FlipBends toward the other side of the sheet.
Corner Relief Shape and sizeUse the rule’s setting or override relief between edge flanges of this feature. These overrides are not available for base or contour flanges.
DistanceSets the length of a contour flange’s extrusion along the open sketch.

Try it: two sides of a tray

  1. Set a sheet rule with 1.5 mm thickness and 1.5 mm bend radius.
  2. Draw and finish an 80 × 50 mm rectangular sketch.
  3. Choose Flange, select the rectangle’s region and make a Base flange.
  4. Choose Flange again, select an edge and set its height to 20 mm.
  5. Add another 20 mm flange on the opposite edge. Check the bend directions before confirming each feature.
  6. 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

ResourceWhat to exploreAuthor and licence
Editable sheet metal demoThe 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.

ParameterTypeRequiredDescription
basesketch + profiles?Yesrule?, flip?
contoursketch + curvesYesopen chain of lines and tangent arcs
angleNodefault 90 deg
radiusNodefault: rule
height_fromouter|inner|tangentNowhere 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)
positioninside|outside|middle|material_outside|tangentNowhere 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)
flipNo
bodyNo
corner_relief_shapenotch|round|rectangular|tear and corner_relief?Nosize across
typebase|edge|contourNodefault 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.

ParameterTypeRequiredDescription
edge[x,y,z] on a top or bottom edge of the sheetYes
radiusNodefault: 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.

ParameterTypeRequiredDescription
diameterexprYes
pitchexprYes
marginexprNoclear of edges, cut-outs, bends and the outline; default: the diameter
patternstaggered| squareNo60°, default
bodyNo
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

ChoiceMeaning
EdgesThe sheet edges to turn back. Check that the preview changes the intended edge.
LengthThe return’s length, measured to its outer face. It is not the thickness of the sheet.
GapControls the inner radius of the return bend. Leave it empty to use the sheet rule’s hem setting.
FlipTurns the return toward the other side of the sheet.

Try it: a returned edge

  1. Create an 80 × 50 mm base flange in 1.5 mm sheet.
  2. Choose Hem and select a free 80 mm edge of the sheet.
  3. Set Length to 8 mm and Gap to 1.5 mm.
  4. Check which side receives the return; use Flip if necessary, then confirm.
  5. 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

ResourceWhat to exploreAuthor and licence
Editable hem demoThe 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.

ParameterTypeRequiredDescription
edges[[x,y,z] on sheet edges]Yes
lengthYesto the outer face
gapNoinner radius, default: rule
flipNo
bodyNo
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.

ParameterTypeRequiredDescription
linesketch + curveYesa sketch line on the sheet's base face; followed when the sketch changes
points[[x,y,z], [x,y,z]]Yes
angleNodefault 90 deg
radiusNodefault: rule
positioncenterline|start|end|mouldNowhere the line sits in the bend, default centerline
fixed[x,y,z] on the side that staysNodefault: the larger side
flipNofold the other way
bodyNo
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.

ParameterTypeRequiredDescription
bodyYes
ruleNo
bends[[x,y,z] on sharp edges]Noa 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.

ParameterTypeRequiredDescription
bodyNo
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.

ParameterTypeRequiredDescription
bodyNodefault: 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.

ParameterTypeRequiredDescription
bodyNodefault: 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.

ParameterTypeRequiredDescription
nameYesnew or existing
thicknessNo
k_factorNo
bend_radiusNo
relief_widthNo
relief_depthNo
corner_reliefNo
hem_gapNo
gapNoexpressions; `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_shapenotch|round|rectangular|tearNowhat 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_displaybend|includedNohow 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
activeboolNo
deleteboolNo
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

ParameterTypeRequiredDescription
sketchthe frame sketchYesid or name; 2D or 3D
lines[curve ids]Noone member each; default: every straight line drawn in the sketch: not construction, not projected or otherwise linked, not of no length
anchororigin|center|centroid|top_left|top|top_right|left|right|bottom_left|bottom|bottom_rightNothe profile point that sits on each line, default origin
locate[x,y]Nothe 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
angleangle exprNothe 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
mirrorboolNothe profile mirrored across its y axis
nameNo
body_nameNowhat 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

ParameterTypeRequiredDescription
thicknesslength in design units or a parameter expressionYes
ratiothe inset as a share of the thicknessNogive offset or ratio, not both; neither: the plate is flush with the outside of the profile
chamfercorner chamfer length along each edge from the cornerNodefault 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.

ParameterTypeRequiredDescription
position[x,y,z] on a faceYes
directionNodefault: out of the face
diameterYes
heightYes
hole_diameterNo
hole_depthNodefault: to the face
draftNoangle
filletNoroot radius
ribsNocount
rib_thicknessNo
rib_lengthNoout from the wall
rib_offsetNobelow the top
bodyNo
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.

ParameterTypeRequiredDescription
face[x,y,z] on the rim face of a shelled bodyYes
widthYes
heightYes
typelip|grooveNo
gapNogroove clearance
sideinside|outsideNowhich rim edge
bodyNo
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.

ParameterTypeRequiredDescription
position[x,y,z] on a faceYes
directionNodefault: out of the face
hook[x,y,z]Yesthe catch's direction
lengthYes
thicknessYes
widthYes
catch_depthYes
catch_lengthYes
base_heightNoextends the base below the face
new_bodyboolNomake a separate body instead of joining
bodyNo
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.

ParameterTypeRequiredDescription
position[x,y,z] on a faceYesthe rest's centre
directionNodefault: out of the face
widthYesround: the diameter
lengthNoa rectangle, along `along`
along[x,y,z]No
heightYes
draftNoangle; default: the body's plastic rule
thicknessNowall of a hollow rest
bodyNo
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.

ParameterTypeRequiredDescription
nameYeslibrary or new rule; a new one starts from `from`, default ABS (1.5mm)
fromNo
materialNo
thicknessNo
nominal_radiusNo
clearanceNo
knife_edgeNo
reveal_heightNo
thickness_variationNo
draftNo
max_thicknessNo
min_thicknessNo
min_draftNoexpressions; `Thickness` is the rule's
activeboolNorule for bodies without one
deleteboolNoa 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.

ParameterTypeRequiredDescription
bodies[names]Yes
rulenameYesempty: 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

ParameterTypeRequiredDescription
sketchid or nameYes
restore_markernonnegative timeline positionNo
nullYesend
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

ParameterTypeRequiredDescription
entities[curve, point or constraint ids]Yes
Automation details

Command ID: sketch.delete

Parameters:

entities: [curve, point or constraint ids]

Drag Sketch Point

ParameterTypeRequiredDescription
pointrefYes
to[x,y]Yes
Automation details

Command ID: sketch.move_point

Parameters:

point: ref, to: [x,y]

Move Sketch Points

ParameterTypeRequiredDescription
moves[{point: ref | near: [x,y], to: [x,y]}]Yeseach point to its own target; `near`: the sketch point closest to it, refused when none lies within `tolerance` or two are as close
tolerancemmNodefault 0.1
sketchNo
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

ParameterTypeRequiredDescription
dimensionconstraint id or parameter nameYes
at[x,y] text centreYessketch coordinates
resettrueYesdefault 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

ParameterTypeRequiredDescription
sketchid|nameNodefault 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

ParameterTypeRequiredDescription
curveid: the curves joined to it end to endYeswhat 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

ParameterTypeRequiredDescription
curvespline idYesfit 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

ParameterTypeRequiredDescription
curves[line ids]Yes
valueboolNodefault 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

ParameterTypeRequiredDescription
livebool: one frame of an interactive changeNothe 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

ParameterTypeRequiredDescription
curvean equation curve's idYes
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

ParameterTypeRequiredDescription
constraintdimension idYes
drivenboolNodefault 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

ParameterTypeRequiredDescription
constrainta circle's or an arc's radius or diameter dimension idYes
diameterboolNodefault: the other one
sketchid|nameNodefault: 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

ParameterTypeRequiredDescription
sketchidNo
nameevery constraint with where to draw its glyphYessketch coordinates
Automation details

Command ID: sketch.glyphs

Parameters:

sketch?: id|name: every constraint with where to draw its glyph (sketch coordinates)

Snap Inference

ParameterTypeRequiredDescription
at[x,y]Yes
from[x,y]Noprevious click
radiusmmNosnap 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

ParameterTypeRequiredDescription
pathSVG or DXFYesby `format`: "svg" | "dxf", default by the file name, else SVG
textSVG or DXFYesby `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

ParameterTypeRequiredDescription
sketchid|nameNodefault active
pathfile to writeNoelse the DXF text is returned
units"design" | "in" | "inch" | "mm" | "cm" | "m" | "ft"Nodefault mm
layerprofile layer nameNodefault "0"
layers"single" | "roles"Nodefault "single": all on `layer`; "roles": outer on "OUTLINE", holes on "CUT"
joinboolNodefault 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

ParameterTypeRequiredDescription
sketchid|nameNodefault active
untied[{point, curve, at, touches: {point}|{curve}}] ends that touch another curve only by positionYesthe 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

ParameterTypeRequiredDescription
sketchid|nameNodefault 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

ParameterTypeRequiredDescription
points[[x,y,z]…] world fit pointsYes2 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

ParameterTypeRequiredDescription
point[x,y,z] world pointYesneeds 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

ParameterTypeRequiredDescription
wiredrawn 3D curve or point idYes
indexfit pointNodefault 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

ParameterTypeRequiredDescription
curvederived offset curve idYesretains 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…)

ParameterTypeRequiredDescription
linklink idNoj1
entities[curve or point ids]: linked geometry becomes normal sketch geometryNo
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

ParameterTypeRequiredDescription
valueboolNodefault 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

ParameterTypeRequiredDescription
sketchid or nameYes
planeas sketch.createYes
frameas sketch.createNo
author_pathexact owner occurrence idsNo
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

ParameterTypeRequiredDescription
entities[curve or point ids]Nodefault: 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

ParameterTypeRequiredDescription
at[x, y]Nosketch point the copy's centre goes to
translate[x, y]No
sketchtargetNodefault: 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

ParameterTypeRequiredDescription
sketchthe sketch to replaceNodefault: the active sketch
fromthe sketch whose contents take its placeYesid 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

ParameterTypeRequiredDescription
canvasid or nameYes
atwo points on the canvas plane [x,y]Yes
btwo points on the canvas plane [x,y]Yes
distancetheir true distanceYesmm
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

ParameterTypeRequiredDescription
canvasid or nameYes
atwo points on the canvas plane [x,y] along a line of the imageYes
btwo points on the canvas plane [x,y] along a line of the imageYes
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

ParameterTypeRequiredDescription
canvasid or nameYes
Automation details

Command ID: canvas.delete

Parameters:

canvas: id or name

Canvas to Sketch

ParameterTypeRequiredDescription
canvasid or nameNodefault: 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

ParameterTypeRequiredDescription
cloudid or nameYes
nameNo
visibleNo
point_sizepixelsNo0.5…16
color_byfile|single|height or a property's nameNothe 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…1Nothe single colour; given alone it sets color_by single, null sets color_by file
height_rangethe same as color_rangeNo
unitsmm|cm|m|in|ftNothe file's length unit: the points are scaled from the unit they came in as
matrix[12 or 16 numbers]Nowhere the cloud sits: a rigid row-major 3x4 or 4x4 matrix, as occurrence.move takes it
toleranceNo
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

ParameterTypeRequiredDescription
cloudid or nameYesits 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

ParameterTypeRequiredDescription
cloudid or nameYes
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

ParameterTypeRequiredDescription
offtrue 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

ParameterTypeRequiredDescription
bodies[names]Nodefault: every solid body, in world placement, but those in `against`; mesh bodies are not measured
against[names]Noonly pairs with one body in `bodies` and the other here
min_volumemm³Nodefault 0.01: smaller overlaps count as contact
clearancemmNodefault 0: report pairs closer than this
nearestnNoeach body of `bodies` gets its n nearest others
skip_within"occurrence"| "component"| nullNopairs of bodies of one occurrence; pairs of bodies inside one placed component, its subcomponents included
tolerancemmNodefault 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

ParameterTypeRequiredDescription
parameternameYes
values[number | expression]| fromYesat most 200
tonumbersYes
stepsNodefault 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

ParameterTypeRequiredDescription
tolerancemmNo0.001 to 10, default 0.01
max_regionsNodefault 50
colortrue | {only_in_a?, only_in_b?: "#rrggbb"}Nocolours 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

ParameterTypeRequiredDescription
referencepath to a PNG or JPEG the model should matchYes
crop_px[x, y, w, h] in pixelsNo
crop_fraction[x, y, w, h] as fractions 0..1 of the pictureNoto take one view off a board
overlayfalse leaves the overlay PNG outNo
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

ParameterTypeRequiredDescription
viewfront|back|left|right|top|bottom|isoNodefault front
camera{target: [x,y,z], yaw, pitch, distance, fov?}Nomm, radians; fov 0 means parallel
bodies[world body names]Nodefault visible bodies, named hidden bodies included
rowsmask height in pixelsNodefault 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

ParameterTypeRequiredDescription
sizeexprYesa cell's inscribed diameter
webexprYesthe wall between cells
depthexprYesor through_all: true
shapehexagon|square|triangle|circle|polygonNodefault hexagon
sidesexprNopolygon cells, 3 to 64; default 8
dot_gridhexagonal|squareNowhere circle and polygon cells sit; default hexagonal
angleexprNothe grid's rotation about the anchor; angle 45 deg with square cells gives a diamond layout
anchor[x,y,z]Noa cell's centre, projected onto the sketch plane; default the sketch origin: grids with the same anchor, angle, size and web line up
clipwhole|snap|freeNocells 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
directionpositive|negative|symmetricNodefault positive
sketchid|nameNodefault: active or last sketch; its closed profiles hold the field: a loop inside another is a keep-out
profilesas solid.extrudeNo
targets[body]No
modecutNothe 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

ParameterTypeRequiredDescription
bodymesh body nameNodefault: the selected mesh body
nameNo
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

ParameterTypeRequiredDescription
bodyfinite positive chord tolerance in mmYes
tolerancefinite positive chord tolerance in mmNodefault 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

ParameterTypeRequiredDescription
bodynameYes
Automation details

Command ID: model.edges

Parameters:

body: name

List Faces

ParameterTypeRequiredDescription
bodynameYes
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

ParameterTypeRequiredDescription
bodynameNoa 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

ParameterTypeRequiredDescription
pathplugin package folderYes
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

ParameterTypeRequiredDescription
pathplugin .zipYes
replaceboolNorequired to replace an installed plugin of the same id
dry_runboolNo
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

ParameterTypeRequiredDescription
pathYes
approvalexact hash from plugin.inspect after reviewing permissionsYes
entryYes
paramsJSONNo
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

ParameterTypeRequiredDescription
bodyNo
pathNo
curvesexact|arcsNodefault 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
textcut|etchNodefault 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_notesboolNodefault 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_heightmmNodefault 3
bend_linesboolNodefault true; false leaves BEND_UP and BEND_DOWN out, for a cutter that would cut them
layersroles|singleNodefault roles, the layers below; single: every entity on layer 0
per_bodyboolNoa 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

ParameterTypeRequiredDescription
bodyNo
formatcsv|jsonNodefault csv
pathNo
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

ParameterTypeRequiredDescription
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}Yesframe.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

ParameterTypeRequiredDescription
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}Yesframe.profile.list gives each kind's dimensions and an example; dimensions left out take defaults from the profile's size
at[x,y]Nosketch mm, default the origin
anchororigin|center|centroid|top_left|top|top_right|left|right|bottom_left|bottom|bottom_rightNothe 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
fixedboolNodefault true: the curves are locked, so solving the sketch keeps the shape
sketchid|nameNodefault: 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.

ParameterTypeRequiredDescription
componentid or nameYes
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.

ParameterTypeRequiredDescription
componentid or nameYes
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.

ParameterTypeRequiredDescription
componentid or nameYes
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.

ParameterTypeRequiredDescription
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.

ParameterTypeRequiredDescription
componentid or nameYes0 or "root" for the design
occurrenceexact placement used to author shared geometryNo
pathexact placement used to author shared geometryNo
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.

ParameterTypeRequiredDescription
componentid or name of a linked componentYes
pathits placementNooccurrence 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.

ParameterTypeRequiredDescription
compactboolNocounts of bodies, features, sketches and construction planes instead of their names; occurrences leave out identity transforms; children as occurrence ids
bodiesboolNowith 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.

ParameterTypeRequiredDescription
componentid or nameNodefault active
descendantsboolNodefault 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.

ParameterTypeRequiredDescription
componentYes
nameYes
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.

ParameterTypeRequiredDescription
bodies[names]Yes
componentYes
component_pathits placement to place them byNodefault: its only one, else the active one; a component placed more than once gets them in every instance
from_paththe placement of their component they move fromNodefault: 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.

ParameterTypeRequiredDescription
bodies[names, as the Browser shows them: a body seen in another placement of its component (Cube (B:2)) is copied from there]Yes
componentwhere the copies goNodefault: the active one
component_pathits placement to place them byNodefault: 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.

ParameterTypeRequiredDescription
componentwhere it goesNodefault: 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.

ParameterTypeRequiredDescription
sketches[ids or names]Yesa number is an id; a string is an exact name, then an id
componentYes
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.

ParameterTypeRequiredDescription
sketches[ids or names]Nodefault: 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.

ParameterTypeRequiredDescription
features[ids or names]Yessketches too
componentwhere they goNodefault: 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.

ParameterTypeRequiredDescription
occurrenceselected source placementNo
pathselected source placementNo
parentcomponent the copy goes inNodefault: the source placement's; not the component or one inside it
in_placeas occurrence.copyNo
parent_pathas occurrence.copyNo
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

Read the components and joints guide.

ParameterTypeRequiredDescription
componentid or nameNodefault: 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)

Read the components and joints guide.

ParameterTypeRequiredDescription
componentid or name of a linked componentYes
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

Read the components and joints guide.

ParameterTypeRequiredDescription
componentid or name of a linked component — keeps its bodies as they are and forgets the design fileYes
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.

ParameterTypeRequiredDescription
componentid or name of a component that is not linkedYes
paththe .sc design to writeYes
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.

ParameterTypeRequiredDescription
componentid or name of a linked componentYes
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

Read the components and joints guide.

ParameterTypeRequiredDescription
witha linked componentYes
patha .sc designYesits 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

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.

ParameterTypeRequiredDescription
componentid or nameYes0 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.

ParameterTypeRequiredDescription
componentid or nameYesnot the root: use document.metadata.set
part_numbertextNo
descriptiontextNo
revisiontextNoempty or null removes
bom_typenormal|phantom|reference|purchased|inseparableNoempty or null: normal
values{key: value}NoSolidCraft'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.

ParameterTypeRequiredDescription
occurrenceid or nameYes
path[occurrence ids]Norequired if nested under multiple instances
descendantsboolNodefault 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.

ParameterTypeRequiredDescription
componentYesor occurrence
pathvalidates selected occurrenceNo
parentcomponentNodefault: 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.

ParameterTypeRequiredDescription
occurrenceYes
pathexact placementNo
spacelocal|worldNodefault local
translate[x,y,z]Nonumbers 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
angleradians 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]Noabsolute placement: where it goes in space, not a move; not with translate/axis/angle/origin/matrix
matrix[12 or 16 numbers]Noinstead 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
tolerancelargest accepted |RᵀR − I|Nodefault 1e-9, at most 1e-3
captureboolNodefault true; false keeps it pending until Capture Position
move_groundedboolNodefault 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.

ParameterTypeRequiredDescription
at[x,y,z] world point on itYes
point[x,y,z] where it goesYes
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.

ParameterTypeRequiredDescription
occurrenceplacements to move togetherNo
occurrencesplacements to move togetherNo
pathplacements to move togetherNo
pathsplacements to move togetherNo
fromYes
from_faceYes
from_planeYes
toYes
to_faceYes
to_planeYes
flipboolNo
captureboolNodefault true
move_groundedboolNodefault 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.

ParameterTypeRequiredDescription
occurrenceYes
groundedboolNodefault toggles
Automation details

Command ID: occurrence.ground

Parameters:

occurrence; grounded?: bool (default toggles)

Move to Component

Read the components and joints guide.

ParameterTypeRequiredDescription
occurrenceYes
pathexact placementNo
parentcomponent id or nameYes0 or "root" for the design
parent_paththe parent's placement to place it byNodefault: 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.

ParameterTypeRequiredDescription
folderbodies|sketches|constructionNo
componentidNodefault 0
parentgroup idNothe new group nests in it, taking its component and folder; at most 8 levels
nameNo
items[keys]Nothey 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.

ParameterTypeRequiredDescription
groupidYesits 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.

ParameterTypeRequiredDescription
groupidYes
nameYes
Automation details

Command ID: browser.rename_group

Parameters:

group: id, name

Move Browser Items

Read the window tour.

ParameterTypeRequiredDescription
folder[keys (strings) and group ids (numbers)]Yes
component[keys (strings) and group ids (numbers)]No
items[keys (strings) and group ids (numbers)]Yes
groupidNointo it; omit for the folder's top level
beforekey or group idNoposition 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.

ParameterTypeRequiredDescription
folderbodies|sketches|construction|componentsYes
componentNo
order[keys (strings) and top-level group ids (numbers)]Yesdisplay 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.

ParameterTypeRequiredDescription
visibleboolYes
items[sketch id or name | body name | construction name | joint name | O|X|Y|Z|XY|XZ|YZ]No
joints[joint id or name]Notheir glyphs; they still constrain and move parts
features[feature id or name]Nothe bodies they made; path?: [occurrence ids] for only that placement's
folderbodies|sketches|construction|origin|joints|allNoall 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]Nothe folder or group itself: its items keep their own state; component origin items use o:4/origin/XY etc. in items
paths[[occurrence ids]]Noexact placements and descendants
isolateboolNowith 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.

ParameterTypeRequiredDescription
path[occurrence ids]Nothat placement and its descendants
componentidNothat 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.

ParameterTypeRequiredDescription
path[occurrence ids]Nothat placement's branch
componentidNo
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.

ParameterTypeRequiredDescription
occurrenceid|nameYes
point[x,y,z]Yeswhere its point goes, world
at[x,y,z]Noits point, in the world where it is now; default: the centre of its bodies' box
z[x,y,z]Nothe way its axis then points
axis[x,y,z]Nothat axis, in the world now; default: its own z
joints[ids or names]Noonly these move toward the point; the other joints of a closed loop they are in follow
quietboolNo
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.

ParameterTypeRequiredDescription
jointYes
indexvalue indexNodefault 0
minNo
maxNoomit 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.

ParameterTypeRequiredDescription
jointYes
ajoint origins as joint.create takes themNo
bjoint origins as joint.create takes themNoa side left out keeps its place; the two must stay on different occurrences
typeNo
flipNo
offsetNo
angleNoa number, or an expression the joint then follows
suppressedNo
nameNo
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.

ParameterTypeRequiredDescription
jointid|nameYesor 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.

ParameterTypeRequiredDescription
jointid|nameNodefault: 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.

ParameterTypeRequiredDescription
jointid|nameYes
fromits value the sweep runs betweenYes
toits value the sweep runs betweenYesdegrees for angles, mm for distances, or expressions
indexNowhich value, default 0
stepNobetween samples, in the joint's unit; default: fine enough that no part passes through another between two
refinemmNothe 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]Nochecked against each other; default every occurrence
against[ids or names]Nothe parts that stay: each of `occurrences` only against these
contact_setstrueNothe pairs of the design's contact sets
exclude_pairs[[a, b]]Nooccurrences by id or name: pairs of bodies under a and b are not checked, such as a pin in its hole
budget_ssecondsNoat 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_gapsboolNothe nearest gap at every sample, default false
applyboolNoleave 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.

ParameterTypeRequiredDescription
jointid|nameYes
indexNoone value; default every value
refineNo
stepNo
occurrencesNo
againstNo
contact_setsNo
exclude_pairsNoas 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

ParameterTypeRequiredDescription
constraintid|nameYesa joint made with assembly.constraint.create
typea rule as assembly.constraint.create takes itNothe references it has must fit it; the gap carries over
offsetthe gapNomm or an expression
anglean angle rule's angleNo
fliptrue turns b overNofrom the new rule's way after a type change, else from how it faces now
nameNo
suppressedNo
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

ParameterTypeRequiredDescription
setid|nameYes
occurrencesNo
nameNo
suppressedboolNo
deleteboolNo
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.

ParameterTypeRequiredDescription
studyid|nameYes
stepYes0…steps
quietboolNopositions 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.

ParameterTypeRequiredDescription
studyYes
samplesNodefault steps + 1
pathNo.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.

ParameterTypeRequiredDescription
studyid|nameYes
jointid|name with from and toYesdegrees for angles, mm for distances, or expressions
viewid|nameYesan exploded view, coming apart from the assembled placement
samplesNoframes, 2…1000; default the study's steps + 1, 100 for a joint, 41 for a view or 81 with back
widthNo
heightNo16…4096 pixels, default 800 × 500
camera{target, yaw, pitch, roll?, distance, fov?, up?}Noui.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
fpsNo1…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.

ParameterTypeRequiredDescription
studyid|nameYes
jointid|name with from and toYesdegrees for angles, mm for distances, or expressions
nameNodefault Motion TraceN
auto_updateboolNodefault true
point_refjoint origin snap - keeps the trace as a root 3D sketch splineNo
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.

ParameterTypeRequiredDescription
sketchid|nameYes
indexNo
samplesNo2…500
auto_updatefalse to detachNo
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.

ParameterTypeRequiredDescription
studyid|nameYes
joints[id|name]Nodefault: every joint that moves
samplesNo3…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.

ParameterTypeRequiredDescription
studyid|nameYes
occurrences[ids or names]Notwo or more, checked against each other; default every occurrence
against[ids or names]Nothen each of `occurrences` is checked only against these, such as an arm against the parts it must miss
contact_setstrueNothe pairs of the design's contact sets
exclude_pairs[[a, b]]Nooccurrences by id or name: pairs of bodies under a and b are not checked
samplesNo2…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.

ParameterTypeRequiredDescription
studyYes
Automation details

Command ID: motion.delete

Parameters:

study

Other commands: explode

Show Exploded View

ParameterTypeRequiredDescription
viewid|nameYesor 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

ParameterTypeRequiredDescription
viewYes
Automation details

Command ID: explode.delete

Parameters:

view

Other commands: layout

Apply Layout

ParameterTypeRequiredDescription
nameapply preset to current workspace through retained runtimeYes
expected_revisionapply preset to current workspace through retained runtimeNo
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

ParameterTypeRequiredDescription
expected_revisionrestore current workspace's registered defaultNo
Automation details

Command ID: layout.reset

Parameters:

expected_revision?: restore current workspace's registered default

Save Layout

ParameterTypeRequiredDescription
nameYes
replacefalseNooverwrite accepted for compatibility
expected_revisionsave complete envelope in injected catalogueNo
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

ParameterTypeRequiredDescription
workspaceatomically remember outgoing and replace with destinationYes
expected_revisionatomically remember outgoing and replace with destinationNo
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

ParameterTypeRequiredDescription
expected_revisiondismiss temporary collapsed-panel presentationNo
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

ParameterTypeRequiredDescription
expected_revisionresolve the focused shared panel control in the live hostNo
Automation details

Command ID: panel.focus.next

Parameters:

expected_revision?: resolve the focused shared panel control in the live host

Focus Previous Panel

ParameterTypeRequiredDescription
expected_revisionresolve the focused shared panel control in the live hostNo
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

ParameterTypeRequiredDescription
expected_revisionresolve the focused shared panel control in the live hostNo
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

ParameterTypeRequiredDescription
targetnative_hostYes
expected_revisionnative close redocks without cancelling contentNo
Automation details

Command ID: panel.native_close

Parameters:

target: native_host, expected_revision?: native close redocks without cancelling content

Open Panel

ParameterTypeRequiredDescription
kindYes
instanceYes
destinationrequired for new instanceNo
expected_revisionNo
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

ParameterTypeRequiredDescription
firstreset adjacent dock pair to registered default ratioYes
secondreset adjacent dock pair to registered default ratioYes
expected_revisionreset adjacent dock pair to registered default ratioNo
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

ParameterTypeRequiredDescription
firstconserve adjacent dock pair extentYes
secondconserve adjacent dock pair extentYes
first_sizeconserve adjacent dock pair extentYes
second_sizeconserve adjacent dock pair extentYes
expected_revisionconserve adjacent dock pair extentNo
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

ParameterTypeRequiredDescription
expected_revisionresolve the focused shared panel control in the live hostNo
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

ParameterTypeRequiredDescription
expected_revisionresolve the focused shared panel control in the live hostNo
Automation details

Command ID: panel.sash.left

Parameters:

expected_revision?: resolve the focused shared panel control in the live host

Reset Focused Panel Sash

ParameterTypeRequiredDescription
expected_revisionresolve the focused shared panel control in the live hostNo
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

ParameterTypeRequiredDescription
expected_revisionresolve the focused shared panel control in the live hostNo
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

ParameterTypeRequiredDescription
expected_revisionresolve the focused shared panel control in the live hostNo
Automation details

Command ID: panel.sash.up

Parameters:

expected_revision?: resolve the focused shared panel control in the live host

Toggle Focused Panel

ParameterTypeRequiredDescription
expected_revisionresolve the focused shared panel control in the live hostNo
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.

ParameterTypeRequiredDescription
paramNotarget name
featureNotarget name
materialNotarget name
appearanceNotarget name
deleteboolNo
Automation details

Command ID: config.column

Parameters:

param? | feature? | material? | appearance? (target name); delete?: bool

Configuration Row

Read the parameters and expressions guide.

ParameterTypeRequiredDescription
nameYesa row's name, or its id from config.table
fromNorow to copy, by name or id; default current values
values{column key: expression, suppression, material name, appearance name or Look object}No
renameNo
deleteboolNo
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.

ParameterTypeRequiredDescription
rule{id,name,enabled,condition,effect}No
rules[rule…]Noadded 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

ParameterTypeRequiredDescription
familyNo
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

ParameterTypeRequiredDescription
familyYessocket_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
sizeYes"M6", "608" for bearings, "1/2-13 UNC" for inch screws and nuts, "1/2" for inch washers
lengthNomm, inch parts too; screws, bolts, set screws, pins; default a standard length near 2.5 d
flipboolNodefault false: turned over, head into the material with at, +z against direction with point
nameNo
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

ParameterTypeRequiredDescription
componentid|name of an inserted partYes
sizeNo
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

ParameterTypeRequiredDescription
bodyits nameYes
bodiesseveral body namesYeseach in turn gets the first of name, name (2), name (3)… that no other body has
namethe new nameYesfeatures 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

ParameterTypeRequiredDescription
bodyits nameYesa part the modelling kernel refuses, or an open part that should be a solid
gapexprNodefault 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_holesboolNodefault 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
nameNo
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

Default keyboard shortcut: Ctrl+B

ParameterTypeRequiredDescription
bodyits nameYes
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

ParameterTypeRequiredDescription
unitsmm|cm|m|in|ftYesdisplay 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

ParameterTypeRequiredDescription
key[keys]Yes
keys[keys]Yesany 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

ParameterTypeRequiredDescription
measureboolNoinclude body measurements
sketch_countsboolNoeach sketch also gives its plane and its number of points and constraints
timelinetrue| "summary"| falseNodefault; each feature as id, name, type, with error, warning, suppressed and rolled_back only when set; left out
bodiestrue| "names"| falseNodefault; 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.

ParameterTypeRequiredDescription
nameNo
camera{target: [x,y,z], yaw, pitch, distance, fov?}Yesreplaces 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.

ParameterTypeRequiredDescription
viewnameYes
nameYes
Automation details

Command ID: view.rename

Parameters:

view: name, name

Delete Named View

Read the window tour.

ParameterTypeRequiredDescription
viewnameYes
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.

ParameterTypeRequiredDescription
viewfront|back|top|bottom|left|right|iso|home| a named view's nameNoframes the model
camera{target: [x,y,z], yaw, pitch, distance, fov?, roll?}Noradians, 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

Read the window tour.

ParameterTypeRequiredDescription
toolorbit|pan|zoom|noneYes
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.

ParameterTypeRequiredDescription
onboolNoomitted: 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.

ParameterTypeRequiredDescription
onboolNoomitted: 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.

ParameterTypeRequiredDescription
styleshaded_with_edges|shaded|wireframe|shaded_with_hidden_edgesYes
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.

ParameterTypeRequiredDescription
onboolNoomitted: toggle
Automation details

Command ID: view.grid

Parameters:

on?: bool (omitted: toggle) → on?; show the viewport grid

Ground Shadow

Read the window tour.

ParameterTypeRequiredDescription
onboolNoomitted: toggle
Automation details

Command ID: view.ground_shadow

Parameters:

on?: bool (omitted: toggle) → on?; show the ground shadow

Read the window tour.

ParameterTypeRequiredDescription
visibleboolNoomitted: 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.

ParameterTypeRequiredDescription
styleaxes|cube|customNo
bodybody name|nullNo
texturethemed|modeledNo
arrowsboolNo
homeboolNo
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.

ParameterTypeRequiredDescription
onboolNoomitted: 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.

ParameterTypeRequiredDescription
onboolYes
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.

ParameterTypeRequiredDescription
aspect16:9|3:2|1:1|4:5|9:16|customNo
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.

ParameterTypeRequiredDescription
openboolYes
by_lookboolNo
searchboolNo
querystringNoup 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.

ParameterTypeRequiredDescription
visibleboolYes
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.

ParameterTypeRequiredDescription
pausedboolYes
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.

ParameterTypeRequiredDescription
kindnothing|environment|lighting|light|shot|output|wear|sampling|effects|checkYes
idbounded nonempty string for light/shotNo
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.

ParameterTypeRequiredDescription
stagelook|light|frame|outputYes
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.

ParameterTypeRequiredDescription
visibleboolYes
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.

ParameterTypeRequiredDescription
panelinspector|browserYes
sideleft|rightYes
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.

ParameterTypeRequiredDescription
modefloating|compactYes
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.

ParameterTypeRequiredDescription
width1..1000000No
dockbottom|left|under_browser|browserNobrowser: the history in the browser, no timeline
collapsedboolNo
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.

ParameterTypeRequiredDescription
presetperformance|qualityYes
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.

ParameterTypeRequiredDescription
enabledboolYes
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.

ParameterTypeRequiredDescription
enabledboolYes
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.

ParameterTypeRequiredDescription
enabledboolYes
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.

ParameterTypeRequiredDescription
enabledboolYes
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

Read the window tour.

ParameterTypeRequiredDescription
cameraCameraYes
direction[x,y,z] in the camera's up-axis frameNo
actionleft|right|up|down|clockwise|counterclockwise|home|fitYes
degrees0..180Nohow far left|right|up|down turn; default 90
fitboolNoframe the whole model from the new direction as well, as home does; default false
motionpan|orbit|zoomYes
delta[dx,dy]Nopixels, each ±10000
free_orbitboolNoorbit through poles, default false
viewport[width,height]No1..1000000, required for pan or pivot
pivot[x,y,z]No
factor0.05..20Norequired 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.

ParameterTypeRequiredDescription
cameraCameraNodefault: 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.

ParameterTypeRequiredDescription
cameraCameraNodefault: 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.

ParameterTypeRequiredDescription
cameraCameraNodefault: 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.

ParameterTypeRequiredDescription
cameraCameraNodefault: 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.

ParameterTypeRequiredDescription
cameraCameraNodefault: 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.

ParameterTypeRequiredDescription
cameraCameraNodefault: 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.

ParameterTypeRequiredDescription
cameraCameraNodefault: 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.

ParameterTypeRequiredDescription
cameraCameraNodefault: 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

ParameterTypeRequiredDescription
anchor[x,y,z]Nothe point in model space, mm; without it, where the selection points, or the origin
textthe noteYesmay span lines
hiddenboolNosaved 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

ParameterTypeRequiredDescription
noteidYes
textthe new textNo
anchor[x,y,z]Nomove the anchor
hiddenboolNoshow 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

ParameterTypeRequiredDescription
noteidYes
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

ParameterTypeRequiredDescription
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_runboolNo
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

ParameterTypeRequiredDescription
detailboolNodefault 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

ParameterTypeRequiredDescription
checkpointidYes
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

ParameterTypeRequiredDescription
actiontoggle|play|stopNodefault 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

ParameterTypeRequiredDescription
featureid|nameYes
nameYesreferences to it follow
Automation details

Command ID: timeline.rename

Parameters:

feature: id|name, name (references to it follow)

New Feature Folder

ParameterTypeRequiredDescription
nameNo
features[id|name]No
joints[id|name]No
groups[folder ids]No
parentfolder idNofeatures 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

ParameterTypeRequiredDescription
groupidYes
groups[ids]Yesfeatures 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

ParameterTypeRequiredDescription
groupidYes
nameYesrenames 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

ParameterTypeRequiredDescription
features[id|name]No
joints[id|name]No
groups[ids]No
groupidNoomit 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

ParameterTypeRequiredDescription
features[id|name]No
groups[folder ids]No
groupfolder idNo
positioninsertion slotYes
activeboolNotrue = 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

ParameterTypeRequiredDescription
featureid|nameYes
positionits new indexYes
activeboolNotrue = 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

ParameterTypeRequiredDescription
features[id|name]Yes
positioninsertion slot in the current historyYes
activeboolNoas 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

ParameterTypeRequiredDescription
featureid|nameYes
commandthe feature's command idYes
paramsits parametersYesthe 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

ParameterTypeRequiredDescription
featureid|nameYes
Automation details

Command ID: timeline.dependents

Parameters:

feature: id|name → features deleted with it, and features that would fail without it

Suppress Feature

ParameterTypeRequiredDescription
featureid|nameYes
features[id|name]Yes
groups[timeline folder ids]Yesevery feature and joint in those folders and their nested folders; one undo step
suppressedboolNodefault 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

ParameterTypeRequiredDescription
featureid|nameYes
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

ParameterTypeRequiredDescription
groupfolder idYes
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

ParameterTypeRequiredDescription
features[ids or names]Yesin timeline order on paste
Automation details

Command ID: timeline.copy

Parameters:

features: [ids or names] (in timeline order on paste)

Paste Features

ParameterTypeRequiredDescription
translate[x,y,z]Nomoves the copies' geometry
componentwhere the copies goNodefault: the active one
component_pathits placementNodefault: the active one, else its only one
from_designtrue to paste sketch features from the host's cross-design clipboard snapshotNo
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

ParameterTypeRequiredDescription
featurea feature as the design file and timeline.inspect hold itYes{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?}]Nothe 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

ParameterTypeRequiredDescription
pathwrite the script to this fileNo
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.

ParameterTypeRequiredDescription
items[{type: body|edge|face|feature|sketch_curve|sketch_point|profile, …}]Yes
addboolNo
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.

ParameterTypeRequiredDescription
modebody|face|componentYes
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.

ParameterTypeRequiredDescription
bodyworld body nameNo
faceface indexNo
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.

ParameterTypeRequiredDescription
favoritesboolNoonly favourites
filterall|user|sketch|feature|favoritesNo
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.

ParameterTypeRequiredDescription
nameYes
expressionYes
unitas parameters.changeNotext: a text parameter, its expression the text
commentNo
favoriteboolNo
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.

ParameterTypeRequiredDescription
nameYes
new_nameYesexpressions, 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.

ParameterTypeRequiredDescription
nameYesrefused 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.

ParameterTypeRequiredDescription
nameboolYes
favoriteboolNodefault true
Automation details

Command ID: parameters.favorite

Parameters:

name, favorite?: bool (default true)

Move Parameter

Read the parameters and expressions guide.

ParameterTypeRequiredDescription
nameanother user parameterYes
beforeanother user parameterYes
afteranother user parameterYes
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.

ParameterTypeRequiredDescription
nameYes
commentYes
Automation details

Command ID: parameters.comment

Parameters:

name, comment

Parameter Users

Read the parameters and expressions guide.

ParameterTypeRequiredDescription
nameYes
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.

ParameterTypeRequiredDescription
formatcsv|jsonNodefault csv, or from the path
pathwrite to a fileNo
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.

ParameterTypeRequiredDescription
textCSVYesheader 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.

ParameterTypeRequiredDescription
prefixthe text before the cursorNo
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.

ParameterTypeRequiredDescription
expressionlength|angle|unitlessYes
kindlength|angle|unitlessNoor 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.

ParameterTypeRequiredDescription
nameNo
Automation details

Command ID: file.new

Parameters:

name?

Save

Default keyboard shortcut: Ctrl+S

Read the import and export guide.

ParameterTypeRequiredDescription
pathNodefault: current file; a name that opens as another kind of file, such as .step, .stl or .dxf, is refused: file.export writes those
formatcontainer|jsonNodefault: json for .json, otherwise container
compressionfast|compactNodefault: fast
cacheboolNothe evaluated model, so the design opens without rebuilding; default: true
previewboolNosaved display meshes, default: false
overwriteboolNoreplace the design's file even though another program or computer changed it since it was opened or saved; without it that save is refused
signboolNothe app's own Save only: sign the save with GnuPG, appending a provenance record; container only; a script or agent is refused
signing_keyfingerprint or user idNodefault: 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.

ParameterTypeRequiredDescription
pathYesa 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
formatcontainer|jsonNodefault: json for .json, otherwise container
compressionfast|compactNodefault: fast
cacheboolNothe evaluated model, so the design opens without rebuilding; default: true
previewboolNosaved display meshes, default: false
overwriteboolNoas file.save, when `path` is the design's own file
signbool and signing_key?Noas 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.

ParameterTypeRequiredDescription
pathNodefault: 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.

ParameterTypeRequiredDescription
pathYes
formatstl|stla|obj|step|3mf|3mf-tagged|glb|urdf|jsonNodefault 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]NoJSON and URDF export the complete design
qualitystandard|fine|finestNoSTL, 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
objectsbody|componentNo3MF 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_facesboolNoSTL 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.

ParameterTypeRequiredDescription
pathYes
bodies[names]Nodefault: 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.

ParameterTypeRequiredDescription
pathYes
bodies[names]Nodefault: every body
qualitystandard|fine|finestNodefault standard
lay_on_print_facesboolNodefault 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.

ParameterTypeRequiredDescription
pathYes
bodies[names]Nodefault: every body
qualitystandard|fine|finestNodefault standard
objectsbody|componentNoas file.export
lay_on_print_facesboolNodefault 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.

ParameterTypeRequiredDescription
pathYes
bodies[names]Nodefault: every body
qualitystandard|fine|finestNodefault 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.

ParameterTypeRequiredDescription
pathYes
mesh_prefixNo
effortNodefault 1000
velocityNodefault 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.

ParameterTypeRequiredDescription
pathYes
formatstl|3mf|3mf-taggedNodefault from the extension, else stl; 3mf-tagged: docs/formats/3mf-face-tags.md
bodies[names]Nodefault: all
asciiboolNoSTL
single_instanceboolNodefault true; see file.send_to_slicer
qualitystandard|fine|finestNoSTL, 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
objectsbody|componentNo3MF 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_facesboolNodefault 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.

ParameterTypeRequiredDescription
bodies[names]Nodefault: the selected bodies
waitblock|return|noNodefault 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_instanceboolNodefault true: PrusaSlicer, SuperSlicer and Cura load the file in the window that is open
format3mf|stl|3mf-taggedNodefault 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.

ParameterTypeRequiredDescription
consentboolYesrequired: 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]Nodefault: the selected bodies
format3mf|stlNodefault 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.

ParameterTypeRequiredDescription
cameraCameraYescurrent view
hiddenomit|dashedNodefault omit
tolerance0.0001..1 mmNocurve chord tolerance, default 0.01
curveslines|arcsNolines, default, writes the short lines the view is built from; arcs writes visible circles and arcs as CIRCLE and ARC
zerotarget|originNowhere the drawing's 0,0 is: the camera target, default, or the model origin as seen from the camera
path.dxf fileNoelse 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.

ParameterTypeRequiredDescription
unitsfor an STL or OBJ fileNosee file.insert_mesh
originbool for a mesh fileNosee file.insert_mesh
reuse_importboolNoSTEP/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
historyfeatures|solids for a FreeCAD fileNosee file.insert_step
componentsboolNodefault true
silkscreenboolNodefault true: the silk shapes and text
color"#rrggbb" or [r, g, b]Noboard substrate colour
representationmesh|brepNothe board itself; default brep: a solid whose faces can be picked
read_onlyboolNoa design: saving to its own file is refused, file.save_as keeps the changes elsewhere
verifyboolNodefault 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.

ParameterTypeRequiredDescription
dirNodefault: 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.

ParameterTypeRequiredDescription
idYesfrom doc.recovery_list
dirNo
discardboolNodelete the entry once open
unsavedYes
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.

ParameterTypeRequiredDescription
idtrueYes
alltrueYes
dirNo
Automation details

Command ID: doc.recovery_discard

Parameters:

id, or all: true; dir?

Other commands: appearance

Copy Look

Default keyboard shortcut: Ctrl+Alt+C

ParameterTypeRequiredDescription
targetappearance.chain targetYes
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

ParameterTypeRequiredDescription
lookappearance.assign lookYes
favoriteboolYes
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

ParameterTypeRequiredDescription
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

ParameterTypeRequiredDescription
fromlibrary name | saved look {name,color,opacity,pbr?}Yescopy 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

ParameterTypeRequiredDescription
bodynameNoor 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

ParameterTypeRequiredDescription
targetappearance.chain targetNo
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

ParameterTypeRequiredDescription
nameYesnot a built-in material's
density_g_cm3Yes
appearancelibrary nameNoappearance.library
color"#rrggbb" or [r, g, b]No0–255
opacityNo0–1
pbr{metallic:0..1, roughness:0.045..1, dielectric_ior:1..3}Noopaque only, needs color/appearance
pbrnull selects scalar shadingYes
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

ParameterTypeRequiredDescription
materiala material defined in this designYes
nameNobodies and configuration cells follow
density_g_cm3No
appearanceNo
colorNo
opacityNo
pbrNoas 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

ParameterTypeRequiredDescription
materiala material defined in this designYes
replacematerial for the bodies and configuration cells that use itNowithout 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

ParameterTypeRequiredDescription
cardschema_version 1 engineering material cardYes
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

ParameterTypeRequiredDescription
pathv1/v2 library JSONYes
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

ParameterTypeRequiredDescription
path.jsonYes
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

ParameterTypeRequiredDescription
pathYes
entryqualified IDYes
revisionexact content SHA-256Yes
targets{bodies?, faces?: [{body,point}], components?}No
namephysical material name on importNo
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

ParameterTypeRequiredDescription
name1..64 charactersYes
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

ParameterTypeRequiredDescription
nameYes
Automation details

Command ID: settings.profile.apply

Parameters:

name → name, applied, skipped: [preference]; switches every setting the profile holds at once

Rename Settings Profile

ParameterTypeRequiredDescription
name1..64 charactersYes
to1..64 charactersYes
Automation details

Command ID: settings.profile.rename

Parameters:

name, to: 1..64 characters → name

Delete Settings Profile

ParameterTypeRequiredDescription
nameYes
Automation details

Command ID: settings.profile.delete

Parameters:

name → deleted

Export Settings Profile

ParameterTypeRequiredDescription
namefileYes
pathfileNo
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

ParameterTypeRequiredDescription
pathfileYes
profilesolidcraft-profile/1 documentYes
name1..64 charactersNo
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

ParameterTypeRequiredDescription
idone reportNodefault: all
Automation details

Command ID: diagnostics.crash_reports.clear

Parameters:

id?: one report (default: all). Returns {deleted}

Profile

ParameterTypeRequiredDescription
enabledboolNostart or stop recording
resetboolNoforget what was recorded
toprowsNodefault 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

ParameterTypeRequiredDescription
nameYes
settyped CPU raytrace or GPU path setup patchNo
frameworld-mm origin/u/v physical repeat vectorsYes
mapsexplicit base_color_srgb/normal_opengl/roughness_linear/metallic_linear {path,expected_sha256?}Yes
provenance{author,source,license}Yes
normal_strength1No
flip_vfalseNo
replacefalseNo
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

ParameterTypeRequiredDescription
nameYes
setnumerical setup patchNo
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

ParameterTypeRequiredDescription
nameYes
settingsfull unsaved RenderSetupNo
expected_revisionu64No
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

ParameterTypeRequiredDescription
nameYes
settingsfull unsaved RenderSetupNo
expected_revisionu64No
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

ParameterTypeRequiredDescription
nameYes
settingsfull unsaved RenderSetupNo
expected_revisionu64No
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

ParameterTypeRequiredDescription
nameYes
settingsfull unsaved RenderSetupNo
expected_revisionu64No
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

ParameterTypeRequiredDescription
setupsaved setup name OR settings?: complete RenderSetup snapshotNo
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

ParameterTypeRequiredDescription
nameYes
setnumerical setup patchNo
expected_revisionYes
coat{weight:0..1,roughness:0.045..1,ior:1..3}Yes
replacefalseNo
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

ParameterTypeRequiredDescription
nameYes
targetexact saved definition/feature/component/occurrence_pathYes
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

ParameterTypeRequiredDescription
nameCPU or GPU setupYes
setcomplete numerical setup patchNo
expected_revisionYes
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

ParameterTypeRequiredDescription
namesaved setupYes
targetexact saved definition/feature/component/occurrence_pathYes
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

ParameterTypeRequiredDescription
jobexact completed JobIdNodefault 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

ParameterTypeRequiredDescription
idNATIVE-STUDIO-001..025Yes
nameYes
settyped CPU/GPU setup patchNo
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

ParameterTypeRequiredDescription
idQ-*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

ParameterTypeRequiredDescription
nameu64Yes
new_nameu64Yes
expected_revisionu64Yes
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

ParameterTypeRequiredDescription
nameu64Yes
new_nameu64Yes
expected_revisionu64Yes
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

ParameterTypeRequiredDescription
nameu64Yes
expected_revisionu64Yes
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

ParameterTypeRequiredDescription
idnamed built-in physical profileYes
nameproposed new material labelYes
acknowledge_referencetrueYes
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

ParameterTypeRequiredDescription
nametyped raytrace setupYes
setsetup patchNo
margin_fraction0.25No
gap_mm0.1No
reflectance_linear[0.18,0.18,0.18]No
replace_stagefalseNo
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

ParameterTypeRequiredDescription
nametyped raytrace setupYes
setsetup patchNo
kindfloor_wall or cycloramaYes
reflectance_linear[0.18,0.18,0.18]No
expected_revisionreviewed revisionYes
replace_stagefalseNo
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

ParameterTypeRequiredDescription
namesetupYes
setsetup patchNo
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

ParameterTypeRequiredDescription
nameCPU or GPU setupYes
setsetup patchNo
surfacesame input as render.library.surface.prepareYes
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

ParameterTypeRequiredDescription
namesetupYes
targetsaved definition/feature/component/occurrence_pathYes
setsetup patchNo
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

ParameterTypeRequiredDescription
queryexact-name substringNo
offset0No
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

ParameterTypeRequiredDescription
querybounded searchNo
availabilityall/usable/specification/blockedNo
offset0No
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

ParameterTypeRequiredDescription
idSURF-* or SELENE-AP-*Yes
variantuniform_opaqueYesrequired
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

ParameterTypeRequiredDescription
idHDR-*Yes
namesaved setupYes
settyped CPU/GPU setup patchNo
rotation_radauthored rotationNonative origin offset is explicit in the reply
intensity1No
samples16 for CPUNo
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

ParameterTypeRequiredDescription
idSURF-*Yes
origin[0,0,0]No
planexy/yz/zxNo
scale1No
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

ParameterTypeRequiredDescription
idRIG-*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

ParameterTypeRequiredDescription
nameYes
settyped CPU/GPU setup patchNo
expected_revisionu64No
enable_indirectfalseNoexplicit 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

ParameterTypeRequiredDescription
pathscoped Radiance HDR fileYes
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

ParameterTypeRequiredDescription
nametyped CPU/GPU setup patch with hdr/environment unsetYes
settyped CPU/GPU setup patch with hdr/environment unsetYes
pathscoped HDRYes
expected_sha256digest returned by render.hdr.inspectNochanged sources refuse
rotation_rad0No
intensity1No
samples1/4/16/64 for CPU onlyNodefault16
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

ParameterTypeRequiredDescription
setupsaved name OR settings?: full RenderSetupNo
progressivefalseNoregistered GPU path, CPU integrator/LED options are mutually exclusive
texture_filteringfalseNoGPU
max_depth1..64No
seedu32 for progressiveNo
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

ParameterTypeRequiredDescription
jobcompleted JobIdNodefault 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

ParameterTypeRequiredDescription
namesaved setupNo
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

ParameterTypeRequiredDescription
namesetup nameYes
setobject of fields to replaceYesbackend, 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

ParameterTypeRequiredDescription
width1..16384Yes
height1..16384Yes
customboolNo
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

ParameterTypeRequiredDescription
viewmodel|image|fit|actual|denoise_maskYes
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

ParameterTypeRequiredDescription
idkind:slot light addressNo
soloboolYes
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

ParameterTypeRequiredDescription
idkind:slot light addressYes
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.