Design: every offer verb has a hint, shown on hover — and the status line wraps

Mirror of snaporca 2b3e890165 (DesignPanel.cpp applied as a patch; parity 30 / 16, shared
files byte-identical).

All 86 verbs now carry a hint: 55 extracted from the C++ tool definitions so the offer and
the armed-tool hint cannot drift, 31 written by hand. One wxEVT_MENU_HIGHLIGHT binding
shows the hovered verb's hint in the status line. The generator asserts that no wired verb
lacks one.

Also: all 200 status writes go through set_status(), which wraps instead of clipping at the
panel edge; and the empty-document hint is called from on_tab_shown() as well, since
after_tree_edit() never runs on a freshly opened tab.

Verified on the rig.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LyRwbuq6fjn3VV9U9UvhBM
This commit is contained in:
Tommaso Bianchi
2026-08-01 19:46:49 +02:00
co-authored by Claude Opus 5
parent 3037e55f44
commit 96816f725c
5 changed files with 505 additions and 376 deletions
+7 -2
View File
@@ -93,6 +93,7 @@ def main():
" // grouping instead of flattening 19 create tools into one wall.",
" const char* family;",
" const char* icon; // resources/images name, or nullptr — the offer draws it beside the row",
" const char* hint; // what the verb does / what to click; shown on hover",
"};",
"",
"// Row labels, in ratified order.",
@@ -106,19 +107,23 @@ def main():
"",
"static const OfferVerb kOfferVerbs[] = {",
]
# A verb the user can PICK must say what it does. Fail loudly rather than ship a
# bare name — the offer is now the only door to these tools.
blind = [v["id"] for v in A["verbs"] if v.get("action") and not v.get("hint")]
assert not blind, f"wired verbs with no hint: {blind}"
for v in A["verbs"]:
mask = 0
for a in v["accepts"]:
mask |= 1 << sels.index(a)
n = v.get("needs") or {}
lines.append(
" {%s, %s, %d, %s, %s, %s, 0x%08xu, %d, %d, %s, %s, %s, %s}," % (
" {%s, %s, %d, %s, %s, %s, 0x%08xu, %d, %d, %s, %s, %s, %s, %s}," % (
cstr(v["id"]), cstr(v["name"]), slots.index(v["slot"]),
cstr(v.get("key")), cstr(v.get("action")), cstr(v.get("refusal")),
mask, n.get("bodies", 0), n.get("sketches", 0),
"true" if n.get("sheet") else "false",
"true" if v.get("mode") == "sketch" else "false",
cstr(v.get("family")), cstr(v.get("icon"))))
cstr(v.get("family")), cstr(v.get("icon")), cstr(v.get("hint"))))
lines += [
"};",
f"static const int kOfferVerbCount = {len(A['verbs'])};",
+172 -86
View File
@@ -226,7 +226,8 @@
"refusal": "Click a face or a reference plane in the viewport, then a sketch tool",
"gui": true,
"action": "key:S+S",
"icon": "design_sketch"
"icon": "design_sketch",
"hint": "Click a face or a reference plane, then pick a drawing tool"
},
{
"id": "extrude",
@@ -243,7 +244,8 @@
"refusal": "Create a sketch, or pick a solid face, first",
"gui": true,
"action": "key:S+E",
"icon": "design_extrude"
"icon": "design_extrude",
"hint": "Extrude a sketch profile, or push/pull a picked face"
},
{
"id": "revolve",
@@ -259,7 +261,8 @@
"refusal": "Create a sketch profile to revolve first",
"gui": true,
"action": "key:S+R",
"icon": "design_revolve"
"icon": "design_revolve",
"hint": "Revolve a profile about an axis"
},
{
"id": "sweep",
@@ -277,7 +280,8 @@
"refusal": "Create a profile sketch to sweep first",
"gui": true,
"action": "key:S+W",
"icon": "design_sweep"
"icon": "design_sweep",
"hint": "Sweep a profile along a path"
},
{
"id": "loft",
@@ -295,7 +299,8 @@
"refusal": "Create at least two profile sketches to loft",
"gui": true,
"action": "key:S+L",
"icon": "design_loft"
"icon": "design_loft",
"hint": "Loft (skin) between two or more profiles"
},
{
"id": "thicken",
@@ -314,7 +319,8 @@
"refusal": "Thicken needs a solid body — add or import one first",
"gui": true,
"action": "fly:material#4",
"icon": "design_thicken"
"icon": "design_thicken",
"hint": "Offset a solid face into a thin plate (new body)"
},
{
"id": "rib",
@@ -332,7 +338,8 @@
"refusal": "Rib needs a solid body — add or import one first",
"gui": true,
"action": "fly:material#5",
"icon": "design_rib"
"icon": "design_rib",
"hint": "Grow a thin wall from an open sketch line, fused to a body"
},
{
"id": "boolean",
@@ -350,7 +357,8 @@
"refusal": "Boolean needs two bodies — create or import a second solid",
"gui": true,
"action": "btn:bool#0",
"icon": "design_boolean"
"icon": "design_boolean",
"hint": "Fuse the tool body into the target — one solid, no seam"
},
{
"id": "bool_subtract",
@@ -369,7 +377,8 @@
"gui": true,
"action": "btn:bool#1",
"mode": null,
"icon": "design_boolean"
"icon": "design_boolean",
"hint": "Cut the tool body out of the target"
},
{
"id": "bool_intersect",
@@ -388,7 +397,8 @@
"gui": true,
"action": "btn:bool#2",
"mode": null,
"icon": "design_boolean"
"icon": "design_boolean",
"hint": "Keep only where the two bodies overlap"
},
{
"id": "surf_extrude",
@@ -404,7 +414,8 @@
"refusal": "Create a sketch first",
"gui": true,
"action": "key:S+G",
"icon": "design_extrude"
"icon": "design_extrude",
"hint": "Extrude a sketch into a sheet body (no end caps)"
},
{
"id": "surf_revolve",
@@ -420,7 +431,8 @@
"refusal": "Create a sketch profile to revolve first",
"gui": true,
"action": "fly:surface#1",
"icon": "design_revolve"
"icon": "design_revolve",
"hint": "Revolve a sketch profile into a sheet body"
},
{
"id": "surf_loft",
@@ -438,7 +450,8 @@
"refusal": "Create at least two profile sketches to loft",
"gui": true,
"action": "fly:surface#2",
"icon": "design_loft"
"icon": "design_loft",
"hint": "Loft (skin) between 2+ profiles, open (no end caps)"
},
{
"id": "surf_fill",
@@ -454,7 +467,8 @@
"refusal": "Create a closed sketch first",
"gui": true,
"action": "fly:surface#3",
"icon": "design_surface"
"icon": "design_surface",
"hint": "Fill a sketch boundary with a smooth face"
},
{
"id": "thicken_surf",
@@ -472,7 +486,8 @@
"refusal": "target is not a sheet body",
"gui": true,
"action": "fly:surface#5",
"icon": "design_thicken"
"icon": "design_thicken",
"hint": "Thicken a sheet body into a solid"
},
{
"id": "hole",
@@ -491,7 +506,8 @@
"refusal": "Pick a face or a plane to drill into",
"gui": true,
"action": "key:S+H",
"icon": "design_hole"
"icon": "design_hole",
"hint": "Drill a hole, centred on a picked face or placed on a plane"
},
{
"id": "thread",
@@ -510,7 +526,8 @@
"refusal": "Pick a cylindrical surface (bore / outer) or a circular edge for a thread",
"gui": true,
"action": "key:S+T",
"icon": "design_thread"
"icon": "design_thread",
"hint": "Thread a cylindrical surface (inner bore / outer) or a circular edge"
},
{
"id": "shell",
@@ -529,7 +546,8 @@
"refusal": "Shell needs a solid body",
"gui": true,
"action": "key:S+K",
"icon": "design_shell"
"icon": "design_shell",
"hint": "Hollow the body to a wall thickness, opening a picked face"
},
{
"id": "cut",
@@ -548,7 +566,8 @@
"refusal": "Create a solid body to cut first",
"gui": true,
"action": "key:S+X",
"icon": "design_cut"
"icon": "design_cut",
"hint": "Split the body with a plane; set the offset in the card"
},
{
"id": "split",
@@ -566,7 +585,8 @@
"refusal": "Split needs a solid body",
"gui": false,
"action": null,
"icon": null
"icon": null,
"hint": "Split the body into separate solids"
},
{
"id": "fillet",
@@ -587,7 +607,8 @@
"refusal": "Pick an edge to round",
"gui": true,
"action": "btn:dress#0",
"icon": "design_filletedge"
"icon": "design_filletedge",
"hint": "Pick an edge, then drag the radius arrow or type it"
},
{
"id": "chamfer",
@@ -608,7 +629,8 @@
"refusal": "Pick an edge to bevel",
"gui": true,
"action": "btn:dress#1",
"icon": "design_chamfer"
"icon": "design_chamfer",
"hint": "Pick an edge, then drag the distance arrow or type it"
},
{
"id": "draft",
@@ -627,7 +649,8 @@
"refusal": "Pick a face to taper",
"gui": true,
"action": "key:S+D",
"icon": "design_draft"
"icon": "design_draft",
"hint": "Tilt a picked face by a draft angle"
},
{
"id": "surf_offset",
@@ -645,7 +668,8 @@
"refusal": "target is not a sheet body",
"gui": true,
"action": "fly:surface#4",
"icon": "design_offset"
"icon": "design_offset",
"hint": "Offset a sheet body's shell by a signed distance"
},
{
"id": "pattern",
@@ -666,7 +690,8 @@
"refusal": "Create a solid body to pattern first",
"gui": true,
"action": "btn:pat#0",
"icon": "design_array"
"icon": "design_array",
"hint": "Repeat the body along a direction — drag the spacing, set the count"
},
{
"id": "pattern_circular",
@@ -688,7 +713,8 @@
"gui": true,
"action": "btn:pat#1",
"mode": null,
"icon": "design_polararray"
"icon": "design_polararray",
"hint": "Repeat the body around an axis — set the count and sweep"
},
{
"id": "mirror",
@@ -707,7 +733,8 @@
"refusal": "Mirror needs a body — add or import one first",
"gui": true,
"action": "key:S+Z",
"icon": "design_mirror"
"icon": "design_mirror",
"hint": "Reflect a body about a plane"
},
{
"id": "pat_curve",
@@ -726,7 +753,8 @@
"refusal": "Pattern on curve needs a body and a curve",
"gui": false,
"action": null,
"icon": null
"icon": null,
"hint": "Repeat the body along a picked curve"
},
{
"id": "transform",
@@ -746,7 +774,8 @@
"refusal": "Transform needs a body — add or import one first",
"gui": true,
"action": "key:S+Y",
"icon": "design_move"
"icon": "design_move",
"hint": "Move and/or rotate an existing body"
},
{
"id": "mate",
@@ -766,7 +795,8 @@
"refusal": "A mate needs two coordinate systems",
"gui": true,
"action": "fly:placement#2",
"icon": "design_c_coincident"
"icon": "design_c_coincident",
"hint": "Assembly: align two CoordSys features (fastened, planar, revolute, slider, cylindrical)"
},
{
"id": "align",
@@ -784,7 +814,8 @@
"refusal": "Align needs a body",
"gui": false,
"action": null,
"icon": null
"icon": null,
"hint": "Align the body to a picked face or plane"
},
{
"id": "plane",
@@ -804,7 +835,8 @@
"refusal": null,
"gui": true,
"action": "key:S+P",
"icon": "design_plane"
"icon": "design_plane",
"hint": "Reference plane (offset / tilt / midplane / tangent / two edges / coincident)"
},
{
"id": "axis",
@@ -824,7 +856,8 @@
"refusal": null,
"gui": true,
"action": "key:S+A",
"icon": "design_line"
"icon": "design_line",
"hint": "Datum axis (two points, face normal, cylinder centerline, two planes, along edge)"
},
{
"id": "coordsys_v",
@@ -842,7 +875,8 @@
"refusal": null,
"gui": true,
"action": "key:S+C",
"icon": "design_point"
"icon": "design_point",
"hint": "Datum coordinate system (world point, or face + direction edge)"
},
{
"id": "helix",
@@ -860,7 +894,8 @@
"refusal": null,
"gui": true,
"action": "fly:plane#3",
"icon": "design_thread"
"icon": "design_thread",
"hint": "Helical curve (spring path) — use as a sweep path for coils / springs / augers"
},
{
"id": "project",
@@ -880,7 +915,8 @@
"refusal": "Project needs a body — add or import one first",
"gui": true,
"action": "fly:plane#4",
"icon": "design_sketch"
"icon": "design_sketch",
"hint": "Project body edges onto a plane as sketch entities"
},
{
"id": "measure",
@@ -907,7 +943,8 @@
"refusal": null,
"gui": false,
"action": null,
"icon": null
"icon": null,
"hint": "Measure between the picked points, edges or faces"
},
{
"id": "mass_props",
@@ -925,7 +962,8 @@
"refusal": null,
"gui": true,
"action": "btn:mass",
"icon": "info"
"icon": "info",
"hint": "Report the volume and surface area of the selected body"
},
{
"id": "interference",
@@ -943,7 +981,8 @@
"refusal": null,
"gui": false,
"action": null,
"icon": null
"icon": null,
"hint": "Check whether two bodies overlap — reports, changes nothing"
},
{
"id": "edit_feature",
@@ -968,7 +1007,8 @@
"refusal": null,
"gui": true,
"action": "btn:edit",
"icon": "design_edit"
"icon": "design_edit",
"hint": "Reopen the selected feature to change what it was made from"
},
{
"id": "delete_face",
@@ -988,7 +1028,8 @@
"refusal": "Delete Face needs a body — add or import one first",
"gui": true,
"action": "fly:dressup#3",
"icon": "design_delete"
"icon": "design_delete",
"hint": "Remove faces from a body and heal the solid"
},
{
"id": "colour",
@@ -1007,7 +1048,8 @@
"refusal": null,
"gui": true,
"action": "btn:colour",
"icon": "color_palette"
"icon": "color_palette",
"hint": "Set the selected body's display colour"
},
{
"id": "delete",
@@ -1034,7 +1076,8 @@
"refusal": null,
"gui": true,
"action": "btn:delete",
"icon": "design_delete"
"icon": "design_delete",
"hint": "Delete what is selected"
},
{
"id": "sk_line_t",
@@ -1056,7 +1099,8 @@
"gui": true,
"action": "key:L",
"family": "Line",
"icon": "design_line"
"icon": "design_line",
"hint": "Line — click start, then end"
},
{
"id": "sk_polyline",
@@ -1078,7 +1122,8 @@
"action": "fly:design_line#1",
"mode": "sketch",
"family": "Line",
"icon": "design_polyline"
"icon": "design_polyline",
"hint": "Click points; click first / right-click to close the loop"
},
{
"id": "sk_rect",
@@ -1100,7 +1145,8 @@
"gui": true,
"action": "key:R",
"family": "Rectangle",
"icon": "design_rect"
"icon": "design_rect",
"hint": "Rectangle — click two opposite corners"
},
{
"id": "sk_rect_center",
@@ -1122,7 +1168,8 @@
"action": "fly:design_rect#1",
"mode": "sketch",
"family": "Rectangle",
"icon": "design_crect"
"icon": "design_crect",
"hint": "Click center, then a corner"
},
{
"id": "sk_rect_oblique",
@@ -1144,7 +1191,8 @@
"action": "fly:design_rect#2",
"mode": "sketch",
"family": "Rectangle",
"icon": "design_rect_oblique"
"icon": "design_rect_oblique",
"hint": "Click two corners of one edge, then a point for the width"
},
{
"id": "sk_rect_rounded",
@@ -1166,7 +1214,8 @@
"action": "fly:design_rect#3",
"mode": "sketch",
"family": "Rectangle",
"icon": "design_rect_rounded"
"icon": "design_rect_rounded",
"hint": "Click two opposite corners, then a point for the corner radius"
},
{
"id": "sk_circle",
@@ -1188,7 +1237,8 @@
"gui": true,
"action": "key:C",
"family": "Circle",
"icon": "design_circle"
"icon": "design_circle",
"hint": "Circle — click center, then radius"
},
{
"id": "sk_circle_2pt",
@@ -1210,7 +1260,8 @@
"action": "fly:design_circle#1",
"mode": "sketch",
"family": "Circle",
"icon": "design_circle2pt"
"icon": "design_circle2pt",
"hint": "Click two ends of the diameter"
},
{
"id": "sk_circle_3pt",
@@ -1232,7 +1283,8 @@
"action": "fly:design_circle#2",
"mode": "sketch",
"family": "Circle",
"icon": "design_circle3pt"
"icon": "design_circle3pt",
"hint": "Click three points on the circle"
},
{
"id": "sk_arc_t",
@@ -1254,7 +1306,8 @@
"gui": true,
"action": "key:A",
"family": "Arc",
"icon": "design_arc3pt"
"icon": "design_arc3pt",
"hint": "Arc — click start, end, then a point"
},
{
"id": "sk_arc_tangent",
@@ -1276,7 +1329,8 @@
"action": "fly:design_arc3pt#1",
"mode": "sketch",
"family": "Arc",
"icon": "design_tangentarc"
"icon": "design_tangentarc",
"hint": "Click start (on the last entity) then end"
},
{
"id": "sk_arc_center",
@@ -1298,7 +1352,8 @@
"action": "fly:design_arc3pt#2",
"mode": "sketch",
"family": "Arc",
"icon": "design_arc_center"
"icon": "design_arc_center",
"hint": "Click center, then start, then a point for the end angle"
},
{
"id": "sk_slot",
@@ -1320,7 +1375,8 @@
"gui": true,
"action": "key:S",
"family": "Slot",
"icon": "design_slot"
"icon": "design_slot",
"hint": "Slot — two centerline ends, then end radius"
},
{
"id": "sk_slot_arc",
@@ -1342,7 +1398,8 @@
"action": "fly:design_slot#1",
"mode": "sketch",
"family": "Slot",
"icon": "design_slot_arc"
"icon": "design_slot_arc",
"hint": "Click center, start, end, then a point for the width"
},
{
"id": "sk_ellipse",
@@ -1364,7 +1421,8 @@
"gui": true,
"action": "key:E",
"family": "Ellipse",
"icon": "design_ellipse"
"icon": "design_ellipse",
"hint": "Ellipse — center, major end, minor point"
},
{
"id": "sk_ellipse_arc",
@@ -1386,7 +1444,8 @@
"action": "fly:design_ellipse#1",
"mode": "sketch",
"family": "Ellipse",
"icon": "design_ellipse_arc"
"icon": "design_ellipse_arc",
"hint": "Click center, major-axis end, minor point, then arc start and end"
},
{
"id": "sk_spline",
@@ -1407,7 +1466,8 @@
"refusal": null,
"gui": true,
"action": "key:B",
"icon": "design_bspline"
"icon": "design_bspline",
"hint": "Spline — click control points"
},
{
"id": "sk_poly_3",
@@ -1429,7 +1489,8 @@
"action": "btn:poly#3",
"mode": "sketch",
"family": "Polygon",
"icon": "design_polygon"
"icon": "design_polygon",
"hint": "Triangle — click centre, then a vertex"
},
{
"id": "sk_poly_4",
@@ -1451,7 +1512,8 @@
"action": "btn:poly#4",
"mode": "sketch",
"family": "Polygon",
"icon": "design_polygon"
"icon": "design_polygon",
"hint": "Square — click centre, then a vertex"
},
{
"id": "sk_poly_5",
@@ -1473,7 +1535,8 @@
"action": "btn:poly#5",
"mode": "sketch",
"family": "Polygon",
"icon": "design_polygon"
"icon": "design_polygon",
"hint": "Pentagon — click centre, then a vertex"
},
{
"id": "sk_polygon",
@@ -1495,7 +1558,8 @@
"gui": true,
"action": "btn:poly#6",
"family": "Polygon",
"icon": "design_polygon"
"icon": "design_polygon",
"hint": "Hexagon — click centre, then a vertex"
},
{
"id": "sk_poly_8",
@@ -1517,7 +1581,8 @@
"action": "btn:poly#8",
"mode": "sketch",
"family": "Polygon",
"icon": "design_polygon"
"icon": "design_polygon",
"hint": "Octagon — click centre, then a vertex"
},
{
"id": "sk_poly_12",
@@ -1539,7 +1604,8 @@
"action": "btn:poly#12",
"mode": "sketch",
"family": "Polygon",
"icon": "design_polygon"
"icon": "design_polygon",
"hint": "Dodecagon — click centre, then a vertex"
},
{
"id": "sk_poly_inscribed",
@@ -1561,7 +1627,8 @@
"action": "btn:polyfit#0",
"mode": "sketch",
"family": "Polygon",
"icon": "design_polygon"
"icon": "design_polygon",
"hint": "Measure the polygon to its corners (inscribed)"
},
{
"id": "sk_poly_circumscribed",
@@ -1583,7 +1650,8 @@
"action": "btn:polyfit#1",
"mode": "sketch",
"family": "Polygon",
"icon": "design_polygon"
"icon": "design_polygon",
"hint": "Measure the polygon to its flats (circumscribed)"
},
{
"id": "sk_point_t",
@@ -1604,7 +1672,8 @@
"refusal": null,
"gui": true,
"action": "key:P",
"icon": "design_point"
"icon": "design_point",
"hint": "Point — click to place"
},
{
"id": "sk_text",
@@ -1625,7 +1694,8 @@
"gui": true,
"action": "btn:text",
"mode": "sketch",
"icon": "design_text"
"icon": "design_text",
"hint": "Type text; its outline is added to this sketch as editable lines"
},
{
"id": "sk_svg",
@@ -1646,7 +1716,8 @@
"gui": true,
"action": "btn:svg",
"mode": "sketch",
"icon": "design_svg"
"icon": "design_svg",
"hint": "Import an SVG outline into this sketch as editable lines"
},
{
"id": "sk_offset",
@@ -1665,7 +1736,8 @@
"refusal": null,
"gui": true,
"action": "key:O",
"icon": "design_offset"
"icon": "design_offset",
"hint": "Offset — pick an entity, drag the distance"
},
{
"id": "sk_trim",
@@ -1684,7 +1756,8 @@
"refusal": null,
"gui": true,
"action": "key:T",
"icon": "design_trim"
"icon": "design_trim",
"hint": "Trim — click a segment to trim it"
},
{
"id": "sk_fillet",
@@ -1702,7 +1775,8 @@
"refusal": null,
"gui": true,
"action": "key:F",
"icon": "design_filletedge"
"icon": "design_filletedge",
"hint": "Fillet — pick two lines, set the radius"
},
{
"id": "sk_chamfer",
@@ -1720,7 +1794,8 @@
"refusal": null,
"gui": true,
"action": "key:H",
"icon": "design_chamfer"
"icon": "design_chamfer",
"hint": "Chamfer — pick two lines, set the distance"
},
{
"id": "sk_array",
@@ -1740,7 +1815,8 @@
"action": "fly:design_array#0",
"mode": "sketch",
"family": "Array",
"icon": "design_array"
"icon": "design_array",
"hint": "Pick entities, drag the spacing handle, click the count; click empty to apply"
},
{
"id": "sk_array_polar",
@@ -1760,7 +1836,8 @@
"action": "fly:design_array#1",
"mode": "sketch",
"family": "Array",
"icon": "design_polararray"
"icon": "design_polararray",
"hint": "Pick entities, drag the sweep handle, click the count; click empty to apply"
},
{
"id": "sk_mirror",
@@ -1779,7 +1856,8 @@
"refusal": null,
"gui": true,
"action": "key:M",
"icon": "design_mirror"
"icon": "design_mirror",
"hint": "Mirror — pick axis, then entities"
},
{
"id": "sk_move",
@@ -1800,7 +1878,8 @@
"gui": true,
"action": "fly:design_move#0",
"family": "Move",
"icon": "design_move"
"icon": "design_move",
"hint": "Pick entities, then drag the handle or click the distance; click empty to apply"
},
{
"id": "sk_rotate",
@@ -1821,7 +1900,8 @@
"action": "fly:design_move#1",
"mode": "sketch",
"family": "Move",
"icon": "design_rotate"
"icon": "design_rotate",
"hint": "Pick entities, then drag around the pivot or click the angle; click empty to apply"
},
{
"id": "sk_scale",
@@ -1842,7 +1922,8 @@
"action": "fly:design_move#2",
"mode": "sketch",
"family": "Move",
"icon": "design_scale"
"icon": "design_scale",
"hint": "Pick entities, then drag the handle or click the factor; click empty to apply"
},
{
"id": "sk_dimension",
@@ -1863,7 +1944,8 @@
"refusal": null,
"gui": true,
"action": "key:D",
"icon": "design_dimension"
"icon": "design_dimension",
"hint": "Dimension — click 2 points or an entity"
},
{
"id": "sk_constrain",
@@ -1883,7 +1965,8 @@
"refusal": null,
"gui": true,
"action": "key:K",
"icon": "design_constrain"
"icon": "design_constrain",
"hint": "Constrain the selected sketch entities to each other"
},
{
"id": "sk_construct",
@@ -1903,7 +1986,8 @@
"refusal": null,
"gui": true,
"action": "key:Q",
"icon": null
"icon": null,
"hint": "Toggle construction: geometry that guides but is never built"
},
{
"id": "sk_extend",
@@ -1922,7 +2006,8 @@
"refusal": null,
"gui": true,
"action": "key:X",
"icon": "design_extend"
"icon": "design_extend",
"hint": "Extend — click a line/arc to extend it"
},
{
"id": "sk_delete",
@@ -1942,7 +2027,8 @@
"refusal": null,
"gui": true,
"action": "btn:delete",
"icon": "design_delete"
"icon": "design_delete",
"hint": "Delete the selected sketch entities"
}
],
"chrome_only": {
+87 -86
View File
@@ -64,6 +64,7 @@ struct OfferVerb {
// grouping instead of flattening 19 create tools into one wall.
const char* family;
const char* icon; // resources/images name, or nullptr — the offer draws it beside the row
const char* hint; // what the verb does / what to click; shown on hover
};
// Row labels, in ratified order.
@@ -80,92 +81,92 @@ static const char* const kOfferRowNames[] = {
static const int kOfferRowCount = 8;
static const OfferVerb kOfferVerbs[] = {
{"sketch", "Sketch", 0, "Shift+S", "key:S+S", "Click a face or a reference plane in the viewport, then a sketch tool", 0x00000403u, 0, 0, false, false, nullptr, "design_sketch"},
{"extrude", "Extrude", 1, "Shift+E", "key:S+E", "Create a sketch, or pick a solid face, first", 0x00004002u, 0, 0, false, false, nullptr, "design_extrude"},
{"revolve", "Revolve", 1, "Shift+R", "key:S+R", "Create a sketch profile to revolve first", 0x00004000u, 0, 0, false, false, nullptr, "design_revolve"},
{"sweep", "Sweep", 1, "Shift+W", "key:S+W", "Create a profile sketch to sweep first", 0x00004000u, 0, 2, false, false, nullptr, "design_sweep"},
{"loft", "Loft", 1, "Shift+L", "key:S+L", "Create at least two profile sketches to loft", 0x00004000u, 0, 2, false, false, nullptr, "design_loft"},
{"thicken", "Thicken", 1, nullptr, "fly:material#4", "Thicken needs a solid body — add or import one first", 0x0000000au, 1, 0, false, false, nullptr, "design_thicken"},
{"rib", "Rib", 1, nullptr, "fly:material#5", "Rib needs a solid body — add or import one first", 0x00010000u, 1, 0, false, false, nullptr, "design_rib"},
{"boolean", "Union", 1, "Shift+B", "btn:bool#0", "Boolean needs two bodies — create or import a second solid", 0x00000200u, 2, 0, false, false, nullptr, "design_boolean"},
{"bool_subtract", "Subtract", 1, nullptr, "btn:bool#1", "Boolean needs two bodies — create or import a second solid", 0x00000200u, 2, 0, false, false, nullptr, "design_boolean"},
{"bool_intersect", "Intersect", 1, nullptr, "btn:bool#2", "Boolean needs two bodies — create or import a second solid", 0x00000200u, 2, 0, false, false, nullptr, "design_boolean"},
{"surf_extrude", "Surface Extrude", 1, "Shift+G", "key:S+G", "Create a sketch first", 0x00004000u, 0, 0, false, false, nullptr, "design_extrude"},
{"surf_revolve", "Surface Revolve", 1, nullptr, "fly:surface#1", "Create a sketch profile to revolve first", 0x00004000u, 0, 0, false, false, nullptr, "design_revolve"},
{"surf_loft", "Surface Loft", 1, nullptr, "fly:surface#2", "Create at least two profile sketches to loft", 0x00004000u, 0, 2, false, false, nullptr, "design_loft"},
{"surf_fill", "Surface Fill", 1, nullptr, "fly:surface#3", "Create a closed sketch first", 0x00004000u, 0, 0, false, false, nullptr, "design_surface"},
{"thicken_surf", "Thicken Surface", 1, nullptr, "fly:surface#5", "target is not a sheet body", 0x00000100u, 0, 0, true, false, nullptr, "design_thicken"},
{"hole", "Hole", 2, "Shift+H", "key:S+H", "Pick a face or a plane to drill into", 0x00000402u, 1, 0, false, false, nullptr, "design_hole"},
{"thread", "Thread", 2, "Shift+T", "key:S+T", "Pick a cylindrical surface (bore / outer) or a circular edge for a thread", 0x00000024u, 1, 0, false, false, nullptr, "design_thread"},
{"shell", "Shell", 2, "Shift+K", "key:S+K", "Shell needs a solid body", 0x00000082u, 1, 0, false, false, nullptr, "design_shell"},
{"cut", "Cut", 2, "Shift+X", "key:S+X", "Create a solid body to cut first", 0x00000480u, 1, 0, false, false, nullptr, "design_cut"},
{"split", "Split", 2, nullptr, nullptr, "Split needs a solid body", 0x00000080u, 1, 0, false, false, nullptr, nullptr},
{"fillet", "Fillet", 3, "Shift+F", "btn:dress#0", "Pick an edge to round", 0x000000b2u, 1, 0, false, false, nullptr, "design_filletedge"},
{"chamfer", "Chamfer", 3, nullptr, "btn:dress#1", "Pick an edge to bevel", 0x000000b2u, 1, 0, false, false, nullptr, "design_chamfer"},
{"draft", "Draft", 3, "Shift+D", "key:S+D", "Pick a face to taper", 0x0000000au, 1, 0, false, false, nullptr, "design_draft"},
{"surf_offset", "Surface Offset", 3, nullptr, "fly:surface#4", "target is not a sheet body", 0x00000100u, 0, 0, true, false, nullptr, "design_offset"},
{"pattern", "Linear pattern", 4, "Shift+N", "btn:pat#0", "Create a solid body to pattern first", 0x00006082u, 1, 0, false, false, nullptr, "design_array"},
{"pattern_circular", "Circular pattern", 4, nullptr, "btn:pat#1", "Create a solid body to pattern first", 0x00006082u, 1, 0, false, false, nullptr, "design_polararray"},
{"mirror", "Mirror", 4, "Shift+Z", "key:S+Z", "Mirror needs a body — add or import one first", 0x00000480u, 1, 0, false, false, nullptr, "design_mirror"},
{"pat_curve", "Pattern on Curve", 4, nullptr, nullptr, "Pattern on curve needs a body and a curve", 0x00000090u, 1, 0, false, false, nullptr, nullptr},
{"transform", "Move", 5, "Shift+Y", "key:S+Y", "Transform needs a body — add or import one first", 0x00002180u, 1, 0, false, false, nullptr, "design_move"},
{"mate", "Mate", 5, nullptr, "fly:placement#2", "A mate needs two coordinate systems", 0x00001202u, 2, 0, false, false, nullptr, "design_c_coincident"},
{"align", "Align to", 5, nullptr, nullptr, "Align needs a body", 0x00000002u, 1, 0, false, false, nullptr, nullptr},
{"plane", "Plane", 6, "Shift+P", "key:S+P", nullptr, 0x00000453u, 0, 0, false, false, nullptr, "design_plane"},
{"axis", "Axis", 6, "Shift+A", "key:S+A", nullptr, 0x00000057u, 0, 0, false, false, nullptr, "design_line"},
{"coordsys_v", "Coord Sys", 6, "Shift+C", "key:S+C", nullptr, 0x00000043u, 0, 0, false, false, nullptr, "design_point"},
{"helix", "Helix", 6, nullptr, "fly:plane#3", nullptr, 0x00000405u, 0, 0, false, false, nullptr, "design_thread"},
{"project", "Project", 6, nullptr, "fly:plane#4", "Project needs a body — add or import one first", 0x00000482u, 1, 0, false, false, nullptr, "design_sketch"},
{"measure", "Measure", 6, nullptr, nullptr, nullptr, 0x000b03feu, 0, 0, false, false, nullptr, nullptr},
{"mass_props", "Mass", 6, nullptr, "btn:mass", nullptr, 0x00000080u, 1, 0, false, false, nullptr, "info"},
{"interference", "Interference", 6, nullptr, nullptr, nullptr, 0x00000200u, 2, 0, false, false, nullptr, nullptr},
{"edit_feature", "Edit", 7, nullptr, "btn:edit", nullptr, 0x00007d8eu, 0, 0, false, false, nullptr, "design_edit"},
{"delete_face", "Delete Face", 7, nullptr, "fly:dressup#3", "Delete Face needs a body — add or import one first", 0x0000000eu, 1, 0, false, false, nullptr, "design_delete"},
{"colour", "Colour", 7, nullptr, "btn:colour", nullptr, 0x00000180u, 1, 0, false, false, nullptr, "color_palette"},
{"delete", "Delete", 7, "Del", "btn:delete", nullptr, 0x000f7f80u, 0, 0, false, false, nullptr, "design_delete"},
{"sk_line_t", "Line", 0, "L", "key:L", nullptr, 0x000f8000u, 0, 0, false, true, "Line", "design_line"},
{"sk_polyline", "Polyline", 0, nullptr, "fly:design_line#1", nullptr, 0x000f8000u, 0, 0, false, true, "Line", "design_polyline"},
{"sk_rect", "Corner rectangle", 0, "R", "key:R", nullptr, 0x000f8000u, 0, 0, false, true, "Rectangle", "design_rect"},
{"sk_rect_center", "Centre rectangle", 0, nullptr, "fly:design_rect#1", nullptr, 0x000f8000u, 0, 0, false, true, "Rectangle", "design_crect"},
{"sk_rect_oblique", "Oblique rectangle", 0, nullptr, "fly:design_rect#2", nullptr, 0x000f8000u, 0, 0, false, true, "Rectangle", "design_rect_oblique"},
{"sk_rect_rounded", "Rounded rectangle", 0, nullptr, "fly:design_rect#3", nullptr, 0x000f8000u, 0, 0, false, true, "Rectangle", "design_rect_rounded"},
{"sk_circle", "Centre circle", 0, "C", "key:C", nullptr, 0x000f8000u, 0, 0, false, true, "Circle", "design_circle"},
{"sk_circle_2pt", "2-point circle", 0, nullptr, "fly:design_circle#1", nullptr, 0x000f8000u, 0, 0, false, true, "Circle", "design_circle2pt"},
{"sk_circle_3pt", "3-point circle", 0, nullptr, "fly:design_circle#2", nullptr, 0x000f8000u, 0, 0, false, true, "Circle", "design_circle3pt"},
{"sk_arc_t", "3-point arc", 0, "A", "key:A", nullptr, 0x000f8000u, 0, 0, false, true, "Arc", "design_arc3pt"},
{"sk_arc_tangent", "Tangent arc", 0, nullptr, "fly:design_arc3pt#1", nullptr, 0x000f8000u, 0, 0, false, true, "Arc", "design_tangentarc"},
{"sk_arc_center", "Centre-point arc", 0, nullptr, "fly:design_arc3pt#2", nullptr, 0x000f8000u, 0, 0, false, true, "Arc", "design_arc_center"},
{"sk_slot", "Slot", 0, "S", "key:S", nullptr, 0x000f8000u, 0, 0, false, true, "Slot", "design_slot"},
{"sk_slot_arc", "Arc slot", 0, nullptr, "fly:design_slot#1", nullptr, 0x000f8000u, 0, 0, false, true, "Slot", "design_slot_arc"},
{"sk_ellipse", "Ellipse", 0, "E", "key:E", nullptr, 0x000f8000u, 0, 0, false, true, "Ellipse", "design_ellipse"},
{"sk_ellipse_arc", "Elliptical arc", 0, nullptr, "fly:design_ellipse#1", nullptr, 0x000f8000u, 0, 0, false, true, "Ellipse", "design_ellipse_arc"},
{"sk_spline", "Spline", 0, "B", "key:B", nullptr, 0x000f8000u, 0, 0, false, true, nullptr, "design_bspline"},
{"sk_poly_3", "Triangle", 0, nullptr, "btn:poly#3", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon"},
{"sk_poly_4", "Square", 0, nullptr, "btn:poly#4", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon"},
{"sk_poly_5", "Pentagon", 0, nullptr, "btn:poly#5", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon"},
{"sk_polygon", "Hexagon", 0, "G", "btn:poly#6", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon"},
{"sk_poly_8", "Octagon", 0, nullptr, "btn:poly#8", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon"},
{"sk_poly_12", "Dodecagon", 0, nullptr, "btn:poly#12", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon"},
{"sk_poly_inscribed", "Inscribed", 0, nullptr, "btn:polyfit#0", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon"},
{"sk_poly_circumscribed", "Circumscribed", 0, nullptr, "btn:polyfit#1", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon"},
{"sk_point_t", "Point", 0, "P", "key:P", nullptr, 0x000f8000u, 0, 0, false, true, nullptr, "design_point"},
{"sk_text", "Text", 0, nullptr, "btn:text", nullptr, 0x000f8000u, 0, 0, false, true, nullptr, "design_text"},
{"sk_svg", "SVG", 0, nullptr, "btn:svg", nullptr, 0x000f8000u, 0, 0, false, true, nullptr, "design_svg"},
{"sk_offset", "Offset", 1, "O", "key:O", nullptr, 0x000b0000u, 0, 0, false, true, nullptr, "design_offset"},
{"sk_trim", "Trim", 2, "T", "key:T", nullptr, 0x000b0000u, 0, 0, false, true, nullptr, "design_trim"},
{"sk_fillet", "Fillet", 3, "F", "key:F", nullptr, 0x00090000u, 0, 0, false, true, nullptr, "design_filletedge"},
{"sk_chamfer", "Chamfer", 3, "H", "key:H", nullptr, 0x00090000u, 0, 0, false, true, nullptr, "design_chamfer"},
{"sk_array", "Linear array", 4, nullptr, "fly:design_array#0", nullptr, 0x000b0000u, 0, 0, false, true, "Array", "design_array"},
{"sk_array_polar", "Polar array", 4, nullptr, "fly:design_array#1", nullptr, 0x000b0000u, 0, 0, false, true, "Array", "design_polararray"},
{"sk_mirror", "Mirror", 4, "M", "key:M", nullptr, 0x000b0000u, 0, 0, false, true, nullptr, "design_mirror"},
{"sk_move", "Move", 5, nullptr, "fly:design_move#0", nullptr, 0x000f0000u, 0, 0, false, true, "Move", "design_move"},
{"sk_rotate", "Rotate", 5, nullptr, "fly:design_move#1", nullptr, 0x000f0000u, 0, 0, false, true, "Move", "design_rotate"},
{"sk_scale", "Scale", 5, nullptr, "fly:design_move#2", nullptr, 0x000f0000u, 0, 0, false, true, "Move", "design_scale"},
{"sk_dimension", "Dimension", 6, "D", "key:D", nullptr, 0x000f8000u, 0, 0, false, true, nullptr, "design_dimension"},
{"sk_constrain", "Constrain", 6, "K", "key:K", nullptr, 0x000f0000u, 0, 0, false, true, nullptr, "design_constrain"},
{"sk_construct", "Construction", 6, "Q", "key:Q", nullptr, 0x000b8000u, 0, 0, false, true, nullptr, nullptr},
{"sk_extend", "Extend", 7, "X", "key:X", nullptr, 0x000b0000u, 0, 0, false, true, nullptr, "design_extend"},
{"sk_delete", "Delete", 7, "Del", "btn:delete", nullptr, 0x000f0000u, 0, 0, false, true, nullptr, "design_delete"},
{"sketch", "Sketch", 0, "Shift+S", "key:S+S", "Click a face or a reference plane in the viewport, then a sketch tool", 0x00000403u, 0, 0, false, false, nullptr, "design_sketch", "Click a face or a reference plane, then pick a drawing tool"},
{"extrude", "Extrude", 1, "Shift+E", "key:S+E", "Create a sketch, or pick a solid face, first", 0x00004002u, 0, 0, false, false, nullptr, "design_extrude", "Extrude a sketch profile, or push/pull a picked face"},
{"revolve", "Revolve", 1, "Shift+R", "key:S+R", "Create a sketch profile to revolve first", 0x00004000u, 0, 0, false, false, nullptr, "design_revolve", "Revolve a profile about an axis"},
{"sweep", "Sweep", 1, "Shift+W", "key:S+W", "Create a profile sketch to sweep first", 0x00004000u, 0, 2, false, false, nullptr, "design_sweep", "Sweep a profile along a path"},
{"loft", "Loft", 1, "Shift+L", "key:S+L", "Create at least two profile sketches to loft", 0x00004000u, 0, 2, false, false, nullptr, "design_loft", "Loft (skin) between two or more profiles"},
{"thicken", "Thicken", 1, nullptr, "fly:material#4", "Thicken needs a solid body — add or import one first", 0x0000000au, 1, 0, false, false, nullptr, "design_thicken", "Offset a solid face into a thin plate (new body)"},
{"rib", "Rib", 1, nullptr, "fly:material#5", "Rib needs a solid body — add or import one first", 0x00010000u, 1, 0, false, false, nullptr, "design_rib", "Grow a thin wall from an open sketch line, fused to a body"},
{"boolean", "Union", 1, "Shift+B", "btn:bool#0", "Boolean needs two bodies — create or import a second solid", 0x00000200u, 2, 0, false, false, nullptr, "design_boolean", "Fuse the tool body into the target — one solid, no seam"},
{"bool_subtract", "Subtract", 1, nullptr, "btn:bool#1", "Boolean needs two bodies — create or import a second solid", 0x00000200u, 2, 0, false, false, nullptr, "design_boolean", "Cut the tool body out of the target"},
{"bool_intersect", "Intersect", 1, nullptr, "btn:bool#2", "Boolean needs two bodies — create or import a second solid", 0x00000200u, 2, 0, false, false, nullptr, "design_boolean", "Keep only where the two bodies overlap"},
{"surf_extrude", "Surface Extrude", 1, "Shift+G", "key:S+G", "Create a sketch first", 0x00004000u, 0, 0, false, false, nullptr, "design_extrude", "Extrude a sketch into a sheet body (no end caps)"},
{"surf_revolve", "Surface Revolve", 1, nullptr, "fly:surface#1", "Create a sketch profile to revolve first", 0x00004000u, 0, 0, false, false, nullptr, "design_revolve", "Revolve a sketch profile into a sheet body"},
{"surf_loft", "Surface Loft", 1, nullptr, "fly:surface#2", "Create at least two profile sketches to loft", 0x00004000u, 0, 2, false, false, nullptr, "design_loft", "Loft (skin) between 2+ profiles, open (no end caps)"},
{"surf_fill", "Surface Fill", 1, nullptr, "fly:surface#3", "Create a closed sketch first", 0x00004000u, 0, 0, false, false, nullptr, "design_surface", "Fill a sketch boundary with a smooth face"},
{"thicken_surf", "Thicken Surface", 1, nullptr, "fly:surface#5", "target is not a sheet body", 0x00000100u, 0, 0, true, false, nullptr, "design_thicken", "Thicken a sheet body into a solid"},
{"hole", "Hole", 2, "Shift+H", "key:S+H", "Pick a face or a plane to drill into", 0x00000402u, 1, 0, false, false, nullptr, "design_hole", "Drill a hole, centred on a picked face or placed on a plane"},
{"thread", "Thread", 2, "Shift+T", "key:S+T", "Pick a cylindrical surface (bore / outer) or a circular edge for a thread", 0x00000024u, 1, 0, false, false, nullptr, "design_thread", "Thread a cylindrical surface (inner bore / outer) or a circular edge"},
{"shell", "Shell", 2, "Shift+K", "key:S+K", "Shell needs a solid body", 0x00000082u, 1, 0, false, false, nullptr, "design_shell", "Hollow the body to a wall thickness, opening a picked face"},
{"cut", "Cut", 2, "Shift+X", "key:S+X", "Create a solid body to cut first", 0x00000480u, 1, 0, false, false, nullptr, "design_cut", "Split the body with a plane; set the offset in the card"},
{"split", "Split", 2, nullptr, nullptr, "Split needs a solid body", 0x00000080u, 1, 0, false, false, nullptr, nullptr, "Split the body into separate solids"},
{"fillet", "Fillet", 3, "Shift+F", "btn:dress#0", "Pick an edge to round", 0x000000b2u, 1, 0, false, false, nullptr, "design_filletedge", "Pick an edge, then drag the radius arrow or type it"},
{"chamfer", "Chamfer", 3, nullptr, "btn:dress#1", "Pick an edge to bevel", 0x000000b2u, 1, 0, false, false, nullptr, "design_chamfer", "Pick an edge, then drag the distance arrow or type it"},
{"draft", "Draft", 3, "Shift+D", "key:S+D", "Pick a face to taper", 0x0000000au, 1, 0, false, false, nullptr, "design_draft", "Tilt a picked face by a draft angle"},
{"surf_offset", "Surface Offset", 3, nullptr, "fly:surface#4", "target is not a sheet body", 0x00000100u, 0, 0, true, false, nullptr, "design_offset", "Offset a sheet body's shell by a signed distance"},
{"pattern", "Linear pattern", 4, "Shift+N", "btn:pat#0", "Create a solid body to pattern first", 0x00006082u, 1, 0, false, false, nullptr, "design_array", "Repeat the body along a direction — drag the spacing, set the count"},
{"pattern_circular", "Circular pattern", 4, nullptr, "btn:pat#1", "Create a solid body to pattern first", 0x00006082u, 1, 0, false, false, nullptr, "design_polararray", "Repeat the body around an axis — set the count and sweep"},
{"mirror", "Mirror", 4, "Shift+Z", "key:S+Z", "Mirror needs a body — add or import one first", 0x00000480u, 1, 0, false, false, nullptr, "design_mirror", "Reflect a body about a plane"},
{"pat_curve", "Pattern on Curve", 4, nullptr, nullptr, "Pattern on curve needs a body and a curve", 0x00000090u, 1, 0, false, false, nullptr, nullptr, "Repeat the body along a picked curve"},
{"transform", "Move", 5, "Shift+Y", "key:S+Y", "Transform needs a body — add or import one first", 0x00002180u, 1, 0, false, false, nullptr, "design_move", "Move and/or rotate an existing body"},
{"mate", "Mate", 5, nullptr, "fly:placement#2", "A mate needs two coordinate systems", 0x00001202u, 2, 0, false, false, nullptr, "design_c_coincident", "Assembly: align two CoordSys features (fastened, planar, revolute, slider, cylindrical)"},
{"align", "Align to", 5, nullptr, nullptr, "Align needs a body", 0x00000002u, 1, 0, false, false, nullptr, nullptr, "Align the body to a picked face or plane"},
{"plane", "Plane", 6, "Shift+P", "key:S+P", nullptr, 0x00000453u, 0, 0, false, false, nullptr, "design_plane", "Reference plane (offset / tilt / midplane / tangent / two edges / coincident)"},
{"axis", "Axis", 6, "Shift+A", "key:S+A", nullptr, 0x00000057u, 0, 0, false, false, nullptr, "design_line", "Datum axis (two points, face normal, cylinder centerline, two planes, along edge)"},
{"coordsys_v", "Coord Sys", 6, "Shift+C", "key:S+C", nullptr, 0x00000043u, 0, 0, false, false, nullptr, "design_point", "Datum coordinate system (world point, or face + direction edge)"},
{"helix", "Helix", 6, nullptr, "fly:plane#3", nullptr, 0x00000405u, 0, 0, false, false, nullptr, "design_thread", "Helical curve (spring path) — use as a sweep path for coils / springs / augers"},
{"project", "Project", 6, nullptr, "fly:plane#4", "Project needs a body — add or import one first", 0x00000482u, 1, 0, false, false, nullptr, "design_sketch", "Project body edges onto a plane as sketch entities"},
{"measure", "Measure", 6, nullptr, nullptr, nullptr, 0x000b03feu, 0, 0, false, false, nullptr, nullptr, "Measure between the picked points, edges or faces"},
{"mass_props", "Mass", 6, nullptr, "btn:mass", nullptr, 0x00000080u, 1, 0, false, false, nullptr, "info", "Report the volume and surface area of the selected body"},
{"interference", "Interference", 6, nullptr, nullptr, nullptr, 0x00000200u, 2, 0, false, false, nullptr, nullptr, "Check whether two bodies overlap — reports, changes nothing"},
{"edit_feature", "Edit", 7, nullptr, "btn:edit", nullptr, 0x00007d8eu, 0, 0, false, false, nullptr, "design_edit", "Reopen the selected feature to change what it was made from"},
{"delete_face", "Delete Face", 7, nullptr, "fly:dressup#3", "Delete Face needs a body — add or import one first", 0x0000000eu, 1, 0, false, false, nullptr, "design_delete", "Remove faces from a body and heal the solid"},
{"colour", "Colour", 7, nullptr, "btn:colour", nullptr, 0x00000180u, 1, 0, false, false, nullptr, "color_palette", "Set the selected body's display colour"},
{"delete", "Delete", 7, "Del", "btn:delete", nullptr, 0x000f7f80u, 0, 0, false, false, nullptr, "design_delete", "Delete what is selected"},
{"sk_line_t", "Line", 0, "L", "key:L", nullptr, 0x000f8000u, 0, 0, false, true, "Line", "design_line", "Line — click start, then end"},
{"sk_polyline", "Polyline", 0, nullptr, "fly:design_line#1", nullptr, 0x000f8000u, 0, 0, false, true, "Line", "design_polyline", "Click points; click first / right-click to close the loop"},
{"sk_rect", "Corner rectangle", 0, "R", "key:R", nullptr, 0x000f8000u, 0, 0, false, true, "Rectangle", "design_rect", "Rectangle — click two opposite corners"},
{"sk_rect_center", "Centre rectangle", 0, nullptr, "fly:design_rect#1", nullptr, 0x000f8000u, 0, 0, false, true, "Rectangle", "design_crect", "Click center, then a corner"},
{"sk_rect_oblique", "Oblique rectangle", 0, nullptr, "fly:design_rect#2", nullptr, 0x000f8000u, 0, 0, false, true, "Rectangle", "design_rect_oblique", "Click two corners of one edge, then a point for the width"},
{"sk_rect_rounded", "Rounded rectangle", 0, nullptr, "fly:design_rect#3", nullptr, 0x000f8000u, 0, 0, false, true, "Rectangle", "design_rect_rounded", "Click two opposite corners, then a point for the corner radius"},
{"sk_circle", "Centre circle", 0, "C", "key:C", nullptr, 0x000f8000u, 0, 0, false, true, "Circle", "design_circle", "Circle — click center, then radius"},
{"sk_circle_2pt", "2-point circle", 0, nullptr, "fly:design_circle#1", nullptr, 0x000f8000u, 0, 0, false, true, "Circle", "design_circle2pt", "Click two ends of the diameter"},
{"sk_circle_3pt", "3-point circle", 0, nullptr, "fly:design_circle#2", nullptr, 0x000f8000u, 0, 0, false, true, "Circle", "design_circle3pt", "Click three points on the circle"},
{"sk_arc_t", "3-point arc", 0, "A", "key:A", nullptr, 0x000f8000u, 0, 0, false, true, "Arc", "design_arc3pt", "Arc — click start, end, then a point"},
{"sk_arc_tangent", "Tangent arc", 0, nullptr, "fly:design_arc3pt#1", nullptr, 0x000f8000u, 0, 0, false, true, "Arc", "design_tangentarc", "Click start (on the last entity) then end"},
{"sk_arc_center", "Centre-point arc", 0, nullptr, "fly:design_arc3pt#2", nullptr, 0x000f8000u, 0, 0, false, true, "Arc", "design_arc_center", "Click center, then start, then a point for the end angle"},
{"sk_slot", "Slot", 0, "S", "key:S", nullptr, 0x000f8000u, 0, 0, false, true, "Slot", "design_slot", "Slot — two centerline ends, then end radius"},
{"sk_slot_arc", "Arc slot", 0, nullptr, "fly:design_slot#1", nullptr, 0x000f8000u, 0, 0, false, true, "Slot", "design_slot_arc", "Click center, start, end, then a point for the width"},
{"sk_ellipse", "Ellipse", 0, "E", "key:E", nullptr, 0x000f8000u, 0, 0, false, true, "Ellipse", "design_ellipse", "Ellipse — center, major end, minor point"},
{"sk_ellipse_arc", "Elliptical arc", 0, nullptr, "fly:design_ellipse#1", nullptr, 0x000f8000u, 0, 0, false, true, "Ellipse", "design_ellipse_arc", "Click center, major-axis end, minor point, then arc start and end"},
{"sk_spline", "Spline", 0, "B", "key:B", nullptr, 0x000f8000u, 0, 0, false, true, nullptr, "design_bspline", "Spline — click control points"},
{"sk_poly_3", "Triangle", 0, nullptr, "btn:poly#3", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon", "Triangle — click centre, then a vertex"},
{"sk_poly_4", "Square", 0, nullptr, "btn:poly#4", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon", "Square — click centre, then a vertex"},
{"sk_poly_5", "Pentagon", 0, nullptr, "btn:poly#5", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon", "Pentagon — click centre, then a vertex"},
{"sk_polygon", "Hexagon", 0, "G", "btn:poly#6", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon", "Hexagon — click centre, then a vertex"},
{"sk_poly_8", "Octagon", 0, nullptr, "btn:poly#8", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon", "Octagon — click centre, then a vertex"},
{"sk_poly_12", "Dodecagon", 0, nullptr, "btn:poly#12", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon", "Dodecagon — click centre, then a vertex"},
{"sk_poly_inscribed", "Inscribed", 0, nullptr, "btn:polyfit#0", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon", "Measure the polygon to its corners (inscribed)"},
{"sk_poly_circumscribed", "Circumscribed", 0, nullptr, "btn:polyfit#1", nullptr, 0x000f8000u, 0, 0, false, true, "Polygon", "design_polygon", "Measure the polygon to its flats (circumscribed)"},
{"sk_point_t", "Point", 0, "P", "key:P", nullptr, 0x000f8000u, 0, 0, false, true, nullptr, "design_point", "Point — click to place"},
{"sk_text", "Text", 0, nullptr, "btn:text", nullptr, 0x000f8000u, 0, 0, false, true, nullptr, "design_text", "Type text; its outline is added to this sketch as editable lines"},
{"sk_svg", "SVG", 0, nullptr, "btn:svg", nullptr, 0x000f8000u, 0, 0, false, true, nullptr, "design_svg", "Import an SVG outline into this sketch as editable lines"},
{"sk_offset", "Offset", 1, "O", "key:O", nullptr, 0x000b0000u, 0, 0, false, true, nullptr, "design_offset", "Offset — pick an entity, drag the distance"},
{"sk_trim", "Trim", 2, "T", "key:T", nullptr, 0x000b0000u, 0, 0, false, true, nullptr, "design_trim", "Trim — click a segment to trim it"},
{"sk_fillet", "Fillet", 3, "F", "key:F", nullptr, 0x00090000u, 0, 0, false, true, nullptr, "design_filletedge", "Fillet — pick two lines, set the radius"},
{"sk_chamfer", "Chamfer", 3, "H", "key:H", nullptr, 0x00090000u, 0, 0, false, true, nullptr, "design_chamfer", "Chamfer — pick two lines, set the distance"},
{"sk_array", "Linear array", 4, nullptr, "fly:design_array#0", nullptr, 0x000b0000u, 0, 0, false, true, "Array", "design_array", "Pick entities, drag the spacing handle, click the count; click empty to apply"},
{"sk_array_polar", "Polar array", 4, nullptr, "fly:design_array#1", nullptr, 0x000b0000u, 0, 0, false, true, "Array", "design_polararray", "Pick entities, drag the sweep handle, click the count; click empty to apply"},
{"sk_mirror", "Mirror", 4, "M", "key:M", nullptr, 0x000b0000u, 0, 0, false, true, nullptr, "design_mirror", "Mirror — pick axis, then entities"},
{"sk_move", "Move", 5, nullptr, "fly:design_move#0", nullptr, 0x000f0000u, 0, 0, false, true, "Move", "design_move", "Pick entities, then drag the handle or click the distance; click empty to apply"},
{"sk_rotate", "Rotate", 5, nullptr, "fly:design_move#1", nullptr, 0x000f0000u, 0, 0, false, true, "Move", "design_rotate", "Pick entities, then drag around the pivot or click the angle; click empty to apply"},
{"sk_scale", "Scale", 5, nullptr, "fly:design_move#2", nullptr, 0x000f0000u, 0, 0, false, true, "Move", "design_scale", "Pick entities, then drag the handle or click the factor; click empty to apply"},
{"sk_dimension", "Dimension", 6, "D", "key:D", nullptr, 0x000f8000u, 0, 0, false, true, nullptr, "design_dimension", "Dimension — click 2 points or an entity"},
{"sk_constrain", "Constrain", 6, "K", "key:K", nullptr, 0x000f0000u, 0, 0, false, true, nullptr, "design_constrain", "Constrain the selected sketch entities to each other"},
{"sk_construct", "Construction", 6, "Q", "key:Q", nullptr, 0x000b8000u, 0, 0, false, true, nullptr, nullptr, "Toggle construction: geometry that guides but is never built"},
{"sk_extend", "Extend", 7, "X", "key:X", nullptr, 0x000b0000u, 0, 0, false, true, nullptr, "design_extend", "Extend — click a line/arc to extend it"},
{"sk_delete", "Delete", 7, "Del", "btn:delete", nullptr, 0x000f0000u, 0, 0, false, true, nullptr, "design_delete", "Delete the selected sketch entities"},
};
static const int kOfferVerbCount = 86;
File diff suppressed because it is too large Load Diff
+4
View File
@@ -624,6 +624,10 @@ private:
std::map<std::string, std::function<void()>> m_verb_actions;
// Append an offer row with its toolbar glyph. The bitmap must be set BEFORE Append —
// wxGTK builds the GtkMenuItem there and only makes an image item if one is present.
// Every status write goes through here so long hints wrap instead of clipping.
void set_status(const wxString& text);
wxString idle_hint() const; // what to say when nothing is selected
wxMenuItem* append_offer_item(wxMenu* menu, int id, const wxString& text,
const struct OfferVerb& v);
void show_offer_menu(const wxPoint& screen_pos);