Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Capabilities

The kernel’s capability ledger, included verbatim from docs/CAPABILITIES.md. It is generated from the hand-written docs/capabilities.toml, and tools/check.sh fails if it goes stale, so this chapter is as current as the commit the book was built from.

Every capability has one of six verdicts, and the gate enforces the evidence each requires:

VerdictMeansMust cite
coveredbuilt and testedsymbols that resolve in the built rustdoc, and tests that exist in the tree
partialbuilt, with a stated restrictionthe restriction in words, plus symbols and tests
divergentdeliberately done another waythe reasoning
absentnot builta plan entry
n/anot a kernel capability for usthe reasoning
unreviewednot yet reviewedcounted against a ratchet that can only go down

Rename a cited symbol or delete a cited test, and the build fails.


Capabilities

Generated by tools/capabilities.py generate; do not edit. The input is docs/capabilities.toml, the only file a person edits. docs/SCOPE.md defines what belongs in the kernel; this file records where it stands.

One capability per thing a caller would ask for, not per type and not per module. Each verdict cites the symbols and tests that back it, and tools/check.sh fails if they drift apart.

Where the kernel stands

verdictcapabilities
covered100
partial13
divergent6

119 capabilities. Ratchet: unreviewed_max = 0.

Capabilities

ogeom-algo

  • algo.bounds: Guaranteed and tight bounding boxes, axis-aligned and oriented, for curves, surfaces and shapes · covered
  • algo.builders: Building topology by hand: vertices, edges, wires, faces, shells, solids · covered
  • algo.classification: Classifying a point against a solid or a face: in, out, or on, exactly · covered
  • algo.curve-sampling: Sampling curves: by count, by spacing, by deflection, by abscissa · covered
  • algo.fit-outline: An outline of lines, tangent arcs and circles fitted around a 2D silhouette, every point between a play and the play plus twice a tolerance outside it, negative play inside it, optionally about the silhouette with holes and notches narrower than a width filled · covered
  • algo.fit-segments-2d: The fewest lines and tangent or cornered arcs fitted to a 2D polyline, open or closed, every input point within a hard tolerance of its piece · covered
  • algo.fitting: Interpolating and approximating points with B-splines, curves and surfaces, and fitting scattered points over a seed surface’s chart to a tolerance · covered
  • algo.global-properties: Volume, area, mass, centroid and principal moments of shapes · covered
  • algo.history: Every operation emits history: what was generated, modified, deleted · covered
  • algo.medial-axis: The medial axis of a planar region · covered
  • algo.mesh-orientation: Face directions, axes of revolution, principal frames and open rims of a mesh · covered
  • algo.nurbs-conversion: Converting a shape’s geometry to NURBS form · covered
  • algo.patch-network: A network of B-spline patches fitted to a scan in one sparse least-squares system: shared curves one set of poles, curves that are not creases held tangent pole by pole, sides that may be chains of curves meeting at T-junctions, corners of other than four patches held tangent where the tolerance allows, spans raised per strip where a patch misses, optional parameter correction, built into a shell of faces sharing their edges · partial
    • restriction: Patches are four-sided, or three-sided with one side shrunk to a point. A side may be a chain of curves (a T-junction), but the side opposite must cross as many strips, split or as one curve; a curve of a split side may itself be crossed by junctions elsewhere (nested junctions), unless the junctions are carried round a loop. A curve between two patches is held exactly tangent where both its ends are on the border, at corners of four patches or at T-junctions; a curve between two junctions whose knot ratios differ is left near tangent. A corner of other than four patches is held exactly tangent only where every curve into it runs on to the border, to a corner of four patches, to a T-junction (the line across the patch through the junction then held tangent at the corner’s ratio, not C¹) or to other such corners (an even corner, or a corner whose curves all end at others, as on a ball covered as a cube, settled with the rest where the ratios asked round every cycle of its scales close), and the fit with it meets the tolerance; where it does not, a corner of an odd number of patches, or an even number above four, whose curves each run on to the border or to another such corner has its gluing spread along its curves, every knot inside their strips doubled and the patches only C¹ across those knots, which meets 0.001 on clean caps of five, six and seven patches. Where the fit near tangent misses too, each held fit that missed is finished from its spans: the points re-taken at their nearest points on it (by the patch across a shared side where a point lies past its own patch’s side) while that comes nearer them and the worst distance grows no worse, the fit refined on after each step with points past their cells’ spread counted as misses, for at most eight steps, the noise read once from the fit at the seed’s parameters; this meets 0.001 on the clean ball covered as a cube and the clean filleted box corner. A clean cap of eight patches at 0.001 still misses (two points on its rim end refinement as strays); there, the curves are fitted near tangent from the points, their angle measured into worst_tangent and the corner’s angle reported. A fan, a point every patch there is three-sided at, is held exactly tangent along its curves and at the point where that meets the tolerance (fans of three to six patches meet 0.001 clean); a point where a three-sided patch meets four-sided ones is fitted near tangent. Parameter correction otherwise runs only after refinement, at the final spans, and only through fit_network_chained; the points are those of the region the network covers.
  • algo.place-copy: Copying and transforming shapes, rigidly or generally, sharing what can be shared · covered
  • algo.point-projection: Projecting a point onto a curve or a surface, nearest first, all minima found · covered
  • algo.primitive-fits: Best fits of planes, spheres, cylinders, cones, tori, circles and lines to points, with residuals, a mesh region grown for one from clicks, its rounded rim peeled, a rim circle or a crease line traced along a mesh’s sharp edges from a click, and the line where the faces either side of a rounded edge meet · covered
  • algo.primitives: The primitive solids: box, wedge, cylinder, cone, sphere, torus, half-space, prism, revolution · covered
  • algo.rigid-registration: Rigid registration: closed-form absolute orientation, point-to-plane ICP onto a mesh with free motions, and symmetry planes · covered
  • algo.sewing: Sewing faces into shells along coincident edges, or across a gap asked for, with spatial acceleration · covered
  • algo.shape-distance: Distance, proximity and overlap between whole shapes, and self-intersection · covered
  • algo.signed-distance: Signed distances from many points to a mesh or a shape’s own faces, facing-aware · covered
  • algo.solid-from-mesh: A solid from a triangle mesh: coplanar triangles merged into planar faces, curved regions recognized as cylinders, cones, spheres and tori · covered
  • algo.spatial-acceleration: Generic bounding-volume hierarchies · divergent
    • reasoning: No generic BVH container library: the kernel’s standing indexes are keyed on what a caller asks of a mesh or a cloud (mesh.spatial-index), and the acceleration structures inside its algorithms (sewing’s cell filter, the classifier’s bounds, the distance walk’s pruning) stay internal to them, sized and keyed for their one question. Picking, outside the kernel (outside/crates/ogeom-select), builds on mesh.spatial-index’s triangle hierarchy.
  • algo.surface-sheet: Laying a flat sketch onto a curved face: geodesic polar coordinates, curves carried with pcurves · partial
    • restriction: SurfaceSheet lays a sheet by geodesic polar coordinates (the exponential map at its origin) on any face whose surface has first and second derivatives: a plane, a cylinder and a cone by their exact development, a sphere in closed form, every other surface by integrating its geodesics and their Jacobi field in its chart, the step error held per unit of length. Lengths along lines through the origin are kept; distortion reports the across-ray stretch over the points carried. Carried curves are fitted chart curves whose lift stands within the tolerance asked (a line on a plane or a cylinder is exact), continued along the curve across periodic seams, so a curve going round a pole of the chart is one chart curve winding a whole period. Refused: an origin on a pole of the chart, a sphere’s reach to its origin’s antipode, a point past the reach, on a pole, off a bounded surface’s domain or past a fold of the map; as one chart curve, a curve running through a pole of the chart, whose chart curve jumps there. On a sphere chart_pieces and chart_edges carry such a curve as pieces meeting at the pole, and split_face cuts a face along them, closing the region along the pole’s row; on a cone they cut it at the apex alike, except along the sheet’s ray from the origin through the apex, where a straight line has no one way on past a point holding less than a whole turn; through a revolved or spline surface’s collapsed side it is refused by name, a geodesic integrated in its chart never carried past the pole (“crosses a pole of the surface’s chart”). SheetMethod::LeastDistortion lays the conformal flattening of the covered geodesic disc that stretches nothing along its rim, scaled to keep the disc’s area (on a sphere the stereographic projection): solved on a polar mesh by one Poisson problem for the scale and a harmonic extension of the rim, rings doubled until two meshes agree within the resolution asked, and mapped back by a fitted polynomial; flattening_error estimates the departure from the smooth map, a bound only where each ring doubling at least halves it (measured near four times per doubling on a sphere and a torus, not proved). It is conformal, not area-keeping point by point: a 6 x 4 rectangle at R = 10 with reach 5 covers 25.07 on the sphere, as the scaled stereographic projection does. SheetMethod::AsRigidAsPossible lays the as-rigid-as-possible flattening of the same disc, settled by local and global rounds from the conformal one on a mesh of 32 rings, and not scaled; its energy is not convex, and the sheet is judged by its measured stretch, not by any distance from a smooth map. Its length ratio against the surface’s metric is measured at the flattened mesh’s vertices and centroids within the reach (not bounded between them) and the sheet is refused past the stretch asked, or where a triangle folds or the rim crosses itself. On a sphere of radius 10 with reach 5 it measures 0.969 to 1.017 in length and 0.970 to 1.034 in area, against the conformal 0.938 to 1.063 in area.
  • algo.validity: Diagnosing a shape’s validity, by entity, with named problems · covered
  • algo.volume-difference: The volume between a scan and its solid on a grid: nodes read by exact parity against the scan and against the solid, those in the solid’s mesh band against its true surfaces; holes filled and doubted, differences joined into missing and excess regions with volume, depth, layer or lump, and the shallower than a cell dropped · covered
  • algo.wall-thickness: Wall thickness at many points of a mesh or a shape’s own faces, by rays or by medial balls · covered
  • algo.zone-fits: Form as the standards define it: the minimum-zone flatness, circularity, cylindricity, sphericity and straightness of points, and their maximum-inscribed and minimum-circumscribed circles and cylinders, exact or certified by the Chebyshev conditions · covered

