Commit Graph
1484 Commits
Author SHA1 Message Date
FredApps 0e7e0f59f0 Merge pull request #2434 from vangel76/perf-nurbs-derivative-stack
perf(geom): make NURBS derivative allocation-free up to degree 10
2026-11-09 00:04:03 +01:00
FredApps 6cb8e9b1a0 Merge pull request #2755 from vangel76/contributors-vangel76
contributors: set names for vangel76
2026-11-09 00:02:16 +01:00
FredApps 909af5e389 Merge pull request #2939 from FredApps/fix/freebsd-arm64-alpha
Fix FreeBSD ARM64 all-targets test build
2026-11-08 17:24:24 +01:00
FredApps 78810069c7 Merge main and gate the remaining DWG-only unit test 2026-11-08 17:02:58 +01:00
FredApps bd4a47491a Merge pull request #2919 from mkzung/fix/dxf-hard-owned-objects
DXF/DWG: an object a kept object holds by a hard owner reference is kept
2026-11-08 16:57:04 +01:00
FredApps 54c973c919 Merge main to validate proxy preservation and hard-owner retention together 2026-11-08 16:47:57 +01:00
FredApps 53962a5cd5 Merge pull request #2654 from mkzung/fix/opaque-proxy-roundtrip
DWG: keep opaque registered entities and their source classes
2026-11-08 16:44:27 +01:00
FredApps 1434d1017b Use public DXF codecs in the streaming class scanner 2026-11-08 16:31:40 +01:00
FredApps baf2424164 Keep hard-owner liveness monotonic and deduplicate holders in linear time 2026-11-08 16:31:08 +01:00
FredApps ec09c87c43 Keep DXF regressions enabled without the DWG bridge 2026-11-08 16:26:26 +01:00
FredApps a0dfe07f5a Preserve decoded proxy class identities through the DWG bridge 2026-11-08 16:25:00 +01:00
FredApps 9ec5728159 Fix FreeBSD ARM64 test dependency gating 2026-11-08 16:11:26 +01:00
mkzungandClaude Opus 5.5 42490afe8e Merge main into fix/opaque-proxy-roundtrip
Main now has its own proxy class handling for DWG saves (`proxy_classes`, from bf137e2c,
31935157 and 946af874) and the application object conversion of #2917. This branch is
brought onto that:

- Cargo.lock, crates/dwg/Cargo.toml and xtask/src/layers.rs are main's. `dwg` no longer
  depends on `dxf`: the source classes are read from the bridge's ASCII DXF by a bounded
  scan in `proxy_transport::source_classes`, as main's `dxf_class_names` reads their names.
- Saving as DWG 2013 or later restores the source classes in their places (duplicate
  names and metadata kept) when every CLASS record can be written back. Otherwise (before
  2013, a binary DXF, a malformed or unused bad CLASS) main's `proxy_classes` runs: proxies
  are matched by name or left out and counted as unwritten. Nothing returns an error any
  more, so a drawing with proxies saves in its own pre-2013 version, without them, as the
  save report says. A proxy whose number names no source class is left out and counted.
- The loss report is main's `not_saved_as` (`Foreign::proxy_class`);
  `preserves_proxy_entity` and this branch's report test are gone.
- On DWG read, `prepare` runs after `application_objects`, so the proxy objects that makes
  are numbered as the DXF numbers them. It uses main's `proxy_dwg_version`. A registered
  entity with decoded properties and opaque data now stays as read, as on main, and a read
  note names it, instead of being dropped.

Tests: `cargo test -p cadcraft-dwg` 37 passed, `-p cadcraft-io` all passed (25 ignored),
`-p cadcraft-doc`, `-p cadcraft-engine --test save_reports_not_saved` and `--test it`
passed; clippy `-p cadcraft-dwg -p cadcraft-io -p cadcraft-doc -p cadcraft-engine
--all-targets -D warnings`, fmt, `cargo xtask layers` and the wasm32 check of cadcraft-io
pass. `registered_proxy` now checks that a pre-2013 DWG save leaves the proxy out and
keeps the rest; main's proxy tests in crates/io/src/tests.rs pass unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H43qQA41CJLauqXnPgBQ7r
2026-11-08 14:27:18 +00:00
mkzungandClaude Opus 5.5 adf02f9f04 DXF/DWG: a null-owner object goes with a hard owner that is kept
hard_owners took the first object naming a null-owner object in a 360 as its owner, kept or not.
When an object that is left out named it first, the reader dropped the object, though a kept one
held it too, and the save wrote the kept holder's 360 as 0.

