Skip to content

Releases: Fluid-CAD/FluidCAD

v0.0.39

Choose a tag to compare

@marwndev marwndev released this 04 Jul 17:21

Release Notes — v0.0.39

Covers changes from v0.0.38 to v0.0.39.

The headline feature is guided lofting: rails and end conditions for loft(), built on an in-house B-spline skinning pipeline. Also includes a sweep extension helper and several fixes to fillet, repeat, shell, rib, and intersect.

Features

Loft guide curves and end conditions

loft() now accepts .guides() to pull the loft through one or more rail curves, and .startCondition()/.endCondition() to control tangency at the first and last profile. Thin lofts assemble conditioned walls and ring caps directly instead of going through a boolean, and wall faces split at curvature jumps so rounded offset corners keep their edges.

See the loft guide.

Sweep extend

sweep() gained .extend() to continue a swept profile past the ends of its path along the path's tangent.

Bug Fixes

  • fillet: the radius-first spread form fillet(r, ...curves) now dispatches correctly inside sketches.
  • repeat: cloning a sweep whose path comes from another sketch freezes the borrowed 2D curves instead of orphaning them.
  • rib: parallel ribs flip direction under a mirror repeat so the mirrored clone lands on the correct side.
  • shell: a failed wall offset now surfaces an error instead of silently returning the original solid.
  • intersect: only consumes source geometries that are actual scene selections.

v0.0.38

Choose a tag to compare

@marwndev marwndev released this 21 Jun 11:25

Release Notes — v0.0.38

Covers changes from v0.0.37 to v0.0.38.

A small release: a new way to derive a plane from an edge, plus a handful of fixes.

Features

Plane from an edge

You can now create a plane from an edge at a normalized 0–1 position along it, oriented normal to the edge (the start point faces outward). Handy for placing a sketch perpendicular to a curve or at a precise fraction along it.

See the sketching guide.

Bug Fixes

  • sweep: the fixed binormal is derived from the spine's rotation axis, so helix sweeps no longer twist.
  • offset: the sketch plane is passed as a reference face, so offsetting a single line works.
  • recompute: drops the compare baseline so a recompute fully rebuilds and reports build timings.
  • Sketcher: screen‑space markers are sized at creation, so the tangent indicator isn't oversized after a timeline rollback.

v0.0.37

Choose a tag to compare

@marwndev marwndev released this 12 Jun 18:31

Release Notes — v0.0.37

Covers changes from v0.0.36 to v0.0.37.

A big release: three new modeling features — helixes, 3D text, and wrap — plus an measure tool, all on top of a new OpenCASCADE 8.0 geometry kernel. FluidCAD is now MIT licensed.

Features

Helix

helix() creates a helical wire — the curve behind springs, threads, and coils. Size it with any two of .pitch(), .turns(), and .height(), taper it, derive its axis from existing geometry, and pair it with sweep() to turn it into a solid. It's now built on OpenCASCADE's TKHelix for clean, stable curves.

See the helix guide.

3D text

text() turns a string into extrudable outline geometry — each glyph a closed profile, counters preserved. Use it inside a sketch() or standalone on a plane, pick a system font or a workspace .ttf/.otf with .weight() and .italic(), and lay text along any planar path with text(string, path) and alignment options.

See the text guide and the text() reference.

Wrap

wrap(thickness, sketch, face) develops a flat sketch onto a cylindrical or conical face — labels, embossed logos, engraved text — preserving every length and angle instead of squashing them like a projection. Chain .remove() to engrave rather than emboss; holes and fusion scope work as they do elsewhere.

See the wrap guide.

Measure tool

A new measure tool in the viewer, multi‑select faces and edges to read distances, lengths, areas, angles, and more. Results appear in the status bar with an expandable panel, unit selection, and a viewport overlay. Also exposed over the HTTP API and as an MCP tool for agents.

Geometry engine: OpenCASCADE 8.0

The geometry kernel moved to OpenCASCADE 8.0 (opencascade.js v3).

Other improvements

  • Sketcher: rectangle and rounded‑rectangle dimension inputs are anchored at the edge midpoint.
  • Features and shapes without a custom icon now fall back to a default icon.