ogeom-bool

  • bool.booleans: The boolean operations: cut, fuse, common, section and split, exact and fuzzy, with argument checking · covered
  • bool.cells: The cells builder: arbitrary take/remove over the fused arrangement · covered
  • bool.cut-by-mesh-region: Cutting a solid by a break surface marked on a mesh: the break extended over its average plane clear of the solid, holes closed, thickened into a slab and cut away, one side kept, the solid’s faces left on their own surfaces · covered
  • bool.defeaturing: Removing a set of faces from a solid by extending and re-intersecting its neighbours · partial
    • restriction: Inner-loop features (bores, bosses, pockets whose rim is a surviving face’s inner wire) remove in full generality: wire surgery, no re-intersection, the block back to the last bit. Band features (fillets and chamfers along an edge) close for any number of bands in one call, each running straight through with two end faces or wrapping with none, and bands meeting at a corner close together: each recovers its own crease, the corner is where one crease pierces the other’s side, and a wedge’s flush cap named with its band folds into the band’s crease; a tangent chain’s bands close together too (a stadium’s rim rounded in one call), the junction being the foot on either crease of the cross-section edge the two bands share, and a band across a circular crease’s seam read as one run about its own centre rather than its complement; a rebuilt face whose surface has no closed-form pcurves fits them by projection, tolerances widened by the measured offset. A rim blend (a drum’s top, a bore’s mouth, a boss’s seat) takes a whole ring out of its neighbours and closes on the circle they meet along: the neighbours’ surfaces tell that wound from a bore’s, whose faces never meet and whose rings are simply dropped, and a neighbour’s own outer boundary may be the ring, so a drum’s cap grows back to its rim. The wall’s seam reaches the recovered circle, which is where it is cut and what the seam extends to meet. Wires are spliced in the face’s own order, since a seam stands in its wire twice, and a gap that leaves and arrives at one vertex is wound the way the rim it replaces was. A feature of several faces each bordering only one of the neighbours that must meet again (a step along an edge, a notch cut from a corner, a pocket open at an edge) closes by extension: every two neighbours whose surfaces meet across the wound close the stretch of that curve it took, as a new edge between the faces it pierces where they share none there, or by running on an edge they share, cut short or split, to where a third neighbour pierces the curve or to the other half’s end. Neighbours the wound left on one surface facing one way (a slot right across a top, its two halves on one plane) come back as one face through both halves’ surviving edges, and a curve two neighbours meet along that no other face stops (a rebate round a drum’s rim) is taken whole, closing on itself at the wall’s seam: the box and the drum come back exactly. What stays refused by name: a wound whose sides meet in no curve and lie on no one surface, a removal that would leave a face with no boundary and no edge to grow to, and a gap the recovered edges do not bridge.
  • bool.glue: Gluing shapes along known-coincident boundaries · divergent
    • reasoning: Subsumed, and recorded as a settled decision in docs/PLAN.md: the boolean’s same-domain unification already skips nothing it needs and unifies what glue would, so a separate glue mode would be a second spelling of the fuse with a faster wrong answer available. MakeConnected’s job (conformal multi-body assembly) falls out of the fuse plus history.
  • bool.make-periodic: Making a shape periodic so instances tile without seam duplication · covered
  • bool.make-volume: Making volumes from a soup of faces: the arrangement’s closed cells · covered

ogeom-core

  • core.progress: Cancellable, staged progress through long operations · covered
  • core.tolerances: The tolerance vocabulary: confusion, angular, intersection, and per-entity widening · covered

ogeom-doc

  • doc.appearance: Colours, layers, materials and textures, per shape and per sub-shape, with inheritance resolved · covered
  • doc.colour-values: Colour values and their names · covered
  • doc.pmi: Semantic PMI: dimensions, tolerances with datum reference frames and material modifiers, datums, datum targets, and their presentation · covered
  • doc.product-structure: Products, occurrences and instances with placements: the assembly tree · covered
  • doc.properties: Names, user properties, validation properties, lengths and centroids to check a transfer by · covered
  • doc.saved-views: Saved views and standalone note objects in the exchange document · covered

