Kernel: fillets and chamfers along plane-cylinder rulings; blend
booleans refused when they change the solid by more than their tool.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Kernel: spline normals and tangents kept while a body is meshed —
solid display of spline-heavy drawings up to 2.7 times faster.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Kernel: spline surface search grid kept, ray/control-net box test,
sampled proximity-mesh deviation — booleans on spline solids several
times faster.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Kernel: shell for solids run straight between two caps (plates with
holes, walls bent round arcs).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Kernel: fillets and chamfers round plane-cylinder/cone circles (hole and
boss rims, countersinks), shell for any planar solid, NURBS projection
onto the right pass of a looping curve, straight rational profile
pieces, slice section precision.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A region's loop area sums its pieces with Curve::chain_area, the
composable share: enclosed_area closes an open polyline by its chord.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Island cuts stay inside the face; MASSPROP falls back to a coarser mesh
when the finest leaves a face untriangulated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Pins: codec 8189f83, kernel a82f17d, graph d3558bb (all manifests and
the python plugin lock).
- MASSPROP reports volume, centroid, inertia, products, radii of
gyration and principal moments of 3D solids and bodies from their
B-rep (exact where analytic, else from a fine mesh).
- OFFSET of ellipses and splines through the kernel's curve offset.
- FILLET between circles, ellipses and splines through the kernel's
curve-curve fillet, trimming arcs and open splines to the tangents.
The kernel bump brings the DWG ACIS audit fixes: slices, booleans and
press/pull on cones, slanted cylinder sections, survey coordinates,
spline walls and touching parts.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- refresh_associative_sweeps runs on every edit and scanned the xdata of
every entity; it now returns at once when no associative swept surface
exists (its application is not registered) and looks at surfaces only.
- An arc's end angle was raised by TAU in a loop, which never ends on a
huge angle from a damaged file; the sweep is taken with rem_euclid.
- The sweep DELOBJ test expected surface sweeps to delete their sources,
which #1663 changed on purpose: an associative surface keeps them.
- codec c9ffcac (opencadcodec #103) adds an explicit viewport-off bit: the
viewport on state is read with is_on() and set with turn_on()/turn_off()
everywhere, so a viewport the file marks off shows off and can be turned
back on from Properties.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SWEEP: base point from the path; kernel sweep validity fixes
The fork pin the PR carried ([patch] to ramox81/cadkernel 30b3810) is
resolved to upstream instead: kernel 99b6b48 (opencadkernel #78-#83),
codec c9ffcac (opencadcodec #102, #103), graph 7f6aae7, in every manifest.
The Properties palette reads the layer names when it is built, and a
layer rename only refreshed the layer panel and the ribbon, so the
palette's layer list kept the old name beside the new one. The layer
panel refresh now rebuilds the palette whenever the set of layer names
changed: rename, new, delete and purge all pass through it. A layer
toggle that leaves the names alone does not rebuild it, as the rebuild is
costly for a large selection.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Idle and object selection drew the same cursor, crosshair arms with the
pickbox, so the cursor did not tell a pick from a free move. While a
command gathers a selection or waits for an object pick the arms now go
and the pickbox stays: idle keeps arms and box, point input arms and dot.
Fixes#1661
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On a non-Retina screen macOS draws the interface at 1x, which reads small
on a Full HD monitor, and there was no way to enlarge it. Options >
Display now offers an interface scale of 75–200 % in 25 % steps, applied
through the window's scale factor on top of the display's own and kept
with the user settings. It is a list rather than a slider because the
dialog rescales under the pointer as the value changes.
Fixes#1655
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PURGE repeats until a pass removes nothing. A drawing whose complex
linetypes use shape files carries unnamed STYLE records for them; the
table holds those under keys the empty name does not reach, so every pass
listed them again and removed nothing, and the loop never ended.
- Unnamed and shape-file styles, and styles a complex linetype reaches by
handle, are never listed for purging.
- In-use checks compare names case-insensitively, as the tables do, so a
layer, style or linetype referenced as WALL is not purged as Wall.
- Counts are what the tables actually removed, and a pass that removes
nothing ends the loop.
Fixes#1662
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Language gains lo-LA, labelled ລາວ in every catalog, so the new
translation can be chosen.
- Two Lao keys under stale names now use the catalog's names, and the
touchpad option added since gets its Lao label.
- The web build gets a Lao font (Noto Sans Lao, generated like Thai) and
routes Lao and Thai drawing text to their fonts; Thai had a font but
was never routed to it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Outside macOS a touchpad's two-finger drag arrives as wheel scrolls that
nothing tells from a wheel. A new option (Options, off by default) makes
every scroll pan and Ctrl+scroll — what a pinch sends there — zoom.
Fixes#1560
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DWG layout owners and the overall paper-space viewport read back as
written (opencadcodec#78, opencadcodec#80).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
select takes window [x1, y1, x2, y2] in world XY, with crossing to also
take what the box crosses. It runs the viewport's own box test, now one
helper (box_selection_handles) that the drag and click-move-click
gestures share; the drag gesture applies the selection filter as the
click one already did.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The closed combo is at least 250 px wide (about 25 characters of name)
and its dropdown 300 px.
Fixes#1648
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The text was placed by its alignment rather than its attachment point,
so text on the left of the landing ran over the leader. It now attaches
by the attachment point, and putting the text on a side (on creation or
by a grip) turns left- or right-justified text to read away from the
leader.
Fixes#1646
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Circle and ellipse shaders scaled the pattern length by the linetype
scale (PSLTSCALE in a viewport, annotation scale in model) but not the
dash and gap elements, so a dashed arc broke into dots.
Fixes#1644
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
COPY and PASTE kept the source's reactors on each copy, so a copied
dimension still pointed at the source's dimension association (and
boundary or group members at the source hatch or group). Another
application reports such a drawing as damaged and, after recovery,
moves the dimensions. A copy's reactors now follow only targets copied
with it; group copies give their members the new group's reactor; and a
drawing opened with such stray dimension reactors has them dropped.
Fixes#1645Fixes#1649
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The paste kernel added every entity to model space. It now takes the
space a new entity goes to: the block being edited, a layout's paper
space when no viewport is active, or model space.
Fixes#1652
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Cargo: drop the fork patches; codec 8e93175, kernel 0665fc9, graph
3b91e67 in every manifest and lock.
- A swept surface's expression link is written through set_entity_xdata,
so OCS_SWEEP_EXPRESSION has its APPID record and the record its handle.
- Applying the whole named-parameter table also rebuilds the swept
surfaces linked to expressions, not only a single-row edit.
- swept_surface_entity keeps its doc comment.
- The native-constraint tests find a scope's network through its own
dictionary, where it is now stored.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The refused-path message split its format string across a raw line
break; it uses \n. The reference-length and new-length prompts SWEEP no
longer shows leave the catalog and all 21 locales. Lines past the width
limit in the UPDATEFIELD and automation select changes are wrapped.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Eight messages with %{name} arguments went through the positional
formatter, which printed "%3" for a count, and their catalog entries
held %__ocs_fmt_N__ where the named form is expected. They take named
arguments now, and the entries — and those of the selection and HATCHEDIT
prompts with the same fault — use __ocs_arg_<name>__.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ctrl+click on a composite selects it with the solid under the cursor as
the one its palette and grips edit: the solid whose own surface passes
through the picked point. With its history shown, a composite draws the
edges of the solids its booleans joined, each where it sits.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
grips lists the selection's grips; grip_drag moves one to a world point
through the viewport's own grip gesture with snaps, ortho and polar off;
click presses the left button where a world point shows, optionally with
Ctrl and/or Shift held.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With SOLIDHIST on, UNION, SUBTRACT and INTERSECT no longer reduce the
result's history to a frozen body: each solid's history joins the
result's under a boolean step, in the order the result applied them.
The Properties palette lists a composite's solids under Operand; the one
chosen shows its own geometry rows and grips, placed where it sits in
the composite, and editing it replays the whole tree. A composite read
from a file keeps its saved body; the tree is replayed only on edits.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Display gets a command line text colour (blank keeps the theme's); it
covers history, prompts and the input, while errors stay red. Files
lists the fonts folder that text resolution searches, so .shx files can
be added by hand; opening it creates it first.
Discussions #1493, #1372
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Before a grip is picked, the crosshair now jumps to the grip under it, so
the click lands where the marker shows.
Discussion #1557
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The no-selection panel showed only the AC code. It now reads e.g.
"AC1032 (2018+)", from the version the file was opened as.
Discussion #1442
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An aggregate of irregular stones on a 25.4 tile, built from edges whose
slopes repeat on the tile so every stone closes.
Discussion #1533
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3DROTATE (ROTATE3D) took the drawing's rotation path, so a polyline only
turned in its own plane. It now asks for a base point, an axis — X, Y, Z
or a second point — and an angle, and rotates the selection about that
axis in space.
Fixes#1641
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The dimension's own block parts were mirrored with their text, so the
measurement read backwards. Text orientation is kept under reflection,
the same as TEXT and MTEXT with MIRRTEXT off.
Fixes#1639
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Center and Quadrant found nothing on a polyline's bulge segments: the
lightweight and heavy polylines carried no snap points for them, and a
polyline split into several wires kept its points on one piece whose box
the others' never reached. Each arc segment now carries its centre and
quadrants, hovering the segment offers its centre, and a wire's box
covers its snap points.
Fixes#1640
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It stamps sheet set data, which the web build does not have; the wasm
check failed once #1627 split it out of prepare_native_save.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sweep history records in the reference layout.
Pins resolved to upstream: codec bff95f5 (#93, #94, #95, #96, #97 and
review fixes), kernel 6146d31 (#75 and review fixes), graph 9635ba7.
- main already rebuilt an edited table's block; the PR added a second
loop after it that could never fire. Formula refresh and the block
cache bump now live in the one loop.
- Formula refresh copies the drawing only for a table that has a field.
- A field cell lays its text out once and boxes it from those cells.
- A zero text height at one level falls through to the next instead of
ending the lookup.
- Field box constants and BACKGROUND keep their own doc comments.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- One visible-named LRM constant (ttf_glyph) instead of two invisible
literals. Stroke and SDF text skip it, so a right-to-left script the
shaper does not handle no longer gets a 6-unit gap per mark; vertical
MTEXT does not insert it at all.
- Shaped cells keep a cluster the shaper merged into the leading mark.
- The always-false RTL paragraph flag, its indent/anchor branches and the
unused reorder_line_atoms are gone; its test now covers reorder_rtl_runs.
- Underline, overline and strike follow each drawn run of a mixed word.
- Justify/distribute count only the gaps the measured width holds.
- The two RTL alignment tests assert the new left-to-right behaviour;
glyph_boxes keeps its own doc comment.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- UPDATEFIELD stays the command main already had (Select objects, undo,
locale strings); it now takes the PR's reach — a block reference's
attributes and block definition, a table's cell texts — and reports
the fields that really changed. The PR's second implementation and its
duplicate registration are gone.
- FIELDEVAL's range error goes through the locale catalog.
- Field boxes: no slicing inside a character, one layout per multi-line
attribute, and TEXT boxes scale about the annotative reference point
like the glyphs do. Comment and indentation put back where they belong.
- bump_text_hosts classifies every host in one pass over the drawing
instead of scanning all layouts and blocks per host.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The ROMANS advance list was pasted twice; once is enough.
- The stroke-font golden checksum follows TXT's new advances (segment and
vertex counts unchanged).
- The tolerance compartment test checks ink against pen only for symbol
cells: text fonts now advance by the reference's pen, not their ink.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A blank script line outside a command repeats the last command through
dispatch_command, as the command line's empty Enter does.
- ZOOMFACTOR bound docs describe the SETVAR range the PR widened, and the
test keeps checking the value the Options field reaches.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Fillet/chamfer hole and boss rims, edges of non-convex bodies, and a
chamfer next to a fillet (and the reverse).
- Fillet after an extruded PRESSPULL: booleans now join coplanar faces.
- Union/subtract/intersect of a sphere with an off-axis cylinder.
- Web open dialog lists drawing templates.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Text styles keep their TrueType typeface through save and reopen (codec
reads and writes the STYLE record's ACAD extended data) (#1633)
- Unnamed shape-file entries no longer show in text style lists (#1634)
- Save As offers DWT 2018; NEW asks for the template to start from, while
Ctrl+N and the quick-access New run QNEW with the default template (#1635)
- An edge next to an earlier fillet of the same radius rounds together with
it (kernel); the solid stays drawn and pickable while edges are chosen
(#1625, #1107)
- A full cache rebuild drops the B-rep cache too, so an undone fillet does
not come back with the next edge operation (#1107)
- Selected solids in shaded styles highlight only their visible edges (#1031)
- VIEW ISO / SWISO / SEISO / NEISO / NWISO snap to the isometric corners
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Dynamic-input fields take ' and " and read 2'9" / 3' as lengths (#937)
- STRETCH on a selection made by a crossing window stretches through that
window and goes straight to the base point (#1068)
- STRETCH's crossing-window steps show no coordinate boxes (#657)
- Collapsed ribbon panel titles wrap at words, never mid-word (#920)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes:
- Font prompt no longer lists bundled ltypeshp/qcadshp shape files (#1626)
- Wide polylines step at a discontinuous segment width; PEDIT marks the
current vertex; keyword steps refresh the command preview (#1628)
- Radius-0 fillet drops the zero-length segment it left, so the corner
fillets again (#1422)
- FILLET Trim / No trim option (#1558)
- True-colour wires plot in their own colour; colour picker stores the
value it shows (#1621)
- Model tab keeps its page setup; "Save changes to layout" in Model (#1620)
- QNEW default template in Options > Files; .dwt in the open dialog
(#1134, #1113)
- GRIDUNIT / GRIDMODE / PERSPECTIVE variables (#1618, #1524)
- PTYPE (#1433)
- ZOOM nX / nXP (#1465)
- CHSPACE between model and paper space through a viewport (#1428)
- Moving a dimension keeps its automatic text placement
- Shell icon; "&&" button labels (#1554)
- LINETYPE Load from a .lin file (#1588)
- XLINE / RAY hide the crosshair arms (#1437)
- Dynamic-input boxes keep clear of the crosshair and each other (#1546)
- Snap marker colour setting, dark default on light canvases
(#1497, #1229, #1128)
- Dimension style precision as a 0.00 pattern dropdown (#1426)
- Node graph nodes left of the origin no longer clip away (#1592)
- Collapse button in the command history header (#1094)
- Freeze-in-current-viewport toggle in the ribbon layer list (#1466)
- Geometric Center object snap for closed polylines (#1369)
New strings translated in all 21 locales.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings codec PRs #84 (cross-version visual styles, table styles,
subentity managers), #88 (viewport clipping flag, DXF boundary handle),
#89 (DXF viewport snap/twist in degrees) and #92 (field format codes,
event updates).
With #88 a viewport keeps a stored boundary whether or not clipping is
on, so a linked boundary alone no longer means "clipped": rendering,
paper picking, VPCLIP and the Clipped property check the clipping flag
too, and VPCLIP / MVIEW Object and Polygon set it. Before, OCS never set
the flag, so its clipped viewports opened rectangular elsewhere.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The codec now carries upstream acadrust 0.6.0 (foldhash, thiserror 2,
MLINE / legacy class / layer handle fixes). Its new Spline::dwg_scenario
is serde-skipped, so the Python plugin's generated entity records could
not name it; they now take such fields from the type's Default.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Both PRs registered "Requires an integer between {min} and {max}." under
their own key; keep the sheet set one, which every locale translates.
- Pin the MCP tool schema digest with the sheet set actions added.
- searchable_layer_coexists_with_outlines read glyph outlines from the
shared atlas while other tests could re-bake it, and failed now and
then; lay out and export under one atlas generation.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Count adds automation actions to the MCP tool surface and a Count row to
the idle context menu; update the pinned digest and the expected height.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- SSM* / SS* sysvar messages and the Place on Sheet prompt go through
t!/tf!, reusing the existing catalog entries where they exist; one new
key (integer range) is translated in all 21 locales.
- The SETVAR prefix is matched case-insensitively.
- The stale "SHEETSET ... not yet implemented" key is removed from the
catalog and every locale.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Restore the web no-op of `sync_drawing_locks` and keep
`stamp_sheet_set_data` (called only by the native save) out of the web
build.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The glyph-text icons (refresh, swap, remove, submenu and step arrows)
are SVG icons from ui::icons (new REFRESH and SWAP) or plain labels.
- The custom RowMenu widget is removed: Sheet Views / Model Views rows use
iced_aw::ContextMenu like the Sheet List rows, with a submenu expanding
in place while hovered.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Invalid Area "Undo" reverts the step that lost the boundary (redo after
an undo, undo otherwise), checks the boundary is back and otherwise puts
the step back and continues without the area; no auto-undo loop.
- COUNTCLOSE / area replacement remove the count polyline outside the
history instead of as an undo step of their own.
- UPDATEFIELD re-evaluates the field texts of a table's *T block and
reports the number actually updated.
- Zoom to a counted object goes through the f64 handle_zoom_to_window.
- Palette: SVG icons instead of glyph text, list cache keyed by tab id,
cached result borrowed instead of cloned, "Count" as the source text.
- Command-line messages go through t!/tf! with entries in all locales.
- Cleanups: \n escapes, area comment, unused parameter, comment order.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- refresh_table_block no longer runs for every table change: only tables
whose picture reference this app dropped while editing them (and new
tables without one), never on appearance-only bumps. Moved, restyled or
freshly opened tables keep their authored *T block. TABLE edits now drop
the picture reference like the other table edit paths.
- set_count_display recolours just the handles whose count class changed
(restyle path + recolor_meshes_for_handles); only entering or leaving
count mode rebuilds the whole drawing.
- Count colouring keeps insert instancing: counted and duplicate wires get
their own instance groups instead of dropping render_instance.
- The hatch backdrop takes the count colour too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The wizard's folder scan, Import Layout as Sheet, the template layout
lists and the drawing cache behind Model Views, Place on Sheet, callout /
label blocks and block previews parsed whole DWGs on the UI thread. They
now go through the shared `background_task` worker: a cache miss reads the
drawing and handles the message that needed it again. Block previews lend
the cached drawing to the preview scene instead of cloning it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1617 pinned the codec at ramox81/cadcodec through a [patch] block. Its
codec PR (#83) is merged upstream together with #85 and #86, so every
manifest now pins the upstream revision and the patch is gone.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Place on Sheet gives its viewport a unique id (shared
`Scene::next_viewport_id`, also used by the normal viewport commit).
- Renaming a sheet's layout in an open tab records undo and marks the tab
modified; in a closed drawing the previous file is kept as `.bak`
(ISAVEBAK) before it is written back.
- New Sheet saves the drawing before the `.dst`: a failed save leaves no
sheet behind.
- Rename & Renumber Previous/Next no longer panics on an empty list.
- Leftovers: unused binding, a hard-coded localized Documents path.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A VIEW record's centre is an offset from its target in view coordinates.
Views saved by earlier versions stored the target itself as the centre;
treating that as an offset put them (and VIEW plots) at about twice the
coordinates. One shared `named_view_center` now resolves the centre in
f64 (DVec3/DQuat), taking a centre equal to a non-zero target as the old
convention; VIEW RESTORE, the view plot window and Place on Sheet use it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- `.dst` read/write go through native-only helpers (a browser answers
"Not available"); the folder pickers are web no-ops; time stamps use
iced::time (web-safe).
- Lock files are written only for drawings that are sheets of an open set,
released when the last set closes, and a lock a crashed session left
(recorded with its process id, same user and machine) is taken back.
The `.dwl2` header is well-formed and the date line comes from the OS
long date on every platform. The 1 Hz poll runs only while a set is open.
- Refreshing sheet set fields never stores `####`: fields no open set
resolves keep their value, and only the hosts that changed are redrawn
(and their tab marked modified).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- #1602 changed the COMMANDLINEFADETIME help text and added "Never"
without catalog entries, so both showed in English everywhere. Add
them to the catalog and all 21 locales; drop the "0 skips them" key.
- #1606 named another CAD vendor in a doc comment and two test names.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>