From ead88e582b809ebd75765e5e20fab4f5e75a2d44 Mon Sep 17 00:00:00 2001 From: Brennen Herbruck Date: Wed, 21 Oct 2026 06:17:39 -0400 Subject: [PATCH] kernel-cases: threads cases from modelled-thread reports (2 of 2), skipped sources The rest of the thread cases (holes at the nominal size, shafts and holes off the thread's size, the crash and sketch-attachment repros) and the triage of the sources that are not kernel geometry. Co-Authored-By: Claude Sonnet 5.5 --- .../expected.json | 31 +++ .../recipe.json | 41 ++++ .../expected.json | 26 ++ .../recipe.json | 94 +++++++ .../expected.json | 26 ++ .../recipe.json | 47 ++++ .../expected.json | 31 +++ .../recipe.json | 85 +++++++ .../expected.json | 31 +++ .../recipe.json | 35 +++ .../expected.json | 26 ++ .../recipe.json | 64 +++++ .../expected.json | 32 +++ .../3366-m20-thread-in-20mm-hole/recipe.json | 35 +++ .../expected.json | 26 ++ .../recipe.json | 109 +++++++++ .../expected.json | 23 ++ .../recipe.json | 90 +++++++ .../expected.json | 26 ++ .../recipe.json | 52 ++++ .../expected.json | 27 ++ .../recipe.json | 127 ++++++++++ .../995-m5-thread-in-5mm-hole/expected.json | 32 +++ .../995-m5-thread-in-5mm-hole/recipe.json | 35 +++ tests/kernel-cases/threads/skipped.json | 230 ++++++++++++++++++ 25 files changed, 1381 insertions(+) create mode 100644 tests/kernel-cases/threads/2406-modelled-m8-thread-in-6.8mm-pilot-hole/expected.json create mode 100644 tests/kernel-cases/threads/2406-modelled-m8-thread-in-6.8mm-pilot-hole/recipe.json create mode 100644 tests/kernel-cases/threads/2526-three-modelled-threads-in-one-body/expected.json create mode 100644 tests/kernel-cases/threads/2526-three-modelled-threads-in-one-body/recipe.json create mode 100644 tests/kernel-cases/threads/2705-m14-thread-on-14.6mm-boss-turned-to-major/expected.json create mode 100644 tests/kernel-cases/threads/2705-m14-thread-on-14.6mm-boss-turned-to-major/recipe.json create mode 100644 tests/kernel-cases/threads/2822-modelled-thread-in-filleted-cube/expected.json create mode 100644 tests/kernel-cases/threads/2822-modelled-thread-in-filleted-cube/recipe.json create mode 100644 tests/kernel-cases/threads/2969-m48x0.75-thread-in-48mm-hole/expected.json create mode 100644 tests/kernel-cases/threads/2969-m48x0.75-thread-in-48mm-hole/recipe.json create mode 100644 tests/kernel-cases/threads/3311-two-tapped-holes-both-modelled-threaded/expected.json create mode 100644 tests/kernel-cases/threads/3311-two-tapped-holes-both-modelled-threaded/recipe.json create mode 100644 tests/kernel-cases/threads/3366-m20-thread-in-20mm-hole/expected.json create mode 100644 tests/kernel-cases/threads/3366-m20-thread-in-20mm-hole/recipe.json create mode 100644 tests/kernel-cases/threads/3914-sketch-on-top-face-of-threaded-rounded-block/expected.json create mode 100644 tests/kernel-cases/threads/3914-sketch-on-top-face-of-threaded-rounded-block/recipe.json create mode 100644 tests/kernel-cases/threads/3952-modelled-thread-in-blind-hole-of-revolved-ring/expected.json create mode 100644 tests/kernel-cases/threads/3952-modelled-thread-in-blind-hole-of-revolved-ring/recipe.json create mode 100644 tests/kernel-cases/threads/4149-internal-thread-below-counterbore-filleted-rim/expected.json create mode 100644 tests/kernel-cases/threads/4149-internal-thread-below-counterbore-filleted-rim/recipe.json create mode 100644 tests/kernel-cases/threads/602-fillet-hex-head-beside-modelled-thread/expected.json create mode 100644 tests/kernel-cases/threads/602-fillet-hex-head-beside-modelled-thread/recipe.json create mode 100644 tests/kernel-cases/threads/995-m5-thread-in-5mm-hole/expected.json create mode 100644 tests/kernel-cases/threads/995-m5-thread-in-5mm-hole/recipe.json create mode 100644 tests/kernel-cases/threads/skipped.json diff --git a/tests/kernel-cases/threads/2406-modelled-m8-thread-in-6.8mm-pilot-hole/expected.json b/tests/kernel-cases/threads/2406-modelled-m8-thread-in-6.8mm-pilot-hole/expected.json new file mode 100644 index 0000000000..43f6a5f071 --- /dev/null +++ b/tests/kernel-cases/threads/2406-modelled-m8-thread-in-6.8mm-pilot-hole/expected.json @@ -0,0 +1,31 @@ +{ + "sources": [ + "tangency-labs/solidcraft#2406" + ], + "what": "an M8 modelled thread in a 6.8 mm pilot hole (the case where the thread 'was not visible')", + "source": "analytic", + "method": "ISO 68-1 basic profile: H = P sqrt3/2, basic depth 5H/8. External groove (the space between teeth): a trapezoid P/4 wide at the root radius d/2 - 5H/8, widening by 2 tan30 per unit of radius to 7P/8 at d/2. Internal groove: P/8 wide at the major radius d/2, widening to 3P/4 at the minor radius, cut only where there is material (r >= hole radius). Pappus: volume per turn = 2 pi A rc (A the trapezoid area, rc its centroid radius from the axis); a helical sweep of L/P turns removes exactly (L/P) x that, where each end of the thread is a free end or lies inside material. Block 20x20x10 with a 6.8 mm through hole (rho=3.4, a 0.6 mm groove depth at M8x1.25), M8 over the full 10 mm (8 turns, both ends free): V = 4000 - pi 3.4^2 10 - 8 x V_turn(clipped at r=3.4) = 3636.8319 - 8 x 6.88085 = 3581.7851 mm3. COM on the axis at z=5. Tolerance 1%: a modelled thread is a faceted helical solid (radial chord error up to 1% of the pitch on every wall, i.e. a volume deficit of about 4/3 x sag/R).", + "outcome": "solid", + "body_count": 1, + "volume_mm3": 3581.7851, + "center_of_mass": [ + 0, + 0, + 5.0 + ], + "tolerance": { + "rel": 0.01 + }, + "bbox": { + "min": [ + -10, + -10, + 0 + ], + "max": [ + 10, + 10, + 10 + ] + } +} diff --git a/tests/kernel-cases/threads/2406-modelled-m8-thread-in-6.8mm-pilot-hole/recipe.json b/tests/kernel-cases/threads/2406-modelled-m8-thread-in-6.8mm-pilot-hole/recipe.json new file mode 100644 index 0000000000..17b399f74f --- /dev/null +++ b/tests/kernel-cases/threads/2406-modelled-m8-thread-in-6.8mm-pilot-hole/recipe.json @@ -0,0 +1,41 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "corner": [ + -10, + -10, + 0 + ], + "length": 20, + "width": 20, + "height": 10, + "body_name": "Block" + } + }, + { + "command": "solid.hole", + "params": { + "position": [ + 0, + 0, + 10 + ], + "diameter": 6.8 + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 3.4, + 0, + 5.0 + ], + "designation": "M8", + "modeled": true + } + } + ] +} diff --git a/tests/kernel-cases/threads/2526-three-modelled-threads-in-one-body/expected.json b/tests/kernel-cases/threads/2526-three-modelled-threads-in-one-body/expected.json new file mode 100644 index 0000000000..4280142e69 --- /dev/null +++ b/tests/kernel-cases/threads/2526-three-modelled-threads-in-one-body/expected.json @@ -0,0 +1,26 @@ +{ + "sources": [ + "tangency-labs/solidcraft#2526" + ], + "what": "three modelled threads, internal and external, in one body with a hub and a plain hole beside the bore (each thread used to facet the rest of the part and the next thread was refused)", + "source": "analytic", + "method": "ISO 68-1 basic profile: H = P sqrt3/2, basic depth 5H/8. External groove (the space between teeth): a trapezoid P/4 wide at the root radius d/2 - 5H/8, widening by 2 tan30 per unit of radius to 7P/8 at d/2. Internal groove: P/8 wide at the major radius d/2, widening to 3P/4 at the minor radius, cut only where there is material (r >= hole radius). Pappus: volume per turn = 2 pi A rc (A the trapezoid area, rc its centroid radius from the axis); a helical sweep of L/P turns removes exactly (L/P) x that, where each end of the thread is a free end or lies inside material. Block 40x40x20, a hub R=10 h=10 on top, a 6.75 mm bore through both (30 long), a 3.3 mm hole through the block at (15,15). Three modelled threads on one body: M8 over 8 mm of the bore from the free top end (8/1.25 = 6.4 turns), M4 over the whole 20 mm of the 3.3 mm hole (20/0.7 turns), M20x2.5 over 6 mm of the hub from its free top end (2.4 turns). Plain solid: 32000 + pi 10^2 10 - pi 3.375^2 30 - pi 1.65^2 20 = 33896.9918. Grooves: 46.9780 + 32.4641 + 271.1296. V = 33546.4201 mm3. Tolerance 1%: a modelled thread is a faceted helical solid (radial chord error up to 1% of the pitch on every wall, i.e. a volume deficit of about 4/3 x sag/R).", + "outcome": "solid", + "body_count": 1, + "volume_mm3": 33546.4201, + "tolerance": { + "rel": 0.01 + }, + "bbox": { + "min": [ + -20, + -20, + 0 + ], + "max": [ + 20, + 20, + 30 + ] + } +} diff --git a/tests/kernel-cases/threads/2526-three-modelled-threads-in-one-body/recipe.json b/tests/kernel-cases/threads/2526-three-modelled-threads-in-one-body/recipe.json new file mode 100644 index 0000000000..6ef2bb207d --- /dev/null +++ b/tests/kernel-cases/threads/2526-three-modelled-threads-in-one-body/recipe.json @@ -0,0 +1,94 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "corner": [ + -20, + -20, + 0 + ], + "length": 40, + "width": 40, + "height": 20, + "body_name": "Block" + } + }, + { + "command": "solid.cylinder", + "params": { + "radius": 10, + "height": 10, + "base": [ + 0, + 0, + 20 + ], + "operation": "join", + "targets": [ + "Block" + ] + } + }, + { + "command": "solid.hole", + "params": { + "position": [ + 0, + 0, + 30 + ], + "diameter": 6.75 + } + }, + { + "command": "solid.hole", + "params": { + "position": [ + 15, + 15, + 20 + ], + "diameter": 3.3 + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 3.375, + 0, + 29 + ], + "designation": "M8", + "length": 8, + "modeled": true + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 16.65, + 15, + 10 + ], + "designation": "M4", + "modeled": true + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 10, + 0, + 29 + ], + "designation": "M20", + "length": 6, + "modeled": true + } + } + ] +} diff --git a/tests/kernel-cases/threads/2705-m14-thread-on-14.6mm-boss-turned-to-major/expected.json b/tests/kernel-cases/threads/2705-m14-thread-on-14.6mm-boss-turned-to-major/expected.json new file mode 100644 index 0000000000..2303baf8e7 --- /dev/null +++ b/tests/kernel-cases/threads/2705-m14-thread-on-14.6mm-boss-turned-to-major/expected.json @@ -0,0 +1,26 @@ +{ + "sources": [ + "tangency-labs/solidcraft#2705" + ], + "what": "a modelled M14 thread on a 14.6 mm boss, slightly thicker than the thread (refused: the face is too far from the thread's diameter)", + "source": "analytic", + "method": "ISO 68-1 basic profile: H = P sqrt3/2, basic depth 5H/8. External groove (the space between teeth): a trapezoid P/4 wide at the root radius d/2 - 5H/8, widening by 2 tan30 per unit of radius to 7P/8 at d/2. Internal groove: P/8 wide at the major radius d/2, widening to 3P/4 at the minor radius, cut only where there is material (r >= hole radius). Pappus: volume per turn = 2 pi A rc (A the trapezoid area, rc its centroid radius from the axis); a helical sweep of L/P turns removes exactly (L/P) x that, where each end of the thread is a free end or lies inside material. A 14.6 mm boss (R=7.3, 15 tall) on a 20x20x4 plate takes a modelled M14 (P=2) over 10 mm from its free top end. The boss is thicker than the major diameter, so a die turns it down to 14 mm over the threaded length first (ring pi (7.3^2 - 7^2) 10 = 134.7743) and the groove is cut from there (5 turns, 50.18900 each). V = 1600 + pi 7.3^2 15 - 134.7743 - 5 x 50.18900 = 3725.5127 mm3. The groove's last end may nick the unturned boss by well under 0.2 mm3. Tolerance 1%: a modelled thread is a faceted helical solid (radial chord error up to 1% of the pitch on every wall, i.e. a volume deficit of about 4/3 x sag/R).", + "outcome": "solid", + "body_count": 1, + "volume_mm3": 3725.5127, + "tolerance": { + "rel": 0.01 + }, + "bbox": { + "min": [ + -10, + -10, + 0 + ], + "max": [ + 10, + 10, + 19 + ] + } +} diff --git a/tests/kernel-cases/threads/2705-m14-thread-on-14.6mm-boss-turned-to-major/recipe.json b/tests/kernel-cases/threads/2705-m14-thread-on-14.6mm-boss-turned-to-major/recipe.json new file mode 100644 index 0000000000..0562503bea --- /dev/null +++ b/tests/kernel-cases/threads/2705-m14-thread-on-14.6mm-boss-turned-to-major/recipe.json @@ -0,0 +1,47 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "corner": [ + -10, + -10, + 0 + ], + "length": 20, + "width": 20, + "height": 4, + "body_name": "Part" + } + }, + { + "command": "solid.cylinder", + "params": { + "radius": 7.3, + "height": 15, + "base": [ + 0, + 0, + 4 + ], + "operation": "join", + "targets": [ + "Part" + ] + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 7.3, + 0, + 17 + ], + "designation": "M14", + "length": 10, + "modeled": true + } + } + ] +} diff --git a/tests/kernel-cases/threads/2822-modelled-thread-in-filleted-cube/expected.json b/tests/kernel-cases/threads/2822-modelled-thread-in-filleted-cube/expected.json new file mode 100644 index 0000000000..fd7ce87291 --- /dev/null +++ b/tests/kernel-cases/threads/2822-modelled-thread-in-filleted-cube/expected.json @@ -0,0 +1,31 @@ +{ + "sources": [ + "tangency-labs/solidcraft#2822" + ], + "what": "a modelled M3 thread in a hole through a block whose vertical edges are rounded (the fillets showed as black lines after the thread)", + "source": "analytic", + "method": "ISO 68-1 basic profile: H = P sqrt3/2, basic depth 5H/8. External groove (the space between teeth): a trapezoid P/4 wide at the root radius d/2 - 5H/8, widening by 2 tan30 per unit of radius to 7P/8 at d/2. Internal groove: P/8 wide at the major radius d/2, widening to 3P/4 at the minor radius, cut only where there is material (r >= hole radius). Pappus: volume per turn = 2 pi A rc (A the trapezoid area, rc its centroid radius from the axis); a helical sweep of L/P turns removes exactly (L/P) x that, where each end of the thread is a free end or lies inside material. Cube 20x20x10 with its four vertical edges rounded R2: each removes (1 - pi/4) R^2 x 10 = 8.5841, total 34.3363. A 2.5 mm through hole (the M3 tap drill, rho=1.25) with M3 (P=0.5) over the whole 10 mm (20 turns): V = 4000 - 34.3363 - pi 1.25^2 10 - 20 x 0.43729 = 3907.8305 mm3. By symmetry COM = (10,10,5). Tolerance 1%: a modelled thread is a faceted helical solid (radial chord error up to 1% of the pitch on every wall, i.e. a volume deficit of about 4/3 x sag/R).", + "outcome": "solid", + "body_count": 1, + "volume_mm3": 3907.8305, + "center_of_mass": [ + 10, + 10, + 5 + ], + "tolerance": { + "rel": 0.01 + }, + "bbox": { + "min": [ + 0, + 0, + 0 + ], + "max": [ + 20, + 20, + 10 + ] + } +} diff --git a/tests/kernel-cases/threads/2822-modelled-thread-in-filleted-cube/recipe.json b/tests/kernel-cases/threads/2822-modelled-thread-in-filleted-cube/recipe.json new file mode 100644 index 0000000000..adbca23162 --- /dev/null +++ b/tests/kernel-cases/threads/2822-modelled-thread-in-filleted-cube/recipe.json @@ -0,0 +1,85 @@ +{ + "commands": [ + { + "command": "sketch.create", + "params": { + "plane": "XY" + } + }, + { + "command": "sketch.rectangle.two_point", + "params": { + "p0": [ + 0, + 0 + ], + "p1": [ + 20, + 20 + ] + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "distance": 10, + "body_name": "Cube" + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 0, + 0, + 5 + ], + [ + 20, + 0, + 5 + ], + [ + 20, + 20, + 5 + ], + [ + 0, + 20, + 5 + ] + ], + "radius": 2 + } + }, + { + "command": "solid.hole", + "params": { + "position": [ + 10, + 10, + 10 + ], + "diameter": 2.5 + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 11.25, + 10, + 5 + ], + "designation": "M3", + "modeled": true + } + } + ] +} diff --git a/tests/kernel-cases/threads/2969-m48x0.75-thread-in-48mm-hole/expected.json b/tests/kernel-cases/threads/2969-m48x0.75-thread-in-48mm-hole/expected.json new file mode 100644 index 0000000000..e730c02156 --- /dev/null +++ b/tests/kernel-cases/threads/2969-m48x0.75-thread-in-48mm-hole/expected.json @@ -0,0 +1,31 @@ +{ + "sources": [ + "tangency-labs/solidcraft#2969" + ], + "what": "a modelled M48x0.75 internal thread in a 48 mm hole (a workflow Fusion accepts)", + "source": "analytic", + "method": "ISO 68-1 basic profile: H = P sqrt3/2, basic depth 5H/8. External groove (the space between teeth): a trapezoid P/4 wide at the root radius d/2 - 5H/8, widening by 2 tan30 per unit of radius to 7P/8 at d/2. Internal groove: P/8 wide at the major radius d/2, widening to 3P/4 at the minor radius, cut only where there is material (r >= hole radius). Pappus: volume per turn = 2 pi A rc (A the trapezoid area, rc its centroid radius from the axis); a helical sweep of L/P turns removes exactly (L/P) x that, where each end of the thread is a free end or lies inside material. A 48 mm hole through a D54 x 3 disc, drawn at the thread's nominal size, takes a modelled M48x0.75: the hole is first filled to the tap drill (major - pitch = 47.25 mm, rho=23.625), then the groove is cut, the same thread as in a hole drilled at the tap drill. Whole length, both ends free (4 turns): V = pi 27^2 3 - pi 23.625^2 3 - 4 x V_turn(clipped at rho) = 6870.6631 - 5260.3515 - 4 x 17.37563 = 1540.8091 mm3. The thin lips a tap leaves at each end are below 0.2% of the volume. Tolerance 1%: a modelled thread is a faceted helical solid (radial chord error up to 1% of the pitch on every wall, i.e. a volume deficit of about 4/3 x sag/R).", + "outcome": "solid", + "body_count": 1, + "volume_mm3": 1540.8091, + "tolerance": { + "rel": 0.01 + }, + "bbox": { + "min": [ + -27, + -27, + 0 + ], + "max": [ + 27, + 27, + 3 + ] + }, + "center_of_mass": [ + 0, + 0, + 1.5 + ] +} diff --git a/tests/kernel-cases/threads/2969-m48x0.75-thread-in-48mm-hole/recipe.json b/tests/kernel-cases/threads/2969-m48x0.75-thread-in-48mm-hole/recipe.json new file mode 100644 index 0000000000..76867f2b49 --- /dev/null +++ b/tests/kernel-cases/threads/2969-m48x0.75-thread-in-48mm-hole/recipe.json @@ -0,0 +1,35 @@ +{ + "commands": [ + { + "command": "solid.cylinder", + "params": { + "radius": 27, + "height": 3, + "body_name": "Nut" + } + }, + { + "command": "solid.hole", + "params": { + "position": [ + 0, + 0, + 3 + ], + "diameter": 48 + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 24.0, + 0, + 1.5 + ], + "designation": "M48x0.75", + "modeled": true + } + } + ] +} diff --git a/tests/kernel-cases/threads/3311-two-tapped-holes-both-modelled-threaded/expected.json b/tests/kernel-cases/threads/3311-two-tapped-holes-both-modelled-threaded/expected.json new file mode 100644 index 0000000000..e9aa4a3199 --- /dev/null +++ b/tests/kernel-cases/threads/3311-two-tapped-holes-both-modelled-threaded/expected.json @@ -0,0 +1,26 @@ +{ + "sources": [ + "tangency-labs/solidcraft#3311" + ], + "what": "a second modelled thread on the same body (the first thread faceted every other hole), over each hole's full length", + "source": "analytic", + "method": "ISO 68-1 basic profile: H = P sqrt3/2, basic depth 5H/8. External groove (the space between teeth): a trapezoid P/4 wide at the root radius d/2 - 5H/8, widening by 2 tan30 per unit of radius to 7P/8 at d/2. Internal groove: P/8 wide at the major radius d/2, widening to 3P/4 at the minor radius, cut only where there is material (r >= hole radius). Pappus: volume per turn = 2 pi A rc (A the trapezoid area, rc its centroid radius from the axis); a helical sweep of L/P turns removes exactly (L/P) x that, where each end of the thread is a free end or lies inside material. Block 40x20x9 with two M5 tapped holes (drill 4.2, rho=2.1), each modelled-threaded over its whole 9 mm (11.25 turns, both ends free): V = 7200 - 2 pi 2.1^2 9 - 2 x 11.25 x V_turn(clipped at 2.1) = 6950.6204 - 22.5 x 1.87431 = 6908.4483 mm3. Tolerance 1%: a modelled thread is a faceted helical solid (radial chord error up to 1% of the pitch on every wall, i.e. a volume deficit of about 4/3 x sag/R).", + "outcome": "solid", + "body_count": 1, + "volume_mm3": 6908.4483, + "tolerance": { + "rel": 0.01 + }, + "bbox": { + "min": [ + 0, + 0, + 0 + ], + "max": [ + 40, + 20, + 9 + ] + } +} diff --git a/tests/kernel-cases/threads/3311-two-tapped-holes-both-modelled-threaded/recipe.json b/tests/kernel-cases/threads/3311-two-tapped-holes-both-modelled-threaded/recipe.json new file mode 100644 index 0000000000..4b04f76048 --- /dev/null +++ b/tests/kernel-cases/threads/3311-two-tapped-holes-both-modelled-threaded/recipe.json @@ -0,0 +1,64 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "corner": [ + 0, + 0, + 0 + ], + "length": 40, + "width": 20, + "height": 9, + "body_name": "Block" + } + }, + { + "command": "solid.hole", + "params": { + "position": [ + 10, + 10, + 9 + ], + "thread": "M5" + } + }, + { + "command": "solid.hole", + "params": { + "position": [ + 30, + 10, + 9 + ], + "thread": "M5" + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 12.1, + 10, + 4.5 + ], + "designation": "M5", + "modeled": true + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 32.1, + 10, + 4.5 + ], + "designation": "M5", + "modeled": true + } + } + ] +} diff --git a/tests/kernel-cases/threads/3366-m20-thread-in-20mm-hole/expected.json b/tests/kernel-cases/threads/3366-m20-thread-in-20mm-hole/expected.json new file mode 100644 index 0000000000..94019f9725 --- /dev/null +++ b/tests/kernel-cases/threads/3366-m20-thread-in-20mm-hole/expected.json @@ -0,0 +1,32 @@ +{ + "sources": [ + "tangency-labs/solidcraft#3366", + "tangency-labs/solidcraft#3367" + ], + "what": "a modelled M20 internal thread in a 20 mm hole, made after the 20 mm cylinder's own thread", + "source": "analytic", + "method": "ISO 68-1 basic profile: H = P sqrt3/2, basic depth 5H/8. External groove (the space between teeth): a trapezoid P/4 wide at the root radius d/2 - 5H/8, widening by 2 tan30 per unit of radius to 7P/8 at d/2. Internal groove: P/8 wide at the major radius d/2, widening to 3P/4 at the minor radius, cut only where there is material (r >= hole radius). Pappus: volume per turn = 2 pi A rc (A the trapezoid area, rc its centroid radius from the axis); a helical sweep of L/P turns removes exactly (L/P) x that, where each end of the thread is a free end or lies inside material. A 20 mm hole through a D48 x 10 disc, drawn at the thread's nominal size, takes a modelled M20: the hole is first filled to the tap drill (major - pitch = 17.5 mm, rho=8.75), then the groove is cut, the same thread as in a hole drilled at the tap drill. Whole length, both ends free (4 turns): V = pi 24^2 10 - pi 8.75^2 10 - 4 x V_turn(clipped at rho) = 18095.5737 - 2405.2819 - 4 x 74.96751 = 15390.4218 mm3. The thin lips a tap leaves at each end are below 0.2% of the volume. Tolerance 1%: a modelled thread is a faceted helical solid (radial chord error up to 1% of the pitch on every wall, i.e. a volume deficit of about 4/3 x sag/R).", + "outcome": "solid", + "body_count": 1, + "volume_mm3": 15390.4218, + "tolerance": { + "rel": 0.01 + }, + "bbox": { + "min": [ + -24, + -24, + 0 + ], + "max": [ + 24, + 24, + 10 + ] + }, + "center_of_mass": [ + 0, + 0, + 5.0 + ] +} diff --git a/tests/kernel-cases/threads/3366-m20-thread-in-20mm-hole/recipe.json b/tests/kernel-cases/threads/3366-m20-thread-in-20mm-hole/recipe.json new file mode 100644 index 0000000000..6faa07f4fb --- /dev/null +++ b/tests/kernel-cases/threads/3366-m20-thread-in-20mm-hole/recipe.json @@ -0,0 +1,35 @@ +{ + "commands": [ + { + "command": "solid.cylinder", + "params": { + "radius": 24, + "height": 10, + "body_name": "Nut" + } + }, + { + "command": "solid.hole", + "params": { + "position": [ + 0, + 0, + 10 + ], + "diameter": 20 + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 10.0, + 0, + 5.0 + ], + "designation": "M20", + "modeled": true + } + } + ] +} diff --git a/tests/kernel-cases/threads/3914-sketch-on-top-face-of-threaded-rounded-block/expected.json b/tests/kernel-cases/threads/3914-sketch-on-top-face-of-threaded-rounded-block/expected.json new file mode 100644 index 0000000000..3d7aaf2775 --- /dev/null +++ b/tests/kernel-cases/threads/3914-sketch-on-top-face-of-threaded-rounded-block/expected.json @@ -0,0 +1,26 @@ +{ + "sources": [ + "tangency-labs/solidcraft#3914" + ], + "what": "Create Sketch on the top face of a block with a modelled thread and rounded corners, then a boss from it", + "source": "analytic", + "method": "ISO 68-1 basic profile: H = P sqrt3/2, basic depth 5H/8. External groove (the space between teeth): a trapezoid P/4 wide at the root radius d/2 - 5H/8, widening by 2 tan30 per unit of radius to 7P/8 at d/2. Internal groove: P/8 wide at the major radius d/2, widening to 3P/4 at the minor radius, cut only where there is material (r >= hole radius). Pappus: volume per turn = 2 pi A rc (A the trapezoid area, rc its centroid radius from the axis); a helical sweep of L/P turns removes exactly (L/P) x that, where each end of the thread is a free end or lies inside material. Box 20^3, a D5 hole 20 deep (rho=2.5), M6 (P=1) over the whole 20 mm (20 turns, both ends free), the four vertical edges rounded R2 (68.6726), then a sketch on the top face with a 4x4 rectangle at least 4 mm from the hole centre, extruded 5 mm and joined: +80. V = 8000 - 68.6726 - pi 2.5^2 20 - 20 x 3.49832 + 80 = 7548.6619 mm3. Create Sketch on that face was refused ('its history can't tell it apart from other faces'). Tolerance 1%: a modelled thread is a faceted helical solid (radial chord error up to 1% of the pitch on every wall, i.e. a volume deficit of about 4/3 x sag/R).", + "outcome": "solid", + "body_count": 1, + "volume_mm3": 7548.6619, + "tolerance": { + "rel": 0.01 + }, + "bbox": { + "min": [ + 0, + 0, + 0 + ], + "max": [ + 20, + 20, + 25 + ] + } +} diff --git a/tests/kernel-cases/threads/3914-sketch-on-top-face-of-threaded-rounded-block/recipe.json b/tests/kernel-cases/threads/3914-sketch-on-top-face-of-threaded-rounded-block/recipe.json new file mode 100644 index 0000000000..2e0e1756b9 --- /dev/null +++ b/tests/kernel-cases/threads/3914-sketch-on-top-face-of-threaded-rounded-block/recipe.json @@ -0,0 +1,109 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "corner": [ + 0, + 0, + 0 + ], + "length": 20, + "width": 20, + "height": 20, + "body_name": "Block" + } + }, + { + "command": "solid.hole", + "params": { + "position": [ + 10, + 10, + 20 + ], + "diameter": 5, + "depth": 20 + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 12.5, + 10, + 10 + ], + "designation": "M6", + "modeled": true + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 0, + 0, + 10 + ], + [ + 20, + 0, + 10 + ], + [ + 20, + 20, + 10 + ], + [ + 0, + 20, + 10 + ] + ], + "radius": 2 + } + }, + { + "command": "sketch.create", + "params": { + "plane": { + "face": [ + 5, + 5, + 20 + ] + } + } + }, + { + "command": "sketch.rectangle.two_point", + "params": { + "p0": [ + 3, + 3 + ], + "p1": [ + 7, + 7 + ] + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "distance": 5, + "operation": "join", + "targets": [ + "Block" + ] + } + } + ] +} diff --git a/tests/kernel-cases/threads/3952-modelled-thread-in-blind-hole-of-revolved-ring/expected.json b/tests/kernel-cases/threads/3952-modelled-thread-in-blind-hole-of-revolved-ring/expected.json new file mode 100644 index 0000000000..fc806d35fd --- /dev/null +++ b/tests/kernel-cases/threads/3952-modelled-thread-in-blind-hole-of-revolved-ring/expected.json @@ -0,0 +1,23 @@ +{ + "sources": [ + "tangency-labs/solidcraft#3952" + ], + "what": "a modelled thread in a small blind hole drilled into a revolved ring, off its axis ('faceted boolean: inconsistent volumes')", + "source": "analytic", + "method": "ISO 68-1 basic profile: H = P sqrt3/2, basic depth 5H/8. External groove (the space between teeth): a trapezoid P/4 wide at the root radius d/2 - 5H/8, widening by 2 tan30 per unit of radius to 7P/8 at d/2. Internal groove: P/8 wide at the major radius d/2, widening to 3P/4 at the minor radius, cut only where there is material (r >= hole radius). Pappus: volume per turn = 2 pi A rc (A the trapezoid area, rc its centroid radius from the axis); a helical sweep of L/P turns removes exactly (L/P) x that, where each end of the thread is a free end or lies inside material. Revolved ring R12..30, 30 tall: pi (30^2 - 12^2) 30 = 71251.3214. A D2.5 flat-bottomed hole 8 deep at 21 mm from the axis (pi 1.25^2 8 = 39.2699), M3 (P=0.5, rho=1.25) over the hole's whole 8 mm (16 turns): 16 x 0.43729. The blind end can shift the groove's last end by under 0.25 mm3. V = 71205.0548 mm3. Tolerance 1e-3 (the ring dominates the volume; the check is that the thread builds a valid solid, which it once refused: faceted boolean: inconsistent volumes).", + "outcome": "solid", + "body_count": 1, + "volume_mm3": 71205.0548, + "bbox": { + "min": [ + -30, + -30, + 0 + ], + "max": [ + 30, + 30, + 30 + ] + } +} diff --git a/tests/kernel-cases/threads/3952-modelled-thread-in-blind-hole-of-revolved-ring/recipe.json b/tests/kernel-cases/threads/3952-modelled-thread-in-blind-hole-of-revolved-ring/recipe.json new file mode 100644 index 0000000000..f7e5fdbc99 --- /dev/null +++ b/tests/kernel-cases/threads/3952-modelled-thread-in-blind-hole-of-revolved-ring/recipe.json @@ -0,0 +1,90 @@ +{ + "commands": [ + { + "command": "sketch.create", + "params": { + "plane": "XZ", + "name": "Sketch1" + } + }, + { + "command": "sketch.line", + "params": { + "points": [ + [ + 12, + 0 + ], + [ + 30, + 0 + ], + [ + 30, + -30 + ], + [ + 12, + -30 + ] + ], + "closed": true + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.revolve", + "params": { + "sketch": "Sketch1", + "axis": "Z" + } + }, + { + "command": "sketch.create", + "params": { + "plane": "XY", + "offset": "30 mm", + "name": "Sketch2" + } + }, + { + "command": "sketch.circle.center", + "params": { + "center": [ + 21, + 0 + ], + "diameter": 2.5 + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "sketch": "Sketch2", + "profiles": "all", + "distance": 8, + "direction": "negative", + "operation": "cut" + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 22.25, + 0, + 26 + ], + "designation": "M3", + "modeled": true + } + } + ] +} diff --git a/tests/kernel-cases/threads/4149-internal-thread-below-counterbore-filleted-rim/expected.json b/tests/kernel-cases/threads/4149-internal-thread-below-counterbore-filleted-rim/expected.json new file mode 100644 index 0000000000..02d00be605 --- /dev/null +++ b/tests/kernel-cases/threads/4149-internal-thread-below-counterbore-filleted-rim/expected.json @@ -0,0 +1,26 @@ +{ + "sources": [ + "tangency-labs/solidcraft#4149" + ], + "what": "a modelled M10x1.5 internal thread, full length of the bore below a counterbore, in a cylinder with its rim rounded (stack overflow)", + "source": "analytic", + "method": "ISO 68-1 basic profile: H = P sqrt3/2, basic depth 5H/8. External groove (the space between teeth): a trapezoid P/4 wide at the root radius d/2 - 5H/8, widening by 2 tan30 per unit of radius to 7P/8 at d/2. Internal groove: P/8 wide at the major radius d/2, widening to 3P/4 at the minor radius, cut only where there is material (r >= hole radius). Pappus: volume per turn = 2 pi A rc (A the trapezoid area, rc its centroid radius from the axis); a helical sweep of L/P turns removes exactly (L/P) x that, where each end of the thread is a free end or lies inside material. Cylinder D40 h=30; a 8.5 mm through hole with a D18 x 5 counterbore (hole volume pi(9^2 5 + 4.25^2 25) = 2690.9705); the top outer edge rounded R3: removed = 2 pi (R - xbar) A with A = r^2 (1 - pi/4) = 1.9314 and the removed corner's centroid xbar = r (5/6 - pi/4)/(1 - pi/4) = 0.6701 from the corner, so 234.5769. M10x1.5 over the 25 mm of the bore below the counterbore (16.667 turns, rho=4.25): the thread ends at the counterbore floor, so the last groove end may stop up to half a groove short of it; that is under 0.3 mm of pitch, below 4 mm3. V = 37699.1118 - 234.5769 - 2690.9705 - 16.667 x 13.26888 = 34552.4164 mm3. Tolerance 0.3%: faceted helix as for the other thread cases; that is 110 mm3 on this large body (the groove itself is 192 mm3), and the end effect and the faceting stay far below it.", + "outcome": "solid", + "body_count": 1, + "volume_mm3": 34552.4164, + "tolerance": { + "rel": 0.003 + }, + "bbox": { + "min": [ + -20, + -20, + 0 + ], + "max": [ + 20, + 20, + 30 + ] + } +} diff --git a/tests/kernel-cases/threads/4149-internal-thread-below-counterbore-filleted-rim/recipe.json b/tests/kernel-cases/threads/4149-internal-thread-below-counterbore-filleted-rim/recipe.json new file mode 100644 index 0000000000..380dd16700 --- /dev/null +++ b/tests/kernel-cases/threads/4149-internal-thread-below-counterbore-filleted-rim/recipe.json @@ -0,0 +1,52 @@ +{ + "commands": [ + { + "command": "solid.cylinder", + "params": { + "radius": 20, + "height": 30, + "body_name": "Part" + } + }, + { + "command": "solid.hole", + "params": { + "position": [ + 0, + 0, + 30 + ], + "diameter": 8.5, + "type": "counterbore", + "cb_diameter": 18, + "cb_depth": 5 + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 20, + 0, + 30 + ] + ], + "radius": 3 + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 0, + -4.25, + 12.5 + ], + "designation": "M10x1.5", + "length": 25, + "modeled": true + } + } + ] +} diff --git a/tests/kernel-cases/threads/602-fillet-hex-head-beside-modelled-thread/expected.json b/tests/kernel-cases/threads/602-fillet-hex-head-beside-modelled-thread/expected.json new file mode 100644 index 0000000000..2d5cff8c59 --- /dev/null +++ b/tests/kernel-cases/threads/602-fillet-hex-head-beside-modelled-thread/expected.json @@ -0,0 +1,27 @@ +{ + "sources": [ + "tangency-labs/solidcraft#602", + "tangency-labs/solidcraft#618" + ], + "what": "rounding the top edges of a hex head on a shaft with a modelled thread (it froze the app)", + "source": "analytic", + "method": "ISO 68-1 basic profile: H = P sqrt3/2, basic depth 5H/8. External groove (the space between teeth): a trapezoid P/4 wide at the root radius d/2 - 5H/8, widening by 2 tan30 per unit of radius to 7P/8 at d/2. Internal groove: P/8 wide at the major radius d/2, widening to 3P/4 at the minor radius, cut only where there is material (r >= hole radius). Pappus: volume per turn = 2 pi A rc (A the trapezoid area, rc its centroid radius from the axis); a helical sweep of L/P turns removes exactly (L/P) x that, where each end of the thread is a free end or lies inside material. Shaft D5 h=10 plus a hexagonal head of apothem a=2 (area 2 sqrt3 a^2 = 13.8564), h=3. M5 (P=0.8) over 4 mm from the free bottom end (5 turns): 5 x 2.84480. The six top edges rounded R=r=0.3 with the vertical edges left sharp: the section at depth y below the top is a hexagon of apothem a - d(y), d = r - sqrt(r^2 - (r-y)^2); removed = 2 sqrt3 int (2 a d - d^2) dy = 2 sqrt3 [2 a r^2 (1 - pi/4) - r^3 (5/3 - pi/2)] = 0.25866. V = pi 2.5^2 10 + 41.5692 - 5 x 2.84480 - 0.25866 = 223.4361 mm3. Tolerance 1%: a modelled thread is a faceted helical solid (radial chord error up to 1% of the pitch on every wall, i.e. a volume deficit of about 4/3 x sag/R).", + "outcome": "solid", + "body_count": 1, + "volume_mm3": 223.4361, + "tolerance": { + "rel": 0.01 + }, + "bbox": { + "min": [ + -2.5, + -2.5, + 0 + ], + "max": [ + 2.5, + 2.5, + 13 + ] + } +} diff --git a/tests/kernel-cases/threads/602-fillet-hex-head-beside-modelled-thread/recipe.json b/tests/kernel-cases/threads/602-fillet-hex-head-beside-modelled-thread/recipe.json new file mode 100644 index 0000000000..1dd9de4ffd --- /dev/null +++ b/tests/kernel-cases/threads/602-fillet-hex-head-beside-modelled-thread/recipe.json @@ -0,0 +1,127 @@ +{ + "commands": [ + { + "command": "sketch.create", + "params": { + "plane": "XY" + } + }, + { + "command": "sketch.circle.center", + "params": { + "center": [ + 0, + 0 + ], + "diameter": 5 + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "distance": 10, + "body_name": "Screw" + } + }, + { + "command": "sketch.create", + "params": { + "plane": { + "face": [ + 0, + 0, + 10 + ] + } + } + }, + { + "command": "sketch.polygon.circumscribed", + "params": { + "center": [ + 0, + 0 + ], + "radius": 2, + "sides": 6 + } + }, + { + "command": "sketch.finish", + "params": {} + }, + { + "command": "solid.extrude", + "params": { + "distance": 3, + "profiles": [ + { + "point": [ + 0, + 0 + ] + } + ], + "operation": "join", + "targets": [ + "Screw" + ] + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 2.5, + 0, + 5 + ], + "designation": "M5", + "length": 4, + "modeled": true + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 1.7320508075688774, + 0.9999999999999999, + 13 + ], + [ + 1.2246467991473532e-16, + 2.0, + 13 + ], + [ + -1.7320508075688774, + 0.9999999999999999, + 13 + ], + [ + -1.7320508075688772, + -1.0000000000000002, + 13 + ], + [ + -3.6739403974420594e-16, + -2.0, + 13 + ], + [ + 1.7320508075688767, + -1.0000000000000009, + 13 + ] + ], + "radius": 0.3 + } + } + ] +} diff --git a/tests/kernel-cases/threads/995-m5-thread-in-5mm-hole/expected.json b/tests/kernel-cases/threads/995-m5-thread-in-5mm-hole/expected.json new file mode 100644 index 0000000000..5069a84e04 --- /dev/null +++ b/tests/kernel-cases/threads/995-m5-thread-in-5mm-hole/expected.json @@ -0,0 +1,32 @@ +{ + "sources": [ + "tangency-labs/solidcraft#995", + "tangency-labs/solidcraft#1018" + ], + "what": "a modelled M5 thread in a hole drawn at 5 mm, the thread's own size (nothing was cut: the wall only turned faceted)", + "source": "analytic", + "method": "ISO 68-1 basic profile: H = P sqrt3/2, basic depth 5H/8. External groove (the space between teeth): a trapezoid P/4 wide at the root radius d/2 - 5H/8, widening by 2 tan30 per unit of radius to 7P/8 at d/2. Internal groove: P/8 wide at the major radius d/2, widening to 3P/4 at the minor radius, cut only where there is material (r >= hole radius). Pappus: volume per turn = 2 pi A rc (A the trapezoid area, rc its centroid radius from the axis); a helical sweep of L/P turns removes exactly (L/P) x that, where each end of the thread is a free end or lies inside material. A 5 mm hole through a D14 x 4 disc, drawn at the thread's nominal size, takes a modelled M5: the hole is first filled to the tap drill (major - pitch = 4.2 mm, rho=2.1), then the groove is cut, the same thread as in a hole drilled at the tap drill. Whole length, both ends free (5 turns): V = pi 7^2 4 - pi 2.1^2 4 - 5 x V_turn(clipped at rho) = 615.7522 - 55.4177 - 5 x 1.87431 = 550.9629 mm3. The thin lips a tap leaves at each end are below 0.2% of the volume. Tolerance 1%: a modelled thread is a faceted helical solid (radial chord error up to 1% of the pitch on every wall, i.e. a volume deficit of about 4/3 x sag/R).", + "outcome": "solid", + "body_count": 1, + "volume_mm3": 550.9629, + "tolerance": { + "rel": 0.01 + }, + "bbox": { + "min": [ + -7, + -7, + 0 + ], + "max": [ + 7, + 7, + 4 + ] + }, + "center_of_mass": [ + 0, + 0, + 2.0 + ] +} diff --git a/tests/kernel-cases/threads/995-m5-thread-in-5mm-hole/recipe.json b/tests/kernel-cases/threads/995-m5-thread-in-5mm-hole/recipe.json new file mode 100644 index 0000000000..7a8e9548f4 --- /dev/null +++ b/tests/kernel-cases/threads/995-m5-thread-in-5mm-hole/recipe.json @@ -0,0 +1,35 @@ +{ + "commands": [ + { + "command": "solid.cylinder", + "params": { + "radius": 7, + "height": 4, + "body_name": "Nut" + } + }, + { + "command": "solid.hole", + "params": { + "position": [ + 0, + 0, + 4 + ], + "diameter": 5 + } + }, + { + "command": "solid.thread", + "params": { + "face": [ + 2.5, + 0, + 2.0 + ], + "designation": "M5", + "modeled": true + } + } + ] +} diff --git a/tests/kernel-cases/threads/skipped.json b/tests/kernel-cases/threads/skipped.json new file mode 100644 index 0000000000..ed39d1f349 --- /dev/null +++ b/tests/kernel-cases/threads/skipped.json @@ -0,0 +1,230 @@ +[ + { + "source": "tangency-labs/solidcraft#4093", + "why": "other area: sweeps (a guided helical sweep cut whose exported mesh has open boundaries; not the Thread feature)" + }, + { + "source": "tangency-labs/solidcraft#4087", + "why": "feature request: the thread as a few selectable faces rather than many facets; no closed-form face count, no number to grade" + }, + { + "source": "tangency-labs/solidcraft#4085", + "why": "no new geometry: M6 on a 7 mm shaft is a shaft thicker than the thread, the family of case 2705" + }, + { + "source": "tangency-labs/solidcraft#4033", + "why": "visual only: the thread's facets look faceted; the report has no design, only a face point" + }, + { + "source": "tangency-labs/solidcraft#3847", + "why": "other area: tessellation (display plans for threads and pointed ends of imported STEP bodies)" + }, + { + "source": "tangency-labs/solidcraft#3745", + "why": "UI only: hover highlight of a large thread computed on the main thread" + }, + { + "source": "tangency-labs/solidcraft#3737", + "why": "UI only: orbit and zoom freeze in edge highlighting on the main thread" + }, + { + "source": "tangency-labs/solidcraft#3710", + "why": "no repro geometry: the report has only the face point of a private design (an app that stopped responding)" + }, + { + "source": "tangency-labs/solidcraft#3519", + "why": "UI only: the Thread dialog was applied with no cylindrical face selected" + }, + { + "source": "tangency-labs/solidcraft#3467", + "why": "no repro geometry: 'planar boolean: shell not oriented and closed' with only the face point of a private design; the same family as case 3311-two-tapped-holes-both-modelled-threaded" + }, + { + "source": "tangency-labs/solidcraft#3386", + "why": "other area: crashes (a crash report with only a face point, no design)" + }, + { + "source": "tangency-labs/solidcraft#3337", + "why": "no repro geometry: 'planar boolean: shell not oriented and closed' with only a face point; the same family as case 3311-two-tapped-holes-both-modelled-threaded" + }, + { + "source": "tangency-labs/solidcraft#3307", + "why": "no repro: a hole with a thread size is a cosmetic thread by default (see case 2115-tapped-hole-drill-is-major-minus-pitch)" + }, + { + "source": "tangency-labs/solidcraft#3183", + "why": "no repro geometry: 'planar boolean: tree too deep' redefining a thread after a fillet; sizes of the private design unknown" + }, + { + "source": "tangency-labs/solidcraft#3165", + "why": "empty report (the body was not pasted)" + }, + { + "source": "tangency-labs/solidcraft#3145", + "why": "feature request: threads without turning the whole body into facets; no number to grade (the multi-thread case 2526-three-modelled-threads-in-one-body covers the symptom)" + }, + { + "source": "tangency-labs/solidcraft#3133", + "why": "CPU or window threads (off-thread evaluation, freezes), not modelled threads: no geometry" + }, + { + "source": "tangency-labs/solidcraft#3131", + "why": "no repro geometry: 'the face is too far from the thread's diameter' with only a face point; the family of case 2369" + }, + { + "source": "tangency-labs/solidcraft#3110", + "why": "not kernel geometry: the automatic-size lookup refuses a 78 mm shaft (no standard size); a cosmetic thread leaves the model unchanged" + }, + { + "source": "tangency-labs/solidcraft#2929", + "why": "test flakiness of the off-window-thread tests: not geometry" + }, + { + "source": "tangency-labs/solidcraft#2908", + "why": "test flakiness of the off-window-thread tests: not geometry" + }, + { + "source": "tangency-labs/solidcraft#2892", + "why": "no repro geometry: 'planar boolean: tree too deep' for an M22x2.5 modelled thread, with only a face point" + }, + { + "source": "tangency-labs/solidcraft#2796", + "why": "other area: crashes (a crash report with only a face point, no design)" + }, + { + "source": "tangency-labs/solidcraft#2470", + "why": "other area: crashes (a crash report with only a face point, no design)" + }, + { + "source": "tangency-labs/solidcraft#2467", + "why": "window-thread / UI responsiveness, not modelled threads: no geometry" + }, + { + "source": "tangency-labs/solidcraft#2451", + "why": "other area: crashes (a crash report with only a face point, no design)" + }, + { + "source": "tangency-labs/solidcraft#2079", + "why": "tracker for modelled threads; the geometry is in cases 2038-* and 2526-*" + }, + { + "source": "tangency-labs/solidcraft#1794", + "why": "no repro geometry: 'no cylindrical face there to thread' with only a face point of a private design; the family of case 2038-internal-then-external-thread-on-one-body" + }, + { + "source": "tangency-labs/solidcraft#1731", + "why": "no repro geometry: 'planar boolean: shell not oriented and closed' with only a face point; the family of case 3311-two-tapped-holes-both-modelled-threaded" + }, + { + "source": "tangency-labs/solidcraft#1289", + "why": "other area: tessellation (imported STEP threads displayed with artifacts; the B-rep was fine)" + }, + { + "source": "tangency-labs/solidcraft#1024", + "why": "test-process memory corruption on Windows in the thread tests, not a geometry result with a right answer" + }, + { + "source": "tangency-labs/solidcraft#873", + "why": "other area: booleans (a hexagon join beside a screw: 'join cannot preserve the original faces'; no thread involved)" + }, + { + "source": "tangency-labs/solidcraft#524", + "why": "design preference (thread adds material instead of cutting into the part) and a groove-end convention at shoulders with no derivable number; the hole-too-wide fill it was linked to is case 1443-m5x0.7-thread-in-5mm-hole" + }, + { + "source": "tangency-labs/solidcraft#519", + "why": "feature request: a thread as 1 to 3 faces so it can be offset; no closed-form face count to grade" + }, + { + "source": "tangency-labs/solidcraft#424", + "why": "Insert Part bolts carry cosmetic threads by design (the comment asks for a modelled option); no geometry defect" + }, + { + "source": "tangency-labs/solidcraft#287", + "why": "performance umbrella: multithreading, SIMD, caching; nothing to grade" + }, + { + "source": "tangency-labs/solidcraft#3870", + "why": "other area: tessellation (hover and select a thread as one piece: display and picking groups)" + }, + { + "source": "tangency-labs/solidcraft#3849", + "why": "other area: tessellation (display plans for STEP threads and pointed ends)" + }, + { + "source": "tangency-labs/solidcraft#3738", + "why": "UI and data: tapped-hole catalogue of metric fine, UNC and UNF sizes with tabulated pilot drills; no closed form" + }, + { + "source": "tangency-labs/solidcraft#3622", + "why": "test flakiness: not geometry" + }, + { + "source": "tangency-labs/solidcraft#3609", + "why": "CPU or window threads (off-thread evaluation, freezes), not modelled threads: no geometry" + }, + { + "source": "tangency-labs/solidcraft#3340", + "why": "CPU or window threads (off-thread evaluation, freezes), not modelled threads: no geometry" + }, + { + "source": "tangency-labs/solidcraft#3135", + "why": "CPU or window threads (off-thread evaluation, freezes), not modelled threads: no geometry" + }, + { + "source": "tangency-labs/solidcraft#2868", + "why": "UI only: cosmetic thread markings as a display preference" + }, + { + "source": "tangency-labs/solidcraft#2679", + "why": "CPU or window threads (off-thread evaluation, freezes), not modelled threads: no geometry" + }, + { + "source": "tangency-labs/solidcraft#2468", + "why": "CPU or window threads (off-thread evaluation, freezes), not modelled threads: no geometry" + }, + { + "source": "tangency-labs/solidcraft#2265", + "why": "UI only: reopening a Thread feature lost its face selection" + }, + { + "source": "tangency-labs/solidcraft#2264", + "why": "UI only: modelled-thread preview in the dialog" + }, + { + "source": "tangency-labs/solidcraft#2243", + "why": "other area: import (STEP export read-back hangs meshing a seam cylinder hole)" + }, + { + "source": "tangency-labs/solidcraft#2095", + "why": "performance: kernel profile timings of a thread's faceted cut" + }, + { + "source": "tangency-labs/solidcraft#1759", + "why": "UI only: the Thread dialog's size suggestion" + }, + { + "source": "tangency-labs/solidcraft#1675", + "why": "CPU or window threads (off-thread evaluation, freezes), not modelled threads: no geometry" + }, + { + "source": "tangency-labs/solidcraft#1527", + "why": "other area: booleans (last-resort nudge of a pleat loft join; not a thread)" + }, + { + "source": "tangency-labs/solidcraft#1524", + "why": "assembly joints (gear, rack and screw couplings between motions): no kernel geometry" + }, + { + "source": "tangency-labs/solidcraft#1300", + "why": "other area: tessellation (display of imported modelled threads)" + }, + { + "source": "tangency-labs/solidcraft#1201", + "why": "CPU or window threads (off-thread evaluation, freezes), not modelled threads: no geometry" + }, + { + "source": "tangency-labs/solidcraft#1020", + "why": "CPU or window threads (off-thread evaluation, freezes), not modelled threads: no geometry" + } +]