ogeom-fillet

  • fillet.asymmetric-rounds: Asymmetric rounds: a different distance onto each face, elliptical and conic sections · partial
    • restriction: A straight edge between two planes, convex or concave, rounds to a band meeting one face at one distance and the other at another, its section the ellipse tangent to both there (the circular round’s arc stretched to each distance) or a conic of shape rho: the rational quadratic arc swept along the edge, exact, tangent to both faces along its contact lines. A whole rim where a planar cap meets a coaxial cylinder or cone (a drum’s top, a bore’s mouth, a boss’s foot, a frustum’s top) rounds to that section revolved about the axis, exact, tangent to cap and wall along their contact rings, and an open arc of such a rim to that section revolved over the arc, its ends the circular round’s. A tangent chain of such edges, asked in one blend_edges request naming one face with the same distances (a pad’s top loop, a pocket’s floor loop), closes: each band is capped in its end sections, which the bands either side of a junction share. On a straight edge between planes each distance may vary along the edge by a law (linear, or through points), the band exact: the section’s control points carried along the laws’ cubics, capped square where the edge ends at faces square to it. Any other crease the march seats (a spline’s crease along a wall, a bore’s rim on a drum, open or closed) takes a band fitted to the march’s target through the conic sections station by station: each leg walked its distance along its face’s section in the plane square to the crease, as a marched bevel’s is, and the conic tangent to each face’s section at its contact, through the shoulder where those tangents meet. There, with equal distances, the elliptical section is the round of constant setback, not the constant ball, the dihedral varying. Naming the other face with the distances swapped builds the same solid to the bit, and equal distances with the elliptical section are the circular round by the same call. A straight band’s ends are the circular round’s: square caps at a wall, run out across a face that cuts the corner away past an end, cut off by a face overhanging the corner. In a blend_edges request it stands beside the request’s other rounds and bevels where it meets none of them at a vertex; an asymmetric round of equal distances and the elliptical section meets them as the circular round does. At a convex corner of three planes whose three edges are all in the request, asymmetric rounds close with each other, with rounds and with bevels: each band stopped at the least setback where its section clears the others, and the opening closed by one patch held inside the corner’s planes, tangent to each round’s band, the same solid whichever face each names and in whichever order the request lists them. Refused by name: a crease whose sections do not seat all along it (a straight edge between a flat and a drum whose sections run off the drum); a corner that is not a convex corner of planes, or where an edge is left sharp; a varying distance on a rim, along a chain or at an end not square to its edge; asymmetric rounds meeting at a vertex other than as one tangent chain, or one meeting another blended edge at a vertex; a contact set back past its face’s side or a rim’s contact reaching its axis; and largest_fillet_distances answers the largest common scale of a pair that fits, on a straight edge between planes or a rim.
  • fillet.bitangent: Bi-tangent blend construction · divergent
    • reasoning: Subsumed, per the settled decision in docs/PLAN.md: the 2D repertoire carries bi-tangency in the plane and the blend family’s own envelope carries it in space, so a separate bi-tangent constructor would be a third spelling of two existing ones.
  • fillet.chamfers: Chamfering edges: symmetric, two-distance, distance-and-angle · covered
  • fillet.corners-2d: Filleting and chamfering the corners of planar wires · covered
  • fillet.edge-blends: Blending edges: constant and variable radius fillets, rolling-ball, marched where no closed form exists · partial
    • restriction: Single edges, tangent chains and full rims blend, constant and variable radius, and the corner where three blends meet is closed. A concave band on a curved edge whose contact leaves its face past the face’s side (a boss’s foot where the plate’s side runs tangent into the boss, the plate’s top narrowing to a cusp there) is cut off at that side’s plane, its fill ending flush with the side; where the solid stands beyond that plane, or no planar side bounds the face there, it is refused by name rather than laid over nothing. Where the request also rounds the plate’s top edge along that side, one tangent chain through the tangent point, the edge’s convex round turns into the foot’s concave one through an S on each side of that point: two patches G1 to the bands, the top, the side and the wall, held inside the solid and the foot’s fill. A cusp rounded on one side of the tangent point only (an arm’s side edge and its arc into a hub) closes the same way with one patch. It builds at radius 1 on a wall of radius 6 (printCAD’s case, and the arm and hub); other radii are refused by name. Also in this restriction: a rim where a flat cap meets a coaxial cylinder or cone (a drum’s top, a frustum’s foot, a tapered bore) rounds to its exact torus band, where the tube stands clear of its axis, and to the fitted band where that is what builds; an arc of such a rim ending on a planar face oblique to it, with no other edge of the request there, runs its torus band on past the end until the ball’s section has left the solid across that face within four radii, as a straight band’s run-out is read (a fill cut back to the face’s plane), where a cap in the meridian there would leave a sliver of the corner. a corner blend applied through the boolean’s tangency at a face’s own vertex. The marched fillet carries the rolling ball to topology on seats no closed form speaks (a fitted seam between two analytic walls, a conic seat re-opened to its full loop), with the blend fitted through the ball’s own arcs and the legs melting on the hosts’ exact surfaces. An open seat runs out: where the crease ends at a wall the band runs on until the ball has left the solid and the cut trims it against the wall, a straight band so across a boss’s cylinder or cone cutting its corner away obliquely (a D-shaped block’s chord, its wall square, drafted or overhanging, its drum upright or drafted) where it runs out alone; where the faces at its end all turn back behind the crease (a re-entrant turn of its wall, however slight), its continuation runs into the material and the band stops at the vertex; where it ends at a split (a seam vertex, or a neighbouring blend’s own rail), the band is capped in the end section’s own plane, and two such blends meet cap to cap along the shared arc, both caps consumed, in either order. Two convex creases of one request that share a face and turn at a vertex meet there: carried on past it each is a straight band of its end section, and two of one radius cross in the plane bisecting their centre lines, exactly where the reflection in it carries one end section onto the other (a flat shared host, walls whose tangent planes at the vertex reflect into each other). There, across a re-entrant turn both run on to that plane and take the corner cell both hold, where the material holds it (a straight band between planes whose end section reaches past that plane, its wall drafted out under the corner as a moulded pocket’s are, is carried on past it and cut back to it); across a convex turn of a curved crease both stop in it where the bands’ curvature keeps their sections there within a marched band’s fit; either way the two are joined across it into one wedge. Where the end sections differ and both creases are straight (a drafted wall beside a square one), across a re-entrant turn each band is carried on with what stands past its wall and the two are intersected in one boolean, so the corner takes what lies above both bands, bounded by their own intersection, where the material holds it all. Across a convex turn of two straight creases, whatever their sections (an acute, square or obtuse outside corner, its walls square or leaning alike or apart), each band runs out as it does alone and the cuts take their union, as they do where one of the two is a drum’s rim beside a straight crease (a D-shaped block’s arc beside its chord, in either order, its drum upright or drafted) and, past where they meet flush, beside a spline crease (a rib’s wall running into a boss’s rim, the rib’s band run out past the vertex as alone). Across a re-entrant turn one of the two may be a drum’s rim beside a straight crease, the material within the drum (a boss fused onto a block whose wall leans either way, the boss upright or overhanging, a cone narrowing to its foot or standing out at it) or outside it (a bore up to a drafted chord): the rim’s torus band is taken from its cap to where its section stands wholly past the other wall, widened by what stands off the drum before the rim’s cap (beside the chord’s own band too, where a chord through the bore’s axis or past it leans off the drum), intersected so, less what stands off the drum past the other wall, and the rest joined back on. A bore whose chord wall overhangs meets as without a junction, where the band carried on past the rim’s cap would reach under the pocket’s floor, and so does a cone standing out at its foot beside a square wall close to the rim’s cap, where that band crosses the cone at a turn the boolean reads as a touch. A loop of junctions closes, its last junction taken and the ring’s wedge sewn to itself (a square pocket’s rim meets at all four corners, and a disc’s pocket up to a chord at both). Crossed junctions stand beside flush ones in a loop or chain of the request’s edges, the flush ones taken first; a band crossed at both ends is cut in two halfway along, each half joined into its own corner and the two joined again where both hold the band’s one section. Inside corners off square in plan and corners whose walls both lean are taken, the open corner past both walls’ planes taken out of the two widenings, and so is every corner of a pocket off square in plan whose walls each lean their own way. Elsewhere (a crossed junction that would leave two joined bands meeting without one, a turn folding back past the solid, a wider convex turn of two curved bands, or of a curved band other than a drum’s rim beside one of another kind) the later seat runs on through the earlier band or the caps stand, as without a junction, and so wherever the meeting does not close. An L-bracket’s end rim blends over its re-entrant band as one tangent chain (line, the band’s own end arc, line), the ball rolling on the concave cylinder between the lines, to the closed form. A fill and a wedge asked together stop at each other, since only blends that round the same way run on through one another’s bands; whichever is asked first takes the corner, and both orders are exact. Cone, sphere and torus hosts march and blend: the chart inverted in closed form, a band’s connector fitted where no closed form lifts the chart segment, a looping seat with a corner at its join steered by a smooth refit of itself, the band’s first station re-solved on the apex column so a rim opened at the host’s own seam leaves no sliver; a full circular rim whose hosts are not a cap and its coaxial wall takes the march too. A fitted host marches: its chart inverts by projection, a closed patch’s seam wraps as a period does, the patch is continued past the face by a few radii so the ball can run out, a seat the boolean split into arcs is closed back through the neighbours the hosts share and marched as the loop it is, the rail loop slid into the host’s own window, and the wedge melts: a straight edge of a converted box, the crease round a converted post split at its seam, a converted cone’s rim, a converted drum’s rim. Under it a marched section the centripetal fit misses is fitted again by chord length, and a loop cut at a closed patch’s seam is closed on it; a melt the boolean still cannot resolve refuses by name. A rim beside a sphere’s pole whose rail passes over the pole blends with the sphere’s leg running from the rail to the pole, the rim cut from it. A bore whose wall toward the pole is thinner than the ball blends the same way. A rail passing the pole closer than one stride of the march, where its chart turns half round faster than the stations follow, is taken on the same sphere charted with its pole on another axis of its frame and its seam through the widest gap between the seat and the faces’ edges: the leg is built there and the solid’s faces on the sphere are rebuilt on that chart, their old seam and pole edges dropped. Where those faces are not the sphere less some disks (or one disk less others) on the turned chart, the rail is refused by name. A seat whose hosts turn tangent at an end of the crease (the seam of two equal drums crossing, at the points where they touch) pinches there: the stations are solved one by one toward the pole, the pole’s collapsed section closes the band, and the wedge has no cap at that end. A tangency inside a crease with none at its ends is refused by name. A straight crease whose faces are planes or drums parallel to it (a wall meeting a drum along a ruling) blends exactly: the section swept straight, its band a drum of the fillet’s radius. A vertex where a curved face meets rounds with the one ball touching its three surfaces, its centre walked to a radius in from each and its compartment bounded by the planes through the centre and each pair of touch points, so each band’s end section is the ball’s own; fillet_edges closes such a corner, and the bands one at a time with the corner tool after agree with it to rounding when the ruling’s band goes first, or when the rim arc’s band goes first: the straight band’s section through the rim’s torus runs tangent to the torus’s end meridian into the corner, and ends at that vertex. The straight band first runs out across the drum past that vertex, as it does alone, and takes the corner with it; the ruling’s band and the rim arc’s after it agree in either order. The corner tool rounds any convex planar vertex. Where one ball touches every face (a square or oblique trihedral corner, a square pyramid’s four-edged apex), its block is the polyhedron of the N host planes and the N planes through the ball’s centre square to the edges, where each band’s rim and the ball’s coincide. Where no single ball does (a rectangular pyramid’s apex, an irregular pentagonal one), the region the ball’s centre may occupy has a tip of several vertices joined by ridges, and the corner is the exact envelope of the rolling ball: a sphere at each tip vertex, cut with its own compartment, and the flush fillet of a virtual crease along each ridge, the compartments meeting cap to cap on the planes square to the ridges; a ridge seven microns long is kept as the sliver of cylinder it is. At more than three edges the corner goes first and the flush fillets follow, since bands built before the corner crash into each other at the apex. The ball’s pole stands along a ridge where there is one, its seam turned from the corner, and otherwise the tool is offered on each of the corner’s 2N labellings in turn, the first that closes standing; the boolean closes every labelling of an oblique corner and of a square pyramid’s apex, one solid each time. The flush fillets follow at a sharp apex too, and after a corner whose sphere clears a fourth plane by a few hundredths of a millimetre, where the envelope keeps a sliver of that plane beside the patch and the band meeting the sliver runs a straight end tangent to the sphere’s rim: a line and a circle share no stretch, so the tangency splits neither. The curved-seat corner is closed in either order: through fillet_edges a marched blend and a straight one meet at their corners, the later’s run-out walking on under the earlier band, and the boolean decides once per shared edge piece whether it is dust. A sub-piece of one edge lies in several charts, each with its own snap, so deciding once means a sliver that one chart collapses is collapsed in every chart. Where three or more edges of one fillet_edges call meet at a vertex, the corner tool closes it with the rolling ball’s patch before the bands, which stop flush against it: a box corner’s sphere octant, a pyramid apex’s sphere or spheres and cylinders; a corner the tool does not speak keeps the bands’ caps. blend_faces and fillet_faces round curved faces that share no edge: swept from one section where the surfaces share a direction or an axis, marched where they cross otherwise; a swept round whose crease’s edges end on a planar face oblique to the crease runs on past that end until the ball’s section has left the solid across the face within four radii, cut back to the face’s plane, as a chamfer along an arc of a rim ending so does. Between separate faces a marched ball that touches both all the way round a closed seat (a tube through a floor at a slant, two pipes crossing) gives a band fitted closed round the loop, each face cut along its closed line of contact, across the seam of a closed B-spline face whose chart closes on itself without repeating as across a repeating one. Where both faces let a marched ball go round a closed seat, never at the same place, the round is a run over each stretch both hold it: capped and applied in turn on a solid, and between separate faces a round over each run. A marched line of contact crossing a face more than once (a face letting the ball go at two places round its seat, or a line running out of a face and back) holds the ball over a stretch each time, and the round is a run over each overlap of the two faces’ stretches; with trim each face is cut along every stretch and keeps every piece beyond one. Refused by name too: with trim, a marched line of contact crossing a face’s seam or crossing a face over a stretch the other face does not reach; a line of contact crossing a face more than once on a seat with a closed form; and a round crossing a face between the two (a ball wider than a chamfer between the faces it rounds). The ball touching both faces is the one the round’s arc lies on, and a blend is refused by name where another face of the solid, on any surface, B-splines included, holds a point inside it at any station of the run (a chamfer, a round or a wedge between the faces, over all or part of the run), read over the whole run by halving between stations until the centre’s travel fits under the face’s clearance: the strip goes with the corner only where it lies wholly outside the ball. Between two planes and on the swept path only the ball’s lune counts, the part of it between its centre and its arc, searched cell by cell over its section and the run where a face comes inside the ball: a part thinner than the ball, its far side reaching into the back of the ball only, is rounded, and an older, smaller round between the faces goes with the corner, the ball’s side read inside the lune. On the marched path, where the section turns along the run, the lunes are searched the same way, each cell’s travel between two stations bounded by the centre’s and the contacts’ arcs (chord and twice the height) and the radius times the turn of the contacts’ directions, so a part thinner than its ball rounds there too, and an older round just smaller than its ball goes with the corner. blend_faces and fillet_faces round every corner the surfaces cross in that the ball rolls in (a drum’s flat and its wall, two drums fused), where the corners stand apart by more than their reach or a line parts the polygons holding their sections. Faces the crease or a line of contact meets, and faces holding a capped run’s end, are where the round runs off and are not asked. Between two planes a blend is refused by name too where the ball touching both touches a face’s plane off the face at a station of the run (a face narrower than the ball’s setback). An edge round refuses by name where its faces meet tangent (no corner), where the ball’s contact on a face stands past the face’s far side in the material (a boss on the wall) or all along the edge (a face narrower than the setback, which a ball would roll over onto the face beyond), but for a convex straight edge beside a planar strip (a chamfer, a narrow top) whose far edge is convex too: where the strip lies wholly in the corner the ball touching the planes either side of it takes off, its ends on faces square to the edge or slanted to it, the round is that ball’s and the strip goes with the corner, cut back to slanted ends by their planes; and for a convex rim beside a ring (a coaxial cone or torus: a chamfered or small-rounded boss’s rim) whose far circle is on the wall: where the ring lies wholly in the corner the ball touching the cap and the wall takes off, the round is that ball’s torus band, the ring going with the corner, the edge then refused for its faces meeting tangent rounding too; and for a convex edge on a marched seat beside a strip between it and one other face (a bevelled bore’s rim on a drum), the strip closing on itself or running out at end faces (a bevelled spline crease on a slab): where the ball touching the faces either side of the strip along their crossing keeps every face out of its lune, the strip stands behind both surfaces and no other edge but seams comes within the corner’s reach, the round is that ball’s marched band and the strip goes with the corner. A concave straight edge beside such a strip whose far edge is straight and convex (the seam of two solids fused at a slant) rounds with the ball touching the other face and resting on that far edge, its centre on the ellipse, or the line, where the plane a radius off the face meets the cylinder a radius about the edge, the band fitted through the balls’ arcs to the marched band’s target with its rails on the face’s plane and the edge’s line, where over the whole crease the ball rests on that edge alone, its contact moving one way along it, touches the face within it, comes within its radius of no other face and its sections do not cross (an end face meeting the far edge’s end, touched there by the end ball, is clear of every ball). Where a ball on that edge comes within its radius of the faces beyond it, and the strips beyond the narrow face are planes whose far edges run parallel to the edge over its whole length, ending on planar faces square to it or slanted, the ball may rest on the far edge of a strip beyond (a wall on a staircase with a deep drop past its lower step): the round is the cylinder about the line its centre runs on, and the fill is the prism of one section fused on, the strips it reaches over going into it. Where those far edges are slanted to the edge, the ball may rest on a convex far edge of a strip beyond, its centre on the ellipse about that edge’s line, the round the band through its arcs and the fill the band’s wedge with one face on each strip between, fused on; the walk takes each strip’s far edge as the first it crosses square from the edge before, and a face is cleared only of its part in front of the touched face’s plane and of the planes through the far edge’s line square to the ball’s radius, so a held far edge may end where the end ball touches an end face; past a concave far edge over such strips the ball may come down on the face they run into, the floor going in as the last strip. Past a concave far edge the ball may touch the plane face the strips run into instead (a flat in an inside corner, a staircase coming down on a floor): the round is the cylinder a radius off that face and the touched one, the strips between going into the fill. Where the ball changes what it holds partway, the round is a chain of such bands meeting tangent on the section where the ball holds three things at once, each piece the ball’s holding a face on each side (the cylinder between the planes), a face and an edge of the other face (the ellipse), or a face and a corner of the other face (the circle a radius over the face and a radius from the corner, its band’s arcs all ending on the corner): it comes down on a strip that widens past its setback, narrows onto the other face’s far edge, or rolls round a corner of a triangular strip onto its next edge, under the same conditions on every piece. It is refused by name where the ball comes onto the face beyond a far edge along the crease (it then rounds the corner between that face and the one it touches, another seam’s round), rests on far edges of both faces at once, or leaves either face, and in a request where the edge shares a face or a vertex with another of its edges. A ball whose contact runs off a face along part of an edge, out of the solid, is cut off there as alone, in a request too: where the edge shares a face or a vertex with another of the request, or stands within the two setbacks’ sum of another, its band is checked against theirs on the stretch the face holds, up to the face’s side, and on the face across that side, at the side and, for a convex edge, where the ball’s arc meets that face. It refuses by name where the face it runs off, or, convex, the face across, is not planar with straight sides, where a convex band is cut off by more than that one face, and where those points stand inside another band. A request may give each edge its own radius (fillet_edges_with): two bands of different radii turning at a vertex take the union of their cuts, a tangent chain steps its radius at a junction, and a corner where three or more bands of different radii meet is refused, since no ball rolls round it and the patch between the bands’ ends is not built.
  • fillet.setback-corners: Setback vertex corners: bands stopped a chosen distance along their edges, one patch over the opening · partial
    • restriction: At a convex planar vertex one ball touches every face of (a box corner, a square pyramid’s apex), each band of the vertex’s edges stops at its own setback, cut square to its edge; on each face the trim runs from one band’s rail end to the next on a conic tangent to both rails, and one patch fills the opening of arcs and conics, fitted G1 to every band end and face within the bands’ fit target. A setback equal to the ball’s own is the ball corner. On a solid bounded by planes, fillet_edges and fillet_edges_with close a corner of three rounds no one ball touches (three radii, or convex and concave meeting, as at an L-bracket’s front edges at its re-entrant edge) through the blend engine, the same solid in any order: each strip ends through its faces’ setback corners, skew on its cylinder where they stand apart, and one transfinite patch closes the corner tangent to the three strips’ ends within the bands’ fit target, proved inside the corner’s material, concave rounds’ fill included. Off the engine’s class, fillet_edges_with closes a corner of three bands of different radii the same way as round_vertex_setback, each band stopped its own width past the least setback at which its section clears the others, and short of where any other band reaches its section plane. A patch fitted freely that strays past a plane of the vertex is held inside it where it strayed and fitted again, so the box corner at 1, 3 and 2 closes within the block; where the patch misses the bands’ fit target, or no held net keeps it within the planes, it is refused by name. Where a convex and a concave band of one request meet at a vertex of three planar faces and three straight edges, all rounded (an L-bracket’s front edges at its re-entrant edge), fillet_edges closes it the same way whatever the request’s order, the same solid to the bit: each band its own width past the least setback, and on a face reflex at the vertex the face kept on the side of its conic away from it; coplanar faces a fusion left there count as one. With a convex edge of such a vertex left sharp (the L-bracket’s upright front edge), the opening runs into a point Q on that edge as round_vertex_setback_sharp’s does, the trim on a face reflex at the vertex a cubic swinging round it; both orders give the same solid to the bit. Refused by name there: a concave edge left sharp, a band whose setback reaches its edge’s far end, a cell (twice the widest band behind the vertex) reaching through the solid’s far side, and a patch that no net holds within what the solid and its concave rounds hold near the vertex (out of each concave round’s ball) within the bands’ fit target. round_vertex_setback_sharp closes a box-like corner with two of its three edges rounded and the third left sharp: the sharp edge is cut at its own setback, at a point Q, and the opening runs into Q, where a three-sided patch with its fourth side shrunk to Q, held tangent to both of the sharp edge’s faces exactly up to the held trims’ projection, turns its normal from one face’s to the other’s; one patch G1 within the bands’ fit target closes the rest. blend_edges closes a convex corner of one round, one bevel and one edge left sharp so, in any request order, the sharp edge cut as far out as the farther band and the rest meeting the bevel’s end and the trims from it in position only. Sharp edges at vertices of more than three edges are still refused by name. Refused by name: a corner whose cell holds anything of the solid but the corner (a void, a hole, another feature: a face neither meeting the vertex nor on one of its planes, taken whole or cut through by the cell, or a shell dropped), G2 (a circular band meets its face at G1, so its end arc bends the patch at 1/radius where the face asks none; curvature-continuous band sections come first), a vertex a curved face meets, planes sharing no tangent ball, a curved edge leaving the vertex, and a setback inside the ball’s own or past the edge’s end. fillet_edges_cornered asks setbacks through fillet_edges’ corners: the edges rounded once, each named vertex closed the same way, refused by name where an edge at a named vertex is not rounded or two setbacks along one edge meet. Owed: the patch as a network of quads from the sides’ midpoints to a centre, held tangent exactly rather than to the fit.
  • fillet.variable: Variable-radius fillets under a radius law: linear or by points along the chain · partial
    • restriction: The radius follows a law by arc length along the chain (linear, or radii at fractions interpolated C1 without overshoot), the section the arc of the law’s radius in the plane square to the edge. Rounded: a straight edge between two planes under any law, its envelope exact (a cubic B-spline along the edge by the rational quadratic arc across it under a law of points); a closed loop of curved edges between the same two faces, one closed edge or the arcs it is split into end to end (a drum’s rim, a cut drum’s oblique rim), marched with the law’s radius station by station and the band fitted through each station’s arc; an open curved edge whose ball runs out past its ends (a half drum’s rim), the law laid along the edge and held at its end radius past each end, where the ball runs out at that radius, or, where the crease ends on a planar face whose plane holds the ball’s section there (a cut square to it), stops at the vertex capped in that face’s plane; an open chain of arcs of one curve between the same two faces, end to end (a crease split at a vertex), rounded as the one seat over the window its arcs cover; a straight edge along a drum’s ruling (a flat or a wall meeting a drum, or two drums), marched with the law’s radius; and a seat pinched where its hosts turn tangent at an end (two equal drums crossing), each station solved at the law’s radius for its place and the pole’s at the law’s radius there; and a chain of edges of different seats continuing each other end to end, open or closed (the top loop of a rounded-rectangle pad: sides between two planes, corners’ arcs between the top and a drum), each edge under the law over its own stretch of the run, its band stopped in its end sections, and the bands’ wedges joined across each junction’s plane, where one ball touches the same two points from either side, sewn within the marched band’s fit, and applied in one boolean; and a chain of straight edges between planes turning where they meet on one shared planar host (a block’s top loop, an L-block’s), each band carried past a turning vertex at the law’s radius there, as the law holds level past an edge’s end: the constant band of that radius, running out across a convex turn as that band alone does, the cuts taking the union, and carried to the plane bisecting a re-entrant turn, where the two are joined; across a re-entrant turn whose bands’ sections differ (a drafted wall beside a square one), each band follows the law to the vertex and is carried on level past it with what stands past its wall, and the corner takes what lies above both, as the constant corner does; across a convex turn whose bands’ sections differ (a drafted wall’s foot leaning out under the far face), a band that runs out past the vertex is built on past it as one surface, the law held level past the edge’s end as far as the constant band runs out, where that band ends square to its crease; a loop the tangent junctions join round to one convex turn (a pad with one vertical left sharp) is opened at a straight band between two of them, built in two halves meeting flush, so no wedge overlaps itself at the turn; and a chain turning where marched bands meet (a drum’s ruling turning into its rim), met in rounds as fillet_edges meets it, each piece an earlier round leaves under its own window of the law and run on through the earlier band at the law’s radius there. A straight edge between two planes, alone or in a chain joined across tangent junctions or turning on a shared plane (outside the rounds a curved crease’s turn is met in), whose ball’s contact runs off a face beside it (a strip left beside a groove) is read station by station at its law’s radius as the constant round reads its own: a contact on any face of the solid holds, one in the open is cut off there, the band running on over it, and one in the material refuses; in a chain the cut-off band’s contacts are carried past the face’s side and checked against the other bands at every station. A curved edge alone, and a closed loop of arcs of one curve marched as one seat (a drum’s rim beside a ring grooved into its cap), are read so too, the law laid by arc length as the march lays it; and a straight edge alone beside a narrow strip the ball takes off whole at every radius of the law, as the constant round takes it off (its ball off the edge’s faces), the exact envelope over the seat between the faces either side of the strip, while a law whose ball sits on the strip throughout rounds the edge beside it. Refused by name: a law whose ball sits on a narrow strip at some radii and takes it off whole at others, where the constant round changes construction; a linear law changing radius round a closed chain (it jumps where the chain closes), a turn where a marched band meets a straight band between planes (under a law the marched band is fitted, the constant round’s there an exact torus band, and its end meets the straight band in what the boolean does not melt, whichever is built first and however it ends), a loop joined round a convex turn with no straight band between two junctions to open it at, a ball whose contact at any radius of the law runs off a face beside the edge into the material (a step raised beside a strip), or off a face beside an open chain of arcs of one curve or an edge of a chain met in rounds, two bands overlapping across a face they share, any other straight edge whose faces are not both planes (a drum’s ruling inside a chain among them), a law over one arc of a crease that closes through other edges (the whole loop is given instead), and a ball at the law’s largest radius that does not fit the faces.

