- LAYERS opens the Layer Manager as a dockable pallet instead of a modal
dialog with a darkened backdrop. It floats over the middle of the
drawing the first time and keeps its place after that; LAYERS again
(or its close button) hides it. The table keeps its natural width and
scrolls sideways when the pallet is narrower, and the Name column
divider now drags through the dock's pointer capture. Ctrl+A selects
all layers while a layer row is selected in the open pallet.
- The Layer Manager is listed in the tab-row pallet menu like the others.
- Double-clicking a docked title bar floats the panel beside its edge;
double-clicking a floating title bar docks the panel on the side its
title bar faces.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
- Dropping on a docked pallet now stacks it above or below over the top
and bottom 35 % of the slot; only the middle 30 % makes it a tab.
- Tabs show the pallet icon (title as tooltip), aligned to the left.
Every docked slot has the tab row, so its menu is always reachable.
- A menu button at the right of the tab row lists every pallet with a
check mark for those shown in this slot. Checking one opens it as a
tab here (moving it from wherever it was docked); unchecking hides it
and keeps its tab for next time.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
- Dragging a tab along its slot's tab strip moves it to the gap under the
pointer; the drop preview shows the new tab order. A panel dragged from
elsewhere onto a tab strip lands at that position too. A drop in the
middle of the slot still appends a newcomer and leaves a member where
it is.
- All tabs of a slot share one width: a joining panel takes the slot's
width, resizing or resetting one tab sizes them all, and slots sized
apart by older configs render at their widest tab. Switching tabs no
longer changes the column width.
- Hovering an auto-hide rail raises its slot without turning the rail
blue.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
- Docked title bars show the pin and close only while the pointer is
over the bar; the bar keeps a fixed height so nothing jumps.
- Auto-hide on is drawn as a 30° tilted pin (new pin_active.svg)
instead of a coloured button background, on docked and floating bars.
- A floating panel's resize grip sits in the bottom corner away from its
title bar. With the bar on the right it is bottom-left (new mirrored
resize_left.svg) and resizing from there keeps the right edge fixed.
The bar stays on its side while resizing.
- While a floating panel is dragged, only the drop preview shows it; the
panel no longer stays drawn at its old place.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
Every docked panel now shows its title bar flush along the top, like the
Properties panel: dock::frame takes the title bar separately and pads
only the content below it.
A floating panel drops its horizontal title bar for a vertical one on
the side facing the nearer workspace edge. Close and the auto-hide pin
sit at the top; the panel's icon sits at the bottom with the title
reading upward above it. The free part of the bar drags the panel. With
auto-hide on, a floating panel shrinks to its title bar until hovered.
Panel views take a dock::Chrome (auto-collapse plus floating) in place
of the bare auto-collapse flag, so the shared title bar knows when to
step aside.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
Panels can now float over the workspace, share a docked slot as tabs,
and split an edge at heights the user picks.
- Dropping a panel away from the edges floats it at the pointer. Floating
panels move by their title bar, resize from a corner grip, and come to
the front when clicked.
- Dropping in the top or bottom quarter of a docked slot docks the panel
above or below it, as before. Dropping in the middle adds the panel as
a tab of that slot. Pressing a tab shows that panel; dragging a tab
pulls the panel out again.
- While dragging, a blue ghost previews the result: the new slot, the
slot with its future tab row, or the floating window.
- A splitter between stacked slots sets their heights; double-click it
to make the slots equal again. Heights persist.
- A press only becomes a drag after 5 px of movement, so clicking a title
bar or tab never moves the panel.
The persisted layout now stores each edge as tab groups with a height
weight, plus a list of floating panels. Configs with the old
bare-panel-id stacks still load as single-panel slots.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
- Cargo: drop the fork patches; codec 8e93175, kernel 0665fc9, graph
3b91e67 in every manifest and lock.
- A swept surface's expression link is written through set_entity_xdata,
so OCS_SWEEP_EXPRESSION has its APPID record and the record its handle.
- Applying the whole named-parameter table also rebuilds the swept
surfaces linked to expressions, not only a single-row edit.
- swept_surface_entity keeps its doc comment.
- The native-constraint tests find a scope's network through its own
dictionary, where it is now stored.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A closed 3D polyline profile that does not lie in one plane sweeps a
surface with the reference's refusals. Swept surfaces made with an
Expression scale or twist follow the named parameters, and reference
surfaces linked through their associative action are picked up on open.
Saving keeps the associative actions the constraint graph does not
rebuild and stores each scope network through its own dictionary.
Kernel 23138fc, codec 64fe2a6.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- An open path is swept from its end nearest the pick point (in plan), as
the reference does; the record keeps the original path and the placed
frame marks the start.
- Kernel from ramox81/cadkernel 1df75f5: one face per path run for
twisted, scaled and spline sweeps, placed records swept from the placed
end, end caps without pcurves.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The refused-path message split its format string across a raw line
break; it uses \n. The reference-length and new-length prompts SWEEP no
longer shows leave the catalog and all 21 locales. Lines past the width
limit in the UPDATEFIELD and automation select changes are wrapped.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Eight messages with %{name} arguments went through the positional
formatter, which printed "%3" for a count, and their catalog entries
held %__ocs_fmt_N__ where the named form is expected. They take named
arguments now, and the entries — and those of the selection and HATCHEDIT
prompts with the same fault — use __ocs_arg_<name>__.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Ctrl+click on a composite selects it with the solid under the cursor as
the one its palette and grips edit: the solid whose own surface passes
through the picked point. With its history shown, a composite draws the
edges of the solids its booleans joined, each where it sits.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
grips lists the selection's grips; grip_drag moves one to a world point
through the viewport's own grip gesture with snaps, ortho and polar off;
click presses the left button where a world point shows, optionally with
Ctrl and/or Shift held.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
With SOLIDHIST on, UNION, SUBTRACT and INTERSECT no longer reduce the
result's history to a frozen body: each solid's history joins the
result's under a boolean step, in the order the result applied them.
The Properties palette lists a composite's solids under Operand; the one
chosen shows its own geometry rows and grips, placed where it sits in
the composite, and editing it replays the whole tree. A composite read
from a file keeps its saved body; the tree is replayed only on edits.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- Scale and Twist take an Expression evaluated with the drawing's
parameters; invalid input prints the reference message and asks again.
- The scale and twist prompts use the reference wording and defaults.
- The SWEEP prompts and refusal messages are in the locale catalog with
translations in every locale.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- 3D polyline profiles are recorded as wire bodies, like 3D polyline paths.
- Refused sweeps print the modeling error code and "Unable to sweep N
selected objects."; a scaled sweep rejects closed and cornered spatial
paths with the reference messages and asks for the path again.
- Scale > Reference asks for start and end reference lengths (start / end).
- Bank stays on for later sweeps until a twist angle is entered.
- Refused twist/scale edits in Properties print the modeling error code.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Display gets a command line text colour (blank keeps the theme's); it
covers history, prompts and the input, while errors stay red. Files
lists the fonts folder that text resolution searches, so .shx files can
be added by hand; opening it creates it first.
Discussions #1493, #1372
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Before a grip is picked, the crosshair now jumps to the grip under it, so
the click lands where the marker shows.
Discussion #1557
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The no-selection panel showed only the AC code. It now reads e.g.
"AC1032 (2018+)", from the version the file was opened as.
Discussion #1442
Co-Authored-By: Claude Opus 5.5 <[email protected]>
An aggregate of irregular stones on a 25.4 tile, built from edges whose
slopes repeat on the tile so every stone closes.
Discussion #1533
Co-Authored-By: Claude Opus 5.5 <[email protected]>
3DROTATE (ROTATE3D) took the drawing's rotation path, so a polyline only
turned in its own plane. It now asks for a base point, an axis — X, Y, Z
or a second point — and an angle, and rotates the selection about that
axis in space.
Fixes#1641
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The dimension's own block parts were mirrored with their text, so the
measurement read backwards. Text orientation is kept under reflection,
the same as TEXT and MTEXT with MIRRTEXT off.
Fixes#1639
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Center and Quadrant found nothing on a polyline's bulge segments: the
lightweight and heavy polylines carried no snap points for them, and a
polyline split into several wires kept its points on one piece whose box
the others' never reached. Each arc segment now carries its centre and
quadrants, hovering the segment offers its centre, and a wire's box
covers its snap points.
Fixes#1640
Co-Authored-By: Claude Opus 5.5 <[email protected]>
DimensionPreview drew identical generic triangles regardless of dimblk/dimblk1/dimblk2. It now resolves each end through the shared arrow_from_block_name mapping (widened to pub(crate)) and draws per-end glyphs, keeping DIMTSZ tick precedence. Tests: arrow_name_mapping_covers_preview_kinds pins the shared contract; 2 preview_arrow_tests pin per-end resolution (RED first). Full suite: 1989 passed / 0 failed / 25 ignored.
DsSetHandle for the first arrowhead also overwrote the second, destroying split-arrowhead configurations. The second write was a drive-by from overhaul 25515fa3; the Dimsah toggle has its own null-guarded init. Test: dimblk1_pick_leaves_dimblk2_alone pins per-end independence (RED first). Full suite: 1989 passed / 0 failed / 25 ignored.
SelectionState now holds view, gesture, input, menu and orbit sub-structs; all 450 access sites updated mechanically with no behavior change. Deletes three write-only dead fields (box_last, box_last_crossing, poly_last_crossing). Hand-rolled clears in commands and dim_viewport route through the new clear methods; bench fixture updated. Full suite: 1976 passed / 0 failed / 25 ignored.
The two per-frame ViewCube blocks rebuilt the named-UCS name list (N String clones plus a Vec) every frame; now Scene::cached_ucs_names memoises it behind ucs_epoch and the picker takes the Arc, so frames cost a refcount bump. Bumped on UCS SAVE, UCS DELETE, RENAME UCS, record-API ucss patch, file-open, and undo Full-swap. Tests: cached_ucs_names_returns_same_arc_until_bump pins the hit path; cached_ucs_names_invalidated_by_bump pins rebuild with new content. Full suite: 1976 passed / 0 failed / 25 ignored.
It stamps sheet set data, which the web build does not have; the wasm
check failed once #1627 split it out of prepare_native_save.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Sweep history records in the reference layout.
Pins resolved to upstream: codec bff95f5 (#93, #94, #95, #96, #97 and
review fixes), kernel 6146d31 (#75 and review fixes), graph 9635ba7.
- main already rebuilt an edited table's block; the PR added a second
loop after it that could never fire. Formula refresh and the block
cache bump now live in the one loop.
- Formula refresh copies the drawing only for a table that has a field.
- A field cell lays its text out once and boxes it from those cells.
- A zero text height at one level falls through to the next instead of
ending the lookup.
- Field box constants and BACKGROUND keep their own doc comments.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- One visible-named LRM constant (ttf_glyph) instead of two invisible
literals. Stroke and SDF text skip it, so a right-to-left script the
shaper does not handle no longer gets a 6-unit gap per mark; vertical
MTEXT does not insert it at all.
- Shaped cells keep a cluster the shaper merged into the leading mark.
- The always-false RTL paragraph flag, its indent/anchor branches and the
unused reorder_line_atoms are gone; its test now covers reorder_rtl_runs.
- Underline, overline and strike follow each drawn run of a mixed word.
- Justify/distribute count only the gaps the measured width holds.
- The two RTL alignment tests assert the new left-to-right behaviour;
glyph_boxes keeps its own doc comment.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- UPDATEFIELD stays the command main already had (Select objects, undo,
locale strings); it now takes the PR's reach — a block reference's
attributes and block definition, a table's cell texts — and reports
the fields that really changed. The PR's second implementation and its
duplicate registration are gone.
- FIELDEVAL's range error goes through the locale catalog.
- Field boxes: no slicing inside a character, one layout per multi-line
attribute, and TEXT boxes scale about the annotative reference point
like the glyphs do. Comment and indentation put back where they belong.
- bump_text_hosts classifies every host in one pass over the drawing
instead of scanning all layouts and blocks per host.
Co-Authored-By: Claude Opus 5.5 <[email protected]>