diff --git a/tests/kernel-cases/booleans/114-extrude-join-on-curved-body-coincident-wall/expected.json b/tests/kernel-cases/booleans/114-extrude-join-on-curved-body-coincident-wall/expected.json new file mode 100644 index 0000000000..4c22eb0ed0 --- /dev/null +++ b/tests/kernel-cases/booleans/114-extrude-join-on-curved-body-coincident-wall/expected.json @@ -0,0 +1,11 @@ +{ + "sources": [ + "tangency-labs/solidcraft#114" + ], + "what": "extruding a profile onto a cylinder with zero taper: the new wall is the old wall continued (coincident cylindrical faces), join failed", + "source": "analytic", + "method": "cylinder r10 h10 joined with an r10 circle extruded 5 from its top: one cylinder r10 h15; V = pi*100*15 = 1500 pi = 4712.389; faces: 2 caps and one side = 3", + "body_count": 1, + "volume_mm3": 4712.38898038469, + "faces": 3 +} diff --git a/tests/kernel-cases/booleans/114-extrude-join-on-curved-body-coincident-wall/recipe.json b/tests/kernel-cases/booleans/114-extrude-join-on-curved-body-coincident-wall/recipe.json new file mode 100644 index 0000000000..94a3cdb06c --- /dev/null +++ b/tests/kernel-cases/booleans/114-extrude-join-on-curved-body-coincident-wall/recipe.json @@ -0,0 +1,42 @@ +{ + "commands": [ + { + "command": "solid.cylinder", + "params": { + "radius": 10, + "height": 10, + "body_name": "Base" + } + }, + { + "command": "sketch.create", + "params": { + "plane": "XY", + "name": "Top", + "offset": 10 + } + }, + { + "command": "sketch.circle.center", + "params": { + "center": [ + 0, + 0 + ], + "radius": 10 + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "Top", + "distance": 5, + "operation": "join" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/1195-text-cut-into-plate/expected.json b/tests/kernel-cases/booleans/1195-text-cut-into-plate/expected.json new file mode 100644 index 0000000000..4a164a7806 --- /dev/null +++ b/tests/kernel-cases/booleans/1195-text-cut-into-plate/expected.json @@ -0,0 +1,21 @@ +{ + "sources": [ + "tangency-labs/solidcraft#1195" + ], + "what": "text cut into a plate: a boundary curve's end meeting a point whatever its parameter (glyph outlines through a text cut)", + "source": "invariants", + "method": "cutting engraved text 1 mm deep into a 60x20x5 plate keeps one valid closed solid with less volume than the plate (V < 6000) ; a clean solid, no refusal", + "body_count": 1, + "bbox": { + "min": [ + 0, + 0, + 0 + ], + "max": [ + 60, + 20, + 5 + ] + } +} diff --git a/tests/kernel-cases/booleans/1195-text-cut-into-plate/recipe.json b/tests/kernel-cases/booleans/1195-text-cut-into-plate/recipe.json new file mode 100644 index 0000000000..027ba9cdbe --- /dev/null +++ b/tests/kernel-cases/booleans/1195-text-cut-into-plate/recipe.json @@ -0,0 +1,44 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 60, + "width": 20, + "height": 5, + "body_name": "Plate" + } + }, + { + "command": "sketch.create", + "params": { + "plane": "XY", + "offset": 5, + "name": "Label" + } + }, + { + "command": "sketch.text", + "params": { + "text": "SOLID 391", + "at": [ + 3, + 5 + ], + "height": 8 + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "Label", + "distance": -1, + "operation": "cut" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/1279-cut-with-tool-cylinder-coaxial-with-hole/expected.json b/tests/kernel-cases/booleans/1279-cut-with-tool-cylinder-coaxial-with-hole/expected.json new file mode 100644 index 0000000000..14b3f374c2 --- /dev/null +++ b/tests/kernel-cases/booleans/1279-cut-with-tool-cylinder-coaxial-with-hole/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#1279" + ], + "what": "a corner piece (square column minus a quarter disc r1.5, 0.0003 off the axis) cut out of a part with a blind r1.6 hole on the same axis: the tool's r1.5 face sits 0.1 mm inside the hole wall; 'no result'", + "source": "analytic", + "method": "part 12x12x5.1 = 734.4 minus the hole pi*1.6^2*4.1 = 32.97 (hole z -4..0.1, part top z 0.1). The tool (z -3.9..3.2, the square 1.5x1.5 where r >= 1.5) overlaps solid only where r >= 1.6: area A1 = integral_0^1.5 (1.5 - min(1.5, sqrt(2.56-x^2))) dx = 0.31409, over the 4.0 mm of shared z: 1.25638 mm3 (the 0.0003 offset moves this by about 3e-3). V = 734.4 - 32.9662 - 1.2564 = 700.1695. Reduced from the report's STEP geometry (no pocket or rotation); the answer is for this geometry", + "body_count": 1, + "volume_mm3": 700.1694662079215 +} diff --git a/tests/kernel-cases/booleans/1279-cut-with-tool-cylinder-coaxial-with-hole/recipe.json b/tests/kernel-cases/booleans/1279-cut-with-tool-cylinder-coaxial-with-hole/recipe.json new file mode 100644 index 0000000000..a47186fda1 --- /dev/null +++ b/tests/kernel-cases/booleans/1279-cut-with-tool-cylinder-coaxial-with-hole/recipe.json @@ -0,0 +1,72 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "corner": [ + -6, + -6, + -5 + ], + "length": 12, + "width": 12, + "height": 5.1, + "body_name": "Part" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 0, + 0, + -4 + ], + "radius": 1.6, + "height": 4.1, + "operation": "cut" + } + }, + { + "command": "solid.box", + "params": { + "corner": [ + 0, + 0, + -3.9 + ], + "length": 1.5, + "width": 1.5, + "height": 7.1, + "operation": "new", + "body_name": "Tool" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 0.0003, + 0, + -4 + ], + "radius": 1.5, + "height": 7.5, + "operation": "cut", + "targets": [ + "Tool" + ] + } + }, + { + "command": "solid.combine", + "params": { + "target": "Part", + "tools": [ + "Tool" + ], + "operation": "cut" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/13-split-body-by-a-plane/expected.json b/tests/kernel-cases/booleans/13-split-body-by-a-plane/expected.json new file mode 100644 index 0000000000..68e8dc0b24 --- /dev/null +++ b/tests/kernel-cases/booleans/13-split-body-by-a-plane/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#13" + ], + "what": "split a body by a plane (the split-by-a-face path tripped a debug assertion, 'Two same vertices cannot construct an edge')", + "source": "analytic", + "method": "20 cube split by z=10 into two 20x20x10 blocks: total V = 8000, two bodies", + "body_count": 2, + "volume_mm3": 8000.0 +} diff --git a/tests/kernel-cases/booleans/13-split-body-by-a-plane/recipe.json b/tests/kernel-cases/booleans/13-split-body-by-a-plane/recipe.json new file mode 100644 index 0000000000..d0d2832862 --- /dev/null +++ b/tests/kernel-cases/booleans/13-split-body-by-a-plane/recipe.json @@ -0,0 +1,31 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 20, + "width": 20, + "height": 20, + "body_name": "Block" + } + }, + { + "command": "solid.split_body", + "params": { + "body": "Block", + "plane": { + "origin": [ + 0, + 0, + 10 + ], + "normal": [ + 0, + 0, + 1 + ] + } + } + } + ] +} diff --git a/tests/kernel-cases/booleans/1355-concentric-hole-through-drilled-recess/expected.json b/tests/kernel-cases/booleans/1355-concentric-hole-through-drilled-recess/expected.json new file mode 100644 index 0000000000..ae27dd0102 --- /dev/null +++ b/tests/kernel-cases/booleans/1355-concentric-hole-through-drilled-recess/expected.json @@ -0,0 +1,11 @@ +{ + "sources": [ + "tangency-labs/solidcraft#1355", + "tangency-labs/solidcraft#1736" + ], + "what": "a drilled O8.5 recess (118 deg drill point) in a plate, then a O4 hole through its centre: the second cut 'does not work'", + "source": "analytic", + "method": "plate 30x30x10 = 9000. Hole 1: cylinder O8.5 depth 5 plus the drill point cone (height r/tan(59deg) = 2.55366): V1 = pi r^2 (5 + H/3) = 332.0275. Hole 2: O4 through all, V2 = 40 pi = 125.664. Their overlap = the O4 cylinder over the 5 mm of the recess plus, below it, the part of the cone inside r=2: cone of height 2/(r/H) = 1.20180 (volume pi*4*1.2018/3) and the O4 cylinder over the rest of the cone height: total 84.8545. Removed = V1 + V2 - overlap = 372.8367; V = 9000 - 372.8367 = 8627.1633", + "body_count": 1, + "volume_mm3": 8627.163303492243 +} diff --git a/tests/kernel-cases/booleans/1355-concentric-hole-through-drilled-recess/recipe.json b/tests/kernel-cases/booleans/1355-concentric-hole-through-drilled-recess/recipe.json new file mode 100644 index 0000000000..a663583f7f --- /dev/null +++ b/tests/kernel-cases/booleans/1355-concentric-hole-through-drilled-recess/recipe.json @@ -0,0 +1,56 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "center": [ + 0, + 0, + 5 + ], + "length": 30, + "width": 30, + "height": 10, + "body_name": "Plate" + } + }, + { + "command": "sketch.create", + "params": { + "plane": "XY", + "offset": 10, + "name": "Pt" + } + }, + { + "command": "sketch.point", + "params": { + "point": [ + 0, + 0 + ] + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.hole", + "params": { + "sketch": "Pt", + "type": "drilled", + "diameter": 8.5, + "depth": 5, + "tip_angle": "118 deg" + } + }, + { + "command": "solid.hole", + "params": { + "sketch": "Pt", + "diameter": 4 + } + } + ] +} diff --git a/tests/kernel-cases/booleans/1647-box-cylinder-general-intersect/expected.json b/tests/kernel-cases/booleans/1647-box-cylinder-general-intersect/expected.json new file mode 100644 index 0000000000..33f0a76bab --- /dev/null +++ b/tests/kernel-cases/booleans/1647-box-cylinder-general-intersect/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#1647" + ], + "what": "a box and a cylinder in general position (nothing coincident or tangent): Intersect refused as an implausible volume", + "source": "analytic", + "method": "axis along z, so V = (area of the box's xy rectangle inside the cylinder's disc) * (z overlap). Rectangle x 11.4838..16.2729, y 4.8016..7.8016; disc centre (29.2481, 8.3683) r 13.5029; area = integral over x of the y-length inside both (clipped chord) = 1.019217 mm2 (integrated with 4e6 midpoint steps and cross-checked with Simpson). z overlap: max(3.6313, 6.9479)=6.9479 .. min(14.0507, 26.667)=14.0507 -> 7.102761. V = 1.019217 * 7.102761 = 7.2393", + "body_count": 1, + "volume_mm3": 7.2392536 +} diff --git a/tests/kernel-cases/booleans/1647-box-cylinder-general-intersect/recipe.json b/tests/kernel-cases/booleans/1647-box-cylinder-general-intersect/recipe.json new file mode 100644 index 0000000000..c648e9f9c8 --- /dev/null +++ b/tests/kernel-cases/booleans/1647-box-cylinder-general-intersect/recipe.json @@ -0,0 +1,43 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "corner": [ + 11.483767761089219, + 4.801612107504224, + 3.6313476467611787 + ], + "length": 4.789088988834864, + "width": 3.0, + "height": 10.419335961063835, + "body_name": "Box" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 29.2480632732879, + 8.3683289461485, + 6.947922225984966 + ], + "axis": "Z", + "radius": 13.502884497756853, + "height": 19.719218725477496, + "operation": "new", + "body_name": "Cyl" + } + }, + { + "command": "solid.combine", + "params": { + "target": "Box", + "tools": [ + "Cyl" + ], + "operation": "intersect" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/1649-crossing-cylinders-union-far-from-origin/expected.json b/tests/kernel-cases/booleans/1649-crossing-cylinders-union-far-from-origin/expected.json new file mode 100644 index 0000000000..04f79d096d --- /dev/null +++ b/tests/kernel-cases/booleans/1649-crossing-cylinders-union-far-from-origin/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#1649" + ], + "what": "union of two crossing cylinders, both moved (1000,-700,300) mm: volume lost with position", + "source": "analytic", + "method": "A: axis x, r5, x 17.5..27.5 about (y,z)=(30,7.5); B: axis y, r12.5, y 30..35 about (x,z)=(17.5,15). V = Va + Vb - Vint, Va=pi*25*10=785.398, Vb=pi*156.25*5=2454.369. Vint = integral over z in [2.5,12.5] of L(z)*min(10,w(z)) dz with L=sqrt(25-(z-7.5)^2) (A's y half-chord, B only has y>=30) and w=sqrt(156.25-(z-15)^2) (B's x reach from x=17.5, A spans 10) = 346.31 (substitution z=7.5+5 sin t, Simpson; cross-checked by a 400^3 midpoint grid: 346.36). V = 3239.767 - 346.31 = 2893.46. The translation does not change it", + "body_count": 1, + "volume_mm3": 2893.458 +} diff --git a/tests/kernel-cases/booleans/1649-crossing-cylinders-union-far-from-origin/recipe.json b/tests/kernel-cases/booleans/1649-crossing-cylinders-union-far-from-origin/recipe.json new file mode 100644 index 0000000000..499a44e2c3 --- /dev/null +++ b/tests/kernel-cases/booleans/1649-crossing-cylinders-union-far-from-origin/recipe.json @@ -0,0 +1,43 @@ +{ + "commands": [ + { + "command": "solid.cylinder", + "params": { + "base": [ + 1017.5, + -670, + 307.5 + ], + "axis": "X", + "radius": 5, + "height": 10, + "body_name": "A" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 1017.5, + -670, + 315 + ], + "axis": "Y", + "radius": 12.5, + "height": 5, + "operation": "new", + "body_name": "B" + } + }, + { + "command": "solid.combine", + "params": { + "target": "A", + "tools": [ + "B" + ], + "operation": "join" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/168-rim-touching-coin-along-a-circle-only/expected.json b/tests/kernel-cases/booleans/168-rim-touching-coin-along-a-circle-only/expected.json new file mode 100644 index 0000000000..b944b051a7 --- /dev/null +++ b/tests/kernel-cases/booleans/168-rim-touching-coin-along-a-circle-only/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#168" + ], + "what": "a rim on a coin's top face that meets the coin along one circle only (no shared area, no shared volume): it must not be joined into it", + "source": "analytic", + "method": "coin r10 h5: 500 pi; rim = ring r10..14 standing on z=5 for 3: pi*(196-100)*3 = 288 pi. They share only the circle r10 at z=5, so the result is two bodies (or a refusal, never one joined body); volume 788 pi = 2475.664. body_count 2", + "body_count": 2, + "volume_mm3": 2475.5750110287568 +} diff --git a/tests/kernel-cases/booleans/168-rim-touching-coin-along-a-circle-only/recipe.json b/tests/kernel-cases/booleans/168-rim-touching-coin-along-a-circle-only/recipe.json new file mode 100644 index 0000000000..bf1a5a0b49 --- /dev/null +++ b/tests/kernel-cases/booleans/168-rim-touching-coin-along-a-circle-only/recipe.json @@ -0,0 +1,60 @@ +{ + "commands": [ + { + "command": "solid.cylinder", + "params": { + "radius": 10, + "height": 5, + "body_name": "Coin" + } + }, + { + "command": "sketch.create", + "params": { + "plane": "XY", + "offset": 5, + "name": "Rim" + } + }, + { + "command": "sketch.circle.center", + "params": { + "center": [ + 0, + 0 + ], + "radius": 14 + } + }, + { + "command": "sketch.circle.center", + "params": { + "center": [ + 0, + 0 + ], + "radius": 10 + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "Rim", + "profiles": [ + { + "point": [ + 12, + 0 + ] + } + ], + "distance": 3, + "operation": "join" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/1717-two-overlapping-sphere-cuts/expected.json b/tests/kernel-cases/booleans/1717-two-overlapping-sphere-cuts/expected.json new file mode 100644 index 0000000000..cf2a5747d8 --- /dev/null +++ b/tests/kernel-cases/booleans/1717-two-overlapping-sphere-cuts/expected.json @@ -0,0 +1,11 @@ +{ + "sources": [ + "tangency-labs/solidcraft#1717", + "tangency-labs/solidcraft#2158" + ], + "what": "a second sphere cut overlapping an earlier sphere cut on a box edge: 'no result'", + "source": "analytic", + "method": "box 30x20x5 (V=3000). Each sphere r=10 centred on the back-bottom edge removes the quarter of the ball between z=-5..5: pi(r^2 h - h^3/3)/2 with h=5 -> 1375*pi/6 = 719.95. The two balls' common lens (centres 5 apart) over the slab, halved by the y<=20 half-space: 1/2 * integral_0^5 [2 rho^2 acos(d/2rho) - (d/2) sqrt(4 rho^2 - d^2)] dz with rho^2=100-z^2, d=5 -> 483.551. Removed = 2*719.95 - 483.551 = 956.345; V = 3000 - 956.345 = 2043.655", + "body_count": 1, + "volume_mm3": 2043.6548 +} diff --git a/tests/kernel-cases/booleans/1717-two-overlapping-sphere-cuts/recipe.json b/tests/kernel-cases/booleans/1717-two-overlapping-sphere-cuts/recipe.json new file mode 100644 index 0000000000..ae127cba94 --- /dev/null +++ b/tests/kernel-cases/booleans/1717-two-overlapping-sphere-cuts/recipe.json @@ -0,0 +1,36 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 30, + "width": 20, + "height": 5 + } + }, + { + "command": "solid.sphere", + "params": { + "center": [ + 12, + 20, + 0 + ], + "operation": "cut", + "radius": 10 + } + }, + { + "command": "solid.sphere", + "params": { + "center": [ + 17, + 20, + 0 + ], + "operation": "cut", + "radius": 10 + } + } + ] +} diff --git a/tests/kernel-cases/booleans/1730-cut-short-of-far-face-keeps-skin/expected.json b/tests/kernel-cases/booleans/1730-cut-short-of-far-face-keeps-skin/expected.json new file mode 100644 index 0000000000..ce9d66be27 --- /dev/null +++ b/tests/kernel-cases/booleans/1730-cut-short-of-far-face-keeps-skin/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#1730" + ], + "what": "an extrude cut whose profile stops 0.25 mm short of a wall's far face must leave that skin (it was grown through)", + "source": "analytic", + "method": "wall 200 x 3.75 x 95 = 71250. The profile (x -24..24, y -0.5..3.5) extruded 91 from z=-1 covers z 0..90 of the wall and y 0..3.5 of its 3.75: removes 48*3.5*90 = 15120. V = 56130", + "body_count": 1, + "volume_mm3": 56130.0 +} diff --git a/tests/kernel-cases/booleans/1730-cut-short-of-far-face-keeps-skin/recipe.json b/tests/kernel-cases/booleans/1730-cut-short-of-far-face-keeps-skin/recipe.json new file mode 100644 index 0000000000..bd721ff6a9 --- /dev/null +++ b/tests/kernel-cases/booleans/1730-cut-short-of-far-face-keeps-skin/recipe.json @@ -0,0 +1,52 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "corner": [ + -100, + 0, + 0 + ], + "length": 200, + "width": 3.75, + "height": 95, + "body_name": "Wall" + } + }, + { + "command": "sketch.create", + "params": { + "plane": "XY", + "offset": -1 + } + }, + { + "command": "sketch.rectangle.two_point", + "params": { + "p0": [ + -24, + -0.5 + ], + "p1": [ + 24, + 3.5 + ] + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "distance": 91, + "operation": "cut", + "targets": [ + "Wall" + ] + } + } + ] +} diff --git a/tests/kernel-cases/booleans/1858-shallow-cuts-after-earlier-pocket/expected.json b/tests/kernel-cases/booleans/1858-shallow-cuts-after-earlier-pocket/expected.json new file mode 100644 index 0000000000..28927efabf --- /dev/null +++ b/tests/kernel-cases/booleans/1858-shallow-cuts-after-earlier-pocket/expected.json @@ -0,0 +1,11 @@ +{ + "sources": [ + "tangency-labs/solidcraft#1765", + "tangency-labs/solidcraft#1858" + ], + "what": "two 1.5 mm circular cuts overlapping an earlier 0.75 mm pocket (timeline roll-back, insert, redefine): the cut came out empty", + "source": "analytic", + "method": "plate 40x30x10 = 12000 minus the 2 mm round on its top-front edge (1-pi/4)*4*40 = 34.336, minus the 30x10x0.75 pocket (225), minus per circle (r5, centred y=15, so its upper half lies under the pocket): upper half 0.5*25pi*(1.5-0.75) + lower half 0.5*25pi*1.5 = 29.45 + 58.90 = 88.36 each (circles are 16 apart, so they do not meet). V = 12000 - 34.336 - 225 - 176.71 = 11563.95", + "body_count": 1, + "volume_mm3": 11563.949119379165 +} diff --git a/tests/kernel-cases/booleans/1858-shallow-cuts-after-earlier-pocket/recipe.json b/tests/kernel-cases/booleans/1858-shallow-cuts-after-earlier-pocket/recipe.json new file mode 100644 index 0000000000..c3699c2496 --- /dev/null +++ b/tests/kernel-cases/booleans/1858-shallow-cuts-after-earlier-pocket/recipe.json @@ -0,0 +1,131 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 40, + "width": 30, + "height": 10, + "body_name": "Plate", + "name": "Plate" + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 20, + 0, + 10 + ] + ], + "radius": 2, + "name": "Rim" + } + }, + { + "command": "sketch.create", + "params": { + "plane": "XY", + "offset": 10, + "name": "Circles" + } + }, + { + "command": "sketch.circle.center", + "params": { + "center": [ + 12, + 15 + ], + "radius": 5 + } + }, + { + "command": "sketch.circle.center", + "params": { + "center": [ + 28, + 15 + ], + "radius": 5 + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "Circles", + "distance": -1.5, + "operation": "cut", + "name": "ShallowCuts" + } + }, + { + "command": "timeline.rollback", + "params": { + "position": 2 + } + }, + { + "command": "sketch.create", + "params": { + "plane": "XY", + "offset": 10, + "name": "PocketOutline" + } + }, + { + "command": "sketch.rectangle.two_point", + "params": { + "p0": [ + 5, + 15 + ], + "p1": [ + 35, + 25 + ] + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "PocketOutline", + "distance": -0.75, + "operation": "cut", + "name": "EarlierPocket" + } + }, + { + "command": "timeline.rollback", + "params": {} + }, + { + "command": "timeline.redefine", + "params": { + "feature": "ShallowCuts", + "command": "solid.extrude", + "params": { + "sketch": "Circles", + "profiles": [ + 0, + 1 + ], + "distance": "-1.5", + "direction": "positive", + "convention": "total_distance", + "operation": "cut" + } + } + } + ] +} diff --git a/tests/kernel-cases/booleans/1865-tube-and-sector-meeting-along-cylinder-walls/expected.json b/tests/kernel-cases/booleans/1865-tube-and-sector-meeting-along-cylinder-walls/expected.json new file mode 100644 index 0000000000..5a4f94cd49 --- /dev/null +++ b/tests/kernel-cases/booleans/1865-tube-and-sector-meeting-along-cylinder-walls/expected.json @@ -0,0 +1,14 @@ +{ + "sources": [ + "tangency-labs/solidcraft#1865", + "tangency-labs/solidcraft#1910", + "tangency-labs/solidcraft#1983", + "tangency-labs/solidcraft#2034" + ], + "what": "a union of two solids that meet along cylindrical faces: a tube (r10..12, z 0..20) and a 90 deg ring sector (same radii, z 10..30) whose curved faces are the tube's own, overlapping it axially; refused ('planar faces only') or, by the faceted fallback, left 1710 faceted faces", + "source": "analytic", + "method": "tube pi(144-100)*20 = 880 pi; sector pi(144-100)/4*20 = 220 pi, of which z 10..20 (110 pi) lies in the tube. V = 880 pi + 110 pi = 990 pi = 3110.18. Faces by merged count: bottom annulus, 3/4 top annulus at z=20, sector top at z=30, two radial planes (x=0, y=0, z 20..30), one outer and one inner cylinder = 7; never a faceted body", + "body_count": 1, + "volume_mm3": 3110.1767270538953, + "faces": 7 +} diff --git a/tests/kernel-cases/booleans/1865-tube-and-sector-meeting-along-cylinder-walls/recipe.json b/tests/kernel-cases/booleans/1865-tube-and-sector-meeting-along-cylinder-walls/recipe.json new file mode 100644 index 0000000000..c2242f1c55 --- /dev/null +++ b/tests/kernel-cases/booleans/1865-tube-and-sector-meeting-along-cylinder-walls/recipe.json @@ -0,0 +1,85 @@ +{ + "commands": [ + { + "command": "solid.cylinder", + "params": { + "radius": 12, + "height": 20, + "body_name": "Tube" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 0, + 0, + -1 + ], + "radius": 10, + "height": 22, + "operation": "cut", + "targets": [ + "Tube" + ] + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 0, + 0, + 10 + ], + "radius": 12, + "height": 20, + "operation": "new", + "body_name": "Sector" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 0, + 0, + 9 + ], + "radius": 10, + "height": 22, + "operation": "cut", + "targets": [ + "Sector" + ] + } + }, + { + "command": "solid.box", + "params": { + "corner": [ + 0, + 0, + 9 + ], + "length": 20, + "width": 20, + "height": 22, + "operation": "intersect", + "targets": [ + "Sector" + ] + } + }, + { + "command": "solid.combine", + "params": { + "target": "Tube", + "tools": [ + "Sector" + ], + "operation": "join" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/1910-coaxial-cylinders-intersect/expected.json b/tests/kernel-cases/booleans/1910-coaxial-cylinders-intersect/expected.json new file mode 100644 index 0000000000..a03464162b --- /dev/null +++ b/tests/kernel-cases/booleans/1910-coaxial-cylinders-intersect/expected.json @@ -0,0 +1,12 @@ +{ + "sources": [ + "tangency-labs/solidcraft#1910", + "tangency-labs/solidcraft#1865" + ], + "what": "intersection of two cylinders of one radius on one axis (z 0..30 and 22..46) whose round sides lie in each other over the shared 8 mm", + "source": "analytic", + "method": "common part is the cylinder r25.6 over z 22..30: V = pi*25.6^2*8 = 5242.88 pi = 16471.0; faces 3", + "body_count": 1, + "volume_mm3": 16470.993291652856, + "faces": 3 +} diff --git a/tests/kernel-cases/booleans/1910-coaxial-cylinders-intersect/recipe.json b/tests/kernel-cases/booleans/1910-coaxial-cylinders-intersect/recipe.json new file mode 100644 index 0000000000..5111efc149 --- /dev/null +++ b/tests/kernel-cases/booleans/1910-coaxial-cylinders-intersect/recipe.json @@ -0,0 +1,36 @@ +{ + "commands": [ + { + "command": "solid.cylinder", + "params": { + "radius": 25.6, + "height": 30, + "body_name": "A" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 0, + 0, + 22 + ], + "radius": 25.6, + "height": 24, + "operation": "new", + "body_name": "B" + } + }, + { + "command": "solid.combine", + "params": { + "target": "A", + "tools": [ + "B" + ], + "operation": "intersect" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/1927-delete-pocket-face-restores-plate/expected.json b/tests/kernel-cases/booleans/1927-delete-pocket-face-restores-plate/expected.json new file mode 100644 index 0000000000..a5a333246a --- /dev/null +++ b/tests/kernel-cases/booleans/1927-delete-pocket-face-restores-plate/expected.json @@ -0,0 +1,11 @@ +{ + "sources": [ + "tangency-labs/solidcraft#1927" + ], + "what": "Delete Face on the 0.5 mm deep O15 recess of a plate: the face around the gap must keep its surface", + "source": "analytic", + "method": "100x100x10 plate with a O15x0.5 recess; deleting the recess floor (and, with heal, its wall) restores the plain plate: V = 100000, six faces", + "body_count": 1, + "volume_mm3": 100000.0, + "faces": 6 +} diff --git a/tests/kernel-cases/booleans/1927-delete-pocket-face-restores-plate/recipe.json b/tests/kernel-cases/booleans/1927-delete-pocket-face-restores-plate/recipe.json new file mode 100644 index 0000000000..5922737bb3 --- /dev/null +++ b/tests/kernel-cases/booleans/1927-delete-pocket-face-restores-plate/recipe.json @@ -0,0 +1,60 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 100, + "width": 100, + "height": 10, + "body_name": "Plate" + } + }, + { + "command": "sketch.create", + "params": { + "plane": "XY", + "name": "Pocket", + "offset": 10 + } + }, + { + "command": "sketch.circle.center", + "params": { + "center": [ + 50, + 50 + ], + "radius": 7.5 + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "Pocket", + "distance": -0.5, + "operation": "cut" + } + }, + { + "command": "face.delete", + "params": { + "faces": [ + [ + 50, + 50, + 9.5 + ], + [ + 57.5, + 50, + 9.75 + ] + ] + } + } + ] +} diff --git a/tests/kernel-cases/booleans/1949-extrude-side-drawn-in-collinear-pieces/expected.json b/tests/kernel-cases/booleans/1949-extrude-side-drawn-in-collinear-pieces/expected.json new file mode 100644 index 0000000000..83be263be4 --- /dev/null +++ b/tests/kernel-cases/booleans/1949-extrude-side-drawn-in-collinear-pieces/expected.json @@ -0,0 +1,13 @@ +{ + "sources": [ + "tangency-labs/solidcraft#1949" + ], + "what": "a profile side drawn as two collinear lines extrudes into one flat face, not two with an edge between them", + "source": "analytic", + "method": "polyline 0,0 -> 10,0 -> 20,0 -> 20,10 -> 0,10 -> 0,0 is the rectangle 20x10 with a point on the bottom side; extruded 5: V = 1000; merged faces = 6 (the collinear pieces are one side), edges 12, vertices 8", + "body_count": 1, + "volume_mm3": 1000.0, + "faces": 6, + "edges": 12, + "vertices": 8 +} diff --git a/tests/kernel-cases/booleans/1949-extrude-side-drawn-in-collinear-pieces/recipe.json b/tests/kernel-cases/booleans/1949-extrude-side-drawn-in-collinear-pieces/recipe.json new file mode 100644 index 0000000000..c900f356fd --- /dev/null +++ b/tests/kernel-cases/booleans/1949-extrude-side-drawn-in-collinear-pieces/recipe.json @@ -0,0 +1,51 @@ +{ + "commands": [ + { + "command": "sketch.create", + "params": { + "plane": "XY" + } + }, + { + "command": "sketch.line", + "params": { + "points": [ + [ + 0, + 0 + ], + [ + 10, + 0 + ], + [ + 20, + 0 + ], + [ + 20, + 10 + ], + [ + 0, + 10 + ], + [ + 0, + 0 + ] + ] + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "distance": 5 + } + } + ] +} diff --git a/tests/kernel-cases/booleans/1949-tapered-extrude-side-in-collinear-pieces/expected.json b/tests/kernel-cases/booleans/1949-tapered-extrude-side-in-collinear-pieces/expected.json new file mode 100644 index 0000000000..22fbbc61ed --- /dev/null +++ b/tests/kernel-cases/booleans/1949-tapered-extrude-side-in-collinear-pieces/expected.json @@ -0,0 +1,11 @@ +{ + "sources": [ + "tangency-labs/solidcraft#1949" + ], + "what": "with a taper too, a side drawn in two collinear pieces is one face", + "source": "analytic", + "method": "rectangle 20x10 (with a point on a long side) extruded 5 with +5 deg taper (grows outward): frustum of rectangles; offset t=5*tan(5deg): top (20+2t)x(10+2t). V = h/3 (A0 + A1 + sqrt(A0 A1)); faces 6", + "body_count": 1, + "volume_mm3": 1066.8173784443, + "faces": 6 +} diff --git a/tests/kernel-cases/booleans/1949-tapered-extrude-side-in-collinear-pieces/recipe.json b/tests/kernel-cases/booleans/1949-tapered-extrude-side-in-collinear-pieces/recipe.json new file mode 100644 index 0000000000..dbf3d79814 --- /dev/null +++ b/tests/kernel-cases/booleans/1949-tapered-extrude-side-in-collinear-pieces/recipe.json @@ -0,0 +1,52 @@ +{ + "commands": [ + { + "command": "sketch.create", + "params": { + "plane": "XY" + } + }, + { + "command": "sketch.line", + "params": { + "points": [ + [ + 0, + 0 + ], + [ + 10, + 0 + ], + [ + 20, + 0 + ], + [ + 20, + 10 + ], + [ + 0, + 10 + ], + [ + 0, + 0 + ] + ] + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "distance": 5, + "taper": "5 deg" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/2003-mirror-feature-join-flush-with-mirror-plane/expected.json b/tests/kernel-cases/booleans/2003-mirror-feature-join-flush-with-mirror-plane/expected.json new file mode 100644 index 0000000000..c85a6af5e8 --- /dev/null +++ b/tests/kernel-cases/booleans/2003-mirror-feature-join-flush-with-mirror-plane/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#2003" + ], + "what": "mirror a feature with Join: the image meets its original along the mirror plane and the join was refused for its volume", + "source": "analytic", + "method": "base 20x20x10 = 4000; pad 10x10x5 on top at x 0..10 flush with the mirror plane x=0; its image (x -10..0) shares the x=0 face with it. Union pad+image = 20x10x5 = 1000; V = 5000", + "body_count": 1, + "volume_mm3": 5000.0 +} diff --git a/tests/kernel-cases/booleans/2003-mirror-feature-join-flush-with-mirror-plane/recipe.json b/tests/kernel-cases/booleans/2003-mirror-feature-join-flush-with-mirror-plane/recipe.json new file mode 100644 index 0000000000..d4471d5910 --- /dev/null +++ b/tests/kernel-cases/booleans/2003-mirror-feature-join-flush-with-mirror-plane/recipe.json @@ -0,0 +1,39 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 20, + "width": 20, + "height": 10, + "body_name": "Base", + "name": "Base" + } + }, + { + "command": "solid.box", + "params": { + "corner": [ + 0, + 5, + 10 + ], + "length": 10, + "width": 10, + "height": 5, + "operation": "join", + "name": "Pad" + } + }, + { + "command": "solid.mirror", + "params": { + "features": [ + "Pad" + ], + "plane": "YZ", + "combine": true + } + } + ] +} diff --git a/tests/kernel-cases/booleans/2008-coaxial-cylinders-join-one-wall/expected.json b/tests/kernel-cases/booleans/2008-coaxial-cylinders-join-one-wall/expected.json new file mode 100644 index 0000000000..3116adc214 --- /dev/null +++ b/tests/kernel-cases/booleans/2008-coaxial-cylinders-join-one-wall/expected.json @@ -0,0 +1,12 @@ +{ + "sources": [ + "tangency-labs/solidcraft#2008", + "tangency-labs/solidcraft#1986" + ], + "what": "a join of coaxial cylinders of one radius whose walls overlap leaves one cylindrical wall in one face (it came out as a stack of faces, so a later chamfer on its top edge refused)", + "source": "analytic", + "method": "cylinder r25.6 over z 0..46: V = pi*655.36*46 = 30146.56 pi = 94711; faces 3 (two caps, one wall)", + "body_count": 1, + "volume_mm3": 94708.21142700392, + "faces": 3 +} diff --git a/tests/kernel-cases/booleans/2008-coaxial-cylinders-join-one-wall/recipe.json b/tests/kernel-cases/booleans/2008-coaxial-cylinders-join-one-wall/recipe.json new file mode 100644 index 0000000000..9a676cf02f --- /dev/null +++ b/tests/kernel-cases/booleans/2008-coaxial-cylinders-join-one-wall/recipe.json @@ -0,0 +1,36 @@ +{ + "commands": [ + { + "command": "solid.cylinder", + "params": { + "radius": 25.6, + "height": 30, + "body_name": "A" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 0, + 0, + 22 + ], + "radius": 25.6, + "height": 24, + "operation": "new", + "body_name": "B" + } + }, + { + "command": "solid.combine", + "params": { + "target": "A", + "tools": [ + "B" + ], + "operation": "join" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/2055-countersink-holes-from-several-sketch-points/expected.json b/tests/kernel-cases/booleans/2055-countersink-holes-from-several-sketch-points/expected.json new file mode 100644 index 0000000000..7459b81e49 --- /dev/null +++ b/tests/kernel-cases/booleans/2055-countersink-holes-from-several-sketch-points/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#2055" + ], + "what": "a countersunk hole at two sketch points at once, in a design with several bodies: 'there is no body to cut or intersect' (one point works)", + "source": "analytic", + "method": "plate 40x20x10 = 8000 and a separate 10x10x10 block (1000). Each hole: O5 cylinder through 10 mm (62.5 pi) plus the 90 deg countersink to O10 (depth 2.5, frustum pi*2.5/3*(25+12.5+6.25) = 36.458 pi, of which 15.625 pi lies in the cylinder): 83.333 pi. Two holes: 166.667 pi = 523.60; total V = 9000 - 523.60 = 8476.40. Two bodies", + "body_count": 2, + "volume_mm3": 8476.401224401701 +} diff --git a/tests/kernel-cases/booleans/2055-countersink-holes-from-several-sketch-points/recipe.json b/tests/kernel-cases/booleans/2055-countersink-holes-from-several-sketch-points/recipe.json new file mode 100644 index 0000000000..97c6297217 --- /dev/null +++ b/tests/kernel-cases/booleans/2055-countersink-holes-from-several-sketch-points/recipe.json @@ -0,0 +1,73 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "center": [ + 0, + 0, + 5 + ], + "length": 40, + "width": 20, + "height": 10, + "body_name": "Plate" + } + }, + { + "command": "solid.box", + "params": { + "center": [ + 100, + 0, + 5 + ], + "length": 10, + "width": 10, + "height": 10, + "operation": "new", + "body_name": "Other" + } + }, + { + "command": "sketch.create", + "params": { + "plane": "XY", + "offset": 10, + "name": "Pts" + } + }, + { + "command": "sketch.point", + "params": { + "point": [ + -10, + 0 + ] + } + }, + { + "command": "sketch.point", + "params": { + "point": [ + 10, + 0 + ] + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.hole", + "params": { + "sketch": "Pts", + "type": "countersink", + "diameter": 5, + "cs_diameter": 10, + "cs_angle": "90 deg" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/2076-rectangular-pattern-of-cylinder-join/expected.json b/tests/kernel-cases/booleans/2076-rectangular-pattern-of-cylinder-join/expected.json new file mode 100644 index 0000000000..bee715c067 --- /dev/null +++ b/tests/kernel-cases/booleans/2076-rectangular-pattern-of-cylinder-join/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#2076" + ], + "what": "a rectangular pattern of a cylinder join (pin-fin plate) scales quadratically in time", + "source": "analytic", + "method": "plate 52x52x3 = 8112 plus 25 pins O1.4x3.5 standing on it, 2.6 apart (none touch): 8112 + 25*pi*0.49*3.5 = 8246.696. Result must also come in a reasonable time (the case has the runner's time limit)", + "body_count": 1, + "volume_mm3": 8246.695785022663 +} diff --git a/tests/kernel-cases/booleans/2076-rectangular-pattern-of-cylinder-join/recipe.json b/tests/kernel-cases/booleans/2076-rectangular-pattern-of-cylinder-join/recipe.json new file mode 100644 index 0000000000..817278ceb3 --- /dev/null +++ b/tests/kernel-cases/booleans/2076-rectangular-pattern-of-cylinder-join/recipe.json @@ -0,0 +1,56 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "center": [ + 0, + 0, + 1.5 + ], + "length": 52, + "width": 52, + "height": 3, + "body_name": "Plate", + "name": "Plate" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + -5.2, + -5.2, + 3 + ], + "radius": 0.7, + "height": 3.5, + "operation": "join", + "name": "Pin" + } + }, + { + "command": "solid.pattern.rectangular", + "params": { + "features": [ + "Pin" + ], + "dir1": [ + 1, + 0, + 0 + ], + "count1": 5, + "spacing1": 2.6, + "dir2": [ + 0, + 1, + 0 + ], + "count2": 5, + "spacing2": 2.6, + "name": "Pins" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/2464-extrude-join-leaves-hidden-body-alone/expected.json b/tests/kernel-cases/booleans/2464-extrude-join-leaves-hidden-body-alone/expected.json new file mode 100644 index 0000000000..422964ccf1 --- /dev/null +++ b/tests/kernel-cases/booleans/2464-extrude-join-leaves-hidden-body-alone/expected.json @@ -0,0 +1,11 @@ +{ + "sources": [ + "tangency-labs/solidcraft#2464", + "tangency-labs/solidcraft#2465" + ], + "what": "an Extrude Join onto a plate with a hidden coincident copy: the hidden body must not be joined in", + "source": "analytic", + "method": "two 40x40x5 plates (8000 each), the copy hidden. The 2 mm wide ring rim (36x36 minus 32x32 = 272 mm2) extruded 3 joins the visible plate only: 8000 + 816 + 8000 = 16816. Two bodies remain", + "body_count": 2, + "volume_mm3": 16816.0 +} diff --git a/tests/kernel-cases/booleans/2464-extrude-join-leaves-hidden-body-alone/recipe.json b/tests/kernel-cases/booleans/2464-extrude-join-leaves-hidden-body-alone/recipe.json new file mode 100644 index 0000000000..6276ab9094 --- /dev/null +++ b/tests/kernel-cases/booleans/2464-extrude-join-leaves-hidden-body-alone/recipe.json @@ -0,0 +1,85 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 40, + "width": 40, + "height": 5, + "body_name": "Plate" + } + }, + { + "command": "solid.move", + "params": { + "bodies": [ + "Plate" + ], + "copy": true + } + }, + { + "command": "browser.visibility", + "params": { + "items": [ + "Plate (2)" + ], + "visible": false + } + }, + { + "command": "sketch.create", + "params": { + "plane": "XY", + "offset": 5, + "name": "Rim" + } + }, + { + "command": "sketch.rectangle.two_point", + "params": { + "p0": [ + 2, + 2 + ], + "p1": [ + 38, + 38 + ] + } + }, + { + "command": "sketch.rectangle.two_point", + "params": { + "p0": [ + 4, + 4 + ], + "p1": [ + 36, + 36 + ] + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "Rim", + "profiles": [ + { + "point": [ + 3, + 3 + ] + } + ], + "distance": 3, + "operation": "join" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/2524-circular-pattern-of-bore-cut/expected.json b/tests/kernel-cases/booleans/2524-circular-pattern-of-bore-cut/expected.json new file mode 100644 index 0000000000..b5af888c87 --- /dev/null +++ b/tests/kernel-cases/booleans/2524-circular-pattern-of-bore-cut/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#2524" + ], + "what": "a circular pattern (count 2, 360 deg, about Y) of a cut made off-axis: 'boolean Cut: no result'", + "source": "analytic", + "method": "block 40x20x40 = 32000 centred on the Y axis; a through bore r3 along Y at x=10 and its half-turn copy at x=-10 (they do not meet): V = 32000 - 2*pi*9*20 = 32000 - 360 pi", + "body_count": 1, + "volume_mm3": 30869.026644707676 +} diff --git a/tests/kernel-cases/booleans/2524-circular-pattern-of-bore-cut/recipe.json b/tests/kernel-cases/booleans/2524-circular-pattern-of-bore-cut/recipe.json new file mode 100644 index 0000000000..3bd6f80fe8 --- /dev/null +++ b/tests/kernel-cases/booleans/2524-circular-pattern-of-bore-cut/recipe.json @@ -0,0 +1,44 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "center": [ + 0, + 10, + 0 + ], + "length": 40, + "width": 20, + "height": 40, + "body_name": "Block" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 10, + -1, + 0 + ], + "axis": "Y", + "radius": 3, + "height": 22, + "operation": "cut", + "name": "Bore" + } + }, + { + "command": "solid.pattern.circular", + "params": { + "features": [ + "Bore" + ], + "axis": "Y", + "count": 2, + "angle": "360 deg" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/307-tangent-hole-contacts-ring-against-grid/expected.json b/tests/kernel-cases/booleans/307-tangent-hole-contacts-ring-against-grid/expected.json new file mode 100644 index 0000000000..2fb3b5d016 --- /dev/null +++ b/tests/kernel-cases/booleans/307-tangent-hole-contacts-ring-against-grid/expected.json @@ -0,0 +1,11 @@ +{ + "sources": [ + "tangency-labs/solidcraft#307" + ], + "what": "four pairs of through holes whose circles touch at exactly one point (ring holes at (+-25,0),(0,+-25) against grid holes at (+-15,0),(0,+-15)); the symmetric contacts must be treated alike and split no cylinder face", + "source": "analytic", + "method": "plate 100x100x5 minus eight O10 through holes (centres 10 apart = 2r in the four pairs, so they only touch along a line): V = 50000 - 8*pi*25*5 = 50000 - 1000 pi = 46858.41. Faces by merged count: 6 planes + 8 cylinders = 14, a tangent line contact splits nothing. NOT SURE: the touching holes leave the plate pinched along four vertical lines, so a strict manifold check may reject the right answer", + "body_count": 1, + "volume_mm3": 46858.407346410204, + "faces": 14 +} diff --git a/tests/kernel-cases/booleans/307-tangent-hole-contacts-ring-against-grid/recipe.json b/tests/kernel-cases/booleans/307-tangent-hole-contacts-ring-against-grid/recipe.json new file mode 100644 index 0000000000..15025de1be --- /dev/null +++ b/tests/kernel-cases/booleans/307-tangent-hole-contacts-ring-against-grid/recipe.json @@ -0,0 +1,122 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "corner": [ + -50, + -50, + 0 + ], + "length": 100, + "width": 100, + "height": 5, + "body_name": "Plate" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 25, + 0, + -1 + ], + "radius": 5, + "height": 7, + "operation": "cut" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + -25, + 0, + -1 + ], + "radius": 5, + "height": 7, + "operation": "cut" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 0, + 25, + -1 + ], + "radius": 5, + "height": 7, + "operation": "cut" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 0, + -25, + -1 + ], + "radius": 5, + "height": 7, + "operation": "cut" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 15, + 0, + -1 + ], + "radius": 5, + "height": 7, + "operation": "cut" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + -15, + 0, + -1 + ], + "radius": 5, + "height": 7, + "operation": "cut" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 0, + 15, + -1 + ], + "radius": 5, + "height": 7, + "operation": "cut" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + 0, + -15, + -1 + ], + "radius": 5, + "height": 7, + "operation": "cut" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/308-blind-cut-ending-inside-a-cylinder/expected.json b/tests/kernel-cases/booleans/308-blind-cut-ending-inside-a-cylinder/expected.json new file mode 100644 index 0000000000..6180c8b115 --- /dev/null +++ b/tests/kernel-cases/booleans/308-blind-cut-ending-inside-a-cylinder/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#308" + ], + "what": "a hinge leaf (40x30x3) with a joined r4 knuckle cylinder along X and a O4 pin hole, then a 3.3 mm blind cut of x 12..28, y 29..40 ending inside the cylinder: the result grew a sphere and a freeform face", + "source": "analytic", + "method": "all walls are planes or cylinders along X, so V = 40*A - 16*B with A = area of the section (leaf y 0..30,z 0..3 union disc centre (y=33,z=4) r4, minus the pin disc r2) = 126.8438 mm2 (integrated over y, exact chords), B = the part of A with y>=29, z<=3.3 = 18.1650 mm2 (the gap, 16 long). V = 5073.752 - 290.640 = 4783.112. No sphere or freeform face can occur: only planes and cylinders", + "body_count": 1, + "volume_mm3": 4783.1123 +} diff --git a/tests/kernel-cases/booleans/308-blind-cut-ending-inside-a-cylinder/recipe.json b/tests/kernel-cases/booleans/308-blind-cut-ending-inside-a-cylinder/recipe.json new file mode 100644 index 0000000000..c58c430cd7 --- /dev/null +++ b/tests/kernel-cases/booleans/308-blind-cut-ending-inside-a-cylinder/recipe.json @@ -0,0 +1,145 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 40, + "width": 30, + "height": 3, + "body_name": "Hinge" + } + }, + { + "command": "sketch.create", + "params": { + "name": "Knuckle", + "plane": { + "origin": [ + 0, + 0, + 0 + ], + "x_dir": [ + 0, + 0, + -1 + ], + "y_dir": [ + 0, + 1, + 0 + ] + } + } + }, + { + "command": "sketch.circle.center", + "params": { + "center": [ + -4, + 33 + ], + "radius": 4 + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "Knuckle", + "distance": 40, + "operation": "join", + "body_names": [ + "Hinge" + ] + } + }, + { + "command": "sketch.create", + "params": { + "name": "Pin", + "plane": { + "origin": [ + 0, + 0, + 0 + ], + "x_dir": [ + 0, + 0, + -1 + ], + "y_dir": [ + 0, + 1, + 0 + ] + } + } + }, + { + "command": "sketch.circle.center", + "params": { + "center": [ + -4, + 33 + ], + "radius": 2 + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "Pin", + "distance": 100, + "direction": "symmetric", + "operation": "cut", + "body_names": [ + "Hinge" + ] + } + }, + { + "command": "sketch.create", + "params": { + "name": "Gap", + "plane": "XY" + } + }, + { + "command": "sketch.rectangle.two_point", + "params": { + "p0": [ + 12, + 29 + ], + "p1": [ + 28, + 40 + ] + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "Gap", + "distance": 3.3, + "operation": "cut", + "body_names": [ + "Hinge" + ] + } + } + ] +} diff --git a/tests/kernel-cases/booleans/423-through-all-cut-must-not-reach-behind-sketch-plane/expected.json b/tests/kernel-cases/booleans/423-through-all-cut-must-not-reach-behind-sketch-plane/expected.json new file mode 100644 index 0000000000..f7ea3c91a1 --- /dev/null +++ b/tests/kernel-cases/booleans/423-through-all-cut-must-not-reach-behind-sketch-plane/expected.json @@ -0,0 +1,22 @@ +{ + "sources": [ + "tangency-labs/solidcraft#423" + ], + "what": "a one-sided Through All cut from a sketch plane at x=98 toward -x, with its wall 0.0022 mm from a face of a notch beyond the plane: the cut must remove nothing at x > 98", + "source": "analytic", + "method": "frame 100x14.5x10 = 14500 with a 1.5x2x10 end notch (x 98.5..100, y 0..2) = 30 removed. The cut tool is y -0.0022..3 for the full height, from x=98 to x=0: 98*3.0022*10 = 2942.156. It never reaches x>98, so the notch is untouched: V = 14500 - 30 - 2942.156 = 11527.844. Reduced from a STEP frame (not committed)", + "body_count": 1, + "volume_mm3": 11527.844000000001, + "bbox": { + "min": [ + 0, + -7.25, + 0 + ], + "max": [ + 100, + 7.25, + 10 + ] + } +} diff --git a/tests/kernel-cases/booleans/423-through-all-cut-must-not-reach-behind-sketch-plane/recipe.json b/tests/kernel-cases/booleans/423-through-all-cut-must-not-reach-behind-sketch-plane/recipe.json new file mode 100644 index 0000000000..abe731b246 --- /dev/null +++ b/tests/kernel-cases/booleans/423-through-all-cut-must-not-reach-behind-sketch-plane/recipe.json @@ -0,0 +1,69 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "corner": [ + 0, + -7.25, + 0 + ], + "length": 100, + "width": 14.5, + "height": 10, + "body_name": "Frame" + } + }, + { + "command": "solid.box", + "params": { + "corner": [ + 98.5, + 0, + -1 + ], + "length": 2, + "width": 2, + "height": 12, + "operation": "cut" + } + }, + { + "command": "sketch.create", + "params": { + "plane": "YZ", + "offset": 98, + "name": "Cutter" + } + }, + { + "command": "sketch.rectangle.two_point", + "params": { + "p0": [ + -0.0022, + -1 + ], + "p1": [ + 3, + 11 + ] + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "Cutter", + "through_all": true, + "direction": "negative", + "operation": "cut", + "targets": [ + "Frame" + ] + } + } + ] +} diff --git a/tests/kernel-cases/booleans/500-coaxial-cylinder-cut-from-thin-disc/expected.json b/tests/kernel-cases/booleans/500-coaxial-cylinder-cut-from-thin-disc/expected.json new file mode 100644 index 0000000000..9b11a69b64 --- /dev/null +++ b/tests/kernel-cases/booleans/500-coaxial-cylinder-cut-from-thin-disc/expected.json @@ -0,0 +1,11 @@ +{ + "sources": [ + "tangency-labs/solidcraft#500" + ], + "what": "a radius 20 cylinder cut out of a coaxial radius 40 disc spanning x -1..1 lost about 2.6% of the volume", + "source": "analytic", + "method": "disc r40 thickness 2 minus the through bore r20: V = pi (40^2 - 20^2) * 2 = 2400 pi = 7539.822; faces: two annular ends, outer and inner cylinder = 4", + "body_count": 1, + "volume_mm3": 7539.822368615503, + "faces": 4 +} diff --git a/tests/kernel-cases/booleans/500-coaxial-cylinder-cut-from-thin-disc/recipe.json b/tests/kernel-cases/booleans/500-coaxial-cylinder-cut-from-thin-disc/recipe.json new file mode 100644 index 0000000000..f56c181792 --- /dev/null +++ b/tests/kernel-cases/booleans/500-coaxial-cylinder-cut-from-thin-disc/recipe.json @@ -0,0 +1,32 @@ +{ + "commands": [ + { + "command": "solid.cylinder", + "params": { + "base": [ + -1, + 0, + 0 + ], + "axis": "X", + "radius": 40, + "height": 2, + "body_name": "Disc" + } + }, + { + "command": "solid.cylinder", + "params": { + "base": [ + -3, + 0, + 0 + ], + "axis": "X", + "radius": 20, + "height": 6, + "operation": "cut" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/559-through-hole-into-shelled-box-rim/expected.json b/tests/kernel-cases/booleans/559-through-hole-into-shelled-box-rim/expected.json new file mode 100644 index 0000000000..e03bba3e55 --- /dev/null +++ b/tests/kernel-cases/booleans/559-through-hole-into-shelled-box-rim/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#559" + ], + "what": "a 1 mm through-all hole straight down into the 2 mm rim of a shelled box: 'implausible volume' / no result", + "source": "analytic", + "method": "box 70x50x30 shelled 2 mm inward, top open: 105000 - 66*46*28 = 19992. The hole (r 0.5) at y=24 lies inside the wall y 23..25 and runs all 30 mm (wall, then floor): pi*0.25*30 = 23.562. V = 19992 - 23.562 = 19968.438", + "body_count": 1, + "volume_mm3": 19968.438055098075 +} diff --git a/tests/kernel-cases/booleans/559-through-hole-into-shelled-box-rim/recipe.json b/tests/kernel-cases/booleans/559-through-hole-into-shelled-box-rim/recipe.json new file mode 100644 index 0000000000..03e793386f --- /dev/null +++ b/tests/kernel-cases/booleans/559-through-hole-into-shelled-box-rim/recipe.json @@ -0,0 +1,41 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "corner": [ + -35, + -25, + 0 + ], + "length": 70, + "width": 50, + "height": 30 + } + }, + { + "command": "solid.shell", + "params": { + "faces": [ + [ + 0, + 0, + 30 + ] + ], + "thickness": 2 + } + }, + { + "command": "solid.hole", + "params": { + "position": [ + 0, + 24, + 30 + ], + "diameter": 1 + } + } + ] +} diff --git a/tests/kernel-cases/booleans/562-press-pull-floor-beside-rounds/expected.json b/tests/kernel-cases/booleans/562-press-pull-floor-beside-rounds/expected.json new file mode 100644 index 0000000000..d02f68bfb6 --- /dev/null +++ b/tests/kernel-cases/booleans/562-press-pull-floor-beside-rounds/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#562" + ], + "what": "Press Pull of a floor whose neighbours are rounds (vertical corner fillets): 'a neighbouring edge is not straight'", + "source": "analytic", + "method": "60x40x10 box with four vertical edges rounded r3: floor area 2400 - 4*(1-pi/4)*9 = 2400 - 9*(4-pi) = 2392.274. Pulling the floor 1 mm outward adds a prism of the floor's outline: V = 2392.274 * 11 = 26315.018", + "body_count": 1, + "volume_mm3": 26315.017672705388 +} diff --git a/tests/kernel-cases/booleans/562-press-pull-floor-beside-rounds/recipe.json b/tests/kernel-cases/booleans/562-press-pull-floor-beside-rounds/recipe.json new file mode 100644 index 0000000000..84b08187d0 --- /dev/null +++ b/tests/kernel-cases/booleans/562-press-pull-floor-beside-rounds/recipe.json @@ -0,0 +1,52 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 60, + "width": 40, + "height": 10, + "body_name": "Case" + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 0, + 0, + 5 + ], + [ + 60, + 0, + 5 + ], + [ + 60, + 40, + 5 + ], + [ + 0, + 40, + 5 + ] + ], + "radius": 3 + } + }, + { + "command": "solid.press_pull", + "params": { + "face": [ + 30, + 20, + 0 + ], + "distance": 1 + } + } + ] +} diff --git a/tests/kernel-cases/booleans/831-tapered-extrude-d-shape-arc-meets-line/expected.json b/tests/kernel-cases/booleans/831-tapered-extrude-d-shape-arc-meets-line/expected.json new file mode 100644 index 0000000000..d33208354a --- /dev/null +++ b/tests/kernel-cases/booleans/831-tapered-extrude-d-shape-arc-meets-line/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [ + "tangency-labs/solidcraft#831" + ], + "what": "tapered extrude of a D shape (an arc meeting a line at a sharp corner): refused as 'tapered profiles where an arc meets another edge at a corner'", + "source": "analytic", + "method": "half disc r5 (x>=0) with a -10 deg taper (shrinks inward), 2 mm: the section at height z is the eroded D = disc r=5-d cut at x>=d, d=z tan10deg (erosion of a convex intersection is the intersection of the erosions). Area(d) = rho^2 acos(d/rho) - d sqrt(rho^2-d^2), rho=5-d; V = integral_0^2 Area(z tan10) dz = 69.7714 (Simpson; Area(0) = 12.5 pi = 39.27 at the base)", + "body_count": 1, + "volume_mm3": 69.77140599276278 +} diff --git a/tests/kernel-cases/booleans/831-tapered-extrude-d-shape-arc-meets-line/recipe.json b/tests/kernel-cases/booleans/831-tapered-extrude-d-shape-arc-meets-line/recipe.json new file mode 100644 index 0000000000..da12d61d73 --- /dev/null +++ b/tests/kernel-cases/booleans/831-tapered-extrude-d-shape-arc-meets-line/recipe.json @@ -0,0 +1,55 @@ +{ + "commands": [ + { + "command": "sketch.create", + "params": { + "plane": "XY", + "name": "D" + } + }, + { + "command": "sketch.line", + "params": { + "points": [ + [ + 0, + -5 + ], + [ + 0, + 5 + ] + ] + } + }, + { + "command": "sketch.arc.three_point", + "params": { + "start": [ + 0, + 5 + ], + "end": [ + 0, + -5 + ], + "through": [ + 5, + 0 + ] + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "D", + "distance": "2 mm", + "taper": "-10 deg" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/831-tapered-extrude-text-glyph/expected.json b/tests/kernel-cases/booleans/831-tapered-extrude-text-glyph/expected.json new file mode 100644 index 0000000000..c3a1b6975d --- /dev/null +++ b/tests/kernel-cases/booleans/831-tapered-extrude-text-glyph/expected.json @@ -0,0 +1,9 @@ +{ + "sources": [ + "tangency-labs/solidcraft#831" + ], + "what": "tapered extrude of a text glyph (Bezier outline): refused with a misleading 'mixing lines and arcs' error", + "source": "invariants", + "method": "the letter S, 1 mm tall with -10 deg draft, is one valid closed solid (the glyph is one connected region); no number is derived because the glyph outline is the font's. Its volume is positive and below the plain extrusion's", + "body_count": 1 +} diff --git a/tests/kernel-cases/booleans/831-tapered-extrude-text-glyph/recipe.json b/tests/kernel-cases/booleans/831-tapered-extrude-text-glyph/recipe.json new file mode 100644 index 0000000000..9c81269953 --- /dev/null +++ b/tests/kernel-cases/booleans/831-tapered-extrude-text-glyph/recipe.json @@ -0,0 +1,34 @@ +{ + "commands": [ + { + "command": "sketch.create", + "params": { + "plane": "XY", + "name": "T" + } + }, + { + "command": "sketch.text", + "params": { + "text": "S", + "at": [ + 0, + 0 + ], + "height": 10 + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "T", + "distance": "1 mm", + "taper": "-10 deg" + } + } + ] +} diff --git a/tests/kernel-cases/booleans/skipped-a.json b/tests/kernel-cases/booleans/skipped-a.json new file mode 100644 index 0000000000..25d86eda66 --- /dev/null +++ b/tests/kernel-cases/booleans/skipped-a.json @@ -0,0 +1,294 @@ +[ + { + "source": "tangency-labs/solidcraft#24", + "why": "not geometry: a diagnostics/warning feature (report which boolean fallback ran and by how much), no wrong result" + }, + { + "source": "tangency-labs/solidcraft#141", + "why": "needs the basin design (a floor of four 0.5 degree facets around a drain with a boss ring, from #119/#126); not attached, no recipe in the issue" + }, + { + "source": "tangency-labs/solidcraft#206", + "why": "no design attached (a 146-curved-face target); only the join's params and the failure text" + }, + { + "source": "tangency-labs/solidcraft#367", + "why": "needs the example plastic enclosure (not attached); only the drilled-hole params and the failure text" + }, + { + "source": "tangency-labs/solidcraft#456", + "why": "no design attached (cut with a freeform tool from a sketch 'to' a point); only the params and failure text" + }, + { + "source": "tangency-labs/solidcraft#458", + "why": "no design attached: a cut from a sketch that projects the body's top edges; the steps in the report are not enough to rebuild it" + }, + { + "source": "tangency-labs/solidcraft#522", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#586", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#608", + "why": "no design attached: a second cut onto a face with an existing cut leaving a tiny edge; only the extrude cut's parameters" + }, + { + "source": "tangency-labs/solidcraft#632", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#746", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#823", + "why": "other area: import (an imported STEP body: 'lumps: nested shells do not alternate material and void'); the file is not attached" + }, + { + "source": "tangency-labs/solidcraft#858", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#864", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#873", + "why": "the hexagon positions 'next to' the screw are not given, so the touching contact cannot be rebuilt faithfully; the report has only the join's params" + }, + { + "source": "tangency-labs/solidcraft#887", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#938", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#953", + "why": "no design attached: a cup with a square on its inside floor; the square's size and position are not given" + }, + { + "source": "tangency-labs/solidcraft#967", + "why": "tracking issue for the Hole tool audit; its open refusals (slanted faces, #559) are covered by the case 559-through-hole-into-shelled-box-rim and the hole matrix; the rest is UI" + }, + { + "source": "tangency-labs/solidcraft#990", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#999", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1002", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1025", + "why": "private design not attached (join of 23 cone/cylinder tools); no recipe" + }, + { + "source": "tangency-labs/solidcraft#1125", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1126", + "why": "no design attached: a Draft of a face with non-perpendicular neighbours about a custom neutral plane; only the Draft parameters" + }, + { + "source": "tangency-labs/solidcraft#1133", + "why": "no design attached (a text sketch extruded from another object, tool with 21 freeform faces)" + }, + { + "source": "tangency-labs/solidcraft#1137", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1216", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1225", + "why": "needs the user's design (extrudecrash.txt attachment): tapered extrude of tangent circles on an existing body; steps not reproducible from the text" + }, + { + "source": "tangency-labs/solidcraft#1253", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1343", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1409", + "why": "feature request: Emboss on non-planar ('complex') faces; the current refusal is documented, and no geometry or design is given" + }, + { + "source": "tangency-labs/solidcraft#1436", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1440", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1441", + "why": "no design attached and the report text is empty beyond the feature's parameters" + }, + { + "source": "tangency-labs/solidcraft#1451", + "why": "other area: import (a STEP model from a public site, not attached; join of a 1 mm extrusion refused)" + }, + { + "source": "tangency-labs/solidcraft#1467", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1471", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1511", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1552", + "why": "feature request: sketch entities as Split Body tools; not a wrong result" + }, + { + "source": "tangency-labs/solidcraft#1662", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1672", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1760", + "why": "no design attached ('CPR Sensor' split by a construction plane: 'Intersect: no result')" + }, + { + "source": "tangency-labs/solidcraft#1807", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1834", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1848", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1882", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1926", + "why": "no design attached; a freeze in a symmetric cut, only a screenshot" + }, + { + "source": "tangency-labs/solidcraft#1944", + "why": "empty report: no parameters, no text" + }, + { + "source": "tangency-labs/solidcraft#1946", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#1963", + "why": "empty report: no parameters, no text" + }, + { + "source": "tangency-labs/solidcraft#1964", + "why": "screenshot only, no parameters or text; no recipe" + }, + { + "source": "tangency-labs/solidcraft#1965", + "why": "not a geometry failure: booleans on mesh bodies are refused by design ('a boolean needs a solid body')" + }, + { + "source": "tangency-labs/solidcraft#2048", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#2059", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#2073", + "why": "not boolean geometry: inspect.hole_stacks (an inspection command for aligned holes), no wrong kernel result" + }, + { + "source": "tangency-labs/solidcraft#2075", + "why": "not boolean geometry: parts.fasten (assembly fasteners sized to hole stacks)" + }, + { + "source": "tangency-labs/solidcraft#2090", + "why": "not boolean geometry: inspect.clearance measuring (a shared volume against the union), a measurement feature" + }, + { + "source": "tangency-labs/solidcraft#2156", + "why": "clearance/interference measurement of a pin in its bore (inspect.clearance), not a modelling boolean; the facet crossing tolerance is not a right-answer number a recipe can state" + }, + { + "source": "tangency-labs/solidcraft#2205", + "why": "persistent face names (exact history of a prism boolean) only; the solid it gives is already right, so no geometry answer to grade" + }, + { + "source": "tangency-labs/solidcraft#2407", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#2418", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#2450", + "why": "other area: tessellation (Section Analysis shows a white line at the part's edge; display only)" + }, + { + "source": "tangency-labs/solidcraft#2454", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#2461", + "why": "other area: sheet metal ('this machining intersects a folded bend or a nonparallel panel')" + }, + { + "source": "tangency-labs/solidcraft#2466", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#2495", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#2497", + "why": "not boolean geometry: assembly joint relations (parallel, angle, point on plane)" + }, + { + "source": "tangency-labs/solidcraft#2503", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#2522", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#2525", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#2527", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + }, + { + "source": "tangency-labs/solidcraft#2534", + "why": "no design or file attached: the report carries only the failure text and the feature's parameters, so no synthetic geometry can be rebuilt from it" + } +]