hard_owners now lists every object naming it, in file order, and owner_of takes the first of
them that is kept, else the first. The read (retained_objects) and the write liveness pass in
finish run until what they keep settles; a file where no object has two hard owners takes one
pass, as before. The write pass no longer keeps a converted copy of every object's groups.

The test adds an object nothing keeps that names the held record before its holder does: the
held record stays with the holder and the stray object is dropped, DXF and DWG, twice. It fails
before this change ("DXF 1: no record held").

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H43qQA41CJLauqXnPgBQ7r
2026-11-08 14:15:03 +00:00
FredApps e56cc4beeb Merge pull request #2917 from mkzung/fix/dwg-application-object-proxies
DWG: another application's objects are kept as proxy objects of their class
2026-11-08 14:52:50 +01:00
Luis 7a9ec9bae3 Release: refresh contributor credits for each release (#2880) (#2881)
About > Contributors still showed an old snapshot, because nothing
regenerated contributors/contributors.json before a release. Opt in to
the shared refresh from craft-common-actions: a read-only credits job
regenerates the snapshot for the release commit, and the shared release
workflow installs it before every source build. The snapshot is not
committed back.
2026-11-08 01:44:24 +01:00
mkzungandClaude Opus 5.5 1363afb883 DXF/DWG: an object a kept object holds by a hard owner reference is kept
An object whose owner (group 330) is null but which another kept object
holds by a hard owner reference (group 360), as one application's proxy
object held by another, broke the owner chain the reader and writer follow
to decide what to keep: it was dropped, and the holder kept a reference to
nothing. Such an object's owner is now the object that hard-owns it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H43qQA41CJLauqXnPgBQ7r
2026-11-07 23:32:34 +00:00
mkzungandClaude Opus 5.5 3f9e45f726 DWG: another application's objects are kept as proxy objects of their class
An object of another application's class that acadrust has no model for is
read only as its DWG record (ObjectType::Unknown), which its DXF writer
leaves out. The DWG to DXF bridge lost every such object with no note, and
the references to it went too (an extension dictionary entry naming the
object, say).

Each one is now carried as a proxy object of its class (ACAD_PROXY_OBJECT):
the record is split into its common object data (owner, reactors, extension
dictionary) and the streams after it (data bits, R2007+ strings, object
references), as the Open Design Specification for .dwg describes them. The
references are read to the end of the handle stream (to its exact length
from R2010 on), null ones too: a null reference is an empty field, and the
references after it belong to the next fields. Objects of the drawing
database's own classes, and records that don't split, stay as they were and
are named in a note.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H43qQA41CJLauqXnPgBQ7r
2026-11-07 23:32:34 +00:00
FredApps 486d558a78 Merge pull request #2887 from helenkwok/web/page-api
cadcraft-web: window.cadcraft, the page command API from craft-web-api
2026-11-07 15:36:49 +01:00
Helen Kwok 6304abd8f0 cadcraft: keep the ui.screenshot web note inside the table row 2026-11-07 15:29:59 +08:00
Helen Kwok 07b6b8c53a cadcraft: document that ui.screenshot ignores path in the web build 2026-11-07 10:28:05 +08:00
Helen Kwok 14a6cc3cdc cadcraft-ui-egui: ui.screenshot returns the PNG inline on wasm
Without a path the screenshot was written into a private temp directory, and std::env::temp_dir panics on wasm32 (no file system), which stopped the whole web app: the page's call never got a reply and nothing after it ran. On wasm the PNG now comes back inline (pngBase64, width, height, bytes), as ui.render's does. Native builds are unchanged.
2026-11-07 08:11:48 +08:00
Helen Kwok 85b35fc5b9 cadcraft-web: window.cadcraft, the page command API from craft-web-api
The web shell queues the page's calls as control requests (the channel the desktop control server uses) and answers them on the next frame. PendingReply gains try_reply, so a transport that cannot block can poll it, and cancels a request the app has not started when it is dropped, as a timed-out wait does: the page was told the call failed, so the app skips it. The API is installed in every mode; opening, saving, the file name and the unsaved flag stay with the host messages.
2026-11-07 07:59:36 +08:00
Tanish Manku 865fa9afb0 Merge pull request #2874 from storytold/stack/s3
Stage 1 stack 3: land #2403, #1105, #1002, #1908, #1907, #2134, #2371
2026-11-06 15:33:47 -07:00
Tanish Manku 1452ab6f9f Stack 3: CodeRabbit on #2874: editor limits for braces and deep nesting, OK on a rewritten but unedited text, round-off next to zero in the palette, test folder cleanup 2026-11-06 14:58:21 -07:00
Tanish Manku 0140e275f3 Stack 3: the multileader save test saves as 2007 DXF, where a multileader stays one 2026-11-06 14:33:18 -07:00
Tanish Manku 098fa7fd80 Stack 3: #1105's multileader height field takes #2403's ids as they are 2026-11-06 13:44:57 -07:00
Tanish Manku 32db96f5e3 Stage 1 stack 3: review fixes on #1105, #1002, #1908, #1907, #2134, #2371 2026-11-06 13:35:40 -07:00
Tanish Manku 4e36021812 Merge branch 'stk-2371' into stack/s3
# Conflicts:
#	crates/ui-egui/src/i18n/it.tsv
#	crates/ui-egui/src/i18n/uk.tsv
#	crates/ui-egui/src/options.rs
#	docs/gaps.md
#	docs/ui-parity.md
2026-11-06 13:33:05 -07:00
Tanish Manku fafc9e1910 Merge branch 'stk-2134' into stack/s3
# Conflicts:
#	crates/ui-egui/src/i18n/fr.tsv
#	crates/ui-egui/src/i18n/uk.tsv
#	crates/ui-egui/src/lib.rs
2026-11-06 13:32:34 -07:00
Tanish Manku a42760af80 Merge branch 'stk-1907' into stack/s3
# Conflicts:
#	docs/customization.md
2026-11-06 13:32:16 -07:00
Tanish Manku b1263ed3a4 Merge branch 'stk-1908' into stack/s3 2026-11-06 13:31:50 -07:00
Tanish Manku 141a1ac8cd Merge branch 'stk-1002' into stack/s3
# Conflicts:
#	crates/engine/src/cmd/modify2/textedit.rs
#	crates/ui-egui/src/mtext_editor.rs
2026-11-06 13:29:50 -07:00
Tanish Manku 42c1dca89d Merge branch 'stk-1105' into stack/s3 2026-11-06 13:29:27 -07:00
Tanish Manku b36d7aea40 Merge branch 'stk-2403' into stack/s3 2026-11-06 13:29:26 -07:00
FredApps a655cee0c1 Merge pull request #2850 from storytold/house-rules
Copy the shared house rules into AGENTS.md
2026-11-06 14:59:06 +01:00
FredApps aa1c896ef2 Copy the shared house rules into AGENTS.md.
The blocks come from craft-contrib at dde09ea31e2e457f5b4653a6e76f7cdf55944bdf. CLAUDE.md imports AGENTS.md. The house-rules workflow checks the copy.
2026-11-06 11:50:01 +01:00
Tanish Manku 3b7eb1b7bc Merge pull request #2842 from storytold/stack/s2
Stage 1 stack 2: land #2587, #2585, #2608
2026-11-05 20:36:21 -07:00
Tanish Manku 1f11d4f701 Stage 1 stack 2: review fixes on #2587, #2585, #2608
- #2587: a frame turned by anything but a quarter turn keeps its size about its turned
  centre; the box of its two mapped corners collapsed it (a 10 x 10 square turned 45° became
  14.14 x 0, and the OLE header with it) for EXPLODE, REFEDIT, paste and array placement
  (austin62jake, CodeRabbit). Moves, scales, mirrors and quarter turns keep the exact
  corner mapping. `recase` reads only the rewritten digits and a few after them, not the
  whole 310 line (austin62jake). The PR's rotated-frame test expects the kept size.
- #2585: an `output` that contradicts the path's extension is refused, as a device that
  does is; it lost silently to the extension.
- #2608: the window's state is dropped when another dialog took its place (it missed a UI
  pass), so reopening reads the drawing instead of an old unsent edit (CodeRabbit); TEXT and
  ATTDEF get a one-line field (Enter commits), so a line break can't turn into a space on
  save; the module comment says the shortcut menu opens it.