Licensing

FluidCAD is now released under the MIT license.

Bug Fixes

  • extrude honors endOffset when extruding to a conical target face.
  • Import/export no longer closes an un‑opened document, and import errors surface decoded WASM messages.

Docs

  • New guides, API references, and examples for helix, 3D text, and wrap.

v0.0.36

Choose a tag to compare

@marwndev marwndev released this 06 Jun 08:36

Release Notes — v0.0.36

Covers changes from v0.0.34 to v0.0.36.

Features

Interactive sketcher

The headline of this release: an interactive sketching toolbar in the viewer. It's a helper for writing sketches faster, not a replacement for the code‑first workflow — it covers the common drawing tools and writes clean, editable code back into your .fluid.js file, but it doesn't expose the full sketch API. Reach for it to rough things out or place geometry by eye, then keep refining in code.

Everything the toolbar produces is plain FluidCAD code, so anything it doesn't cover you can still add or adjust by hand. Geometry that isn't part of the active toolbar set is rendered in a distinct, non‑interactive color so it's always clear what the tools will touch. The toolbar is vertical and grouped, with icons switched to Iconoir.

Parameters

A new param() API turns model inputs into live controls in a dedicated Params panel — change a value and the model re‑renders in place.

import { param } from "fluidcad/core";

const width  = param("Width", 40, "number", { min: 10, max: 100, group: "Box" });
const round  = param("Rounded corners", true, "checkbox");

In local development this is of limited use — you're editing the code anyway, so changing a value in the panel is rarely faster than changing it in the source. Where it pays off is publishing models online (coming soon): parameters become the knobs viewers can turn to customize a published model without touching any code.

Other improvements

  • copy now transfers ownership of the original shapes to the copy feature.
  • back() skips non‑geometry children when resolving the previous tangent.