ogeom-geom

  • geom.adaptors: Evaluating topology as geometry: an edge’s curve and a face’s surface, placed · covered
  • geom.conversion: Converting between curve and surface forms: to B-spline, to Bézier segments, degree elevation · covered
  • geom.curves-2d: Parametric plane curves, the pcurve vocabulary · covered
  • geom.curves-3d: Parametric space curves: lines, conics, Bézier, B-spline, trimmed, offset · covered
  • geom.extension: Extending curves, surfaces and faces beyond their domains · covered
  • geom.local-properties: Local properties along curves and across surfaces: tangent, normal, curvature · covered
  • geom.surfaces: Parametric surfaces: planes, quadrics, swept, Bézier, B-spline, trimmed, offset · covered

ogeom-heal

  • heal.canonical-simplification: Recognizing that exact geometry is secretly analytic: a B-spline that is a cylinder · covered
  • heal.custom-remodelling: Rebuilding a shape’s geometry wholesale: baking transforms, converting representations · covered
  • heal.fix-shape: Fixing broken shapes: wires, faces, shells, solids, free bounds, small features · partial
    • restriction: fix_shape is the standalone entry point: diagnose, put a wire’s edges end to end where an order exists, collapse edges shorter than their own vertices’ tolerances, make one of two vertices a wire’s edges meet at within the trim cap, fill a wider gap with a straight edge where it is provably the one lacking (shorter than every edge of each face it is in, no other vertex as near its ends, on each face’s surface within the face’s tolerance, each face checking clean after; any other gap stays reported), give a boundary crossing a pole its degenerate edge, fit missing pcurves, sew loose faces, strip a wire’s tails (an edge out and one straight back along the same curve within their tolerances, on one copy of the chart, held by no other face; a hole of tails alone goes) and cut off its notches (an edge run back along part of the one before it, the longer cut where the shorter turns; check names two-edge tails and notches, not a slit of one edge), remove a hole held by no other face whose every point is within the face’s tolerance of its boundary, on a plane, cylinder, cone, sphere, torus, B-spline patch, or revolution or extrusion of a B-spline (proved cell by cell on the chart drawn to a bound on the surface’s first derivatives over the hole’s box, closed form on the elementary surfaces and from the control net on a spline; the hole’s area within the tolerance times its length is necessary, not sufficient; any other surface keeps its holes), judging and healing each placed copy of a face on its own where it stands (a copy whose tail or hole another face holds at its placement keeps it, a scaled copy keeps its holes), mend a boundary crossing itself once in its chart (two consecutive edges crossing short of their vertex within the trim cap are cut back to the crossing and the vertex moved there; any other crossing of a one-wire face held by a container splits it into its two loops; each face changed checking clean after, anything else counted), bound a wireless face by its domain’s sides (seam and pole edges) on a sphere, torus or patch, or mark it natural where those sides have no closed form (a wireless face on a plane, cylinder or extrusion stays reported: its domain is a working window, not an extent), state the gap between two free edges of a shell’s or a compound’s loose faces that are each other’s only twin within the trim cap (the gap shorter than every edge of either face, no other vertex as near their ends) where sewing a copy shows it joins them, chain free edges into contours and wires (free_bounds), tighten tolerances, widen an edge to how far its pcurves stand off its curve and a vertex to how far its curves end from it (within the trim cap, as the readers record the same slop), orient each run of a shell’s or solid’s faces along their shared edges, turn a solid’s run facing into its material as a whole, restore tolerance containment by widening what is bounded (restore_containment, which the STEP and IGES readers run on every body they build), diagnose again, and report what it did and what remains. Beneath it: reanchoring periodic rings, sewing, validity diagnosis, the reader’s inline heal sequence, and the instructed fixes: fix_face_pcurves fits the trims the reader refused at a caller’s cap, and re-charts a sphere face whose trim runs within 0.05 rad of a pole of its chart without running through it (rechart_clear_of_poles, which the STEP and IGES readers run on every face they read): the same sphere charted about the candidate axis whose poles stand furthest from the trim, the face restated in place, a face no chart clears refused by name; and reanchor_boundaries moves a boundary onto the surface it bounds with the displacement recorded in widened tolerances, both measured on community assemblies with boundaries millimetres off. fix_small_faces collapses a spot face to a point and a strip face to one long side, rebuilding its neighbours so the shell stays closed; remove_small_solids drops debris solids under a volume; solids_from_shells makes solids of closed shells, outer boundaries told from voids by which shell holds which vertex. self_union (in ogeom-bool, opt-in) resolves a solid whose boundary passes through itself into the union of the material it encloses: faces split where they cross, pieces kept where the winding number is zero beyond and positive behind; faces crossing one they share an edge or corner with, or folding through themselves, are refused. A STEP grid of patches reads as one spline surface. Healing here is measured by the imported corpus rather than claimed in general.
  • heal.same-parameter: Diagnosing and repairing the same-parameter law between a curve and its pcurves · covered
  • heal.scripted-pipeline: Resource-file-driven sequences of healing operators · divergent
    • reasoning: The job (run a heal sequence on import) exists and is done with a fixed inline sequence in the exchange readers, measured by the corpus. A pipeline scripted from resource files is configuration the applications that need it can build from the same functions; the kernel keeping a config-file interpreter would be an application affordance.
  • heal.status-reporting: Statuses, messages and traversal support for the healing pipeline · divergent
    • reasoning: Healing outcomes here are values: SameParameterReport, StepReport, counts from reduce_tolerances. These are Rust Results rather than status bitfields read back through a registrator. A message-registration framework would add a second channel for what the return values already say.
  • heal.substitution: Recording shape substitutions and applying them across a model · covered
  • heal.tolerances: Reading and tightening the tolerances a shape actually needs · covered
  • heal.upgrade: Upgrading shapes in place: same-domain unification, edge merging, subdivision, splitting along curves · covered

