Files
solvecraft/docs/frames.md
T
Karl Von Richter 44b0056d48 Frames: a Weldments ribbon tab (#4003) (#5262)
* Frames: a Weldments ribbon tab (#4003)

- WELDMENTS joins the ribbon after SHEET METAL and is built the same way:
  Sketch (New Sketch), Create (Frame Member) and Configure (Parameters,
  Configurations). Frame Member's home moves there from MODEL > Create.
- Always shown, as a frame starts from a sketch of its lines. It selects
  itself and takes the contextual style when the selected body (or the last
  body of the active component) is a frame member; sheet metal comes first.
- It uses the default accent until the palette has a colour for it.
- The tab label is in every catalog; docs/ribbon-layout.md, docs/frames.md
  and the tab list in docs/control-protocol.md follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Frames: Weldments keeps the ordinary tab look (#4003)

Weldments still selects itself when a frame member is the active body, but
no longer takes the solid contextual fill or the 2 px accent line under the
tab row: selected, it looks like a selected Model tab. Only Sketch and Sheet
Metal (on a sheet body) are contextual.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 12:24:38 +00:00

117 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Frames and weldments
Frames and weldments (#4003) are structural members (tube, angle, channel, beam, an aluminium
extrusion of your own) laid along the lines of a frame sketch. This page covers what has landed:
members and their profiles. Corners, trims, end caps, gussets, welds and the cut list follow.
## The workflow
1. **Sketch the frame**: lines in a sketch, or a 3D sketch for a frame that leaves one plane
(`sketch.options sketch_3d: true`, then `sketch.line3d`). Drive the sizes with parameters as
usual; members follow.
2. **Choose a profile**: a built-in one from its dimensions (below), or your own drawn in a sketch
(a vendor's extrusion: insert their DXF with `sketch.insert_dxf`). A profile sketch's origin is
the point that sits on each line, and its x and y are the profile's.
3. **Add members**: **Frame Member** (WELDMENTS › CREATE, `frame.member`) makes one body per line,
square to it, from its start to its end. Repeat with another profile for the next group of
lines.
```json
{"command": "frame.member", "params": {"sketch": "Frame", "profile": {"kind": "rect_tube", "width": 40, "height": 40, "wall": 3}}}
{"command": "frame.member", "params": {"sketch": "Frame", "lines": ["l5", "l6"], "profile_sketch": "45x45 section", "anchor": "bottom_left", "angle": "90 deg"}}
```
Members are ordinary bodies: mirror, pattern, move, drill and combine them with the usual
commands. Where members meet they overlap until corner treatments land.
The **Weldments** ribbon tab gathers the frame commands: New Sketch, Frame Member and
Parameters. Like Sheet Metal it is always there, and it selects itself when a frame member is
the selected body (or the last body of the active component).
## The Frame Member dialog
- **Lines**: pick the frame sketch's lines in the view (2D or 3D sketch lines). **All Lines**
makes a member on every line of that sketch instead, including lines drawn later.
- **Section (optional)**: pick the section's region in another sketch (the ring between two
circles makes a tube). With nothing picked, **Profile** chooses a built-in profile and its
dimensions follow; optional ones left empty take their defaults.
- **Anchor**, **Angle** and **Mirror** place the section on each line, as below. **Name** names
the members (default: after the profile).
- The preview shows the members as you change the values. **Edit Feature** reopens the dialog with
the feature's values; the members keep their names through the edit, and a new **Name**
renames them all. A member made with a whole profile sketch keeps it (the **Section** row shows
the sketch; untick it for a built-in profile).
## frame.member
- `sketch`: the frame sketch. `lines`: the curve ids to lay members on (2D lines or 3D sketch
lines), each once; left out, every straight line drawn in the sketch: not construction, not
projected or otherwise linked (a sketch on a face projects the face's edges; they are
references, not members), and with a length.
- `profile` (a built-in profile) or `profile_sketch` (a sketch), one of them. A profile sketch's
section is its material as nested loops alternate (an outline is material, a loop inside it a
hole, a loop inside that material again), so two circles make a tube; pick other regions with
`profiles` as `solid.extrude` takes them. Like `solid.extrude`, only what was drawn counts:
projected edges are left out unless the drawn curves make no profile. It must be one piece.
- `anchor`: the profile point on the line: `origin` (the default: a built-in profile's centre, a
profile sketch's origin), `center` (of its bounding box), `centroid`, or a corner or edge middle
of its bounding box (`bottom_left`, `top`…).
- **Orientation**: the profile's y points up (world +Z) as far as the line allows and its x is
square to the line and to y (x × y runs along the line, so on a line along +X the profile's x is
world +Y); a vertical member's x is world +X. `angle` (an angle expression) turns the profile
about the line, counter-clockwise looking back from the line's end; `mirror` mirrors it across
its y axis first. A line leaning less than 10⁻⁶ rad from vertical counts as vertical, so
rounding in a 3D sketch never turns a post a quarter turn.
- Bodies are named after `body_name`, or the profile (`Rect Tube 40x40x3`) or the profile
sketch, then numbered on past names already taken (`(2)`, `(3)`…). Each member's name is kept
with its line (the feature's `names`), so deleting or adding a line, or deleting another
feature, leaves the other members' names alone; `body.rename` renames a member on its line.
`names` (`{line id: name}`) gives names to keep, as Edit Feature (`timeline.redefine`) passes
them unless the edit changes `body_name`.
Every built-in profile is SolidCraft's own parametric definition, built in code
(`solidcraft_doc::frame`). SolidCraft ships no vendor's or standard's size table: you give the
dimensions of the stock you buy. Any other section, a vendor's aluminium extrusion for example, comes
from a sketch: draw it or insert the vendor's DXF.
## Built-in profiles
A profile is JSON with a `kind` and its dimensions, each a number in the design's units or a
length expression over its parameters (`"tube_wall"`, `"2 in"`): a member follows a parameter
change like any feature. Dimensions marked *optional* default from the profile's size when left
out, made smaller where a thick section leaves less room for a radius;
`frame.profile.properties` returns the profile in millimetres with every default written out.
| Kind | Required | Optional (default) |
|---|---|---|
| `bar` | `width`, `height` | `corner_radius` (0) |
| `round_bar` | `diameter` | |
| `rect_tube` | `width`, `height`, `wall` | `outer_radius` (2 × wall; inner radius is outer − wall) |
| `round_tube` | `diameter`, `wall` | |
| `angle` | `width` (leg along x), `height` (leg along y), `thickness` | `root_radius` (thickness), `toe_radius` (thickness / 2); together at most the shorter leg's inside length |
| `channel` | `height`, `width` (flange length), `web`, `flange` (thicknesses) | `root_radius` (web, at most the room in a flange and half the web's inside height), `toe_radius` (0) |
| `i_beam` | `height`, `width`, `web`, `flange` | `root_radius` (web, at most the room in a flange and half the web's inside height) |
The profile's bounding box is centred on its origin, x across and y up. Angles have their heel at
the bottom left; channels open towards +x.
Dimensions are refused, with the dimension named, when they are not finite, are outside
0.01 mm–10 m (radii: 0, or 0.01 mm–10 m), or do not fit: a wall of half the tube or more, a radius
given larger than the room for it.
## Commands
- `frame.profile.list`: every kind, its dimensions and a working example.
- `frame.profile.properties` `{profile, density?}`: the section, worked out exactly from its lines
and arcs: `area` (mm²), `centroid` (mm from the bounding box centre), `ixx`, `iyy`, `ixy` (mm⁴
about the centroid), `width`, `height`; with `density` (kg/m³), `mass_per_m` (kg/m).
- `frame.profile.insert` `{profile, at?, anchor?, angle?, fixed?, sketch?}`: draws the profile into
the sketch being edited, its `anchor` point (`center`, `centroid`, or a corner or edge middle of
the bounding box such as `bottom_left`) on `at`, turned by `angle` radians. The curves are locked
(`fixed`, default true) so solving the sketch keeps the shape. The outline and each hole are
separate sketch regions: extrude the material region (pick it with `profiles: [{point}]`).
```json
{"command": "frame.profile.insert", "params": {"profile": {"kind": "rect_tube", "width": 40, "height": 40, "wall": 3}, "at": [0, 0], "anchor": "bottom_left"}}
```