Commit graph

2,228 commits

Author SHA1 Message Date
Hakan Seven
8601fd8e4b fix(render): draw block-contained 3D faces 2026-08-19 23:34:10 +03:00
Hakan Seven
c8840e2706 fix(web): force WebGL2 backend
Affected Chromium adapters fail after selecting WebGPU even when packed renderer paths are forced. Use WebGL2 for the web app and let device limits select renderer tiers.\n\nRefs #788
2026-08-19 19:04:58 +03:00
Hakan Seven
97a6322e2a fix(web): use compatibility renderer
Chromium can advertise WebGPU limits that its shader path does not reliably support. Keep web builds on the packed/texture pipelines.\n\nRefs #788
2026-08-18 22:35:39 +03:00
Hakan Seven
7c818d15e9 fix(geometry): honor polyline OCS in commands
Route editing and derived geometry through kernel world-space curves.\n\nRefs #797\nRefs #798\nRefs #799
2026-08-18 22:09:48 +03:00
Hakan Seven
08f4cc97f8 feat(zoom): default to window mode
Keep all existing zoom modes available as interactive options.\n\nRefs #804
2026-08-18 20:29:55 +03:00
Hakan Seven
f4889d4c70 fix(grid): restore viewport visibility
Draw the grid above opaque GPU surfaces and below interaction overlays.\n\nRefs #789
2026-08-18 20:21:14 +03:00
Hakan Seven
f9c3546551 fix(trim): keep retained geometry continuous
Use kernel trim spans so unrelated boundary crossings do not split survivors.
2026-08-18 20:12:30 +03:00
Hakan Seven
afd4c96a78 fix(properties): measure bulged polylines
Merge PR #808 and use kernel area, length, and centroid measurements.
2026-08-18 19:50:08 +03:00
Hakan Seven
3a53a110cc fix(properties): hide unsafe MLine geometry
Merge PR #807. MLine vertex fields mutate stored points without rebuilding dependent geometry.
2026-08-18 19:31:58 +03:00
Hakan Seven
5d4a279c1d fix(properties): correct XLine geometry
Merge PR #806 and route point/direction math through the kernel so valid near-zero directions are not rejected by an application tolerance.
2026-08-18 19:21:50 +03:00
Hakan Seven
c62bbe59a9 fix(plugin): skip non-V4 notifications 2026-08-18 18:46:19 +03:00
ramox81
7687211fbb fix(ellipse): show full end angle as 360
Use kernel closure tolerance so Properties matches geometric classification.
2026-08-18 18:43:16 +03:00
ramox81
c17c25fef1 fix(properties): measure bulged polylines exactly 2026-08-18 16:46:16 +03:00
ramox81
cdd337261f fix(properties): remove MLine geometry section 2026-08-18 16:24:54 +03:00
ramox81
5bd104faab fix(properties): normalize XLine direction edits 2026-08-18 16:09:09 +03:00
ramox81
74c1fe48d8 fix(properties): expose XLine second point 2026-08-18 16:07:35 +03:00
Sebastian
fcd4a278e4 fix(plugin): skip non-V4 plugins in broadcast_notification
PluginManager::broadcast_notification was fanning out host notifications to every loaded plugin. Only V4 plugin processes can receive host->plugin notifications; V2/V3 plugins correctly rejected them with notify_plugin requires V4 protocol.

Add PluginProcess::is_v4() and skip non-V4 plugins in broadcast_notification so V4 document snapshot notifications only go to V4-capable plugins. Fixes repeated console errors for Example, Land Survey and V2 Compat.
2026-08-18 12:12:42 +02:00
Hakan Seven
403247cbc3 feat(i18n): add Bulgarian locale 2026-08-17 23:45:04 +03:00
Hakan Seven
6c3455fb09 fix(plugin): bound shared-memory mappings
Reject malformed or oversized snapshots before mmap and apply checked size arithmetic to both host and reader paths.
2026-08-17 23:22:58 +03:00
Hakan Seven
313349fd71 fix(io): verify saves through edit leases 2026-08-17 23:13:07 +03:00
Hakan Seven
f9e7afdee2 fix(build): scope Windows debug stack
Apply /STACK only to the debug app binary instead of every Windows target artifact.
2026-08-17 22:46:50 +03:00
Sebastian
fcffa13693
fix(build): increase Windows debug stack
Increase the Windows debug executable stack reserve to prevent startup overflow.
2026-08-17 22:40:45 +03:00
Hakan Seven
04b9363666 test(plot): verify printer property commands
Use exact platform-specific command expectations.\n\nRefs #773
2026-08-17 22:29:47 +03:00
Ngo Quoc Viet
3a94c37eea
fix(plot): open selected printer properties
Open the selected printer's properties on Windows and retain the printer-list fallback.

