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
* claim: #4585
* Sketch drag: a linkage held by redundant parallelograms still moves (#4585)
Cursor motion looks for the sketch's freedom in the null space of the
constraint Jacobian. Redundant constraints (a parallelogram held both
parallel and equal on each pair of sides) are dependent only at an exact
solution; after a correction to the solver's tolerance their rows differ
by about 1e-9, which the 1e-9 pivot tolerance counted as rank, so the
null space came out empty and a one-DoF linkage stayed locked. Use the
rank analysis' 1e-7, so the drag sees the freedom the sketch reports.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Model cache written by default: exact bodies, stored once, scaled caps (#3053)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* bench-open: say why bodies were not kept
* Exact planes and revolutions; budgets for large bodies (#3053)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Native B-rep: rebuild shells as the kernel made them (closed and seam edges) (#3053)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: the model cache and the exact native B-rep (#3053)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* bench-open: time a save without the cache too
* Model cache entries are Deflate-compressed (#3053)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Model cache: one that does not fit the design file is left out, never a failed save (#3053)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Extrude: a profile edge short of a face is not grown through the skin beyond it (#1669)
A cut or join profile edge that lies on a face of the target is grown off it by 0.5 % of the body, so that the tool's wall does not lie in the face. Whether it lies on a face was judged half a growth step either side of it: empty just outside, material just inside. An edge 0.25 mm short of a 3.75 mm wall's far face reads the same, and the growth cut through the skin it should leave (55 050 mm³ instead of 56 130 on the test's wall). Now the space just past the edge, 1e-4 of the body out, must already be as the operation wants too.
In #1669, the pleat's window built directly at the far end of a case opened through the wall at 3.75 and 4 mm, while its mirror, built without the growth, rightly left the skin and then failed to join the loft through it. Built either way, the window now leaves the skin.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Regression tests: the issue's pleats mirror and build at the far end (#1669)
The issue's battery case at 3.5 mm: the mirror of the window and the pleat builds (it needed #1670's meshing of twisted faces), and at 3 mm the same window and pleat built directly at the far end of the finished case join it (they needed #1667's end rounds).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Far-end pleat test: the direct build matches the mirror's volume
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Erikas <erkexzcx@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
A scale across a revolution's axis keeps the face a surface of revolution and is written as one; any other refusal from the writer is an export error, not a panic.