ogeom-hlr

  • hlr.projection: Projecting a model into a view with visibility classified: hidden line removal, exact and polygonal · covered

ogeom-intersect

  • intersect.analytic-sections: Closed-form intersections of planes and quadrics · covered
  • intersect.curve-curve: Intersecting two curves, in the plane and in space: crossings, tangencies, overlaps · covered
  • intersect.curve-surface: Intersecting a curve with a surface: piercings and lying segments, with transitions · covered
  • intersect.extrema: Extrema between two curves, a curve and a surface, or two surfaces · covered
  • intersect.surface-surface-march: The general surface/surface intersection: seeding, marching, branch assembly, approximation · covered

ogeom-io

  • io.3mf-colours-and-roles: 3MF colours from colour groups, base materials and textures, and the roles of objects and volumes · partial
    • restriction: Colour groups, base materials and texture groups read at each triangle’s corners, textures (PNG or JPEG parts) sampled by the nearest texel and tiled as the texture says, none read as clamp. Composite materials and multi-properties are passed over with a warning. Roles (part, modifier, support blocker, support enforcer, negative volume, or another as written) are read by name from objects’ metadata and from the configuration parts under Metadata/, by triangle range or by component; a role kept in any other form is not seen, and the volume reads as a part. A volume’s triangles stay in its object’s mesh, the volumes saying which they are.
  • io.dxf: DXF drawings, both directions: lines, arcs, circles, ellipses, bulged polylines, splines and text, with units and layers · covered
  • io.iges: IGES, both directions: solids as manifold B-rep, sheets as trimmed surfaces, surface files sewn, units converted · partial
    • restriction: The core entity set reads and writes, and eight round-trip cases hold it to measured volumes: planes, a periodic cylinder wall with its seam, a doubly periodic torus, a seam-only sphere, a boolean result, a spline-walled prism through its tabulated cylinders (122 over 126), a revolved spline profile through its surface of revolution (120), and inch-unit scaling. The writer writes surfaces of revolution, extrusions and offsets in their own spellings (120, 122, 140; an offset as its analytic form where it has one, over a plane or spline basis otherwise, any other offset as a spline patch), and the reader reads each back as the same surface; a solid’s whole name goes out and comes back as its Name property (406 form 15). The reader also takes every axis-aligned conic arc (104: ellipse, hyperbola, parabola, each as its own curve), ruled surfaces (118) as the degree-one patch between the two curves’ exact spline forms, and constant offset curves and offset surfaces (130, 140). A conic whose axes turn is read in the frame where its cross term vanishes and turned back, exactly; parametric spline surfaces (114) convert exactly to bicubic B-splines; an offset curve whose distance varies (linearly with arc length, or as a function curve’s coordinate) is fitted same-parameter with its base; and a trim given only in a B-spline surface’s parameters is lifted through the surface. Model-space annotation (notes, leaders, labels, symbols and the linear, radial, diametral, angular and ordinate dimensions) reads as PMI callouts of the lines the file draws, a dimension whose text states a number carrying that value as a semantic dimension. Subfigure instances place their definition (308, 320) or base, built once and shared under each placement: a singular instance (408) or a network instance (420) by its scale, matrix and translation in the specification’s order, a rectangular (412) or circular (414) array at each position its DO or DON’T list keeps, a group (402) as its base placing every member; a network instance flagged logical (a schematic’s), or scaling its axes unlike, is refused by name, and connect points are not read; a definition’s solids, trimmed and untrimmed surfaces, constructive solids and curves are placed with it; levels (with 406 level lists) and groups (402) read as the document’s layers. Constructive solids read as the solids they describe: the block, wedge, cylinder, cone frustum, sphere, torus and ellipsoid primitives (150 to 168), solids of revolution and linear extrusion, boolean trees (180) through the kernel’s own booleans, solid assemblies (184) and solid instances (430). A trim given only in the parameters of a plane, cylinder, cone, sphere or torus is lifted through the format’s parameterization, each surface framed by the reference direction it names; on a tabulated cylinder (fractions of its directrix and generator) and a surface of revolution whose generatrix is a line, a spline, a circular arc or an ellipse with its axes along its plane’s (the generatrix’s own parameter, an arc’s or ellipse’s its angle from the format’s start angle, and the angle turned). Independent untrimmed surfaces (parametric spline, ruled, revolved, tabulated, B-spline, and offsets of those) read as faces bounded by their own extent and sew with the rest; the writer writes a face with no boundary as the trimmed surface whose outer boundary is its surface’s. Copious data drawn as a path (106, forms 11 to 13 and 63) reads as the exact polyline through its points, a trim taking each segment as an edge; a point set (forms 1 to 3) is no curve and is refused by name. Refused by name: a trim on a surface of revolution of a hyperbola, parabola, turned ellipse, composite, parametric-spline or offset generatrix, whose own IGES parameter this reader does not carry; a drawing’s own annotation stays on the sheet and is counted as skipped. Independent curves that are geometry (100, 102, 104, 106, 110, 112, 126, 130) read as wires, a composite curve’s matrix carrying its pieces and its points passed over, and the writer writes a free wire or edge as an independent curve. Stand-alone points (116) that are geometry read as vertices, and the writer writes a free vertex as an independent point. A curve on a surface (142) builds its trim from its model-space curve unless its preference flag prefers the parameter-space curve, which is then lifted, the model-space curve standing in where that lift fails. A parent’s matrix carries the children it owns physically, as IGES 5.3, section 3.2.3, table 4 lists them: a trimmed surface’s surface and boundaries, a subfigure definition’s members, a drafting entity’s leaders and witness lines, a composite curve’s pieces, and the curves and surfaces the swept, ruled and offset entities are built from; a child owned only logically stands where its own matrix puts it. An independent bounded plane (108, form 1) reads as the face its curve encloses. External references (416) to a definition or a whole file resolve, through read_iges_file, against the files in the deck’s own directory, each file identified by the name its global section gives it and a definition by the symbol its index (402, form 12) lists; a missing file, a misnamed file, an unlisted symbol, a logical reference and a reference to a natively kept definition are refused by name, as is every reference in a deck read from text. A document’s construction geometry is written as independent entities flagged as construction (use flag 06): a point (116), a curve as an edge’s is (a hyperbola or parabola as a conic arc, 104), a surface as a trimmed surface (144) over the exact B-spline patch (128) of its window, an axis as a transformation matrix (124), each named by its label and a Name property; an item with no exact B-spline form is left out and named in write_iges_reported’s warnings. The reader reads such entities back into the document’s construction, a composite of several pieces and a surface trimmed by a boundary of its own excepted; a line reads back over its own length from its start, and a surface other than a plane or a B-spline over its patch’s parameters.
  • io.mesh-formats: The mesh exchange formats: STL, OBJ, PLY, glTF/GLB, 3MF, with welding on import · covered
  • io.native-format: The native shape interchange format, versioned, with location and triangulation sets · covered
  • io.obj-materials: OBJ colours: material libraries’ diffuse colours, PNG and JPEG textures sampled at each corner, per-vertex colours · covered
  • io.ply: PLY in text and both binary byte orders: meshes and point clouds, with normals, colours and named scalar properties · covered
  • io.step: STEP, both directions: solids and sheets, construction geometry, assemblies, colours, validation properties, semantic PMI (AP242 datum systems included) and presentation PMI · covered
  • io.text-clouds: XYZ and PTS text point clouds, columns named or read by their count · covered
  • io.vrml: VRML scenes · covered

