AGENTS.md, CONTRIBUTING.md and the contributing skill say how the work is
split since 0.40: SolidCraft is the application and calls the solidcore API;
geometry math (evaluators, intersections, solvers, tessellation, kernel cases)
is added to solidcore first. New features are discussed on Discord, then get
an issue and a claim, after a search of all issues and pull requests, open and
closed, for similar work. Work begun before 0.40 is ported onto today's code
before it lands. The kernel-paused section becomes "Kernel work goes to
solidcore".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #8517
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* web: editing embed for host pages (?embed=editor, #8517)
A host page that keeps the files itself and frames SolidCraft for modelling needs
the modelling UI without the application chrome. `?embed=editor` runs the web app
as such an embed:
- no application bar (logo, File menu, document tabs, update, help, report a bug)
and no start page; the layout is docked;
- the ribbon, browser, timeline and properties stay; Ctrl+Z and Ctrl+Y still undo
and redo;
- Ctrl+N, Ctrl+O, Ctrl+S, Ctrl+W and Ctrl+, are left to the host;
- nothing is kept in the browser (no stored designs, autosave, recovery prompt,
preferences or leave-page prompt), as with the existing viewer embed.
The existing `?embed&open=` viewer embed is unchanged. SolveApp gets one flag,
`embed_editor`, for desktop and test hosts too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* control: document.export / document.import / document.saved for a host (#8517)
An editing embed's host keeps the design itself. Three control methods
(window.solidcraft.request in the browser; the desktop control channel too; not
the agent chat's, whose method list is unchanged):
- `document.export` -> {name, revision, dirty, format: "json", text}: the active
design as a `.json` design file holds it. `revision` is the one
`document.revision` answers, so a host that follows the design compares one number.
- `document.import {text, name?}`: replaces the active design with that text,
timeline and parameters as saved, opened saved with a new `document_id`. It runs
as a design opened in a tab of its own, with the old tab closed without asking,
so whatever was open in the old design leaves with it. A text that does not read
leaves the design as it was. Waits behind a file loading or a design change, as
commands do, and evaluates on the window thread.
- `document.saved {revision}`: the host saved that revision; refused when the
design has changed since.
They are control methods, not commands: they act on the app's open design. The
browser API test gets a round trip through all three.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: aduijs <7501203+aduijs@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Model cache: a body made by rounds keeps them, so a later round blends them the same after opening
A design gave another body when opened from its model cache: the rounds a body was made of
lived only in memory, so a later round at their mitre was built sequentially (or refused, as
too large) after opening and blended with them when evaluated anew. The saved model now
records, per kernel body made by rounds, the body they were made on (a place in the bodies,
stored once though no state holds it) and the edges with their radii; reading it attaches
them back down each chain, and a thinned model keeps those bodies with the bodies made from
them. Model cache format 7.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: a corner patch of rounds 2/3/4 takes no more than the strips leave in its block
three_rounds_at_a_corner bounded the patch's extra cut at 3 mm³ beyond the strips, a figure
with no derivation; SMLib's all-at-once body at radii 2, 3, 4 takes 3.099 (V 7878.579574
against strips 7881.678). That body is the strips' outside the block its patch lies in: its
rounds are the strips' cylinders ending at a's section y = rc, b's x = 20 − rc and c's rails
where they meet a's and b's (the patch's four corners, now asserted), so the patch takes at
most what the strips leave in that block (11.86 at 2/2/3, 32.69 at 2/3/4). The lower bound is
that block; the upper one, at most the strips' volume, stays.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: the io crate's hand-built saved models list their rounds, as format 7 records do
Model cache format 7 (f3cf0c4f3) records a `rounds` list in every saved model, and reading one
without it is refused ("saved model: rounds"), as is a model without any of its other lists:
the states, the preview and the thinned model all came back empty. The io tests' saved_model
and timeline_model wrote format-6 records, so six tests (the round trip, the repeated part
stored once, and the four too-big-for-the-file cases) read nothing. Their bodies are none made
by rounds: the list is empty, and every expectation stays as it was.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* SMLib: pin eaa998a (tangency-labs/smlib#68, #69, #70)
Batch 4: drafts and loops, mitre corners, rim chamfers, rulings, tight box, stitch, point
classification, eased corners. Batch 5: a face's tight box divides its cells at the surface's
knots (thread boxes exact); a cylinder, cone, sphere or torus is extended along its own circles.
Batch 6: a revolution's extension closes its turn; a dropped point's foot is the converged one.
The C API is ABI 5 (smlib_blend_dropping and smlib_brep_classify_point are new; nothing existing
changed), so the binding expects 5.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: a strip's tangent and curvature run-offs are the distance long across the surface
SMLib measures an extension's distance across the surface (smlib_extend_sheet corrects
CreateExtendedSurface until the parameter line through the side's middle is that long), so each
run-off of the cylinder strip, swept 20 along z, adds 5 x 20: 10 pi/2 20 + 100 = 414.159 for
both. The parabola-length formula (418.18) was truck's.
Ruling d2 (2026-10-30).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: one smooth angle, and a round too small to change the part is refused
The blend's tangent angle is the shaded view's half degree (smooth_edges::ANGLE), one value
for smooth. A constant round lies r (sec(d/2) - 1) inside the crease it replaces (about
r d^2/8); below the edge's tolerance it changes nothing and is refused before SMLib (which
answered SM_ERR_INVALID_INPUT), naming the smallest radius that rounds,
tolerance / (sec(d/2) - 1). d is the least turn along the edge
(tangent_edge::least_angle_along, at tangent_all_along's stations).
Ruling d3 (2026-10-30). The block's tolerance is 2e-5 mm, not 0.1 um: at 1 deg the smallest
radius is 0.526 mm, so R2 and R20 reach SMLib, which still calls an edge within 2 deg smooth
(SmEdge::GetBlendEdgeuse); that test is ignored until SMLib uses 0.5 deg.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet rig: the knife-edge chamfers name SMLib's cause, a cusp's ball radius of 0
smlib_chamfer turns the distance into a ball radius d sqrt((1 - c)/(1 + c)), c the faces'
binormals' dot (capi chamfer_radius); at #851's cusp the binormals agree, the radius is 0 and
the call is SM_ERR_INVALID_INPUT before the fillet executive runs (gdb: chamfer_edges sees
radius 0; the dump's why is empty). SolidCraft hands every chamfer to SMLib, so the
ball-contact chord (the ball of radius d: 3.822 wide at d = 2, 159.2365 removed) is SMLib's to
build.
Ruling d4 (2026-10-30).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel tests: a corner round wider than its faces overflows and takes the corner's other edges
R21 on a 20 mm cube's edge builds (6107.529370, closed form, to 2e-12). With R5 on the
corner's other edges the R21 takes the faces they lie on, so the body is R21's alone; SMLib
fails that blend (status 1001, fillet error 4, Unable to Trim Rail Curve) and the test is
ignored until it builds. It replaces the refusal test that expected TooLarge.
Ruling d8 (2026-10-30).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: a 1 degree crease rounds, and the knife edge's chamfers build, on SMLib smlib-batch-4-rulings
With SMLib's smooth limit at half a degree (422e6f1) the 1 degree crease rounds R2 and R20
(the test is no longer ignored), and with a cusp's chamfer the ball of radius d (d231547) the
The 0.5 one stays, for its own cause (the chamfer face left apart from the body). Two corner
cases the same SMLib (replay/1.0.1 and those commits) builds come off too.
Needs SMLIB_REV at that SMLib once it is pushed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel, doc: an overflowing round goes first; an edge it removes is gone, and the fillet says so
SMLib (smlib-batch-4-rulings 0e83cca, SMLIB_ABI_VERSION 5) rounds the edges whose rounds overflow
their faces first and then what is left of the others; smlib_blend_dropping says which picks'
edges the overflow removed whole. The smlib crate binds it (Brep::blend_dropping), the kernel
returns those picks (fillet_removing), and a fillet notes them as its warning: "the edge at
(0, 0, 10) was removed by the larger round, so it is not rounded" (a 50 x 50 x 20 block, R21 on
its bottom front edge with the front left upright: the block is R21's alone, in closed form).
Ruling d8: [21, 5, 5] on a 20 cube builds as R21 alone (6107.529370); the test is no longer
ignored. R25 with R2 at a corner (blend_corner) builds the same way, R25's alone in closed form,
where it was refused. The rig's 1080 notched block outline at R8 builds now and comes off the
known-failing list.
Needs SMLIB_REV at that SMLib once it is pushed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet rig: the knife edge's 0.5 chamfer builds
SMLib's trim took a fillet meeting its face at more than 78 degrees for one with no side
(smlib-batch-4-rulings 971e567); the chord of the knife edge's 0.5 chamfer meets the flat face at
81 degrees. The case comes off the known-failing list.
Needs SMLIB_REV at that SMLib once it is pushed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: a 15° tapered text builds, every letter grown, exact where its outline gives it
Owner ruling d6: the letter t of "tres long" was drafted inward by SMLib (its
loop's normal, summed from the cross products of its chords, pointed down;
fixed in SMLib). With the fix every letter grows, and the join builds at 3°
and 15° by the Round rule and by the default rule (tangent for spline
outlines), where before 15° was expected to be refused.
Exact where the outline derives it: a letter's section at height z is its
outline offset by e = z tan a, by the Round rule of area A + P e + C e² while
the offset trims nothing (Steiner; C half each loop's turning less
tan(t/2) - t/2 at each reflex corner), so the letter is
A h + P k h²/2 + C k² h³/3. Each extruded alone, the t at 3° and s, l and o
at 3° and 15° are checked to 1e-6 (SMLib measures them within 1.3e-9; its
mass properties integrate to 1e-8). The concave joins of r, n, g and e are
tighter than e already at 3° (their swallowtails trimmed: r 1.1e-3 under the
formula), the t's by 15° (9.9e-5 over), and on the block the letters grow
into each other, so the whole word is checked for what holds exactly: one
closed body with the block, and half-way up every point of each straight
letter's outline inside the solid (the t drafted inward failed that).
With SMLib's fix (smlib-batch-4-text-loops 82133b2).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: a sloped basin's mitred rim rounds are checked tangent along their contact lines
1080-fillet-sloped-basin-1-mm-rim-r0-5-4-edges asked G1 at every blend seam. Its front wall
leans 19 over 20 and the others 10 over 20, so at each rim corner the two mitred rounds meet the
sloped corner edge at different heights (0.155625 and 0.276393 below the top): the deeper round
runs on past the corner edge and is cut by the plane of the other's wall, a crease by
construction, the gap below the shallower round filled on that plane. The check now measures
the rounds' contact seams, on the top and on each wall, where the rounds are tangent. The
volume is unchanged.
With SMLib smlib-batch-4-mitre (1c15364): the case passes (V 144530.427946 against
144530.427909, 15 faces, sound); before it, only the four corner creases failed the check.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* smlib: Brep::classify_point says exactly where a point lies against a body
Binds the fork's smlib_brep_classify_point (SmBrep::Point3DClassify at the body's own zone
tolerance): inside, outside, or on the boundary within that tolerance of a face, an edge or a
vertex. A box and a cylinder just off its curved wall in measure's tests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKQ2rEZvcXNQnhE3Sgs
* kernel: Body::classify_point decides inside, outside or on the boundary exactly
SMLib's point classification at the body's own tolerance, on the exact faces and edges, in
place of a mesh at a chord of 2e-3 of the body's size (about 0.4 mm on a 200 mm part). A point
within the tolerance of a face, edge or vertex is OnBoundary, never decided by a ray. A mesh
body's triangles are its exact shape: on them within the record's tolerance, else by ray
crossings. The kernel's own probes move to it; Body::contains goes once its last callers have.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKQ2rEZvcXNQnhE3Sgs
* doc: a hole decides whether it exits at its drill point's shoulder exactly
Material past the depth needs a body with the point inside, air before it needs every body to
have it outside; a point within a body's tolerance of the exit face is neither.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKQ2rEZvcXNQnhE3Sgs
* engine tests: probes ask for the exact point class
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKQ2rEZvcXNQnhE3Sgs
* ui, cli tests: probes ask for the exact point class
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKQ2rEZvcXNQnhE3Sgs
* kernel: Body::contains, the mesh test, is gone
Every caller asks Body::classify_point now.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKQ2rEZvcXNQnhE3Sgs
* kernel tests: the rim chamfers running off their rims build, on SMLib 737c392
chamfer_wider_than_sloped_basin_rim_builds and a_rim_loop_chamfer_running_off_its_rim_builds
waited for SMLib to build the cliff overflow (CloseRemovalRegion refused it,
SM_FILERR_NO_ROOM). The pinned SMLib builds it (eddf0ede4, bba9914b6): both pass on aarch64
Linux and are no longer ignored.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet rig: the cases SMLib 737c392 builds come off the known-failing list
The gate on aarch64 Linux reports 16 fillet cases FIXED with the pinned SMLib: the sloped and
equal-slope basin rim chamfers and rounds past their rims (1080-*, 5835-*), the pocket rim
chamfer past the floor, and the three pocket rim rounds now mitred at the pocket's corners
(every-pocket-*). No other area's gate reports a case fixed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: the re-blend's removed picks formatted as rustfmt lays them out
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: blend_smlib laid out by the 2024 edition's rustfmt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Skills: the tests skill's unit-test example stays under the 3600-character limit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet: the radius-too-large choice in plain nouns
"If too large: Stop and say so / Largest that fits / Narrow where needed"
becomes "Face limits: Exact radius / Largest radius / Narrowed radius", in
every language of the catalog, with the error and the tip that name them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: a round that would cut through its wall into a hollow is refused
The owner's rule of 2026-10-30: a round running past a rim of its faces
into open air builds; one whose section would remove material through to
a hollow behind its edge (a slit into the hollow, a cut through the part)
is refused as too large, so the fillet names the largest radius that fits.
Decided exactly in the section of a straight convex edge between planar
faces: the round's centre is at depth r below both planes, and it opens
where its arc uncovers a boundary point strictly inside the wedge with no
material beyond it toward the centre (the body's exact point
classification). Looked at: straight edges parallel to the round's (a
hollow's corner), cylinders about parallel axes (a rounded corner), and a
picked concave parallel edge's own round, which fills the corner.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet rig: 1668's R7 past the inside corner is refused at 4 + 2 sqrt2
The round's centre (32 - r, 42 - r) leaves the hollow's corner (30, 40)
outside its circle, opening the wall, where sqrt2 (r - 2) = r: the case
expects the refusal naming 6.828. 2852's R30, refused naming 25.24, now
passes too: both come off the known-failing list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* xtask: known-failing grades a nextest junit report against tests/KNOWN_FAILING_TESTS
`cargo xtask known-failing --junit PATH` reads nextest's junit (a file, or every .xml under a
directory, so all of a run's junit artifacts at once) and fails on a test that failed and the
list does not name, and on a listed test that passed (FIXED: take its line off, as the kernel
rig's gate does). A listed test that did not run is neither, since a pull request tests only the
packages it touches. The list has the rig's KNOWN_FAILING format (`<test> <cause>`, sorted, the
rig's own parser), with `<test>` nextest's `<binary id>::<test name>`; `cargo xtask lists`
checks it is sorted. The list starts empty.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* CI: the test jobs grade their junit against tests/KNOWN_FAILING_TESTS
Native Linux tests and the GPU path test shards no longer fail on any failed test: nextest's
"tests failed" exit (100) goes to `cargo xtask known-failing --junit`, which fails on a failure
the list does not name and on a listed test that passes. Any other nextest exit (a build error,
a bad filter) still fails the step at once. The tests skill says to list a failing test with its
cause, in place of ignoring it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: the known-failing list takes develop's 10 failing tests
Develop 38fd4a4f6 (CI run 41157648345, after the SMLib eaa998a pin) fails 10 cargo tests; each
is listed with the cause its failure message gives. Seven are SMLib refusals or results off
their derived volumes (fillet, chamfer and shell), the cli action matrix and naming corpus
among them; the two corner_g2 tests are the fitted G2 corner patch bulging past the box, which
the explicit G2 corner fixes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Reference tests: the eight cases that fail on SMLib eaa998a name their cause as known failures
Develop 38fd4a4f6's Reference tests fail 34, 35, 77, 78 and 81 (STEP export finds fillet edges
4.6e-5 to 6.1e-5 off their surfaces against 2e-5), 37 (the apex blend 0.193 off), 80 (the
taper-to-fit area) and 83 (thicken status 1001). Each expected.json names its cause in
known_failure, which the oracle already reads: a known failure that passes fails the job.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sweep path: a curve of several pieces is turned round whole
The path chain oriented its first piece, not its first curve: a first curve
of several exact pieces (a fit spline, an ellipse, a projected free-form
edge) was never turned round, so a path whose next curve meets it at its
start was refused as "not connected end to end". The chain now orients
curve by curve: the first runs toward the second where they meet at one
end only (else from the end nearest the profile), each next one starts
where the previous ended, with one joint tolerance for both questions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* SMLib: pin 2fc375f (tangency-labs/smlib#71, #72, #73)
A sheet's side is extended exactly the distance asked, or the call says it cannot (#71);
NVIDIA's -Werror build passes again (#72); a body splits by a sheet of several faces as it
is, smlib_split_body_by_sheet (#73). The C API is ABI 6 (the new entry), so the binding
expects 6.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: Extend grows a surface of several faces face by face
A surface body of more than one face (a fit-point spline's spans extruded, #3830) was refused.
Each face with a picked edge is now extended alone by SMLib's extension of its surface, and the
faces are sewn back together, each the face it was. A side that lengthens onto a face meeting it
tangent takes that face along, past its edge continuing the picked one; across a crease the
neighbour grows only when its edge is picked too, otherwise the extension is refused. Faces whose
lengthened sides no longer meet are refused. Up to a target keeps the pieces every grown face
lies in.
3830's extensions now build; its split still fails (the tool point picks one span, and a face
tool cuts with that face's surface alone), so it stays on the list with that reason.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: Split Body by a face of a smooth sheet cuts with the whole sheet
A face tool cut with that face's surface alone, so a face of a surface body made of spans joined
tangent (a fit-point spline extruded, #3830) cut nothing where its span ends inside the body.
Split Body by a face of a surface body now takes the faces joined to it tangentially (the exact
check Extend uses, within the one angle for smooth) and slices with them as they are, through
SMLib's slice by a sheet (smlib_split_body_by_sheet, tangency-labs/smlib 7a01f1b), its sides those
of the picked face. A sheet that only nicks the body cuts nothing, as before; a lone face, or a
face of a solid, still cuts with its surface extended.
3830 comes off the booleans list. Its answer counted the two halves of the cup and not the surface
that cut it, which stays as a body of its own (4879 removes its surface for that reason): three
bodies, the volume unchanged.
Needs SMLib 7a01f1b pinned (SMLIB_REV, prebuilt; its SMLIB_ABI_VERSION 6, which crates/smlib now expects) to link.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: a cylinder strip's run-offs are 100 pi + 100 to 1e-6, SMLib's exact area
The tangent and curvature run-offs of the quarter cylinder r 10 strip, 5 across the surface,
are its section swept 20 along z: exactly 10 pi/2 20 + 5 x 20 = 414.159265. measure is SMLib's
integration on the exact surface (1e-8), not a mesh, so the run-off check is 1e-6 relative and
the 'measured on meshes' notes go. Red until SMLib's extension is solved to its distance
(smlib-extend-converges 590d8a1): eaa998a's curvature run-off is 4.986 long, area 413.882.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: an extension SMLib cannot make exact says so, naming the length asked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: a control spline can carry its own knots and weights
A sketch spline over control points was always the clamped uniform B-spline
over them, so a free-form edge whose knots are not evenly spaced (or whose
weights are not 1) could only come into a sketch as one curve per Bezier
span. A control spline now may save `nurbs`: its clamped knots and its
weights. Its points, polyline, exact pieces (one a knot span; conics for a
rational quadratic), the solver's distance and curvature, links, parallel
re-projection and inspect.sketch all read them; a loaded design's are
checked. One pending format file (spline-knots).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch projection: a free-form edge comes in as the one exact spline it is
A projected spline edge of several Bezier spans came into the sketch as one
curve per span (#1508), so a G2 round's bottom edge was 16 curves and a path
naming the corner named one span of it (#3604). The kernel now reads such an
edge (a spline, or an elliptical arc of several spans) as the one clamped
B-spline it is over the edge's interval, its knots and weights its own, and
the sketch takes it as one control spline whose ends sit on the edge's
vertices. Planar regions still read edges span by span. The 3604 case builds
with its original path and leaves KNOWN_FAILING.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet rig: blends past an outer rim of their faces build, on SMLib smlib-blends-past-rims
The owner's ruling: a round or chamfer that runs past an outer edge of its face into open air
builds, tangent where it has room and cut by the face beyond where it runs out. SMLib's branch
smlib-blends-past-rims builds them by the rig's analytic answers. Off the known-failing list:
the disc's rim past its 2 mm wall (190), the hole's top rim R12 past the plate's bottom, the
chamfer past the cylinder's bottom (2893), each closing on the wall continued as itself, and
926's chamfer ending on the boss's wall, which now builds to its answer too.
The sloped basins' R4 rim rounds (1080, mitred rounds built together where one overflows) build
to their analytic volumes (to 6e-9), and stay listed with that reason: their continuity check
(g1 at every blend seam) takes in the mitres' creases, G0 by the mitre ruling.
2893-chamfer-two-distances-elliptical-rim is graded as a solid (the owner: it builds) and stays
listed, waiting on the ruling on unequal chamfers along a rim whose angle varies.
5158-fillet-round-just-past-a-10mm-face stays listed with its cause found: the round passes
5e-6 under the box's top back edge, inside the body's tolerance.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Naming: test that a round of a round's end has no seam with that round's faces
The r1 round of a block's top edge, chained onto the end curve of the r2
round of its arc at a cylinder (rig fillets/every-block-cylinder-crease-
top-edge-after-arc-round-r1), ends where it runs into the cylinder. That
edge is no seam of the r1 round: the cylinder is a face of the r2 round,
not of the r1. blend_seams takes it for one today (the r2 round's name
F3:blend:F1:+z|F2:side holds a | of its own), and the rig reads it as a
contact seam at 60 degrees.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Naming: a blend's seams split its edge's name at the | between its two faces
A blend face's name holds the edge it replaced, <face>|<face>, and a side
of that edge can be a blend face whose own name holds a |. Whether a face
is a contact of the blend was read as the edge's name starting or ending
with the face's name next to a |, so the r2 round's own face F2:side read
as a contact of the r1 round F4:blend:F1:+y|F3:blend:F1:+z|F2:side. The
edge's name is now split into its two faces, a blend side read whole as
the two faces of its own edge.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet rig: five refused blends build, off the known-failing list
926 (the chamfer ending on the boss's wall), the oblique cut's r0.1
round, the every-block r1 round (its seam with the cylinder is no
contact seam, after the blend_seams fix), the up-down squares' concave
chamfers and the shelled box's lip chamfer build with SMLib branch
smlib-blend-refusals (f8650b8 and later). 1207 r0.5 passes SMLib's check
on its rails now and stays listed for the next cause: its end rib on the
boss, which starts where the round and the boss are tangent.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the trough and the pocket whose floors fall to a drain build
SMLib now offsets a vertex where four faces meet (two walls and two facets at the floor's
corners, four facets at the drain) to two vertices joined by a new edge (tangency-labs/smlib
branch smlib-shells). Both volumes match their closed forms. The pocket's lining, hanging from
the top's rim round the pocket, stands apart from the slab's outer walls with the cavity rising
between them to the open top: the case says two shells in the one body.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the plate with a hole through its arc side shells open at its far end
SMLib's merge now intersects the offsets of an edge's faces where they could not be mated along
it (the hole's offset poking out through the half-round side's; tangency-labs/solidcore#1795):
one closed valid solid with the one face open, as the owner ruled.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the ring cut frame and the up-down join shell
SMLib's inset now keeps only the regions that are cavity, not the one the offsets close where
they overlap (between the two faces of #545's 0.5 floor, round the up-down join's two empty
octants). The frame's core under the recess is hollowed to a sealed void, so the case says two
shells and its closed form, 21044 mm³.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: #616's lid shells open at a rib's side, with the 0.15 lip
SMLib keeps the skirt top's offset where its loops wind the other way under the opening, the
cavity's floor (the owner's ruling of 2026-10-31: build it; a lip thinner than the wall is no
break-through).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Known failing tests: the action matrix's shells and chamfers as they fail with SMLib batch 7
The ring cut frame's and the up-down join's shells build now, and so do the up-down join's and
modern-plastic's chamfers (SMLib smlib-blend-refusals). #616's lid in the corpus still fails
SMLib's loop check, the shelled box shelled again at an inner wall is unchanged, and the
oblique cut of a cylinder's fillet still fails SmSurfOfRevolution's Test #7: 3 actions of 7.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* SMLib: pin 26cc451 (batch 7: rounds past a rim, blend refusals that build, shells)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Known failing tests: the shell after a cut whose end touches an arc side builds on SMLib batch 7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Surface fair test: the energy falls strictly, the face moves, and the edges are read after the fair
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch scaling test: the first dimension sets l1 to 40 and scales both joined rectangles about the origin
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Frames tests: a pick on a moved component or an instance removes the exact round and bore volumes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Issue 1080 tests: the rib's rounds and the mitred corner chamfers and rounds have their exact volumes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Engine tests: lip_after_boss checks each lip's and groove's exact band, hole_as_deep_as_the_plate each hole's exact bore
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Robustness tests: lip_after_boss and hole_as_deep_as_the_plate live once, in the engine's tests.rs with exact volumes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Engine tests: loft_cut goes; loft_spacing's hollow elbow covers its section counts and more
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel loft test: the square-to-circle loft has the oracle's exact ruled volume, without printing
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tessellation lens test: the lens's triangles fill exactly the rhombus through its arcs' midpoints
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Pattern test: six chamfered holes take exactly five more holes' bore and chamfer rings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel pocket floor fillet test: the corner rounds and the floor loop round add their exact volumes, by Pappus at the corners
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Shell regression: the saddle-corner shell opened on the top box's side has its exact volume
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* SMLib history test: every operand's order is the identity on its record's faces and edges
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Boolean history tests: the SMLib module's box-minus-sphere, box-minus-cylinder and box-union-box copies go; the top-level ones check more
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Modify history tests: shell, offset and thicken are one test each through the public API, with the volumes, refusals and history the SMLib copies checked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Chamfer history test: the chamfer after each box cut is exactly one face on the painted block too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Grid test: a pole side's face is the five triangles fanned from its one grid node, none degenerate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel tests: the twelve ignored print-only debug tests and surveys go; coplanar_curved_booleans checks the flush-capped cylinder cuts and unions they printed
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel: the #883 board fixture generator is an example, not an ignored test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* STEP import test: a seam sphere whose meridian stops short of the pole imports as the whole 2 mm ball
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Material tests: the nine copies in material_properties go; the persistence file checks the library copy's card and formats 20 and 21 in one loop
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sample test: one loop checks every sample builds cleanly and without a panic; the robustness copy goes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Known failing: the non-antipodal seam sphere import, refused for a loop of no (u, v) area
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: rustfmt the board fixture example and the coplanar asserts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the two 3871 cone cases were byte-for-byte the 258 cases; the 258 cases carry their sources
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: a volume or area can be graded as a hand-derived range where analysis only bounds it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: fillets keeps one case per regime; 17 replications of a case in the same regime go
The sloped-basin chamfers and rounds at 0.5 mm rims repeat the 1 mm rim's regimes; two of the
three knife-edge chamfer tips, the r1 and box r3 curvature corners, the r1 tangent corner, the
1 mm pocket-rim and hole-rim chamfers short of the floor and the r1 together-round each repeat a kept case's regime
and grades. #854 moves to 851-chamfer-arc-top-edge-9-5, and the cases that cited a dropped one
cite the kept one or state its formula.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: five cases outside fillets repeat a kept case's regime and go
A square cut is the slanted plane's ordinary crossing; the cam's half turn is the quarter turn's
contact at a symmetric angle; the r15 slab stands inside the same coincidence tolerance as the r10;
the 90 degree unfold and the 40 degree flange repeat the 72 degree and 20 degree cases' formulas.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 3243 rim and tooth join graded on its volume (rim plus the trimmed tooth less their 0.01 mm overlap)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 3782 emboss on a cylinder graded on its volume, area, faces and box (the wrapped 4 x 5 badge raised 1 mm)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 3604 G2 swept-tool cut graded on a volume range (filleted box minus the swept corner section)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 4505 coil joined through a cylinder wall graded on its volume, area and box (cylinder plus the wire's screw-swept segment outside r 76)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 4879 window cut through a thickened spline revolve graded on a volume range and its faces
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 4623 join of crossing pleated loft skins graded on its volume and box (both skins less their overlap)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 831 tapered glyph extrude graded on a volume range and box (the font's S drafted in by 10 deg)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 2357 ring of 90 cylinder segments graded on its volume and box (the segments less their 90 joint overlaps)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 4542 fluted wall joined on a revolved base graded on its volume and box (the base by Pappus plus the fit-spline ring)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 1985 and 2243 STEP-export enclosures graded on their volume and box (the outline less the cavity, plus gusset and standoffs)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: both 4092 loft, ribs and pad unions graded on their volume and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 1525 graded on its volume (the convex body's exact 2 mm inward offset), faces and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 1494 graded on its volume (box and cylinder less the 1 mm-offset cavity, sharp to rounded concave edges) and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 4492 graded on its box and a volume range (the face's 19 mm sweep added, within the block's sides)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 745 graded on its volume (the end moved 1 mm plus the spline boss's exact area), faces and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 4567 graded on its volume (the revolved spline less its revolved 2 mm offset), faces and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the up-down squares shell graded on its volume (the columns less the 0.346 mm-offset cavity, sharp to rounded concave edges) and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 545 graded on its volume (the frame less its 0.5 mm-offset cavity, sharp to rounded concave edges), its sealed pillar void and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the shell-again case graded on its volume (the shelled box less the 0.5 mm-offset cavity in its walls) and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the arc-sided plate shell graded on its volume (sharp to rounded at the hole's bottom), faces and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 616 graded on its volume (the lid less its 0.5 mm-offset cavity, sharp to rounded concave edges) and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 391 graded on its volume (the shelled housing, sharp to rounded at the flange, less the letters' 0.6 mm deboss) and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: shell/3576 was the ladder's drafted box with rounds shelled, recipe for recipe; the ladder case grades it and carries #3576 and #3573
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the two 851 chamfers of 2 graded on their volume (the cone's sweep, and its union with the front edge's prism)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the chamfered corner of the lipped shell graded on its volume (the chamfer's triangle through the wall)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the concave round into the peg's cylinder graded on a volume range (the torus it must add, the band it can't leave)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the two folded 72 degree trays graded on their volume (flat area x thickness) and the walls' reach
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the flanged rhombus graded on its volume (flat area x thickness, all four reliefs cut) and its walls' ends
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the base with two adjacent flanges and a hole graded on its volume (base, bends and panels folded)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the flange beside the ledge graded on a volume range (the flange's two readings of its length)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the two G0 window patches graded on the box the part they close keeps
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the hub's six swept grooves graded on its volume (the revolved hub less each tube's part inside it)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the cut mirrored loft graded on the box its sections pin
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the three modelled-thread joins and the fine M48 graded on their volume (the basic profile's groove, Pappus)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the oblique-cut round graded by its seams (tangent, not curvature-continuous); the flanged rhombus says what it tests (its reliefs stay apart at 60 mm)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 3841 is 168's rim touching its coin along a circle, and 4092's reduced recipe is its report less a flange clear of the failing join; the kept cases carry their sources
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the oblique-cut round keeps its old grade until the new blend algorithm lands
Its seams grade needs the continuity check to skip the body the round is not on. Fillet cases
wait for the new algorithm.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 1985's enclosure is 78 x 77 (74 and 73 inside, 2 mm walls); its volume 38063.827 by hand
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the three spline walls' face counts wait for the one-wall decision; their volumes grade them
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* STEP import: a face bounded by seams alone runs its loop the other way, never turns over
A loop that uses each of its edges once each way (a whole torus within its tube and ring seams)
is the same set of uses run backwards, so it says nothing of the face's side. One written
clockwise in (u, v) turned the face over, against its same_sense: the torus came in inside out
with a warning. Such a loop is now reversed and the face keeps its side.
Test: seam_only_torus_imports_as_a_whole_ring, both orders of the two seams, volume 2π²Rr².
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* STEP import: a face bounded by a slit alone is the whole of its closed surface
A loop that runs out along a chain of edges and straight back (a meridian from a sphere's pole
stopping short of the other, out and back) encloses no (u, v) area, yet on a closed surface it
bounds all of it less a cut of none. The reader only read such a face when the slit already ran
pole to pole (and moved the sphere's frame onto it only then), so the 2 mm ball whose meridian
stops at 2.5 rad was refused for its empty loop.
The slit is now made the face's seams, so its loop bounds the surface's whole domain: on a
sphere, a revolution whose profile ends on its axis, or a spline closed round u that collapses
at both ends, the slit's meridian is run on to both poles, out and back (a sphere's frame put
on the slit first, whichever two points it joins); on a torus, the circle the slit lies along is
closed and the other circle through its start is the second seam. The seams on a sphere are its
own meridians (angle 0 on the equator), so their pcurves are exact lines on its form.
Tests: non_antipodal_seam_sphere_imports_as_a_whole_ball passes (its known-failing line goes);
seam_only_torus_imports_as_a_whole_ring adds a torus bounded by a slit along its tube.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: the test-peg's concave arc and front top edge rounded together stay within the body's box
A new fillet case, report-fillet-concave-arc-and-front-top-edge-together-solver-residues:
the reported part's bar (with the sketch solver's residues) whose sides run tangent into the
cylinder, its concave arc and front top edge rounded r2 together. The plane of the front face
bounds the whole body, so every blend lies within the unblended body's exact box (SMLib's tight
box); graded to 4e-5, the corner patch's own tolerance. On SMLib 2fc375f the corner patch
stands 0.0374 out of the front face (box y min 0.0205): listed in KNOWN_FAILING.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: the test-peg corner at r5 and r7
Two more fillet cases, the reported part's concave arc and front top edge rounded together at
r5 and r7, with the same exact-box containment check (graded to 4e-5, the corner patch's
tolerance). On SMLib 2fc375f the corner patch stands 0.128 (r5) and 0.230 (r7) out of the
bar's front face (box y min -0.0699 and -0.1723): listed in KNOWN_FAILING.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: blends that end where their face runs tangent into another
Fifteen fillet cases on the test-peg's shape with clean numbers: a bar 40 x 16 x 10 whose far
end is a half disc R8, a disc R8 standing 10 on its top, joined, so the front face runs tangent
into the cylinder along x = 40 and the front top edge (convex) meets the concave arc of the top
tangentially there. Each blend ends on a face tangent to the one it rolls on.
- Rounds: both edges together at r2 and r5; one after the other in either order at r2, and at
r1.5 and r3; the front edge alone as a curvature round, whose end on the cylinder is a
semicubical cusp. The containment invariant (the unblended body's exact box, to 4e-5) and
G1 seams, or the analytic volume where the blend has a closed section.
- Chamfers: the front edge alone and the concave arc alone (analytic volumes: the section along
x up to the wall, the cone's spandrel ring clipped by the sides), both together, and one after
the other (1 then 2).
- STEP: the peg written to STEP and read back, its front edge rounded (analytic) and both edges
rounded together.
- A cone: the peg drafted 5 deg, whose front face runs tangent into a cone along a generator,
its front edge alone and both edges together.
The quadratures are tanh-sinh, converged to 1e-13; SMLib's own volumes of the passing analytic
cases agree to 4e-9. A sphere is left out: a plane meets a sphere tangentially at a point, not
along a seam, so it is not this ending.
On SMLib 2fc375f eight fail, listed in KNOWN_FAILING: every chamfer that ends tangent (status
1001, SmFilletNx1Corner), the two rounds together (the corner patch 0.0374 at r2 and 0.128 at r5
out of the front face, and the rounds meeting with normals 180 degrees apart where their
contact lines on the top cross), the same on the STEP-read peg (status 1001) and on the drafted
peg (its corner refused as unsupported).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: fillet corners graded curvature-continuous, the default to be
Six fillet cases that pick their edges with no type, so they take the fillet's default, which the
owner has ruled is to be curvature-continuous (G2) at every corner, with circular rounds kept as
an option. Each grades every seam of the rounds and of the corner patch G2, on one valid body:
- an oblique convex corner (a block drafted 15 deg);
- a four-edge and a five-edge apex corner (pyramids lofted to a point);
- a pocket's concave corner;
- a mixed corner (a step: one concave edge, two convex);
- a corner beside a cylinder (the top corner of a half cylinder).
All six fail on SMLib 2fc375f, listed in KNOWN_FAILING: today's default is the circular round,
whose seams jump in curvature by 1/r. On the five-edge apex the corner patch also meets two
rounds at 8.45 degrees (G0).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: the test-peg's front chamfer builds
With the SMLib fork's smlib-tangent-ends (a rail's end on its side edge is the rail/edge
crossing), report-peg-front-chamfer-d2 passes. Its line leaves KNOWN_FAILING, for the pin that
carries that fix.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: the curvature-continuous corner cases pick the curvature fillet
The six corner cases added in 3a854104a took the fillet's default type, on the premise that the
default would become curvature-continuous. The default stays the circular round, so each case
now asks for the curvature fillet itself (type curvature: curvature-continuous sections and
corner patches) and keeps its grading: every seam of the rounds and of the corner patch G2, one
valid body. They are renamed from cov-fillet-g2-default-* to cov-fillet-g2-*.
The oblique three-edge corner (a block drafted 15 deg) and the pocket corner pass. Four fail, as
KNOWN_FAILING now says:
- the corner beside a cylinder: the curvature fillet builds its sections only between planar
faces;
- the four- and five-edge apex corners: refused because the default setback is shorter than
where the rounds' contact lines meet (3.90 and 3.51 mm from the apex);
- the mixed corner: SMLib sets back a corner only where its edges are all convex or all
concave.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: the test-peg's concave chamfer, alone and after the front chamfer, builds
With SMLib's tangent end as an event of the fillet's trace (blend-end-event 6d73e4f), the
concave chamfer's rail on the cylinder ends where it crosses the seam along which the front
face runs tangent into the cylinder, continued past the vertex, and its end rib on the front
face is built from there. report-peg-concave-chamfer-d2 and
report-peg-front-chamfer-d1-then-concave-chamfer-d2 pass and leave KNOWN_FAILING. The two
chamfers together still fail, now at the mixed-convexity corner where they meet: its line says
so. Rig against SMLib 0cc48bd: no area regresses (963/993 pass, 961 on a87c502), ladder 168/168,
kernel lib only its listed failures.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: constant rounds of the exact classes, and a tee's round
A plane cutting a cylinder or a cone at an angle, a sphere or a cone coaxial with the other face, a
cone and a cylinder touching one ball, two pipes touching at a point: their rounds' centre lines
are rational, so the rounds are rational surfaces of degrees fixed by the construction ((4, 2),
(2, 2) revolved, (6, 2), (12, 2)). The tee's centre line is not rational; its round is graded on
its volume. Volumes from the divergence theorem over the exact pieces, at rel 1e-6. The six that
SMLib 0cc48bd traces are listed in KNOWN_FAILING with what they come out as.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the exact-class rounds pass on SMLib's classified exact rounds
The rounds now come as the rational surfaces their classes give, closed ones as two faces split
at their seams, the touching pipes' as four: one splines entry a face, each of the class's degrees.
Their KNOWN_FAILING lines go.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* SMLib: pin 7ac037e (the new blend's tangent-end event, zero-speed G2 ends, and its exact-class rounds)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the fillets known-failing list is the 22 cases that fail on SMLib 7ac037e
Twelve listed cases build on the new blend's end event and exact classes, or were already
built on develop: they come off the list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: #316's bottom rounds as large as the wall, or larger, shell with a step wall at the opening, not refused
Where the round meets the open bottom the cavity's wall steps down along the bottom's normal, so the
round meets it at 90 degrees and the opening is exactly the picked face. The cases are renamed and
graded on the exact volumes, and come off the shell known-failing list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Merge fixes: every crate and test target compiles on the merged tree, but for crates/geom's hlr
world_state, view::bounds, home_camera and scene return Result on develop; new
main code takes that with ? or session_world. New fixtures carry the spline's
nurbs. ForeignCopy::of returns Result. occurrence_placement_with walks the path
with its moves, since the placement index holds pending_moves only.
The hlr port is separate and still to come: this commit does not compile as it
stands in crates/geom/src/hlr.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Drawings hidden lines: read develop's B-rep records
Edges come from the record's edge list, cut to their interval (C3::of_edge), and
faces from its face list; a cylinder, cone, sphere or torus chart takes its bounds
from where its NURBS form lies on its label (S3::of_face). A rigidly placed
revolution has main's revolution chart; other placements stay refused. Moving a body
to its centre goes through Brep::moved. Loops are read against the natural normal of
the face's parameters where a chart wraps.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Hidden-line fixtures: build develop's records from the fixtures' data
Fixtures keep their bounded curves and surfaces and their own edge numbers; a private
builder makes the canonical record, and the local prepare puts the edges back in the
fixture's numbering. Assertions are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Hidden lines: tests of the bounded edges, face charts and placed revolutions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* drawing-hlr doc: what is drawn and refused on develop's records
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* hlr tests: a placed revolution is refused when its placement is not rigid
The new model has one record for main's Revolution, which was drawn, and its
PlacedRevolution, which was refused. An identity placement is now the former, so
this test's fixture takes a non-rigid one. The refusal it asserts is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Hidden lines: a traced intersection is drawn only where its spline lies on both surfaces
A leader off either surface is refused like a curve with no spline to follow. Tests: a traced rim
drawn on the circle and plane within tolerance, the same leader 1 mm off refused, and kernel bodies
with arcs through the production prepare against closed forms.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Hidden lines: kernel bodies through the production prepare against closed forms
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Tests from main: the world state is a Result here
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* A blend's pick measures close edges on their curves, not their polylines
A polyline can be a chord off its edge, more than two edges are apart near a
tangent point. A pick exactly on a ball's rim took the straight edge the rim is
tangent to, and solidcore built a chamfer of that edge with a clean check.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
(cherry picked from commit c786db6bf4)
* Merge fixes from the first SMLib test pass
Model cache key covers the crates develop's kernel adds under doc (profile, smlib, step).
A piece taking a name also takes the feature that made it: SMLib lists a cut's pieces in another
order, and the swap left the name on a piece of the wrong feature.
A replaced analysis keeps its status slot. A command with no world picks does not place the model
first, so assembly.mass_properties answers for a flattening placement. FeatureCommon loses the
touching key the merge added; only the contracts that read it take it.
Two of main's tests listed as failing on SMLib, with why.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Merge fixes from the ui test pass and the gates
Main's thread.direction keys go with develop's thread hand, which replaced them. Vietnamese for the
messages develop added while main made vi a complete catalog. CGA and 1-bit themes set develop's
comb and section hatch colours. A ribbon button with a persistent effect is pressed only while its
tool runs, so persistent_ribbon_pressed alone decides how its effect is shown; other analyses stay
pressed while on. Two of main's ui tests listed as failing on SMLib, with why.
Gates: fixed thread tables become slices, one collapsed if, rustfmt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* A silhouette takes its facing from the surface's normals
A flat triangle beside the outline can tip the other way from the surface it approximates, and its
edges joined the outline. On SMLib's sphere that made 192 segments instead of the equator's 64, 100
curves and 95 profiles from the tight fit of #7989. Each corner's normal is used where it is close
to the triangle's own; a mesh without such normals (none, zero, not numbers, or averaged across
creases) keeps the triangle's normal, as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Clippy and rustfmt on the merged tree
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Stepwise open checks every feature under the session's mode
OpenSteps::start evaluated under the default check mode, and finish kept those results under the session's mode: an each_step or off session opened in steps recomputed nothing. start now takes the mode (the app passes its session's), and a mode that changed before finish evaluates the design again under the new one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Clippy without SMLib: the planar-sheet edge reader is built only with it
Its one caller is in the smlib-only sheets module, so without the feature it was dead code and
clippy -D warnings refused the kernel.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* SMLib: pin d01d7b0 (the new blend's one Gⁿ section generator: the chord, circle and curvature sections, and the variable rounds as the union of their balls)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the section orders, chord, circle and curvature section, on planes and against a cylinder
Eight fillet cases for the blend's cross-section by its order of contact with the faces, each
graded on its analytic volume at rel 1e-7 and its exact continuity (the order, and not the next):
- a box's top back edge chamfered 3 (G0), rounded r3 (G1) and curvature-rounded 3 (G2): the
areas cut off the corner s^2/2, (1 - pi/4) s^2 and 113/756 s^2, the last by the default
thumbweight's definition;
- a pipe R10 dipping into a plate, its concave edge chamfered 2 (the chord between the contacts of
the ball SMLib rolls for that setback, radius 1), rounded r2 and curvature-rounded 2, each
section's added area by Green's theorem along the plate, the section and the pipe's arc; the
order-2 section is built from the faces' feet of the point at distance d from both, which on
the pipe are not linear in d;
- a boss root curvature-rounded 2, the square corner's section revolved (Pappus);
- a variable round r1 to r5 along a box edge (rel 1e-5): the balls' envelope is a circular cone,
and the volume is the cone's sections integrated along the edge.
Three fail today and are listed: the two curvature rounds whose faces are not a square corner of
planes (SMLib's quintic blend curve, not the order-2 section: rel 6.5e-7 and 1.2e-5) and the
variable round (great circles, not the envelope's: rel 4.8e-5). The other five pass on SMLib
7ac037e.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the curvature fillets' expected bodies from the order-2 section at thumbweight 0
SMLIB_BLEND_CURVATURE's section is now the order-2 G^n section at thumbweight 0. Between two
planes square to each other it cuts A = 0.154192655384275 s^2 off the corner, its first moment
about either face 0.0291753295725360 s^3 (Green's theorem on the section): the curvature cases
built on that corner (862, 2708, every-box-edge, every-hole-top-rim, every-l-bracket,
every-block-cylinder-crease, the three-edges-at-bar-corner reports, 3604's fillet) take their
volumes from it by their own methods, the peg's front blend 23.3237146876 (its section along x
up to the wall). Between planes the section's t^3 term vanishes (their feet are linear in the
distance): the box edge case is exactly G3. The boss root is a certified fit, G3 to the plate and
G2 to the wall at Continuity Analysis's tolerances: at least G2. The boss root and the pipe on
the plate pass on SMLib's section and leave the known-failing list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Curvature fillets: the section's default thumbweight is equal area, so the round's volumes are the circle's
On the round's rails the order-2 section takes off what the ball's circle does: (1 - pi/4) s^2 at a
square corner, first moment 0.0474559669443 s^3 (w = -0.5252123889). The kernel and engine tests
and the curvature rig cases take their volumes from it by their own methods; the pipe on the plate
from its own wedge (70.52878 degrees, w = -0.8544103493). The G2 corner patch's seam test is listed
until the corner step.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: four G2 corners wait for the corner step: their patch meets the new section's rounds G1 at one face seam
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the turn at a corner of two rounds, Mitre (the default) and Swept, at a pocket's floor and a boss's base, by exact volumes
A round's spandrel A = (1 - pi/4) r^2 and its first moment about its wall M = r^3 (5/6 - pi/4):
Mitre adds L A -+ 2 M per edge (cut at, or run on to, the corners' bisector planes), Swept turns
the section about a convex corner's edge, (pi/2) M a corner, and refuses a concave corner rounded
less than the ball. The pocket's tangent chain round its R3 corners is a torus each. Graded to
1e-7, where Mitre and Swept differ by 6.6e-6. The Swept cases are listed until solid.fillet
takes a turn.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: a junction family: oblique wedges 30 to 150 degrees rounded and chamfered (exact), bosses upright and tilted, pipe tees and a Y junction
Four are listed with their causes: the equal-pipe tee (its exact conic-pair rounds meet at the
ellipses' crossings in a corner the old corner code cannot join), the tilted bosses (1001, before the
blend rework too) and the Y junction (refused for room at its triple points).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Variable rounds: graded by the union of their balls (their envelope), not the balls' great circles
The smlib crate's laws and ladder 005, 006, 007 and 012 take the volumes the balls' envelope
removes; the law with a corner is its own test, listed as failing until the corner step.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel tests: variable rounds graded by the union of their balls, the removed volume to 1e-4 of itself
removed_by_balls integrates, in each plane square to a right-angled edge, the corner the union
of the balls leaves (by rays from the edge, the least entry over the balls), cut to the body's
section. The law with a corner through a middle point is its own test, listed as failing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel tests: a spline radius whose balls fold over one another at its peak is refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the variable round on its cone passes (the round is the balls' envelope)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: three rounds of different radii at a corner listed: the corner's transition kinks with the balls' touch circles
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Ladder: the variable rounds graded to 1e-6 by the union of their balls; 012 by its law going on past the edge
At the default 1e-3 the great circles' volumes (4e-6 off) passed too. SMLib builds each within
1.6e-7. The golden takes the new volumes and areas; counts unchanged. The G2 corner test listed
as failing passes on SMLib's step 3 and leaves the list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Reference tests: the variable rounds 77, 78 and 81 pass on SMLib d01d7b0; their known-failure marks come off
The new section builds their edges on the surfaces, so STEP export no longer finds them 4.6e-5
to 6.1e-5 off. develop's Reference tests (60393a718) report all three as passing while marked.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* STEP import: a ball's halves whose seams are off each other's quarter lines each form within one turn
A sphere split into two halves along a circle about its axis, each half covering a pole with no
seam, gets a seam per half from the first vertex of its loop to the pole. The circles between the
halves group their frames so they turn together, and when the two seams are not a whole number of
quarters apart no one turn fits both: the group kept its frames, a half's form ran past one turn,
SMLib's trim (SMLib and solidcore alike) across the form's end crossed the face, and the mesh
folded over the ball (a rotor's ball showed torn; its half had 196 times its area in triangles).
When no one turn fits the group, each spilling face is now turned on its own to start on a quarter
line. On the rotor file this also clears three other faces that were filled leniently and a
0.076 mm edge gap; regression test in step_in/tests.rs with the area and volume of each half.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
(cherry picked from commit b3188e005d427043b918267449c2336a1777e54f)
* SMLib: pin 5e8c9c1 (the new blend's corners: Ball and End/Join; exact fold and room checks with fit sizes; overflow in place; the round as its definition)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel tests: a law's dip shows its corner ball's sphere, a peak's two rounds cross (the reasons had them swapped)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Reference tests: the variable rounds 77, 78, 80 and 81 expect the union of their balls
A variable round is the envelope of the balls rolled along the edge, which takes less than a
quarter round in each section. The expectations are now that union, the law continued past the
edge's ends along its end slopes, integrated by Gauss-Legendre panels in x and t; 2, 4 and 8
panels agree to 1e-9 of the body's values, and 77's removed volume matches a brute-force union of
balls to 2.5e-10. The nearest-ball search now scans the balls the ray meets around ball x
(|x - s| < r(s) sqrt(sin 2t)) on their own, which near the faces and where 78's radius closes to 0
are narrower than the global scan's step. Regenerating keeps each case's known_failure. 79, a
constant radius, is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Known failing: the law corners' kernel and crate tests and rig 1207 pass on SMLib 48ea616
SMLib builds a variable round's law corners as its balls' union (the corner
ball's zone at a dip, the sides' crossing at a peak): the kernel's corner
through a middle point (39.5410) and the crate's 4 -> 2 -> 4 law (39.5421) pass.
Rig 1207 (the bar's top edge rounded after the boss's arc, r0.5) builds and
grades on the same SMLib; it failed on c820346.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: every fillet and chamfer case rounds its tangent chain
The owner's ruling of 2026-11-01: the rig and the ladder round with tangent_chain true, how a
user's default pick behaves. The 38 fillets-area recipes and the ladder's 07-fillets/016 and 018
that passed false now pass true. The shell recipes keep theirs: a shell's tangent_chain is its
open-face chain, a different feature.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the partial-selection cases kept as -partial-chain copies, tangent chain off
Where a case's point is one edge of a tangent chain rounded alone, a copy keeps tangent_chain
false as its own case (SMLib rounds exactly the picked edges, ending at the smooth vertex); their
expectations stay as they were, to be re-derived:
- fillets/1207-fillet-box-end-edge-into-unblended-round-partial-chain;
- fillets/every-fillet-after-fillet-curvature-front-then-side-r3-partial-chain;
- fillets/1207-fillet-bar-top-edge-after-boss-arc-round-partial-chain, renamed from
...-no-tangent-chain: with the chain on it is exactly 1207-fillet-bar-top-edge-after-boss-arc-round,
which the rig already has;
- ladder/07-fillets/020 and 021, the r5/r3/r7 and r5/r3/r2 corners (016 and 018) with the r3 on
its edge alone: with the chain on, the r3 runs on along the r5 round's end arc and down the
vertical edge the third round was to take.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the concave arc between the block's tangent sides kept with tangent chain off
fillets/every-block-cylinder-tangent-concave-arc-r2-partial-chain: the pick takes one piece of the
concave half circle, which SMLib splits; with the chain off its other pieces are left out, and the
blend is refused at the piece's end (the base gate's outcome). With the chain on the case rounds
the whole half circle. The copy keeps its expectation, to be re-derived.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: two chains that now build graded by their exact volumes
With the tangent chain on, two cases round more than the edge they pick, and their old
expectations were the single edge's:
- 1207-fillet-box-end-edge-into-unblended-round: the r1 chain is the end face's top edge, the r3
round's end arc and the back upright; 34 A + (pi/2) A (3 - c) by Pappus on the arc:
V = 7953.139216 (it built 7953.139216, the old 7957.505 passed only inside 1e-3), 10 faces.
- 851-fillet-top-front-then-front-left-upright: the upright's chain runs up the first round's
end arc on x = 0 and along the left top edge, so the corner becomes the R2 ball's eighth:
V0 less the first round's spandrel to the wall (35.344727) less 27 (4 - pi) + 2 pi/3:
V = 9530.777979 (built 9530.777987), 10 faces.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: a curvature chain round a round's end refused for its size; the concave half circle builds
- every-fillet-after-fillet-curvature-front-then-side-r3: the side edge's chain runs round the
first curvature round's end curve, whose radius of curvature has a weighted mean of 3 (its
setback) and is unbounded at the ends, so somewhere below 3: the size-3 blend's contact line
folds back on itself. Refused, "larger than the faces beside its edges allow", as ladder
07-fillets/016's r7 on the r5 arc. (It was solid or refused for running on tangentially.)
- every-block-cylinder-tangent-concave-arc-r2-no-tangent-chain: the chain takes every piece of
the half circle and ends at the convex edges it runs on into; it builds the analytic 19091.9620,
so the outcome is solid (the refusal alternative was the chain-off one's).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Known failing: two 851 chains whose corner piece is a ball of tube-centre radius 0
851-fillet-arc-then-top-front and 851-fillet-top-front-then-upright: with the tangent chain on,
each R2 chain runs along the end curve of an R2 round on a curved face (the arc round's end on the
front face; the first round's end on the wall), where the rolling ball sits on that round's own
centre line, so the piece is the ball about (39.2538, -19, 8): the three-edge rolling-ball corner.
SMLib fails with status 1001; the same piece on a plane end arc builds (front-left upright).
Expectations unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Ladder: 016 and 018 refused, their r3 chain takes the vertical edge; 020 and 021 recorded
With the tangent chain on, 016's and 018's r3 runs on along the r5 round's end arc and down the
vertical edge, so the third pick (60, 40, 8) is 3 from both of that round's contact lines and
names no edge: refused, asking for a point along one edge. The corners they were made for are
020 and 021 (the r3 alone), whose golden entries are 016's and 018's (021 measured on f12a101).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel tests: three rounds at a box corner end on one rational patch on the ball's sphere, not an analytic sphere
SMLib's Ball corner is always the rational patch exactly on the sphere (owner ruling, blend
design §23), so the corner counts as an 'other' face beside the three cylinders and six planes.
The removed volume still checks the corner against r³ − πr³/6.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the curvature round on a pipe on a plate is listed: a seam grades G3 where exactly G2 is wanted
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel tests: the box-and-fillet wire fixture records the round's cylinder frame as SMLib now keeps it
The round's cylinder keeps the frame it was made on when it is turned (SMLib's SwapUV no longer
re-derives it): its origin sits at x = −20 on the same axis line, (x, 2, 8) along x, radius 2.
Same cylinder; one number in the record moves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Known failing: two kernel tests' reasons as they fail on SMLib 5e8c9c1 (a partial selection running into an unblended tangent edge)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: two curvature rounds get 600 s, past the 180 s default, while G2 certification is slow (tangency-labs/smlib#96)
On the CI runners the boss root and the hole rim, both size-2/size-1 curvature rounds, build
correctly but take more than 180 s: the order-2 section's span certificate and the round's
definition are evaluated station by station. The per-case limit is the one the thread cases use.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Lid ring sketch test: find the ring under the pick, not by main's kernel's name
On SMLib the lip join's exact history names the lid underside's ring a piece
of the lid's own start (F14:start#[...]), as the naming rule says for a face
that came from the feature's input; main's kernel named it after the case's
top it rests on (F2:top). The test looked the ring up by that name and so
stopped before the attachment it guards. It now takes the underside piece
under the pick point, which the cap certificate attaches on either kernel.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Viewport culling test: each box's triangles from its mesh, not 12
SMLib meshes a 10 mm box in 108 triangles, so the hard-coded 12 a box stopped
the test before it reached the culling. The expected counts are now each
body's span in the scene.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Timeline chip test: a fillet that really reduces
The R20 fillet with fit reduce on one top edge of a 10 mm box builds on SMLib
without a reduced-radius warning, so the fixture had no warned feature. It
now rounds the four vertical edges at R6, reduced to the full round (5), as
the copy-warning test beside it does, and checks the warning says so.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Oracle: 34-chamfer-then-fillet and 35-fillet-curved-curved pass on SMLib 5e8c9c1 (their STEP edges are on their surfaces)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Known-failing: the shell of a fully rounded box opened at one face fails on SMLib 5e8c9c1 (tangency-labs/smlib#102)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Known-failing: the action matrix's oblique cylinder cut fillet passes on SMLib 5e8c9c1; two shells still fail
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the boss root's curvature round gets the rig's 1800 s cap: on the CI runners, 8 cases at a time, its G2 certification passed 600 s (tangency-labs/smlib#96)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: a case's continuity can ask for an order per seam (seams: [{order, edges, exact}])
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the pipe on a plate's curvature round meets the plate G2 and the pipe G3, 40307.8856312 (option B's order-2 jets, tangency-labs/solidcraft#10845)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Edge names: a seam names its one face once; the curve-id test reads every edge kernel-neutrally
A seam's two sides are the same face, and edge names list each face an edge
bounds once, so SMLib's extruded circle names its side's seam F2:side:c1, with
no separator. The name grammar now says one face also means a seam. The #5858
test no longer counts one '|' an edge: every part of every edge name is a
whole face name of the edge, one per face it bounds, two for the rims and one
only for the side's seam (checked to run bottom to top on the circle).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* rustfmt on the merged tree
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Known failing on SMLib: two of main's new tests assume truck's box mesh and fillet torus
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* SMLib: pin f916a8d (a round on a definition face is its definition; the G1 setback fill certified convex, setbacks too short refused naming the least; the G2 certificate halves a span no level can certify at once)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Fillet: a setback too short for its corner is refused naming the least that builds (smlib_blend_fit_size)
SMLib's setback corner takes a G1 fill only once certified convex, and refuses a setback too
short for that as SMLIB_ERR_NO_ROOM with SMLIB_FIT_SETBACK_AT_LEAST, the smallest setback that
builds. The kernel reads it (solidcraft-smlib binds smlib_blend_fit_size) and names it; the
Fillet dialog says it in plain words. Other room refusals keep their words. The r5 box corner
set back 5.5 is refused naming 5.962, which builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel tests: three rounds of different radii at a corner meet in SMLib's setback corner
Each round runs whole to its section square to its edge at its setback (the owner's rule, at
least 1.5 r, scaled to the least at which the G1 fill is certified convex), and the hole is the
setback split: one patch per round and the triangle in three quadrilaterals, 15 faces, G1.
Outside the box the sections span the body is the three strips', so its volume is theirs within
that box's. A later r3 round at the mitred corner makes the body all three at once make
(7928.142563938, 15 faces), as the engine and the model-cache tests have it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel tests: SMLib's own corner between curvature rounds is curvature continuous, as the G2 patch is
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the boss root's and the hole rim's curvature rounds take the default timeout again (37 s and 34 s on the box under the rig's parallel load, tangency-labs/smlib#96)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Agents: model decisions use exact geometry; a mesh is for display, export, previews and mesh bodies
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* xtask: mesh-decisions, model decisions use exact geometry; today's 176 mesh decision sites are listed and the list only shrinks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Sheet metal: cuts and holes pass over sheets and bends by their exact boxes, never a mesh's
A primitive cut skips the sheets kernel::apart (exact bounds grown by the record tolerance)
finds clear of its tool; the bend check leaves the clear case to kernel::boolean, which answers
it from the same exact boxes with no intersection work. The mesh-box helpers are gone, and their
four lines leave xtask/mesh-decisions.txt (172 sites left).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Agents: AGENTS.md loses a stray merge-conflict marker line at its end
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Locales: Vietnamese for the setback-too-short refusal, now that vi is a complete catalog
Main made vi a complete catalog; develop's new message (ui.fillet_error_setback_short) had no vi
entry, so every_complete_catalog_carries_every_english_message failed on the merged tree.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: exact volumes for 1213's bent-tube round and 4782's bar round, rel 1e-6
1213: the loft is a cubic skin through the five sections (ellipses between
them), not a torus; its volume 131601.597487935 by quadrature less the exact
rolling-ball removal 233.662461919 gives 131367.935026 (was a Pappus estimate
on a torus, 131360.148, at rel 5e-4).
4782: the section's area in closed form, 25 pi/3 - 5 sqrt(75) + 25, so
V = 630.2934873 (was a grid estimate, 630.293125).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Kernel rig: the boss root's and the hole rim's curvature rounds take 600 s again: under CI's parallel load they pass the 180 s default (develop 820b7b6)
They take 37 s and 34 s alone on the box, but CI runs 8 cases at once on slower runners. Their
G2 certificate cost is the open item (tangency-labs/smlib#106, moved to solidcore#2344).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* After the merge: clippy's auto-deref, and the mesh-decisions list for the merged tree
Develop's list was taken on develop alone. Main's code (tap-marking reach, cut and hole box
checks, join pieces, print faces, placed measuring, selection items, imported mesh payloads) and
the branch's own exact_edges and named_vertex use meshes too; three listed functions were renamed
by main (face_outline and plate_recesses into FaceSlice, paste into build).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* After the merge: main's new tests on the SMLib kernel
- Cut To the far side of a curved wall (#8634): the tool stops past the first crossing of the
face ahead of the profile; SMLib's whole bore is one face that a line crosses twice, so the
single-crossing rule found none and the cut took nothing.
- Clearing view analyses goes through refresh_display, as main's #10687 made the others, so an
open feature editor keeps OK and Cancel after Zebra.
- vi, a complete catalog on main, gets the setback-too-short message.
- fillets/KNOWN_FAILING: 4782's cause is now its continuity check (SMLib f916a8d builds the
expected volume).
- Known failing, as main's tests assume truck: the spline wall's spans as one mesh patch, a
hole touching an edge at a point leaving one body, and a copy of a copy's triangles matching
a fresh mesh.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Twisted sweep: circles about a straight path are exact cylinders (solidcore#2184)
A twist about a straight path maps a profile circle centred on the path's
line onto itself, so its swept wall is exactly the cylinder. The skin
through the stations stayed within 3.9e-9 of it (6.6e-9 on the outer wall),
and a boolean with another body on that cylinder failed with status 1001
(solidcore#2184; the kernel's handling of a B-spline face lying on a
cylinder stays open there).
sweep_controlled now builds those walls exactly when the path is lines
along the profile's normal and there is no end scale or rails: a profile
whose every loop is such a circle is swept untwisted, and such holes in
another outer loop are cut as exact cylinders from the skinned sweep of
the rest. Other loops, and an axis-centred arc inside a loop of other
curves, are skinned as before; a failed cut falls back to skinning all.
Regression test in smlib_sweeps_tests.rs: #2184's tubes joined at 10, 16,
18, 20 and 30 degrees give one closed body of 11.5625 pi with cylinder
walls; a twisted hexagon with the bore keeps a cylinder bore.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEtwSrdwZxqTQp5MfnU
* After the merge: a hole that misses is found by exact boxes; a face is a one-face patch; main's mesh-box helpers gone
- `hole_misses` (main's #10701, through brett's branch) decided from the targets' mesh boxes. It now uses their exact boxes (`Body::exact_bounds`). An unknown box still leaves the hole not known to miss.
- With #10303's two shortcuts and `hole_misses` off the mesh, `body_box`, `mesh_box` and `padded_box` have no caller left, and are deleted.
- `project`'s intersection link passes its one face to `meeting_edges` as a one-element patch. This branch picks one face, not #9009's mesh patch.
- xtask/mesh-decisions.txt drops the six sites that no longer use a mesh here: `apply_traced_with`, `cut_end_past_face`, `beyond_cylinder_reach`, `hole_misses`, `body_box`/`mesh_box`/`padded_box`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* After the merge: split_move's Result reaches its callers; to_local's duplicated move check goes
`frames::split_move` returns a Result on this branch: an unplaceable model is an error, not a silent no-split.
- Move/Copy of a component (main's #9914) propagates it, as its other calls do.
- `to_local` had the solid.move check twice after the merge (brett's Option one and ours). Ours stays, after the no-picks/not-placed return.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* After the merge: main's two new tests take world_state's Result, as the rest of their files do
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Native B-rep: a ball patch is its own surface kind, read from and written to SMLib's flat kind 6
SMLib's flat arrays now carry the corner of three equal rounds as `SURFACE_BALL_PATCH` (kind 6): its net as a NURBS face's block, with its sphere's centre and radius as its definition (ids 36 and 166). The record reads it as `ball_patch {center, radius}`, a label like the analytic kinds, with the net as its `nurbs`. A plain sphere with a form won't do: the net is not a piece of SMLib's sphere NURBS, so SMLib's `IsNurbSurfaceSphere` would refuse it.
Written back, a ball patch is kind 6 with the same definition, which SMLib takes once its net is certified on that sphere. Elsewhere:
- Offsets classify it as its sphere, so its offsets stay exact and collapse at the centre.
- Face kinds count it as a sphere: fillet_three_edges_at_a_corner's corner is now `sphere`, no longer `other`.
- STEP, which has no ball-patch entity, gets the net as the face's B-spline surface, pcurves included.
- Iso curves and SSI of the label are refused; the face's form is what evaluates.
Test: a_rounded_cubes_ball_patches_go_round_with_their_spheres. The cube's eight corners are ball patches about the corners pulled in by r. Points of each patch lie on its sphere to 1e-12. The patches are kind 6 again after import, with the same definitions bit for bit, and the closed-form volume holds.
Format: pending/ball-patch-faces.rs. Docs: docs/native-brep.md and the rig README's `surface_types` (`ball_patch`).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* SMLib: pin v1.1.0-alpha (a18bbe5): the generic blend's step-4 corners, the Ball's sphere patch through the flat arrays, all-target CI
Since f916a8d:
- #120: every target again, plus the warnings fix;
- #121: the Ball's patch as flat kind 6 with its sphere, read by the previous commit;
- #122: tests gated on counts;
- #123: the Mixed corner;
- #124: the End at a smooth vertex;
- #125: four or more rounds, and open setbacks;
- #126: the equal-area thumbweight guard;
- #127: the trunk merge.
The SMLIB_PREBUILT checksums are from the release prebuilt-a18bbe5…, written by `scripts/fetch-smlib.sh --pin`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* smlib export tests: rustfmt's line for the rounded cube's edge midpoints
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the fillet and ladder results on SMLib v1.1.0-alpha, the new failures recorded with their reasons
Fixed (off the known-failing list): the Mixed corner's peg cases and the concave arc with the front top edge (smlib #123), and the 40° boss junction (smlib #124). Eight cases in all.
New failures, recorded as they are, each with its reason. They passed on f916a8d.
- **Six cases grade a blend seam G0 where G1 (or G2) is wanted,** at the end of the round's contact seam, after smlib #124's End at a smooth vertex. Two of them also shift in volume.
- **Four cases come back unsupported** after smlib #125, which leaves setbacks to the Setback's corners only.
- **Ladder 07/012** makes 9 faces, 20 edges and 13 vertices, where its golden had 8, 18 and 12. Its golden entry is the new result, with the reason added.
Whether each change is by design or a defect is being established. A defect is fixed in solidcore, where the End and the Setback are being brought over (#2364, #2365), not in the frozen SMLib.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel ladder: 07/021 and 06/018 recorded as they are on SMLib v1.1.0-alpha, each with its reason
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel ladder: a golden case marked unstable is gated on its status, and 06/018 is marked
On SMLib v1.1.0-alpha, 06/018 makes 597 or 594 edges from the same input:
the union's post-process keeps pointers to edges it has deleted. A golden
entry's `unstable` reason makes the gate compare that case's status only
and name it in its output; recording keeps the reason, and only an edit of
the golden removes it. v1.1.0-alpha.1 fixes the cause and removes the mark.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* After the merge with main: its new code on develop's exact bounds, types and thread fields
- The sheet cut's cull (#10301) and the tapped wall's (#10227) use each
body's exact box (`exact_box`), not its display mesh.
- model.threads replies with develop's thread fields: form, hand (right,
left or both) and starts.
- surface.boundary's schema checks a network curve's continuity as the
handler does, and words a list entry's error as it does.
- Main's new tests take develop's Hole fields and world_state's Result.
- mesh-decisions: contact_sweep's triangle check is now `depth` (main
split `hits`).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Known failing: the 14 cargo tests SMLib v1.1.0-alpha fails, with what each sees; two cases that pass now
Develop's CI after the a18bbe5 pin (run 41522001173) fails 14 tests that
passed on f916a8d, and passes two listed ones. Each new line says what the
test sees on v1.1.0-alpha; v1.1.0-alpha.1 fixes the setback hole's cause.
shell_tangent_chain_that_opens_every_face_explains_how_to_keep_walls and
oracle 37-pyramid-apex-blend pass and leave their lists.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Cargo.lock: develop's profile, smlib and step crates at main's 0.30.1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: main's six new sketch-only commands are exempt from a kernel case
sketch.construction_line (and its horizontal and vertical forms) and
sketch.spline.insert_point, remove_point and reverse change only the 2D
sketch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Cuts leave the bodies their tools can't reach, by exact boxes (#10225 on exact geometry)
- The per-target cut loop skips a body whose exact box lies clear of
every tool's, as main's version did with mesh boxes. The sheet culls
(#10226, #10301) and this one now leave the far sheets and bodies alone:
a_cut_leaves_bodies_it_cannot_reach_as_they_were passes and leaves the
known-failing list.
- a_cut_still_runs_where_its_tool_touches_grazes_or_meets_a_curved_face:
a tool 0.5 µm clear of the block is now left out (exact boxes; 0.5 µm is
far past the bodies' tolerances); touching and 0.1 mm in still cut.
- Known failing, with reasons: main's edge lookup by a stored point
(#11286, on the display mesh) is not taken; SMLib refuses the
wrong-way chamfer for its tangent chain first.
- EXEMPT: main's eight new sketch-only commands.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: main's new view, rendering, appearance and settings commands are exempt from a case
62 of the commands main added change no geometry: the view and render
panes, rendering lights and results, appearance tools, settings profiles,
point clouds (drawn as points, never a body), the selection, two sketch
edits, component links and History bar visibility, edit.repeat,
timeline.play, inspect.compare_picture (a picture against the outline),
and component.paste_from_design, which pastes the app's cross-window
clipboard that no command fills. Each joins EXEMPT's first section under
its family's reason.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: construct.plane.axis_point gets construction cases
The plane through a box edge and its far corner, graded against its
closed-form normal (0,-2,3)/sqrt(13) through the origin, and the refusal
of a point on the axis.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: assembly cases for mass properties, align, find limits and moving items between parts
- assembly.mass_properties: two boxes (2 g/cm3) in a rigid group: mass
0.006 kg, centre (18.333,5,5), inertia diag(0.1, 1.0333, 1.0333) kg mm2
by the parallel-axis theorem.
- occurrence.align: a block's end face onto a base's top face: a quarter
turn about y, centre (70,20,20), box (65,15,10)-(75,25,30).
- joint.find_limits: a slider between two stops: min -20, max 10 mm.
- component.move_features, browser.reparent and
component.move_sketches.to_parts: items moved into a turned and moved
part keep their world place (volumes, centres and boxes by hand).
The mass case assigns a material it creates, so material.create and
material.assign leave EXEMPT. PATHS names the new command modules.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: export and print face cases in the import area
- file.export_step, export_stl, export_3mf, export_obj: a 30x20x10 box
written and read back (the meshes converted to a solid): V 6000,
A 2200, 6 faces, box (5,-10,0)-(35,10,10).
- file.export_urdf: a hinged arm on a grounded base: 3 links, 2 joints,
and the base's mesh, written in metres, reads back as the
1 x 0.5 x 0.2 box (V 0.1, A 1.6).
- body.print_face: a cylinder's flat end is accepted, its side refused.
PATHS adds the URDF writer and the print face modules.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* claim: #11259
* fix: preserve transferred profile frames when capturing positions
---------
Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: brett19 <brett19@gmail.com>
Co-authored-by: jyviko <jyviko@gmail.com>
* Measure: the area of a curved face on the exact surface, not the display mesh (#9086)
* Measure: a non-straight border edge leaves the band to the mesh; fix the Vec3 imports (#9086)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Inspect menu: Component Colors is a normal on/off item
The Component Colors entry in Inspect > Check was labelled "Enable Component Colors" and
swapped to "Disable Component Colors" with a different icon while on. It is now labelled
"Component Colors" in both states, keeps one icon, and shows a check mark when on, like Draft
Analysis and the other toggles beside it. The command id and parameters are unchanged.
The now-unused "disable" strings and the colored_components_off icon are removed. Other
languages' old "Enable ..." wording is dropped so they fall back to English until retranslated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Keep the Component Colors label in the fully translated catalogs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Checkable menu rows tell screen readers whether they are on
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Georgian: Component Colors loses its Enable/Disable wording
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #3413
* feat(gpu): extend viewport AO to the virtual ground
* test(gpu): retain measured AO render attachments
* perf: initialize ground AO pipeline with concurrent jobs
* fix(gpu): size ground AO receiver for the current frame radius
* fix(viewport): retain orbit caches when ground AO visibility changes
* claim: #7520
* Hole: drill only the shown bodies when no target is picked (#7520)
A Hole that names no bodies drilled every body in its path, hidden ones
too, and its dialog preview replaced the hidden bodies with drilled ones.
Like a cut (#3961), it now takes the shown bodies of the active component
as its participants while some are hidden, stored so showing the others
later changes nothing. With nothing hidden, or everything, it still drills
every body.
Its face points are named on the bodies it drills first, so a hidden
body's face in the same plane no longer takes the picked face's name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FN5eEMrqWWXqi65FcK8GXq
* Hole: drill the picked body though it is hidden (#7520)
Review on #7562: with the picked face's body hidden (picked through Select
Other, or hidden while the dialog is open), the shown-bodies default left it
out, so the hole drilled only shown bodies further along, or nothing, without
a message. The body whose face holds the hole's position now joins the shown
ones, unless a shown body has a face there too (a face shared by a shown and
a hidden body is the shown one's, as a pick in the view takes it).
The test also covers editing a hole made with nothing hidden while a body it
drills is hidden: timeline.redefine stores participants only when the edit
passes them, so the hole keeps its empty scope and the hidden body its bore.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EMbqRqYimvY26QzcvrojSC
* Hole: test that a hole made with a body hidden replays the same (#7520)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Hole: follow the face-name lookup now returning a Result (#7520)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Hole: tests follow main's Vec3 and world_state (#7520)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Hole: format (#7520)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Hole: with every body hidden, drill them all as before (#7520)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
---------
Co-authored-by: sascha2101 <221609842+sascha2101@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
* claim: #7191
* Report a bug: limit answers by characters and show the room left (#7191)
The answers were cut to 2,000 bytes, silently: 666 characters of
Chinese or Japanese. They now keep 2,000 characters, as the text field's
own limit counts them, in the form, in the report and in a crash draft.
Under 200 characters left, an answer says how many there are. The
report's budget grows so three full answers in any script still fit
beside the technical details.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Report a bug: leave the crash draft's description as it was
It is the app's own English text, well under the limit in bytes as in
characters; leaving the line alone keeps it apart from #7189's change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Locales: Arabic and Hebrew for the new strings
ar and he are complete catalogs on main now (#3458): every new message
needs them. The pending-messages test compares right-to-left messages in
display order once #7532 lands (#7527).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Locales: Vietnamese for the new strings
Vietnamese became a complete catalog on main (#5823), so every new English
message needs it too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Claim #9557
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Navigation: a middle or right drag keeps the mode it started with (#9557)
The mode of a middle or right drag was worked out again from the keys
held on every frame, so letting go of Shift partway through a Fusion
Shift+middle orbit turned the rest of the drag into a pan. It is now taken
when the drag starts and kept until its button is released, as a left
drag with the mapping's keys already was. Preferences > Navigation > "A
drag keeps the navigation it started with" (on) turns it off.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* test: the file chooser says when it is not the desktop's own (#10159)
rfd falls back to zenity in silence when the XDG portal is not there, and the
user gets a foreign window with no explanation. The host must be able to say so.
RED: the test fails with 'without a D-Bus session bus the file chooser is not the
desktop's own: the user has to be told'.
* fix: say when the file chooser is not the desktop's own (#10159)
rfd opens the file chooser through the XDG desktop portal; without the portal it
falls back to zenity, a window that does not belong to the app, and the app never
says so. The user gets a foreign window and no explanation.
The host now asks the session bus, on a thread of its own, whether the portal is
there, and keeps the answer. When a file is opened and the chooser is not the
desktop's own, the reason goes to the session log (Help > Messages), which is
where a user looks for it.
* fix: the file chooser messages read as notices, not assertions (#10159)
The maintainer asked for two things on the pull request: the strings of the
pending catalogue read like a test assertion ("the user has to be told...")
rather than a notice a person would see, and the doc comment above
desktop_chooser_fallback was there twice.
The three reasons are now plain messages, in every locale of the file: they
say what the chooser is and why, and stop there. The doc comment of the
function is now the only one, and it says what it did.
Only the version moves: SolidCraft builds against 0.6.7 unchanged. 0.6.7 applies App::Part
and link placements once, writes a sphere's seam ring as a valid loop, and indexes the
lookups that made large assemblies slow to decode. Two real FreeCAD documents that 0.6.3
refused as invalid open with it.
Claude-Session: https://claude.ai/code/session_01MvsHJx9gzG4447TABcpZFo
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #10977
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parameter Sweep: input and output schemas (#10977)
inspect.parameter_sweep gets a typed contract and reply types in
schema/parameter_sweep.rs and leaves unconverted.txt. Each key reads as
the handler reads it, with its message; the reply is built from
ParameterSweep and its item types, with the same JSON as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Parameter Sweep schema: a missing parameter reaches the handler's message
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* parameter_sweep schema: do not publish a null default on the required parameter
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Where one body stands on another (a post on a plate), the post's bottom,
seen through the cut, and the plate's top are the same plane. In the CPU
rasterizer (headless pictures without a GPU) the plate's top won that
depth tie and showed through the post's cut. The cut now wins a tie by a
few f32 steps (DEPTH_EPS).
The viewport already draws this right since #6363 and #6728; a GPU
regression test now covers it, both creation orders, orthographic and
perspective, with both depth formats.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* UI kit: one shared needs-attention mark, used by the agent chat's badge
The agent chat's "waiting" badge becomes `ui_kit::attention_mark` (a count, or
a plain dot) in `ui_kit/attention.rs`, so other things that wait for the user
(linked designs that changed, #5354) share one mark. The count is drawn
exactly as before. No change in behaviour.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UI kit: sort the attention re-export
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* ui_kit attention mark: take the corner inset from Tokens::space_3
The inset came from the agent chat panel as plain numbers, which font_sizes_and_dense_form_metrics_come_from_tokens refuses outside theme::Tokens (review on #5424). space_3 is 3.0, so nothing moves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Carel Theron <careltheron@Carels-MacBook-Pro.local>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
The live product preview's signature included the session revision, which
every command moves: a selection click extracted every body and built every
product vertex again (118 ms on a 200-body assembly) before the key comparison
skipped the upload. The signature is now the document and world state (held,
so their addresses are not reused) and every input of body visibility,
including hidden folders and the active sketch.
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Past a failed step a scripted drag solves the next steps at once and takes
those that fail in a row as tried; the first that solved was then solved
again by the walk. It now becomes the sketch from its solved copy, so no
step is solved twice. A batch holds one step per core (at most 8), and on
one core or in the browser build, where a batch would run its steps one
after another, the walk solves the steps itself. The walk takes the same
steps with the same outcomes, so results and counted solves don't change.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #9007
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Circular pattern: cut copies of a hole that lie apart in one go, and check missed copies cheaply (#9007)
The check for copies that remove no material intersected every copy with
the whole body; a point test along the hole's axis (and through the middle
of the copy's overlap with the body) now proves most copies take material
and only the rest are intersected. Copies the kernel's coarse box test
takes for meeting are measured on finer meshes and, when clearly apart,
joined with join_apart and cut once.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Format (#9007)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Look for a copy's material through the middle of each of its faces (#9007)
A tool of two pieces (two circles cut at once) turned by 45 degrees has the
middle of its box between the pieces; the lines along the axes through it
miss both, and the copy was intersected. The lines through the middle of
each face's box run along each cylinder's axis.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Circular pattern: cut copies that notch the same round face one by one (#9007)
Copies whose boxes only finer meshes show apart were cut in one go. When
several of them notch the same curved face of the target (grooves along a
bore), the result kept extra lines on that face: a revolved ring with 37
grooves came out in 184 faces instead of the 151 a one-by-one cut leaves,
at the same volume. Such copies are now cut in turn; copies that only
share flat faces (through holes in a tube wall) are still cut at once.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Circular pattern: tell copies apart and find copies that cut nothing on exact shapes (#9007)
The checks this pull request added decided on meshes, which `cargo xtask
mesh-decisions` now refuses. They decide on the exact shapes instead:
- Two tools whose boxes meet are apart when their union comes out in two
pieces that share no face, edge or vertex (crossing, nested and touching
tools do not).
- A copy takes material when a point along its axis, the axes of its round
faces or the middle of the box it shares with a target is inside both, by
exact point classification; only copies that test cannot place are
intersected.
- Copies that notch the same round face are no longer cut one by one: cut
in one go they now leave the same faces as one by one (a revolved bore
with 37 grooves: 80 faces either way, as on main).
The test of copies that come close now uses 8.5 mm, where they overlap; at
9 mm they are 0.012 mm apart and are cut in one go.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #8823
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sheet metal: returns on a notched tray close at the corner away from the notch (#8823)
Closing two returns at a corner was refused when either return already lay
over another flange in the flat pattern, even far from that corner. On a tray
with a notch, the walls on either side of the notch's inner corner both unfold
into the notch, so the return on one of them lies over the other there; the
return's opposite convex corner was then left open ("closed, the flanges would
overlap in the flat pattern") and the two returns ran through each other.
A closure is now refused only when it makes the two returns overlap or adds to
what either already shares with another flange in the flat.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* English: command labels in title case, other labels in sentence case (#9085)
The rest of #9085 after #9194 (the plural and the spelling) and #9907
(the Preferences page names). Command labels are in title case (422 of
430 were already); the seven in sentence case follow, and Fix/UnFix
reads Fix/Unfix. The UI text skill states the rule. The user docs name
the Preferences footer's button by its current label, Restore page
defaults (#10295).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Navigation bar menu test: the echo names the command by its own label
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UI text skill: state the case rule in one short sentence, under the 3600 limit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Localization doc: the case rule in full, with examples
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Localization doc: the example button is Restore page defaults now
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* i18n: make engine errors translatable
Engine errors (`EngineError::BadParams` and the offset/path errors the kernel
returns) were shown in English regardless of the active locale.
- Add `tr_engine_error`, which maps the known messages to `sketch.error.*`
keys and returns anything unknown unchanged.
- Normalise the `invalid parameters for `<command>`: ` prefix before matching,
and interpolate the offset id into the translated message.
- Route `friendly_error` through `tr_engine_error`.
- Avoid redundant status writes in `run_points`/`run_entities`.
- Ship the es-ES pending strings for the sketch tool hints.
* Spanish (es-ES): catch up with en.json
Translate the 734 messages `es.json` was missing and fix `ui.project`
("Proyecto" → "Proyectar", the action behind the sketch project tool).
The catalogue now matches `en.json` key for key (5,591 entries), keeps every
placeholder intact and stays alphabetically sorted. That includes the 61
messages added upstream since the last catch-up (92a9a5e0).
Terminology: "Turntable" → «Plato giratorio», "hover" → «pasar el puntero»,
"card" → «tarjeta».
* i18n: attribute the sketch hints and keep the offset error neutral
The pending sketch hints file adds an asset, so it gets its own row under
attribution/pending rather than editing ATTRIBUTION.md.
The engine reuses the offset-ends error for trim, extend and break, so the
message no longer tells the user to trim: it asks them to edit the source
curves instead.
* i18n: translate shortcut-started tool hints and fix the break message
Shortcuts are handled in logic(), before ui() installs the language scope, so a
tool started by its key stored the English hint even with another language
selected. Install the scope for the whole frame.
The engine has nothing to break, so say so: "nothing to break here".
* i18n: scope a tool start so its hint uses the app language
A direct start can run outside the frame scope (and a shortcut runs in logic),
so the hint was built with the thread default. Open the scope where the tool
starts.
* Spanish (es-ES): translate the 30 new messages
The blur preferences, the dimension step settings and the fillet turn modes
arrived upstream after the last catch-up.
* i18n: scope command errors and use US spelling in the hints
The native menu runs Undo and Redo before the frame scope exists, so an error
from them was translated in the thread default language.
The pending hints mixed British spellings into the English source; the English
catalog is US-spelled, so the fallbacks say center and en-GB keeps centre.
* claim: #10854
* Agent chat: tell the agent the design changed by hand since its last reply (#10854)
The chat remembers the design as the agent last saw it, at the end of a
turn it answered or worked in. When the next message goes and the design
is no longer that one, a note goes before the message for the agent (not
into the conversation, like the note after an interruption): the user
changed the design by hand, which parameters changed from what to what,
which features are new, edited or removed, where the History marker went,
and to read the design again before reusing positions, picks or sizes.
A new chat and a stopped backend forget it, so a session that has seen
nothing gets no note. Each list names at most 12 items and counts the
rest; names and expressions are cut at 60 characters.
* Agent chat docs: the design-changed note asks the agent to read the design again (#10854)
---------
Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com>
* Loft: profiles picked one after another in one sketch are one section (#11720)
The Loft dialog made every picked profile its own section, so two picks in
one sketch (both halves of a split outline, say) became two sections in one
plane and the loft was refused. Consecutive picks in one sketch now form one
section {sketch, profiles: [...]}; a later return to that sketch is still a
section of its own, so the there-and-back loft of #8221 is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Loft: an unchanged edit keeps a section of all profiles "all" (#11720)
An edit loads a section of "all" as each profile of its sketch; now that
those picks make one section, OK saved them as indices. Indices fill a
letter's counters that "all" keeps as holes, so a later rebuild could
change the loft. Like Extrude, Revolve and Emboss, a section that was
"all" stays "all" while the picks are unchanged and cover every profile.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
same_nurbs compared the weights of a face's NURBS form and the rebuilt
analytic surface's NURBS within an absolute 1e-12. A weight is found from
the control points, so its rounding grows with the coordinates: 3.8e-12 at
coordinates of about 320 on a cone. The face was refused with "a NURBS form
that is not its analytic surface". Weights now compare within
1e-12 * max(1, |coordinates|), as same_nurbs_curve already does for points.
* claim: #11434
Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch>
* Preferences: the theme arrows move by the themes that fit in view
The previous and next arrows beside the theme cards in Preferences >
Appearance moved the row by one card per click, although their hover
text says "Previous themes" and "Next themes". With 26 themes and about
six cards in view, reaching the last theme took some twenty clicks.
The shared carousel now moves by the number of cards that fit at the
current width, so one click shows the next screenful. The last page
ends on the last card, the first page starts on the first, and the
arrow at an end stays dimmed and inert. The step follows the window
width, and the row still opens on the chosen theme.
Fixes#11434
Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch>
---------
Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch>
* claim: #11895
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Configuration table: input and output schemas for Configure, Configuration Column, Row and Rule (#11895)
describe_command now gives the exact parameters and reply of the four
commands that change a design's configuration table, and the warn and
strict parameter checks use them. The handlers read their parameters
from the raw JSON, so the new contracts in schema/config.rs read each
key as its handler does, with its message: lists of names as
params::string_list (whose json_brief and MAX_STRING_LIST become
pub(crate)), exactly one column target, faces picked or a face column's
key, a row's cells, and rules (whose schema describes them; the handler
keeps its own check). What only the design can answer stays the
handler's. All four reply with ConfigTableReply, as config.table does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* claim: #9625
Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch>
* Name the value at fault when a hole, sheet rule, joint or extrude is refused (#9625)
Several refusals were right but named a check the input had passed, so
the user changed the wrong field:
- solid.hole: an unknown `fit` was reported as an unknown bolt size; it
now says the fit must be close, normal or loose. A countersink angle
out of range was reported as a countersink too narrow; the angle and
the width are now checked apart. A `diameter` number out of range was
reported as missing; it now gives the range, as other parameters do.
- Sheet rules: a thickness of 10000 mm or more said "must be positive";
it now gives both limits. The K-factor and the bend radius are named
on their own, and the message no longer implies a radius of 0 is
refused.
- joint.drive: a number out of range said "numbers or expressions"; it
now gives the range.
- Extrude: a distance past the kernel's limit said `end = 1000000000`;
it now says the extrusion is too long and gives the limit.
Fixes#9625
Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch>
* Refuse a too-long extrusion before the kernel and match the countersink floor (#9625)
The kernel is paused, and its `finite()` check also guards a revolve's
angle and a cylinder's and a torus's sizes, so its message must not say
"extrusion". crates/kernel is back as it was; the doc evaluator now
refuses an extrude (plain, tapered, or redefined from the Edit Extrude
dialog) whose end lies 10000000 mm or more from the sketch plane,
mirroring the kernel's limit, and says so. A cylinder of radius 2e7
keeps the kernel's own message.
The countersink check refused 0.1° while the message said "more than
0°". The floor stays (the cone grows as 1 / tan of the half angle) and
the message now names it: more than 0.115°.
Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch>
---------
Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch>
* Allow optional hidden-edge picking in Shaded with hidden edges
Keep visible-only picking as the default. Cover the preference, hover cache,
section and body visibility, and Fillet inputs in the existing UI tests.
Use platform-absolute fixture paths in the Windows CI argument-parser test.
* Respect section caps and visible-edge ties in hidden-edge picking
* Keep section caps as occluders behind nearer kept faces
* claim: #11882
* Agent chat: a prompt's bubble is as tall as its message (#11882)
The prompt's Copy message row (#10741) was laid out right to left and centred
across its height. egui gives such a row all the height left in the
conversation's view, so a prompt near the top of a conversation stretched
down over the empty view, with Copy message floating in the middle. The row
is top-aligned now.
* Agent chat: keep the test's harness bound (#11882)
---------
Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com>
* Arabic: rim term and the shell-first step in the Lip help
* Arabic: Up/Down keys in the dimension step preferences, frame-rate note matches the English
Added as assets/locales/pending/finnish-catch-up-2026-11.json so it
folds after merge: help texts, the redesigned Preferences (sketch,
navigation, dimension values, panel blur), fillet corner, setback and
turn options, threads, import report, browser and viewport messages.
cargo xtask i18n lists nothing missing for fi.
Co-authored-by: Janiz-zzz <267742026+Janiz-zzz@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The handler's strict parameter type moves to schema/render_shots.rs as
ShotParams, with descriptions and JsonSchema, and becomes the contract of all
three commands; the handler reads the same type. It builds ShotChange instead
of a json! literal, and takes its operation as a ShotOperation enum.
Co-authored-by: Claude <noreply@anthropic.com>
* Snap points: a flat face offers its corners, edge middles and every hole's centre (#11476)
A flat face now offers its whole outline as snap points, read from the
exact faces and edges: every corner, the middle of every straight edge
and the centre of every round edge, holes included, as well as the centre
of its area. Corners on a closed circle's seam, or where the kernel split
one circle into pieces, are left out.
snap_points_from gives each point with where it came from (SnapSource):
the face it was picked on, the face's outward normal and a point inside
its edge, so a tool can keep the point by name (joint.create's edge,
corner and on) and turn a frame to the face. SnapPoint itself does not
change, so code that builds one keeps compiling.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Snap points: a round face's end centres say which way their end faces (#11476)
The centres at a cylinder's or cone's two ends now carry a normal in their
SnapSource: the axis pointing out of that end, which is the normal of the
face a hole opens onto or of a pin's end. A joint origin taken from one can
then lie on that face, as the centres a flat face offers already do.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Snap points: a hole centred on its face keeps its own point and rim (#11476)
Snap points were one point when they lay at one place, whatever their kind,
so a hole centred on its face was lost behind the face's centre, and with it
the rim its point keeps. Now only points of one kind are merged: the face's
centre and the hole's centre both stay, and only the hole's has its rim.
SnapSource::normal's doc now says it is also the axis out of a cylinder's or
cone's end.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Snap points: a washer's two rims keep a centre each (#11476)
Centres at one place are one point only when they are on one circle: the
inner and outer rims of a washer face now keep a centre each, with its own
rim, while the pieces the kernel split one circle into are still one point.
SnapSource::normal's doc now says that at a round face's end it is the
axis out of that end of the face, which at a blind hole's bottom points
into the material below, not out of it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Snap points: rims are told apart by their radii's size, not their place (#11476)
Two centres at one place were one circle when their rims' radii differed by
less than the place's tolerance, which grows with the distance from the
origin: 60 m out, rims of 4 and 4.05 counted as one and one lost its point.
The radii are now compared with a tolerance from the radii themselves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Snap points: nearby points stay apart far from the origin (#11476)
Points of one kind at one place were merged within a tolerance of 1e-6 of
their distance from the origin, 0.06 mm at 60 m, so two small holes there
whose centres are 0.05 apart lost one centre. Places now use 1e-9 of that
distance (0.06 µm at 60 m): well above the rounding of coordinates and of a
circle fitted to an imported edge, so a point found twice is still one, and
far below any feature. The radii keep their own tolerance.
The merge is its own function, so its test can give it points directly.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Alfonso Tamés <mufufu@Mufufu-MacBook-Pro.local>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Book: a numbered window screenshot and a navigation clip, from a capture script
The window tour now opens with a screenshot of the real window, its parts numbered in the
order the page describes them, and a short looping clip of orbit, pan, zoom and Home.
examples/demo/doc_shots.py makes both, and any later figure: each shot is a function that
starts a fresh app (its own settings) under Xvfb, drives it over the control channel with
the demo's Demo driver, and writes a still (numbered callouts, palette-optimised PNG) or an
H.264 clip (the drawn pointer of overlay.py, short button labels, idle cut by trim_idle.py)
into docs/book/src/media/. CONTRIBUTING.md says how to redo a figure when the UI changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* doc_shots: clips keep a moment on each result; the window tour again on 0.29.0
trim_idle.py takes --hold S, the seconds of each idle stretch to keep (default 0.1, as before,
so the README demo is unchanged). The guide's clips keep 0.8 s, so a reader can see what each
step did before the next begins. The window screenshot and the navigation clip are made again
with it, on SolidCraft 0.29.0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Claim #9943: keep orbit gizmo drag tracking past the window edge
* Warp the orbit gizmo drag back to the window centre at the edge (#9943)
---------
Co-authored-by: Dahak Builds <dahakbuilds@users.noreply.github.com>
A design that crashes or hangs the app while it is being reopened was
reopened blindly every launch, bricking the app each time. A launch that
reopens designs now marks them in the recovery folder; the marker is
cleared as each design finishes opening. A launch that finds the marker
left behind skips those designs once and says which one the last session
stopped on, so the app starts usable and the loop breaks.
Co-authored-by: Dahak Builds <dahakbuilds@users.noreply.github.com>
* claim: #10540
* Ribbon: only switch the tab when a command actually starts (#10540)
select_command_tab ran before the command's own checks, so a command that
only reports a missing parameter or nothing to work on still moved the
ribbon. The ribbon now moves when the command starts and a refused command
puts the tab back, as a disabled command already never leaves it. View
display toggles and choices menus keep the ribbon's tab however they are
started, matching F6, the navigation bar and the view cube.
Written by Qwen.
* rustfmt (#10540)
Written by Qwen.
---------
Co-authored-by: Dahak Builds <dahakbuilds@users.noreply.github.com>
* claim: #10240
* Lost GPU: a loss met by a queue write restarts the app instead of crashing (#10240)
The per-frame probe (#6528) finds a device the driver reset before the
frame's uploads, but the driver resets a device at any moment: a reset
that lands after the probe is still met first by a queue write or the
present, and wgpu-core unwraps the driver's Lost there
(PendingWrites::activate) instead of losing the device. That panic
ended the app and wrote a crash report.
- egui-wgpu: the painter runs each frame under DeviceLost::survive. A
panic the frame meets is taken for the loss once the probe then finds
the device lost (the probe's path loses the device and runs its lost
callback); the painter draws nothing more and the app restarts as for
any lost device, keeping unsaved changes for recovery. Any other panic
carries on unwinding.
- Crash reports: a panic inside wgpu-core that unwraps Lost is the
device loss, not a bug, and is not reported. A command that meets it
fails; the next frame's probe restarts the app.
---------
Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com>
* View navigator: a custom body as the navigator, and a right-click menu to switch types
A right-click anywhere on the view navigator opens a menu with its three types: Axes, Cube and
Custom. Custom opens the Custom View Navigator panel (a feature panel with OK and Cancel): pick a
body in the view, its texture (Themed: the cube's colours; Modeled: the body's own appearance and
the view's edge colour), and whether the cube's rotation arrows and Home button go around it. The
navigator previews the panel's choices while it is open; Cancel leaves it as it was.
The custom navigator draws the body at the cube's size through a small depth-buffered raster, so
hidden faces stay hidden; hovering a face highlights it, a click looks straight at it (and frames
the model with navigator_fit on), a drag orbits. Until a body is chosen it draws the cube.
The body is kept as a packed snapshot (16-bit, base64) with the preferences and in settings
profiles, so it stays across runs and designs and travels with an exported profile. Bodies over
10,000 triangles, and long or flat ones (thinnest width under a fifth of the widest), are refused.
New command view.navigator (style, body, texture, arrows, home) does the same without opening
anything; new preferences navigator_texture, navigator_arrows and navigator_home, and a Custom
choice for navigator_style. Defaults are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Custom view navigator: a hovered face in Modeled takes the view's selection colours
In the Modeled texture the face under the pointer is filled and outlined the way the view selects
a face of the model (sel_face, sel_edge), not in the cube's hover blue and accent, which Themed
keeps.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Custom view navigator: a hovered face in Modeled lights up as the view's mouse-over does
The face under the pointer keeps its own colour, a little lighter (hover_face_lift) and still
shaded, with its edges in the view's mouse-over edge colour (hover_edge), as the 3D view shows a
face under the pointer; not the selection colours. Themed keeps the cube's hover blue and accent.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Custom view navigator: rotation arrows and Home on by default
navigator_arrows and navigator_home start on, so a new custom navigator has the cube's arrows and
Home button around it; the Custom View Navigator panel turns either off.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Custom view navigator: the strings in every complete language, and test fixes
- The new messages in Arabic, Hebrew and Vietnamese (complete catalogs, like Japanese and Chinese).
- The navigator's raster goes through one colour helper, listed with its reason among the files
allowed colour literals (the design's appearance shaded into pixels).
- nav_settings joins the requested-icon manifest (the view.navigator command's icon).
- A visible edge piece is kept only when the stretch seen with it, across the edge's segments, is
at least two samples long: a hidden edge no longer shows a sliver at a silhouette corner.
- The navigator layout test treats Custom without a body as the cube it draws; the panel and
size tests no longer assume an empty undo list, the style before opening, or a coarse sphere.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Custom view navigator: profiles carry its texture, arrows and Home
Settings profiles keep a fixed set of preference keys (#9907), which the custom navigator's newer
settings are not part of. They travel in the profile's own `view_navigator` entry, next to its
body (`view_gizmo`): captured, checked (a value this version can't read is left out) and applied,
leaving the fixed key set unchanged. The cube's arrow inversion (#10286) applies to the custom
navigator's arrows too, through the shared arrows().
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Custom view navigator: follow main's Vec3 move and fallible world_state
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Custom view navigator: list view.navigator in the rig's EXEMPT, refuse a stored body that can't save again, right-click without a widget over the navigator
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Custom view navigator: keep the body unless picked again, save only a profile that reads back, no navigator menu through a popup
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Custom view navigator: refuse a stored body with a triangle past its points
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Custom view navigator: a stored body meets the triangle and aspect limits a picked one does
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Custom view navigator: a body at the 5:1 limit stays inside it once packed
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* i18n(uk): translate the 80 messages main gained after batch 11
* i18n(uk): translate the messages main gained after 2 November
Add Ukrainian for the 158 English messages upstream added since the last
sync, and update 10 existing translations whose English text changed.
The new messages go in assets/locales/pending/uk-sync-2-nov.json, as the
locale files are not edited for new messages. The changed English text is
updated in assets/locales/uk.json, because a pending file cannot change an
existing message.
* i18n(uk): translate the messages main gained after the 3 November sync
Add Ukrainian for the 174 English messages upstream added since the last
sync, and update 56 existing translations whose English text changed.
The new messages go in assets/locales/pending/uk-sync-2-nov.json, as the
locale files are not edited for new messages. The changed English text is
updated in assets/locales/uk.json, because a pending file cannot change an
existing message.
* i18n(uk): apply CodeRabbit review fixes
Use the catalog's established wording: 'вибрати' in the keyboard hint,
name the linked component in the double-click help, and use the command
labels 'Упор', 'Бобишка' and 'Клацкове з'єднання' in the placement group.
* i18n(uk): use "Защіпкове з'єднання" for Snap Fit
The catalog called the plastic snap-fit joint "Клацкове з'єднання", a
calque of "snap". Use the standard "Защіпкове з'єднання" and
"защіпковий гачок" in the command label, help, sample description and
the design tools placement group. The drag hint already said "защіпку".
* i18n(uk): replace calques and outdated terms
Use "збіг" for coincident, "виступ" for lip, "ступиця" for hub, "шаблон" for preset, and "наддискретизація" for supersampling. Render and panel host texts now say "рендерер" or "середовище"/"вікно" instead of "хост".
* Sketch: an ellipse comes with its axes, and D measures its half-axes
An ellipse could only be sized by its minor radius, drawn like a circle's
radius, and there was no way to give its full axes. sketch.ellipse now also
adds the major and minor axes as construction lines through the centre.
The major axis runs from the major end to the point opposite it; the minor
one is perpendicular to it, ends on the ellipse, and both are bisected by
the centre. That adds six coordinates and six equations, so the ellipse
keeps its five degrees of freedom, and it needs no new constraint kind and
no format change.
With the axes in place every ellipse size is an ordinary dimension. D on an
axis line gives its length, the whole axis. D on the outline gives a half-
axis, the distance from the centre to an axis end, chosen the way a line
chooses horizontal or vertical but in the ellipse's own frame: text pulled
across the major axis measures along it (the major half-axis), text pulled
out past an end of it measures across it (the minor one). The end on the
text's side is used. Near the boundary between the two, a dimension being
placed keeps the half-axis it had (sketch.dimension's previous_axis, which
the Dimension tool sends), so the preview does not flip. A half-axis and
its whole axis determine each other, so the second becomes a driven
dimension through the existing redundancy path.
Deleting the ellipse leaves its axes, as deleting a Center Rectangle's
edges leaves its construction diagonals. Ellipses without axes, from
existing designs, keep the minor radius as before, and type radius still
gives it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Guide: an ellipse's axes and half-axis dimensions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: test that an ellipse's half-axis preview keeps its axis near the boundary
The Dimension tool sends the half-axis its last preview chose, so near the
boundary between the major and the minor half-axis the preview keeps it.
This covers that path from the tool, from both sides of the boundary.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: an ellipse's axes select and drag with it, as a rectangle's diagonals do
A double-click on a Center Rectangle's edge or diagonal selects its edges
and both diagonals, and dragging a diagonal moves the rectangle without
changing it, because its lines share corner points. An ellipse's axes are
held by constraints instead, so a double-click selected only the ellipse
(and Delete then left the axes behind), and dragging the major axis moved
the ellipse but stretched its minor half-axis.
Sketch::ellipse_axes now finds an ellipse's construction axes (the
detection sketch.dimension already used, moved into the sketch crate).
Sketch::chain treats an ellipse and its two axes as joined, so a
double-click on any of them selects all three. Dragging either axis moves
the ellipse and both axes as one, keeping both half-axes. Dragging the
outline still sets the minor half-axis.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: a corner test reads its line's id instead of assuming l1
sketch.ellipse now adds two axis lines, which take the first line ids, so
the extend test reads the id of the line it draws from the reply.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: an ellipse's axes cut a trim, as a Center Rectangle's diagonals do
Trim, extend and break take every other curve as a cutter, construction
lines included, so an ellipse's construction axes stop them as a Center
Rectangle's diagonals do. A test now states it for both shapes, and the
guide says it. The freeform cutter test keeps the axes it used to delete
and asserts the piece a trim removes: from where the major axis crosses
the circle to where the ellipse does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: test dragging an ellipse's outline with its axes present
Dragging the outline sets the minor half-axis, and the minor axis line,
held on the ellipse at one end, follows it; the centre and the major
half-axis stay.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: other dimension types on an ellipse with axes keep the minor radius
Only auto, major and minor give a half-axis on an ellipse drawn with its
axes. Any other type (radius, diameter, horizontal and the rest) gives
what it gives on an ellipse without axes, as the parameter doc says,
instead of quietly becoming a half-axis chosen by the text. The arm for
a missing text_at is dropped: with no text the rule already picks the
minor half-axis.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: test an ellipse's half-axis dead zone from the major side too
The tests only showed a previous minor half-axis being kept near the
boundary; the point they used on the major side is major by geometry
alone. A point inside the band where geometry says minor now shows a
previous major half-axis kept, in the engine and in the Dimension
tool's preview.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: a placed ellipse half-axis is the one its preview showed
On an ellipse already sized, a half-axis is added as a driven dimension
on the click, and that command left out the half-axis the preview kept
near the boundary, so the click could place the other one. It now
passes it as the preview does.
The remembered half-axis also comes only from a draft whose text was
placed (one without text is the minor half-axis by default and biased
the first placement), is kept per sketch as well as per picks, and is
forgotten once a dimension is placed or the picks are cleared.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: say how an ellipse's axes are recognised and what that costs
The axes are read from the constraints, with no mark in the design, so
the doc comment says which lines count, that deleting the midpoint or
point-on-curve constraint leaves an ellipse without axes, and that each
lookup scans curves times constraints.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: an ellipse with one axis deleted still picks its half-axis by the text
With one construction axis deleted, D on the ellipse fell back to the minor radius wherever the
text was pulled, because the half-axis choice needed both axes. It now reads what is left of
them and chooses as before: the major half-axis goes to the major end (also from the far side,
when the point opposite is gone with its line), the minor one to its axis end, or as the minor
radius when the minor axis is the one deleted. An ellipse with neither axis keeps the minor
radius.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: the one-axis half-axis test checks what is measured to
The test for an ellipse with one axis deleted checked only the reply's axis and value, which
both ends of an axis give alike. It now checks the dimension's kind and end: the axis end on
the text's side, the major end from either side once the point opposite is gone, a radius once
the minor axis is. With the major axis deleted and no text the reply names the minor axis and
measures to its end, where it used to be a radius with no axis named.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: an ellipse's minor radius is drawn as its half-axis, without R
A radius on an ellipse is the minor half-axis, and it was drawn as a circle's radius: one
leader from the centre towards the text, marked R, which measures nothing a reader can see.
It is now drawn as the distance from the centre to the minor axis end on the text's side,
the way the half-axis is drawn while the ellipse has its axes, and labelled with the length
alone. This is what D gives once the minor axis line is deleted, and on an ellipse with no
axes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: an ellipse's half-axis keeps a radius's stored text
The half-axis frame read the stored text from the middle of the half-axis, so a radius placed
on an ellipse in an existing design would show its text somewhere else. The text is stored from
the centre again, as a radius's always was, and the side drawn to follows it. An unplaced one
sits where a linear dimension to the minor axis end puts its text, and stacked texts step out
from the centre as a radius's do. A view test reads the painted label, so the drawing cannot
go back to R unnoticed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: an ellipse moved, turned or scaled takes its axes along
Move, Sketch Transform and Scale moved only the curves picked, so an ellipse moved without its
axes left them where they were: its centre no longer halved them, the minor end left the
ellipse, and the sketch stayed unsolved. A Center Rectangle's diagonals share its corners and
always go along; an ellipse's axes share only the major end. The axes now go with the ellipse,
as they do when it is dragged. Copy is unchanged: it copies no constraints, for a rectangle
either.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: a preference draws ellipses without their axes, as before
Drawing an ellipse with its construction axes changes what the Ellipse tool makes out of the
box, so the old ellipse stays one setting away: Preferences › Sketch › Draw ellipses with their
axes, on by default. Off, the tool draws the ellipse alone. sketch.ellipse takes axes: false
for the same, and keeps drawing the axes when it is not given.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: sketch.ellipse refuses an axes value that is not true or false
A string such as "false" was read as not given, so the axes were drawn; it is now refused as
the text commands refuse a non-boolean bold or italic. The move test also covers an ellipse
whose minor axis was deleted: the major axis left goes along.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: D picks a half-axis on an ellipse without axes too
An ellipse with no axis lines (both deleted, a mirrored copy, one from an older design) gave the
minor radius wherever the text was pulled, so its major half-axis could not be dimensioned on
it. The half-axis is now chosen by where the text is on every ellipse: the major one to the
ellipse's own major end, the minor one as its minor radius. With no text it is the minor
radius, as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: with one half-axis dimensioned, D on the ellipse gives the other
D on an ellipse chose the half-axis by where the text was pulled even when that half-axis was
already held by a dimension, so the second D usually guessed the one already there and was
refused as over-constrained. With a driving dimension already on one half-axis (to an axis
end, the minor radius, or the whole axis along its line or between its ends), D with no type
now gives the other, in either order and with or without the axis lines. With both held it
chooses as before; an explicit major or minor is kept.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: the held half-axis rule is documented and its cases tested
The Dimension command's parameters and the guide now say that with one half-axis held, D on
the ellipse gives the other. Tests cover the whole axis held as a distance between its ends
and as its line's length with the other axis deleted, and check that a mirrored ellipse has
no axes. The placement test undoes its first dimension, so its second half still tests where
the text is rather than the held half-axis.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: Transform previews an ellipse with its axes
OK in Sketch Transform moves, turns and scales an ellipse's axes with it, but the window drew
where OK would leave only the picked curves, so the axes stayed put in the preview until OK. An
ellipse picked alone is now drawn with the axis lines it has.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: the typed-radius ellipse test counts the ellipse's axes
Main's #10282 test drew an ellipse with typed radii and expected one curve; with the
ellipse_axes preference on by default the tool also draws the two axes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: an ellipse's remaining axis still drags and selects it
With one axis deleted, dragging the other axis did not hold the ellipse (with the minor axis
left, the drag squashed it), and a double-click on the ellipse or that axis selected only the
one curve. The drag and Sketch::chain now read whichever axes are left through
ellipse_axis_lines, as Transform and Move already do.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: drop the unreachable third arm of the held half-axis check
A distance from the centre to the major end or the point opposite it is already matched by the first arm, so the third arm and its major_end closure never ran.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: D on an ellipse's axis line is the whole axis wherever the value is pulled
An axis line took the free line's rule, so on a turned ellipse a value pulled beside or above the box the axis spans gave its horizontal or vertical distance. An ellipse's axis is a construction axis, so auto now always gives its length, which the held half-axis check already counts.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: an ellipse's axis is never a side of a Fillet or Chamfer corner
A line drawn from an ellipse's major end shares that point with the major axis, so Fillet or Chamfer there took the two as a corner (two lines skip the construction filter) and rounded the line into the axis. The axes are left out of a corner, picked by its point or as a and b.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: test the move reply, extend and the one-axis Transform preview for ellipse axes
The reply of sketch.move, sketch.transform and sketch.scale lists the axis lines, Extend stops at an axis, and Sketch Transform previews an ellipse with the one axis left after the other was deleted.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: with Draw ellipses with their axes off, D on an ellipse is its minor radius as before
The preference brought back the old drawing only; D on an ellipse had changed with no way back. sketch.dimension takes half_axes (default true, refused when not true or false); false makes auto on an ellipse the minor radius wherever the text is. The Dimension tool and the context menu's Sketch Dimension pass it from the preference, and with it off a radius on an ellipse is drawn and labelled R as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: read an ellipse's axes in one pass over the constraints
ellipse_axis_lines scanned every constraint for every curve, so 500 ellipses with their axes (1500 curves, 2000 constraints) took 1.6 s to read and Move on all of them 2.0 s. It now collects the lines the centre bisects first: 3 ms and 0.36 s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: the dimension and corner parameters say how an ellipse's axis lines take part
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Preferences: Draw ellipses with their axes says D gives the minor radius when off
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: ask only the ellipses centred on a line's midpoint whether it is their axis
is_ellipse_axis read every ellipse's axes to answer for one line. An axis is bisected by its ellipse's centre, so it now asks only the ellipses centred on a point that bisects the line. The answer is the same.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: a horizontal or vertical dimension across a level major axis holds it for D on the ellipse
half_axes_held counted a distance, a length and a radius, but not a horizontal or vertical dimension across the major axis, which is its length when the axis lies that way. D on the outline could then take the held major half-axis and be refused as determined; it now gives the minor one. Across a slanted axis such a dimension is only a projection and does not count.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Dimension: a draft on an ellipse is drawn with the axes preference it was made with
The frame read the preference as it is now, while the dimension added is the draft's.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: a horizontal or vertical dimension across an upright minor axis holds it too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: drop the unused Sketch::ellipse_axes; ellipse_axis_lines says how the axes are read
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: an ellipse's own axes do not cut it, so Trim takes a lone ellipse whole and stops at real crossings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: Fillet and Chamfer offer no corner at an ellipse's axis end, as the engine takes none
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: a deleted ellipse leaves its centre on its axes, as a Center Rectangle's centre stays
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: ellipse axis docs say what they do, and the corner picker tests a curve's ends before its axis role
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: the trim-at-a-crossing test checks that part of the ellipse is left
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: an ellipse axis moved, turned or scaled on its own takes its ellipse along, as a drag does
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: a selection dragged by an ellipse axis takes the ellipse along, as the axis alone does
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Docs: the Sketch preferences page lists Draw ellipses with their axes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: the ellipse axes help text says D gives the minor radius, drawn and labelled R as before, wherever the value is pulled
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #794
Co-authored-by: ReDead <ReDead@users.noreply.github.com>
* Shell: pick a body from the Browser for a closed hollow (#794)
Faces/Body accepted only faces, so a Browser body click never filled the
Shell dialog. Accept bodies, build faces:[] with that body, restore empty-face
shells as a body pick, and keep the chip/highlights on the body itself.
Co-authored-by: ReDead <ReDead@users.noreply.github.com>
* Shell: refuse faces that sit on a different body than the Browser-picked one
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: ReDead <ReDead@users.noreply.github.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #11003
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Standard parts: input and output schemas (#11003)
parts.library, parts.insert, parts.fastener and parts.resize get typed
contracts and reply types in schema/parts.rs and leave unconverted.txt.
Each key reads as the handler reads it, with its message; the replies
are built from PartsLibrary, InsertedPart and ResizedPart, with the same
JSON as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Standard parts schema: Vec3 comes from solidcore_record
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Standard parts schema: hole picks must start with a list
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* parts.insert schema: the first hole pick must be a point, not any list
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
* claim: #11103
* Hole: Bridge option for counterbores (#11103)
A counterbore hole takes an optional `bridge` length: two 3D-printing
layers that thick below the counterbore's floor, a slot along X across
the counterbore and then a square, both 0.02 mm wider than the hole, so
a printer bridges the step instead of sagging into it. Empty (the
default) keeps a plain counterbore.
The clearance keeps the bore, cut straight through both layers as for a
plain counterbore, clear of their sides: at exactly the hole's width it
ran tangent along them and broke through. The command and the geometry
refuse a layer that is not a positive length, layers that don't fit in
the hole below the counterbore, and a bridge on any other hole type.
The Hole dialog shows a Bridge field below Drill Point for counterbores.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Hole: translate the Bridge label for the complete catalogs (#11103)
Arabic, Hebrew, Japanese, Vietnamese and Chinese carry every English
message, so `cargo xtask i18n --check` needs the new label in each.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Hole: bridged counterbores refuse layers past a through hole's exit, too narrow a counterbore and a malformed bridge (#11103)
- Through all, the second bridge layer must end inside a body (exact point classification),
short of the exit face; the tool's reach is no measure of the material.
- A bridged counterbore must be at least 0.04 mm wider than the hole, so the slot's ends have
room on its wall (no square root of a negative number reaches the extrude).
- `solid.hole` refuses a `bridge` that is given but not a length expression (`true`, `[]`, `""`)
instead of making a plain counterbore; `null` still leaves it out.
- Loop2 and Seg2 now come from solidcore_record (main moved them).
- The "nothing saved" check looks for the `"bridge"` key: `format_pending` names
`bridged-counterbore` in every design.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unit defaults test: solid.hole has the bridge field too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
* claim: #11443
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Render library: input and output schemas for List, Describe, Targets and Preview (#11443)
Describe, Targets and Preview read their strict parameter types from
schema/render_library.rs, which become their contracts. List keeps its two
readers (the physical profiles' takes availability: null, the other
catalogs' doesn't); its contract takes what either takes. The handlers build
LibraryPage, LibraryResource, LibraryTargets and LibraryPreview instead of
json! literals; a catalog resource is read into ResourceSummary through a
small Listed reader. The physical profiles' replies keep their JSON, which the
schemas describe.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Render library schema: the list says which availability each catalog takes
render.library.list has two readers: the physical profiles' takes
availability all, usable or null; the other catalogs' (and a call
without kind, which lists surfaces) take all, usable, specification or
blocked, but not null. The schema now says so with an anyOf on kind.
The type still takes what either reader takes: the readers check the
query and the page before availability, so refusing it in the type
would change which message a call with two mistakes gets in strict.
A new test checks that the schema takes ten calls exactly when the
handler does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* claim: #11723
* Assembly: Move Occurrence says when the part's joints put it back (#11723)
A part that rigid joints hold to something grounded was moved, then put
back by the joint solve after the command, while occurrence.move still
replied with the moved transform. occurrence.move now solves the joints
before it replies. When they put the part back, the reply gives where the
part is, adds reverted: true and a warning that names the joint holding it
and what to change instead. A free chain of parts follows the move as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Move Occurrence: the warning names the joint for a part in a repeated assembly too (#11723)
A part inside an assembly placed more than once has no path of its own, so
the reverted-move warning asked for one instead of naming the joint. It now
looks at the placement the caller named, or else the first one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Move Occurrence: list the part's joints when no single joint holds it back (#11723)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Viewport: hidden occurrences draw no joint-origin triads
A named joint origin's triad (red/green/blue axes, white dot) was drawn for every
origin, so hidden inserted hardware still showed one at its placement. It now
follows the occurrence's visibility (and its parents') and the Joints folder of
the design and of the placement.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Viewport: a copy's joint-origin triad follows that copy's visibility
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
#10871 reworded Lip's refusal on a face that is not a shelled rim to
"Lip needs the rim of a shelled body: ...", but the plastic rig case
cov-lip-on-a-face-without-an-opening-refused still looked for "pick the
rim face of a shelled body". The case now matches the new message, so the
kernel rig's plastic shard passes again on main.
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Adds assets/branding/logo with the static mark (colour, one-colour
black and white), transparent 512/1024/2048 px PNGs, an outlined
wordmark and a horizontal lockup, all drawn from the app icon's
blue cutout layer. assets/branding/README.md covers use, colours,
clear space, minimum size and the name.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Desktop: closing a design stops its kernel work; same result on any kernel
A design's jobs now run under a stop token that closing or replacing the
design fires: an operation under it refuses to start, and one running ends
at solidcore's next check. The kernel it ran on is not used again. Calls
that answer from a body itself always finish, since a stopped call can leave
what it borrows half-changed, and what fills a body's shared cells is not
stopped.
Every kernel call starts clean (the same random rays, no stations from
earlier calls), so a design builds the same on any kernel of the pool, down
to its B-rep records. The pool is bounded: at most 8 kernels wait between
calls, and at 256 running calls a new call fails rather than grow or wait.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Stop tokens: a copy never stops its design; a stopped job can't decide a refusal
A copy replacing its own design stopped the token it shares with the design
it came from, so that design's later work would be refused. Only the design
itself stops it now. Which face a refusal names no longer depends on whether
the job that found it had been stopped: the refusal is kept with the body,
and a stopped job's probes were all refused, which named the wrong face.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: constraint icons stay while the sketch fills the view (#10518)
Constraint glyphs hid as soon as a millimetre of the sketch plane drew smaller than two pixels
(#8980), whatever the sketch's size, so a 500 mm sketch zoomed to fit lost every glyph although
it still filled the view. Below that scale the glyphs now hide only while their anchors span
less than twenty glyphs (300 px) on screen: a small sketch far away still loses them, a large
one that fills the view keeps them. The preference "Hide constraint glyphs when zoomed out" is
unchanged; off, glyphs stay at every zoom as before.
Test: constraint_glyphs_hide_when_zoomed_out adds a 500 mm sketch that keeps its glyphs zoomed
to fit and loses them far away; glyph_zoom_tests covers the span threshold.
* Sketch: glyph span measures only drawn glyphs and stops at the threshold (#10518)
The span check now walks the same constraints the glyph pass draws (one MidPoint glyph per shared midpoint, a pattern's constraints once) and returns as soon as the bounds reach MIN_GLYPH_SPAN_PX, so a large sketch zoomed out costs no more than before.
* Sketch: filter glyph constraints lazily, midpoints in a set (#10518)
* Sketch: measure the sketch, not its glyph anchors, before hiding glyphs (#10518)
* Sketch: collapse the midpoint check into one if (#10518)
* claim: #11303
* Keep Browser and History row interactions independent
* Browser tests: use solidcore_record::Vec3 after the layer split
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
rfd opens file dialogs through the XDG desktop portal and falls back to zenity
when there is none. The flake's package didn't bring zenity, so on a system
without a portal or zenity, Open and Save showed nothing. The wrapper now adds
nixpkgs' zenity at the end of PATH, after the system's own.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Measure: show complete point coordinates (#11069)
Render measurement item details as wrapping text instead of fixed-height cells. Keep the existing values, units and precision. Add a regression test in the existing measurement UI test module.
Local validation: the regression test compiled, but the Windows GNU test binary crashes with 0xc0000005 even for --list, before tests run. Runtime verification and visual evidence remain pending; this contribution is a draft.
* Keep repository LF line endings in the coordinate fix
* claim: #10994
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Compare Bodies: input and output schemas (#10994)
inspect.compare gets a typed contract and reply types in
schema/compare.rs and leaves unconverted.txt. Each key reads as the
handler reads it, with its message; `color` checks each colour with the
handler's own color_param, now pub(crate) and re-exported from cmd. The
reply is built from Comparison and its parts, with the same JSON.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Compare: drop the json import the typed reply no longer uses
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Compare schema: colour strings carry the hex pattern
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
* claim: #11362
* Settings profiles: export and import go through vfs, inside an agent's folders (#11362)
settings.profile.export and settings.profile.import read and wrote their
path with std::fs, so the folder scope an MCP request's allow_paths sets
up never saw it: an agent could write a profile anywhere, or probe any
path. Both now go through vfs (len, read_to_string, write), as file.export
and ui.screenshot do. requests_with_allow_paths_stay_inside_them covers
export and import inside and outside the agent's folders.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: thocsmith <193096300+thocsmith@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Edit reopens the dialog from the section's own geometry (Show viewport
section status, on by default): the plane is kept as numbers and nothing
is picked. The arrow was placed from the first pick only, so it was gone.
With nothing picked, it now stands on the kept plane, its tip at the cut.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #11455
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Render stage: input and output schemas for Ground, Backdrop and Clear (#11455)
The three handlers' strict parameter types move to schema/render_stage.rs as
GroundParams, BackdropParams and ClearParams, with descriptions and
JsonSchema, and become the contracts; the handlers read the same types. The
handlers build the shared StageSaved reply instead of json! literals, and the
saved setup is serialized with an error instead of json!'s panic path.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* claim: #7896
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Isolate a body: other components are hidden as components, in one step (#7896)
Isolating a body hid every other body one by one: browser.visibility with `items` writes only
hidden_bodies, so every other component's Browser row kept an open eye and normal text, and
its eye could not bring it back (the first click hid an already invisible component).
browser.visibility takes `isolate: true` with `items` (bodies), as it does with `paths`. The
picked bodies' own placements stay open, their other bodies (and the root's) are hidden one by
one, and every other placement is hidden as a placement. Isolate in the Browser and the view
runs that one command, so it is also one undo step instead of two.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Isolate a body: a hidden Bodies folder or group it is in shows again (#7896)
Isolating a body inside a hidden Bodies folder or group left that folder or
group hidden, so the picked body stayed hidden. Isolate now shows the
folders and groups (with the groups they are in) that hold the picked
bodies; their other bodies are hidden one by one as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Isolate a body: look for hidden folders only when some are hidden, and find body owners once (#7896)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Box, Sphere and Torus: a sketch point picks where they go (#9403)
The Point input of the Box, Sphere and Torus windows took a vertex, a point on an edge or face
and the origin, but not a sketch's points, so a sphere could not be centred on a point drawn in a
sketch. It now takes the points of every shown sketch (POINTS | EXTERNAL_POINTS, as Measure
does): a click fills X, Y and Z with where the sketch puts the point in the world, and a point
selected before the window opens places the primitive there, as a vertex does. The input's chip
names the point and its sketch as Select Other does ("Point 2 · Marks").
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Box, Sphere and Torus: the sketch point chip label for every complete locale
Main's i18n check wants each message in the complete catalogs (ar, he, ja,
vi, zh); the label has no words, so each carries the same "{point} · {sketch}".
With main's new selection kinds and this one, every Sel variant has its arm,
so the catch-all arm is unreachable (clippy) and goes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Primitive at a sketch point: a point picked in the sketch being finished still places it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
document.metadata, document.metadata.set and document.metadata.remove
get input and output schemas: contracts in schema/metadata.rs, checked
in front of the unchanged handlers, and reply types the handlers now
build their replies from. Their lines leave unconverted.txt.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A Georgian catalog (assets/locales/ka.json) carrying every English message,
registered in crates/ui-egui/src/i18n.rs, with a row in the new-language test,
a pending attribution file and a terminology note in docs/localization.md.
The catalog is Mkhedruli only; egui's built-in Hack already draws it.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #11222
* Render: the progress row keeps Cancel whole (#11222)
The progress card is an egui area, laid out within last frame's size. When
the status grew (9 % to 10 %, a longer phase or name), the caption and the
Cancel button were truncated, down to "..." with a long shot name.
progress_action now takes the name and the status apart and gives each part
an explicit width from the room the caller offers (the canvas for the
floating card): Cancel and the status always show whole, a long name is cut
with an ellipsis (full name on hover), then the meter narrows.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #11527
* Agent chat: a text selection dragged past the edge scrolls the conversation (#11527)
Holding a text selection near or past the top or bottom of the conversation
scrolls it, faster the further out, so a long answer can be selected in one
drag. egui scrolls a label's selection only for the label under the cursor, and
not at all for a table, whose label sits in its own horizontal scroll area.
egui also leaves a label out of the text selection while it is scrolled out of
view: a selection whose start had scrolled away was dropped, and Copy missed
the hidden text. The conversation's labels now take part out of view too,
clipped to nothing, so they keep their end of the selection and give their
text to Copy without being drawn or moving the selection.
* Agent chat: only a drag towards the edge scrolls the conversation (#11527)
A press on a label creates an empty selection on the press frame, so a click,
a double click or a held press on the line by the edge scrolled the
conversation, and so did the start of a drag from there inwards. Scrolling now
waits until the pointer has moved more than 8 points towards that edge since
the press.
* Agent chat: approval titles and pending messages keep a selection scrolled away
They were plain selectable labels, so a selection that started in one was dropped
once its label scrolled out of view, as in the rest of #11527. They now use the
same off-screen-aware label as the conversation's text.
---------
Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com>
* claim: #11483
* Interference: intersect and mesh each overlap on a kernel worker (#11483)
Compute in Inspect > Interference intersected each overlapping pair and
meshed the shared volume on the window thread. Its stack is 1 MiB on
Windows, too small for the kernel's recursion, so the app could close
without a crash message. Each pair now runs through
kernel::map_with_local_pools, on a worker with the kernel's 8 MiB stack,
as inspect.interference and inspect.clearance already do.
* Interference: Compute checks off the window thread (#11483)
On 0.30.0 the report's two parts took the window thread 95 s (x64) to
154 s (x86) in the overlap boolean, and the window stopped responding
until the app was closed. Compute now runs inspect.clearance and the
shared volumes on a copy of the session, on a kernel thread, when the
app runs commands off the window thread (as Find Limits does). The
dialog shows the elapsed seconds with Cancel meanwhile, and drops the
reply of a design changed since.
* Interference: Cancel on its own row while Compute checks (#11483)
---------
Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com>
A cut that leaves a body in pieces names them after their faces
(`order_lumps`): the piece whose least face name sorts first takes the
first name, and so on. It moved the names but left the pieces where the
kernel put them. The session then pinned the feature's body names in
that state order, and the next full evaluation (opening the design, or
editing a parameter upstream) handed them out again in a different
order: two pieces swapped names, and a later feature that named one met
the other. Found by a local model fuzzer.
The pieces now also take the family's places in name order, so the
names pinned are the order the next evaluation hands them out in. A
design saved before keeps the names a fresh evaluation gave it.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A through-point 0.0000001 mm from the start made an infinite line whose
direction nothing held, and a Line that short had both ends connected to
the origin, a line of length zero. Both now refuse points closer than the
distance at which a new point is connected to an existing one.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Design tabs: the tooltip says when a saved design has unsaved changes (#11408)
A tab marks unsaved changes with a bullet after the design's name, and a
long name cut short by the tab hides it. The tab's tooltip, which says
where the design is saved, now adds "Unsaved changes" below for a saved
design with changes not saved yet. A design never saved already says
"Not saved yet". The new string is in a pending locale file, with ten
translations taken from the same words elsewhere in the catalogs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Design tabs: the unsaved line in every complete catalog (#11408)
Arabic, Hebrew and Vietnamese are complete catalogs, which must carry
every English message: they get the words they already use for
"Unsaved changes" elsewhere.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: Recovery: the save test waits for the autosave worker before it checks
* Recovery: the save test waits for the autosave worker before it checks
saving_drops_the_entry_and_a_clean_close_leaves_nothing marked the
session saved right after the tick that started an autosave. Under load
the worker was still writing, so the next tick found the write running,
took nothing up and dropped nothing; the file landed afterwards and the
check that it is gone failed (seen in CI on #9021).
The test now ticks, bounded, until the autosave has caught up
(Autosaver::caught_up), as the app's own frames would, before it marks
the session saved. A small helper in the test module does this. The
app's behaviour is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #7246
* feat(sketch): enter a dimension's value in a small window with step arrows (#7246)
* Dimension window: fit the layer split, and keep the wheel off the camera over the window
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #11171
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: test that a line starts on a snap point of an existing shape (#11171)
The Line tool's first click on a line's midpoint, a circle's centre or edge,
a rectangle's edge or a point part-way along a line starts the line there and
ties its start to that shape. In 0.30.0 and 0.30.1 the start was dropped on the
next hover (fixed by #11184); this covers each shape the reports name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Arabic: viewport term in the Appearance section heading, desktop app badge, deeper-overlap note in Find Limits
* Arabic: drop the stray direction mark and match the Refresh wording in the old Node.js note
* Arabic: tanween in the thread fit hint, tap drill wording, crease term in continuity, spline label and setback wording in the fillet help
* Arabic: sweep and boolean terms in the body check note
* Arabic: badge term for the status chips note and summary wording for Fold items in Graphics preferences
* Arabic: tanween, catalog terms and clearer labels in the Assistant, Design and Tools preferences
* Arabic: tanween in the shortcut key prompt, Look At wording in the Assistant follow help
* Arabic: complete the Several choice for bodies folders and use a verb form for the dialogs Open row
* Arabic: orbit style term, Select Other and center-point arc names in Sketch preferences, place-from-origin wording, tanween in the radial menu help, tap makers in the tap drill notes
* Arabic: graphics device term in the blur notes, boss and turn wording in the fillet corner option
* claim: Properties: hold the measuring worker in tests until the card is checked
* Properties: hold the measuring worker in tests until the card is checked
open_object starts the measurement on a worker and looks for the reply
once without waiting. Under load the window side could be held up
between the two, the reply was already in, and two Properties tests saw
the card filled where it should still be measuring (about 0.3 % and 4 %
of runs with 18 tests at a time).
measure_beside now runs a hold before sending the reply. In tests it
waits on the app's existing apply_gate, which feature evaluation already
uses for the same purpose; outside tests it does nothing. Both tests set
the gate, check the card is measuring, then let the worker go.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #11726
* MCP list_commands: ask for commands by id prefix or panel, ids and labels only, or a page at a time (#11726)
list_commands answered with the whole catalog, every key of 575 commands
(about 350 KB), and could only narrow it by a substring. It now also takes
`prefix` (start of the id), `panel` (a whole panel or tab name), `compact`
(id and label), `fields` (the keys to keep) and `limit`/`offset` (pages, as
{commands, total, offset, next_offset}). With none of them the reply is the
same as before. A batch step naming list_commands narrows the same way, and
a bad argument is an error that names it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #10437
Co-authored-by: Cursor <cursoragent@cursor.com>
* Lip: say Shell first when the face is not a rim (#10437)
A solid box top left OK disabled with a vague shelled-body hint. Name Shell and the rim-around-an-opening requirement in the refusal, the dialog tip, and the command help.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Lip: keep the dialog hint as it was, match the new refusal text in the test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #10981
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Match Surface: input and output schemas (#10981)
surface.match gets a typed contract in schema/surface_match.rs and the
shared FeatureResult as its output, and leaves unconverted.txt. Each key
reads as the handler reads it, with its message; like solid.scale it
declares `name` and `participants` itself, since a match makes no body.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Follow main's kernel merge: world_state and the shared continuity reader
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Surface match schema: Vec3 comes from solidcore_record now
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
* claim: #11036
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Physical material property commands: input and output schemas (#11036)
material.properties.validate and material.properties.directional get
typed contracts and reply types in schema/material_properties.rs and
leave unconverted.txt. The card stays the handler's to check; the
direction has the handler's messages. The replies mirror the document's
Validation and DirectionalModulus, destructured in full.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Feature editor: a roll back's re-solved placements are not a changed design
Rolling the marker solves the joints again and stores where that puts each occurrence, so the
editor's pinned original differed from its source there and OK was refused with "the original
editor model does not match its source design". The check now takes the placements as the roll
leaves them.
* Feature editor: also accept the ratio and lift of coupled joints that rolling the marker works out
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #11051
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Clearance: input and output schemas (#11051)
inspect.clearance gets a typed contract and reply types in
schema/clearance.rs and leaves unconverted.txt. Each key reads as the
handler reads it, with its message; MAX_CLEARANCE and MAX_NEAREST move
to the schema module so both read one limit. The reply is built from
Clearance and its item types, with the same JSON as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* claim: #6173
* Inspect: center of mass reports the same volume as measure (#6173)
inspect.center_of_mass measured each body's display mesh, whose flat
facets cut curved faces short, so its volume and centre differed from
inspect.measure's (a sphere of radius 10: 4183.10 vs 4188.49 mm3). It now
takes both from the same cached kernel measurement Measure uses, and like
Measure it leaves out bodies that enclose no volume, counting them in
open_bodies_skipped.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Centre of mass tests: read the skipped list that main now returns
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Tyler Chiriboga <18270301+Tyler-Chiriboga@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
* 15 languages: translate the 21 messages main gained after batch 4 (batch 5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Pending locales: drop the strings the catalogs already have
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
* Modeled threads: run down to a flat shoulder so a nut can bottom out
An external thread running the whole face stopped with its groove clear of
a shoulder, leaving up to a turn uncut above it. The groove now runs on past
the plane of the face's end and is trimmed there, so its root reaches the
shoulder at every angle and nothing past the plane is cut.
A shoulder rising back along the face keeps the square stop, as do internal
threads, tapers, runouts and lengths stopping short. Where the kernel refuses
the trimmed cut, the groove also keeps the square stop and the feature warns.
Closes#11610
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel ladder: record the thread cases that now reach their shoulder
Six cases gain the faces of the trimmed last turn; every other case is
unchanged apart from its timing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Thread at a shoulder: review fixes, and a test of the fallback
The shoulder check starts just off the face, as the free-end check does, so
a slope rising from the face counts. A groove the trim leaves nothing of now
falls back to the square stop too. A test forces the fallback and reads its
warning. The ladder's order and report go back to main's, changed only for
the cases this moved.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Thread at a shoulder: check all the radii the groove cuts
The check for a shoulder rising along the face looked a fixed distance out,
which falls short of the groove on an undersized shaft. It now covers the
groove's reach. A test reads how each kind of shoulder is classified.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Thread at a shoulder: test the trim that leaves nothing of the groove
The test now reaches the path where the half-space keeps nothing, which is
the one that must fall back to the square stop.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Thread at a shoulder: say so when the shoulder can't be checked
If the kernel can't make the rising-shoulder check, the groove keeps the square
stop as before, and the feature now warns that its last turn is left uncut.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* SMLib wrapper: a swept or mitred turn for constant rounds (Turn)
Brep::blend_dropping takes a Turn: Mitre (the default, as before) or Swept,
which sets solidcore's FilletSession::set_swept_turns before the corners are
made. A swept turn solidcore refuses at CreateFilletCorners comes back as
Error::TurnRefused with its reason and place (NoRoom at a concave side edge,
else CornerUnsupported). Swept is for Blend::Round only.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel: fillet rounds turn in a mitre or swept (FilletTurn)
fillet_removing, fillet_max, fillet_max_each and fillet_each take a
FilletTurn and hand it to SMLib, through the reblend of earlier rounds at a
later corner too. A swept corner solidcore does not build is refused as
invalid input with its reason and place: no smaller radius builds it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Design: a fillet saves its turn, mitre (default) or swept
FeatureKind::Fillet gets `turn` (FilletTurn: mitre, the default and not
saved, or swept), one pending format file. Evaluation hands it to the kernel,
pattern copies included, and refuses a swept turn with a style, fit, corner
or setbacks the kernel's swept corner does not take (SWEPT_TAKES).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* solid.fillet: the turn parameter, and the command's input and output schemas
`turn: mitre|swept` on solid.fillet, refused when unknown or with options a
swept corner does not take. solid.fillet now has its contract (FilletParams)
and reply type (FilletResult), registered with checked!, and leaves
schema/unconverted.txt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Fillet dialog: a Turns choice, Mitre or Swept
A Constant radius fillet's Turns row sends `turn: swept`; choosing a narrowed
radius or a curvature corner puts it back to Mitre, and Swept puts those back.
Its tooltip says what each does where two rounds turn round a corner edge.
New strings in a pending locale file (en, de, ja, ko, zh); glossary entry.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Fillet turn: the schema tests' fixes and the complete catalogs' strings
The no-contract example in the schema tests is solid.chamfer now that
solid.fillet has one; the reply test checks the mid-radii form against the
contract (solidcore refuses that law's corner yet, #430) instead of building
it; Arabic, Hebrew and Vietnamese, complete catalogs, get the new strings.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Fillet schema test: variable and spline forms checked against the contract
solidcore fails a variable round on a box edge at this pin (status 1001, as
variable_radius_on_a_box_edge), so the reply test checks those forms against
the contract instead of building them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Fillet turn: the swept rig cases pass; the MCP no-contract example is solid.chamfer
cov-fillet-turn-swept-boss-base-r1 and
cov-fillet-turn-swept-pocket-sharp-corner-refused-r1 pass now that
solid.fillet takes `turn`: off the rig's known-failing list. The MCP bridge
test's example of a command without a contract was solid.fillet, which has
one now.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
---------
Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #3683
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SBN24y2TcqRcm2zn8Gkj27
* Selection fields: remove one picked item from the dialog (#3683)
A dialog field that takes several picks (edges for Fillet, Chamfer or
Flange, faces, bodies) showed "N selected" with one x that cleared them
all. It now has the kit's disclosure arrow beside that x: open, it lists
the picked items by name, each with its own remove button (the rows
Sketch Modify dialogs already used), in a short scroll area. Removing an
item works like picking it again to toggle it off: the hand-picked edges
of a Fillet and the explicit profile choice of Extrude, Revolve and
Emboss follow. The x still clears everything and folds the list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SBN24y2TcqRcm2zn8Gkj27
* Selection fields: hovering a picked row lights its item; every multi field lists alike (#3683)
Review follow-up. Hovering a row of a dialog's picked-items list, or its
remove button, lights that item in the view with the normal hover shading
(and not as picked): faces, edges, vertices, profiles, planes, axes and
sketch geometry as the hover, bodies, components and features as their
Browser and timeline rows light them.
Every multi-pick field now has the same folded list: Sketch Modify fields
lose their always-open list for the shared toggle, and Shell with Tangent
Chain lists the faces its chip counts (removing a face its chain brought
takes out the pick that brought it). Removing a row works as picking the
item again: a rim or surface split into pieces is one row and goes whole.
Tests cover removing a row from Combine, Loft rails, Sweep path, Blend To
edges, Rigid Group components and pattern features: the preview's
commands follow.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SBN24y2TcqRcm2zn8Gkj27
* Selection fields: build on main's fallible world state; Sketch Mirror's label test opens the list (#3683)
The world state is now a Result on main: the remove and hover paths treat a
failed one as nothing to remove or light. The Sketch Mirror label test from
#10770 opens the picked list first, as this field now lists its picks behind
the arrow like every other multi-pick field.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Selection fields: removing a Tangent Chain row takes out the pick that brought it (#3683)
With Tangent Chain on, a Fillet's list shows every edge of each picked
edge's chain. Removing one of those rows left the picked edge behind, so
ticking Tangent Chain off and on brought the chain back. The row now goes as
picking it again would: with the picks whose chain holds it and their whole
chains. A Shell row whose model can't be built goes on its own instead of
silently staying.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Planar sources: decide coplanar faces by support group, no budgets that drop sources
map_planar_sources kept two budgets, `metadata` (2 MB) and `identity_bytes`
(16 MB), charged by each face's source descriptor and by every extra
candidate on its plane. When one ran out, faces silently lost their source
and with it their persistent name: a 300-hole plate whose top a comb of
grooves cuts into 62 strips lost the cap source from strip ~47 on.
The budgets bounded the real cost: each result face looked at every
candidate on its plane, faces x candidates when many faces are coplanar.
The candidates are now grouped by support once (`same_support` against
each group's first plane, through the existing PlaneIndex), each group's
chosen source, ambiguity and inner flag decided once, and the faces
without a role together with the competing tool faces grouped the same
way. Each result face then looks up its plane's few groups. The decision
is the old one: blocked by an unknown or competing support, else the
first candidate on the plane unless another candidate there has a
different plane, source or role.
Work: grouping looks at each candidate's index window once per group
(each candidate is assigned on its group's first look), and each face
looks at the group representatives near its plane, so the planes looked
at grow with faces + candidates. A counter (`looked`) checks it: n
pieces of one cap and n faces on its plane take exactly 2n looks (n*n
before), 3n with n blocking supports.
Tests: the holed plate keeps the cap source on all 62 strips and the
bottom (fails on the old code: face 352 lost its source); the existing
planar source tests pass.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Extrude: an ellipse or a spline sketch curve sweeps one wall
An extruded ellipse had four side faces (`F2:side:e1#1` to `#4`), one
per conic quarter, and a spline one per span: the profile holds such a
curve as several exact segments and SMLib got each as its own curve.
The Extrude feature's builder (`extrude_whole_sides`) now takes a
`one_curve` test from the caller. Each run of free-form segments of one
degree that it says are one curve goes to SMLib as one B-spline: the
Béziers' control points in a row, knots repeated the degree times at
each joint, each span as long as keeps the speed through the joint the
same (so the curve is C1 there and SMLib makes one face over it, as it
would not over a C0 parametrisation), weights scaled to meet. Exact: the
same curve, reparametrised. A loop starts at a run's start, so no run
wraps round it. The wall's history lists every piece, and its
construction source is its first piece's (as joined collinear lines).
The document says which segments are one curve: ExactSketchCurves now
also holds each free-form sketch curve's exact segments
(`find_free_form`: a segment that is one of them, either way round), and
the profile roles use it, so the wall is named `side:<curve>` from its
history rather than by the curve nearest its mesh centre.
Saved designs rebuild with these walls renamed (`F2:side:e1#k` ->
`F2:side:e1`); accepted, no alias kept.
Tests: kernel `pieces_of_one_curve_extrude_into_one_wall` (an ellipse in
four conics is 3 faces, its volume pi a b h to 1e-6, the wall generated by
all four pieces; a 3-span spline closed by lines is one wall; the same
solid as a face per piece); doc
`an_extruded_ellipse_or_spline_is_one_wall_named_by_its_curve` (one
`F2:side:e1`, no piece names, the same names on a second build and after
reopening).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Tests: a tray's far rim name is checked on the exact B-rep face
The tray test took the point `sheet:...:rim.far` finds as right when it
lay within 1e-3 mm of the strip z = 30, 199 <= y <= 200: a slack sized to
the mesh. It now asserts on the face the name finds, on exact geometry:
the point's distance to that face's surface (FaceSurface::nearest) is
within rounding at the part's scale (1e-12 x its size), and the point is
inside the face's boundary, counted by crossings of its record edges
(each asserted to be a line, the rim being planar).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Tests: delete tests/naming/, the records no test reads since the naming corpus stopped comparing against them
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Viewport test: smooth wall joins drawn from eight G2 spline walls
The PR extrudes each spline or ellipse sketch curve as one wall, so the
offset-ellipse ring the test built has no joins between faces any more.
The test now extrudes a circle drawn as eight cubic splines: eight walls
meeting with one curvature along eight upright edges (24 edges in all).
It still checks that those joins are left out of the shaded view, drawn
in the wireframe and selectable as edges.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel ladder: 009 and 012 record the one-wall extrude (an extruded spline or ellipse sweeps one wall)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
---------
Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Bumps the version to 0.40.0-rc.2 and folds the pending format changes into format 50. A published pre-release no longer reaches the Flatpak feed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Web app: a page that hands designs saved at the old address to app.solidcraft.io
The stable web app moved from docs.solidcraft.io/app/ to app.solidcraft.io, and a browser keeps
storage per address, so designs saved at the old one don't appear at the new one. The docs site
gets app-transfer.html: framed by the move page at app.solidcraft.io it answers that page's
requests, and opened on its own it offers each design as a file. It only reads.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Web app: name the browsers the one-step move was checked in
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
solidcraft-smlib held one process-wide kernel lock for the whole of every
solidcore call, so a long call in one design (a modeled thread, a fillet)
held up every kernel call in every other design, even after its tab was
closed, and a call that never returned held them until restart.
Each call now takes a kernel from a pool and the lock is only held to take
or put one back. Calls one after another get the same kernel as before; one
that starts while another runs gets its own. Each kernel has its own range
of procedural blend serials, since a body keeps the serials of the kernel
that made it.
History commands and delete checks now belong to their design: they wait
with its tab, go when it closes, and can't land in another design. An
agent's command for a design that left the window is refused at once
instead of holding up the requests behind it.
Closes#11681
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: Sketch dimension: typing replaces the proposed value (#11204)
* Sketch dimensions: typing replaces the proposed value until you move the caret (#11204)
The value box selected the proposed value only on its first frame. A frame
in which the field misses the keyboard collapses egui's selection to its
caret, so typing 400 over a proposed 40 mm could give 40040 mm (seen in a
WebView2 host). Now every frame starts with the whole value selected, before
the field reads its state, until the person takes the value over: typing, a
completion or reference, a key in the box, or a press into the box after it
stayed in place. The click that placed or pinned the value does not count.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Preferences: one heavier, evenly detailed icon set for the page tabs
* Build: import traced body records from their new owner
* Build: read exported kernel records from their new crate
document.units gets input and output schemas: `units` (mm, cm, m, in or
ft, with the handler's messages for a missing or unknown unit) and its
reply, `units` and `kept`, which the handler now builds from the reply
type. Its line leaves unconverted.txt.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Threads: a 12 mm hole takes M12, and a modelled thread narrows a bore that is too wide (#11609)
Automatic sizing of a hole now takes the size whose nominal diameter the hole has (a 12 mm hole
is M12, not M14, the size whose tap drill is 12 mm); a hole near no nominal diameter is still
matched by tap drill. A modelled internal thread in a hole as wide as the thread or wider no
longer refuses with "too wide": the bore is filled in to the thread's minor diameter over the
threaded length and the groove cut there, and the feature's warning says so. A size that does
not fit the hole names the size that does.
A saved thread with no designation keeps the old rule through a pending format step, so an
existing design rebuilds with the size it had.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Threads: keep an old automatic size through edits; kernel-rig cases expect the narrowed bore (#11609)
Editing a saved automatic thread keeps `old_auto_size`, so it does not change size. The five
kernel-rig cases that expected a modelled thread in a hole as wide as the thread to be refused
now expect the narrowed bore, with the volume worked out analytically in each case. The thread
dialog's reopen pattern names the new field.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Thread dialog test: a 5 mm hole is suggested M5, its nominal size (#11609)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Typed schemas for Appearance, Appearance Library and List Appearances (part of #2829)
appearance.assign, appearance.library and appearance.list get contracts
that read what their handlers read, with the handlers' messages, and
reply types the handlers build their replies from. Their lines leave
unconverted.txt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Appearance library: the opacity is already a number
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Every point on a spline surface returned its basis tables by value, up to
272 bytes several times over. Filling them in place takes about a quarter off
meshing a round extrude's wall, with the same numbers.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #6257
* Align: move bodies by frames that follow sketch and model geometry (#6257)
solid.align takes from_frame and to_frame: a joint origin on the model
(a face's or round end's centre, an edge's middle, a corner, found again
by name) or a sketch point or a sketch circle's, arc's or ellipse's
centre. Both are resolved on every evaluation, so the bodies follow
their target when it changes. An optional angle turns the bodies about
the target's direction after the move.
The Align dialog takes sketch points and curves as From and To, offers
the Joint Origin snap and an Angle row.
* Align frames: box the joint origin (clippy large_enum_variant)
* Align frames: every moved body on the frame's component, placed once
* Align frames: a sketch id's length in characters
* Align frames: the dialog test's sketch curve hit carries its point
* Align frames: the dialog test takes Vec2 from solidcore-record
---------
Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com>
* New kernel cases go to solidcore's corpus; tests/kernel-cases/ only shrinks
tests/kernel-cases/CASES lists every rig and ladder case there is today. `cargo xtask lists`
fails on a case directory it does not list, saying where a kernel case goes instead
(solidcore's crates/solidcore/tests/kernel_cases/, exported with `cargo xtask kernel-cases
--export` or written by hand), and on a listed case that is gone. AGENTS.md, CONTRIBUTING.md,
the tests skill, the rig README and EXEMPT say the same; a new command gets an EXEMPT line
naming where it is tested.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* CONTRIBUTING: the kernel-cases paragraph ends before the naming corpus one
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
---------
Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Each path test opens its own device and compiles the path pipeline. On a
cold driver cache that takes minutes and gigabytes per compile, and libtest
ran one per CPU thread side by side: on NVIDIA the solidcraft-gpu tests ran
for hours and committed ~80 GB. Executor::new now holds a process-wide lock
while it compiles; the first compile fills the driver's cache and the
waiting ones get the pipeline from there.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The CLI's kernel_cases_export.rs still imported Brep from solidcraft_geom::brep after the layer split moved it to solidcore_record::brep. Changes this one import.
The second half of #11626: apps/solidcraft-cli/src/kernel_cases_export.rs (#11568) imported
solidcraft_engine::geom::brep::Brep, which #11496 moved to solidcore_record::brep::Brep.
cargo clippy --workspace --all-targets -D warnings is clean with it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
#11568's trace (crates/smlib/src/trace.rs) named the record as solidcraft_geom::brep::Brep,
and #11496 moved that type to solidcore_record::brep. Each merged green on its own; together
main does not compile (error[E0425]: cannot find type Brep in module b).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel: the B-rep record and the native body file come from solidcore-record
SolidCraft's portable B-rep record (`solidcraft_geom::brep`: brep.rs, topology, history,
envelope, part, curve2) and the native body file (`solidcraft_kernel::native`: the tagged binary
codec and the container) move to solidcore's `solidcore-record` crate: geometry as data, with
structural validation and no maths (solidcore's docs/layers.md, stage 1). Every caller uses
`solidcore_record::brep` and `solidcore_record::native`; the old copies are deleted.
What computes from coordinates stays with the kernel, in geom's `brep`:
- `brep::check`: the record's geometric checks (orthonormal frames, non-degenerate planes,
unit revolution axes, non-singular placements). `check::validate` and
`check::validate_built` are the record's validation and these together, and every caller of
`Brep::validate` uses them, so what is accepted is unchanged;
- `brep::label`: a surface's natural ranges (a cone's apex), `curve_interval`,
`edge_curve_interval` and `form_turns`;
- `brep::pcurve::eval`: a pcurve's point;
- `geometry::check`, `placement::moved` and `split_edges` become functions on the record.
The kernel's native module keeps the conversion between a body and its saved record
(metadata.rs) and checks the decoded record's geometry. `native/analytic.rs`, which no module
declared, is deleted.
solidcore-record is pinned to its rev on solidcore's `layer-record` branch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKMbMFSQU8tzRtoJhtT
* Geometry: Vec2, Vec3, Plane and the profile types come from solidcore-record
The plain data of vectors and points, sketch planes and planar profiles (`Seg2`, `Loop2`,
`Region2`) moves to `solidcore-record`, with its constants and component-wise operators only
(owner decision, solidcore layer split). Their geometry stays in geom as traits:
`Vec2Geom`, `Vec3Geom`, `PlaneGeom`, `Seg2Geom`, `Loop2Geom`, `Region2Geom`, `Seg2ArcFit`,
`Loop2ArcFit` and `Region2ArcFit`, in scope with `use solidcraft_geom::prelude::*`. Every caller
names the types from `solidcore_record`; geom no longer defines or re-exports them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKMbMFSQU8tzRtoJhtT
* Kernel: pin solidcore-record to solidcore main f5e8e9a29
solidcore-record is merged on solidcore main (tangency-labs/solidcore#2519); its crate there is
identical to the rev pinned before but for its clippy configuration. The lock is regenerated
against the merged rev.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKMbMFSQU8tzRtoJhtT
---------
Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
It fails with status 1001 since #11360 moved SolidCraft onto solidcore alone, as the
kernel test variable_radius_on_a_box_edge already listed in tests/KNOWN_FAILING_TESTS.
The oracle keeps its own list, so main's Reference tests have been red since.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
The web app is now offered at /app/ (latest release), /app-rc/ (newest release candidate) and /app-edge/ (current main), each with its own browser storage. /app/ is built from the latest release's web zip instead of main.
- Picks run on a copy of the operand: a pick builds query caches on the body it
reads, so the traced body stays as an untraced run leaves it.
- An untrim and an extension record their picks with the pickers they run
(`face_at`, `nearest_edge`).
- A final body matches the newest export of its record that an operation made.
- A stopped run is the kernel's when the last failed operation is followed by
copies only.
- A re-export removes each case's old entry first; fixes.json is written whole.
- The manifest names no commit for a copy without git, never an empty one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
An entry keeps what each operand body is and names <case>.bodies.json.gz, which
holds the records (gzip with no timestamp, so the same records give the same
bytes); the entry itself is pretty JSON. The corpus of 1202 cases is 33 MB.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
An entry's operation is expressible when the kernel accounts for its result; the
values only SolidCraft grades (continuity, meshes, files, command answers, merged
counts, SolidCraft's wording of a refusal) are listed under `ungraded` instead of
making the whole case inexpressible.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
`cargo xtask kernel-cases [--ladder] --export DIR` runs the rig with the kernel's
operations traced (`smlib::trace`) and writes one entry per case: the operation, or
chain of operations, that made the bodies the case ends with; each operand that came
in as a record, as that record; the parameters, with every pick by points also given
as the topology index it picked; the fix set; the case's expected values and the
rig's result. A case no kernel operation alone accounts for is written too, marked
not expressible with its reasons. DIR/manifest.json counts them per area.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
The packaging action can't read a hyphenated version from the tarball's name, so the job gives it a name without the hyphen and renames the package back. A hyphenated version no longer fails the build if its Arch job fails; a plain version still does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bumps the version to 0.40.0-rc.1 and folds the pending format changes into format 49. The default-layout header test now expects the room the version really takes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
06-threads/018-external-m10-both-hands makes 606 edges and 404 vertices (486 and 324 before),
with the same 204 faces, area and volume (to 1e-11), in two runs on the box; every other ladder
case is as the golden records it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
Five tests fail at the new pin and are listed with their causes: the variable round along a box
edge (status 1001, twice), the shell of a fully rounded box past its rounds' radius
(SM_ERR_INVALID_INPUT), the chamfer that would grow the part (no face instead of the
too-large refusal) and the box-edge round's wire record. The tabbed plate's outer loop with a
partial selection passes and leaves the list; issue2422's vertical edge now fails as a smooth
edge.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
851-fillet-arc-then-top-front and 851-fillet-top-front-then-upright build (9524.3437, 10 faces,
solidcore#2431); 5158-fillet-round-just-past-a-10mm-face, the curvature pipe on a plate's
order-2 section, the concave-arc and front-top rounds (r5, r7 and default) and the peg's front
and concave rounds and chamfers build and pass their checks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
The rim alone was pinned to 7.958674274526857, the marched end rib's value; its closed form,
the spandrel (1 - pi/4) r^2 revolved about the disc's axis outside |x| < 4, is
7.958672911836132, which the rim's End (fillet_blend_corner) builds to 5e-8. With the corner
arc's Pappus volume the two take off 8.117808752; solidcore 8ddce9016 removes 8.117808800.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
At solidcore 8ddce9016 (pinned) the r2, r2, r3 corner at (20, 0, 20) is one patch: 10 faces,
7928.743041456134 mm³, the r3 round and the patch the second fillet's. The test is pinned to
that and leaves the known-failing list. The fork's setback corner (15 faces, 7928.142563938)
waits for solidcore#2310; solidcore#2382, not merged, moves the case to 7927.724282512234.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
smlib's run() catches a solidcore panic and replaces the kernel (kept: the app does not die
natively), returning Error::Internal; the kernel turned it into KernelError::Failed and the
engine into Other, so hostile_params_never_panic and the fuzzer no longer saw kernel panics.
Now the kernel's wrapper errors go through KernelError::smlib, which keeps Internal; a body the
wrapper could not take because of a panic is Internal too. A feature whose evaluation hit it
records the result as internal (not cached: the kernel was replaced), and the command that
made it, or any command whose kernel call returns it, fails with EngineError::Internal under
its own id. Crash reports mark a panic inside a solidcore call recovered (kernel::guarded), and
the crash test's kernel mode panics inside a solidcore call.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
The kernel crash test's command must fail with EngineError::Internal naming
diagnostics.crash_test, as a panic in the command itself does: the panic detectors
(hostile_params_never_panic, the fuzzer) look for Internal. Today it is EngineError::Other.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
solidcore's algorithms recurse (subdivision, intersection, filleting) and its README asks for
8 MiB, a native main thread's stack; Rust starts other threads with 2 MiB, and only the web
build set more. kernel::KERNEL_STACK is 8 MiB and kernel::kernel_thread a thread builder with it.
The kernel's parallel map runs on a pool of its own with that stack (on a worker of a pool
already, as in map_with_local_pools, it stays on that pool as before), the one-thread mesh pools
and map_on_threads' helpers have it, and so do the engine's interference worker and the
evaluator's plan-mesh thread. A test recurses 5 MiB deep on each.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
While a dump folder was set, every call serialised each input body before it ran, so the rig's
timings (taken with a folder set) measured the serialiser as much as the kernel. The callers now
hand run_on the bodies the call reads; they keep them until its result is known, and only a
failing call serialises them, into the folder as before. A test counts the serialisations: an
answered volume and union none, a failing call one per input.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
The check had become one-sided after the C++ kernel's removal: a case that started passing,
or a change in the count, went unnoticed. As on main, a case that now passes fails the test
until it is added to the list, one that no longer passes is a regression, and the count is 111.
At solidcore 8ddce9016 solidcore passes exactly the 111.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
The workflow triggers on the root Cargo.toml and Cargo.lock, and the plan gets their diff
(--pin-diff): a changed line that names solidcore's repository (Cargo.toml's git rev, Cargo.lock's
source) selects every area and the ladder. A path filter cannot tell a pin from another
dependency's change, so the plan reads the lines; another dependency's change runs no area.
The fillet rig is not triggered: the kernel rig's fillets shard runs the same cases.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
A solidcore bump changes only the root Cargo.toml and Cargo.lock, which neither PATHS-ALL nor
the workflow's trigger paths list, so it ran no rig. The tests want a change to the solidcore
lines of those files to run everything, another dependency's change in them to run nothing, and
the workflow to trigger on both files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
A shell, offset or thicken solidcore's one construction refuses because a face's offset folds
(SolidError::ShellRefused, ShellRefusal::Fold) is Error::WallFolds with the largest wall it
names; the kernel says "the wall is thicker than a face curves, so the face's offset would
fold; the largest wall that works is 10 mm". A blend too large carries solidcore's NoRoomReason
as Error::TooLarge's RoomReason, worded in its message before the largest size that fits:
a collapsed offset (solidcore#2431) says the ball is as wide as the face it rolls on.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
A thicken of solidcore#2350's parabolic sheet past its apex's radius of curvature is refused
by solidcore's one construction (ShellRefused, Fold, naming 10); the wrapper passed it on as
"solidcore: ..." with no words of its own. A round at the radius of the round it rolls on
beside the 851 part's arc wall is refused as a collapsed offset (NoRoomReason::OffsetCollapses,
solidcore#2431); the message named the size but not why. Both fail until the reasons are
carried through.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
At solidcore 8ddce9016 three equal convex rounds at a vertex of three planes are the blend
corner's Ball (fillet_blend_corner). The wrapper set a setback on the corner after the corners
were made, so a set-back vertex was already a Ball (NByTwo) and its setback was refused
(CornerRefused): a_setback_corner_left_open_returns_its_hole (both) and setback_corner's
closed form. solidcore's AddSetBackVertex, called before the corners are made as the fork's capi
round_edges does, keeps a set-back vertex out of the Ball, and its corner is set back.
The corner a setback is set on may also be a blend corner whose event is the Setback, as the
capi takes it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
At solidcore 8ddce9016 a Ball corner is a BallPatch (fillet_blend_corner) and a round between
NURBS faces a ProceduralBlend (fillet_round_as_definition). The arrays' B-spline part of a face
had neither, so their export fell to the approximation and failed ("an approximated face surface
that is not a B-spline"): the rounded cube, the variable and curvature rounds and the
all-edges box in the smlib tests, and the Ball-corner and round cases of the rig.
Both are their nets, exactly. A ball patch also goes out as SURFACE_BALL_PATCH, its sphere's
centre and radius in FACE_DEFINITION_REALS, as the record's BallPatch reads it, and comes back
as solidcore's BallPatch on that net: the rounded cube's eight corners stay on their spheres
through the record and back.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
solidcore main at 8ddce9016 adds cone_unbounded_parameterized_as_nurb,
ellipse_open_arc_keeps_end_angle (solidcore#2422), fillet_round_as_definition,
fillet_round_on_round_as_definition, fillet_overflow_crease_along_edge,
plane_first_torus_section_exact, keep_exact_pcurves and shell_one_construction
(solidcore#2367), and drops fillet_extended_rail_end_at_side_edge_crossing.
Every one is on. fillet_keep_features is no longer held back: solidcore#2374
fixes the round beside a boss it refused (solidcore#2370).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
A block's front top edge rounded r 3 beside a boss joined on its top fails SM_ERR_INVALID_INPUT
with it on; off it builds the closed form, 6099.225530 mm³, as the C++ fork does. Found by
ui-egui's opening_a_large_design_never_stalls_the_window.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
solidcore's fit is the largest size less a margin (34.99 where the L bracket's bend builds 35,
4.29 where #3435's ring builds 4.3), so the feature's search keeps naming the size, and solidcore's
is the answer only where the search finds none. The refusal keeps its words, "larger than the
faces beside its edges allow", with the edge after them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
solidcore sizes a blend it refuses as too large (the session's fit, SolidError::FilletRefused under
fillet_gn_section_generator). The smlib crate gives it as Error::TooLarge with the size, what it
sizes and a point halfway along its edge (an equal chamfer's ball radius turned back into its
distance); the kernel words it as the fillet feature's search does (largest_fit_note), and the
feature runs no search when the refusal names it. The 3x2 mixed corner whose rails cross, which
solidcore refuses (fillet_refuse_mixed_corner_crossing_rails), is not supported yet, citing
solidcore#2256.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
With it on, 11 rig cases that pass with it off are refused as breaking through the part, and
190-fillet-disc-rim-past-its-2mm-wall fails status 1001. A fix under the same flag is in progress
on solidcore.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
Main took #11351 as one squashed commit (ea772a043). This merge records its history as 509
wave commits: a wave ends at every SMLib pin and holds at most 4 commits or about 800 changed
lines. Each wave lists the commits it holds; the originals stay reachable from tag
archive/merge-main-develop. Main's files are kept as they are.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360).
- b2fd08e85 jyviko: Profiler: no smlib category left in its tests and help
- d49a7eac0 jyviko: Known-failing tests: the convex chamfer that would grow the part passes
- d55fedd56 jyviko: smlib export test: a rounded cube's corners checked on solidcore's spheres
- 017a2a607 jyviko: Known-failing tests: the fillet into an earlier round passes on solidcore
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* UI: rim and wall picking tests for a circle of arcs that is one wall
A circle drawn as two half arcs now extrudes to one full-turn wall with its
seam edge, and each rim is one closed edge (tangency-labs/smlib#67). The tests
keep their intent on that body: a rim clicked once is one item, measured and
highlighted whole and picked from either side; a wall picked either side of
its seam is the same surface, lit whole, and toggles off from the other side;
every face is its own patch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillets: a later round at a corner where earlier rounds meet blends them again with it
The owner's ruling of 2026-10-30: a later fillet on an edge at a vertex where earlier
rounds already meet in a mitre makes the corner rounding all of them at once makes, one
smooth patch, the mitre gone. A body made by constant-radius rounds keeps what they were
made on and which edges they rounded at which radius; a later round reaching such a corner
blends the earlier rounds' edges (from the earliest of those meeting there on) with the new
edges in one SMLib blend of the body before them. The result's history is put over the body
the later round was given: an earlier round's face is that face trimmed anew (its name
kept), the corner patch and the new rounds are the later fillet's. A picked mitre seam has
no round of its own: it is refused unless a new edge of its radius meets it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: a later r3 round at an r2 mitre, through the Fillet feature, makes the all-at-once corner
Two box edges rounded r2 in one fillet, then the upright edge at their mitre r3 in a second
fillet (tangent chain on, so the seam comes with it): 10 faces, 7928.743041 mm³ as
fillet_radii of the box gives, the r2 rounds' names kept, the r3 round and the corner patch
the second fillet's.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel: a body's record of rounds goes with its history, and can be read back
The rounds that made a body are over the body its history is over: a new history (an
operation carrying a step's result back to its own operands) leaves the record out, so a
later round never reads one history against another body. Body::rounds gives the record and
Body::with_rounds_of takes one back, checked (edges of the body before them, a fillet's
radii, the body's history over that body), for a saved model to keep it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Model cache: a body made by rounds keeps them, so a later round blends them the same after opening
A design gave another body when opened from its model cache: the rounds a body was made of
lived only in memory, so a later round at their mitre was built sequentially (or refused, as
too large) after opening and blended with them when evaluated anew. The saved model now
records, per kernel body made by rounds, the body they were made on (a place in the bodies,
stored once though no state holds it) and the edges with their radii; reading it attaches
them back down each chain, and a thinned model keeps those bodies with the bodies made from
them. Model cache format 7.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: a corner patch of rounds 2/3/4 takes no more than the strips leave in its block
three_rounds_at_a_corner bounded the patch's extra cut at 3 mm³ beyond the strips, a figure
with no derivation; SMLib's all-at-once body at radii 2, 3, 4 takes 3.099 (V 7878.579574
against strips 7881.678). That body is the strips' outside the block its patch lies in: its
rounds are the strips' cylinders ending at a's section y = rc, b's x = 20 − rc and c's rails
where they meet a's and b's (the patch's four corners, now asserted), so the patch takes at
most what the strips leave in that block (11.86 at 2/2/3, 32.69 at 2/3/4). The lower bound is
that block; the upper one, at most the strips' volume, stays.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: the io crate's hand-built saved models list their rounds, as format 7 records do
Model cache format 7 (f3cf0c4f3) records a `rounds` list in every saved model, and reading one
without it is refused ("saved model: rounds"), as is a model without any of its other lists:
the states, the preview and the thinned model all came back empty. The io tests' saved_model
and timeline_model wrote format-6 records, so six tests (the round trip, the repeated part
stored once, and the four too-big-for-the-file cases) read nothing. Their bodies are none made
by rounds: the list is empty, and every expectation stays as it was.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* SMLib: pin eaa998a (tangency-labs/smlib#68, #69, #70)
Batch 4: drafts and loops, mitre corners, rim chamfers, rulings, tight box, stitch, point
classification, eased corners. Batch 5: a face's tight box divides its cells at the surface's
knots (thread boxes exact); a cylinder, cone, sphere or torus is extended along its own circles.
Batch 6: a revolution's extension closes its turn; a dropped point's foot is the converged one.
The C API is ABI 5 (smlib_blend_dropping and smlib_brep_classify_point are new; nothing existing
changed), so the binding expects 5.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: a strip's tangent and curvature run-offs are the distance long across the surface
SMLib measures an extension's distance across the surface (smlib_extend_sheet corrects
CreateExtendedSurface until the parameter line through the side's middle is that long), so each
run-off of the cylinder strip, swept 20 along z, adds 5 x 20: 10 pi/2 20 + 100 = 414.159 for
both. The parabola-length formula (418.18) was truck's.
Ruling d2 (2026-10-30).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: one smooth angle, and a round too small to change the part is refused
The blend's tangent angle is the shaded view's half degree (smooth_edges::ANGLE), one value
for smooth. A constant round lies r (sec(d/2) - 1) inside the crease it replaces (about
r d^2/8); below the edge's tolerance it changes nothing and is refused before SMLib (which
answered SM_ERR_INVALID_INPUT), naming the smallest radius that rounds,
tolerance / (sec(d/2) - 1). d is the least turn along the edge
(tangent_edge::least_angle_along, at tangent_all_along's stations).
Ruling d3 (2026-10-30). The block's tolerance is 2e-5 mm, not 0.1 um: at 1 deg the smallest
radius is 0.526 mm, so R2 and R20 reach SMLib, which still calls an edge within 2 deg smooth
(SmEdge::GetBlendEdgeuse); that test is ignored until SMLib uses 0.5 deg.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet rig: the knife-edge chamfers name SMLib's cause, a cusp's ball radius of 0
smlib_chamfer turns the distance into a ball radius d sqrt((1 - c)/(1 + c)), c the faces'
binormals' dot (capi chamfer_radius); at #851's cusp the binormals agree, the radius is 0 and
the call is SM_ERR_INVALID_INPUT before the fillet executive runs (gdb: chamfer_edges sees
radius 0; the dump's why is empty). SolidCraft hands every chamfer to SMLib, so the
ball-contact chord (the ball of radius d: 3.822 wide at d = 2, 159.2365 removed) is SMLib's to
build.
Ruling d4 (2026-10-30).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel tests: a corner round wider than its faces overflows and takes the corner's other edges
R21 on a 20 mm cube's edge builds (6107.529370, closed form, to 2e-12). With R5 on the
corner's other edges the R21 takes the faces they lie on, so the body is R21's alone; SMLib
fails that blend (status 1001, fillet error 4, Unable to Trim Rail Curve) and the test is
ignored until it builds. It replaces the refusal test that expected TooLarge.
Ruling d8 (2026-10-30).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: a 1 degree crease rounds, and the knife edge's chamfers build, on SMLib smlib-batch-4-rulings
With SMLib's smooth limit at half a degree (422e6f1) the 1 degree crease rounds R2 and R20
(the test is no longer ignored), and with a cusp's chamfer the ball of radius d (d231547) the
The 0.5 one stays, for its own cause (the chamfer face left apart from the body). Two corner
cases the same SMLib (replay/1.0.1 and those commits) builds come off too.
Needs SMLIB_REV at that SMLib once it is pushed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel, doc: an overflowing round goes first; an edge it removes is gone, and the fillet says so
SMLib (smlib-batch-4-rulings 0e83cca, SMLIB_ABI_VERSION 5) rounds the edges whose rounds overflow
their faces first and then what is left of the others; smlib_blend_dropping says which picks'
edges the overflow removed whole. The smlib crate binds it (Brep::blend_dropping), the kernel
returns those picks (fillet_removing), and a fillet notes them as its warning: "the edge at
(0, 0, 10) was removed by the larger round, so it is not rounded" (a 50 x 50 x 20 block, R21 on
its bottom front edge with the front left upright: the block is R21's alone, in closed form).
Ruling d8: [21, 5, 5] on a 20 cube builds as R21 alone (6107.529370); the test is no longer
ignored. R25 with R2 at a corner (blend_corner) builds the same way, R25's alone in closed form,
where it was refused. The rig's 1080 notched block outline at R8 builds now and comes off the
known-failing list.
Needs SMLIB_REV at that SMLib once it is pushed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet rig: the knife edge's 0.5 chamfer builds
SMLib's trim took a fillet meeting its face at more than 78 degrees for one with no side
(smlib-batch-4-rulings 971e567); the chord of the knife edge's 0.5 chamfer meets the flat face at
81 degrees. The case comes off the known-failing list.
Needs SMLIB_REV at that SMLib once it is pushed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: a 15° tapered text builds, every letter grown, exact where its outline gives it
Owner ruling d6: the letter t of "tres long" was drafted inward by SMLib (its
loop's normal, summed from the cross products of its chords, pointed down;
fixed in SMLib). With the fix every letter grows, and the join builds at 3°
and 15° by the Round rule and by the default rule (tangent for spline
outlines), where before 15° was expected to be refused.
Exact where the outline derives it: a letter's section at height z is its
outline offset by e = z tan a, by the Round rule of area A + P e + C e² while
the offset trims nothing (Steiner; C half each loop's turning less
tan(t/2) - t/2 at each reflex corner), so the letter is
A h + P k h²/2 + C k² h³/3. Each extruded alone, the t at 3° and s, l and o
at 3° and 15° are checked to 1e-6 (SMLib measures them within 1.3e-9; its
mass properties integrate to 1e-8). The concave joins of r, n, g and e are
tighter than e already at 3° (their swallowtails trimmed: r 1.1e-3 under the
formula), the t's by 15° (9.9e-5 over), and on the block the letters grow
into each other, so the whole word is checked for what holds exactly: one
closed body with the block, and half-way up every point of each straight
letter's outline inside the solid (the t drafted inward failed that).
With SMLib's fix (smlib-batch-4-text-loops 82133b2).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: a sloped basin's mitred rim rounds are checked tangent along their contact lines
1080-fillet-sloped-basin-1-mm-rim-r0-5-4-edges asked G1 at every blend seam. Its front wall
leans 19 over 20 and the others 10 over 20, so at each rim corner the two mitred rounds meet the
sloped corner edge at different heights (0.155625 and 0.276393 below the top): the deeper round
runs on past the corner edge and is cut by the plane of the other's wall, a crease by
construction, the gap below the shallower round filled on that plane. The check now measures
the rounds' contact seams, on the top and on each wall, where the rounds are tangent. The
volume is unchanged.
With SMLib smlib-batch-4-mitre (1c15364): the case passes (V 144530.427946 against
144530.427909, 15 faces, sound); before it, only the four corner creases failed the check.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* smlib: Brep::classify_point says exactly where a point lies against a body
Binds the fork's smlib_brep_classify_point (SmBrep::Point3DClassify at the body's own zone
tolerance): inside, outside, or on the boundary within that tolerance of a face, an edge or a
vertex. A box and a cylinder just off its curved wall in measure's tests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKQ2rEZvcXNQnhE3Sgs
* kernel: Body::classify_point decides inside, outside or on the boundary exactly
SMLib's point classification at the body's own tolerance, on the exact faces and edges, in
place of a mesh at a chord of 2e-3 of the body's size (about 0.4 mm on a 200 mm part). A point
within the tolerance of a face, edge or vertex is OnBoundary, never decided by a ray. A mesh
body's triangles are its exact shape: on them within the record's tolerance, else by ray
crossings. The kernel's own probes move to it; Body::contains goes once its last callers have.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKQ2rEZvcXNQnhE3Sgs
* doc: a hole decides whether it exits at its drill point's shoulder exactly
Material past the depth needs a body with the point inside, air before it needs every body to
have it outside; a point within a body's tolerance of the exit face is neither.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKQ2rEZvcXNQnhE3Sgs
* engine tests: probes ask for the exact point class
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKQ2rEZvcXNQnhE3Sgs
* ui, cli tests: probes ask for the exact point class
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKQ2rEZvcXNQnhE3Sgs
* kernel: Body::contains, the mesh test, is gone
Every caller asks Body::classify_point now.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NvoxKQ2rEZvcXNQnhE3Sgs
* kernel tests: the rim chamfers running off their rims build, on SMLib 737c392
chamfer_wider_than_sloped_basin_rim_builds and a_rim_loop_chamfer_running_off_its_rim_builds
waited for SMLib to build the cliff overflow (CloseRemovalRegion refused it,
SM_FILERR_NO_ROOM). The pinned SMLib builds it (eddf0ede4, bba9914b6): both pass on aarch64
Linux and are no longer ignored.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet rig: the cases SMLib 737c392 builds come off the known-failing list
The gate on aarch64 Linux reports 16 fillet cases FIXED with the pinned SMLib: the sloped and
equal-slope basin rim chamfers and rounds past their rims (1080-*, 5835-*), the pocket rim
chamfer past the floor, and the three pocket rim rounds now mitred at the pocket's corners
(every-pocket-*). No other area's gate reports a case fixed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: the re-blend's removed picks formatted as rustfmt lays them out
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: blend_smlib laid out by the 2024 edition's rustfmt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Skills: the tests skill's unit-test example stays under the 3600-character limit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet: the radius-too-large choice in plain nouns
"If too large: Stop and say so / Largest that fits / Narrow where needed"
becomes "Face limits: Exact radius / Largest radius / Narrowed radius", in
every language of the catalog, with the error and the tip that name them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: a round that would cut through its wall into a hollow is refused
The owner's rule of 2026-10-30: a round running past a rim of its faces
into open air builds; one whose section would remove material through to
a hollow behind its edge (a slit into the hollow, a cut through the part)
is refused as too large, so the fillet names the largest radius that fits.
Decided exactly in the section of a straight convex edge between planar
faces: the round's centre is at depth r below both planes, and it opens
where its arc uncovers a boundary point strictly inside the wedge with no
material beyond it toward the centre (the body's exact point
classification). Looked at: straight edges parallel to the round's (a
hollow's corner), cylinders about parallel axes (a rounded corner), and a
picked concave parallel edge's own round, which fills the corner.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet rig: 1668's R7 past the inside corner is refused at 4 + 2 sqrt2
The round's centre (32 - r, 42 - r) leaves the hollow's corner (30, 40)
outside its circle, opening the wall, where sqrt2 (r - 2) = r: the case
expects the refusal naming 6.828. 2852's R30, refused naming 25.24, now
passes too: both come off the known-failing list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* xtask: known-failing grades a nextest junit report against tests/KNOWN_FAILING_TESTS
`cargo xtask known-failing --junit PATH` reads nextest's junit (a file, or every .xml under a
directory, so all of a run's junit artifacts at once) and fails on a test that failed and the
list does not name, and on a listed test that passed (FIXED: take its line off, as the kernel
rig's gate does). A listed test that did not run is neither, since a pull request tests only the
packages it touches. The list has the rig's KNOWN_FAILING format (`<test> <cause>`, sorted, the
rig's own parser), with `<test>` nextest's `<binary id>::<test name>`; `cargo xtask lists`
checks it is sorted. The list starts empty.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* CI: the test jobs grade their junit against tests/KNOWN_FAILING_TESTS
Native Linux tests and the GPU path test shards no longer fail on any failed test: nextest's
"tests failed" exit (100) goes to `cargo xtask known-failing --junit`, which fails on a failure
the list does not name and on a listed test that passes. Any other nextest exit (a build error,
a bad filter) still fails the step at once. The tests skill says to list a failing test with its
cause, in place of ignoring it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: the known-failing list takes develop's 10 failing tests
Develop 38fd4a4f6 (CI run 41157648345, after the SMLib eaa998a pin) fails 10 cargo tests; each
is listed with the cause its failure message gives. Seven are SMLib refusals or results off
their derived volumes (fillet, chamfer and shell), the cli action matrix and naming corpus
among them; the two corner_g2 tests are the fitted G2 corner patch bulging past the box, which
the explicit G2 corner fixes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Reference tests: the eight cases that fail on SMLib eaa998a name their cause as known failures
Develop 38fd4a4f6's Reference tests fail 34, 35, 77, 78 and 81 (STEP export finds fillet edges
4.6e-5 to 6.1e-5 off their surfaces against 2e-5), 37 (the apex blend 0.193 off), 80 (the
taper-to-fit area) and 83 (thicken status 1001). Each expected.json names its cause in
known_failure, which the oracle already reads: a known failure that passes fails the job.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sweep path: a curve of several pieces is turned round whole
The path chain oriented its first piece, not its first curve: a first curve
of several exact pieces (a fit spline, an ellipse, a projected free-form
edge) was never turned round, so a path whose next curve meets it at its
start was refused as "not connected end to end". The chain now orients
curve by curve: the first runs toward the second where they meet at one
end only (else from the end nearest the profile), each next one starts
where the previous ended, with one joint tolerance for both questions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* SMLib: pin 2fc375f (tangency-labs/smlib#71, #72, #73)
A sheet's side is extended exactly the distance asked, or the call says it cannot (#71);
NVIDIA's -Werror build passes again (#72); a body splits by a sheet of several faces as it
is, smlib_split_body_by_sheet (#73). The C API is ABI 6 (the new entry), so the binding
expects 6.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: Extend grows a surface of several faces face by face
A surface body of more than one face (a fit-point spline's spans extruded, #3830) was refused.
Each face with a picked edge is now extended alone by SMLib's extension of its surface, and the
faces are sewn back together, each the face it was. A side that lengthens onto a face meeting it
tangent takes that face along, past its edge continuing the picked one; across a crease the
neighbour grows only when its edge is picked too, otherwise the extension is refused. Faces whose
lengthened sides no longer meet are refused. Up to a target keeps the pieces every grown face
lies in.
3830's extensions now build; its split still fails (the tool point picks one span, and a face
tool cuts with that face's surface alone), so it stays on the list with that reason.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: Split Body by a face of a smooth sheet cuts with the whole sheet
A face tool cut with that face's surface alone, so a face of a surface body made of spans joined
tangent (a fit-point spline extruded, #3830) cut nothing where its span ends inside the body.
Split Body by a face of a surface body now takes the faces joined to it tangentially (the exact
check Extend uses, within the one angle for smooth) and slices with them as they are, through
SMLib's slice by a sheet (smlib_split_body_by_sheet, tangency-labs/smlib 7a01f1b), its sides those
of the picked face. A sheet that only nicks the body cuts nothing, as before; a lone face, or a
face of a solid, still cuts with its surface extended.
3830 comes off the booleans list. Its answer counted the two halves of the cup and not the surface
that cut it, which stays as a body of its own (4879 removes its surface for that reason): three
bodies, the volume unchanged.
Needs SMLib 7a01f1b pinned (SMLIB_REV, prebuilt; its SMLIB_ABI_VERSION 6, which crates/smlib now expects) to link.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: a cylinder strip's run-offs are 100 pi + 100 to 1e-6, SMLib's exact area
The tangent and curvature run-offs of the quarter cylinder r 10 strip, 5 across the surface,
are its section swept 20 along z: exactly 10 pi/2 20 + 5 x 20 = 414.159265. measure is SMLib's
integration on the exact surface (1e-8), not a mesh, so the run-off check is 1e-6 relative and
the 'measured on meshes' notes go. Red until SMLib's extension is solved to its distance
(smlib-extend-converges 590d8a1): eaa998a's curvature run-off is 4.986 long, area 413.882.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* kernel: an extension SMLib cannot make exact says so, naming the length asked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: a control spline can carry its own knots and weights
A sketch spline over control points was always the clamped uniform B-spline
over them, so a free-form edge whose knots are not evenly spaced (or whose
weights are not 1) could only come into a sketch as one curve per Bezier
span. A control spline now may save `nurbs`: its clamped knots and its
weights. Its points, polyline, exact pieces (one a knot span; conics for a
rational quadratic), the solver's distance and curvature, links, parallel
re-projection and inspect.sketch all read them; a loaded design's are
checked. One pending format file (spline-knots).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch projection: a free-form edge comes in as the one exact spline it is
A projected spline edge of several Bezier spans came into the sketch as one
curve per span (#1508), so a G2 round's bottom edge was 16 curves and a path
naming the corner named one span of it (#3604). The kernel now reads such an
edge (a spline, or an elliptical arc of several spans) as the one clamped
B-spline it is over the edge's interval, its knots and weights its own, and
the sketch takes it as one control spline whose ends sit on the edge's
vertices. Planar regions still read edges span by span. The 3604 case builds
with its original path and leaves KNOWN_FAILING.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet rig: blends past an outer rim of their faces build, on SMLib smlib-blends-past-rims
The owner's ruling: a round or chamfer that runs past an outer edge of its face into open air
builds, tangent where it has room and cut by the face beyond where it runs out. SMLib's branch
smlib-blends-past-rims builds them by the rig's analytic answers. Off the known-failing list:
the disc's rim past its 2 mm wall (190), the hole's top rim R12 past the plate's bottom, the
chamfer past the cylinder's bottom (2893), each closing on the wall continued as itself, and
926's chamfer ending on the boss's wall, which now builds to its answer too.
The sloped basins' R4 rim rounds (1080, mitred rounds built together where one overflows) build
to their analytic volumes (to 6e-9), and stay listed with that reason: their continuity check
(g1 at every blend seam) takes in the mitres' creases, G0 by the mitre ruling.
2893-chamfer-two-distances-elliptical-rim is graded as a solid (the owner: it builds) and stays
listed, waiting on the ruling on unequal chamfers along a rim whose angle varies.
5158-fillet-round-just-past-a-10mm-face stays listed with its cause found: the round passes
5e-6 under the box's top back edge, inside the body's tolerance.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Naming: test that a round of a round's end has no seam with that round's faces
The r1 round of a block's top edge, chained onto the end curve of the r2
round of its arc at a cylinder (rig fillets/every-block-cylinder-crease-
top-edge-after-arc-round-r1), ends where it runs into the cylinder. That
edge is no seam of the r1 round: the cylinder is a face of the r2 round,
not of the r1. blend_seams takes it for one today (the r2 round's name
F3:blend:F1:+z|F2:side holds a | of its own), and the rig reads it as a
contact seam at 60 degrees.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Naming: a blend's seams split its edge's name at the | between its two faces
A blend face's name holds the edge it replaced, <face>|<face>, and a side
of that edge can be a blend face whose own name holds a |. Whether a face
is a contact of the blend was read as the edge's name starting or ending
with the face's name next to a |, so the r2 round's own face F2:side read
as a contact of the r1 round F4:blend:F1:+y|F3:blend:F1:+z|F2:side. The
edge's name is now split into its two faces, a blend side read whole as
the two faces of its own edge.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fillet rig: five refused blends build, off the known-failing list
926 (the chamfer ending on the boss's wall), the oblique cut's r0.1
round, the every-block r1 round (its seam with the cylinder is no
contact seam, after the blend_seams fix), the up-down squares' concave
chamfers and the shelled box's lip chamfer build with SMLib branch
smlib-blend-refusals (f8650b8 and later). 1207 r0.5 passes SMLib's check
on its rails now and stays listed for the next cause: its end rib on the
boss, which starts where the round and the boss are tangent.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the trough and the pocket whose floors fall to a drain build
SMLib now offsets a vertex where four faces meet (two walls and two facets at the floor's
corners, four facets at the drain) to two vertices joined by a new edge (tangency-labs/smlib
branch smlib-shells). Both volumes match their closed forms. The pocket's lining, hanging from
the top's rim round the pocket, stands apart from the slab's outer walls with the cavity rising
between them to the open top: the case says two shells in the one body.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the plate with a hole through its arc side shells open at its far end
SMLib's merge now intersects the offsets of an edge's faces where they could not be mated along
it (the hole's offset poking out through the half-round side's; tangency-labs/solidcore#1795):
one closed valid solid with the one face open, as the owner ruled.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the ring cut frame and the up-down join shell
SMLib's inset now keeps only the regions that are cavity, not the one the offsets close where
they overlap (between the two faces of #545's 0.5 floor, round the up-down join's two empty
octants). The frame's core under the recess is hollowed to a sealed void, so the case says two
shells and its closed form, 21044 mm³.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: #616's lid shells open at a rib's side, with the 0.15 lip
SMLib keeps the skirt top's offset where its loops wind the other way under the opening, the
cavity's floor (the owner's ruling of 2026-10-31: build it; a lip thinner than the wall is no
break-through).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Known failing tests: the action matrix's shells and chamfers as they fail with SMLib batch 7
The ring cut frame's and the up-down join's shells build now, and so do the up-down join's and
modern-plastic's chamfers (SMLib smlib-blend-refusals). #616's lid in the corpus still fails
SMLib's loop check, the shelled box shelled again at an inner wall is unchanged, and the
oblique cut of a cylinder's fillet still fails SmSurfOfRevolution's Test #7: 3 actions of 7.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* SMLib: pin 26cc451 (batch 7: rounds past a rim, blend refusals that build, shells)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Known failing tests: the shell after a cut whose end touches an arc side builds on SMLib batch 7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Surface fair test: the energy falls strictly, the face moves, and the edges are read after the fair
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch scaling test: the first dimension sets l1 to 40 and scales both joined rectangles about the origin
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Frames tests: a pick on a moved component or an instance removes the exact round and bore volumes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Issue 1080 tests: the rib's rounds and the mitred corner chamfers and rounds have their exact volumes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Engine tests: lip_after_boss checks each lip's and groove's exact band, hole_as_deep_as_the_plate each hole's exact bore
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Robustness tests: lip_after_boss and hole_as_deep_as_the_plate live once, in the engine's tests.rs with exact volumes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Engine tests: loft_cut goes; loft_spacing's hollow elbow covers its section counts and more
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel loft test: the square-to-circle loft has the oracle's exact ruled volume, without printing
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tessellation lens test: the lens's triangles fill exactly the rhombus through its arcs' midpoints
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Pattern test: six chamfered holes take exactly five more holes' bore and chamfer rings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel pocket floor fillet test: the corner rounds and the floor loop round add their exact volumes, by Pappus at the corners
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Shell regression: the saddle-corner shell opened on the top box's side has its exact volume
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* SMLib history test: every operand's order is the identity on its record's faces and edges
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Boolean history tests: the SMLib module's box-minus-sphere, box-minus-cylinder and box-union-box copies go; the top-level ones check more
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Modify history tests: shell, offset and thicken are one test each through the public API, with the volumes, refusals and history the SMLib copies checked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Chamfer history test: the chamfer after each box cut is exactly one face on the painted block too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Grid test: a pole side's face is the five triangles fanned from its one grid node, none degenerate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel tests: the twelve ignored print-only debug tests and surveys go; coplanar_curved_booleans checks the flush-capped cylinder cuts and unions they printed
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel: the #883 board fixture generator is an example, not an ignored test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* STEP import test: a seam sphere whose meridian stops short of the pole imports as the whole 2 mm ball
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Material tests: the nine copies in material_properties go; the persistence file checks the library copy's card and formats 20 and 21 in one loop
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sample test: one loop checks every sample builds cleanly and without a panic; the robustness copy goes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Known failing: the non-antipodal seam sphere import, refused for a loop of no (u, v) area
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: rustfmt the board fixture example and the coplanar asserts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the two 3871 cone cases were byte-for-byte the 258 cases; the 258 cases carry their sources
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: a volume or area can be graded as a hand-derived range where analysis only bounds it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: fillets keeps one case per regime; 17 replications of a case in the same regime go
The sloped-basin chamfers and rounds at 0.5 mm rims repeat the 1 mm rim's regimes; two of the
three knife-edge chamfer tips, the r1 and box r3 curvature corners, the r1 tangent corner, the
1 mm pocket-rim and hole-rim chamfers short of the floor and the r1 together-round each repeat a kept case's regime
and grades. #854 moves to 851-chamfer-arc-top-edge-9-5, and the cases that cited a dropped one
cite the kept one or state its formula.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: five cases outside fillets repeat a kept case's regime and go
A square cut is the slanted plane's ordinary crossing; the cam's half turn is the quarter turn's
contact at a symmetric angle; the r15 slab stands inside the same coincidence tolerance as the r10;
the 90 degree unfold and the 40 degree flange repeat the 72 degree and 20 degree cases' formulas.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 3243 rim and tooth join graded on its volume (rim plus the trimmed tooth less their 0.01 mm overlap)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 3782 emboss on a cylinder graded on its volume, area, faces and box (the wrapped 4 x 5 badge raised 1 mm)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 3604 G2 swept-tool cut graded on a volume range (filleted box minus the swept corner section)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 4505 coil joined through a cylinder wall graded on its volume, area and box (cylinder plus the wire's screw-swept segment outside r 76)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 4879 window cut through a thickened spline revolve graded on a volume range and its faces
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 4623 join of crossing pleated loft skins graded on its volume and box (both skins less their overlap)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 831 tapered glyph extrude graded on a volume range and box (the font's S drafted in by 10 deg)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 2357 ring of 90 cylinder segments graded on its volume and box (the segments less their 90 joint overlaps)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 4542 fluted wall joined on a revolved base graded on its volume and box (the base by Pappus plus the fit-spline ring)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 1985 and 2243 STEP-export enclosures graded on their volume and box (the outline less the cavity, plus gusset and standoffs)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: both 4092 loft, ribs and pad unions graded on their volume and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 1525 graded on its volume (the convex body's exact 2 mm inward offset), faces and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 1494 graded on its volume (box and cylinder less the 1 mm-offset cavity, sharp to rounded concave edges) and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 4492 graded on its box and a volume range (the face's 19 mm sweep added, within the block's sides)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 745 graded on its volume (the end moved 1 mm plus the spline boss's exact area), faces and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 4567 graded on its volume (the revolved spline less its revolved 2 mm offset), faces and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the up-down squares shell graded on its volume (the columns less the 0.346 mm-offset cavity, sharp to rounded concave edges) and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 545 graded on its volume (the frame less its 0.5 mm-offset cavity, sharp to rounded concave edges), its sealed pillar void and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the shell-again case graded on its volume (the shelled box less the 0.5 mm-offset cavity in its walls) and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the arc-sided plate shell graded on its volume (sharp to rounded at the hole's bottom), faces and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 616 graded on its volume (the lid less its 0.5 mm-offset cavity, sharp to rounded concave edges) and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 391 graded on its volume (the shelled housing, sharp to rounded at the flange, less the letters' 0.6 mm deboss) and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: shell/3576 was the ladder's drafted box with rounds shelled, recipe for recipe; the ladder case grades it and carries #3576 and #3573
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the two 851 chamfers of 2 graded on their volume (the cone's sweep, and its union with the front edge's prism)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the chamfered corner of the lipped shell graded on its volume (the chamfer's triangle through the wall)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the concave round into the peg's cylinder graded on a volume range (the torus it must add, the band it can't leave)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the two folded 72 degree trays graded on their volume (flat area x thickness) and the walls' reach
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the flanged rhombus graded on its volume (flat area x thickness, all four reliefs cut) and its walls' ends
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the base with two adjacent flanges and a hole graded on its volume (base, bends and panels folded)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the flange beside the ledge graded on a volume range (the flange's two readings of its length)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the two G0 window patches graded on the box the part they close keeps
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the hub's six swept grooves graded on its volume (the revolved hub less each tube's part inside it)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the cut mirrored loft graded on the box its sections pin
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the three modelled-thread joins and the fine M48 graded on their volume (the basic profile's groove, Pappus)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the oblique-cut round graded by its seams (tangent, not curvature-continuous); the flanged rhombus says what it tests (its reliefs stay apart at 60 mm)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 3841 is 168's rim touching its coin along a circle, and 4092's reduced recipe is its report less a flange clear of the failing join; the kept cases carry their sources
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the oblique-cut round keeps its old grade until the new blend algorithm lands
Its seams grade needs the continuity check to skip the body the round is not on. Fillet cases
wait for the new algorithm.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: 1985's enclosure is 78 x 77 (74 and 73 inside, 2 mm walls); its volume 38063.827 by hand
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the three spline walls' face counts wait for the one-wall decision; their volumes grade them
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* STEP import: a face bounded by seams alone runs its loop the other way, never turns over
A loop that uses each of its edges once each way (a whole torus within its tube and ring seams)
is the same set of uses run backwards, so it says nothing of the face's side. One written
clockwise in (u, v) turned the face over, against its same_sense: the torus came in inside out
with a warning. Such a loop is now reversed and the face keeps its side.
Test: seam_only_torus_imports_as_a_whole_ring, both orders of the two seams, volume 2π²Rr².
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* STEP import: a face bounded by a slit alone is the whole of its closed surface
A loop that runs out along a chain of edges and straight back (a meridian from a sphere's pole
stopping short of the other, out and back) encloses no (u, v) area, yet on a closed surface it
bounds all of it less a cut of none. The reader only read such a face when the slit already ran
pole to pole (and moved the sphere's frame onto it only then), so the 2 mm ball whose meridian
stops at 2.5 rad was refused for its empty loop.
The slit is now made the face's seams, so its loop bounds the surface's whole domain: on a
sphere, a revolution whose profile ends on its axis, or a spline closed round u that collapses
at both ends, the slit's meridian is run on to both poles, out and back (a sphere's frame put
on the slit first, whichever two points it joins); on a torus, the circle the slit lies along is
closed and the other circle through its start is the second seam. The seams on a sphere are its
own meridians (angle 0 on the equator), so their pcurves are exact lines on its form.
Tests: non_antipodal_seam_sphere_imports_as_a_whole_ball passes (its known-failing line goes);
seam_only_torus_imports_as_a_whole_ring adds a torus bounded by a slit along its tube.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: the test-peg's concave arc and front top edge rounded together stay within the body's box
A new fillet case, report-fillet-concave-arc-and-front-top-edge-together-solver-residues:
the reported part's bar (with the sketch solver's residues) whose sides run tangent into the
cylinder, its concave arc and front top edge rounded r2 together. The plane of the front face
bounds the whole body, so every blend lies within the unblended body's exact box (SMLib's tight
box); graded to 4e-5, the corner patch's own tolerance. On SMLib 2fc375f the corner patch
stands 0.0374 out of the front face (box y min 0.0205): listed in KNOWN_FAILING.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: the test-peg corner at r5 and r7
Two more fillet cases, the reported part's concave arc and front top edge rounded together at
r5 and r7, with the same exact-box containment check (graded to 4e-5, the corner patch's
tolerance). On SMLib 2fc375f the corner patch stands 0.128 (r5) and 0.230 (r7) out of the
bar's front face (box y min -0.0699 and -0.1723): listed in KNOWN_FAILING.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: blends that end where their face runs tangent into another
Fifteen fillet cases on the test-peg's shape with clean numbers: a bar 40 x 16 x 10 whose far
end is a half disc R8, a disc R8 standing 10 on its top, joined, so the front face runs tangent
into the cylinder along x = 40 and the front top edge (convex) meets the concave arc of the top
tangentially there. Each blend ends on a face tangent to the one it rolls on.
- Rounds: both edges together at r2 and r5; one after the other in either order at r2, and at
r1.5 and r3; the front edge alone as a curvature round, whose end on the cylinder is a
semicubical cusp. The containment invariant (the unblended body's exact box, to 4e-5) and
G1 seams, or the analytic volume where the blend has a closed section.
- Chamfers: the front edge alone and the concave arc alone (analytic volumes: the section along
x up to the wall, the cone's spandrel ring clipped by the sides), both together, and one after
the other (1 then 2).
- STEP: the peg written to STEP and read back, its front edge rounded (analytic) and both edges
rounded together.
- A cone: the peg drafted 5 deg, whose front face runs tangent into a cone along a generator,
its front edge alone and both edges together.
The quadratures are tanh-sinh, converged to 1e-13; SMLib's own volumes of the passing analytic
cases agree to 4e-9. A sphere is left out: a plane meets a sphere tangentially at a point, not
along a seam, so it is not this ending.
On SMLib 2fc375f eight fail, listed in KNOWN_FAILING: every chamfer that ends tangent (status
1001, SmFilletNx1Corner), the two rounds together (the corner patch 0.0374 at r2 and 0.128 at r5
out of the front face, and the rounds meeting with normals 180 degrees apart where their
contact lines on the top cross), the same on the STEP-read peg (status 1001) and on the drafted
peg (its corner refused as unsupported).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: fillet corners graded curvature-continuous, the default to be
Six fillet cases that pick their edges with no type, so they take the fillet's default, which the
owner has ruled is to be curvature-continuous (G2) at every corner, with circular rounds kept as
an option. Each grades every seam of the rounds and of the corner patch G2, on one valid body:
- an oblique convex corner (a block drafted 15 deg);
- a four-edge and a five-edge apex corner (pyramids lofted to a point);
- a pocket's concave corner;
- a mixed corner (a step: one concave edge, two convex);
- a corner beside a cylinder (the top corner of a half cylinder).
All six fail on SMLib 2fc375f, listed in KNOWN_FAILING: today's default is the circular round,
whose seams jump in curvature by 1/r. On the five-edge apex the corner patch also meets two
rounds at 8.45 degrees (G0).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: the test-peg's front chamfer builds
With the SMLib fork's smlib-tangent-ends (a rail's end on its side edge is the rail/edge
crossing), report-peg-front-chamfer-d2 passes. Its line leaves KNOWN_FAILING, for the pin that
carries that fix.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: the curvature-continuous corner cases pick the curvature fillet
The six corner cases added in 3a854104a took the fillet's default type, on the premise that the
default would become curvature-continuous. The default stays the circular round, so each case
now asks for the curvature fillet itself (type curvature: curvature-continuous sections and
corner patches) and keeps its grading: every seam of the rounds and of the corner patch G2, one
valid body. They are renamed from cov-fillet-g2-default-* to cov-fillet-g2-*.
The oblique three-edge corner (a block drafted 15 deg) and the pocket corner pass. Four fail, as
KNOWN_FAILING now says:
- the corner beside a cylinder: the curvature fillet builds its sections only between planar
faces;
- the four- and five-edge apex corners: refused because the default setback is shorter than
where the rounds' contact lines meet (3.90 and 3.51 mm from the apex);
- the mixed corner: SMLib sets back a corner only where its edges are all convex or all
concave.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Rig: the test-peg's concave chamfer, alone and after the front chamfer, builds
With SMLib's tangent end as an event of the fillet's trace (blend-end-event 6d73e4f), the
concave chamfer's rail on the cylinder ends where it crosses the seam along which the front
face runs tangent into the cylinder, continued past the vertex, and its end rib on the front
face is built from there. report-peg-concave-chamfer-d2 and
report-peg-front-chamfer-d1-then-concave-chamfer-d2 pass and leave KNOWN_FAILING. The two
chamfers together still fail, now at the mixed-convexity corner where they meet: its line says
so. Rig against SMLib 0cc48bd: no area regresses (963/993 pass, 961 on a87c502), ladder 168/168,
kernel lib only its listed failures.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: constant rounds of the exact classes, and a tee's round
A plane cutting a cylinder or a cone at an angle, a sphere or a cone coaxial with the other face, a
cone and a cylinder touching one ball, two pipes touching at a point: their rounds' centre lines
are rational, so the rounds are rational surfaces of degrees fixed by the construction ((4, 2),
(2, 2) revolved, (6, 2), (12, 2)). The tee's centre line is not rational; its round is graded on
its volume. Volumes from the divergence theorem over the exact pieces, at rel 1e-6. The six that
SMLib 0cc48bd traces are listed in KNOWN_FAILING with what they come out as.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the exact-class rounds pass on SMLib's classified exact rounds
The rounds now come as the rational surfaces their classes give, closed ones as two faces split
at their seams, the touching pipes' as four: one splines entry a face, each of the class's degrees.
Their KNOWN_FAILING lines go.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* SMLib: pin 7ac037e (the new blend's tangent-end event, zero-speed G2 ends, and its exact-class rounds)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the fillets known-failing list is the 22 cases that fail on SMLib 7ac037e
Twelve listed cases build on the new blend's end event and exact classes, or were already
built on develop: they come off the list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: #316's bottom rounds as large as the wall, or larger, shell with a step wall at the opening, not refused
Where the round meets the open bottom the cavity's wall steps down along the bottom's normal, so the
round meets it at 90 degrees and the opening is exactly the picked face. The cases are renamed and
graded on the exact volumes, and come off the shell known-failing list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Merge fixes: every crate and test target compiles on the merged tree, but for crates/geom's hlr
world_state, view::bounds, home_camera and scene return Result on develop; new
main code takes that with ? or session_world. New fixtures carry the spline's
nurbs. ForeignCopy::of returns Result. occurrence_placement_with walks the path
with its moves, since the placement index holds pending_moves only.
The hlr port is separate and still to come: this commit does not compile as it
stands in crates/geom/src/hlr.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Drawings hidden lines: read develop's B-rep records
Edges come from the record's edge list, cut to their interval (C3::of_edge), and
faces from its face list; a cylinder, cone, sphere or torus chart takes its bounds
from where its NURBS form lies on its label (S3::of_face). A rigidly placed
revolution has main's revolution chart; other placements stay refused. Moving a body
to its centre goes through Brep::moved. Loops are read against the natural normal of
the face's parameters where a chart wraps.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Hidden-line fixtures: build develop's records from the fixtures' data
Fixtures keep their bounded curves and surfaces and their own edge numbers; a private
builder makes the canonical record, and the local prepare puts the edges back in the
fixture's numbering. Assertions are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Hidden lines: tests of the bounded edges, face charts and placed revolutions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* drawing-hlr doc: what is drawn and refused on develop's records
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* hlr tests: a placed revolution is refused when its placement is not rigid
The new model has one record for main's Revolution, which was drawn, and its
PlacedRevolution, which was refused. An identity placement is now the former, so
this test's fixture takes a non-rigid one. The refusal it asserts is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Hidden lines: a traced intersection is drawn only where its spline lies on both surfaces
A leader off either surface is refused like a curve with no spline to follow. Tests: a traced rim
drawn on the circle and plane within tolerance, the same leader 1 mm off refused, and kernel bodies
with arcs through the production prepare against closed forms.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Hidden lines: kernel bodies through the production prepare against closed forms
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Tests from main: the world state is a Result here
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* A blend's pick measures close edges on their curves, not their polylines
A polyline can be a chord off its edge, more than two edges are apart near a
tangent point. A pick exactly on a ball's rim took the straight edge the rim is
tangent to, and solidcore built a chamfer of that edge with a clean check.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
(cherry picked from commit c786db6bf4)
* Merge fixes from the first SMLib test pass
Model cache key covers the crates develop's kernel adds under doc (profile, smlib, step).
A piece taking a name also takes the feature that made it: SMLib lists a cut's pieces in another
order, and the swap left the name on a piece of the wrong feature.
A replaced analysis keeps its status slot. A command with no world picks does not place the model
first, so assembly.mass_properties answers for a flattening placement. FeatureCommon loses the
touching key the merge added; only the contracts that read it take it.
Two of main's tests listed as failing on SMLib, with why.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Merge fixes from the ui test pass and the gates
Main's thread.direction keys go with develop's thread hand, which replaced them. Vietnamese for the
messages develop added while main made vi a complete catalog. CGA and 1-bit themes set develop's
comb and section hatch colours. A ribbon button with a persistent effect is pressed only while its
tool runs, so persistent_ribbon_pressed alone decides how its effect is shown; other analyses stay
pressed while on. Two of main's ui tests listed as failing on SMLib, with why.
Gates: fixed thread tables become slices, one collapsed if, rustfmt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* A silhouette takes its facing from the surface's normals
A flat triangle beside the outline can tip the other way from the surface it approximates, and its
edges joined the outline. On SMLib's sphere that made 192 segments instead of the equator's 64, 100
curves and 95 profiles from the tight fit of #7989. Each corner's normal is used where it is close
to the triangle's own; a mesh without such normals (none, zero, not numbers, or averaged across
creases) keeps the triangle's normal, as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Clippy and rustfmt on the merged tree
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXkZLQ6T7TSi4wswcmk
* Stepwise open checks every feature under the session's mode
OpenSteps::start evaluated under the default check mode, and finish kept those results under the session's mode: an each_step or off session opened in steps recomputed nothing. start now takes the mode (the app passes its session's), and a mode that changed before finish evaluates the design again under the new one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Clippy without SMLib: the planar-sheet edge reader is built only with it
Its one caller is in the smlib-only sheets module, so without the feature it was dead code and
clippy -D warnings refused the kernel.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* SMLib: pin d01d7b0 (the new blend's one Gⁿ section generator: the chord, circle and curvature sections, and the variable rounds as the union of their balls)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the section orders, chord, circle and curvature section, on planes and against a cylinder
Eight fillet cases for the blend's cross-section by its order of contact with the faces, each
graded on its analytic volume at rel 1e-7 and its exact continuity (the order, and not the next):
- a box's top back edge chamfered 3 (G0), rounded r3 (G1) and curvature-rounded 3 (G2): the
areas cut off the corner s^2/2, (1 - pi/4) s^2 and 113/756 s^2, the last by the default
thumbweight's definition;
- a pipe R10 dipping into a plate, its concave edge chamfered 2 (the chord between the contacts of
the ball SMLib rolls for that setback, radius 1), rounded r2 and curvature-rounded 2, each
section's added area by Green's theorem along the plate, the section and the pipe's arc; the
order-2 section is built from the faces' feet of the point at distance d from both, which on
the pipe are not linear in d;
- a boss root curvature-rounded 2, the square corner's section revolved (Pappus);
- a variable round r1 to r5 along a box edge (rel 1e-5): the balls' envelope is a circular cone,
and the volume is the cone's sections integrated along the edge.
Three fail today and are listed: the two curvature rounds whose faces are not a square corner of
planes (SMLib's quintic blend curve, not the order-2 section: rel 6.5e-7 and 1.2e-5) and the
variable round (great circles, not the envelope's: rel 4.8e-5). The other five pass on SMLib
7ac037e.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the curvature fillets' expected bodies from the order-2 section at thumbweight 0
SMLIB_BLEND_CURVATURE's section is now the order-2 G^n section at thumbweight 0. Between two
planes square to each other it cuts A = 0.154192655384275 s^2 off the corner, its first moment
about either face 0.0291753295725360 s^3 (Green's theorem on the section): the curvature cases
built on that corner (862, 2708, every-box-edge, every-hole-top-rim, every-l-bracket,
every-block-cylinder-crease, the three-edges-at-bar-corner reports, 3604's fillet) take their
volumes from it by their own methods, the peg's front blend 23.3237146876 (its section along x
up to the wall). Between planes the section's t^3 term vanishes (their feet are linear in the
distance): the box edge case is exactly G3. The boss root is a certified fit, G3 to the plate and
G2 to the wall at Continuity Analysis's tolerances: at least G2. The boss root and the pipe on
the plate pass on SMLib's section and leave the known-failing list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Curvature fillets: the section's default thumbweight is equal area, so the round's volumes are the circle's
On the round's rails the order-2 section takes off what the ball's circle does: (1 - pi/4) s^2 at a
square corner, first moment 0.0474559669443 s^3 (w = -0.5252123889). The kernel and engine tests
and the curvature rig cases take their volumes from it by their own methods; the pipe on the plate
from its own wedge (70.52878 degrees, w = -0.8544103493). The G2 corner patch's seam test is listed
until the corner step.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: four G2 corners wait for the corner step: their patch meets the new section's rounds G1 at one face seam
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the turn at a corner of two rounds, Mitre (the default) and Swept, at a pocket's floor and a boss's base, by exact volumes
A round's spandrel A = (1 - pi/4) r^2 and its first moment about its wall M = r^3 (5/6 - pi/4):
Mitre adds L A -+ 2 M per edge (cut at, or run on to, the corners' bisector planes), Swept turns
the section about a convex corner's edge, (pi/2) M a corner, and refuses a concave corner rounded
less than the ball. The pocket's tangent chain round its R3 corners is a torus each. Graded to
1e-7, where Mitre and Swept differ by 6.6e-6. The Swept cases are listed until solid.fillet
takes a turn.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: a junction family: oblique wedges 30 to 150 degrees rounded and chamfered (exact), bosses upright and tilted, pipe tees and a Y junction
Four are listed with their causes: the equal-pipe tee (its exact conic-pair rounds meet at the
ellipses' crossings in a corner the old corner code cannot join), the tilted bosses (1001, before the
blend rework too) and the Y junction (refused for room at its triple points).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Variable rounds: graded by the union of their balls (their envelope), not the balls' great circles
The smlib crate's laws and ladder 005, 006, 007 and 012 take the volumes the balls' envelope
removes; the law with a corner is its own test, listed as failing until the corner step.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel tests: variable rounds graded by the union of their balls, the removed volume to 1e-4 of itself
removed_by_balls integrates, in each plane square to a right-angled edge, the corner the union
of the balls leaves (by rays from the edge, the least entry over the balls), cut to the body's
section. The law with a corner through a middle point is its own test, listed as failing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel tests: a spline radius whose balls fold over one another at its peak is refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: the variable round on its cone passes (the round is the balls' envelope)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Tests: three rounds of different radii at a corner listed: the corner's transition kinks with the balls' touch circles
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Ladder: the variable rounds graded to 1e-6 by the union of their balls; 012 by its law going on past the edge
At the default 1e-3 the great circles' volumes (4e-6 off) passed too. SMLib builds each within
1.6e-7. The golden takes the new volumes and areas; counts unchanged. The G2 corner test listed
as failing passes on SMLib's step 3 and leaves the list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Reference tests: the variable rounds 77, 78 and 81 pass on SMLib d01d7b0; their known-failure marks come off
The new section builds their edges on the surfaces, so STEP export no longer finds them 4.6e-5
to 6.1e-5 off. develop's Reference tests (60393a718) report all three as passing while marked.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* STEP import: a ball's halves whose seams are off each other's quarter lines each form within one turn
A sphere split into two halves along a circle about its axis, each half covering a pole with no
seam, gets a seam per half from the first vertex of its loop to the pole. The circles between the
halves group their frames so they turn together, and when the two seams are not a whole number of
quarters apart no one turn fits both: the group kept its frames, a half's form ran past one turn,
SMLib's trim (SMLib and solidcore alike) across the form's end crossed the face, and the mesh
folded over the ball (a rotor's ball showed torn; its half had 196 times its area in triangles).
When no one turn fits the group, each spilling face is now turned on its own to start on a quarter
line. On the rotor file this also clears three other faces that were filled leniently and a
0.076 mm edge gap; regression test in step_in/tests.rs with the area and volume of each half.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
(cherry picked from commit b3188e005d427043b918267449c2336a1777e54f)
* SMLib: pin 5e8c9c1 (the new blend's corners: Ball and End/Join; exact fold and room checks with fit sizes; overflow in place; the round as its definition)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel tests: a law's dip shows its corner ball's sphere, a peak's two rounds cross (the reasons had them swapped)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Reference tests: the variable rounds 77, 78, 80 and 81 expect the union of their balls
A variable round is the envelope of the balls rolled along the edge, which takes less than a
quarter round in each section. The expectations are now that union, the law continued past the
edge's ends along its end slopes, integrated by Gauss-Legendre panels in x and t; 2, 4 and 8
panels agree to 1e-9 of the body's values, and 77's removed volume matches a brute-force union of
balls to 2.5e-10. The nearest-ball search now scans the balls the ray meets around ball x
(|x - s| < r(s) sqrt(sin 2t)) on their own, which near the faces and where 78's radius closes to 0
are narrower than the global scan's step. Regenerating keeps each case's known_failure. 79, a
constant radius, is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Known failing: the law corners' kernel and crate tests and rig 1207 pass on SMLib 48ea616
SMLib builds a variable round's law corners as its balls' union (the corner
ball's zone at a dip, the sides' crossing at a peak): the kernel's corner
through a middle point (39.5410) and the crate's 4 -> 2 -> 4 law (39.5421) pass.
Rig 1207 (the bar's top edge rounded after the boss's arc, r0.5) builds and
grades on the same SMLib; it failed on c820346.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Kernel rig: every fillet and chamfer case rounds its tangent chain
The owner's ruling of 2026-11-01: the rig and the ladder round with tangent_chain true, how a
user's default pick behaves. The 38 fillets-area recipes and the ladder's 07-fillets/016 and 018
that passed false now pass true. The shell recipes keep theirs: a shell's tangent_chain is its
open-face chain, a different feature.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the partial-selection cases kept as -partial-chain copies, tangent chain off
Where a case's point is one edge of a tangent chain rounded alone, a copy keeps tangent_chain
false as its own case (SMLib rounds exactly the picked edges, ending at the smooth vertex); their
expectations stay as they were, to be re-derived:
- fillets/1207-fillet-box-end-edge-into-unblended-round-partial-chain;
- fillets/every-fillet-after-fillet-curvature-front-then-side-r3-partial-chain;
- fillets/1207-fillet-bar-top-edge-after-boss-arc-round-partial-chain, renamed from
...-no-tangent-chain: with the chain on it is exactly 1207-fillet-bar-top-edge-after-boss-arc-round,
which the rig already has;
- ladder/07-fillets/020 and 021, the r5/r3/r7 and r5/r3/r2 corners (016 and 018) with the r3 on
its edge alone: with the chain on, the r3 runs on along the r5 round's end arc and down the
vertical edge the third round was to take.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the concave arc between the block's tangent sides kept with tangent chain off
fillets/every-block-cylinder-tangent-concave-arc-r2-partial-chain: the pick takes one piece of the
concave half circle, which SMLib splits; with the chain off its other pieces are left out, and the
blend is refused at the piece's end (the base gate's outcome). With the chain on the case rounds
the whole half circle. The copy keeps its expectation, to be re-derived.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: two chains that now build graded by their exact volumes
With the tangent chain on, two cases round more than the edge they pick, and their old
expectations were the single edge's:
- 1207-fillet-box-end-edge-into-unblended-round: the r1 chain is the end face's top edge, the r3
round's end arc and the back upright; 34 A + (pi/2) A (3 - c) by Pappus on the arc:
V = 7953.139216 (it built 7953.139216, the old 7957.505 passed only inside 1e-3), 10 faces.
- 851-fillet-top-front-then-front-left-upright: the upright's chain runs up the first round's
end arc on x = 0 and along the left top edge, so the corner becomes the R2 ball's eighth:
V0 less the first round's spandrel to the wall (35.344727) less 27 (4 - pi) + 2 pi/3:
V = 9530.777979 (built 9530.777987), 10 faces.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: a curvature chain round a round's end refused for its size; the concave half circle builds
- every-fillet-after-fillet-curvature-front-then-side-r3: the side edge's chain runs round the
first curvature round's end curve, whose radius of curvature has a weighted mean of 3 (its
setback) and is unbounded at the ends, so somewhere below 3: the size-3 blend's contact line
folds back on itself. Refused, "larger than the faces beside its edges allow", as ladder
07-fillets/016's r7 on the r5 arc. (It was solid or refused for running on tangentially.)
- every-block-cylinder-tangent-concave-arc-r2-no-tangent-chain: the chain takes every piece of
the half circle and ends at the convex edges it runs on into; it builds the analytic 19091.9620,
so the outcome is solid (the refusal alternative was the chain-off one's).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Known failing: two 851 chains whose corner piece is a ball of tube-centre radius 0
851-fillet-arc-then-top-front and 851-fillet-top-front-then-upright: with the tangent chain on,
each R2 chain runs along the end curve of an R2 round on a curved face (the arc round's end on the
front face; the first round's end on the wall), where the rolling ball sits on that round's own
centre line, so the piece is the ball about (39.2538, -19, 8): the three-edge rolling-ball corner.
SMLib fails with status 1001; the same piece on a plane end arc builds (front-left upright).
Expectations unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Ladder: 016 and 018 refused, their r3 chain takes the vertical edge; 020 and 021 recorded
With the tangent chain on, 016's and 018's r3 runs on along the r5 round's end arc and down the
vertical edge, so the third pick (60, 40, 8) is 3 from both of that round's contact lines and
names no edge: refused, asking for a point along one edge. The corners they were made for are
020 and 021 (the r3 alone), whose golden entries are 016's and 018's (021 measured on f12a101).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel tests: three rounds at a box corner end on one rational patch on the ball's sphere, not an analytic sphere
SMLib's Ball corner is always the rational patch exactly on the sphere (owner ruling, blend
design §23), so the corner counts as an 'other' face beside the three cylinders and six planes.
The removed volume still checks the corner against r³ − πr³/6.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the curvature round on a pipe on a plate is listed: a seam grades G3 where exactly G2 is wanted
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel tests: the box-and-fillet wire fixture records the round's cylinder frame as SMLib now keeps it
The round's cylinder keeps the frame it was made on when it is turned (SMLib's SwapUV no longer
re-derives it): its origin sits at x = −20 on the same axis line, (x, 2, 8) along x, radius 2.
Same cylinder; one number in the record moves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Known failing: two kernel tests' reasons as they fail on SMLib 5e8c9c1 (a partial selection running into an unblended tangent edge)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: two curvature rounds get 600 s, past the 180 s default, while G2 certification is slow (tangency-labs/smlib#96)
On the CI runners the boss root and the hole rim, both size-2/size-1 curvature rounds, build
correctly but take more than 180 s: the order-2 section's span certificate and the round's
definition are evaluated station by station. The per-case limit is the one the thread cases use.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Lid ring sketch test: find the ring under the pick, not by main's kernel's name
On SMLib the lip join's exact history names the lid underside's ring a piece
of the lid's own start (F14:start#[...]), as the naming rule says for a face
that came from the feature's input; main's kernel named it after the case's
top it rests on (F2:top). The test looked the ring up by that name and so
stopped before the attachment it guards. It now takes the underside piece
under the pick point, which the cap certificate attaches on either kernel.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Viewport culling test: each box's triangles from its mesh, not 12
SMLib meshes a 10 mm box in 108 triangles, so the hard-coded 12 a box stopped
the test before it reached the culling. The expected counts are now each
body's span in the scene.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Timeline chip test: a fillet that really reduces
The R20 fillet with fit reduce on one top edge of a 10 mm box builds on SMLib
without a reduced-radius warning, so the fixture had no warned feature. It
now rounds the four vertical edges at R6, reduced to the full round (5), as
the copy-warning test beside it does, and checks the warning says so.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Oracle: 34-chamfer-then-fillet and 35-fillet-curved-curved pass on SMLib 5e8c9c1 (their STEP edges are on their surfaces)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Known-failing: the shell of a fully rounded box opened at one face fails on SMLib 5e8c9c1 (tangency-labs/smlib#102)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Known-failing: the action matrix's oblique cylinder cut fillet passes on SMLib 5e8c9c1; two shells still fail
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the boss root's curvature round gets the rig's 1800 s cap: on the CI runners, 8 cases at a time, its G2 certification passed 600 s (tangency-labs/smlib#96)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: a case's continuity can ask for an order per seam (seams: [{order, edges, exact}])
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the pipe on a plate's curvature round meets the plate G2 and the pipe G3, 40307.8856312 (option B's order-2 jets, tangency-labs/solidcraft#10845)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Edge names: a seam names its one face once; the curve-id test reads every edge kernel-neutrally
A seam's two sides are the same face, and edge names list each face an edge
bounds once, so SMLib's extruded circle names its side's seam F2:side:c1, with
no separator. The name grammar now says one face also means a seam. The #5858
test no longer counts one '|' an edge: every part of every edge name is a
whole face name of the edge, one per face it bounds, two for the rims and one
only for the side's seam (checked to run bottom to top on the circle).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* rustfmt on the merged tree
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Known failing on SMLib: two of main's new tests assume truck's box mesh and fillet torus
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* SMLib: pin f916a8d (a round on a definition face is its definition; the G1 setback fill certified convex, setbacks too short refused naming the least; the G2 certificate halves a span no level can certify at once)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Fillet: a setback too short for its corner is refused naming the least that builds (smlib_blend_fit_size)
SMLib's setback corner takes a G1 fill only once certified convex, and refuses a setback too
short for that as SMLIB_ERR_NO_ROOM with SMLIB_FIT_SETBACK_AT_LEAST, the smallest setback that
builds. The kernel reads it (solidcraft-smlib binds smlib_blend_fit_size) and names it; the
Fillet dialog says it in plain words. Other room refusals keep their words. The r5 box corner
set back 5.5 is refused naming 5.962, which builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel tests: three rounds of different radii at a corner meet in SMLib's setback corner
Each round runs whole to its section square to its edge at its setback (the owner's rule, at
least 1.5 r, scaled to the least at which the G1 fill is certified convex), and the hole is the
setback split: one patch per round and the triangle in three quadrilaterals, 15 faces, G1.
Outside the box the sections span the body is the three strips', so its volume is theirs within
that box's. A later r3 round at the mitred corner makes the body all three at once make
(7928.142563938, 15 faces), as the engine and the model-cache tests have it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel tests: SMLib's own corner between curvature rounds is curvature continuous, as the G2 patch is
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the boss root's and the hole rim's curvature rounds take the default timeout again (37 s and 34 s on the box under the rig's parallel load, tangency-labs/smlib#96)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Agents: model decisions use exact geometry; a mesh is for display, export, previews and mesh bodies
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* xtask: mesh-decisions, model decisions use exact geometry; today's 176 mesh decision sites are listed and the list only shrinks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Sheet metal: cuts and holes pass over sheets and bends by their exact boxes, never a mesh's
A primitive cut skips the sheets kernel::apart (exact bounds grown by the record tolerance)
finds clear of its tool; the bend check leaves the clear case to kernel::boolean, which answers
it from the same exact boxes with no intersection work. The mesh-box helpers are gone, and their
four lines leave xtask/mesh-decisions.txt (172 sites left).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Agents: AGENTS.md loses a stray merge-conflict marker line at its end
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Locales: Vietnamese for the setback-too-short refusal, now that vi is a complete catalog
Main made vi a complete catalog; develop's new message (ui.fillet_error_setback_short) had no vi
entry, so every_complete_catalog_carries_every_english_message failed on the merged tree.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: exact volumes for 1213's bent-tube round and 4782's bar round, rel 1e-6
1213: the loft is a cubic skin through the five sections (ellipses between
them), not a torus; its volume 131601.597487935 by quadrature less the exact
rolling-ball removal 233.662461919 gives 131367.935026 (was a Pappus estimate
on a torus, 131360.148, at rel 5e-4).
4782: the section's area in closed form, 25 pi/3 - 5 sqrt(75) + 25, so
V = 630.2934873 (was a grid estimate, 630.293125).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Kernel rig: the boss root's and the hole rim's curvature rounds take 600 s again: under CI's parallel load they pass the 180 s default (develop 820b7b6)
They take 37 s and 34 s alone on the box, but CI runs 8 cases at once on slower runners. Their
G2 certificate cost is the open item (tangency-labs/smlib#106, moved to solidcore#2344).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* After the merge: clippy's auto-deref, and the mesh-decisions list for the merged tree
Develop's list was taken on develop alone. Main's code (tap-marking reach, cut and hole box
checks, join pieces, print faces, placed measuring, selection items, imported mesh payloads) and
the branch's own exact_edges and named_vertex use meshes too; three listed functions were renamed
by main (face_outline and plate_recesses into FaceSlice, paste into build).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* After the merge: main's new tests on the SMLib kernel
- Cut To the far side of a curved wall (#8634): the tool stops past the first crossing of the
face ahead of the profile; SMLib's whole bore is one face that a line crosses twice, so the
single-crossing rule found none and the cut took nothing.
- Clearing view analyses goes through refresh_display, as main's #10687 made the others, so an
open feature editor keeps OK and Cancel after Zebra.
- vi, a complete catalog on main, gets the setback-too-short message.
- fillets/KNOWN_FAILING: 4782's cause is now its continuity check (SMLib f916a8d builds the
expected volume).
- Known failing, as main's tests assume truck: the spline wall's spans as one mesh patch, a
hole touching an edge at a point leaving one body, and a copy of a copy's triangles matching
a fresh mesh.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEu4Lr3moCCisdZShKz
* Twisted sweep: circles about a straight path are exact cylinders (solidcore#2184)
A twist about a straight path maps a profile circle centred on the path's
line onto itself, so its swept wall is exactly the cylinder. The skin
through the stations stayed within 3.9e-9 of it (6.6e-9 on the outer wall),
and a boolean with another body on that cylinder failed with status 1001
(solidcore#2184; the kernel's handling of a B-spline face lying on a
cylinder stays open there).
sweep_controlled now builds those walls exactly when the path is lines
along the profile's normal and there is no end scale or rails: a profile
whose every loop is such a circle is swept untwisted, and such holes in
another outer loop are cut as exact cylinders from the skinned sweep of
the rest. Other loops, and an axis-centred arc inside a loop of other
curves, are skinned as before; a failed cut falls back to skinning all.
Regression test in smlib_sweeps_tests.rs: #2184's tubes joined at 10, 16,
18, 20 and 30 degrees give one closed body of 11.5625 pi with cylinder
walls; a twisted hexagon with the bore keeps a cylinder bore.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEtwSrdwZxqTQp5MfnU
* After the merge: a hole that misses is found by exact boxes; a face is a one-face patch; main's mesh-box helpers gone
- `hole_misses` (main's #10701, through brett's branch) decided from the targets' mesh boxes. It now uses their exact boxes (`Body::exact_bounds`). An unknown box still leaves the hole not known to miss.
- With #10303's two shortcuts and `hole_misses` off the mesh, `body_box`, `mesh_box` and `padded_box` have no caller left, and are deleted.
- `project`'s intersection link passes its one face to `meeting_edges` as a one-element patch. This branch picks one face, not #9009's mesh patch.
- xtask/mesh-decisions.txt drops the six sites that no longer use a mesh here: `apply_traced_with`, `cut_end_past_face`, `beyond_cylinder_reach`, `hole_misses`, `body_box`/`mesh_box`/`padded_box`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* After the merge: split_move's Result reaches its callers; to_local's duplicated move check goes
`frames::split_move` returns a Result on this branch: an unplaceable model is an error, not a silent no-split.
- Move/Copy of a component (main's #9914) propagates it, as its other calls do.
- `to_local` had the solid.move check twice after the merge (brett's Option one and ours). Ours stays, after the no-picks/not-placed return.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* After the merge: main's two new tests take world_state's Result, as the rest of their files do
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Native B-rep: a ball patch is its own surface kind, read from and written to SMLib's flat kind 6
SMLib's flat arrays now carry the corner of three equal rounds as `SURFACE_BALL_PATCH` (kind 6): its net as a NURBS face's block, with its sphere's centre and radius as its definition (ids 36 and 166). The record reads it as `ball_patch {center, radius}`, a label like the analytic kinds, with the net as its `nurbs`. A plain sphere with a form won't do: the net is not a piece of SMLib's sphere NURBS, so SMLib's `IsNurbSurfaceSphere` would refuse it.
Written back, a ball patch is kind 6 with the same definition, which SMLib takes once its net is certified on that sphere. Elsewhere:
- Offsets classify it as its sphere, so its offsets stay exact and collapse at the centre.
- Face kinds count it as a sphere: fillet_three_edges_at_a_corner's corner is now `sphere`, no longer `other`.
- STEP, which has no ball-patch entity, gets the net as the face's B-spline surface, pcurves included.
- Iso curves and SSI of the label are refused; the face's form is what evaluates.
Test: a_rounded_cubes_ball_patches_go_round_with_their_spheres. The cube's eight corners are ball patches about the corners pulled in by r. Points of each patch lie on its sphere to 1e-12. The patches are kind 6 again after import, with the same definitions bit for bit, and the closed-form volume holds.
Format: pending/ball-patch-faces.rs. Docs: docs/native-brep.md and the rig README's `surface_types` (`ball_patch`).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* SMLib: pin v1.1.0-alpha (a18bbe5): the generic blend's step-4 corners, the Ball's sphere patch through the flat arrays, all-target CI
Since f916a8d:
- #120: every target again, plus the warnings fix;
- #121: the Ball's patch as flat kind 6 with its sphere, read by the previous commit;
- #122: tests gated on counts;
- #123: the Mixed corner;
- #124: the End at a smooth vertex;
- #125: four or more rounds, and open setbacks;
- #126: the equal-area thumbweight guard;
- #127: the trunk merge.
The SMLIB_PREBUILT checksums are from the release prebuilt-a18bbe5…, written by `scripts/fetch-smlib.sh --pin`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* smlib export tests: rustfmt's line for the rounded cube's edge midpoints
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: the fillet and ladder results on SMLib v1.1.0-alpha, the new failures recorded with their reasons
Fixed (off the known-failing list): the Mixed corner's peg cases and the concave arc with the front top edge (smlib #123), and the 40° boss junction (smlib #124). Eight cases in all.
New failures, recorded as they are, each with its reason. They passed on f916a8d.
- **Six cases grade a blend seam G0 where G1 (or G2) is wanted,** at the end of the round's contact seam, after smlib #124's End at a smooth vertex. Two of them also shift in volume.
- **Four cases come back unsupported** after smlib #125, which leaves setbacks to the Setback's corners only.
- **Ladder 07/012** makes 9 faces, 20 edges and 13 vertices, where its golden had 8, 18 and 12. Its golden entry is the new result, with the reason added.
Whether each change is by design or a defect is being established. A defect is fixed in solidcore, where the End and the Setback are being brought over (#2364, #2365), not in the frozen SMLib.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel ladder: 07/021 and 06/018 recorded as they are on SMLib v1.1.0-alpha, each with its reason
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel ladder: a golden case marked unstable is gated on its status, and 06/018 is marked
On SMLib v1.1.0-alpha, 06/018 makes 597 or 594 edges from the same input:
the union's post-process keeps pointers to edges it has deleted. A golden
entry's `unstable` reason makes the gate compare that case's status only
and name it in its output; recording keeps the reason, and only an edit of
the golden removes it. v1.1.0-alpha.1 fixes the cause and removes the mark.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* After the merge with main: its new code on develop's exact bounds, types and thread fields
- The sheet cut's cull (#10301) and the tapped wall's (#10227) use each
body's exact box (`exact_box`), not its display mesh.
- model.threads replies with develop's thread fields: form, hand (right,
left or both) and starts.
- surface.boundary's schema checks a network curve's continuity as the
handler does, and words a list entry's error as it does.
- Main's new tests take develop's Hole fields and world_state's Result.
- mesh-decisions: contact_sweep's triangle check is now `depth` (main
split `hits`).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Known failing: the 14 cargo tests SMLib v1.1.0-alpha fails, with what each sees; two cases that pass now
Develop's CI after the a18bbe5 pin (run 41522001173) fails 14 tests that
passed on f916a8d, and passes two listed ones. Each new line says what the
test sees on v1.1.0-alpha; v1.1.0-alpha.1 fixes the setback hole's cause.
shell_tangent_chain_that_opens_every_face_explains_how_to_keep_walls and
oracle 37-pyramid-apex-blend pass and leave their lists.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Cargo.lock: develop's profile, smlib and step crates at main's 0.30.1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: main's six new sketch-only commands are exempt from a kernel case
sketch.construction_line (and its horizontal and vertical forms) and
sketch.spline.insert_point, remove_point and reverse change only the 2D
sketch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Cuts leave the bodies their tools can't reach, by exact boxes (#10225 on exact geometry)
- The per-target cut loop skips a body whose exact box lies clear of
every tool's, as main's version did with mesh boxes. The sheet culls
(#10226, #10301) and this one now leave the far sheets and bodies alone:
a_cut_leaves_bodies_it_cannot_reach_as_they_were passes and leaves the
known-failing list.
- a_cut_still_runs_where_its_tool_touches_grazes_or_meets_a_curved_face:
a tool 0.5 µm clear of the block is now left out (exact boxes; 0.5 µm is
far past the bodies' tolerances); touching and 0.1 mm in still cut.
- Known failing, with reasons: main's edge lookup by a stored point
(#11286, on the display mesh) is not taken; SMLib refuses the
wrong-way chamfer for its tangent chain first.
- EXEMPT: main's eight new sketch-only commands.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: main's new view, rendering, appearance and settings commands are exempt from a case
62 of the commands main added change no geometry: the view and render
panes, rendering lights and results, appearance tools, settings profiles,
point clouds (drawn as points, never a body), the selection, two sketch
edits, component links and History bar visibility, edit.repeat,
timeline.play, inspect.compare_picture (a picture against the outline),
and component.paste_from_design, which pastes the app's cross-window
clipboard that no command fills. Each joins EXEMPT's first section under
its family's reason.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: construct.plane.axis_point gets construction cases
The plane through a box edge and its far corner, graded against its
closed-form normal (0,-2,3)/sqrt(13) through the origin, and the refusal
of a point on the axis.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: assembly cases for mass properties, align, find limits and moving items between parts
- assembly.mass_properties: two boxes (2 g/cm3) in a rigid group: mass
0.006 kg, centre (18.333,5,5), inertia diag(0.1, 1.0333, 1.0333) kg mm2
by the parallel-axis theorem.
- occurrence.align: a block's end face onto a base's top face: a quarter
turn about y, centre (70,20,20), box (65,15,10)-(75,25,30).
- joint.find_limits: a slider between two stops: min -20, max 10 mm.
- component.move_features, browser.reparent and
component.move_sketches.to_parts: items moved into a turned and moved
part keep their world place (volumes, centres and boxes by hand).
The mass case assigns a material it creates, so material.create and
material.assign leave EXEMPT. PATHS names the new command modules.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
* Kernel rig: export and print face cases in the import area
- file.export_step, export_stl, export_3mf, export_obj: a 30x20x10 box
written and read back (the meshes converted to a solid): V 6000,
A 2200, 6 faces, box (5,-10,0)-(35,10,10).
- file.export_urdf: a hinged arm on a grounded base: 3 links, 2 joints,
and the base's mesh, written in metres, reads back as the
1 x 0.5 x 0.2 box (V 0.1, A 1.6).
- body.print_face: a cylinder's flat end is accepted, its side refused.
PATHS adds the URDF writer and the print face modules.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
---------
Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: brett19 <brett19@gmail.com>
39 commits, squashed; the originals stay reachable from tag archive/merge-main-develop. These commits sit on several merged branches, so the wave holds their combined result.
- 1b17dd7f5 brett19: Merge fixes: every crate and test target compiles on the merged tree, but for crates/geom's hlr
- 8f2c11da2 brett19: Drawings hidden lines: read develop's B-rep records
- c30ca0216 brett19: Hidden-line fixtures: build develop's records from the fixtures' data
- 5dd2509ae brett19: Hidden lines: tests of the bounded edges, face charts and placed revolutions
- 1642df0ea brett19: drawing-hlr doc: what is drawn and refused on develop's records
- ddcb80c8e brett19: hlr tests: a placed revolution is refused when its placement is not rigid
- e4977721f brett19: Hidden lines: a traced intersection is drawn only where its spline lies on both surfaces
- b3ef6ae52 brett19: Hidden lines: kernel bodies through the production prepare against closed forms
- 4cd2ae062 brett19: Tests from main: the world state is a Result here
- 51d7ad09e brett19: A blend's pick measures close edges on their curves, not their polylines
- 11a89713c brett19: Merge fixes from the first SMLib test pass
- 48fcb7aac brett19: Merge fixes from the ui test pass and the gates
- abd739855 brett19: A silhouette takes its facing from the surface's normals
- 85114c5a2 brett19: Clippy and rustfmt on the merged tree
- 55a46569f brett19: Stepwise open checks every feature under the session's mode
- 4627402e4 brett19: Clippy without SMLib: the planar-sheet edge reader is built only with it
- 5fbece0ac brett19: STEP import: a ball's halves whose seams are off each other's quarter lines each form within one turn
- eb78d20b0 brett19: Lid ring sketch test: find the ring under the pick, not by main's kernel's name
- 3048d8c49 brett19: Viewport culling test: each box's triangles from its mesh, not 12
- dc88b80e2 brett19: Timeline chip test: a fillet that really reduces
- 876203621 brett19: Edge names: a seam names its one face once; the curve-id test reads every edge kernel-neutrally
- 900635710 brett19: rustfmt on the merged tree
- b7e83cd7c brett19: Known failing on SMLib: two of main's new tests assume truck's box mesh and fillet torus
- 63bde053a jyviko: Locales: Vietnamese for the setback-too-short refusal, now that vi is a complete catalog
- 967a1caa6 brett19: Kernel rig: exact volumes for 1213's bent-tube round and 4782's bar round, rel 1e-6
- 82c821d2a brett19: After the merge: clippy's auto-deref, and the mesh-decisions list for the merged tree
- 5862ee223 brett19: After the merge: main's new tests on the SMLib kernel
- be78372b2 brett19: Twisted sweep: circles about a straight path are exact cylinders (solidcore#2184)
- 312d14500 jyviko: After the merge: a hole that misses is found by exact boxes; a face is a one-face patch; main's mesh-box helpers gone
- 6f7e51acb jyviko: After the merge: split_move's Result reaches its callers; to_local's duplicated move check goes
- 8f0c79b20 jyviko: After the merge: main's two new tests take world_state's Result, as the rest of their files do
- 5f4d70061 jyviko: After the merge with main: its new code on develop's exact bounds, types and thread fields
- 2b2ab6627 jyviko: Cargo.lock: develop's profile, smlib and step crates at main's 0.30.1
- e6a4b0a9a jyviko: Kernel rig: main's six new sketch-only commands are exempt from a kernel case
- 5acbd2e71 jyviko: Cuts leave the bodies their tools can't reach, by exact boxes (#10225 on exact geometry)
- d2b202307 jyviko: Kernel rig: main's new view, rendering, appearance and settings commands are exempt from a case
- 21db090ba jyviko: Kernel rig: construct.plane.axis_point gets construction cases
- c1f45cae2 jyviko: Kernel rig: assembly cases for mass properties, align, find limits and moving items between parts
- 084695416 jyviko: Kernel rig: export and print face cases in the import area
Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 4e01031bc jyviko: smlib export tests: rustfmt's line for the rounded cube's edge midpoints
- c29190ec3 jyviko: Kernel rig: the fillet and ladder results on SMLib v1.1.0-alpha, the new failures recorded with their reasons
- 62d372cc1 jyviko: Kernel ladder: 07/021 and 06/018 recorded as they are on SMLib v1.1.0-alpha, each with its reason
- 2bf58241f jyviko: Kernel ladder: a golden case marked unstable is gated on its status, and 06/018 is marked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- b8fa0d8aa brett19: Known failing on solidcore after the f916a8d sync; blend_fit in the entry-point guard
- 5a93e6c4d brett19: Make the C++ SMLib kernel opt-in at build time (feature smlib, off by default)
- 29a148abd brett19: CI: build without the C++ SMLib kernel except where a job needs it
- e30cfd2ac brett19: Tests and the rig for a default build without the C++ kernel
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d3902c954 jyviko: SMLib: pin v1.1.0-alpha (a18bbe5): the generic blend's step-4 corners, the Ball's sphere patch through the flat arrays, all-target CI
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 4c1eed960 brett19: Tabbed plate: the rim and one corner arc round together (solidcore#2223)
- dd00ff989 brett19: Native wire fixture: a box edge round's cylinder keeps its own frame
- 584075662 brett19: Known failing on solidcore after the smlib merge: SMLib 5e8c9c1's new blend (solidcore#2273) and main's new tests
- 8af1fdf5a brett19: Known failing on SMLib (the .smlib list): as the smlib branch lists them at f916a8d
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 597b23ba8 jyviko: Sheet metal: cuts and holes pass over sheets and bends by their exact boxes, never a mesh's
- 820b7b667 jyviko: Agents: AGENTS.md loses a stray merge-conflict marker line at its end
- 92734d7eb jyviko: Kernel rig: the boss root's and the hole rim's curvature rounds take 600 s again: under CI's parallel load they pass the 180 s default (develop 820b7b6)
- 653c16e6f jyviko: Native B-rep: a ball patch is its own surface kind, read from and written to SMLib's flat kind 6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- ad3ee0585 jyviko: Agents: model decisions use exact geometry; a mesh is for display, export, previews and mesh bodies
- 608d07eca jyviko: xtask: mesh-decisions, model decisions use exact geometry; today's 176 mesh decision sites are listed and the list only shrinks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5136898b9 jyviko: Fillet: a setback too short for its corner is refused naming the least that builds (smlib_blend_fit_size)
- e6db7be0a jyviko: Kernel tests: three rounds of different radii at a corner meet in SMLib's setback corner
- 5d168a5e2 jyviko: Kernel tests: SMLib's own corner between curvature rounds is curvature continuous, as the G2 patch is
- 99953687c jyviko: Kernel rig: the boss root's and the hole rim's curvature rounds take the default timeout again (37 s and 34 s on the box under the rig's parallel load, tangency-labs/smlib#96)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- aed047703 jyviko: Kernel rig: the pipe on a plate's curvature round meets the plate G2 and the pipe G3, 40307.8856312 (option B's order-2 jets, tangency-labs/solidcraft#10845)
- 17de3569f jyviko: SMLib: pin f916a8d (a round on a definition face is its definition; the G1 setback fill certified convex, setbacks too short refused naming the least; the G2 certificate halves a span no level can certify at once)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- f9fc68167 brett19: solidcore: a curvature fillet is the equal-area Gⁿ section; mixed wedges refused
- d52cf6b14 brett19: Known failures at solidcore adf26ddbc: curvature and variable rounds built
- 5ec92b0ba brett19: Move the solidcore pin to 2dbd88b6e
- 92618ac4c brett19: Turn on solidcore's new fixes at 2dbd88b6e
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- e30e983c3 brett19: Move the solidcore pin to 4d3ce6264
- c8351719e brett19: Move the solidcore pin to adf26ddbc
- d33b6eb30 brett19: Turn on fillet_gn_section_generator
- 3b4adeb73 brett19: solidcore: a variable round is built again, as the union of its balls
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 4a4d9c31c jyviko: Known-failing: the shell of a fully rounded box opened at one face fails on SMLib 5e8c9c1 (tangency-labs/smlib#102)
- 303111e4e jyviko: Known-failing: the action matrix's oblique cylinder cut fillet passes on SMLib 5e8c9c1; two shells still fail
- c5332faf4 jyviko: Kernel rig: the boss root's curvature round gets the rig's 1800 s cap: on the CI runners, 8 cases at a time, its G2 certification passed 600 s (tangency-labs/smlib#96)
- 970446dec jyviko: Kernel rig: a case's continuity can ask for an order per seam (seams: [{order, edges, exact}])
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 72109054c jyviko: Kernel tests: the box-and-fillet wire fixture records the round's cylinder frame as SMLib now keeps it
- f87305648 jyviko: Known failing: two kernel tests' reasons as they fail on SMLib 5e8c9c1 (a partial selection running into an unblended tangent edge)
- 75efb8f0c jyviko: Kernel rig: two curvature rounds get 600 s, past the 180 s default, while G2 certification is slow (tangency-labs/smlib#96)
- 68c3ccb75 jyviko: Oracle: 34-chamfer-then-fillet and 35-fillet-curved-curved pass on SMLib 5e8c9c1 (their STEP edges are on their surfaces)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d5cd5f303 jyviko: Known failing: two 851 chains whose corner piece is a ball of tube-centre radius 0
- ea49dff48 jyviko: Ladder: 016 and 018 refused, their r3 chain takes the vertical edge; 020 and 021 recorded
- 38385ab5d jyviko: Kernel tests: three rounds at a box corner end on one rational patch on the ball's sphere, not an analytic sphere
- 459937e52 jyviko: Kernel rig: the curvature round on a pipe on a plate is listed: a seam grades G3 where exactly G2 is wanted
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 9f64cce54 brett19: solidcore: a variable-radius fillet is refused until solidcore builds the union of its balls
- bd4dc081d brett19: Known failures on solidcore after the merge: the refused curvature and variable rounds, develop's new cases
- c6fa7e563 brett19: Move the solidcore pin to c9a06dc7c
- de9a654db brett19: Turn on solidcore's new fixes at c9a06dc7c
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- ce8b01fa3 jyviko: Kernel rig: the partial-selection cases kept as -partial-chain copies, tangent chain off
- 78ed75162 jyviko: Kernel rig: the concave arc between the block's tangent sides kept with tangent chain off
- ee3ed66a4 jyviko: Kernel rig: two chains that now build graded by their exact volumes
- f2ff6f0d4 jyviko: Kernel rig: a curvature chain round a round's end refused for its size; the concave half circle builds
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- bf51e62f7 jyviko: Kernel tests: a law's dip shows its corner ball's sphere, a peak's two rounds cross (the reasons had them swapped)
- cde8be4a1 jyviko: Reference tests: the variable rounds 77, 78, 80 and 81 expect the union of their balls
- 155f1f470 jyviko: Known failing: the law corners' kernel and crate tests and rig 1207 pass on SMLib 48ea616
- 21f00a917 jyviko: Kernel rig: every fillet and chamfer case rounds its tangent chain
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e8caa1e91 jyviko: Tests: three rounds of different radii at a corner listed: the corner's transition kinks with the balls' touch circles
- 60393a718 jyviko: Ladder: the variable rounds graded to 1e-6 by the union of their balls; 012 by its law going on past the edge
- 6ba069d06 jyviko: Reference tests: the variable rounds 77, 78 and 81 pass on SMLib d01d7b0; their known-failure marks come off
- e24eb7789 jyviko: SMLib: pin 5e8c9c1 (the new blend's corners: Ball and End/Join; exact fold and room checks with fit sizes; overflow in place; the round as its definition)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 02de15f90 brett19: Move the solidcore pin to 9fb13f145
- 09b646005 brett19: Turn on solidcore's new fixes at 9fb13f145
- c494a18f9 brett19: Rig: the reimported peg's rounds fail as the peg's do
- e9ac0e606 brett19: solidcore: a curvature fillet is refused until solidcore has the equal-area Gⁿ section
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- a1b4119c3 brett19: Turn on geometric_g2_continuity: 2992's slowdown is gone
- f2ce343a0 brett19: Known failures after the new fixes: four tests and a rig case pass
- b57c24f7f brett19: Known-failing tests: the tabbed plate cites solidcore#2223
- 0aff35705 brett19: Merge fix: solidcore reads planar sheets without SMLib, so their edge reader is always built
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- fb851d9c2 brett19: Known-failing tests: main's four tests that fail on solidcore as on C++
- 6de10a7fb brett19: Model cache test: say why it reaches the C++ kernel
- 84bca5969 brett19: Move the solidcore pin to c931c9641
- e1b76bdfc brett19: Turn on solidcore's new fixes at c931c9641
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 15c5cd5d5 brett19: Known-failing tests: cite the solidcore issues now filed
- 462738b6a brett19: Known failing after the smlib merge: the r5 test-peg corner on solidcore, main's C++ test lines
- 4a98a1f8a brett19: Model cache: a saved model is its kernel's
- 9c2388ef8 brett19: Geometry kernel strings in Vietnamese, now a complete catalog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 01e2e939e jyviko: Variable rounds: graded by the union of their balls (their envelope), not the balls' great circles
- 7bba3092c jyviko: Kernel tests: variable rounds graded by the union of their balls, the removed volume to 1e-4 of itself
- 0b1cc8a8c jyviko: Kernel tests: a spline radius whose balls fold over one another at its peak is refused
- 1745e5c38 jyviko: Kernel rig: the variable round on its cone passes (the round is the balls' envelope)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- afb55d806 brett19: One kernel flag: solidcore, the default, or smlib; routed is gone
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 3908128a8 brett19: Known-failing tests: refreshed from the default run at solidcore de85a3e00
- cd94f78f3 brett19: Rig: --route is gone; a run has one kernel
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- cf5e0e3c1 jyviko: Kernel rig: a junction family: oblique wedges 30 to 150 degrees rounded and chamfered (exact), bosses upright and tilted, pipe tees and a Y junction
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 7577e032f jyviko: Kernel rig: the turn at a corner of two rounds, Mitre (the default) and Swept, at a pocket's floor and a boss's base, by exact volumes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 922ee28f3 jyviko: Kernel rig: the section orders, chord, circle and curvature section, on planes and against a cylinder
- 19455396b jyviko: Kernel rig: the curvature fillets' expected bodies from the order-2 section at thumbweight 0
- 4df3adc5a jyviko: Curvature fillets: the section's default thumbweight is equal area, so the round's volumes are the circle's
- 539d12648 jyviko: Kernel rig: four G2 corners wait for the corner step: their patch meets the new section's rounds G1 at one face seam
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- aa41c0b5d jyviko: Kernel rig: the fillets known-failing list is the 22 cases that fail on SMLib 7ac037e
- 05f5e8601 jyviko: Kernel rig: #316's bottom rounds as large as the wall, or larger, shell with a step wall at the opening, not refused
- 9d4f78001 jyviko: SMLib: pin d01d7b0 (the new blend's one Gⁿ section generator: the chord, circle and curvature sections, and the variable rounds as the union of their balls)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 75229f2b9 brett19: Offset tests: a sphere moved to its centre leaves nothing again (solidcore#2092 fixed by #2096)
- 6221b7f4b brett19: Rig: solidcore known-failing lists at pin de85a3e00
- b04e363e7 brett19: Rig: #316's renamed shell cases pass on solidcore, off its known-failing list
- c786db6bf brett19: A blend's pick measures close edges on their curves, not their polylines
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 197cd4f43 brett19: Booleans: the copies no longer take an index
- 0f843c295 brett19: Pin solidcore at main de85a3e00 (#2080, #2081, #2086, #2095, #2096, #2097, #2102, #2103)
- 0b48548af brett19: Turn on solidcore's new fixes and take the rational-span flag off HELD_BACK
- d0c95f0dc brett19: Chamfer: second offsets through SetFilletParameters (solidcore#2095)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 1bf9c8665 brett19: HELD_BACK: geometric_g2_continuity is a fourfold slowdown on 2992, not a hang
- 126a281bb brett19: Pin solidcore at main c093bc5a3 (#2054, #2060, #2061, #2065, #2066, #2068, #2069, #2072, #2076)
- 5d59d42d8 brett19: Turn on gap_samples_non_bspline_v_stride, gap_array_append_updates_longest, imprint_skips_collapsed_definition
- 1c90e60aa brett19: Working copies by solidcore's brep_copy, not our own key domains (#2047 fixed by #2055)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 32b26888c brett19: Turn on offset_keep_cavity_regions and offset_four_face_vertex_split
- 38849d7b0 brett19: Hold geometric_g2_continuity: with the rational-span flag off, 2992 and 3368 don't end
- 5d7dca1a9 brett19: Offset tests: both kernels refuse a top moved -9; the sphere to its centre waits on solidcore
- da4db59a3 brett19: HELD_BACK: geometric_g2_continuity's reason is 2992 alone
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 19014f38a jyviko: Kernel rig: constant rounds of the exact classes, and a tee's round
- 73416a9bf jyviko: Kernel rig: the exact-class rounds pass on SMLib's classified exact rounds
- 60923d8cc jyviko: SMLib: pin 7ac037e (the new blend's tangent-end event, zero-speed G2 ends, and its exact-class rounds)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 2b1a63d3f brett19: Pin solidcore at main 2898e1197 (#2053)
- 9337aff4c brett19: Every solidcore fix on unless it appears broken (brett19's rule)
- 2cd566aae brett19: Hold bspline_trim_keeps_rational_end_spans: it fails 3078's check
- 9df34988c brett19: Pin solidcore at main bb6b65706 (#2049, #2051, #2055)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- eff6416d4 brett19: Pin solidcore at main f75e9d2e8 (#2023, #2024, #2034-#2040, #2043-#2045)
- 15e3a61da brett19: Pin 8: decide the new solidcore flags against the fork at 26cc451
- 6a0166853 brett19: A round mitred to one that overflows goes first with it (fork 9ba2b12); flags() and warnings
- d4eb66f25 brett19: Turn on offset_splits_corner_vertices (fork 2e1bb8c's behaviour)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 8ad306e69 brett19: boolean2d through boolean_2d, typed edge-vanishes, typed put-back refusal
- b6285e525 brett19: Overflowing rounds go first again (solidcore#1980)
- 2647b12e5 brett19: Hold back fillet_refuse_crossing_rails: not in the fork
- 0b627d637 brett19: Restore all_solid's loop: an unused index slipped in
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- a3165f62d jyviko: Rig: fillet corners graded curvature-continuous, the default to be
- be0b1b39b jyviko: Rig: the test-peg's front chamfer builds
- 6cd4003ad jyviko: Rig: the curvature-continuous corner cases pick the curvature fillet
- 4401ffb1f jyviko: Rig: the test-peg's concave chamfer, alone and after the front chamfer, builds
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 83487c4d9 brett19: Pin solidcore at main 9f2c980b3 (#2004, #2005, #2006, #2008)
- aca0b57ee brett19: Turn on plane_recognition_origin_after_axes
- 5c0279153 brett19: Pin solidcore at main c369f8801 (#1977, #1996, #2000, #2016, #2017, #2018, #2027 and more)
- 14b1d1956 brett19: Pin 7: decide the new solidcore flags against the fork
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- ec3a21778 Brett Lawson: smlib: a blend on solidcore has a history, as on the C++ kernel
- 03470c3df brett19: Pin solidcore at main 9dde25e97 (#1988, #1997, #1985, #1940, #1974, #1975, #1976)
- f01b87757 brett19: Audit the held flags against the fork's source; tabbed plate and mitred rounds parity
- 9b73dfe74 brett19: Offsets go through solidcore's simple calls; ignored tests cite solidcore issues
Co-authored-by: Brett Lawson <brett@Ubuntu-resolute-latest-amd64-base.zst>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 88e00486b jyviko: STEP import: a face bounded by a slit alone is the whole of its closed surface
- 3c16884f7 jyviko: Rig: the test-peg's concave arc and front top edge rounded together stay within the body's box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 57edcf61a jyviko: Kernel rig: the oblique-cut round keeps its old grade until the new blend algorithm lands
- a250062c2 jyviko: Kernel rig: 1985's enclosure is 78 x 77 (74 and 73 inside, 2 mm walls); its volume 38063.827 by hand
- b0d1ba345 jyviko: Kernel rig: the three spline walls' face counts wait for the one-wall decision; their volumes grade them
- 77f127c61 jyviko: STEP import: a face bounded by seams alone runs its loop the other way, never turns over
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 889a2f866 jyviko: Kernel rig: the cut mirrored loft graded on the box its sections pin
- 37a4c5647 jyviko: Kernel rig: the three modelled-thread joins and the fine M48 graded on their volume (the basic profile's groove, Pappus)
- 6c2a2f395 jyviko: Kernel rig: the oblique-cut round graded by its seams (tangent, not curvature-continuous); the flanged rhombus says what it tests (its reliefs stay apart at 60 mm)
- cd56cd3ad jyviko: Kernel rig: 3841 is 168's rim touching its coin along a circle, and 4092's reduced recipe is its report less a flange clear of the failing join; the kept cases carry their sources
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- f6847c97c jyviko: Kernel rig: the base with two adjacent flanges and a hole graded on its volume (base, bends and panels folded)
- bfdb79418 jyviko: Kernel rig: the flange beside the ledge graded on a volume range (the flange's two readings of its length)
- 130f2adaf jyviko: Kernel rig: the two G0 window patches graded on the box the part they close keeps
- 8e0f6403c jyviko: Kernel rig: the hub's six swept grooves graded on its volume (the revolved hub less each tube's part inside it)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 49c7b982e jyviko: Kernel rig: the chamfered corner of the lipped shell graded on its volume (the chamfer's triangle through the wall)
- 0bcc24ccd jyviko: Kernel rig: the concave round into the peg's cylinder graded on a volume range (the torus it must add, the band it can't leave)
- 27b7e202a jyviko: Kernel rig: the two folded 72 degree trays graded on their volume (flat area x thickness) and the walls' reach
- 9b4162a33 jyviko: Kernel rig: the flanged rhombus graded on its volume (flat area x thickness, all four reliefs cut) and its walls' ends
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- f2aba03f8 jyviko: Kernel rig: 616 graded on its volume (the lid less its 0.5 mm-offset cavity, sharp to rounded concave edges) and box
- 764719c53 jyviko: Kernel rig: 391 graded on its volume (the shelled housing, sharp to rounded at the flange, less the letters' 0.6 mm deboss) and box
- 4b512f69e jyviko: Kernel rig: shell/3576 was the ladder's drafted box with rounds shelled, recipe for recipe; the ladder case grades it and carries #3576 and #3573
- 63dd6ae6f jyviko: Kernel rig: the two 851 chamfers of 2 graded on their volume (the cone's sweep, and its union with the front edge's prism)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- a53f1640e jyviko: Kernel rig: the up-down squares shell graded on its volume (the columns less the 0.346 mm-offset cavity, sharp to rounded concave edges) and box
- be8e728cd jyviko: Kernel rig: 545 graded on its volume (the frame less its 0.5 mm-offset cavity, sharp to rounded concave edges), its sealed pillar void and box
- edb558bd1 jyviko: Kernel rig: the shell-again case graded on its volume (the shelled box less the 0.5 mm-offset cavity in its walls) and box
- fd9d159f4 jyviko: Kernel rig: the arc-sided plate shell graded on its volume (sharp to rounded at the hole's bottom), faces and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- c740e4de1 jyviko: Kernel rig: 1494 graded on its volume (box and cylinder less the 1 mm-offset cavity, sharp to rounded concave edges) and box
- ba75de350 jyviko: Kernel rig: 4492 graded on its box and a volume range (the face's 19 mm sweep added, within the block's sides)
- bdb321cdb jyviko: Kernel rig: 745 graded on its volume (the end moved 1 mm plus the spline boss's exact area), faces and box
- 1893a5016 jyviko: Kernel rig: 4567 graded on its volume (the revolved spline less its revolved 2 mm offset), faces and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d54d3195f jyviko: Kernel rig: 4542 fluted wall joined on a revolved base graded on its volume and box (the base by Pappus plus the fit-spline ring)
- c0c961326 jyviko: Kernel rig: 1985 and 2243 STEP-export enclosures graded on their volume and box (the outline less the cavity, plus gusset and standoffs)
- d77aac416 jyviko: Kernel rig: both 4092 loft, ribs and pad unions graded on their volume and box
- e30459e52 jyviko: Kernel rig: 1525 graded on its volume (the convex body's exact 2 mm inward offset), faces and box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 7fdbd5ab6 jyviko: Kernel rig: 4879 window cut through a thickened spline revolve graded on a volume range and its faces
- 18c8add3f jyviko: Kernel rig: 4623 join of crossing pleated loft skins graded on its volume and box (both skins less their overlap)
- 5fb3cfa8a jyviko: Kernel rig: 831 tapered glyph extrude graded on a volume range and box (the font's S drafted in by 10 deg)
- 34e404d38 jyviko: Kernel rig: 2357 ring of 90 cylinder segments graded on its volume and box (the segments less their 90 joint overlaps)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d3c8c36ec jyviko: Kernel rig: 3243 rim and tooth join graded on its volume (rim plus the trimmed tooth less their 0.01 mm overlap)
- 9aa2651b1 jyviko: Kernel rig: 3782 emboss on a cylinder graded on its volume, area, faces and box (the wrapped 4 x 5 badge raised 1 mm)
- 391fc51b4 jyviko: Kernel rig: 3604 G2 swept-tool cut graded on a volume range (filleted box minus the swept corner section)
- 166d574cc jyviko: Kernel rig: 4505 coil joined through a cylinder wall graded on its volume, area and box (cylinder plus the wire's screw-swept segment outside r 76)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5e348ae2a jyviko: Tests: rustfmt the board fixture example and the coplanar asserts
- 033d1a122 jyviko: Kernel rig: the two 3871 cone cases were byte-for-byte the 258 cases; the 258 cases carry their sources
- 780a0652d jyviko: Kernel rig: a volume or area can be graded as a hand-derived range where analysis only bounds it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 43551498d jyviko: STEP import test: a seam sphere whose meridian stops short of the pole imports as the whole 2 mm ball
- 6704d3094 jyviko: Material tests: the nine copies in material_properties go; the persistence file checks the library copy's card and formats 20 and 21 in one loop
- 94acc0c43 jyviko: Sample test: one loop checks every sample builds cleanly and without a panic; the robustness copy goes
- 88c7cb6a8 jyviko: Known failing: the non-antipodal seam sphere import, refused for a loop of no (u, v) area
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- f81c4b157 jyviko: Chamfer history test: the chamfer after each box cut is exactly one face on the painted block too
- 9c0d6bd1f jyviko: Grid test: a pole side's face is the five triangles fanned from its one grid node, none degenerate
- 648413556 jyviko: Kernel tests: the twelve ignored print-only debug tests and surveys go; coplanar_curved_booleans checks the flush-capped cylinder cuts and unions they printed
- 35805f899 jyviko: Kernel: the #883 board fixture generator is an example, not an ignored test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 16bef1097 jyviko: Shell regression: the saddle-corner shell opened on the top box's side has its exact volume
- 699ddb6b3 jyviko: SMLib history test: every operand's order is the identity on its record's faces and edges
- ec421252d jyviko: Boolean history tests: the SMLib module's box-minus-sphere, box-minus-cylinder and box-union-box copies go; the top-level ones check more
- f87f22874 jyviko: Modify history tests: shell, offset and thicken are one test each through the public API, with the volumes, refusals and history the SMLib copies checked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 94e67d4ca jyviko: Kernel loft test: the square-to-circle loft has the oracle's exact ruled volume, without printing
- 4c7d4f5c0 jyviko: Tessellation lens test: the lens's triangles fill exactly the rhombus through its arcs' midpoints
- 0d94d5f77 jyviko: Pattern test: six chamfered holes take exactly five more holes' bore and chamfer rings
- c44cbe9ac jyviko: Kernel pocket floor fillet test: the corner rounds and the floor loop round add their exact volumes, by Pappus at the corners
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d7bbf09e0 jyviko: Issue 1080 tests: the rib's rounds and the mitred corner chamfers and rounds have their exact volumes
- 0e51ffbff jyviko: Engine tests: lip_after_boss checks each lip's and groove's exact band, hole_as_deep_as_the_plate each hole's exact bore
- e03c72a3e jyviko: Robustness tests: lip_after_boss and hole_as_deep_as_the_plate live once, in the engine's tests.rs with exact volumes
- 321e56724 jyviko: Engine tests: loft_cut goes; loft_spacing's hollow elbow covers its section counts and more
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5fe9df533 jyviko: Known failing tests: the shell after a cut whose end touches an arc side builds on SMLib batch 7
- 8ec40d25e jyviko: Surface fair test: the energy falls strictly, the face moves, and the edges are read after the fair
- 697ea2ca8 jyviko: Sketch scaling test: the first dimension sets l1 to 40 and scales both joined rectangles about the origin
- e60cde8dc jyviko: Frames tests: a pick on a moved component or an instance removes the exact round and bore volumes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 25692b119 jyviko: Kernel rig: the ring cut frame and the up-down join shell
- 18f08bf83 jyviko: Kernel rig: #616's lid shells open at a rib's side, with the 0.15 lip
- 78b765e83 jyviko: Known failing tests: the action matrix's shells and chamfers as they fail with SMLib batch 7
- f7d4e5344 jyviko: SMLib: pin 26cc451 (batch 7: rounds past a rim, blend refusals that build, shells)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 469a3b2f9 jyviko: Naming: a blend's seams split its edge's name at the | between its two faces
- 1d818a2d1 jyviko: Fillet rig: five refused blends build, off the known-failing list
- 8550ac7e4 jyviko: Kernel rig: the trough and the pocket whose floors fall to a drain build
- 5f826a1a6 jyviko: Kernel rig: the plate with a hole through its arc side shells open at its far end
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- b16e8a542 jyviko: Sketch: a control spline can carry its own knots and weights
- e6abea809 jyviko: Sketch projection: a free-form edge comes in as the one exact spline it is
- f61f25c7f jyviko: Fillet rig: blends past an outer rim of their faces build, on SMLib smlib-blends-past-rims
- 09bc14dbd jyviko: Naming: test that a round of a round's end has no seam with that round's faces
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- dd8867414 jyviko: kernel: Extend grows a surface of several faces face by face
- 48a757827 jyviko: kernel: Split Body by a face of a smooth sheet cuts with the whole sheet
- 3421a8ef0 jyviko: Tests: a cylinder strip's run-offs are 100 pi + 100 to 1e-6, SMLib's exact area
- 20d5d8b13 jyviko: kernel: an extension SMLib cannot make exact says so, naming the length asked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5bb43bdb1 jyviko: CI: the test jobs grade their junit against tests/KNOWN_FAILING_TESTS
- d23c37027 jyviko: Tests: the known-failing list takes develop's 10 failing tests
- e18fb40d8 jyviko: Reference tests: the eight cases that fail on SMLib eaa998a name their cause as known failures
- 9b58a5170 jyviko: Sweep path: a curve of several pieces is turned round whole
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- c19500fce jyviko: Fillet: the radius-too-large choice in plain nouns
- b75d17667 jyviko: kernel: a round that would cut through its wall into a hollow is refused
- 795394417 jyviko: Fillet rig: 1668's R7 past the inside corner is refused at 4 + 2 sqrt2
- a26d3ee41 jyviko: xtask: known-failing grades a nextest junit report against tests/KNOWN_FAILING_TESTS
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 62fe29dbd jyviko: Fillet rig: the cases SMLib 737c392 builds come off the known-failing list
- 571d711c8 jyviko: kernel: the re-blend's removed picks formatted as rustfmt lays them out
- 2fab94991 jyviko: kernel: blend_smlib laid out by the 2024 edition's rustfmt
- 38fd4a4f6 jyviko: Skills: the tests skill's unit-test example stays under the 3600-character limit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- b0568524b Brett Lawson: smlib: solidcore's four new fork-carried opt-ins are on; the trimmed face tight box waits
- a2d5971be Brett Lawson: smlib: the quarter-cylinder sheet offset and the half-disc extrude match the C++ kernel on solidcore
- 509209838 Brett Lawson: solidcore: move the pin to afcee131a (main, with solidcore#1594, #1674, #1595)
- c9fcf82a5 Brett Lawson: smlib: solidcore's four new fork-carried opt-ins are on; the fillet trim status waits
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- cdff4ac7c jyviko: engine tests: probes ask for the exact point class
- 7ca072ec6 jyviko: ui, cli tests: probes ask for the exact point class
- a85d22e60 jyviko: kernel: Body::contains, the mesh test, is gone
- baf51b271 jyviko: kernel tests: the rim chamfers running off their rims build, on SMLib 737c392
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 9a901d136 Brett Lawson: smlib: tag history on solidcore is one application Tag per object, with the capi's handlers
- fecd4bee3 Brett Lawson: smlib: an extruded profile's arcs on one circle sweep one wall face on solidcore
- 5f7a21157 Brett Lawson: smlib: the half-disc extrude's C++ comparison cites solidcore#1477
- f64857f95 Brett Lawson: solidcore: move the pin to 15e72dff9 (main, with solidcore#1752, #1495, #1796)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 63864b298 Brett Lawson: smlib: solidcore's five new fork-carried opt-ins are on; the trim end-span opt-in waits
- 494a08de1 Brett Lawson: smlib: history on solidcore: a face whose edge is only cut by a vertex is Kept (fork 1c7accd)
- ccfa37a9b Brett Lawson: solidcore: move the pin to bba8d8798 (main, with solidcore#1747 application attribute handlers)
- 8d47118ff Brett Lawson: smlib: solidcore's three new fork-carried opt-ins are on; the blend-curve revolve opt-in waits
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 20c0c2ffc jyviko: Kernel rig: a sloped basin's mitred rim rounds are checked tangent along their contact lines
- 56d39a576 jyviko: smlib: Brep::classify_point says exactly where a point lies against a body
- 7b3e66cba jyviko: kernel: Body::classify_point decides inside, outside or on the boundary exactly
- 3b88f1acc jyviko: doc: a hole decides whether it exits at its drill point's shoulder exactly
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- cf2a15ace Brett Lawson: smlib: solidcore's four fork-carried opt-ins are on; only the trim base v opt-in waits
- c3f5bb40b Brett Lawson: smlib: a draft on solidcore keeps the body's tags and face history
- cd25e9e8f Brett Lawson: smlib: a face section on solidcore cuts planes, cylinders, cones and spheres too (solidcore#1769)
- 9c1f8904e Brett Lawson: solidcore: move the pin to 43ed10e54 (main, with solidcore#1650, fixing #1631)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 6f0bf0dea jyviko: Tests: a 1 degree crease rounds, and the knife edge's chamfers build, on SMLib smlib-batch-4-rulings
- 3772a6e97 jyviko: kernel, doc: an overflowing round goes first; an edge it removes is gone, and the fillet says so
- 9308224ef jyviko: Fillet rig: the knife edge's 0.5 chamfer builds
- 58e0d8346 jyviko: Tests: a 15° tapered text builds, every letter grown, exact where its outline gives it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 04955683f jyviko: Tests: a strip's tangent and curvature run-offs are the distance long across the surface
- 4f64a035a jyviko: kernel: one smooth angle, and a round too small to change the part is refused
- c23ef9d93 jyviko: Fillet rig: the knife-edge chamfers name SMLib's cause, a cusp's ball radius of 0
- 6f7172dc8 jyviko: kernel tests: a corner round wider than its faces overflows and takes the corner's other edges
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 9760feed4 jyviko: Kernel: a body's record of rounds goes with its history, and can be read back
- f3cf0c4f3 jyviko: Model cache: a body made by rounds keeps them, so a later round blends them the same after opening
- 134a34f89 jyviko: Tests: a corner patch of rounds 2/3/4 takes no more than the strips leave in its block
- 456e5b7fa jyviko: Tests: the io crate's hand-built saved models list their rounds, as format 7 records do
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 8ed4663ae jyviko: Mesh convert: a reconstructed bore is one wall, so the bracket has 9 faces
- 6d8e002f8 jyviko: UI: rim and wall picking tests for a circle of arcs that is one wall
- 3e5b358af jyviko: Fillets: a later round at a corner where earlier rounds meet blends them again with it
- 5d1b18f40 jyviko: Tests: a later r3 round at an r2 mitre, through the Fillet feature, makes the all-at-once corner
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 2ae53d387 jyviko: Preferences: metric tapped holes drill only the tap maker's drill
- a71450aeb jyviko: Preferences: symmetric surface extrudes read only the total distance
- 26b42048c jyviko: Preferences: the Body check note says each option in one short line
- 2c1901371 jyviko: kernel: the record test takes the one wall a circle of arcs extrudes to
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 709765fca jyviko: Model cache: a saved model records its body check mode and is adopted under it
- 393c83c2a jyviko: STEP import: a solid the kernel refuses, its faces too, is refused with the reason, never a mesh
- 6700e6ef1 jyviko: kernel: a body SMLib keeps in the record's order is mapped, whatever order its export lists
- 222211de4 jyviko: Model cache: a thinned model keeps the check mode only as the model records it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e43fe1ab0 jyviko: Kernel rig: diagnostics.validation is a setting, exempt from cases
- b24d90269 jyviko: doc, ui: a feature that lost a reference asks for it to be picked again
- d62d248b7 jyviko: doc: Untrim's face points pick faces of the body it untrims
- 1b08d4b8b jyviko: doc: a feature's face points are named on its own component's bodies first
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5d80fc571 jyviko: Engine: diagnostics.validation reads and sets the mode
- 1a93a3977 jyviko: CLI: run and kernel-cases take the validation mode
- 50501fe14 jyviko: Preferences: Body check, once per feature by default
- 6a133042c jyviko: Preferences: the body check is the kernel's, not named after SMLib
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 292ec65c8 jyviko: Fillet rig: the chamfer running into the openings is named for what it does
- 051a7b714 jyviko: Kernel tests: rustfmt
- 4030b795c jyviko: Kernel: a validation mode decides when sweeps, booleans and blends are checked
- 9acbcf924 jyviko: Evaluation: under each_feature a feature's kept bodies are checked once
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- b4af45dd0 jyviko: Kernel rig: the horn torus and the circle revolved touching its axis build
- f1199f89b jyviko: Joint drive: contact is decided on the exact bodies, not their display meshes
- 3a2fac31a jyviko: Kernel tests, fillet rig: a chamfer as wide as its rim builds
- 1878274cb jyviko: Kernel tests, fillet rig: a chamfer past its rim builds, cut by what lies past it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e46359ff0 jyviko: Kernel rig: the patch cases the fill now builds come off the known-failing lists
- 7c9e5ec69 jyviko: kernel: a seam held as two edges is one join, drawn whole in the shaded view
- 12496c2c1 jyviko: Tests: a round flange stays an exact circle through unfold, refold and DXF, with a cut near its rim
- 7fe880a7b jyviko: SMLib: pin f8fd83e (tangency-labs/smlib#66)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 5314031ba Brett Lawson: smlib: solidcore's tangent-face edge check and horn-torus revolve opt-ins are on
- 81088bf0c Brett Lawson: smlib: a sweep along a bent path is tested on solidcore (solidcore#1628 is fixed)
- a6b280467 Brett Lawson: solidcore: move the pin to 3569b5d73 (main, with solidcore#1665, #1681, #1614, #1677)
- 0bed45d82 Brett Lawson: smlib: solidcore's planar thicken side walls opt-in is on; four opt-ins wait for the fork
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d5941c0d0 jyviko: geom: a general fill's crown fills out to the side its neighbours' normals face
- f7409dd59 jyviko: geom, kernel: a loop with fewer than three corners is filled by a ring of patches
- c088cf43e jyviko: geom: the patches about a centre are solved the same to the last bit on every run
- 25e275722 jyviko: Tests: a patch's continuity g3 is valid, g5 is the hostile word
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 49377d318 jyviko: geom: patches about a fill's centre join G1 there, with the linear gluing function
- 55cb6b32b jyviko: geom, kernel: the patch fill's sides run from corner to corner, not edge to edge
- 62d41a0cf jyviko: Tests: the fill tests evaluate a face's (u, v) on its NURBS form
- 30b12cea8 jyviko: geom: a crowned height field rises by the whole crown at its box's middle
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5732b62ec jyviko: Tapered extrude: the end check of a profile with holes takes the section a swallowed line leaves
- 738f336e1 jyviko: Raytrace: a closed box dielectric is certified from its mesh's geometry, in any tiling
- 9243b6550 jyviko: SMLib history: a split line between two pieces of one face comes from nothing
- 013978724 jyviko: geom: the patch fill's cross-boundary targets agree with its corners
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- fb5ae6cdd jyviko: SMLib import: an extruded circle's circle comes from its widest span, not the face's range
- 17a466e6b jyviko: Ruled surface: a free strip on a straight edge gets a far curve that can bend
- f2982b47a jyviko: Sheet tests: the tiny cut inside the exact circle is above SMLib's modelling tolerance
- cf40a3e6c jyviko: Boolean regression test: the raked wedge's R4 rounds the four edges the issue picked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 0b7468729 jyviko: Curvature comb: every comb shown at one scale, kept by the command
- 6ab96c658 jyviko: View analyses: one toggle group, its state in the session
- 9a45d4248 jyviko: Kernel rig: inspect.analysis is a display analysis switch, exempt like the others
- 8d590c198 jyviko: Kernel tests: the long-setback G2 patch's reach past the box from its exact surface
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- dfa84e84d jyviko: Blends: an edge is smooth when its faces' normals agree all along it, decided exactly
- 6cc759750 jyviko: SMLib import: an extruded circle is a cylinder over the face's trimmed range
- 9b3572797 jyviko: Fillet rig: the known-failing list names the report- cases, not their old ids
- 9851718ea jyviko: Curvature comb: purple envelope and orange teeth from their own theme tokens
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 2d84f8a17 Brett Lawson: smlib: solidcore's new opt-in fixes are on: sliver iso curves degenerate, Coons corner patches tangent to their sides, a fillet's own edge kept at a corner patch, the corner ball centred where the axes meet, one solution for a seam point, 2D boolean covers of far faces, area only between solid and void, a coincident definition split across the split point, the tight box from the interval's knots, overlapping bands refused, and the SSI tangent-curve tracer
- 0877278d6 Brett Lawson: solidcore: move the pin to 2b81c033 (main, with solidcore#1640, #1623, #1655, #1673, #1668, #1662)
- 97a475d8d Brett Lawson: smlib: solidcore's torus check and step-wall opt-ins are on: the torus check reads its V interval, a spindle torus through its apex is a self-intersection, and a local operation builds the step wall between tangent faces moved apart
- f4eec76b4 Brett Lawson: solidcore: move the pin to dca3135cc (main, with solidcore#1630, #1632, #1649, #1664)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- c9bf97ce4 jyviko: Blends: an edge is smooth only where its faces are tangent all along it
- 1e6c91a10 jyviko: Fillet rig: the concave arc where a bar's top meets a cylinder its sides run tangent into
- de9c005f2 jyviko: Blends: a blend face is named by its picked edge, not an edge it took up
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- bf85e0a6c jyviko: Fillet rig: the knife edge's R2 round builds on the new SMLib pin
- 739e47b9d jyviko: Kernel tests: the basin rim chamfers check the kernel's refusal kind, not the named size
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 94938b3b5 jyviko: Kernel rig sources: the kinds of the four sources the new cases cite first
- 191fa9839 jyviko: Fillet rig: the R7 round past a thin wall's inside corner held to its exact volume
- ecbca1f74 jyviko: Fillet rig: grade the 851 rows' rounds G1 at their own tangent seams
- 30dce7fba jyviko: Fillet rig: the sloped basin's rim loops with their mitred corners' exact volumes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 8b9e0e0c0 jyviko: Continuity rig: an opened tube end capped G1 and G2, as cases
- 24a58066c jyviko: Sweeps rig: a circle touching its axis revolved a quarter turn, as a case
- 51316b7ec jyviko: Import rig: the horn torus quarter written to STEP and read back, as a case
- 8524458ce jyviko: Tests skill: when a check is a unit test and when it is a rig case
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 368b34e3b jyviko: Tessellation: a curved face's grid reads the quarter turn from its surface, not its parameter
- 9da160892 jyviko: Tessellation: two corners of a face a hair apart, within their tolerance, are one point of it
- 7cbbe2bc2 jyviko: Tessellation: two curves that touch within the chord tolerance share nodes, so the face pinches there
- 95f1258b7 jyviko: Motion interference: a collision is deepest where the parts share the most volume
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- c1328212d jyviko: Tests: curved bodies' contact stop is checked, not the sweep's internal step
- 172c64cef jyviko: Tests: the naming corpus checks that references resolve and builds agree
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5ea43b5c2 jyviko: Tests: a tray's sheet names are checked by where their points lie
- 978ae1d51 jyviko: Tests: a mirrored sheet's flat pattern is its source's mirrored, as the code makes it
- 2be7b1b6f jyviko: Tests: the extruded ellipse is checked by its area, not its face count
- 51855589d jyviko: Tests: Open in EasyPrint's STL is read back, not measured in bytes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 4d7553dd8 jyviko: Kernel tests: a ruled strip's moved handles are checked on its far curve
- 21c1ed541 jyviko: Kernel tests: rim rounds meeting at a concave corner are mitred, not swept
- 03054211b jyviko: Tests: the arc-touching cut is checked by its volume and area, not its face count
- 5e7e1485c jyviko: Tests: the knife-edge R2 fillet is checked once, in closed form
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5229bbedd jyviko: Kernel tests: a small bend's display mesh is graded on the display mesh alone
- 4ff38619c jyviko: Kernel tests: the rounded shell's planar roles are graded by name and exact volume
- a3848d1d0 jyviko: Kernel tests: modifier histories are graded by what each face is, not how many changed
- a45d56aa9 jyviko: Kernel tests: the slot plates' STEP files are graded by their bounds and volume, not surface kinds
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- a0c24b87c jyviko: Kernel tests: the back edge then the arc is one more pair of the rounds-in-sequence test
- c69dbc5d3 jyviko: Kernel tests: the collapsed taper's mesh is held to its B-rep, the taper to validity
- 87e9123d3 jyviko: Kernel tests: a crowned patch's hostile crowns are refused for their range
- 65718cd41 jyviko: Kernel tests: the five- and six-sided fills are graded by what they make, not their face counts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 3569298a4 jyviko: Kernel tests: a chamfer whose leg runs off the thin rim is refused, naming the largest
- a8f393ca3 jyviko: Kernel tests: the tabbed plate's rim rounds take their exact volume
- 5af467aef jyviko: Kernel tests: the box rounded after separate bottom rounds takes its exact volume
- 659bd866b jyviko: Kernel tests: the #871 part's fitting rounds take their exact volume
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 2f88ca2f6 jyviko: Kernel rig: everyday chamfers of box edges and pocket rims
- 51641123c jyviko: Kernel tests: drop the mixed arc-and-line mitre test, the rig's 485 grades it
- e9963439b jyviko: Kernel tests: the round into a hole moves to the rig, with the hole cut the test's way
- 65e46a962 jyviko: Kernel tests: a round as tall as its wall and more builds on the disc
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 01d0d6bb9 jyviko: SMLib bindings: a curve list holds up to 16384 curves, as the C API now takes
- 96b248d28 jyviko: Kernel tests: a slot narrower than the taper closes partway up and builds; a closing hole is refused
- 42d4d0ecd jyviko: Engine tests: rounding the long edge then the left upright matches the three edges their chains take
- b66821c82 jyviko: Kernel tests: the third round at a mitred corner takes its tangent chain, a sphere octant
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 785b78bea jyviko: Surface Fair test: fair the B-spline patch on a saddle rim, not an offset sphere
- 1817cffaf jyviko: Shell: a basin shelled past its 4 mm rim measures its exact sharp offset
- 2e123eb3d jyviko: Kernel tests: a swallowed tip's volume is the drafted wedge's, every wall at the taper
- 1661fe292 jyviko: SMLib: pin 985faae, the batch of 2026-10-30 evening (tangency-labs/smlib#63–#65)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 3346f4172 Brett Lawson: smlib: solidcore's new opt-in fixes are on: UV trim checks on the surface, loop orientation from the loop's box, cones extended as themselves, the local operation's box, joined drop pieces, exact edges on analytic faces after a shell, and the two SSI trace fixes
- 271f0a39e Brett Lawson: smlib: a face's planar section runs on solidcore, as the capi's smlib_face_section (solidcore#1534)
- 436fae56a Brett Lawson: smlib: drafting a cylinder's side runs on solidcore (solidcore#1606, fixed by #1611)
- 39adb66ad Brett Lawson: solidcore: move the pin to 55748ecf (main, with solidcore#1648, #1645, #1644, #1641, #1639, #1637, #1636, #1634, #1657, #1656, #1654, #1653, #1652, #1651, #1598, #1622, #1618, #1616, #1603, #1626, #1661, #1658, #1660, #1629, #1663: attributes through offsets, shells, booleans and copies (#1462 P2, P4), the tight box from the interval's knots (#1054), a merge's UV trims named after their edge use (#435), SM_API ordered-point surfaces, exact projection copies, and the fork's WR-562, WR-547, WR-546, WR-541, WR-537, WR-536, WR-535, WR-533, WR-542 and WR-75 opt-ins)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 97d79e3b8 Brett Lawson: smlib: the solidcore tag test names what still holds it back
- 6a3558a96 Brett Lawson: smlib: a sweep along lines and arcs goes piece by piece on solidcore, as the capi does
- 1feba5af9 Brett Lawson: smlib: the bent-path sweep's ignore cites solidcore#1628
- 9ceddd9d5 Brett Lawson: solidcore: move the pin to 937a6319 (main, with solidcore#1534, #1537, #1544, #1617, #1608, #1582, #1591, #1625, #1586, #1619, #1620, #1611, #1647, #1646, #1643, #1642, #1638, #1635, #1633: planar section curves, SM_API intersections, cut, HCR silhouettes on solids, UV trim checks on the surface and tiny loops oriented, projection, trimming, tessellated boundaries and knot removal, the fillet refusal that leaves the body unchanged, Cone::lean_cylinder as a cone, and the fork's WR-260, WR-550, WR-545, WR-543, WR-80, WR-534 and WR-532 opt-ins)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 73b053221 jyviko: Face capture test: extruding a split face in an uncaptured component is refused
- 918429c6d jyviko: Sheet machining: a trimmed To Object tool is measured as the prism its record proves
- f37b95498 jyviko: Native B-rep: a body is written as it serializes, not through a JSON value
- 298869f4d jyviko: Engine tests: the hostile-parameter test builds its starting model once per command
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 01477bb14 jyviko: Tests: the saved curved strip is the link a truck build saved
- 0c4f54edf jyviko: rustfmt
- 74001e532 jyviko: Tests: check what each operation is for, not how many faces it makes
- a84369fe7 jyviko: Sheet convert: a wall cut off at its strip keeps each corner with its own edge
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- c8adedaec Brett Lawson: smlib: solidcore's new fixes are on (taper tangent corner planes, holed revolve void, loose tangent edges refused, scaled extrusion origin zero, booleans skip faces apart)
- 744f7574d Brett Lawson: smlib: drafted extrudes keep their corners and curve sweeps keep the profile where it lies on solidcore (solidcore#1449, #1450)
- dafb25b4b Brett Lawson: smlib: the body check reads a Caller body's recorded keys on solidcore (solidcore#1584)
- 2ad118666 Brett Lawson: smlib: curvature-continuous rounds and corners left open on solidcore (solidcore#1438, #1439)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- a69016f21 Brett Lawson: solidcore: move the pin to e4379b45 (main, with solidcore#1573: the #1024 rail-through-boundary-vertex test, plus the CreateCurveApproxPoints and PolyBrepCopy ports)
- 2308fa5be Brett Lawson: solidcore: move the pin to ddfb3895 (main, with solidcore#1569 and #1533: the 3x2 mixed corner at a concave unfilleted edge, and SmSurface::ApproximateSurface)
- f23aa76d3 Brett Lawson: smlib: an offset or other non-NURBS face surface exports through ApproximateSurface on solidcore (solidcore#1441), and the new fixes are on
- d4cec2ca9 Brett Lawson: solidcore: move the pin to b2450cbf (main, with solidcore#1568, #1579, #1581, #1585, #1597, #1604, #1600: attributes through booleans, taper corner rules, the curve sweep, check_brep naming, fillet thirds and corner marks, WR-302)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- bf74dcbbe jyviko: Tests: a round wall is one face, its name without a piece number
- 8f914ddd2 jyviko: Tests: the saw cut's halves named after their faces, listed in the kernel's order
- 1a5a3b5eb jyviko: Tests: an extended cylinder strip stays one face in every mode
- a3f150257 jyviko: Tests: the tapered bosses' volume in closed form, not truck's measure
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- ec4eebaa8 jyviko: sew: a folded pcurve has no piece shorter than it lifts onto its edge
- 1bc8b204f jyviko: Kernel tests: a circle is one closed arc, a round wall one face
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 41206c065 jyviko: Sheet metal: a whole circle in the outline is sewn as its two exact halves
- 374d3b7e8 jyviko: Sheet machining: a depth an ulp off the sheet's face is on it
- 909f9a20e jyviko: Sheet face names: a triangle takes a flat face's name only where that face faces its way
- ff9ccaf1e jyviko: Sheet tests: the DXF outline and the folded volume as the exact flat pattern and measure give them
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 1ae748417 jyviko: Robustness: seed 5's edge-only join keeps two bodies, as joins have since 94ee28d5c
- 48d72ba2b jyviko: Convert Mesh: a triangle of no area is dropped, not refused (#4561)
- a0a75dc78 jyviko: Kernel rig: import/4561 passes, off the known-failing list
- beaed5b35 jyviko: Kernel rig: threads/2369 names the tap maker's 6.8 mm drill for M8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 4ebc3d078 jyviko: UI tests: the thread catalogue's error and Press Pull's hole wall as they are now
- 2debdd87a jyviko: Pi case test: each standoff is four faces, its walls one face each
- db757efc7 jyviko: Tests: the pi case and the hole wall read as on green-truck-era-tests, so both branches agree
- 191c1b855 jyviko: Fair: a net of up to 128 x 128 control points, the band bounding the solver
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- f8b45f277 jyviko: STEP import: a void reads as a cavity whichever way its shell flag points, again
- 64188ce43 jyviko: Planar regions: a hole goes to the material that holds it, read closer than the hole lies
- 1a0289011 jyviko: Planar region tests: edges on one line are one edge of the result
- 514426e5d jyviko: STEP import: a closed spline a face lies across the start of starts clear of the face
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- c47c1d26a jyviko: Tests: the fit and taper tests use geometry that still doesn't fit
- 8c37bc756 jyviko: Fillet rig: R10 past the full round is refused naming 7.5 mm, as the case asks
- a100c7c06 jyviko: Loft rails: a station grows about its section's centroid by length, not the mean of its control points
- e5476706b jyviko: Issue 616 test: the lid's volume is its closed form, 6703.5344
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 44b779364 jyviko: Tests: a point path's sweep has a wall along each line; coplanar walls join at a corner
- d945cf53a jyviko: Fillet and chamfer: a refusal as too large names the largest size that fits
- 8bcd81244 jyviko: Tests: a blend refused as too large is SMLib's NO_ROOM, in its own words
- deaf8e679 jyviko: Tests: convex blends past a cliff are cut from the part, as the owner decided
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- b9d0a3308 jyviko: Mesh memo test: SMLib's booleans mesh neither operand
- b6c3bf3c5 jyviko: Face capture test: an Offset Face's top is anchored by its exact history name
- 1ee5f1af3 jyviko: Kernel: a mitred sweep carries a slanted section all the way to each mitre
- 1e4b64402 jyviko: Provenance: a sweep's origins are the ones it recorded
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 15c31a96f jyviko: Kernel: planar source lineage finds each face's support through an index, with no budgets
- 049b2bc40 jyviko: Lumps: a face-source table of another length is refused, never sliced
- f60bf96df jyviko: Planar sources test: two bodies side by side joined as the record requires
- e1b762c4b jyviko: Booleans and Shell keep the lines faces were split along on purpose
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- ffb1e650d jyviko: Isocurve Analysis: count curves each way, evenly spaced across the face
- 177eb207f jyviko: Exploded views are shown only: the design's placements and Capture Position leave them out
- 8d72cfa59 jyviko: SMLib export: a face's outer area reads only its own loop's edges
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e7e613b6f jyviko: Records: the item budget bounds input, not the kernel's own results (Refs #3992)
- cf2b3a62f jyviko: Fair Surface: a face of degree 1 one way fairs along its curved way, and a face with nothing free is left as it is
- 16d467e14 jyviko: Point and Plane Along Path: exact on the path's curves by arc length, and a t outside 0…1 is refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 97935eed8 jyviko: Inspect: the centre of mass from the exact faces, as Measure takes it
- d094d43f2 jyviko: Compare Bodies: each region measured exactly, on the cut of the two bodies
- 864bcbccb jyviko: Compare Bodies: a region the exact cut cannot measure has no volume and says why, never an estimate
- a1dbb7c08 jyviko: Kernel rig: the two G2 corner cases are graded clear of the vertices, as the ladder grades them
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 80d08659f jyviko: Kernel rig: the booleans, import and threads lists name the 5 cases that fail on the pinned SMLib
- 5c45570c9 jyviko: Kernel rig: rustfmt; measured values in results are decimals, within tolerance; the ladder records 06/023 passing
- 393a9aab6 jyviko: CI: native and reference tests stay on pushes until develop is green
- 322ac2592 jyviko: CI: the release gate still calls ci.yml (workflow_call)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 6af622978 jyviko: Threads: a taper thread's groove follows its crest cone across the section, so no sliver of the flanks is left
- 3f5efdf70 jyviko: Kernel rig: one results check, each {step, pointer?, json, rel?, abs_mm?}
- dc093b0cb jyviko: Kernel rig: a symmetric surface extrude with no convention is the total distance (#9091); the per-side reading is its own case
- 55338e139 jyviko: Kernel rig: each area's PATHS names only its own files, and EXEMPT lists only commands no case uses
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 0d3c46dad Brett Lawson: solidcore: move the pin to 6a068272 (main, with solidcore#1419 WP4: the level-2 AssertValid tests and SmSurfOfExtrusion::AssertValid, #1578)
- 41e902eaa Brett Lawson: solidcore: move the pin to 0ae36782 (main, with solidcore#1452: SolidError::sm_status and a port-invariant variant)
- c13d760fa Brett Lawson: smlib: a copy queried under the arena's identities is a port-side invariant (solidcore#1452)
- 76c755508 Brett Lawson: smlib: a call answers None exactly when solidcore's error stands for an SMLib status (SolidError::sm_status, solidcore#1452)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 9fecf7709 jyviko: Kernel rig: interference and clearance between placed occurrences
- 22cd8e74f jyviko: Ladder generator: cases.py writes the values committed by hand for 05/007, 06/017, 07/016 and 11/003
- 487914427 jyviko: Ladder 05: UNC, UNF, Rc and NPT tapped holes, each drilled to its tap maker's drill
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 3b7dabdb7 jyviko: Kernel rig: bodies moved, copied and extracted, designs inserted, occurrences copied, reparented, dragged and exploded land where worked out
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e7eb8a5d4 jyviko: Kernel rig: contact sets stop a drive at the block, touching faces don't, and edit, list, enable and disable do as coded
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 489441907 jyviko: Kernel rig: motion studies play, plot and trace to known values; a crank-slider's slider follows r cos t + sqrt(l^2 - r^2 sin^2 t)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 236a5597e jyviko: Kernel rig: gears turn by their radii, a rack travels r per radian, a screw its lead per turn, a disc cam lifts 2e
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 0da95a8cc jyviko: Kernel rig: each joint type moves its part to the placement worked out by hand, limits clamp, as-built keeps it in place
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 445f6faa4 jyviko: Kernel rig: parameter cases, an expression in a sketch dimension and a cyclic one refused
- 2cd1a0335 jyviko: Kernel rig: an assemblies area, with the source files that rerun it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 305c36479 jyviko: Kernel rig: inspect cases, the gap between two spheres, their lens where they overlap, none past the clearance
- 4355e15df jyviko: Kernel rig: inspect cases, a box against a taller one and an identical one, and a tolerance out of range refused
- 7b1fbb57f jyviko: Kernel rig: inspect cases, the comb of a sketch circle and line and a cylinder edge, and nothing picked refused
- 5c80ef4ad jyviko: Kernel rig: inspect cases, three isocurves each way on a cube's top, and a count of 0 refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- cacc394f9 jyviko: Kernel rig: inspect cases, the centre of mass and volume of a box, of a box and cylinder, and an unknown body refused
- f43a0c7ac jyviko: Kernel rig: inspect cases, the smallest radius of a fillet, an ellipse and a circular edge, and none on a box
- 311b57bb7 jyviko: Kernel rig: inspect cases, a fillet's seams are G1 with a 1/r curvature jump, a box edge is sharp, too few stations refused
- 58b384d7d jyviko: Kernel rig: inspect cases, the overlap volume of two boxes, none where they only touch, a box inside a box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 1ac12ba72 jyviko: Kernel rig: construction cases, where three planes meet, and parallel planes or planes through one line refused
- f72108895 jyviko: Kernel rig: construction cases, where two edges meet or come closest, and parallel edges refused
- 1acbf1e9c jyviko: Kernel rig: construction cases, a point on a vertex or another construction point, and no body refused
- 33e3b6379 jyviko: Kernel rig: the inspect area, what reruns it, and the analyses that only draw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 02ee36ce9 jyviko: Kernel rig: construction cases, the plane through parallel and meeting edges, and skew edges refused
- fbe540b40 jyviko: Kernel rig: construction cases, a point along a sketch line and arc, and one past the end held at the end
- a0bd94f4d jyviko: Kernel rig: construction cases, the centre of a circular edge, sphere, torus and sketch arc, and a flat face refused
- 8a8960f13 jyviko: Kernel rig: construction cases, where an edge crosses a square and a slanted plane, and a parallel edge refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e0e3798ae jyviko: Kernel rig: construction cases, the midplane of parallel faces, of a corner, and of a plane with itself
- 3ff1347d9 jyviko: Kernel rig: construction cases, a plane through an edge or axis square to a plane, and a line along the normal refused
- 6fed4f996 jyviko: Kernel rig: construction cases, the tangent plane to a cylinder and a sphere, and a point on the axis refused
- 8be5341c7 jyviko: Kernel rig: construction cases, the plane through three points or vertices, and collinear points refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 776d979ce jyviko: Kernel rig: construction cases, an axis square to a flat face and to a cylinder through a point, and a point on the axis refused
- 84a326f16 jyviko: Kernel rig: construction cases, the axis of a cylinder, a torus and a circular edge, and a flat face refused
- 17c0aee44 jyviko: Kernel rig: construction cases, the line where two planes meet, square and slanted, and parallel planes refused
- f9c53503b jyviko: Kernel rig: construction cases, a plane turned about an axis in it, off it and along its own normal
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- b8c6bb921 jyviko: Kernel rig: thicken a sheet into a slab and a tube, trim by a plane and by a circle, and refuse a stray keep_with
- 70f695c6b jyviko: Kernel rig: grade construction geometry and the numbers a command replies with
- 5c0db8e82 jyviko: Kernel rig: the construction area, with what reruns it
- ffd3d5fb1 jyviko: Kernel rig: construction cases, an axis on a straight box edge, and a circular edge refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 75353cb04 jyviko: Kernel rig: extend, extrude, loft, patch, revolve, stitch and sweep surfaces, a normal case and an edge case each, with their exact areas and surface kinds
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- f861f44e1 jyviko: Kernel rig: a matched sheet meets its target's edge at the order asked, flat where both are flat, and a solid is refused
- 3d080e96a jyviko: Kernel rig: fairing leaves a flat patch flat and a face with no free control rows as it was; zero strength is refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 425c8ed42 jyviko: Kernel rig: a blend between coplanar sheets is flat, a step blend meets both sheets at the order asked, and unchained edges are refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 7ac95e47e jyviko: Kernel rig: a reversed normal sends a later thicken to the other side, and a solid is refused
- 680f2ee5c jyviko: Kernel rig: boundary surfaces through a square, a triangle and a network of four lines have their exact areas; five curves are refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- a01d82f30 jyviko: Kernel rig: untrim removes holes from a sheet, a cylinder sheet and a solid's face, and refuses a face with none
- b2cc77094 jyviko: Kernel rig: unstitch takes a box and a cylinder apart into their faces, or one face out, and refuses a single face
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- bc3c9185c jyviko: Kernel rig: grade the kinds of a result's surfaces, its B-spline degrees and spans, and its free edges
- 657c5af57 jyviko: Kernel rig: surfaces area; an offset plane, cylinder and sphere land exactly where the distance puts them, and faces across a sharp edge part
- 476b04ed3 jyviko: Kernel rig: ruled strips along a normal, at 45 degrees and tangent are the exact plane, cone and flat ring, and a closed chain mitres into a frame
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5ba60bd9d jyviko: Kernel rig: plastic cases, bosses, lips and grooves, rests, a snap fit edge case and the plastic rules, each with its answer
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 67dd8892f jyviko: Kernel rig: bend table cases, JSON and CSV rows with angles, radii and K-factor allowances, and an unknown format refused
- 235645db5 jyviko: Kernel rig: the ellipse length's Simpson weights as a named step
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- fce8e4a26 jyviko: Kernel rig: perforation cases, square and staggered fields counted hole by hole, a field kept clear of a bend zone, and a pitch refused
- c114e6c35 jyviko: Kernel rig: flat DXF cases, outline, cut and bend line lengths, an ellipse exact and as arcs, and no sheet refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 2edf64952 jyviko: Kernel rig: hem cases, closed on a top and a bottom edge, open and flipped, on a flange, and one too short
- c60bcb55e jyviko: Kernel rig: path flange cases, a Z section, one line at 45 degrees down, and a path straight on refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 815711421 jyviko: Kernel rig: second cases for draft (two adjacent faces), rib (in plane), press pull (an edge), split face (sketch and tool face) and sketch projection (a face loop and a silhouette)
- acd7bb066 jyviko: Kernel rig: the boundary-fill crescent ends at the cusps, x = 5
- 45c955326 jyviko: Kernel rig: a case can check the files it writes and the commands' answers
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 4e7810659 jyviko: Kernel rig: frames area, frame member and inserted profile cases with their exact sections, placements and a too-thick wall refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- a5513a4e1 jyviko: Kernel rig: boundary fill cases, the lens and the crescent of two cylinders, and a point outside every tool refused
- f0eac58a2 jyviko: Kernel rig: align cases, face onto face as a move, a side face turned onto a top face, and a face onto an offset plane along its normal
- 1e9cefe1e jyviko: Kernel rig: web cases, two gussets in a channel's corners and two walls grown along the sketch normal
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- af8f28e34 jyviko: Kernel rig: scale cases, a cube doubled about its corner, a sphere scaled into an ellipsoid of the same volume, and a zero factor refused
- e1724be62 jyviko: Kernel rig: pattern on path cases, bosses along a line, bodies turning with an arc's tangent, and instances past the path's end refused
- cf58e3735 jyviko: Kernel rig: replace face cases, a top moved onto a plane and a lower step raised to the higher top (fails today: SMLib offset of faces refuses closing the step wall)
- be4f15db6 jyviko: Kernel rig: bounding solid cases, two boxes with a margin and a sphere's exact box
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d671bbbc1 jyviko: Kernel rig: every registry command has a case or an exemption (kernel-cases --coverage)
- 6701b1c5e jyviko: Docs: how the kernel rig picks its areas, how a new area joins, and the coverage check
- 585789c60 jyviko: Kernel rig: cone cases, a frustum on X and a full cone of negative height with their exact volume, area and centroid, and a zero height refused; a new solids area
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e71177769 jyviko: Docs: the kernel rig gate, updating a known-failing list, re-recording the ladder golden
- d84d00bb4 jyviko: Release gate: the packages' dry run is unsigned and skips the release job
- 02e1f1841 jyviko: Kernel rig: each area runs only when the files its PATHS lists change, every area on the shared core
- b67e93211 jyviko: Kernel rig: an area's PATHS names only its own files, never the shared core
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 376bba92c Brett Lawson: solidcore: move the pin to 3c17ddb1 (main, with solidcore#1480: an intersection edge's end goes to its own vertex, and #1419 WP1's whole-body AssertValid walk)
- c191634b5 Brett Lawson: solidcore: move the pin to 7ca6ce7a (main, with solidcore PR #1427 SmBrep::LocalOperation, #1474 Nx1 corner, and fixes since 3c17ddb1)
- 9c7c139bd Brett Lawson: solidcore: move the pin to b19dbcb5 (main, with solidcore#1476: a shell's implicit offsets take every base upstream casts to a B-spline, and the offset sample bound scales with the input)
- 22a1c20b1 Brett Lawson: solidcore: move the pin to b3baca8e (main, with solidcore#1490 and #1491: a revolve's torus is never inside out and keeps the flag, and a one-circle full turn puts its seam at the profile)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 6c5537df6 jyviko: Kernel ladder: a gate run fails on any case whose status or counts differ from the golden
- ee2a1ea06 jyviko: CI: maintainers' pull requests run the tests, and the reference tests run on pull requests
- b4fcd5910 jyviko: Kernel rig: every area and the ladder as a parallel gate on pull requests that touch the kernel
- 18d2dddac jyviko: Release gate: every check in full and in parallel before a branch replaces main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 53da86734 Brett Lawson: solidcore: move the pin to 2a47645e (main, with solidcore#1435: precise properties split at the surface's knots)
- cb79c32ee Brett Lawson: smlib: the curved primitives' measures, round trips and two sweep volumes run on solidcore (solidcore#1435 landed)
- 6e5722af9 Brett Lawson: solidcore: move the pin to fa3caa94 (main, with solidcore#1463: a revolve's cylinder is never inside out, and an inside-out NURB cylinder keeps its frame)
- 9c7e54be4 Brett Lawson: solidcore: move the pin to 43ca3745 (main, with solidcore#1473: SmShell::IsInnerShellOf, and #1419's level-0 helpers)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 9008d13f3 jyviko: Surface Extrude: a symmetric distance is the total, as for a solid extrude
- de5c338e7 jyviko: Preferences: keep the older per-side reading of a symmetric surface extrude
- ac70662d6 jyviko: Sweeps: a path through a drawn 3D arc follows the arc, not a spline through its three points
- 7664925fb jyviko: Sketch: Project onto Surface keeps the side the projection meets first, in one curve
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- bb4299e56 jyviko: Tests: a drafted cube side leaves the bottom and the opposite side Kept, the rest Modified
- 29adfd0d7 jyviko: Kernel tests: the barrel's side is the exact surface of revolution of its arc
- 5ada4fc8a jyviko: SMLib: pin 90aabff, a shelled round stays a cylinder and a step wall is ruled as its plane
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- f3b77d71b jyviko: Tests: expectations for the SMLib fixes of 2026-10-29
- 567b764b9 jyviko: Viewport tests: the offset ellipse ring's 512 wall joins are all smooth
- 9d0fb564e jyviko: SMLib: pinned at 60b1c6a: the 43 fixes of 2026-10-29 (tangency-labs/smlib#14–#56)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- c93b3ad5a jyviko: Engine tests: SMLib's builds where truck refused or approximated
- b6b59e7b3 jyviko: Naming tests: pieces of one name on a grooved disc, the merged boss wall by its point
- ac52443df jyviko: Ring tests: a cut's volume is the piece it took, not the difference of the ring's volumes
- de606715b jyviko: Placement tests: a body mirrored in SMLib reads back from its record valid
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- d35dcf022 Brett Lawson: solidcore: move the pin to 19d87ca7 (main, with solidcore#1442: walls that meet are refused as WALLS_TOUCH)
- 8493abc90 Brett Lawson: smlib: shell_walls_touch runs on solidcore (solidcore#1442 landed)
- 30d6331a5 Brett Lawson: solidcore: move the pin to 19587445 (main, with solidcore#1453: an offset edge between two analytic faces is their exact line or conic)
- f44e08128 Brett Lawson: smlib: shell_cylinder_open_top runs on solidcore (solidcore#1453 landed)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- f62d6ee6d Brett Lawson: solidcore: move the pin to 4cd55082 (main, with Ellipse::is_nurb_curve_circle, solidcore#1432)
- c11640214 Brett Lawson: solidcore: move the pin to f020a066 (main, with IsNurbSurfaceCylinder / IsNurbSurfaceTorus, solidcore#1433)
- c9b2c18eb Brett Lawson: smlib: circle, cylinder and torus NURBS forms come into solidcore (solidcore#1432, #1433)
- 04c2af035 Brett Lawson: solidcore: move the pin to 3546c9bc (main, with solidcore#1437 and #1445)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- ee9fc3793 jyviko: Tests: a torus patch to thicken is cut from SMLib's one-face torus
- ca53656a2 jyviko: Schema tests: an empty face list is checked on the draft, which refuses it
- ab68a3d0f jyviko: View tests: the section cap test draws the cap in the cap colour
- 24bcaca03 jyviko: Engine tests: SMLib's faces, not truck's pieces, in the face counts and measures
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 2c341006a jyviko: Tests: a cylinder's side and a sphere are one face each, as SMLib builds them
- 6c9c679dc jyviko: Tests: a revolved sheet over one radian is one face, untrimmed over its whole span
- 8075b8f70 jyviko: Tests: a swept point path is its lines, and rails must turn with a cornered path
- b9d65e6bc jyviko: Tests: thicken across a sharp edge extends the offsets until they meet
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 3c680d21a jyviko: Geometry: the closest point on a full circle just before its start is found before its end
- 30ceb44e6 jyviko: Tests: SMLib's faces, one per swept segment, closed along a seam, replace truck's halves
- 908bc756c jyviko: Tests: the matchsurf and mixed-fillet helpers read an edge on the curve its interval is on
- 98284eb1e jyviko: Tests: a box thinner than a body's tolerance may be refused instead of getting no certificate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 93bbde86e jyviko: Tests: a script keeps a fillet a parameter makes impossible, a radius below zero
- 913a61329 jyviko: Tests: a tilted cylinder's Intersect cut is checked on the cylinder, not by its mesh's count
- da4f122f4 jyviko: Tests: a face picked by point is found on a block of 256 drilled holes, as on #6720's thread
- d0daee90f jyviko: Tests: a cam's edge is picked on its rim, off the vertex where its circle's seam meets it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- ff0dda537 jyviko: UI tests: picks that name one thing, and a thread that names its start
- 2523d13cf jyviko: UI tests: SMLib's cylinder has one wall and one edge per rim; split rims come from two arcs
- b71e5ae6f jyviko: Tests: edges are read on their NURBS forms, a chamfer's chain is its caller's, the cap test's hatch
- 138acad01 jyviko: UI tests: a frame member's volume is compared to the accuracy SMLib measures at
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 319e6b8b3 jyviko: Kernel tests: the chamfer on a tangent wall junction is measured on meshes fine enough
- 68a217d98 jyviko: Reference tests: the loft case is analytic, SolidCraft's correspondence with its closed form
- 73b028b5b jyviko: Kernel: a drafted extrusion of a profile with holes, every wall leaning on the material's side
- b2c5b1f5e jyviko: Designs before format 14: a split's pieces take the names its later features use them by
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 4a0c13910 jyviko: UI kit: a field's scenario handle is where the field shows
- 271f0c5de jyviko: STEP import: a face's loop through a pole closes its turn, so a dimple keeps its area
- 983b1ca8f jyviko: Sketch projection: a projected face's curves meet at the face's vertices
- 426a505a8 jyviko: Display meshes: tests count the planner's grids; a mesh's outline is one line per straight edge
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 43c1b7b88 jyviko: UI tests: Isocurve Analysis's engine colour is drawn from the theme's accent
- 7bb5bb3d5 jyviko: Locales: Arabic and Hebrew for the version and section hatch labels
- e657e4086 jyviko: UI kit gallery: entries for the controls added without one
- 6a6cd8f56 jyviko: Sketch: a sketch's bounds reach its circles' and arcs' extremes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 23bfa1cf7 jyviko: Tests: the saved fitted-letters design measures its closed form, its letter as conics
- 0e3f01ec0 jyviko: Tests: a loft cut whose top is the basin's whole outline leaves the walls above as their own body
- b3dfcf1ff jyviko: Tests: an engraved face's letters project as conics, their exact quadratic Béziers
- 367beae69 jyviko: Viewport: the analysis legend stays above the floating History card again
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 4a94a025c jyviko: Tests: freezing rebuilt arc borders gets its rebuild from a notch across the arc
- 5cbfbe35d jyviko: Tests: interference lists the pair of a solid and an imported mesh as not checked
- 5489599c0 jyviko: Tests: a face with no attachment is a rib's wall, whose feature reports no roles
- f5dfb78ee jyviko: kernel: a cut's tool face blocks a planar role only where it enters the result
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- a31272194 jyviko: Sketch: an included 3D edge keeps its exact curve from the moment it is linked
- 1fb5e94da jyviko: Tests: Intersect's box outline is compared as lines, and a tilted cylinder's whole rim projects to its ellipse
- 9be29894e jyviko: kernel: a cut by a tool apart from the body is the body itself
- 2b0357a22 jyviko: kernel: two planar supports are one when SMLib would call them coincident
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- fcd5f7997 jyviko: Tessellation: a node lying on another chord is untangled like a crossing
- 43ad9d0b0 jyviko: Tessellation: a slit (a side the loops run along both ways) bounds the face on neither side
- 534dffa96 jyviko: Tessellation: the band beside a slit and the sag refinement keep the face on both sides of it
- 7b984936a jyviko: kernel: an emboss's arcs run on their wall's own frame, and its seam is read from the circle's angles
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- f9347aca7 jyviko: Tests: the mirrored union's volume held to the two integrals' 1e-8 accuracy
- bb0b146a9 jyviko: Tests: #1510's parts are weighed by their exact volumes, not 1e-3 mm meshes
- d5bd1ebfd jyviko: Bridge: a support surface's shape read about a station in its middle has the right signs
- a6054603d jyviko: Tests: fillet removals from exact volumes; SMLib's rounds match Pappus and the quadrature
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 6a780de5f jyviko: Tests: the helical groove's removed volume from the cut's exact volume, not a 0.01 mm mesh's
- 80b7ce28e jyviko: Tests: volume checks held to what their measures can tell, not tighter
- a3e42e548 jyviko: Tests: the cap whose loops prism_measure compares is found by its plane, not as the last face
- fad9c44da jyviko: kernel: measure integrates to SMLib's finest accuracy, 1e-8, not 1e-4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 666ccd85d jyviko: Tessellation: sag refinement splits a flat triangle's long side and never across an obtuse one's short side
- 2b22b2cbe jyviko: Tessellation: a face's sides are flipped where the triangles lie closer along the surface the other way
- e0d5ee496 jyviko: Tests: thicken and raised-band histories checked as SMLib reports them, Meet edges and seams included
- 39e1dcea0 jyviko: Faceted boolean: a body's own mesh is closed once its faces' shared corners are one vertex
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 7ec4b7212 jyviko: Tests: a face's flat area may differ from its surface's by the sails its boundary chords bridge
- 4626f83e5 jyviko: Tests: a sketch curve splits a cylinder's one side face in two, not a half side
- 9e97bc470 jyviko: Tests: a split face without its record exports as the body has it, and the next operation joins it
- 47b1d716d jyviko: Tessellation: a whole sphere's loop starts off its poles when its seam has two segments
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 8eb77affb jyviko: Kernel: a body's size counts its edges, so a sphere, cylinder or torus is its own size
- 6a06226ad jyviko: UI tests: the split face's isocurve pieces are each wider than the lines' spacing
- eb40e161d jyviko: Tests: the thread whose display is checked is made as the thread feature makes one, with exact helices
- 71ea626d0 jyviko: Tests: a quarter disc tapered outward builds, and its volume is the exact integral of its sections
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d91d3f2a6 jyviko: Kernel: a body moved by a non-rigid matrix keeps each face's source and paint on that face
- c1ead0fef jyviko: Kernel: a sweep along a smooth path names every wall, and a closed one has no caps
- 6387be309 jyviko: Tests: the high-degree line prism_curve certifies is written at the record's highest degree
- 55f48e4e5 jyviko: Tests: the sample-aliasing trap aliases by its knots, within the degree a record holds
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5547cd98a jyviko: Blends: a picked edge is named as the blend takes it, the rim and not the seam
- 1cb713c96 jyviko: Kernel: an extrusion's wall seed marks only the edges nearest it
- db9cf693a jyviko: Kernel: an extrusion's cap is in its own plane however thin the extrusion
- de16a6b99 jyviko: Kernel: a half turn's caps keep their roles when its end plane is its start plane
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- f8c2fba07 jyviko: STEP import: FILE_DESCRIPTION and the preprocessor name a Y-up exporter again
- 5cc0d5e9c jyviko: Threads: a metric size without a coarse pitch suggests its fine pitches again
- e0545b2bd jyviko: Measure: an arc edge's angle is its span on the circle, not its NURBS parameter
- ae5dc2416 jyviko: Split Body: a face tool runs over its own surface's parameters
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 6a8753443 jyviko: Fill: the height-field fill tries grids up to 64 spans
- dc3d504ba jyviko: geom: a fill patch folds where its normal reverses between neighbours, not where it turns past the middle's
- bac6674ab jyviko: geom: patches about a fill's centre run in the spaces of their own sides, not one space of every edge's breaks
- ea6500559 jyviko: geom: patches about a fill's centre are solved by blocks, their banded interiors eliminated onto what they share
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- b389601b0 jyviko: Ruled surface: a strip on a cone is SMLib's revolve of its ruling, a cone face
- 1e7713d1e jyviko: Fill: a patch's edges and vertices hold its fit's gap in SMLib's tolerance model
- 4faee7dd8 jyviko: Fill: the general fill takes a loop of one or two edges in exact pieces of their curves
- c5b038548 jyviko: Fill: its tolerances follow a size that does not depend on where the body is
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 9095fce42 jyviko: SMLib export: a NURBS edge's interval a rounding past its knots is the NURBS's own
- b68f71a2d jyviko: Fill: a patch's edges are the body's own edges again, circles and ellipses included
- b540faaf5 jyviko: Thicken: a surface turned to its back grows the other way again
- ebb1d843a jyviko: Sweep: a parallel sweep whose path runs along the profile's plane is refused again
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 60f33f6fc jyviko: Feature walks: Repair Part has its fixture, its gap an input and its body renamed with the rest
- 075f307bf jyviko: UI tests: a shown dimension that breaks a later feature does it with a shell left no room
- 242bbc89f jyviko: Fillet rig: the known-failing list follows the SMLib 7e917f0 pin
- 8515dc1a3 jyviko: Blend tests: a vertical round run on up a top round's end arc (ladder 07-fillets/018) is SMLib's to end, and builds
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 229739a70 jyviko: Blends: a smooth edge and an unfinished tangent chain are refused saying why; SMLib's unsupported corner is named
- 0ec97c570 jyviko: Blends: tangent propagation off blends the picked edges alone; a refusal says how to change it
- 94d763c83 jyviko: Tests: a round run on through an earlier one by tangent propagation is matched by the same edges together
- a0eaceab5 jyviko: SMLib tests: a round larger than the cube is cut as if its faces went on, at its exact volume
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 7d00ad78c jyviko: kernel: a patch builds G0 to G4, and Continuity Analysis reads each seam's middle at the order asked
- 102cde292 jyviko: Kernel rig: patched holes graded by their continuity, at clashing corners and in one sheet
- 7c9a9051d jyviko: Patch: the continuity choice's hover text says the corners stay tangent where the faces round them clash
- ef93b18ed jyviko: SMLib: pinned at 7e917f0: a corner patch tangent to its sides, an unsupported corner named, a torus from a NURBS a whole turn round its tube
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- d6b3bf27b Brett Lawson: Shell walls-touch case waits on solidcore#1442 (port fork a759622)
- 29a1ac5a6 Brett Lawson: Sweep cases name their solidcore issues (#1449 draft corners, #1450 curve-sweep placement, #1451 planar sections)
- 4f1ad5cc6 Brett Lawson: Cylinder shell case waits on solidcore#1453 (port fork fddc366 + 98ab1b0)
- c9aa5116d Brett Lawson: solidcore: move the pin to 9b76ac13 (main, with SmApiBrepMaterialCensus, solidcore#1436)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 86e4226ae Brett Lawson: solidcore backend: every UpstreamFixes flag on, and the ignored cases name their solidcore issues
- ce5de8bcf Brett Lawson: Sphere measurement cases wait on solidcore#1437 (trim_boundary_seam_wrap at the poles)
- 5140556c7 Brett Lawson: Blend refusals name their solidcore issues (#960, #1438, #1439, #430)
- 263f34850 Brett Lawson: Offset cases name their solidcore issues (#1440 face picks, #1441 ApproximateSurface, #1060, #1019, PR #1427)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). Its changes conflict with main as it is, so this wave keeps the previous files; the next wave that merges cleanly holds them.
- 21eba6a38 Brett Lawson: claim: solidcore backend for develop
- 8c12073be Brett Lawson: Kernel: a solidcore backend behind crates/smlib, routed per operation
- 12ace4973 Brett Lawson: diagnostics.kernel: read and set which kernel answers, and see the routing table
- 976acfd76 Brett Lawson: Conversion tests: each ignored case names its solidcore issue (#1431, #1432, #1433)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 7d9c84bdb jyviko: geom: the patch fill is tangent continuous across its own C0 knot lines, and tapers what its corners do not allow
- 2397a691c jyviko: geom: the patch fill is faired at the order it is asked for
- 0631d2d3a jyviko: kernel: a three-round corner patched G2 and G3, read off the faces at each seam
- 11af682c0 jyviko: examples: cleaning up rounds by patching their messy faces, G2 and G3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- f11c0c571 jyviko: Bodies: an operation's result is its record, not the SMLib body it was exported from
- b121d8d00 jyviko: frames tests: the moved combine tool's part is made ungrounded
- e0c7867b9 jyviko: run_strict: the box's volume to 1e-9, as SMLib integrates it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 00faac965 jyviko: kernel: a planar sheet's loop splits where it passes one vertex twice
- 5d25684a1 jyviko: sheet tests: the flat pattern as SMLib's exact 2D boolean makes it
- 52343ba23 jyviko: Robustness tests: a round's tangent chain and the lid's closed-form volume
- bc6d31e60 jyviko: GPU tests build their designs with SMLib, and the GPU jobs fetch it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- ab3ba1af4 jyviko: Mesh: a ray through an edge two triangles share crosses one of them
- ccff7224c jyviko: Shell: its planar walls carry their shell roles again
- 068c6a6dc jyviko: Shell certificate tests: the saved strips are saved data, not rebuilt pieces
- b9d4ad74f jyviko: kernel: a planar region inside another's hole keeps its material
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 17465a63b jyviko: Tests: the kernel-cases ladder is the reference for what the kernel builds; the seeded robustness goldens go
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 517fc01dc jyviko: Fillet rig: a regression gate on every pull request that touches fillet code
- b91ad9de2 jyviko: Splines: every degree a B-rep record holds is evaluated, so a G4 blend of degree 9 gets its pcurves
- 175b4f2ac jyviko: GPU tessellation: the shader's basis slots follow the CPU evaluator's highest degree
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 39bf63b16 jyviko: Kernel rig: designed continuity cases, G0 to G4, that prove the measurement
- 52339b7ec jyviko: Kernel rig: fillet cases for the open fillet issues, each with its exact answer
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 44b859fe6 jyviko: STEP import: a whole sphere bounded by one seam has its frame on that seam
- ce71791ec jyviko: Spline surfaces: a closed spline whose outermost knots appear once is periodic
- c7373279d jyviko: Viewport: hidden edges are drawn before the visible ones, so a visible edge is never covered by a light hidden copy
- b3cb826ed jyviko: Engine: an optional check before every command
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 6055ce6fd jyviko: step_in tests: knot multiplicities refused per knot, then by their sum
- ae393fd9c jyviko: step_in tests: a face with too many bounds is refused by the reader's own limit
- fc3a13f17 jyviko: step_in tests: the import's repair notes for added seams and turned faces
- 4688c0f20 jyviko: STEP import: a whole round face whose seam is off its frame's quarter lines is turned onto one
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d2858cb3d jyviko: STEP import: a circle edge between two vertices is the arc between them, however short
- 8b4b4a9d6 jyviko: SMLib pcurves: an end SMLib moves within the tolerance it held the edge at is mapped
- 6c355fdf7 jyviko: step_in tests: the cube fixture's edge directions clear of the assembly fixtures' ids
- efdc245d1 jyviko: step_in tests: a face the reader refuses leaves the rest of the solid as surfaces, named
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- cfaf4ab55 jyviko: Kernel rig: the reason each refused sheet-metal, sweep, crash and ladder case must be refused for
- 30dc4c860 jyviko: Section hatch by part: touching cut parts never look alike
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 2dd505d83 jyviko: kernel tests: rustfmt
- ee4d4b5a5 jyviko: STEP import: a round face off its frame's quarter lines is formed within one turn
- 97a31c0c0 jyviko: SMLib: the prebuilt where a union that seals a void keeps its enclosing shell first
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 025344dee jyviko: A refused face is tinted as well as ringed
- 25642b6d2 jyviko: STEP import: a part's later instances in a window wait for its first, not end the window
- c1713994f jyviko: Body::unmeshed_faces counts on the coarse plan, without making the mesh
- d0081b235 jyviko: kernel: a placed copy is planned as its original, moved, as its mesh already is
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 188011736 jyviko: A part the modelling kernel refuses is named, with what is wrong and what to do
- d3b8c3dc5 jyviko: Browser: Repair Part is planned under #8371
- c15c39443 jyviko: Open and import card: the step marks share one box, size and stroke
- 090fcec6c jyviko: A refused face is ringed in the error colour while the window points at it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 06fbcdfec jyviko: Fillet dialog: Setback shows its default as a length and flags one too small before OK
- baa44fc64 jyviko: Fillet dialog: a setback the field flags is not refused again under the dialog
- b7d813bd6 jyviko: Open and import card: three plain steps instead of a status line
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 33acb6dc3 jyviko: Section cap by crossing count: a body touching the cut body no longer shows through
- c33bae870 jyviko: Section cap: only closed bodies take part in the crossing count
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 97721ad05 jyviko: Fillet setbacks not past where the rounds meet are refused naming the least; the rig grades a refusal by its reason
- 3fd5e138c jyviko: kernel: rustfmt
- 61a1f8bf2 jyviko: STEP import: a face's NURBS form ends where its boundary does, within its tolerance
- cd4f72572 jyviko: STEP import: a surface model's closed shell beside a sheet is a solid of its own
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 912bccef6 jyviko: Isocurve Analysis: faces on one surface share their lines
- 29744b811 jyviko: Preview: the ghost leaves out the surface the changed body keeps
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 739153d3d jyviko: Fillet dialog: one option model, plain labels, refusals in plain words
- e4844753c jyviko: SMLib: the prebuilt with a torus or sphere keeping its NURBS form, and the concave mixed fillet corner
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- fd5319a0e jyviko: docs: the kernel's move from truck to SMLib, as written up on #4012
- 4cb0d6ee9 jyviko: STEP import: a refused solid comes in as a surface body of its exact faces
- e19785620 jyviko: STEP import: a refused solid's surface body faces as the file has it
- 529fb7cf3 jyviko: Release: macOS builds on macos-15 (GitHub retires macos-14 on 2026-11-02)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5a596dd95 jyviko: STEP import: a patch side collapsed within its vertex's tolerance is a pole of the loop
- cfee4a720 jyviko: STEP import: a solid no B-rep can be made of is shown as a mesh of the faces that read
- 5bfecd8a0 jyviko: Tessellation: a loop corner on a side collapsed within its vertex's tolerance is a pole; a face no method plans is left out, named
- 0102f95dc jyviko: Tessellation tests: rustfmt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 0bee8c2ed jyviko: solidcraft-smlib: Brep::edge_face_distance, SMLib's own edge/face gap
- 5d6810128 jyviko: STEP and SMLib: no edge or vertex tolerance past the 1 mm SMLib takes
- 005b1e6ea jyviko: SMLib pcurves: an edge past its face's patch gets a tolerance that covers it
- f327cdb3d jyviko: solidcraft-smlib test: an edge 2.5 um past its patch keeps its interval
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- fd34314d5 jyviko: UI: one continuity control for every continuity choice
- fab8948b3 jyviko: Clippy: assign operators and is_multiple_of in the continuity code
- 1260353f4 jyviko: Fillet Corners: the shared continuity control says what each corner builds
- bf16a76a4 jyviko: SMLib: the prebuilt with eased setbacks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- f042d2073 jyviko: Isocurve test: the spline face's hole is an inner loop of one face (Refs #770)
- cb8712aa0 jyviko: Continuity: one table of orders G0-G4, and one check of what each construction builds
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 0694fd4e8 jyviko: STEP import: an edge through a face's pole is split there
- 1d70ac267 jyviko: tess: a face whose boundary still crosses itself after untangling is filled leniently, not the whole body refused
- 77bd85cab jyviko: cli: snapshot --quality coarse|normal|fine|ultra meshes the bodies at that display quality
- 1404bc1f5 jyviko: STEP import: a spline face's edges are measured on their pcurves only, not by nearest point first
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e2c0c0a20 jyviko: pcurve: the lift check samples its interval's end exactly
- 293d19f65 jyviko: STEP import: a vertex's tolerance covers its edges', and edge samples end exactly
- 19c4a1502 jyviko: SMLib pcurves: an end SMLib sets within the edge's tolerance is mapped onto our interval
- fc08b5f99 jyviko: bspline: a parameter a rounding past the domain's end is that end
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- dfcdefa92 jyviko: STEP import: a loop jumps at a pole to within the tolerance, as its pcurves closed it
- 7ba82d729 jyviko: STEP import: spindle and horn tori, and a negative major radius
- 3a7b51f72 jyviko: STEP import: an edge's distance from an analytic face is measured before its closed-form pcurve
- fcb162448 jyviko: brep: the geometry check reads a pcurve at its edge's parameter within the interval's rounding
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 07cb8c7cc jyviko: STEP import: an edge off its face's surface carries its gap as its tolerance
- 21c64fb24 jyviko: tess: an edge loop of fewer than three segments is split until it encloses an area
- 9da3174bb jyviko: solidcraft-smlib: a revolution goes to SMLib as its NURBS form alone
- 31b9410f5 jyviko: solidcraft-smlib: a horn torus to rounding is no ring torus
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 05f1c6b9a jyviko: Tapped holes: the tap maker's drill for every form, and a drill of the user's within 5%
- 87e7fe472 jyviko: Tapped holes: a preference keeps metric's major-less-pitch drill
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 9717fab2f jyviko: Tapped holes: Rc and NPT, and a modelled thread with the thread's End
- 72e0e0094 jyviko: Ladder 06/017: the golden entry from a run of the case
- 376a91ad7 jyviko: Hole presets: a modelled tapped thread and its End, and every catalogued size
- b6c3b32a9 jyviko: Tapped holes: an Rc or NPT hole takes the stocked drill under its standard minor
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 361b35afe jyviko: Thread: a shoulder thinner than the overrun's reach is still a shoulder
- 5fe141c0f jyviko: Thread: the start never fades; ease_in is gone
- 386598282 jyviko: Thread dialog: the Ends section is Start (None, Chamfer) and End (Square, Fade)
- 80e47130b jyviko: Thread: the pipe forms in the dialog, ISO 7-1's Rp, a chamfered tip on a taper thread
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 2c4212c04 jyviko: Thread: the chamfered tip at the start or at both ends
- 75deb73aa jyviko: Thread: ISO 228-1, ISO 7-1 and NPT pipe threads, taper threads by a radial law
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 28e3b8a19 jyviko: Continuity in words: surface dialogs and Continuity Analysis show no G codes
- 81ecc872f jyviko: Guide: the Fillet dialog's Type and Corners in their new words
- d1a8f0417 jyviko: Thread: a boss thread keeps clear of the plate below
- a30a85698 jyviko: Thread: the chamfered tip reaches ISO 724's external minor diameter
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 4f6f254d0 jyviko: smlib: a setback left open is a profiler span like every other SMLib call
- 676919d4d jyviko: tess: a face no method plans is filled leniently in (u, v), and named in the stats
- 1acbe2806 jyviko: Fillet dialog: plain words for continuity, Corners with Setback out of Advanced
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- b2fc5e1fb jyviko: smlib, kernel: a refused setback corner is named by its point and why
- 855575473 jyviko: SMLib: the prebuilt with setback-open corners and the refused-corner index
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d8282b336 jyviko: doc, engine: corner: g2 sets each corner back for its G2 patch
- 8fbb575a5 jyviko: kernel-cases: a continuity check, and ladder 07/015 graded by it
- 808913777 jyviko: kernel: G2 corners at concave corners, mixed ones refused
- ba38fbd2a jyviko: kernel-cases: ladder 07/019, a concave corner's G2 patch
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 6263db8d6 jyviko: smlib: Brep::blend_setback_open, set-back corners left open with their holes
- d63a50c47 jyviko: kernel: seam diagnostics give every station's values
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- faffa6664 jyviko: Profiler: the diagnostics.profile test holds while other tests record
- 7fde0bdff jyviko: Profiler: docs/perf.md says how to switch it on and read it
- 29225d2c8 jyviko: geom: fill_matched, a height field G1/G2 to the faces beside its loop
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 10ea00e74 jyviko: Profiler: every SMLib C API call is a span, timed by the C API itself
- 319c0bc9f jyviko: Profiler: kernel operations and STEP/IGES import stages are spans
- 9cd655259 jyviko: Profiler: commands, feature evaluation, io; diagnostics.profile; CLI --profile
- fafd977b0 jyviko: Profiler: the Profile operations preference switches recording at run time
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- f6645e2c6 jyviko: Threads: a modelled thread's tangent flank joins are not drawn
- 970c29745 jyviko: Smooth edges: a measured crease is kept apart from a tangent display join
- 541b94a60 jyviko: Smooth edges: hide only joins inside one smooth surface (G2); draw tangent joins
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 57d48aa9f jyviko: Clippy: the kernel's and engine's warnings on develop
- b52a01e29 jyviko: Attribution: the hand-written box STL of kernel case 4561
- 15caa50d2 jyviko: CI affected crates: no truck crates are vendored any more
- c95580d04 jyviko: Smooth edges: one G1 rule on exact surfaces and pcurves
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d13300b0a jyviko: cargo fmt: the format-40 change and the rebase's export list
- 873124c49 jyviko: CI: develop runs like main; SMLib is fetched after the Rust cache is restored
- 6517d1ee6 jyviko: Arabic and Hebrew catalogs: #4414's thread direction labels out, as in every other catalog
- fddb57c0d jyviko: Thread dialog: its labels in the catalogs; Arabic and Hebrew pending messages compare in display order
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 4e26dc640 jyviko: The command line and the web app link SMLib by default too
- 826f36a79 jyviko: CI and releases fetch SMLib before building
- 8aea8e5a8 jyviko: Format 40: a thread's hand on tapped holes too; v0.24.0's handedness opens as hand
- 652d3a2cb jyviko: ui: main's browser picks (#4774) read the placed model through session_world
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 562a5bd33 jyviko: Formatting: rustfmt over the rebased branch
- bc15221fa jyviko: The desktop app links SMLib by default
- e476aba94 jyviko: SMLib in the browser: built with wasi-sdk for wasm32-unknown-unknown
- e1ad6ec1a jyviko: SMLib links prebuilt: one build per commit, pinned by SHA-256
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- a57ce13e7 jyviko: thread: a shaft thicker than a modelled thread is refused, never turned down
- 6b9f5e0e4 jyviko: thread: main's screw direction (#4414) out; the thread's hand is the one direction
- 5fc160732 jyviko: Main's new callers of the placing calls that now return their error
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 3e9c70e26 jyviko: Cargo.lock: resolved for the merged manifests
- 6e15b9676 jyviko: engine, kernel-cases: tangent joins out of the corner-pick count; 3383 and 5024 recipes to main's rules
- 46294c7c2 jyviko: kernel: STEP placements by a transformation operator keep its axes and scales
- 3d0f6aa3f jyviko: kernel: IGES trim pieces closed onto their meeting points in main's assembly reader
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d63aa814f jyviko: threads: main's tapped-hole sizes and shaft turn-down on the reworked thread
- cfc393d68 jyviko: Main's new callers of the placing calls that now return their error
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- b310512e9 jyviko: kernel-ladder: tier 11 threaded parts grade their geometry
- f6b42d416 jyviko: kernel-ladder: 07/016 is a refusal; 07/018 the same corner with r2; cases.py makes 013
- fb384be9c jyviko: smlib: build against SMLib a15b5a2 (replay of usd-brep 1.0.1 with the fork's fixes)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d3f771998 jyviko: kernel-ladder: tier 07 corner cases grade their geometry
- 0d7acb0ce jyviko: kernel-ladder: 08/007 grades the rounds run into the chamfer
- c9dcc42a1 jyviko: kernel-ladder: tier 09 shells grade their geometry
- 05e0dc17b jyviko: kernel-ladder: 10/008 grades the vents as four times one
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 191b2f4c4 jyviko: kernel-ladder: cases.py makes every committed case again
- 977230b7c jyviko: kernel-ladder: tier 04 cases grade their geometry
- 84473f61f jyviko: kernel-ladder: tier 06 grades the threaded boss; both hands and Tr40x14(P7) added
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 8edf5b873 jyviko: kernel-cases: the ladder's golden recorded after the thread rework
- 2e1c1097a jyviko: geom: a degenerate point's normal steps into the parameter interval
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 3287bcba9 jyviko: Threads with several starts
- 7bfc184e8 jyviko: A modelled thread's chamfered tip (ISO 4753)
- d433ce2c9 jyviko: Thread runouts: the groove fades out instead of stopping square
- fdede5a0a jyviko: Thread work in rustfmt's layout
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 610173e1f jyviko: combine: move each tool into its target's frame
- 3fb263d00 jyviko: hole: keep a countersink's tool within its rim above the face
- 1171c4c2a jyviko: A sheet metal body mirrored or patterned into new bodies is sheet metal (#3353)
- 5a9bf4742 jyviko: A converted sheet takes its rule's values at its own thickness (#4328)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 48abbbcc1 jyviko: kernel: a vertex a face's loops pass twice is one point of its (u, v)
- 1df330c79 jyviko: engine: a shell that opens no face makes a closed hollow body
- 5aeff43f8 jyviko: smlib: a horn or spindle torus face comes out as its NURBS form
- bd4e1926a jyviko: kernel-cases: 2928's base extrudes the ring it describes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 903e371fa jyviko: geom: a face's box reaches its boundary's extremes, not its samples'
- cfe1b8b92 jyviko: step: a loop through its surface's pole has its seam
- 0bea4631b jyviko: kernel: IGES trim pieces that miss their meeting point are closed onto it
- 0e6681a2d jyviko: kernel: the largest fitting fillet shrinks only on a refusal as too large
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 237f0ae74 jyviko: kernel, kernel-cases: a convex blend overflowing a cliff is built, with its analytic answer
- 7d300984b jyviko: kernel, kernel-cases: a shell whose walls would meet is refused, saying so
- 3be6ad433 jyviko: kernel: a tangent chain stops where the edges' convexity flips
- 098fac037 jyviko: geom: a face's loops lie in one turn of its periodic surface
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 810f0d66d jyviko: doc: a join groups pieces that touch nothing; only edge and point contacts are kept apart
- 1d98d5111 jyviko: smlib: solids touching round a pocket each export as one closed shell
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 773e627b4 jyviko: tess: no edge segment spans more than a quarter turn; loops touching at a vertex close
- 806268714 jyviko: tess: a face's sampled boundary never crosses itself
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 94ee28d5c jyviko: doc: a join keeps solids that only touch as separate bodies
- 3e2b109cc jyviko: engine: feature commands take touching; a join's result notice
- ec6fa9706 jyviko: kernel: a seam with one face on both of its sides is a seam, and no pick takes it
- 19cf11ef3 jyviko: kernel-cases: ladder 07-fillets/016's second fillet rounds only its picked edge
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 42e50a87c jyviko: smooth edges: tangent joins of planes, cylinders and cones, along straight splines too
- 89e23d1eb jyviko: record: a body built from a sketch has new edges, with no origins
- 8eb93ff06 jyviko: step_in tests: the cube fixture's edges lie on their lines
- 4b418c0d2 jyviko: kernel: how a body's material regions meet, read from the record
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 667ee5665 jyviko: kernel tests: a blend meant to run along a tangent chain asks for it
- 74d02d2a0 jyviko: smlib: the fork with NVIDIA usd-brep 1.0.1 merged (f7f012b)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 306c7b75b jyviko: pcurve: a rim at a steady pace on a spline face, read from the edge itself
- 28e0eea80 jyviko: pcurve: each use's closed form or none, and a kernel's trims for the rest
- 1bf206259 jyviko: STEP and IGES import: SMLib makes the pcurves that have no closed form
- 879958721 jyviko: pcurves: a flat patch's are a plane's; SMLib's sheet loops read either way round
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 2883981a0 jyviko: brep: meridians, revolutions and whole turns exact on their forms
- 6c385c843 jyviko: sew, step: face forms from the boundary's extent; trimmed profiles exact
- fd71e6a95 jyviko: kernel: assembled faces and edges on their NURBS forms
- f6f8b28c0 jyviko: Records require NURBS forms on circles, ellipses and curved analytic faces
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- fd873bb83 jyviko: sew: an edge folded across a bend gets a Hermite pcurve on the bend's form
- c376e8403 jyviko: step: imported faces and edges on their NURBS forms
- 69702833f jyviko: solidcraft-smlib: ellipse edges on their NURBS form, as circles are (fork 0c5868e)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- c5dbf879a jyviko: brep: exact pcurves of forms: cut on planes, along the parameters of spline faces
- a4180ab42 jyviko: sew: faces and edges on their NURBS forms, their pcurves exact
- 57080f88c jyviko: fixup! sew: faces and edges on their NURBS forms, their pcurves exact
- 76a254137 jyviko: sew: a circle on a revolved face is labelled on that face's frame
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- f070eee2b jyviko: brep, kernel: a face's side is read on its NURBS form (#4149)
- 58f60adbf jyviko: kernel: an assembled face keeps its NURBS form
- 807010c49 jyviko: brep: the NURBS forms of lines, circles, ellipses, cylinders, cones, spheres and tori
- f370d1e42 jyviko: brep: forms on their frame's quarter grid, across the seam
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 6892ceac7 jyviko: brep, kernel: code that reads an edge's angles takes them from the circle, code that evaluates takes the NURBS form
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- b1326e48d jyviko: brep: an edge on a line, circle or ellipse carries the NURBS form SMLib holds it as
- 6adba90e2 jyviko: solidcraft-smlib: circle edges on their NURBS form, SMLib's trims kept on them (fork deec9cb)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e6f993fff jyviko: Revert "kernel: merged topology counts no seam edge (a face on both sides of it)"
- 4ea29e307 jyviko: kernel-cases: 818 counts its two cylinders' seams, as every case counts edges
- de0e5bf52 jyviko: kernel: a tangent chain stops at a smooth edge
- 369c897d8 jyviko: kernel, cli: clippy and the cli tests build again
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 84bd2daad jyviko: doc, engine, kernel: solid.fillet and solid.chamfer round each picked edge's tangent chain by default
- d0ff1dcfa jyviko: doc: an extrude's taper without a corner rule picks one per profile
- 5e7aba8df jyviko: loft sections matched to their neighbours
- 2752eee61 jyviko: kernel: merged topology counts no seam edge (a face on both sides of it)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- b6a3b31ff jyviko: brep: a face on a cylinder, cone, sphere or torus carries the NURBS form SMLib holds it as
- 2e26e0567 jyviko: solidcraft-smlib: the export reads FACE_NURBS_FORM
- 03db54a23 jyviko: solidcraft-smlib: SMLib at the merged fixes: slice, seam check, analytic revolve, draft corners, blend refusal, union of many, NURBS forms (fork 03c14ca)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- bcbb99005 jyviko: kernel, smlib: a blend larger than its faces is SMLib's refusal; blends take exactly the given edges
- 13e49e069 jyviko: engine: solid.fillet and solid.chamfer say they blend exactly the edges given
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 2ffbbc74d jyviko: step: a cone within the file's uncertainty of its limit plane over the face is read as that plane
- 0185ccc1e jyviko: solidcraft-smlib: Brep::union_all, the union of many bodies in one SMLib call
- 0213c3dfa jyviko: kernel: union_all, one SMLib union of many bodies checked once, history over every operand
- 83d965f30 jyviko: doc: a join into one target and an intersection's tools are one union_all call
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 045961445 jyviko: doc: an extrude's taper saves how it closes the profile's corners
- 1b5ca02b8 jyviko: solidcraft-smlib: SMLib's tangent draft corner meets lines at an edge (fork ccc56fd and docs)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 09c979a4b jyviko: brep: a full circle in a profile is one closed arc
- 8e6c24aeb jyviko: kernel: a raised band reads its arcs' circles from the record
- d10041743 jyviko: kernel: emboss reads a wall's span from its arc's interval
- 0414f5a7a jyviko: kernel: assemble's unused CurveEval import goes with edge_point
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 99024b368 jyviko: solidcraft-smlib: SMLib at the candidate: solver statuses, range-end refinement, arc sweeps as cylinders (fork 1c8e415)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 44744d3aa jyviko: kernel: a face's boundary runs along a pole as its pcurves say
- 01845c189 jyviko: kernel: planar sheets are built one simple loop at a time
- 529c2cf04 jyviko: solidcraft-smlib: SMLib's area counts the faces between solid and void only (fork 8400690)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 78937d1db jyviko: brep: one basis-derivative routine, bspline::basis_derivatives
- afce22bb6 jyviko: solidcraft-smlib: mass properties of any body, by its material regions (fork 311946c)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 81cef1c60 jyviko: kernel: a free ruled strip is the exact ruled surface to a far curve of its own
- 9e2c1c57c jyviko: kernel: ruled surface docs and test for the free strip's far curve
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 2a09b9943 jyviko: kernel: the test target compiles: the last tests on the record and SMLib
- 2f83aaa5d jyviko: kernel: clippy's own fixes across the kernel (needless borrows, assign ops, contains)
- f6afec8ea jyviko: kernel: dead code left by the port deleted; clippy -D warnings clean on all targets
- a0e17daa5 jyviko: kernel: cargo fmt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 1b7fda4d3 jyviko: kernel: surfaces and SMLib blends without the smlib feature gate
- e1b9ea10c jyviko: kernel: placement, history, mesh-memo, display and issue tests read the record
- 8237cc927 jyviko: kernel: mesh, lump, loft-rail, untouched-face and intersection-curve tests read the record
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- af4e97b64 jyviko: cli: the rig and the oracle reach MeshTolerance through the engine
- f7daf6124 jyviko: doc, engine: the unused revolve targets and the formatting of the exact tools
- caa5ed0e6 jyviko: kernel: twisted and scaled sweeps round corners by the plain sweep's corner model
- dead22ba7 jyviko: kernel: corner rules for direction, rails and closed paths; no feature gate on SMLib sweeps
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 712caf8bf jyviko: engine: no boolean retries to report; overlaps are SMLib's exact intersection
- 431c3f6d0 jyviko: doc: plastic features' tools stand on the face as drawn
- 4ca7793a3 jyviko: doc: a hole in sheet metal is a cut-out or a bore by its drill's direction
- 8d91c19f1 jyviko: brep: an intersection curve's point is a function of t alone
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 7646e8ff6 jyviko: kernel: compiles on the record — trim reads the tool's side near its body; mesh memo typed
- 748e796b2 jyviko: kernel: sweep histories attach with no edge origins given
- a5f5809ba jyviko: kernel: a ruled strip's side builder needs no mutable binding
- ee79235f5 jyviko: kernel: surfaces, bridge and loft rails clippy-clean; picked_loop gone
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 7d9eb68e4 jyviko: solidcraft-step: a record's layout (solids, voids, sheets) and outer loops for every writer
- ed43871f7 jyviko: kernel: IGES export from the record
- 1d4811201 jyviko: kernel: STEP import tests and docs without the deleted face splitting
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 30ddda306 jyviko: solidcraft-step: write a schema 4 record as ISO 10303-42 topology
- d59bb0084 jyviko: solidcraft-step: revolutions under axis-keeping placements; void shells as the record has them; Reader::frame
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 4a8ca6d0f jyviko: kernel: Assembly::finish ends in Brep::canonical
- bd1095fff jyviko: kernel: the general fill's tests read the record; five- and six-sided fills are patches about a centre
- 5aaf405d8 jyviko: kernel: the second-derivative tests check the record's SurfaceEval::second
- 4897ce17b jyviko: kernel: loft rails tests measure against the record's surfaces
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 849bb1f24 jyviko: kernel: face sections along a direction as SMLib's exact curves
- 876333480 jyviko: doc: an iso link along a direction on a solid is SMLib's exact section
- d9274aaf1 jyviko: kernel: the point-path sweep test expects the polyline's walls
- 13e9aca7e jyviko: kernel: exact projection, section and iso curves exported; SMLib at the fork's integration head
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 7b5d732e3 jyviko: kernel: project_onto_face, sketch curves projected onto a face as SMLib's curves
- 0ef5b910f jyviko: doc: a curve projected onto a solid's face is SMLib's projection of the curve
- 95e9a80fa jyviko: kernel: iso_curves, a face's isoparametric curve exactly, trimmed by its loops
- 814475f4f jyviko: doc: an iso curve of a solid's face along u or v is the surface's own curve
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 6d0993817 jyviko: kernel: a ruled strip whose rulings turn along a free-form edge is refused, not fitted
- a6b41dd82 jyviko: solidcraft-smlib: Brep::project_curves, curves projected onto a face as SMLib's B-splines
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 1708fe0e0 jyviko: brep: Brep::canonical, any record in canonical order
- 98548fe16 jyviko: kernel: one canonicaliser; one tensor sheet
- f8e175273 jyviko: brep: Brep::split_edges, a record's edges split exactly at parameters inside them
- 65e141ac4 jyviko: kernel: stitch splits an edge at another sheet's vertex lying on it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 30b02cdfa jyviko: kernel: the solid loft's rails anchored by loft_rails::railed; path curves shared
- 0d611ed84 jyviko: kernel: surface sweeps mitre at corners, as the solid sweep does
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- c7afe5eb4 jyviko: doc: a lip is SMLib's raised band and a groove its exact rim band, nothing else
- 89423b88e jyviko: doc: a sheet bore is cut once, with the drill clipped to its panel
- f4fa8a407 jyviko: kernel: the touching-face checks, extrusion batching and clearance probe are gone
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 7c0d9b5e8 jyviko: kernel: the general fill on loops of five or more edges, its patches about a centre
- 87907628e jyviko: kernel: surface match on the record, through bridge's record API
- 22fde06a3 jyviko: kernel: loft blend on the record, through bridge's record API
- 7e7193b33 jyviko: doc: the faceted thread groove is gone; the groove is SMLib's exact screw sweep
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- beebf2203 jyviko: kernel-cases: --dumps=DIR leaves each failing SMLib call's inputs for replay
- 83c0f4e2c jyviko: AGENTS.md: SMLib is the kernel; no switch, no other kernel
- 1b27c134d jyviko: kernel: an intersection curve is where SMLib's imprint cuts, exactly
- 9398b2586 jyviko: kernel: intersection edges exported from the crate root
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e00645ca5 jyviko: kernel: crate root follows the split, surfaces and SSI ports
- 252b2947a jyviko: kernel: mesh bodies built by Body::of_mesh; fuzz booleans have no fallback counts
- 0013249c4 jyviko: kernel: Patch of a body's edges is fill's patch with no crown
- 08f061b02 jyviko: kernel: boundary surfaces on the record
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 9b5e0a8b4 jyviko: kernel: T-spline sheets as record faces; NURBS faces on the record
- 5c1b335e1 jyviko: kernel: bridges read their support faces on the record
- b5a7d52b7 jyviko: kernel: bridges and surfaces read the body's own record
- c83bd8f94 jyviko: kernel: T-spline and offset tests read the body's record
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- f6fb1af00 jyviko: kernel: an arc's knots built without a borrowed temporary
- d3ca6e089 jyviko: kernel: loft rails on exact NURBS sections, the last section met where the rail ends
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 0cbd9e19d jyviko: kernel: profile segments as exact schema 4 edge curves and pcurves
- e1326f37f jyviko: solidcraft-smlib: Brep::stitch and Brep::offset_sheet, and the fork pinned at e3d478d
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 585334a29 jyviko: kernel: planar source lineage on the record, coplanar faces joined by SMLib
- 5c16e8dd1 jyviko: kernel: coplanar faces joined by SMLib's merge_faces, the record read from the body
- c802458ef jyviko: solidcraft-smlib: Brep::face_points, a point inside each face (smlib_face_points)
- 453a4dec7 jyviko: kernel: a trimmed piece's side is read at a point inside it, exactly
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e520c9d42 jyviko: kernel: a body's record may be a surface body of open shells
- befcfecb7 jyviko: solidcraft-smlib: Brep::split_faces and Brep::split_body on the fork's split shims
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d5d783066 jyviko: kernel: outline_union deleted, a retry of the old boolean with no caller left
- 25b128698 jyviko: kernel: crate root follows the query-module port; SMLib at the fork's integration head
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- abf46cc21 jyviko: kernel: clearance reads each face's surface from the schema 4 record
- f53405d6b jyviko: kernel: plane_fit fits and certifies planes on the schema 4 record
- bd956b88a jyviko: kernel: spline_conv makes record curves, surfaces and tensor sheets
- abb7c37d8 jyviko: kernel: face_params deleted; a face's boundary in its parameters is the record's pcurves
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e463eabb6 jyviko: kernel: topo reads each face's surface from the schema 4 record
- 80e34cc8c jyviko: kernel: surface_kind reads faces and edges off the schema 4 record
- b0ad6f62b jyviko: kernel: body distance projects onto the schema 4 record's faces and edges
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 3ef93b363 jyviko: kernel: the general fill is the iso-parametric patch on three or four edges
- cfb5dc3ba jyviko: solidcraft-smlib: Brep::planar_faces and Brep::boolean2d
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5fa086dd5 jyviko: kernel: record.rs records history on the schema 4 record, by index
- c5c411de5 jyviko: kernel: an assembled record is the body; its history through record::attach
- 796d3e7d2 jyviko: kernel: boolean_record composes histories; healing is heal's
- f56a94eac jyviko: kernel: exact path helpers exported; SMLib pinned at the fork's integration head
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 7952516eb jyviko: doc: sweeps along linked and planar curves follow the exact curves
- 43e8b0349 jyviko: kernel: a point path's polyline is swept as the lines it is, however smooth
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 166bfbacd jyviko: brep: records of bodies apart from each other join into one; islands stay inside their voids
- 065e61ec7 jyviko: kernel: Body is its schema 4 record, with its SMLib body made once
- 22734a55f jyviko: kernel: trim on the record: split, side by the tool's field, pieces removed
- 7bbdd3713 jyviko: kernel: untrim on SMLib (smlib_untrim_face), its history from SMLib's tags
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 1d289dfd6 jyviko: kernel: fairing works on record curves and surfaces; fair_faces rebuilds through SMLib
- f9f59d826 jyviko: brep: SurfaceEval::second, a record surface's exact second partial derivatives
- 748d9f25e jyviko: brep: CurveEval::derivs, a record curve's point and first derivative
- e01018839 jyviko: kernel: seam continuity measures the body's record
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 9f71e93e2 jyviko: kernel: Delete Face with healing on the schema 4 record
- 3bd1cc534 jyviko: solidcraft-smlib: Brep::merge_faces, SMLib's removal of topological edges and vertices
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- cbf28a4fd jyviko: kernel: the prism boolean modules are gone from the crate root
- 9268a1e88 jyviko: solidcraft-smlib: SMLib's "no change" as Error::NoEffect, the fork pinned at its integration head
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- b11433bc5 jyviko: kernel: smooth display edges classified on the schema 4 record
- 3ca3638c5 jyviko: kernel: the curve, loop and vertex blend modules are gone from the crate root
- b0cc84b28 jyviko: brep: a record moved rigidly, exactly
- fa3d914af jyviko: kernel: SMLib measures mass properties at its documented 1e-4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- ba99405e2 jyviko: doc: a pattern or mirror of a pattern or mirror copies what that one made
- 386b1d123 jyviko: doc: a sweep round a closed path starts where the profile is (#3345)
- 5df8a5565 jyviko: engine: an extrude Join, Cut or Intersect leaves hidden bodies alone (#2464)
- f10dfd8d0 jyviko: kernel-cases: crossing equal holes leave each wall in two faces
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 6e17d26dd jyviko: brep: a spline's closedness is worked out once, not on every evaluation
- 51d7fc413 jyviko: kernel: IGES trimmed surfaces close their loops and split into separate bodies
- f71cb3d99 jyviko: engine: revolve about a construction axis given by name
- 85da7d6c2 jyviko: engine: count a face pick's work as it is done
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d61efb306 jyviko: kernel: a face's boundary takes its (u, v) from the record's exact pcurves
- 4b8edef06 jyviko: kernel: the tessellator's tests plan the body's schema 4 record
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 667cd3356 jyviko: solidcraft-smlib: pcurves on B-spline faces are SMLib's own UV trims
- e57f2f2a5 jyviko: brep: a face's points search one grid of its surface, made once
- 1bc0df6d0 jyviko: doc: a join of many tools into one target unions them in a balanced tree
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 69a7a85cb jyviko: kernel: SMLib sweeps round corners and along free-form paths, lofts with holes or to a point, drafts on a foot
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- cac7d6eff jyviko: kernel-cases: the hollow ball of case 450 has two shells
- faae48d6e jyviko: solidcraft-smlib: Brep::loft_to_point, and the fork pinned at 0294982
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 520d934fe jyviko: kernel: SMLib sweeps that twist, scale or follow rails, railed lofts, and paths of points
- f870ecb87 jyviko: solidcraft-smlib: pin the fork at ffaf4e8, offset merge and intersection-edge ends
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e1a257169 jyviko: kernel-cases: SOLIDCRAFT_KERNEL=truck grades as the default kernel
- 1336352a4 jyviko: solidcraft-smlib: pin the fork at 2d7c7ed, the second round of SMLib C++ fixes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5a630daee jyviko: tess: a hole in a closed face lies in its outer loop's period
- 693cba4e2 jyviko: kernel: a curved strip straight across and narrower than a side is its boundary nodes alone
- 20d4b1f4e jyviko: kernel: a spline wall winding round an axis sends its body to the display plan for meshing
- 5ed1e95a4 jyviko: kernel: a cut grid past the grid cap thins its lines instead of giving the face to Delaunay
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 69ad1ae45 jyviko: solidcraft-smlib: the curve list carries nothing in a build without SMLib
- 1a5e60349 jyviko: brep: a point's parameters on a spline winding several turns are found on its own turn
- e1c631dd3 jyviko: brep: a pcurve keeps its tangent where its curve is smooth through a full knot
- 829d161f6 jyviko: brep: the projection runs Newton from up to 32 starts, nearest first, until one lands
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 02bfd6e10 bherbruck: kernel: draft through SMLib
- d20e91f8c jyviko: doc: re-anchor a stored face pick strictly inside its named face
- 36b7aa267 jyviko: solidcraft-smlib: a build without SMLib keeps the sweeps' curve lists without a dead-code error
- d22e89bcc jyviko: solidcraft-smlib: a solid touching itself along an edge comes back with every edge bounding two faces
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 714475b84 bherbruck: kernel: measure through SMLib's exact mass properties, checked against the mesh
- 07c36cfd0 bherbruck: solidcraft-smlib: Brep::chamfer_sides, and Error::Unsupported for a radius law with a corner
- ae1d746ae bherbruck: kernel: chamfers with two setbacks through SMLib
- a043e4ae2 bherbruck: kernel: an SMLib blend's corner patch comes from the edges meeting there
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 8fde178fe Brennen Herbruck: kernel: any schema 4 record into SMLib with its order, healed where refused
- 5014c4f17 Brennen Herbruck: kernel: with SOLIDCRAFT_KERNEL=smlib, STEP solids are SMLib's bodies
- 8ad09ec64 bherbruck: smlib export: a face's loop crosses its poles where the face's parameter box says
- f4da25243 bherbruck: solidcraft-smlib: the fork at bf7c272, whose operation results hold their own gaps
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 96bdbbf3b bherbruck: docs: SMLib vs truck triage of the sweeps, threads and shell cases
- 82fe0e59e Brennen Herbruck: solidcraft-smlib: Brep::imprint
- 7e208529c Brennen Herbruck: solidcraft-step: each record face names its face in the file
- 863afb5e3 Brennen Herbruck: solidcraft-smlib: an arc past a full turn goes to SMLib a turn back
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- baae4ee19 jyviko: kernel: fillets and chamfers through SMLib when SOLIDCRAFT_KERNEL=smlib
- f73d40383 jyviko: kernel: an SMLib blend pick at a seam's end takes the sharp edge there
- 1d8299aed jyviko: kernel: an SMLib body keeps each edge's and vertex's tolerance through its record
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 29d307bdc jyviko: doc: a modelled thread through SMLib cuts the exact groove
- 5dd3acdec Brennen Herbruck: kernel-cases: on the kernel branch a thread off its hole or shaft size is refused
- b900d6d46 jyviko: kernel: solids an SMLib boolean leaves touching come back as separate solids
Co-authored-by: Brennen Herbruck <brennen.herbruck@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 0f3d6f177 jyviko: kernel: shell, offset faces and thicken through SMLib, with SMLib's history
- 82865e283 jyviko: kernel: a body SMLib walks some loops of the other way keeps its order
- 6bfbe1041 jyviko: kernel: an SMLib shell opens a round wall whole; split pieces press on either kernel
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d672cfa01 jyviko: kernel: one switch, SOLIDCRAFT_KERNEL, picks the kernel for every operation
- f35f06d98 jyviko: kernel: a revolution that is no analytic surface goes into SMLib as its B-spline
- a6ca4e0dd jyviko: AGENTS.md: one switch, SOLIDCRAFT_KERNEL, in place of the booleans-only note
- 51211ad1f jyviko: solidcraft-smlib: offset faces, thicken, and NoRoom for walls with no room
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e35b4d744 jyviko: kernel: revolutions of a line square to the axis go into SMLib as planes
- 00e43aacc jyviko: kernel: an operand SMLib's check refuses goes through SMLib's healer
- 94c159825 jyviko: kernel: SMLib's round faces decode as truck's own revolutions are laid out
- ff0f7ccfa jyviko: kernel: a body's record for SMLib takes a larger tolerance where an edge needs it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- b27751d43 jyviko: kernel: planes go into SMLib as its planes; analytic angles start at zero
- 640d3d9ea jyviko: kernel: truck's extruded circles go into SMLib as its cylinders
- 1980f9743 jyviko: kernel: SMLib's export keeps every face of a void's shell
- c344801cc jyviko: kernel: note that the engine's and CLI's `smlib` features reach SOLIDCRAFT_BOOLEANS
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5238840bc jyviko: kernel: booleans through SMLib behind SOLIDCRAFT_BOOLEANS, with SMLib's history
- d271add1a jyviko: kernel: revolutions go into SMLib as its cylinders, cones, spheres and tori
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- c992630e1 bherbruck: ATTRIBUTION.md: rows for the kernel rig's STEP import fixtures
- b90a5851c jyviko: kernel: open a half sphere's loop at its pole, so its seam closes
- 54542890d jyviko: kernel: hold every display-plan triangle to the chord tolerance
- f7336497f jyviko: AGENTS.md: the kernel does geometry, sugar lives above it
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 201ca9a81 Brennen Herbruck: smlib tests: score SMLib's GlobalSurfaceIntersect on the SSI corpus
- f8b48d0e4 Brennen Herbruck: smlib: pin the fork at 70e1bf5 (capi: surface/surface intersection)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 17eafa2d4 Brennen Herbruck: solidcraft-smlib: revolved surfaces into SMLib as exact rational B-splines
- 1edeb2a6f Brennen Herbruck: tests: SSI corpus fixtures (119 cases with exact truth)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 58ce14f45 bherbruck: kernel-cases: count ranges, a watertight mesh check, and per-case timeouts
- e809edd33 Brennen Herbruck: kernel-cases: thread cases that are slow by nature get 600 s
- 8cb976b9b bherbruck: kernel-cases: watertight checks the display mesh, welding vertices by distance
- 3feb9ba2c Brennen Herbruck: kernel-cases: tessellation cases from mesh-hole reports grade watertightness
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 35ebc816b jyviko: kernel-cases: a missing capability's message is the case's own text
- 248fee75b jyviko: ladder: every ladder run measures one case at a time
- e1575385b Brennen Herbruck: kernel-cases: a thread off its hole or shaft size is refused
- d7381a1fa bherbruck: kernel-cases: threads fit a hole or shaft off the thread's size again
Co-authored-by: Brennen Herbruck <brennen.herbruck@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 75aa8acb6 Brennen Herbruck: kernel-cases: sweeps skipped sources (72)
- 678a70da2 bherbruck: kernel-cases: shells as a graded count, no SMLib verdict where it can't take the record, $OUT
- c24b066d2 bherbruck: kernel-cases: an outcome for geometry with no single manifold answer
- 8764a76ff Brennen Herbruck: kernel-cases: threads cases from #1995 and #3368 (finely faceted booleans), skipped #987#3130#3824
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- a9002968f Brennen Herbruck: kernel-cases: sweeps sweep and pipe cases from #96-#3505 (end scale, rails, corners, closed paths)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5e71db662 Brennen Herbruck: kernel-cases: sweeps revolve cases from #2183-#4008 (refusals, flush ends, dome seam, primitives)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 739524a17 Brennen Herbruck: kernel-cases: sweeps lofts from #271-#3412 (zig-zag pairing, ring sections, flush joins and cuts)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- ce201eea1 jyviko: kernel: SMLib spheres cut by a boolean decode oriented and meshed
- 62142ef38 jyviko: brep: a revolution of a closed profile is periodic along it
- 62124a711 jyviko: kernel: spline edges on part of their curve load as that piece
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- a7c0109ea Brennen Herbruck: kernel: boolean runner grades the seeds against a reference volume
- 7bb74d1c6 bherbruck: kernel-cases: an smlib feature for the CLI, and no grading of a kernel the build isn't running
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- ac6ddbdbe jyviko: kernel: boolean runner times both kernels and runs the cut sequence
- 79ae117dd jyviko: kernel: boolean runner measures SMLib's results again on truck
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 27e996c44 jyviko: brep: splines closed on themselves are periodic for pcurves and tessellation
- 204b650d9 jyviko: brep: check_geometry refuses loops that enclose no area or turn the wrong way
- 19cf3d94a jyviko: brep: orientation, not position, tells a face's outer loop
- 2196129f1 jyviko: kernel: side-by-side boolean runner calls SMLib's boolean
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 5b8d89abd Brennen Herbruck: kernel: schema 4 STEP records of revolved and conic-bounded parts against closed-form volumes
- c35fd77f6 jyviko: solidcraft-smlib: rebuild SMLib when its own sources change
- 734883bdb jyviko: solidcraft-smlib: booleans, fillet, chamfer and shell through SMLib
Co-authored-by: Brennen Herbruck <brennen.herbruck@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
1 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- d41ae8512 Brennen Herbruck: solidcraft-step: surfaces of revolution and extrusion, offset surfaces, hyperbola and parabola edges
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- e0bad4161 bherbruck: solidcraft-smlib: check test on every primitive
- 7050e9cfc bherbruck: solidcraft-smlib: mass properties of every primitive against closed forms
- 4983b8872 Brennen Herbruck: kernel: the boolean runner builds every SMLib operand
- acff340a0 Brennen Herbruck: solidcraft-step: representation context units and uncertainty, shared with the kernel's STEP reader
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 161832976 jyviko: AGENTS.md: unsafe in the SMLib FFI module and its child modules
- 25d2056a2 jyviko: brep: a seam from pole to pole gets pcurves a period apart
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- b85b51e81 Brennen Herbruck: solidcraft-smlib: blend faces come from the edge they replace
- 4a6494b48 jyviko: brep: check_geometry, the geometric agreement of a record
- 570028f31 jyviko: brep: the truck adapter checks a record's geometry before decoding it
- 30f5e617c jyviko: brep: document check_geometry in the validation section
Co-authored-by: Brennen Herbruck <brennen.herbruck@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- fd80377dd Brennen Herbruck: solidcraft-smlib: face and edge history out of SMLib operations
- 4a4e11ef7 Brennen Herbruck: kernel: a side-by-side runner for truck and SMLib booleans
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 60aa5e697 jyviko: solidcraft-smlib: build every C API source file
- 3c0b53935 jyviko: solidcraft-smlib: read SMLib's log lines inside the FFI module
- 858f2c3bd jyviko: solidcraft-smlib: the C types are imported only when SMLib is built
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
3 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 692fba51a jyviko: naming: say how to re-record the corpus names
- a8c8f8832 jyviko: naming: list removed lines before added ones in the corpus diff
- 1d4916008 jyviko: brep: a surface point's parameters move to geom
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 099026d94 jyviko: kernel: fitted pcurves on curved surfaces, unwrapped and closed per wire
- c7088fac9 jyviko: kernel: pcurve tests for seams, poles and loop orientation, and pictures
- 0d026e975 jyviko: kernel: pcurve fits start from four samples per span
- 4afbe3b90 jyviko: kernel: pcurve test for a face round its surface without a seam
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
4 commits, squashed; the originals stay reachable from tag archive/merge-main-develop.
- 7024ceec8 jyviko: CI: no runs for pull requests into kernel-smlib for now
- 92d433ca9 jyviko: AGENTS.md: the kernel-smlib branch's rules (ADR 0002)
- ee5deffaa jyviko: brep: Curve2 pcurve type and the truck pcurve entry point
- 26ab8981d jyviko: kernel: exact pcurves of lines and splines on planes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ
2026-10-20 22:53:02 -04:00
4164 changed files with 346258 additions and 108954 deletions
# Dependabot bumps are checked by CI; skip CodeRabbit reviews on them.
ignore_usernames:
- "dependabot[bot]"
path_instructions:
- path:"**"
instructions:|
Project rule: don't change anyone's existing defaults unless the change is purely additive and belongs in the application.
Flag any change to something a user already relies on: a default setting or preference value, what a command or tool does when used the usual way, the UI's default layout or behaviour, a keyboard or mouse shortcut, or the result an existing saved design rebuilds to.
Don't flag purely additive changes: a new command, a new setting whose default keeps today's behaviour, or a new option that appears only when someone chooses it. Don't flag bug fixes that only turn a crash or an error into the result the feature always promised.
When you flag one, start the comment with "Changes a default:", say what a user sees before and after, whether a setting keeps the old behaviour, and whether the PR description's `Changes a default:` line says so.
pre_merge_checks:
custom_checks:
- name:"Existing defaults unchanged"
mode:"warning"
instructions:|
Pass if the pull request changes no default a user already relies on (default setting or preference values, what a command or tool does when used the usual way, the UI's default layout or behaviour, shortcuts, or the result an existing saved design rebuilds to), or if its changes are purely additive.
Fail otherwise, naming each changed default and what a user sees before and after. Also fail if the description says `Changes a default: no` while the code changes one.
# `ci` job still runs and reports the commit's real result (see the `ci` job): the merge queue
# reads `ci` from the newest run of a commit, so a run without it would block a PR that passed.
# Cross-compilation is opt-in through Run workflow; release builds remain in release.yml.
# The release gate (release-gate.yml) calls this workflow (workflow_call) as a Run workflow with
# cross-compilation on.
# Every Linux job runs on Blacksmith's Ubuntu 24.04 runners (blacksmith-<N>vcpu-ubuntu-2404), sized
# per job: 32 vCPU for the tests, 16 for Clippy, the GPU path tests, the archive build (nightly) and the merge queue's, 8 for compiles, doc and reference tests, 4 for the light checks, 2 for Select checks and ci.
# The Windows shader job runs on Blacksmith's Windows Server 2025 runners (blacksmith-8vcpu-windows-2025);
@@ -50,10 +52,14 @@ on:
# only (other labels are skipped, see the top of this file).
# Pull requests test the affected packages (scripts/ci/affected.py).
scope=(--workspace)
if [ "$FULL" != true ]; then scope=(); for p in $PACKAGES; do scope+=(-p "$p"); done; fi
status=0
# The GPU path tracer's tests run in their own job (GPU path tests): one at a time, they
# took about 36 of this job's 45 minutes.
# A failed test does not fail the step by itself: the tests known to fail today
# (tests/KNOWN_FAILING_TESTS) may fail, any other fails it, and so does a listed test
# that passes. nextest's exit code 100 is "tests failed"; any other is its own error
# (a build error, a bad filter) and fails the step at once.
status=0
cargo nextest run "${scope[@]}" --cargo-profile ci --locked --profile ci --no-tests=pass \
--ignore-default-filter -E "($base) & not (package(=solidcraft-gpu) & test(/^path::/))" || status=1
if [ "$status" != 0 ]; then
# A failed golden gets the hint to re-record it (junit.xml lists the failures).
if [ -f "$junit" ] && tr '\n' ' ' < "$junit" | grep -q '<testcase name="tests::robustness_goldens::[^"]*"[^>]*>[[:space:]]*<failure'; then
echo "::error::A robustness golden changed. If the new result is intended, re-record it in this pull request and say why:"
echo "::error::ROBUSTNESS_GOLDENS_BLESS=\"why it changed\" cargo test --profile ci -p solidcraft-engine --lib robustness_goldens:: (see docs/robustness.md)"
fi
exit 1
fi
--ignore-default-filter -E "($base) & not (package(=solidcraft-gpu) & test(/^path::/))" || status=$?
if [ "$status" -ne 0 ] && [ "$status" -ne 100 ]; then exit "$status"; fi
SolidCraft is a clean-room, pure-Rust parametric 3D CAD app (sketch solver, feature timeline, B-rep kernel, an egui UI that agents drive). This file is a router: the hard rules, then the skill to read for your task. Humans: CONTRIBUTING.md.
## Start here
Work: ROADMAP.md, "Where help is wanted most" in CONTRIBUTING.md, issues labelled `help wanted`, `good first issue`, `needs-triage`; architecture in `docs/architecture.md`. Act when the code, docs and rules settle a question; ask only when it changes what users see. Local `plan/` notes are optional.
Work: ROADMAP.md, "Where help is wanted most" in CONTRIBUTING.md, issues labelled `help wanted`, `good first issue`, `needs-triage`; architecture in `docs/architecture.md`. Act when the code, docs and rules settle a question; ask only when it changes what users see.
## Hard rules (what enforces each)
- Independent: never copy another product's code, icons, text or templates; never drive or take data from commercial CAD. `skills/solidcraft-ground-rules/SKILL.md`.
- No GPL/LGPL/AGPL code, not even reading it (OpenCASCADE, FreeCAD, SolveSpace, CadQuery, LibreCAD, QCAD): `cargo xtask licences --check`.
- Every asset is original or openly licensed with a row in ATTRIBUTION.md; read `assets/AGENTS.md` before icon work: `cargo xtask assets`, `cargo xtask icons`.
- Never crash: no unwrap/expect/panic/unsafe in non-test code (unsafe allowlist in crash-safety), errors are `Result`, input is hostile: clippy `-D warnings`, `hostile_params_never_panic`.
- Model decisions (what an operation does, which bodies it touches, which face or edge a point or name means, depths, nearness) use exact geometry; a mesh is for display, export, previews and mesh bodies (`xtask/mesh-decisions.txt` only shrinks): `cargo xtask mesh-decisions`.
- Kernel ops and math go to solidcore; features call its API: `cargo xtask lists`.
- Everything is a command and programmatic calls never open dialogs: `skills/solidcraft-commands/SKILL.md`.
@@ -103,6 +103,22 @@ Editable drawing code, native projects and shipped exports are collected under `
| tests/step-conformance/tiny_pin.step | step-conformance contributors | generated from formulas by https://github.com/dan335/step-conformance (corpus/generated, 96f30bb); import regression fixture | CC0-1.0 |
| tests/step-conformance/torus_ring_nurbs.step | step-conformance contributors | generated from formulas by https://github.com/dan335/step-conformance (corpus/generated, 96f30bb); import regression fixture | CC0-1.0 |
| tests/step-conformance/washer.step | step-conformance contributors | generated from formulas by https://github.com/dan335/step-conformance (corpus/generated, 96f30bb); import regression fixture | CC0-1.0 |
| tests/kernel-cases/import/1721-closed-bspline-tube-face/input.step | step-conformance contributors | copy of tests/step-conformance/cylinder_nurbs.step (generated from formulas by https://github.com/dan335/step-conformance, corpus/generated, 96f30bb); kernel regression case for tangency-labs/solidcraft#1721 | CC0-1.0 |
| tests/kernel-cases/import/2043-outer-bound-opposing-surface-sense/input.step | SolidCraft contributors | synthetic STEP file written by hand from ISO 10303-21 for the kernel regression case of tangency-labs/solidcraft#2043 | MIT OR Apache-2.0 |
| tests/kernel-cases/import/258-cone-point-vertex/input.step | step-conformance contributors | copy of tests/step-conformance/cone_point_vertex.step (generated from formulas by https://github.com/dan335/step-conformance, corpus/generated, 96f30bb); kernel regression case for tangency-labs/solidcraft#258 | CC0-1.0 |
| tests/kernel-cases/import/258-cone-to-point/input.step | step-conformance contributors | copy of tests/step-conformance/cone_point.step (generated from formulas by https://github.com/dan335/step-conformance, corpus/generated, 96f30bb); kernel regression case for tangency-labs/solidcraft#258 | CC0-1.0 |
| tests/kernel-cases/import/258-tiny-pin/input.step | step-conformance contributors | copy of tests/step-conformance/tiny_pin.step (generated from formulas by https://github.com/dan335/step-conformance, corpus/generated, 96f30bb); kernel regression case for tangency-labs/solidcraft#258 | CC0-1.0 |
| tests/kernel-cases/import/3098-bspline-edges-over-tiny-knot-span/input.step | SolidCraft contributors | synthetic STEP file written by hand from ISO 10303-21 for the kernel regression case of tangency-labs/solidcraft#3098 | MIT OR Apache-2.0 |
| tests/kernel-cases/import/3208-extruded-ellipse-face-over-parameter-seam/input.step | SolidCraft contributors | synthetic STEP file written by hand from ISO 10303-21 for the kernel regression case of tangency-labs/solidcraft#3208 | MIT OR Apache-2.0 |
| tests/kernel-cases/import/3352-vertex-off-its-edge-curve/input.step | SolidCraft contributors | synthetic STEP file written by hand from ISO 10303-21 for the kernel regression case of tangency-labs/solidcraft#3352 | MIT OR Apache-2.0 |
| tests/kernel-cases/import/3730-void-oriented-shell-false/input.step | SolidCraft contributors | synthetic STEP file written by hand from ISO 10303-21 for the kernel regression case of tangency-labs/solidcraft#3730 | MIT OR Apache-2.0 |
| tests/kernel-cases/import/3880-cylinder-seam-edge/input.step | step-conformance contributors | copy of tests/step-conformance/cylinder_seam.step (generated from formulas by https://github.com/dan335/step-conformance, corpus/generated, 96f30bb); kernel regression case for tangency-labs/solidcraft#3880 | CC0-1.0 |
| tests/kernel-cases/import/3880-nurbs-hemisphere-dome/input.step | step-conformance contributors | copy of tests/step-conformance/dome_nurbs.step (generated from formulas by https://github.com/dan335/step-conformance, corpus/generated, 96f30bb); kernel regression case for tangency-labs/solidcraft#3880 | CC0-1.0 |
| tests/kernel-cases/import/3963-closed-spline-edge-vertex-past-start/input.step | SolidCraft contributors | synthetic STEP file written by hand from ISO 10303-21 for the kernel regression case of tangency-labs/solidcraft#3963 | MIT OR Apache-2.0 |
| tests/kernel-cases/import/4005-cylinder-written-as-near-zero-cone/input.step | SolidCraft contributors | synthetic STEP file written by hand from ISO 10303-21 for the kernel regression case of tangency-labs/solidcraft#4005 | MIT OR Apache-2.0 |
| tests/kernel-cases/import/4006-plane-written-as-cone-of-nearly-right-angle/input.step | SolidCraft contributors | synthetic STEP file written by hand from ISO 10303-21 for the kernel regression case of tangency-labs/solidcraft#4006 | MIT OR Apache-2.0 |
| tests/ssi-corpus/cases/*.json.gz, tests/ssi-corpus/LICENSE-MIT, tests/ssi-corpus/LICENSE-APACHE | ssi-corpus contributors (jyviko) | 119 surface/surface intersection cases with exact ground truth from https://github.com/jyviko/ssi-corpus (cases/data, b04c8a6), gzip-compressed, unchanged; SSI scorer fixtures (tests/ssi-corpus/README.md) | MIT OR Apache-2.0 |
| tests/ssi-corpus/cases/y23_*.json.gz | Yang, Jia and Yan (paper authors: published surfaces, figures and topology); ssi-corpus contributors (reconstructions and truth) | 25 cases built from Yang, Jia & Yan 2023, "Topology Guaranteed B-Spline Surface/Surface Intersection", ACM Transactions on Graphics 42(6), Article 211; each cites the paper in its `source` field | CC-BY 4.0 (paper); MIT OR Apache-2.0 (case files) |
| tests/step-regressions/rod_doubled_edge.step | SolidCraft contributors | written by SolidCraft from the commands of #4598 (a bored rod moved 100 mm and exported); import regression fixture | MIT OR Apache-2.0 |
| tests/oracle/17-loft/reference.stl | SolidCraft contributors | triangulation of our own recipe (tests/oracle/17-loft/recipe.json) built with FreeCAD as an external tool by tools/freecad-oracle | MIT OR Apache-2.0 |
| tests/oracle/23-bracket-multifeature/reference.stl | SolidCraft contributors | triangulation of our own recipe (tests/oracle/23-bracket-multifeature/recipe.json) built with FreeCAD as an external tool by tools/freecad-oracle | MIT OR Apache-2.0 |
@@ -229,6 +245,18 @@ Editable drawing code, native projects and shipped exports are collected under `
| assets/icons/ui/design/svg/flat/plus.svg | SolidCraft contributors | single-colour application/navigation icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/pan.svg | SolidCraft contributors | single-colour application/navigation icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/perspective.svg | SolidCraft contributors | single-colour application/navigation icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/prefs_appearance.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/prefs_assistant.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/prefs_design.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/prefs_general.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/prefs_graphics.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/prefs_layout.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/prefs_mouse3d.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/prefs_navigation.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/prefs_plugins.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/prefs_shortcuts.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/prefs_sketch.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/prefs_tools.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/redo.svg | SolidCraft contributors | single-colour application/navigation icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/save.svg | SolidCraft contributors | single-colour application/navigation icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/settings.svg | SolidCraft contributors | single-colour application/navigation icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
@@ -289,7 +317,6 @@ Editable drawing code, native projects and shipped exports are collected under `
| assets/icons/ui/design/svg/model/circle_ttt.svg | SolidCraft contributors | two-tone modelling icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/model/coil.svg | SolidCraft contributors | two-tone modelling icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/model/colored_components.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/model/colored_components_off.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/model/combine.svg | SolidCraft contributors | two-tone modelling icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/model/component.svg | SolidCraft contributors | two-tone modelling icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
@@ -755,6 +782,22 @@ Original SolidCraft drawings, Open for owner review; no runtime assignments.
| docs/design/preferences/figures/view-shadow.light.svg | SolidCraft contributors | original SolidCraft artwork drawn for the Preferences redesign (tracker #9863), extracted from the design board as a standalone SVG | MIT OR Apache-2.0 |
| `assets/locales/pending/sketch-offset-instances.json` | SolidCraft contributors | Original offset instance-count label and translations | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/settings_profile.svg | SolidCraft contributors | single-colour application/navigation icon master (64 grid), original analytic head and shoulder geometry for settings profiles | MIT OR Apache-2.0 |
| tests/kernel-cases/import/4561-convert-box-mesh-with-a-zero-area-triangle/box-degenerate.stl | SolidCraft contributors | synthetic ASCII STL written by hand: a box with one zero-area triangle, for the kernel regression case of tangency-labs/solidcraft#4561 | MIT OR Apache-2.0 |
| assets/locales/pending/theme-blur-ui.json | SolidCraft contributors | Original blur controls, notices and translations | MIT OR Apache-2.0 |
| crates/ui-egui/tests/fixtures/theme-blur.json | SolidCraft contributors | Original theme for blur option scenarios and manager review | MIT OR Apache-2.0 |
| assets/locales/ka.json | David Machakhelidze (devius) | Original Georgian translation of SolidCraft's English catalog, written with Claude Code from the meaning of each English string; terminology and doubtful strings decided by a native Georgian speaker; no commercial CAD text used | MIT OR Apache-2.0 |
| assets/branding/logo/solidcraft-mark.svg | SolidCraft contributors | static SolidCraft mark: the five faces and gradients of assets/icons/app/macos/source/SolidCraft.icon/Assets/03-solid-blue-cutout.svg (the final frame of assets/styles/web/loading-logo.svg), cropped to the mark's bounds; original artwork | MIT OR Apache-2.0 |
| assets/branding/logo/solidcraft-mark-mono-black.svg | SolidCraft contributors | one-colour (black) version of assets/branding/logo/solidcraft-mark.svg, same paths; original artwork | MIT OR Apache-2.0 |
| assets/branding/logo/solidcraft-mark-mono-white.svg | SolidCraft contributors | one-colour (white) version of assets/branding/logo/solidcraft-mark.svg, same paths; original artwork | MIT OR Apache-2.0 |
| assets/branding/logo/solidcraft-mark-512.png | SolidCraft contributors | transparent 512 px render of assets/branding/logo/solidcraft-mark.svg (cairosvg); original artwork | MIT OR Apache-2.0 |
| assets/branding/logo/solidcraft-mark-1024.png | SolidCraft contributors | transparent 1024 px render of assets/branding/logo/solidcraft-mark.svg (cairosvg); original artwork | MIT OR Apache-2.0 |
| assets/branding/logo/solidcraft-mark-2048.png | SolidCraft contributors | transparent 2048 px render of assets/branding/logo/solidcraft-mark.svg (cairosvg); original artwork | MIT OR Apache-2.0 |
| assets/branding/logo/solidcraft-wordmark.svg | SolidCraft contributors | the name SolidCraft set like the loading logo's wordmark (bold, +0.02 em tracking, #15499e) in IBM Plex Sans Bold from assets/fonts/ibm-plex-sans (SIL OFL 1.1, IBM Corp.), outlined to paths; no font file is embedded | MIT OR Apache-2.0 |
| assets/branding/logo/solidcraft-lockup-horizontal.svg | SolidCraft contributors | assets/branding/logo/solidcraft-mark.svg beside assets/branding/logo/solidcraft-wordmark.svg, in the proportions of assets/branding/web/source/og.png; original artwork | MIT OR Apache-2.0 |
| assets/styles/ui/themes/onyx.json | SolidCraft contributors | original Onyx stone-grey palette, option overlays and semantic icon-role mapping; existing SolidCraft artwork is unchanged | MIT OR Apache-2.0 |
| docs/book/src/media/ui-tour/window.png | SolidCraft contributors | screenshot of SolidCraft 0.29.0 itself (`solidcraft --sample`, default dark theme, software renderer, 1280x800) with original numbered callouts (digits set in DejaVu Sans Bold), captured with examples/demo/doc_shots.py | MIT OR Apache-2.0 |
| docs/book/src/media/ui-tour/navigate.mp4 | SolidCraft contributors | original screen recording of the actual SolidCraft 0.29.0 English desktop UI (`--sample`, default dark theme, software renderer) orbiting, panning and zooming, with the original drawn pointer of examples/demo/overlay.py and labels set in DejaVu Sans Bold, captured with examples/demo/doc_shots.py | MIT OR Apache-2.0 |
| assets/locales/pending/sketch-tool-hints.json | carlymx | Original sketch tool hints and engine error translations | MIT OR Apache-2.0 |
## Code adapted from sibling projects
@@ -794,10 +837,19 @@ in THIRD-PARTY-LICENSES.txt; no images or artwork from that project are copied.
The glTF test files are built by the tests themselves (crates/io/src/gltf_in_tests.rs,
crates/engine/src/tests/gltf_import.rs); no third-party models are committed.
## Geometry kernel crates
| Crate | Used for | Licence |
|---|---|---|
| solidcore (https://github.com/tangency-labs/solidcore, pinned by rev in Cargo.toml) | the Rust port of NVIDIA's SMLib: the B-rep kernel behind crates/smlib | Apache-2.0 (its NOTICE credits NVIDIA's USD BRep) |
Linked as a crate; no code from it is copied into SolidCraft. Its licence text and NOTICE go
into THIRD-PARTY-LICENSES.txt when `main` regenerates it.
## FreeCAD and Rhino import library
FreeCAD `.FCStd` and Rhino `.3dm` files are read with [cadmpeg](https://github.com/cadmpeg/cadmpeg)
0.6.3 (Apache-2.0), linked as the crates `cadmpeg-core`, `cadmpeg-ir`, `cadmpeg-registry`,
0.6.7 (Apache-2.0), linked as the crates `cadmpeg-core`, `cadmpeg-ir`, `cadmpeg-registry`,
`cadmpeg-container`, `cadmpeg-codec-freecad`, `cadmpeg-codec-rhino` and `cadmpeg-codec-step`
in native and browser builds (`crates/io/src/native_cad.rs`). Only those open-format codecs are built: no
default features, so cadmpeg's codecs for commercial CAD formats and its ShapeManager/ACIS
@@ -809,17 +861,13 @@ copied into SolidCraft.
| SolidCraft file | Original contribution | Licence |
|---|---|---|
| crates/ui-egui/src/viewport.rs (`nearest_quarter_turn`, `axis_view_orbit`) | N3MI-DG's [PR #101](https://github.com/bherbruck/solidcraft/pull/101): [minimal TOP/BOTTOM turns](https://github.com/bherbruck/solidcraft/commit/c28e780f52490784ef5886f094b9d3f6d10c3e3f) and [drag-to-orbit](https://github.com/bherbruck/solidcraft/commit/f30b30be6ecc4e2e6544a851243137c01a354934), adapted to the axis gizmo | MIT OR Apache-2.0 |
| crates/smlib/src/core/offset.rs (`draft`: the tilted planes and `SmBrep::LocalOperation`, the tail of the capi's `draft_faces`) | ablasik's `draft` in `crates/smlib/src/ffi/rs_ops2.rs` on [ablasik/solidcraft `app/solidcore-backend-on-develop`](https://github.com/ablasik/solidcraft/blob/9c7e8e31565e1823f0591b58e2967351c32af13f/crates/smlib/src/ffi/rs_ops2.rs), adapted to `core::offset`'s errors and checks | MIT OR Apache-2.0 |
## Vendored third-party code
| Directory | Source | Licence | Changes |
|---|---|---|---|
| vendor/accesskit_macos | accesskit_macos 0.26.3, https://github.com/AccessKit/accesskit (The AccessKit contributors) | MIT OR Apache-2.0 | the subclassing adapter and its tests from 0.27.2: dropping the adapter keeps AppKit's key-value observers (vendor/README.md) |
| vendor/truck-shapeops | truck-shapeops 0.4.0, https://github.com/ricosjp/truck (RICOS Co. Ltd.) | Apache-2.0 | robust meshing and nearest-parameter fallback in booleans; degenerate intersection-curve rejection; face and edge history of booleans; trace macro; corner choice at vertices several intersection curves end on; reuse of an operand's meshes (vendor/README.md) |
| vendor/truck-geometry | truck-geometry 0.5.0, https://github.com/ricosjp/truck (RICOS Co. Ltd.) | Apache-2.0 | intersection curves divided from their neighbours' surface parameters; surface second derivatives (vendor/README.md) |
**Kernel cases go to solidcore.** A case that checks a kernel operation (a boolean, a blend, a
shell, a sweep, an import's geometry) is a new entry in solidcore's corpus,
`crates/solidcore/tests/kernel_cases/<area>/` in
[tangency-labs/solidcore](https://github.com/tangency-labs/solidcore), with an answer in closed
form or exact. Draft it as a rig case here, export it with
`cargo xtask kernel-cases --area <area> --export DIR`, add `DIR/<area>/<case>.json` and its
`.bodies.json.gz` there, and delete the draft; or write the entry by hand as that folder's README
describes. `tests/kernel-cases/` takes no new cases: its `CASES` list only shrinks
(`cargo xtask lists`). App-level cases (what a command does, the UI, product rules) stay in
SolidCraft, as tests in their area's existing test file or UI scenarios.
The naming corpus checks persistent names: every name a corpus design stores still finds a face or
an edge, and two builds name its faces and edges alike
(`cargo test --profile ci -p solidcraft-cli --test naming_corpus`).
[docs/mutation-testing.md](docs/mutation-testing.md) shows how to find kernel behaviour these
black-box suites miss.
@@ -222,8 +248,7 @@ Pull requests skip a few heavy tests (one to twelve minutes each), which run in
Check that validation after merging. They are listed in
`.config/nextest.toml` and the [testing page](docs/book/src/dev/testing.md):
- `solidcraft-engine`: `tests::hostile_params_never_panic`, everything in `tests::robustness` and
the seeds of `tests::robustness_goldens` (`seed_00` … `seed_95`; pull requests that change the kernel, truck or the goldens run all but the slowest, `SLOW_SEEDS` in `ci.yml`),
- `solidcraft-engine`: `tests::hostile_params_never_panic`, everything in `tests::robustness`,
`cmd::plastic::tests::enclosure_snap_fit_follows_resized_front_wall`, the `atomic_commands` contract tests
@@ -243,7 +268,8 @@ the surface itself). Expected values are either worked out in closed form
(`tools/oracle-analytic/`) or computed by building the same recipe in FreeCAD, run as a separate
program (`tools/freecad-oracle/`); each file says which. The generated
[reference test report](docs/oracle.md) has the current case count and results. The reference-test
CI job runs `cargo xtask oracle` during full validation; pull-request runs skip it. A case that
CI job runs `cargo xtask oracle` during full validation, and on pullrequests that reach
`solidcraft-cli`. A case that
fails because of a known bug names its issue in `expected.json` (`"known_failure": "#123"`);
never change an expected value to match SolidCraft's output.
@@ -315,8 +341,11 @@ and a fresh CI run:
1. Work is tracked in [GitHub issues](https://github.com/tangency-labs/solidcraft/issues), labelled
by area (`area:kernel`, `area:sketch`, `area:doc`, `area:ui`, `area:infra`). For anything
bigger than a bug fix that has no issue yet, open one first. **Claim the issue with a draft
PR** before you start, so two people don't build the same thing:
bigger than a bug fix that has no issue yet, discuss it on [Discord](https://discord.gg/FtU4NQNVDH)
first, then open an issue. Before you start, search **all** issues and pull requests, open and
closed, for similar work (`gh issue list -R tangency-labs/solidcraft --state all --search "<words>"`,
and the same with `gh pr list`). **Claim the issue with a draft PR** before you start, so two
people don't build the same thing:
- Check nobody has it: `gh pr list -R tangency-labs/solidcraft --state open --search "#N"`.
- Branch from the latest `main`, commit `git commit --allow-empty -m "claim: #N"`, push, and
open a **draft** PR titled `<summary> (#N)`, e.g. `Fillet: variable radius along a chain (#123)`.
@@ -429,7 +458,7 @@ correct them freely and it won't put them back.
## Where help is wanted most
**Kernel speed (slow fillets, booleans, STEP):** please don't rewrite the current kernel code for speed; it is being replaced by [solidcore](https://github.com/bherbruck/solidcore) ([progress](https://tangency-labs.github.io/solidcore/)). Report slow cases with a file under the `kernel-perf` label, and put kernel effort into solidcore instead. See [#1597](https://github.com/tangency-labs/solidcraft/issues/1597).
**Kernel speed (slow fillets, booleans, STEP):** please don't rewrite the current kernel code for speed; the kernel is [solidcore](https://github.com/tangency-labs/solidcore) ([progress](https://tangency-labs.github.io/solidcore/)). Report slow cases with a file under the `kernel-perf` label, and put kernel effort into solidcore instead. See [#1597](https://github.com/tangency-labs/solidcraft/issues/1597).
See the [`help wanted`](https://github.com/tangency-labs/solidcraft/labels/help%20wanted) and
[`good first issue`](https://github.com/tangency-labs/solidcraft/labels/good%20first%20issue) labels.
@@ -458,6 +487,16 @@ the same area), first resolve the command registry and source conflicts, then ru
The generator tests cover stable ordering and additions that leave existing lines
unchanged. The initial switch to sorted rows is a one-time larger diff.
## Pictures in the user guide
The user guide's screenshots and short clips (`docs/book/src/media/`) are captured from the real
app by `examples/demo/doc_shots.py`, one function per figure. Each run starts a fresh app with its
own settings, so your preferences never show. When a change makes a figure out of date, run
`python3 examples/demo/doc_shots.py <page or shot>` (it needs Xvfb, ffmpeg, Pillow and a release
build) and commit the new file. A new figure is a new function there, an ATTRIBUTION row in
`attribution/pending/`, and a `<video>` (clips) or image link on the page. Keep a still under
about 250 KB and a clip under about 1 MB.
## Licence
By contributing you agree that your contribution is licensed as MIT OR Apache-2.0, like the rest
constUSAGE_RUN: &str=" solidcraft-cli run <script.json|design.sc|part.step> [--in design.sc|part.step] [--out FILE]... [--save FILE] [--quiet] [--results] [--timings] [--profile] [--json-out FILE] [--allow-errors]\n [--param-check off|warn|strict]\n solidcraft-cli run --in <design.sc|part.step> [--out FILE]...\n (a timeline feature that fails fails the run and nothing is written; --allow-errors writes anyway)\n (--param-check checks each step against its command's contract: warn reports on stderr, strict stops the run)\n (--timings prints {timings: [{index, command, ms}], total_ms} for a script, with --results its results too;\n --profile adds each command's profile: {boolean_ms, tessellate_ms, other_ms}, the kernel's share)\n";
constUSAGE_RUN: &str=" solidcraft-cli run <script.json|design.sc|part.step> [--in design.sc|part.step] [--out FILE]... [--save FILE] [--quiet] [--results] [--timings] [--profile] [--profile-out trace.json] [--json-out FILE] [--allow-errors] [--validation each_step|each_feature|off]\n [--param-check off|warn|strict]\n solidcraft-cli run --in <design.sc|part.step> [--out FILE]...\n (a timeline feature that fails fails the run and nothing is written; --allow-errors writes anyway)\n (--validation: when SMLib's full check runs on the features computed (diagnostics.validation), default each_feature)\n (--param-check checks each step against its command's contract: warn reports on stderr, strict stops the run)\n (--timings prints {timings: [{index, command, ms}], total_ms} for a script, with --results its results too;\n --profile adds each command's profile: {boolean_ms, tessellate_ms, other_ms}, the kernel's share)\n (--profile also records where the time goes, SMLib's calls, kernel operations, features, commands and import stages,\n and prints the table to stderr: count, total, self time and longest per span; --profile-out FILE writes the spans\n as a Chrome trace for chrome://tracing or ui.perfetto.dev; SOLIDCRAFT_PROFILE=1 does the same for any command)\n";
/// `eval`'s lines in the usage.
constUSAGE_EVAL: &str=" solidcraft-cli eval <script.json|design.sc|part.step> [--in design.sc|part.step] [--json-out FILE] (alias: inspect)\n solidcraft-cli eval --in <script.json|design.sc|part.step> [--json-out FILE]\n (with both inputs, runs the positional script on --in before measuring; does not automatically save the modified design)\n (--json-out FILE writes the JSON that run (with --results, else the measurement) and eval print to FILE instead of stdout,\n as plain UTF-8: a shell's > can re-encode it, e.g. Windows PowerShell adds a byte-order mark)\n";
constUSAGE_EVAL: &str=" solidcraft-cli eval <script.json|design.sc|part.step> [--in design.sc|part.step] [--json-out FILE] [--profile] [--profile-out trace.json] (alias: inspect)\n solidcraft-cli eval --in <script.json|design.sc|part.step> [--json-out FILE]\n (with both inputs, runs the positional script on --in before measuring; does not automatically save the modified design)\n (--json-out FILE writes the JSON that run (with --results, else the measurement) and eval print to FILE instead of stdout,\n as plain UTF-8: a shell's > can re-encode it, e.g. Windows PowerShell adds a byte-order mark)\n (--profile and --profile-out as for run)\n";
/// `script`'s lines in the usage.
constUSAGE_SCRIPT: &str=" solidcraft-cli script <design.sc|script.json> [--out script.json]\n (the design's history as a command script that eval and run replay)\n";
/// `bench-open`'s lines in the usage.
constUSAGE_BENCH_OPEN: &str=" solidcraft-cli bench-open <design.sc | part.step> [--parse-only] [--save OUT.sc] [--display LEVEL [--edit NAME EXPR]] [--ops script.json]\n (--ops: after opening, run each command of the script and undo it, timing the command, the\n evaluations it caused and the view it leaves: placing and meshing what changed)\n";
constUSAGE_BENCH_OPEN: &str=" solidcraft-cli bench-open <design.sc | part.step> [--parse-only] [--save OUT.sc] [--display LEVEL [--edit NAME EXPR]] [--ops script.json] [--profile] [--profile-out trace.json]\n (--profile and --profile-out as for run)\n (--ops: after opening, run each command of the script and undo it, timing the command, the\n evaluations it caused and the view it leaves: placing and meshing what changed)\n";
constUSAGE_SNAPSHOT: &str=" solidcraft-cli snapshot <script|design> [--in design.sc|part.step] --out shot.png [--width W] [--height H] [--view NAME | --camera JSON] [--no-grid] [--no-axes]\n [--body NAME:opacity=0.3,color=#rrggbb]... [--tool NAME]... [--section z=27]\n solidcraft-cli snapshot --in <design.sc|part.step> --out shot.png ...\n (as with run, --in starts from a design and the script runs on top of it; an option snapshot doesn't take is an error;\n --view: iso, front, back, top, bottom, left, right, or the name of a view saved in the design with view.save;\n --camera: {target: [x,y,z], yaw, pitch, distance, fov?} in mm and radians, as the MCP screenshot takes it (docs/mcp.md);\n --no-grid and --no-axes leave the ground grid (on Z 0) and the origin's axes out of the picture;\n --body: how one body is drawn, as appearance.assign takes it: opacity 0-1 (below 1 is see-through, so what is inside\n it shows) and color #rrggbb, either or both, once per body;\n --tool: draw this body solid in the tool colour and every other body see-through, so a cut's or a join's tool body\n is visible inside the material it meets; a later --body overrides it;\n --section: cut the model as inspect.section does, so the inside shows: z=27 (the plane through that world\n coordinate, keeping the smaller side), add ,flip to keep the other side, or XY, XZ, YZ, or its own JSON)\n";
constUSAGE_SNAPSHOT: &str=" solidcraft-cli snapshot <script|design> [--in design.sc|part.step] --out shot.png [--width W] [--height H] [--view NAME | --camera JSON] [--no-grid] [--no-axes]\n [--body NAME:opacity=0.3,color=#rrggbb]... [--tool NAME]... [--section z=27] [--quality coarse|normal|fine|ultra]\n solidcraft-cli snapshot --in <design.sc|part.step> --out shot.png ...\n (as with run, --in starts from a design and the script runs on top of it; an option snapshot doesn't take is an error;\n --view: iso, front, back, top, bottom, left, right, or the name of a view saved in the design with view.save;\n --camera: {target: [x,y,z], yaw, pitch, distance, fov?} in mm and radians, as the MCP screenshot takes it (docs/mcp.md);\n --no-grid and --no-axes leave the ground grid (on Z 0) and the origin's axes out of the picture;\n --body: how one body is drawn, as appearance.assign takes it: opacity 0-1 (below 1 is see-through, so what is inside\n it shows) and color #rrggbb, either or both, once per body;\n --tool: draw this body solid in the tool colour and every other body see-through, so a cut's or a join's tool body\n is visible inside the material it meets; a later --body overrides it;\n --section: cut the model as inspect.section does, so the inside shows: z=27 (the plane through that world\n coordinate, keeping the smaller side), add ,flip to keep the other side, or XY, XZ, YZ, or its own JSON;\n --quality: the display quality the bodies are meshed at, as the app's setting (default normal))\n";
constUSAGE_KERNEL_CASES: &str=" solidcraft-cli kernel-cases <case-dir>... [--json] [--dumps=DIR] [--export=DIR] [--validation=each_step|each_feature|off]\n (the kernel regression rig, tests/kernel-cases, on SMLib; --dumps: each case's\n failing SMLib calls leave their inputs for replay in DIR/<area>-<case>; --export: each case's\n kernel operations, input records and expected values for solidcore's rig, in DIR/<area>/<case>.json; --validation: when SMLib's\n full check runs (diagnostics.validation), default each_feature)\n";
out.push(format!("{n} at {x:?}, then {m} at {y:?}"));
}
}
for((r,_),(q,_))ina.refs.iter().zip(&b.refs){
ifr!=q{
out.push(format!("{r}, then {q}"));
}
}
ifa.refs.len()!=b.refs.len(){
out.push(format!("{} stored names, then {}",a.refs.len(),b.refs.len()));
}
out.truncate(cap);
out
}
/// Designs whose names differ from one build to the next today: (design, why). Their
/// differences are printed, not failed on, until the cause is fixed; a stored name that finds
/// nothing still fails.
constUNSTABLE: [(&str,&str);1]=[(
"regressions/closed_sweep_torus_cut",
"the halves of each swept wall lie level along every axis, so which is `#1` and which `#2` follows the order the kernel gives the faces in, which changes from one build to the next",
| `logo/solidcraft-mark-mono-white.svg` | One-colour print on dark material, such as a white print on a dark shirt. |
| `logo/solidcraft-mark-512.png`, `-1024.png`, `-2048.png` | Transparent square PNGs for places that don't take SVG: avatars, social posts, slides, print shops that ask for a bitmap (send the 2048). |
| `logo/solidcraft-wordmark.svg` | The name on its own, outlined to paths. |
| `logo/solidcraft-lockup-horizontal.svg` | Mark and name side by side: headers, banners, shirt fronts, wide stickers. |
| `web/source/og.png` | The existing link preview card for the docs site. |
The gaps between the faces are part of the logo. In the colour and one-colour files they are
transparent, so the material shows through. For a die-cut sticker, cut around the outer shape
and let the backing colour (white is best) fill the gaps.
## Colours
The mark's five faces each use a two-stop gradient from the icon source:
"Move holes by clicking or dragging":"تحريك الثقوب بالنقر أو السحب",
"Move holes by clicking or dragging":"التحريك بالنقر أو السحب",
"Move later":"نقل إلى الأحدث",
"Move up":"نقل للأعلى",
"Name":"الاسم",
@@ -496,6 +497,7 @@
"Render Stage":"مرحلة التصيير",
"Reopen designs":"إعادة فتح التصاميم",
"Reopen the designs that were open when SolidCraft was last closed":"إعادة فتح التصاميم التي كانت مفتوحة آخر مرة",
"Repair Part":"إصلاح الجزء",
"Replace existing library file":"استبدال ملف المكتبة الموجود",
"Report a bug — review a screenshot and open a GitHub draft":"الإبلاغ عن خطأ — راجع لقطة الشاشة وافتح مسودة GitHub",
"Report copied. Keep this text to submit on GitHub when you are online.":"تم نسخ التقرير. احتفظ بهذا النص لإرساله على GitHub عند الاتصال بالإنترنت.",
@@ -584,7 +586,7 @@
"Show ghost":"إظهار الطيف",
"Show in folder":"إظهار في المجلد",
"Show the pointer an AI agent moves (#35)":"إظهار المؤشر الذي يحرّكه وكيل الذكاء الاصطناعي (#35)",
"Show tool at cursor":"إظهار الأداة عند المؤشر",
"Show tool at cursor":"الأداة عند المؤشر",
"Signed axes":"محاور بإشارة",
"Size":"الحجم",
"Sketch constraints":"قيود الرسم",
@@ -595,7 +597,7 @@
"Sketch points":"نقاط الرسم",
"Slider":"منزلق",
"Slot width":"عرض الشق",
"Snap to face and edge centres":"الالتقاط إلى مراكز الأوجه والحواف",
"Snap to face and edge centres":"الالتقاط إلى المراكز",
"SolidCraft cannot submit reports directly. Submit on GitHub; no token is needed in the app.":"لا يستطيع SolidCraft إرسال التقارير مباشرةً. أرسلها على GitHub؛ لا حاجة إلى رمز وصول في التطبيق.",
"SolidCraft closed before these designs were saved. Their last autosave can be opened.":"أُغلق SolidCraft قبل حفظ هذه التصاميم. يمكن فتح آخر حفظ تلقائي لها.",
"Sort A to Z":"فرز تصاعدي",
@@ -738,34 +740,34 @@
"a picked edge's body is gone":"جسم الحافة المحددة لم يعد موجودًا",
"add a key for a joint first":"أضف أولًا مفتاحًا لمفصل",
"ai.prefs.allow_control":"السماح لوكلاء الذكاء الاصطناعي بالاتصال (قناة التحكم / MCP)",
"ai.prefs.allow_control_note":"يفتح قناة تحكم على هذا الحاسوب فقط (127.0.0.1، المنفذ 27878 أو أول منفذ متاح بعده). على البرنامج الذي يتصل أن يقدّم أيضًا رمزًا سريًا لا يقرؤه إلا حساب المستخدم الخاص بك، ويُنشأ من جديد عند كل تشغيل. يُطبّق في المرة القادمة التي يبدأ فيها SolidCraft. عند الإيقاف: لا شيء يستمع ما لم تشغّل SolidCraft مع --control.",
"ai.prefs.availability":"عناصر تحكم المساعد",
"ai.prefs.background_commands":"تشغيل أوامر الوكيل في الخلفية",
"ai.prefs.connect_apps":"إتاحة SolidCraft لتطبيقات الذكاء الاصطناعي على هذا الحاسوب",
"ai.prefs.connect_apps_note":"عند بدء تشغيل SolidCraft، يُضاف كخادم MCP إلى تطبيقات الذكاء الاصطناعي الموجودة على هذا الحاسوب (OpenCode وClaude Desktop وClaude Code وCursor وCodex وGemini CLI وCopilot CLI وWindsurf وZed وVS Code)، ليتمكن الوكيل من استخدامه دون أي إعداد. لا يُضاف إلا مُدخل solidcraft أو يُحدَّث مساره؛ ويُترك المُدخل الذي غيّرته كما هو، ويُنسخ الملف احتياطيًا أولًا. عند الإيقاف تُزال المُدخلات التي أضافها. الأمر «المساعدة > ربط مساعدي الذكاء الاصطناعي…» يفعل ذلك يدويًا.",
"ai.prefs.connect_at_start":"الاتصال بآخر وكيل مستخدم عند بدء SolidCraft",
"ai.prefs.allow_control_note":"قناة محلية (MCP). لا شيء يغادر هذا الحاسوب.\n\nيفتح قناة تحكم على هذا الحاسوب فقط (127.0.0.1، المنفذ 27878 أو أول منفذ متاح بعده). على البرنامج الذي يتصل أن يقدّم أيضًا رمزًا سريًا لا يقرؤه إلا حساب المستخدم الخاص بك، ويُنشأ من جديد عند كل تشغيل. يُطبّق في المرة القادمة التي يبدأ فيها SolidCraft. عند الإيقاف: لا شيء يستمع ما لم تشغّل SolidCraft مع --control.",
"ai.prefs.availability":"التوفر",
"ai.prefs.background_commands":"تشغيل الأوامر البطيئة في الخلفية",
"ai.prefs.connect_apps":"إضافة SolidCraft إلى تطبيقات الذكاء الاصطناعي",
"ai.prefs.connect_apps_note":"إيقافه يزيل الإدخالات مجددًا.\n\nعند بدء تشغيل SolidCraft، يُضاف كخادم MCP إلى تطبيقات الذكاء الاصطناعي الموجودة على هذا الحاسوب (OpenCode وClaude Desktop وClaude Code وCursor وCodex وGemini CLI وCopilot CLI وWindsurf وZed وVS Code)، ليتمكن الوكيل من استخدامه دون أي إعداد. لا يُضاف إلا مُدخل solidcraft أو يُحدَّث مساره؛ ويُترك المُدخل الذي غيّرته كما هو، ويُنسخ الملف احتياطيًا أولًا. عند الإيقاف تُزال المُدخلات التي أضافها. الأمر «المساعدة > ربط مساعدي الذكاء الاصطناعي…» يفعل ذلك يدويًا.",
"ai.prefs.connect_at_start":"توصيل آخر وكيل عند البدء",
"ai.prefs.connect_at_start_note":"يبدأ في الخلفية الوكيل الذي اتصلت به آخر مرة (أو الوكيل الافتراضي) في كل مرة يبدأ فيها SolidCraft، ليكون جاهزًا للمحادثة. لا يحدث ذلك عند بدء SolidCraft مع --control. إذا تعذّر الاتصال، يعرض المساعد «فشل الاتصال» وزر «إعادة المحاولة».",
"ai.prefs.follow_camera":"توجيه الكاميرا نحو الرسومات",
"cmd.panel.native_close":"إعادة إرساء قسم اللوحة من نافذته المستقلة",
"cmd.panel.open":"فتح اللوحة",
"cmd.panel.peek":"عرض اللوحة المطوية مؤقتًا",
"cmd.panel.popout":"نقل اللوحة إلى نافذة مستقلة",
"cmd.panel.reset_pair":"إعادة ضبط فاصل اللوحة",
"cmd.panel.resize":"تغيير حجم قسم اللوحة",
"cmd.panel.resize_pair":"تحريك فاصل اللوحة",
"cmd.parameters_add":"إضافة معامل مستخدم",
"cmd.parameters_change":"تغيير المعاملات",
"cmd.parameters_comment":"التعليق على المعامل",
@@ -1270,6 +1296,7 @@
"cmd.timeline_stop":"إيقاف السجل",
"cmd.timeline_suppress":"تعطيل الميزة",
"cmd.ui.assistant":"إظهار المساعد أو إخفاؤه",
"cmd.view.navigator":"متصفح العرض المخصص",
"cmd.view.render_browser":"متصفح التصيير",
"cmd.view.render_dock":"نقل لوحة التصيير",
"cmd.view.render_focus":"عرض تركيز التصيير",
@@ -1360,6 +1387,7 @@
"crash.unclean_explanation":"اكتُشف عند تشغيل لاحق، ولم يُسجَّل وقت الخروج بدقة. قد يسبب إيقاف تشغيل النظام أو الإيقاف القسري خروجًا غير سليم أيضًا.",
"delete.and_more":"… و{count} غيرها",
"diagnostic.empty_boolean_component":"لا يوجد جسم للقص أو التقاطع في المكوّن '{component}'؛ قد تتداخل الأداة مع '{body}' في المكوّن '{other}' — نشّط ذلك المكوّن أو اختر الجسم هدفًا",
"diagnostic.reselect_reference":"{feature}: المرجع `{reference}` لم يعد موجودًا كما اختير؛ أعد اختياره",
"dialog.bodies_count":"{count} أجسام",
"dialog.clearance_invalid":"يجب أن يكون الخلوص طولًا قيمته 0 أو أكثر",
"dialog.compute":"احسب",
@@ -1369,6 +1397,9 @@
"dialog.custom_axis":"↖ محور مخصص",
"dialog.dimension_insert_hint":"انقر على بُعد قائد آخر لإدراج اسمه",
"dialog.selection_guidance":"حدد مُدخلًا لتغييره. انقر على العناصر المحددة لإزالتها؛ Ctrl/Cmd مع النقر يبدّل تحديدها أيضًا. راجع المعاينة ثم اضغط موافق.",
"document.read_only_save":"فُتح هذا التصميم للقراءة فقط: احفظه كملف جديد",
"document.save_changes":"حفظ التغييرات على {name}؟",
"document.save_copy":"حفظ نسخة…",
"document.tab_unsaved_changes":"تغييرات غير محفوظة",
"document.unsaved_changes":"في {name} تغييرات غير محفوظة. إن لم تحفظها فستضيع.",
"drive.rigid":"{joint} مفصل صلب: يثبّت أجزاءه في مكانها، لذا لا يوجد ما يمكن تحريكه. لتتحرك الأجزاء، غيّر نوعه في «تعديل المفصل»: «دوراني» للدوران، «منزلق» للانزلاق، «أسطواني» لكليهما.",
"drive.stopped_by_contact":"توقف عند {value}: سيخترق {a} الجسم {b}",
@@ -1413,6 +1446,9 @@
"each rail's curves must be in one sketch":"يجب أن تكون منحنيات كل دليل في رسم واحد",
"feature computation ended without a result":"انتهى حساب الميزة دون نتيجة",
"file_load.stopping":"انتظار توقف العملية السابقة...",
"file_load.updating_links":"تحديث الروابط",
"file_load.waiting":"انتظار عملية الملف",
@@ -1521,6 +1565,11 @@
"help.joint.reach":"يحرّك نقطة على قطعة نحو هدف بتغيير مفاصل سلسلتها ضمن حدودها. استخدمه لضبط وضعية آلية حسب الموضع المطلوب لنهايتها، مثل طرف ذراع روبوت.",
"help.joint.rigid_group":"يثبّت القطع المحددة معًا كما هي لتتحرك كقطعة واحدة. استخدمه للقطع التي تنتمي إلى وحدة واحدة ولا تتحرك بالنسبة إلى بعضها.",
"help.joint.screw":"يربط الدوران والانزلاق بخطوة لولبية، بحيث تتقدم القطعة بمقدار تلك المسافة في كل دورة. استخدمه للوالب القيادة والبراغي والمحاور الملولبة.",
"help.layout.apply":"تطبيق تخطيط محفوظ على مساحة العمل الحالية. تحتفظ أدوات التحرير القائمة بمسوداتها.",
"help.layout.get":"قراءة التخطيط المعتمد وعرض مساحات العمل المسجلة.",
"help.layout.reset":"استعادة التخطيط الافتراضي المسجل لمساحة العمل الحالية. تبقى إعدادات المستخدم المسبقة متاحة.",
"help.layout.save":"حفظ التخطيط الكامل باسم محدد. يتطلب استبدال إعداد مسبق للمستخدم إذنًا صريحًا بالكتابة فوقه.",
"help.layout.workspace.select":"اختيار مساحة عمل تخطيط مسجلة وتذكر التخطيط السابق.",
"help.library.apply":"يطبّق مادة أو مظهرًا من ملف مكتبة محلي على أجسام أو أوجه أو مكوّنات. استخدمه لإعادة استخدام مواد حفظتها من تصميم آخر.",
"help.library.export":"يحفظ مواد التصميم ومظاهره في ملف مكتبة. استخدمه لمشاركتها أو إعادة استخدامها في تصميمات أخرى.",
"help.library.inspect":"يفحص ملف مكتبة ويسرد موادّه ومظاهره دون تغيير التصميم. استخدمه لمعرفة ما تحويه المكتبة قبل تطبيقها.",
@@ -1534,6 +1583,21 @@
"help.notice":"NOTICE",
"help.occurrence.ground":"يثبّت قطعة في موضعها أو يحررها مجددًا، بحيث تحرّك المفاصل القطع الأخرى حولها. استخدمه للإطار أو القاعدة التي يُبنى عليها باقي التجميع.",
"help.occurrence.move":"يحرّك جزءًا في التجميع فقط ضمن درجات الحرية التي تسمح بها مفاصله. حدد وجهًا للجزء، ثم اسحب سهمًا أو قوسًا متاحًا.",
"help.panel.activate":"اختيار علامة تبويب لوحة مفتوحة دون طلب تركيز لوحة المفاتيح.",
"help.panel.close":"إغلاق اللوحة بعد التحقق من دورة حياة محتواها. يُحفظ موضعها.",
"help.panel.collapse":"طي قسم اللوحة أو توسيعه مع الاحتفاظ بأبعاده المطلوبة.",
"help.panel.dismiss":"إغلاق العرض المؤقت للوحة مطوية.",
"help.panel.float":"نقل لوحة إلى قسم عائم ذي موضع محدد صراحةً.",
"help.panel.focus":"تركيز لوحة وإعادة فتح حالتها المحفوظة وتوسيع قسمها عند الحاجة.",
"help.panel.move":"نقل لوحة إلى قسم جديد أو ضمها إلى مجموعة علامات تبويب موجودة.",
"help.panel.native_close":"إعادة قسم لوحة من نافذته المستقلة إلى موضع الإرساء المحفوظ دون إلغاء محتواه.",
"help.panel.open":"فتح نوع لوحة بمعرّف مثيل صريح. يتطلب المثيل الجديد تحديد موضعه.",
"help.panel.peek":"إظهار لوحة مطوية مؤقتًا دون تغيير حجمها المحفوظ أو حالة طيها.",
"help.panel.popout":"نقل لوحة إلى نافذة مستقلة عند دعم ذلك. يستخدم مضيف المتصفح قسمًا عائمًا.",
"help.panel.reset_pair":"استعادة نسبة الحجم الافتراضية لقسمي إرساء متجاورين ضمن حدودهما المشتركة.",
"help.panel.resize":"تعيين العرض والارتفاع الخارجيين لقسم اللوحة ضمن حدود جميع علامات التبويب.",
"help.panel.resize_pair":"تغيير حجم قسمي إرساء متجاورين معًا مع الحفاظ على امتدادهما الكلي المشترك.",
"help.parameters.change":"يفتح جدول القيم المسماة والتعبيرات التي تتحكم في أبعاد التصميم. استخدمه لتغيير مقاس في مكان واحد فتتبعه كل الميزات التي تستخدمه.",
"help.parameters.export":"يحفظ معاملات التصميم بصيغة CSV أو JSON. استخدمه لتعديلها في جدول بيانات أو نقلها إلى تصميم آخر.",
"help.parameters.graph":"يبيّن أي المعاملات والميزات تستخدم أيًّا من غيرها، وأي حلقات أو أخطاء بينها. استخدمه لمعرفة ما سيتأثر بتغيير معامل.",
@@ -1545,7 +1609,7 @@
"help.parts.resize":"يغيّر مقاس قطعة قياسية مدرجة أو طولها ويعيد بناءها، وتبقيها مفاصلها مثبتة في مكانها. استخدمه عندما يتبين أن برغيًا أطول من اللازم أو أن ثقبًا يحتاج إلى مقاس آخر.",
"help.plastic.assign_rule":"يعيّن قاعدة بلاستيك لأجسام، فتأخذ ميزاتها البلاستيكية ميلها وخلوصها منها كقيم افتراضية. استخدمه لإعداد قطعة مقولبة مرة واحدة لكل ميزاتها.",
"help.plastic.boss":"يضيف نتوءًا لمسمار على وجه: عمودًا مع ثقب اختياري وميل وتقويس عند الجذر وأضلاع تقوية. استخدمه لنقاط البراغي في الهياكل المقولبة أو المطبوعة.",
"help.plastic.lip":"يضيف شفة أو أخدودًا مطابقًا على طول حافة جسم مفرَّغ. استخدمه ليتمركز نصفا الهيكل أحدهما على الآخر ويُغلقا بإحكام.",
"help.plastic.lip":"يضيف شفة أو أخدودًا مطابقًا على طول إطار جسم مفرَّغ (فرّغ الجسم بفتح أحد وجوهه أولًا، ثم اختر الإطار المحيط بتلك الفتحة). استخدمه ليتمركز نصفا الهيكل أحدهما على الآخر ويُغلقا بإحكام.",
"help.plastic.manage_rules":"ينشئ قواعد البلاستيك ويعدّلها: المادة وسماكة الجدار وأنصاف الأقطار والخلوص والميل. استخدمها للحفاظ على اتساق ميزات القطعة المقولبة.",
"help.plastic.rest":"يضيف مسندًا على وجه: وسادة مستديرة أو مستطيلة، مصمتة أو مجوفة، مع ميل. استخدمه كدعامة أو مُباعِد في هيكل مقولب.",
"help.plastic.snap_fit":"يضيف خطاف وصلة كبس على وجه، بطوله وسماكته ونتوء التثبيت. استخدمه لتثبيت القطع معًا بلا براغي.",
@@ -1719,6 +1783,7 @@
"help.timeline.delete":"يحذف الميزات المحددة من السجل، وحذف رسمٍ يحذف معه الميزات المبنية عليه. استخدمه لإزالة خطوة لم تعد مطلوبة.",
"help.timeline.dependents":"يسرد الميزات التي ستُحذف مع ميزة ما، وتلك التي ستفشل بدونها. استخدمه قبل حذف ميزة أو تغييرها.",
"help.timeline.play":"أعد تشغيل الميزات المتبقية واحدة تلو الأخرى، مع توقف لمدة نصف ثانية بعد كل إعادة بناء. شغّل هذا الأمر مرة أخرى أو اضغط Escape للإيقاف؛ ينتقل «الذهاب إلى النهاية» فورًا إلى النهاية.",
"help.version":"الإصدار {version}",
"help.view.apply":"يدير العرض إلى اتجاه قياسي مثل الأمامي أو العلوي أو الأيزومتري، أو إلى عرض مسمّى محفوظ. استخدمه للنظر إلى النموذج من زاوية ثابتة.",
"help.view.delete":"يحذف عرضًا مسمّى محفوظًا. لا يتغير النموذج.",
"help.view.fit":"يضبط التكبير ويُزيح العرض حتى يملأ النموذج كله أو التحديد منطقة العرض. استخدمه حين يخرج النموذج من مجال الرؤية.",
@@ -1806,6 +1871,27 @@
"home.start_hint":"أنشئ تصميمًا، أو افتح ملفًا حديثًا، أو استكشف مثالًا.",
"home.whats_new":"ما الجديد",
"home.yesterday":"أمس",
"import_report.details":"التفاصيل:",
"import_report.file_one":"كانت هناك مشكلة أخرى واحدة في الملف.",
"import_report.file_other":"كانت هناك {count} مشكلات أخرى في الملف.",
"import_report.hint":"قد يحل ذلك تصدير هذه الأجزاء مرة أخرى من البرنامج الذي أنشأها. يحتوي «نسخ رسالة التحذير» على التفاصيل.",
"import_report.left_out_one":"تعذّر إصلاح وجه واحد وهو مفقود.",
"import_report.left_out_other":"تعذّر إصلاح {count} أوجه وهي مفقودة.",
"import_report.needs_repair_one":"يحتاج جزء واحد إلى إصلاح قبل النمذجة عليه.",
"import_report.needs_repair_other":"تحتاج {count} أجزاء إلى إصلاح قبل النمذجة عليها.",
"import_report.not_imported_one":"تعذّر استيراد جزء واحد.",
"import_report.not_shown_one":"تعذّر رسم وجه واحد وهو مخفي.",
"import_report.not_shown_other":"تعذّر رسم {count} أوجه وهي مخفية.",
"import_report.open_one":"في جزء واحد فجوات بين أوجهه، فاستُورد كجسم مفتوح.",
"import_report.open_other":"في {count} أجزاء فجوات بين أوجهها، فاستُوردت كأجسام مفتوحة.",
"import_report.refused_one":"تعذّر تحويل جزء واحد إلى مجسم، فلم يُستورد.",
"import_report.refused_other":"تعذّر تحويل {count} أجزاء إلى مجسمات، فلم تُستورد.",
"import_report.repaired_one":"أُصلحت عيوب صغيرة في جزء واحد.",
"import_report.repaired_other":"أُصلحت عيوب صغيرة في {count} أجزاء.",
"import_report.solids":"استُورد {solids} من {parts} أجزاء كمجسمات.",
"import_report.surfaces_one":"تعذّر تحويل جزء واحد إلى مجسم، فاستُورد كأسطح.",
"import_report.surfaces_other":"تعذّر تحويل {count} أجزاء إلى مجسمات، فاستُوردت كأسطح.",
"install.button_tip":"ثبّت SolidCraft كتطبيق: يُفتح في نافذته الخاصة ويعمل دون اتصال",
"install.dock_1":"اختر ملف › إضافة إلى Dock.",
"install.dock_2":"انقر إضافة.",
@@ -1841,28 +1927,28 @@
"joint.limit_loop":"{side} {value}: لا يمكن لحلقة مغلقة أن تنغلق بعده",
"joint.limit_range":"{side}: لا تلامس ضمن {range}، تُرك كما كان",
"joint.limit_turn":"{side} {value}: لا تلامس ضمن دورة واحدة",
"joint.limits_overlapping":"متداخلة بالفعل هنا: {pairs}. لا توقف البحث إلا إذا تداخلت أعمق.",
"joint.limits_overlapping":"متداخلة بالفعل هنا: {pairs}. لا توقف البحث إلا إذا ازداد تداخلها.",
"joint.one_body":"كلا الاختيارين على {body}. اختر الثاني على قطعة أخرى.",
"joint.one_component":"هذه القطع أجسام لمكوّن واحد: {bodies}. المفصل يحرّك مكوّنًا مقابل آخر، لذا تحتاج كل قطعة إلى مكوّن خاص بها.",
"joint.rigid_group_one_component":"هذه الأجسام وعددها {count} كلها في مكوّن واحد (أو في التصميم نفسه): استخدم {command} أولًا.",
"joint.rigid_group_select_components":"اختر مكوّنين أو أكثر.",
"joint_move.blocked_hint":"تحقق من نوع المفصل (مثل المفصل الثابت)، وتثبيت الجزء، وحدود المفصل، والقيم التي تتحكم بها المعاملات.",
"joint_move.blocked_title":"لا يمكن تحريك هذا الجزء",
"joint_move.coarse":"خطوة الدوران قرب المحور (°)",
"joint_move.coarse":"الخطوة قرب المحور",
"joint_move.conflict":"يتعارض أحد مفاصل هذا الجزء مع المفاصل الأخرى: {joint}.",
"joint_move.conflict_hint":"عدّل المفصل المتعارض أو عطّله أو احذفه حتى تتمكن المفاصل الأخرى من وضع الجزء.",
"joint_move.distance":"المسافة من نقطة البداية",
"joint_move.done":"تم",
"joint_move.fine":"خطوة الدوران بعيدًا عن المحور (°)",
"joint_move.fine":"الخطوة بعيدًا عن المحور",
"joint_move.fixed":"لا يملك هذا الجزء محور مفصل قابلًا للحركة.",
"joint_move.help":"تحريك — اسحب سهمًا أو قوسًا. يلغى السحب الحالي بمفتاح Esc.",
"joint_move.legacy_hint":"أوقف هذا الخيار لاستخدام لوحة التحريك السابقة.",
"joint_move.precision":"اسحب خارج الدليل المتقطع لضبط الدوران بدقة.",
"joint_move.legacy_hint":"عند الإيقاف: لوحة التحريك السابقة.",
"joint_move.precision":"اسحب خارج الدليل المتقطع للخطوة الدقيقة.",
"joint_move.rotation":"الدوران من نقطة البداية",
"joint_move.select":"اختر وجهًا أو جزءًا واحدًا من التجميع، ثم اختر تحريك.",
"joint_move.settings":"تحريك التجميع",
"joint_move.step":"الخطوة",
"joint_move.use_handles":"استخدام مقابض حركة المفاصل لتحريك التجميع",
"joint_move.use_handles":"استخدام مقابض حركة المفاصل للتحريك",
"keymap.command_id":"معرّف الأمر",
"keymap.empty":"لا توجد أوامر مطابقة",
"keymap.use_anyway":"استخدام {key} هنا على أي حال",
@@ -1922,6 +2008,7 @@
"material.selection.mixed":"مواد مختلفة",
"measure.at":"عند",
"measure.item":"العنصر {number}",
"measure.line_to_centre":"من الخط إلى المركز",
"measure.quick_copied":"تم نسخ القياس",
"measure.quick_copy":"انقر لنسخ القياس",
"measure.quick_edges":"{count} حواف",
@@ -1952,6 +2039,8 @@
"nav.blender.help":"السحب بالزر الأوسط يدوّر العرض، وShift مع الأوسط يُزيحه، وCtrl مع الأوسط يكبّره؛ والسحب بالأيمن لا يحرك الكاميرا",
"nav.creo.help":"السحب بالزر الأوسط يدوّر العرض، وShift مع الأوسط يُزيحه، وCtrl مع السحب العمودي بالأوسط يكبّره أو يصغّره (السحب لأسفل للتكبير)؛ وتدوير العجلة يكبّره أو يصغّره",
"nav.creo.label":"Creo",
"nav.drag_keeps_mode.help":"يستمر السحب بالزر الأوسط أو الأيمن في التدوير أو التحريك أو التكبير كما بدأ حتى تحرير الزر، مهما ضُغطت المفاتيح أو حُرّرت في أثناء ذلك. عند الإيقاف: تقرر المفاتيح المضغوطة في كل لحظة من السحب.",
"nav.drag_keeps_mode.label":"يحتفظ السحب بطريقة التنقل التي بدأ بها",
"nav.free_orbit.help":"الفأرة والفأرة ثلاثية الأبعاد تدوّران العرض عبر القطبين وتحافظان على اللف. يُعطَّل التقاط المحاور بـ Shift.",
"nav.free_orbit.label":"تدوير حر",
"nav.free_orbit.snap_help":"الفأرة والفأرة ثلاثية الأبعاد تدوّران العرض عبر القطبين وتحافظان على اللف. اضغط مطولًا على Shift أثناء سحب التدوير لالتقاط اتجاه العرض واللف.",
"navbar.custom.available":"{available} · اسحبها إلى الشريط، أو اضغط إضافة",
"navbar.custom.buttons":"الأزرار",
"navbar.custom.compact":"مضغوط",
@@ -2016,6 +2111,7 @@
"navbar.custom.reset_default":"إعادة الضبط إلى الافتراضي",
"navbar.custom.right":"نقل إلى اليمين",
"navbar.custom.select":"لم يتم تحديد أي خانة. حدّد خانة على الشريط لنقلها أو إزالتها أو تغيير مظهرها.",
"navbar.custom.separator_hint":"فاصل بين مجموعات الأزرار. اسحبه إلى الشريط، أو اضغط على إضافة؛ يمكنك استخدام أي عدد من الفواصل.",
"navbar.custom.separators_full":"يحتوي الشريط بالفعل على أربعة فواصل.",
"navbar.custom.show":"إظهار شريط التنقل",
"navbar.custom.shows":"يعرض",
@@ -2156,7 +2252,7 @@
"prefs.anti_aliasing_amd_dx12":"يستخدم تنعيم الحواف 1× لأن فحص بدء التشغيل لم يرسم شيئًا مع أخذ العينات المتعددة ونجح عند 1×. يمكنك اختيار إعداد آخر أعلاه؛ أعد التشغيل لتطبيقه إن نجح الفحص.",
"prefs.appearance.viewport_colours":"ألوان العرض ثلاثي الأبعاد",
"prefs.appearance.viewport_logo":"منفذ العرض والشعار",
"prefs.appearance.viewport_logo":"منطقة العرض والشعار",
"prefs.applies_on_restart":"يُطبَّق عند إعادة التشغيل",
"prefs.assistant":"المساعد",
"prefs.assistant_connecting":"الاتصال",
"prefs.assistant_follow_help":"النظر إلى الرسومات يحرّك العرض مع المؤشر.",
"prefs.assistant_limit":"الحد",
"prefs.assistant_limited":"محدود",
"prefs.assistant_pointer_speed":"سرعة المؤشر",
"prefs.assistant_seconds":"ثوانٍ",
"prefs.assistant_seconds_aria":"الثواني",
"prefs.assistant_use_care":"استخدم بحذر",
"prefs.auto_operation":"اختيار العملية تلقائيًا",
"prefs.auto_operation_note":"تختار نوافذ الميزات «ضم» أو «جسم جديد» أو «قص» بحسب ما تلامسه المادة الجديدة، إلى أن تختار عملية بنفسك. عند الإيقاف: تحتفظ بالعملية التي تُفتح بها.",
"prefs.auto_operation_note":"ضم أو جسم جديد أو قص، حسب ما تلامسه المادة.",
"prefs.axes":"المحاور",
"prefs.axis":"المحور",
"prefs.blur_cost":"تكلفة العرض النسبية. زيادة الأشرطة تعني عادةً مزيدًا من العمل.",
"prefs.blur_device":"غير متاح على جهاز الرسوميات أو مسار العرض هذا",
"prefs.blur_guard":"خُفّضت جودة التمويه للحفاظ على استجابة الإطارات. لم يتغير نصف القطر.",
"prefs.blur_off":"إيقاف",
"prefs.blur_reduce_transparency":"معطّل بسبب إعداد تقليل الشفافية في النظام",
"prefs.blur_software":"غير متاح مع الرسوميات البرمجية (gpu-software)",
"prefs.blur_source":"غير متاح في عرض مساحة العمل هذا",
"prefs.blur_web":"غير متاح في مسار عرض الويب هذا",
"prefs.dialogs_note":"مكان فتح حوارات الأوامر: مثبتة عند حافة العرض، أو في العمود الأيسر مكان المستعرض والسجل، اللذين يعودان كما كانا عند إغلاق الحوار.",
"prefs.dimension_step_angle":"ما تضيفه أسهم النافذة والسهمان لأعلى ولأسفل والعجلة إلى الزاوية",
"prefs.dimension_step_length":"ما تضيفه أسهم النافذة والسهمان لأعلى ولأسفل والعجلة إلى الطول",
"prefs.dimension_steps":"خطوات النافذة",
"prefs.dimension_values":"قيم الأبعاد",
"prefs.dimension_values_note":"مكان كتابة قيمة البعد. للنافذة أسهم تغيّرها بخطوات؛ تضع أداة البعد النص أولًا.",
"prefs.dimension_values_view":"في العرض",
"prefs.dimension_values_window":"في نافذة",
"prefs.display":"العرض",
"prefs.edges":"الحواف والتظليل",
"prefs.extend":"توسيع",
@@ -2255,6 +2385,23 @@
"prefs.graphics_card_restart":"يُطبَّق بعد إعادة تشغيل SolidCraft. يتجاوز WGPU_ADAPTER_NAME هذا الاختيار.",
"prefs.graphics_card_unused":"لم تُستخدم بطاقة الرسوميات المحفوظة لهذه النافذة؛ البطاقة المستخدمة تظهر في «المساعدة › حول» وفي شريط الحالة. جرّب «تلقائي»، أو عيّن WGPU_ADAPTER_NAME إلى جزء فريد من اسم البطاقة.",
"prefs.graphics_note":"وازن بين السرعة والنعومة. كل خيار يعرض أثره على عيّنة.",
"prefs.hide_constraint_glyphs_zoomed_out":"إخفاء رموز القيود عند التصغير",
"prefs.hide_constraint_glyphs_zoomed_out_note":"تختفي رموز القيود من العرض عندما يُصغَّر الرسم بقدر يجعلها تزحمه. معطّل: تبقى بحجم ثابت على الشاشة عند أي مستوى تكبير.",
@@ -2263,7 +2410,7 @@
"prefs.history_origin_bodies_note":"يبدأ السجل على اليسار أو تحت المستعرض بمجلد الأجسام للمكوّن النشط وبالأصل، مع أيقونات الإظهار والقوائم كما في المستعرض. لا يتغير السجل في الأسفل.",
"prefs.history_play_button":"زر تشغيل السجل في عناصر تحكم السجل",
"prefs.history_play_button_note":"يضيف تشغيل السجل بين الرجوع خطوة والتقدم خطوة في عناصر تحكم السجل. يمكنك أيضًا النقر بزر الماوس الأيمن على عناصر التحكم لإظهاره أو إخفائه.",
"prefs.history_sketches":"الرسومات",
"prefs.history_sketches":"الرسومات في السجل",
"prefs.history_sketches_in_order":"بالترتيب",
"prefs.history_sketches_note":"عند ضبط الرسومات على «تحت ميزتها»، يعرض السجل على اليسار كل رسم بمستوى واحد للداخل، تحت أول ميزة بُنيت منه، متى كان عريضًا بما يكفي لإظهار الأسماء. أما الخط الزمني في الأسفل فيحتفظ دائمًا بترتيب الإنشاء.",
"prefs.navigator_fit":"ملاءمة النموذج بعد تغيير العرض من متصفح العرض",
"prefs.navigator_fit_note":"النقر على وجه أو ركن أو سهم في المكعب، أو على محور في أداة المحاور، يوجّه العرض أيضًا نحو منتصف النموذج من المسافة الواحدة التي تُظهره كاملًا من كل جهة (كرته المحيطة). يستخدم العرض الرئيسي التكبير والمركز ذاتهما ما دام هذا مفعّلًا، فلا تغيّر العروض المختارة بعده سوى الاتجاه. عند الإيقاف: يدور العرض في مكانه محتفظًا بالهدف والتكبير.",
@@ -2332,11 +2502,15 @@
"prefs.origin_plane_names_note":"الأسماء المعروضة في المستعرض والحوارات والقوائم. {top} هو XY و{front} هو XZ و{right} هو YZ، والمحور Z للأعلى. تحتفظ الأوامر والسكربتات والتصاميم المحفوظة بـ XY وXZ وYZ.",
"prefs.overall_speed":"السرعة العامة",
"prefs.parameter_list_rows":"صفوف قائمة المعاملات",
"prefs.parameter_list_rows_tip":"يعرض السهم لأسفل في حقل قيمة فارغ المعاملات، المفضلة أولًا، حتى هذا العدد. العدد الأقل يبقي القائمة خفيفة في التصميم الكبير.",
"prefs.parameter_list_rows_tip":"الحد الأقصى للمعاملات التي يسردها السهم لأسفل في مربع تعبير فارغ.",
"prefs.profile_name_hint":"اسم ملف التعريف، مثل: حاسوب محمول",
"prefs.profile_operations":"تحليل زمن العمليات",
"prefs.profile_operations_note":"يسجّل المدة التي تستغرقها استدعاءات SMLib وعمليات النواة والميزات والأوامر وعمليات الاستيراد. يقرؤه الوكلاء عبر diagnostics.profile.",
"prefs.profile_rename":"إعادة تسمية",
"prefs.profile_renamed":"تمت إعادة تسمية ملف التعريف.",
"prefs.profile_save":"حفظ",
@@ -2380,7 +2556,12 @@
"prefs.scale_text":"الحجم والنص",
"prefs.search":"البحث في الإعدادات",
"prefs.search_empty":"لا توجد إعدادات مطابقة",
"prefs.section_hatch":"تهشير المقطع",
"prefs.section_hatch_by_part":"حسب الجزء",
"prefs.section_hatch_one":"نمط واحد",
"prefs.select":"تحديد",
"prefs.select_hidden_edges":"تحديد الحواف المخفية في العرض المظلل مع الحواف المخفية",
"prefs.select_hidden_edges_help":"يتيح تحديد الحواف عبر الأسطح عند تفعيل العرض المظلل مع الحواف المخفية، بما في ذلك استخدام أداة Fillet. يحافظ إيقافه على سلوك التحديد في v0.30.1. تظل الأجسام المخفية غير قابلة للتحديد.",
"prefs.select_one_item":"تحديد عنصر واحد",
"prefs.select_other_hidden":"تحديد العناصر الهندسية المخفية باستخدام «تحديد عنصر آخر»",
"prefs.select_other_hidden_help":"عند التفعيل: تضمين الأجسام والمخططات المخفية والحواف المحجوبة قرب المؤشر. عند التعطيل: استخدام القائمة الأصلية للعناصر الهندسية المرئية أسفل المؤشر.",
@@ -2389,8 +2570,45 @@
"prefs.shift_add_ctrl_toggle":"Shift يضيف فقط، وCtrl / Cmd يبدّل",
"prefs.single_surface_analysis":"استخدام تحليل سطح واحد",
"prefs.single_surface_analysis_help":"عند إيقاف هذا الخيار، يمكن إبقاء تظليل السطح وتحليل الاستمرارية مفعّلين معًا. عند تشغيله، يبقى آخر تحليل تم بدؤه أو تغييره فقط.",
"prefs.sketch.align_points":"المحاذاة مع نقاط الرسم الأخرى",
"prefs.sketch.align_points_note":"تتحاذى الخطوط أثناء الرسم مع النقاط على المحورين معًا.",
"prefs.sketch.auto_dimensions":"إضافة كل الأبعاد للأشكال الجديدة",
"prefs.sketch.auto_dimensions_note":"القيم المدخلة وكل بُعد يثبّت الشكل.",
"prefs.sketch.auto_locate":"تحديد الموضع من أصل الرسم",
"prefs.sketch.auto_locate_note":"مع إضافة كل الأبعاد.",
"prefs.sketch.center_arc":"القوس بنقطة مركز يتبع المؤشر",
"prefs.sketch.click_selects":"النقر يحدد",
"prefs.sketch.conflict_colour":"لون التعارض",
"prefs.sketch.drawing":"الرسم",
"prefs.sketch.ellipse_axes":"رسم القطوع الناقصة مع محاورها",
"prefs.sketch.ellipse_axes_note":"المحوران الأكبر والأصغر كخطوط مساعدة، لتحديد أبعاد أنصاف المحاور والمحاور. عند الإيقاف: القطع الناقص وحده، ويعطي D عليه نصف قطره الأصغر أينما سُحبت القيمة، مرسومًا ومُعلَّمًا بـ R كما في السابق.",
"prefs.sketch.exit_keep":"إبقاء",
"prefs.sketch.exit_previous":"العودة إلى العرض السابق",
"prefs.sketch.exit_unless_rotated":"إلا إذا تم التدوير",
"prefs.sketch.faces_edges":"الأوجه والحواف",
"prefs.sketch.hide_glyphs":"إخفاء الرموز عند التصغير",
"prefs.sketch.marks":"العلامات في الرسم",
"prefs.sketch.note":"الرسم والالتقاط والتحديد.",
"prefs.sketch.opening_closing":"الفتح والإغلاق",
"prefs.sketch.prefer_free_points":"تفضيل النقاط القابلة للتحريك عند تداخلها",
"prefs.sketch.project_options":"السؤال عن خيارات الإسقاط أولًا",
"prefs.sketch.recent_snap":"الالتقاط عند تقاطع دليلين",
"prefs.sketch.select_other_hidden":"تحديد آخر يشمل الهندسة المخفية",
"prefs.sketch.tracking_guides":"أدلة المراكز ونقاط المنتصف",
"prefs.sketch.tracking_guides_note":"أدلة أفقية وعمودية مؤقتة من المراكز ونقاط منتصف الحواف عند التحويم.",
"prefs.sketch.tracking_points":"أدلة من نقاط الرسم أيضًا",
"prefs.sketch.unless_turned_note":"العودة إذا لم يتم التدوير",
"prefs.sketch.whole_bodies":"الأجسام كاملة",
"prefs.sketch_align_points":"المحاذاة مع نقاط الرسم الأخرى أثناء الرسم",
"prefs.sketch_align_points_note":"أثناء الرسم، تتحاذى النقطة أفقيًا مع نقطة رسم وعموديًا مع نقطة أخرى في الوقت نفسه، مع خط إرشادي منقط، وتحتفظ النقرة بالمحاذاتين. عند الإيقاف: مع النقطة السابقة فقط، محور واحد في كل مرة.",
"prefs.stand_up_note":"بعد فتح ملف STEP أو IGES ومحوره Z للأعلى، يُعرض تدويره ربع دورة حول X.",
"prefs.stand_up_unknown":"للملفات من برامج غير معروفة",
"prefs.stand_up_unknown":"ملفات من برامج غير معروفة",
"prefs.stand_up_unknown.ask":"السؤال في مربع حوار",
"prefs.stand_up_unknown.note":"عرض ملاحظة",
"prefs.stand_up_unknown.off":"عدم العرض",
"prefs.stand_up_unknown_note":"طريقة العرض عندما لا يذكر رأس الملف برنامجًا معروفًا بحفظ المحور Y للأعلى. تظهر الملاحظة فقط عندما يبدو أن الملف ملقى على ظهره؛ أما «السؤال في مربع حوار» فيسأل عن كل ملف كهذا، كما كان سابقًا.",
"prefs.stand_up_unknown_note":"كيفية عرض الاقتراح عندما لا يذكر الملف برنامجًا معروفًا.",
"prefs.status_bar":"شريط الحالة",
"prefs.status_bar_note":"شريط رفيع على الحافة السفلية للنافذة يعرض ما يجري تحريره، وحالة الرسم المفتوح بلونها، ووحدات التصميم؛ النقر على الوحدات يغيّرها. عندها لا تظهر حالة الرسم في زاوية العرض.",
"prefs.status_done":"تم",
@@ -2463,6 +2681,10 @@
"prefs.theme_follow_off":"إيقاف",
"prefs.theme_follow_stop":"إيقاف الاتباع",
"prefs.theme_import_hint":"انقر لاختيار ملف سمة، أو أفلت ملفًا هنا، أو اضغط Ctrl+V (Cmd+V على Mac) بعد نسخ سمة",
"prefs.theme_notice_dismiss":"إخفاء",
"prefs.theme_option_blur":"تمويه خلف اللوحات",
"prefs.theme_option_blur_help":"تمويه خلف اللوحات شبه الشفافة، بالبكسل الفعلي. الصفر يوقف التمويه.",
"prefs.theme_option_invalid":"القيمة المحفوظة للخيار {option} غير صالحة؛ تُستخدم القيمة الافتراضية للسمة. تبقى القيمة المحفوظة كما هي.",
"prefs.theme_option_opacity":"العتامة",
"prefs.theme_option_opacity_help":"اضبط عتامة اللوحات العائمة. يُطبّق حد أدنى للعتامة للحفاظ على وضوح النص فوق ألوان منطقة العرض.",
"prefs.theme_option_tab_fade_ms_help":"تتغيّر ألوان اللوحات ومنطقة العرض تدريجيًا عند تبديل علامات التبويب. القيمة صفر تبدّلها فورًا.",
"prefs.theme_options_badge":"الخيارات",
"prefs.theme_options_more":"المزيد · {count}",
"prefs.theme_options_newer":"تتطلب هذه السمة إصدارًا أحدث من SolidCraft. بعد الترقية، أعد استيراد السمة الأصلية لاستعادة تعريفات خياراتها.",
"prefs.theme_options_reset":"إعادة تعيين",
"prefs.theme_options_unavailable":"غير متاح على هذا الجهاز",
"prefs.theme_paste":"لصق السمة",
@@ -2494,8 +2717,14 @@
"prefs.under_cursor":"تحت المؤشر",
"prefs.units_precision":"الوحدات والدقة",
"prefs.updates":"التحديثات",
"prefs.value_boxes_in_view":"إظهار القيم بجانب مقابضها في العرض",
"prefs.value_boxes_in_view_tip":"قيمة الأمر (المسافة، نصف القطر…) في مربع بجانب مقبضه، فوق النموذج. عند الإيقاف: تكتبها في نافذة الأمر، التي تتلقى لوحة المفاتيح بعد التحديد، ولا شيء يغطي النموذج.",
"prefs.validation":"التحقق من الأجسام",
"prefs.validation.each_feature":"مرة لكل ميزة",
"prefs.validation.each_step":"بعد كل خطوة",
"prefs.validation.label":"فحص النواة الكامل",
"prefs.validation.off":"متوقف (تجريبي)",
"prefs.validation_note":"بعد كل خطوة: يفحص كل عملية كنس وعملية منطقية وتقويس.\nمرة لكل ميزة: يفحص ناتج كل ميزة مرة واحدة.\nمتوقف (تجريبي): لا فحص.",
"prefs.value_boxes_in_view":"إظهار القيم بجانب مقابضها",
"prefs.value_boxes_in_view_tip":"مسافة البثق ونصف قطر التدوير... في مربع داخل العرض.",
"prefs.view":"سلوك العرض",
"prefs.view_confirm_corner":"موافق وإلغاء في زاوية العرض",
"prefs.view_confirm_corner_note":"أثناء فتح مربع حوار أو رسم، تؤدي علامة الصح وعلامة الإكس أعلى يمين العرض ما يؤديه زرّا موافق وإلغاء في مربع الحوار، أو تنهي الرسم وتلغيه. وينتقل متصفح العرض إلى أسفلهما.",
@@ -2528,6 +2757,17 @@
"recovery.just_now":"الآن",
"recovery.min_ago":"قبل {count} دقيقة",
"recovery.never_saved":"لم يُحفظ قط",
"refused.change":"تعذّر تغيير {body}.",
"refused.cut":"تعذّر قطع {body}.",
"refused.face_curved":"أحد أوجهه المنحنية لا يمكن استخدامه في النمذجة.",
"refused.face_flat":"أحد أوجهه المستوية لا يمكن استخدامه في النمذجة.",
"refused.face_freeform":"أحد أوجهه الحرة لا يمكن استخدامه في النمذجة.",
"refused.face_rounded":"أحد أوجهه المستديرة لا يمكن استخدامه في النمذجة.",
"refused.faces_apart":"أوجهه لا تلتقي بدقة كافية لاستخدامها في النمذجة.",
"render.adaptive_enable":"توزيع العيّنات باستخدام عيّنات استكشافية مستقلة",
@@ -3885,11 +4125,11 @@
"select two components":"حدد مكوّنين اثنين",
"set by the sketch's lines":"تحدده خطوط الرسم",
"settings.display_quality_note":"المستويات الأدق ترسم الأوجه والحواف المنحنية بنعومة أكبر وتستغرق وقتًا أطول لإنشاء الشبكة. يتغير العرض فقط، لا التصميم ولا الملفات المصدّرة.",
"settings.double_click_components":"انقر نقرًا مزدوجًا على مكوّن لتنشيطه، أو لتحرير مكوّن مرتبط في مكانه",
"settings.double_click_components":"النقر المزدوج على مكوّن لتنشيطه",
"settings.frame_rate_details_note":"يضيف رسمًا لأزمنة الإطارات الأخيرة مع المثلثات المرسومة فوقه، ومدرّجًا تكراريًا لأزمنة الإطارات، وما رسمته وحدة GPU. انقر معدل الإطارات في العرض لإظهارها أو إخفائها.",
"settings.frame_rate_note":"يعرض الإطارات في الثانية في الزاوية اليمنى السفلية من العرض. أثناء تفعيله يُعاد رسم العرض باستمرار.",
"settings.insert_lists_open_designs":"يعرض إدراج تصميم أولًا التصاميم المفتوحة في علامات التبويب الأخرى",
"settings.measure_axis_distances":"إظهار المسافات على X/Y/Z",
"settings.frame_rate_note":"يعرض الإطارات في الثانية في الزاوية اليمنى السفلية من العرض.",
"settings.insert_lists_open_designs":"إدراج تصميم يسرد التصاميم المفتوحة أولًا",
"settings.measure_axis_distances":"مسافات المحاور في القياس",
"settings.measure_axis_distances_help":"إظهار مركّبات الأبعاد على محاور العالم بجانب المسافة الكلية أثناء فتح أداة القياس.",
"settings.msaa_applies_on_restart":"يُطبّق تنعيم الحواف في المرة القادمة التي يبدأ فيها SolidCraft",
"settings.msaa_reset":"{setting}: القيمة {requested}× غير مدعومة في جهاز الرسوميات هذا؛ أصبحت الآن {reset}× (المدعوم: {supported}).",
@@ -3899,7 +4139,7 @@
"settings.reset_intro":"هذه الإعدادات لا تعمل على هذا الحاسوب وكانت ستمنع SolidCraft من البدء، لذا غُيّرت:",
"settings.reset_title":"تم تغيير الإعدادات",
"settings.supersampling_note":"يرسم العرض بدقة أعلى ثم يصفّيه: حواف وخطوط وشبكة أنعم على الشاشات الأقل من 4K. يكلّف وقتًا من معالج الرسوميات: نحو 2.25× من البكسلات عند 1.5× و4× عند 2×.",
"settings.update_changed_links":"تحديث التصاميم المرتبطة التي تغيّرت عند العودة إلى علامة التبويب",
"settings.update_changed_links":"تحديث الروابط المتغيرة عند العودة إلى علامة تبويب",
"settings.window_system_details":"التفاصيل",
"settings.window_system_note_now":"يُطبَّق بعد إعادة التشغيل. الحالي: {now}.",
"settings.window_system_wayland_limited":"بعض الميزات محدودة على Wayland الأصلي.",
@@ -3938,6 +4178,32 @@
"sketch.dof_left":"تبقّت {count} درجات حرية",
"sketch.dof_left_one":"تبقّت {count} درجة حرية",
"sketch.draw_curves":"الرسم كـ {linetype}",
"sketch.error.closed_curve_two_crossings":"a closed curve needs two crossings to trim",
"sketch.error.nothing_to_break":"nothing to break here",
"sketch.error.offset_fillet_chamfer":"`{id}` is an offset, and its corners follow its source curves: round or cut the source corners before offsetting, or break the offset association first",
"sketch.error.offset_trim":"`{id}` is an offset, and its ends follow its source curves: edit the source curves instead, or break the offset association first",
"sketch.hint.arc.center_point":"Arc: click center and start, go round either way and click the end, or type a signed sweep",
"sketch.hint.arc.three_point":"Arc: click start, end, then a point on the arc",
"sketch.hint.arc3d":"3D Arc: click start, end, then a point on the arc (points may leave the sketch plane)",
"sketch.hint.break":"Break: click a curve where it should split",
"sketch.hint.circle.center":"Circle: click the center, then a point on the circle",
"sketch.hint.constraint.generic":"Constraint: pick the sketch entities",
"sketch.hint.constraint.horizontal_vertical":"Horizontal/Vertical: pick a line, two points, or a point and a line; hold Shift to pick a line midpoint",
"sketch.hint.constraint.midpoint":"MidPoint: pick a point and a line, or two lines to center the second on the first",
"sketch.hint.dimension":"Dimension: pick one or two entities and type the value (or click to place it first); click a dimension to edit it; Enter applies",
"sketch.hint.extend":"Extend: click a curve near the end to extend (Shift: click two curves to extend both to where they meet)",
"sketch.hint.fallback":"Click in the sketch",
"sketch.hint.line":"Line: click points; right-click or Esc to finish",
"sketch.hint.line3d":"3D Line: click world points; right-click or Esc to finish (points may leave the sketch plane)",
"sketch.hint.open_done":"Open done",
"sketch.hint.point3d":"3D Point: click where a 3D point goes",
"sketch.hint.rectangle.center":"Center rectangle: click the center, then a corner",
"sketch.hint.rectangle.rounded":"Rounded rectangle: click two opposite corners (Tab to the radius box to type the corner radius)",
"sketch.hint.rectangle.three_point":"3-point rectangle: click two points of one edge, then the width",
"sketch.hint.rectangle.two_point":"Rectangle: click two opposite corners",
"sketch.hint.slot":"Slot: click both ends, then the width",
"sketch.hint.spline3d":"3D Spline: click fit points in 3D; right-click or Esc to finish",
"sketch.hint.trim":"Trim: click the piece of a curve to remove, or drag across the pieces to remove",
"sketch.make_selection":"تحويل التحديد إلى {linetype}",
"sketch.open_ends":"مفتوحة {count}",
"sketch.status_conflict":"تعارض القيود",
@@ -3995,11 +4261,20 @@
"the section's profiles must be in one sketch":"يجب أن تكون مقاطع المقطع العرضي في رسم واحد",
"the two origins are on the same component":"يقع الأصلان على المكوّن نفسه",
"thread.automatic_size":"حجم تلقائي",
"thread.chamfer_depth_needed":"مطلوب لهذا الشكل",
"thread.designation":"التسمية",
"thread.direction":"اتجاه السن اللولبي",
"thread.drill_range":"مثقاب التسنين الذي يوصي به صانعو ذكور التسنين {drill} مم. القطر الأصغر القياسي للسن الداخلي {minor} مم. يُقبل مثقاب من {low} إلى {high} مم.",
"thread.drill_range_custom":"المثقاب هو القطر الأكبر ناقص الخطوة، {drill} مم. القطر الأصغر القياسي للسن الداخلي {minor} مم. يُقبل مثقاب من {low} إلى {high} مم.",
"thread.drill_range_taper":"مثقاب التسنين الذي يوصي به صانعو ذكور التسنين {drill} مم. القطر الأصغر القياسي عند نهاية السن {minor} مم. يُقبل مثقاب من {low} إلى {high} مم.",
"thread.form_rp":"سن أنابيب داخلي متوازٍ Rp (ISO 7-1)",
"thread.iso_metric":"متري ISO",
"thread.left_hand":"يساري",
"thread.right_hand":"يميني",
"thread.select_size":"اختر الحجم",
"timeline.delete_after_marker_one":"حذف ميزة واحدة بعد مؤشر السجل",
"timeline.delete_after_marker_other":"حذف {count} ميزات بعد مؤشر السجل",
@@ -4251,6 +4526,7 @@
"ui.agent_chat_no_images":"هذا الوكيل لا يقبل الصور",
"ui.agent_chat_no_picture":"لا توجد صورة في الحافظة",
"ui.agent_chat_no_tool_call":"لم يستخدم النموذج أدوات SolidCraft، لذا لم يتغيّر التصميم. اختر نموذجًا يدعم استدعاء الأدوات؛ راجع «النماذج المحلية» في دليل محادثة الوكيل.",
"ui.agent_chat_node_too_old":"إصدار Node.js {version} قديم جدًا لهذا الوكيل. ثبّت Node.js 20.10 أو أحدث، ثم اضغط تحديث.",
"ui.agent_chat_none_found":"لم يُعثر على وكيل برمجي. ثبّت أحد هذه ثم اضغط تحديث:",
"ui.agent_chat_none_found_short":"لم يُعثر على وكيل",
"ui.agent_chat_not_installed":"غير مثبت",
@@ -4291,7 +4567,7 @@
"ui.agent_chat_send_now_tip":"إيقاف خطوة الوكيل الحالية وإرسال هذه بعدها (Ctrl+Enter)",
"ui.agent_chat_setup_body":"يتواصل SolidCraft مع وكيل برمجة مثبّت على هذا الحاسوب. اختر واحدًا من التفضيلات › الوكيل.",
"ui.agent_chat_setup_title":"إعداد مساعد",
"ui.agent_chat_side":"جانب محادثة الوكيل",
"ui.agent_chat_side":"تثبيت المحادثة",
"ui.agent_chat_signed_in":"سجّل الدخول",
"ui.agent_chat_state_auth":"يلزم تسجيل الدخول",
"ui.agent_chat_state_busy":"جارٍ العمل…",
@@ -4356,14 +4632,14 @@
"ui.ai_key_note":"يُخزّن في سلسلة مفاتيح النظام، وليس في إعدادات SolidCraft أبدًا. اتركه فارغًا لخادم محلي.",
"ui.ai_keychain_error":"رفضت سلسلة مفاتيح النظام: {error}",
"ui.ai_kind":"النوع",
"ui.ai_mode_all":"السماح بكل شيء",
"ui.ai_mode_all":"تنفيذ كل شيء",
"ui.ai_mode_all_note":"لا شيء يسأل أولًا. تبقى تقارير الأعطال محظورة وتظل حدود المجلدات سارية.",
"ui.ai_mode_all_warning":"يمكن للوكيل حفظ تصميمك والكتابة فوقه وتصديره واستبداله دون سؤال. استخدم هذا فقط مع وكيل تثق به، وعلى تصاميم حفظتها.",
"ui.ai_mode_ask":"السؤال في كل مرة",
"ui.ai_mode_ask":"السؤال أولًا",
"ui.ai_mode_ask_note":"كل تغيير في التصميم وكل إجراء على الملفات ينتظر سماحك.",
"ui.ai_mode_edits_note":"أوامر النمذجة تعمل دون سؤال؛ أما الحفظ والفتح والتصدير وإجراءات الملفات أو الإجراءات الهدّامة الأخرى فتسأل.",
"ui.ai_mode_global":"كما هو مضبوط أعلاه",
"ui.ai_mode_global":"كما في الأعلى",
"ui.ai_model":"النموذج",
"ui.ai_model_hint":"qwen3:14b",
"ui.ai_modes_scope":"هذه الإعدادات تغطي أدوات SolidCraft. أدوات الوكيل الخاصة (الصدفة وتعديل الملفات) تتبع وضع الوكيل الخاص، الذي تختاره في رأس لوحة المحادثة عندما تكون للوكيل أوضاع.",
"ui.ai_show_features_note":"محادثة الوكيل: لوحة يعمل فيها وكيل برمجي تستخدمه أصلًا، أو نقطة نهاية نموذج تختارها، على التصميم المفتوح. عند الإيقاف: لا زر ولا اختصار ولا عنصر قائمة ولا لوحة للذكاء الاصطناعي، ولا يُبحث عن شيء أو يُشغّل.",
"ui.ai_show_features_note":"إيقافه يخفي المساعد في كل مكان ولا يبدأ أي شيء. تصبح كل الخيارات أدناه باهتة.\n\nمحادثة الوكيل: لوحة يعمل فيها وكيل برمجي تستخدمه أصلًا، أو نقطة نهاية نموذج تختارها، على التصميم المفتوح. عند الإيقاف: لا زر ولا اختصار ولا عنصر قائمة ولا لوحة للذكاء الاصطناعي، ولا يُبحث عن شيء أو يُشغّل.",
"ui.ai_switch_tip":"تغيير الوكيل لهذه المحادثة",
"ui.ai_test":"اختبار",
"ui.ai_test_acp_ok":"يجيب: {agent}",
@@ -4423,7 +4699,7 @@
"ui.ai_tool_sum_then":"{first}، ثم {next}",
"ui.ai_tool_unfold":"انقر لعرض ما أعاده",
"ui.ai_tool_waiting":"بالانتظار",
"ui.ai_toolbar_button":"إظهار الزر في شريط الأدوات",
"ui.ai_toolbar_button":"زر المساعد في شريط التطبيق",
"ui.ai_toolbar_button_note":"زر الذكاء الاصطناعي في الطرف الأيمن من شريط الأدوات. يظل Ctrl+Shift+A وقائمة العرض يفتحان اللوحة.",
"ui.ai_undo_tip":"التراجع عن كل ما غيّره الوكيل لهذه الرسالة، بخطوة واحدة",
"ui.ai_url_hint":"https://example.com/v1",
@@ -4470,6 +4746,8 @@
"ui.centerline":"خط المركز",
"ui.chain":"سلسلة",
"ui.chamfer":"شطف",
"ui.chamfer_angle":"زاوية الشطف",
"ui.chamfer_depth":"عمق الشطف",
"ui.chamfer_type":"نوع الشطف",
"ui.change_workspace":"تغيير مساحة العمل",
"ui.circle":"دائرة",
@@ -4500,6 +4778,10 @@
"ui.colour_vision_sample":"عيّنة",
"ui.colour_vision_tritan":"ضعف الأزرق",
"ui.colour_vision_tritan_tip":"لضعف أو غياب الإحساس باللون الأزرق",
"ui.comb_length":"طول المشط",
"ui.comb_length_tip":"طول الأسنان: مضاعف للطول التلقائي الذي يجعل أطول سنّ خُمس حجم المنحنيات المعروضة.",
"ui.comb_teeth":"الأسنان",
"ui.comb_teeth_tip":"عدد أسنان كل مشط، موزّعة بالتساوي على طول المنحنى. كلما زادت الأسنان ظهرت تفاصيل أكثر عن تغيّر الانحناء.",
"ui.combine":"دمج",
"ui.coming_later":"قريبًا",
"ui.command_done":"تم {command}",
@@ -4524,11 +4806,24 @@
"ui.construction.ribbon_label":"خطوط مساعدة",
"ui.construction.side_hint":"خط إنشائي: انقر الجهة التي يمتد نحوها الخط؛ انقر بزر الفأرة الأيمن للبدء من جديد",
"ui.extrude_auto_to_object":"البثق إلى هدف مختار",
"ui.extrude_auto_to_object_tip":"في البثق، مع اختيار مقطع، يؤدي اختيار وجه أو رأس أو مستوى موازٍ خارج مستواه إلى تبديل الامتداد إلى «إلى كائن»",
"ui.extrude_auto_to_object_tip":"وجه أو رأس أو مستوى موازٍ يغيّر الامتداد إلى «إلى كائن».",
"ui.factor":"المعامل",
"ui.fade":"تلاشٍ",
"ui.fade_length":"طول التلاشي",
"ui.feature_history":"سجل الميزات",
"ui.feature_options":"خيارات الميزة",
"ui.features":"الميزات",
"ui.file":"ملف",
"ui.fillet":"تقويس",
"ui.fillet_corner_ball":"كرة",
"ui.fillet_corner_ball_tip":"جزء من سطح الكرة المتدحرجة، مماسّ (G1) لكل تقويس.",
"ui.fillet_corner_curvature_tip":"الانحناء (G2): رقعة ناعمة. تُرجَع الزاوية على طول كل حافة بمقدار الإرجاع ({factor} ضعف نصف القطر ما لم تكتب قيمة) وتُملأ برقعة، فتمر الانعكاسات عبرها دون انكسار.",
"ui.fillet_corner_needs_constant":"زوايا الرقعة الناعمة (G2) تتطلب نصف قطر ثابتًا وملاءمة دقيقة لنصف القطر.",
"ui.fillet_corner_patch":"رقعة ناعمة",
"ui.fillet_corner_patch_tip":"متصل الانحناء (G2): تُرجَع الزاوية على طول كل حافة وتُملأ برقعة، فتمر الانعكاسات عبرها دون انكسار.",
"ui.fillet_corner_tangent_tip":"مماس (G1): زاوية بالكرة المتدحرجة، جزء من سطح الكرة المتدحرجة مماسّ لكل تقويس.",
"ui.fillet_error_corner":"تعذّر بناء الزاوية الناعمة هنا. جرّب مسافة إرجاع أخرى، أو زوايا مماسّة.",
"ui.fillet_error_failed":"تعذّر بناء هذا التقويس على هذه الحواف. جرّب نصف قطر آخر، أو قوّس حوافّ أقل في المرة الواحدة.",
"ui.fillet_error_setback_short":"مسافة الإرجاع قصيرة جدًا على رقعة هذه الزاوية: تُبنى ابتداءً من {least}. جرّب مسافة إرجاع أطول.",
"ui.fillet_error_too_large":"نصف القطر كبير جدًا على الوجوه المجاورة لهذه الحواف. جرّب نصف قطر أصغر، أو اختر في «حدود الوجوه» الخيار «أكبر نصف قطر».",
"ui.fillet_fit":"حدود الوجوه",
"ui.fillet_fit_exact":"نصف قطر دقيق",
"ui.fillet_fit_needs_constant":"ملاءمة نصف القطر تتطلب نصف قطر ثابتًا.",
"ui.fillet_fit_reduce":"أكبر نصف قطر",
"ui.fillet_fit_taper":"نصف قطر مُضيَّق",
"ui.fillet_fit_tip":"عندما يكون نصف القطر أكبر مما تسمح به الوجوه المجاورة للحافة.\nنصف قطر دقيق: نصف القطر كما هو، أو لا تقويس ورسالة توضّح السبب.\nأكبر نصف قطر: تُقوَّس كل حافة بأكبر نصف قطر يتّسع.\nنصف قطر مُضيَّق: يبقى نصف القطر، ويُضيَّق التقويس فقط حيث تنتهي الوجوه.",
"ui.fillet_options_tip":"سلسلة مماسّة: قوّس أيضًا الحواف التي تتصل بسلاسة بالحواف المختارة.\nمعاينة: اعرض النتيجة في العرض أثناء التحرير.",
"ui.fillet_setback":"مسافة الإرجاع",
"ui.fillet_setback_hint":"{factor} × نصف القطر",
"ui.fillet_setback_least":"أكثر من {least}",
"ui.fillet_setback_tip":"حيث تبدأ رقعة الزاوية الناعمة: المسافة على طول كل حافة من الزاوية. الافتراضي {factor} ضعف نصف القطر. يجب أن تكون أكبر من أقل مسافة إرجاع، وهي التي تلتقي عندها التقويسات دون إرجاع: نصف القطر حين تكون الأوجه متعامدة.",
"ui.fillet_turn_tip":"حيث يلتف تقويسان حول حافة ركن حادة بينهما، مثل التقويسات على قاعدة نتوء عند حوافه القائمة.\nوصلة مائلة: يمتد التقويسان حتى يلتقيا في وصلة مائلة.\nملتف: يتوقف التقويسان عند حافة الركن ويلتفان حولها، والركن طارة مماسة لكليهما. فقط لتقويسين بنصف قطر واحد حول حافة ركن مستقيمة ومحدبة.",
"ui.fillet_type_choices_tip":"نصف قطر ثابت: نصف قطر واحد على طول الحافة.\nطول الوتر: يبقى عرض التقويس نفسه مهما كانت الزاوية بين الوجوه.\nنصف قطر متغيّر: نصف قطر عند كل طرف، ومزيد على طول الحافة إن أضفته.\nمتصل الانحناء: مقطع بلا انكسار في الانعكاسات حيث يلتقي بالوجوه المستوية (G2).\nمنحنى شريحي: يتبع نصف القطر على طول الحافة أنصاف أقطار تحكّم تحدّدها.",
"ui.fillet_type_curvature":"متصل الانحناء",
"ui.fillet_type_tip":"المقطع عبر الحافة. متصل الانحناء: مقطع متصل الانحناء (G2) بين وجوه مستوية، فتمر الانعكاسات من الوجوه إلى التقويس دون انكسار.",
"ui.filter_commands_or_keys":"تصفية الأوامر أو المفاتيح",
"ui.findInTimeline":"البحث في الخط الزمني",
"ui.findInWindow":"البحث في النافذة",
@@ -4722,6 +5053,7 @@
"ui.heading_construct":"إنشاء مرجعي",
"ui.heading_create":"إنشاء",
"ui.heading_create_sketch":"إنشاء رسم",
"ui.heading_custom_view_navigator":"متصفح العرض المخصص",
"ui.heading_cylinder":"أسطوانة",
"ui.heading_design":"التصميم",
"ui.heading_draft":"ميل السحب",
@@ -4789,7 +5121,7 @@
"ui.hidePlanes":"إخفاء المستويات",
"ui.hideProfile":"إخفاء المقطع",
"ui.hide_component_history":"إخفاء سجله",
"ui.hide_origin_by_default":"إخفاء نقطة الأصل افتراضيًا",
"ui.hide_origin_by_default":"إخفاء مجلد نقطة الأصل في التصاميم الجديدة",
"ui.hide_origin_note":"تبدأ التصاميم الجديدة ومجلد نقطة الأصل مخفي. يحتفظ كل تصميم بإعداد نقطة الأصل الخاص به بمجرد إظهارها أو إخفائها.",
"ui.history_back":"الرجوع خطوة",
"ui.history_below_browser":"أسفل المستعرض",
@@ -4829,6 +5161,7 @@
"ui.inspect":"فحص",
"ui.instances":"النسخ",
"ui.intersect":"تقاطع",
"ui.iso_4753":"ISO 4753",
"ui.isolate":"عزل",
"ui.join":"ضم",
"ui.joint_play":"▶ تشغيل",
@@ -4931,6 +5264,7 @@
"ui.part_size_needs_a_part":"حدد قطعة قياسية مُدرجة (برغي أو صامولة أو حلقة مسطحة أو مسمار) لتغيير مقاسها. لتكبير جسم أو تصغيره، استخدم «تحجيم».",
"ui.part_size_shared":"يعيد بناء القطعة مستبدلًا أي ميزات مضافة. تتحدث كل نسخ هذا المكوّن.",
"ui.paste":"لصق",
"ui.patch_continuity_corner_tip":"تلتقي الرقعة بالأوجه المحيطة بها بالاستمرارية المختارة على طول كل جانب. وعند زاوية تلتقي فيها تلك الأوجه بعضها ببعض بانحناءات مختلفة، تبقى مماسّة (G1) هناك.",
"ui.path":"المسار",
"ui.pattern_object_type_tip":"الأجسام: أشكال مصمتة تُختار في العرض أو في المستعرض؛ يُنسخ كل منها كاملًا.\nالميزات: خطوات في السجل، مثل بثق أو ثقب، تُختار في السجل أو على وجه صنعته؛ تتكرر الخطوة.\nالرسم ليس أيًّا منهما: كرّر منحنياته بأداة النمط أو المرآة داخل الرسم، أو ابثقه أولًا.",
"ui.pattern_on_path":"نمط على مسار",
@@ -4947,7 +5281,7 @@
"ui.pitch":"الخطوة",
"ui.placement":"الموضع",
"ui.placement_handles":"مقابض الموضع",
"ui.placement_handles_tip":"مقابض على معاينة المسند أو النتوء أو وصلة الكبس: اسحب العلامة لتحريكها على النموذج، وأدِرها من حلقتها",
"ui.placement_handles_tip":"علامة لسحب الميزة عبر النموذج وحلقة لتدويرها.",
"ui.plane":"المستوى",
"ui.plane_at_angle":"مستوى بزاوية",
"ui.plugins":"الإضافات",
@@ -5031,6 +5365,8 @@
"ui.repeat_nothing":"لا يوجد ما يُكرَّر بعد: ابدأ أداة أو مربع حوار أولًا.",
"ui.replace_with_link_done":"أصبحت النسخ الآن مواضع للتصميم المرتبط.",
"ui.step_values_tip":"في حقل قيمة تكتب فيه، يغيّر السهمان لأعلى ولأسفل الرقم العادي بمقدار 1 (Shift: 10، Alt: 0.1)، وكذلك عجلة الفأرة فوق الحقل. أما التعابير فتبقى كما كُتبت.",
"ui.step_values":"تغيير القيم بالأسهم والعجلة",
"ui.step_values_tip":"يغيّر السهمان لأعلى ولأسفل والعجلة فوق حقل قيمة الرقم فيه.",
"ui.stitch_tolerance_hint":"دقيقة",
"ui.stretch":"مطّ",
"ui.supersampling":"التنعيم الفائق (SSAA)",
@@ -5315,6 +5651,14 @@
"values must be numbers or expressions":"يجب أن تكون القيم أعدادًا أو تعابير",
"view.auto_ortho_faces":"منظوري أثناء التدوير، ومتعامد على الأوجه",
"view.render_inspector":"مفتش التصيير",
"view_gizmo.arrows":"أسهم التدوير",
"view_gizmo.home":"زر العرض الرئيسي",
"view_gizmo.no_such_body":"لا يوجد في هذا التصميم جسم بهذا الاسم.",
"view_gizmo.note":"اختر جسمًا في العرض. يُحفظ مع تفضيلاتك وملفات تعريف الإعدادات، ويظهر في كل تصميم. انقر أحد أوجهه للنظر إليه مباشرة.",
"view_gizmo.texture":"الخامة",
"view_gizmo.themed":"حسب السمة",
"view_gizmo.too_detailed":"مفصّل أكثر مما يناسب متصفح العرض (أكثر من 10,000 مثلث)",
"view_gizmo.too_thin":"طويل ورفيع أكثر مما يناسب متصفح العرض: يجب ألا يقل أرفع جانب عن خُمس أطول جانب",
"web.files.insert_drawings_hint":"ملفات CAD أو شبكات أو DXF أو SVG إلى التصميم المفتوح",
"web.files.insert_stored_drawings_hint":"إلى التصميم المفتوح (ملفات CAD، شبكات، DXF، SVG)",
"Sections (one sketch each)":"Presjeci (po jedna skica)",
"Select Other":"Izaberi drugo",
"Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).":"Izaberi drugo: držite lijevo dugme mirno na modelu (ili desni klik › Izaberi drugo…) da prikažete sve ispod pokazivača; ponovo kliknite na isto mjesto da izaberete sljedeći element. Dvaput kliknite srednjim dugmetom za Početni prikaz (Postavke › Navigacija).",
@@ -859,6 +861,7 @@
"cmd.component_extract":"Izdvoji u datoteku",
"cmd.component_finish_edit":"Završi uređivanje",
"cmd.component_from_bodies":"Napravi komponente iz tijela",
"cmd.component_hide_history":"Sakrij vremensku traku komponente",
"config.rule_parameter_columns":"Prikazani su samo parametri koji imaju kolonu u tabeli. Dodajte kolonu pomoću Dodaj kolonu (+) da biste parametar koristili ovdje.",
"config.rule_suppression_columns":"Prikazane su samo operacije koje imaju kolonu Potisni u tabeli. Dodajte kolonu pomoću Dodaj kolonu (+) da biste ovdje mogli upravljati operacijom.",
"contact.components_count":"Komponente: {count}",
"contact.enabled_label":"omogućeno",
"coupling.gear_1":"Zupčanik 1",
@@ -1353,7 +1371,11 @@
"dialog.pattern_sketch_not_object":"Izaberite tijela ili operacije: skica nije ni jedno ni drugo. Ponovite njene krive pomoću alata Niz ili Preslikaj u samoj skici ili je prvo ekstrudirajte.",
"dialog.selection_guidance":"Izaberite ulaz da ga promijenite. Kliknite izabrane objekte da ih uklonite; Ctrl/Cmd-klik ih također uključuje i isključuje. Pogledajte pregled, a zatim pritisnite U redu.",
"dialog.selection_midpoint":"Središnja tačka · {id}",
"dialog.selection_step":"{step} od {total}: Izaberite {input}",
"dialog.step":"Korak",
"document.changed_on_disk":"{name} je promijenjen na disku",
@@ -1436,6 +1458,7 @@
"help.construct.axis.two_points":"Pravi pomoćnu osu kroz dvije tačke, vrhove ili tačke skice. Koristite je za osu koja prolazi između dva poznata položaja.",
"help.construct.plane.along_path":"Pravi pomoćnu ravan okomitu na ivicu ili krivu, na nekom položaju duž nje. Koristite je da skicirate profil za povlačenje ili presjek putanje.",
"help.construct.plane.at_angle":"Pravi pomoćnu ravan zakrenutu za ugao u odnosu na ravan ili lice, oko ose ili ivice. Koristite je za nagnute skice, npr. kutni nosač.",
"help.construct.plane.axis_point":"Pravi pomoćnu ravan koja sadrži osu i tačku izvan te ose. Izaberite osu ishodišta ili pomoćnu osu, ravnu ivicu ili liniju skice, pa vrh, tačku skice ili pomoćnu tačku. Tačka na osi ne može odrediti jedinstvenu ravan.",
"help.construct.plane.midplane":"Pravi pomoćnu ravan na pola puta između dvije ravni ili ravna lica, ili koja ih raspolavlja tamo gdje se sastaju pod uglom. Koristite je kao ravan simetrije za preslikavanje.",
"help.construct.plane.offset":"Pravi pomoćnu ravan paralelnu s ravni ili ravnim licem, na određenoj udaljenosti ili kroz tačku. Koristite je da skicirate na zadatoj visini iznad lica.",
"help.construct.plane.perpendicular":"Pravi pomoćnu ravan koja sadrži liniju ili ivicu i okomita je na ravan ili lice. Koristite je da skicirate uspravno na modelu duž ivice.",
@@ -1812,6 +1835,8 @@
"joint_move.blocked_hint":"Provjerite vrstu spoja (npr. Kruti), učvršćenje, granice spoja i vrijednosti koje pokreću parametri.",
"joint_move.blocked_title":"Ovaj dio se ne može pomjeriti",
"joint_move.coarse":"Korak rotacije blizu ose (°)",
"joint_move.conflict":"Jedan spoj ovog dijela je u sukobu s ostalima: {joint}.",
"joint_move.conflict_hint":"Uredite, potisnite ili izbrišite spoj koji je u sukobu da bi ostali spojevi mogli postaviti dio.",
"joint_move.distance":"Udaljenost od početka",
"joint_move.done":"Gotovo",
"joint_move.fine":"Korak rotacije dalje od ose (°)",
@@ -1911,6 +1936,8 @@
"motion.track_name":"Staza {number}",
"nav.alias.help":"Shift+Alt+povlačenje lijevim dugmetom orbitira, Shift+Alt+srednjim pomjera, Shift+Alt+desnim zumira; povlačenje srednjim dugmetom također pomjera, a desnim orbitira",
"nav.blender.help":"Povlačenje srednjim dugmetom orbitira, Shift+srednje pomjera, Ctrl+srednje zumira; povlačenje desnim dugmetom ne dira kameru",
"nav.creo.help":"Povlačenje srednjim dugmetom orbitira, Shift+srednje pomjera, Ctrl+srednje uz vertikalno povlačenje zumira (prema dolje za približavanje); točkić također zumira",
"nav.creo.label":"Creo",
"nav.free_orbit.help":"Miš i 3D miš rotiraju kroz oba pola i čuvaju nagib. Privlačenje osa tipkom Shift je isključeno.",
"nav.free_orbit.label":"Slobodno orbitiranje",
"nav.free_orbit.snap_help":"Miš i 3D miš rotiraju kroz oba pola i čuvaju nagib. Držite Shift tokom povlačenja za orbitiranje da privučete smjer pogleda i nagib.",
@@ -2063,12 +2090,19 @@
"parts.family.button_head_cap_screw":"Vijak s poluokruglom glavom i imbusom",
"parts.family.dowel_pin":"Cilindrični zatik",
"parts.family.hex_bolt":"Vijak sa šestougaonom glavom",
"parts.family.hex_cap_screw_inch":"Vijak sa šestougaonom glavom (inč)",
"prefs.cut_preview_tint":"Prikaži uklonjeni materijal u crvenoj boji",
"prefs.cut_preview_tint_help":"Pregled ispunjava materijal koji operacija uklanja i oblik koji zamjenjuje crvenom prozirnom sjenom. Kada je isključeno, te ispune su potpuno prozirne i crtaju se samo njihovi obrisi.",
"prefs.dark_parts_shading":"Zadrži oblik tamnih dijelova",
"prefs.dark_parts_shading_help":"Sjenči prikaz u linearnom svjetlu s mekim dopunskim svjetlom neba, tako da tamna lica zadrže gradijent umjesto da pocrne",
"prefs.dead_zone_note":"Šrafirana traka je mrtva zona: kretanje unutar nje se zanemaruje.",
@@ -2200,6 +2238,8 @@
"prefs.interface_language":"Jezik interfejsa",
"prefs.interface_note":"Kako SolidCraft izgleda i gdje su njegovi dijelovi.",
"prefs.interval_minutes":"{n} min",
"prefs.invert_curved_roll_arrows":"Obrni zakrivljene strelice za valjanje",
"prefs.invert_curved_roll_arrows_note":"Dvije zakrivljene strelice u uglu kocke valjaju prikaz unutar ravni ekrana. Uključeno: strelica u smjeru kazaljke na satu valja prikaz suprotno od smjera kazaljke na satu, a strelica suprotno od smjera kazaljke na satu valja ga u smjeru kazaljke na satu. Isključeno: svaka strelica valja prikaz onako kako je zakrivljena.",
"prefs.invert_navigator_arrows":"Obrni strelice za rotaciju kocke prikaza",
"prefs.invert_navigator_arrows_note":"Strelice oko kocke orbitiraju kameru u smjeru u kojem pokazuju, kao u programima Fusion i Inventor: strelica s lijeve strane pokazuje udesno i zakreće kameru udesno. Isključeno: strelica okreće kocku prema strani na kojoj se nalazi, pa lijeva strelica zakreće kameru ulijevo. Postavka ne utiče na zakrivljene strelice za valjanje.",
"prefs.keep_work_on_tab_switch":"Zadrži dijaloge i alate otvorenima pri prebacivanju između dizajna",
@@ -2259,6 +2299,8 @@
"prefs.placement":"Postavljanje",
"prefs.prefer_free_sketch_points":"Daj prednost pokretnim tačkama skice kada se tačke preklapaju",
"prefs.preview_choices":"Pregled vaših izbora",
"prefs.preview_tint_new_faces":"Oboji novu površ u pregledu",
"prefs.preview_tint_new_faces_help":"Pregled operacije koja mijenja tijelo može nacrtati površ koju dodaje u boji pregleda. Kada je isključeno, tijelo se crta kakvo jest.",
"prefs.print_face_highlight":"Isticanje površine za štampu",
"prefs.print_face_highlight_tip":"Koliko se jako površina za štampu tijela boji i obrubljuje u prikazu. 0 % ne prikazuje isticanje.",
"prefs.profile_active":"Aktivni profil",
@@ -2556,6 +2598,10 @@
"render.base_color":"Osnovna boja · sRGB",
"render.base_metallic":"Metalni udio",
"render.base_opaque_only":"Ovaj uređivač čuva semantiku neprozirnih tijela. Za optičko propuštanje koristite izričite kontrole stakla.",
"render.batch_all_shots":"Svi kadrovi ({count})",
"render.batch_empty":"Sačuvajte kadar prije renderovanja svih kadrova.",
"render.batch_limit":"Renderovanje svih kadrova ograničeno je na 32 kadra.",
"render.batch_status":"U toku: {running} · Na čekanju: {waiting}",
"render.bloom_enable":"Sjaj prikaza",
"render.bloom_help":"Kreativni sjaj samo na izlazu iz pozitivnih linearnih svijetlih dijelova, raširen kroz tri normalizovana prolaza kutijastog filtera. Poluprečnik je u pikselima izlaza. Dodaje se u linearnoj svjetlosti prikaza prije sRGB-a; nije objektiv, volumetrijski efekat niti poboljšanje konvergencije. Sirovi EXR ostaje nepromijenjen.",
"render.bloom_opaque":"Sjaj zahtijeva neprozirni izlaz. Prozirni PNG se odbija, a ne spljoštava tiho.",
@@ -2666,6 +2712,13 @@
"render.choose_look":"Prvo izaberite izgled u Izgledima",
"ui.hide_origin_note":"Novi dizajni počinju sa skrivenim folderom Ishodište. Dizajn zadržava vlastitu postavku Ishodišta kada ga prikažete ili sakrijete.",
"Report a bug — review a screenshot and open a GitHub draft":"Fehler melden — Screenshot prüfen und einen GitHub-Entwurf öffnen",
"Report copied. Keep this text to submit on GitHub when you are online.":"Bericht kopiert. Bewahren Sie diesen Text auf, um ihn auf GitHub einzureichen, sobald Sie online sind.",
@@ -584,7 +585,7 @@
"Show ghost":"Geistermodell anzeigen",
"Show in folder":"Im Ordner anzeigen",
"Show the pointer an AI agent moves (#35)":"Den Zeiger anzeigen, den ein KI-Agent bewegt (#35)",
"Show tool at cursor":"Werkzeug am Cursor anzeigen",
"Show tool at cursor":"Werkzeug am Mauszeiger",
"Signed axes":"Vorzeichenbehaftete Achsen",
"Size":"Größe",
"Sketch constraints":"Skizzenbedingungen",
@@ -595,7 +596,7 @@
"Sketch points":"Skizzenpunkte",
"Slider":"Schubgelenk",
"Slot width":"Langlochbreite",
"Snap to face and edge centres":"An Flächen- und Kantenmittelpunkten einrasten",
"Snap to face and edge centres":"An Mittelpunkten einrasten",
"SolidCraft cannot submit reports directly. Submit on GitHub; no token is needed in the app.":"SolidCraft kann Berichte nicht direkt einreichen. Reichen Sie Ihren Bericht auf GitHub ein. In der App wird dafür kein Token benötigt.",
"SolidCraft closed before these designs were saved. Their last autosave can be opened.":"SolidCraft wurde beendet, bevor diese Designs gespeichert wurden. Ihr letzter Autosave kann geöffnet werden.",
"Sort A to Z":"Von A bis Z sortieren",
@@ -738,36 +739,36 @@
"a picked edge's body is gone":"der Körper einer gewählten Kante existiert nicht mehr",
"add a key for a joint first":"zuerst einen Schlüssel für ein Gelenk hinzufügen",
"ai.connected_toast":"SolidCraft ist jetzt in {clients} verfügbar. Starten Sie diese neu, um es zu nutzen (Einstellungen > Assistent).",
"ai.prefs.allow_control":"Verbindungen von KI-Agenten zulassen (Steuerkanal / MCP)",
"ai.prefs.allow_control_note":"Öffnet einen Steuerkanal nur auf diesem Computer (127.0.0.1, Port 27878 oder der nächste freie). Ein verbindendes Programm muss zusätzlich ein geheimes Token vorweisen, das nur Ihr Benutzerkonto lesen kann und bei jedem Start neu erzeugt wird. Wirkt ab dem nächsten Start von SolidCraft. Aus: Es wartet nichts auf Verbindungen, außer Sie starten SolidCraft mit --control.",
"ai.prefs.availability":"Assistenten-Steuerung",
"ai.prefs.background_commands":"Agentenbefehle im Hintergrund ausführen",
"ai.prefs.connect_apps":"SolidCraft für KI-Apps auf diesem Computer verfügbar machen",
"ai.prefs.connect_apps_note":"Trägt SolidCraft beim Start als MCP-Server in die auf diesem Computer gefundenen KI-Apps ein (OpenCode, Claude Desktop, Claude Code, Cursor, Codex, Gemini CLI, Copilot CLI, Windsurf, Zed, VS Code), damit ein Agent es ohne Einrichtung nutzen kann. Nur der Eintrag „solidcraft“ wird hinzugefügt oder sein Pfad aktualisiert; ein von Ihnen geänderter Eintrag bleibt unberührt, und die Datei wird vorher gesichert. Aus: Die hinzugefügten Einträge werden entfernt. Hilfe > KI-Assistenten verbinden… erledigt das von Hand.",
"ai.prefs.connect_at_start":"Zuletzt verwendeten Agenten beim Start von SolidCraft verbinden",
"ai.prefs.allow_control_note":"Ein lokaler Kanal (MCP). Nichts verlässt diesen Computer.\n\nÖffnet einen Steuerkanal nur auf diesem Computer (127.0.0.1, Port 27878 oder der nächste freie). Ein verbindendes Programm muss zusätzlich ein geheimes Token vorweisen, das nur Ihr Benutzerkonto lesen kann und bei jedem Start neu erzeugt wird. Wirkt ab dem nächsten Start von SolidCraft. Aus: Es wartet nichts auf Verbindungen, außer Sie starten SolidCraft mit --control.",
"ai.prefs.availability":"Verfügbarkeit",
"ai.prefs.background_commands":"Langsame Befehle im Hintergrund ausführen",
"ai.prefs.connect_apps":"SolidCraft zu KI-Apps hinzufügen",
"ai.prefs.connect_apps_note":"Aus entfernt die Einträge wieder.\n\nTrägt SolidCraft beim Start als MCP-Server in die auf diesem Computer gefundenen KI-Apps ein (OpenCode, Claude Desktop, Claude Code, Cursor, Codex, Gemini CLI, Copilot CLI, Windsurf, Zed, VS Code), damit ein Agent es ohne Einrichtung nutzen kann. Nur der Eintrag „solidcraft“ wird hinzugefügt oder sein Pfad aktualisiert; ein von Ihnen geänderter Eintrag bleibt unberührt, und die Datei wird vorher gesichert. Aus: Die hinzugefügten Einträge werden entfernt. Hilfe > KI-Assistenten verbinden… erledigt das von Hand.",
"ai.prefs.connect_at_start":"Letzten Agenten beim Start verbinden",
"ai.prefs.connect_at_start_note":"Verbindet beim Start von SolidCraft automatisch den zuletzt verwendeten Agenten (oder den Standardagenten) im Hintergrund, damit er für den Chat bereitsteht. Diese Funktion ist deaktiviert, wenn SolidCraft mit --control gestartet wird. Kann keine Verbindung hergestellt werden, zeigt der Assistent „Verbindung fehlgeschlagen“ und eine Schaltfläche zum erneuten Verbindungsversuch an.",
"ai.prefs.follow_camera":"Kamera zu Skizzen drehen",
"ai.prefs.follow_camera":"Der Kamera folgen",
"ai.prefs.follow_camera_off":"Die automatische Kameraführung ist aus.",
"ai.prefs.follow_camera_on":"Die Kamera dreht sich zu Skizzen, die der Agent erstellt.",
"ai.prefs.intro":"Agenten, Berechtigungen und wie ihre Arbeit angezeigt wird.",
"ai.prefs.open_at_start":"Assistentenbereich beim Start von SolidCraft öffnen",
"ai.prefs.open_at_start":"Chat beim Start öffnen",
"ai.prefs.open_at_start_note":"Öffnet beim Start von SolidCraft automatisch den Assistentenbereich oder dessen separates Fenster. Diese Funktion ist deaktiviert, wenn SolidCraft mit --control gestartet wird.",
"ai.prefs.override_all_warning":"Dieser Agent darf das Design ohne Rückfrage speichern, überschreiben, exportieren oder ersetzen.",
"ai.prefs.permission_all":"Alles erlauben",
"ai.prefs.permission_all_summary":"Verfügbare SolidCraft-Werkzeuge werden ohne Rückfrage ausgeführt.",
"ai.prefs.privacy_note":"Die Unterhaltung geht nur an den von Ihnen gewählten Agenten oder API-Endpunkt. API-Schlüssel werden im Schlüsselbund des Systems gespeichert.",
"ai.prefs.show_pointer":"Agentenzeiger anzeigen",
"ai.prefs.show_pointer":"Zeiger des Agenten anzeigen",
"ai.prefs.turn_limit_hint":"Höchstzahl designändernder Werkzeugaufrufe, die der Assistent für eine Nachricht ausführen darf.",
"angle, height":"Winkel, Höhe",
"appearance.dielectric_ior":"Brechungsindex des Dielektrikums",
"crash.unclean_explanation":"Beim späteren Start erkannt; der genaue Zeitpunkt des Beendens wurde nicht aufgezeichnet. Auch ein Herunterfahren des Systems oder ein erzwungener Stopp kann ein unsauberes Beenden verursachen.",
"delete.and_more":"… und {count} weitere",
"diagnostic.empty_boolean_component":"In Komponente '{component}' gibt es keinen Körper zum Abziehen oder für eine Schnittmenge; das Werkzeug überschneidet sich eventuell mit '{body}' in Komponente '{other}' – aktivieren Sie diese Komponente oder wählen Sie den Körper als Ziel",
"diagnostic.reselect_reference":"{feature}: Die Referenz `{reference}` existiert nicht mehr so, wie sie ausgewählt wurde; wählen Sie sie erneut aus",
"dialog.bodies_count":"{count} Körper",
"dialog.clearance_invalid":"der Abstand muss eine Länge von 0 oder mehr sein",
"dialog.compute":"Berechnen",
@@ -1365,6 +1390,9 @@
"dialog.custom_axis":"↖ Eigene Achse",
"dialog.dimension_insert_hint":"Doppelklicken Sie auf eine andere steuernde Bemaßung, um ihren Namen einzufügen",
"dialog.dimension_step_expression":"Nur eine Zahl lässt sich schrittweise ändern; ein Ausdruck bleibt, wie er eingegeben ist",
"dialog.dimension_step_up":"Um {step} erhöhen",
"dialog.edit_title":"{title} bearbeiten",
"dialog.no_shown_body":"Kein sichtbarer Körper zum Ändern vorhanden. Blenden Sie einen Körper ein oder wählen Sie „Neuer Körper“.",
"dialog.pattern_sketch_not_object":"Körper oder Funktionen wählen: Eine Skizze ist keines von beiden. Ihre Kurven mit Muster oder Spiegeln in der Skizze wiederholen oder sie zuerst extrudieren.",
@@ -1389,6 +1417,7 @@
"document.read_only_save":"Dieses Design wurde schreibgeschützt geöffnet: Speichern Sie es als neue Datei",
"document.save_changes":"Änderungen in {name} speichern?",
"document.unsaved_changes":"{name} enthält ungespeicherte Änderungen. Wenn Sie nicht speichern, gehen sie verloren.",
"drive.rigid":"{joint} ist ein starres Gelenk. Es hält die verbundenen Teile fest zusammen und ermöglicht daher keine Bewegung. Um die Teile beweglich zu machen, ändern Sie den Gelenktyp unter „Gelenk bearbeiten“: Drehgelenk für Drehbewegungen, Schubgelenk für lineare Bewegungen oder Zylindergelenk für beides.",
"drive.stopped_by_contact":"Angehalten bei {value}: {a} würde {b} durchdringen",
@@ -1409,6 +1438,9 @@
"each rail's curves must be in one sketch":"die Kurven jeder Führungskurve müssen in derselben Skizze liegen",
"feature computation ended without a result":"die Berechnung des Merkmals wurde ohne Ergebnis beendet",
"file.open.drawing_filter":"Designs, CAD-Dateien, Netze und Zeichnungen",
"file.open.portal_fallback.no_portal_service":"Die geöffnete Dateiauswahl ist nicht die des Desktops: Der Dateiauswahl-Dienst des Desktops ist nicht verfügbar.",
"file.open.portal_fallback.no_session_bus":"Die geöffnete Dateiauswahl ist nicht die des Desktops: Es gibt keinen D-Bus-Sitzungsbus.",
"file.open.portal_fallback.xwayland":"Die geöffnete Dateiauswahl ist nicht die des Desktops: Unter XWayland lehnt das Portal das Elternfenster ab.",
"file_load.built":"Bisher erstellt: {built} von {total} Merkmalen.",
"file_load.converting":"Volumenkörper {done} von {total} wird konvertiert",
"file_load.inserting":"Geometrie wird eingefügt",
@@ -1421,6 +1453,14 @@
"file_load.reading_percent":"Datei wird gelesen... {percent} %",
"file_load.rebuilding":"Merkmal {done} von {total} wird neu aufgebaut",
"file_load.recovering":"Design wird wiederhergestellt",
"file_load.step_build":"Modell wird aufgebaut",
"file_load.step_feature":"Merkmal {done} von {total}",
"file_load.step_part":"Teil {done} von {total}",
"file_load.step_percent":"{percent} %",
"file_load.step_read":"Datei wird gelesen",
"file_load.step_rebuild":"Merkmale werden neu aufgebaut",
"file_load.step_repair":"Teile werden geprüft und repariert",
"file_load.step_show":"Ansicht wird vorbereitet",
"file_load.stopping":"Warten, bis der vorherige Vorgang beendet ist...",
"file_load.updating_links":"Verknüpfungen werden aktualisiert",
"file_load.waiting":"Warten auf Dateivorgang",
@@ -1517,6 +1557,11 @@
"help.joint.reach":"Bewegt einen Punkt eines Teils auf ein Ziel zu, indem die Gelenke seiner Kette innerhalb ihrer Grenzen verstellt werden. Damit stellen Sie einen Mechanismus über die Lage seines Endes ein, etwa der Spitze eines Roboterarms.",
"help.joint.rigid_group":"Verbindet die gewählten Teile starr in ihrer jetzigen Lage, sodass sie sich als Einheit bewegen. Für Teile, die zusammengehören und sich gegeneinander nicht bewegen.",
"help.joint.screw":"Koppelt Drehen und Schieben über eine Steigung, sodass jede Umdrehung um diesen Weg vorrückt. Für Gewindespindeln, Schrauben und Trapezspindeln.",
"help.layout.apply":"Ein gespeichertes Layout auf den aktuellen Arbeitsbereich anwenden. Geöffnete Editoren behalten ihre Entwürfe.",
"help.layout.get":"Das übernommene Layout lesen und registrierte Arbeitsbereiche anzeigen.",
"help.layout.reset":"Das registrierte Standardlayout des aktuellen Arbeitsbereichs wiederherstellen. Eigene Vorlagen bleiben erhalten.",
"help.layout.save":"Das vollständige Layout unter einem Namen speichern. Eine vorhandene eigene Vorlage wird nur mit ausdrücklicher Erlaubnis überschrieben.",
"help.layout.workspace.select":"Einen registrierten Layout-Arbeitsbereich auswählen und das bisherige Layout merken.",
"help.library.apply":"Wendet ein Material oder eine Darstellung aus einer lokalen Bibliotheksdatei auf Körper, Flächen oder Komponenten an. Damit nutzen Sie Materialien aus einem anderen Design wieder.",
"help.library.export":"Speichert die Materialien und Darstellungen des Designs in einer Bibliotheksdatei. Damit teilen Sie sie oder nutzen sie in anderen Designs wieder.",
"help.library.inspect":"Prüft eine Bibliotheksdatei und listet ihre Materialien und Darstellungen auf, ohne das Design zu ändern. Damit sehen Sie vor dem Anwenden, was eine Bibliothek enthält.",
@@ -1530,6 +1575,21 @@
"help.notice":"NOTICE",
"help.occurrence.ground":"Setzt ein Teil an seiner Stelle fest oder gibt es wieder frei, sodass Gelenke die übrigen Teile um es herum bewegen. Für den Rahmen oder Sockel, auf dem der Rest der Baugruppe aufbaut.",
"help.occurrence.move":"Bewegt eine Baugruppeninstanz ausschließlich entlang der Freiheitsgrade, die ihre Gelenke zulassen. Wählen Sie eine Fläche des Bauteils aus und ziehen Sie anschließend einen der verfügbaren Pfeile oder Bögen.",
"help.panel.activate":"Eine geöffnete Panel-Registerkarte auswählen, ohne den Tastaturfokus anzufordern.",
"help.panel.close":"Ein Panel unter Beachtung seines Inhaltslebenszyklus schließen. Seine Platzierung wird gespeichert.",
"help.panel.collapse":"Einen Panel-Bereich ein- oder ausklappen und seine gewünschten Abmessungen beibehalten.",
"help.panel.dismiss":"Die vorübergehende Ansicht eines eingeklappten Panels schließen.",
"help.panel.float":"Ein Panel in einen frei positionierten Bereich verschieben.",
"help.panel.focus":"Ein Panel fokussieren, seinen gespeicherten Zustand bei Bedarf wieder öffnen und seinen Bereich ausklappen.",
"help.panel.list":"Registrierte Panel-Arten, übernommene Instanzen, aktive Registerkarten, Verfügbarkeit und Host-Funktionen lesen.",
"help.panel.move":"Ein Panel in einen neuen Bereich verschieben oder einer vorhandenen Registerkartengruppe hinzufügen.",
"help.panel.native_close":"Einen nativen Panel-Bereich an seine gespeicherte Position zurückbringen, ohne seinen Inhalt abzubrechen.",
"help.panel.open":"Eine Panel-Art mit einer ausdrücklichen Instanzkennung öffnen. Neue Instanzen benötigen eine Platzierung.",
"help.panel.peek":"Ein eingeklapptes Panel vorübergehend anzeigen, ohne seine gespeicherte Größe oder seinen Klappzustand zu ändern.",
"help.panel.popout":"Ein Panel bei Unterstützung in ein natives Fenster verschieben. Im Browser wird ein frei positionierter Bereich verwendet.",
"help.panel.reset_pair":"Das Standardgrößenverhältnis zweier benachbarter Andockbereiche innerhalb ihrer gemeinsamen Grenzen wiederherstellen.",
"help.panel.resize":"Die äußere Breite und Höhe eines Panel-Bereichs innerhalb der Grenzen aller Registerkarten festlegen.",
"help.panel.resize_pair":"Benachbarte Andockbereiche gemeinsam skalieren und ihre gemeinsame Ausdehnung beibehalten.",
"help.parameters.change":"Öffnet die Tabelle mit benannten Parametern und Ausdrücken, die die Abmessungen des Designs steuern. Ändern Sie einen Wert an einer zentralen Stelle, werden alle Features, die diesen Wert verwenden, entsprechend aktualisiert.",
"help.parameters.export":"Speichert die Parameter des Designs als CSV oder JSON. Damit bearbeiten Sie sie in einer Tabellenkalkulation oder übertragen sie in ein anderes Design.",
"help.parameters.graph":"Zeigt, welche Parameter und Elemente welche anderen nutzen, samt Schleifen oder Fehlern. Damit sehen Sie, was eine Parameteränderung beeinflusst.",
@@ -1802,6 +1862,27 @@
"home.start_hint":"Erstellen Sie einen Entwurf, öffnen Sie eine zuletzt verwendete Datei oder erkunden Sie ein Beispiel.",
"home.whats_new":"Neuigkeiten",
"home.yesterday":"Gestern",
"import_report.details":"Details:",
"import_report.file_one":"Die Datei hatte 1 weiteres Problem.",
"import_report.file_other":"Die Datei hatte {count} weitere Probleme.",
"import_report.hint":"Die Teile erneut aus dem Programm zu exportieren, mit dem sie erstellt wurden, kann das beheben. „Warnmeldung kopieren“ enthält die Details.",
"import_report.left_out_one":"1 Fläche konnte nicht repariert werden und fehlt.",
"import_report.left_out_other":"{count} Flächen konnten nicht repariert werden und fehlen.",
"import_report.needs_repair_one":"1 Teil muss repariert werden, bevor daran modelliert werden kann.",
"import_report.needs_repair_other":"{count} Teile müssen repariert werden, bevor daran modelliert werden kann.",
"import_report.not_imported_one":"1 Teil konnte nicht importiert werden.",
"import_report.not_imported_other":"{count} Teile konnten nicht importiert werden.",
"import_report.not_shown_one":"1 Fläche konnte nicht gezeichnet werden und ist ausgeblendet.",
"import_report.not_shown_other":"{count} Flächen konnten nicht gezeichnet werden und sind ausgeblendet.",
"import_report.open_one":"1 Teil hat Lücken zwischen seinen Flächen und kam als offener Körper herein.",
"import_report.open_other":"{count} Teile haben Lücken zwischen ihren Flächen und kamen als offene Körper herein.",
"import_report.refused_one":"1 Teil konnte nicht zu einem Volumenkörper werden und wurde nicht importiert.",
"import_report.refused_other":"{count} Teile konnten nicht zu Volumenkörpern werden und wurden nicht importiert.",
"import_report.repaired_one":"Kleine Fehler wurden an 1 Teil repariert.",
"import_report.repaired_other":"Kleine Fehler wurden an {count} Teilen repariert.",
"import_report.solids":"{solids} von {parts} Teilen als Volumenkörper importiert.",
"import_report.surfaces_one":"1 Teil konnte nicht zu einem Volumenkörper werden und kam als Flächen herein.",
"import_report.surfaces_other":"{count} Teile konnten nicht zu Volumenkörpern werden und kamen als Flächen herein.",
"install.button_tip":"SolidCraft als App installieren: eigenes Fenster, funktioniert auch offline",
"install.dock_1":"Wählen Sie Ablage › Zum Dock hinzufügen.",
"install.dock_2":"Klicken Sie auf „Hinzufügen“.",
@@ -1833,21 +1914,21 @@
"joint.rigid_group_select_components":"Wählen Sie zwei oder mehr Komponenten aus.",
"joint_move.blocked_hint":"Prüfen Sie den Gelenktyp (z. B. „Starr“), die Fixierung, die Gelenkgrenzen und die durch Parameter gesteuerten Werte.",
"joint_move.blocked_title":"Dieses Bauteil kann nicht bewegt werden",
"joint_move.coarse":"Drehschritt nahe der Achse (°)",
"joint_move.coarse":"Schritt nahe der Achse",
"joint_move.conflict":"Ein Gelenk dieses Bauteils steht im Konflikt mit den anderen: {joint}.",
"joint_move.conflict_hint":"Bearbeiten, unterdrücken oder löschen Sie das widersprüchliche Gelenk, damit die anderen Gelenke das Bauteil platzieren können.",
"joint_move.distance":"Abstand vom Ausgangspunkt",
"joint_move.done":"Fertig",
"joint_move.fine":"Drehschritt weit von der Achse entfernt (°)",
"joint_move.fine":"Schritt fern der Achse",
"joint_move.fixed":"Dieses Bauteil verfügt über keine bewegliche Gelenkachse.",
"joint_move.help":"Verschieben: Ziehen Sie einen Pfeil oder Ring. Mit Esc brechen Sie den aktuellen Ziehvorgang ab.",
"joint_move.legacy_hint":"Deaktivieren, um wieder den bisherigen Verschiebebereich zu verwenden.",
"joint_move.precision":"Ziehen Sie außerhalb der gestrichelten Führung, um die Drehung fein einzustellen.",
"joint_move.legacy_hint":"Aus: das bisherige Verschieben-Panel.",
"joint_move.precision":"Für den feinen Schritt außerhalb der gestrichelten Führung ziehen.",
"joint_move.rotation":"Drehwinkel vom Ausgangspunkt",
"joint_move.select":"Wählen Sie eine Fläche oder eine Baugruppenkomponente aus und anschließend „Verschieben“.",
"joint_move.settings":"Baugruppe verschieben",
"joint_move.step":"Schrittweite",
"joint_move.use_handles":"Gelenkgriffe zum Bewegen von Baugruppen verwenden",
"joint_move.use_handles":"Gelenkbewegungsgriffe für Verschieben verwenden",
"keymap.command_id":"Befehls-ID",
"keymap.empty":"Keine passenden Befehle",
"keymap.use_anyway":"{key} hier trotzdem verwenden",
"measure.quick_copy":"Klicken, um den Messwert zu kopieren",
"measure.quick_edges":"{count} Kanten",
@@ -1937,6 +2019,8 @@
"nav.blender.help":"Mittlere Maustaste dreht, Umschalt+Mitte verschiebt, Strg+Mitte zoomt; rechtes Ziehen lässt die Kamera unverändert",
"nav.creo.help":"Ziehen mit der mittleren Maustaste dreht, Umschalt+Mitte verschiebt, Strg+Mitte zoomt beim vertikalen Ziehen (nach unten zum Vergrößern); das Mausrad zoomt",
"nav.creo.label":"Creo",
"nav.drag_keeps_mode.help":"Ein Ziehen mit der mittleren oder rechten Taste dreht, verschiebt oder zoomt weiter wie begonnen, bis die Taste losgelassen wird, egal welche Tasten dabei gedrückt oder losgelassen werden. Aus: Die gehaltenen Tasten entscheiden in jedem Moment des Ziehens.",
"nav.drag_keeps_mode.label":"Ziehen behält die Navigation bei, mit der es begann",
"nav.free_orbit.help":"Maus und 3D-Maus drehen über beide Pole hinweg und behalten die Rollneigung bei. Das Einrasten mit Umschalt ist deaktiviert.",
"nav.free_orbit.label":"Freie Drehung",
"nav.free_orbit.snap_help":"Maus und 3D-Maus drehen über beide Pole hinweg und behalten die Rollausrichtung bei. Halten Sie beim Ziehen zum Drehen die Umschalttaste gedrückt, um Blickrichtung und Rollausrichtung einrasten zu lassen.",
"navbar.custom.available":"{available} · auf die Leiste ziehen oder auf Hinzufügen klicken",
"navbar.custom.buttons":"Schaltflächen",
"navbar.custom.compact":"Kompakt",
@@ -2001,6 +2091,7 @@
"navbar.custom.reset_default":"Auf Standard zurücksetzen",
"navbar.custom.right":"Nach rechts",
"navbar.custom.select":"Kein Feld ausgewählt. Wählen Sie ein Feld in der Leiste, um es zu verschieben, zu entfernen oder sein Aussehen zu ändern.",
"navbar.custom.separator_hint":"Eine Trennlinie zwischen Gruppen von Schaltflächen. Auf die Leiste ziehen oder auf Hinzufügen klicken; beliebig oft verwendbar.",
"navbar.custom.separators_full":"Die Leiste hat bereits vier Trennlinien.",
"prefs.auto_operation_note":"Die Feature-Dialoge wählen automatisch zwischen „Verbinden“, „Neuer Körper“ und „Ausschneiden“, abhängig davon, was das neue Material berührt. Sobald Sie selbst eine Operation auswählen, wird diese Einstellung nicht mehr angewendet. Deaktiviert: Die beim Öffnen des Dialogs voreingestellte Operation wird beibehalten.",
"prefs.auto_operation_note":"Vereinigung, Neuer Körper oder Schnitt, je nachdem, was das Material berührt.",
"prefs.axes":"Achsen",
"prefs.axis":"Achse",
"prefs.blur_cost":"Relativer Renderaufwand. Mehr Balken bedeuten meist mehr Arbeit.",
"prefs.blur_device":"Auf diesem Grafikgerät oder Renderpfad nicht verfügbar",
"prefs.blur_guard":"Die Unschärfequalität wurde für flüssigere Bilder verringert. Der Radius bleibt unverändert.",
"prefs.blur_off":"Aus",
"prefs.blur_reduce_transparency":"Durch die Systemeinstellung zur Transparenzreduzierung deaktiviert",
"prefs.blur_software":"Mit Softwaregrafik nicht verfügbar (gpu-software)",
"prefs.blur_source":"In dieser Arbeitsbereichsansicht nicht verfügbar",
"prefs.blur_web":"Auf diesem Web-Renderpfad nicht verfügbar",
"prefs.bodies_folders":"Körperordner",
"prefs.bodies_folders_always":"Immer",
"prefs.bodies_folders_never":"Nie",
"prefs.bodies_folders_several":"Nur bei mehreren Körpern",
"prefs.bodies_folders_several":"Mehrere",
"prefs.bottom":"Unten",
"prefs.bottom_centre":"Unten mittig",
"prefs.bottom_right":"Unten rechts",
@@ -2197,14 +2304,32 @@
"prefs.dark_parts_shading_help":"Die Ansicht in linearem Licht mit sanftem Himmelslicht schattieren, damit dunkle Flächen einen Verlauf behalten statt schwarz zu werden",
"prefs.dead_zone_note":"Der schraffierte Bereich kennzeichnet die Totzone. Bewegungen innerhalb dieses Bereichs werden ignoriert.",
"prefs.default":"Standard",
"prefs.design":"Design-Vorgaben",
"prefs.design_note":"Legt fest, mit welchen Einstellungen neue Designs beginnen. Bereits geöffnete Designs behalten ihre eigenen Einstellungen.",
"prefs.design":"Konstruktion",
"prefs.design_note":"Womit neue Konstruktionen beginnen.",
"prefs.design_tools.ask":"Fragen",
"prefs.design_tools.degrees":"Grad",
"prefs.design_tools.double_click_help":"Oder zum Bearbeiten einer verknüpften Komponente an Ort und Stelle.",
"prefs.design_tools.ghost":"Alte Position verschobener Teile als Geisterbild zeigen",
"prefs.design_tools.hole_moves_help":"Erneutes Auswählen der Fläche verschiebt die Bohrung, statt sie zu entfernen.",
"prefs.design_tools.hole_snaps_help":"Die Mitte einer Fläche und die Mittelpunkte ihrer kreisförmigen Kanten.",
"prefs.dialogs_left_column":"In der linken Spalte",
"prefs.dialogs_note":"Wo Befehlsdialoge öffnen: am Rand der Ansicht angedockt oder in der linken Spalte anstelle von Browser und Verlauf, die beim Schließen des Dialogs wie zuvor zurückkehren.",
"prefs.dimension_step_angle":"Was die Pfeile des Fensters, Auf/Ab und das Mausrad zu einem Winkel addieren",
"prefs.dimension_step_length":"Was die Pfeile des Fensters, Auf/Ab und das Mausrad zu einer Länge addieren",
"prefs.dimension_steps":"Schritte im Fenster",
"prefs.dimension_values":"Bemaßungswerte",
"prefs.dimension_values_note":"Wo der Wert einer Bemaßung eingegeben wird. Ein Fenster hat Pfeile, die ihn schrittweise ändern; das Bemaßungswerkzeug platziert zuerst den Text.",
"prefs.dimension_values_view":"In der Ansicht",
"prefs.dimension_values_window":"In einem Fenster",
"prefs.display":"Anzeige",
"prefs.edges":"Kanten und Schattierung",
"prefs.extend":"Erweitern",
@@ -2240,6 +2365,23 @@
"prefs.graphics_card_restart":"Diese Einstellung wird nach einem Neustart von SolidCraft wirksam. Die Umgebungsvariable WGPU_ADAPTER_NAME hat Vorrang vor dieser Auswahl.",
"prefs.graphics_card_unused":"Die gespeicherte Grafikkarte wurde für dieses Fenster nicht verwendet; die tatsächlich genutzte Karte steht unter Hilfe › Info und in der Statuszeile. Versuchen Sie Automatisch, oder setzen Sie WGPU_ADAPTER_NAME auf einen eindeutigen Teil des Kartennamens.",
"prefs.graphics_note":"Wägen Sie Leistung und Darstellungsqualität gegeneinander ab. Jede Option veranschaulicht ihre Wirkung anhand eines Beispiels.",
"prefs.graphics_page.supersampling_adaptive":"Nur solange die Ansicht stillsteht",
"prefs.graphics_page.surfaces_edges":"Flächen und Kanten",
"prefs.graphics_page.view_bar":"Auch in der Ansichtsleiste",
"prefs.graphics_presets_note":"Mit den Profilen werden die unten aufgeführten Optionen gemeinsam eingestellt.",
"prefs.hide_constraint_glyphs_zoomed_out":"Bindungssymbole bei starkem Herauszoomen ausblenden",
"prefs.hide_constraint_glyphs_zoomed_out_note":"Bindungssymbole verschwinden, wenn die Skizze so weit herausgezoomt ist, dass sie sie überladen würden. Aus: sie behalten bei jedem Zoom eine feste Bildschirmgröße.",
@@ -2248,7 +2390,7 @@
"prefs.history_origin_bodies_note":"Der Verlauf links oder unter dem Browser beginnt mit dem Körper-Ordner der aktiven Komponente und dem Ursprung, mit Augen und Menüs wie im Browser. Der Verlauf unten bleibt unverändert.",
"prefs.history_play_button":"Schaltfläche „Verlauf abspielen“ in den Verlaufssteuerelementen",
"prefs.history_play_button_note":"Fügt „Verlauf abspielen“ zwischen „Einen Schritt zurück“ und „Einen Schritt vor“ in die Verlaufssteuerelemente ein. Mit einem Rechtsklick auf die Steuerelemente lässt sich die Schaltfläche auch ein- oder ausblenden.",
"prefs.history_sketches_note":"Wenn „Skizzen“ auf „Unter dem zugehörigen Feature“ eingestellt ist, wird jede Skizze im linken Verlauf eine Ebene unter dem ersten daraus erstellten Feature angezeigt, sofern der Bereich breit genug für die Namen ist. Die Timeline unten zeigt weiterhin die Reihenfolge, in der die Elemente erstellt wurden.",
"prefs.history_sketches_under_feature":"Unter dem zugehörigen Feature",
@@ -2271,6 +2413,22 @@
"prefs.language_system":"System",
"prefs.layout":"Layout",
"prefs.layout_note":"Im Layout „Kompakt“ werden Bereiche an den Fensterrändern angedockt. Transparenz für den Browser ist nur im Layout „Schwebend“ verfügbar. Die Position des Assistenten ändern Sie auf der Seite „Assistent“.",
"prefs.layout_page.slot_count":"{count} von {max} Plätzen",
"prefs.layout_page.view_corner":"Auch in der Ansichtsecke",
"prefs.layout_page.window":"Fenster",
"prefs.left":"Links",
"prefs.left_click":"Linksklick",
"prefs.line_drag_draws_one":"Drücken und Ziehen zeichnet eine Linie",
@@ -2299,6 +2457,13 @@
"prefs.mouse_heading":"Maus",
"prefs.mouse_mapping":"Mausbelegung",
"prefs.navigation":"Navigation",
"prefs.navigation.axes_signed":"Achsen",
"prefs.navigation.cube_compact":"Würfel",
"prefs.navigation.device":"Gerät",
"prefs.navigation.free":"Frei",
"prefs.navigation.orbit_style":"Drehstil",
"prefs.navigation.radial_help":"Die rechte Taste halten oder kurz bewegen, um einen Werkzeugring zu öffnen.",
"prefs.navigation.turntable":"Drehteller",
"prefs.navigation_note":"Legt fest, wie Maus, Trackpad und 3D-Maus die Ansicht steuern.",
"prefs.navigator_fit":"Modell nach einem Ansichtswechsel am Navigator einpassen",
"prefs.navigator_fit_note":"Eine Fläche, Ecke oder ein Pfeil des Würfels oder eine Achse des Gizmos blickt auch auf die Mitte des Modells, aus dem einen Abstand, der es von jeder Seite einpasst (seine Hüllkugel). Home nutzt denselben Zoom und dieselbe Mitte, solange dies an ist, sodass danach gewählte Ansichten sich nur drehen. Aus: Die Ansicht dreht sich an Ort und Stelle und behält Ziel und Zoom.",
@@ -2315,11 +2480,15 @@
"prefs.origin_plane_names_note":"Namen in Browser, Dialogen und Listen. {top} ist XY, {front} ist XZ und {right} ist YZ, mit Z nach oben. Befehle, Skripte und gespeicherte Konstruktionen behalten XY, XZ und YZ.",
"prefs.overall_speed":"Gesamtgeschwindigkeit",
"prefs.parameter_list_rows":"Zeilen der Parameterliste",
"prefs.parameter_list_rows_tip":"Der Pfeil nach unten in einem leeren Wertefeld listet die Parameter auf, Favoriten zuerst, bis zu dieser Anzahl. Weniger hält die Liste in einem großen Design übersichtlich.",
"prefs.parameter_list_rows_tip":"Maximale Anzahl der Parameter, die Pfeil abwärts in einem leeren Ausdrucksfeld auflistet.",
"prefs.persistent_ribbon_pressed_help":"Hebt Befehle im Menüband hervor, solange ihre Effekte eingeschaltet sind. Deaktivieren Sie diese Option, um die bisherige neutrale Darstellung und Befehlshilfe beizubehalten.",
"prefs.profile_operations_note":"Zeichnet auf, wie lange SMLib-Aufrufe, Kernel-Vorgänge, Features, Befehle und Importe dauern. Agenten lesen es mit diagnostics.profile.",
"prefs.select_hidden_edges":"Verdeckte Kanten in der schattierten Ansicht mit verdeckten Kanten auswählen",
"prefs.select_hidden_edges_help":"Kanten durch Flächen auswählen, wenn die schattierte Ansicht mit verdeckten Kanten aktiv ist, auch zum Verrunden. Aus behält das Auswahlverhalten von v0.30.1 bei. Ausgeblendete Körper bleiben ausgeschlossen.",
"prefs.select_one_item":"Ein Element auswählen",
"prefs.select_other_hidden":"Verborgene Geometrie mit „Andere auswählen“ auswählen",
"prefs.select_other_hidden_help":"Ein: Verborgene Körper, Skizzen und verdeckte Kanten nahe dem Zeiger einbeziehen. Aus: Die ursprüngliche Liste sichtbarer Geometrie direkt unter dem Zeiger verwenden.",
@@ -2372,8 +2545,45 @@
"prefs.shift_add_ctrl_toggle":"Umschalt fügt nur hinzu; Strg / Cmd schaltet die Auswahl um",
"prefs.shift_add_note":"Aktiviert: Umschalt fügt Elemente zur Auswahl hinzu, Strg / Cmd schaltet ihre Auswahl um. Deaktiviert (Standard): Beide Tasten schalten die Auswahl um.",
"prefs.shortcuts":"Tastenkürzel",
"prefs.shortcuts_import":"Importieren",
"prefs.shortcuts_intro":"Tasten für jeden Befehl.",
"prefs.single_surface_analysis":"Nur eine Flächenanalyse verwenden",
"prefs.single_surface_analysis_help":"Wenn deaktiviert, können Flächenschattierung und Stetigkeitsanalyse gleichzeitig aktiv bleiben. Beim Aktivieren bleibt die zuletzt gestartete oder geänderte Analyse erhalten.",
"prefs.sketch.align_points":"An anderen Skizzenpunkten ausrichten",
"prefs.sketch.align_points_note":"Beim Zeichnen richten sich Linien gleichzeitig an Punkten auf beiden Achsen aus.",
"prefs.sketch.center_arc":"Mittelpunktbogen folgt dem Zeiger",
"prefs.sketch.click_selects":"Klick wählt",
"prefs.sketch.conflict_colour":"Konfliktfarbe",
"prefs.sketch.drawing":"Zeichnen",
"prefs.sketch.ellipse_axes":"Ellipsen mit ihren Achsen zeichnen",
"prefs.sketch.ellipse_axes_note":"Haupt- und Nebenachse als Konstruktionslinien, damit Halbachsen und Achsen bemaßt werden können. Aus: nur die Ellipse, und D darauf ergibt ihren Nebenradius, wohin der Wert auch gezogen wird, gezeichnet und mit R beschriftet wie bisher.",
"prefs.sketch.shortcut_cycles_modes":"Erneuter Kurzbefehl wechselt den Modus",
"prefs.sketch.shortcut_cycles_modes_tip":"Aus: Das Werkzeug startet erneut.",
"prefs.sketch.snapping_guides":"Fangen und Hilfslinien",
"prefs.sketch.state_icons":"Statussymbole",
"prefs.sketch.tracking_guides":"Hilfslinien für Mittelpunkte und Kantenmitten",
"prefs.sketch.tracking_guides_note":"Temporäre waagerechte und senkrechte Hilfslinien von überfahrenen Mittelpunkten und Kantenmitten.",
"prefs.sketch.tracking_points":"Hilfslinien auch von Skizzenpunkten",
"prefs.sketch.unless_turned_note":"zurück, wenn nicht gedreht",
"prefs.sketch.whole_bodies":"Ganze Körper",
"prefs.sketch_align_points":"Beim Zeichnen an anderen Skizzenpunkten ausrichten",
"prefs.sketch_align_points_note":"Beim Zeichnen richtet sich ein Punkt zugleich waagerecht an einem Skizzenpunkt und senkrecht an einem anderen aus, mit einer gepunkteten Hilfslinie; der Klick behält beide Ausrichtungen. Aus: nur am vorherigen Punkt, jeweils eine Achse.",
"prefs.sketch_conflict_colour":"Widersprüchliche Geometrie in der Konfliktfarbe",
@@ -2406,11 +2616,11 @@
"prefs.source":"Quelle",
"prefs.speed":"Geschwindigkeit",
"prefs.stand_up_note":"Wenn eine STEP- oder IGES-Datei mit der Z-Achse nach oben geöffnet wird, wird eine Vierteldrehung um die X-Achse angeboten.",
"prefs.stand_up_unknown":"Für Dateien aus unbekannten Programmen",
"prefs.stand_up_unknown":"Dateien aus unbekannten Programmen",
"prefs.stand_up_unknown.ask":"In einem Dialog fragen",
"prefs.stand_up_unknown_note":"Wie das Aufrichten angeboten wird, wenn der Dateikopf kein Programm nennt, das bekanntlich mit Y nach oben speichert. Ein Hinweis erscheint nur, wenn die Datei auf dem Rücken zu liegen scheint; „In einem Dialog fragen“ fragt wie bisher bei jeder solchen Datei.",
"prefs.stand_up_unknown_note":"Wie der Vorschlag erscheint, wenn die Datei kein bekanntes Programm nennt.",
"prefs.status_bar":"Statusleiste",
"prefs.status_bar_note":"Eine schmale Leiste am unteren Fensterrand zeigt, was gerade bearbeitet wird, den Zustand der offenen Skizze in seiner Farbe und die Einheiten der Konstruktion; ein Klick auf die Einheiten ändert sie. Der Zustand der Skizze steht dann nicht mehr in der Ecke der Ansicht.",
"prefs.status_done":"Fertig",
@@ -2446,6 +2656,10 @@
"prefs.theme_follow_off":"Aus",
"prefs.theme_follow_stop":"Nicht mehr folgen",
"prefs.theme_import_hint":"Klicken, um eine Designdatei zu wählen, eine hierher ziehen oder mit kopiertem Design Strg+V (Cmd+V auf dem Mac) drücken",
"prefs.theme_notice_dismiss":"Ausblenden",
"prefs.theme_option_blur":"Unschärfe hinter Panels",
"prefs.theme_option_blur_help":"Unschärfe hinter durchscheinenden Panels in physischen Pixeln. Null bedeutet aus.",
"prefs.theme_option_invalid":"Der gespeicherte Wert für {option} ist ungültig; der Designstandard wird verwendet. Der gespeicherte Wert bleibt erhalten.",
"prefs.theme_option_opacity":"Deckkraft",
"prefs.theme_option_opacity_help":"Deckkraft schwebender Bedienfelder anpassen. Eine Mindestdeckkraft schützt die Lesbarkeit über den Ansichtsfarben.",
"prefs.theme_option_tab_colours":"Tabfarben",
@@ -2454,6 +2668,7 @@
"prefs.theme_option_tab_fade_ms_help":"Panel- und Ansichtsfarben beim Tabwechsel überblenden. Null wechselt sofort.",
"prefs.theme_options_badge":"Optionen",
"prefs.theme_options_more":"Mehr · {count}",
"prefs.theme_options_newer":"Dieses Design benötigt eine neuere Version von SolidCraft. Nach dem Upgrade das Originaldesign erneut importieren, um seine Optionsdefinitionen wiederherzustellen.",
"prefs.theme_options_reset":"Zurücksetzen",
"prefs.theme_options_unavailable":"Auf diesem Gerät nicht verfügbar",
"prefs.theme_paste":"Design einfügen",
@@ -2477,8 +2692,14 @@
"prefs.under_cursor":"Unter dem Cursor",
"prefs.units_precision":"Einheiten und Genauigkeit",
"prefs.updates":"Updates",
"prefs.value_boxes_in_view":"Werte in der Ansicht neben ihren Griffen zeigen",
"prefs.value_boxes_in_view_tip":"Der Wert eines Befehls (Abstand, Radius …) in einem Feld neben seinem Griff, über dem Modell. Aus: Sie geben ihn im Befehlsfenster ein, das nach einer Auswahl die Tastatur erhält, und nichts verdeckt das Modell.",
"prefs.validation":"Körperprüfung",
"prefs.validation.each_feature":"Einmal je Feature",
"prefs.validation_note":"Nach jedem Schritt: prüft jeden Sweep, jede Boolesche Operation und jede Rundung.\nEinmal je Feature: prüft das Ergebnis jedes Features einmal.\nAus (experimentell): keine Prüfung.",
"prefs.value_boxes_in_view":"Werte neben ihren Griffen anzeigen",
"prefs.value_boxes_in_view_tip":"Abstand beim Extrudieren, Radius beim Verrunden … als Feld in der Ansicht.",
"prefs.view":"Ansichtsverhalten",
"prefs.view_confirm_corner":"OK und Abbrechen in der Ansichtsecke",
"prefs.view_confirm_corner_note":"Solange ein Dialog oder eine Skizze geöffnet ist, übernehmen ein Häkchen und ein Kreuz oben rechts in der Ansicht dieselben Funktionen wie „OK“ und „Abbrechen“ des Dialogs. Eine Skizze wird damit beendet oder verworfen. Der Ansichtsnavigator rückt darunter.",
@@ -2511,6 +2732,17 @@
"recovery.just_now":"gerade eben",
"recovery.min_ago":"vor {count} Min.",
"recovery.never_saved":"nie gespeichert",
"refused.change":"{body} konnte nicht geändert werden.",
"refused.cut":"{body} konnte nicht geschnitten werden.",
"refused.face_curved":"Eine seiner gekrümmten Flächen kann nicht zum Modellieren verwendet werden.",
"refused.face_flat":"Eine seiner ebenen Flächen kann nicht zum Modellieren verwendet werden.",
"refused.face_freeform":"Eine seiner Freiformflächen kann nicht zum Modellieren verwendet werden.",
"refused.face_rounded":"Eine seiner gerundeten Flächen kann nicht zum Modellieren verwendet werden.",
"refused.faces_apart":"Seine Flächen treffen nicht genau genug aufeinander, um damit zu modellieren.",
"refused.intersect":"Schnittmenge mit {body} nicht möglich.",
"refused.join":"Konnte nicht mit {body} vereinigt werden.",
"select two components":"zwei Komponenten auswählen",
"set by the sketch's lines":"durch die Skizzenlinien festgelegt",
"settings.display_quality_note":"Feinere Stufen zeigen gekrümmte Flächen und Kanten glatter und brauchen länger zum Vernetzen. Nur die Ansicht ändert sich, nie das Design oder Exporte.",
"settings.double_click_components":"Doppelklick auf eine Komponente aktiviert sie oder bearbeitet eine verknüpfte an Ort und Stelle",
"settings.double_click_components":"Komponente zum Aktivieren doppelklicken",
"settings.frame_rate_details_note":"Fügt ein Diagramm der Bildzeiten der letzten Bilder hinzu, darüber die gezeichneten Dreiecke, dazu ein Histogramm der Bildzeiten und was die GPU gezeichnet hat. Ein Klick auf die Bildrate in der Ansicht blendet sie ein oder aus.",
"settings.frame_rate_note":"Zeigt die Bilder pro Sekunde unten rechts in der Ansicht.",
"settings.insert_lists_open_designs":"Konstruktion einfügen zeigt zuerst die in anderen Tabs geöffneten Konstruktionen",
"settings.measure_axis_distances":"Achsabstände beim Messen",
"settings.measure_axis_distances_help":"Bei geöffneter Messung die Abstände entlang der Weltachsen zusätzlich zum Gesamtabstand anzeigen.",
"settings.msaa_applies_on_restart":"Die Kantenglättung wird beim nächsten Start von SolidCraft übernommen",
"settings.msaa_reset":"{setting}: {requested}× wird von diesem Grafikgerät nicht unterstützt; jetzt {reset}× (unterstützt: {supported}).",
@@ -3882,7 +4114,7 @@
"settings.reset_intro":"Diese Einstellungen funktionieren auf diesem Computer nicht und würden den Start von SolidCraft verhindern. Sie wurden daher geändert:",
"settings.reset_title":"Einstellungen wurden geändert",
"settings.supersampling_note":"Zeichnet die Ansicht in höherer Auflösung und rechnet sie herunter: glattere Kanten, Linien und Raster auf Bildschirmen unter 4K. Kostet GPU-Zeit: etwa 2,25-mal so viele Pixel bei 1,5× und 4-mal bei 2×.",
"settings.update_changed_links":"Geänderte verknüpfte Designs aktualisieren, wenn ein Tab wieder angezeigt wird",
"settings.update_changed_links":"Geänderte Verknüpfungen bei Rückkehr zum Tab aktualisieren",
"settings.window_system_details":"Details",
"settings.window_system_note_now":"Wird nach einem Neustart wirksam. Aktuell: {now}.",
"settings.window_system_wayland_limited":"Einige Funktionen sind unter nativem Wayland eingeschränkt.",
@@ -3978,11 +4210,19 @@
"the section's profiles must be in one sketch":"die Profile des Querschnitts müssen in einer Skizze liegen",
"the two origins are on the same component":"die beiden Ursprünge liegen auf derselben Komponente",
"thread.automatic_size":"Automatische Größe",
"thread.chamfer_depth_needed":"für diese Form erforderlich",
"thread.designation":"Bezeichnung",
"thread.direction":"Gewinderichtung",
"thread.drill_range":"Der Bohrer des Gewindebohrerherstellers ist {drill} mm. Der genormte Kerndurchmesser des Innengewindes ist {minor} mm. Ein Bohrer von {low} bis {high} mm wird angenommen.",
"thread.drill_range_custom":"Der Bohrer ist der Nenndurchmesser minus Steigung, {drill} mm. Der genormte Kerndurchmesser des Innengewindes ist {minor} mm. Ein Bohrer von {low} bis {high} mm wird angenommen.",
"thread.drill_range_taper":"Der Bohrer des Gewindebohrerherstellers ist {drill} mm. Der genormte Kerndurchmesser am Gewindeende ist {minor} mm. Ein Bohrer von {low} bis {high} mm wird angenommen.",
"thread.end_square":"Rechtwinklig",
"thread.fade_short":"1,25 P (ISO 3508)",
"thread.fade_standard":"2,5 P (ISO 3508)",
"thread.form_bspp":"Rohrgewinde G (ISO 228-1)",
"thread.form_bspt":"Kegeliges Rohrgewinde R, Rc (ISO 7-1)",
"thread.form_rp":"Zylindrisches Innenrohrgewinde Rp (ISO 7-1)",
"thread.iso_metric":"ISO metrisch",
"thread.left_hand":"Linksgewinde",
"thread.right_hand":"Rechtsgewinde",
"thread.select_size":"Größe wählen",
"timeline.delete_after_marker_one":"1 Merkmal nach der Verlaufsmarkierung löschen",
"timeline.delete_after_marker_other":"{count} Merkmale nach der Verlaufsmarkierung löschen",
@@ -4234,6 +4474,7 @@
"ui.agent_chat_no_images":"Dieser Agent nimmt keine Bilder an",
"ui.agent_chat_no_picture":"In der Zwischenablage befindet sich kein Bild",
"ui.agent_chat_no_tool_call":"Das Modell hat die Werkzeuge von SolidCraft nicht verwendet, daher wurde das Design nicht geändert. Wählen Sie ein Modell, das Werkzeugaufrufe unterstützt; siehe „Lokale Modelle“ im Leitfaden zum Agenten-Chat.",
"ui.agent_chat_node_too_old":"Node.js {version} ist für diesen Agenten zu alt. Installieren Sie Node.js 20.10 oder neuer und klicken Sie dann auf Aktualisieren.",
"ui.agent_chat_none_found":"Kein Coding-Agent gefunden. Installieren Sie einen davon und klicken Sie dann auf Aktualisieren:",
"ui.agent_chat_send_now_tip":"Den aktuellen Schritt des Agenten stoppen und dies als Nächstes senden (Strg+Eingabe)",
"ui.agent_chat_setup_body":"SolidCraft kommuniziert mit einem auf diesem Computer installierten Programmieragenten. Wählen Sie einen unter Einstellungen › KI aus.",
"ui.agent_off_thread":"Fenster bedienbar halten, während Agenten Befehle ausführen",
"ui.agent_off_thread_note":"Langsame Befehle eines Agenten (aus dem Assistentenbereich oder von einem MCP-Client) werden neben dem Fenster berechnet: Sie können die Ansicht weiter drehen und prüfen und einen Befehl über den Chip in der Ansicht stoppen. Aus: Jeder läuft im Thread des Fensters, und das Fenster wartet darauf.",
@@ -4339,14 +4580,14 @@
"ui.ai_key_note":"Im Schlüsselbund des Systems gespeichert, nie in den Einstellungen von SolidCraft. Für einen lokalen Server leer lassen.",
"ui.ai_keychain_error":"Der Schlüsselbund des Systems hat abgelehnt: {error}",
"ui.ai_kind":"Art",
"ui.ai_mode_all":"Alles erlauben",
"ui.ai_mode_all":"Alles ausführen",
"ui.ai_mode_all_note":"Nichts fragt vorher. Absturzberichte bleiben tabu, und die Ordnergrenzen gelten weiter.",
"ui.ai_mode_all_warning":"Der Agent kann Ihr Design ohne Nachfrage speichern, überschreiben, exportieren und ersetzen. Nutzen Sie das nur mit einem Agenten, dem Sie vertrauen, und mit gespeicherten Designs.",
"ui.ai_mode_ask":"Jedes Mal fragen",
"ui.ai_mode_ask":"Zuerst fragen",
"ui.ai_mode_ask_note":"Jede Änderung am Design und jede Dateiaktion wartet auf Ihr Erlauben.",
"ui.ai_mode_edits_note":"Modellierbefehle laufen ohne Nachfrage; Speichern, Öffnen, Exportieren und andere Datei- oder destruktive Aktionen fragen weiterhin.",
"ui.ai_mode_global":"Wie oben eingestellt",
"ui.ai_mode_global":"Wie oben",
"ui.ai_model":"Modell",
"ui.ai_model_hint":"qwen3:14b",
"ui.ai_modes_scope":"Diese Einstellungen gelten für die Werkzeuge von SolidCraft. Die eigenen Werkzeuge eines Agenten (seine Shell, seine Dateiänderungen) folgen seinem eigenen Modus, den Sie im Kopf des Chat-Panels wählen, wenn der Agent Modi hat.",
@@ -4372,7 +4613,7 @@
"ui.ai_save":"Speichern",
"ui.ai_settings":"KI-Einstellungen…",
"ui.ai_show_features":"KI-Funktionen anzeigen",
"ui.ai_show_features_note":"Der Agenten-Chat: ein Panel, in dem ein Coding-Agent, den Sie schon nutzen, oder ein Modell-Endpunkt Ihrer Wahl am geöffneten Design arbeitet. Aus: keine KI-Schaltfläche, kein Kürzel, kein Menüeintrag, kein Panel, und nichts wird gesucht oder gestartet.",
"ui.ai_show_features_note":"Aus blendet den Assistenten überall aus und startet nichts. Alles darunter wird gedimmt.\n\nDer Agenten-Chat: ein Panel, in dem ein Coding-Agent, den Sie schon nutzen, oder ein Modell-Endpunkt Ihrer Wahl am geöffneten Design arbeitet. Aus: keine KI-Schaltfläche, kein Kürzel, kein Menüeintrag, kein Panel, und nichts wird gesucht oder gestartet.",
"ui.ai_switch_tip":"Den Agenten für dieses Gespräch wechseln",
"ui.ai_test":"Testen",
"ui.ai_test_acp_ok":"Antwortet: {agent}",
@@ -4406,7 +4647,7 @@
"ui.ai_tool_sum_then":"{first}, dann {next}",
"ui.ai_tool_unfold":"Klicken, um das Ergebnis zu zeigen",
"ui.ai_tool_waiting":"wartet",
"ui.ai_toolbar_button":"Schaltfläche in der Werkzeugleiste anzeigen",
"ui.ai_toolbar_button":"Assistent-Schaltfläche in der Anwendungsleiste",
"ui.ai_toolbar_button_note":"Die KI-Schaltfläche am rechten Ende der Werkzeugleiste. Strg+Umschalt+A und das Ansicht-Menü öffnen das Panel weiterhin.",
"ui.ai_undo_tip":"Alles, was der Agent für diese Nachricht geändert hat, in einem Schritt rückgängig machen",
"ui.ai_url_hint":"https://example.com/v1",
@@ -4483,6 +4724,10 @@
"ui.colour_vision_sample":"Beispiel",
"ui.colour_vision_tritan":"Tritan",
"ui.colour_vision_tritan_tip":"Bei schwachem oder fehlendem Blausinn",
"ui.comb_length":"Kammlänge",
"ui.comb_length_tip":"Wie lang die Zähne sind: ein Vielfaches der automatischen Länge, bei der der längste Zahn ein Fünftel der Größe der gezeigten Kurven ist.",
"ui.comb_teeth":"Zähne",
"ui.comb_teeth_tip":"Wie viele Zähne jeder Kamm hat, gleichmäßig entlang der Kurve verteilt. Mehr Zähne zeigen genauer, wie sich die Krümmung ändert.",
"ui.combine":"Kombinieren",
"ui.coming_later":"bald verfügbar",
"ui.command_done":"{command} fertig",
@@ -4507,11 +4752,24 @@
"ui.construction.ribbon_label":"Hilfslinien",
"ui.construction.side_hint":"Konstruktionslinie: die Seite anklicken, zu der die Linie läuft; Rechtsklick beginnt neu",
"ui.continuity_smooth_curvature_change_tip":"Glatte Krümmungsänderung (G4): Selbst die Art, wie sich die Krümmung ändert, läuft an der Naht glatt weiter.",
"ui.continuity_tangent":"Tangential",
"ui.continuity_tangent_tip":"Tangential (G1): kein Knick, aber die Krümmung springt an der Naht.",
"ui.copy":"Kopieren",
"ui.copy_details":"Details kopieren",
"ui.copy_details_tip":"Die vollständige Meldung kopieren, um sie nachzuschlagen oder zu melden.",
"ui.delete_select_first":"Wählen Sie zuerst aus, was gelöscht werden soll: Features, Körper, Komponenten oder Skizzengeometrie",
"ui.dependents_select_first":"Wählen Sie zuerst aus, wessen Abhängige aufgelistet werden sollen",
"ui.depth":"Tiefe",
"ui.design":"Design",
"ui.design_properties.author":"Autor",
@@ -4629,6 +4888,7 @@
"ui.edit_sketch_empty":"Keine Skizzen zum Bearbeiten",
"ui.ellipse":"Ellipse",
"ui.emboss_wrap_note":"Senkrechte Linienprofile, die einen unterstützten Zylinder berühren, werden automatisch aufgewickelt. Eine Wand auswählen, um ein Ziel festzulegen.",
"ui.end":"Ende",
"ui.end_radius":"Endradius",
"ui.end_scale":"Endskalierung",
"ui.entities":"Elemente",
@@ -4656,13 +4916,45 @@
"ui.extract_done":"Die Komponente ist jetzt ein eigenes Design und hier verknüpft.",
"ui.extrude":"Extrudieren",
"ui.extrude_auto_to_object":"Bis zu einem gewählten Ziel extrudieren",
"ui.extrude_auto_to_object_tip":"Wenn in „Extrudieren“ ein Profil gewählt ist, schaltet das Wählen einer Fläche, eines Eckpunkts oder einer parallelen Ebene außerhalb der Profilebene die Ausdehnung auf „Bis Objekt“ um",
"ui.extrude_auto_to_object_tip":"Eine Fläche, ein Scheitelpunkt oder eine parallele Ebene stellt die Ausdehnung auf Bis Objekt um.",
"ui.factor":"Faktor",
"ui.fade":"Auslauf",
"ui.fade_length":"Auslauflänge",
"ui.feature_history":"Feature-Verlauf",
"ui.feature_options":"Funktionsoptionen",
"ui.features":"Funktionen",
"ui.file":"Datei",
"ui.fillet":"Vollrundung",
"ui.fillet_corner_ball":"Kugel",
"ui.fillet_corner_ball_tip":"Ein Stück der Kugel des rollenden Balls, tangential (G1) zu jeder Rundung.",
"ui.fillet_corner_curvature_tip":"Krümmung (G2): ein glattes Flächenstück. Die Ecke wird entlang jeder Kante um den Rücksprung zurückgesetzt ({factor} × der Radius, sofern Sie keinen eingeben) und mit einem Flächenstück gefüllt, sodass Spiegelungen ohne Knick hindurchlaufen.",
"ui.fillet_corner_needs_constant":"Ecken mit glattem Flächenstück (G2) brauchen einen konstanten Radius und exakte Radiusanpassung.",
"ui.fillet_corner_patch":"Glattes Flächenstück",
"ui.fillet_corner_patch_tip":"Krümmungsstetig (G2): Die Ecke wird entlang jeder Kante zurückgesetzt und mit einem Flächenstück gefüllt, sodass Spiegelungen ohne Knick hindurchlaufen.",
"ui.fillet_corner_tangent_tip":"Tangential (G1): eine Kugelecke, ein Stück der Kugel des rollenden Balls, tangential zu jeder Rundung.",
"ui.fillet_error_corner":"Die glatte Ecke ließ sich hier nicht bauen. Versuchen Sie einen anderen Rücksprung oder tangentiale Ecken.",
"ui.fillet_error_failed":"Diese Rundung ließ sich an diesen Kanten nicht bauen. Versuchen Sie einen anderen Radius oder runden Sie weniger Kanten auf einmal.",
"ui.fillet_error_setback_short":"Der Rücksprung ist für das Eckstück zu kurz: Es lässt sich ab {least} bauen. Versuchen Sie einen längeren Rücksprung.",
"ui.fillet_error_too_large":"Der Radius ist zu groß für die Flächen neben diesen Kanten. Versuchen Sie einen kleineren Radius oder stellen Sie „Flächengrenzen“ auf „Größter Radius“.",
"ui.fillet_fit":"Flächengrenzen",
"ui.fillet_fit_exact":"Exakter Radius",
"ui.fillet_fit_needs_constant":"Radiusanpassung braucht einen konstanten Radius.",
"ui.fillet_fit_reduce":"Größter Radius",
"ui.fillet_fit_taper":"Verjüngter Radius",
"ui.fillet_fit_tip":"Wenn der Radius größer ist, als die Flächen neben einer Kante zulassen.\nExakter Radius: der angegebene Radius, oder keine Rundung und eine Meldung mit dem Grund.\nGrößter Radius: jede Kante mit dem größten passenden Radius gerundet.\nVerjüngter Radius: der Radius bleibt, die Rundung wird nur dort verjüngt, wo die Flächen enden.",
"ui.fillet_options_tip":"Tangentenkette: auch die Kanten runden, die glatt an die gewählten anschließen.\nVorschau: das Ergebnis beim Bearbeiten in der Ansicht zeigen.",
"ui.fillet_setback":"Rücksprung",
"ui.fillet_setback_hint":"{factor} × Radius",
"ui.fillet_setback_least":"Mehr als {least}",
"ui.fillet_setback_tip":"Wo das glatte Eckflächenstück beginnt: wie weit von der Ecke entlang jeder Kante. Standard ist {factor} × der Radius. Er muss größer sein als der kleinste Rücksprung, wo sich die Rundungen ohne ihn treffen: der Radius, wo die Flächen rechtwinklig zueinander stehen.",
"ui.fillet_smooth_radius":"Radius glatt ändern",
"ui.fillet_turn":"Wendungen",
"ui.fillet_turn_mitre":"Gehrung",
"ui.fillet_turn_swept":"Geschwenkt",
"ui.fillet_turn_tip":"Wo zwei Rundungen um eine scharfe Eckkante zwischen ihnen herumlaufen, etwa die Rundungen am Fuß eines Zapfens an seinen senkrechten Kanten.\nGehrung: Die Rundungen laufen weiter, bis sie sich in einer Gehrung treffen.\nGeschwenkt: Die Rundungen enden an der Eckkante und schwenken um sie herum; die Ecke ist ein Torus, tangential zu beiden. Nur für Rundungen mit einem Radius um eine gerade, konvexe Eckkante.",
"ui.fillet_type_choices_tip":"Konstanter Radius: ein Radius entlang der ganzen Kante.\nSehnenlänge: die Breite der Rundung bleibt gleich, in welchem Winkel die Flächen auch aufeinandertreffen.\nVariabler Radius: ein Radius an jedem Ende und weitere entlang der Kante, wenn Sie sie hinzufügen.\nKrümmungsstetig: ein Querschnitt ohne Knick in den Spiegelungen, wo er auf ebene Flächen trifft (G2).\nSpline: der Radius entlang der Kante folgt Steuerradien, die Sie festlegen.",
"ui.fillet_type_curvature":"Krümmungsstetig",
"ui.fillet_type_tip":"Der Querschnitt über die Kante. Krümmungsstetig: ein krümmungsstetiger Querschnitt (G2) zwischen ebenen Flächen, sodass Spiegelungen ohne Knick von den Flächen in die Rundung laufen.",
"ui.filter_commands_or_keys":"Befehle oder Tasten filtern",
"ui.hide_origin_by_default":"Ursprungsordner in neuen Konstruktionen ausblenden",
"ui.hide_origin_note":"Neue Designs beginnen mit ausgeblendetem Ordner „Ursprung“. Ein Design behält seine eigene Ursprungseinstellung, sobald Sie ihn ein- oder ausblenden.",
"ui.history_back":"Einen Schritt zurück",
"ui.history_below_browser":"Unter dem Browser",
@@ -4911,6 +5204,7 @@
"ui.part_size_needs_a_part":"Wählen Sie ein eingefügtes Standardbauteil (Schraube, Mutter, Scheibe oder Stift) aus, um seine Größe zu ändern. Einen Körper vergrößern oder verkleinern Sie mit Skalieren.",
"ui.part_size_shared":"Baut das Teil neu auf und ersetzt alle hinzugefügten Merkmale. Alle Vorkommen dieser Komponente werden aktualisiert.",
"ui.paste":"Einfügen",
"ui.patch_continuity_corner_tip":"Der Patch schließt entlang jeder Seite mit der gewählten Stetigkeit an die umgebenden Flächen an. An einer Ecke, an der diese Flächen mit unterschiedlicher Krümmung aufeinandertreffen, bleibt er dort tangential (G1).",
"ui.path":"Pfad",
"ui.pattern_object_type_tip":"Körper: feste Formen, in der Ansicht oder im Browser gewählt; jeder wird ganz kopiert.\nFunktionen: Schritte im Verlauf, etwa eine Extrusion oder eine Bohrung, im Verlauf oder auf einer von ihnen erzeugten Fläche gewählt; der Schritt wird wiederholt.\nEine Skizze ist keines von beiden: Ihre Kurven mit Muster oder Spiegeln in der Skizze wiederholen oder sie zuerst extrudieren.",
"ui.pattern_on_path":"Pfadmuster",
@@ -4927,7 +5221,7 @@
"ui.pitch":"Steigung",
"ui.placement":"Platzierung",
"ui.placement_handles":"Platzierungsgriffe",
"ui.placement_handles_tip":"Griffe an der Vorschau einer Auflage, eines Ansatzes oder einer Rastverbindung: Ziehen Sie die Markierung, um sie über das Modell zu bewegen, und drehen Sie sie am Ring",
"ui.placement_handles_tip":"Eine Markierung zum Verschieben des Features über das Modell und ein Ring zum Drehen.",
"ui.plane":"Ebene",
"ui.plane_at_angle":"Ebene im Winkel",
"ui.plugins":"Plugins",
@@ -5011,6 +5305,8 @@
"ui.repeat_nothing":"Noch nichts zu wiederholen: Starten Sie zuerst ein Werkzeug oder einen Dialog.",
"ui.replace_with_link_done":"Die Kopien sind jetzt Platzierungen des verknüpften Designs.",
"ui.reset_the_settings_on_this_page":"Einstellungen auf dieser Seite zurücksetzen",
@@ -5122,8 +5418,8 @@
"ui.start":"Start",
"ui.start_over":"Von vorn beginnen",
"ui.start_page":"Startseite",
"ui.step_values":"Werte mit Pfeiltasten und Mausrad schrittweise ändern",
"ui.step_values_tip":"In einem Wertefeld, in das Sie gerade tippen, ändern Auf/Ab eine einfache Zahl um 1 (Umschalt: 10, Alt: 0,1), ebenso das Mausrad über dem Feld. Ausdrücke bleiben wie eingegeben.",
"ui.step_values":"Werte mit Pfeilen und Mausrad ändern",
"ui.step_values_tip":"Pfeil auf/ab und das Mausrad über einem Wertefeld ändern dessen Zahl.",
"ui.stitch_tolerance_hint":"eng",
"ui.stretch":"Strecken",
"ui.supersampling":"Supersampling (SSAA)",
@@ -5292,6 +5588,14 @@
"values must be numbers or expressions":"Werte müssen Zahlen oder Ausdrücke sein",
"view.auto_ortho_faces":"Perspektivisch beim Drehen, orthografisch auf Flächen",
"view_gizmo.no_such_body":"Diese Konstruktion hat keinen Körper mit diesem Namen.",
"view_gizmo.note":"Wählen Sie einen Körper in der Ansicht. Er wird mit Ihren Einstellungen und Einstellungsprofilen gespeichert und in jeder Konstruktion angezeigt. Klicken Sie auf eine seiner Flächen, um direkt darauf zu blicken.",
"view_gizmo.texture":"Textur",
"view_gizmo.themed":"Design",
"view_gizmo.too_detailed":"Zu detailliert für den Ansichtsnavigator (über 10.000 Dreiecke)",
"view_gizmo.too_thin":"Zu lang und dünn für den Ansichtsnavigator: Die dünnste Seite muss mindestens ein Fünftel der längsten sein",
"web.files.insert_drawings_hint":"CAD-Dateien, Netze, DXF oder SVG in das geöffnete Design",
"web.files.insert_stored_drawings_hint":"In das geöffnete Design (CAD-Dateien, Netze, DXF, SVG)",
"cmd.render_effects_describe":"Lens and Creative Effects",
@@ -69,6 +68,9 @@
"help.solid.split_face":"Divides the selected faces along a plane, the face of another body or sketch curves, without cutting the body. Use it to give part of a face its own draft, colour or offset.",
"help.third_party":"Third-party licences",
"home.new_mm_hint":"Millimetres · opens in Design",
"prefs.design_tools.hole_snaps_help":"The middle of a face and the centres of its round edges.",
"prefs.logo_theme":"Theme's colours",
"prefs.max_file_size":"Largest file to open",
"prefs.max_file_size_flag":"This run started with --max-file-size {size}, which applies until SolidCraft closes. These settings apply when it starts without it.",
@@ -83,6 +86,11 @@
"prefs.max_file_size_web":"The web app opens STEP and import files up to 512 MB and designs up to 256 MB: a browser tab can't hold larger files. The desktop app can raise these limits.",
"prefs.megabytes":"MB",
"prefs.network_locations_note":"For organisations that keep designs on file servers. Off: only servers you allow.",
"prefs.select_hidden_edges_help":"Select edges through faces when Shaded with hidden edges is active, including for Fillet. Off keeps v0.30.1 selection behaviour. Hidden bodies stay unselectable.",
"prefs.sketch.center_arc":"Centre-point arc follows the cursor",
"prefs.sketch.conflict_colour":"Conflict colour",
"prefs.sketch.tracking_guides":"Centre and midpoint guides",
"prefs.sketch.tracking_guides_note":"Temporary horizontal and vertical guides from hovered centres and edge midpoints.",
"prefs.sketch_conflict_colour":"Conflicting geometry in the conflict colour",
"prefs.sketch_conflict_colour_note":"While a sketch's constraints conflict, the curves and points a failing constraint holds are drawn in the conflict colour too, not only its glyph or dimension. Off: they keep their usual colours.",
"prefs.sketch_construction_lines":"Extended construction line tools",
@@ -227,6 +235,10 @@
"render.studio_area_help":"Up to four one-sided rectangles. Orthogonal half-edges U and V define size; U × V faces the lit side. Coordinates are world-space millimetres.",
"render.studio_center":"Centre X, Y, Z (mm)",
"render.studio_hdr_help":"Radiance .hdr, 2:1 panorama, up to 2048 × 1024. EXR is unavailable. The colour assumption applies only when primaries are unspecified.",
"sketch.hint.arc.center_point":"Arc: click centre and start, go round either way and click the end, or type a signed sweep",
"sketch.hint.circle.center":"Circle: click the centre, then a point on the circle",
"sketch.hint.constraint.midpoint":"MidPoint: pick a point and a line, or two lines to centre the second on the first",
"sketch.hint.rectangle.center":"Centre rectangle: click the centre, then a corner",
"sketch_text.align_center":"Centre",
"ui.3d_mouse_kind_cap":"Return to Centre",
"ui.3d_mouse_looks_like_cap":"The reading stays put while you hold it, the way a Return to Centre device does.",
"Report a bug — review a screenshot and open a GitHub draft":"Report a bug — review a screenshot and open a GitHub draft",
"Report copied. Keep this text to submit on GitHub when you are online.":"Report copied. Keep this text to submit on GitHub when you are online.",
@@ -584,7 +586,7 @@
"Show ghost":"Show ghost",
"Show in folder":"Show in folder",
"Show the pointer an AI agent moves (#35)":"Show the pointer an AI agent moves (#35)",
"Show tool at cursor":"Show tool at cursor",
"Show tool at cursor":"Tool at the cursor",
"Signed axes":"Signed axes",
"Size":"Size",
"Sketch constraints":"Sketch constraints",
@@ -595,7 +597,7 @@
"Sketch points":"Sketch points",
"Slider":"Slider",
"Slot width":"Slot width",
"Snap to face and edge centres":"Snap to face and edge centers",
"Snap to face and edge centres":"Snap to centers",
"SolidCraft cannot submit reports directly. Submit on GitHub; no token is needed in the app.":"SolidCraft cannot submit reports directly. Submit on GitHub; no token is needed in the app.",
"SolidCraft closed before these designs were saved. Their last autosave can be opened.":"SolidCraft closed before these designs were saved. Their last autosave can be opened.",
"Sort A to Z":"Sort A to Z",
@@ -738,36 +740,36 @@
"a picked edge's body is gone":"a picked edge's body is gone",
"add a key for a joint first":"add a key for a joint first",
"ai.connected_toast":"SolidCraft is now available in {clients}. Restart them to use it (Preferences > Assistant).",
"ai.prefs.allow_control":"Let AI agents connect (control channel / MCP)",
"ai.prefs.allow_control_note":"Opens a control channel on this computer only (127.0.0.1, port 27878 or the next free one). A program that connects must also show a secret token that only your user account can read, made fresh at every start. Takes effect the next time SolidCraft starts. Off: nothing listens unless you start SolidCraft with --control.",
"ai.prefs.availability":"Assistant controls",
"ai.prefs.background_commands":"Run agent commands in the background",
"ai.prefs.connect_apps":"Make SolidCraft available to AI apps on this computer",
"ai.prefs.connect_apps_note":"When SolidCraft starts, adds it as an MCP server to the AI apps found on this computer (OpenCode, Claude Desktop, Claude Code, Cursor, Codex, Gemini CLI, Copilot CLI, Windsurf, Zed, VS Code), so an agent can use it without any setup. Only the solidcraft entry is added or its path refreshed; an entry you changed is left alone, and the file is backed up first. Off: the entries it added are removed. Help > Connect AI assistants… does this by hand.",
"ai.prefs.connect_at_start":"Connect the last-used agent when SolidCraft starts",
"ai.prefs.allow_control":"Let AI agents connect",
"ai.prefs.allow_control_note":"A local channel (MCP). Nothing leaves this computer.\n\nOpens a control channel on this computer only (127.0.0.1, port 27878 or the next free one). A program that connects must also show a secret token that only your user account can read, made fresh at every start. Takes effect the next time SolidCraft starts. Off: nothing listens unless you start SolidCraft with --control.",
"ai.prefs.availability":"Availability",
"ai.prefs.background_commands":"Run slow commands in the background",
"ai.prefs.connect_apps":"Add SolidCraft to AI apps",
"ai.prefs.connect_apps_note":"Off takes the entries out again.\n\nWhen SolidCraft starts, adds it as an MCP server to the AI apps found on this computer (OpenCode, Claude Desktop, Claude Code, Cursor, Codex, Gemini CLI, Copilot CLI, Windsurf, Zed, VS Code), so an agent can use it without any setup. Only the solidcraft entry is added or its path refreshed; an entry you changed is left alone, and the file is backed up first. Off: the entries it added are removed. Help > Connect AI assistants… does this by hand.",
"ai.prefs.connect_at_start":"Connect the last agent at start",
"ai.prefs.connect_at_start_note":"Starts the agent you connected last (or the default one) in the background each time SolidCraft starts, so it is ready for chatting. Not when SolidCraft is started with --control. If it cannot connect, the Assistant shows Connection failed and a Retry button.",
"ai.prefs.follow_camera":"Turn the camera to sketches",
"ai.prefs.follow_camera":"Follow the camera",
"ai.prefs.follow_camera_off":"Automatic camera following is off.",
"ai.prefs.follow_camera_on":"The camera turns to face sketches the agent creates.",
"ai.prefs.intro":"Agents, permissions and how their work appears.",
"ai.prefs.make_default":"Use by default",
"ai.prefs.intro":"AI agents in SolidCraft.",
"ai.prefs.make_default":"Make default",
"ai.prefs.no_agents":"No agents yet. Add an agent or refresh to find installed agents.",
"ai.prefs.open_at_start":"Open the Assistant panel when SolidCraft starts",
"ai.prefs.open_at_start":"Open the chat at start",
"ai.prefs.open_at_start_note":"Shows the Assistant panel (or its own window) each time SolidCraft starts. Not when SolidCraft is started with --control.",
"ai.prefs.override_all_warning":"This agent may save, overwrite, export or replace the design without asking.",
"ai.prefs.permission_all":"Allow everything",
"ai.prefs.permission_all_summary":"Available SolidCraft tools run without asking.",
"ai.prefs.permission_ask":"Ask before changes",
"ai.prefs.permission_ask_summary":"Approve every design change and file action.",
"ai.prefs.permission_edits":"Allow model edits",
"ai.prefs.permission_edits_summary":"Model edits run; file and destructive actions still ask.",
"ai.prefs.permission_all":"Do everything",
"ai.prefs.permission_all_summary":"Never asks",
"ai.prefs.permission_ask":"Ask first",
"ai.prefs.permission_ask_summary":"Asks for every change",
"ai.prefs.permission_edits":"Make edits",
"ai.prefs.permission_edits_summary":"Edits freely, asks for the rest",
"ai.prefs.permission_scope":"For SolidCraft tools only. The agent’s shell and file edits use its own permissions.",
"crash.unclean_explanation":"Detected on a later launch; the exact exit time was not recorded. A system shutdown or forced stop can also cause an unclean exit.",
"delete.and_more":"… and {count} more",
"diagnostic.empty_boolean_component":"there is no body to cut or intersect in component '{component}'; the tool may overlap '{body}' in component '{other}' — activate that component or pick the body as a target",
"diagnostic.reselect_reference":"{feature}: the reference `{reference}` no longer exists as it was picked; reselect it",
"dialog.bodies_count":"{count} bodies",
"dialog.clearance_invalid":"the clearance must be a length of 0 or more",
"dialog.compute":"Compute",
@@ -1369,6 +1397,9 @@
"dialog.custom_axis":"↖ Custom Axis",
"dialog.dimension_insert_hint":"Click another driving dimension to insert its name",
"dialog.dimension_name":"Dimension: {name}",
"dialog.dimension_step_down":"Down by {step}",
"dialog.dimension_step_expression":"Only a number steps; an expression stays as typed",
"dialog.dimension_step_up":"Up by {step}",
"dialog.edit_title":"EDIT {title}",
"dialog.no_shown_body":"No shown body to change: show one, or choose New Body",
"dialog.pattern_sketch_not_object":"Pick bodies or features: a sketch is neither. Repeat its curves with the sketch's own Pattern or Mirror, or extrude it first.",
"dialog.selection_guidance":"Select an input to change it. Click selected objects to remove them; Ctrl/Cmd-click also toggles them. Review the preview, then press OK.",
"document.read_only_save":"This design was opened read-only: save it as a new file",
"document.save_changes":"Save changes to {name}?",
"document.save_copy":"Save a Copy…",
"document.tab_unsaved_changes":"Unsaved changes",
"document.unsaved_changes":"{name} has unsaved changes. If you don't save, they are lost.",
"drive.rigid":"{joint} is a rigid joint: it holds its parts still, so it has nothing to drive. To let them move, change its type in Edit Joint: Revolute to rotate, Slider to slide, Cylindrical for both.",
"drive.stopped_by_contact":"Stopped at {value}: {a} would pass through {b}",
@@ -1413,6 +1446,9 @@
"each rail's curves must be in one sketch":"each rail's curves must be in one sketch",
"feature computation ended without a result":"feature computation ended without a result",
"file.open.drawing_filter":"Designs, CAD files, meshes and drawings",
"file.open.portal_fallback.no_portal_service":"The file chooser that opened is not the desktop's own: the desktop portal service is not available.",
"file.open.portal_fallback.no_session_bus":"The file chooser that opened is not the desktop's own: there is no D-Bus session bus.",
"file.open.portal_fallback.xwayland":"The file chooser that opened is not the desktop's own: under XWayland the portal refuses the parent window.",
"file_load.built":"Built so far: {built} of {total} features.",
"file_load.converting":"Converting solid {done} of {total}",
"file_load.inserting":"Inserting geometry",
@@ -1425,6 +1461,14 @@
"file_load.reading_percent":"Reading the file... {percent}%",
"file_load.rebuilding":"Rebuilding feature {done} of {total}",
"file_load.recovering":"Recovering design",
"file_load.step_build":"Building the model",
"file_load.step_feature":"Feature {done} of {total}",
"file_load.step_part":"Part {done} of {total}",
"file_load.step_percent":"{percent}%",
"file_load.step_read":"Reading the file",
"file_load.step_rebuild":"Rebuilding the features",
"file_load.step_repair":"Checking and repairing the parts",
"file_load.step_show":"Preparing the view",
"file_load.stopping":"Waiting for the previous operation to stop...",
"file_load.updating_links":"Updating links",
"file_load.waiting":"Waiting for file operation",
@@ -1521,6 +1565,11 @@
"help.joint.reach":"Moves a point on a part toward a target by changing the joints on its chain, within their limits. Use it to pose a mechanism by where its end should be, such as the tip of a robot arm.",
"help.joint.rigid_group":"Locks the selected parts together as they are, so they move as one. Use it for parts that belong together and have no motion between them.",
"help.joint.screw":"Links turning and sliding by a pitch, so each turn advances by that distance. Use it for lead screws, bolts and threaded spindles.",
"help.layout.apply":"Apply a saved layout to the current workspace. Retained editors keep their drafts.",
"help.layout.get":"Read the committed layout and discover registered workspaces.",
"help.layout.reset":"Restore the current workspace's registered default layout. User presets remain available.",
"help.layout.save":"Save the complete layout under a name. Replacing a user preset requires explicit overwrite permission.",
"help.layout.workspace.select":"Select a registered layout workspace and remember the outgoing layout.",
"help.library.apply":"Applies a material or appearance from a local library file to bodies, faces or components. Use it to reuse materials you saved from another design.",
"help.library.export":"Saves the design's materials and appearances to a library file. Use it to share them or reuse them in other designs.",
"help.library.inspect":"Checks a library file and lists its materials and appearances, without changing the design. Use it to see what a library holds before applying it.",
@@ -1534,6 +1583,21 @@
"help.notice":"NOTICE",
"help.occurrence.ground":"Fixes a part in place, or frees it again, so that joints move the other parts around it. Use it for the frame or base that the rest of the assembly is built on.",
"help.occurrence.move":"Moves an assembly part only along freedoms allowed by its joints. Select a part face, then drag an available arrow or arc.",
"help.panel.activate":"Select an open panel tab without requesting keyboard focus.",
"help.panel.close":"Close a panel through its content lifecycle guard. Its placement is remembered.",
"help.panel.collapse":"Collapse or expand a panel section while retaining its requested dimensions.",
"help.panel.dismiss":"Dismiss the temporary view of a collapsed panel.",
"help.panel.float":"Move a panel into an explicitly positioned floating section.",
"help.panel.focus":"Focus a panel, reopening its retained state and expanding its section when needed.",
"help.panel.list":"Read registered panel kinds, committed instances, active tabs, availability and host capabilities.",
"help.panel.move":"Move a panel into a new section or join an existing tab group.",
"help.panel.native_close":"Return a native panel section to its remembered dock without cancelling its content.",
"help.panel.open":"Open a panel kind with an explicit instance identity and placement for a new instance.",
"help.panel.peek":"Temporarily show a collapsed panel without changing its saved size or collapse state.",
"help.panel.popout":"Move a panel to a native host when supported. Browser hosts use a floating section.",
"help.panel.reset_pair":"Restore an adjacent dock pair's default size ratio within its shared bounds.",
"help.panel.resize":"Set a panel section's outer width and height within every tab's bounds.",
"help.panel.resize_pair":"Resize adjacent dock sections together while conserving their shared extent.",
"help.parameters.change":"Opens the table of named values and expressions that drive the dimensions of the design. Use it to change a size in one place and let every feature that uses it follow.",
"help.parameters.export":"Saves the design's parameters as CSV or JSON. Use it to edit them in a spreadsheet or move them to another design.",
"help.parameters.graph":"Shows which parameters and features use which others, and any loops or errors among them. Use it to see what a change to a parameter will affect.",
@@ -1545,7 +1609,7 @@
"help.parts.resize":"Changes the size or length of an inserted standard part and rebuilds it; its joints keep it seated. Use it when a screw turns out too long or a hole needs another size.",
"help.plastic.assign_rule":"Assigns a plastic rule to bodies, so their plastic features take its draft and clearance as defaults. Use it to set up a moulded part once for all its features.",
"help.plastic.boss":"Adds a screw boss on a face: a post with an optional hole, draft, root fillet and supporting ribs. Use it for screw points in moulded or printed housings.",
"help.plastic.lip":"Adds a lip or a matching groove along the rim of a shelled body. Use it so that two housing halves locate on each other and close tightly.",
"help.plastic.lip":"Adds a lip or a matching groove along the rim of a shelled body (Shell a face open first, then pick the rim around that opening). Use it so that two housing halves locate on each other and close tightly.",
"help.plastic.manage_rules":"Creates and edits plastic rules: material, wall thickness, radii, clearance and draft. Use them to keep the features of a moulded part consistent.",
"help.plastic.rest":"Adds a rest on a face: a round or rectangular pad, solid or hollow, with draft. Use it as a support or standoff in a moulded housing.",
"help.plastic.snap_fit":"Adds a snap-fit hook on a face, with its length, thickness and catch. Use it to clip parts together without screws.",
@@ -1719,6 +1783,7 @@
"help.timeline.delete":"Deletes the selected features from the timeline; deleting a sketch also deletes the features built from it. Use it to remove a step that is no longer wanted.",
"help.timeline.dependents":"Lists the features that would be deleted with a feature, and those that would fail without it. Use it before deleting or changing a feature.",
"help.timeline.play":"Replay the remaining features one at a time, with a half-second pause after each rebuild. Run this command again or press Escape to stop; Go to end jumps immediately.",
"help.version":"Version {version}",
"help.view.apply":"Turns the view to a standard direction such as front, top or iso, or to a saved named view. Use it to look at the model from a fixed angle.",
"help.view.delete":"Deletes a saved named view. The model is not changed.",
"help.view.fit":"Zooms and pans so the whole model, or the selection, fills the view. Use it when the model has gone out of sight.",
@@ -1806,6 +1871,27 @@
"home.start_hint":"Create a design, open a recent file, or explore a sample.",
"home.whats_new":"What's new",
"home.yesterday":"Yesterday",
"import_report.details":"Details:",
"import_report.file_one":"There was 1 other problem with the file.",
"import_report.file_other":"There were {count} other problems with the file.",
"import_report.hint":"Exporting these parts again from the program that made them may fix this. Copy Warning Message has the details.",
"import_report.left_out_one":"1 face couldn't be repaired and is missing.",
"import_report.left_out_other":"{count} faces couldn't be repaired and are missing.",
"import_report.needs_repair_one":"1 part needs repair before it can be modelled on.",
"import_report.needs_repair_other":"{count} parts need repair before they can be modelled on.",
"import_report.not_imported_one":"1 part couldn't be imported.",
"import_report.not_imported_other":"{count} parts couldn't be imported.",
"import_report.not_shown_one":"1 face couldn't be drawn and is hidden.",
"import_report.not_shown_other":"{count} faces couldn't be drawn and are hidden.",
"import_report.open_one":"1 part has gaps between its faces and came in as an open body.",
"import_report.open_other":"{count} parts have gaps between their faces and came in as open bodies.",
"import_report.refused_one":"1 part couldn't be made into a solid and was not imported.",
"import_report.refused_other":"{count} parts couldn't be made into solids and were not imported.",
"import_report.repaired_one":"Small flaws were repaired in 1 part.",
"import_report.repaired_other":"Small flaws were repaired in {count} parts.",
"import_report.solids":"Imported {solids} of {parts} parts as solids.",
"import_report.surfaces_one":"1 part couldn't be made into a solid and came in as surfaces.",
"import_report.surfaces_other":"{count} parts couldn't be made into solids and came in as surfaces.",
"install.button_tip":"Install SolidCraft as an app: it opens in its own window and works offline",
"install.dock_1":"Choose File › Add to Dock.",
"install.dock_2":"Click Add.",
@@ -1848,21 +1934,21 @@
"joint.rigid_group_select_components":"Select two or more components.",
"joint_move.blocked_hint":"Check the joint type (such as Rigid), grounding, joint limits, and parameter-driven values.",
"joint_move.blocked_title":"Cannot move this part",
"joint_move.conflict":"A joint of this part conflicts with the others: {joint}.",
"joint_move.conflict_hint":"Edit, suppress or delete the conflicting joint so the other joints can place the part.",
"joint_move.distance":"Distance from start",
"joint_move.done":"Done",
"joint_move.fine":"Far-axis rotation step (°)",
"joint_move.fine":"Far-axis step",
"joint_move.fixed":"This part has no movable joint axis.",
"joint_move.help":"Move — drag an arrow or ring. Esc cancels the current drag.",
"joint_move.legacy_hint":"Turn off to use the previous Move panel.",
"joint_move.precision":"Pull outside the dashed guide for fine rotation.",
"joint_move.legacy_hint":"Off: the previous Move panel.",
"joint_move.precision":"Pull outside the dashed guide for the fine step.",
"joint_move.rotation":"Rotation from start",
"joint_move.select":"Select a face or one assembly part, then choose Move.",
"joint_move.settings":"Assembly Move",
"joint_move.step":"Step",
"joint_move.use_handles":"Use joint motion handles for assembly Move",
"joint_move.use_handles":"Use joint motion handles for Move",
"keymap.command_id":"Command ID",
"keymap.empty":"No matching commands",
"keymap.use_anyway":"Use {key} here anyway",
@@ -1922,6 +2008,7 @@
"material.selection.mixed":"Different materials",
"measure.at":"At",
"measure.item":"Item {number}",
"measure.line_to_centre":"Line to center",
"measure.quick_copied":"Measurement copied",
"measure.quick_copy":"Click to copy the measurement",
"measure.quick_edges":"{count} edges",
@@ -1952,6 +2039,8 @@
"nav.blender.help":"Middle drag orbits, Shift+middle pans, Ctrl+middle zooms; right drag leaves the camera alone",
"nav.creo.help":"Middle drag orbits, Shift+middle pans, Ctrl+middle drag vertically zooms (down to zoom in); scroll the wheel to zoom",
"nav.creo.label":"Creo",
"nav.drag_keeps_mode.help":"A middle or right drag goes on orbiting, panning or zooming as it began until the button is released, whatever keys are pressed or let go meanwhile. Off: the keys held decide at every moment of the drag.",
"nav.drag_keeps_mode.label":"A drag keeps the navigation it started with",
"nav.free_orbit.help":"Mouse and 3D mouse rotate through both poles and preserve roll. Shift axis snapping is disabled.",
"nav.free_orbit.label":"Free orbit",
"nav.free_orbit.snap_help":"Mouse and 3D mouse rotate through both poles and preserve roll. Hold Shift during an orbit drag to snap the view direction and roll.",
"navbar.custom.available":"{available} · drag onto the bar, or press Add",
"navbar.custom.buttons":"Buttons",
"navbar.custom.compact":"Compact",
@@ -2016,6 +2111,7 @@
"navbar.custom.reset_default":"Reset to default",
"navbar.custom.right":"Move right",
"navbar.custom.select":"No slot selected. Select a slot on the bar to move it, remove it or change how it looks.",
"navbar.custom.separator_hint":"A divider between groups of buttons. Drag it onto the bar, or press Add; use as many as you like.",
"navbar.custom.separators_full":"The bar already has four separators.",
"navbar.custom.show":"Show navigation bar",
"navbar.custom.shows":"Shows",
@@ -2169,21 +2265,37 @@
"prefs.appearance.viewport_logo":"Viewport and logo",
"prefs.applies_on_restart":"Applies on restart",
"prefs.assistant":"Assistant",
"prefs.assistant_connecting":"Connecting",
"prefs.assistant_follow_help":"Look At sketches move the view with the pointer.",
"prefs.assistant_limit":"Limit",
"prefs.assistant_limited":"Limited",
"prefs.assistant_pointer_speed":"Pointer speed",
"prefs.assistant_seconds":"seconds",
"prefs.assistant_seconds_aria":"Seconds",
"prefs.assistant_use_care":"Use with care",
"prefs.auto_operation":"Choose the operation automatically",
"prefs.auto_operation_note":"Feature windows pick Join, New Body or Cut from what the new material touches, until you pick one. Off: they keep the operation they open with.",
"prefs.auto_operation_note":"Join, New Body or Cut, from what the material touches.",
"prefs.axes":"Axes",
"prefs.axis":"Axis",
"prefs.blur_cost":"Relative rendering cost. More bars usually mean more work.",
"prefs.blur_device":"Unavailable on this graphics device or rendering path",
"prefs.blur_guard":"Blur quality was reduced to keep frames responsive. The radius is unchanged.",
"prefs.blur_off":"Off",
"prefs.blur_reduce_transparency":"Disabled by the system's Reduce transparency setting",
"prefs.blur_software":"Unavailable with software graphics (gpu-software)",
"prefs.blur_source":"Unavailable in this workspace view",
"prefs.blur_web":"Unavailable on this web rendering path",
"prefs.browser_components_open_note":"Every component in the browser starts open, as before, instead of closed until you open it.",
"prefs.browser_eye_left":"Eye next to the fold arrow",
"prefs.browser_eye_left":"Eye beside the fold arrow",
"prefs.browser_eye_left_note":"Browser rows show their show/hide eye next to the fold arrow, as before, instead of in a column at the right end of the rows.",
"prefs.browser_reveal_on_hover":"Reveal on hover",
"prefs.browser_show_note":"Shown keeps the browser on screen. Reveal on hover keeps it out of sight until the pointer comes over its place or the thin tab at its left edge, and it stays open while the pointer is inside it or a menu from it is open.",
@@ -2212,14 +2324,32 @@
"prefs.dark_parts_shading_help":"Shade the view in linear light with a soft sky fill, so dark faces keep a gradient instead of turning black",
"prefs.dead_zone_note":"The hatched band is the dead zone: motion inside it is ignored.",
"prefs.default":"default",
"prefs.design":"Design defaults",
"prefs.design_note":"What new designs start with. Open designs keep their own.",
"prefs.design":"Design",
"prefs.design_note":"What new designs start with.",
"prefs.design_tools.ask":"Ask",
"prefs.design_tools.degrees":"Degrees",
"prefs.design_tools.double_click_help":"Or to edit a linked one in place.",
"prefs.design_tools.ghost":"Show moved parts' old place as a ghost",
"prefs.design_tools.hole_moves_help":"Picking the face again moves the hole instead of removing it.",
"prefs.design_tools.hole_snaps_help":"The middle of a face and the centers of its round edges.",
"prefs.dialogs_note":"Where command dialogs open: docked at the view's edge, or in the left column in place of the browser and the History, which come back as they were when the dialog closes.",
"prefs.dimension_step_angle":"What the window's arrows, Up/Down and the wheel add to an angle",
"prefs.dimension_step_length":"What the window's arrows, Up/Down and the wheel add to a length",
"prefs.dimension_steps":"Window steps",
"prefs.dimension_values":"Dimension values",
"prefs.dimension_values_note":"Where you type a dimension's value. A window has arrows that step it; the Dimension tool places the text first.",
"prefs.dimension_values_view":"In the view",
"prefs.dimension_values_window":"In a window",
"prefs.display":"Display",
"prefs.edges":"Edges and shading",
"prefs.extend":"Extend",
@@ -2255,6 +2385,23 @@
"prefs.graphics_card_restart":"Takes effect after restarting SolidCraft. WGPU_ADAPTER_NAME overrides this choice.",
"prefs.graphics_card_unused":"The saved graphics card was not used for this window; the card in use is shown in Help › About and in the status line. Try Automatic, or set WGPU_ADAPTER_NAME to a unique part of the card's name.",
"prefs.graphics_note":"Trade speed for smoothness. Each choice shows its effect on a sample.",
"prefs.graphics_page.supersampling_adaptive":"Only while the view is still",
"prefs.graphics_page.surfaces_edges":"Surfaces and edges",
"prefs.graphics_page.view_bar":"Also in the view bar",
"prefs.graphics_presets_note":"Presets set the choices below together.",
"prefs.hide_constraint_glyphs_zoomed_out":"Hide constraint glyphs when zoomed out",
"prefs.hide_constraint_glyphs_zoomed_out_note":"Constraint glyphs leave the view when the sketch is zoomed out far enough that they would clutter it. Off: they stay at a fixed screen size at every zoom.",
@@ -2263,7 +2410,7 @@
"prefs.history_origin_bodies_note":"The History on the left or under the browser starts with the active component's Bodies folder and the Origin, with their eyes and menus as in the browser. The History at the bottom is unchanged.",
"prefs.history_play_button":"Play History button in the History controls",
"prefs.history_play_button_note":"Puts Play History between Go back one step and Go forward one step in the History controls. You can also right-click the controls to show or hide it.",
"prefs.history_sketches":"Sketches",
"prefs.history_sketches":"Sketches in History",
"prefs.history_sketches_in_order":"In order",
"prefs.history_sketches_note":"With Sketches set to Under their feature, the History at the left lists each sketch one level in, under the first feature built from it, whenever it is wide enough for names. The timeline at the bottom always keeps the creation order.",
"prefs.history_sketches_under_feature":"Under their feature",
@@ -2288,6 +2435,22 @@
"prefs.language_system":"System",
"prefs.layout":"Layout",
"prefs.layout_note":"Compact docks panels to the window edges. Browser translucency is available in Floating. Change the Assistant side on the Assistant page.",
"prefs.layout_page.active_commands":"Highlight active commands",
"prefs.layout_page.origin_bodies":"Origin and bodies on top",
"prefs.layout_page.panels":"Panels",
"prefs.layout_page.pinned_menus":"Pinned commands out of menus",
"prefs.layout_page.play_history":"Play History button",
"prefs.layout_page.slot_count":"{count} of {max} slots",
"prefs.layout_page.view_corner":"Also in the view's corner",
"prefs.layout_page.window":"Window",
"prefs.left":"Left",
"prefs.left_click":"Left click",
"prefs.line_drag_draws_one":"Press and drag draws one line",
@@ -2316,6 +2479,13 @@
"prefs.mouse_heading":"Mouse",
"prefs.mouse_mapping":"Mouse mapping",
"prefs.navigation":"Navigation",
"prefs.navigation.axes_signed":"Axes",
"prefs.navigation.cube_compact":"Cube",
"prefs.navigation.device":"Device",
"prefs.navigation.free":"Free",
"prefs.navigation.orbit_style":"Orbit style",
"prefs.navigation.radial_help":"Hold or flick the right button for a ring of tools.",
"prefs.navigation.turntable":"Turntable",
"prefs.navigation_note":"How the mouse, trackpad and 3D mouse move the view.",
"prefs.navigator_fit":"Fit the model after a navigator view change",
"prefs.navigator_fit_note":"A face, corner or arrow of the view cube, or an axis of the gizmo, also looks at the middle of the model from the one distance that fits it from every side (its bounding sphere). Home uses the same zoom and centre while this is on, so views chosen after it only turn. Off: the view turns in place, keeping its target and zoom.",
@@ -2332,11 +2502,15 @@
"prefs.origin_plane_names_note":"Names shown in the browser, dialogs and lists. {top} is XY, {front} is XZ and {right} is YZ, with Z up. Commands, scripts and saved designs keep XY, XZ and YZ.",
"prefs.overall_speed":"Overall speed",
"prefs.parameter_list_rows":"Parameter list rows",
"prefs.parameter_list_rows_tip":"Down arrow in an empty value field lists the parameters, favourites first, up to this many. Fewer keeps the list light in a large design.",
"prefs.parameter_list_rows_tip":"The most parameters Down arrow lists in an empty expression box.",
"prefs.persistent_ribbon_pressed":"Highlight active ribbon commands",
"prefs.persistent_ribbon_pressed_help":"Highlight ribbon commands while their effects are on. Turn off to keep the previous neutral appearance and command help.",
"prefs.prefer_free_sketch_points":"Prefer movable sketch points when points overlap",
"prefs.preview_choices":"Preview of your choices",
"prefs.preview_tint_new_faces":"Tint new surface in a preview",
@@ -2351,6 +2525,8 @@
"prefs.profile_exported":"Profile exported.",
"prefs.profile_imported":"Profile imported.",
"prefs.profile_name_hint":"Profile name, e.g. Laptop",
"prefs.profile_operations":"Profile operations",
"prefs.profile_operations_note":"Records how long SMLib calls, kernel operations, features, commands and imports take. Agents read it with diagnostics.profile.",
"prefs.profile_rename":"Rename",
"prefs.profile_renamed":"Profile renamed.",
"prefs.profile_save":"Save",
@@ -2380,7 +2556,12 @@
"prefs.scale_text":"Scale and text",
"prefs.search":"Search preferences",
"prefs.search_empty":"No matching preferences",
"prefs.section_hatch":"Section hatch",
"prefs.section_hatch_by_part":"By part",
"prefs.section_hatch_one":"One style",
"prefs.select":"Select",
"prefs.select_hidden_edges":"Select hidden edges in Shaded with hidden edges",
"prefs.select_hidden_edges_help":"Select edges through faces when Shaded with hidden edges is active, including for Fillet. Off keeps v0.30.1 selection behavior. Hidden bodies stay unselectable.",
"prefs.select_one_item":"Select one item",
"prefs.select_other_hidden":"Select hidden geometry with Select Other",
"prefs.select_other_hidden_help":"On: include hidden bodies, sketches and occluded edges near the pointer. Off: use the original list of visible geometry under the pointer.",
"prefs.shift_add_note":"On: Shift adds, Ctrl / Cmd toggles. Off (default): both toggle.",
"prefs.shortcuts":"Shortcuts",
"prefs.shortcuts_import":"Import",
"prefs.shortcuts_intro":"Keys for each command.",
"prefs.shortcuts_not_assigned":"Not assigned",
"prefs.shortcuts_press":"Press a key...",
"prefs.single_surface_analysis":"Use a single surface analysis",
"prefs.single_surface_analysis_help":"When off, surface shading and Continuity can stay on together. Turning this on keeps the last analysis started or changed.",
"prefs.sketch.align_points":"Line up with other sketch points",
"prefs.sketch.align_points_note":"Drawing lines align with points on both axes at once.",
"prefs.sketch.auto_dimensions":"Dimension new shapes fully",
"prefs.sketch.auto_dimensions_note":"Typed values plus every dimension that fixes the shape.",
"prefs.sketch.auto_locate":"Place from the sketch origin",
"prefs.sketch.auto_locate_note":"With full dimensions.",
"prefs.sketch.center_arc":"Center-point arc follows the cursor",
"prefs.sketch.click_selects":"Click selects",
"prefs.sketch.conflict_colour":"Conflict color",
"prefs.sketch.drawing":"Drawing",
"prefs.sketch.ellipse_axes":"Draw ellipses with their axes",
"prefs.sketch.ellipse_axes_note":"The major and minor axes as construction lines, so the half-axes and axes can be dimensioned. Off: the ellipse alone, and D on it gives its minor radius wherever the value is pulled, drawn and labelled R as before.",
"prefs.sketch.exit_keep":"Keep",
"prefs.sketch.exit_previous":"Return to the view before",
"prefs.sketch.note":"Drawing, snapping and selecting.",
"prefs.sketch.opening_closing":"Opening and closing",
"prefs.sketch.prefer_free_points":"Prefer movable points where they overlap",
"prefs.sketch.project_options":"Ask for Project options first",
"prefs.sketch.recent_snap":"Snap to where two guides cross",
"prefs.sketch.select_other_hidden":"Select Other reaches hidden geometry",
"prefs.sketch.shortcut_cycles_modes":"Shortcut again switches mode",
"prefs.sketch.shortcut_cycles_modes_tip":"Off: it starts the tool again.",
"prefs.sketch.snapping_guides":"Snapping and guides",
"prefs.sketch.state_icons":"State icons",
"prefs.sketch.tracking_guides":"Center and midpoint guides",
"prefs.sketch.tracking_guides_note":"Temporary horizontal and vertical guides from hovered centers and edge midpoints.",
"prefs.sketch.tracking_points":"Guides from sketch points too",
"prefs.sketch.unless_turned_note":"return if not rotated",
"prefs.sketch.whole_bodies":"Whole bodies",
"prefs.sketch_align_points":"Line up with other sketch points while drawing",
"prefs.sketch_align_points_note":"While drawing, a point lines up horizontally with one sketch point and vertically with another at the same time, with a dotted guide, and the click keeps both alignments. Off: only with the previous point, one axis at a time.",
"prefs.sketch_conflict_colour":"Conflicting geometry in the conflict color",
@@ -2423,11 +2641,11 @@
"prefs.source":"Source",
"prefs.speed":"Speed",
"prefs.stand_up_note":"After a STEP or IGES file opens with Z up, offer a quarter turn about X.",
"prefs.stand_up_unknown":"For files from unknown programs",
"prefs.stand_up_unknown":"Files from unknown programs",
"prefs.stand_up_unknown.ask":"Ask in a dialog",
"prefs.stand_up_unknown.note":"Show a note",
"prefs.stand_up_unknown.off":"Don't offer",
"prefs.stand_up_unknown_note":"How the offer is made when the file's header names no program known to save Y up. A note is shown only when the file seems to lie on its back; Ask in a dialog asks about every such file, as before.",
"prefs.stand_up_unknown_note":"How the offer is made when the file names no known program.",
"prefs.status_bar":"Status bar",
"prefs.status_bar_note":"A thin bar along the window's bottom edge shows what is being edited, the open sketch's state in its color and the design's units; a click on the units changes them. The sketch's state then no longer shows in the view's corner.",
"prefs.status_done":"Done",
@@ -2463,6 +2681,10 @@
"prefs.theme_follow_off":"Off",
"prefs.theme_follow_stop":"Stop following",
"prefs.theme_import_hint":"Click to choose a theme file, drop one here, or press Ctrl+V (Cmd+V on a Mac) with a theme copied",
"prefs.theme_notice_dismiss":"Dismiss",
"prefs.theme_option_blur":"Blur behind panels",
"prefs.theme_option_blur_help":"Blur behind translucent panels, in physical pixels. Zero is off.",
"prefs.theme_option_invalid":"Saved value for {option} is invalid; using the theme default. The saved value is kept.",
"prefs.theme_option_opacity":"Opacity",
"prefs.theme_option_opacity_help":"Adjust floating panel opacity. A readability floor protects text over viewport colors.",
"prefs.theme_option_tab_colours":"Tab colors",
@@ -2471,6 +2693,7 @@
"prefs.theme_option_tab_fade_ms_help":"Fade panel and viewport colors when switching tabs. Zero switches instantly.",
"prefs.theme_options_badge":"Options",
"prefs.theme_options_more":"More · {count}",
"prefs.theme_options_newer":"This theme requires a newer SolidCraft. Upgrade, then reimport the original theme to recover its option definitions.",
"prefs.theme_options_reset":"Reset",
"prefs.theme_options_unavailable":"Unavailable on this device",
"prefs.theme_paste":"Paste theme",
@@ -2494,8 +2717,14 @@
"prefs.under_cursor":"Under cursor",
"prefs.units_precision":"Units and precision",
"prefs.updates":"Updates",
"prefs.value_boxes_in_view":"Show values beside their handles in the view",
"prefs.value_boxes_in_view_tip":"A command's value (Distance, Radius…) in a box next to its handle, over the model. Off: you type it in the command window, which takes the keyboard after a pick, and nothing covers the model.",
"prefs.validation":"Body check",
"prefs.validation.each_feature":"Once per feature",
"prefs.validation.each_step":"After every step",
"prefs.validation.label":"Full kernel check",
"prefs.validation.off":"Off (experimental)",
"prefs.validation_note":"After every step: checks each sweep, boolean and blend.\nOnce per feature: checks each feature's result once.\nOff (experimental): no check.",
"prefs.value_boxes_in_view":"Show values beside their handles",
"prefs.value_boxes_in_view_tip":"Extrude's Distance, Fillet's Radius... as a box in the view.",
"prefs.view":"View behavior",
"prefs.view_confirm_corner":"OK and Cancel in the view's corner",
"prefs.view_confirm_corner_note":"While a dialog or a sketch is open, a check and a cross at the top right of the view do what the dialog's OK and Cancel do, or finish and cancel the sketch. The view navigator moves down below them.",
@@ -2528,6 +2757,17 @@
"recovery.just_now":"just now",
"recovery.min_ago":"{count} min ago",
"recovery.never_saved":"never saved",
"refused.change":"Couldn't change {body}.",
"refused.cut":"Couldn't cut {body}.",
"refused.face_curved":"One of its curved faces can't be used for modelling.",
"refused.face_flat":"One of its flat faces can't be used for modelling.",
"refused.face_freeform":"One of its freeform faces can't be used for modelling.",
"refused.face_rounded":"One of its rounded faces can't be used for modelling.",
"refused.faces_apart":"Its faces don't meet closely enough to be used for modelling.",
"refused.intersect":"Couldn't intersect with {body}.",
"render.adaptive_enable":"Allocate samples with independent pilots",
@@ -3885,11 +4125,11 @@
"select two components":"select two components",
"set by the sketch's lines":"set by the sketch's lines",
"settings.display_quality_note":"Only the display. Designs and exports are not affected.",
"settings.double_click_components":"Double-click a component to activate it, or to edit a linked one in place",
"settings.double_click_components":"Double-click a component to activate it",
"settings.frame_rate_details_note":"Adds a graph of the last frames' times with the triangles drawn over it, a histogram of frame times and what the GPU drew. Click the frame rate in the view to show or hide them.",
"settings.frame_rate_note":"Shows frames per second in the view's bottom-right corner.",
"settings.insert_lists_open_designs":"Insert Design lists the designs open in other tabs first",
"settings.insert_lists_open_designs":"Insert Design lists open designs first",
"settings.measure_axis_distances":"Axis distances in Measure",
"settings.measure_axis_distances_help":"Show world-axis component dimensions alongside the total distance while Measure is open.",
"settings.msaa_applies_on_restart":"Anti-aliasing applies the next time SolidCraft starts",
"settings.msaa_reset":"{setting}: {requested}× isn't supported by this graphics device; it is now {reset}× (supported: {supported}).",
@@ -3899,7 +4139,7 @@
"settings.reset_intro":"These settings don't work on this computer and would keep SolidCraft from starting, so they were changed:",
"settings.reset_title":"Settings were changed",
"settings.supersampling_note":"Draws the view at a higher resolution and filters it down: smoother edges, lines and grid on screens below 4K. It costs GPU time: about 2.25× the pixels at 1.5× and 4× at 2×.",
"settings.update_changed_links":"Update changed linked designs when a tab comes back",
"settings.update_changed_links":"Update changed links when a tab comes back",
"settings.window_system_details":"Details",
"settings.window_system_note_now":"Applies after a restart. Now: {now}.",
"settings.window_system_wayland_limited":"Some features are limited on native Wayland.",
@@ -3938,6 +4178,32 @@
"sketch.dof_left":"{count} degrees of freedom left",
"sketch.dof_left_one":"{count} degree of freedom left",
"sketch.draw_curves":"Draw as {linetype}",
"sketch.error.closed_curve_two_crossings":"a closed curve needs two crossings to trim",
"sketch.error.nothing_to_break":"nothing to break here",
"sketch.error.offset_fillet_chamfer":"`{id}` is an offset, and its corners follow its source curves: round or cut the source corners before offsetting, or break the offset association first",
"sketch.error.offset_trim":"`{id}` is an offset, and its ends follow its source curves: edit the source curves instead, or break the offset association first",
"sketch.hint.arc.center_point":"Arc: click center and start, go round either way and click the end, or type a signed sweep",
"sketch.hint.arc.three_point":"Arc: click start, end, then a point on the arc",
"sketch.hint.arc3d":"3D Arc: click start, end, then a point on the arc (points may leave the sketch plane)",
"sketch.hint.break":"Break: click a curve where it should split",
"sketch.hint.circle.center":"Circle: click the center, then a point on the circle",
"sketch.hint.constraint.generic":"Constraint: pick the sketch entities",
"sketch.hint.constraint.horizontal_vertical":"Horizontal/Vertical: pick a line, two points, or a point and a line; hold Shift to pick a line midpoint",
"sketch.hint.constraint.midpoint":"MidPoint: pick a point and a line, or two lines to center the second on the first",
"sketch.hint.dimension":"Dimension: pick one or two entities and type the value (or click to place it first); click a dimension to edit it; Enter applies",
"sketch.hint.extend":"Extend: click a curve near the end to extend (Shift: click two curves to extend both to where they meet)",
"sketch.hint.fallback":"Click in the sketch",
"sketch.hint.line":"Line: click points; right-click or Esc to finish",
"sketch.hint.line3d":"3D Line: click world points; right-click or Esc to finish (points may leave the sketch plane)",
"sketch.hint.open_done":"Open done",
"sketch.hint.point3d":"3D Point: click where a 3D point goes",
"sketch.hint.rectangle.center":"Center rectangle: click the center, then a corner",
"sketch.hint.rectangle.rounded":"Rounded rectangle: click two opposite corners (Tab to the radius box to type the corner radius)",
"sketch.hint.rectangle.three_point":"3-point rectangle: click two points of one edge, then the width",
"sketch.hint.rectangle.two_point":"Rectangle: click two opposite corners",
"sketch.hint.slot":"Slot: click both ends, then the width",
"sketch.hint.spline3d":"3D Spline: click fit points in 3D; right-click or Esc to finish",
"sketch.hint.trim":"Trim: click the piece of a curve to remove, or drag across the pieces to remove",
"sketch.make_selection":"Convert the selection to {linetype}",
"sketch.open_ends":"Open {count}",
"sketch.status_conflict":"constraints conflict",
@@ -3995,11 +4261,20 @@
"the section's profiles must be in one sketch":"the section's profiles must be in one sketch",
"the two origins are on the same component":"the two origins are on the same component",
"thread.automatic_size":"Automatic size",
"thread.chamfer_depth_needed":"required for this form",
"thread.designation":"Designation",
"thread.direction":"Thread direction",
"thread.drill_range":"The tap maker's drill is {drill} mm. The internal thread's standard minor diameter is {minor} mm. A drill from {low} to {high} mm is accepted.",
"thread.drill_range_custom":"The drill is the major diameter less the pitch, {drill} mm. The internal thread's standard minor diameter is {minor} mm. A drill from {low} to {high} mm is accepted.",
"thread.drill_range_taper":"The tap maker's drill is {drill} mm. The standard's minor diameter where the thread ends is {minor} mm. A drill from {low} to {high} mm is accepted.",
"thread.end_square":"Square",
"thread.fade_short":"1.25 P (ISO 3508)",
"thread.fade_standard":"2.5 P (ISO 3508)",
"thread.fits_the_face":"fits the face, e.g. {example}",
"timeline.delete_after_marker_one":"Delete 1 Feature After History Marker",
"timeline.delete_after_marker_other":"Delete {count} Features After History Marker",
@@ -4251,6 +4526,7 @@
"ui.agent_chat_no_images":"This agent doesn't take pictures",
"ui.agent_chat_no_picture":"There is no picture on the clipboard",
"ui.agent_chat_no_tool_call":"The model didn't use SolidCraft's tools, so the design wasn't changed. Choose a model that supports tool calling; see Local models in the agent chat guide.",
"ui.agent_chat_node_too_old":"Node.js {version} is too old for this agent. Install Node.js 20.10 or newer, then press Refresh.",
"ui.agent_chat_none_found":"No coding agent found. Install one of these, then press Refresh:",
"ui.agent_chat_send_now_tip":"Stop the agent's current step and send this next (Ctrl+Enter)",
"ui.agent_chat_setup_body":"SolidCraft talks to a coding agent installed on this computer. Pick one in Preferences › AI.",
"ui.agent_chat_setup_title":"Set up an assistant",
"ui.agent_chat_side":"Agent chat side",
"ui.agent_chat_side":"Dock the chat",
"ui.agent_chat_signed_in":"signed in",
"ui.agent_chat_state_auth":"Sign-in needed",
"ui.agent_chat_state_busy":"Working…",
@@ -4310,7 +4586,7 @@
"ui.agent_chat_undone":"(undone)",
"ui.agent_chat_view_attached":"View attached",
"ui.agent_chat_waiting":"Waiting for you",
"ui.agent_cursor":"Agent cursor",
"ui.agent_cursor":"Agent pointer",
"ui.agent_cursor_speed":"Agent cursor speed",
"ui.agent_off_thread":"Keep the window responsive while agents run commands",
"ui.agent_off_thread_note":"An agent's slow commands (from the AI panel or an MCP client) compute beside the window: you can keep turning and inspecting the view, and stop one from the chip in the view. Off: each runs on the window's thread and the window waits for it.",
@@ -4356,14 +4632,14 @@
"ui.ai_key_note":"Stored in the system keychain, never in SolidCraft's settings. Leave it empty for a local server.",
"ui.ai_keychain_error":"The system keychain refused: {error}",
"ui.ai_kind":"Kind",
"ui.ai_mode_all":"Allow everything",
"ui.ai_mode_all":"Do everything",
"ui.ai_mode_all_note":"Nothing asks first. Crash reports stay off limits and the folder limits still apply.",
"ui.ai_mode_all_warning":"The agent can save, overwrite, export and replace your design without asking. Use this only with an agent you trust, on designs you have saved.",
"ui.ai_mode_ask":"Ask every time",
"ui.ai_mode_ask":"Ask first",
"ui.ai_mode_ask_note":"Every change to the design, and every file action, waits for your Allow.",
"ui.ai_mode_edits":"Auto-allow model edits",
"ui.ai_mode_edits":"Make edits",
"ui.ai_mode_edits_note":"Modeling commands run without asking; saving, opening, exporting and other file or destructive actions still ask.",
"ui.ai_mode_global":"As set above",
"ui.ai_mode_global":"Same as above",
"ui.ai_model":"Model",
"ui.ai_model_hint":"qwen3:14b",
"ui.ai_modes_scope":"These settings cover SolidCraft's tools. An agent's own tools (its shell, its file edits) follow the agent's own mode, which you pick in the chat panel's header when the agent has modes.",
@@ -4389,7 +4665,7 @@
"ui.ai_save":"Save",
"ui.ai_settings":"AI settings…",
"ui.ai_show_features":"Show AI features",
"ui.ai_show_features_note":"The agent chat: a panel where a coding agent you already use, or a model endpoint you choose, works on the open design. Off: no AI button, shortcut, menu entry or panel, and nothing is looked for or started.",
"ui.ai_show_features_note":"Off hides the Assistant everywhere and starts nothing. Everything below dims.\n\nThe agent chat: a panel where a coding agent you already use, or a model endpoint you choose, works on the open design. Off: no AI button, shortcut, menu entry or panel, and nothing is looked for or started.",
"ui.ai_switch_tip":"Change the agent for this conversation",
"ui.ai_test":"Test",
"ui.ai_test_acp_ok":"Answers: {agent}",
@@ -4423,7 +4699,7 @@
"ui.ai_tool_sum_then":"{first}, then {next}",
"ui.ai_tool_unfold":"Click to show what it returned",
"ui.ai_tool_waiting":"waiting",
"ui.ai_toolbar_button":"Show Assistant button in application bar",
"ui.ai_toolbar_button":"Assistant button in the application bar",
"ui.ai_toolbar_button_note":"The Assistant button in the application bar. Ctrl+Shift+A and the View menu still open the panel.",
"ui.ai_undo_tip":"Undo everything the agent changed for this message, as one step",
"ui.ai_url_hint":"https://example.com/v1",
@@ -4470,6 +4746,8 @@
"ui.centerline":"Centerline",
"ui.chain":"Chain",
"ui.chamfer":"Chamfer",
"ui.chamfer_angle":"Chamfer Angle",
"ui.chamfer_depth":"Chamfer Depth",
"ui.chamfer_type":"Chamfer Type",
"ui.change_workspace":"Change workspace",
"ui.circle":"Circle",
@@ -4500,6 +4778,10 @@
"ui.colour_vision_sample":"Sample",
"ui.colour_vision_tritan":"Tritan",
"ui.colour_vision_tritan_tip":"For a weak or missing blue sense",
"ui.comb_length":"Comb length",
"ui.comb_length_tip":"How long the teeth are: a multiple of the automatic length, which makes the longest tooth a fifth of the size of the curves shown.",
"ui.comb_teeth":"Teeth",
"ui.comb_teeth_tip":"How many teeth each comb has, evenly spaced along the curve. More teeth show more detail of how the curvature changes.",
"ui.combine":"Combine",
"ui.coming_later":"coming later",
"ui.command_done":"{command} done",
@@ -4524,11 +4806,24 @@
"ui.construction.ribbon_label":"X-Lines",
"ui.construction.side_hint":"Construction line: click the side the line runs towards; right-click to restart",
"ui.delete_select_first":"Select what to delete first: features, bodies, components or sketch geometry",
"ui.dependents_select_first":"Select what to list the dependents of first",
"ui.depth":"Depth",
"ui.design":"Design",
"ui.design_properties.author":"Author",
@@ -4646,8 +4942,10 @@
"ui.edit_sketch_empty":"No sketches to edit",
"ui.ellipse":"Ellipse",
"ui.emboss_wrap_note":"Orthogonal line profiles tangent to one supported cylinder wrap automatically. Pick a wall to choose a target.",
"ui.end":"End",
"ui.end_radius":"End Radius",
"ui.end_scale":"End Scale",
"ui.ends":"Ends",
"ui.entities":"Entities",
"ui.equal":"Equal",
"ui.equation_end":"End",
@@ -4667,19 +4965,52 @@
"ui.export_ellipsis_keymap":"Export…",
"ui.export_keymap_tip":"Keys, S box favorites and the toolbar, as a file",
"ui.extend":"Extend",
"ui.extent":"Extent",
"ui.extent_type":"Extent Type",
"ui.extract_component":"Extract to File…",
"ui.extract_design_changed":"The design changed while choosing a file. Start Extract to File again.",
"ui.extract_done":"The component is now its own design, linked here.",
"ui.extrude":"Extrude",
"ui.extrude_auto_to_object":"Extrude to a picked target",
"ui.extrude_auto_to_object_tip":"In Extrude, with a profile picked, picking a face, vertex or parallel plane off its plane switches the extent to To Object",
"ui.extrude_auto_to_object_tip":"A face, vertex or parallel plane switches the extent to To Object.",
"ui.factor":"Factor",
"ui.fade":"Fade",
"ui.fade_length":"Fade Length",
"ui.feature_history":"Feature history",
"ui.feature_options":"Feature Options",
"ui.features":"Features",
"ui.file":"File",
"ui.fillet":"Fillet",
"ui.fillet_corner_ball":"Ball",
"ui.fillet_corner_ball_tip":"A piece of the rolling ball's sphere, tangent (G1) to each round.",
"ui.fillet_corner_curvature_tip":"Curvature (G2): a smooth patch. The corner is set back along each edge by the Setback ({factor} × the radius unless you type one) and filled with a patch, so reflections run through it without a kink.",
"ui.fillet_corner_needs_constant":"Smooth patch corners (G2) need Constant radius and Exact fit.",
"ui.fillet_corner_patch":"Smooth patch",
"ui.fillet_corner_patch_tip":"Curvature-continuous (G2): the corner is set back along each edge and filled with a patch, so reflections run through it without a kink.",
"ui.fillet_corner_tangent_tip":"Tangent (G1): a rolling-ball corner, a piece of the rolling ball's sphere tangent to each round.",
"ui.fillet_error_corner":"The smooth corner could not be built here. Try another Setback, or Tangent corners.",
"ui.fillet_error_failed":"This fillet could not be built on these edges. Try another radius, or round fewer edges at once.",
"ui.fillet_error_setback_short":"The setback is too short for this corner's patch: it builds from {least} on. Try a longer Setback.",
"ui.fillet_error_too_large":"The radius is too large for the faces beside these edges. Try a smaller radius, or set Face limits to Largest radius.",
"ui.fillet_fit":"Face limits",
"ui.fillet_fit_exact":"Exact radius",
"ui.fillet_fit_needs_constant":"Radius fit needs Constant radius.",
"ui.fillet_fit_reduce":"Largest radius",
"ui.fillet_fit_taper":"Narrowed radius",
"ui.fillet_fit_tip":"When the radius is larger than the faces beside an edge allow.\nExact radius: the radius as given, or nothing rounded and a message saying why.\nLargest radius: every edge rounded with the largest radius that fits.\nNarrowed radius: the radius kept, the round narrowed only where the faces run out.",
"ui.fillet_options_tip":"Tangent chain: also round the edges that continue smoothly from the picked ones.\nPreview: show the result in the view while you edit.",
"ui.fillet_setback":"Setback",
"ui.fillet_setback_hint":"{factor} × radius",
"ui.fillet_setback_least":"More than {least}",
"ui.fillet_setback_tip":"Where the smooth corner patch starts: how far along each edge from the corner. The default is {factor} × the radius. It must be more than the least setback, where the rounds meet without one: the radius where the faces are square to each other.",
"ui.fillet_smooth_radius":"Smooth radius change",
"ui.fillet_turn":"Turns",
"ui.fillet_turn_mitre":"Mitre",
"ui.fillet_turn_swept":"Swept",
"ui.fillet_turn_tip":"Where two rounds turn round a sharp corner edge between them, such as the rounds along a boss's base at its upright edges.\nMitre: the rounds run on until they meet in a mitre.\nSwept: the rounds stop at the corner edge and turn round it, the corner a torus tangent to both. Only for rounds of one radius round a straight, convex corner edge.",
"ui.fillet_type_choices_tip":"Constant radius: one radius all along the edge.\nChord length: the width across the round stays the same, whatever angle the faces meet at.\nVariable radius: a radius at each end, and more along the edge if you add them.\nCurvature continuous: a section without a kink in reflections where it meets flat faces (G2).\nSpline: the radius along the edge follows control radii you set.",
"ui.fillet_type_tip":"The section across the edge. Curvature continuous: a curvature-continuous (G2) section between planar faces, so reflections run from the faces into the round without a kink.",
"ui.filter_commands_or_keys":"Filter commands or keys",
"ui.hide_origin_by_default":"Hide origin by default",
"ui.hide_origin_by_default":"Hide the Origin folder in new designs",
"ui.hide_origin_note":"New designs start with the Origin folder hidden. A design keeps its own Origin setting once you show or hide it.",
"ui.history_back":"Go back one step",
"ui.history_below_browser":"Below browser",
@@ -4829,6 +5161,7 @@
"ui.inspect":"Inspect",
"ui.instances":"Instances",
"ui.intersect":"Intersect",
"ui.iso_4753":"ISO 4753",
"ui.isolate":"Isolate",
"ui.join":"Join",
"ui.joint_play":"▶ Play",
@@ -4931,6 +5264,7 @@
"ui.part_size_needs_a_part":"Select an inserted standard part (a screw, nut, washer or pin) to change its size. To make a body larger or smaller, use Scale.",
"ui.part_size_shared":"Rebuilds the part, replacing any added features. All occurrences of this component update.",
"ui.paste":"Paste",
"ui.patch_continuity_corner_tip":"The patch meets the faces round it at the chosen continuity along each side. At a corner where those faces meet each other with different curvatures, it stays tangent (G1) there.",
"ui.path":"Path",
"ui.pattern_object_type_tip":"Bodies: solid shapes, picked in the view or the Browser; each is copied whole.\nFeatures: steps of the History, such as an extrude or a hole, picked in the History or on a face they made; the step is repeated.\nA sketch is neither: repeat its curves with the sketch's own Pattern or Mirror, or extrude it first.",
"ui.pattern_on_path":"Pattern on Path",
@@ -4947,7 +5281,7 @@
"ui.pitch":"Pitch",
"ui.placement":"Placement",
"ui.placement_handles":"Placement handles",
"ui.placement_handles_tip":"Handles on the preview of a Rest, Boss or Snap Fit: drag the marker to move it across the model, turn it by its ring",
"ui.placement_handles_tip":"A marker to drag the feature across the model and a ring to turn it.",
"ui.plane":"Plane",
"ui.plane_at_angle":"Plane at Angle",
"ui.plugins":"Plugins",
@@ -5031,6 +5365,8 @@
"ui.repeat_nothing":"Nothing to repeat yet: start a tool or dialog first.",
"ui.replace_with_link_done":"The copies are now placements of the linked design.",
"ui.report_a_bug":"Report a bug",
"ui.report_characters_left_one":"{count} character left",
"ui.reset_the_settings_on_this_page":"Reset the settings on this page",
@@ -5145,8 +5481,8 @@
"ui.start":"Start",
"ui.start_over":"Start over",
"ui.start_page":"Start page",
"ui.step_values":"Step values with the arrow keys and the wheel",
"ui.step_values_tip":"In a value field you are typing in, Up/Down change a plain number by 1 (Shift: 10, Alt: 0.1), and so does the mouse wheel over the field. Expressions are left as typed.",
"ui.step_values":"Step values with arrows and wheel",
"ui.step_values_tip":"Up/Down and the wheel over a value field change its number.",
"ui.stitch_tolerance_hint":"tight",
"ui.stretch":"Stretch",
"ui.supersampling":"Supersampling (SSAA)",
@@ -5315,6 +5651,14 @@
"values must be numbers or expressions":"values must be numbers or expressions",
"view.auto_ortho_faces":"Perspective while orbiting, ortho on faces",
"view.render_inspector":"Render Inspector",
"view_gizmo.arrows":"Rotation arrows",
"view_gizmo.home":"Home button",
"view_gizmo.no_such_body":"This design has no body of that name.",
"view_gizmo.note":"Pick a body in the view. It is kept with your preferences and settings profiles, and shown in every design. Click one of its faces to look straight at it.",
"view_gizmo.texture":"Texture",
"view_gizmo.themed":"Themed",
"view_gizmo.too_detailed":"Too detailed for the view navigator (over 10,000 triangles)",
"view_gizmo.too_thin":"Too long and thin for the view navigator: its thinnest side must be at least a fifth of its longest",
"web.files.insert_drawings_hint":"CAD files, meshes, DXF or SVG into the open design",
"web.files.insert_stored_drawings_hint":"Into the open design (CAD files, meshes, DXF, SVG)",
"Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).":"Sélectionner un autre élément: maintenir le bouton gauche immobile sur le modèle (ou clic droit › Sélectionner un autre…) pour lister tout ce qui se trouve sous le curseur; cliquer de nouveau au même endroit pour sélectionner l'élément suivant. Double-cliquer avec le bouton du milieu pour revenir à l'accueil (Préférences › Navigation).",
"config.rule_parameter_columns":"Seuls les paramètres ayant une colonne dans la table sont listés. Ajouter une colonne avec Ajouter une colonne (+) pour l'utiliser ici.",
"config.rule_suppression_columns":"Seules les fonctions ayant une colonne Désactiver dans la table sont listées. Ajouter une colonne avec Ajouter une colonne (+) pour la piloter ici.",
"contact.components_count":"{count} composants",
"contact.enabled_label":"activé",
"coupling.gear_1":"Engrenage 1",
@@ -1345,7 +1370,11 @@
"dialog.pattern_sketch_not_object":"Choisissez des corps ou des fonctions : une esquisse n'est ni l'un ni l'autre. Répétez ses courbes avec la Répétition ou la Symétrie de l'esquisse, ou extrudez-la d'abord.",
"dialog.selection_guidance":"Sélectionner une entrée pour la modifier. Cliquer sur un objet sélectionné pour le retirer; Ctrl/Cmd-clic le bascule aussi. Vérifier l'aperçu, puis appuyer sur OK.",
"dialog.selection_midpoint":"Point milieu · {id}",
"dialog.selection_step":"{step} sur {total}: sélectionner {input}",
"dialog.step":"Étape",
"document.changed_on_disk":"{name} a été modifié sur le disque",
@@ -1360,6 +1389,7 @@
"document.read_only_save":"Cette conception a été ouverte en lecture seule: enregistrez-la dans un nouveau fichier",
"document.save_changes":"Enregistrer les modifications de {name}?",
"document.save_copy":"Enregistrer une copie…",
"document.tab_unsaved_changes":"Modifications non enregistrées",
"document.unsaved_changes":"{name} contient des modifications non enregistrées. Si vous n'enregistrez pas, elles seront perdues.",
"drive.rigid":"{joint} est une liaison rigide: elle maintient ses pièces immobiles, il n'y a donc rien à piloter. Pour les laisser bouger, changer son type dans Modifier la liaison: Revolute pour tourner, Slider pour coulisser, Cylindrical pour les deux.",
"drive.stopped_by_contact":"Arrêté à {value}: {a} traverserait {b}",
@@ -1428,6 +1458,7 @@
"help.construct.axis.two_points":"Crée un axe de construction passant par deux points, sommets ou points d'esquisse. À utiliser pour un axe qui relie deux positions connues.",
"help.construct.plane.along_path":"Crée un plan de construction perpendiculaire à une arête ou une courbe, à une position choisie le long de celle-ci. À utiliser pour esquisser le profil d'un balayage ou une coupe d'une trajectoire.",
"help.construct.plane.at_angle":"Crée un plan de construction tourné d'un angle par rapport à un plan ou une face, autour d'un axe ou d'une arête. À utiliser pour des esquisses inclinées, par exemple une équerre à angle.",
"help.construct.plane.axis_point":"Crée un plan de construction contenant un axe et un point situé hors de cet axe. Sélectionner une origine ou un axe de construction, une arête rectiligne ou une ligne d'esquisse, puis un sommet, un point d'esquisse ou un point de construction. Un point situé sur l'axe ne définit pas un plan unique.",
"help.construct.plane.midplane":"Crée un plan de construction à mi-distance entre deux plans ou faces planes, ou bissecteur lorsqu'ils se rencontrent en formant un angle. À utiliser comme plan de symétrie.",
"help.construct.plane.offset":"Crée un plan de construction parallèle à un plan ou une face plane, à une distance donnée ou passant par un point. À utiliser pour esquisser à une hauteur précise au-dessus d'une face.",
"help.construct.plane.perpendicular":"Crée un plan de construction qui contient une droite ou une arête et qui est perpendiculaire à un plan ou une face. À utiliser pour esquisser à la verticale sur un modèle, le long d'une arête.",
@@ -1804,6 +1835,8 @@
"joint_move.blocked_hint":"Vérifiez le type de liaison (par exemple rigide), la fixation de la pièce, les limites de la liaison et les valeurs pilotées par des paramètres.",
"joint_move.blocked_title":"Impossible de déplacer cette pièce",
"joint_move.coarse":"Pas de rotation près de l’axe (°)",
"joint_move.conflict":"Une liaison de cette pièce est en conflit avec les autres: {joint}.",
"joint_move.conflict_hint":"Modifier, désactiver ou supprimer la liaison en conflit pour que les autres liaisons puissent placer la pièce.",
"joint_move.distance":"Distance depuis le départ",
"joint_move.done":"Terminé",
"joint_move.fine":"Pas de rotation loin de l’axe (°)",
@@ -1903,6 +1936,8 @@
"motion.track_name":"Piste {number}",
"nav.alias.help":"Maj+Alt+glisser gauche fait orbiter, Maj+Alt+milieu fait un panoramique, Maj+Alt+droit zoome; glisser avec le milieu fait aussi un panoramique et glisser avec le droit fait orbiter",
"nav.blender.help":"Glisser avec le milieu fait orbiter, Maj+milieu fait un panoramique, Ctrl+milieu zoome; glisser avec le droit ne touche pas la caméra",
"nav.creo.help":"Glisser avec le milieu fait orbiter, Maj+milieu fait un panoramique, Ctrl+glisser avec le milieu zoome verticalement (vers le bas pour zoomer); la molette zoome",
"nav.creo.label":"Creo",
"nav.free_orbit.help":"La souris et la souris 3D tournent en passant par les deux pôles et conservent le roulis. L'alignement des axes avec Maj est désactivé.",
"nav.free_orbit.label":"Orbite libre",
"nav.free_orbit.snap_help":"La souris et la souris 3D tournent en passant par les deux pôles et conservent le roulis. Maintenir Maj pendant un glissement d'orbite pour aligner la direction de vue et le roulis.",
@@ -1912,6 +1947,7 @@
"nav.hfss.help":"Alt+glisser gauche fait un panoramique, Maj+Alt+gauche zoome, Ctrl+glisser gauche sur un espace vide fait orbiter",
"nav.inventor.help":"Glisser avec le milieu fait un panoramique, Maj+milieu fait orbiter, Ctrl+milieu zoome, glisser avec le droit fait orbiter",
"nav.maya.help":"Alt+glisser gauche fait orbiter, Alt+milieu fait un panoramique, Alt+droit zoome ; glisser avec le milieu fait aussi un panoramique",
"nav.nx.help":"Glisser avec le milieu fait orbiter, Maj+milieu fait un panoramique (milieu + droit dans NX), Ctrl+milieu zoome (milieu + gauche dans NX); glisser avec le droit ne touche pas la caméra",
"nav.openscad.help":"Glisser avec le gauche dans le vide fait orbiter, Maj+glisser gauche sélectionne par rectangle, glisser la géométrie d'esquisse la modifie; glisser avec le droit ou le milieu fait un panoramique, Maj+droit ou Maj+milieu zoome",
"nav.perspective.sketch":"La modification d'une esquisse utilise la vue orthographique. Terminer l'esquisse pour passer en perspective.",
"nav.right_drag_orbits.help":"Désactivé : glisser avec le droit ne touche pas la caméra et le bouton droit ouvre seulement le menu contextuel. Choisir l'affectation des boutons de la souris SolidWorks le désactive.",
@@ -2130,6 +2166,8 @@
"prefs.button_left":"Glisser gauche",
"prefs.button_middle":"Glisser milieu",
"prefs.button_right":"Glisser droit",
"prefs.carousel_next":"Suivant",
"prefs.carousel_previous":"Précédent",
"prefs.choose_font":"Choisir un fichier de police…",
"prefs.click":"Clic",
"prefs.contact_shading":"Ombrage de contact doux",
@@ -2142,6 +2180,10 @@
"prefs.ctrl_cmd":"Ctrl / Cmd",
"prefs.curved_surfaces":"Surfaces courbes",
"prefs.curves":"Surfaces courbes",
"prefs.cut_preview_tint":"Afficher en rouge la matière retirée",
"prefs.cut_preview_tint_help":"Un aperçu remplit la matière qu'une fonction retire, et la forme qu'elle remplace, d'un fantôme rouge translucide. Désactivée, ces remplissages sont entièrement transparents et seuls leurs contours sont tracés.",
"prefs.dark_parts_shading":"Conserver la forme des pièces sombres",
"prefs.dark_parts_shading_help":"Ombrer la vue en lumière linéaire avec un léger éclairage de ciel, pour que les faces sombres gardent un dégradé au lieu de devenir noires",
"prefs.dead_zone_note":"La bande hachurée est la zone morte: les mouvements à l'intérieur sont ignorés.",
"prefs.default":"par défaut",
"prefs.design":"Valeurs par défaut des conceptions",
@@ -2156,6 +2198,8 @@
"prefs.edges":"Arêtes et ombrage",
"prefs.extend":"Étendre",
"prefs.extra_navigation":"Ctrl+glisser gauche dans le vide fait orbiter; maintenir Espace pour un panoramique.",
"prefs.extrude_view_isometric":"Passer la vue en isométrique à l'ouverture de l'extrusion",
"prefs.extrude_view_return":"Revenir à la vue précédente à la fermeture de l'extrusion",
"prefs.follows_os":"Suit le système",
"prefs.font":"Police",
"prefs.font_fallback":"Les caractères absents de la police choisie utilisent la police intégrée, pour qu'aucun libellé n'affiche de case vide.",
@@ -2171,6 +2215,7 @@
"prefs.graphics_card_auto":"Automatique",
"prefs.graphics_card_missing":"La carte graphique enregistrée n'est pas disponible; Automatique est utilisé.",
"prefs.graphics_card_restart":"Prend effet après le redémarrage de SolidCraft. WGPU_ADAPTER_NAME prévaut sur ce choix.",
"prefs.graphics_card_unused":"La carte graphique enregistrée n'a pas été utilisée pour cette fenêtre; la carte utilisée est indiquée dans Aide › À propos et dans la barre d'état. Essayer Automatique, ou définir WGPU_ADAPTER_NAME avec une partie unique du nom de la carte.",
"prefs.graphics_note":"Compromis entre vitesse et fluidité. Chaque choix montre son effet sur un exemple.",
"prefs.graphics_presets_note":"Les préréglages définissent ensemble les choix ci-dessous.",
"prefs.hide_constraint_glyphs_zoomed_out":"Masquer les symboles de contraintes en cas de zoom arrière",
@@ -2185,6 +2230,8 @@
"prefs.history_sketches_note":"Avec Esquisses réglé sur Sous leur fonction, l'historique de gauche liste chaque esquisse un niveau en retrait, sous la première fonction construite à partir d'elle, dès qu'il est assez large pour les noms. La chronologie en bas garde toujours l'ordre de création.",
"prefs.history_sketches_under_feature":"Sous leur fonction",
"prefs.hold_stop_snapping":"Maintenir pour désactiver l'accrochage",
"prefs.home_fit_size":"Taille de Accueil et Cadrer",
"prefs.home_fit_size_note":"Part de la vue que remplit le modèle quand Accueil, Cadrer, l'ouverture d'une conception ou une vue du repère de navigation recadre la vue, que le réglage ci-dessous soit activé ou non. 100 %: remplit la vue entre les panneaux, la boussole et la barre de navigation.",
"prefs.icons_only":"Icônes seules",
"prefs.imported_file":"Fichier importé",
"prefs.in_browser":"Dans le navigateur",
@@ -2193,15 +2240,22 @@
"prefs.interface_language":"Langue de l'interface",
"prefs.interface_note":"L'apparence de SolidCraft et la place de ses éléments.",
"prefs.interval_minutes":"{n} min",
"prefs.invert_curved_roll_arrows":"Inverser les flèches courbes de roulis",
"prefs.invert_curved_roll_arrows_note":"Les deux flèches courbes au coin du cube font rouler la vue dans le plan de l'écran. Activé : la flèche horaire fait rouler dans le sens antihoraire et la flèche antihoraire dans le sens horaire. Désactivé : chaque flèche fait rouler la vue dans le sens de sa courbure.",
"prefs.invert_navigator_arrows":"Inverser les flèches de rotation du cube de vue",
"prefs.invert_navigator_arrows_note":"Les flèches autour du cube font orbiter la caméra dans le sens où elles pointent, comme dans Fusion et Inventor: la flèche de gauche pointe vers la droite et fait pivoter la caméra vers la droite. Désactivé : une flèche fait tourner le cube vers le côté où elle se trouve, donc la flèche de gauche fait pivoter la caméra vers la gauche. Les flèches courbes de roulis ne sont pas concernées.",
"prefs.keep_work_on_tab_switch":"Garder dialogues et outils ouverts en changeant de conception",
"prefs.keep_work_on_tab_switch_note":"Chaque onglet de conception garde son dialogue ou son outil ouvert, avec ce que vous y avez sélectionné et saisi, ainsi que son onglet de barre d'outils. Vous les retrouvez en revenant à la conception. Désactivé : changer de conception les annule et affiche l'onglet Modèle.",
"prefs.labels":"Libellés",
"prefs.language_system":"Système",
"prefs.layout":"Disposition",
"prefs.layout_note":"Compacte: ancre les panneaux aux bords de la fenêtre. La transparence du navigateur est disponible en mode Flottante. Changez le côté de l'assistant dans la page Assistant.",
"prefs.left":"Gauche",
"prefs.left_click":"Clic gauche",
"prefs.line_drag_draws_one":"Appuyer et glisser trace une seule ligne",
"prefs.line_drag_draws_one_note":"Dans l'outil Ligne, appuyer, faire glisser puis relâcher trace une seule ligne, du point d'appui au point de relâchement, et le tracé s'arrête là. Les clics tracent toujours une chaîne. Désactivé : un glissement place un point là où il est relâché, comme un clic.",
"prefs.line_hover_tangent_arc":"S'arrêter sur le dernier point d'une ligne pour passer à un arc tangent",
"prefs.line_hover_tangent_arc_note":"Dans l'outil Ligne, une fois un segment tracé, éloigner le pointeur du dernier point de la chaîne, revenir et le maintenir immobile dessus: le clic suivant termine un arc tangent, et le même geste revient aux lignes. Désactivé : s'arrêter là ne fait rien.",
"prefs.linked_designs":"Conceptions liées",
"prefs.live_input":"Saisie en direct",
"prefs.live_preview":"Aperçu en direct",
@@ -2225,6 +2279,8 @@
"prefs.mouse_mapping":"Affectation des boutons de la souris",
"prefs.navigation":"Navigation",
"prefs.navigation_note":"Comment la souris, le pavé tactile et la souris 3D déplacent la vue.",
"prefs.navigator_fit":"Cadrer le modèle après un changement de vue du repère de navigation",
"prefs.navigator_fit_note":"Une face, un coin ou une flèche du cube de vue, ou un axe du gizmo, regarde aussi le milieu du modèle depuis la distance unique qui le cadre sous tous les côtés (sa sphère englobante). Accueil utilise le même zoom et le même centre tant que cette option est activée, de sorte que les vues choisies ensuite ne font que tourner. Désactivé : la vue tourne sur place, en gardant sa cible et son zoom.",
"prefs.network_host_remove":"Retirer",
"prefs.network_locations":"Autoriser les emplacements réseau dans les conceptions",
"prefs.network_locations_note":"Désactivé : les fichiers liés d'une conception situés sur un autre ordinateur (\\\\server\\share) ne sont ouverts que depuis les serveurs listés ici, ou après en avoir autorisé un sur demande.",
@@ -2245,6 +2301,8 @@
"prefs.placement":"Placement",
"prefs.prefer_free_sketch_points":"Privilégier les points d'esquisse déplaçables quand des points se superposent",
"prefs.preview_choices":"Aperçu de vos choix",
"prefs.preview_tint_new_faces":"Teinter la nouvelle surface dans un aperçu",
"prefs.preview_tint_new_faces_help":"L'aperçu d'une fonction qui modifie un corps peut tracer la surface qu'elle ajoute dans la couleur d'aperçu. Désactivée, le corps est tracé tel quel.",
"prefs.print_face_highlight":"Mise en évidence de la face d’impression",
"prefs.print_face_highlight_tip":"Intensité de la teinte et du contour de la face d’impression d’un corps dans la vue. 0 % n’affiche aucune mise en évidence.",
"prefs.profile_active":"Profil actif",
@@ -2273,6 +2331,8 @@
"prefs.render_previous_geometry_budget":"Utiliser l'ancien budget de géométrie de l'aperçu Rendu",
"prefs.render_previous_geometry_budget_help":"Rétablir l'ancienne limite fixe de géométrie (512 Mio sur un ordinateur 64 bits, 128 Mio ailleurs) au lieu du budget basé sur l'appareil.",
"prefs.reports_saved":"Enregistrés: {n}",
"prefs.ribbon_click_ends_tool":"Cliquer sur le bouton de l'outil en cours le termine",
"prefs.ribbon_click_ends_tool_note":"Un clic sur le bouton allumé du ruban de l'outil d'esquisse en cours termine l'outil, et les clics dans la vue sélectionnent de nouveau. Désactivé : le clic relance l'outil.",
"prefs.ribbon_reveal":"Montrer les résultats de recherche dans le ruban",
"prefs.ribbon_reveal_note":"Survoler un résultat dans Rechercher des commandes montre où se trouve la commande dans le ruban: son onglet, son bouton ou sa ligne dans le menu déroulant d'un panneau. Une commande lancée depuis la recherche y clignote, et une commande en cours issue d'un menu déroulant signale son panneau.",
"prefs.right_click":"Clic droit",
@@ -2302,6 +2362,8 @@
"prefs.sketch_exit_view.previous":"Revenir à la vue précédente",
"prefs.sketch_exit_view.unless_rotated":"Revenir, sauf si la vue a été tournée",
"prefs.sketch_exit_view_note":"Où va la vue après Terminer l'esquisse, Annuler ou un double Échap.",
"prefs.sketch_face_activates_part":"Esquisser sur la face d'une pièce active cette pièce",
"prefs.sketch_face_activates_part_note":"Une esquisse commencée sur une face du corps d'un autre composant active d'abord ce composant, de sorte que l'esquisse lui appartient et reste avec cette pièce dans le navigateur. La pièce reste ensuite active. Désactivé : l'esquisse appartient au composant actif.",
"prefs.sketch_open_look_at":"Se placer face à l'esquisse à son ouverture",
"prefs.sketch_open_look_at_note":"Désactivé : créer ou modifier une esquisse laisse la vue telle quelle. Vue normale place la vue face à l'esquisse quand vous le souhaitez.",
"prefs.sketch_recent_snap":"Accrocher automatiquement aux centres et points milieux récents",
@@ -2333,7 +2395,24 @@
"prefs.status_error":"Erreur",
"prefs.status_selected":"Sélectionné",
"prefs.status_warning":"Avertissement",
"prefs.structure.appearance":"Apparence",
"prefs.structure.appearance_note":"Couleurs, texte et accessibilité.",
"prefs.structure.in_profile":"Dans le profil",
"prefs.structure.layout":"Disposition",
"prefs.structure.layout_note":"Où se placent les parties de la fenêtre.",
"prefs.structure.look":"Aspect",
"prefs.structure.measure_pointer":"Mesure et pointeur",
"prefs.structure.mouse3d":"Souris 3D",
"prefs.structure.mouse3d_note":"SpaceMouse et SpaceNavigator.",
"prefs.structure.navigation_note":"Souris et pavé tactile. La souris 3D a sa propre page.",
"prefs.structure.profile":"Profil",
"prefs.structure.profile_edited":"Modifié depuis l'enregistrement",
"prefs.structure.profile_hover":"Enregistré dans les profils de réglages",
"prefs.structure.scale_percent":"{percent} %",
"prefs.structure.sketch":"Esquisse",
"prefs.structure.tools":"Outils",
"prefs.structure.tools_note":"Comportement des outils de modélisation.",
"prefs.structure.work":"Travail",
"prefs.supersampling_brief":"Dessine la vue en plus grand puis la réduit par filtrage: très net, mais plus lourd.",
"render.base_opaque_only":"Cet éditeur conserve la sémantique des corps opaques. Utilisez les commandes de verre dédiées pour la transmission optique.",
"render.batch_all_shots":"Toutes les prises de vue ({count})",
"render.batch_empty":"Enregistrer une prise de vue avant de rendre toutes les prises de vue.",
"render.batch_limit":"Le rendu de toutes les prises de vue est limité à 32 prises de vue.",
"render.batch_status":"{running} en cours · {waiting} en attente",
"render.bloom_enable":"Halo lumineux (bloom) à l'affichage",
"render.bloom_help":"Lueur créative appliquée à la sortie seulement, à partir des hautes lumières linéaires positives, étalée par trois passes de flou normalisées. Le rayon est en pixels de sortie. Ajoutée en lumière d'affichage linéaire avant sRVB; ce n'est ni un effet d'objectif, ni un effet volumétrique, ni une amélioration de la convergence. L'EXR brut est inchangé.",
"render.bloom_opaque":"Le halo lumineux nécessite une sortie opaque. Un PNG transparent est refusé, pas aplati en silence.",
@@ -2631,6 +2714,13 @@
"render.choose_look":"Choisissez d'abord un aspect dans Apparences",
"render.chromatic_offset":"Décalage chromatique des bords",
"render.clear_stage":"Supprimer le décor enregistré",
"render.compare_divider":"Séparateur de comparaison",
"render.compare_live":"En direct",
"render.compare_live_preview":"Aperçu en direct",
"render.compare_render":"Rendu {number}",
"render.compare_side":"Rendu {number} · {shot}",
"render.compare_summary":"{shot} · {width} × {height} · PNG · {seconds} s · {renderer} · capturé à la révision {revision}",
"render.compare_swap":"Inverser",
"render.copy_request":"Copier le JSON",
"render.cpu_aa_help":"Échantillons spatiaux: plus d'échantillons améliorent les bords et allongent le rendu.",
"render.cpu_area_add":"Ajouter une lumière CPU rectangulaire",
@@ -3380,6 +3470,10 @@
"render.result_retained":"Affichage de la dernière image terminée; un rendu plus récent ne l'a pas remplacée.",
"ui.agent_chat_custom_hint":"Tout programme qui parle l'Agent Client Protocol sur stdin et stdout. Aucun shell ne le lance.",
"ui.agent_chat_denied":"Refusé",
"ui.agent_chat_deny":"Refuser",
@@ -4096,8 +4190,16 @@
"ui.agent_chat_mode_all":"Tout",
"ui.agent_chat_mode_ask":"Demander",
"ui.agent_chat_mode_edits":"Édition",
"ui.agent_chat_model_custom":"Utiliser le modèle personnalisé : {model}",
"ui.agent_chat_model_no_tools":"{model} ne peut pas utiliser les outils de SolidCraft: il peut seulement discuter. Choisissez un modèle qui prend en charge les outils.",
"ui.agent_chat_model_rejected":"L'agent n'a pas accepté {model}: {error}",
"ui.agent_chat_model_search":"Rechercher des modèles…",
"ui.agent_chat_model_tip":"Le modèle utilisé par l'agent. Votre choix est mémorisé pour cet agent.",
"ui.agent_chat_models_failed":"Impossible de lister les modèles: {error}",
"ui.agent_chat_models_listing":"Liste des modèles en cours…",
"ui.agent_chat_models_none":"Le point d'accès ne liste aucun modèle",
"ui.agent_chat_models_not_a_list":"La réponse n'était pas une liste de modèles",
"ui.agent_chat_new":"Nouveau chat",
"ui.agent_chat_new_confirm":"Démarrer un nouveau chat? Le chat actuel sera effacé.",
"ui.agent_chat_next_picture":"Image suivante",
@@ -4233,6 +4335,9 @@
"ui.ai_permissions":"Autorisations",
"ui.ai_preset":"Préréglage",
"ui.ai_protocol":"Protocole",
"ui.ai_reasoning_effort":"Effort de raisonnement",
"ui.ai_reasoning_effort_field_hint":"vide = valeur par défaut du fournisseur",
"ui.ai_reasoning_effort_hint":"Facultatif. Envoyé au point d'accès sous le nom `reasoning_effort`; les valeurs acceptées varient selon le fournisseur (par exemple `low`, `high` ou `max`). Une valeur saisie ici n'est jamais remplacée par SolidCraft. Laisser vide pour ne rien envoyer et garder la valeur par défaut du fournisseur.",
"ui.ai_remove":"Retirer",
"ui.ai_request_timed_out":"Le modèle a mis plus de {seconds} s. Vous pouvez augmenter le délai d'expiration des requêtes de ce point d'accès dans Préférences › Assistant.",
"ui.ai_request_timeout":"Délai d'expiration des requêtes",
@@ -4368,14 +4473,21 @@
"ui.construction.contact_hint":"Tangente: sélectionnez un cercle/arc ou une spline/conique ouverte, puis le point de contact (courbes libres: extrémités)",
"ui.construction.external_hint":"Tangente: sélectionnez un cercle ou un arc, un point extérieur, puis la solution souhaitée",
"ui.construction.free_hint":"Droite de construction: cliquez sur deux points; clic droit pour recommencer",
"ui.construction.normal_needs_length":"Une ligne infinie est toujours de construction: saisir une longueur pour tracer une ligne normale",
"ui.construction.point_hint":"Droite de construction: cliquez sur le point de passage",
"ui.construction.reference_hint":"Droite de construction: sélectionnez une ligne droite, puis un point; clic droit pour changer la référence",
"ui.construction.ribbon_label":"Lignes aux.",
"ui.construction.side_hint":"Ligne de construction: cliquer du côté vers lequel la ligne s'étend; clic droit pour recommencer",
"ui.context_menu":"Menu contextuel",
"ui.continuity_crease":"Angle vif",
"ui.continuity_curvature":"Courbure",
"ui.continuity_curvature_change":"Variation de courbure",
"ui.continuity_g0":"G0 angle vif",
"ui.continuity_g1":"G1 tangence",
"ui.continuity_g2":"G2 courbure",
"ui.continuity_gap":"Écart",
"ui.continuity_position":"Position",
"ui.continuity_tangent":"Tangence",
"ui.copy":"Copier",
"ui.corner":"Angle",
"ui.corners":"Angles",
@@ -4398,6 +4510,7 @@
"ui.dark":"Sombre",
"ui.default_modelling_orientation":"Orientation de modélisation par défaut",
"ui.delete":"Supprimer",
"ui.delete_select_first":"Sélectionner d'abord ce qu'il faut supprimer: fonctions, corps, composants ou géométrie d'esquisse",
"ui.depth":"Profondeur",
"ui.design":"Conception",
"ui.design_properties.author":"Auteur",
@@ -4490,6 +4603,7 @@
"ui.edit_in_place_saved_elsewhere":"La pièce a été enregistrée dans un autre fichier; l'assemblage reste lié à {name}",
"ui.edit_in_place_wait":"Attendez la fin de ce qui s'exécute dans la conception",
"ui.edit_section_analysis":"Modifier l'analyse de coupe",
"ui.edit_sketch_empty":"Aucune esquisse à modifier",
"ui.ellipse":"Ellipse",
"ui.emboss_wrap_note":"Les profils de lignes orthogonales tangents à un cylindre pris en charge s'enroulent automatiquement. Choisir une paroi pour définir une cible.",
"ui.end_radius":"Rayon final",
@@ -4500,7 +4614,9 @@
"ui.equation_explicit":"Explicite",
"ui.equation_form":"Forme",
"ui.equation_note":"La variable est un simple nombre: sin(t) la prend en radians. Un résultat sans unité est dans l'unité de la conception.",
"ui.equation_note_range":"La variable est une longueur, comme sa plage: la combiner avec des paramètres de longueur, et la diviser par une longueur pour sin(). Un résultat sans unité est dans l'unité de la conception.",
"ui.equation_parametric":"Paramétrique",
"ui.equation_variable_unit":"La variable a l'unité de la plage",
"ui.equation_x_of_t":"x(t)",
"ui.equation_y_of_t":"y(t)",
"ui.equation_y_of_x":"y(x)",
@@ -4632,6 +4748,7 @@
"ui.hideOrigin":"Masquer l'origine",
"ui.hidePlanes":"Masquer les plans",
"ui.hideProfile":"Masquer le profil",
"ui.hide_component_history":"Masquer son historique",
"ui.hide_origin_by_default":"Masquer l'origine par défaut",
"ui.hide_origin_note":"Les nouvelles conceptions démarrent avec le dossier Origine masqué. Une conception garde son propre réglage d'Origine dès que vous l'affichez ou la masquez.",
"ui.history_back":"Reculer d’une étape",
@@ -4639,6 +4756,7 @@
"ui.history_edge_hint":"double-cliquer sur le bord",
"ui.history_first":"Aller au début",
"ui.history_forward":"Avancer d’une étape",
"ui.history_hide_hidden":"Masquer les composants masqués",
"ui.history_hide_names":"Masquer les noms",
"ui.history_last":"Aller à la fin",
"ui.history_marker_tip":"Marqueur d'historique: faire glisser pour ramener le modèle en arrière; les nouvelles fonctions s'insèrent ici",
@@ -4648,6 +4766,7 @@
"ui.history_play_button_show":"Afficher le bouton Lire",
"ui.history_play_finish_action":"Terminez l'action en cours avant de lire l'historique",
"ui.history_play_roll_back":"Reculez le marqueur d'historique avant de lire",
"ui.history_show_hidden":"Afficher les composants masqués",
"ui.history_show_names":"Afficher les noms",
"ui.history_sketch_listed_under":"Listé sous {feature}",
"ui.history_title":"Historique",
@@ -4676,12 +4795,14 @@
"ui.joints":"Liaisons",
"ui.keyboard_shortcuts":"Raccourcis clavier",
"ui.language":"Langue",
"ui.lasso_select":"Lasso (faire glisser une boucle libre: prend ce qui est entièrement à l'intérieur)",
"ui.layout_compact":"Compacte",
"ui.layout_floating":"Flottante",
"ui.length":"Longueur",
"ui.length_decimals":"Décimales des longueurs",
"ui.light":"Clair",
"ui.line":"Ligne",
"ui.line_arc_hint":"Arc tangent: cliquer sur l'extrémité de l'arc. S'arrêter de nouveau sur le dernier point pour revenir aux lignes; clic droit ou Échap pour terminer",
"ui.link_copies":"Lier les copies identiques",
"ui.link_copies_keep":"Conserver",
"ui.link_copies_link":"Lier",
@@ -4930,6 +5051,7 @@
"ui.showDimension":"Afficher la cote",
"ui.showOrigin":"Afficher l'origine",
"ui.showPlanes":"Afficher les plans",
"ui.show_component_history":"Afficher son historique",
"ui.show_constraints":"Contraintes",
"ui.show_construction_geometries":"Géométries de construction",
"ui.show_dimensions":"Cotes",
@@ -5046,12 +5168,15 @@
"ui.view_angles":"Angles de vue",
"ui.view_angles_convention":"Degrés autour de l'axe vertical. Lacet 0° = vue de face, 90° = vue de gauche, −90° = vue de droite, 180° = vue arrière; tangage 90° = vue de dessus; un roulis positif fait tourner le modèle dans le sens horaire.",
"ui.view_angles_help":"Affiche le tangage, le lacet et le roulis de la vue en degrés, ainsi que sa projection, sous le gizmo d'orientation. Cliquez sur l'indicateur pour saisir des angles exacts.",
"Move holes by clicking or dragging":"הזזת חורים בלחיצה או בגרירה",
"Move holes by clicking or dragging":"הזזה בלחיצה או בגרירה",
"Move later":"דחייה",
"Move up":"הזזה למעלה",
"Name":"שם",
@@ -496,6 +497,7 @@
"Render Stage":"שלב הרינדור",
"Reopen designs":"פתיחה מחדש של תכנים",
"Reopen the designs that were open when SolidCraft was last closed":"פתיחה מחדש של התכנונים שהיו פתוחים בפעם הקודמת",
"Repair Part":"תיקון חלק",
"Replace existing library file":"החלפת קובץ הספרייה הקיים",
"Report a bug — review a screenshot and open a GitHub draft":"דיווח על באג — בדיקת צילום מסך ופתיחת טיוטה ב־GitHub",
"Report copied. Keep this text to submit on GitHub when you are online.":"הדיווח הועתק. יש לשמור את הטקסט כדי לשלוח אותו ב-GitHub כשהחיבור לאינטרנט יהיה זמין.",
@@ -584,7 +586,7 @@
"Show ghost":"הצגת צללית",
"Show in folder":"הצגה בתיקייה",
"Show the pointer an AI agent moves (#35)":"הצגת הסמן שסוכן הבינה המלאכותית מזיז (#35)",
"Show tool at cursor":"הצגת הכלי ליד הסמן",
"Show tool at cursor":"כלי ליד הסמן",
"Signed axes":"צירים עם סימן",
"Size":"גודל",
"Sketch constraints":"אילוצי סקיצה",
@@ -595,7 +597,7 @@
"Sketch points":"נקודות סקיצה",
"Slider":"הזזה",
"Slot width":"רוחב חריץ",
"Snap to face and edge centres":"הצמדה למרכזי פאות ומקצועות",
"Snap to face and edge centres":"הצמדה למרכזים",
"SolidCraft cannot submit reports directly. Submit on GitHub; no token is needed in the app.":"אין אפשרות לשלוח דיווחים ישירות מתוך SolidCraft. יש לשלוח אותם ב-GitHub; אין צורך באסימון גישה באפליקציה.",
"SolidCraft closed before these designs were saved. Their last autosave can be opened.":"SolidCraft נסגרה לפני שתכנים אלה נשמרו. אפשר לפתוח את השמירה האוטומטית האחרונה שלהם.",
"Sort A to Z":"מיון בסדר עולה",
@@ -738,36 +740,36 @@
"a picked edge's body is gone":"הגוף של המקצוע שנבחר כבר לא קיים",
"add a key for a joint first":"יש להוסיף תחילה מפתח למפרק",
"ai.connected_toast":"SolidCraft זמין עכשיו ב־{clients}. יש להפעיל אותם מחדש כדי להשתמש בו (הגדרות > עוזר).",
"ai.prefs.allow_control":"התרת חיבור לסוכני בינה מלאכותית (ערוץ בקרה / MCP)",
"ai.prefs.allow_control_note":"פותח ערוץ בקרה במחשב זה בלבד (127.0.0.1, פורט 27878 או הפנוי הבא). תוכנה שמתחברת צריכה גם להציג אסימון סודי שרק חשבון המשתמש שלך יכול לקרוא, ונוצר מחדש בכל הפעלה. ייכנס לתוקף בהפעלה הבאה של SolidCraft. כבוי: שום דבר אינו מאזין, אלא אם SolidCraft מופעל עם --control.",
"ai.prefs.connect_apps_note":"בהפעלת SolidCraft הוא מתווסף כשרת MCP ליישומי הבינה המלאכותית שנמצאו במחשב זה (OpenCode, Claude Desktop, Claude Code, Cursor, Codex, Gemini CLI, Copilot CLI, Windsurf, Zed, VS Code), כך שסוכן יכול להשתמש בו בלי שום הגדרה. רק הרשומה solidcraft נוספת או שהנתיב שלה מתעדכן; רשומה ששינית נשארת כפי שהיא, ולפני כן נשמר גיבוי של הקובץ. כבוי: הרשומות שנוספו מוסרות. הפקודה עזרה > חיבור עוזרי בינה מלאכותית… עושה זאת ידנית.",
"ai.prefs.connect_at_start":"התחברות לסוכן האחרון שבו השתמשת בהפעלת SolidCraft",
"ai.prefs.allow_control":"לאפשר לסוכני AI להתחבר",
"ai.prefs.allow_control_note":"ערוץ מקומי (MCP). שום דבר לא יוצא מהמחשב הזה.\n\nפותח ערוץ בקרה במחשב זה בלבד (127.0.0.1, פורט 27878 או הפנוי הבא). תוכנה שמתחברת צריכה גם להציג אסימון סודי שרק חשבון המשתמש שלך יכול לקרוא, ונוצר מחדש בכל הפעלה. ייכנס לתוקף בהפעלה הבאה של SolidCraft. כבוי: שום דבר אינו מאזין, אלא אם SolidCraft מופעל עם --control.",
"ai.prefs.connect_apps":"להוסיף את SolidCraft ליישומי AI",
"ai.prefs.connect_apps_note":"כיבוי מסיר שוב את הרשומות.\n\nבהפעלת SolidCraft הוא מתווסף כשרת MCP ליישומי הבינה המלאכותית שנמצאו במחשב זה (OpenCode, Claude Desktop, Claude Code, Cursor, Codex, Gemini CLI, Copilot CLI, Windsurf, Zed, VS Code), כך שסוכן יכול להשתמש בו בלי שום הגדרה. רק הרשומה solidcraft נוספת או שהנתיב שלה מתעדכן; רשומה ששינית נשארת כפי שהיא, ולפני כן נשמר גיבוי של הקובץ. כבוי: הרשומות שנוספו מוסרות. הפקודה עזרה > חיבור עוזרי בינה מלאכותית… עושה זאת ידנית.",
"ai.prefs.connect_at_start":"לחבר את הסוכן האחרון בהפעלה",
"ai.prefs.connect_at_start_note":"מפעיל ברקע את הסוכן שאליו התחברת לאחרונה (או את סוכן ברירת המחדל) בכל הפעלה של SolidCraft, כך שהוא מוכן לשיחה. לא כש-SolidCraft מופעל עם --control. אם ההתחברות נכשלת, העוזר מציג „ההתחברות נכשלה” ולחצן „ניסיון חוזר”.",
"ai.prefs.follow_camera":"הפניית המצלמה אל סקיצות",
"cmd.layout.workspace.select":"בחירת סביבת עבודה לפריסה",
"cmd.library_apply":"החלת פריט מהספרייה המקומית",
"cmd.library_export":"ייצוא ספריית התכן",
"cmd.library_inspect":"בדיקת הספרייה המקומית",
@@ -1024,6 +1035,21 @@
"cmd.occurrence_move":"הזזת מופע",
"cmd.occurrence_properties":"תכונות פיזיקליות של מופע",
"cmd.occurrence_reparent":"העברה לרכיב",
"cmd.panel.activate":"הפעלת לשונית חלונית",
"cmd.panel.close":"סגירת חלונית",
"cmd.panel.collapse":"כיווץ מקטע חלונית",
"cmd.panel.dismiss":"סגירת תצוגה זמנית של חלונית",
"cmd.panel.float":"הצפת חלונית",
"cmd.panel.focus":"מיקוד חלונית",
"cmd.panel.list":"הצגת רשימת חלוניות",
"cmd.panel.move":"העברת חלונית",
"cmd.panel.native_close":"עיגון מחדש של מקטע חלונית מחלון נפרד",
"cmd.panel.open":"פתיחת חלונית",
"cmd.panel.peek":"הצגה זמנית של חלונית מכווצת",
"cmd.panel.popout":"העברת חלונית לחלון נפרד",
"cmd.panel.reset_pair":"איפוס מפריד חלוניות",
"cmd.panel.resize":"שינוי גודל מקטע חלונית",
"cmd.panel.resize_pair":"הזזת מפריד חלוניות",
"cmd.parameters_add":"הוספת פרמטר משתמש",
"cmd.parameters_change":"שינוי פרמטרים",
"cmd.parameters_comment":"הערה לפרמטר",
@@ -1270,6 +1296,7 @@
"cmd.timeline_stop":"עצירת ציר הזמן",
"cmd.timeline_suppress":"השבתת פיצ'ר",
"cmd.ui.assistant":"הצגה או הסתרה של העוזר",
"cmd.view.navigator":"ניווט תצוגה מותאם אישית",
"cmd.view.render_browser":"דפדפן רינדור",
"cmd.view.render_dock":"הזז את עגינת הרינדור",
"cmd.view.render_focus":"תצוגת מיקוד רינדור",
@@ -1360,6 +1387,7 @@
"crash.unclean_explanation":"זוהה בהפעלה מאוחרת יותר; זמן היציאה המדויק לא נרשם. גם כיבוי של המערכת או עצירה בכפייה עלולים לגרום ליציאה לא תקינה.",
"delete.and_more":"… ועוד {count}",
"diagnostic.empty_boolean_component":"אין גוף להסרה או לחיתוך משותף ברכיב '{component}'; ייתכן שהכלי חופף ל־'{body}' ברכיב '{other}' — יש להפעיל את הרכיב הזה או לבחור את הגוף כיעד",
"diagnostic.reselect_reference":"{feature}: ההפניה `{reference}` כבר אינה קיימת כפי שנבחרה; יש לבחור אותה מחדש",
"dialog.bodies_count":"{count} גופים",
"dialog.clearance_invalid":"המרווח חייב להיות אורך של 0 ומעלה",
"dialog.compute":"חישוב",
@@ -1369,6 +1397,9 @@
"dialog.custom_axis":"↖ ציר מותאם",
"dialog.dimension_insert_hint":"יש ללחוץ על מידה מניעה אחרת כדי להוסיף את שמה",
"dialog.dimension_name":"מידה: {name}",
"dialog.dimension_step_down":"הפחתה ב־{step}",
"dialog.dimension_step_expression":"רק מספר משתנה בצעדים; ביטוי נשאר כפי שנכתב",
"dialog.dimension_step_up":"הוספה של {step}",
"dialog.edit_title":"עריכת {title}",
"dialog.no_shown_body":"אין גוף מוצג לשינוי: הציגו גוף, או בחרו „גוף חדש”",
"dialog.pattern_sketch_not_object":"בחרו גופים או פיצ'רים: סקיצה אינה אף אחד מהם. חזרו על העקומות שלה בעזרת המערך או השיקוף של הסקיצה עצמה, או בצעו לה שליפה קודם.",
"dialog.selection_guidance":"יש לבחור קלט כדי לשנות אותו. לחיצה על אובייקט שנבחר מסירה אותו; גם Ctrl/Cmd+לחיצה מחליפה את מצבו. לאחר בדיקת התצוגה המקדימה יש ללחוץ על אישור.",
"document.read_only_save":"התכן הזה נפתח לקריאה בלבד: יש לשמור אותו כקובץ חדש",
"document.save_changes":"לשמור את השינויים ב־{name}?",
"document.save_copy":"שמירת עותק…",
"document.tab_unsaved_changes":"שינויים שלא נשמרו",
"document.unsaved_changes":"ב־{name} יש שינויים שלא נשמרו. ללא שמירה, הם יאבדו.",
"drive.rigid":"{joint} הוא מפרק קשיח: הוא מחזיק את החלקים שלו במקומם, ולכן אין מה להניע. כדי שהחלקים יזוזו, שנו את הסוג שלו ב״עריכת מפרק״: Revolute לסיבוב, Slider להחלקה, Cylindrical לשניהם.",
"drive.stopped_by_contact":"נעצר ב־{value}: {a} היה עובר דרך {b}",
@@ -1413,6 +1446,9 @@
"each rail's curves must be in one sketch":"עקומות כל מסילה חייבות להיות בסקיצה אחת",
"feature computation ended without a result":"חישוב הפיצ'ר הסתיים ללא תוצאה",
"file.open.portal_fallback.no_portal_service":"בורר הקבצים שנפתח אינו של שולחן העבודה: שירות בחירת הקבצים של שולחן העבודה אינו זמין.",
"file.open.portal_fallback.no_session_bus":"בורר הקבצים שנפתח אינו של שולחן העבודה: אין אוטובוס הפעלה של D-Bus.",
"file.open.portal_fallback.xwayland":"בורר הקבצים שנפתח אינו של שולחן העבודה: תחת XWayland הפורטל דוחה את חלון האב.",
"file_load.built":"נבנו עד כה: {built} מתוך {total} פיצ'רים.",
"file_load.converting":"המרת גוף מוצק {done} מתוך {total}",
"file_load.inserting":"הוספת גאומטריה",
@@ -1425,6 +1461,14 @@
"file_load.reading_percent":"קורא את הקובץ... {percent}%",
"file_load.rebuilding":"בונה מחדש פיצ'ר {done} מתוך {total}",
"file_load.recovering":"משחזר את התכן",
"file_load.step_build":"בונה את המודל",
"file_load.step_feature":"תכונה {done} מתוך {total}",
"file_load.step_part":"חלק {done} מתוך {total}",
"file_load.step_percent":"{percent}%",
"file_load.step_read":"קורא את הקובץ",
"file_load.step_rebuild":"בונה מחדש את התכונות",
"file_load.step_repair":"בודק ומתקן את החלקים",
"file_load.step_show":"מכין את התצוגה",
"file_load.stopping":"ממתין לעצירת הפעולה הקודמת...",
"file_load.updating_links":"עדכון קישורים",
"file_load.waiting":"ממתין לפעולת קובץ",
@@ -1521,6 +1565,11 @@
"help.joint.reach":"הזזת נקודה על חלק לעבר יעד על ידי שינוי המפרקים בשרשרת שלה, בתוך גבולותיהם. כך קובעים תנוחה של מנגנון לפי המיקום הרצוי של קצהו, כגון קצה זרוע רובוט.",
"help.joint.rigid_group":"נעילת החלקים שנבחרו יחד כפי שהם, כך שינועו כיחידה אחת. מתאים לחלקים השייכים יחד ואינם נעים זה ביחס לזה.",
"help.joint.screw":"קישור סיבוב והחלקה לפי פסיעה, כך שכל סיבוב מקדם באותו מרחק. מתאים לבורגי הנעה, לברגים ולכושים בעלי תבריג.",
"help.layout.apply":"החלת פריסה שמורה על סביבת העבודה הנוכחית. העורכים הקיימים שומרים על הטיוטות שלהם.",
"help.layout.get":"קריאת הפריסה שאושרה והצגת סביבות העבודה הרשומות.",
"help.layout.reset":"שחזור פריסת ברירת המחדל הרשומה של סביבת העבודה הנוכחית. הגדרות המשתמש השמורות נשארות זמינות.",
"help.layout.save":"שמירת הפריסה המלאה בשם. החלפת הגדרה שמורה של משתמש מחייבת הרשאה מפורשת לדריסה.",
"help.layout.workspace.select":"בחירת סביבת עבודה רשומה לפריסה ושמירת הפריסה שממנה יוצאים.",
"help.library.apply":"החלת חומר או מראה מקובץ ספרייה מקומי על גופים, פאות או רכיבים. מתאים לשימוש חוזר בחומרים ששמרת מתכן אחר.",
"help.library.export":"שמירת החומרים והמראות של התכן בקובץ ספרייה. מתאים לשיתוף או לשימוש חוזר בתכן אחר.",
"help.library.inspect":"בדיקת קובץ ספרייה והצגת החומרים והמראות שבו, בלי לשנות את התכן. מתאים כדי לראות מה הספרייה מכילה לפני החלתה.",
@@ -1534,6 +1583,21 @@
"help.notice":"NOTICE",
"help.occurrence.ground":"עיגון חלק במקומו או שחרורו מחדש, כך שהמפרקים מניעים את החלקים האחרים סביבו. מתאים למסגרת או לבסיס שעליהם נבנית שאר ההרכבה.",
"help.occurrence.move":"מזיז חלק בהרכבה רק בכיוונים שהמפרקים שלו מאפשרים. בחרו פאה של החלק, ואז גררו חץ או קשת זמינים.",
"help.panel.activate":"בחירת לשונית חלונית פתוחה בלי לבקש מיקוד מקלדת.",
"help.panel.close":"סגירת חלונית דרך בדיקת מחזור החיים של התוכן שלה. המיקום שלה נשמר.",
"help.panel.collapse":"כיווץ או הרחבה של מקטע חלונית תוך שמירת המידות המבוקשות.",
"help.panel.dismiss":"סגירת התצוגה הזמנית של חלונית מכווצת.",
"help.panel.float":"העברת חלונית למקטע צף שמיקומו מוגדר במפורש.",
"help.panel.focus":"מיקוד חלונית, פתיחה מחדש של מצבה השמור והרחבת המקטע שלה לפי הצורך.",
"help.panel.move":"העברת חלונית למקטע חדש או צירופה לקבוצת לשוניות קיימת.",
"help.panel.native_close":"החזרת מקטע חלונית מחלון נפרד למיקום העיגון השמור בלי לבטל את התוכן שלו.",
"help.panel.open":"פתיחת סוג חלונית עם מזהה מופע מפורש. מופע חדש דורש מיקום.",
"help.panel.peek":"הצגה זמנית של חלונית מכווצת בלי לשנות את הגודל השמור או את מצב הכיווץ שלה.",
"help.panel.popout":"העברת חלונית לחלון נפרד כאשר יש תמיכה בכך. במארח דפדפן נעשה שימוש במקטע צף.",
"help.panel.reset_pair":"שחזור יחס הגדלים המוגדר כברירת מחדל לשני מקטעי עיגון סמוכים, במסגרת הגבולות המשותפים שלהם.",
"help.panel.resize":"הגדרת הרוחב והגובה החיצוניים של מקטע חלונית במסגרת המגבלות של כל הלשוניות.",
"help.panel.resize_pair":"שינוי גודלם של מקטעי עיגון סמוכים יחד תוך שמירה על האורך הכולל המשותף שלהם.",
"help.parameters.change":"פתיחת הטבלה של ערכים בעלי שם וביטויים שקובעים את מידות התכנון. כך משנים מידה במקום אחד וכל הפיצ'רים שמשתמשים בה מתעדכנים.",
"help.parameters.export":"שמירת הפרמטרים של התכן כ־CSV או JSON. מתאים לעריכתם בגיליון אלקטרוני או להעברתם לתכן אחר.",
"help.parameters.graph":"הצגת אילו פרמטרים ופיצ'רים משתמשים באילו אחרים, ואילו לולאות או שגיאות יש ביניהם. מתאים כדי לראות על מה ישפיע שינוי בפרמטר.",
@@ -1719,6 +1783,7 @@
"help.timeline.delete":"מחיקת הפיצ'רים שנבחרו מציר הזמן; מחיקת סקיצה מוחקת גם את הפיצ'רים שנבנו ממנה. מתאים להסרת שלב שכבר אין בו צורך.",
"help.timeline.dependents":"הצגת הפיצ'רים שיימחקו יחד עם פיצ'ר, ואלה שייכשלו בלעדיו. מתאים לפני מחיקה או שינוי של פיצ'ר.",
"help.timeline.play":"הפעלה מחדש של הפיצ'רים שנותרו, אחד בכל פעם, עם השהיה של חצי שנייה לאחר כל בנייה מחדש. להפסקה יש להפעיל שוב את הפקודה או ללחוץ על Escape; מעבר לסוף מתבצע מיד.",
"help.version":"גרסה {version}",
"help.view.apply":"סיבוב התצוגה לכיוון סטנדרטי כמו חזית, מבט עליון או איזומטרי, או לתצוגה שמורה בשם. מתאים להתבוננות במודל מזווית קבועה.",
"help.view.delete":"מחיקת תצוגה שמורה. המודל אינו משתנה.",
"help.view.fit":"זום והזזה כך שכל המודל, או הבחירה, ימלאו את התצוגה. מתאים כשהמודל יצא מהטווח הנראה.",
@@ -1806,6 +1871,27 @@
"home.start_hint":"אפשר ליצור תכן, לפתוח קובץ אחרון או לעיין בדוגמה.",
"home.whats_new":"מה חדש",
"home.yesterday":"אתמול",
"import_report.details":"פרטים:",
"import_report.file_one":"הייתה בעיה נוספת אחת בקובץ.",
"import_report.file_other":"היו {count} בעיות נוספות בקובץ.",
"import_report.hint":"ייצוא מחדש של החלקים האלה מהתוכנה שיצרה אותם עשוי לפתור זאת. ב„העתקת הודעת האזהרה” יש את הפרטים.",
"import_report.left_out_one":"לא ניתן היה לתקן פאה אחת והיא חסרה.",
"import_report.left_out_other":"לא ניתן היה לתקן {count} פאות והן חסרות.",
"import_report.needs_repair_one":"חלק אחד דורש תיקון לפני שאפשר למדל עליו.",
"import_report.needs_repair_other":"{count} חלקים דורשים תיקון לפני שאפשר למדל עליהם.",
"import_report.not_imported_one":"לא ניתן היה לייבא חלק אחד.",
"import_report.not_imported_other":"לא ניתן היה לייבא {count} חלקים.",
"import_report.not_shown_one":"לא ניתן היה לצייר פאה אחת והיא מוסתרת.",
"import_report.not_shown_other":"לא ניתן היה לצייר {count} פאות והן מוסתרות.",
"import_report.open_one":"בחלק אחד יש רווחים בין הפאות והוא יובא כגוף פתוח.",
"import_report.open_other":"ב-{count} חלקים יש רווחים בין הפאות והם יובאו כגופים פתוחים.",
"import_report.refused_one":"לא ניתן היה להפוך חלק אחד לגוף מוצק והוא לא יובא.",
"import_report.refused_other":"לא ניתן היה להפוך {count} חלקים לגופים מוצקים והם לא יובאו.",
"import_report.repaired_one":"תוקנו פגמים קטנים בחלק אחד.",
"import_report.repaired_other":"תוקנו פגמים קטנים ב-{count} חלקים.",
"import_report.solids":"{solids} מתוך {parts} חלקים יובאו כגופים מוצקים.",
"import_report.surfaces_one":"לא ניתן היה להפוך חלק אחד לגוף מוצק והוא יובא כמשטחים.",
"import_report.surfaces_other":"לא ניתן היה להפוך {count} חלקים לגופים מוצקים והם יובאו כמשטחים.",
"install.button_tip":"התקנת SolidCraft כיישום: נפתח בחלון משלו ועובד גם ללא חיבור לרשת",
"install.dock_1":"יש לבחור קובץ › הוספה ל־Dock.",
"install.dock_2":"יש ללחוץ על הוספה.",
@@ -1848,21 +1934,21 @@
"joint.rigid_group_select_components":"יש לבחור שני רכיבים או יותר.",
"joint_move.blocked_hint":"בדקו את סוג המפרק (למשל מפרק קשיח), את קיבוע החלק, את מגבלות המפרק ואת הערכים הנשלטים על ידי פרמטרים.",
"joint_move.blocked_title":"אי אפשר להזיז את החלק הזה",
"joint_move.coarse":"צעד סיבוב קרוב לציר (°)",
"joint_move.coarse":"צעד בקרבת הציר",
"joint_move.conflict":"אחד המפרקים של החלק הזה מתנגש עם האחרים: {joint}.",
"joint_move.conflict_hint":"ערכו, השביתו או מחקו את המפרק המתנגש כדי שהמפרקים האחרים יוכלו למקם את החלק.",
"joint_move.distance":"מרחק מנקודת ההתחלה",
"joint_move.done":"סיום",
"joint_move.fine":"צעד סיבוב רחוק מהציר (°)",
"joint_move.fine":"צעד הרחק מהציר",
"joint_move.fixed":"לחלק הזה אין ציר מפרק שניתן להזיז.",
"joint_move.help":"הזזה — גררו חץ או קשת. Esc מבטל את הגרירה הנוכחית.",
"joint_move.legacy_hint":"כבו כדי להשתמש בחלונית ההזזה הקודמת.",
"joint_move.precision":"משכו אל מחוץ למנחה המקווקו כדי לכוון את הסיבוב בעדינות.",
"joint_move.precision":"לצעד העדין יש למשוך מחוץ לקו העזר המקווקו.",
"joint_move.rotation":"סיבוב מנקודת ההתחלה",
"joint_move.select":"בחרו פאה או חלק אחד בהרכבה, ואז בחרו הזזה.",
"joint_move.settings":"הזזה בהרכבה",
"joint_move.step":"צעד",
"joint_move.use_handles":"שימוש בידיות תנועת מפרקים להזזה בהרכבה",
"joint_move.use_handles":"שימוש בידיות תנועת מפרקים להזזה",
"keymap.command_id":"מזהה פקודה",
"keymap.empty":"אין פקודות תואמות",
"keymap.use_anyway":"שימוש ב־{key} כאן בכל זאת",
@@ -1922,6 +2008,7 @@
"material.selection.mixed":"חומרים שונים",
"measure.at":"מיקום",
"measure.item":"פריט {number}",
"measure.line_to_centre":"מהקו למרכז",
"measure.quick_copied":"המדידה הועתקה",
"measure.quick_copy":"לחיצה מעתיקה את המדידה",
"measure.quick_edges":"{count} מקצועות",
@@ -1952,6 +2039,8 @@
"nav.blender.help":"גרירה אמצעית מסובבת, Shift וגרירה אמצעית מזיזים, Ctrl וגרירה אמצעית מבצעים זום; גרירה ימנית לא מזיזה את המצלמה",
"nav.creo.help":"גרירה בלחצן האמצעי מסובבת את התצוגה, Shift והלחצן האמצעי מזיזים אותה, Ctrl וגרירה אנכית בלחצן האמצעי משנים את הזום (גרירה מטה להגדלה); גלילת הגלגלת משנה גם היא את הזום",
"nav.creo.label":"Creo",
"nav.drag_keeps_mode.help":"גרירה בכפתור האמצעי או הימני ממשיכה לסובב, להזיז או לשנות זום כפי שהתחילה עד שמשחררים את הכפתור, בלי קשר למקשים שנלחצים או משתחררים בינתיים. כבוי: המקשים הלחוצים קובעים בכל רגע של הגרירה.",
"nav.drag_keeps_mode.label":"גרירה שומרת על הניווט שבו התחילה",
"nav.free_orbit.help":"העכבר והעכבר התלת־ממדי מסובבים דרך שני הקטבים ושומרים על הגלגול. הצמדת הצירים עם Shift מושבתת.",
"nav.free_orbit.label":"סיבוב חופשי",
"nav.free_orbit.snap_help":"העכבר והעכבר התלת־ממדי מסובבים דרך שני הקטבים ושומרים על הגלגול. יש להחזיק את Shift בזמן גרירת סיבוב כדי להצמיד את כיוון התצוגה ואת הגלגול.",
"prefs.assistant_follow_help":"פעולות Look At בסקיצות מזיזות את התצוגה עם המצביע.",
"prefs.assistant_limit":"מגבלה",
"prefs.assistant_limited":"מוגבל",
"prefs.assistant_pointer_speed":"מהירות המצביע",
"prefs.assistant_seconds":"שניות",
"prefs.assistant_seconds_aria":"שניות",
"prefs.assistant_use_care":"להשתמש בזהירות",
"prefs.auto_operation":"בחירת הפעולה באופן אוטומטי",
"prefs.auto_operation_note":"חלונות הפיצ'רים בוחרים „איחוד”, „גוף חדש” או „הסרה” לפי מה שהחומר החדש נוגע בו, עד שתבחרו פעולה בעצמכם. כבוי: הם שומרים על הפעולה שאיתה נפתחו.",
"prefs.auto_operation_note":"איחוד, גוף חדש או חיתוך, לפי מה שהחומר נוגע בו.",
"prefs.axes":"צירים",
"prefs.axis":"ציר",
"prefs.blur_cost":"עלות עיבוד יחסית. יותר פסים מציינים בדרך כלל יותר עבודה.",
"prefs.blur_device":"לא זמין בהתקן הגרפי או בנתיב העיבוד הזה",
"prefs.blur_guard":"איכות הטשטוש הופחתה כדי לשמור על תגובתיות הפריימים. הרדיוס לא השתנה.",
"prefs.blur_off":"כבוי",
"prefs.blur_reduce_transparency":"מושבת עקב הגדרת הפחתת השקיפות של המערכת",
"prefs.blur_software":"לא זמין עם עיבוד גרפי בתוכנה (gpu-software)",
"prefs.blur_source":"לא זמין בתצוגת סביבת העבודה הזו",
"prefs.blur_web":"לא זמין בנתיב העיבוד הזה בדפדפן",
"prefs.bodies_folders":"תיקיות גופים",
"prefs.bodies_folders_always":"תמיד",
"prefs.bodies_folders_never":"אף פעם",
"prefs.bodies_folders_several":"רק כשיש כמה גופים",
"prefs.bodies_folders_several":"כמה",
"prefs.bottom":"למטה",
"prefs.bottom_centre":"למטה במרכז",
"prefs.bottom_right":"למטה מימין",
@@ -2212,14 +2324,32 @@
"prefs.dark_parts_shading_help":"הצללת התצוגה באור ליניארי עם תאורת שמיים רכה, כך שפאות כהות שומרות על מעבר גוונים במקום להפוך לשחורות",
"prefs.dead_zone_note":"הפס המקווקו הוא האזור המת: תנועה בתוכו לא נלקחת בחשבון.",
"prefs.default":"ברירת מחדל",
"prefs.design":"ברירות מחדל לתכן",
"prefs.design_note":"ההגדרות שתכנים חדשים מתחילים איתן. תכנים פתוחים שומרים על ההגדרות שלהם.",
"prefs.design_tools.placement_group":"משען, בליטה, חיבור נצמד",
"prefs.design_tools.rows":"שורות",
"prefs.devices":"עכבר תלת־ממדי",
"prefs.dialog_buttons":"לחצני תיבות דו־שיח",
"prefs.dialogs":"תיבות דו־שיח",
"prefs.dialogs_edge":"בקצה התצוגה",
"prefs.dialogs_left_column":"בעמודה השמאלית",
"prefs.dialogs_note":"היכן נפתחות תיבות הדו־שיח של הפקודות: מעוגנות בקצה התצוגה, או בעמודה השמאלית במקום הדפדפן וההיסטוריה, שחוזרים כפי שהיו כשהתיבה נסגרת.",
"prefs.dimension_values_note":"היכן מקלידים את ערך המידה. לחלון יש חצים שמשנים אותו בצעדים; כלי המידה מציב קודם את הטקסט.",
"prefs.dimension_values_view":"בתצוגה",
"prefs.dimension_values_window":"בחלון",
"prefs.display":"תצוגה",
"prefs.edges":"מקצועות והצללה",
"prefs.extend":"הרחבה",
@@ -2255,6 +2385,23 @@
"prefs.graphics_card_restart":"ייכנס לתוקף אחרי הפעלה מחדש של SolidCraft. WGPU_ADAPTER_NAME גובר על בחירה זו.",
"prefs.graphics_card_unused":"כרטיס המסך השמור לא שימש לחלון זה; הכרטיס שבשימוש מוצג בעזרה › אודות ובשורת המצב. נסו אוטומטי, או הגדירו את WGPU_ADAPTER_NAME לחלק ייחודי משם הכרטיס.",
"prefs.graphics_note":"איזון בין מהירות לחלקות. כל בחירה מציגה את השפעתה על דוגמה.",
"prefs.hide_constraint_glyphs_zoomed_out_note":"סמלי האילוצים נעלמים כשהשרטוט מוקטן מספיק כדי שלא יעמיסו על התצוגה. כבוי: הם נשארים בגודל מסך קבוע בכל זום.",
@@ -2263,7 +2410,7 @@
"prefs.history_origin_bodies_note":"ההיסטוריה משמאל או מתחת לדפדפן מתחילה בתיקיית הגופים של הרכיב הפעיל ובראשית, עם סמלי העין והתפריטים כמו בדפדפן. ההיסטוריה למטה לא משתנה.",
"prefs.history_play_button":"כפתור הפעלת ציר הזמן בפקדי ציר הזמן",
"prefs.history_play_button_note":"מוסיף את הפעלת ציר הזמן בין צעד אחד אחורה לצעד אחד קדימה בפקדי ציר הזמן. אפשר גם ללחוץ לחיצה ימנית על הפקדים כדי להציג או להסתיר אותו.",
"prefs.history_sketches":"סקיצות",
"prefs.history_sketches":"סקיצות בציר הזמן",
"prefs.history_sketches_in_order":"לפי הסדר",
"prefs.history_sketches_note":"כשהסקיצות מוגדרות ל„מתחת לפיצ'ר שלהן”, ציר הזמן משמאל מציג כל סקיצה רמה אחת פנימה, מתחת לפיצ'ר הראשון שנבנה ממנה, בכל פעם שהוא רחב מספיק להצגת שמות. ציר הזמן בתחתית שומר תמיד על סדר היצירה.",
"prefs.line_drag_draws_one":"לחיצה וגרירה משרטטות קו אחד",
@@ -2316,6 +2479,13 @@
"prefs.mouse_heading":"עכבר",
"prefs.mouse_mapping":"מיפוי העכבר",
"prefs.navigation":"ניווט",
"prefs.navigation.axes_signed":"צירים",
"prefs.navigation.cube_compact":"קובייה",
"prefs.navigation.device":"התקן",
"prefs.navigation.free":"חופשי",
"prefs.navigation.orbit_style":"סגנון סיבוב",
"prefs.navigation.radial_help":"יש להחזיק או להניע במהירות את הלחצן הימני להצגת טבעת כלים.",
"prefs.navigation.turntable":"שולחן מסתובב",
"prefs.navigation_note":"איך העכבר, משטח המגע והעכבר התלת־ממדי מזיזים את המבט.",
"prefs.navigator_fit":"התאמת המודל לאחר שינוי תצוגה בניווט התצוגה",
"prefs.navigator_fit_note":"לחיצה על פאה, פינה או חץ בקובייה, או על ציר בגיזמו, גם מביטה אל מרכז המודל מהמרחק האחד שמכיל אותו מכל צד (הכדור החוסם שלו). תצוגת בית משתמשת באותו זום ובאותו מרכז כל עוד זה פעיל, כך שתצוגות שנבחרות אחריה רק מסתובבות. כבוי: התצוגה מסתובבת במקומה ושומרת על היעד ועל הזום.",
@@ -2332,11 +2502,15 @@
"prefs.origin_plane_names_note":"השמות המוצגים בדפדפן, בתיבות הדו־שיח וברשימות. {top} הוא XY, {front} הוא XZ ו־{right} הוא YZ, כש־Z למעלה. פקודות, סקריפטים ותכנונים שמורים שומרים על XY, XZ ו־YZ.",
"prefs.overall_speed":"מהירות כללית",
"prefs.parameter_list_rows":"שורות ברשימת הפרמטרים",
"prefs.parameter_list_rows_tip":"חץ למטה בשדה ערך ריק מציג את הפרמטרים, המועדפים תחילה, עד מספר זה. מספר קטן יותר שומר על רשימה קלה בתכנון גדול.",
"prefs.parameter_list_rows_tip":"מספר הפרמטרים המרבי שמקש חץ למטה מציג בתיבת ביטוי ריקה.",
"prefs.persistent_ribbon_pressed":"הדגשת פקודות פעילות ברצועת הכלים",
"prefs.persistent_ribbon_pressed_help":"הדגשת פקודות ברצועת הכלים כל עוד ההשפעות שלהן פעילות. כבו אפשרות זו כדי לשמור על המראה הניטרלי הקודם ועל עזרת הפקודות.",
"prefs.perspective_fov":"שדה ראייה",
"prefs.placement":"מיקום",
"prefs.plugins_enabled":"מופעל",
"prefs.plugins_installed":"מותקנים",
"prefs.plugins_intro":"תוספים מבודדים.",
"prefs.plugins_show_folder":"להציג את תיקיית התוספים",
"prefs.prefer_free_sketch_points":"העדפת נקודות סקיצה ניתנות להזזה כשנקודות חופפות",
"prefs.preview_choices":"תצוגה מקדימה של הבחירות שלך",
"prefs.preview_tint_new_faces":"צביעת משטח חדש בתצוגה מקדימה",
@@ -2351,6 +2525,8 @@
"prefs.profile_exported":"הפרופיל יוצא.",
"prefs.profile_imported":"הפרופיל יובא.",
"prefs.profile_name_hint":"שם הפרופיל, למשל מחשב נייד",
"prefs.profile_operations":"מדידת זמני פעולות",
"prefs.profile_operations_note":"מתעד כמה זמן לוקחות קריאות SMLib, פעולות ליבה, תכונות, פקודות וייבוא. סוכנים קוראים זאת עם diagnostics.profile.",
"prefs.profile_rename":"שינוי שם",
"prefs.profile_renamed":"שם הפרופיל שונה.",
"prefs.profile_save":"שמירה",
@@ -2380,7 +2556,12 @@
"prefs.scale_text":"קנה מידה וטקסט",
"prefs.search":"חיפוש הגדרות",
"prefs.search_empty":"אין הגדרות תואמות",
"prefs.section_hatch":"קווקוו חתך",
"prefs.section_hatch_by_part":"לפי חלק",
"prefs.section_hatch_one":"סגנון אחד",
"prefs.select":"בחירה",
"prefs.select_hidden_edges":"בחירת קצוות מוסתרים בתצוגה מוצללת עם קצוות מוסתרים",
"prefs.select_hidden_edges_help":"מאפשר לבחור קצוות דרך פאות בתצוגה מוצללת עם קצוות מוסתרים, גם עבור Fillet. כיבוי שומר על אופן הבחירה של v0.30.1. גופים שהוסתרו עדיין אינם ניתנים לבחירה.",
"prefs.select_one_item":"בחירת פריט אחד",
"prefs.select_other_hidden":"בחירת גאומטריה מוסתרת באמצעות בחירה אחרת",
"prefs.select_other_hidden_help":"מופעל: כולל גופים, סקיצות וקצוות מוסתרים בקרבת הסמן. כבוי: שימוש ברשימה המקורית של גאומטריה גלויה מתחת לסמן.",
"prefs.single_surface_analysis":"שימוש בניתוח משטח יחיד",
"prefs.single_surface_analysis_help":"כשהאפשרות כבויה, הצללת המשטח וניתוח הרציפות יכולים להישאר פעילים יחד. הפעלתה משאירה רק את הניתוח האחרון שהופעל או שונה.",
"prefs.sketch.align_points":"יישור עם נקודות אחרות בסקיצה",
"prefs.sketch.align_points_note":"קווים בשרטוט מיושרים עם נקודות בשני הצירים בו־זמנית.",
"prefs.sketch.auto_dimensions":"הוספת כל המידות לצורות חדשות",
"prefs.sketch.auto_dimensions_note":"ערכים מוקלדים וכל מידה שמקבעת את הצורה.",
"prefs.sketch.auto_locate":"מיקום ביחס לראשית הסקיצה",
"prefs.sketch.auto_locate_note":"עם כל המידות.",
"prefs.sketch.center_arc":"קשת מנקודת מרכז עוקבת אחר הסמן",
"prefs.sketch.click_selects":"לחיצה בוחרת",
"prefs.sketch.conflict_colour":"צבע התנגשות",
"prefs.sketch.drawing":"שרטוט",
"prefs.sketch.ellipse_axes":"שרטוט אליפסות עם הצירים שלהן",
"prefs.sketch.ellipse_axes_note":"הציר הראשי והציר המשני כקווי עזר, כדי שאפשר יהיה לתת מידות לחצאי הצירים ולצירים. כבוי: האליפסה בלבד, ו-D עליה נותן את הרדיוס המשני שלה בכל מקום שאליו נגרר הערך, משורטט ומסומן R כמו קודם.",
"prefs.sketch.recent_snap":"הצמדה למפגש שני קווי עזר",
"prefs.sketch.select_other_hidden":"בחירת אחר כוללת גאומטריה מוסתרת",
"prefs.sketch.shortcut_cycles_modes":"לחיצה חוזרת על קיצור מחליפה מצב",
"prefs.sketch.shortcut_cycles_modes_tip":"כבוי: הכלי מתחיל מחדש.",
"prefs.sketch.snapping_guides":"הצמדה וקווי עזר",
"prefs.sketch.state_icons":"סמלי מצב",
"prefs.sketch.tracking_guides":"קווי עזר למרכזים ולנקודות אמצע",
"prefs.sketch.tracking_guides_note":"קווי עזר אופקיים ואנכיים זמניים ממרכזים ומנקודות אמצע של קצוות בעת ריחוף.",
"prefs.sketch.tracking_points":"קווי עזר גם מנקודות הסקיצה",
"prefs.sketch.unless_turned_note":"חזרה אם לא סובבה",
"prefs.sketch.whole_bodies":"גופים שלמים",
"prefs.sketch_align_points":"יישור לנקודות סקיצה אחרות בזמן השרטוט",
"prefs.sketch_align_points_note":"בזמן השרטוט, נקודה מתיישרת אופקית עם נקודת סקיצה אחת ואנכית עם אחרת בו-זמנית, עם קו עזר מנוקד, והלחיצה שומרת את שני היישורים. כבוי: רק עם הנקודה הקודמת, ציר אחד בכל פעם.",
"prefs.sketch_conflict_colour":"גאומטריה סותרת בצבע הסתירה",
@@ -2423,11 +2641,11 @@
"prefs.source":"מקור",
"prefs.speed":"מהירות",
"prefs.stand_up_note":"אחרי שקובץ STEP או IGES נפתח כש־Z למעלה, להציע רבע סיבוב סביב X.",
"prefs.stand_up_unknown":"לקבצים מתוכנות לא מוכרות",
"prefs.stand_up_unknown":"קבצים מתוכנות לא מוכרות",
"prefs.stand_up_unknown_note":"איך ההצעה מוצגת כשכותרת הקובץ לא מציינת תוכנה שידוע שהיא שומרת עם Y למעלה. הערה מוצגת רק כשנראה שהקובץ שוכב על גבו; ״לשאול בתיבת דו־שיח״ שואל על כל קובץ כזה, כמו קודם.",
"prefs.stand_up_unknown_note":"כיצד מוצעת האפשרות כשהקובץ אינו מציין תוכנה מוכרת.",
"prefs.status_bar":"שורת מצב",
"prefs.status_bar_note":"פס דק לאורך הקצה התחתון של החלון מציג מה נערך, את מצב הסקיצה הפתוחה בצבע שלו ואת יחידות התכנון; לחיצה על היחידות משנה אותן. מצב הסקיצה לא מוצג אז עוד בפינת התצוגה.",
"prefs.status_done":"הושלם",
@@ -2463,6 +2681,10 @@
"prefs.theme_follow_off":"כבוי",
"prefs.theme_follow_stop":"הפסקת המעקב",
"prefs.theme_import_hint":"לחצו כדי לבחור קובץ ערכת נושא, שחררו קובץ כאן, או הקישו Ctrl+V (Cmd+V ב-Mac) אחרי שהעתקתם ערכת נושא",
"prefs.theme_notice_dismiss":"הסתרה",
"prefs.theme_option_blur":"טשטוש מאחורי לוחות",
"prefs.theme_option_blur_help":"טשטוש מאחורי לוחות שקופים למחצה, בפיקסלים פיזיים. אפס מכבה את הטשטוש.",
"prefs.theme_option_invalid":"הערך השמור עבור {option} אינו תקין; נעשה שימוש בברירת המחדל של ערכת הנושא. הערך השמור נשמר ללא שינוי.",
"prefs.theme_option_opacity":"אטימות",
"prefs.theme_option_opacity_help":"כוונון אטימות הלוחות הצפים. רמת אטימות מינימלית שומרת על קריאות הטקסט על רקע צבעי חלון התצוגה.",
"prefs.theme_option_tab_colours":"צבעי כרטיסיות",
@@ -2471,6 +2693,7 @@
"prefs.theme_option_tab_fade_ms_help":"שנה בהדרגה את צבעי הלוח ואזור התצוגה בעת מעבר בין כרטיסיות. ערך אפס מבצע את המעבר מיד.",
"prefs.theme_options_badge":"אפשרויות",
"prefs.theme_options_more":"עוד · {count}",
"prefs.theme_options_newer":"ערכת נושא זו דורשת גרסה חדשה יותר של SolidCraft. לאחר השדרוג יש לייבא שוב את ערכת הנושא המקורית כדי לשחזר את הגדרות האפשרויות שלה.",
"prefs.value_boxes_in_view":"הצגת ערכים ליד הידיות שלהם בתצוגה",
"prefs.value_boxes_in_view_tip":"ערך הפקודה (מרחק, רדיוס…) בתיבה ליד הידית שלו, מעל המודל. כבוי: מקלידים אותו בחלון הפקודה, שמקבל את המקלדת אחרי בחירה, ושום דבר לא מסתיר את המודל.",
"prefs.validation":"בדיקת גופים",
"prefs.validation.each_feature":"פעם אחת לכל תכונה",
"prefs.validation.each_step":"אחרי כל שלב",
"prefs.validation.label":"הבדיקה המלאה של הקרנל",
"prefs.validation.off":"כבוי (ניסיוני)",
"prefs.validation_note":"אחרי כל שלב: בודק כל סחיפה, פעולה בוליאנית ועיגול.\nפעם אחת לכל תכונה: בודק את התוצאה של כל תכונה פעם אחת.\nכבוי (ניסיוני): אין בדיקה.",
"prefs.value_boxes_in_view":"הצגת ערכים לצד הידיות שלהם",
"prefs.view_confirm_corner_note":"כשתיבת דו־שיח או סקיצה פתוחות, סימן וי וסימן איקס בפינה הימנית העליונה של התצוגה עושים את מה שעושים אישור וביטול של תיבת הדו־שיח, או מסיימים ומבטלים את הסקיצה. ניווט התצוגה זז אל מתחתיהם.",
@@ -2528,6 +2757,17 @@
"recovery.just_now":"זה עתה",
"recovery.min_ago":"לפני {count} דק'",
"recovery.never_saved":"לא נשמר מעולם",
"refused.change":"לא ניתן היה לשנות את {body}.",
"refused.cut":"לא ניתן היה לחתוך את {body}.",
"refused.face_curved":"אחת הפאות המעוקלות שלו אינה ניתנת לשימוש במידול.",
"refused.face_flat":"אחת הפאות השטוחות שלו אינה ניתנת לשימוש במידול.",
"refused.face_freeform":"אחת הפאות החופשיות שלו אינה ניתנת לשימוש במידול.",
"refused.face_rounded":"אחת הפאות המעוגלות שלו אינה ניתנת לשימוש במידול.",
"refused.faces_apart":"הפאות שלו אינן נפגשות בצמידות מספקת לשימוש במידול.",
"refused.intersect":"לא ניתן היה לחתוך עם {body}.",
"render.adaptive_enable":"הקצאת דגימות באמצעות דגימות גישוש עצמאיות",
@@ -3885,11 +4125,11 @@
"select two components":"יש לבחור שני רכיבים",
"set by the sketch's lines":"נקבע לפי קווי הסקיצה",
"settings.display_quality_note":"ברמות עדינות יותר, פאות ומקצועות מעוקלים מוצגים חלקים יותר ויצירת הרשת אורכת זמן רב יותר. רק אזור התצוגה משתנה, לא התכן ולא קובצי הייצוא.",
"settings.double_click_components":"לחיצה כפולה על רכיב מפעילה אותו, או עורכת רכיב מקושר במקומו",
"settings.double_click_components":"לחיצה כפולה על רכיב להפעלתו",
"settings.frame_rate_details_note":"מוסיף גרף של זמני התמונות האחרונות עם המשולשים שצוירו מעליו, היסטוגרמה של זמני התמונות ואת מה שה־GPU צייר. לחיצה על קצב התמונות בתצוגה מציגה או מסתירה אותם.",
"settings.frame_rate_note":"הצגת מספר הפריימים לשנייה בפינה הימנית התחתונה של התצוגה. כל עוד האפשרות פעילה, התצוגה מצוירת מחדש ברציפות.",
"settings.insert_lists_open_designs":"הוספת תכן מציגה קודם את התכנים הפתוחים בלשוניות אחרות",
"settings.measure_axis_distances_help":"הצגת המרחקים לאורך צירי העולם לצד המרחק הכולל כשכלי המדידה פתוח.",
"settings.msaa_applies_on_restart":"החלקת הקצוות תחול בהפעלה הבאה של SolidCraft",
"settings.msaa_reset":"{setting}: {requested}× אינו נתמך בהתקן הגרפי הזה; הערך הוא כעת {reset}× (נתמכים: {supported}).",
@@ -3899,7 +4139,7 @@
"settings.reset_intro":"ההגדרות האלה לא פועלות במחשב הזה והיו מונעות מ־SolidCraft לעלות, ולכן הן שונו:",
"settings.reset_title":"ההגדרות שונו",
"settings.supersampling_note":"התצוגה מצוירת ברזולוציה גבוהה יותר ומסוננת כלפי מטה: מקצוות, קווים ורשת חלקים יותר במסכים שמתחת ל־4K. הדבר צורך זמן GPU: בערך 2.25× פיקסלים ב־1.5×, ו־4× ב־2×.",
"sketch.error.closed_curve_two_crossings":"a closed curve needs two crossings to trim",
"sketch.error.nothing_to_break":"nothing to break here",
"sketch.error.offset_fillet_chamfer":"`{id}` is an offset, and its corners follow its source curves: round or cut the source corners before offsetting, or break the offset association first",
"sketch.error.offset_trim":"`{id}` is an offset, and its ends follow its source curves: edit the source curves instead, or break the offset association first",
"sketch.hint.arc.center_point":"Arc: click center and start, go round either way and click the end, or type a signed sweep",
"sketch.hint.arc.three_point":"Arc: click start, end, then a point on the arc",
"sketch.hint.arc3d":"3D Arc: click start, end, then a point on the arc (points may leave the sketch plane)",
"sketch.hint.break":"Break: click a curve where it should split",
"sketch.hint.circle.center":"Circle: click the center, then a point on the circle",
"sketch.hint.constraint.generic":"Constraint: pick the sketch entities",
"sketch.hint.constraint.horizontal_vertical":"Horizontal/Vertical: pick a line, two points, or a point and a line; hold Shift to pick a line midpoint",
"sketch.hint.constraint.midpoint":"MidPoint: pick a point and a line, or two lines to center the second on the first",
"sketch.hint.dimension":"Dimension: pick one or two entities and type the value (or click to place it first); click a dimension to edit it; Enter applies",
"sketch.hint.extend":"Extend: click a curve near the end to extend (Shift: click two curves to extend both to where they meet)",
"sketch.hint.fallback":"Click in the sketch",
"sketch.hint.line":"Line: click points; right-click or Esc to finish",
"sketch.hint.line3d":"3D Line: click world points; right-click or Esc to finish (points may leave the sketch plane)",
"sketch.hint.open_done":"Open done",
"sketch.hint.point3d":"3D Point: click where a 3D point goes",
"sketch.hint.rectangle.center":"Center rectangle: click the center, then a corner",
"sketch.hint.rectangle.rounded":"Rounded rectangle: click two opposite corners (Tab to the radius box to type the corner radius)",
"sketch.hint.rectangle.three_point":"3-point rectangle: click two points of one edge, then the width",
"sketch.hint.rectangle.two_point":"Rectangle: click two opposite corners",
"sketch.hint.slot":"Slot: click both ends, then the width",
"sketch.hint.spline3d":"3D Spline: click fit points in 3D; right-click or Esc to finish",
"sketch.hint.trim":"Trim: click the piece of a curve to remove, or drag across the pieces to remove",
"sketch.make_selection":"המרת הבחירה ל־{linetype}",
"sketch.open_ends":"קצוות פתוחים: {count}",
"sketch.status_conflict":"אילוצים סותרים",
@@ -3995,11 +4261,20 @@
"the section's profiles must be in one sketch":"הפרופילים של החתך חייבים להיות בסקיצה אחת",
"the two origins are on the same component":"שתי הראשיות נמצאות על אותו רכיב",
"thread.automatic_size":"גודל אוטומטי",
"thread.chamfer_depth_needed":"נדרש לצורה זו",
"thread.designation":"סימון",
"thread.direction":"כיוון ההברגה",
"thread.drill_range":"מקדח יצרן המברז הוא {drill} מ\"מ. הקוטר הקטן התקני של התבריג הפנימי הוא {minor} מ\"מ. מתקבל מקדח מ-{low} עד {high} מ\"מ.",
"thread.drill_range_custom":"המקדח הוא הקוטר הגדול פחות הפסיעה, {drill} מ\"מ. הקוטר הקטן התקני של התבריג הפנימי הוא {minor} מ\"מ. מתקבל מקדח מ-{low} עד {high} מ\"מ.",
"thread.drill_range_taper":"מקדח יצרן המברז הוא {drill} מ\"מ. הקוטר הקטן התקני בסוף התבריג הוא {minor} מ\"מ. מתקבל מקדח מ-{low} עד {high} מ\"מ.",
"thread.end_square":"ישר",
"thread.fade_short":"1.25 P (ISO 3508)",
"thread.fade_standard":"2.5 P (ISO 3508)",
"thread.fits_the_face":"מתאים לפאה, למשל {example}",
"thread.form_bspp":"תבריג צנרת G (ISO 228-1)",
"thread.form_bspt":"תבריג צנרת קוני R, Rc (ISO 7-1)",
"thread.form_rp":"תבריג צנרת פנימי מקביל Rp (ISO 7-1)",
"thread.iso_metric":"ISO מטרי",
"thread.left_hand":"שמאלית",
"thread.right_hand":"ימנית",
"thread.select_size":"בחירת גודל",
"timeline.delete_after_marker_one":"מחיקת פיצ'ר אחד אחרי סמן ציר הזמן",
"timeline.delete_after_marker_other":"מחיקת {count} פיצ'רים אחרי סמן ציר הזמן",
@@ -4251,6 +4526,7 @@
"ui.agent_chat_no_images":"הסוכן הזה לא מקבל תמונות",
"ui.agent_chat_no_picture":"אין תמונה בלוח",
"ui.agent_chat_no_tool_call":"המודל לא השתמש בכלים של SolidCraft, ולכן התכן לא השתנה. יש לבחור מודל שתומך בקריאה לכלים; ראו „מודלים מקומיים” במדריך צ'אט הסוכן.",
"ui.agent_chat_node_too_old":"גרסת Node.js {version} ישנה מדי עבור סוכן זה. יש להתקין Node.js 20.10 ומעלה, ואז ללחוץ על רענון.",
"ui.agent_chat_none_found":"לא נמצא סוכן קוד. יש להתקין אחד מאלה ואז ללחוץ על רענון:",
"ui.agent_chat_none_found_short":"לא נמצא סוכן",
"ui.agent_chat_not_installed":"לא מותקן",
@@ -4291,7 +4567,7 @@
"ui.agent_chat_send_now_tip":"עצירת הצעד הנוכחי של הסוכן ושליחת הודעה זו כבאה בתור (Ctrl+Enter)",
"ui.agent_chat_setup_body":"SolidCraft מדבר עם סוכן קוד שמותקן במחשב הזה. אפשר לבחור אחד בהעדפות › AI.",
"ui.agent_chat_setup_title":"הגדרת עוזר",
"ui.agent_chat_side":"צד הצ'אט עם הסוכן",
"ui.agent_chat_side":"לעגן את הצ'אט",
"ui.agent_chat_signed_in":"מחובר",
"ui.agent_chat_state_auth":"נדרשת התחברות",
"ui.agent_chat_state_busy":"עובד…",
@@ -4310,7 +4586,7 @@
"ui.agent_chat_undone":"(בוטל)",
"ui.agent_chat_view_attached":"התצוגה צורפה",
"ui.agent_chat_waiting":"ממתין לך",
"ui.agent_cursor":"סמן הסוכן",
"ui.agent_cursor":"מצביע הסוכן",
"ui.agent_cursor_speed":"מהירות סמן הסוכן",
"ui.agent_off_thread":"שמירה על תגובתיות החלון בזמן שסוכנים מריצים פקודות",
"ui.agent_off_thread_note":"פקודות איטיות של סוכן (מחלונית ה־AI או מלקוח MCP) מחושבות לצד החלון: אפשר להמשיך לסובב ולבחון את התצוגה, ולעצור פקודה מהתג שבתצוגה. כבוי: כל פקודה רצה בתהליכון של החלון, והחלון ממתין לה.",
@@ -4356,14 +4632,14 @@
"ui.ai_key_note":"נשמר במחזיק המפתחות של המערכת, לעולם לא בהגדרות של SolidCraft. יש להשאיר ריק עבור שרת מקומי.",
"ui.ai_keychain_error":"מחזיק המפתחות של המערכת סירב: {error}",
"ui.ai_kind":"סוג",
"ui.ai_mode_all":"התרת הכול",
"ui.ai_mode_all":"לעשות הכול",
"ui.ai_mode_all_note":"שום דבר לא שואל קודם. דוחות קריסה נשארים חסומים ומגבלות התיקיות עדיין חלות.",
"ui.ai_mode_all_warning":"הסוכן יכול לשמור, לדרוס, לייצא ולהחליף את התכן בלי לשאול. יש להשתמש בזה רק עם סוכן אמין, ועל תכנים שנשמרו.",
"ui.ai_mode_ask":"שאלה בכל פעם",
"ui.ai_mode_ask":"לשאול קודם",
"ui.ai_mode_ask_note":"כל שינוי בתכן, וכל פעולת קובץ, ממתינים לאישור התרה.",
"ui.ai_mode_edits":"התרה אוטומטית של עריכות מודל",
"ui.ai_mode_edits":"לבצע עריכות",
"ui.ai_mode_edits_note":"פקודות מידול רצות בלי לשאול; שמירה, פתיחה, ייצוא ופעולות קובץ או פעולות הרסניות אחרות עדיין שואלות.",
"ui.ai_mode_global":"כפי שהוגדר למעלה",
"ui.ai_mode_global":"כמו למעלה",
"ui.ai_model":"מודל",
"ui.ai_model_hint":"qwen3:14b",
"ui.ai_modes_scope":"ההגדרות האלה חלות על הכלים של SolidCraft. הכלים של הסוכן עצמו (המעטפת שלו, עריכת הקבצים שלו) כפופים למצב של הסוכן, שנבחר בכותרת חלונית הצ'אט כשלסוכן יש מצבים.",
@@ -4389,7 +4665,7 @@
"ui.ai_save":"שמירה",
"ui.ai_settings":"הגדרות AI…",
"ui.ai_show_features":"הצגת תכונות AI",
"ui.ai_show_features_note":"הצ'אט עם הסוכן: חלונית שבה סוכן קוד שכבר נמצא בשימוש, או נקודת קצה של מודל לבחירתך, עובדים על התכן הפתוח. כבוי: אין לחצן AI, קיצור דרך, פריט תפריט או חלונית, ושום דבר לא מחופש או מופעל.",
"ui.ai_show_features_note":"כיבוי מסתיר את העוזר בכל מקום ולא מפעיל דבר. כל מה שמתחת מעומעם.\n\nהצ'אט עם הסוכן: חלונית שבה סוכן קוד שכבר נמצא בשימוש, או נקודת קצה של מודל לבחירתך, עובדים על התכן הפתוח. כבוי: אין לחצן AI, קיצור דרך, פריט תפריט או חלונית, ושום דבר לא מחופש או מופעל.",
"ui.ai_switch_tip":"החלפת הסוכן לשיחה הזו",
"ui.ai_test":"בדיקה",
"ui.ai_test_acp_ok":"עונה: {agent}",
@@ -4423,7 +4699,7 @@
"ui.ai_tool_sum_then":"{first}, ואז {next}",
"ui.ai_tool_unfold":"יש ללחוץ כדי להציג מה הוחזר",
"ui.delete_select_first":"בחרו קודם מה למחוק: תכונות, גופים, רכיבים או גאומטריית סקיצה",
"ui.dependents_select_first":"בחרו קודם מה להציג את התלויים שלו",
"ui.depth":"עומק",
"ui.design":"תכן",
"ui.design_properties.author":"מחבר",
@@ -4646,8 +4942,10 @@
"ui.edit_sketch_empty":"אין סקיצות לעריכה",
"ui.ellipse":"אליפסה",
"ui.emboss_wrap_note":"פרופילי קווים ניצבים המשיקים לגליל נתמך נכרכים אוטומטית. יש לבחור דופן כדי לקבוע יעד.",
"ui.end":"סוף",
"ui.end_radius":"רדיוס סיום",
"ui.end_scale":"קנה מידה בסיום",
"ui.ends":"קצוות",
"ui.entities":"ישויות",
"ui.equal":"שווה",
"ui.equation_end":"סוף",
@@ -4667,19 +4965,52 @@
"ui.export_ellipsis_keymap":"ייצוא…",
"ui.export_keymap_tip":"מקשים, מועדפי תיבת S וסרגל הכלים, כקובץ",
"ui.extend":"הארכה",
"ui.extent":"גבול",
"ui.extent_type":"סוג גבול",
"ui.extract_component":"חילוץ לקובץ…",
"ui.extract_design_changed":"התכן השתנה בזמן בחירת הקובץ. יש להפעיל שוב את חילוץ לקובץ.",
"ui.extract_done":"הרכיב הוא עכשיו תכן נפרד, מקושר לכאן.",
"ui.extrude":"שליפה",
"ui.extrude_auto_to_object":"שליפה עד יעד שנבחר",
"ui.extrude_auto_to_object_tip":"בשליפה, כשנבחר פרופיל, בחירת פאה, קודקוד או מישור מקביל מחוץ למישור שלו מעבירה את התחום ל\"עד אובייקט\"",
"ui.extrude_auto_to_object_tip":"פאה, קודקוד או מישור מקביל מעבירים את ההיקף למצב עד אובייקט.",
"ui.factor":"מקדם",
"ui.fade":"דעיכה",
"ui.fade_length":"אורך דעיכה",
"ui.feature_history":"ציר הזמן",
"ui.feature_options":"אפשרויות פיצ'ר",
"ui.features":"פיצ'רים",
"ui.file":"קובץ",
"ui.fillet":"עיגול פינה",
"ui.fillet_corner_ball":"כדור",
"ui.fillet_corner_ball_tip":"חלק מספירת הכדור המתגלגל, משיק (G1) לכל עיגול.",
"ui.fillet_corner_curvature_tip":"עקמומיות (G2): טלאי חלק. הפינה נסוגה לאורך כל קצה במרחק הנסיגה (פי {factor} מהרדיוס אלא אם תקלידו ערך) ומתמלאת בטלאי, כך שההשתקפויות עוברות בה בלי שבר.",
"ui.fillet_corner_needs_constant":"פינות עם טלאי חלק (G2) דורשות רדיוס קבוע והתאמת רדיוס מדויקת.",
"ui.fillet_corner_patch":"טלאי חלק",
"ui.fillet_corner_patch_tip":"רציף בעקמומיות (G2): הפינה נסוגה לאורך כל קצה ומתמלאת בטלאי, כך שההשתקפויות עוברות בה בלי שבר.",
"ui.fillet_corner_tangent_tip":"משיק (G1): פינת כדור מתגלגל, חלק מספירת הכדור המתגלגל, משיק לכל עיגול.",
"ui.fillet_error_corner":"לא ניתן היה לבנות כאן את הפינה החלקה. נסו נסיגה אחרת, או פינות משיקות.",
"ui.fillet_error_failed":"לא ניתן היה לבנות את העיגול הזה על הקצוות האלה. נסו רדיוס אחר, או עגלו פחות קצוות בבת אחת.",
"ui.fillet_error_setback_short":"הנסיגה קצרה מדי עבור הטלאי של פינה זו: הוא נבנה החל מ-{least}. נסו נסיגה ארוכה יותר.",
"ui.fillet_error_too_large":"הרדיוס גדול מדי עבור הפאות שליד הקצוות האלה. נסו רדיוס קטן יותר, או בחרו ב„גבולות הפאות” את „הרדיוס הגדול ביותר”.",
"ui.fillet_fit_tip":"כשהרדיוס גדול ממה שהפאות שליד הקצה מאפשרות.\nרדיוס מדויק: הרדיוס כפי שניתן, או ללא עיגול והודעה שמסבירה למה.\nהרדיוס הגדול ביותר: כל קצה מעוגל ברדיוס הגדול ביותר שנכנס.\nרדיוס מוצר: הרדיוס נשמר, והעיגול מוצר רק היכן שהפאות נגמרות.",
"ui.fillet_options_tip":"שרשרת משיקה: לעגל גם את הקצוות שממשיכים בחלקות מהקצוות שנבחרו.\nתצוגה מקדימה: להציג את התוצאה בתצוגה בזמן העריכה.",
"ui.fillet_setback":"נסיגה",
"ui.fillet_setback_hint":"{factor} × רדיוס",
"ui.fillet_setback_least":"יותר מ-{least}",
"ui.fillet_setback_tip":"היכן מתחיל טלאי הפינה החלק: המרחק לאורך כל קצה מהפינה. ברירת המחדל היא פי {factor} מהרדיוס. עליה להיות גדולה מהנסיגה המזערית, שבה העיגולים נפגשים בלעדיה: הרדיוס כשהפאות ניצבות זו לזו.",
"ui.fillet_smooth_radius":"שינוי רדיוס חלק",
"ui.fillet_turn":"פניות",
"ui.fillet_turn_mitre":"מיטר",
"ui.fillet_turn_swept":"מסובב",
"ui.fillet_turn_tip":"היכן ששני עיגולים מסתובבים סביב קצה פינה חד ביניהם, כמו העיגולים בבסיס בליטה ליד הקצוות הזקופים שלה.\nמיטר: העיגולים נמשכים עד שהם נפגשים במיטר.\nמסובב: העיגולים נעצרים בקצה הפינה ומסתובבים סביבו, והפינה היא טורוס המשיק לשניהם. רק לעיגולים ברדיוס אחד סביב קצה פינה ישר וקמור.",
"ui.fillet_type_choices_tip":"רדיוס קבוע: רדיוס אחד לכל אורך הקצה.\nאורך מיתר: רוחב העיגול נשאר זהה, בכל זווית שבה הפאות נפגשות.\nרדיוס משתנה: רדיוס בכל קצה, ועוד לאורך הקצה אם מוסיפים.\nרציף בעקמומיות: חתך בלי שבר בהשתקפויות היכן שהוא פוגש פאות מישוריות (G2).\nספליין: הרדיוס לאורך הקצה עוקב אחרי רדיוסי בקרה שאתם קובעים.",
"ui.fillet_type_curvature":"רציף בעקמומיות",
"ui.fillet_type_tip":"החתך לרוחב הקצה. רציף בעקמומיות: חתך רציף בעקמומיות (G2) בין פאות מישוריות, כך שההשתקפויות עוברות מהפאות אל העיגול בלי שבר.",
"ui.filter_commands_or_keys":"סינון פקודות או מקשים",
"ui.hide_component_history":"הסתר את ההיסטוריה שלו",
"ui.hide_origin_by_default":"הסתרת הראשית כברירת מחדל",
"ui.hide_origin_by_default":"הסתרת תיקיית הראשית בתכנונים חדשים",
"ui.hide_origin_note":"תכנים חדשים מתחילים כשתיקיית הראשית מוסתרת. כל תכן שומר על הגדרת הראשית שלו אחרי שמציגים או מסתירים אותה.",
"ui.history_back":"צעד אחד אחורה",
"ui.history_below_browser":"מתחת לעץ התכן",
@@ -4829,6 +5161,7 @@
"ui.inspect":"בדיקה",
"ui.instances":"מופעים",
"ui.intersect":"חיתוך משותף",
"ui.iso_4753":"ISO 4753",
"ui.isolate":"בידוד",
"ui.join":"איחוד",
"ui.joint_play":"▶ הפעלה",
@@ -4931,6 +5264,7 @@
"ui.part_size_needs_a_part":"בחרו חלק סטנדרטי שהוכנס (בורג, אום, דסקית או פין) כדי לשנות את גודלו. כדי להגדיל או להקטין גוף, השתמשו בשינוי קנה מידה.",
"ui.part_size_shared":"בונה מחדש את החלק ומחליף פיצ'רים שנוספו. כל המופעים של רכיב זה מתעדכנים.",
"ui.paste":"הדבקה",
"ui.patch_continuity_corner_tip":"הטלאי פוגש את הפאות שסביבו ברציפות שנבחרה לאורך כל צלע. בפינה שבה הפאות האלה נפגשות זו עם זו בעקמומיות שונה, הוא נשאר משיק (G1) שם.",
"ui.path":"מסלול",
"ui.pattern_object_type_tip":"גופים: צורות מלאות, נבחרות בתצוגה או בעץ התכן; כל אחד מועתק בשלמותו.\nפיצ'רים: שלבים בציר הזמן, כמו שליפה או חור, נבחרים בציר הזמן או על פאה שהם יצרו; השלב חוזר על עצמו.\nסקיצה אינה אף אחד מהם: חזרו על העקומות שלה בעזרת המערך או השיקוף של הסקיצה עצמה, או בצעו לה שליפה קודם.",
"ui.pattern_on_path":"מערך לאורך מסלול",
@@ -4947,7 +5281,7 @@
"ui.pitch":"פסיעה",
"ui.placement":"מיקום",
"ui.placement_handles":"ידיות מיקום",
"ui.placement_handles_tip":"ידיות בתצוגה המקדימה של משען, בליטה או חיבור הצמדה: יש לגרור את הסמן כדי להזיז על פני המודל,ולסובב בעזרת הטבעת",
"ui.placement_handles_tip":"סמן לגרירת התכונה על המודל וטבעת לסיבובה.",
"ui.plane":"מישור",
"ui.plane_at_angle":"מישור בזווית",
"ui.plugins":"תוספים",
@@ -5031,6 +5365,8 @@
"ui.repeat_nothing":"אין עדיין מה לחזור עליו: התחל קודם כלי או תיבת דו־שיח.",
"ui.replace_with_link_done":"העותקים הם עכשיו מיקומים של התכן המקושר.",
"ui.step_values":"שינוי ערכים בעזרת מקשי החצים והגלגלת",
"ui.step_values_tip":"בשדה ערך שמקלידים בו, החצים למעלה ולמטה משנים מספר רגיל ב־1 (Shift: 10, Alt: 0.1), וכך גם גלגלת העכבר מעל השדה. ביטויים נשארים כפי שהוקלדו.",
"ui.step_values":"שינוי ערכים בחצים ובגלגלת",
"ui.step_values_tip":"מקשי מעלה/מטה והגלגלת מעל שדה ערך משנים את המספר בו.",
"ui.stitch_tolerance_hint":"הדוקה",
"ui.stretch":"מתיחה",
"ui.supersampling":"דגימת־על (SSAA)",
@@ -5315,6 +5651,14 @@
"values must be numbers or expressions":"הערכים חייבים להיות מספרים או ביטויים",
"view.auto_ortho_faces":"פרספקטיבה בזמן סיבוב, אורתוגרפי על פאות",
"view.render_inspector":"מפקח רינדור",
"view_gizmo.arrows":"חיצי סיבוב",
"view_gizmo.home":"לחצן תצוגת בית",
"view_gizmo.no_such_body":"אין בעיצוב הזה גוף בשם הזה.",
"view_gizmo.note":"בחרו גוף בתצוגה. הוא נשמר עם ההעדפות ופרופילי ההגדרות שלכם ומוצג בכל עיצוב. לחצו על אחת מפאותיו כדי להביט בה ישירות.",
"view_gizmo.texture":"מרקם",
"view_gizmo.themed":"לפי ערכת הנושא",
"view_gizmo.too_detailed":"מפורט מדי לניווט התצוגה (יותר מ-10,000 משולשים)",
"view_gizmo.too_thin":"ארוך ודק מדי לניווט התצוגה: הצד הדק ביותר חייב להיות לפחות חמישית מהצד הארוך ביותר",
"web.files.insert_drawings_hint":"קובצי CAD, רשתות משולשים, DXF או SVG אל התכן הפתוח",
"document.read_only_save":"Questa progettazione è stata aperta in sola lettura: salvala come nuovo file",
"document.save_changes":"Salvare le modifiche a {name}?",
"document.save_copy":"Salva una copia…",
"document.tab_unsaved_changes":"Modifiche non salvate",
"document.unsaved_changes":"{name} contiene modifiche non salvate. Se non salvi, andranno perse.",
"drive.rigid":"{joint} è un giunto rigido: tiene ferme le sue parti, quindi non c'è nulla da azionare. Per farle muovere, cambia il suo tipo in Modifica giunto: Rotante per ruotare, Scorrevole per scorrere, Cilindrico per entrambi.",
"drive.stopped_by_contact":"Arrestato a {value}: {a} attraverserebbe {b}",
@@ -3959,10 +3958,7 @@
"the two origins are on the same component":"le due origini sono sullo stesso componente",
"thread.automatic_size":"Dimensione automatica",
"thread.designation":"Designazione",
"thread.direction":"Verso del filetto",
"thread.iso_metric":"Metrica ISO",
"thread.left_hand":"Sinistro",
"thread.right_hand":"Destro",
"thread.select_size":"Seleziona dimensione",
"timeline.delete_after_marker_one":"Elimina 1 lavorazione dopo il marcatore della cronologia",
"timeline.delete_after_marker_other":"Elimina {count} lavorazioni dopo il marcatore della cronologia",
@@ -4485,10 +4481,15 @@
"ui.construction.ribbon_label":"Linee aus.",
"ui.construction.side_hint":"Retta di costruzione: fai clic sul lato verso cui prosegue la retta; clic destro per ricominciare",
"ui.context_menu":"Menu contestuale",
"ui.continuity_crease":"Spigolo vivo",
"ui.continuity_curvature":"Curvatura",
"ui.continuity_curvature_change":"Variazione di curvatura",
"Report a bug — review a screenshot and open a GitHub draft":"バグを報告 — スクリーンショットを確認してGitHub下書きを作成",
"Report copied. Keep this text to submit on GitHub when you are online.":"レポートをコピーしました。このテキストを保存し、オンラインになったらGitHubで送信してください。",
@@ -584,7 +586,7 @@
"Show ghost":"ゴーストを表示",
"Show in folder":"フォルダに表示",
"Show the pointer an AI agent moves (#35)":"エージェントが操作するポインターを表示 (#35)",
"Show tool at cursor":"カーソルの横にツールを表示",
"Show tool at cursor":"カーソル位置にツールを表示",
"Signed axes":"符号付き座標軸",
"Size":"サイズ",
"Sketch constraints":"スケッチ拘束",
@@ -595,7 +597,7 @@
"Sketch points":"スケッチ点",
"Slider":"スライダ",
"Slot width":"長穴の幅",
"Snap to face and edge centres":"面とエッジの中心にスナップ",
"Snap to face and edge centres":"中心にスナップ",
"SolidCraft cannot submit reports directly. Submit on GitHub; no token is needed in the app.":"SolidCraftからレポートを直接送信することはできません。GitHubで送信してください。アプリにトークンは必要ありません。",
"SolidCraft closed before these designs were saved. Their last autosave can be opened.":"これらのデザインが保存される前にSolidCraftが終了しました。最後の自動保存ファイルを開くことができます。",
"Sort A to Z":"昇順で並べ替え",
@@ -738,34 +740,34 @@
"a picked edge's body is gone":"選択したエッジのボディが存在しなくなりました",
"add a key for a joint first":"先にジョイントのキーを追加してください",
"sketch.error.closed_curve_two_crossings":"a closed curve needs two crossings to trim",
"sketch.error.nothing_to_break":"nothing to break here",
"sketch.error.offset_fillet_chamfer":"`{id}` is an offset, and its corners follow its source curves: round or cut the source corners before offsetting, or break the offset association first",
"sketch.error.offset_trim":"`{id}` is an offset, and its ends follow its source curves: edit the source curves instead, or break the offset association first",
"sketch.hint.arc.center_point":"Arc: click center and start, go round either way and click the end, or type a signed sweep",
"sketch.hint.arc.three_point":"Arc: click start, end, then a point on the arc",
"sketch.hint.arc3d":"3D Arc: click start, end, then a point on the arc (points may leave the sketch plane)",
"sketch.hint.break":"Break: click a curve where it should split",
"sketch.hint.circle.center":"Circle: click the center, then a point on the circle",
"sketch.hint.constraint.generic":"Constraint: pick the sketch entities",
"sketch.hint.constraint.horizontal_vertical":"Horizontal/Vertical: pick a line, two points, or a point and a line; hold Shift to pick a line midpoint",
"sketch.hint.constraint.midpoint":"MidPoint: pick a point and a line, or two lines to center the second on the first",
"sketch.hint.dimension":"Dimension: pick one or two entities and type the value (or click to place it first); click a dimension to edit it; Enter applies",
"sketch.hint.extend":"Extend: click a curve near the end to extend (Shift: click two curves to extend both to where they meet)",
"sketch.hint.fallback":"Click in the sketch",
"sketch.hint.line":"Line: click points; right-click or Esc to finish",
"sketch.hint.line3d":"3D Line: click world points; right-click or Esc to finish (points may leave the sketch plane)",
"sketch.hint.open_done":"Open done",
"sketch.hint.point3d":"3D Point: click where a 3D point goes",
"sketch.hint.rectangle.center":"Center rectangle: click the center, then a corner",
"sketch.hint.rectangle.rounded":"Rounded rectangle: click two opposite corners (Tab to the radius box to type the corner radius)",
"sketch.hint.rectangle.three_point":"3-point rectangle: click two points of one edge, then the width",
"sketch.hint.rectangle.two_point":"Rectangle: click two opposite corners",
"sketch.hint.slot":"Slot: click both ends, then the width",
"sketch.hint.spline3d":"3D Spline: click fit points in 3D; right-click or Esc to finish",
"sketch.hint.trim":"Trim: click the piece of a curve to remove, or drag across the pieces to remove",
"sketch.make_selection":"選択を{linetype}にする",
"sketch.open_ends":"開放 {count}",
"sketch.status_conflict":"拘束が競合しています",
@@ -3995,11 +4261,20 @@
"the section's profiles must be in one sketch":"セクションのプロファイルは1つのスケッチ内にある必要があります",
"the two origins are on the same component":"2つの原点が同じコンポーネント上にあります",
"thread.automatic_size":"サイズを自動選択",
"thread.chamfer_depth_needed":"この形状では必須",
"thread.designation":"ねじの呼び",
"thread.direction":"ねじの方向",
"thread.drill_range":"タップメーカーの下穴ドリルは {drill} mm です。めねじの規格の内径は {minor} mm です。{low}~{high} mm のドリルを使用できます。",
"thread.drill_range_custom":"下穴ドリルは外径からピッチを引いた {drill} mm です。めねじの規格の内径は {minor} mm です。{low}~{high} mm のドリルを使用できます。",
"thread.drill_range_taper":"タップメーカーの下穴ドリルは {drill} mm です。ねじ終端での規格の内径は {minor} mm です。{low}~{high} mm のドリルを使用できます。",
"ui.ai_show_features_note":"エージェントチャット: 普段使っているコーディングエージェント、または選んだモデルのエンドポイントが、開いているデザインを操作するパネルです。オフ: AI ボタン、ショートカット、メニュー項目、パネルは表示されず、検索も起動も行いません。",
"ui.ai_show_features_note":"オフにするとアシスタントをすべて非表示にし、何も起動しません。以下の項目はすべて無効表示になります。\n\nエージェントチャット: 普段使っているコーディングエージェント、または選んだモデルのエンドポイントが、開いているデザインを操作するパネルです。オフ: AI ボタン、ショートカット、メニュー項目、パネルは表示されず、検索も起動も行いません。",
"Move holes by clicking or dragging":"클릭 또는 드래그로 이동",
"Move later":"뒤로 이동",
"Move up":"위로 이동",
"Name":"Name",
@@ -424,6 +425,7 @@
"Rename Folder":"폴더 이름 바꾸기",
"Render Stage":"렌더링 단계",
"Reopen the designs that were open when SolidCraft was last closed":"지난번에 열려 있던 디자인 다시 열기",
"Repair Part":"부품 복구",
"Replace existing library file":"기존 라이브러리 파일 바꾸기",
"Report a bug — review a screenshot and open a GitHub draft":"버그 신고 — 스크린샷을 검토하고 GitHub 초안 열기",
"Report text copied. Paste it into GitHub and submit your report there.":"보고서 텍스트를 복사했습니다. GitHub에 붙여넣고 그곳에서 보고서를 제출하세요.",
@@ -504,7 +506,7 @@
"Show Agent Cursor":"에이전트 커서 표시",
"Show in folder":"폴더에서 보기",
"Show the pointer an AI agent moves (#35)":"AI 에이전트가 움직이는 포인터 표시 (#35)",
"Show tool at cursor":"커서 옆에 도구 표시",
"Show tool at cursor":"커서에 도구 표시",
"Signed axes":"부호 있는 축",
"Size":"크기",
"Sketch constraints":"스케치 구속 조건",
@@ -515,6 +517,7 @@
"Sketch points":"스케치 점",
"Slider":"슬라이더",
"Slot width":"슬롯 폭",
"Snap to face and edge centres":"중심에 스냅",
"SolidCraft closed before these designs were saved. Their last autosave can be opened.":"이 디자인들이 저장되기 전에 SolidCraft가 종료되었습니다. 마지막 자동 저장본을 열 수 있습니다.",
"Spacing 2 must be a non-zero number":"간격 2는 0이 아닌 숫자여야 합니다",
"Spacing must be a non-zero number":"간격은 0이 아닌 숫자여야 합니다",
@@ -640,26 +643,32 @@
"a picked edge is gone":"선택한 모서리가 더 이상 없습니다",
"a picked edge's body is gone":"선택한 모서리의 바디가 더 이상 없습니다",
"add a key for a joint first":"먼저 관절의 키를 추가하세요",
"ai.prefs.availability":"어시스턴트 제어",
"ai.prefs.background_commands":"에이전트 명령을 백그라운드에서 실행",
"ai.prefs.follow_camera":"카메라를 스케치로 돌리기",
"ai.prefs.allow_control":"AI 에이전트 연결 허용",
"ai.prefs.allow_control_note":"로컬 채널(MCP)입니다. 이 컴퓨터 밖으로 아무것도 나가지 않습니다.\n\n이 컴퓨터에서만 제어 채널을 엽니다(127.0.0.1, 포트 27878 또는 다음 빈 포트). 연결하는 프로그램은 시작할 때마다 새로 생성되며 현재 사용자 계정만 읽을 수 있는 비밀 토큰을 제시해야 합니다. SolidCraft를 다음에 시작할 때 적용됩니다. 끄면 --control로 실행하지 않는 한 아무것도 수신하지 않습니다.",
"ai.prefs.availability":"사용 설정",
"ai.prefs.background_commands":"느린 명령을 백그라운드에서 실행",
"ai.prefs.connect_apps":"AI 앱에 SolidCraft 추가",
"ai.prefs.connect_apps_note":"끄면 추가한 항목이 다시 제거됩니다.\n\nSolidCraft 시작 시 이 컴퓨터에서 찾은 AI 앱(OpenCode, Claude Desktop, Claude Code, Cursor, Codex, Gemini CLI, Copilot CLI, Windsurf, Zed, VS Code)에 MCP 서버로 추가합니다. solidcraft 항목만 추가하거나 경로를 갱신하며, 사용자가 변경한 항목은 그대로 두고 파일을 먼저 백업합니다. 끄면 추가했던 항목을 제거합니다. 도움말 > AI 어시스턴트 연결…에서 수동으로 실행할 수도 있습니다.",
"ai.prefs.connect_at_start":"시작할 때 마지막 에이전트 연결",
"ai.prefs.follow_camera":"카메라 따라가기",
"ai.prefs.follow_camera_off":"카메라 자동 따라가기가 꺼져 있습니다.",
"ai.prefs.follow_camera_on":"에이전트가 만드는 스케치를 향해 카메라가 회전합니다.",
"ai.prefs.intro":"에이전트, 권한, 그리고 작업이 표시되는 방식.",
"ai.prefs.make_default":"기본값으로 사용",
"ai.prefs.intro":"SolidCraft의 AI 에이전트.",
"ai.prefs.make_default":"기본값으로 설정",
"ai.prefs.no_agents":"아직 에이전트가 없습니다. 에이전트를 추가하거나 새로 고쳐서 설치된 에이전트를 찾으세요.",
"ai.prefs.no_saved_approvals":"저장된 승인이 없습니다.",
"ai.prefs.open_at_start":"시작할 때 채팅 열기",
"ai.prefs.override_all_warning":"이 에이전트는 묻지 않고 설계를 저장, 덮어쓰기, 내보내기 또는 교체할 수 있습니다.",
"ai.prefs.permission_all":"모두 허용",
"ai.prefs.permission_all_summary":"사용 가능한 SolidCraft 도구가 묻지 않고 실행됩니다.",
"ai.prefs.permission_ask":"변경 전에 묻기",
"ai.prefs.permission_ask_summary":"모든 설계 변경과 파일 작업을 승인합니다.",
"ai.prefs.permission_edits":"모델 편집 허용",
"ai.prefs.permission_edits_summary":"모델 편집은 실행되고, 파일 및 파괴적인 작업은 계속 묻습니다.",
"ai.prefs.permission_all":"모두 실행",
"ai.prefs.permission_all_summary":"묻지 않음",
"ai.prefs.permission_ask":"먼저 묻기",
"ai.prefs.permission_ask_summary":"모든 변경 전에 확인",
"ai.prefs.permission_edits":"편집 허용",
"ai.prefs.permission_edits_summary":"자유롭게 편집하고 나머지는 확인",
"ai.prefs.permission_scope":"SolidCraft 도구에만 적용됩니다. 에이전트의 셸과 파일 편집은 자체 권한을 사용합니다.",
"crash.unclean_explanation":"이후 실행 시 감지되었으며 정확한 종료 시각은 기록되지 않았습니다. 시스템 종료나 강제 중지로도 비정상 종료가 발생할 수 있습니다.",
"delete.and_more":"… 외 {count}개",
"diagnostic.reselect_reference":"{feature}: 참조 `{reference}`이(가) 선택했을 때의 모습으로 더 이상 존재하지 않습니다. 다시 선택하세요",
"dialog.bodies_count":"바디 {count}개",
"dialog.clearance_invalid":"간격은 0 이상의 길이여야 합니다",
"dialog.compute":"계산",
@@ -1173,6 +1208,9 @@
"dialog.custom_axis":"↖ 사용자 정의 축",
"dialog.dimension_insert_hint":"다른 구동 치수를 두 번 클릭하여 이름 삽입",
"dialog.dimension_name":"치수: {name}",
"dialog.dimension_step_down":"{step} 줄이기",
"dialog.dimension_step_expression":"숫자만 증감할 수 있으며 수식은 입력한 그대로 유지됩니다",
"dialog.dimension_step_up":"{step} 늘리기",
"dialog.edit_title":"{title} 편집",
"dialog.pattern_sketch_not_object":"바디나 피처를 선택하세요. 스케치는 둘 다 아닙니다. 곡선은 스케치 안의 패턴이나 대칭 복사로 반복하거나, 먼저 돌출하세요.",
"dialog.select":"↖ 선택",
@@ -1203,6 +1241,9 @@
"dxf.tolerance_help":"표시된 바디와 스케치만 내보내며 곡선은 직선 구간으로 근사합니다. 허용 오차가 작을수록 곡선이 매끄러워지지만 처리 시간과 메모리 사용량이 늘어납니다.",
"each rail's curves must be in one sketch":"각 레일의 곡선은 하나의 스케치 안에 있어야 합니다",
"feature computation ended without a result":"특성 계산이 결과 없이 끝났습니다",
"file.open.portal_fallback.no_portal_service":"열린 파일 선택은 데스크톱의 것이 아닙니다: 데스크톱의 파일 선택 서비스를 사용할 수 없습니다.",
"file.open.portal_fallback.no_session_bus":"열린 파일 선택은 데스크톱의 것이 아닙니다: D-Bus 세션 버스가 없습니다.",
"file.open.portal_fallback.xwayland":"열린 파일 선택은 데스크톱의 것이 아닙니다: XWayland에서는 포털이 부모 창을 거부합니다.",
"file_load.built":"지금까지 빌드됨: 피처 {total}개 중 {built}개.",
"file_load.converting":"솔리드 변환 중 {done}/{total}",
"file_load.inserting":"기하 삽입 중",
@@ -1214,6 +1255,14 @@
"file_load.reading_percent":"파일 읽는 중... {percent}%",
"file_load.rebuilding":"피처 다시 빌드 중 {done}/{total}",
"file_load.recovering":"디자인 복구 중",
"file_load.step_build":"모델 만드는 중",
"file_load.step_feature":"피처 {done}/{total}",
"file_load.step_part":"부품 {done}/{total}",
"file_load.step_percent":"{percent}%",
"file_load.step_read":"파일 읽는 중",
"file_load.step_rebuild":"피처 다시 빌드 중",
"file_load.step_repair":"부품 확인 및 복구 중",
"file_load.step_show":"뷰 준비 중",
"file_load.stopping":"이전 작업이 중지되기를 기다리는 중...",
"file_load.waiting":"파일 작업 대기 중",
"fits the face, e.g. M8":"면에 맞음, 예: M8",
@@ -1225,9 +1274,29 @@
"help.construct.plane.axis_point":"축과 축 위에 있지 않은 점을 포함하는 구성 평면을 만듭니다. 원점 축, 구성 축, 직선 모서리 또는 스케치 직선을 선택한 다음 꼭짓점, 스케치 점 또는 구성점을 선택합니다. 축 위의 점으로는 평면을 하나로 결정할 수 없습니다.",
"help.font_details":"인터페이스는 egui의 내장 글꼴을 사용합니다(Ubuntu Font Licence 및 MIT/Bitstream Vera 라이선스의 Ubuntu Light와 Hack, OFL 및 MIT의 Noto Emoji와 이모지 아이콘 글꼴). 스케치 텍스트는 Liberation Sans(SIL OFL 1.1)를 사용합니다. The Crafting Apps의 선택적 글꼴 팩 craft-fonts(BIZ UDPGothic, Shippori Mincho, BIZ UDMincho, Noto Sans CJK SC, Noto Sans Arabic; SIL OFL 1.1)는 SolidCraft 빌드에 포함되지 않습니다.",
"help.fonts":"글꼴",
"help.layout.apply":"저장된 레이아웃을 현재 작업 공간에 적용합니다. 유지 중인 편집기의 초안은 보존됩니다.",
"help.layout.get":"확정된 레이아웃과 등록된 작업 공간을 확인합니다.",
"help.layout.reset":"현재 작업 공간에 등록된 기본 레이아웃을 복원합니다. 사용자 사전 설정은 유지됩니다.",
"help.layout.save":"전체 레이아웃에 이름을 지정해 저장합니다. 사용자 사전 설정을 바꾸려면 명시적인 덮어쓰기 허용이 필요합니다.",
"help.layout.workspace.select":"등록된 레이아웃 작업 공간을 선택하고 이전 레이아웃을 기억합니다.",
"help.licences":"라이선스",
"help.mit":"MIT 라이선스",
"help.notice":"NOTICE",
"help.panel.activate":"키보드 초점을 요청하지 않고 열린 패널 탭을 선택합니다.",
"help.panel.close":"콘텐츠 수명 주기 검사를 거쳐 패널을 닫습니다. 배치는 기억됩니다.",
"prefs.line_drag_draws_one":"누른 채 드래그하면 선 하나 그리기",
@@ -1668,6 +1842,13 @@
"prefs.mouse_heading":"마우스",
"prefs.mouse_mapping":"마우스 매핑",
"prefs.navigation":"탐색",
"prefs.navigation.axes_signed":"축",
"prefs.navigation.cube_compact":"큐브",
"prefs.navigation.device":"장치",
"prefs.navigation.free":"자유",
"prefs.navigation.orbit_style":"회전 방식",
"prefs.navigation.radial_help":"오른쪽 버튼을 길게 누르거나 튕겨 도구 링을 표시합니다.",
"prefs.navigation.turntable":"턴테이블",
"prefs.navigation_note":"마우스, 트랙패드, 3D 마우스로 뷰를 움직이는 방식입니다.",
"prefs.navigator_fit":"뷰 탐색기로 뷰를 바꾼 뒤 모델 맞춤",
"prefs.navigator_fit_note":"큐브의 면, 모서리, 화살표나 기즈모의 축을 클릭하면 어느 방향에서든 전체가 들어가는 한 거리(경계 구)에서 모델의 중심을 바라봅니다. 켜져 있는 동안 홈 뷰도 같은 확대/축소와 중심을 쓰므로 그 뒤에 고른 뷰는 방향만 바뀝니다. 끄면 뷰가 제자리에서 회전하며 대상과 확대/축소를 유지합니다.",
@@ -1680,9 +1861,14 @@
"prefs.origin_plane_names":"원점 평면 이름",
"prefs.origin_plane_names_note":"브라우저, 대화 상자, 목록에 표시되는 이름입니다. {top}은 XY, {front}는 XZ, {right}는 YZ이며 Z가 위쪽입니다. 명령, 스크립트, 저장된 디자인은 XY, XZ, YZ를 유지합니다.",
"prefs.overall_speed":"전체 속도",
"prefs.parameter_list_rows_tip":"빈 수식 상자에서 아래쪽 화살표로 표시할 매개변수의 최대 개수입니다.",
"prefs.persistent_ribbon_pressed":"활성 리본 명령 강조 표시",
"prefs.persistent_ribbon_pressed_help":"효과가 켜져 있는 동안 리본 명령을 강조 표시합니다. 끄면 이전의 중립적인 모양과 명령 도움말을 유지합니다.",
"prefs.perspective_fov":"시야각",
"prefs.plugins_enabled":"사용",
"prefs.plugins_installed":"설치됨",
"prefs.plugins_intro":"샌드박스 추가 기능.",
"prefs.plugins_show_folder":"플러그인 폴더 표시",
"prefs.preview_choices":"선택 항목 미리보기",
"prefs.preview_tint_new_faces":"미리 보기에서 새 면에 색 입히기",
"prefs.preview_tint_new_faces_help":"바디를 변경하는 피처의 미리 보기에서 추가되는 면을 미리 보기 색으로 그릴 수 있습니다. 끄면 바디가 원래 색으로 그려집니다.",
@@ -1690,6 +1876,8 @@
"prefs.print_face_highlight_tip":"뷰에서 바디의 출력 바닥면을 색칠하고 윤곽을 그리는 강도입니다. 0 %이면 강조하지 않습니다.",
"prefs.profile_export":"내보내기",
"prefs.profile_imported":"프로필을 가져왔습니다.",
"prefs.profile_operations":"작업 프로파일링",
"prefs.profile_operations_note":"SMLib 호출, 커널 작업, 피처, 명령, 가져오기에 걸리는 시간을 기록합니다. 에이전트는 diagnostics.profile로 읽습니다.",
"prefs.project_options_dialog":"Project 옵션 대화상자",
"prefs.project_options_dialog_note":"켜기: 투영 전에 지오메트리 또는 바디와 투영 링크를 선택합니다. 끄기: 기존 직접 선택 작업 흐름을 유지합니다.",
"prefs.quality_default":"기본값",
@@ -1707,6 +1895,8 @@
"prefs.search":"설정 검색",
"prefs.search_empty":"일치하는 설정이 없습니다",
"prefs.select":"선택",
"prefs.select_hidden_edges":"숨은 모서리가 표시된 음영 뷰에서 숨은 모서리 선택",
"prefs.select_hidden_edges_help":"숨은 모서리가 표시된 음영 뷰에서 면 뒤의 모서리를 선택하여 필렛에 사용할 수 있습니다. 끄면 v0.30.1의 선택 동작을 유지합니다. 숨긴 바디는 선택되지 않습니다.",
"prefs.select_one_item":"항목 하나 선택",
"prefs.select_other_hidden":"다른 항목 선택으로 숨겨진 형상 선택",
"prefs.select_other_hidden_help":"켜짐: 포인터 근처의 숨겨진 바디, 스케치 및 가려진 모서리를 포함합니다. 꺼짐: 포인터 바로 아래에 보이는 형상만 포함하는 기존 목록을 사용합니다.",
"prefs.shift_add_note":"켬: Shift는 추가, Ctrl / Cmd는 토글. 끔(기본값): 둘 다 토글.",
"prefs.shortcuts":"단축키",
"prefs.shortcuts_import":"가져오기",
"prefs.shortcuts_intro":"각 명령의 키.",
"prefs.shortcuts_not_assigned":"할당되지 않음",
"prefs.shortcuts_press":"키를 누르세요...",
"prefs.single_surface_analysis":"표면 분석 하나만 사용",
"prefs.single_surface_analysis_help":"끄면 표면 음영 분석과 연속성 분석을 함께 유지할 수 있습니다. 켜면 마지막으로 시작하거나 변경한 분석만 유지됩니다.",
"prefs.sketch.align_points":"다른 스케치 점에 정렬",
"prefs.sketch.align_points_note":"그리는 선을 두 축의 점에 동시에 정렬합니다.",
"prefs.sketch.auto_dimensions":"새 도형에 모든 치수 지정",
"prefs.sketch.auto_dimensions_note":"입력한 값과 도형을 고정하는 모든 치수.",
"prefs.sketch.auto_locate":"스케치 원점에서 배치",
"prefs.sketch.auto_locate_note":"모든 치수 지정 시 적용.",
"prefs.sketch.center_arc":"중심점 호가 커서를 따라감",
"prefs.sketch.click_selects":"클릭으로 선택",
"prefs.sketch.conflict_colour":"충돌 색상",
"prefs.sketch.drawing":"그리기",
"prefs.sketch.ellipse_axes":"타원을 축과 함께 그리기",
"prefs.sketch.ellipse_axes_note":"장축과 단축을 구성선으로 그려 반축과 축에 치수를 지정할 수 있습니다. 끄면: 타원만 그리며, D는 값을 어디로 끌든 단반경을 주며, 이전처럼 R로 표시되어 그려집니다.",
"prefs.sketch.exit_keep":"유지",
"prefs.sketch.exit_previous":"이전 뷰로 돌아가기",
"prefs.sketch.exit_unless_rotated":"회전하지 않았다면",
"prefs.sketch.faces_edges":"면과 모서리",
"prefs.sketch.hide_glyphs":"축소 시 기호 숨기기",
"prefs.sketch.marks":"스케치의 표시",
"prefs.sketch.note":"그리기, 스냅 및 선택.",
"prefs.sketch.opening_closing":"열기 및 닫기",
"prefs.sketch.prefer_free_points":"겹치는 곳에서는 이동 가능한 점 우선",
"prefs.sketch.project_options":"투영 옵션을 먼저 묻기",
"prefs.sketch.recent_snap":"두 안내선의 교차점에 스냅",
"prefs.sketch.select_other_hidden":"다른 항목 선택에 숨겨진 형상 포함",
"prefs.sketch.shortcut_cycles_modes":"단축키를 다시 누르면 모드 전환",
"prefs.sketch.shortcut_cycles_modes_tip":"끄면 도구를 다시 시작합니다.",
"prefs.sketch.snapping_guides":"스냅 및 안내선",
"prefs.sketch.state_icons":"상태 아이콘",
"prefs.sketch.tracking_guides":"중심 및 중점 안내선",
"prefs.sketch.tracking_guides_note":"마우스를 올린 중심과 모서리 중점에서 임시 가로 및 세로 안내선을 표시합니다.",
"prefs.sketch.tracking_points":"스케치 점에서도 안내선 표시",
"prefs.sketch.unless_turned_note":"회전하지 않았으면 복귀",
"prefs.sketch.whole_bodies":"전체 바디",
"prefs.sketch_align_points":"그리는 동안 다른 스케치 점에 맞추기",
"prefs.sketch_align_points_note":"그리는 동안 점이 한 스케치 점과 수평으로, 다른 점과 수직으로 동시에 맞춰지고 점선 안내선이 표시됩니다. 클릭하면 두 정렬이 모두 유지됩니다. 끄기: 이전 점에만, 한 번에 한 축씩 맞춥니다.",
"prefs.sketch_conflict_colour":"충돌하는 기하를 충돌 색상으로 표시",
@@ -1742,6 +1969,8 @@
"prefs.source":"소스",
"prefs.speed":"속도",
"prefs.stand_up_note":"STEP 또는 IGES 파일이 Z가 위쪽인 상태로 열린 후 X축 기준 90도 회전을 제안합니다.",
"prefs.stand_up_unknown":"알 수 없는 프로그램의 파일",
"prefs.stand_up_unknown_note":"파일에 알려진 프로그램 이름이 없을 때 제안하는 방법입니다.",
"prefs.status_bar":"상태 표시줄",
"prefs.status_bar_note":"창 아래쪽 가장자리의 얇은 표시줄에 편집 중인 항목, 열려 있는 스케치의 상태(해당 색상으로), 설계 단위가 표시됩니다. 단위를 클릭하면 변경할 수 있습니다. 스케치 상태는 더 이상 뷰 모서리에 표시되지 않습니다.",
"prefs.status_done":"완료",
@@ -1775,6 +2004,10 @@
"prefs.theme_follow_note":"다른 도구가 파일을 다시 쓸 때마다 다시 불러옵니다. 테마를 선택하면 따르기를 중지합니다.",
"prefs.theme_follow_off":"끄기",
"prefs.theme_follow_stop":"따르기 중지",
"prefs.theme_notice_dismiss":"닫기",
"prefs.theme_option_blur":"패널 뒤 흐림",
"prefs.theme_option_blur_help":"반투명 패널 뒤의 흐림을 물리적 픽셀 단위로 설정합니다. 0이면 꺼집니다.",
"prefs.theme_option_invalid":"{option}의 저장된 값이 유효하지 않아 테마 기본값을 사용합니다. 저장된 값은 유지됩니다.",
"prefs.theme_option_opacity":"불투명도",
"prefs.theme_option_opacity_help":"플로팅 패널의 불투명도를 조정합니다. 뷰포트 색상 위에서도 텍스트를 읽을 수 있도록 최솟값이 적용됩니다.",
"prefs.theme_option_tab_colours":"탭 색상",
@@ -1783,6 +2016,7 @@
"prefs.theme_option_tab_fade_ms_help":"탭을 전환할 때 패널 및 뷰포트 색상을 서서히 변경합니다. 0이면 즉시 전환합니다.",
"prefs.theme_options_badge":"옵션",
"prefs.theme_options_more":"더 보기 · {count}",
"prefs.theme_options_newer":"이 테마에는 더 최신 버전의 SolidCraft가 필요합니다. 업그레이드 후 원본 테마를 다시 가져와 옵션 정의를 복구하세요.",
"prefs.theme_options_reset":"초기화",
"prefs.theme_options_unavailable":"이 기기에서는 사용할 수 없음",
"prefs.timeline_half_hour":"−30분",
@@ -1804,8 +2038,14 @@
"prefs.under_cursor":"커서 아래",
"prefs.units_precision":"단위 및 정밀도",
"prefs.updates":"업데이트",
"prefs.value_boxes_in_view":"뷰에서 핸들 옆에 값 표시",
"prefs.value_boxes_in_view_tip":"명령의 값(거리, 반경 등)을 모델 위 핸들 옆 상자에 표시합니다. 끄면 값은 명령 창에 입력하며, 선택 후 키보드 입력이 그 창으로 가고 모델을 가리는 것이 없습니다.",
"prefs.validation":"바디 검사",
"prefs.validation.each_feature":"피처마다 한 번",
"prefs.validation.each_step":"모든 단계 후",
"prefs.validation.label":"커널 전체 검사",
"prefs.validation.off":"끄기 (실험적)",
"prefs.validation_note":"모든 단계 후: 스윕, 불리언, 블렌드마다 검사합니다.\n피처마다 한 번: 각 피처의 결과를 한 번 검사합니다.\n끄기 (실험적): 검사하지 않습니다.",
"prefs.value_boxes_in_view":"핸들 옆에 값 표시",
"prefs.value_boxes_in_view_tip":"돌출의 거리, 필렛의 반지름 등을 뷰 안의 상자로 표시합니다.",
"prefs.view":"뷰 동작",
"prefs.view_confirm_corner":"뷰 모서리에 확인 및 취소",
"prefs.view_confirm_corner_note":"대화 상자나 스케치가 열려 있는 동안 뷰 오른쪽 위의 체크와 X 표시가 대화 상자의 확인과 취소와 같은 동작을 하거나 스케치를 마치고 취소합니다. 뷰 탐색기는 그 아래로 내려갑니다.",
@@ -1835,6 +2075,17 @@
"recovery.just_now":"방금",
"recovery.min_ago":"{count}분 전",
"recovery.never_saved":"저장된 적 없음",
"refused.change":"{body}을(를) 변경하지 못했습니다.",
"refused.cut":"{body}을(를) 자르지 못했습니다.",
"refused.face_curved":"곡면 중 하나를 모델링에 사용할 수 없습니다.",
"refused.face_flat":"평면 중 하나를 모델링에 사용할 수 없습니다.",
"refused.face_freeform":"자유 곡면 중 하나를 모델링에 사용할 수 없습니다.",
"refused.face_rounded":"둥근 면 중 하나를 모델링에 사용할 수 없습니다.",
"refused.faces_apart":"면들이 충분히 맞물리지 않아 모델링에 사용할 수 없습니다.",
"refused.intersect":"{body}과(와) 교차하지 못했습니다.",
"refused.join":"{body}에 결합하지 못했습니다.",
"refused.repair":"부품 복구",
"refused.show_face":"면 보기",
"render.add_ground":"Add fitted ground to setup",
"render.all_shots_label":"모든 샷",
"render.appearance_editor.absorption":"흡수",
@@ -2737,10 +2988,10 @@
"select the sheet edge first":"판금 모서리를 먼저 선택하세요",
"select two components":"구성요소 두 개를 선택하세요",
"settings.display_quality_note":"세밀할수록 곡면과 모서리가 더 매끄럽게 표시되지만 메시 생성 시간이 늘어납니다. 뷰포트만 바뀌며 설계나 내보내기는 바뀌지 않습니다.",
"settings.double_click_components":"구성요소를 두 번 클릭하여 활성화하거나 연결된 구성 요소를 제자리에서 편집",
"settings.double_click_components":"구성요소를 두 번 클릭하여 활성화",
"settings.frame_rate_note":"뷰의 오른쪽 아래에 초당 프레임 수를 표시합니다.",
"settings.insert_lists_open_designs":"설계 삽입에서 다른 탭에 열린 설계를 먼저 표시",
"settings.measure_axis_distances":"X/Y/Z 거리 표시",
"settings.insert_lists_open_designs":"디자인 삽입에서 열린 디자인을 먼저 표시",
"settings.measure_axis_distances":"측정에서 축 거리 표시",
"settings.measure_axis_distances_help":"측정 대화상자가 열려 있는 동안 전체 거리와 함께 월드 축 방향 치수와 거리를 표시합니다.",
"settings.msaa_applies_on_restart":"안티앨리어싱은 다음에 SolidCraft를 시작할 때 적용됩니다",
"settings.msaa_reset":"{setting}: {requested}×는 이 그래픽 장치에서 지원되지 않아 {reset}×로 변경했습니다(지원: {supported}).",
@@ -2750,6 +3001,7 @@
"settings.reset_intro":"다음 설정은 이 컴퓨터에서 작동하지 않아 SolidCraft를 시작할 수 없게 하므로 변경되었습니다:",
"settings.reset_title":"설정이 변경되었습니다",
"settings.supersampling_note":"뷰를 더 높은 해상도로 그린 뒤 축소합니다. 4K 미만 화면에서 모서리, 선, 그리드가 더 매끄러워집니다. GPU 시간이 듭니다: 1.5×에서 약 2.25배, 2×에서 4배의 픽셀.",
"settings.update_changed_links":"탭으로 돌아올 때 변경된 링크 업데이트",
"sheet.flange_type_base":"베이스",
"sheet.flange_type_contour":"윤곽",
"sheet.flange_type_edge":"모서리",
@@ -2832,7 +3084,18 @@
"the section's profiles must be in one sketch":"단면의 프로파일은 하나의 스케치 안에 있어야 합니다",
"the two origins are on the same component":"두 원점이 같은 구성요소에 있습니다",
"thread.automatic_size":"자동 크기",
"thread.chamfer_depth_needed":"이 형상에 필요",
"thread.designation":"호칭",
"thread.drill_range":"탭 제조사의 드릴은 {drill} mm입니다. 암나사의 규격 골지름은 {minor} mm입니다. {low}~{high} mm 드릴을 사용할 수 있습니다.",
"thread.drill_range_custom":"드릴은 바깥지름에서 피치를 뺀 {drill} mm입니다. 암나사의 규격 골지름은 {minor} mm입니다. {low}~{high} mm 드릴을 사용할 수 있습니다.",
"thread.drill_range_taper":"탭 제조사의 드릴은 {drill} mm입니다. 나사 끝에서의 규격 골지름은 {minor} mm입니다. {low}~{high} mm 드릴을 사용할 수 있습니다.",
"thread.end_square":"직각",
"thread.fade_short":"1.25 P (ISO 3508)",
"thread.fade_standard":"2.5 P (ISO 3508)",
"thread.form_bspp":"관용 평행나사 G (ISO 228-1)",
"thread.form_bspt":"관용 테이퍼나사 R, Rc (ISO 7-1)",
"thread.form_npt":"관용 테이퍼나사 NPT (ASME B1.20.1)",
"thread.form_rp":"관용 평행 암나사 Rp (ISO 7-1)",
"thread.iso_metric":"ISO 미터",
"thread.select_size":"크기 선택",
"timeline.feature_hint":"두 번 클릭하여 편집 · 드래그하여 순서 변경 · 마우스 오른쪽 버튼을 클릭하여 더 보기",
@@ -2927,6 +3190,7 @@
"ui.3d_mouse_section":"3D 마우스",
"ui.3d_mouse_show_in_view":"3D 뷰에 3D 마우스 표시",
"ui.3d_mouse_show_in_view_tip":"왼쪽 아래에 3D 마우스 그림을 띄워 움직임을 따라 보여 줍니다.",
"ui.3d_mouse_sketch_orbit":"스케치 편집 중 뷰 회전",
"ui.3d_mouse_skip":"내 장치는 이 동작을 못 해요",
"ui.3d_mouse_skip_tip":"이 동작을 양방향 모두 건너뛰고 보정에서 뺍니다.",
"ui.3d_mouse_speed":"3D 마우스 속도",
@@ -3059,6 +3323,7 @@
"ui.agent_chat_no_control":"에이전트 채팅 엔드포인트가 시작되지 않아 에이전트가 디자인에 접근할 수 없습니다.",
"ui.agent_chat_no_images":"이 에이전트는 이미지를 받지 않습니다",
"ui.agent_chat_no_picture":"클립보드에 이미지가 없습니다",
"ui.agent_chat_node_too_old":"Node.js {version}은 이 에이전트에 사용하기에는 너무 오래된 버전입니다. Node.js 20.10 이상을 설치한 후 새로 고침을 누르세요.",
"ui.agent_chat_none_found":"코딩 에이전트를 찾지 못했습니다. 다음 중 하나를 설치한 뒤 새로 고침을 누르세요:",
"ui.agent_chat_none_found_short":"에이전트를 찾지 못함",
"ui.agent_chat_not_installed":"설치되지 않음",
@@ -3093,7 +3358,7 @@
"ui.agent_chat_send_now_tip":"에이전트의 현재 단계를 중지하고 이것을 다음으로 보냅니다 (Ctrl+Enter)",
"ui.agent_chat_setup_body":"SolidCraft는 이 컴퓨터에 설치된 코딩 에이전트와 통신합니다. 환경 설정 › AI에서 에이전트를 선택하세요.",
"ui.agent_chat_setup_title":"어시스턴트 설정",
"ui.agent_chat_side":"에이전트 채팅 위치",
"ui.agent_chat_side":"채팅 도킹",
"ui.agent_chat_signed_in":"로그인됨",
"ui.agent_chat_state_auth":"로그인 필요",
"ui.agent_chat_state_busy":"작업 중…",
@@ -3110,7 +3375,7 @@
"ui.agent_chat_undone":"(취소됨)",
"ui.agent_chat_view_attached":"뷰 첨부됨",
"ui.agent_chat_waiting":"확인 대기 중",
"ui.agent_cursor":"에이전트 커서",
"ui.agent_cursor":"에이전트 포인터",
"ui.agent_cursor_speed":"에이전트 커서 속도",
"ui.agent_off_thread":"에이전트가 명령을 실행하는 동안 창 반응성 유지",
"ui.agent_off_thread_note":"에이전트의 느린 명령(AI 패널 또는 MCP 클라이언트에서 실행)은 창과 별도로 계산됩니다. 뷰를 계속 회전하며 살펴볼 수 있고, 뷰의 칩에서 하나씩 중지할 수 있습니다. 끄면 각 명령이 창의 스레드에서 실행되며, 창은 명령이 끝날 때까지 기다립니다.",
@@ -3153,14 +3418,14 @@
"ui.ai_key_needs_https":"키는 HTTPS를 통해서만, 또는 이 컴퓨터로만 전송됩니다.",
"ui.ai_key_note":"SolidCraft 설정이 아닌 시스템 키체인에 저장됩니다. 로컬 서버라면 비워 두세요.",
"ui.ai_mode_all_note":"묻지 않고 실행합니다. 충돌 보고서는 계속 제외되고 폴더 제한도 그대로 적용됩니다.",
"ui.ai_mode_all_warning":"에이전트가 묻지 않고 디자인을 저장, 덮어쓰기, 내보내기, 교체할 수 있습니다. 신뢰하는 에이전트와 저장된 디자인에서만 사용하세요.",
"ui.ai_mode_ask":"매번 묻기",
"ui.ai_mode_ask":"먼저 묻기",
"ui.ai_mode_ask_note":"디자인의 모든 변경과 파일 작업이 사용자의 허용을 기다립니다.",
"ui.ai_mode_edits":"모델 편집 자동 허용",
"ui.ai_mode_edits":"편집 허용",
"ui.ai_mode_edits_note":"모델링 명령은 묻지 않고 실행되며, 저장·열기·내보내기 등 파일 작업이나 파괴적인 작업은 계속 묻습니다.",
"ui.ai_mode_global":"위 설정 따름",
"ui.ai_mode_global":"위와 동일",
"ui.ai_model":"모델",
"ui.ai_model_hint":"qwen3:14b",
"ui.ai_modes_scope":"이 설정은 SolidCraft 도구에 적용됩니다. 에이전트 자체 도구(셸, 파일 편집)는 에이전트에 모드가 있을 때 채팅 패널 머리글에서 고르는 에이전트 자체 모드를 따릅니다.",
@@ -3179,7 +3444,7 @@
"ui.ai_save":"저장",
"ui.ai_settings":"AI 설정…",
"ui.ai_show_features":"AI 기능 표시",
"ui.ai_show_features_note":"에이전트 채팅: 이미 사용 중인 코딩 에이전트나 선택한 모델 엔드포인트가 열린 디자인을 다루는 패널입니다. 끄면 AI 버튼, 단축키, 메뉴 항목, 패널이 없고 아무것도 찾거나 시작하지 않습니다.",
"ui.ai_show_features_note":"끄면 모든 곳에서 어시스턴트를 숨기고 아무것도 시작하지 않습니다. 아래 항목이 모두 흐려집니다.\n\n에이전트 채팅: 이미 사용 중인 코딩 에이전트나 선택한 모델 엔드포인트가 열린 디자인을 다루는 패널입니다. 끄면 AI 버튼, 단축키, 메뉴 항목, 패널이 없고 아무것도 찾거나 시작하지 않습니다.",
"ui.ai_switch_tip":"이 대화의 에이전트 변경",
"ui.ai_test":"테스트",
"ui.ai_test_acp_ok":"응답: {agent}",
@@ -3193,7 +3458,7 @@
"ui.ai_tool_running":"실행 중",
"ui.ai_tool_unfold":"클릭하면 결과를 표시",
"ui.ai_tool_waiting":"대기 중",
"ui.ai_toolbar_button":"도구 모음에 버튼 표시",
"ui.ai_toolbar_button":"애플리케이션 바의 어시스턴트 버튼",
"ui.ai_toolbar_button_note":"도구 모음 오른쪽 끝의 AI 버튼. Ctrl+Shift+A와 보기 메뉴로도 패널을 열 수 있습니다.",
"ui.ai_undo_tip":"이 메시지에서 에이전트가 바꾼 모든 것을 한 번에 실행 취소",
"ui.ai_url_hint":"https://example.com/v1",
@@ -3265,6 +3530,10 @@
"ui.colour_vision_sample":"예시",
"ui.colour_vision_tritan":"청색각이상 (Tritan)",
"ui.colour_vision_tritan_tip":"파란색 감각이 약하거나 없는 경우",
"ui.comb_length":"빗 길이",
"ui.comb_length_tip":"빗살의 길이: 자동 길이의 배수입니다. 자동 길이에서는 가장 긴 빗살이 표시된 곡선 크기의 5분의 1이 됩니다.",
"ui.comb_teeth":"빗살 수",
"ui.comb_teeth_tip":"각 빗의 빗살 수이며, 곡선을 따라 같은 간격으로 놓입니다. 빗살이 많을수록 곡률이 어떻게 바뀌는지 더 자세히 보입니다.",
"ui.combine":"결합",
"ui.coming_later":"추후 지원 예정",
"ui.command_done":"{command} 완료",
@@ -3289,11 +3558,24 @@
"ui.construction.ribbon_label":"보조선",
"ui.construction.side_hint":"보조 직선: 선이 뻗어 나갈 쪽 클릭; 마우스 오른쪽 버튼으로 다시 시작",
"ui.continuity_smooth_curvature_change_tip":"부드러운 곡률 변화(G4): 이음매에서 곡률이 변하는 방식까지 부드럽게 이어집니다.",
"ui.continuity_tangent":"접선",
"ui.continuity_tangent_tip":"접선(G1): 꺾임은 없지만, 이음매에서 곡률이 급변합니다.",
"ui.copy":"복사",
"ui.copy_details":"세부 정보 복사",
"ui.copy_details_tip":"찾아보거나 보고할 수 있도록 전체 메시지를 복사합니다.",
"ui.corner":"코너",
"ui.corners":"코너",
"ui.counterbore":"카운터보어",
@@ -3314,6 +3596,7 @@
"ui.default_modelling_orientation":"기본 모델링 방향",
"ui.delete":"삭제",
"ui.delete_select_first":"먼저 삭제할 항목을 선택하세요: 피처, 바디, 컴포넌트 또는 스케치 형상",
"ui.dependents_select_first":"먼저 종속 항목을 표시할 대상을 선택하세요",
"ui.depth":"깊이",
"ui.design":"디자인",
"ui.design_properties.author":"작성자",
@@ -3408,6 +3691,7 @@
"ui.edit_sketch_empty":"편집할 스케치가 없습니다",
"ui.ellipse":"타원",
"ui.emboss_wrap_note":"지원되는 원통에 접하는 직교 선 프로파일은 자동으로 감깁니다. 대상을 고르려면 벽을 선택하세요.",
"ui.end":"끝",
"ui.end_radius":"끝 반지름",
"ui.end_scale":"끝 배율",
"ui.entities":"요소",
@@ -3431,12 +3715,45 @@
"ui.extend":"연장",
"ui.extent_type":"범위 유형",
"ui.extrude":"돌출",
"ui.extrude_auto_to_object_tip":"면, 꼭짓점 또는 평행 평면을 선택하면 범위가 객체까지로 전환됩니다.",
"ui.factor":"배율",
"ui.fade":"페이드",
"ui.fade_length":"페이드 길이",
"ui.feature_history":"피처 기록",
"ui.feature_options":"피처 옵션",
"ui.features":"피처",
"ui.file":"파일",
"ui.fillet":"필렛",
"ui.fillet_corner_ball":"볼",
"ui.fillet_corner_ball_tip":"굴러가는 볼의 구면 일부로, 각 라운드에 접합니다(G1).",
"ui.fillet_corner_curvature_tip":"곡률(G2): 부드러운 패치. 코너를 각 모서리를 따라 셋백만큼(입력하지 않으면 반지름의 {factor}배) 물려 패치로 채우므로, 반사가 꺾임 없이 지나갑니다.",
"ui.fillet_corner_needs_constant":"부드러운 패치 코너(G2)에는 일정한 반지름과 정확한 반지름 맞춤이 필요합니다.",
"ui.fillet_corner_patch":"부드러운 패치",
"ui.fillet_corner_patch_tip":"곡률 연속(G2): 코너를 각 모서리를 따라 물려 패치로 채우므로, 반사가 꺾임 없이 지나갑니다.",
"ui.fillet_corner_tangent_tip":"접선(G1): 굴러가는 볼 코너. 굴러가는 볼의 구면 일부로, 각 라운드에 접합니다.",
"ui.fillet_error_corner":"여기에서는 부드러운 코너를 만들 수 없었습니다. 다른 셋백이나 접선 코너를 시도해 보세요.",
"ui.fillet_error_failed":"이 모서리들에 이 필렛을 만들 수 없었습니다. 다른 반지름을 시도하거나 한 번에 둥글게 하는 모서리 수를 줄여 보세요.",
"ui.fillet_error_setback_short":"이 코너의 패치에 비해 셋백이 너무 짧습니다. {least}부터 만들 수 있습니다. 더 긴 셋백을 시도해 보세요.",
"ui.fillet_error_too_large":"이 모서리 옆의 면에 비해 반지름이 너무 큽니다. 더 작은 반지름을 시도하거나 '면 경계'를 '최대 반지름'으로 설정하세요.",
"ui.fillet_fit":"면 경계",
"ui.fillet_fit_exact":"정확한 반지름",
"ui.fillet_fit_needs_constant":"반지름 맞춤에는 일정한 반지름이 필요합니다.",
"ui.fillet_fit_reduce":"최대 반지름",
"ui.fillet_fit_taper":"좁힌 반지름",
"ui.fillet_fit_tip":"반지름이 모서리 옆 면이 허용하는 것보다 클 때.\n정확한 반지름: 지정한 반지름 그대로, 또는 둥글게 하지 않고 이유를 알리는 메시지.\n최대 반지름: 모든 모서리를 들어가는 가장 큰 반지름으로 둥글게 합니다.\n좁힌 반지름: 반지름을 유지하고 면이 모자란 곳에서만 라운드를 좁힙니다.",
"ui.fillet_options_tip":"접선 체인: 선택한 모서리에서 부드럽게 이어지는 모서리도 둥글게 합니다.\n미리 보기: 편집하는 동안 결과를 뷰에 표시합니다.",
"ui.fillet_setback":"셋백",
"ui.fillet_setback_hint":"{factor} × 반지름",
"ui.fillet_setback_least":"{least}보다 크게",
"ui.fillet_setback_tip":"부드러운 코너 패치가 시작되는 위치: 코너에서 각 모서리를 따른 거리. 기본값은 반지름의 {factor}배. 최소 셋백(셋백 없이 라운드가 만나는 곳, 면이 서로 직각이면 반지름)보다 커야 합니다.",
"ui.fillet_smooth_radius":"반지름 부드럽게 변화",
"ui.fillet_turn":"꺾임",
"ui.fillet_turn_mitre":"마이터",
"ui.fillet_turn_swept":"회전",
"ui.fillet_turn_tip":"두 라운드가 사이의 날카로운 코너 모서리를 돌아가는 곳(보스 밑동의 라운드가 세로 모서리를 도는 곳 등).\n마이터: 라운드가 계속 이어져 마이터로 만납니다.\n회전: 라운드가 코너 모서리에서 멈추고 그 둘레를 돕니다. 코너는 둘 모두에 접하는 토러스입니다. 반지름이 같은 라운드가 곧고 볼록한 코너 모서리를 돌 때만.",
"ui.fillet_type_choices_tip":"일정한 반지름: 모서리 전체에 하나의 반지름.\n현 길이: 면이 어떤 각도로 만나든 라운드의 폭이 같습니다.\n가변 반지름: 양 끝의 반지름과, 추가하면 모서리를 따라 더.\n곡률 연속: 평면과 만나는 곳에서 반사가 꺾이지 않는 단면(G2).\n스플라인: 모서리를 따라 반지름이 설정한 제어 반지름을 따릅니다.",
"ui.fillet_type_curvature":"곡률 연속",
"ui.fillet_type_tip":"모서리를 가로지르는 단면. 곡률 연속: 평면 사이의 곡률 연속(G2) 단면으로, 반사가 면에서 라운드로 꺾임 없이 이어집니다.",
"ui.filter_commands_or_keys":"명령 또는 키 필터",
"ui.findInTimeline":"타임라인에서 찾기",
"ui.findInWindow":"창에서 찾기",
@@ -3477,6 +3794,7 @@
"ui.heading_construct":"구성",
"ui.heading_create":"만들기",
"ui.heading_create_sketch":"스케치 만들기",
"ui.heading_custom_view_navigator":"사용자 지정 뷰 탐색기",
"ui.heading_cylinder":"원통",
"ui.heading_design":"디자인",
"ui.heading_draft":"구배",
@@ -3543,6 +3861,7 @@
"ui.hideOrigin":"원점 숨기기",
"ui.hidePlanes":"평면 숨기기",
"ui.hideProfile":"윤곽 숨기기",
"ui.hide_origin_by_default":"새 디자인에서 원점 폴더 숨기기",
"ui.history_back":"한 단계 뒤로",
"ui.history_below_browser":"브라우저 아래",
"ui.history_edge_hint":"가장자리를 더블클릭",
@@ -3632,6 +3951,7 @@
"ui.move":"이동",
"ui.multiple":"다중",
"ui.named_views":"명명된 뷰",
"ui.nav_bridge_tip":"장치의 내비게이션 브리지에 연결합니다. 요청하기 전에는 꺼져 있습니다. 3D 입력 장치 자체 프로그램(예: 직접 만든 3D 마우스 드라이버)이 뷰를 움직이며 마우스 포인터는 그대로 사용할 수 있습니다. 연결은 이 컴퓨터의 이 포트만 사용합니다.",
"ui.navigation":"탐색",
"ui.needs_design":"{command}: 먼저 디자인을 열어 주세요",
"ui.newSketchGroup":"새 스케치 그룹",
@@ -3669,6 +3989,7 @@
"ui.part_size_needs_a_part":"크기를 바꿀 삽입된 표준 부품(나사, 너트, 와셔 또는 핀)을 선택하십시오. 바디를 키우거나 줄이려면 축척을 사용하십시오.",
"ui.part_size_shared":"부품을 다시 빌드하며 추가된 피처는 모두 대체됩니다. 이 구성요소의 모든 인스턴스가 업데이트됩니다.",
"ui.paste":"붙여넣기",
"ui.patch_continuity_corner_tip":"패치는 각 변을 따라 주변 면과 선택한 연속성으로 이어집니다. 주변 면끼리 서로 다른 곡률로 만나는 모서리에서는 그곳에서 접선(G1)으로 유지됩니다.",
"ui.path":"경로",
"ui.pattern_object_type_tip":"바디: 뷰나 브라우저에서 선택하는 솔리드 형상이며, 각각 통째로 복사됩니다.\n피처: 돌출이나 구멍 같은 기록의 단계이며, 기록에서 또는 그 단계가 만든 면에서 선택합니다. 그 단계가 반복됩니다.\n스케치는 둘 다 아닙니다. 곡선은 스케치 안의 패턴이나 대칭 복사로 반복하거나, 먼저 돌출하세요.",
"ui.pattern_on_path":"경로 패턴",
@@ -3679,6 +4000,7 @@
"ui.pipe":"파이프",
"ui.pitch":"피치",
"ui.placement":"배치",
"ui.placement_handles_tip":"모델 위로 피처를 드래그하는 마커와 회전하는 링입니다.",
"ui.plane":"평면",
"ui.plane_at_angle":"각도 평면",
"ui.plugins":"플러그인",
@@ -3843,6 +4165,8 @@
"ui.start":"시작",
"ui.start_over":"처음부터 다시",
"ui.start_page":"시작 페이지",
"ui.step_values":"화살표와 휠로 값 변경",
"ui.step_values_tip":"값 필드에서 위/아래 화살표와 휠로 숫자를 변경합니다.",
"ui.stitch_tolerance_hint":"엄격",
"ui.stretch":"늘이기",
"ui.supersampling":"슈퍼샘플링 (SSAA)",
@@ -3998,5 +4322,13 @@
"values must be finite numbers":"값은 유한한 숫자여야 합니다",
"values must be numbers or expressions":"값은 숫자 또는 식이어야 합니다",
"view.render_inspector":"렌더 검사기",
"view_gizmo.arrows":"회전 화살표",
"view_gizmo.home":"홈 버튼",
"view_gizmo.no_such_body":"이 디자인에 그런 이름의 바디가 없습니다.",
"view_gizmo.note":"뷰에서 바디를 선택하십시오. 바디는 환경설정과 설정 프로필에 저장되어 모든 디자인에 표시됩니다. 면을 클릭하면 그 면을 정면으로 봅니다.",
"view_gizmo.texture":"텍스처",
"view_gizmo.themed":"테마",
"view_gizmo.too_detailed":"뷰 탐색기에 너무 세밀합니다 (삼각형 10,000개 초과)",
"view_gizmo.too_thin":"뷰 탐색기에 너무 가늘고 깁니다: 가장 얇은 변이 가장 긴 변의 5분의 1 이상이어야 합니다",
"↑ ↓ choose · Enter / Tab complete · Esc dismiss":"↑ ↓ 선택 · Enter / Tab 완성 · Esc 닫기"
"dialog.dimension_insert_hint":"Klik op een andere aandrijvende maat om de naam ervan in te voegen",
"dialog.dimension_name":"Maat: {name}",
"dialog.dimension_step_down":"{step} omlaag",
"dialog.dimension_step_expression":"Alleen een getal verspringt; een uitdrukking blijft zoals ingevoerd",
"dialog.dimension_step_up":"{step} omhoog",
"dialog.edit_title":"{title} BEWERKEN",
"dialog.no_shown_body":"Geen zichtbaar lichaam om te wijzigen: toon er een of kies Nieuw lichaam",
"dialog.pattern_sketch_not_object":"Kies lichamen of kenmerken: een schets is geen van beide. Herhaal de curven ervan met het eigen Patroon of Spiegelen van de schets, of extrudeer de schets eerst.",
@@ -1392,6 +1393,7 @@
"document.read_only_save":"Dit ontwerp is alleen-lezen geopend: sla het op als nieuw bestand",
"document.save_changes":"Wijzigingen in {name} opslaan?",
"document.unsaved_changes":"{name} heeft niet-opgeslagen wijzigingen. Als u niet opslaat, gaan ze verloren.",
"drive.rigid":"{joint} is een starre verbinding: die houdt zijn onderdelen vast en heeft dus niets om aan te sturen. Wijzig het type in Verbinding bewerken om ze te laten bewegen: Draaiend om te draaien, Schuivend om te schuiven, Cilindrisch voor beide.",
"drive.stopped_by_contact":"Gestopt bij {value}: {a} zou door {b} heen gaan",
@@ -2194,6 +2196,13 @@
"prefs.dialogs_edge":"Aan de rand van de weergave",
"prefs.dialogs_left_column":"In de linkerkolom",
"prefs.dialogs_note":"Waar opdrachtdialogen openen: vastgezet aan de rand van de weergave, of in de linkerkolom in plaats van de browser en de geschiedenis, die terugkomen zoals ze waren wanneer de dialoog sluit.",
"prefs.dimension_step_angle":"Wat de pijlen van het venster, Omhoog/Omlaag en het wieltje bij een hoek optellen",
"prefs.dimension_step_length":"Wat de pijlen van het venster, Omhoog/Omlaag en het wieltje bij een lengte optellen",
"prefs.dimension_steps":"Stappen in het venster",
"prefs.dimension_values":"Maatwaarden",
"prefs.dimension_values_note":"Waar de waarde van een maat wordt ingevoerd. Een venster heeft pijlen die de waarde laten verspringen; het maatgereedschap plaatst eerst de tekst.",
"prefs.dimension_values_view":"In de weergave",
"prefs.dimension_values_window":"In een venster",
"prefs.display":"Weergave",
"prefs.edges":"Randen en schaduwing",
"prefs.extend":"Verlengen",
@@ -3957,10 +3966,7 @@
"the two origins are on the same component":"de twee oorsprongen liggen op hetzelfde component",
"thread.automatic_size":"Automatische grootte",
"thread.designation":"Aanduiding",
"thread.direction":"Richting van schroefdraad",
"thread.iso_metric":"ISO metrisch",
"thread.left_hand":"Linksdraaiend",
"thread.right_hand":"Rechtsdraaiend",
"thread.select_size":"Grootte selecteren",
"timeline.delete_after_marker_one":"1 kenmerk na geschiedenismarkering verwijderen",
"timeline.delete_after_marker_other":"{count} kenmerken na geschiedenismarkering verwijderen",
@@ -4483,10 +4489,15 @@
"ui.construction.ribbon_label":"Hulplijnen",
"ui.construction.side_hint":"Constructielijn: klik op de zijde waarheen de lijn loopt; klik met rechts om opnieuw te beginnen",
"document.unsaved_changes":"{name} ma niezapisane zmiany. Jeśli ich nie zapiszesz, zostaną utracone.",
"drive.rigid":"{joint} to złącze sztywne: utrzymuje swoje części nieruchomo, więc nie ma czym sterować. Aby mogły się poruszać, zmień jego typ w Edytuj złącze: Obrotowe do obrotu, Przesuwne do przesuwu, Walcowe do obu.",
"drive.stopped_by_contact":"Zatrzymano przy {value}: {a} przeszedłby przez {b}",
@@ -1985,6 +1984,8 @@
"prefs.shortcuts":"Skróty",
"prefs.single_surface_analysis":"Używaj jednej analizy powierzchni",
"prefs.single_surface_analysis_help":"Gdy wyłączone, cieniowanie powierzchni i Ciągłość mogą być włączone jednocześnie. Włączenie zachowuje ostatnio uruchomioną lub zmienioną analizę.",
"prefs.sketch.ellipse_axes":"Rysuj elipsy z osiami",
"prefs.sketch.ellipse_axes_note":"Oś wielka i mała jako linie konstrukcyjne, aby można było wymiarować półosie i osie. Wyłączone: sama elipsa, a D na niej daje promień małej półosi, gdziekolwiek przeciągnąć wartość, rysowany i oznaczony R jak dotąd.",
"prefs.sketch_align_points":"Wyrównuj do innych punktów szkicu podczas rysowania",
"prefs.sketch_align_points_note":"Podczas rysowania punkt wyrównuje się jednocześnie poziomo z jednym punktem szkicu i pionowo z innym, z kropkowaną linią pomocniczą, a kliknięcie zachowuje oba wyrównania. Wyłączone: tylko z poprzednim punktem, po jednej osi.",
"prefs.sketch_conflict_colour":"Geometria w konflikcie w kolorze konfliktu",
@@ -2249,10 +2250,7 @@
"the two origins are on the same component":"oba początki leżą na tym samym komponencie",
"thread.automatic_size":"Rozmiar automatyczny",
"thread.designation":"Oznaczenie",
"thread.direction":"Kierunek gwintu",
"thread.iso_metric":"Metryczny ISO",
"thread.left_hand":"Lewy",
"thread.right_hand":"Prawy",
"thread.select_size":"Wybierz rozmiar",
"timeline.delete_after_marker_one":"Usuń 1 funkcję za znacznikiem historii",
"timeline.delete_after_marker_other":"Usuń funkcje za znacznikiem historii: {count}",
"ui.continuity_curvature_change":"Variação de curvatura",
"ui.continuity_g0":"G0 vinco",
"ui.continuity_g1":"G1 tangente",
"ui.continuity_g2":"G2 curvatura",
"ui.continuity_gap":"Folga",
"ui.continuity_position":"Posição",
"ui.continuity_tangent":"Tangente",
"ui.copy":"Copiar",
"ui.corner":"Canto",
"ui.corners":"Cantos",
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.