A request settles once the work it started reports back, and waits for
any open or save in progress. When that never happens the bridge stayed
busy: every later request, `cancel` included, was refused until the app
was killed. `cancel` now ends the active command and closes any pending
request as cancelled, not only interactive picks. (#1801)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The paste adds entities to the document directly, so the fill and raster
models `add_entity` seeds were never built. An associative hatch got its
model back when its pasted boundary rebuilt it; a non-associative one
stayed in the drawing but was never drawn. Seed the fill, image and
underlay models of the pasted entities. (#1807)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Block Attribute Manager: the error band's dismiss button is the close
icon, not a "×" glyph the web build may not have.
- Two signatures wrapped to the 100-column limit.
- MCP tool schema digest updated for the new `block_def_dialog` and
`attman_dialog` actions.
- Measurement docs: MEASUREGEOM's Quick mode.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The codec now decodes version-0 (2010 release) constraint groups, so the
parametric constraints of such drawings load and their dynamic
dimensions show (#992). Constraint groups also keep their next node id.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MEASUREGEOM gains a Quick option. As the cursor moves, the nearest
drawn geometry along the working plane's X and Y lines through it is
measured live: cyan measurement lines and a Horizontal/Vertical readout
by the cursor. A click prints the current readout and keeps measuring;
Enter ends the command. The rays go through the scene's interaction
index, so large drawings stay responsive.
A structure-pick command whose miss message is empty now gets the click
as a plain point instead of an error.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every plotted wire and hatch resolves to its entity's layer, and the PDF
wraps each run of same-layer items in an optional-content group, so a
viewer's layer panel lists the drawing's layers and can hide them. Draw
order is unchanged; images stay outside any group. Expanded block
geometry goes with its INSERT's layer.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Plugins read the host's document through a shared reference across the
dynamic-library boundary, and the entity index hashed with foldhash's
per-process seed, so every handle lookup from the plugin missed. The
codec now uses a fixed hasher (opencadcodec f385f75; kernel 9841749,
graph e9c23ad).
The Python IPC suite also caught up with intended changes: ATTDEF
renders its tag, DXF now keeps the lock-position flag, and the modify
audit turns associative arrays off since it checks loose copies.
The rate-limiter test waits for the host's check instead of a fixed
sleep that raced on macOS, and ENV_LOCK no longer cascades a poisoned
lock into every later test.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With dynamic UCS on (UCSDETECT 1, toggled with F6), a command's first
point picked on a planar face of a solid sets the UCS to that face for
the rest of the command, so 2D commands draw on the face (#1711). An
unsnapped first point lands on the face itself; a snapped point off the
face's plane belongs to other geometry and leaves the UCS alone. The
previous UCS comes back when the command ends. UCS commands themselves
are left out.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Options → User Preferences → Navigation style picks which mouse
gestures pan and orbit the model view (#1480):
- CAD (default): middle button pans, Shift + middle button orbits.
- Blender: middle button orbits, Shift + middle button pans.
- CATIA: middle button pans; pressing the left button during it orbits,
so 3D navigation needs only the mouse.
An armed orbit tool always orbits. The choice is saved with the user
settings.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cargo: codec d36331d, kernel 60f086b, graph 74aac56.
The table model and its file codec now live in `codec::plot_style`
(opencadcodec#53) and are re-exported here. What stays is where tables
come from: the plot styles folder, the session registry, the shipped
tables, and saving to disk, as the `PlotStyleTableExt` trait.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Gradient stops keep their DWG color book name and book; RGB wins over
ACI in a DXF gradient block in either tag order.
- MTEXT decimal tab stops keep their alignment character.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A browser tab gets a few GB of memory at most, so a drawing of a few
hundred MB can fail to open there while the desktop app opens it
(#918). When an open over 150 MB fails in the browser, the command line
now says so and recommends the desktop app.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With Quick Select or another dialog open, letters typed while one of
its lists was open went to the command line behind it (#922). Typed
glyphs are now dropped while a dialog is up; its own text fields keep
receiving them as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A middle-button drag stopped when the pointer left the viewport: the
mouse area reports moves only inside, and leaving reset the drag, so
the release outside never arrived (#1400). The viewport and each model
pane now carry an input layer that keeps reporting a drag they started,
with the pointer anywhere in the window, and the release outside ends
it; leaving no longer cancels a middle-button drag.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Annotative text in DWG/DXF holds the model height of its default
(native) scale representation; other scales draw it at the ratio of the
two. OCS read the stored value as paper height and multiplied it by the
annotation scale again, so text from AutoCAD came out far too small
(#1734), and annotative text OCS wrote came out too small in AutoCAD.
- Rendering uses the active/native context ratio (1 when the object has
no representation for the displayed scale).
- TEXT with an annotative style asks for the paper height, stores the
model height of the creation scale and gets that context; MTEXT
starts from the model height; ANNOUPDATE converts a fixed style
height the same way.
- Properties: the Height row of annotative TEXT and MTEXT is the paper
height at the displayed scale, with the model height beside it, and
an edit converts back. MTEXT shows Annotative when it has contexts.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
WIPEOUT's Polyline option took only straight closed polylines. It now
also takes a circle or a closed polyline with arc segments, sampled
every 5° into the polygon a wipeout stores, so the result stays a
standard polygonal wipeout (#641).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A dynamic dimension is drawn by its constraint at screen size; without
the constraint it is a bare dimension with stretched extension lines.
Those orphans now stay undrawn and unplotted, as in a viewer (#992).
- First-release drawings keep dynamic dimensions on
*LayerNameForDynamicConstraint; it counts as the dynamic layer.
- The hidden set is refreshed when constraints load, and the loader's
prepared wires (built before that) are not installed while it holds
anything.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With nothing selected, Shift+MMB orbit pivoted on the surface at the
view centre, so grabbing a small part off-centre flung the model away.
It now pivots on the solid or mesh surface under the pointer where the
drag began, falling back to the view centre and then the camera target
(#1389).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Typing a length keeps the start angle and moves the end along the
circle; a length outside (0, 2πr) is ignored (#1408).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New created a bare dimension style, whose defaults are inch-sized
(0.18 arrows and text). In a metric drawing its arrows came out too
small to see (#1675). It now starts from the selected style.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DXF values read into exactly sized strings (codec #114): reading a
DXF in the web worker no longer spends most of its time in malloc.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Import AutoCAD PGP aliases and support UCSFOLLOW workflows. The UCS
conflict keeps main's click-origin flow (axis preview, Enter accepts
the placed axes) and takes the PR's prompt and option keywords.
Selection cycling was reachable only from the status bar and Options.
SELECTIONCYCLING / SETVAR now read and set it: 0 off, 1 or 2 on (the
candidate list always shows).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
UCS waited for an option keyword before taking any point. A picked or
typed point at the first prompt now starts the origin / X / XY
placement directly. A live L of the new X and Y axes follows the cursor,
and Enter accepts what has been placed so far: the origin alone moves
the UCS, an X point turns it about the current Z.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PROPERTIES only flipped the visibility flag, so a Properties pallet in
an edge's inactive group or behind auto-hide stayed out of sight. It
now opens through the dock, which brings its group forward. In clean
screen the pallet shows on top without changing its normal state;
leaving clean screen drops that overlay.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An annotative dimension style still stores a DIMSCALE (100 in ACA
templates), but its features are sized by the annotation scale. Using
the stored value drew 3 mm dimension text 300 units tall, burying the
plan under giant digits.
Some templates also store their ratio scales already converted to the
drawing unit (a metre drawing's "1:50" as 1 paper = 0.05 drawing, with
CANNOSCALEVALUE 20). Applying the INSUNITS conversion on top shrank
the annotation multiplier a thousandfold.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Options > Files lets the fonts and plot style folders move elsewhere,
such as a share a whole team uses (Change... / Default). Fonts are then
looked up and downloaded there, and plot style tables listed and saved
there; the choice is kept in the profile.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dragging a radius dimension's text left the point on the arc where it
was and kinked the line to reach the text. The point on the arc now
follows the text round the centre, as the diameter's already does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Changing a TEXT's style in the Properties panel only swapped the font, so
a style that differs in its fixed height, width factor or oblique angle
seemed to change nothing. The text now takes the style's fixed height
(when it sets one), width factor and oblique angle, and an MTEXT the
fixed height.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both commands gain a mOde option [Quick/Standard]. Quick (the default)
starts ready to pick, every object a cutting or boundary edge; Standard
starts by selecting those edges, Enter with none taking every object.
The choice is TRIMEXTENDMODE (1 Quick, 0 Standard), kept in the profile
and settable with SETVAR.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The resident wire sets were capped at 16 and cleared once more were
held. A layout with more content viewports than that (24 in the report)
cleared them all on each redraw and re-tessellated the model for every
viewport, so the layout stayed sluggish even when nothing changed. The
cap now covers the shown layout's viewports: idle redraws build no
wires, and a frame of that layout draws in ~14 ms instead of ~30 ms
plus ~100 ms of rebuilds.
The automation bridge gains a `layout_switch` action, as clicking a
layout tab does, which is how this was measured.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Restoring a layer state while a layout viewport is active now applies it
to that viewport alone, as viewport freezes and viewport overrides for
colour, linetype, lineweight and transparency (where they differ from the
layer, or an override is already there). On/off, lock and plot have no
per-viewport form and still apply to the drawing.
Viewport colour overrides are packed as the format does (0xC3 index,
0xC2 true colour); reading them now honours that type byte, so an index
override from a file no longer shows as a near-black true colour.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- block-def strings in every locale (English until translated); the
catalog test requires each locale to carry them.
- A new block's base point starts at 0, and ATTMAN / BATTMAN report a
drawing without attributed blocks; the tests expect that now.
- Lines over 100 columns wrapped.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The count was keyed on the gathering command's address, so a command
boxed where the previous one was (MOVE right after MOVE) inherited its
selection and reported its first pick as a duplicate. Drop the report
whenever no command is running.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Selection: report what each pick found while a command gathers objects
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
# src/locale_catalog.rs
Since layer 0 and Defpoints map to the host's own layers, the loop that
marks dependent layers flagged the host's layer 0 as xref-dependent and
owned by the reference. Skip the layers that keep their name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The guard remembered only the last announced (tab, generation), so
switching A -> B -> A announced A's load again. Each tab now carries
its own pending flag, set when a document is installed and cleared by
the boundary dispatch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reference-only entities (plugin API v9): a scene-scoped, in-memory
designation for plugin-owned display geometry, plus HostNotification
dispatch to native plugins so they can re-mark on DocumentOpened.
Resolves the new DeltaSnapshot site in block_editor.rs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Viewport stacking rank kept apart from its ID in DXF; a layer's method-0
transparency reads as opaque.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The end angle subtracted a whole octant less the end offset, so the arc
in the ISOCP 9 stopped about 45 degrees short and the glyph shrank to
0.68 of the cap height; clockwise arcs and n = 0 (a full circle) drew
nothing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lines still showing when the pointer reaches the overlay history no
longer fade under it; leaving restarts their COMMANDLINEFADETIME.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A save records the entered model viewport (or the sheet) as the layout's
last active viewport, and opening the layout enters it again with its
UCS. Picks up the codec fix that kept a last-active link from being read
as the sheet viewport (codec d57097c, kernel b40fa59, graph 2360341).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PDF dash entries are whole points in the plot's user space; on an inch
sheet a 0.1 in dash rounded to the 1-unit floor, so every short pattern
plotted as 1 in on, 1 in off.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Picks up the DXF fix for MTEXT without group 41, which wrapped at a
default width of 10 (#1739).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every weight under 0.26 mm was clamped to the screen's 1 px floor before
the PDF and SVG exporters saw it, so 0.00, 0.09, 0.13 and 0.25 mm all
plotted alike. The floor now applies on the GPU only.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A selection of several unconnected chains, or one holding a closed
polyline, failed as a whole; each chain now joins on its own and the
rest stays.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The docked panel and Quick Properties render the same rows from one
state, so a picked colour opened both dropdowns and each swallowed the
other's click.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ISOCPEUR, ISOCTEUR and the other aliased names are real fonts; with one
installed, its face draws the text instead of the stroke substitute,
which has no Cyrillic.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With TAN and CEN on, hovering a circle offered its centre everywhere on
the rim, so the tangent point from the base was never reachable.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A ten-minute time::every on wasm piles up long setTimeouts in the shared
wasmtimer driver until it stops waking every timer, which silenced the
automation channel and drop-open about 8 s after load.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1776 left its dialog in English outside tr-TR and added the
image_adjust automation action without re-pinning the MCP tool schema
digest, which failed tool_schema_digest_is_pinned.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
In the Block Editor, BVSTATE makes a new visibility state, makes one
current, renames or deletes one; BVHIDE and BVSHOW hide or show the
picked objects in the current state (BVSHOW shows every object of the
block while they are picked). The first use makes the block dynamic.
The states are stored as the format keeps them: a
BLOCKVISIBILITYPARAMETER in the block's ACAD_ENHANCEDBLOCK evaluation
graph with its visibility grip and the grip's two location expressions,
the round-trip purge preventer, AcDbDynamicBlockTrueName /
AcDbDynamicBlockGUID / AcDbBlockRepETag on the definition and element
tags on each of its objects. The definition shows its first state; a
reference given another state gets its own evaluated *U copy, tagged
AcDbBlockRepBTag and linked back through AcDbBlockRepresentation /
AcDbRepData, so it shows that state and the other references do not
change. Saving the block drops erased objects from the states.
Checked: a block authored this way reads back with its states and
reference link from DWG and DXF, and the ODA converter accepts the DWG.
Closes#1566
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep the product name Open CAD Studio, restore the accents of Colinéaire
and Égal, and use the established French terms for the array commands
(Réseau rectangulaire / polaire / trajectoire) and Lissage for loft.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
add_layout took the sheet viewport out, so the first viewport added to
the layout afterwards (by automation, or a plugin) was read as the sheet
and the scale pill and paper camera followed it. The sheet now stays and
is fitted to the page when the layout first opens; a layout saved before
that is still written without viewports.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opening a layout whose page setup was never filled in took every viewport
out of it, including viewports onto the model a file carries (plenty of
DXF writers leave the paper fields empty). With only the sheet taken out
instead, the next viewport would have been read as the sheet. The sheet
is now fitted to the new page and every other viewport stays.
A layout saved as never opened keeps its state when it already holds a
viewport onto the model (one added by automation), and only its sheet is
taken out otherwise.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
REFCLOSE Save on an xref replaced the referenced file's model space with
the working set alone. With the Nested selection method the objects that
were not checked out stay in the definition, but they were deleted from
the file on disk. Write back every object of the saved definition, and
copy the file to .bak first when ISAVEBAK is on, as a drawing save does.
Also translate the new REFEDIT prompts into the other 20 locales; the
catalog test requires every locale.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The brightness/contrast cache keyed entries by the source buffer's
address without holding it, so a reloaded image whose new buffer landed
at the freed address could be shown with the old file's pixels. Each
entry now holds its source. The new functions had also been inserted
between resolve_image's doc comment and the function, merging that text
into the lookup table's documentation; it is back where it belongs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>