Command reference
Generated by cargo xtask book from solvecraft-cli commands (300 commands). Every command runs the same way from the toolbar, a script, solvecraft-cli exec <id> '<json>', the control channel and MCP. Parameters marked ? are optional; expr is a number or an expression with units.
SOLID › CREATE
sketch.createCreate Sketchplane: XY|XZ|YZ | {origin, x_dir, y_dir} | {face: [x,y,z]} (planar face at point), offset?: expr, name?solid.extrudeExtrude (E)distance: expr (or through_all: true); taper?: angle expr; sketch?: id|name (default: active or last sketch); profiles?: all | [index] | [[curve ids]] | [{point:[x,y]}]; face?: [x,y,z] (extrude a planar body face instead of a sketch profile); direction?: positive|negative|symmetric; distance2?; start_offset?; 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, join out of one, else new); targets?: [body]; name?; body_name?solid.revolveRevolveaxis: sketch line id | x | y (sketch axes) | X|Y|Z (world); angle?: expr (default 360 deg); angle2?: expr (Two Sides: the other side's angle); direction?: symmetric (angle split either side); 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), operation?, targets?, name?, body_name?solid.sweepSweepsketch: profile sketch; profiles?; path_sketch: sketch; path: [curve ids in order]; operation?solid.loftLoftsections: [{sketch, profiles?} | {sketch, point: id} (an apex)] (2 or more, in order); operation?solid.boxBoxlength, width, height: expr; corner?: [x,y,z] | center?: [x,y,z]; operation?solid.cylinderCylinderradius | diameter, height: expr; base?: [x,y,z]; axis?: [x,y,z]; operation?solid.sphereSphereradius | diameter: expr; center?: [x,y,z]; operation?solid.torusTorusmajor, minor: expr (radii); center?; operation?solid.pattern.rectangularRectangular Patternfeatures: [names] | bodies: [names] | components: [names]; dir1: [x,y,z]; count1; spacing1; dir2?, count2?, spacing2?solid.pattern.circularCircular Patternfeatures: [names] | bodies: [names] | components: [names]; axis: X|Y|Z | {origin, dir}; count; angle? (default 360 deg)solid.pattern.pathPattern on Pathfeatures: [names] | bodies: [names]; path_sketch: sketch; path: [curve ids in order]; count; spacing (between instances) | distance (first to last); orientation?: identical|path; flip?: boolsolid.mirrorMirrorfeatures: [names] | bodies: [names] (combine?: join with the original); plane: XY|XZ|YZ | {origin, x_dir, y_dir}solid.holeHole (H)position: [x,y,z] on a face | sketch + points: [sketch point ids] (one hole each, perpendicular to the sketch) | sketch alone (every sketch point: standalone points and circle centres); direction?: [x,y,z] (default: into the face); diameter | thread (a tapped hole: the tap drill, major − pitch) | clearance: "M6" with fit?: close|normal|loose (ISO 273); depth? (default through all) | to?: [x,y,z] (To Object: drill to that face or point); type?: simple|drilled|counterbore|countersink; tip_angle?; cb_diameter?, cb_depth?; cs_diameter?, cs_angle?; thread?: "M6" (cosmetic)solid.pipePipepath_sketch: sketch; path: [curve ids in order]; diameter: expr; wall?: expr (hollow); operation?, targets?, name?, body_name?solid.bounding_solidBounding Solidbodies?: [names] (default: all); margin?: expr; name?, body_name?solid.threadThreadface: [x,y,z] on a cylindrical face; designation?: ISO metric ("M8", "M8x1"; default: the size that fits); length?: expr (default: the whole face). Cosmetic: the model is unchanged, model.threads lists itSurfaceSculptBoundary Filltools: [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?: boolsolid.coilCoildiameter; two of revolutions (or turns), height, pitch; section_size; section?: circular|square; section_position?: inside|center|outside; base?: [x,y,z]; axis?: X|Y|Z|[x,y,z] (default Z); start_angle?; clockwise?: bool; operation?, targets?, name?, body_name?solid.ribRibsketch, curves: [open curve ids, in order]; thickness (across the sketch plane); depth? (default: to the next face); flip?: bool (fill to the other side)solid.webWebsketch, curves: [open curve ids] (one wall each); thickness; depth? (default: to the next face); flip?: boolsolid.embossEmbosssketch (on a planar face), profiles?; depth; mode?: emboss|deboss (default emboss); targets?joint.originJoint Originname?, occurrence?: id|name (default: from the pick), face: [x,y,z] (centre of a planar face) | circle: [x,y,z] (centre of a round end) | point: [x,y,z], z?: [x,y,z]
SOLID › MODIFY
solid.filletFillet (F)edges: [[x,y,z] point on edge | {body, index}]; radius: expr; body?; type?: constant|chord (radius is the width across)|variable (radius at the end nearest start, radius2 at the other); radius2?; start?: [x,y,z]solid.chamferChamferedges: [[x,y,z] | {body, index}]; distance: expr; 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?solid.combineCombinetarget: body; tools: [body]; operation?: join|cut|intersect; keep_tools?: bool; new_component?: bool (the result goes into a new component; component_name?)solid.scaleScalebodies: [names]; factor: expr | factors: [x, y, z] exprs; origin?: [x,y,z]face.deleteDelete Facefaces: [[x,y,z] points on the faces]; body?. The neighbouring planes close the gap, as when a rounded edge, hole or boss is taken offsolid.offset_faceOffset Facefaces: [[x,y,z] points on planar faces]; distance: expr (positive: outward); body?solid.shellShellfaces: [[x,y,z] points on the faces to remove]; thickness: expr; direction?: inside|outside|both; tangent_chain?: bool (also open faces joined smoothly to the picked ones); body?solid.draftDraftfaces: [[x,y,z]]; angle: expr; neutral: XY|XZ|YZ|plane name|{origin, normal}; pull?: [x,y,z] (default: neutral plane normal); body?solid.split_faceSplit Facefaces: [[x,y,z] points on the faces to split]; 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)solid.split_bodySplit Bodybody: name; plane: XY|XZ|YZ|plane name|{origin, normal} — or tool: {body, point} (a face of a body, its surface extended)solid.press_pullPress Pull (Q)face: [x,y,z] and distance: expr (positive adds material, negative cuts), or edges: [[x,y,z]…] and distance (a fillet)solid.moveMove/Copy (M)bodies: [names]; translate?: [x,y,z] (exprs or numbers); axis?: [x,y,z]; angle?: exprsolid.replace_faceReplace Facefaces: [[x,y,z] points on planar faces]; target: plane (XY|XZ|YZ|construction plane|{origin, normal}) | target_face: [x,y,z] on a parallel planar face; body?solid.alignAlignbodies: [names]; from: [x,y,z] | {snap: vertex|edge_mid|face_center|circle_center, at: [x,y,z]} | from_face: [x,y,z]; to: (the same) | to_face: [x,y,z] (faces also turn to meet); flip?: boolsolid.removeRemovebodies: [names] (removed from here on in the timeline)timeline.compute_allCompute Alltimeline.deleteDelete (Delete)features: [id or name] (a sketch takes its dependent features with it)parameters.changeChange Parametersname, expression (number or text), unit?: mm|cm|m|in|ft|deg|rad|"" (new parameters default to their value's unit), comment?, favorite?: bool, new_name?: rename (references follow); or delete: namematerial.assignPhysical Materialbodies: [names]; material: name (Steel, Aluminum, ABS Plastic, …; `material.list`)appearance.assignAppearance (A)bodies?: [names]; faces?: [[x,y,z] on faces] (body?: which body, default the nearest); components?: [names or ids, or occurrence names]; appearance?: library name (appearance.library) | color: "#rrggbb" or [r, g, b] (0–255), opacity? (0–1, default 1); neither (or color: null): clear, so the face follows its body, the body its component, the component its material
SOLID › CONSTRUCT
construct.plane.offsetOffset Planebase: XY|XZ|YZ|plane name; offset: expr; name?construct.plane.at_anglePlane at Anglebase: XY|XZ|YZ|plane name; axis: X|Y|Z|{origin, dir}; angle: expr; name?construct.axis.through_cylinderAxis Through Cylinder/Cone/Torusface: ref (a cylinder, cone or torus face, or a circular edge); name?construct.axis.normal_to_faceAxis Perpendicular To Faceface: ref; point: ref (the axis goes through it, square to the face); name?construct.axis.two_planesAxis Through Two Planesa, b: plane or planar face refs; name?construct.axis.two_pointsAxis Through Two Pointsa, b: point refs (vertices, sketch points, points); name?construct.axis.edgeAxis Through Edgeedge: ref (a straight edge or sketch line); name?construct.point.vertexPoint At Vertexpoint: ref (vertex, sketch point, point); name?construct.point.two_edgesPoint Through Two Edgesa, b: edge or line refs (where they meet, or come closest); name?construct.point.three_planesPoint Through Three Planesa, b, c: plane or planar face refs; name?construct.point.centerPoint At Center Of Circle/Sphere/Torusof: ref (circular edge, sketch circle or arc, sphere or torus face); name?construct.point.edge_planePoint At Edge And Planeedge: edge or line ref; plane: plane or planar face ref; name?construct.point.along_pathPoint Along Pathpath: edge or sketch curve ref; t: expr, 0…1 along it (default 0.5); name?construct.plane.midplaneMidplanea, b: plane or planar face refs (halfway between; bisecting when they meet at an angle); name?construct.plane.two_edgesPlane Through Two Edgesa, b: straight edge or line refs in one plane; name?construct.plane.three_pointsPlane Through Three Pointsa, b, c: point refs; name?construct.plane.tangentTangent Planeface: ref (cylinder, cone, sphere or torus); at?: [x,y,z] where it touches (default: the face pick); name?construct.plane.along_pathPlane Along Pathpath: edge or sketch curve ref; t: expr, 0…1 along it (default 0.5); name? The plane is square to the path there
SOLID › ASSEMBLE
component.createNew Componentname?, parent?: component id or name (default: the active one); activate?: bool (default true)joint.createJoint (J)type: rigid|revolute|slider|cylindrical|pin_slot|planar|ball; a, b: joint origins ({occurrence, face|circle|point: [x,y,z] in world} | origin name); values?: [angles in deg or expressions, distances]; limits?: [[min, max] | null…]; flip?: bool; offset?; angle?; name?joint.as_builtAs-Built Jointtype, a: occurrence, b: occurrence (stay where they are); at?: joint origin (default: b's origin) — the joint's framejoint.rigid_groupRigid Groupoccurrences: [ids or names] (move together, as they are)joint.driveDrive Jointsjoint: id|name; value | values: [angles in deg or expressions, distances] (clamped to the limits)joint.motion_linkMotion Linka, b: joints; ratio (b = ratio · a + offset); offset?; ia?, ib?: value indices (default 0)contact.enable_setsEnable Contact Setsenabled?: bool (default true) — driving joints and motion studies stop where bodies in one contact set would pass through each othercontact.enable_allEnable All Contactevery occurrence takes part in contact (one set of all)contact.disable_allDisable Contactcontact offcontact.createNew Contact Setoccurrences: [ids or names] (two or more); name?motion.studyMotion Studyname?; 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)explode.createExploded Viewname?; 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
component.capture_positionCapture Positionkeeps pending occurrence movescomponent.revert_positionRevert Positiondrops pending occurrence moves
SOLID › INSPECT
inspect.interferenceInterferencebodies?: [names] (default: all, in world placement) → pairs that overlap with the overlap volume, area, bounding box and centreinspect.measureMeasure (I)bodies?: [names] (default all); or items: [1-2 selections] → length/area/volume, minimum distance (from, to) and angleinspect.sectionSection Analysisplane: XY|XZ|YZ | {origin, normal}; offset?: expr along the normal; flip?: bool; or clear: true
SOLID › CONFIGURE
config.configureConfigureparams?: [parameter names]; features?: [feature names] (columns to add; with no rows yet, a "Default" row takes the current values)config.tableDisplay Configuration Table→ columns (param:<name> or suppress:<feature>), rows, the active row and whether the design still matches it
SOLID › INSERT
parts.fastenerInsert Fastenerthe Insert Part dialog's command (same as parts.insert): family, size, length?, at?|point?+direction?, name?file.insert_stepInsert STEPpath: .step/.stp file (its bodies join the design as an Import base feature); name?file.insert_meshInsert Meshpath: .3mf or .stl file (its meshes join the design as mesh bodies); name?
SKETCH › FINISH SKETCH
sketch.finishFinish Sketchsketch.finish_auto_constrainFinish with AutoConstrainlike AutoConstrain, then Finish Sketch
SKETCH › CREATE
sketch.lineLine (L)points: [[x,y] | "l1.end" | {at, ref}…], closed?: bool, construction?: bool, ids?: [..], infer?: bool (add horizontal/vertical)sketch.rectangle.two_point2-Point Rectangle (R)p0, p1: opposite corners [x,y]; construction?sketch.rectangle.three_point3-Point Rectanglep0, p1: first edge; p2: point on the opposite edgesketch.rectangle.centerCenter Rectanglecenter, cornersketch.circle.centerCenter Diameter Circle (C)center: [x,y] or point ref, radius | diameter: numbersketch.circle.two_point2-Point Circlep0, p1: diameter endssketch.circle.three_point3-Point Circlep0, p1, p2sketch.arc.three_point3-Point Arcstart, end, throughsketch.arc.center_pointCenter Point Arccenter, start, end (counter-clockwise from start) | center, start, sweep: signed degreessketch.polygon.inscribedInscribed Polygoncenter, radius (to vertices), sides, angle?: degsketch.polygon.circumscribedCircumscribed Polygoncenter, radius (to edge midpoints), sides, angle?: degsketch.polygon.edgeEdge Polygonp0, p1: one edge, sidessketch.slot.center_to_centerCenter to Center Slotp0, p1: arc centres, widthsketch.slot.overallOverall Slotp0, p1: overall ends, widthsketch.pointPointpoint: [x,y], id?sketch.dimensionSketch Dimension (D)entities: [refs], type?: auto|distance|horizontal|vertical|length|radius|diameter|angle, value?: number or expression (default: current)sketch.constructionNormal/Construction (X)curves: [ids], value?: bool (default: construction unless all of them already are)sketch.line.midpointMidpoint Linemid: [x,y] or point ref, end: [x,y]; construction?sketch.arc.tangentTangent Arcstart: end point of a line or arc ("l1.end"), end: [x,y]; curve?: the curve to be tangent to (default: the one ending at start)sketch.circle.two_tangent2-Tangent Circlecurves: [two lines/circles/arcs], radius | diameter: expr, near: [x,y] (which of the solutions)sketch.circle.three_tangent3-Tangent Circlecurves: [three lines/circles/arcs], near: [x,y] (which of the solutions)sketch.slot.center_pointCenter Point Slotcenter: slot centre, end: one arc centre, widthsketch.slot.arc_three_pointThree Point Arc Slotstart, through, end: points on the centre arc, widthsketch.slot.arc_centerCenter Point Arc Slotcenter, start: centre arc start, end: direction of the centre arc end (counter-clockwise), widthsketch.ellipseEllipsecenter, major: end of the major axis [x,y], minor: a point the ellipse passes through on the minor side [x,y] | minor_radiussketch.spline.fit_pointFit Point Splinepoints: [[x,y] or point refs…] (2…500): the spline passes through themsketch.spline.control_pointControl Point Splinepoints: control points (2…500), cubicsketch.spline.control_point_5Control Point Spline (Degree 5)points: control points (2…500), degree 5sketch.conicConic Curvestart, end, apex: [x,y] or point refs; rho?: 0…1 (default 0.5: parabola)sketch.textTexttext: string (\n breaks lines), at: baseline start [x,y], height?: capital height mm (default 5), angle?: degsketch.constrainerSketch Constrainerentities: [one or two sketch entity ids]: applies the constraint the geometry nearly has (horizontal/vertical, parallel, perpendicular, collinear, coincident, concentric, equal, tangent)sketch.mirrorMirrorentities: [curve/point ids], line: mirror line id (symmetry constraints are added)sketch.pattern.circularCircular Patternentities: [ids], center: [x,y] or point ref, count: 2…500, angle?: total deg (default 360)sketch.pattern.rectangularRectangular Patternentities: [ids], dir?: [x,y] (default x), count, spacing; count2?, spacing2? (perpendicular direction)sketch.projectProject (P)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} | "origin" | {axis: X|Y|Z} | {plane: XY|XZ|YZ|name}]sketch.intersectIntersectrefs: [{body}, {face: [x,y,z], body?}, {edge: [x,y,z], body?}, {sketch, curve}]: section curves (or points) with the sketch plane, linkedsketch.include_3dInclude 3D Geometryrefs: like Project (edges, vertices, sketch curves and points); curves out of the sketch plane are flattened onto itsketch.project_to_surfaceProject To Surfacecurves: [{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 curvessketch.intersection_curveIntersection Curvea, b: {body} | {face: [x,y,z], body?}: where they meet, as linked 3D curvessketch.spun_profileSpun Profilebody: name, axis: a line of the active sketch (curve id) | X|Y|Z: the body's outline revolved about the axis, in the sketch planesketch.isoparametric_curveIsoparametric Curveface: [x,y,z] point on the face (the curve passes through it), body?, direction?: u|v|[x,y,z] (default u): linked 3D curvesketch.fit_curves_to_sectionFit Curves to Mesh Sectionbody: name (a mesh or solid body): its section with the sketch plane, fitted with lines and arcs, as normal (unlinked) geometry
SKETCH › CONSTRAINTS
sketch.constraint.horizontal_verticalHorizontal/Verticalline: id | points: [a, b]; mode?: horizontal|verticalsketch.constraint.coincidentCoincidenta: point, b: point or curvesketch.constraint.tangentTangenta, b: curvessketch.constraint.equalEquala, b: lines or circles/arcssketch.constraint.parallelParallela, b: linessketch.constraint.perpendicularPerpendiculara, b: linessketch.constraint.fixFix/UnFixentity: point or curve | entities: [points and curves]; fixed?: bool (default: fix them all unless all are fixed, then unfix)sketch.constraint.midpointMidPointpoint, linesketch.constraint.concentricConcentrica, b: circles/arcssketch.constraint.collinearCollineara, b: linessketch.constraint.symmetrySymmetrya, b: points, line: symmetry linesketch.constraint.curvatureCurvaturea, b: two curves sharing an end point (curvature continuous, G2)sketch.constraint.polygonPolygonlines: [line ids] of a closed chain: equal sides with every corner on one circle (a regular polygon)sketch.auto_constrainAutoConstraintolerance?: mm (default 0.01), angle_tolerance?: deg (default 1), dimensions?: bool (default true): infer constraints, then dimension until fully constrainedsketch.auto_constrain_from_datumAutoConstrain from datumdatum: point ref (default origin); like AutoConstrain with positions measured from the datum
SKETCH › MODIFY
sketch.blend_curveBlend Curvea, b: end points of two curves ("l1.end", "a2.start"): a smooth (tangent) spline joining themsketch.filletFilletpoint: corner shared by two curves ("l1.end") | a, b: two lines or arcs meeting at a corner; radius: exprsketch.chamfer.equal_distanceEqual Distance Chamferpoint | a, b: a corner of two lines; distancesketch.chamfer.distance_angleDistance and Angle Chamferpoint | a, b: a corner of two lines; distance: along a, angle: deg from asketch.chamfer.two_distanceTwo Distance Chamferpoint | a, b: a corner of two lines; distance: along a, distance2: along bsketch.offsetOffset (O)curves: [ids], distance: number (positive = left of the chain, or toward `side`), side?: [x,y], chain?: bool (default true: the connected chain)sketch.trimTrim (T)curve: id, at: [x,y] (the piece to remove: between the nearest intersections around it)sketch.extendExtendcurve: id, at: [x,y] near the end to extend (to the nearest curve)sketch.breakBreakcurve: id, at: [x,y] (split at the nearest intersections around it) | params: split at points: [[x,y]…]sketch.scaleSketch Scaleentities: [curve/point ids], base: [x,y] or point ref, factor: number
SKETCH › INSERT
sketch.insert_dxfInsert DXFpath | text: ASCII DXF (blocks expanded); at?: [x,y] offset, scale?, tolerance?: mm within which ends join (default 0.0001); plane?: (when no sketch is active, a new sketch on it; default XY)sketch.insert_svgInsert SVGpath | text: SVG; at?: [x,y] offset, scale?, tolerance?: mm within which ends join (default 0.0001); plane?: (when no sketch is active, a new sketch on it; default XY)canvas.insertCanvaspath | 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?canvas.decalDecalpath | data; face: [x,y,z] on a planar face (the image is centred there); width?: mm; angle?: deg; opacity?: (default 1)canvas.editEdit Canvascanvas: id or name; center?, width?, angle?: deg, opacity?, flip?, visible?, name?
SKETCH › INSPECT
inspect.curvature_combCurvature Comb Analysiscurves?: [sketch curve ids] (sketch?: id|name, default active) | edges?: [[x,y,z] points on body edges]; density?: teeth per curve (default 40), scale?: comb length per unit curvature (default auto)inspect.minimum_radiusMinimum Radius Analysiscurves?: [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 isinspect.isocurveIsocurve Analysisfaces: [[x,y,z]…] points on faces; count?: curves each way (default 8): the faces' isoparametric curvesinspect.center_of_massCenter of Massbodies?: [names] (default all): the centre of mass (uniform density) of each and of all togetherinspect.zebraZebra Analysisstripes?: number across the view (default 12); clear?: true turns the analysis offinspect.draftDraft Analysispull?: [x,y,z] direction (default Z); angle?: degrees (default 1); clear?: true turns the analysis offinspect.environment_mapEnvironment Map Analysisclear?: true turns the analysis offinspect.accessibilityAccessibility Analysisdirection?: [x,y,z] the tool comes from (default Z, from above); clear?: true turns the analysis offinspect.curvature_mapCurvature Map Analysisradius?: mm shown red (default: a tenth of the model's size); clear?: true turns the analysis off
SURFACE › CREATE
surface.patchPatchsketch?: id|name and profiles? (planar patches of sketch regions) | edges: [[x,y,z]] (points on a closed loop of a body's edges) and body?; name?, body_name?surface.thickenThickenbodies: [surface names]; thickness: expr (negative: against the normal); symmetric?: bool; operation?: new|join|cut|intersect; targets?
SURFACE › MODIFY
surface.stitchStitchbodies: [names] (surfaces sewn into the first; a solid when they close); tolerance?: expr (default: tight)surface.extendExtendbody: planar surface name; edges: [[x,y,z]] (points on straight edges to push out); distance: exprsurface.trimTrimbody: surface name; plane: XY|XZ|YZ|plane name|{origin, normal} or tool: {body, point} (a face, its surface extended); keep: [x,y,z] (a point on the side to keep)
SHEET METAL › CREATE
sheet.flangeFlangebase: sketch + profiles? (rule?, flip?) | contour: sketch + curves (open chain of lines) + distance (rule?, flip?, reverse?) | edge: edges: [[x,y,z] on top/bottom edges] + height (to the outer face), angle? (default 90 deg), radius? (default: rule), position?: inside|outside|middle, flip?, body?; type?: base|edge|contour (default from the inputs)sheet.hemHemedges: [[x,y,z] on sheet edges]; length (to the outer face); gap? (inner radius, default: rule); flip?; body?sheet.foldFoldline: 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?sheet.convertConvert to Sheet Metalbody; face: [x,y,z] on its large flat face (a plate of even thickness); rule?sheet.flat_patternCreate Flat Patternbody? → flat size, outline loops and cut-outs (flat coordinates), bend lines and the bend table
SHEET METAL › MODIFY
sheet.unfoldUnfoldbody? (default: the last sheet body) — all bendssheet.refoldRefoldbody? (default: the last unfolded sheet)sheet.manage_rulesSheet Metal Rulesname (new or existing); thickness?, k_factor?, bend_radius?, relief_width?, relief_depth?, corner_relief?, hem_gap?, gap? (expressions; `Thickness` is the rule's); active?: bool; delete?: bool
PLASTIC › CREATE
plastic.bossBossposition: [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?plastic.lipLipface: [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?plastic.snap_fitSnap Fitposition: [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; body?plastic.restRestposition: [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
plastic.manage_rulesManage Plastic Rulesname (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)plastic.assign_ruleAssign Plastic Rulebodies: [names]; rule: name (empty: no rule) — plastic features on these bodies take its draft and clearance as defaults
Other: sketch.*
sketch.editEdit Sketchsketch: id or namesketch.deleteDelete Sketch Entitiesentities: [curve, point or constraint ids]sketch.move_pointDrag Sketch Pointpoint: ref, to: [x,y]sketch.dragDrag Sketch Geometryentity: point or curve, from: [x,y] where it was grabbed, to: [x,y]: a point goes to `to`, a line (spline, conic) slides by to - from, a circle or arc grabbed on its edge takes the radius to `to`; the rest moves as little as it cansketch.dimension_textMove Dimension Textdimension: constraint id or parameter name; at: [x,y] text centre (sketch coordinates) | reset: true (default place)sketch.optionsSketch Palette Optionssketch?: id|name (default active); any of show_profile, show_points, show_dimensions, show_constraints, show_projected, grid, snap, slice, sketch_3d: bool. Returns them allsketch.chainChaincurve: id: the curves joined to it end to end (what a double-click selects)sketch.solveSolve Sketchreports the solver status and degrees of freedomsketch.centerlineCenterlinecurves: [line ids], value?: bool (default toggles): centerline line type (not in profiles; an axis)sketch.edit_textEdit Textlink: the text's link id (or entity: one of its curves), text?, at?, height?, angle?: degsketch.toggle_drivenToggle Driven Dimensionconstraint: dimension id, driven?: bool (default toggles); a driving dimension gets a parameter with its current valuesketch.glyphsConstraint Glyphssketch?: id|name: every constraint with where to draw its glyph (sketch coordinates)sketch.snapSnap Inferenceat: [x,y], from?: [x,y] (previous click), radius?: mm (snap distance, default 1): what a click there would snap to and infersketch.export_dxfSave As DXFsketch?: id|name (default active); path?: file to write (else the DXF text is returned)sketch.line3d3D Linepoints: [[x,y,z]…] world points (2 or more): one 3D line per segment, joined end to end (needs 3D Sketch on)sketch.spline3d3D Splinepoints: [[x,y,z]…] world fit points (2 or more): a smooth 3D curve through them (needs 3D Sketch on)sketch.point3d3D Pointpoint: [x,y,z] world point (needs 3D Sketch on)sketch.move3dMove 3D Pointwire: drawn 3D curve or point id, index?: fit point (default 0), to: [x,y,z] | by: [dx,dy,dz]; points joined to it move toosketch.moveMove/Copy Sketch Entitiesentities: [ids], translate?: [dx,dy], angle?: deg, center?: [x,y], copy?: boolsketch.break_linkBreak Linklink?: link id (j1) | entities?: [curve or point ids]: linked geometry becomes normal sketch geometrysketch.auto_projectAuto-Project Edges on Referencevalue?: bool (default toggles): project a face's edges when a sketch is created on itsketch.redefineRedefine Sketch Planesketch: id or name; plane: XY|XZ|YZ | construction plane name | {face: [x,y,z]} | {origin, normal} (the sketch keeps its geometry)sketch.inspectInspect Sketchsketch?: id|name (default active)
Other: canvas.*
canvas.calibrateCalibrate Canvascanvas: id or name; a, b: two points on the canvas plane [x,y]; distance: their true distance (mm): scales the image about acanvas.deleteDelete Canvascanvas: id or name
Other: sheet.*
sheet.rulesList Sheet Metal Rules→ rules with their expressions and values, and the active onesheet.export_dxfExport Flat Pattern as DXFbody?, path? → DXF (mm): OUTLINE, BEND_UP and BEND_DOWN (centre lines) layers
Other: plastic.*
plastic.rulesList Plastic Rules→ rules with their expressions and values, the active rule and the rules assigned to bodies
Other: component.*
component.from_bodiesCreate Components from Bodiesbodies: [names] → one new component per body, named after itcomponent.activateActivate Componentcomponent: id or name (0 or "root" for the design)component.listList Componentscomponent.renameRename Componentcomponent, namecomponent.deleteDelete Componentcomponent: deletes it, its subcomponents, occurrences and featurescomponent.move_bodiesMove Bodies to Componentbodies: [names], componentcomponent.move_sketchesMove Sketches to Componentsketches: [ids or names], componentcomponent.paste_newPaste Newcomponent: copied with its features into a new, independent component; translate?: [x,y,z]
Other: occurrence.*
occurrence.copyPaste (Instance)component (or occurrence): what to place again; parent?: component (default: the same parent); translate?: [x,y,z]occurrence.moveMove Occurrenceoccurrence; translate?: [x,y,z]; axis?: [x,y,z], angle?: radians or "30 deg", origin?: [x,y,z]; capture?: bool (default true; false keeps it pending until Capture Position)occurrence.groundGroundoccurrence; grounded?: bool (default toggles)
Other: joint.*
joint.limitsJoint Limitsjoint; index?: value index (default 0); min?, max? (omit both to clear)joint.editEdit Jointjoint; type?, flip?, offset?, angle?, suppressed?, name?joint.deleteDelete Jointjoint: id|name (or origin: name, link: index)joint.listList Joints→ joints (type, occurrences, values, limits), origins, links, degrees of freedom, conflictsjoint.solveSolve Jointsre-place the occurrences from the joints → conflicts, errors, dof
Other: contact.*
contact.editEdit Contact Setset: id|name; occurrences?; name?; suppressed?: bool; delete?: boolcontact.listList Contact Sets→ sets, enabled, allcontact.checkCheck Contact→ pairs in contact sets that pass through each other now
Other: motion.*
motion.playPlay Motion Studystudy: id|name; step (0…steps) — sets the joints to the study's values there (contact sets stop them) → positionsmotion.exportExport Motion Studystudy; samples? (default steps + 1); path? (.json or .csv) → occurrence positions per step (the design is not changed)motion.listList Motion Studiesmotion.deleteDelete Motion Studystudy
Other: explode.*
explode.showShow Exploded Viewview: id|name (or none: back to the assembled placement) — shown only; the design keeps its placementsexplode.listList Exploded Viewsexplode.deleteDelete Exploded Viewview
Other: config.*
config.columnConfiguration Columnparam? | feature? (name); delete?: boolconfig.rowConfiguration Rowname; from? (row to copy; default the current values); values?: {param name or feature name: expression or true/false}; rename?; delete?: boolconfig.activateActivate Configurationrow: name — sets its parameter values and suppressions
Other: parts.*
parts.libraryStandard Partsfamily? → families (name, standard, sizes, lengths) and, with family, each size's dimensions (mm)parts.insertInsert Partfamily (socket_head_cap_screw | hex_bolt | hex_nut | washer | set_screw | dowel_pin | bearing); size ("M6", or "608" for bearings); length? (mm; 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) | point?: [x,y,z] with direction?: [x,y,z] (no joint); name?parts.resizeChange Part Sizecomponent: id|name of an inserted part; size?; length? — rebuilds it (joints keep it seated)
Other: body.*
body.renameRename Bodybody: its name, name: the new name (features that use the body follow)
Other: browser.*
browser.groupNew Groupfolder: bodies|sketches|construction; component?: id (default 0); name?; items?: [keys] (they leave other groups)browser.ungroupUngroupgroup: id (its items go back to the folder)browser.rename_groupRename Groupgroup: id, namebrowser.moveMove Browser Itemsfolder, component?, items: [keys]; group?: id (into it; omit to take them out of groups); before?: key (position in the group)browser.orderOrder Browser Itemsfolder, component?, order: [keys] (the folder's items in display order)
Other: document.*
document.unitsChange Design Unitsunits: mm|cm|m|in|ft (display and unit-less parameters; values keep their meaning)document.inspectInspect Designmeasure?: bool (include body measurements)
Other: view.*
view.saveNew Named Viewname?; camera: {target: [x,y,z], yaw, pitch, distance, fov?} (replaces a view of the same name)view.renameRename Named Viewview: name, nameview.deleteDelete Named Viewview: nameview.listList Named Views
Other: selection.*
selection.deleteDeleteitems?: [selection items]; components?, occurrences?, canvases?: [ids or names]; dry_run?: bool → deleted, would_fail, skipped (one undo step)
Other: edit.*
edit.undoUndo (Ctrl+Z)edit.redoRedo (Ctrl+Y)
Other: timeline.*
timeline.renameRenamefeature: id|name, nametimeline.rollbackMove Timeline Markerposition: number of features to keep active (omit = end)timeline.roll_toRoll History Markerposition: number of features to keep active (omit = end) | feature: id|name (the marker goes right after it)timeline.reorderReorder Featurefeature: id|name, position: its new index; refused when a feature that worked would failtimeline.redefineEdit Featurefeature: id|name, command: the feature's command id, params: its parameters (the feature is rebuilt in place)timeline.dependentsFeature Dependentsfeature: id|name → features deleted with it, and features that would fail without ittimeline.suppressSuppress Featurefeature: id|name, suppressed?: bool (default toggles)timeline.editEdit Featurefeature: id|name, set: {fields to change, e.g. {"extent": {"distance": "30"}}}timeline.copyCopy Featuresfeatures: [ids or names] (in timeline order on paste)timeline.pastePaste Featurestranslate?: [x,y,z] (moves the copies' geometry); the copies go at the marker
Other: select.*
select.setSelectitems: [{type: body|edge|face|feature|sketch_curve|sketch_point|profile, …}], add?: boolselect.clearClear Selection
Other: parameters.*
parameters.listList Parametersfavorites?: bool (only favourites), filter?: all|user|sketch|feature|favorites → parameters (name, expression, unit, value in its unit, source, feature/input, comment, favorite, uses, used_by, error) and cyclesparameters.addAdd User Parametername, expression, unit?, comment?, favorite?: boolparameters.renameRename Parametername, new_name (expressions, feature inputs and dimensions that use it follow)parameters.deleteDelete Parametername (refused while something uses it; the error lists the users)parameters.favoriteFavourite Parametername, favorite?: bool (default true)parameters.commentComment Parametername, commentparameters.usersParameter Usersname → users (parameters, feature inputs, dimensions) and the features it drivesparameters.graphParameter Graph→ nodes, edges [user, used] (users include Feature:<name>), cycles, errorsparameters.exportExport Parametersformat?: csv|json (default csv, or from the path), path?: write to a file → textparameters.importImport Parameterstext: CSV (header with name, expression, unit?, comment?) or JSON [{name, expression, unit?, comment?}] | path; all or nothingparameters.completeComplete Expressionprefix?: the text before the cursor → word, suggestions [{text, kind: parameter|function|unit|constant, detail}]
Other: expr.*
expr.evaluateEvaluate Expressionexpression, kind?: length|angle|unitless (or unit?: mm|in|deg…) → ok, value (mm/rad), display_value, references, error
Other: file.*
file.newNew Design (Ctrl+N)name?file.saveSave (Ctrl+S)path? (default: current file)file.save_asSave Aspathfile.exportExportpath; format?: stl|stla|obj|step|3mf (default from extension); bodies?: [names]file.save_meshSave As Meshpath; bodies?: [names]; ascii?: bool
Other: doc.*
doc.openOpen (Ctrl+O)path: .solvecraft design, or a .step/.stp file (opens as a new design)doc.recovery_listRecoverable Designsdir? (default: the recovery folder) → designs autosaved by apps that crashed or closed with unsaved changesdoc.recoverRecover Designid (from doc.recovery_list); dir?; discard?: bool (delete the entry once open) — opens it with its file path, unsaveddoc.recovery_discardDiscard Recovered Designid, or all: true; dir?
Other: model.*
model.edgesList Edgesbody: namemodel.facesList Facesbody: namemodel.threadsList Threads
Other: appearance.*
appearance.libraryAppearance Library→ the built-in appearances (name, colour, opacity)appearance.listList Appearancesbody?: name → assigned appearances; with body, its resolved look and its faces' (face index, look)
Other: material.*
material.listList Materials
Other: engine.*
engine.commandsList Commands