Commit Graph
5111 Commits
Author SHA1 Message Date
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
2026-10-17 19:21:59 +03:00
sclMAX 758ab28636 feat(explode): support exploding ACIS and wire Region entities 2026-10-17 19:21:59 +03:00
Karim Jerbi 26071f2021 feat(blocks): implement native Array action authoring and dynamic evaluation
Add the native Array action (\BARRAY\, \BACTION ARRAY\, and Authoring Palettes Actions tab \Array\) supporting Linear, Polar, and XY parameters.

Prompt for column offset (and row offset for XY), constructing native \DynamicBlockData::ArrayAction(BlockArrayAction)\ with class \AcDbBlockArrayAction\ and 4 native connections (\Base\, \End\, \UpdatedBase\, \UpdatedEnd\) bound to the parameter node ID.

Evaluate step displacement along 1D rays and 2D grids, tagging clones with deterministic element IDs to reconcile representations cleanly across incremental grip adjustments without mutating baseline geometry. Validate native DWG/DXF roundtrip, reference independence, COPY isolation, rejections, and dock palette tool state.
2026-10-17 12:49:51 +01:00
Karim Jerbi 5a6a7fab93 feat(blocks): synchronize definition geometry changes to evaluated references
Update evaluated references upon saving block definition edits while preserving each reference's independent parameter values, visibility states, and undo history.

Reconcile representation members by native element identity rather than positional index, preserving handles, extension dictionaries, reactors, nested attribute handles, and 3D polyline vertex handles. Prune erased targets from action dependencies, synchronize anonymous block base points, and prevent element ID collisions across undo/redo. Coalesce representation updates into editor undo deltas and composite structure snapshots for symmetric undo/redo.
2026-10-17 11:35:26 +01:00
Karim Jerbi ee846914dc feat(blocks): edit action selections and refresh evaluated references
Add BACTIONSET and the Block Editor Action Selection ribbon entry. Pick or preselect an action, replace/add/remove its drawing targets, or redefine a Stretch frame while preserving the native action and graph identity.

Retain existing Stretch vertex bindings during target edits and bind new targets against the stored frame. Normalize duplicate picks, allow removing invalid bindings, and rebuild them through a replacement frame. Rebuild evaluated references at their independent cached values so removed targets lose old effects, with local undo, discard and one drawing save delta.

Validate synthetic native DWG/DXF roundtrips, shared COPY representations, stale-result guards, reference geometry refresh, frame/cancel/history and the real ribbon flyout. 348 block tests pass (6 existing opt-in ignored), plus 42 dock and 27 viewport tests.
2026-10-17 11:35:26 +01:00
Karim Jerbi 7c91f5835e feat(blocks): edit action selections and refresh evaluated references
Add BACTIONSET and the Block Editor Action Selection ribbon entry. Pick or preselect an action, replace/add/remove its drawing targets, or redefine a Stretch frame while preserving the native action and graph identity.

Retain existing Stretch vertex bindings during target edits and bind new targets against the stored frame. Allow removing invalid bindings or rebuilding them through a replacement frame. Rebuild evaluated references at their independent cached values so removed targets lose old action effects, with local undo, discard and one drawing save delta.

Validate synthetic native DWG/DXF roundtrips, shared COPY representations, stale-result guards, reference geometry refresh, frame/cancel/history and the real ribbon flyout. 347 block tests pass (6 existing opt-in ignored), plus 42 dock and 27 viewport tests.
2026-10-17 10:22:14 +01:00
Karim Jerbi 042f26a4cc feat(blocks): wire Stretch actions and independent reference evaluation
Author a native Stretch action from a Linear, Polar or XY parameter, a two-corner stretch frame, an object selection and a marker. Preview and retain its frame in BEDIT, with selectable and movable action markers.

Freeze line and planar lightweight-polyline vertex bindings, preserve curved-segment height, move wholly selected objects, and evaluate independent saved INSERTs from their definition. Retain native DWG/DXF data, copied-reference isolation and undo/redo.

Validate with synthetic frame, topology, parameter, history, Test Block, drawing-reference, COPY and roundtrip regressions: 340 block tests pass (6 existing opt-in ignored), plus 41 dock and 27 viewport tests. Other entity types, Polar Stretch, custom multipliers and chaining remain unsupported.
2026-10-17 10:03:59 +01:00
Karim Jerbi 94940ad77c fix(blocks): show directional Flip grip arrows
Use the existing triangular grip marker in Test Block and saved drawing references. Point it across the reflection line, transform it with the INSERT, and reverse the arrow when the native Flip state changes.

Validate arrow shape and both directions through the existing mouse-click, undo/redo and reopen regression in both contexts.
2026-10-17 09:54:30 +01:00
Karim Jerbi 1ee432ac64 fix(blocks): reopen evaluated references in their authoring definition
Resolve BEDIT reference entry through the native dynamic-definition link instead of editing the anonymous geometry variant. Preserve static-block fallback and existing lock/xref checks.