2026-11-05 20:16:44 -07:00
Tanish Manku 412eb84282 Merge branch 'stk-2608' into stack/s2
# Conflicts:
#	crates/ui-egui/src/i18n/zh.tsv
2026-11-05 19:22:54 -07:00
Tanish Manku 173aa38f35 Merge branch 'stk-2585' into stack/s2
# Conflicts:
#	crates/engine/src/cmd/layout.rs
#	crates/engine/src/cmd/layout/tests.rs
2026-11-05 19:22:47 -07:00
Tanish Manku 7218285443 Merge branch 'stk-2587' into stack/s2
# Conflicts:
#	crates/doc/src/extents.rs
2026-11-05 19:22:25 -07:00
Tanish Manku 8e899eef63 Merge pull request #2837 from storytold/stack/s1
Stage 1 stack: land #2584, #1626, #2028, #2107, #2471, #1026, #2612, #2545, #2658
2026-11-05 19:16:39 -07:00
Tanish Manku 417f195cc3 Stage 1 stack: CodeRabbit on #2837 (CLASS places, the first *ACTIVE record)
- #2471: an unnamed CLASS record keeps its place in the class list a DWG maps proxies by,
  so the classes after it keep theirs; a proxy of the unnamed class is left out instead of
  taking the next class's name (the ODA refuses such a DWG).
