fix(task-22): live named views read and restore the display (VIEWCTR/VIEWSIZE, ZOOM Window), UCS sysvars come from the document, and a frozen current layer is thawed before restore makes it current
Four review findings, all measured by the reviewer on AutoCAD 2026:
1. ucs_list and the ucs_restore('world') CMDACTIVE guard read
app.GetVariable, but GetVariable is an AcadDocument member — the tool
was dead live and the guard's swallowed read forced cmd_active to 0,
sending `_.UCS _W` into any open prompt. Both read the document now,
and a failed CMDACTIVE read refuses instead of proceeding. The fake
app in tests/test_views_ucs.py has no GetVariable any more, so the
old code cannot pass.
2. view_named_save defaulted from doc.ActiveViewport.Center/Height/Width,
which does not track the display (it answered the initial view after
`_.ZOOM _C 5,6 20`). The current view is VIEWCTR / VIEWSIZE at the
SCREENSIZE aspect — what `-VIEW _S` records (width 40.267 for height
20). The fake viewport is deliberately stale so a read of it fails.
3. view_named_restore wrote Center/Height/Width into the AcadViewport;
AutoCAD anchors the lower-left corner and widens to the display
aspect, landing a 10x20 view at (5, 6) on VIEWCTR (20.134, 6). It now
zooms the saved rectangle (app.ZoomWindow), which centres and fits
like `-VIEW _R` (VIEWCTR = saved centre, VIEWSIZE = max(h, w/aspect)),
reports `applied: "zoom_window"` and reads VIEWCTR / VIEWSIZE back.
Headless the same reconciliation moved the centre whenever the
*Active VPORT's aspect was rewritten from w/h (even the 1.34 default
opened at x = 11.734): the aspect the file carries is left alone —
it is the display's, written by AutoCAD at save — and the window is
fitted into it; the payload adds `vport_height` / `aspect_ratio`.
4. layer_state_restore set ActiveLayer before the loop and outside the
try; AutoCAD refuses to make a frozen layer current, so the spec's
own save → freeze → restore path raised an opaque COM error with
nothing applied. When `frozen` is being restored the state's current
layer is thawed first; the write is wrapped and a refusal lands in
`warnings`. The fake document and layer now model both refusals.
Live AutoCAD was not running in this round (GetActiveObject failed, no
acad process), so the fix is measured against the reviewer's numbers,
not re-measured.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FKFStjEFzpGyLq5bMpWxTd
This commit is contained in:
co-authored by
Claude Opus 5
parent
bbc9aeeb63
commit
c7dd72410a
@@ -6951,8 +6951,11 @@ async def layer_state_restore(
|
||||
`applied` says how many layers and which properties moved. Refusals: an
|
||||
unknown state name (lists the saved ones), a property outside the eight
|
||||
(names the index). Live, a layer AutoCAD refuses to change (freezing the
|
||||
active layer) lands in `warnings` instead of failing the call. Portable
|
||||
server states, not Layer States Manager entries. Pack: settings · lean: no.
|
||||
active layer, making a frozen layer current) lands in `warnings` instead
|
||||
of failing the call; the state's current layer is thawed before it is
|
||||
made current when `frozen` is being restored, so save → freeze → restore
|
||||
round-trips. Portable server states, not Layer States Manager entries.
|
||||
Pack: settings · lean: no.
|
||||
"""
|
||||
await ctx.info(f"Restoring layer state {name!r}")
|
||||
return await _backend(ctx).layer_state_restore(name, properties)
|
||||
@@ -7022,12 +7025,18 @@ async def view_named_restore(
|
||||
name: Annotated[str, "A name from view_named_list"],
|
||||
ctx: Context = None,
|
||||
) -> dict:
|
||||
"""Live: sets the active viewport to the saved centre/height/width
|
||||
(`applied: "active_viewport"`). Headless there is no display: the saved
|
||||
window is written to the `*Active` VPORT — the view AutoCAD opens the file
|
||||
on — and the result says `applied: "header_only"`, the same reported-no-op
|
||||
rule as `view_zoom_extents`. Refusal: an unknown name (lists the saved
|
||||
views). Pack: settings · lean: no."""
|
||||
"""Live: zooms the active viewport to the saved window the way `-VIEW _R`
|
||||
does — VIEWCTR becomes the saved centre and VIEWSIZE the saved height
|
||||
(or width / display aspect when the window is wider than the display);
|
||||
`applied: "zoom_window"` plus the read-back `viewctr` / `viewsize`.
|
||||
Headless there is no display: the saved window is fitted into the
|
||||
`*Active` VPORT — the view AutoCAD opens the file on — whose aspect ratio
|
||||
is left as the file carries it (AutoCAD reconciles a changed aspect by the
|
||||
viewport's lower-left corner, which shifts the centre); the result says
|
||||
`applied: "header_only"` with the written `vport_height` and the kept
|
||||
`aspect_ratio`, the same reported-no-op rule as `view_zoom_extents`.
|
||||
Refusal: an unknown name (lists the saved views). Pack: settings · lean:
|
||||
no."""
|
||||
return await _backend(ctx).view_named_restore(name)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user