ogeom-math

  • math.analytic-carriers: The analytic curve and surface carriers: lines, conics, quadrics · covered
  • math.bspline-basis: The B-spline basis: knots, evaluation, derivatives, insertion, elevation, splitting · covered
  • math.curve-constructors: Constructing curves from constraints: through points, from centre and radius, trimmed arcs · covered
  • math.elementary-evaluation: Evaluating and parameterizing the elementary curves and surfaces in closed form · covered
  • math.equation-solving: Roots and minima of functions and systems: Newton, Brent, bisection, polynomial roots, global minima · covered
  • math.linear-algebra: Dense and sparse linear systems, least squares, eigenvalues · divergent
    • reasoning: Dense linear algebra is nalgebra’s, on purpose: the workspace is generic over RealField so extended-precision scalars can be swapped in (docs/DATA_MODEL.md), and reimplementing SVD/LU under that constraint buys nothing but bugs. What is ours is the sparse matrix and conjugate-gradient path the fitting pipeline uses (ogeom_math::SparseMatrix, ogeom_math::least_squares_cgnr).
  • math.primitives: Points, vectors, directions and frames, in the plane and in space · covered
  • math.quadrature: Numerical integration · covered
  • math.tangency-constructions: 2D tangency constructions: circles and lines tangent to points, lines and circles · covered
  • math.transforms: Rigid and general transforms, quaternions, and their interpolation · covered