Add synthetic regressions for evaluated-reference DWG reload and save/close/reedit, plus Rotation-only save/close/reopen followed by Flip placement. Validated with 334 block tests passing (6 existing opt-in tests ignored).
2026-10-17 09:33:29 +01:00
Karim Jerbi de7ed432fb feat(blocks): wire Rotate and Flip actions and saved reference grips
Author Rotate actions against Rotation parameters and Flip actions against Flip
parameters through the existing palette, BACTION selection flow and native
evaluation graph. Keep markers selectable and editable in BEDIT.

Rotation grips accept a new direction at the original radius. Flip grips toggle
immediately. Evaluate both from immutable definition geometry in Test Block and
independent drawing references, preserving per-INSERT angle/state caches across
DWG/DXF saves and COPY. Undo/redo includes the native state and representation.
Accept parameter names containing spaces at the action parameter prompt.

332 block regressions pass (6 existing opt-in checks ignored), including native
binding/marker roundtrips, composed rotation/flip, repeated reversible toggles,
COPY isolation, viewport mouse interactions, history and saved-reference reopen.
Custom base modes, constrained/chained evaluation and parameter-target actions
remain unsupported; Rotate currently binds Rotation parameters.
2026-10-17 09:15:37 +01:00
Karim Jerbi f67f2cf4f5 feat(blocks): persist independent Move and Scale reference grips
Selected drawing references now expose action parameter grips outside Test
Block. Point input evaluates immutable definition geometry into an independent
anonymous representation and stores per-INSERT values in native AppDataCache
XRecords, preserving definition graphs and sibling references.

Reuse visibility representation isolation, including shared COPY blocks, and
retain cache metadata. Record geometry, INSERT links, new block records and
parameter values in one undo step. Support transformed uniform references and
Point, Linear, Polar and XY endpoints for the existing Move/Scale actions.

Validate synthetic DWG/DXF persistence, re-edit/resave, COPY isolation,
XY/Polar cache layouts, metadata, cancellation, transformed grips and undo/redo.
327 block regressions pass (6 existing opt-in checks ignored).
2026-10-17 08:48:26 +01:00
Karim Jerbi ddf348af22 fix(text): stroke aliases txt/monotxt must ignore a same-named TTF
Face::resolve routes a name to a system TrueType face when installed_alias
reports that an alias names a real TTF face (the #1764 escape hatch, added so
an installed ISOCPEUR draws that face instead of its LFF stand-in).

That hatch also caught TXT/MONOTXT: on a machine with a font family matching
"txt" (e.g. a "Txt Regular"), the DXF stroke text font resolved to that
TrueType face instead of the embedded stroke substitute, contradicting the
documented contract that a missing .shx draws with the stroke substitute and
never with a similarly-named TrueType face.

TXT/MONOTXT are stroke aliases, so exclude them from the hatch. ISOCPEUR keeps
its #1764 behaviour.

Eight tests failed on such a machine and now pass: the four font-face/LFF
assertions (shx_name_stays_lff, lff_falls_back_to_ttf_for_uncovered_glyph,
big_font_pairing_routes_ideographs_and_leaves_latin_alone,
lff_tessellation_golden) and the four searchable-PDF assertions that route
through the same Face::resolve. Adds a regression test for the contract.
2026-10-17 05:56:14 +01:00
gianlucafiore 0e4c4c311d Merge pull request #1856 from gianlucafiore/fix/selection-click-first-lasso-delay
fix(selection): prioritize quick click-click boxes over eager lasso
2026-10-16 21:43:56 -03:00
gianlucafiore ae32926967 Merge pull request #1854 from gianlucafiore/fix/layout-paper-units-independent-of-model
fix(plot): keep paper layout dimensions independent of model units
2026-10-16 19:17:11 -03:00
Karim Jerbi 8265444fd6 test(explode): cover ByBlock transparency and linetype on EXPLODE
The codec explode resolver started resolving those two in e6486c0.
These two tests cover the command path: the INSERT's ByBlock children
take the insert's transparency and linetype, and a child that already
names its own keeps them.
2026-10-16 22:18:57 +01: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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
2026-10-16 23:10:27 +03:00
gianlucafiore b7629c4895 test(selection): keep the held-gesture setup readable 2026-10-16 17:00:53 -03:00
gianlucafiore 6cafa1e3ac test(selection): cover quick click boxes and intentional held lasso 2026-10-16 17:00:24 -03:00
gianlucafiore afb2585468 fix(selection): favor quick click-click boxes over eager lasso drags 2026-10-16 16:58:35 -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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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
gianlucafiore 590ca17f94 Merge pull request #1853 from gianlucafiore/fix/extension-guide-visual-anchor
fix(osnap): keep Extension guides anchored when moving the cursor
2026-10-16 16:16:29 -03:00
ramox81andClaude Opus 5.5 0158ea533f Merge upstream main; codec and kernel patches on branches merged with it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 22:12:01 +03:00
gianlucafiore c535ba55f5 fix(plot): keep Layout paper units independent of model INSUNITS 2026-10-16 16:08:36 -03:00
ramox81andClaude Opus 5.5 0b179a862e Merge upstream main; codec patch on the palette branch merged with it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 22:03:16 +03:00