Repository navigation
v0.0.45
Release Notes — v0.0.45
Covers changes from v0.0.44 to v0.0.45.
The headline changes: lofts get vertex connections (plus guides and end conditions) on an in-house skin, sketches, planes and axes are reused by variable with no .reusable(), sketch regions are declared by name and picked from the feature dialogs, the app gets a Settings dialog, and sweeps handle tight corners with a mitre or a spun profile. Alongside: the Split, Trim and Delete key sketch tools, per-project engine upgrades on the desktop, and world-axis plane rotation. Three breaking changes are marked below: .pick(point) is replaced by .region(name), .reusable() is removed, and lofts may rebuild with slightly different surfaces.
Loft connections
- Vertex connections:
.connect(p1, p2, ...)names the vertices the skin must run through, one per profile, so the surface twists the way you want instead of the way the seams happened to line up. The Loft dialog picks them in the viewport, shows them in pink above the ghost, and reopens them for editing. Sketch points are addressable in world space for it. - Guides:
.guides(...)takes one or two side curves the surface must follow; each guide must pass through every profile. Guides compose with connections and thin walls. - End conditions:
.startCondition('normal' | 'tangent' | 'none', magnitude)and.endCondition(...)set how the surface leaves the first profile and arrives at the last. - In-house skinning: plain and thin lofts no longer go through OCCT's ThruSections. Corner matching is fixed, seam alignment is hardened, and multi-region profiles are rejected with a clear error.
- Breaking: existing lofts may rebuild with slightly different surfaces. Check models that fillet or measure a lofted face.
Sketches are reused by variable
- A feature hides its sketch instead of consuming it: any later feature can take the same sketch again by its variable, with no chain to opt in. The same holds for planes and axes.
- Breaking:
.reusable()is removed from sketches, planes and axes. These are reusable by default now. - Used sketches are offered in the sketch slot of every dialog, revealed while a dialog holds them, and shown again with an eye on their timeline row. Used planes and axes get the same treatment.
- Finish Sketch writes a chained
sketch(...).close()that ends sketch mode without a consuming feature, so a profile kept for later or a reference drawing still opens as a 3D scene. Reopening a closed sketch from the timeline takes the chain off again.
Regions
- Regions are declared in the sketch:
region('lens', a, b)names a region by the entities on its outer loop, andfar(b)marks the side of an entity the region lies outside of. A name survives dimension edits, dragged geometry and unrelated holes, which an interior point never did. Holes never take part: the ring insideaisregion('ring', a)however many circles sit inside it. - Features take regions by name:
extrude(20, s).region('lens', 'left'), and the same oncut(),revolve(),sweep()andwrap(). With no name the feature builds nothing and lists every region it found. - Breaking:
.pick(point)is removed. Replace each pick with aregion()declaration in the sketch and.region(name)on the feature. The picker writes both for you. - Region picking lives in the feature dialogs: the extrude, revolve, sweep and wrap dialogs carry a pick row under the sketch slot, and clicking regions in the viewport writes the declaration and the
.region()call. The navbar region button is gone. The ghost preview builds only the regions you picked. rect()edges carry their slot as their role, soedge('top')and a region declaration can name one side of a rectangle.- The sketcher binds every drawn entity to a variable on creation and never reuses a freed name, so declarations and constraints always have something to point at.
Settings
- Settings dialog: a gear before the theme toggle opens tabs for Appearance (theme), Editor (font, size, word wrap, open at startup), Sketch (snap and pick radius), Units (default unit for new projects), Timeline (which sketch children the history lists, constraints on by default, regions grouped and named after their region) and Advanced (reset). Edits are drafts until Save.
- Preferences stay in
~/.config/fluidcad/preferences.json, so the file is still hand-editable, andfluidcad initreads the default unit from it. - Timeline cache status icons show only while execution time is on.
Sweep corners
- Tight corners: two lines meeting at a corner of the spine are cut on the plane that bisects it, like pipe lengths at an elbow, and a line meeting an arc without tangency is joined by spinning the profile about the corner. Before, the section frame was carried across the corner and the solid came out wrong. A leg shorter than its mitre or a path folding back on itself is an error, not a self-intersecting solid.
- Extend:
.extend('start' | 'end', amount)continues the swept solid straight along the path's tangent past either end, exposed in the Sweep dialog behind an Extend toggle and carried through edit and the ghost.
Sketching
- Split tool: one click cuts a line into two lines, an arc into two arcs around the same center, or a circle into a full-turn arc. The statement is rewritten in place,
.end()references and constraints are re-homed, and junction coincidents are added. It snaps to line and arc midpoints and circle quarter marks.
- Trim tool: removes the part of an edge between its nearest crossings, settling the sketch on its solved positions before cutting and pinning the new ends to the edges that cut them.
- Delete key: deletes the selected sketch entities with their constraints and the statements that consumed them, while geometry that borrowed one of their points keeps its place.
- Mirror tool mirrors beziers and ellipses: a bezier reflects with one
symmetric()per control point; an ellipse with a five-row symmetric form. The constraint bar accepts two ellipses. - Bezier curves and their handles redraw live while a control point is dragged, and a drag writes back once per statement.
- Project previous sketches:
project()and the Project tool take an earlier sketch whole, referenced and never consumed, bound like an extrude profile. - A picked constraint chip stays lit until the selection changes, and a chip click clears the edge picks.
- Constraint annotations draw only for the sketch being edited.
Planes and filters
- World-axis plane rotation:
plane(..., { rotationAxes: 'world' })rotates around the world axes about the world origin instead of the plane's own axes; the Plane dialog gets a Local/World toggle. - Loop filters:
edge().outerOf(face)andedge().holeOf(face)select the edges on a face's outer loop or on its holes, and the selection synthesizer offers them for reshaped rims. - B-spline edges are probed by the geometry they stand for, so the
arc()andline()filters reach them.
Desktop and UI
- Engine upgrades per project: the start screen and the project window offer an engine upgrade with a geometry diff preview, comparing build success, solid count, volume and surface area of every model between the two engines before you change the pin.
- The running engine version shows under the wordmark.
- Create a folder from the tab picker by ending the name with a slash.
- Start-screen previews are square and shown whole, and project thumbnails are trimmed to the model's pixels.
- The file-tab strip scrolls a newly active tab into view, as when an agent switches files through the MCP server.
- Escape closes feature dialogs wherever focus is, the newest open dialog first, with the gizmo claiming Escape while it is active. Thanks to spuder. (#76)
- The help menu's Documentation entry opens the docs introduction instead of a 404. (#70)
- The timeline stays on the paused row after Continue and restores the collapse state of parts the breakpoint cut off.
Bug Fixes
- Extrude
memory access out of bounds - Blank viewport on
bezier(..., a.end()) - Region extrude on two bodies:
startandendface selections span every solid a feature built.