- #1626: the first *ACTIVE VPORT record is the caller's to say. A first record with a
  usable view but an unusable tile kept no tile, so the next *ACTIVE record was taken for
  the first and its view replaced the saved one (also austin62jake on #1626).
2026-11-05 18:57:19 -07:00
Tanish Manku 2b88b22949 Stage 1 stack: review fixes on #2584, #2471, #1626, #2028, #1026, #2658, #2612
- #2584: a tilted LWPOLYLINE/HATCH run is flattened to at most a million vertices, then
  its arcs stay chords (a hostile file of arcs asked for gigabytes; austin62jake). The
  file-format-parity.md hunk is dropped: maintainers update the parity docs.
- #2471: another program's proxy objects are in the DWG loss report as its proxy entities
  are (left out before 2013, or when their class can't be named); they went silently.
- #1626: a drawing saved at a view keeps it in the desktop app and when it has xrefs: the
  app's first frame and the xref pass both fitted the extents over it. OPEN's result says
  `saved_view`; one `view::saved_view` replaces the copy of `usable_view` in files.rs.
  A misplaced doc comment goes back to its test.
- #2028: a plot rotation (73) outside 0-3 is written back as 0, not as read.
- #1026: the binary code-page retry drops the first pass's tags before it runs (the peak
  doubled near the tag limit); a float spelling of an integer group clamps to what the
  width holds unsigned too, so 65535.0 reads as 65535 does, not 32767.
- #2658: the reference names Undo by the last command ("Undo Group of commands"); Undo
  matched nothing and went to the end of Edit. Ordering and its test share one rule.
- #2612: its test's Insert gets `clip: None` (XCLIP landed after it was written).
2026-11-05 18:34:43 -07:00
Tanish Manku c96d6b2db8 Merge branch 'stk-2658' into stack/s1 2026-11-05 17:23:13 -07:00
Tanish Manku 12db7237cc Merge branch 'stk-2545' into stack/s1 2026-11-05 17:23:13 -07:00
Tanish Manku 831a437f1e Merge branch 'stk-2612' into stack/s1 2026-11-05 17:23:13 -07:00
Tanish Manku b676dd5510 Merge branch 'stk-1026' into stack/s1 2026-11-05 17:23:12 -07:00
Tanish Manku 577b2f74d6 Merge branch 'stk-2471' into stack/s1 2026-11-05 17:23:12 -07:00