Bug Fixes

  • Windows: ESM/fork paths now resolve correctly on non‑C: drives (#52).
  • repeat: a structural compareTo avoids a crash on unbuilt axis/plane sources during cache comparison.

Docs

  • Documented local‑only installation alongside the Windows drive fix.

v0.0.34

Choose a tag to compare

@marwndev marwndev released this 23 May 14:56

Release Notes — v0.0.34

Covers changes from v0.0.33 to v0.0.34.

Features

MCP server

New FluidCAD MCP server lets LLM coding agents drive a running workspace end‑to‑end. Highlights:

  • Discovery & docslist_workspaces, list_docs, search_docs, read_doc, get_api_signature, get_type_definition, plus a self‑contained llm-docs/ corpus with a coverage gate that fails CI when a documented symbol drifts.
  • Source editing — synchronous write_file and edit_range (each call returns once the render settles), with a dirty‑buffer guard and a missing-imports refusal for .fluid.js files that use FluidCAD symbols without importing them.
  • Scene inspectionget_scene_summary, list_shapes, get_shape_properties, get_face_properties, get_edge_properties, hit_test.
  • Screenshots & camerasscreenshot, screenshot_multi, screenshot_shape, get_camera_state, stateless camera views.
  • Engine controlrecompute, rollback_to, import_step, export, add_breakpoint, clear_breakpoints, wait_for_idle.
  • Skill bundle — installable skill teaches an agent FluidCAD conventions, common pitfalls (e.g. extrude/cut sign convention), and the right tool‑use order.

See the MCP server docs for setup with Claude Code, opencode, and other MCP clients.

fluidcad CLI: init and serve subcommands

The CLI is now built on commander and exposes:

  • fluidcad init — scaffold a new workspace.
  • fluidcad serve — run the server (with --open to launch the UI).

Tangent arc improvements

  • tArc(radius, target) — new overload that ends at the first intersection with target.
  • tArc(targetLine) — new overload with .flip() to curve the other way.
  • createCopy implemented on all tangent arc feature classes so they participate in repeat().

Arc improvements

  • .major() — explicit selector for arcs greater than 180°.
  • IArcPoints split into IArcRadius and IArcCenter for clearer typing.
  • Two‑point arc center defaults to the chord midpoint instead of the current position.

Repeat features

  • Shapes are now removed from axis/plane sources consumed by repeat features.
  • Repeat‑feature matrix resolution is deferred to build time via LazyMatrix.

Shell .join()

shell() gains a chained .join() for selecting the inner‑corner blend style — arc, intersection, or tangent.

Back command tangent restore

back() now restores the tangent in addition to the position.

Init options with mesh deflection

New init options expose mesh deflection configuration for tuning render quality vs. performance.

Docs

  • Regenerated API reference.
  • Expanded primitive shape guide with detailed examples and screenshots.
  • Expanded constrained geometry guide with examples and screenshots.
  • Two new tutorials.

Commits

  • 50fb7c2 chore: release v0.0.34
  • b978a4a fix(mcp): read SERVER_VERSION from root package.json
  • af20e78 docs(skill): add common pitfalls section with extrude/cut sign convention
  • 1786235 docs(mcp): simplify skill install section
  • a119283 refactor(mcp): read SERVER_VERSION from package.json
  • 59715cc feat(mcp): rename server to FluidCAD and document skill install
  • e1110b8 feat(mcp): add skill
  • 710ea4e update llm docs
  • 509e934 docs(mcp): note opencode mcp add is interactive
  • 2d961e8 feat(mcp): add get_type_definition tool and generated type docs
  • d6a8aba docs(cut): note direction convention in summary
  • 64beb8b refactor(mcp): drop wait_for_render now that mutations are synchronous
  • 3400095 feat(mcp): refuse .fluid.js writes that use FluidCAD symbols without imports
  • e5f98fc docs(sketch): note first face is used when selection has multiple
  • 5a48bed test(mcp): assert docs-tag behavior instead of seed-set membership
  • 334eade feat(mcp): make write_file/edit_range synchronous via POST /api/render
  • 5d227c9 docs(mcp): document opencode mcp installation
  • dd9d358 docs(mcp): add 'Imported from' note and import statements to every API doc example
  • 82f23ed docs(mcp): document cut direction convention vs sketch normal
  • 98e545e docs(mcp): spell out required count + offset/length/angle options on repeat/copy
  • ccc853d docs(mcp): migrate references & IO to llm-docs/ (phase 11 slice 6)
  • 3bbdd54 docs(mcp): migrate transforms & patterns to llm-docs/ (phase 11 slice 5)
  • 0c76319 docs(mcp): migrate selections & filters to llm-docs/ (phase 11 slice 4)
  • ed9d4cd docs(mcp): migrate 3D features to llm-docs/ (phase 11 slice 3)
  • 2e77aa8 docs(mcp): migrate constrained geometry to llm-docs/ (phase 11 slice 2)
  • 9a198f4 fix(extensions): stop per-keystroke dirty-state sends starving live render
  • 956ca49 docs(mcp): use --scope user for claude mcp add snippet
  • bcc83c7 add mcp readme.md
  • edf806e docs(mcp): migrate 2D primitives to llm-docs/ (phase 11 slice 1)
  • 15887f4 feat(mcp): add llm-docs coverage gate + example execution (phase 10)
  • 8cad644 feat(mcp): add engine-control tools (phase 9)
  • 2828c98 feat(mcp): add source-editing tools with dirty-buffer guard (phase 8)
  • a0e366c feat(mcp): add wait_for_render/wait_for_idle coordination tools (phase 7)
  • e4bb9cb feat(mcp): add screenshot tools and stateless camera views (phase 6)
  • 78637b2 feat(mcp): add inspection tools and scene endpoints (phase 5)
  • 6f167b3 feat(mcp): add documentation tools and resources (phase 4)
  • bd57070 docs: clarify that "x"/"y"/"z" are world axes even inside a sketch
  • 40675ce feat(mcp): seed llm-docs/ and add manifest generator (phase 3)
  • 8077b0b feat(mcp): add discovery and stdio MCP server skeleton (phases 1-2)
  • 1bfaaa5 docs(cli): show fluidcad serve without -w and document --open
  • 91efbc7 add missing files
  • 40077cd feat(cli): switch to commander with init and serve subcommands
  • dbae652 docs(llm): add design-intent guidance and math footgun
  • e0103b9 add llm.md
  • b5870de update docs
  • 8f42d4e docs(api): regenerate API reference
  • a26c64c docs: expand constrained geometry guide with examples and screenshots
  • 3b1e114 docs: expand primitive shape guide with detailed examples and screenshots
  • a7c8d50 feat(back): restore tangent in addition to position
  • 1379c91 fix(arc): default two-point arc center to chord midpoint instead of current position
  • 0e29c78 fix(tarc): route single LazyVertex arg to endpoint overload
  • 11f5609 feat(tarc): implement createCopy on all tangent arc feature classes
  • 865a907 feat(arc): add .major() for arcs >180°, split IArcPoints into IArcRadius/IArcCenter
  • 00b3c99 feat: add init options with mesh deflection configuration
  • 014f926 feat(tarc): add tArc(radius, target) overload ending at first intersection
  • 37f3aa6 feat(tarc): add tArc(targetLine) overload with .flip() to curve the other way
  • 0e7b98a feat: remove shapes from axis/plane sources consumed by repeat features
  • b98a3c9 refactor: defer repeat-feature matrix resolution to build time via LazyMatrix
  • d762757 feat: add chained .join() to shell for selecting arc/intersection/tangent inner-corner blend
  • 35a58c7 docs: add new tutorial
  • 8c76e34 docs: add new tutorial

v0.0.33

Choose a tag to compare

@marwndev marwndev released this 08 May 14:13

Release Notes — v0.0.33

Covers changes from v0.0.32 to v0.0.33.

Features

rib() for thin wall extrusions

New rib() feature creates thin wall extrusions from sketch spines. Supports parallel direction, draft, and extend() to blend rib side faces with target solids — useful for stiffening ribs against drafted or curved cavity faces.

Positional filters on face/edge selectors

face() and edge() filters now accept positional selectors first(), last(), and at(index) for direct index-based picking.

Chainable options on load()

load() now supports noColors(), include(), and exclude() chainable options for finer control over imported geometry.

UI

  • Shapes panel now displays the scene object name or type instead of the shape type.
  • Timeline no longer auto-capitalizes custom names.
  • Scene object ids are preserved across renders.
  • Sketch mode section caps are disabled for cleaner sketch views.

Performance

  • Faster meshing.
  • Faster face/edge lookups.

Bug Fixes

  • Color bleeding between shapes in some cases.

Docs

  • New rib documentation.
  • Drafted box tutorial updated to use the new rib feature.

Commits

  • 4d6f31e chore: release v0.0.33
  • 9eb7a80 restore meshing params updated by mistake
  • afdbea6 docs: update drafted box tutorial to use the new rib feature
  • b878d05 refactor: replace parallel-mode rib draft with tapered loft for exact start-face thickness preservation
  • 2387120 fix: scale rib draft neutral-plane shift to thickness so thin ribs preserve start-face thickness
  • 87451c6 docs: add rib documentation
  • 98b304f fix: reverse rib thickness sign convention so positive thickness extrudes opposite to sketch normal
  • e233078 fix: exclude rib cap faces (perpendicular to spine) from draft so only wall faces taper
  • e3444df fix: compute scope-coincidence via direct perpendicular distance instead of buggy gp_Pln.Distance
  • 4dc08ba fix: select rib solids via spine-interior containment instead of tuned volume thresholds
  • abd93b8 fix: raise rib conformance volume threshold to drop cavity-trace phantom solids
  • 378a19b fix: exclude rib faces flush with scope from draft so wall-mounted ribs taper correctly
  • 65487c7 fix: parallel-mode draft preserves spine-plane thickness and tapers only the tip
  • 8c777da fix: parallel-mode draft direction and angle convention so rib actually tapers
  • 2dabb58 fix: drop sub-volume sliver fragments and fix parallel-mode draft + fuse-side cleanup
  • 185e443 fix: unify coplanar artifact faces on conformed rib
  • 584cd0a fix: propagate rib _parallel and _extend flags through createCopy so repeat() clones don't silently fall back to normal-mode no-extend ribs
  • 8a35eb9 rewrite rib extend(): bbox-scaled spine extension + lineage-tracked conformal cut for robust blending with drafted/curved cavity faces
  • b063d7a refactoring the rib extending algorithm - wip
  • 9812de6 bug fix: rib extend and trim producing incorrect geometry with fuse and complex shapes
  • 5d9609a bug fix: rib trim and extend producing incorrect geometry
  • 081e6a6 feature: add extend() to rib for blending side faces with target solids
  • b249793 feature: add parallel direction and draft support to rib()
  • baaa045 feature: add rib() for thin wall extrusions from sketch spines
  • 47e8b93 feature: add noColors(), include(), exclude() chainable options to load()
  • 5e82088 feature: add first(), last(), at(index) positional selectors to face/edge filters
  • 4069df4 improve meshing performance
  • de9f268 Update shapes panel to use scene object name or type instead of shape type; update timeline to not auto-capitalize custom names
  • f31dc5a improve face/edge lookup performance
  • fe673b1 bug fix: incorrect color bleeding
  • ee7ef3d preserve scene object id across renders
  • a83cb26 disable sketch mode section caps

v0.0.32

Choose a tag to compare

@marwndev marwndev released this 30 Apr 07:29

Release Notes — v0.0.32

Covers changes from v0.0.31 to v0.0.32.

Features

Cross-part shape selection

edge() and face() now support .from(part) to select shapes from a different part, making it easier to reference geometry across parts.

Face filters in extrude('first-face') and extrude('last-face')

extrude('first-face') and extrude('last-face') now accept face filters, giving finer control over which face the extrusion targets.

planar() face filter

New planar() face filter to select only planar faces.

above() / below() face filters

New above() and below() filters for selecting faces by their position relative to a reference.

Bug Fixes

  • extrude().add() caused all touching shapes to fuse even when they did not touch the extrusion.
  • Extrude failed for sketches outside the 1000 unit bound.
  • Extrude-to-face comparison was failing making uncacheable.
  • guide() method moved from ISceneObject to IGeometry.
  • 2D mirror returned the wrong interface type.
  • Extrude to first-face was not respecting the normal direction.
  • extrude().sideFaces() was empty when extruding in the sketch normal reverse direction.
  • line feature was not repeatable; implemented createCopy.
  • Section view in sketch mode was not exactly at the sketch plane.
  • Drafted cut through all (cut().draft()) was not working.
  • Rotate operations were failing to cache.

Docs

  • New drafted box tutorial.
  • Analytics setup.

Commits

  • 20a3dda chore: release v0.0.32
  • 598fef0 bug fix: new extrude causes all touching shapes to fuse even if they are not touching the extrusion
  • 9125242 bug fix: extrude fails for sketches outside 1000 unit bound
  • 60808fb docs: setup analytics
  • 69074c5 docs: new drafted box tutorial
  • 1cad19d bug fix: extrude to face comparison failing
  • 1853ddb bug fix: move guide() method from ISceneObject to IGeometry
  • bf20b23 bug fix: mirror 2D returning wrong interface type
  • 4a287e9 bug fix: extrude to first-face not respecting normal direction
  • eb840a5 bug fix: extrude().sideFaces() empty when extruding in sketch normal reverse direction
  • 03b579b feature: allow filtering faces in extrude('first-face') and extrude('last-face')
  • aa3668f feature: add new planar() face filter
  • 30a7412 bug fix: implement createCopy in line feature to make it repetable
  • ed34daa feature: add above/below filters for faces
  • 1e78308 bug fix: section view in sketch mode is not exactly at sketch plane
  • aedf3d2 bug fix: drafted cut through all cut().draft() is not working
  • 2c273ba bug fix: rotate operations failing to cache
  • 99cf2a3 feature: allow selecting shapes from different part using edge().from(part) and face().from(part)

v0.0.31

Choose a tag to compare

@marwndev marwndev released this 29 Apr 09:29

Release Notes — v0.0.31

Covers changes from v0.0.30 to v0.0.31.

Features

Fusion type and scope on mirror()

mirror() now supports fusion type and scope via .add(), .new() and .remove(), matching the other fusing features.

Move up to a geometry

hmove, vmove and pmove can now move up to another piece of geometry, instead of always requiring an explicit distance.

Validation for consumed/stale shapes

Attempting to use a consumed or stale shape now produces a clear validation error instead of silently misbehaving downstream.

Opaque sketch section view

The sketch section view now renders opaque faces instead of hollow shapes, making sectioned geometry easier to read.

UI updates

  • Updated highlight colors.
  • Visibility and transparency are now tracked by shape id, and transparency is reset on popup close.

Breaking Changes

pmove() and arc() use the current tangent

pMove() now performs the polar move starting from the current tangent direction, and arc() draws using the current tangent as the zero angle. Existing sketches that relied on the previous absolute angles will need to be updated.

Bug Fixes

  • shell cleared colors in some cases.
  • Default tangent was not set on sketches.
  • start() and end() returned incorrect values on projected and intersected curves.
  • face().cylinderCurve() did not work when the cylindrical curve had ellipse edges.
  • First attempt to import a STEP file always throws an error. Fixed by updated OC bindings.
  • project() generated coincident edges; the implementation now removes them.

Docs

  • New l-stub tutorial, plus a follow-up fix.
  • Tutorial updates for the pmove / arc breaking changes.
  • Documentation for mirror() fusion type and scope.
  • Updated lines documentation.
  • Added missing API docs.

Commits

  • 1969d18 chore: release v0.0.31
  • 43c4074 docs: fix l-stub tutorial
  • 1bc081d add validation errors for attempts to use consumed/stale shapes
  • fbcea3b update sketch section view to render opaque faces instead of hollow shapes
  • b935805 bug fix: shell clearing colors in some cases
  • 008dcac restore the selection color
  • bfd09c2 docs: update with new information for pmove and arc
  • 3395323 docs: update tutorial after new breaking changes
  • 79c06de updated pMove() to do the polar move starting from the current tangent direction; updated arc to draw using current tangent as zero angle
  • b17db3a bug fix: set default tangent on sketches
  • 02c4ce5 bug fix: start() and end() in projected and intersected curves is not correct
  • a19fdb1 fix error messages description + fix offset bug
  • b949e3e bug fix: face().cylinderCurve() not working when the cylindrical curve has ellipse edges
  • 253a8de feature: allow hmove, vmove and pmove to move up to a geometry instead of distance
  • b4f1770 bug fix: update binding to fix step import issue
  • 059d14d docs: add new l-stub tutorial
  • dd89191 bug fix: project() generates coincident edges - update the implementation to remove them
  • 001f31e ui: update highlight colors
  • 1a9323c use shape id for visibility/transparency tracking + reset transparency on popup close
  • df06b2f docs: add mirror fusion type and scope documentation
  • 8b93e38 feature: mirror() now supports fusion type and scope .add() .new() .remove()
  • ca5921b docs: update lines documentation
  • d1dac9f use shape id for tracking transparency instead of shape index
  • 03c9bb4 docs: add missing api docs

v0.0.30

Choose a tag to compare

@marwndev marwndev released this 27 Apr 11:20

Release Notes — v0.0.30

Covers changes from v0.0.29 to v0.0.30.

Features

exclude() on transforms and mirror

rotate(), translate() and mirror() now accept an .exclude(...) method to omit specific objects from the operation.

2D back() command

New back() command in 2D sketches that moves the cursor back to the previous position, making it easier to build paths that branch off from an earlier point.

Draw lines up to an intersection

hline, vline and aline can now be drawn up to the intersection with another piece of geometry, instead of always requiring an explicit length.

Better error reporting

Improved error reporting across the board, with clearer messages and better context for debugging.

Breaking Changes

.centered() method on hline / vline / aline

The centered argument has been removed from hline, vline and aline. Use the .centered() method instead, for consistency with how other features configure this option.

Bug Fixes

  • color() was adding faces to the scene as a side effect.

Docs

  • Updated hline, vline and aline documentation to reflect the new signatures and .centered() method.

Commits

  • 08b80a4 chore: release v0.0.30
  • 4e38d40 feature: better error reporting
  • 97621c2 bug fix: using color() adds faces to scene
  • a4a4f2a feature: add exclude() to rotate() and translate() to exclude specific objects from operation
  • 096bb0e feature: add new 2d back() command to move back to the previous position
  • aec7424 feature: added .exclude() to mirror to exclude specific objects from the operation
  • d3f0b72 feature: allow drawing hline, vline and aline up to the intersection with another geometry
  • fb3fbde update the signature for aline, hline and vline to remove the centered option and replaced it with a method config .centered() to match other features
  • d19d047 docs: update hline and vline docs
  • b05cf11 removed 'centered' argument from hline and vline. use .centered() method instead
  • ee57e8b docs: update aline docs
  • 8564a2f update aLine parameters order + move centered to be set via method to make it consistent with other features

v0.0.29

Choose a tag to compare

@marwndev marwndev released this 26 Apr 10:24

Release Notes — v0.0.29

Covers changes from v0.0.28 to v0.0.29.

Features

Ellipse 2D feature

New ellipse(...) 2D feature for sketching ellipses, alongside the existing circle/arc/rectangle primitives.

from() selection filter

New from(...) selection filter to scope a selection to the shapes of specific objects, instead of searching the whole scene.

select(face().from(myPart));

Closing an open offset wire

Open offset wires can now be closed, completing the shape into a closed region.

Breaking Changes

Plane-first signature for standalone 2D features

Standalone 2D features (used outside a sketch) now take the plane as their first argument instead of the last.

Sketch / part return values are namespaced

Values returned from sketch(...) and part(...) callbacks are now namespaced under regions / features on the returned scene object, so they can no longer accidentally overwrite internal scene-object properties.

Bug Fixes

  • VSCode keybindings did not work when the viewer was in focus.
  • Guide shapes were not visible in rollback.
  • The current-position indicator did not render in rollback.
  • Switching between Neovim-opened buffers did not update the scene.
  • Neovim showed all scene objects from cache on first render.
  • revolve cap faces returned the wrong faces.
  • mirror performed an unintended axis-to-plane conversion; mirror now also validates its 2D/3D context #47.
  • 2D rotate called in a 3D context now throws a clear error (#47).

Performance

  • Faster fusion history recording — skips empty color-bleed and unused additions.
  • Faster edge classification using TopTools_MapOfShape for dedup.
  • Added a scene-object profiler with custom profiling categories, plus more profiling coverage across features.

Internal

  • Refactored extrude base classes for clearer logic branches.

Docs

  • Updated color documentation.
  • Documented the new from() filter, offset updates, and the new 2D feature signatures.

Commits

  • eb93461 chore: release v0.0.29
  • ace94a7 feature: add new ellipse 2d feature
  • f686415 bug fix: vscode keybindings not working when the viewer is in focus
  • 0ece120 refactor: namespace sketch/part callback returns under regions/features to prevent overwriting scene-object internals
  • 562af2b docs: update 2d features signature
  • c572488 update all standalone 2d features (outside sketch) to accept the plane as first argument instead of last
  • 3efb529 bug fix: guide shapes not visible in rollback
  • 4520756 bug fix: current position indicator not rendering in rollback
  • aaae9fe docs: add new offset updates
  • da79aee feature: allow closing an open offseted wire
  • dde685e docs: add new from() filter
  • 69f9718 feature: add new from() selection filter to scope the selection to specific object shapes
  • 7364225 speed up Record fusion history by skipping empty color bleed and unused additions
  • 5c70e18 speed up edge classification by switching to TopTools_MapOfShape dedup
  • 4250ec9 add more profiling information
  • a22370e bug fix: switching between neovim opened buffers does not update the scene
  • 1e2d4c4 disable axis to plane conversion in mirror
  • 86895ae validate 2d and 3d context in mirror function
  • 7ef8588 throw an error when 2d rotate is called in 3d context #47
  • 73026f9 bug fix: revolve cap faces returning wrong faces
  • 6f93b2f refactor extrude base classes to better organize the logic branches
  • 2e48009 bug fix: neovim showing all scene objects served from cache on first render
  • d0b2423 add more profiling information to more features
  • adccce0 feature: add profiler for scene objects to add custom profiling categories
  • dffa1b7 docs: update color documentation