Refs #773
2026-08-17 22:26:29 +03:00
Hakan Seven
ac3392d81b fix(commands): reset selection gestures
Clear held box and lasso input before a new command starts.\n\nRefs #732
2026-08-17 22:16:14 +03:00
Ngo Quoc Viet
ba990d440e
fix(commands): cancel pending marquee
Cancel a pending selection marquee before starting a non-transparent command.

Refs #732
2026-08-17 22:11:41 +03:00
Hakan Seven
687023391e fix(flatten): project entities through kernel
Invalidate scene caches through entity updates and reject projections
that cannot be represented without changing geometry.

Refs #728
2026-08-17 21:59:09 +03:00
Ngo Quoc Viet
69604012d6
fix(flatten): project polylines and planar faces
Add initial FLATTEN coverage for polyline families, SOLID, and 3DFACE.

Refs #728
2026-08-17 21:40:17 +03:00
Hakan Seven
aab30f1b5e fix(blocks): preserve insert unit scaling
Compose unit conversion with authored transforms and attributes. Keep unit-factor display and the full INSUNITS mapping consistent.

Refs #706
2026-08-17 21:32:28 +03:00
Hakan Seven
a65ba28270
Merge pull request #776 from NgoQuocViet2001/fix-unitless-block-insert-scale
fix(blocks): don't unit-scale unitless block inserts
2026-08-17 21:17:55 +03:00
Sebastian
73bb7bd673
1GiB guard for mmap
Adding a MAX_GUARD for mmap to file
2026-08-17 18:25:15 +02:00
NgoQuocViet2001
c88f07d219 fix(io): stop the drawing lock blocking our own reads on Windows
Saving to a path that already holds a drawing fails on Windows with
"could not verify <path> before saving: ... (os error 33)". Save As over any
existing drawing is affected; saving to a new path is not.

EditLease::acquire() opens the destination and takes the platform drawing
lock on it, then the save fingerprints the same path to check nothing changed
underneath. LockFileEx is mandatory and scoped to the handle that took it, so
that second open is refused against our own lock, lands in the non-NotFound
arm and aborts the save. flock on Unix is advisory and the second open
succeeds, so neither CI nor a Linux desktop sees it.

Read through the handle the lease already holds instead. A duplicate shares
the lock ownership, so the pre-replace re-check on the save worker can use
one too rather than re-opening the path.

The same collision reached the headless open op, which read a path this
session may hold leased: automation's save_then_open_round_trips fails on
main for that reason, one line after the save it no longer reaches.
2026-08-17 22:49:54 +07:00
Nikolay Ninkov
777cf3b6a6
Add Bulgarian localization for OpenCAD Studio
The translation is ready for use.
2026-08-17 15:33:31 +03:00
Hakan Seven
0b5d4bd311 fix(mtext): honor background contrast
Preserve stored dimension fills and rotate text backgrounds with their labels.

Refs #774
2026-08-16 23:58:17 +03:00
gianlucafiore
252224f546
Merge pull request #778 from gianlucafiore/fix/annotative-mtext-leader
Fix annotative MTEXT attachment alignment
2026-08-16 16:20:45 -03:00
gianlucafiore
3603346a19 fix: keep annotative mtext anchored to insertion point 2026-08-16 16:17:04 -03:00
Hakan Seven
36e0e40b36 perf(raster): avoid needless image resampling 2026-08-16 21:22:58 +03:00
NgoQuocViet2001
319af57711 fix(blocks): don't unit-scale unitless block inserts
A unitless block has no source length to convert from, so falling back to
MEASUREMENT gave it an inches or millimetres identity it never had and
scaled the reference on insert. The properties panel reported unit_factor
1.0 for the same insert.

Skip the conversion when either the block or the drawing is unitless.

