100 Commits
Author SHA1 Message Date
Hakan SevenandClaude Opus 5.5 d389aaa75c Cargo: kernel 6f986ae, graph 5f217e4
Kernel: every splitting walk of the B-rep mesher spends from a call
budget. Two drawings from a component library (a bus with a six-face
wheel, a teddy bear) never finished opening because a span whose angle
never settled split until the depth cap.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 06:11:17 +03:00
Hakan SevenandClaude Opus 5.5 3b13fa5b64 Build: follow the codec's Block Properties Table types
0d625bbe5 moved the codec to 12d68e4, which adds
DynamicBlockData::PropertiesTable and BlockPropertiesTableValue. The
plugin API's type registry did not list the new enum, so its build
script stopped the workspace build, and the object data panel had no arm
for the new variant.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 06:11:17 +03:00
Hakan SevenandClaude Opus 5.5 4aa4b72d17 TRIM / EXTEND: a large cutting-edge selection no longer stalls each pick
In Standard mode the chosen edges sat in a Vec, and every trim rebuilt
the boundary by asking it about each object of the drawing: edges ×
objects per click, seconds once a crossing window picked thousands of
edges. Look them up in a set. TRIM's edge-selection hover also searched
all objects for every picked edge on each mouse move; it uses the
command's handle index like EXTEND.

Refs #1867

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 22:22:19 +03:00
Hakan SevenandClaude Opus 5.5 15a9051bb2 Cargo: codec a01df94, kernel 0574444, graph 15bfbda
Codec: the DXF reader takes an alignment grip's orientation from the
140/141/142 codes the writer now emits, so a round trip keeps it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 20:14:11 +03:00
Hakan SevenandClaude Opus 5.5 76afd7eabb XCLIP: a copy taken before the clip was set still finds its filter
insert_spatial_filter reads the INSERT's own dictionary link since
3a3d2e4a8; a caller holding a copy made before XCLIP linked the
dictionary saw none. Fall back to the stored INSERT's link, still O(1).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 20:08:47 +03:00
Hakan SevenandClaude Opus 5.5 4158fda45c NEW: open the template picker in the default template's folder
Refs #1836

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 20:03:15 +03:00
Hakan SevenandClaude Opus 5.5 0a968a0509 REPORT: keep the description from turning into a heading
The pre-filled issue body put a `---` line right under the description,
which Markdown reads as a setext heading underline whenever text is typed
on the line above it. Use `***` instead.

Refs #1834

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 20:03:15 +03:00
Hakan SevenandClaude Opus 5.5 629cdd2834 Text: TrueType fonts in the Fonts folder resolve like installed ones
Only system-installed TrueType fonts were searched, so a style naming a
.ttf placed in the Fonts folder fell back to another face, although SHX
fonts there already resolved. The folder is now loaded with the system
fonts.

Refs #925

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 20:03:15 +03:00
Hakan SevenandClaude Opus 5.5 6ef399d83b ARC: a number typed at the end point is the arc length
After Center and Start, typing a length now draws the arc that long along
the circle, running towards the side of the start point the pointer is on.
A length of a full circle or more keeps the prompt.

