- Auto-hide is a setting of the left / right edge rather than of each
pallet: the pin on any docked pallet turns it on for its whole edge,
which then shows only its icon strip until an icon is hovered. A
floating pallet keeps its own auto-hide.
- Hovering the strip icons only shows a group while the edge auto-hides;
otherwise groups switch on click.
- The + menu checks only the pallets open on that edge. Picking one that
is open elsewhere (the other edge, floating) moves it to this edge;
unchecking a checked one hides it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
A group is now a set of pallets shown together, stacked top to bottom,
and an edge shows one group at a time. The icon strip lists every group
(grip bar over its pallets' icons, the shown group on a grey
background); clicking any icon of a group shows that whole group.
- Dropping a pallet on the top / bottom half of a pallet in the shown
group stacks it above / below; dropping on the strip's icons places it
in that group at that spot, and on a grip or below the last group
starts a new group (which is then shown).
- Splitters set the heights of the pallets within a group; double-click
makes them equal again.
- Each group keeps its own width; the divider sizes only the group it
belongs to, and switching groups switches width.
- A group whose pallets all auto-hide shows only while hovered.
- Layouts saved by older builds load with their stacked pallets as one
group.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
Each dock edge now has a vertical icon strip along the window edge in
place of the horizontal tab row and the auto-hide rail.
- Every shown group gets a grip bar with its pallets' icons below it;
the shown pallet's icon has a grey background. Clicking an icon shows
that pallet in its group; hovering the icons of an auto-hiding group
opens it.
- Dragging an icon within the strip reorders it or moves it into
another group; dropping it on a grip or below the last group makes it
a new group there. On the pallet area, the top / bottom bands still
start a new group above / below and the middle joins the group.
- Dragging a grip moves the whole group to another position or edge.
- A + button under the groups opens the pallet menu (icon, name, check
mark). Opening a pallet from it docks it on that edge as a new group,
or in its existing group there; a checked pallet is hidden.
- Groups keep their width when moved; the divider against the viewport
sizes the whole edge column.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
- The tab row shows only when at least two pallets share a slot.
- Tab icons are larger (18 px). The shown tab gets the grey background
without a border; other tabs have no background.
- The pallet menu was drawn by a dropdown that squeezed it to one icon
wide. It is now its own overlay hanging under the menu button, laid
out like the right-click menu: pallet icon, name, and a check mark on
the right for the pallets shown in this slot. Any click outside closes
it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
- 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
An orthographic preset sets its orthographic UCS while UCSORTHO is on
(*FRONT*, *RIGHT*, …; TOP returns to the world UCS); presets no longer
flip to the opposite view when repeated. -VIEW runs as its own command:
Window asks for the name and corners, sEttings loops over Background,
Categorize, Layer snapshot, live Section, Ucs and Visual style with the
reference prompts and messages, Save keeps the UCS with the view while
UCSVIEW is on and Restore brings it back. UCSORTHO and UCSVIEW are
profile variables.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
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
On a non-Retina screen macOS draws the interface at 1x, which reads small
on a Full HD monitor, and there was no way to enlarge it. Options >
Display now offers an interface scale of 75–200 % in 25 % steps, applied
through the window's scale factor on top of the display's own and kept
with the user settings. It is a list rather than a slider because the
dialog rescales under the pointer as the value changes.
Fixes#1655
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Swept surfaces made with SURFACEASSOCIATIVITY on keep their profile and
path and are written as a swept-surface action of the drawing's
associative network, reading the profile and path and their scale and
twist expressions. They follow edits of their sources.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- Add Section 19 benchmarks covering camera pan viewport uniform updates,
spatial hover candidate search, and viewport data assembly scaling
- Add navigation telemetry probes in src/perf.rs (active only when
PERF=1) to track frame interval, batched input moves, and layout-draw gap
Outside macOS a touchpad's two-finger drag arrives as wheel scrolls that
nothing tells from a wheel. A new option (Options, off by default) makes
every scroll pan and Ctrl+scroll — what a pinch sends there — zoom.
Fixes#1560
Co-Authored-By: Claude Opus 5.5 <[email protected]>
select takes window [x1, y1, x2, y2] in world XY, with crossing to also
take what the box crosses. It runs the viewport's own box test, now one
helper (box_selection_handles) that the drag and click-move-click
gestures share; the drag gesture applies the selection filter as the
click one already did.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
COPY and PASTE kept the source's reactors on each copy, so a copied
dimension still pointed at the source's dimension association (and
boundary or group members at the source hatch or group). Another
application reports such a drawing as damaged and, after recovery,
moves the dimensions. A copy's reactors now follow only targets copied
with it; group copies give their members the new group's reactor; and a
drawing opened with such stray dimension reactors has them dropped.
Fixes#1645Fixes#1649
Co-Authored-By: Claude Opus 5.5 <[email protected]>
LayerTransparencyEdit applied without begin/commit_layer_undo, so the edit was permanent while every sibling arm is undoable. Mirrors the color arm inside the non-empty guard. Test: layer_transparency_edit_pushes_undo asserts the entry plus undo-restores (RED first). Full suite: 1991 passed / 0 failed / 25 ignored.
Conflicts were additions on both sides, kept together: the Count palette
and Sheet Set toggles next to the Graphic Attributes toggle in the ribbon,
main's new locale groups and catalog entries next to graphic-attributes,
and module declarations. The palette code follows main's crate renames
(acadrust -> codec, cadkernel -> kernel).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01VgkJN8DEojuPTumAXLHotu
- Colour swatches carry no *VARIES* or ByBlock text; the L / B / C / V
button already shows that.
- A separator sits between "Create Layer with active settings" and the
"Create fills on the current layer" checkbox.
- The linetype scale field is a plain text field like the Properties
panel: the first click selects its value, Enter applies it (decimal
comma and expressions accepted) instead of repeating the last command.
This drops the iced_aw number_input feature again.
- Undo/redo name fill changes "Fill change" and linetype changes
"Linetype", in all 21 locales.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01VgkJN8DEojuPTumAXLHotu
- The hatch pattern picker takes its messages as one PatternPickerMessages
struct instead of eight arguments.
- The palette's fill index is keyed on the scene's geometry epoch alone;
epochs are unique across scenes, so the scene address is not needed.
- The ribbon lineweight handler is an on_ribbon_lineweight_changed method,
used by the palette instead of a recursive update() call.
- The 430-line palette test is split into eight focused tests with shared
helpers; no checks were dropped.
- Palette, gradient editor, prompts, messages and undo labels go through
t!/tf!. The 33 new strings are in a graphic-attributes Fluent group in
all 21 locales; "[Yes / No] <Yes>", ByLayer and ByBlock stay English.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01VgkJN8DEojuPTumAXLHotu
- The palette view looks fills up through an index of associative fills
that is rebuilt only when the scene's geometry epoch changes, instead
of scanning the drawing twice per frame. The gradient previews are
cached and rebuilt only when the gradient changes.
- New fills go to the layer of the filled object. A checkbox in the
palette menu ("Create fills on the current layer") restores the HATCH
behaviour and is saved in the config. Objects on locked layers are
skipped with a message.
- The palette is no longer part of the default dock layout; it is docked
below Properties the first time it is shown and keeps a place the user
chose. The original dock test is restored.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01VgkJN8DEojuPTumAXLHotu
- Revert formatting, import/module reordering and unrelated rewrites
outside the feature (command.rs, style.rs, paper.rs, view/mod.rs,
properties.rs, dialog.rs, ValuePromptCommand); the new SVG icons stay.
- Move the palette logic out of dialog.rs into update/graphic_attributes.rs.
- Replace 14 loose app fields and ~50 Message variants by
GraphicAttributesState (one Menu enum for the open drop-down) and a
nested GraphicAttributesMsg / GradientMsg, like BlockPaletteMsg.
- Share the selection -> line/fill handles -> unlocked edit path, reuse
valid_block_name, the ribbon lineweight handler and fill_handles, and
drop the unused GradientColorToggle, color_open and LineLinetypeScaleInput.
- Linetype scale accepts any positive value (e.g. ISO pen widths 0.13,
0.18, 0.25, 0.35) instead of rounding to 0.1 with a 0.1 minimum.
- Closing open boundaries and creating the fill is one undo step.
- The close prompt also answers typed Y/N + Enter, a bare Enter (Yes)
and Escape (cancel), not only the option buttons.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01VgkJN8DEojuPTumAXLHotu
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]>
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]>
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]>
A point or pick step commits on the press, so the cursor drifting before
the button comes up no longer moves it. Selection steps and drag-fence
picks still wait for the release.
The press runs the existing release path once; the command path clears
left_down, so the real release that follows does nothing. This replaces
the PR's moved click block and press_consumed_point flag, which could
stay set when the release landed outside the viewport and swallow the
next release, and which broke TRIM's press-and-drag fence.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- Text styles keep their TrueType typeface through save and reopen (codec
reads and writes the STYLE record's ACAD extended data) (#1633)
- Unnamed shape-file entries no longer show in text style lists (#1634)
- Save As offers DWT 2018; NEW asks for the template to start from, while
Ctrl+N and the quick-access New run QNEW with the default template (#1635)
- An edge next to an earlier fillet of the same radius rounds together with
it (kernel); the solid stays drawn and pickable while edges are chosen
(#1625, #1107)
- A full cache rebuild drops the B-rep cache too, so an undone fillet does
not come back with the next edge operation (#1107)
- Selected solids in shaded styles highlight only their visible edges (#1031)
- VIEW ISO / SWISO / SEISO / NEISO / NWISO snap to the isometric corners
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- Dynamic-input fields take ' and " and read 2'9" / 3' as lengths (#937)
- STRETCH on a selection made by a crossing window stretches through that
window and goes straight to the base point (#1068)
- STRETCH's crossing-window steps show no coordinate boxes (#657)
- Collapsed ribbon panel titles wrap at words, never mid-word (#920)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Fixes:
- Font prompt no longer lists bundled ltypeshp/qcadshp shape files (#1626)
- Wide polylines step at a discontinuous segment width; PEDIT marks the
current vertex; keyword steps refresh the command preview (#1628)
- Radius-0 fillet drops the zero-length segment it left, so the corner
fillets again (#1422)
- FILLET Trim / No trim option (#1558)
- True-colour wires plot in their own colour; colour picker stores the
value it shows (#1621)
- Model tab keeps its page setup; "Save changes to layout" in Model (#1620)
- QNEW default template in Options > Files; .dwt in the open dialog
(#1134, #1113)
- GRIDUNIT / GRIDMODE / PERSPECTIVE variables (#1618, #1524)
- PTYPE (#1433)
- ZOOM nX / nXP (#1465)
- CHSPACE between model and paper space through a viewport (#1428)
- Moving a dimension keeps its automatic text placement
- Shell icon; "&&" button labels (#1554)
- LINETYPE Load from a .lin file (#1588)
- XLINE / RAY hide the crosshair arms (#1437)
- Dynamic-input boxes keep clear of the crosshair and each other (#1546)
- Snap marker colour setting, dark default on light canvases
(#1497, #1229, #1128)
- Dimension style precision as a 0.00 pattern dropdown (#1426)
- Node graph nodes left of the origin no longer clip away (#1592)
- Collapse button in the command history header (#1094)
- Freeze-in-current-viewport toggle in the ribbon layer list (#1466)
- Geometric Center object snap for closed polylines (#1369)
New strings translated in all 21 locales.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
MTEXT draws its stored text instead of re-evaluating fields on every
redraw. Fields update on their evaluation events as the reference does:
open (1), save (2, not autosave), plot (4) and REGEN/REGENALL (16), each
masked with the drawing's FIELDEVAL (variable dictionary, 0-31, with the
reference's prompt and message), and the new UPDATEFIELD command
(selection, attributes of selected block references, "N field(s)
found." / "N field(s) updated."). A Date field (on demand only) keeps
its value until UPDATEFIELD. The FIELDDISPLAY gray box now covers each
field's own glyphs, one box per line it spans, instead of the whole
text. Codec moved to the update_fields / field_spans revision.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A plot stamps PlotDate fields, but the redraw only dropped the host's
own tessellation: an attribute is drawn by its INSERT and a host inside
a block definition by every reference to the block, so both still
showed the old value on screen and in the plotted output. The changed
hosts now redraw through their INSERT / the block's references (block
cache refreshed), without re-tessellating anything else. The codec is
patched to the field format code fixes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The wizard's folder scan, Import Layout as Sheet, the template layout
lists and the drawing cache behind Model Views, Place on Sheet, callout /
label blocks and block previews parsed whole DWGs on the UI thread. They
now go through the shared `background_task` worker: a cache miss reads the
drawing and handles the message that needed it again. Block previews lend
the cached drawing to the preview scene instead of cloning it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A VIEW record's centre is an offset from its target in view coordinates.
Views saved by earlier versions stored the target itself as the centre;
treating that as an offset put them (and VIEW plots) at about twice the
coordinates. One shared `named_view_center` now resolves the centre in
f64 (DVec3/DQuat), taking a centre equal to a non-zero target as the old
convention; VIEW RESTORE, the view plot window and Place on Sheet use it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>