Fixes #706.
2026-08-17 00:36:49 +07:00
Karim Jerbi
32c3844526 perf(ribbon): stop building and laying out 5 panel renderings per frame
Each ribbon panel was rendered five ways every frame so CollapsePanels could
roll back to any density at layout time: full, compact, button, tight and a
full-size flyout that duplicated the full rendering.
The layout pass ran four full measure-layouts per panel even in forced modes,
and the degradation decision was an untested u8 inline in Ribbon::view.

Now the choice is a pure, unit-tested decide_levels() whose levels are a typed
Level enum (Full/Compact/Collapsed/Tight). Panel carries its four renderings
as elements: [Element; 4] indexed by Level, with a slot(i, level) helper for
the tree stride. Forced modes (Full/Compact/Collapsed) measure nothing at all
and derive the row height from the placed panel. The open flyout draws the
panel's own `full` rendering inside a self-drawn box (identical weakest-bg +
1px neutral-border to the container it replaced), so no duplicate
render_group is built per panel per frame. Level, Panel, Widths, CollapsePanels
and decide_levels are pub(crate); CollapseMode stays pub (re-exported).

Tests (collapse.rs tests module, added RED first):
- forced_modes_pin_every_panel
- auto_huge_width_keeps_everything_full
- auto_degrades_from_the_right_one_panel_at_a_time
- auto_stops_degrading_once_the_row_fits
- auto_escalates_a_single_panel_past_collapsed_to_tight
- auto_cascade_drops_every_collapsed_panel_to_tight
- auto_runs_the_compact_phase_across_the_row_first
- no_panels_stays_empty
- single_panel_walks_the_whole_ladder
- zero_widths_never_overflow
- endless_row_degrades_everything_to_tight
- unbounded_row_keeps_everything_full
- nan_budget_degrades_both_phases_but_no_tight_cascade
- exact_fit_at_full_stays_full
- matches_the_pre_refactor_algorithm: byte-equivalence sweep against the
  verbatim pre-refactor u8 algorithm (280 width/budget combos incl. the
  degenerate 0/0/inf/NaN inputs), proving the decision logic is unchanged.

Measured with the committed #[ignore]d benchmark
(`cargo test --lib --release -- --ignored --nocapture bench_ribbon_view_construction`)
run as one instrument across pre-change / this change: Ribbon::view()
construction ~676 -> ~425 us/frame (~37% of view construction saved); forced
modes run 1 layout call per panel per frame instead of 5.

Verification: cargo build clean; cargo test --lib = 382 passed (367 baseline
+ 15 new ribbon tests) / 2 known pre-existing failures unchanged
(save_then_open_round_trips, tilted_ucs_places_planar_entities_with_the_plane_normal).
2026-08-16 10:23:44 +01:00
Hakan Seven
6df23ad8c2 fix(snap): handle desktop runtime paths
Strict confinement uses a private runtime directory while the Wayland socket remains in the host directory. Resolve the accessible socket path, provide bundled XKB data, and fall back to X11 only when needed.
2026-08-16 09:13:18 +03:00
Hakan Seven
ca959a31e0 fix(snap): preserve payload layout
Snapcraft strips the sole usr directory from tar sources, so extract the artifact directly and retain its desktop-file path.\n\nAdd a snap-only manual target to avoid rebuilding other platforms while validating packaging fixes.
2026-08-16 08:38:51 +03:00
Hakan Seven
2d9b828b87 ci(snap): build from shared Linux payload 2026-08-16 08:16:09 +03:00
Hakan Seven
679c471c61
Merge pull request #586 from Nozzit/snap-packaging
feat(snap): Snap Store packaging
2026-08-16 08:08:19 +03:00
Hakan Seven
2d2ea97613 chore(release): prepare v0.9.6 2026-08-15 23:33:18 +03:00
Hakan Seven
5630f48b4e feat: improve start page links 2026-08-15 23:33:18 +03:00
Hakan Seven
da3488ed00 Merge pull request #711 2026-08-15 23:11:37 +03:00
Hakan Seven
2b224d390f feat: add subreddit to start page 2026-08-15 23:11:29 +03:00
Hakan Seven
1dded7f881 fix: restore workspace verification 2026-08-15 23:11:26 +03:00
Hakan Seven
d36134900d chore: update workspace dependencies 2026-08-15 23:11:21 +03:00
Hakan Seven
405da13a65 docs: move translations under docs/readme 2026-08-15 22:14:22 +03:00