Closes #1408

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 20:03:14 +03:00
Hakan SevenandClaude Opus 5.5 3a3d2e4a84 Viewport block caches no longer scan every object per entity
A drawing with 650k entities and 21k objects stalled for 7 minutes the
first time a layout viewport was drawn (#1746): building that viewport's
block cache asked for each entity's layer viewport overrides, and the
codec found each layer's extension dictionary by scanning every object
whenever the layer had none. Codec 2646725 reads the registered link.

The XCLIP check made the same scan for every nested INSERT without an
extension dictionary; it now reads the INSERT's own link, which the
readers and ensure_extension_dictionary always set.

Cargo: codec 2646725, kernel 4e6334a, graph 2fd1d42.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 19:46:43 +03:00
Hakan SevenandClaude Opus 5.5 5f5b64ef70 Properties: a dynamic block's visibility state as a dropdown
A reference to a block with a visibility parameter gets a Custom row named
after the parameter, listing its states with the one shown selected.
Picking a state applies it the same way as the reference's visibility
grip, one undo step.

Refs #1862

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 19:21:59 +03:00
Hakan SevenandClaude Opus 5.5 20fb6a66b0 explode test: describe the body transform without naming a vendor
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 19:21:59 +03:00
Hakan SevenandClaude Opus 5.5 68d9ebe265 Cargo: codec cf3a040 (crate acadrust), kernel 2659c33, graph 800878a
The codec crate is named acadrust again (b6cb385); the `codec` key and
every `codec::` path stay as they are, only the package name changes in
each manifest, the plugin API build script finds it under that name, and
the recovery report reads the codec revision from the `codec` line it
had stopped matching. Codec: DWG dimension text-position flag polarity
(#117) and explode ByBlock resolution.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 00:03:23 +03:00
Hakan Seven fba1dfcd88 Merge review/1845: PR #1845 DGNIMPORT with fixes
# Conflicts:
#	src/app/commands/dgn_import.rs
2026-10-16 23:51:54 +03:00
Hakan Seven ea72ffad5f Merge review/1844: PR #1844 IMPORT with fixes 2026-10-16 23:50:58 +03:00
Hakan SevenandClaude Opus 5.5 f07d6e19fc Save: don't wait forever for the thumbnail frame or screenshot
A save from the active drawing first redraws the viewport without its
overlays and screenshots it for the file's preview. When the compositor
delivered no frame or never answered the screenshot (an occluded or
throttled Wayland window), the save never started: the input layer stayed
hidden, so the window ignored the mouse and keyboard, and automation
requests waited on the save forever. A timer now stands in for the frame,
and the screenshot races a half-second timeout; whichever answers first
runs the save, without the refreshed preview if it has to.

Closes #1801

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 23:25:59 +03:00
Hakan SevenandClaude Opus 5.5 56861aa0bc Escape DGN text in MTEXT and read 3D text by its byte count
Backslashes and braces in a DGN text stay characters in the MTEXT it
becomes instead of turning into formatting codes.

A 3D V8 text is cut at its stored byte count before it is decoded, so a
multi-byte character no longer shifts where the text ends.

Doc comments that had slipped onto the wrong functions are back on
their own, comments describe the behaviour instead of pointing at
another program, and a few lines added in the previous commits are laid
out the way the rest of the code is.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 23:25:27 +03:00
Hakan SevenandClaude Opus 5.5 2ac8fd9995 Pin MCP tool schema digest for the 3D Studio dialog action
The merged import adds the tds_import_dialog control action, which
changes the MCP tool surface; update the pinned digest to match.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 23:20:03 +03:00
Hakan SevenandClaude Opus 5.5 a0ed20df28 Fix IMPORT naming, messages and 3D Studio limits
STEP assemblies: a link that closes a loop in the assembly is dropped,
so no block inserts itself; the walk is iterative. Each imported block
gets a name the drawing does not use yet instead of silently reusing an
existing definition, inserts are pointed at the names the blocks got,
and an insert of a block that could not be defined is left out with
the error reported.

Names that come from files (STEP products, 3D Studio objects, materials
and cameras, WMF font faces) go through a new shared
scene::sanitized_table_name, which applies the block-name rules
(reserved and control characters, 255 characters).

3D Studio: meshes with more vertices than a polyface mesh can index are
split over several meshes. Single-layer mode uses the current layer.
Materials are only created when the drawing has a material dictionary.
Camera views get the current view's proportions and the perspective
flag.

Messages show paths as given, the file-not-found and read-failure
messages are plain text of our own, and the "Press Esc" line is gone
since the import cannot be cancelled. The true-colour packing is
shared. "Select ACIS File" and "Import WMF" get catalog entries and
keys in all 22 locales.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 23:20:03 +03:00
Hakan SevenandClaude Opus 5.5 dbc428b237 Harden STEP, IGES and WMF readers against crafted files
A truncated or hostile file could crash, hang or exhaust memory while
being read. STEP: a last instance without its semicolon no longer runs
the cursor past the end, the complex B-spline forms read their parts
with bounds checks, a knot multiplicity is capped at degree + 1,
parameter lists nest at most 64 deep, and wrapped curves and
conversion-based units follow at most a fixed number of hops so
self-references cannot loop. IGES: spline curve and surface sizes, hole
and boundary counts and list indices are checked against the
parameters the entity actually has, using checked arithmetic;
transformation matrix chains and nested composite curves are cut after
a few links. IGES colour 1 (black) now maps to colour 7 so it shows on a
dark background. WMF: a record whose size claims more than the file has
left is clamped to the remaining bytes. Doc comments describe the
behaviour instead of naming an outside program.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 23:20:03 +03:00
Hakan SevenandClaude Opus 5.5 a5f965ead4 Group nested DGN complex elements under their own headers
The element collector keeps a stack of open complex elements instead of
one. A chain, text node or cell inside a cell is gathered on its own and,
once complete, counts as one component of the cell, rather than closing
the cell early and leaving its remaining components at the top level.

A B-spline curve whose poles cannot be read still takes its place in the
open cell, so the cell does not absorb the element after it. An element
that is not a component ends every complex element still open, so a
header whose count overstates its components cannot swallow the rest of
the model.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 23:12:45 +03:00
Hakan SevenandClaude Opus 5.5 11ef1efc43 Keep DGN 3D line strings in 3D and fill filled complex shapes
A line string, shape or complex chain whose points are not all at one z
becomes a 3D polyline instead of a 2D polyline flattened to the first
point's elevation; its arcs then come in as points. Chain vertices are
de-duplicated on all three coordinates, and only arcs in the drawing
plane become bulges.

A filled complex shape gets its solid hatch like a filled simple shape,
following the outline's arcs. The hatch keeps the outline's elevation
and is left out when the outline is not at one z.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 23:11:49 +03:00
Hakan SevenandClaude Opus 5.5 ed4dc91670 Keep DGN reference attachments and cell instances well-formed
Plain -DGNIMPORT no longer writes drawings next to referenced files on
its own: references are ignored unless the window (or the kept import
settings) asks to translate them or attach them as underlays.

A referenced file named relative to the host is looked up in the host's
folder rather than the working directory. Its translated drawing takes
a file name made from the model name with path separators and other
reserved characters replaced, so it is always written in the
reference's own folder. A reference placed in sub units is scaled by the
same factor as its origin.

Layer, block, text style and reference names read from the file are
made valid symbol names (reserved characters become underscores).

An instance of a cell that has no block (the point display cell, an
empty or missing definition) is dropped instead of inserting a block
that does not exist.

"Prompt to overwrite" still keeps an existing translated drawing; the
code now says so instead of implying a prompt.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 23:11:18 +03:00
Hakan SevenandClaude Opus 5.5 6cbe62921b Bound DGN element reads that a crafted file could abuse
A V8 B-spline header shorter than 110 bytes no longer panics: the order
and closure word is read only when the element holds it.

A V7 cell takes only the components its total length covers, and cells
nested deeper than 16 levels are left out, so a long run of complex
elements no longer recurses once per element until the stack overflows.
A nested cell also stops swallowing the sibling elements after it.

Only the chosen model's control stream is inflated for its reference
attachments, within what is left of the budget the models were read
under, instead of every model's stream without a total limit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 23:10:27 +03:00
Hakan SevenandClaude Opus 5.5 854641bb55 Start page: a From Template button next to New Drawing
New Drawing starts from the default template (Options > Files), so a
template made here or in another program could only be reached through
the NEW command. The button runs NEW, which asks for the .dwt, .dwg or
.dxf to start from.

Closes #1849

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 22:46:07 +03:00
Hakan Seven c3baff7ea2 Merge pull request #1844 from ramox81/codex/import-formats
IMPORT: read SAT, STEP, IGES and WMF files; ACISIN and WMFIN

# Conflicts:
#	Cargo.lock
2026-10-16 22:41:32 +03:00
Hakan Seven 2b807a7654 Merge pull request #1845 from ramox81/codex/dgnimport-followups
DGNIMPORT: names, cells, text placement, curves, 3D, models and references

# Conflicts:
#	Cargo.lock
2026-10-16 22:41:12 +03:00
Hakan SevenandClaude Opus 5.5 3cbdce6137 Cargo: codec d4ac66e, kernel 85eb912, graph 8b315ab; MCP schema digest
Codec: the colour index palette at its standard intensities (#115), ACIS
colour attributes kept in binary data and multi-body split (#116, #118).
Kernel: spline curves and surfaces recognised as analytic shapes (#89).
The MCP tool schema digest follows the two PDF import automation actions
#1841 added.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 22:40:02 +03:00
Hakan SevenandClaude Opus 5.5 907fa8d760 STRETCH: arcs keep their height; splines stretch; real preview
An arc moved only when its centre was in the window, so stretching a
rounded end left the arc where it was or blew it up. Its ends now decide:
both in move it, one in moves that end while the arc keeps its height
(sagitta) over the new chord. Polyline arc segments keep their height the
same way instead of their bulge, spline control and fit points in the
window move, and 3D polylines and points stretch too. Old-style polylines
were tested in X/Z.

The preview moved the tessellated points that happened to be in the
window, which bent arcs out of shape; it now draws the stretched entities
through one shared function the commit also uses, via a new
preview_entities hook, and hides the originals while it shows.

Closes #1851

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 22:40:02 +03:00
Hakan SevenandClaude Opus 5.5 519d6605f9 MCP: create the automation folder before claiming the startup lock
On a profile that never ran the editor the folder did not exist, the lock
write failed, and ocs_sessions(launch_if_none) took that as another caller
starting the GUI: it never spawned one and kept answering "still starting".

Closes #1846

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 22:40:02 +03:00
Hakan Seven ecdcc5d2b6 Merge pull request #1838 from ramox81/codex/pdf-shx-text-followups
PDFSHXTEXT: reference text grouping, object share and wider character set
2026-10-16 22:40:02 +03:00
Hakan Seven fa7bb9de12 Merge pull request #1841 from ramox81/codex/pdfimport-followups
PDFIMPORT: reference coordinate precision, unreadable file and page messages, picker automation
2026-10-16 22:39:59 +03:00
Hakan Seven 28f51ce270 Merge pull request #1839 from MarcelP102/Graphic-Attributes-fix
FIX: Hide pallet title bar menu button until the bar is hovered
2026-10-16 22:39:56 +03:00
Hakan SevenandClaude Opus 5.5 e5c307c8ae Cargo: codec 0dc8585, kernel d530a52, graph 7dd8cf6
Large DWG sections (over 100 MB) read back instead of opening empty, and
DXF files with very large DGN stroke patterns no longer hang the reader.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 21:54:09 +03:00
Hakan SevenandClaude Opus 5.5 04b2c07a38 Use the codec audit and repair in place of OCS's corruption guard
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 <[email protected]>
2026-10-16 12:02:39 +03:00
Hakan SevenandClaude Opus 5.5 3c9404510f Cargo: codec cb3ce6a (acadrust through 3a3098a), kernel 40f59ca, graph a4bd351
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 10:06:14 +03:00
Hakan SevenandClaude Opus 5.5 e4d04ef132 Cargo: codec e023bc3 (acadrust sync), kernel abca4e8, graph c63556f
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 <[email protected]>
2026-10-16 09:17:01 +03:00
Hakan SevenandClaude Opus 5.5 218150c76a fix(clipboard): copied XDATA keeps its application in another drawing
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 <[email protected]>
2026-10-16 06:37:19 +03:00
Hakan SevenandClaude Opus 5.5 d909bd0787 Cargo: codec 102f04c, kernel 5811296, graph 88cdae0
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 06:37:19 +03:00
Hakan SevenandClaude Opus 5.5 09ec41a5e9 packaging(homebrew): cask on v2026.41, install through a local tap (#1825)
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 <[email protected]>
2026-10-16 02:12:26 +03:00
Hakan SevenandClaude Opus 5.5 f6455b22eb fix(view): Zoom Extents and All frame a drawing placed at survey coordinates (#1829)
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 <[email protected]>
2026-10-16 02:11:16 +03:00
Hakan SevenandClaude Opus 5.5 9a567d4f44 fix(linetype): an opened drawing keeps exactly its own linetypes (#1826)
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 <[email protected]>
2026-10-16 01:27:50 +03:00
Hakan SevenandClaude Opus 5.5 c499ce97d4 docs(plugin-template): pin the template to the host's codec 357cfed
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 01:18:47 +03:00
Hakan Seven a62598cd63 Merge pull request #1828 from schoeller/xdata_entity_type_labels 2026-10-16 01:12:36 +03:00
Hakan Seven 012ccc7b65 Merge pull request #1831 from manuvarkey/system-ui-font-face 2026-10-16 01:11:11 +03:00
Hakan Seven 57d80654be Merge pull request #1827 from MarcelP102/auto-hide-fixes 2026-10-16 01:09:10 +03:00
Hakan SevenandClaude Opus 5.5 0126ea212f feat(layout): copy a layout from its tab menu (#1822)
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 <[email protected]>
2026-10-16 01:08:07 +03:00
Hakan SevenandClaude Opus 5.5 38d81bf838 feat(selection): highlight opacity and extra width (#1823)
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 <[email protected]>
2026-10-16 01:07:23 +03:00
Hakan SevenandClaude Opus 5.5 977135fbbd feat(grid): the coloured grid axis lines can be turned off (#1815)
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 <[email protected]>
2026-10-16 00:42:03 +03:00
Hakan SevenandClaude Opus 5.5 091331f3bd fix(blocks): a dynamic block copied to another drawing stays dynamic (#1816)
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 <[email protected]>
2026-10-16 00:36:59 +03:00
Hakan SevenandClaude Opus 5.5 ca408f4329 Cargo: codec 357cfed, kernel 3642105, graph c7ce31d
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 00:36:59 +03:00
Hakan SevenandClaude Opus 5.5 c8f67ad35b fix(blocks): block previews leave out members of other visibility states (#1819)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 00:11:56 +03:00
Hakan SevenandClaude Opus 5.5 98cce048c7 fix(blocks): a copied dynamic reference changes state on its own (#1818)
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 <[email protected]>
2026-10-16 00:11:56 +03:00
Hakan SevenandClaude Opus 5.5 d2995ecee1 fix(hatch): pick points stay fast in large drawings, and see off layers
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 <[email protected]>
2026-10-15 23:51:38 +03:00
Hakan SevenandClaude Opus 5.5 d67fd101b4 Cargo: kernel 9d7ff46, graph 77d511e
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 <[email protected]>
2026-10-15 23:51:38 +03:00
Hakan SevenandClaude Opus 5.5 bec9e63679 feat(dimension): the standard arrowheads in every arrowhead picker
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 <[email protected]>
2026-10-15 22:18:35 +03:00
Hakan SevenandClaude Opus 5.5 43cca2094b fix(plot): the new page setup name has room to be read
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 <[email protected]>
2026-10-15 21:59:18 +03:00
Hakan SevenandClaude Opus 5.5 d9849e35ab Follow-ups to #1814
- `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 <[email protected]>
2026-10-15 21:48:25 +03:00
Hakan Seven 1efc82bad2 Merge pull request #1814 from ramox81/codex/pdf-shx-text
PDFSHXTEXT: recognise SHX text geometry as MText

# Conflicts:
#	locales/en-US/opencadstudio.ftl
#	locales/tr-TR/opencadstudio.ftl
#	src/app/commands/blocks.rs
#	src/app/control/actions.rs
#	src/modules/draw/select.rs
2026-10-15 21:39:53 +03:00
Hakan Seven 1716414f4f Merge pull request #1824 from AAD001-Dwg/registry/add-construction-plugin
registry: add Construction Layers & Guides plugin (API v9)
2026-10-15 21:29:59 +03:00
Hakan SevenandClaude Opus 5.5 5139e04c2c test: UI snapshot tests render with tiny-skia
iced_test renders headless through wgpu by default. Several test threads
opening GPU devices at once crashed the driver: about every other
parallel `cargo test --lib` run died with SIGSEGV, always with the
color picker, ribbon, overlay and dock UI tests running together. With
ICED_TEST_BACKEND=tiny-skia the suite passes run after run.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 21:29:48 +03:00
Hakan SevenandClaude Opus 5.5 19cc2e1073 fix(render): colour-7 solid edges contrast with a layout's paper
A solid's edges and silhouettes were drawn in its face colour, and the
edge shader read that from the material instead of the edge vertices.
Colour 7 is white, so in Wireframe 2D a solid vanished white-on-white in
a layout viewport (and on a light model background), while wires and
block solids already turned black there. Solids now keep a separate
edge colour, colour 7 turned against the background they are drawn on,
and the edge shader uses the edge vertices' colour again, which also
brings back visual-style edge colours. Shaded faces keep their colour
so they still read as lit. (#1446)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 21:07:05 +03:00
Hakan SevenandClaude Opus 5.5 44c6ddc513 fix(constraints): keep constraint groups the rebuild cannot write
Saving `starttekening.dwg` unchanged lost 275 associative objects: the
constraint network rebuilt before saving cannot write a dimensional
constraint that drives a dynamic block's constraint parameter instead of
a dimension, nor separate dependencies on single edges of one polyline.
The block parameters ended up pointing at erased objects. A group with
either link is now kept as read, through the existing preserved-group
path; ODA counts the same 1948 associative proxies before and after.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 20:36:36 +03:00
Hakan Seven c8750db7c9 Merge pull request #1810 from ramox81/codex/insert-import-panel
Insert ribbon: Recognition Settings opens the settings from PDFSHXTEXT
2026-10-15 17:01:41 +03:00
Hakan SevenandClaude Opus 5.5 83a9b3f8d0 mcp: tool schema digest for the TXT2MTXT and import dialog actions
#1811 and #1812 add the `txt2mtxt_settings`, `import_file_dialog` and
`dgn_import_dialog` automation actions.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 17:00:58 +03:00
Hakan Seven 443d3ec13d Merge pull request #1810 from ramox81/codex/insert-import-panel
Insert ribbon: Import panel

# Conflicts:
#	locales/ar-SA/opencadstudio.ftl
#	locales/bg-BG/opencadstudio.ftl
#	locales/cs-CZ/opencadstudio.ftl
#	locales/de-DE/opencadstudio.ftl
#	locales/el-GR/opencadstudio.ftl
#	locales/en-US/opencadstudio.ftl
#	locales/es-ES/opencadstudio.ftl
#	locales/fi-FI/opencadstudio.ftl
#	locales/fr-FR/opencadstudio.ftl
#	locales/hi-IN/opencadstudio.ftl
#	locales/hu-HU/opencadstudio.ftl
#	locales/it-IT/opencadstudio.ftl
#	locales/ja-JP/opencadstudio.ftl
#	locales/ko-KR/opencadstudio.ftl
#	locales/lo-LA/opencadstudio.ftl
#	locales/nl-NL/opencadstudio.ftl
#	locales/pl-PL/opencadstudio.ftl
#	locales/pt-BR/opencadstudio.ftl
#	locales/ru-RU/opencadstudio.ftl
#	locales/tr-TR/opencadstudio.ftl
#	locales/zh-CN/opencadstudio.ftl
#	locales/zh-TW/opencadstudio.ftl
#	src/modules/insert/mod.rs
#	src/ui/ribbon/draw_panel.rs
2026-10-15 16:47:38 +03:00
Hakan Seven 2b4c4bfdc6 Merge pull request #1812 from ramox81/codex/import-dgnimport
IMPORT window and DGNIMPORT / -DGNIMPORT

# Conflicts:
#	locales/ar-SA/opencadstudio.ftl
#	locales/bg-BG/opencadstudio.ftl
#	locales/cs-CZ/opencadstudio.ftl
#	locales/de-DE/opencadstudio.ftl
#	locales/el-GR/opencadstudio.ftl
#	locales/en-US/opencadstudio.ftl
#	locales/es-ES/opencadstudio.ftl
#	locales/fi-FI/opencadstudio.ftl
#	locales/fr-FR/opencadstudio.ftl
#	locales/hi-IN/opencadstudio.ftl
#	locales/hu-HU/opencadstudio.ftl
#	locales/it-IT/opencadstudio.ftl
#	locales/ja-JP/opencadstudio.ftl
#	locales/ko-KR/opencadstudio.ftl
#	locales/lo-LA/opencadstudio.ftl
#	locales/nl-NL/opencadstudio.ftl
#	locales/pl-PL/opencadstudio.ftl
#	locales/pt-BR/opencadstudio.ftl
#	locales/ru-RU/opencadstudio.ftl
#	locales/tr-TR/opencadstudio.ftl
#	locales/zh-CN/opencadstudio.ftl
#	locales/zh-TW/opencadstudio.ftl
2026-10-15 16:47:21 +03:00
Hakan Seven aa618b8327 Merge pull request #1811 from ramox81/codex/txt2mtxt
TXT2MTXT: combine text into MText with a settings dialog

# Conflicts:
#	locales/ar-SA/opencadstudio.ftl
#	locales/bg-BG/opencadstudio.ftl
#	locales/cs-CZ/opencadstudio.ftl
#	locales/de-DE/opencadstudio.ftl
#	locales/el-GR/opencadstudio.ftl
#	locales/en-US/opencadstudio.ftl
#	locales/es-ES/opencadstudio.ftl
#	locales/fi-FI/opencadstudio.ftl
#	locales/fr-FR/opencadstudio.ftl
#	locales/hi-IN/opencadstudio.ftl
#	locales/hu-HU/opencadstudio.ftl
#	locales/it-IT/opencadstudio.ftl
#	locales/ja-JP/opencadstudio.ftl
#	locales/ko-KR/opencadstudio.ftl
#	locales/lo-LA/opencadstudio.ftl
#	locales/nl-NL/opencadstudio.ftl
#	locales/pl-PL/opencadstudio.ftl
#	locales/pt-BR/opencadstudio.ftl
#	locales/ru-RU/opencadstudio.ftl
#	locales/tr-TR/opencadstudio.ftl
#	locales/zh-CN/opencadstudio.ftl
#	locales/zh-TW/opencadstudio.ftl
2026-10-15 16:47:19 +03:00
Hakan Seven a66880be31 Merge pull request #1809 from ramox81/codex/pdfimport-parity
PDFIMPORT: command-line file import, measured scale and curve recognition
2026-10-15 16:47:08 +03:00
Hakan SevenandClaude Opus 5.5 1f99338018 fix(open): the cursor shows over the opening progress card
The viewport hides the system cursor for its crosshair, and the progress
card's backdrop claimed no cursor of its own, so while a drawing opened
the pointer vanished over the viewport and Cancel could not be aimed at.
The backdrop now shows the arrow. (#1727)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 16:35:21 +03:00
Hakan SevenandClaude Opus 5.5 03cf0f75eb fix(dimension): radius text stands above its line, which runs under it
A radius placed its text where it was clicked, on the line through the
centre and the arc point, whatever DIMTAD said; outside the circle the
line stopped at the text's near edge, so the text sat on the end of the
line. DIMTAD now lifts aligned radius text off that line as it already
does on a diameter, and an outside line runs on under the text to its far
end. A text point already off the line (a file saved elsewhere) is kept
as the text's middle. (#1675)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 16:33:30 +03:00
Hakan SevenandClaude Opus 5.5 12587339d8 fix(selection): a fast press-drag starts the selection window at once
A left drag only became a lasso/window after the button had been held
150 ms, however far the cursor had moved. A fast flick released inside
that delay read as a click and armed a click-click box instead. A press
that has moved more than 12 px is now a drag at once; the delay still
keeps small movements of a click from becoming one. (#1808)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 16:09:55 +03:00
Hakan SevenandClaude Opus 5.5 859070403c fix(automation): cancel ends a request that never settles
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 <[email protected]>
2026-10-15 16:04:18 +03:00
Hakan SevenandClaude Opus 5.5 6f2388796e fix(paste): pasted hatches without an association are drawn
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 <[email protected]>
2026-10-15 15:54:07 +03:00
Hakan SevenandClaude Opus 5.5 aa3b667110 Follow-ups to #1803, #1805 and #1806
- 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 <[email protected]>
2026-10-15 14:51:47 +03:00
Hakan Seven 7de32c91c2 Merge pull request #1806 from ramox81/codex/block-attribute-manager-window
Block Attribute Manager window (BATTMAN / ATTMAN)
2026-10-15 14:51:47 +03:00
Hakan Seven cf6c50f2c0 Merge pull request #1805 from ramox81/codex/block-dialog-additions
Block Definition dialog: preview, empty-block band, open in block editor
2026-10-15 14:51:26 +03:00
Hakan Seven d358204646 Merge pull request #1804 from ramox81/codex/block-definition-ribbon
Insert ribbon: Block Definition panel split button and labels
2026-10-15 14:51:25 +03:00
Hakan Seven 01e805d4bb Merge pull request #1803 from turbuczn/docs/measurement-tools-cleanup
docs: clean up measurement tools documentation
2026-10-15 14:51:25 +03:00
Hakan SevenandClaude Opus 5.5 423b28c6b1 Cargo: codec 278c49a, kernel 46e5bf8, graph 3b3a03d
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 <[email protected]>
2026-10-15 13:55:05 +03:00
Hakan SevenandClaude Opus 5.5 d285fd781e feat(measuregeom): Quick mode measures around the cursor
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 <[email protected]>
2026-10-15 13:22:26 +03:00
Hakan SevenandClaude Opus 5.5 de1e49a4c5 feat(plot): PDF output carries drawing layers
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 <[email protected]>
2026-10-15 13:04:39 +03:00
Hakan SevenandClaude Opus 5.5 ee2898095e fix(plugins): Python plugins see the host document again
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 <[email protected]>
2026-10-15 12:54:03 +03:00
Hakan SevenandClaude Opus 5.5 cccea4008b ucs: dynamic UCS on planar solid faces
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 <[email protected]>
2026-10-15 11:40:39 +03:00
Hakan SevenandClaude Opus 5.5 19ecf78bd9 navigation: selectable mouse navigation style
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 <[email protected]>
2026-10-15 11:17:13 +03:00
Hakan SevenandClaude Opus 5.5 74df9ff84a plot styles: the CTB/STB model and codec come from the codec crate
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 <[email protected]>
2026-10-15 10:58:26 +03:00
Hakan SevenandClaude Opus 5.5 1070361c0a Cargo: codec eaa6d79, kernel bb355ca, graph 9c17779
- 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 <[email protected]>
2026-10-15 10:22:44 +03:00
Hakan SevenandClaude Opus 5.5 d1a14bef91 web: point a failed open of a very large drawing to the desktop app
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 <[email protected]>
2026-10-15 09:32:20 +03:00
Hakan SevenandClaude Opus 5.5 c8aa179ec0 input: typing behind an open dialog stays out of the command line
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 <[email protected]>
2026-10-15 09:23:21 +03:00
Hakan SevenandClaude Opus 5.5 cc78899363 navigation: pan and orbit keep going past the viewport edge
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 <[email protected]>
2026-10-15 09:17:06 +03:00
Hakan SevenandClaude Opus 5.5 39c3e9af58 annotation: TEXT/MTEXT store the model height of their default scale
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 <[email protected]>
2026-10-15 08:53:31 +03:00
Hakan SevenandClaude Opus 5.5 f7bd0ca5ee wipeout: circles and arc polylines as boundaries
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 <[email protected]>
2026-10-15 06:32:15 +03:00
Hakan SevenandClaude Opus 5.5 53b93dc98a constraints: hide dynamic dimensions whose constraint did not load
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 <[email protected]>
2026-10-15 06:12:42 +03:00
Hakan SevenandClaude Opus 5.5 6996505d70 orbit: turn about the surface under the pointer
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 <[email protected]>
2026-10-15 05:06:07 +03:00
Hakan SevenandClaude Opus 5.5 bfc9ead28d arc: Arc length is editable in Properties
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 <[email protected]>
2026-10-15 04:55:51 +03:00
Hakan SevenandClaude Opus 5.5 6f14b53aff dimstyle: New starts from the selected style
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 <[email protected]>
2026-10-15 04:46:13 +03:00
Hakan SevenandClaude Opus 5.5 f7dd9b403d Cargo: codec 2c2a3fb, kernel 2dc2fca, graph 14275ea
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 <[email protected]>
2026-10-15 04:36:38 +03:00
Hakan SevenandClaude Opus 5.5 3893165ac7 #1798 follow-up: wrap lines over 100 columns
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 04:14:30 +03:00
Hakan Seven 87c44cee78 Merge pull request #1798 from Pictus08/feat/autocad-pgp-ucs-follow
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.
2026-10-15 04:09:10 +03:00
Hakan SevenandClaude Opus 5.5 9b518ff912 sysvar: SELECTIONCYCLING
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 <[email protected]>
2026-10-15 03:57:33 +03:00