Name clashes, DGNIMPORTMODE and prefixing as the reference names them;
V7 cell copies, unshared cells and mirrored placements as blocks;
justified text and text nodes placed at their justification points with
the reference's MTEXT contents; B-spline curves as splines and 3D arcs and
ellipses in their own planes; every V8 level as a layer; design models
only; reference attachments translated, ignored or attached as underlays.
The colour index palette comes from the codec fix it depends on.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opening a drawing no longer drops entities with its own sanity checks or
rewrites knotless splines; recovery runs the codec's repair and records
its actions and unresolved issues in the drawing's notifications. Xref
merges keep every entity. The dropped-entity counts, their command-line
warnings, recovery report rows and the automation "purged" field go with
the guard.
AUDIT now reports the codec's audit (counts plus the first 50 issues) and
asks whether to fix; Yes applies the codec repair as one undo step.
Cargo: codec 325fa98, kernel dfca391, graph 5d4e713.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The codec now holds wide EntityType variants boxed (MText, Helix,
Dimension, Hatch, Viewport, MultiLeader, Surface, Table, Ole2Frame,
Light, Extended). Constructors box their entity; nested patterns reach
a dimension through entities::dimension::as_dimension(_mut). Also
follows BlockAction::action_ids, LineTypeComplexData::source_flags and
the decimal tab stop with an explicit character.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
EED names its application by APPID handle. Copying between drawings
(paste, COPYTO, block palette insert, REFEDIT) kept the source
drawing's handles, so the saved DWG named APPIDs it did not have and
the reference program refused to open it (xdata.cpp eInvalidInput).
The copy now carries the APPID records its XDATA names, registers the
missing ones, and re-points the EED at them.
COPYTO also skipped every layer the target lacked (the check tested
the source) and filled the target with the whole linetype catalog; it
now copies the missing layers and loads only the linetypes used.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
codec 85bb5a2 fixes the BLOCKVISIBILITYPARAMETER DXF defect: AcDbEvalExpr
ends after 90/98/99 when the eval has no value instead of emitting a stray
70 -9999. Readers rejected that group 70 ('Unexpected DXF group code: 70')
and discarded every visibility-bearing drawing on open.
Homebrew dropped --no-quarantine and installs casks only from a tap, so
the README's direct-URL install no longer worked, and the cask still
pointed at v0.4.8.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A block whose content is only 3D solids leaves a marker wire carrying
its insertion snap, and that point counted as drawing extent: a
georeferenced block inserted at the origin made ZOOM E frame the
origin and the model together, 860 km wide. Extents now skip those
markers; the solids count through their meshes. The marker's snap also
took the insertion point straight from the OCS, so a mirrored insert's
snap sat on the far side of the origin.
ZOOM All fitted the limits alone. In a 3D view it is now Zoom
Extents, and in plan it frames the limits together with the extents.
Instanced solids summed their rotated point and translation in f32
before meeting the eye, which cost up to half a metre at survey
coordinates; the large terms now cancel first.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opening a drawing added all 50 catalog linetypes to it, so PURGE found
and removed them again after every save and reopen. Opening now only
repairs the catalog linetypes a drawing already has. The linetype
pickers (layers, properties, ribbon, attribute editor, layer states)
offer the missing catalog ones after the drawing's own, and the one
picked, or named in LINETYPE SET, is loaded on first use.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The layout tab's right-click menu gains New Layout, Copy, Page Setup
and Plot beside Rename and Delete. Copy makes "<name> (2)" with the
source's page setup, sheet view and every paper-space object,
viewports included, and opens it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Options > Selection gains "Selection highlight opacity" and "Selection
highlight extra width". Below full opacity the object's own colour
shows through the highlight. The selection overlay draws with its own
copy of the frame uniforms: transparency on, and every line widened by
the extra width. Drawings opened at startup now get the selection
colour settings too; they used to keep the defaults until a setting
changed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Drafting Settings > Snap and Grid gains "Display grid axis lines",
kept with the other grid settings; the grid itself stays as it is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Only the definition's entities crossed drawings: its record's object
graph (parameters, visibility states, grips) stayed behind, and a
reference showing an evaluated copy lost the link to its definition.
The clipboard now captures the graph and the dynamic definition of an
evaluated reference, and paste and the block palette's insert-from-file
recreate them on the new records, re-pointing members and element tags.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
COPY cloned the reference's AcDbRepData without its handle, owner or
representation index, and both references kept sharing one evaluated *U
block, so a state picked on either changed both. The clone now names
itself and is indexed; a state change gives a reference whose *U other
references share its own copy first.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each picked region matched every edge of its rings against every
boundary source of the drawing, twice: with 65,000 sources a click took
over 30 seconds. Sources are now narrowed to those reaching the rings'
box first, once per hatch and once per ring: the same click takes 9 ms.
Objects on layers that are turned off (not frozen) now bound a hatch, as
in the reference. Drawings switch off the layers that close the regions
to be hatched; without them a click between columns found the outer
frame instead. (#1813)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The kernel fills hatch rings whose holes touch (a column against a beam)
by the even-odd rule instead of dropping the whole hatch. A pick-point
hatch with 222 such loops was saved but never drawn. (#1813)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- plugin-architecture.md: new "Entity class display labels (API v10)"
section documenting the split (stable identity keys in XDATA, display
labels in the plugin declaration), the live-loaded-plugin gating (missing,
disabled, cap-excluded, failed, removed, or dead → bare native type), the
"<Label> (<Native>)" display rule, that raw schema fields (`type`,
`dxf_name`, `record_type`) and LIST are unchanged, and that the label is
display-only. `plugin.toml` deliberately does not carry the table: it is
the pre-load discovery file and labels must activate on live manifests.
- Template v2 demonstrates the whole convention: declares
`SURVEY-CLASS:POINT -> "Survey Point"` and stamps the identity key in
MARK_FIRST_SURVEY_POINT, so marked points show as "Survey Point (Point)"
while the plugin is loaded. plugin.toml's api_version is bumped to 10 (keep
in sync with ApiVersion::CURRENT) with a NOTE on where the class table
lives. DESIGN.md documents the flow.
- Template v2's stale `acadrust` pin (8a28c21, predating the host's codec
bump to 278c49a) is realigned with the host's pin: without it the template
no longer compiles on main — its `acadrust::EntityType` and the host
re-exports are distinct types when the revisions disagree (verified the
same four type errors occur before and after this feature's template edit).
- changelogs/unreleased.md entry (Plugins section).
Resolve entities' XDATA class-identity keys through the live plugin manager
(new `src/plugin/entity_labels.rs`) and qualify display types as
"<Label> (<Native>)" wherever the bare native type is shown today.
- The single-entity Properties panel title (and the node graph, which shares
the same computation) becomes e.g. "Linear Element (Line)". Host-owned
classifications (xref, dynamic constraints, underlays, surfaces) keep the
native parenthesized part, so nothing they tell the user is lost.
- The records API's `entities` collection: `display_type` carries the
qualified label; the raw `type` / `record_type` fields stay native so
existing scripts, type filters, and by-type grouping keep working.
- The automation entity summary gains a `display_type` field with the same
semantics; `type` stays raw. Exposed by `query`, `user_select` sessions,
and `get_selection`.
Semantics: the identity (a stable class KEY like "CVIFC-CLASS:LINE") lives
in the entity's XDATA and round-trips the drawing; the display LABELS live
in the declaring plugin's manifest. Keys only — no display text is ever
written to the file, and the label never governs behavior (display-only: it
does not affect snapping, selection, filtering, or grouping). Gating rides
live manager state at query time, so without a loaded declaring plugin every
surface here is byte-identical to today, immediately after any reopen, with
no re-assert pass. The command-line LIST output deliberately stays on the raw
dxf name. An app id claimed by more than one loaded plugin resolves through
the first-loaded declaration and debug-logs the ignored duplicate; a
prefix-only value, an unknown key, or an empty label mapping fall back to
the native type.
Tests: resolver core (known key, foreign app ignored, record without an
identity value ignored, prefix-only / unknown key / empty label fallback,
duplicate app id first-wins), the empty-manager gating end-to-end through
`with_manager`, the "<Label> (<Native>)" form, and the byte-identical
fallbacks asserted at the panel, records, and query layers for entities
stamped with a perfect identity record.
Plugins can now declare the entity classes they identify via XDATA, and the
host resolves them to display-only type labels while the declaring plugin is
loaded.
- Append `BuiltinPlugin::entity_classes()` (a guarded trailing vtable slot,
the same additive pattern as `on_load` in v5) returning a &'static
`EntityClasses { app_id, class_prefix, labels }`. The static
`PluginManifest` struct is deliberately untouched: older cdylibs share it
by pointer and its layout is frozen ABI since v1, so adding a field would
read past their allocation.
- `OwnedEntityClasses` travels on the registered manifest as
`OwnedPluginManifest.entity_classes` with `#[serde(default)]`, so manifests
serialized before the field keep decoding (older runners tolerate it
both ways).
- The runner folds the declaration into the GetManifest registration only
when the loaded cdylib's exported `ocs_plugin_api_version` symbol reports
>= 10 — an older binary's vtable predates the slot, so it is never called;
its entities simply keep their native type names.
- `PluginManager::entity_class_declarations` exposes the live set, filtered
to alive, non-disabled plugins in load order. The registered manifests are
the only source and nothing is cached: not installed, disabled,
cap-excluded (`OCS_PLUGIN_MAX_API_VERSION`), failed at load, removed, or a
dead process all contribute nothing.
- Embedded version info `api_version` follows the bump to 10;
`API_VERSION_MIN_SUPPORTED` stays 3.
Tests: runner fold (v10 folds, pre-v10 skipped, `entity_classes()` panic is
contained and reported), manager filtering (disabled / dead / undeclaring
skipped; declarations disappear once the process dies — verified with a real
killed child), bincode registration round-trip, and older-manifest serde
default.
Detect the desktop's configured interface font and use its family for all
application UI text, instead of iced's generic sans-serif.
- sys::ui_font reads the setting per platform: GNOME/Cinnamon/MATE
gsettings, KDE kdeglobals, Xfce xfconf, the XDG Settings portal, GTK
settings.ini and a Fontconfig fallback on Linux; the non-client message
font (SystemParametersInfoForDpi at 96 DPI) on Windows; the AppKit system
font on macOS.
- ui_font::apply remaps generic sans-serif in iced's shared font database
to that family. iced's Font::DEFAULT is sans-serif, so every widget,
canvas text, bold/italic variant and ribbon measurement follows it with
no call-site changes. A family that is not installed (or a generic alias)
keeps iced's own choice. The font's weight and style are ignored.
- Live updates: portal SettingChanged on Linux, a 2 s poll on Windows. A
change bumps the font-system version so laid-out text reshapes, and
iced::font::set_defaults relays out every window; ribbon large-button
widths re-measure. Without a portal, Linux needs a restart; macOS has no
user-adjustable UI font.
- Monospaced text, drawing text (own cosmic-text font systems) and the web
build's font loading are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The dimension style, multileader style and Properties pickers listed
every block of the drawing as an arrowhead, and nothing else. They now
list the 19 standard arrowheads (Closed filled, Open, Dot, Architectural
tick, Oblique, Right angle, Datum triangle, …), followed by any user
arrow block the dimension or style already uses. Picking one creates
its block (`_Open`, `_ArchTick`, …) with the geometry the reference
program writes, so other programs draw the same arrow; ODA reads the
saved file cleanly.
`_Small` now draws as the reference's "Dot small blank", a hollow circle
half the arrow size, instead of a small filled triangle.
Also drops a duplicated "DGN Import" catalog entry left by #1810/#1812.
(#1820, #1821)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
iced_aw's DropDown keeps its list on screen by testing it against the
viewport's width and height only, as if the viewport started at the
window corner. Inside a scrollable the viewport is the visible area in
window coordinates, so a field in a dock pallet saw its list overflow
and the list jumped left by its own width (or up over the field); the
Properties Transparency dropdown showed it. Hand the drop-down a
viewport reaching from the corner to the visible area's far edges.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ihuqzxdUhd9UbioPn5MGu
Refuse LAYOUT, VPORTS, MVIEW, WBLOCK, PURGE, RENAME, REFEDIT,
REFEDIT_BEGIN and PLOT from the command line while a block editor
session is open, matching the reference product's
"<CMD> command not allowed in block editor" behaviour (spec section 8,
based on the V7 hands-on check). XREF, NEW, OPEN and SAVEAS stay
allowed. The service-level RENAME guard stays as defense in depth.
The name field shared the 160 px sidebar row with Save and the close
button, so it was squeezed until no text showed. It now takes the full
width with the buttons below it, and the close button is the SVG icon
instead of a "×" glyph. (#1817)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At this iced revision the layer under an overlay that wants the pointer
gets an unavailable cursor, not a levitating one, so hover_zone still
read a pointer on an open linetype list as leaving the edge. Keep the
last state on an unavailable cursor and exit only on a position outside
the bounds or the pointer leaving the window. A test drives a real open
dropdown through iced's UserInterface for both mouse_area and the zone.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ihuqzxdUhd9UbioPn5MGu
- `SelectObjectsCommand::with_settings` exists once: #1811 and #1814
each added one; PDFSHXTEXT now passes its settings step as the
callback #1811's takes.
- The `pdf-shx` locale group in every language (English until
translated), so the catalog test passes.
- MCP tool schema digest for the `pdf_shx_settings` action.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
iced gives the layer under an overlay a levitating cursor, so the dock
edge's mouse_area read the pointer on any dropdown or combo list in a
pallet as leaving, and auto-hide collapsed the panel mid-pick. Track
enter/leave with a small hover_zone wrapper that lands the cursor before
its bounds test, on docked edges and floating pallets alike.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ihuqzxdUhd9UbioPn5MGu