Status: proposal, nothing built Version: draft 1, 25 September 2026 Author: Geekatplay Studio · Vladimir Chopine
Image-to-3D services — Tripo, Meshy, Hitem3D and the rest — will produce a ring from a sketch in under a minute, and the result looks right in a render. It is almost never wearable or castable:
| What arrives | Why it matters |
|---|---|
| The bore is an oval, not a circle | It will not go on a finger, and there is no "size" to quote |
| The bore is whatever size the generator felt like | Nobody's finger is 17.89 mm |
| Square-cut edges inside the bore | A sharp inner rim cuts into the finger; every real band is relieved |
| Band thinner than 1 mm in places | It will not fill in casting, and it bends in wear |
| Detail finer than the metal can hold | Prints beautifully in resin, disappears in silver |
| No shrinkage allowance | The cast ring comes out a size and a half small |
Generic STL repair — including the auto-repair built into Meshy and Tripo themselves — closes holes and fixes normals. None of it knows what a ring is. It will happily hand back a watertight, manifold, perfectly non-wearable oval.
That gap is what this is for.
Jewellers and hobbyists who generate designs with AI and cast them through lost-wax, printing a castable-wax master on a resin printer. This is a small market on purpose — it is a wedge, not the main business.
So the design constraint that follows from it: the jewellery panel is collapsed by default and does not intrude on anyone else's workflow. A person printing miniatures should never have to look at ring sizes. Someone who opens it once and picks their printer should find it open next time and never have to think about it again.
One panel, Jewellery (wax casting), collapsed until opened. Inside it, for a ring:
| Measurement | How | Proven |
|---|---|---|
| Which way the finger goes | Largest principal moment of inertia — a ring's mass all sits at one radius from that axis | 0.01 s, correct on a model tilted 23° |
| Bore diameter, all the way round | Rays fired outward from the axis, first hit | Exact: read 16.40 / 17.90 mm off a bore built as 16.4 × 17.9 |
| Out-of-round | max − min of those radii | Caught 1.50 mm (8.8%) on the test ring |
| Ring size | ISO 8653: size = inner circumference in mm, taken at the narrowest point | Reported ISO 54, US 6.8 |
| Band thickness | Rays fired inward at every face (the printability check already does this) | Already in the product |
| Sharp edges | Share of adjacent faces meeting above 55° | 13% on a square-cut section |
Fit the bore — the core operation. Rather than trying to repair the generator's oval, subtract a mathematically perfect one. A D-profile solid of revolution, sized from the ISO table, is booleaned out of the model. That fixes the circle, the size and the inner edge relief in one operation, because a comfort-fit profile is a rounded inner edge.
Measured on the test ring: bore came out at exactly 54.0 mm circumference as asked, 0.03 s, watertight.
The dome goes narrowest-in-the-middle, flaring at the rims. I built it the other way round first: the ring then grips at the edges — the exact thing comfort fit exists to avoid — and the size reads wrong, because a ring's size is set by its narrowest point.
Thicken where it is too thin — flag anything under the casting minimum, and offer to grow the outer surface (never the bore) to reach it.
Round the outer edges — optional, and with a warning attached. See §6.
Scale for shrinkage — one multiplier applied last, so the cast metal comes out the size that was asked for. See §5.
A verdict in the same shape as the printability check: what is wrong, how much, where on the model, and what it would take to fix. Nothing is changed without being asked.
These go in a table in the code with their sources beside them, not scattered as magic constants.
| Rule | Value | Source |
|---|---|---|
| Ring size definition | Inner circumference in mm | ISO 8653:2016 |
| US size step | 0.81 mm diameter / 2.55 mm circumference per whole size | Ring size |
| Ring band minimum wall | 1.0 mm (both gold and silver) | i.materialise gold, Materialise silver |
| General wall minimum | 0.8 mm gold, 0.6–0.8 mm silver | same |
| Absolute floor, lost-wax | 0.35 mm | Materialise lost-wax guidelines |
| Prong diameter | ≥ 0.8 mm | PriceScope |
| Engraving depth | ≥ 0.3 mm on surfaces that rub; depth:width ≤ 1:1 | Materialise guidelines |
| Sunken detail, to be visible | 0.4 × 0.4 × 0.4 mm | Materialise guidelines |
| Comfort-fit profile | D-shape, roughly 2 mm wide × 1.8 mm tall | Ring design guidance |
| Comfort fit sizing | Fits about half a size looser than flat fit | Larson Jewelers |
| Print + cure shrinkage | 0.8% rising to ~1.25% at plateau, measured on an 18 mm bore | Liqcreate |
| Casting shrinkage | ~2.6% average, material dependent | 3dprinting.com |
| Supports | Outer bottom of the shank; never inside the bore | ifun3d |
There are two different minimum feature sizes, and the product already gets one of them right:
- What the printer can resolve — 18 µm on an Elegoo Mars 4 Ultra. Already measured by the existing print check, against 216 machines.
- What survives casting in metal — 0.35 mm absolute, 1.0 mm for a band. That is twenty times coarser, and it is the limit that actually binds.
A ring can pass the print check perfectly and still come out of the kiln as a puddle. The jewellery check is the stricter one, and must be shown as a separate verdict rather than folded into the existing score.
Print-and-cure shrink stacks on top of metal shrink. Published figures put the total around 2–4%, but it depends on the resin, the investment, the metal and the kiln — so a single hard-coded number would be worse than useless.
Design: a per-material compensation field, defaulting to a published figure, with the arithmetic shown plainly — "printing at 103.0%: an ISO 54 ring casts as ISO 54" — and a note that it should be dialled in with a test cast. It is applied last, after every other correction, and recorded in the export report so a known-good factor can be reused.
This is the single most valuable number in the feature and the one we cannot know for the user. It must be theirs to set, and obvious that it is.
The voxel approach does not work, and this was measured. Rounding by closing then opening a voxel solid does round edges — sharp faces 13% → 0%, watertight, 12 s at 0.1 mm voxels — but 0.1 mm voxels cannot hold the 0.3 mm engraving the same guidelines demand, and going fine enough is not affordable: a 20 mm ring at the printer's own 18 µm would be 1.4 billion voxels.
Blender's angle-limited Bevel modifier does work, and by a wide margin:
| Voxel rounding | Blender bevel | |
|---|---|---|
| Sharp faces | 13% → 0% | 35% → 0% |
| 0.3 mm engraving | blurred away | 100% survived, 0.300 mm |
| Faces produced | 259,112 | 13,104 |
| Round trip | 12 s | 1.5 s |
| At 125,952 faces in | — | 1.8 s, 194,880 out, watertight |
Because the bevel is limited by edge angle, it rounds the hard corners and leaves flat faces and shallow detail untouched — which is precisely what the voxel filter could not do, and precisely what a jeweller means by "take the sharpness off".
This moves outer-edge rounding out of Phase 3 research and into Phase 2.
engine/blend_import.py runs an installed Blender headless to open .blend projects,
and find_blender() locates it. The same bridge runs a modifier stack on any mesh. What
this opens up beyond bevelling:
- Solidify — thicken a band that is under the casting minimum, outward only
- Remesh and the exact Boolean solver, as alternatives where trimesh struggles
- Blender must be installed. It already must be, for
.blendimport — but that is an optional format and this would be a core operation. The fallback has to be graceful, in the pattern already used for a missing PyMeshLab: say what is needed, say which copy of Meshwright lacks it, and point at what still works. - Its Python API moves between versions. The STL operator used here,
bpy.ops.wm.stl_import, is Blender 4.2 and newer; before that it wasbpy.ops.import_mesh.stl. A version probe and a fallback are required, and this is the main ongoing maintenance cost. - About 1.5 s per launch, nearly all of it startup — the bevel itself took 0.02 s. Fine for a committed operation with a progress toast; too slow to drag a slider against. Preview approximately in the viewport, commit for real.
- Licence. Blender is GPL-3. Driving an installed copy as a separate process is arm's-length and fine; bundling it into the installer would not be.
Stone settings, prongs and bezels are out of scope. Checking a prong is one thing; building or repairing one is jewellery CAD, and MatrixGold already exists.
We do not become a design tool. The generator designs. This makes what it produced manufacturable.
| Who | What they do | Gap |
|---|---|---|
| Meshy / Tripo auto-repair | Holes, non-manifold, normals | No idea what a ring is |
| meshcast.app and similar | Generic printability | Same |
| JewelCraft (Blender, free, open source) | Ring sizing, gems, prongs, weight in alloys | A design add-on inside Blender; does not take a broken mesh and correct it |
| MatrixGold, RhinoGold, 3Design, JewelCAD | Full professional jewellery CAD | Design from scratch, thousands of pounds, steep |
Nobody is taking AI output and making it castable against jewellery rules. The wedge is real and narrow.
| Library | Offers | Verdict |
|---|---|---|
| OpenVDB 13 | A real level-set Fillet that rounds only concave regions, plus Offset |
No pip wheel. Would have to be vendored or built. Best-in-class, not practical now |
| MeshLib 3.1.4 | Mesh-to-SDF, offsetting, "double-offset blending for seamless fillets" | Free for non-commercial use only — unusable in a distributed product |
| CadQuery 2.8 / build123d 0.13 | Real B-rep fillets and chamfers via OCCT | Cannot fillet an arbitrary AI mesh. Useful for generating the parametric bore and cutters |
| An installed Blender | Angle-limited Bevel, Solidify, Remesh, exact Booleans | The answer for edge rounding — measured, §6. Already reachable through engine/blend_import.py |
| libigl 2.6.3 / pygalmesh / VTK | Geometry processing | Available; nothing needed from them yet |
| Already in the product | trimesh, manifold3d (booleans), scipy (distance transforms), scikit-image (marching cubes), embreex (rays), PyMeshLab | Everything Phase 1 and 2 need is already installed |
No new dependency is required to build the valuable part.
Sizes are relative to what exists; the pattern the codebase already follows is engine module → tests → service → API → panel → drive the real window.
engine/jewellery.py: axis, bore profile, ovality, size, thickness against casting rules- Casting-rule table with sources
- Verdict in the existing issue shape, so faults highlight on the model like every other
- Panel, collapsed by default, with ring size in ISO / US / UK
- Proven feasible end to end. All components measured.
- Parametric comfort-fit bore by boolean subtraction (proven: exact size, 0.03 s)
- Thicken-to-minimum where the band is too thin
- Shrinkage compensation, applied last, shown as arithmetic
- Edge rounding through Blender's bevel, with a graceful refusal when Blender is absent (proven: detail preserved, 1.8 s on a 126k-face ring)
- Each an undoable state, as every operation already is
- Other items: pendants, bands, bangles. The measurement frame generalises; the bore does not
- A weight estimate in silver / gold / platinum, which JewelCraft shows people want
- Resin printer profiles, including the user's Elegoo, with real pixel pitch
- Thickness measurement by ray casting, with the two-measurement honesty rule
- Boolean unions via manifold3d, voxel remesh, decimation, undo/redo, crash recovery
- Per-piece selection and operations, and the right-click menu to hang actions on
- Which metals to ship rules for? Silver and gold cover most of it; platinum and brass differ. One table, extendable.
- Where does the panel live? A collapsed card beside Print check is the obvious place — both answer "will this survive manufacture?"
- How is the ring size chosen — a size picker (ISO/US/UK), a target diameter, or "keep what it is, just make it round"? All three are reasonable; the third may be the most common.
- Should the check refuse non-rings? A pendant run through ring measurement gives nonsense. Detecting "is this ring-shaped" needs a confidence test and a graceful refusal.
- Is a test-cast calibration record worth keeping — remembering that this resin plus this investment needed 103.2%?
Not by "it looks right". The same standard the rest of the product is held to:
- A ring built with a known bore measures back to that bore, within a hundredth of a millimetre (already demonstrated: 16.40 / 17.90 read off exactly)
- A corrected bore measures the exact circumference asked for (demonstrated: 54.0)
- A corrected ring is watertight, is one solid, and lost no volume it should have kept
- Thinning the band by enlarging the bore is caught and reported, not silently allowed (it happened in testing — the wall fell to 0.95 mm, under the 1.0 mm minimum)
- Every published figure in the rules table traces to a source in this document
- Driven in the real window, on a real generated ring, before it ships