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]>
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.
- 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]>
- A blank script line outside a command repeats the last command through
dispatch_command, as the command line's empty Enter does.
- ZOOMFACTOR bound docs describe the SETVAR range the PR widened, and the
test keeps checking the value the Options field reaches.
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]>
Table cell fields show their stored value; only formula cells evaluate
live. UPDATEFIELD on a block reference also updates the fields of its
block definition, and on a table the fields of its cells; a changed
table cell text redraws the table. The FIELDDISPLAY box is placed from
the text layout (MTEXT layout cells, TEXT / attribute pen advances) and
spans 0.345 text heights below the baseline to 1.19 above it.
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]>
- SSM* / SS* sysvar messages and the Place on Sheet prompt go through
t!/tf!, reusing the existing catalog entries where they exist; one new
key (integer range) is translated in all 21 locales.
- The SETVAR prefix is matched case-insensitively.
- The stale "SHEETSET ... not yet implemented" key is removed from the
catalog and every locale.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Restore the web no-op of `sync_drawing_locks` and keep
`stamp_sheet_set_data` (called only by the native save) out of the web
build.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- Invalid Area "Undo" reverts the step that lost the boundary (redo after
an undo, undo otherwise), checks the boundary is back and otherwise puts
the step back and continues without the area; no auto-undo loop.
- COUNTCLOSE / area replacement remove the count polyline outside the
history instead of as an undo step of their own.
- UPDATEFIELD re-evaluates the field texts of a table's *T block and
reports the number actually updated.
- Zoom to a counted object goes through the f64 handle_zoom_to_window.
- Palette: SVG icons instead of glyph text, list cache keyed by tab id,
cached result borrowed instead of cloned, "Count" as the source text.
- Command-line messages go through t!/tf! with entries in all locales.
- Cleanups: \n escapes, area comment, unused parameter, comment order.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- refresh_table_block no longer runs for every table change: only tables
whose picture reference this app dropped while editing them (and new
tables without one), never on appearance-only bumps. Moved, restyled or
freshly opened tables keep their authored *T block. TABLE edits now drop
the picture reference like the other table edit paths.
- set_count_display recolours just the handles whose count class changed
(restyle path + recolor_meshes_for_handles); only entering or leaving
count mode rebuilds the whole drawing.
- Count colouring keeps insert instancing: counted and duplicate wires get
their own instance groups instead of dropping render_instance.
- The hatch backdrop takes the count colour too.
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]>
- Place on Sheet gives its viewport a unique id (shared
`Scene::next_viewport_id`, also used by the normal viewport commit).
- Renaming a sheet's layout in an open tab records undo and marks the tab
modified; in a closed drawing the previous file is kept as `.bak`
(ISAVEBAK) before it is written back.
- New Sheet saves the drawing before the `.dst`: a failed save leaves no
sheet behind.
- Rename & Renumber Previous/Next no longer panics on an empty list.
- Leftovers: unused binding, a hard-coded localized Documents path.
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]>
- `.dst` read/write go through native-only helpers (a browser answers
"Not available"); the folder pickers are web no-ops; time stamps use
iced::time (web-safe).
- Lock files are written only for drawings that are sheets of an open set,
released when the last set closes, and a lock a crashed session left
(recorded with its process id, same user and machine) is taken back.
The `.dwl2` header is well-formed and the date line comes from the OS
long date on every platform. The 1 Hz poll runs only while a set is open.
- Refreshing sheet set fields never stores `####`: fields no open set
resolves keep their value, and only the hosts that changed are redrawn
(and their tab marked modified).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- A drawing's sheet set fields are refreshed when it opens with sets loaded.
- VIEW WINDOW <name> <x1,y1> <x2,y2> saves the plan view of a window.
- opencadcodec: block-attribute fields use their block reference's layout.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- Row menus open Set category / Place Callout Block as fly-out submenus
(hover or right press; leftwards when the palette is docked right).
- List of Blocks and Select Block show the Blocks palette's preview.
- VIEW SAVE keeps the window's width/height ratio.
- Placing view content in model space is refused with the reference message.
- Drawings read for views, placement and blocks are cached by modification time.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Turning a 141k-entity layer off/on took 1.5-5 s; it now takes ~0.6-0.9 s.
- Off/freeze toggles go through invalidate_layer_visibility: entities on
the layer keep their tessellation memo (visibility gates them before
tessellation); only block users re-expand. No mesh recolor.
- The resident patch reuses a surviving memo entry instead of
re-tessellating, guarded by the same display-context hash as the full
build.
- The patch looked up `layout.order` linearly per re-shown entity, which
made turning a big layer back on quadratic.
- recolor_meshes_for_handles resolved materials for handles with no mesh.
- Wire arena: a hidden slab keeps its instances and sets a `hidden` flag
in its consts (collapsed in the vertex shader); an unchanged re-show only
clears the flag. Const writes are batched into merged spans.
- The `layer_visible` automation action indexed the document's layer
table instead of the sortable panel rows the Layer* messages use.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- When the count area's boundary is gone the approved Invalid Area dialog
asks: undo the change (also its X and Cancel) or count all of model space;
"always" keeps the choice in the settings. An edited boundary moves the area.
- A table's *T block is brought up to date whenever the table changes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Model Views lists named model views and places them on the current sheet
(xref, viewport, paper-space named view, view label with navigation
fields, sheet view record); sheet view rows get Display, Rename & Renumber
View, Set category, Place Callout Block and Place View Label Block; the
View Category dialog's Add Blocks opens List of Blocks / Select Block; a
sheet whose relative path is gone shows missing; sheet set fields store
their values when a set changes; named views keep their centre relative to
the target. Codec pin moves to the revision with these field helpers.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Import Layouts as Sheets shows the reference's statuses (already part of
a sheet set / may belong to another sheet set / available) and Browse
replaces the list; the Field dialog SheetView tree lists sheet views with
their properties, scale formats and hyperlinks; drawings open in tabs get
.dwl/.dwl2 lock files that other instances read as open; the codec pin
moves to the revision with sheet views and the default output folder.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Remove Sheets confirmation, Open in drawing editor, Select Layout as Sheet
Template for subsets that prompt, Import Layouts as Sheets with status and
prefix, Rename & Renumber options with Previous/Next and real layout/file
renames, New Subset folder hierarchy and publish setting, subset properties
rows as the reference shows them, sheet status badges (SSMSHEETSTATUS /
SSMPOLLTIME), Sheet Views by category with the View Category dialog, Model
Views locations, Field dialog SheetSet/SheetView navigation, and .dwt/.dws
read as DWG.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- COUNTCOLOR / COUNTERRORCOLOR / COUNTSERVICE reject any other value with
the range message; COUNTTABLE ? lists in the reference order, padded,
22 lines a page with Press ENTER to continue:, then the totals.
- Target picks report N found / N found, M total; several objects (or one
that is not a block reference) count their copies, shown as Geometries
in the palette.
- Current area is the area in use (kept aside by Entire model space),
otherwise all of model space; an invalid Object boundary ends with the
reference message.
- Count colours reach solids and fills; the palette list and the count
are recomputed only when the drawing changes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The tree menus follow the reference per row kind (New Sheet / Import on a
sheet work on its subset, Remove Subset only while empty, Rename Subset),
a new sheet is not opened, an open set reloads when its .dst changes on
disk, ViewportScale placeholders take the version of their format and
the codec pin moves to the revision with navigation fields.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
_LINE / .LINE reached show_command with the prefix and matched nothing;
strip it the way the Start-tab gate already does. The before/after
screenshots only illustrate the PR and stay on its branch.
Co-Authored-By: Claude Opus 5.5 <[email protected]>