Files
solvecraft/docs/ribbon-layout.md
T
Ahmad Khan a7048f41ab Sketch: equation-driven curve, a curve from x(t) and y(t) formulas (#8352) (#8353)
* claim: #8352

* Sketch: equation-driven curve, a fit point spline from x(t) and y(t) formulas (#8352)

sketch.equation_curve draws a curve from formulas in the expression
language and the design's parameters: x(t) and y(t) over a range of t, or
y = f(x) over a range of x. The curve is a cubic fit spline through fixed
points sampled from the formulas, as many as keep it within a tolerance
(0.01 mm by default, at most 500 points); a curve that ends where it starts
closes smoothly. The sketch keeps the formulas (one new design-format
file), places the points again before every solve so they follow the
parameters, and sketch.equation_curve.edit changes them, keeping the joined
end points. Both commands have input and output schemas.

* Sketch: Equation Curve window, its Edit menu item, labels and guide (#8352)

The ribbon's Equation Curve opens a window for the form (parametric or
explicit), the formulas, the range and the tolerance; OK runs
sketch.equation_curve. Right-clicking an equation curve offers Edit
Equation Curve, which reopens the window on its formulas and runs
sketch.equation_curve.edit. New labels and help in a pending locale file
(with ar, de, he, ja, ko, vi and zh), the icon, the glossary term and the
sketching guide.

* Equation curve: one if for closing the sampled points (clippy collapsible_if)
2026-10-29 17:42:59 +00:00

24 KiB
Raw Permalink Blame History

Ribbon structure

The UI layout in crates/ui-egui/src/workspace.rs maps the original engine registry placements into ribbon sections. docs/features.md continues to document registry placements; command registrations and ids are unchanged.

Shown by default, in order: MODEL, SURFACE, ASSEMBLE, INSERT, INSPECT, MANAGE, VIEW, SHEET METAL, WELDMENTS. Click the + after the tabs, right-click a tab or empty toolbar space, or open Preferences › Interface › Toolbar tabs to show or hide them. All existing tabs stay on by default. The per-user hidden_toolbar_tabs preference lists the tabs hidden; newly added tabs show automatically. Hiding a tab preserves its customised buttons, commands in search and shortcuts. Hiding the selected tab selects MODEL, or the first tab still shown. Every tab can be hidden: the + remains, with a hint explaining how to restore them.

SKETCH appears during sketch editing; with Preferences › Interface › Keep the Sketch tab shown (sketch_tab_always, #7904) it stays right after MODEL all the time, and outside a sketch the tools in its CREATE and REFERENCE sections open Create Sketch first and then start in the new sketch. Hidden tabs stay hidden when creating features, opening designs, selecting bodies or undoing changes. When shown, SHEET METAL takes the contextual style and selects itself when the selected body (or the last body of the active component) has evaluated sheet-metal data. When shown, WELDMENTS selects itself when that body is a frame member, keeping the ordinary tab look (sheet metal comes first). Entering a context selects its tab; the other tabs remain available. RENDER belongs to the Render workspace.

Bold command ids are default promoted buttons. Every listed command remains in the section menu. Saved user pins can add buttons, as before.

Tab Section Command ids, in menu order
MODEL SKETCH sketch.create, sketch.edit, sketch.line3d, sketch.spline3d, sketch.point3d, sketch.move3d
MODEL CREATE solid.extrude, solid.revolve, solid.hole, solid.sweep, solid.loft, solid.box, solid.cylinder, solid.sphere, solid.torus, solid.cone, solid.pipe, solid.bounding_solid, solid.thread, solid.boundary_fill, solid.coil, solid.rib, solid.web, solid.emboss, plastic.boss, plastic.lip, plastic.snap_fit, plastic.rest
MODEL MODIFY solid.fillet, solid.chamfer, solid.shell, solid.press_pull, sheet.convert, solid.combine, solid.scale, solid.offset_face, solid.draft, solid.split_face, solid.split_body, solid.replace_face, solid.remove, timeline.delete, face.delete
MODEL ARRANGE solid.move, solid.mirror, solid.pattern.rectangular, solid.align, solid.pattern.circular, solid.pattern.path
MODEL CONFIGURE parameters.change, config.table, config.configure
MODEL CONSTRUCT construct.plane.offset, construct.plane.at_angle, construct.axis.through_cylinder, construct.axis.normal_to_face, construct.axis.two_planes, construct.axis.two_points, construct.axis.edge, construct.point.vertex, construct.point.two_edges, construct.point.three_planes, construct.point.center, construct.point.edge_plane, construct.point.along_path, construct.plane.midplane, construct.plane.two_edges, construct.plane.three_points, construct.plane.tangent, construct.plane.along_path, construct.plane.perpendicular
SURFACE SKETCH sketch.create
SURFACE CREATE surface.extrude, surface.revolve, surface.sweep, surface.loft, surface.boundary, surface.patch, surface.offset, surface.ruled, surface.blend
SURFACE EDIT surface.trim, surface.untrim, surface.extend, surface.stitch, surface.unstitch, surface.reverse_normal, surface.fair, surface.fillet, surface.match
SURFACE CONVERT surface.thicken, mesh.convert
ASSEMBLE COMPONENTS component.create, component.from_bodies, component.insert_design, parts.library
ASSEMBLE JOINTS joint.create, joint.as_built, joint.origin, joint.rigid_group, joint.limits, joint.gear, joint.rack_pinion, joint.screw, joint.cam, joint.reach
ASSEMBLE POSITION occurrence.ground, component.capture_position, component.revert_position
ASSEMBLE MOTION joint.drive, joint.motion_link, motion.study, motion.trace, explode.create
ASSEMBLE CONTACT contact.enable_sets, contact.check, contact.enable_all, contact.disable_all, contact.create, contact.edit, contact.list
INSERT FILES file.insert_step, file.insert_mesh, component.insert_design, file.save_mesh
INSERT IMAGES canvas.insert, canvas.decal, canvas.edit
INSERT 2D sketch.insert_dxf, sketch.insert_svg
INSERT LIBRARY parts.fastener, parts.library, parts.resize, parts.insert
INSERT LINKS component.update_links, component.break_link
INSPECT MEASURE inspect.measure, inspect.center_of_mass, component.properties
INSPECT SECTION inspect.section
INSPECT CHECK inspect.interference, inspect.draft, inspect.accessibility, contact.check, inspect.compare
INSPECT SURFACE QUALITY inspect.zebra, inspect.curvature_map, inspect.curvature_comb, inspect.isocurve, inspect.minimum_radius, inspect.environment_map, inspect.continuity
INSPECT HISTORY timeline.dependents, document.inspect
MANAGE PARAMETERS parameters.change, parameters.graph, parameters.move, parameters.import, parameters.export
MANAGE CONFIGURATIONS config.table, config.configure, config.rules, config.preview
MANAGE MATERIALS material.assign, appearance.assign, material.properties.validate, library.inspect, library.export, library.apply
MANAGE RULES sheet.manage_rules, plastic.manage_rules, plastic.assign_rule
MANAGE DESIGN document.units, timeline.compute_all, edit.checkpoint, edit.restore_checkpoint
VIEW VIEWS view.apply, view.save, view.rename, view.delete, view.list, view.navigate
VIEW SELECT Selection-filter controls (existing UI, no command ids)
SKETCH CREATE sketch.line, sketch.rectangle.two_point, sketch.circle.center, sketch.arc.three_point, sketch.infinite, sketch.rectangle.three_point, sketch.rectangle.rounded, sketch.rectangle.center, sketch.circle.two_point, sketch.circle.three_point, sketch.arc.center_point, sketch.polygon.inscribed, sketch.polygon.circumscribed, sketch.polygon.edge, sketch.slot.center_to_center, sketch.slot.overall, sketch.point, sketch.line.midpoint, sketch.arc.tangent, sketch.circle.two_tangent, sketch.circle.three_tangent, sketch.slot.center_point, sketch.slot.arc_three_point, sketch.slot.arc_center, sketch.ellipse, sketch.spline.fit_point, sketch.spline.control_point, sketch.spline.control_point_5, sketch.conic, sketch.centerline, sketch.text, sketch.equation_curve
SKETCH MODIFY sketch.trim, sketch.offset, sketch.fillet, sketch.copy, sketch.cut, sketch.paste, sketch.blend_curve, sketch.chamfer.equal_distance, sketch.chamfer.distance_angle, sketch.chamfer.two_distance, sketch.extend, sketch.break, sketch.scale, sketch.move
SKETCH PATTERN sketch.mirror, sketch.pattern.circular, sketch.pattern.rectangular
SKETCH CONSTRAIN sketch.dimension, sketch.constraint.horizontal_vertical, sketch.constraint.coincident, sketch.constraint.tangent, sketch.constraint.equal, sketch.constraint.parallel, sketch.constraint.perpendicular, sketch.construction, sketch.constrainer, sketch.constraint.fix, sketch.constraint.midpoint, sketch.constraint.concentric, sketch.constraint.collinear, sketch.constraint.symmetry, sketch.constraint.curvature, sketch.constraint.polygon, sketch.auto_constrain, sketch.auto_constrain_from_datum
SKETCH REFERENCE sketch.project, sketch.intersect, sketch.include_3d, sketch.project_to_surface, sketch.intersection_curve, sketch.spun_profile, sketch.isoparametric_curve, sketch.fit_curves_to_section, sketch.insert_dxf, sketch.insert_svg, canvas.insert
SKETCH FINISH SKETCH sketch.finish, sketch.finish_auto_constrain
SHEET METAL SKETCH sketch.create
SHEET METAL CREATE sheet.flange, sheet.hem, sheet.fold, sheet.perforate, sheet.convert
SHEET METAL FLAT sheet.unfold, sheet.refold, sheet.flat_pattern
SHEET METAL OUTPUT sheet.export_dxf, sheet.export_bend_table
SHEET METAL RULES sheet.manage_rules
SHEET METAL CONFIGURE parameters.change, config.table, config.configure
WELDMENTS SKETCH sketch.create
WELDMENTS CREATE frame.member
WELDMENTS CONFIGURE parameters.change, config.table, config.configure
SKETCH CONFIGURE parameters.change, config.table, config.configure
RENDER SCENE render.scene
RENDER IMAGE render.start

Original placements to ribbon destinations

Explicit command-id lists override the default placement mapping. Shared commands appear in every section that lists them above. This table includes every command with an original toolbar placement.

Original tab / panel New tab / section Command ids
MESH / MODIFY INSERT / FILES file.save_mesh
PLASTIC / CREATE MODEL / CREATE plastic.boss, plastic.lip, plastic.snap_fit, plastic.rest
PLASTIC / SETUP MANAGE / RULES plastic.manage_rules, plastic.assign_rule
RENDER / IMAGE RENDER / IMAGE render.start
RENDER / SCENE RENDER / SCENE render.scene
SHEET METAL / CREATE MODEL / MODIFY sheet.convert
SHEET METAL / CREATE SHEET METAL / SKETCH sketch.create
SHEET METAL / CREATE SHEET METAL / CREATE sheet.flange, sheet.perforate, sheet.hem, sheet.fold
SHEET METAL / CREATE SHEET METAL / FLAT sheet.flat_pattern
SHEET METAL / MODIFY MANAGE / RULES sheet.manage_rules
SHEET METAL / MODIFY SHEET METAL / FLAT sheet.unfold, sheet.refold
SKETCH / CONSTRAINTS SKETCH / CONSTRAIN sketch.constraint.horizontal_vertical, sketch.constraint.coincident, sketch.constraint.tangent, sketch.constraint.equal, sketch.constraint.parallel, sketch.constraint.perpendicular, sketch.constraint.fix, sketch.constraint.midpoint, sketch.constraint.concentric, sketch.constraint.collinear, sketch.constraint.symmetry, sketch.constraint.curvature, sketch.constraint.polygon, sketch.auto_constrain, sketch.auto_constrain_from_datum
SKETCH / CREATE SKETCH / CONSTRAIN sketch.dimension, sketch.construction, sketch.constrainer
SKETCH / CREATE SKETCH / CREATE sketch.line, sketch.rectangle.two_point, sketch.rectangle.three_point, sketch.rectangle.rounded, sketch.rectangle.center, sketch.circle.center, sketch.circle.two_point, sketch.circle.three_point, sketch.arc.three_point, sketch.arc.center_point, sketch.polygon.inscribed, sketch.polygon.circumscribed, sketch.polygon.edge, sketch.slot.center_to_center, sketch.slot.overall, sketch.point, sketch.line.midpoint, sketch.arc.tangent, sketch.circle.two_tangent, sketch.circle.three_tangent, sketch.slot.center_point, sketch.slot.arc_three_point, sketch.slot.arc_center, sketch.ellipse, sketch.spline.fit_point, sketch.spline.control_point, sketch.spline.control_point_5, sketch.conic, sketch.centerline, sketch.text, sketch.equation_curve
SKETCH / CREATE SKETCH / REFERENCE sketch.project, sketch.intersect, sketch.include_3d, sketch.project_to_surface, sketch.intersection_curve, sketch.spun_profile, sketch.isoparametric_curve, sketch.fit_curves_to_section
SKETCH / FINISH SKETCH SKETCH / FINISH SKETCH sketch.finish, sketch.finish_auto_constrain
SKETCH / INSERT INSERT / 2D sketch.insert_dxf, sketch.insert_svg
SKETCH / INSERT INSERT / IMAGES canvas.insert, canvas.decal, canvas.edit
SKETCH / INSPECT INSPECT / CHECK inspect.draft, inspect.accessibility
SKETCH / INSPECT INSPECT / MEASURE inspect.center_of_mass
SKETCH / INSPECT INSPECT / SURFACE QUALITY inspect.curvature_comb, inspect.minimum_radius, inspect.isocurve, inspect.zebra, inspect.environment_map, inspect.curvature_map
SKETCH / MODIFY SKETCH / MODIFY sketch.blend_curve, sketch.fillet, sketch.chamfer.equal_distance, sketch.chamfer.distance_angle, sketch.chamfer.two_distance, sketch.offset, sketch.trim, sketch.extend, sketch.break, sketch.scale, sketch.move
SKETCH / PATTERN SKETCH / PATTERN sketch.mirror, sketch.pattern.circular, sketch.pattern.rectangular
SOLID / ASSEMBLE ASSEMBLE / COMPONENTS component.create, component.insert_design
SOLID / ASSEMBLE ASSEMBLE / CONTACT contact.enable_sets, contact.enable_all, contact.disable_all, contact.create
SOLID / ASSEMBLE ASSEMBLE / JOINTS joint.create, joint.as_built, joint.rigid_group, joint.gear, joint.rack_pinion, joint.screw, joint.cam
SOLID / ASSEMBLE ASSEMBLE / MOTION joint.drive, joint.motion_link, explode.create, motion.study, motion.trace
SOLID / CONFIGURE MANAGE / CONFIGURATIONS config.configure, config.table
SOLID / CONSTRUCT MODEL / CONSTRUCT construct.plane.offset, construct.plane.at_angle, construct.axis.through_cylinder, construct.axis.normal_to_face, construct.axis.two_planes, construct.axis.two_points, construct.axis.edge, construct.point.vertex, construct.point.two_edges, construct.point.three_planes, construct.point.center, construct.point.edge_plane, construct.point.along_path, construct.plane.midplane, construct.plane.two_edges, construct.plane.three_points, construct.plane.tangent, construct.plane.along_path, construct.plane.perpendicular
SOLID / CREATE ASSEMBLE / JOINTS joint.origin
SOLID / CREATE MODEL / ARRANGE solid.pattern.rectangular, solid.pattern.circular, solid.pattern.path, solid.mirror
SOLID / CREATE MODEL / CREATE solid.extrude, solid.revolve, solid.sweep, solid.loft, solid.box, solid.cylinder, solid.sphere, solid.torus, solid.cone, solid.hole, solid.pipe, solid.bounding_solid, solid.thread, solid.boundary_fill, solid.coil, solid.rib, solid.web, solid.emboss
SOLID / CREATE MODEL / SKETCH sketch.create
SOLID / INSERT INSERT / FILES file.insert_step, file.insert_mesh
SOLID / INSERT INSERT / LIBRARY parts.fastener
SOLID / INSPECT INSPECT / CHECK inspect.interference
SOLID / INSPECT INSPECT / MEASURE inspect.measure
SOLID / INSPECT INSPECT / SECTION inspect.section
SOLID / MODIFY MANAGE / DESIGN timeline.compute_all
SOLID / MODIFY MANAGE / MATERIALS appearance.assign, material.assign
SOLID / MODIFY MANAGE / PARAMETERS parameters.change
SOLID / MODIFY MODEL / ARRANGE solid.move, solid.align
SOLID / MODIFY MODEL / MODIFY solid.fillet, solid.chamfer, solid.combine, solid.scale, solid.offset_face, solid.shell, solid.draft, solid.split_face, solid.split_body, solid.press_pull, solid.replace_face, solid.remove, timeline.delete, face.delete
SOLID / POSITION ASSEMBLE / POSITION component.capture_position, component.revert_position
SURFACE / CREATE SURFACE / CONVERT surface.thicken
SURFACE / CREATE SURFACE / CREATE surface.boundary, surface.patch, surface.extrude, surface.revolve, surface.sweep, surface.loft, surface.offset, surface.ruled, surface.blend
SURFACE / INSPECT INSPECT / SURFACE QUALITY inspect.continuity
SURFACE / MODIFY SURFACE / EDIT surface.stitch, surface.extend, surface.trim, surface.untrim, surface.unstitch, surface.reverse_normal, surface.fair, surface.fillet, surface.match
WELDMENTS / CREATE WELDMENTS / CREATE frame.member

Placement decisions and missing commands

  • Save As Mesh (file.save_mesh), previously MESH / MODIFY, is in INSERT / FILES. The existing File menu continues to offer it.
  • The selection filter, previously in SELECT on multiple tabs including UTILITIES, is in VIEW / SELECT. This is a populated control group, although it has no command ids.
  • MODEL’s Pattern button uses the existing solid.pattern.rectangular command; Circular and Path stay in its menu. No generic pattern command is registered.
  • There is no separate New 3D Sketch command. MODEL / SKETCH lists the existing 3D line, spline, point and move-point commands. Infinite Line (sketch.infinite) is in SKETCH / CREATE.
  • Physical Properties maps to the existing component.properties command. Material data checks map to material.properties.validate. Calibrate maps to the existing canvas editor (canvas.edit).
  • VIEW / VIEWS lists the existing named-view and navigation commands. Display, Show, Agent and Window are omitted: their requested settings have no engine commands. No Fit or Orientation commands were invented.
  • RENDER / IMAGE exposes the already registered render.start, which previously had no visible panel. The Render workspace and its existing SCENE command are preserved.
  • Constrain is the gallery exception to the four-promoted-button cap: the large Dimension button is followed by a 3 × 2 icon-only constraint gallery (Horizontal/Vertical, Coincident, Tangent; Equal, Parallel, Perpendicular). Every command remains in the section list and saved pins still apply.

Saved customizations

Legacy toolbar preferences are plain maps keyed by DESIGN/<tab>/<panel>. On load, known keys migrate using the same command destinations. Previously promoted buttons absent from a saved list remain removed. Merging panels retains saved order within each source; sources merge in sorted-key order, and duplicates are removed. New promoted defaults are retained unless an old saved removal applies. Unknown keys and unknown command ids are preserved. An existing new destination takes precedence over a legacy destination.

Preferences and shortcut exports now wrap the map as {"version":2,"panels":{...}}. The version prevents repeated migration of unchanged SKETCH, SURFACE and SHEET METAL keys. Legacy imports still migrate. Reset restores the new defaults.

Additional old panels used for shared layouts migrate as follows: SELECT on any old tab → VIEW / SELECT; ASSEMBLE → ASSEMBLE / JOINTS; CONSTRUCT → MODEL / CONSTRUCT; INSPECT → INSPECT / CHECK; INSERT → INSERT / FILES; PLASTIC / MODIFY → MODEL / MODIFY; MESH / CREATE or PREPARE → SURFACE / CONVERT; UTILITIES / MAKE, ADD-INS or UTILITY → MANAGE / DESIGN. Command-id destinations override these panel defaults.

Automation handles

The tab handle form stays tab:<UPPERCASE NAME>. Added: tab:MODEL, tab:ASSEMBLE, tab:INSERT, tab:INSPECT, tab:MANAGE, tab:VIEW. SURFACE and RENDER retain their names; SKETCH is available in context or with sketch_tab_always; SHEET METAL and WELDMENTS show unless hidden, or when the design has their features; the other design tabs show unless hidden. The + after the last tab is ribbon:add_tab; it opens the toolbar menu. In that menu (ui.menu with target {"type": "toolbar"}), pick a tab's row by its label, as the tab row shows it (ui.menuPick {"item": "Sheet Metal"}). With every tab hidden, the ribbon's hint is ribbon:tabs_hidden. The Settings check boxes are prefs:toolbar_tab:<UPPERCASE NAME>. Legacy aliases remain: tab:SOLID and tab:PLASTIC → MODEL; tab:MESH → SURFACE; tab:UTILITIES → MANAGE. The Home and document-tab handles are unchanged.

Section labels retain panel:<tab>:<section> and collapsed sections retain collapsed:<tab>:<section>, with destinations from the tables above. In particular, panel:SOLID:CREATE becomes panel:MODEL:CREATE, selection-filter panels become panel:VIEW:SELECT, and panel:SKETCH:CONSTRAINTS becomes panel:SKETCH:CONSTRAIN. Command button and menu handles keep their command ids.

Docked ribbon painting

The ribbon is a full-width surface immediately below the 34 px application bar, with no outer gap or rounding. toolbar::{TAB_ROW_HEIGHT,GROUP_HEIGHT,RIBBON_HEIGHT} reserve 30 + 86 + 1 px; browser and viewport placement follows the panel allocation. The workspace column is 88 px wide. Promoted buttons are 54 × 60 px with 3 px gaps (Sketch Create retains wider family selectors). Section labels occupy a 20 px row, inset 3 px, and retain the existing command lists, pin actions and drag targets.

Tab labels use normal word casing. Selected standard tabs use their soft accent; contextual tabs use their solid accent and add a row-wide line when selected. The existing TabAccent helper supplies all selection colours. Search is a 188 × 24 px launcher for the S box, using the existing zoom magnifier; it shrinks to 24 px before the tabs scroll horizontally. The selected tab scrolls into view after a context change or resize. Clicking Search or pressing S anchors the existing search popup below the field. The bottom command line is gone: the S box (and the ribbon search field) runs a command id typed with JSON parameters, e.g. solid.extrude {"distance": 20}, when you press Enter.

Sketch's Finish group reserves space at the far right even when other groups collapse. Its unfilled Finish Sketch button uses the existing finish icon. The chevron-free Exit row still opens the existing command list, preserving Finish with Auto-Constrain and saved pin customizations.

Additional handles: ribbon:workspace, ribbon:search, and ribbon:section:<TAB>:<SECTION>. Existing workspace, tab, panel, collapsed, family and command handles remain available. Layout evidence also publishes rectangles for these handles, button:<command id>, and the open ribbon:search_popup.

Workspace and section lists

The workspace popup is 470 px wide, anchored below the workspace column. Design and Render keep their existing menu actions and enablement; planned workspaces cannot be selected. Each row also publishes workspace:menu:<design|render|animation|simulation|manufacture|drawing>. The constraint cells publish ribbon:constraint:<command id> alongside their existing button: and toolbar: handles. No icon assets or command ids were added.

Section lists use 30 px command rows, 20 px semantic icons, monospace shortcuts, hover pins and a pinning footer. workspace::groups optionally supplies headings and command order. MODEL / MODIFY uses EDGES, FACES, BODIES and SPECIALISE; unlisted commands follow the final heading in their original order. This ordering does not change promoted buttons or saved pins.

Ribbon tooltips show the full command name in bold and its registered shortcut in a key cap. Existing Render catalog descriptions are reused; commands without prose descriptions show the header alone (and their existing disabled reason when applicable). Registry parameter syntax is not presented as a description.

The floating shell uses one Browser card with a title, body count and fold button. Its right edge resizes the same saved browser width as the Docked sidebar. The Browser preference “Float it over the workspace” switches the Docked sidebar to this card; in the Floating shell it keeps the card and enables the translucent overlay surface. With the left history enabled, the browser stays below that history unless the overlay preference is enabled, in which case only the history keeps its column. The bottom History card leaves a gap beneath the browser; the full viewport remains available through the gaps and below a short browser.