ogeom-mesh

  • mesh.boolean: Booleans between closed meshes, and between a mesh and a meshed solid, decided exactly, coplanar faces included, new vertices rounded and flagged · covered
  • mesh.editing: Editing triangulations: half-edges with stable numbers and source vertices, components, rims, face removal and flips, non-manifold input split and reported, welding, decimation verified both ways, in place with source vertex sets carried through collapses and markings of the source mapped to regions · covered
  • mesh.hatching: Hatching faces: iso and free-direction line families clipped to the trim · covered
  • mesh.hole-filling: Filling a rim of an editable mesh: triangulated with the least largest bend then the least area, exactly up to 500 edges and ear-clipped on its plane beyond, refined to the mesh’s spacing, faired curved or flat, closed and manifold about the patch, touching holes parted at their shared point · covered
  • mesh.hollow-thicken: Hollowing a closed mesh to a wall from its exact distance field, the cavity marched on tetrahedra, decimated within a sixteenth of a cell and checked exactly strictly inside; thickening an open mesh by two offset layers walled along each rim · covered
  • mesh.offset: Offsetting an editable mesh by a distance with sharp edges and corners kept by least squares over corner-angle-weighted face normals, moves capped, folds repaired by pushing overshooting vertices onto the offset planes and collapsing folded faces while staying a manifold, and a region stepped behind a closed wall · covered
  • mesh.plane-cut: Cutting an editable mesh by a plane with the section’s exact side test, and capping the cut flat and watertight: discs, rings and nested caps, rim gaps bridged within a distance, the rest reported open · covered
  • mesh.section: Sections of a triangle mesh by a plane or a stack of planes: polylines welded through shared edges, carrying the material side, with exact side tests and non-manifold edges reported · covered
  • mesh.shadow: The shadow of a triangle mesh on a plane, holes kept, and the regions of weighted planar chains, traced with exact integer tests and snap rounding · covered
  • mesh.smoothing-curvature: Feature-preserving smoothing of an editable mesh onto local least-squares quadrics, creases kept by normal angle, moves capped and blended into a region; mean, Gaussian and principal curvatures with their directions at each vertex of a mesh · covered
  • mesh.spatial-index: Spatial indexes over meshes and point clouds: nearest point, ball and ray queries, batched in parallel, equal to brute force · covered
  • mesh.tessellation: Triangulating shapes to a stated deflection by chord and angle alone, with no length cap, deterministically, in parallel · covered

ogeom-offset

  • offset.draft: Drafting faces about a neutral plane for mould release · partial
    • restriction: Planar faces turn about their neutral line, walls of revolution (cylinders and cones) turn about their neutral circle into exact cones, and extruded walls (a spline profile swept straight) turn ruling by ruling about their neutral crossing’s own tangent and re-fit, with the drafted angle held along the height. Every other face (a raw fitted patch, a wall of revolution about an oblique neutral) is drafted the way a mould-maker drafts: the ruled surface through the face’s crossing with the neutral plane, rulings the pull turned by the angle, read off the face’s own mesh and corrected onto the surface. A face the neutral plane does not reach turns about where its own surface, run on beyond the face, meets the plane: the planes’ line, the neutral circle, the ruling’s closed-form height, a drum’s or cone’s rulings run on to the plane, or a patch’s crossing within its own extent; a patch that stops short of the plane has no extension to carry the hinge and is refused by name. A draft whose turned rulings cross inside the drafted window (a profile curled tighter than the draft’s reach) is refused by name, as is a face the neutral plane crosses in two runs: a region beside both would turn about two hinges, and the face would split where the two turned supports meet, which a draft (the same faces on turned supports) does not do.
  • offset.filling: Filling a boundary with a face: the plate surface · covered
  • offset.form-features: The form features: prism, revolution, rib and slot against a base · covered
  • offset.loft: Lofting through sections, ruled or smoothed · partial
    • restriction: The ruled loft takes two closed wire sections (coaxial parallel circles, or polygons of the same corner count whose ruled walls come out planar) or a section and a point: a cone on a circle’s own axis, an exact pyramid over any straight loop. The skinned loft takes N closed sections, planar or not (a planar end is capped by its plane, a wavy end by a patch skinned from the rim to a point inside it), ends at a point on request, loops back on itself, and takes per-section alignment hints. A ruled wall between two segments that are not coplanar is the bilinear patch through its four corners, exact, so polygon sections may be turned against each other. make_loft_solid closes the loft sheet into a solid through N closed sections with planar ends, ruled or smooth: sections of different edge counts, lines, arcs and splines mixed, are split to match by arc length, every piece exact, so a ruled square to circle is exact; with guide curves the walls are the guided Gordon sheet, capped by the end sections’ planes, holding every section exactly and every guide to ten confusions. Guided sections of several edges share one edge count and a guide runs through every corner where two edges meet; each edge’s wall is the Gordon patch between the guides through its two corners. The skinned loft holds its sections exactly where they are exact: through two sections it is the ruled loft; through more with matching corners, one strip per edge meeting along seams through the corners, a plane wherever its rows share one; through coaxial circles, the revolution of a meridian through their radii.
  • offset.middle-path: Extracting the middle path of a pipe-like solid · covered
  • offset.projection: Projecting wires normally onto faces, pcurves riding along · covered
  • offset.shell-thicken: Offsetting shapes and sheets, and thickening shells and sheets into solids · covered
  • offset.sweeps: Sweeping profiles along spines: pipes, pipe shells, evolved shapes, the frame laws · partial
    • restriction: Pipes run a circular section along a spine edge, exactly for straight and circular spines and skinned for free-form and helical ones, and along a wire of lines and arcs, open or closed, as the pipe shell of the disc square to its start with its default mitres, wherever that sweeps it exactly: legs meeting tangent are the cylinders and torus segments they sweep, a closed one a ring with no cap, straight legs are mitred on the planes halving their corners, a sharp corner of a wire with arcs, between two lines or turning in the plane of the arcs beside it (a line and an arc, or two arcs), is the union of the legs and their straight run-ons outside the turn, each cut on the plane halving the corner in one half ellipse, the legs meeting inside the turn where each rim point’s two paths cross, and a corner that turns an arc out of its plane, or turns in it so tightly that the paths inside it miss, is mitred in pieces. A wire the pipe shell refuses, or sweeps only as a skin (a free-form edge), is refused by name, as is a leg shorter than its corner’s reach; the skinned pipe takes such a wire to a stated tolerance, as the pipe shell of its disc. place_on_spine brings a profile drawn elsewhere onto a spine’s start before a sweep, rigidly about its centroid: turned square to the start tangent by the least rotation, moved so its centroid is the start point, or both. A pipe shell may bring its own profile on, as PipeLaws::contact asks: PipeContact::Contact moves it along its plane’s normal until its plane runs through the start point (the start’s foot on the plane is the contact point, so an open wire is moved as a face is), and PipeContact::Correction then turns it about the start by the least rotation standing it square to the start tangent; a profile with no plane, or whose plane holds the tangent, is refused by name. The evolved sweep runs a profile along a planar spine, exactly, by composition. The pipe shell sweeps an arbitrary planar profile, holes and all, along an open spine wire under a rotation-minimizing or Frenet frame law, and it also sweeps a profile round a closed spine, smooth or faceted, holes and all: the loop’s holonomy paid off, a faceted profile skinned as one C1-closed strip per facet, each hole a void tunnel of its own shell. A sharp-cornered ring mitres exactly when its corners turn in the plane: the wrap is one more mitre, the seam must stand on a corner, and the planar Pappus volumes land to the last digit. The Frenet law rides the loop too (single-valued round it, so it owes no reconciliation), with every corner loop one rail shared by the two strips meeting there. A ring seamed mid-leg butts its two half-legs on the seam’s own ring, and a skew-cornered ring closes on its mitres: the frame is reflected across each mitre plane, the loop’s holonomy spread along the legs as a twist. A corner against a curved leg, on an open spine or a ring, ends both walls on the crossing of their generators, exact where the corner turns in the leg’s plane. A skew corner against a curved leg keeps the reflected frame and mitres in pieces: each side is swept on straight past the corner, trimmed by the mitre plane, and the pieces fused, the difference between the two sections standing as a face of the mitre plane; a closed wire profile sweeps there as the walls of the face it bounds, the end caps taken off. Each spine edge skins its own run, so a spine whose curvature steps at a smooth join (an arc into its tangent line) is followed exactly, and a run whose sections share a plane is that plane. A spine of lines and arcs meeting tangent is swept exactly: each line leg an extrusion of the section, each arc leg its revolution about the arc’s axis, the legs fused, so every wall is the plane, drum, cone, ball or torus its profile edge sweeps. Round sharp corners turning in the planes of the arcs beside them, with the default mitres, any planar face, holes and all (square tubing, a rectangle off the spine, a rounded slot), is swept exactly too: each edge’s walls are those closed forms down each leg, outside a turn run on straight and cut on the plane halving the corner, where the two legs’ run-ons are mirror images whatever the section’s shape, and inside it cut on the curve where each point’s two paths cross, a conic held exactly for a straight edge and a curve fitted within the stated tolerance for a curved one. Where the paths inside a turn miss, or an arc bends round an axis the section reaches, the general sweep takes the corner. make_helical_sweep is the screw motion of a profile in a plane through the axis, cylindrical or tapered, either hand: every point runs its own helix and the walls are fitted through those images in quarter turns. make_pipe_shell_evolving scales and twists the section linearly with the length run along the spine, and make_pipe_shell_laws by laws of its own: linear, the monotone cubic through given values, which keeps between neighbouring values (a scale through positive values stays positive), or a function of the share of the length run (SpineFunction), which gives the start value at the start and is read wherever a section is placed or the skin checked, a scale refused where it reads naught or below; a function law is never taken as standing still, so every run it moves along is skinned. Scaled linearly without a twist down one straight edge it is the ruled loft to the scaled image, exact (a pyramid’s or cone’s frustum, the pyramid or cone at a scale of zero); otherwise each loop is skinned through the placed sections and held to the tolerance against the law, along an open spine with no sharp corner, each hole a solid of its own cut from the outer. Round a smooth closed spine the section twists whole turns, unscaled, the skin closed on itself, or part of a turn where that brings each loop of the section home onto itself (a square a quarter turn, a circle about its centre any angle): a faceted loop’s edges sweep strips open at both ends, each closing on the strip that lands where it began, a smooth loop is read from a point sliding round it as it turns; a scale, or a part turn the section’s symmetry does not close, is refused there by name, as the section would not come home to itself; a twist law of any shape closes there where a linear one ending as it does would. Round sharp corners an evolving face sweeps run by run, mitred, extended or rounded: each run under the laws over its share of the length, from the section it starts with, the stretches where the laws stand still swept exactly; a twist still moving through a mitred corner turns the two legs’ sections inside it against each other, so their skins cut the mitre plane along two curves that cross, and the mitre faces are the regions between them (see the glued mitres below); a skinned run into a curved leg’s extended corner, its wall leaving the extension’s side plane along its start edge as the scale narrows it, joins that extension however shallowly it leaves, so long as it rises past ten confusion distances by the first sample in. The multisection pipe takes faces with holes, as many in every section, each hole swept through the sections and cut from the outer solid. Round sharp corners a face is also swept run by run: the spine cut at its corners, each smooth run swept on its own (a straight run keeping its frame as the prism of the section), the runs mitred on the halving plane, extended or rounded, along open or closed spines and against curved legs. The auxiliary and binormal laws turn sharp corners this way too, their runs meeting a mitre with the sections the law sets; a straight run meeting a skinned one at a mitre takes the skin’s own fit of each ring the two share within the tolerance (a hole or a smooth loop), so both cut the mitre plane alike; two skinned runs meeting at a mitre end on their sections exactly where a ring is one edge with an exact rational form (a circle, a conic, a B-spline), the later run starting on the earlier’s end ring mirrored where the earlier is swept first, so both cut the mitre plane in one curve, and a holed section’s ring that is a circle centred on the spine sweeps there as the exact tube every frame carries it along (a cylinder down a line, a torus round an arc), so a holed face mitres between two skinned runs; a section off the spine, solid or holed, mitres there too, the later run run back from its own skin’s start rings. Where the fuse of two mitred runs cannot reconcile their cuts of the mitre plane (two fits of one curve where the frames mirror across it, as round a symmetric lens, or curves that cross at a shallow angle), the trimmed runs are glued on the plane instead: cuts that run within the two runs’ tolerances of each other all along are sewn as one edge stating the gap, the others split where they cross, and the plane keeps a face where only one run’s region covers it, looking out of that run; a solid that still fails the checks is refused by name rather than returned invalid; a round corner is refused where the law’s next section is not the last turned about the corner, within what the runs are held to (a skinned run’s tolerance), so a holed section’s skinned run turns round ones too. The Frenet frame turns sharp corners extended or rounded the same way, each run’s section set by the run’s own Frenet frame, and is refused along a straight run, which has none. Round a smooth closed spine the auxiliary and binormal laws sweep as the rotation-minimizing frame where their frames are its frames turned by a fixed angle; otherwise their own frames, single-valued round the spine, are skinned round it, closed on themselves and held to the tolerance against the law, holes as void tunnels. Along an open spine those laws sweep a face with holes, each hole a solid of its own cut from the outer. Turned run by run, a closed wire sweeps the walls of the face it bounds, the end caps taken off. Round a closed spine of lines and arcs an open wire sweeps a ring of the exact sheet below, from the middle of the first leg round to there, where it closes on itself, each corner (the one where the spine closes too) mitred or rounded as down an open spine, and under a law as below; where the rotation-minimizing frame comes home turned (a spine out of one plane whose turns do not cancel) the ring would not close and is refused by name, as is a closed spine with any other edge. Down an open spine of lines and arcs under the rotation-minimizing frame an open wire sweeps one exact sheet: each line leg the prism of its section and each arc leg its revolution about the arc’s axis, legs meeting tangent sewn on their common section, mitred on the plane halving each corner (an arc leg run on straight by the prism of its end section) or rounded (the section’s part outside the turn turned about the corner). Inside a corner, mitred or rounded, each leg runs on until it meets the other’s wall: on the halving plane between two lines, and where a corner against an arc turns in the arc’s plane, on the conic a straight profile edge’s two walls cross on, held exactly as a rational quadratic, or for a curved profile edge on a curve fitted through each of its points’ exact crossings, its error stated as its tolerance; each profile edge is cut where it crosses the corner’s axis and swept on its own, and both its walls are split on that one curve. The pieces are sewn and held to a disc whose boundary runs only along its end sections and the paths of the wire’s ends; an extended corner, a leg shorter than its corners’ reach (or a point’s two paths meeting past a leg’s end), a round turning too little to stand off its square end, a section reaching inside a corner that turns an arc out of its plane (its paths down the two legs pass each other without meeting) and a sheet that runs into itself are refused by name. The Frenet (rounded only), binormal and auxiliary laws sweep that sheet where their frames are the rotation-minimizing ones turned by a fixed angle, and are refused by name where they set a sharp corner’s next section otherwise. Down an open spine with a leg that is neither a line nor an arc, or under a law whose frames are not those turned by a fixed angle along a spine with no sharp corner, an open wire sweeps one sheet of fitted skins held to the tolerance, uncapped: each profile edge a strip per run, neighbouring strips sharing their rails and neighbouring runs their rows. Its sharp corners follow the exact sheet’s rules point by point: outside a mitred corner against a curved leg the end row runs on straight to the halving plane as two ruled faces sharing their exact cut, outside a round one it turns about the corner’s axis, and inside either it runs on until its two paths cross; a point inside a corner whose paths pass each other, a turn too small to stand a round or run-on off its square end, and a law that sets a sharp corner’s sections other than the rotation-minimizing frame turned by a fixed angle are refused by name.
  • offset.wire-offset: Offsetting planar wires, with the join styles · covered

ogeom-topo

  • topo.data-model: The B-rep data model: shapes as (node, location, orientation) handles into shared arenas · covered
  • topo.identity: The same / equal / partner identity trichotomy, each with a matching hasher · covered
  • topo.location-chain: Placement as a chain of transforms, so instancing shares geometry · covered
  • topo.multi-representation-edges: Edges and vertices carrying several representations: space curve, pcurves per face, polygons on triangulations · covered
  • topo.traversal: Exploring a shape: filtered descent, unique enumeration, ancestry maps · covered
  • topo.triangulation-store: Triangulations as first-class model data: triangles, polygons on them, parameters · covered