Public reference tests: analytic and FreeCAD expected values (#310)

The oracle no longer uses Fusion measurements. tests/oracle/<case>/ now holds the 76 recipes
(our own format, with recorded measurements and tool-specific fields removed) and an
expected.json per case:

- 55 analytic cases: closed-form values from tools/oracle-analytic/ (stdlib Python, formulas
  in each case's "method").
- 21 FreeCAD cases: the same recipe built with FreeCAD's public scripting API by
  tools/freecad-oracle/ (an external program, not a dependency), with a reference.stl for 20.

solvecraft-cli oracle compares body count, volume, area, centre of mass, bbox, face counts
where the geometry fixes them, and, against reference.stl, the sampled Hausdorff distance and
the principal moments (spatial.rs from #301). cargo xtask oracle reads tests/oracle, writes
docs/oracle.md with the source of each value, and supports known_failure marks for tracked
bugs. CI runs it on every PR; a manual workflow regenerates the FreeCAD values. step-corpus,
seam normalisation and the through-all emulation, which only existed to compare with Fusion,
are removed.

75/76 pass; 75-sm-bracket-holes is a known failure (#296).


Claude-Session: https://claude.ai/code/session_01RjGw4gA5ZvKrU8MQP6sBgT

Co-authored-by: bherbruck <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
This commit is contained in:
authored and GitHub committed 2026-10-12 10:43:43 -04:00
1 parent f0dda667bb
commit e12758ff91
204 files changed
+27106 -932

No files matched your search

+25
View File
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "box 40 x 30 x 20 from the origin: V = abc, A = 2(ab + bc + ca)",
"body_count": 1,
"volume_mm3": 24000.0,
"area_mm2": 5200.0,
"center_of_mass": [
20.0,
15.0,
10.0
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
40.0,
30.0,
20.0
]
},
"faces": 6
}
+153
View File
@@ -0,0 +1,153 @@
{
"id": "01-box",
"name": "Box extrude",
"description": "40 x 30 rectangle on XY extruded 20 mm.",
"exercises": [
"sketch",
"extrude"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Sketch1",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
40,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
40.0,
0.0
]
},
"end": {
"at": [
40,
30
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
40.0,
30.0
]
},
"end": {
"at": [
0,
30
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
30.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Sketch1",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 20,
"direction": "positive"
},
"result_bodies": [
"Box"
]
}
]
}
+25
View File
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "cylinder r=15 h=50 on XY: V = pi r^2 h, A = 2 pi r^2 + 2 pi r h",
"body_count": 1,
"volume_mm3": 35342.917352885175,
"area_mm2": 6126.105674500097,
"center_of_mass": [
0.0,
0.0,
25.0
],
"bbox": {
"min": [
-15.0,
-15.0,
0.0
],
"max": [
15.0,
15.0,
50.0
]
},
"faces": 3
}
+94
View File
@@ -0,0 +1,94 @@
{
"id": "02-cylinder",
"name": "Cylinder",
"description": "Circle r=15 at origin on XY extruded 50 mm.",
"exercises": [
"sketch",
"circle",
"extrude"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Sketch1",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0,
0
]
},
"radius": 15,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Sketch1",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 50,
"direction": "positive"
},
"result_bodies": [
"Cylinder"
]
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "box 60x40x20 minus centred through cylinder r=6: V = abc - pi r^2 c, A = 2(ab+bc+ca) - 2 pi r^2 + 2 pi r c; hole is centred so the centroid stays at the box centre",
"body_count": 1,
"volume_mm3": 45738.05328941535,
"area_mm2": 9327.787565803084,
"center_of_mass": [
30.0,
20.0,
10.0
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
60.0,
40.0,
20.0
]
},
"faces": 7
}
@@ -0,0 +1,240 @@
{
"id": "03-box-through-hole",
"name": "Box with through hole",
"description": "60x40x20 box; d=12 circle sketched on the top face at the face centre, cut through all.",
"exercises": [
"extrude",
"sketch_on_face",
"extrude_cut",
"through_all"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Extrude1_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
60,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
60.0,
0.0
]
},
"end": {
"at": [
60,
40
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
60.0,
40.0
]
},
"end": {
"at": [
0,
40
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
40.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Extrude1_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 20,
"direction": "positive"
},
"result_bodies": [
"Box"
]
},
{
"op": "sketch",
"name": "Sketch2",
"plane": {
"ref": "face: top planar face of Box (z=20, normal +Z)",
"origin": [
0.0,
0.0,
20.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
],
"face": {
"type": "plane",
"normal_at_point_on_face": [
0.0,
0.0,
1.0
],
"plane_normal_outward": [
0.0,
0.0,
1.0
],
"point": [
30.0,
20.0,
20.0
]
}
},
"entities": [
{
"type": "circle",
"center": {
"at": [
30.0,
20.0
]
},
"radius": 6,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Cut1",
"operation": "cut",
"profiles": [
{
"sketch": "Sketch2",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "through_all",
"direction": "negative"
},
"result_bodies": [
"Box"
]
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "revolve of a line/3-point-arc profile (XZ, x = radius, z = -sketch y) 360 deg about Z. Pappus/Green: V = 2 pi * int x dA, z_c = int x z dA / int x dA, A = sum over profile edges of 2 pi int x ds (bottom disk r20, frustum r20->25, torus zone of the arc (centre (-16.000000, 33.000000), R=41.109610), frustum r15->18, top disk r18)",
"body_count": 1,
"volume_mm3": 112499.47865571639,
"area_mm2": 13156.614546780698,
"center_of_mass": [
0.0,
0.0,
35.737480169007014
],
"bbox": {
"min": [
-25.10960958218893,
-25.10960958218893,
0.0
],
"max": [
25.10960958218893,
25.10960958218893,
80.0
]
},
"faces": 5
}
+201
View File
@@ -0,0 +1,201 @@
{
"id": "04-revolve-vase",
"name": "Revolved vase profile",
"description": "Closed profile (lines + 3-point arc) on XZ revolved 360 deg about the world Z axis.",
"exercises": [
"sketch_xz",
"arc",
"revolve"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Profile",
"plane": {
"ref": "XZ",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
0.0,
-1.0
],
"normal": [
0.0,
1.0,
0.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0.0,
0.0
]
},
"end": {
"at": [
20.0,
0.0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
20.0,
0.0
]
},
"end": {
"at": [
25.0,
-30.0
]
},
"id": "l2"
},
{
"type": "arc_three_point",
"start": {
"ref": "l2.end",
"at": [
25.0,
-30.0
]
},
"mid": [
23.0,
-46.0
],
"end": {
"at": [
15.0,
-60.0
]
},
"id": "a1"
},
{
"type": "line",
"start": {
"ref": "a1.end",
"at": [
15.0,
-60.0
]
},
"end": {
"at": [
18.0,
-80.0
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
18.0,
-80.0
]
},
"end": {
"at": [
0.0,
-80.0
]
},
"id": "l4"
},
{
"type": "line",
"start": {
"ref": "l4.end",
"at": [
0.0,
-80.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l5"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "revolve",
"name": "Revolve1",
"operation": "new",
"profile": {
"sketch": "Profile",
"loops": [
{
"outer": true,
"curves": [
"a1",
"l1",
"l2",
"l3",
"l4",
"l5"
]
}
]
},
"axis": {
"ref": "world Z axis",
"origin": [
0,
0,
0
],
"dir": [
0,
0,
1
]
},
"angle": 360,
"result_bodies": [
"Vase"
]
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "square frustum: base 40 at z=0, top a1 = 40 + 2*30*tan10 at z=30 (positive taper grows outward); V = h/3 (A0 + A1 + sqrt(A0 A1)), z_c = h (A0 + 2 sqrt(A0A1) + 3 A1) / (4 (A0 + sqrt(A0A1) + A1)), sides = 4 trapezoids (a0+a1)/2 * h/cos(10)",
"body_count": 1,
"volume_mm3": 61814.82595953696,
"area_mm2": 9676.91517028238,
"center_of_mass": [
0.0,
0.0,
16.162703882981894
],
"bbox": {
"min": [
-25.28980942125395,
-25.28980942125395,
0.0
],
"max": [
25.28980942125395,
25.28980942125395,
30.0
]
},
"faces": 6
}
+154
View File
@@ -0,0 +1,154 @@
{
"id": "05-taper-extrude",
"name": "Tapered extrude",
"description": "40x40 square centred on origin, extruded 30 mm with a 10 deg taper.",
"exercises": [
"extrude",
"taper"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Sketch1",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-20,
-20
]
},
"end": {
"at": [
20,
-20
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
20.0,
-20.0
]
},
"end": {
"at": [
20,
20
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
20.0,
20.0
]
},
"end": {
"at": [
-20,
20
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
-20.0,
20.0
]
},
"end": {
"ref": "l1.start",
"at": [
-20.0,
-20.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Sketch1",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 30,
"direction": "positive",
"taper_deg": 10
},
"result_bodies": [
"Frustum"
]
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "50 (x) by 20 (z) rectangle on XZ extruded +-15 along Y: box 50x30x20 centred at origin",
"body_count": 1,
"volume_mm3": 30000.0,
"area_mm2": 6200.0,
"center_of_mass": [
0.0,
0.0,
0.0
],
"bbox": {
"min": [
-25.0,
-15.0,
-10.0
],
"max": [
25.0,
15.0,
10.0
]
},
"faces": 6
}
@@ -0,0 +1,155 @@
{
"id": "06-symmetric-extrude",
"name": "Symmetric extrude",
"description": "50x20 rectangle centred on origin on the XZ plane, extruded symmetrically 15 mm each side (30 total).",
"exercises": [
"sketch_xz",
"extrude",
"symmetric"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Sketch1",
"plane": {
"ref": "XZ",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
0.0,
-1.0
],
"normal": [
0.0,
1.0,
0.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-25,
-10
]
},
"end": {
"at": [
25,
-10
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
25.0,
-10.0
]
},
"end": {
"at": [
25,
10
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
25.0,
10.0
]
},
"end": {
"at": [
-25,
10
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
-25.0,
10.0
]
},
"end": {
"ref": "l1.start",
"at": [
-25.0,
-10.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Sketch1",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "symmetric",
"distance": 15,
"is_full_length": false,
"meaning": "distance on each side"
},
"result_bodies": [
"Block"
]
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "box 40x30x20 with every edge rounded r=3 = inner box (34x24x14) grown by a ball r (Steiner): V = abc + 2r(ab+bc+ca) + pi r^2 (a+b+c) + 4/3 pi r^3, A = 2(ab+bc+ca) + 2 pi r (a+b+c) + 4 pi r^2; faces 6 planes + 12 quarter cylinders + 8 sphere octants",
"body_count": 1,
"volume_mm3": 23340.84937505542,
"area_mm2": 4726.265361880023,
"center_of_mass": [
20.0,
15.0,
10.0
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
40.0,
30.0,
20.0
]
},
"faces": 26
}
@@ -0,0 +1,379 @@
{
"id": "07-fillet-all-edges",
"name": "Box with all edges filleted",
"description": "40x30x20 box, constant-radius 3 mm fillet on all 12 edges.",
"exercises": [
"extrude",
"fillet"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Extrude1_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
40,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
40.0,
0.0
]
},
"end": {
"at": [
40,
30
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
40.0,
30.0
]
},
"end": {
"at": [
0,
30
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
30.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Extrude1_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 20,
"direction": "positive"
},
"result_bodies": [
"Box"
]
},
{
"op": "fillet",
"name": "Fillet1",
"type": "constant_radius",
"radius": 3,
"tangent_chain": false,
"edge_selection": "all 12 edges of Box",
"edges": [
{
"type": "line",
"start": [
40.0,
30.0,
0.0
],
"end": [
0.0,
30.0,
0.0
],
"point": [
20.0,
30.0,
0.0
]
},
{
"type": "line",
"start": [
0.0,
30.0,
0.0
],
"end": [
0.0,
30.0,
20.0
],
"point": [
0.0,
30.0,
10.0
]
},
{
"type": "line",
"start": [
40.0,
30.0,
20.0
],
"end": [
0.0,
30.0,
20.0
],
"point": [
20.0,
30.0,
20.0
]
},
{
"type": "line",
"start": [
40.0,
30.0,
0.0
],
"end": [
40.0,
30.0,
20.0
],
"point": [
40.0,
30.0,
10.0
]
},
{
"type": "line",
"start": [
40.0,
0.0,
0.0
],
"end": [
40.0,
30.0,
0.0
],
"point": [
40.0,
15.0,
0.0
]
},
{
"type": "line",
"start": [
40.0,
0.0,
20.0
],
"end": [
40.0,
30.0,
20.0
],
"point": [
40.0,
15.0,
20.0
]
},
{
"type": "line",
"start": [
40.0,
0.0,
0.0
],
"end": [
40.0,
0.0,
20.0
],
"point": [
40.0,
0.0,
10.0
]
},
{
"type": "line",
"start": [
0.0,
0.0,
0.0
],
"end": [
40.0,
0.0,
0.0
],
"point": [
20.0,
0.0,
0.0
]
},
{
"type": "line",
"start": [
0.0,
0.0,
20.0
],
"end": [
40.0,
0.0,
20.0
],
"point": [
20.0,
0.0,
20.0
]
},
{
"type": "line",
"start": [
0.0,
0.0,
0.0
],
"end": [
0.0,
0.0,
20.0
],
"point": [
0.0,
0.0,
10.0
]
},
{
"type": "line",
"start": [
0.0,
30.0,
0.0
],
"end": [
0.0,
0.0,
0.0
],
"point": [
0.0,
15.0,
0.0
]
},
{
"type": "line",
"start": [
0.0,
30.0,
20.0
],
"end": [
0.0,
0.0,
20.0
],
"point": [
0.0,
15.0,
20.0
]
}
]
}
]
}
+25
View File
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "box 40x30x20 with the 4 top edges chamfered 2: lower box 40x30x18 + top slab with section (36+2u)x(26+2u) at depth u (V, moment by exact polynomial integration); A = bottom + sides(h=18) + top 36x26 + 4 trapezoid bevels of slant 2 sqrt2",
"body_count": 1,
"volume_mm3": 23730.666666666668,
"area_mm2": 5029.352380466497,
"center_of_mass": [
19.999999999999996,
15.0,
9.894145409596582
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
40.0,
30.0,
20.0
]
},
"faces": 10
}
+235
View File
@@ -0,0 +1,235 @@
{
"id": "08-chamfer",
"name": "Box with top edges chamfered",
"description": "40x30x20 box, equal-distance 2 mm chamfer on the 4 edges of the top face.",
"exercises": [
"extrude",
"chamfer"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Extrude1_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
40,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
40.0,
0.0
]
},
"end": {
"at": [
40,
30
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
40.0,
30.0
]
},
"end": {
"at": [
0,
30
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
30.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Extrude1_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 20,
"direction": "positive"
},
"result_bodies": [
"Box"
]
},
{
"op": "chamfer",
"name": "Chamfer1",
"type": "equal_distance",
"distance": 2,
"tangent_chain": false,
"edge_selection": "the 4 edges bounding the top face (z=20)",
"edges": [
{
"type": "line",
"start": [
0.0,
30.0,
20.0
],
"end": [
0.0,
0.0,
20.0
],
"point": [
0.0,
15.0,
20.0
]
},
{
"type": "line",
"start": [
0.0,
0.0,
20.0
],
"end": [
40.0,
0.0,
20.0
],
"point": [
20.0,
0.0,
20.0
]
},
{
"type": "line",
"start": [
40.0,
0.0,
20.0
],
"end": [
40.0,
30.0,
20.0
],
"point": [
40.0,
15.0,
20.0
]
},
{
"type": "line",
"start": [
40.0,
30.0,
20.0
],
"end": [
0.0,
30.0,
20.0
],
"point": [
20.0,
30.0,
20.0
]
}
]
}
]
}
+25
View File
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "50x40x30 box shelled inward 2 with the top open: box minus cavity [2,48]x[2,38]x[2,30]; A = outer bottom + outer sides + rim + cavity floor + cavity walls",
"body_count": 1,
"volume_mm3": 13632.0,
"area_mm2": 13992.0,
"center_of_mass": [
25.0,
20.0,
11.598591549295774
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
50.0,
40.0,
30.0
]
},
"faces": 11
}
+181
View File
@@ -0,0 +1,181 @@
{
"id": "09-shell",
"name": "Shelled open box",
"description": "50x40x30 box shelled inward 2 mm with the top face removed.",
"exercises": [
"extrude",
"shell"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Extrude1_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
50,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
50.0,
0.0
]
},
"end": {
"at": [
50,
40
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
50.0,
40.0
]
},
"end": {
"at": [
0,
40
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
40.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Extrude1_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 30,
"direction": "positive"
},
"result_bodies": [
"Box"
]
},
{
"op": "shell",
"name": "Shell1",
"faces_removed": [
{
"type": "plane",
"normal_at_point_on_face": [
0.0,
0.0,
1.0
],
"plane_normal_outward": [
0.0,
0.0,
1.0
],
"point": [
25.0,
20.0,
30.0
]
}
],
"face_selection": "top face (z=30)",
"inside_thickness": 2,
"outside_thickness": 0,
"tangent_chain": false
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "plate 90x70x5 minus 12 through cylinders r=3 at (15+20i, 15+20j), i<4, j<3: V = abc - 12 pi r^2 t, A = 2(ab+bc+ca) + 12(2 pi r t - 2 pi r^2)",
"body_count": 1,
"volume_mm3": 29803.53996706153,
"area_mm2": 14652.38934211693,
"center_of_mass": [
44.99999999999998,
34.99999999999999,
2.4999999999999964
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
90.0,
70.0,
5.0
]
},
"faces": 18
}
@@ -0,0 +1,248 @@
{
"id": "10-rect-pattern-holes",
"name": "Rectangular pattern of holes",
"description": "90x70x5 plate; d=6 hole at (15,15) cut through; feature pattern 4 along X @20 mm x 3 along Y @20 mm.",
"exercises": [
"extrude",
"extrude_cut",
"rectangular_pattern"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Plate_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
90,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
90.0,
0.0
]
},
"end": {
"at": [
90,
70
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
90.0,
70.0
]
},
"end": {
"at": [
0,
70
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
70.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Plate",
"operation": "new",
"profiles": [
{
"sketch": "Plate_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 5,
"direction": "positive"
},
"result_bodies": [
"Plate"
]
},
{
"op": "sketch",
"name": "HoleSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
15,
15
]
},
"radius": 3,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Hole1",
"operation": "cut",
"profiles": [
{
"sketch": "HoleSketch",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "through_all",
"direction": "positive"
},
"result_bodies": [
"Plate"
]
},
{
"op": "rectangular_pattern",
"name": "RectPattern1",
"pattern_of": "features",
"features": [
"Hole1"
],
"direction1": {
"axis": [
1,
0,
0
],
"count": 4,
"spacing": 20
},
"direction2": {
"axis": [
0,
1,
0
],
"count": 3,
"spacing": 20
},
"distance_type": "spacing (distance between instances)"
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "annulus R50/r15 h10 minus 6 through cylinders r=5 on a 40 radius: V = pi(R^2-r^2)h - 6 pi rh^2 h, A = 2 pi(R^2-r^2) + 2 pi(R+r)h + 6(2 pi rh h - 2 pi rh^2); 6-fold symmetry keeps the centroid on the axis",
"body_count": 1,
"volume_mm3": 66758.84388878311,
"area_mm2": 19320.79481957723,
"center_of_mass": [
0.0,
0.0,
5.0
],
"bbox": {
"min": [
-50.0,
-50.0,
0.0
],
"max": [
50.0,
50.0,
10.0
]
},
"faces": 10
}
@@ -0,0 +1,204 @@
{
"id": "11-circular-pattern-flange",
"name": "Flange with circular hole pattern",
"description": "Annulus OD100 / ID30 extruded 10; d=10 hole at (40,0) cut through; circular pattern x6 over 360 about Z.",
"exercises": [
"extrude",
"annulus_profile",
"extrude_cut",
"circular_pattern"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "FlangeSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0,
0
]
},
"radius": 50,
"id": "c_out"
},
{
"type": "circle",
"center": {
"ref": "c_out.center",
"at": [
0.0,
0.0
]
},
"radius": 15,
"id": "c_in"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Flange",
"operation": "new",
"profiles": [
{
"sketch": "FlangeSketch",
"loops": [
{
"outer": true,
"curves": [
"c_out"
]
},
{
"outer": false,
"curves": [
"c_in"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 10,
"direction": "positive"
},
"result_bodies": [
"Flange"
]
},
{
"op": "sketch",
"name": "HoleSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
40,
0
]
},
"radius": 5,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Hole1",
"operation": "cut",
"profiles": [
{
"sketch": "HoleSketch",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "through_all",
"direction": "positive"
},
"result_bodies": [
"Flange"
]
},
{
"op": "circular_pattern",
"name": "CircPattern1",
"pattern_of": "features",
"features": [
"Hole1"
],
"axis": {
"ref": "world Z axis",
"origin": [
0,
0,
0
],
"dir": [
0,
0,
1
]
},
"count": 6,
"total_angle": 360,
"symmetric": false
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "block [-30,30]x[0,30]x[0,10] + two bosses r=6 h=15 at (+-15,15) on top (mirror across YZ): V = abc + 2 pi r^2 h, A = 2(ab+bc+ca) + 2 * 2 pi r h",
"body_count": 1,
"volume_mm3": 21392.920065876977,
"area_mm2": 6530.973355292325,
"center_of_mass": [
0.0,
14.999999999999998,
6.98250171986157
],
"bbox": {
"min": [
-30.0,
0.0,
0.0
],
"max": [
30.0,
30.0,
25.0
]
},
"faces": 10
}
+262
View File
@@ -0,0 +1,262 @@
{
"id": "12-mirror-feature",
"name": "Mirror feature",
"description": "60x30x10 block centred on X; d=12 boss 15 tall joined at (15,15) on top; boss feature mirrored across YZ.",
"exercises": [
"extrude",
"extrude_join",
"mirror"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Base_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-30,
0
]
},
"end": {
"at": [
30,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
30.0,
0.0
]
},
"end": {
"at": [
30,
30
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
30.0,
30.0
]
},
"end": {
"at": [
-30,
30
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
-30.0,
30.0
]
},
"end": {
"ref": "l1.start",
"at": [
-30.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Base",
"operation": "new",
"profiles": [
{
"sketch": "Base_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 10,
"direction": "positive"
},
"result_bodies": [
"Base"
]
},
{
"op": "sketch",
"name": "BossSketch",
"plane": {
"ref": "face: top face of Base (z=10)",
"origin": [
0.0,
0.0,
10.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
],
"face": {
"type": "plane",
"normal_at_point_on_face": [
0.0,
0.0,
1.0
],
"plane_normal_outward": [
0.0,
0.0,
1.0
],
"point": [
0.0,
15.0,
10.0
]
}
},
"entities": [
{
"type": "circle",
"center": {
"at": [
15.0,
15.0
]
},
"radius": 6,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Boss",
"operation": "join",
"profiles": [
{
"sketch": "BossSketch",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 15,
"direction": "positive"
},
"result_bodies": [
"Base"
]
},
{
"op": "mirror",
"name": "Mirror1",
"mirror_of": "features",
"features": [
"Boss"
],
"plane": {
"ref": "YZ",
"origin": [
0,
0,
0
],
"normal": [
1,
0,
0
]
},
"operation": "join"
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "box [0,40]^2x[0,20] union cylinder r=12 at (40,20) z 0..40: V = box + half-cylinder (x>40, z<20, centroid 40 + 4r/3pi) + full cylinder z 20..40; A = bottom (1600 + pi r^2/2) + box top (1600 - pi r^2/2) + cyl top + 3 full sides + x=40 side minus 24x20 + cyl side (pi r 40 outside half + pi r 20 upper inside half)",
"body_count": 1,
"volume_mm3": 45571.68026350791,
"area_mm2": 8634.336052701581,
"center_of_mass": [
26.46176756194705,
19.999999999999996,
13.970793611305016
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
52.0,
40.0,
40.0
]
},
"faces": 9
}
+231
View File
@@ -0,0 +1,231 @@
{
"id": "13-combine-join",
"name": "Boolean union",
"description": "Box 40x40x20 at origin + cylinder r=12 h=40 at (40,20) as separate bodies, then combine join.",
"exercises": [
"extrude",
"combine_join"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "BoxA_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
40,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
40.0,
0.0
]
},
"end": {
"at": [
40,
40
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
40.0,
40.0
]
},
"end": {
"at": [
0,
40
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
40.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "BoxA",
"operation": "new",
"profiles": [
{
"sketch": "BoxA_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 20,
"direction": "positive"
},
"result_bodies": [
"A"
]
},
{
"op": "sketch",
"name": "CylSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
40,
20
]
},
"radius": 12,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "CylB",
"operation": "new",
"profiles": [
{
"sketch": "CylSketch",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 40,
"direction": "positive"
},
"result_bodies": [
"B"
]
},
{
"op": "combine",
"name": "Combine1",
"operation": "join",
"target_body": "A",
"tool_bodies": [
"B"
],
"keep_tools": false
}
]
}
+25
View File
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "box [-25,25]^2x[-20,0] minus sphere r=15 at the origin (lower hemisphere removed): V = abc - 2/3 pi r^3, hemisphere centroid z = -3r/8; A = 2(ab+bc+ca) - pi r^2 + 2 pi r^2",
"body_count": 1,
"volume_mm3": 42931.41652942297,
"area_mm2": 9706.858347057703,
"center_of_mass": [
0.0,
0.0,
-10.720336182305564
],
"bbox": {
"min": [
-25.0,
-25.0,
-20.0
],
"max": [
25.0,
25.0,
0.0
]
},
"faces": 7
}
+267
View File
@@ -0,0 +1,267 @@
{
"id": "14-combine-cut",
"name": "Boolean subtract",
"description": "Box (-25,-25,-20)..(25,25,0) minus a sphere r=15 at origin (hemispherical dimple).",
"exercises": [
"extrude",
"revolve",
"combine_cut"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "BoxA_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-25,
-25
]
},
"end": {
"at": [
25,
-25
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
25.0,
-25.0
]
},
"end": {
"at": [
25,
25
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
25.0,
25.0
]
},
"end": {
"at": [
-25,
25
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
-25.0,
25.0
]
},
"end": {
"ref": "l1.start",
"at": [
-25.0,
-25.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "BoxA",
"operation": "new",
"profiles": [
{
"sketch": "BoxA_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 20,
"direction": "negative"
},
"result_bodies": [
"A"
]
},
{
"op": "sketch",
"name": "SphereB_sketch",
"plane": {
"ref": "XZ",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
0.0,
-1.0
],
"normal": [
0.0,
1.0,
0.0
]
},
"entities": [
{
"type": "arc_three_point",
"start": {
"at": [
0.0,
15.0
]
},
"mid": [
15.0,
0.0
],
"end": {
"at": [
0.0,
-15.0
]
},
"id": "a1"
},
{
"type": "line",
"start": {
"ref": "a1.end",
"at": [
0.0,
-15.0
]
},
"end": {
"ref": "a1.start",
"at": [
0.0,
15.0
]
},
"id": "l1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "revolve",
"name": "SphereB",
"operation": "new",
"profile": {
"sketch": "SphereB_sketch",
"loops": [
{
"outer": true,
"curves": [
"a1",
"l1"
]
}
]
},
"axis": {
"ref": "world Z axis",
"origin": [
0,
0,
0
],
"dir": [
0,
0,
1
]
},
"angle": 360,
"result_bodies": [
"B"
]
},
{
"op": "combine",
"name": "Combine1",
"operation": "cut",
"target_body": "A",
"tool_bodies": [
"B"
],
"keep_tools": false
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "cube [-20,20]^3 intersect sphere R=25: sphere minus 6 disjoint caps of height h=5 (caps cannot overlap: two would need x^2+y^2 > 800 > R^2); V = 4/3 pi R^3 - 6 pi h^2 (3R-h)/3, A = 4 pi R^2 - 6 * 2 pi R h + 6 pi (R^2-20^2)",
"body_count": 1,
"volume_mm3": 54454.27266222308,
"area_mm2": 7382.7427359360145,
"center_of_mass": [
0.0,
0.0,
0.0
],
"bbox": {
"min": [
-20.0,
-20.0,
-20.0
],
"max": [
20.0,
20.0,
20.0
]
},
"faces": 7
}
@@ -0,0 +1,269 @@
{
"id": "15-combine-intersect",
"name": "Boolean intersect",
"description": "Cube 40 centred at origin intersected with sphere r=25 at origin.",
"exercises": [
"extrude",
"symmetric",
"revolve",
"combine_intersect"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "CubeSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-20,
-20
]
},
"end": {
"at": [
20,
-20
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
20.0,
-20.0
]
},
"end": {
"at": [
20,
20
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
20.0,
20.0
]
},
"end": {
"at": [
-20,
20
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
-20.0,
20.0
]
},
"end": {
"ref": "l1.start",
"at": [
-20.0,
-20.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "CubeA",
"operation": "new",
"profiles": [
{
"sketch": "CubeSketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "symmetric",
"distance": 20,
"is_full_length": false,
"meaning": "distance on each side"
},
"result_bodies": [
"A"
]
},
{
"op": "sketch",
"name": "SphereB_sketch",
"plane": {
"ref": "XZ",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
0.0,
-1.0
],
"normal": [
0.0,
1.0,
0.0
]
},
"entities": [
{
"type": "arc_three_point",
"start": {
"at": [
0.0,
25.0
]
},
"mid": [
25.0,
0.0
],
"end": {
"at": [
0.0,
-25.0
]
},
"id": "a1"
},
{
"type": "line",
"start": {
"ref": "a1.end",
"at": [
0.0,
-25.0
]
},
"end": {
"ref": "a1.start",
"at": [
0.0,
25.0
]
},
"id": "l1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "revolve",
"name": "SphereB",
"operation": "new",
"profile": {
"sketch": "SphereB_sketch",
"loops": [
{
"outer": true,
"curves": [
"a1",
"l1"
]
}
]
},
"axis": {
"ref": "world Z axis",
"origin": [
0,
0,
0
],
"dir": [
0,
0,
1
]
},
"angle": 360,
"result_bodies": [
"B"
]
},
{
"op": "combine",
"name": "Combine1",
"operation": "intersect",
"target_body": "A",
"tool_bodies": [
"B"
],
"keep_tools": false
}
]
}
+25
View File
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "circle r=3 swept along line 30 (+Z) + tangent R20 quarter arc + line 30 (+X): two cylinders + quarter torus (Pappus: V = pi r^2 R theta, A = 2 pi r R theta; torus centroid at rho = (R^2 + r^2/4)/R * sin(theta/2)/(theta/2) from the bend axis along the bisector) + 2 end disks",
"body_count": 1,
"volume_mm3": 2584.7244290365306,
"area_mm2": 1779.6982871223033,
"center_of_mass": [
13.958930123810118,
0.0,
36.04106987618987
],
"bbox": {
"min": [
-3.0,
-3.0,
0.0
],
"max": [
50.0,
3.0,
53.0
]
},
"faces": 5
}
+182
View File
@@ -0,0 +1,182 @@
{
"id": "16-sweep",
"name": "Sweep along path",
"description": "d=6 circle on XY at origin swept along a path on XZ: line up 30, tangent R20 arc, line 30 along +X.",
"exercises": [
"sketch_xz",
"sweep",
"path_chain"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Path",
"plane": {
"ref": "XZ",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
0.0,
-1.0
],
"normal": [
0.0,
1.0,
0.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0.0,
0.0
]
},
"end": {
"at": [
0.0,
-30.0
]
},
"id": "l1"
},
{
"type": "arc_three_point",
"start": {
"ref": "l1.end",
"at": [
0.0,
-30.0
]
},
"mid": [
5.857864376,
-44.142135624
],
"end": {
"at": [
20.0,
-50.0
]
},
"id": "a1"
},
{
"type": "line",
"start": {
"ref": "a1.end",
"at": [
20.0,
-50.0
]
},
"end": {
"at": [
50.0,
-50.0
]
},
"id": "l2"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "sketch",
"name": "ProfileSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0,
0
]
},
"radius": 3,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "sweep",
"name": "Sweep1",
"operation": "new",
"profile": {
"sketch": "ProfileSketch",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
},
"path": {
"sketch": "Path",
"curves": [
"l1",
"a1",
"l2"
],
"chained": true
},
"orientation": "perpendicular",
"result_bodies": [
"Tube"
]
}
]
}
+24
View File
@@ -0,0 +1,24 @@
{
"source": "freecad 1.1.4",
"method": "FreeCAD (OpenCASCADE) build of recipe.json by tools/freecad-oracle/build.py: Part.makeLoft",
"body_count": 1,
"volume_mm3": 35125.49757633739,
"area_mm2": 6495.0000512370025,
"center_of_mass": [
4.902280481153527e-11,
9.800242527565077e-16,
15.119060422795876
],
"bbox": {
"min": [
-20.0000001,
-20.0000001,
-1e-07
],
"max": [
20.0000001,
20.0000001,
40.000000100000015
]
}
}
+211
View File
@@ -0,0 +1,211 @@
{
"id": "17-loft",
"name": "Loft square to circle",
"description": "Loft from a 40x40 square on XY (z=0) to a d=20 circle on a plane offset 40 mm.",
"exercises": [
"loft",
"offset_plane"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Bottom",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-20,
-20
]
},
"end": {
"at": [
20,
-20
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
20.0,
-20.0
]
},
"end": {
"at": [
20,
20
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
20.0,
20.0
]
},
"end": {
"at": [
-20,
20
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
-20.0,
20.0
]
},
"end": {
"ref": "l1.start",
"at": [
-20.0,
-20.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "construction_plane",
"name": "Plane40",
"method": "offset",
"base": "XY",
"offset": 40
},
{
"op": "sketch",
"name": "Top",
"plane": {
"ref": "construction plane Plane40 (XY offset 40)",
"origin": [
0.0,
0.0,
40.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0,
0
]
},
"radius": 10,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "loft",
"name": "Loft1",
"operation": "new",
"sections": [
{
"sketch": "Bottom",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
},
{
"sketch": "Top",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"end_conditions": "free (none)",
"rails": [],
"solid": true,
"result_bodies": [
"Loft"
]
}
]
}
Binary file not shown.
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "plate 60x40x15 minus: counterbore (r7 x 5 deep + r4 through), countersink (90 deg cone frustum r6->r3 over 3 mm + r3 through), blind r3 hole 10 deep to the shoulder with a 118 deg cone point (height 3/tan59, centroid 1/4 up from the apex); areas: removed top/bottom disks, cylinder walls 2 pi r h, cb floor annulus, cone laterals pi r s",
"body_count": 1,
"volume_mm3": 33890.710358950084,
"area_mm2": 8568.695781624992,
"center_of_mass": [
30.307000593669976,
20.000000000000004,
7.38224663372136
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
60.0,
40.0,
15.0
]
},
"faces": 13
}
+253
View File
@@ -0,0 +1,253 @@
{
"id": "18-hole-features",
"name": "Hole features (counterbore, countersink, blind drilled)",
"description": "60x40x15 plate; on the top face: counterbore hole at (15,20) through all, countersink at (35,20) through all, simple blind hole depth 10 at (50,20) with 118 deg drill tip.",
"exercises": [
"hole_counterbore",
"hole_countersink",
"hole_blind"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Plate_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
60,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
60.0,
0.0
]
},
"end": {
"at": [
60,
40
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
60.0,
40.0
]
},
"end": {
"at": [
0,
40
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
40.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Plate",
"operation": "new",
"profiles": [
{
"sketch": "Plate_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 15,
"direction": "positive"
},
"result_bodies": [
"Plate"
]
},
{
"op": "hole",
"name": "CBore",
"hole_type": "counterbore",
"face": {
"type": "plane",
"normal_at_point_on_face": [
0.0,
0.0,
1.0
],
"plane_normal_outward": [
0.0,
0.0,
1.0
],
"point": [
30.0,
20.0,
15.0
]
},
"position": [
15,
20,
15
],
"direction": "into the material (-Z)",
"diameter": 8,
"counterbore_diameter": 14,
"counterbore_depth": 5,
"extent": "through_all"
},
{
"op": "hole",
"name": "CSink",
"hole_type": "countersink",
"face": {
"type": "plane",
"normal_at_point_on_face": [
0.0,
0.0,
1.0
],
"plane_normal_outward": [
0.0,
0.0,
1.0
],
"point": [
30.0,
20.0,
15.0
]
},
"position": [
35,
20,
15
],
"direction": "into the material (-Z)",
"diameter": 6,
"countersink_diameter": 12,
"countersink_angle": 90,
"extent": "through_all"
},
{
"op": "hole",
"name": "Blind",
"hole_type": "simple",
"face": {
"type": "plane",
"normal_at_point_on_face": [
0.0,
0.0,
1.0
],
"plane_normal_outward": [
0.0,
0.0,
1.0
],
"point": [
25.5,
20.0,
15.0
]
},
"position": [
50,
20,
15
],
"direction": "into the material (-Z)",
"diameter": 6,
"depth": 10,
"tip_angle": 118,
"extent": "distance"
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "solved L: (0,0)-(60,0)-(60,8)-(8,8)-(8,40)-(0,40); area 60x8 + 8x32, extruded 20: V = A2 h, A = 2 A2 + perimeter*h, centroid of the two rectangles",
"body_count": 1,
"volume_mm3": 14720.0,
"area_mm2": 5472.0,
"center_of_mass": [
20.956521739130434,
10.956521739130435,
10.0
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
60.0,
40.0,
20.0
]
},
"faces": 8
}
@@ -0,0 +1,275 @@
{
"id": "19-l-bracket-constrained",
"name": "Constrained L-bracket sketch extruded",
"description": "L outline drawn roughly, fully constrained with H/V constraints + 4 dimensions + corner on origin; solved profile extruded 20 mm.",
"exercises": [
"sketch_constraints",
"sketch_dimensions",
"extrude"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "LSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
1,
1
]
},
"end": {
"at": [
55,
-2
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
55.0,
-2.0
]
},
"end": {
"at": [
57,
9
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
57.0,
9.0
]
},
"end": {
"at": [
10,
7
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
10.0,
7.0
]
},
"end": {
"at": [
9,
45
]
},
"id": "l4"
},
{
"type": "line",
"start": {
"ref": "l4.end",
"at": [
9.0,
45.0
]
},
"end": {
"at": [
-1,
38
]
},
"id": "l5"
},
{
"type": "line",
"start": {
"ref": "l5.end",
"at": [
-1.0,
38.0
]
},
"end": {
"ref": "l1.start",
"at": [
1.0,
1.0
]
},
"id": "l6"
}
],
"constraints": [
{
"type": "horizontal",
"refs": [
"l1"
]
},
{
"type": "horizontal",
"refs": [
"l3"
]
},
{
"type": "horizontal",
"refs": [
"l5"
]
},
{
"type": "vertical",
"refs": [
"l2"
]
},
{
"type": "vertical",
"refs": [
"l4"
]
},
{
"type": "vertical",
"refs": [
"l6"
]
},
{
"type": "coincident",
"refs": [
"l1.start",
"origin"
]
}
],
"dimensions": [
{
"type": "distance",
"refs": [
"l1.start",
"l1.end"
],
"value": 60,
"unit": "mm",
"orientation": "horizontal"
},
{
"type": "distance",
"refs": [
"l2.start",
"l2.end"
],
"value": 8,
"unit": "mm",
"orientation": "vertical"
},
{
"type": "distance",
"refs": [
"l6.start",
"l6.end"
],
"value": 40,
"unit": "mm",
"orientation": "vertical"
},
{
"type": "distance",
"refs": [
"l5.start",
"l5.end"
],
"value": 8,
"unit": "mm",
"orientation": "horizontal"
}
]
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "LSketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4",
"l5",
"l6"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 20,
"direction": "positive"
},
"result_bodies": [
"LBracket"
]
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "obround: arc centres (0,0) and (40,0), R6, tangent horizontal lines y=+-6: A2 = 2rL + pi r^2, V = A2 h, A = 2 A2 + perimeter (2L + 2 pi r) h",
"body_count": 1,
"volume_mm3": 2965.4866776461627,
"area_mm2": 1774.6902302738526,
"center_of_mass": [
20.0,
0.0,
2.5
],
"bbox": {
"min": [
-6.0,
-6.0,
0.0
],
"max": [
46.0,
6.0,
5.0
]
},
"faces": 6
}
@@ -0,0 +1,225 @@
{
"id": "20-slot-constrained",
"name": "Constrained slot extruded",
"description": "Obround: two arcs + two lines drawn inexactly, solved with tangent/equal/horizontal constraints, R6 and 40 mm centre distance; extruded 5.",
"exercises": [
"sketch_constraints",
"tangent",
"equal",
"extrude"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "SlotSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "arc_center_start_sweep",
"center": {
"at": [
1,
1
]
},
"start": {
"at": [
1,
7
]
},
"sweep_deg": 180,
"id": "a1"
},
{
"type": "arc_center_start_sweep",
"center": {
"at": [
37,
2
]
},
"start": {
"at": [
37,
-3
]
},
"sweep_deg": 180,
"id": "a2"
},
{
"type": "line",
"start": {
"ref": "a1.end",
"at": [
1.0,
-5.0
]
},
"end": {
"ref": "a2.start",
"at": [
37.0,
-3.0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "a2.end",
"at": [
37.0,
7.0
]
},
"end": {
"ref": "a1.start",
"at": [
1.0,
7.0
]
},
"id": "l2"
}
],
"constraints": [
{
"type": "coincident",
"refs": [
"a1.center",
"origin"
]
},
{
"type": "tangent",
"refs": [
"a1",
"l1"
]
},
{
"type": "tangent",
"refs": [
"l1",
"a2"
]
},
{
"type": "tangent",
"refs": [
"a2",
"l2"
]
},
{
"type": "tangent",
"refs": [
"l2",
"a1"
]
},
{
"type": "equal",
"refs": [
"a1",
"a2"
]
},
{
"type": "horizontal",
"refs": [
"l1"
]
}
],
"dimensions": [
{
"type": "radius",
"refs": [
"a1"
],
"value": 6,
"unit": "mm"
},
{
"type": "distance",
"refs": [
"a1.center",
"a2.center"
],
"value": 40,
"unit": "mm",
"orientation": "horizontal"
}
]
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "SlotSketch",
"loops": [
{
"outer": true,
"curves": [
"a1",
"a2",
"l1",
"l2"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 5,
"direction": "positive"
},
"result_bodies": [
"Slot"
]
}
]
}
+25
View File
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "40x40x30 box, 5 deg draft hinged on the bottom (z=0), pull -Z: square frustum 40 -> 40 + 2*30*tan5; V = h/3 (A0 + A1 + sqrt(A0A1)), sides 4 trapezoids of slant h/cos5",
"body_count": 1,
"volume_mm3": 54574.73735870641,
"area_mm2": 8781.998445243411,
"center_of_mass": [
0.0,
0.0,
15.614983642248854
],
"bbox": {
"min": [
-22.62465990577772,
-22.62465990577772,
0.0
],
"max": [
22.62465990577772,
22.62465990577772,
30.0
]
},
"faces": 6
}
+253
View File
@@ -0,0 +1,253 @@
{
"id": "21-draft",
"name": "Draft side faces",
"description": "40x40x30 box (centred on origin in XY); 5 deg draft on the 4 side faces, neutral plane = bottom face.",
"exercises": [
"extrude",
"draft"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Extrude1_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-20,
-20
]
},
"end": {
"at": [
20,
-20
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
20.0,
-20.0
]
},
"end": {
"at": [
20,
20
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
20.0,
20.0
]
},
"end": {
"at": [
-20,
20
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
-20.0,
20.0
]
},
"end": {
"ref": "l1.start",
"at": [
-20.0,
-20.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Extrude1_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 30,
"direction": "positive"
},
"result_bodies": [
"Box"
]
},
{
"op": "draft",
"name": "Draft1",
"faces": [
{
"type": "plane",
"normal_at_point_on_face": [
0.0,
1.0,
0.0
],
"plane_normal_outward": [
0.0,
1.0,
0.0
],
"point": [
0.0,
20.0,
15.0
]
},
{
"type": "plane",
"normal_at_point_on_face": [
1.0,
0.0,
0.0
],
"plane_normal_outward": [
1.0,
0.0,
0.0
],
"point": [
20.0,
0.0,
15.0
]
},
{
"type": "plane",
"normal_at_point_on_face": [
0.0,
-1.0,
0.0
],
"plane_normal_outward": [
0.0,
-1.0,
0.0
],
"point": [
0.0,
-20.0,
15.0
]
},
{
"type": "plane",
"normal_at_point_on_face": [
-1.0,
0.0,
0.0
],
"plane_normal_outward": [
-1.0,
0.0,
0.0
],
"point": [
-20.0,
0.0,
15.0
]
}
],
"face_selection": "the 4 vertical side faces",
"neutral_plane": {
"type": "plane",
"normal_at_point_on_face": [
0.0,
0.0,
-1.0
],
"plane_normal_outward": [
0.0,
0.0,
-1.0
],
"point": [
0.0,
0.0,
0.0
]
},
"neutral_selection": "bottom face (z=0)",
"angle": 5,
"flipped": false
}
]
}
+25
View File
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "cylinder r20 z -30..30 split by the plane through the X axis tilted 30 deg (z = y tan30, stays within |z|<=11.6 inside the cylinder): 2 congruent halves (point symmetry), V total = pi r^2 h, A total = cylinder + 2 ellipses pi r (r/cos30)",
"body_count": 2,
"volume_mm3": 75398.22368615503,
"area_mm2": 12955.175474262087,
"center_of_mass": [
0.0,
0.0,
0.0
],
"bbox": {
"min": [
-20.0,
-20.0,
-30.0
],
"max": [
20.0,
20.0,
30.0
]
},
"faces": 6
}
+125
View File
@@ -0,0 +1,125 @@
{
"id": "22-split-body",
"name": "Split body by angled plane",
"description": "Cylinder r=20, z from -30 to 30 (symmetric extrude) split by a plane containing the X axis tilted 30 deg from XY.",
"exercises": [
"extrude",
"symmetric",
"construction_plane_angle",
"split_body"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Sketch1",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0,
0
]
},
"radius": 20,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Sketch1",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "symmetric",
"distance": 30,
"is_full_length": false,
"meaning": "distance on each side"
},
"result_bodies": [
"Cyl"
]
},
{
"op": "construction_plane",
"name": "Tilt30",
"method": "at_angle",
"axis": "world X axis",
"base_plane": "XY",
"angle": 30,
"result_origin": [
12.125,
0.0,
0.0
],
"result_normal": [
0.0,
-0.5,
0.866025404
]
},
{
"op": "split_body",
"name": "Split1",
"body": "Cyl",
"tool": "Tilt30",
"extend_tool": true,
"result_bodies": [
"Cyl",
"Cyl (1)"
]
}
]
}
@@ -0,0 +1,24 @@
{
"source": "freecad 1.1.4",
"method": "FreeCAD (OpenCASCADE) build of recipe.json by tools/freecad-oracle/build.py: Part extrude, Part extrude join, Part makeFillet, Part extrude join, Part extrude cut, Part makeChamfer",
"body_count": 1,
"volume_mm3": 59331.128616959795,
"area_mm2": 18290.736978057597,
"center_of_mass": [
40.00000000000001,
34.567350242237325,
15.289013135744947
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
80.0,
50.0,
50.0
]
}
}
@@ -0,0 +1,693 @@
{
"id": "23-bracket-multifeature",
"name": "Multi-feature bracket",
"description": "Base plate 80x50x8, back wall, inner fillet R5, gusset, 2 base holes, wall hole, front corner chamfers.",
"exercises": [
"extrude",
"extrude_join",
"fillet",
"symmetric",
"offset_plane",
"extrude_cut",
"chamfer"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Base_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
80,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
80.0,
0.0
]
},
"end": {
"at": [
80,
50
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
80.0,
50.0
]
},
"end": {
"at": [
0,
50
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
50.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Base",
"operation": "new",
"profiles": [
{
"sketch": "Base_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 8,
"direction": "positive"
},
"result_bodies": [
"Bracket"
]
},
{
"op": "sketch",
"name": "WallSketch",
"plane": {
"ref": "face: top of Base (z=8)",
"origin": [
0.0,
0.0,
8.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
],
"face": {
"type": "plane",
"normal_at_point_on_face": [
0.0,
0.0,
1.0
],
"plane_normal_outward": [
0.0,
0.0,
1.0
],
"point": [
40.0,
25.0,
8.0
]
}
},
"entities": [
{
"type": "line",
"start": {
"at": [
0.0,
42.0
]
},
"end": {
"at": [
80.0,
42.0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
80.0,
42.0
]
},
"end": {
"at": [
80.0,
50.0
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
80.0,
50.0
]
},
"end": {
"at": [
0.0,
50.0
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
50.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
42.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Wall",
"operation": "join",
"profiles": [
{
"sketch": "WallSketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 42,
"direction": "positive"
},
"result_bodies": [
"Bracket"
]
},
{
"op": "fillet",
"name": "InnerFillet",
"type": "constant_radius",
"radius": 5,
"tangent_chain": false,
"edge_selection": "the X-parallel concave edge where base top (z=8) meets wall front (y=42)",
"edges": [
{
"type": "line",
"start": [
80.0,
42.0,
8.0
],
"end": [
0.0,
42.0,
8.0
],
"point": [
40.0,
42.0,
8.0
]
}
]
},
{
"op": "construction_plane",
"name": "MidPlane",
"method": "offset",
"base": "YZ",
"offset": 40
},
{
"op": "sketch",
"name": "GussetSketch",
"plane": {
"ref": "construction plane MidPlane (YZ offset 40)",
"origin": [
40.0,
0.0,
0.0
],
"x_dir": [
0.0,
0.0,
-1.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
1.0,
0.0,
0.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-8.0,
42.0
]
},
"end": {
"at": [
-35.0,
42.0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
-35.0,
42.0
]
},
"end": {
"at": [
-8.0,
15.0
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
-8.0,
15.0
]
},
"end": {
"ref": "l1.start",
"at": [
-8.0,
42.0
]
},
"id": "l3"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Gusset",
"operation": "join",
"profiles": [
{
"sketch": "GussetSketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3"
]
}
]
}
],
"extent": {
"type": "symmetric",
"distance": 3,
"is_full_length": false,
"meaning": "distance on each side"
},
"result_bodies": [
"Bracket"
]
},
{
"op": "sketch",
"name": "BaseHoles",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
20,
20
]
},
"radius": 4,
"id": "c1"
},
{
"type": "circle",
"center": {
"at": [
60,
20
]
},
"radius": 4,
"id": "c2"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "BaseHoles",
"operation": "cut",
"profiles": [
{
"sketch": "BaseHoles",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
},
{
"sketch": "BaseHoles",
"loops": [
{
"outer": true,
"curves": [
"c2"
]
}
]
}
],
"extent": {
"type": "through_all",
"direction": "positive"
},
"result_bodies": [
"Bracket"
]
},
{
"op": "sketch",
"name": "WallHole",
"plane": {
"ref": "face: wall front face (y=42, normal -Y)",
"origin": [
0.0,
42.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
0.0,
1.0
],
"normal": [
0.0,
-1.0,
0.0
],
"face": {
"type": "plane",
"normal_at_point_on_face": [
0.0,
-1.0,
0.0
],
"plane_normal_outward": [
0.0,
-1.0,
0.0
],
"point": [
61.5,
42.0,
31.5
]
}
},
"entities": [
{
"type": "circle",
"center": {
"at": [
20.0,
30.0
]
},
"radius": 5,
"id": "c1"
},
{
"type": "circle",
"center": {
"at": [
60.0,
30.0
]
},
"radius": 5,
"id": "c2"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "WallHoles",
"operation": "cut",
"profiles": [
{
"sketch": "WallHole",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
},
{
"sketch": "WallHole",
"loops": [
{
"outer": true,
"curves": [
"c2"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 8,
"direction": "negative"
},
"result_bodies": [
"Bracket"
]
},
{
"op": "chamfer",
"name": "FrontChamfer",
"type": "equal_distance",
"distance": 3,
"tangent_chain": false,
"edge_selection": "the 2 vertical edges at the front corners of the base (y=0, z 0..8)",
"edges": [
{
"type": "line",
"start": [
80.0,
0.0,
0.0
],
"end": [
80.0,
0.0,
8.0
],
"point": [
80.0,
0.0,
4.0
]
},
{
"type": "line",
"start": [
0.0,
0.0,
0.0
],
"end": [
0.0,
0.0,
8.0
],
"point": [
0.0,
0.0,
4.0
]
}
]
}
]
}
Binary file not shown.
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "width 60 x depth 40 x height 15 block from the origin with a centred d10 through hole: V = (wd - pi r^2) h, A = 2(wd - pi r^2) + 2(w+d)h + 2 pi r h",
"body_count": 1,
"volume_mm3": 34821.90275490383,
"area_mm2": 8114.15926535898,
"center_of_mass": [
30.0,
20.0,
7.5
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
60.0,
40.0,
15.0
]
},
"faces": 7
}
+275
View File
@@ -0,0 +1,275 @@
{
"id": "24-user-parameters",
"name": "Parametric block driven by user parameters",
"description": "Rectangle sized by params width x depth (corner at origin), centred hole d=hole_d, extruded height.",
"exercises": [
"user_parameters",
"sketch_constraints",
"dimension_expressions",
"extrude",
"recompute"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [
{
"name": "width",
"expression": "60 mm",
"unit": "mm"
},
{
"name": "depth",
"expression": "40 mm",
"unit": "mm"
},
{
"name": "height",
"expression": "15 mm",
"unit": "mm"
},
{
"name": "hole_d",
"expression": "10 mm",
"unit": "mm"
}
],
"features": [
{
"op": "sketch",
"name": "Sketch1",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
50,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
50.0,
0.0
]
},
"end": {
"at": [
50,
30
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
50.0,
30.0
]
},
"end": {
"at": [
0,
30
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
30.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
},
{
"type": "circle",
"center": {
"at": [
25,
15
]
},
"radius": 4,
"id": "c1"
}
],
"constraints": [
{
"type": "coincident",
"refs": [
"l1.start",
"origin"
]
},
{
"type": "horizontal",
"refs": [
"l1"
]
},
{
"type": "vertical",
"refs": [
"l2"
]
},
{
"type": "horizontal",
"refs": [
"l3"
]
},
{
"type": "vertical",
"refs": [
"l4"
]
}
],
"dimensions": [
{
"type": "distance",
"refs": [
"l1.start",
"l1.end"
],
"value": "width",
"unit": "mm",
"orientation": "horizontal"
},
{
"type": "distance",
"refs": [
"l2.start",
"l2.end"
],
"value": "depth",
"unit": "mm",
"orientation": "vertical"
},
{
"type": "diameter",
"refs": [
"c1"
],
"value": "hole_d",
"unit": "mm"
},
{
"type": "distance",
"refs": [
"origin",
"c1.center"
],
"value": "width / 2",
"unit": "mm",
"orientation": "horizontal"
},
{
"type": "distance",
"refs": [
"origin",
"c1.center"
],
"value": "depth / 2",
"unit": "mm",
"orientation": "vertical"
}
]
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Sketch1",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
},
{
"outer": false,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": "height",
"direction": "positive"
},
"result_bodies": [
"Block"
]
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "solved triangle (0,0), (50,0), P = t(cos60, sin60) with t = 25 + sqrt(150) from |P-(50,0)| = 45 (the root nearest the drawn apex); V = (1/2 * 50 * Py) * 5, A = 2 A2 + perimeter*5, centroid = vertex mean",
"body_count": 1,
"volume_mm3": 4032.1546015511467,
"area_mm2": 2274.0990841900384,
"center_of_mass": [
22.87457478565265,
10.752412270803058,
2.5
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
50.0,
32.257236812409175,
5.0
]
},
"faces": 5
}
+184
View File
@@ -0,0 +1,184 @@
{
"id": "25-sketch-triangle",
"name": "Sketch solver: triangle with lengths and angle",
"description": "Triangle drawn roughly; l1 horizontal from origin, |l1|=50, |l2|=45, angle(l1,l3)=60 deg. Solved sketch extruded 5 mm.",
"exercises": [
"sketch_only",
"sketch_constraints",
"angle_dim"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Triangle",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
2,
1
]
},
"end": {
"at": [
45,
3
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
45.0,
3.0
]
},
"end": {
"at": [
22,
35
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
22.0,
35.0
]
},
"end": {
"ref": "l1.start",
"at": [
2.0,
1.0
]
},
"id": "l3"
}
],
"constraints": [
{
"type": "coincident",
"refs": [
"l1.start",
"origin"
]
},
{
"type": "horizontal",
"refs": [
"l1"
]
}
],
"dimensions": [
{
"type": "distance",
"refs": [
"l1.start",
"l1.end"
],
"value": 50,
"unit": "mm",
"orientation": "aligned"
},
{
"type": "distance",
"refs": [
"l2.start",
"l2.end"
],
"value": 45,
"unit": "mm",
"orientation": "aligned"
},
{
"type": "angle",
"refs": [
"l1",
"l3"
],
"value": 60,
"unit": "deg",
"text_at": [
8,
4
]
}
]
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Triangle",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 5,
"direction": "positive"
},
"result_bodies": [
"Triangle"
]
}
]
}
+25
View File
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "belt: convex hull of circles R20 @ (0,0) and r10 @ (50,0) (external tangents, sin a = (R-r)/d) minus the d8 hole at (50,0), extruded 5 as one body; hull area = (R+r) sqrt(d^2-(R-r)^2) + R^2(pi+2a)/2 + r^2(pi-2a)/2; moments by Green's theorem over the line/arc boundary",
"body_count": 1,
"volume_mm3": 11326.169514235082,
"area_mm2": 5637.404150511762,
"center_of_mass": [
15.321857347287981,
0.0,
2.5
],
"bbox": {
"min": [
-20.0,
-20.0,
0.0
],
"max": [
60.0,
20.0,
5.0
]
},
"faces": 7
}
+296
View File
@@ -0,0 +1,296 @@
{
"id": "26-sketch-belt",
"name": "Sketch solver: tangent lines between circles",
"description": "Circles d40 at origin and d20 at 50 mm (horizontal), concentric d8 hole, two lines tangent to both. All profiles extruded 5 mm.",
"exercises": [
"sketch_only",
"sketch_constraints",
"tangent",
"concentric",
"point_on_curve"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Belt",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
2,
-1
]
},
"radius": 18,
"id": "c1"
},
{
"type": "circle",
"center": {
"at": [
45,
3
]
},
"radius": 12,
"id": "c2"
},
{
"type": "circle",
"center": {
"at": [
46,
2
]
},
"radius": 5,
"id": "c3"
},
{
"type": "line",
"start": {
"at": [
3,
19
]
},
"end": {
"at": [
47,
13
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"at": [
1,
-22
]
},
"end": {
"at": [
44,
-8
]
},
"id": "l2"
}
],
"constraints": [
{
"type": "coincident",
"refs": [
"c1.center",
"origin"
]
},
{
"type": "horizontal_points",
"refs": [
"c1.center",
"c2.center"
]
},
{
"type": "concentric",
"refs": [
"c3",
"c2"
]
},
{
"type": "coincident",
"refs": [
"l1.start",
"c1"
]
},
{
"type": "coincident",
"refs": [
"l1.end",
"c2"
]
},
{
"type": "tangent",
"refs": [
"l1",
"c1"
]
},
{
"type": "tangent",
"refs": [
"l1",
"c2"
]
},
{
"type": "coincident",
"refs": [
"l2.start",
"c1"
]
},
{
"type": "coincident",
"refs": [
"l2.end",
"c2"
]
},
{
"type": "tangent",
"refs": [
"l2",
"c1"
]
},
{
"type": "tangent",
"refs": [
"l2",
"c2"
]
}
],
"dimensions": [
{
"type": "diameter",
"refs": [
"c1"
],
"value": 40,
"unit": "mm"
},
{
"type": "diameter",
"refs": [
"c2"
],
"value": 20,
"unit": "mm"
},
{
"type": "diameter",
"refs": [
"c3"
],
"value": 8,
"unit": "mm"
},
{
"type": "distance",
"refs": [
"c1.center",
"c2.center"
],
"value": 50,
"unit": "mm",
"orientation": "horizontal"
}
]
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Belt",
"loops": [
{
"outer": false,
"curves": [
"c3"
]
},
{
"outer": true,
"curves": [
"c2",
"c2"
]
}
]
},
{
"sketch": "Belt",
"loops": [
{
"outer": true,
"curves": [
"c1",
"c1"
]
}
]
},
{
"sketch": "Belt",
"loops": [
{
"outer": true,
"curves": [
"c1",
"c2",
"l1",
"l2"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 5,
"direction": "positive"
},
"result_bodies": [
"Belt"
]
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "solved trapezoid bottom (-30,0)-(30,0), top (-15,25)-(15,25) minus two d6 holes at (+-18, 8) (symmetric about the axis, 36 apart, 8 above l1); trapezoid centroid y = H(a+2b)/(3(a+b)); V = A2 t, A = 2 A2 + perimeter t",
"body_count": 1,
"volume_mm3": 5342.256661176918,
"area_mm2": 3066.94581842842,
"center_of_mass": [
0.0,
11.275769231975591,
2.5
],
"bbox": {
"min": [
-30.0,
0.0,
0.0
],
"max": [
30.0,
25.0,
5.0
]
},
"faces": 8
}
@@ -0,0 +1,318 @@
{
"id": "27-sketch-trapezoid",
"name": "Sketch solver: parallel/perpendicular/midpoint/symmetry",
"description": "Trapezoid: bottom horizontal 60 centred on origin (midpoint), construction axis perpendicular, top parallel 30 with its midpoint on the axis end (height 25); two d6 holes symmetric about the axis.",
"exercises": [
"sketch_only",
"sketch_constraints",
"parallel",
"perpendicular",
"midpoint",
"symmetric",
"offset_dim",
"construction_geometry"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Trapezoid",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-27,
2
]
},
"end": {
"at": [
31,
-1
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
31.0,
-1.0
]
},
"end": {
"at": [
18,
23
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
18.0,
23.0
]
},
"end": {
"at": [
-13,
27
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
-13.0,
27.0
]
},
"end": {
"ref": "l1.start",
"at": [
-27.0,
2.0
]
},
"id": "l4"
},
{
"type": "line",
"start": {
"at": [
1,
1
]
},
"end": {
"at": [
2,
22
]
},
"id": "l0",
"construction": true
},
{
"type": "circle",
"center": {
"at": [
-14,
9
]
},
"radius": 2.5,
"id": "h1"
},
{
"type": "circle",
"center": {
"at": [
16,
7
]
},
"radius": 3.5,
"id": "h2"
}
],
"constraints": [
{
"type": "horizontal",
"refs": [
"l1"
]
},
{
"type": "midpoint",
"refs": [
"origin",
"l1"
]
},
{
"type": "perpendicular",
"refs": [
"l0",
"l1"
]
},
{
"type": "coincident",
"refs": [
"l0.start",
"origin"
]
},
{
"type": "parallel",
"refs": [
"l3",
"l1"
]
},
{
"type": "midpoint",
"refs": [
"l0.end",
"l3"
]
},
{
"type": "symmetric",
"refs": [
"h1",
"h2",
"l0"
]
}
],
"dimensions": [
{
"type": "distance",
"refs": [
"l1.start",
"l1.end"
],
"value": 60,
"unit": "mm",
"orientation": "aligned"
},
{
"type": "distance",
"refs": [
"l0.start",
"l0.end"
],
"value": 25,
"unit": "mm",
"orientation": "aligned"
},
{
"type": "distance",
"refs": [
"l3.start",
"l3.end"
],
"value": 30,
"unit": "mm",
"orientation": "aligned"
},
{
"type": "diameter",
"refs": [
"h1"
],
"value": 6,
"unit": "mm"
},
{
"type": "offset",
"refs": [
"l1",
"h1.center"
],
"value": 8,
"unit": "mm"
},
{
"type": "distance",
"refs": [
"h1.center",
"h2.center"
],
"value": 36,
"unit": "mm",
"orientation": "horizontal"
}
]
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Trapezoid",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
},
{
"outer": false,
"curves": [
"h1"
]
},
{
"outer": false,
"curves": [
"h2"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 5,
"direction": "positive"
},
"result_bodies": [
"Trapezoid"
]
}
]
}
@@ -0,0 +1,24 @@
{
"source": "freecad 1.1.4",
"method": "FreeCAD (OpenCASCADE) build of recipe.json by tools/freecad-oracle/build.py: Part extrude, Part extrude cut, Part makeFillet",
"body_count": 1,
"volume_mm3": 84299.24852854047,
"area_mm2": 16279.571562823978,
"center_of_mass": [
39.99999999999999,
29.999999999999996,
9.161827142086619
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
80.0,
60.0,
20.0
]
}
}
@@ -0,0 +1,577 @@
{
"id": "28-blind-pocket-fillets",
"name": "Blind pocket with filleted corners",
"description": "80x60x20 block; 50x30 rectangle on top face cut 8 mm deep (blind); 4 vertical pocket corner edges filleted R5, then pocket floor edges R2.",
"exercises": [
"extrude_cut",
"blind",
"fillet",
"concave_fillet"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Block_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
80,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
80.0,
0.0
]
},
"end": {
"at": [
80,
60
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
80.0,
60.0
]
},
"end": {
"at": [
0,
60
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
60.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Block",
"operation": "new",
"profiles": [
{
"sketch": "Block_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 20,
"direction": "positive"
},
"result_bodies": [
"Block"
]
},
{
"op": "sketch",
"name": "PocketSketch",
"plane": {
"ref": "face: top of Block (z=20)",
"origin": [
0.0,
0.0,
20.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
],
"face": {
"type": "plane",
"normal_at_point_on_face": [
0.0,
0.0,
1.0
],
"plane_normal_outward": [
0.0,
0.0,
1.0
],
"point": [
40.0,
30.0,
20.0
]
}
},
"entities": [
{
"type": "line",
"start": {
"at": [
15.0,
15.0
]
},
"end": {
"at": [
65.0,
15.0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
65.0,
15.0
]
},
"end": {
"at": [
65.0,
45.0
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
65.0,
45.0
]
},
"end": {
"at": [
15.0,
45.0
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
15.0,
45.0
]
},
"end": {
"ref": "l1.start",
"at": [
15.0,
15.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Pocket",
"operation": "cut",
"profiles": [
{
"sketch": "PocketSketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 8,
"direction": "negative"
},
"result_bodies": [
"Block"
]
},
{
"op": "fillet",
"name": "CornerFillet",
"type": "constant_radius",
"radius": 5,
"tangent_chain": false,
"edge_selection": "the 4 vertical pocket corner edges (z 12..20)",
"edges": [
{
"type": "line",
"start": [
65.0,
15.0,
20.0
],
"end": [
65.0,
15.0,
12.0
],
"point": [
65.0,
15.0,
16.0
]
},
{
"type": "line",
"start": [
15.0,
15.0,
20.0
],
"end": [
15.0,
15.0,
12.0
],
"point": [
15.0,
15.0,
16.0
]
},
{
"type": "line",
"start": [
65.0,
45.0,
20.0
],
"end": [
65.0,
45.0,
12.0
],
"point": [
65.0,
45.0,
16.0
]
},
{
"type": "line",
"start": [
15.0,
45.0,
20.0
],
"end": [
15.0,
45.0,
12.0
],
"point": [
15.0,
45.0,
16.0
]
}
]
},
{
"op": "fillet",
"name": "FloorFillet",
"type": "constant_radius",
"radius": 2,
"tangent_chain": false,
"edge_selection": "all edges of the pocket floor (z=12) - 4 lines + 4 arcs",
"edges": [
{
"type": "arc",
"start": [
20.0,
45.0,
12.0
],
"end": [
15.0,
40.0,
12.0
],
"center": [
20.0,
40.0,
12.0
],
"axis": [
0.0,
-0.0,
1.0
],
"point": [
16.464466094,
43.535533906,
12.0
]
},
{
"type": "line",
"start": [
15.0,
20.0,
12.0
],
"end": [
15.0,
40.0,
12.0
],
"point": [
15.0,
30.0,
12.0
]
},
{
"type": "arc",
"start": [
15.0,
20.0,
12.0
],
"end": [
20.0,
15.0,
12.0
],
"center": [
20.0,
20.0,
12.0
],
"axis": [
0.0,
-0.0,
1.0
],
"point": [
16.464466094,
16.464466094,
12.0
]
},
{
"type": "line",
"start": [
60.0,
15.0,
12.0
],
"end": [
20.0,
15.0,
12.0
],
"point": [
40.0,
15.0,
12.0
]
},
{
"type": "arc",
"start": [
60.0,
15.0,
12.0
],
"end": [
65.0,
20.0,
12.0
],
"center": [
60.0,
20.0,
12.0
],
"axis": [
-0.0,
0.0,
1.0
],
"point": [
63.535533906,
16.464466094,
12.0
]
},
{
"type": "line",
"start": [
65.0,
40.0,
12.0
],
"end": [
65.0,
20.0,
12.0
],
"point": [
65.0,
30.0,
12.0
]
},
{
"type": "arc",
"start": [
65.0,
40.0,
12.0
],
"end": [
60.0,
45.0,
12.0
],
"center": [
60.0,
40.0,
12.0
],
"axis": [
0.0,
-0.0,
1.0
],
"point": [
63.535533906,
43.535533906,
12.0
]
},
{
"type": "line",
"start": [
20.0,
45.0,
12.0
],
"end": [
60.0,
45.0,
12.0
],
"point": [
40.0,
45.0,
12.0
]
}
]
}
]
}
Binary file not shown.
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "block [-20,20]x[-25,10]x[0,20] minus the 270 deg revolve (from +X towards +Y) of the 8x8 square r 4..12, z 12..20; the removed section is the annular sector minus the circular segment y > 10 (R^2 acos(d/R) - d sqrt(R^2-d^2), y-moment 2/3 (R^2-d^2)^1.5) that lies outside the block; sector moments (R^3-r^3)/3 (sin, 1-cos); A = box - top opening + floor - front-face notch 2 sqrt(44) x 8 + inner wall r th h + outer wall (th - pi + 2 asin(5/6)) R h + 2 end caps",
"body_count": 1,
"volume_mm3": 25731.30662164881,
"area_mm2": 6312.602171854095,
"center_of_mass": [
0.17244881492337513,
-8.273218841749548,
9.4709883773001
],
"bbox": {
"min": [
-20.0,
-25.0,
0.0
],
"max": [
20.0,
10.0,
20.0
]
},
"faces": 12
}
@@ -0,0 +1,289 @@
{
"id": "29-two-sided-and-partial-revolve",
"name": "Two-sided extrude + partial revolve cut",
"description": "Rectangle 40x20 on XZ extruded two sides (+10 along normal, 25 opposite); then a 270 deg revolve cut of an 8x8 square about the world Z axis.",
"exercises": [
"extrude_two_sides",
"revolve_partial",
"revolve_cut"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Sketch1",
"plane": {
"ref": "XZ",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
0.0,
-1.0
],
"normal": [
0.0,
1.0,
0.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-20.0,
0.0
]
},
"end": {
"at": [
20.0,
0.0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
20.0,
0.0
]
},
"end": {
"at": [
20.0,
-20.0
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
20.0,
-20.0
]
},
"end": {
"at": [
-20.0,
-20.0
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
-20.0,
-20.0
]
},
"end": {
"ref": "l1.start",
"at": [
-20.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Sketch1",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "two_sides",
"side1": 10,
"side2_opposite": 25
},
"result_bodies": [
"Block"
]
},
{
"op": "sketch",
"name": "RevolveSketch",
"plane": {
"ref": "XZ",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
0.0,
-1.0
],
"normal": [
0.0,
1.0,
0.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
4.0,
-12.0
]
},
"end": {
"at": [
12.0,
-12.0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
12.0,
-12.0
]
},
"end": {
"at": [
12.0,
-20.0
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
12.0,
-20.0
]
},
"end": {
"at": [
4.0,
-20.0
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
4.0,
-20.0
]
},
"end": {
"ref": "l1.start",
"at": [
4.0,
-12.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "revolve",
"name": "RevolveCut",
"operation": "cut",
"profile": {
"sketch": "RevolveSketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
},
"axis": {
"ref": "world Z axis",
"origin": [
0,
0,
0
],
"dir": [
0,
0,
1
]
},
"angle": 270,
"result_bodies": [
"Block"
]
}
]
}
@@ -0,0 +1,24 @@
{
"source": "freecad 1.1.4",
"method": "FreeCAD (OpenCASCADE) build of recipe.json by tools/freecad-oracle/build.py: Part extrude, makeThickness shell, Part makeFillet",
"body_count": 1,
"volume_mm3": 21745.87649398271,
"area_mm2": 14968.331952825032,
"center_of_mass": [
30.000000000000004,
20.000000000000007,
11.575289961678543
],
"bbox": {
"min": [
-8.881784197001252e-16,
-8.881784197001252e-16,
0.0
],
"max": [
60.0,
40.0,
30.0
]
}
}
@@ -0,0 +1,385 @@
{
"id": "30-fillet-after-shell",
"name": "Fillets after shell",
"description": "60x40x30 box shelled 3 mm (top open); outer vertical edges R6, inner vertical edges R3, then the inner floor loop R1 (tangent chain).",
"exercises": [
"shell",
"fillet",
"fillet_after_shell",
"tangent_chain"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Extrude1_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
60,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
60.0,
0.0
]
},
"end": {
"at": [
60,
40
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
60.0,
40.0
]
},
"end": {
"at": [
0,
40
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
40.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Extrude1_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 30,
"direction": "positive"
},
"result_bodies": [
"Box"
]
},
{
"op": "shell",
"name": "Shell1",
"faces_removed": [
{
"type": "plane",
"normal_at_point_on_face": [
0.0,
0.0,
1.0
],
"plane_normal_outward": [
0.0,
0.0,
1.0
],
"point": [
30.0,
20.0,
30.0
]
}
],
"face_selection": "top face (z=30)",
"inside_thickness": 3,
"outside_thickness": 0,
"tangent_chain": false
},
{
"op": "fillet",
"name": "OuterFillet",
"type": "constant_radius",
"radius": 6,
"tangent_chain": false,
"edge_selection": "the 4 outer vertical edges (x in {0,60}, y in {0,40})",
"edges": [
{
"type": "line",
"start": [
0.0,
40.0,
0.0
],
"end": [
0.0,
40.0,
30.0
],
"point": [
0.0,
40.0,
15.0
]
},
{
"type": "line",
"start": [
60.0,
40.0,
0.0
],
"end": [
60.0,
40.0,
30.0
],
"point": [
60.0,
40.0,
15.0
]
},
{
"type": "line",
"start": [
60.0,
0.0,
0.0
],
"end": [
60.0,
0.0,
30.0
],
"point": [
60.0,
0.0,
15.0
]
},
{
"type": "line",
"start": [
0.0,
0.0,
0.0
],
"end": [
0.0,
0.0,
30.0
],
"point": [
0.0,
0.0,
15.0
]
}
]
},
{
"op": "fillet",
"name": "InnerFillet",
"type": "constant_radius",
"radius": 3,
"tangent_chain": false,
"edge_selection": "the 4 inner vertical edges (x in {3,57}, y in {3,37}, z 3..30)",
"edges": [
{
"type": "line",
"start": [
57.0,
37.0,
3.0
],
"end": [
57.0,
37.0,
30.0
],
"point": [
57.0,
37.0,
16.5
]
},
{
"type": "line",
"start": [
3.0,
37.0,
3.0
],
"end": [
3.0,
37.0,
30.0
],
"point": [
3.0,
37.0,
16.5
]
},
{
"type": "line",
"start": [
57.0,
3.0,
3.0
],
"end": [
57.0,
3.0,
30.0
],
"point": [
57.0,
3.0,
16.5
]
},
{
"type": "line",
"start": [
3.0,
3.0,
3.0
],
"end": [
3.0,
3.0,
30.0
],
"point": [
3.0,
3.0,
16.5
]
}
]
},
{
"op": "fillet",
"name": "FloorFillet",
"type": "constant_radius",
"radius": 1,
"tangent_chain": true,
"edge_selection": "one edge of the inner floor (z=3) + tangent chain = whole floor boundary loop",
"edges": [
{
"type": "arc",
"start": [
3.0,
6.0,
3.0
],
"end": [
6.0,
3.0,
3.0
],
"center": [
6.0,
6.0,
3.0
],
"axis": [
0.0,
0.0,
1.0
],
"point": [
3.878679656,
3.878679656,
3.0
]
}
]
}
]
}
Binary file not shown.
@@ -0,0 +1,24 @@
{
"source": "freecad 1.1.4",
"method": "FreeCAD (OpenCASCADE) build of recipe.json by tools/freecad-oracle/build.py: Part extrude, Part makeFillet",
"body_count": 1,
"volume_mm3": 14321.625800678561,
"area_mm2": 5024.044667641301,
"center_of_mass": [
20.90086014062925,
10.902918183990028,
10.000000000000005
],
"bbox": {
"min": [
-4.440892098500626e-16,
-4.440892098500626e-16,
-4.440892098500626e-16
],
"max": [
60.0,
40.0,
20.0
]
}
}
@@ -0,0 +1,524 @@
{
"id": "31-fillet-l-all-edges",
"name": "All-edge fillet on an L block",
"description": "L profile (60x40, 8 thick legs) extruded 20; every edge filleted R2 - mixed convex/concave corners.",
"exercises": [
"fillet",
"concave_edge",
"mixed_corner"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "LSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
60,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
60.0,
0.0
]
},
"end": {
"at": [
60,
8
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
60.0,
8.0
]
},
"end": {
"at": [
8,
8
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
8.0,
8.0
]
},
"end": {
"at": [
8,
40
]
},
"id": "l4"
},
{
"type": "line",
"start": {
"ref": "l4.end",
"at": [
8.0,
40.0
]
},
"end": {
"at": [
0,
40
]
},
"id": "l5"
},
{
"type": "line",
"start": {
"ref": "l5.end",
"at": [
0.0,
40.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l6"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "LSketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4",
"l5",
"l6"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 20,
"direction": "positive"
},
"result_bodies": [
"L"
]
},
{
"op": "fillet",
"name": "Fillet1",
"type": "constant_radius",
"radius": 2,
"tangent_chain": false,
"edge_selection": "all 18 edges of L",
"edges": [
{
"type": "line",
"start": [
8.0,
40.0,
0.0
],
"end": [
0.0,
40.0,
0.0
],
"point": [
4.0,
40.0,
0.0
]
},
{
"type": "line",
"start": [
0.0,
40.0,
0.0
],
"end": [
0.0,
40.0,
20.0
],
"point": [
0.0,
40.0,
10.0
]
},
{
"type": "line",
"start": [
8.0,
40.0,
20.0
],
"end": [
0.0,
40.0,
20.0
],
"point": [
4.0,
40.0,
20.0
]
},
{
"type": "line",
"start": [
8.0,
40.0,
0.0
],
"end": [
8.0,
40.0,
20.0
],
"point": [
8.0,
40.0,
10.0
]
},
{
"type": "line",
"start": [
8.0,
8.0,
0.0
],
"end": [
8.0,
40.0,
0.0
],
"point": [
8.0,
24.0,
0.0
]
},
{
"type": "line",
"start": [
8.0,
8.0,
20.0
],
"end": [
8.0,
40.0,
20.0
],
"point": [
8.0,
24.0,
20.0
]
},
{
"type": "line",
"start": [
8.0,
8.0,
0.0
],
"end": [
8.0,
8.0,
20.0
],
"point": [
8.0,
8.0,
10.0
]
},
{
"type": "line",
"start": [
60.0,
8.0,
0.0
],
"end": [
8.0,
8.0,
0.0
],
"point": [
34.0,
8.0,
0.0
]
},
{
"type": "line",
"start": [
60.0,
8.0,
20.0
],
"end": [
8.0,
8.0,
20.0
],
"point": [
34.0,
8.0,
20.0
]
},
{
"type": "line",
"start": [
60.0,
8.0,
0.0
],
"end": [
60.0,
8.0,
20.0
],
"point": [
60.0,
8.0,
10.0
]
},
{
"type": "line",
"start": [
60.0,
0.0,
0.0
],
"end": [
60.0,
8.0,
0.0
],
"point": [
60.0,
4.0,
0.0
]
},
{
"type": "line",
"start": [
60.0,
0.0,
20.0
],
"end": [
60.0,
8.0,
20.0
],
"point": [
60.0,
4.0,
20.0
]
},
{
"type": "line",
"start": [
60.0,
0.0,
0.0
],
"end": [
60.0,
0.0,
20.0
],
"point": [
60.0,
0.0,
10.0
]
},
{
"type": "line",
"start": [
0.0,
0.0,
0.0
],
"end": [
60.0,
0.0,
0.0
],
"point": [
30.0,
0.0,
0.0
]
},
{
"type": "line",
"start": [
0.0,
0.0,
20.0
],
"end": [
60.0,
0.0,
20.0
],
"point": [
30.0,
0.0,
20.0
]
},
{
"type": "line",
"start": [
0.0,
0.0,
0.0
],
"end": [
0.0,
0.0,
20.0
],
"point": [
0.0,
0.0,
10.0
]
},
{
"type": "line",
"start": [
0.0,
40.0,
0.0
],
"end": [
0.0,
0.0,
0.0
],
"point": [
0.0,
20.0,
0.0
]
},
{
"type": "line",
"start": [
0.0,
40.0,
20.0
],
"end": [
0.0,
0.0,
20.0
],
"point": [
0.0,
20.0,
20.0
]
}
]
}
]
}
Binary file not shown.
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "plate 60x60x8 + boss (r10, z 8..23) with R3 concave base and R2 convex top fillets taken as one solid of revolution: V, z-moment and lateral area from Pappus/Green on its (r,z) profile (quarter-circle fillet arcs); plate top loses the r13 disc",
"body_count": 1,
"volume_mm3": 33590.34963015678,
"area_mm2": 9929.863617615047,
"center_of_mass": [
0.0,
0.0,
5.602823546473236
],
"bbox": {
"min": [
-30.0,
-30.0,
0.0
],
"max": [
30.0,
30.0,
23.0
]
},
"faces": 10
}
@@ -0,0 +1,316 @@
{
"id": "32-boss-plate-fillets",
"name": "Boss on plate: base and top fillets",
"description": "60x60x8 plate centred on origin; d20 boss 15 tall joined on top; base circle edge R3 (concave), top circle edge R2 (convex).",
"exercises": [
"extrude_join",
"fillet",
"cylinder_plane_edge"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Plate_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-30,
-30
]
},
"end": {
"at": [
30,
-30
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
30.0,
-30.0
]
},
"end": {
"at": [
30,
30
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
30.0,
30.0
]
},
"end": {
"at": [
-30,
30
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
-30.0,
30.0
]
},
"end": {
"ref": "l1.start",
"at": [
-30.0,
-30.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Plate",
"operation": "new",
"profiles": [
{
"sketch": "Plate_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 8,
"direction": "positive"
},
"result_bodies": [
"Part"
]
},
{
"op": "sketch",
"name": "BossSketch",
"plane": {
"ref": "face: top of plate (z=8)",
"origin": [
0.0,
0.0,
8.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
],
"face": {
"type": "plane",
"normal_at_point_on_face": [
0.0,
0.0,
1.0
],
"plane_normal_outward": [
0.0,
0.0,
1.0
],
"point": [
0.0,
0.0,
8.0
]
}
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0.0,
0.0
]
},
"radius": 10,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Boss",
"operation": "join",
"profiles": [
{
"sketch": "BossSketch",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 15,
"direction": "positive"
},
"result_bodies": [
"Part"
]
},
{
"op": "fillet",
"name": "BaseFillet",
"type": "constant_radius",
"radius": 3,
"tangent_chain": false,
"edge_selection": "circular edge r=10 at z=8 (boss meets plate)",
"edges": [
{
"type": "circle",
"start": [
-10.0,
-0.0,
8.0
],
"end": [
-10.0,
-0.0,
8.0
],
"center": [
0.0,
0.0,
8.0
],
"axis": [
0.0,
0.0,
-1.0
],
"point": [
10.0,
0.0,
8.0
]
}
]
},
{
"op": "fillet",
"name": "TopFillet",
"type": "constant_radius",
"radius": 2,
"tangent_chain": false,
"edge_selection": "circular edge r=10 at z=23 (boss top)",
"edges": [
{
"type": "circle",
"start": [
-10.0,
-0.0,
23.0
],
"end": [
-10.0,
-0.0,
23.0
],
"center": [
0.0,
0.0,
23.0
],
"axis": [
0.0,
0.0,
1.0
],
"point": [
10.0,
0.0,
23.0
]
}
]
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "obround (R8, centres 40 apart) x 10 minus R2 fillet spandrel R^2(1-pi/4) and 1 mm chamfer triangle swept round the whole loop (Pappus: section x path of its centroid, inset R(10-3pi)/(3(4-pi)) resp. c/3); surfaces likewise (fillet arc centroid inset R-2R/pi)",
"body_count": 1,
"volume_mm3": 8237.12239193832,
"area_mm2": 2793.569488148386,
"center_of_mass": [
20.0,
0.0,
4.975827363940953
],
"bbox": {
"min": [
-8.0,
-8.0,
0.0
],
"max": [
48.0,
8.0,
10.0
]
},
"faces": 14
}
@@ -0,0 +1,212 @@
{
"id": "33-fillet-tangent-chain",
"name": "Fillet chain across tangent faces",
"description": "Obround (centres 0 and 40, R8) extruded 10; one top edge filleted R2 with tangent chain (whole top loop), then one bottom edge chamfered 1 with tangent chain.",
"exercises": [
"fillet",
"tangent_chain",
"chamfer"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "SlotSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "arc_center_start_sweep",
"center": {
"at": [
0,
0
]
},
"start": {
"at": [
0,
8
]
},
"sweep_deg": 180,
"id": "a1"
},
{
"type": "arc_center_start_sweep",
"center": {
"at": [
40,
0
]
},
"start": {
"at": [
40,
-8
]
},
"sweep_deg": 180,
"id": "a2"
},
{
"type": "line",
"start": {
"ref": "a1.end",
"at": [
-0.0,
-8.0
]
},
"end": {
"ref": "a2.start",
"at": [
40.0,
-8.0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "a2.end",
"at": [
40.0,
8.0
]
},
"end": {
"ref": "a1.start",
"at": [
0.0,
8.0
]
},
"id": "l2"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "SlotSketch",
"loops": [
{
"outer": true,
"curves": [
"a1",
"a2",
"l1",
"l2"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 10,
"direction": "positive"
},
"result_bodies": [
"Slot"
]
},
{
"op": "fillet",
"name": "TopFillet",
"type": "constant_radius",
"radius": 2,
"tangent_chain": true,
"edge_selection": "top straight edge at y=-8, z=10, plus tangent chain",
"edges": [
{
"type": "line",
"start": [
0.0,
-8.0,
10.0
],
"end": [
40.0,
-8.0,
10.0
],
"point": [
20.0,
-8.0,
10.0
]
}
]
},
{
"op": "chamfer",
"name": "BottomChamfer",
"type": "equal_distance",
"distance": 1,
"tangent_chain": true,
"edge_selection": "bottom straight edge at y=-8, z=0, plus tangent chain",
"edges": [
{
"type": "line",
"start": [
-0.0,
-8.0,
0.0
],
"end": [
40.0,
-8.0,
0.0
],
"point": [
20.0,
-8.0,
0.0
]
}
]
}
]
}
@@ -0,0 +1,24 @@
{
"source": "freecad 1.1.4",
"method": "FreeCAD (OpenCASCADE) build of recipe.json by tools/freecad-oracle/build.py: Part extrude, Part makeChamfer, Part makeFillet",
"body_count": 1,
"volume_mm3": 22892.42132988775,
"area_mm2": 4753.688476928938,
"center_of_mass": [
20.000000000000004,
15.000000000000012,
9.95512677479753
],
"bbox": {
"min": [
-1.3322676295501878e-15,
-8.881784197001252e-16,
0.0
],
"max": [
40.0,
30.0,
20.0
]
}
}
@@ -0,0 +1,390 @@
{
"id": "34-chamfer-then-fillet",
"name": "Chamfer then fillet",
"description": "40x30x20 box; 4 vertical edges chamfered 5; then all 8 edges of the (now octagonal) top face filleted R2.",
"exercises": [
"chamfer",
"fillet",
"chamfer_fillet_interaction"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Extrude1_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
40,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
40.0,
0.0
]
},
"end": {
"at": [
40,
30
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
40.0,
30.0
]
},
"end": {
"at": [
0,
30
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
30.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Extrude1_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 20,
"direction": "positive"
},
"result_bodies": [
"Box"
]
},
{
"op": "chamfer",
"name": "Chamfer1",
"type": "equal_distance",
"distance": 5,
"tangent_chain": false,
"edge_selection": "the 4 vertical edges",
"edges": [
{
"type": "line",
"start": [
0.0,
30.0,
0.0
],
"end": [
0.0,
30.0,
20.0
],
"point": [
0.0,
30.0,
10.0
]
},
{
"type": "line",
"start": [
40.0,
30.0,
0.0
],
"end": [
40.0,
30.0,
20.0
],
"point": [
40.0,
30.0,
10.0
]
},
{
"type": "line",
"start": [
40.0,
0.0,
0.0
],
"end": [
40.0,
0.0,
20.0
],
"point": [
40.0,
0.0,
10.0
]
},
{
"type": "line",
"start": [
0.0,
0.0,
0.0
],
"end": [
0.0,
0.0,
20.0
],
"point": [
0.0,
0.0,
10.0
]
}
]
},
{
"op": "fillet",
"name": "Fillet1",
"type": "constant_radius",
"radius": 2,
"tangent_chain": false,
"edge_selection": "all 8 edges of the top face (z=20)",
"edges": [
{
"type": "line",
"start": [
5.0,
0.0,
20.0
],
"end": [
0.0,
5.0,
20.0
],
"point": [
2.5,
2.5,
20.0
]
},
{
"type": "line",
"start": [
5.0,
0.0,
20.0
],
"end": [
35.0,
0.0,
20.0
],
"point": [
20.0,
0.0,
20.0
]
},
{
"type": "line",
"start": [
40.0,
5.0,
20.0
],
"end": [
35.0,
0.0,
20.0
],
"point": [
37.5,
2.5,
20.0
]
},
{
"type": "line",
"start": [
40.0,
5.0,
20.0
],
"end": [
40.0,
25.0,
20.0
],
"point": [
40.0,
15.0,
20.0
]
},
{
"type": "line",
"start": [
35.0,
30.0,
20.0
],
"end": [
40.0,
25.0,
20.0
],
"point": [
37.5,
27.5,
20.0
]
},
{
"type": "line",
"start": [
35.0,
30.0,
20.0
],
"end": [
5.0,
30.0,
20.0
],
"point": [
20.0,
30.0,
20.0
]
},
{
"type": "line",
"start": [
0.0,
25.0,
20.0
],
"end": [
5.0,
30.0,
20.0
],
"point": [
2.5,
27.5,
20.0
]
},
{
"type": "line",
"start": [
0.0,
25.0,
20.0
],
"end": [
0.0,
5.0,
20.0
],
"point": [
0.0,
15.0,
20.0
]
}
]
}
]
}
Binary file not shown.
@@ -0,0 +1,24 @@
{
"source": "freecad 1.1.4",
"method": "FreeCAD (OpenCASCADE) build of recipe.json by tools/freecad-oracle/build.py: Part extrude, Part extrude join, Part makeFillet",
"body_count": 1,
"volume_mm3": 63171.61517720092,
"area_mm2": 10269.29821399885,
"center_of_mass": [
1.2666242694772013e-06,
-8.296669862737878e-08,
2.5627304852052224
],
"bbox": {
"min": [
-40.0000001,
-15.0000001,
-15.0000001
],
"max": [
40.0000001,
15.0000001,
35.0000001
]
}
}
@@ -0,0 +1,193 @@
{
"id": "35-fillet-curved-curved",
"name": "Fillet between two cylinders",
"description": "Cylinder r15 along X (x -40..40) joined with a cylinder r10 along +Z (z 0..35); the saddle intersection edge filleted R3.",
"exercises": [
"sketch_yz",
"symmetric",
"extrude_join",
"fillet",
"curved_curved_edge"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "MainSketch",
"plane": {
"ref": "YZ",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
0.0,
0.0,
-1.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
1.0,
0.0,
0.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0.0,
0.0
]
},
"radius": 15,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Main",
"operation": "new",
"profiles": [
{
"sketch": "MainSketch",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "symmetric",
"distance": 40,
"is_full_length": false,
"meaning": "distance on each side"
},
"result_bodies": [
"Tee"
]
},
{
"op": "sketch",
"name": "BranchSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0,
0
]
},
"radius": 10,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Branch",
"operation": "join",
"profiles": [
{
"sketch": "BranchSketch",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 35,
"direction": "positive"
},
"result_bodies": [
"Tee"
]
},
{
"op": "fillet",
"name": "SaddleFillet",
"type": "constant_radius",
"radius": 3,
"tangent_chain": false,
"edge_selection": "edge(s) whose both adjacent faces are cylinders (the branch/main intersection curve)",
"edges": [
{
"type": "nurbs",
"start": [
0.0,
-10.0,
11.180339887
],
"end": [
0.0,
-10.0,
11.180339887
],
"point": [
0.0,
10.0,
11.180339887
]
}
]
}
]
}
Binary file not shown.
@@ -0,0 +1,24 @@
{
"source": "freecad 1.1.4",
"method": "FreeCAD (OpenCASCADE) build of recipe.json by tools/freecad-oracle/build.py: Part extrude, Part makeFillet",
"body_count": 1,
"volume_mm3": 57800.23972405685,
"area_mm2": 8585.524087145672,
"center_of_mass": [
24.999999999999996,
19.999999999999996,
14.865497483183885
],
"bbox": {
"min": [
-1.7763568394002505e-15,
-1.0000000177635683e-07,
0.0
],
"max": [
50.0,
40.0,
30.0
]
}
}
@@ -0,0 +1,274 @@
{
"id": "36-corner-blend-two-radii",
"name": "Corner blends with two radii",
"description": "50x40x30 box; 4 vertical edges R8, then the top-face loop R4 (tangent chain) - 3-edge corner blends with unequal radii.",
"exercises": [
"fillet",
"corner_blend",
"tangent_chain"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Extrude1_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
50,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
50.0,
0.0
]
},
"end": {
"at": [
50,
40
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
50.0,
40.0
]
},
"end": {
"at": [
0,
40
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
40.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Extrude1_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 30,
"direction": "positive"
},
"result_bodies": [
"Box"
]
},
{
"op": "fillet",
"name": "VerticalFillet",
"type": "constant_radius",
"radius": 8,
"tangent_chain": false,
"edge_selection": "the 4 vertical edges",
"edges": [
{
"type": "line",
"start": [
0.0,
40.0,
0.0
],
"end": [
0.0,
40.0,
30.0
],
"point": [
0.0,
40.0,
15.0
]
},
{
"type": "line",
"start": [
50.0,
40.0,
0.0
],
"end": [
50.0,
40.0,
30.0
],
"point": [
50.0,
40.0,
15.0
]
},
{
"type": "line",
"start": [
50.0,
0.0,
0.0
],
"end": [
50.0,
0.0,
30.0
],
"point": [
50.0,
0.0,
15.0
]
},
{
"type": "line",
"start": [
0.0,
0.0,
0.0
],
"end": [
0.0,
0.0,
30.0
],
"point": [
0.0,
0.0,
15.0
]
}
]
},
{
"op": "fillet",
"name": "TopFillet",
"type": "constant_radius",
"radius": 4,
"tangent_chain": true,
"edge_selection": "one edge of the top face + tangent chain (whole top loop)",
"edges": [
{
"type": "arc",
"start": [
8.0,
0.0,
30.0
],
"end": [
0.0,
8.0,
30.0
],
"center": [
8.0,
8.0,
30.0
],
"axis": [
-0.0,
-0.0,
-1.0
],
"point": [
2.343145751,
2.343145751,
30.0
]
}
]
}
]
}
Binary file not shown.
@@ -0,0 +1,24 @@
{
"source": "freecad 1.1.4",
"method": "FreeCAD (OpenCASCADE) build of recipe.json by tools/freecad-oracle/build.py: Part.makeLoft, Part makeFillet",
"body_count": 1,
"volume_mm3": 15465.577113384288,
"area_mm2": 3914.585460194058,
"center_of_mass": [
-7.50627101581177e-12,
1.801248348273918e-11,
7.673359735250147
],
"bbox": {
"min": [
-18.26296581635734,
-18.262965816357344,
-2.220446049250313e-16
],
"max": [
18.262965816357344,
18.262965816357344,
28.373982542073644
]
}
}
@@ -0,0 +1,361 @@
{
"id": "37-pyramid-apex-blend",
"name": "Pyramid apex: 4-edge corner blend",
"description": "Loft from a 40x40 square (XY) to a point at (0,0,30) = square pyramid; all edges filleted R2 (apex blends 4 edges).",
"exercises": [
"loft_to_point",
"fillet",
"corner_blend_4"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Base",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-20,
-20
]
},
"end": {
"at": [
20,
-20
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
20.0,
-20.0
]
},
"end": {
"at": [
20,
20
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
20.0,
20.0
]
},
"end": {
"at": [
-20,
20
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
-20.0,
20.0
]
},
"end": {
"ref": "l1.start",
"at": [
-20.0,
-20.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "construction_plane",
"name": "Apex30",
"method": "offset",
"base": "XY",
"offset": 30
},
{
"op": "sketch",
"name": "Apex",
"plane": {
"ref": "construction plane Apex30 (XY offset 30)",
"origin": [
0.0,
0.0,
30.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "point",
"at": [
0,
0
],
"fixed": false,
"id": "p1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "loft",
"name": "Loft1",
"operation": "new",
"sections": [
{
"sketch": "Base",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
},
{
"sketch": "Apex",
"point": "p1",
"world": [
0,
0,
30
]
}
],
"end_conditions": "free",
"solid": true,
"result_bodies": [
"Pyramid"
]
},
{
"op": "fillet",
"name": "Fillet1",
"type": "constant_radius",
"radius": 2,
"tangent_chain": false,
"edge_selection": "all 8 edges of the pyramid",
"edges": [
{
"type": "line",
"start": [
-20.0,
20.0,
0.0
],
"end": [
-20.0,
-20.0,
0.0
],
"point": [
-20.0,
0.0,
0.0
]
},
{
"type": "line",
"start": [
20.0,
20.0,
0.0
],
"end": [
-20.0,
20.0,
0.0
],
"point": [
0.0,
20.0,
0.0
]
},
{
"type": "line",
"start": [
20.0,
-20.0,
0.0
],
"end": [
20.0,
20.0,
0.0
],
"point": [
20.0,
0.0,
0.0
]
},
{
"type": "line",
"start": [
-20.0,
-20.0,
0.0
],
"end": [
20.0,
-20.0,
0.0
],
"point": [
0.0,
-20.0,
0.0
]
},
{
"type": "line",
"start": [
-20.0,
-20.0,
0.0
],
"end": [
0.0,
0.0,
30.0
],
"point": [
-10.0,
-10.0,
15.0
]
},
{
"type": "line",
"start": [
-20.0,
20.0,
0.0
],
"end": [
0.0,
0.0,
30.0
],
"point": [
-10.0,
10.0,
15.0
]
},
{
"type": "line",
"start": [
20.0,
-20.0,
0.0
],
"end": [
0.0,
0.0,
30.0
],
"point": [
10.0,
-10.0,
15.0
]
},
{
"type": "line",
"start": [
20.0,
20.0,
0.0
],
"end": [
0.0,
0.0,
30.0
],
"point": [
10.0,
10.0,
15.0
]
}
]
}
]
}
Binary file not shown.
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "union of r10 z0..30 and r10 z20..50 = cylinder r10 h50: V = pi r^2 h, A = 2 pi r h + 2 pi r^2",
"body_count": 1,
"volume_mm3": 15707.963267948966,
"area_mm2": 3769.9111843077517,
"center_of_mass": [
0.0,
0.0,
25.0
],
"bbox": {
"min": [
-10.0,
-10.0,
0.0
],
"max": [
10.0,
10.0,
50.0
]
},
"faces": 3
}
@@ -0,0 +1,179 @@
{
"id": "38-coincident-cylinders",
"name": "Union of coaxial equal cylinders",
"description": "Cylinder r10 z 0..30 and cylinder r10 z 20..50 (coincident cylindrical faces), combine join.",
"exercises": [
"combine_join",
"coincident_faces",
"offset_plane"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "S1",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0,
0
]
},
"radius": 10,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "CylA",
"operation": "new",
"profiles": [
{
"sketch": "S1",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 30,
"direction": "positive"
},
"result_bodies": [
"A"
]
},
{
"op": "construction_plane",
"name": "Z20",
"method": "offset",
"base": "XY",
"offset": 20
},
{
"op": "sketch",
"name": "S2",
"plane": {
"ref": "construction plane Z20",
"origin": [
0.0,
0.0,
20.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0,
0
]
},
"radius": 10,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "CylB",
"operation": "new",
"profiles": [
{
"sketch": "S2",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 30,
"direction": "positive"
},
"result_bodies": [
"B"
]
},
{
"op": "combine",
"name": "Combine1",
"operation": "join",
"target_body": "A",
"tool_bodies": [
"B"
],
"keep_tools": false
}
]
}
+24
View File
@@ -0,0 +1,24 @@
{
"source": "freecad 1.1.4",
"method": "FreeCAD (OpenCASCADE) build of recipe.json by tools/freecad-oracle/build.py: Part extrude, Part extrude join, Part extrude cut",
"body_count": 1,
"volume_mm3": 24097.79380441197,
"area_mm2": 16710.06166887699,
"center_of_mass": [
4.75919240426363e-06,
-3.866233490238524e-07,
4.436155001585041
],
"bbox": {
"min": [
-40.0000001,
-15.0000001,
-15.0000001
],
"max": [
40.0000001,
15.0000001,
40.0000001
]
}
}
+302
View File
@@ -0,0 +1,302 @@
{
"id": "39-tee-pipe",
"name": "Tee pipe (cylinder through cylinder)",
"description": "Main pipe OD30/ID24 along X (x -40..40); branch OD20/ID14 along +Z to z=40; outer join then bores cut.",
"exercises": [
"sketch_yz",
"symmetric",
"extrude_join",
"extrude_cut",
"cylinder_cylinder"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "MainOuter",
"plane": {
"ref": "YZ",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
0.0,
0.0,
-1.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
1.0,
0.0,
0.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0.0,
0.0
]
},
"radius": 15,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "MainOuter",
"operation": "new",
"profiles": [
{
"sketch": "MainOuter",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "symmetric",
"distance": 40,
"is_full_length": false,
"meaning": "distance on each side"
},
"result_bodies": [
"Tee"
]
},
{
"op": "sketch",
"name": "BranchOuter",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0,
0
]
},
"radius": 10,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "BranchOuter",
"operation": "join",
"profiles": [
{
"sketch": "BranchOuter",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 40,
"direction": "positive"
},
"result_bodies": [
"Tee"
]
},
{
"op": "sketch",
"name": "MainBore",
"plane": {
"ref": "YZ",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
0.0,
0.0,
-1.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
1.0,
0.0,
0.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0.0,
0.0
]
},
"radius": 12,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "MainBore",
"operation": "cut",
"profiles": [
{
"sketch": "MainBore",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "symmetric",
"distance": 40,
"is_full_length": false,
"meaning": "distance on each side"
},
"result_bodies": [
"Tee"
]
},
{
"op": "sketch",
"name": "BranchBore",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0,
0
]
},
"radius": 7,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "BranchBore",
"operation": "cut",
"profiles": [
{
"sketch": "BranchBore",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 40,
"direction": "positive"
},
"result_bodies": [
"Tee"
]
}
]
}
Binary file not shown.
@@ -0,0 +1,26 @@
{
"source": "analytic",
"method": "box 60x60x10 (z -10..0) + upper hemisphere r12 + spherical cap h2 below z=-10 (V = pi h^2(3R-h)/3, A = 2 pi R h) - lower half torus R22 r4 (Pappus: V = pi r^2/2 * 2 pi R, centroid -4r/3pi, A = pi r * 2 pi R); top loses disc r12 and annulus 18..26, bottom loses disc r sqrt(44)",
"body_count": 1,
"volume_mm3": 36287.43285471473,
"area_mm2": 10696.165473259409,
"center_of_mass": [
0.0,
0.0,
-4.390960875015068
],
"bbox": {
"min": [
-30.0,
-30.0,
-12.0
],
"max": [
30.0,
30.0,
12.0
]
},
"faces": 10,
"note": "faces: bottom, 4 sides, top split by the groove into an annulus (r 12..18) and the outer part, upper sphere, lower cap, torus"
}
@@ -0,0 +1,354 @@
{
"id": "40-box-sphere-torus",
"name": "Box + sphere - torus",
"description": "Box (-30,-30,-10)..(30,30,0); sphere r12 at origin joined (dome); torus (R22, r4, axis Z, centre origin) cut (half-round groove ring in the box top).",
"exercises": [
"revolve",
"combine_join",
"combine_cut",
"torus",
"sphere"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Box_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-30,
-30
]
},
"end": {
"at": [
30,
-30
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
30.0,
-30.0
]
},
"end": {
"at": [
30,
30
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
30.0,
30.0
]
},
"end": {
"at": [
-30,
30
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
-30.0,
30.0
]
},
"end": {
"ref": "l1.start",
"at": [
-30.0,
-30.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Box",
"operation": "new",
"profiles": [
{
"sketch": "Box_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 10,
"direction": "negative"
},
"result_bodies": [
"A"
]
},
{
"op": "sketch",
"name": "Sphere_sketch",
"plane": {
"ref": "XZ",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
0.0,
-1.0
],
"normal": [
0.0,
1.0,
0.0
]
},
"entities": [
{
"type": "arc_three_point",
"start": {
"at": [
0.0,
12.0
]
},
"mid": [
12.0,
0.0
],
"end": {
"at": [
0.0,
-12.0
]
},
"id": "a1"
},
{
"type": "line",
"start": {
"ref": "a1.end",
"at": [
0.0,
-12.0
]
},
"end": {
"ref": "a1.start",
"at": [
0.0,
12.0
]
},
"id": "l1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "revolve",
"name": "Sphere",
"operation": "new",
"profile": {
"sketch": "Sphere_sketch",
"loops": [
{
"outer": true,
"curves": [
"a1",
"l1"
]
}
]
},
"axis": {
"ref": "world Z axis",
"origin": [
0,
0,
0
],
"dir": [
0,
0,
1
]
},
"angle": 360,
"result_bodies": [
"S"
]
},
{
"op": "combine",
"name": "JoinSphere",
"operation": "join",
"target_body": "A",
"tool_bodies": [
"S"
],
"keep_tools": false
},
{
"op": "sketch",
"name": "TorusSketch",
"plane": {
"ref": "XZ",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
0.0,
-1.0
],
"normal": [
0.0,
1.0,
0.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
22.0,
0.0
]
},
"radius": 4,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "revolve",
"name": "Torus",
"operation": "new",
"profile": {
"sketch": "TorusSketch",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
},
"axis": {
"ref": "world Z axis",
"origin": [
0,
0,
0
],
"dir": [
0,
0,
1
]
},
"angle": 360,
"result_bodies": [
"T"
]
},
{
"op": "combine",
"name": "CutTorus",
"operation": "cut",
"target_body": "A",
"tool_bodies": [
"T"
],
"keep_tools": false
}
]
}
@@ -0,0 +1,24 @@
{
"source": "freecad 1.1.4",
"method": "FreeCAD (OpenCASCADE) build of recipe.json by tools/freecad-oracle/build.py: Part extrude, Part extrude cut, pattern (tools transformed and re-applied)",
"body_count": 1,
"volume_mm3": 20243.55643647215,
"area_mm2": 14873.859284949844,
"center_of_mass": [
-9.45514125510865e-05,
-0.00016121064416442976,
29.9999903705421
],
"bbox": {
"min": [
-20.0000001,
-20.000000101011352,
-1e-07
],
"max": [
20.0000001,
20.000000101011356,
60.0000001
]
}
}
@@ -0,0 +1,252 @@
{
"id": "41-tube-radial-holes",
"name": "Many small holes in a curved wall",
"description": "Tube OD40/ID34 length 60; three d4 radial holes along Y (z=15,30,45) cut symmetric through both walls; circular pattern x3 over 120 deg -> 18 holes.",
"exercises": [
"annulus_profile",
"sketch_xz",
"symmetric",
"extrude_cut",
"circular_pattern",
"holes_in_cylinder"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "TubeSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0,
0
]
},
"radius": 20,
"id": "c_out"
},
{
"type": "circle",
"center": {
"ref": "c_out.center",
"at": [
0.0,
0.0
]
},
"radius": 17,
"id": "c_in"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Tube",
"operation": "new",
"profiles": [
{
"sketch": "TubeSketch",
"loops": [
{
"outer": true,
"curves": [
"c_out"
]
},
{
"outer": false,
"curves": [
"c_in"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 60,
"direction": "positive"
},
"result_bodies": [
"Tube"
]
},
{
"op": "sketch",
"name": "HoleSketch",
"plane": {
"ref": "XZ",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
0.0,
-1.0
],
"normal": [
0.0,
1.0,
0.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
0.0,
-15.0
]
},
"radius": 2,
"id": "c1"
},
{
"type": "circle",
"center": {
"at": [
0.0,
-30.0
]
},
"radius": 2,
"id": "c2"
},
{
"type": "circle",
"center": {
"at": [
0.0,
-45.0
]
},
"radius": 2,
"id": "c3"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Holes",
"operation": "cut",
"profiles": [
{
"sketch": "HoleSketch",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
},
{
"sketch": "HoleSketch",
"loops": [
{
"outer": true,
"curves": [
"c2"
]
}
]
},
{
"sketch": "HoleSketch",
"loops": [
{
"outer": true,
"curves": [
"c3"
]
}
]
}
],
"extent": {
"type": "symmetric",
"distance": 25,
"is_full_length": false,
"meaning": "distance on each side"
},
"result_bodies": [
"Tube"
]
},
{
"op": "circular_pattern",
"name": "HolePattern",
"pattern_of": "features",
"features": [
"Holes"
],
"axis": {
"ref": "world Z axis",
"origin": [
0,
0,
0
],
"dir": [
0,
0,
1
]
},
"count": 3,
"total_angle": 120,
"symmetric": false
}
]
}
Binary file not shown.
@@ -0,0 +1,24 @@
{
"source": "freecad 1.1.4",
"method": "FreeCAD (OpenCASCADE) build of recipe.json by tools/freecad-oracle/build.py: Part extrude, Part extrude cut, pattern (tools transformed and re-applied), Part extrude cut, pattern (tools transformed and re-applied)",
"body_count": 1,
"volume_mm3": 38487.063633850754,
"area_mm2": 21686.603498756176,
"center_of_mass": [
-4.7262358616155635e-15,
2.1740684963431593e-15,
2.499999999999997
],
"bbox": {
"min": [
-50.0,
-50.0,
-1e-07
],
"max": [
50.0,
50.0,
5.0000001
]
}
}
@@ -0,0 +1,339 @@
{
"id": "42-overlapping-patterns",
"name": "Overlapping hole patterns",
"description": "100x100x5 plate centred; d10 hole at (-30,-30) rect-patterned 5x5 @15; d10 hole at (25,0) circular-patterned x8 about Z - several holes overlap and merge.",
"exercises": [
"rectangular_pattern",
"circular_pattern",
"overlapping_cuts"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Plate_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
-50,
-50
]
},
"end": {
"at": [
50,
-50
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
50.0,
-50.0
]
},
"end": {
"at": [
50,
50
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
50.0,
50.0
]
},
"end": {
"at": [
-50,
50
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
-50.0,
50.0
]
},
"end": {
"ref": "l1.start",
"at": [
-50.0,
-50.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Plate",
"operation": "new",
"profiles": [
{
"sketch": "Plate_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 5,
"direction": "positive"
},
"result_bodies": [
"Plate"
]
},
{
"op": "sketch",
"name": "HoleA",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
-30,
-30
]
},
"radius": 5,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "HoleA",
"operation": "cut",
"profiles": [
{
"sketch": "HoleA",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "through_all",
"direction": "positive"
},
"result_bodies": [
"Plate"
]
},
{
"op": "rectangular_pattern",
"name": "GridPattern",
"pattern_of": "features",
"features": [
"HoleA (1)"
],
"direction1": {
"axis": [
1,
0,
0
],
"count": 5,
"spacing": 15
},
"distance_type": "spacing (distance between instances)",
"direction2": {
"axis": [
0,
1,
0
],
"count": 5,
"spacing": 15
}
},
{
"op": "sketch",
"name": "HoleB",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "circle",
"center": {
"at": [
25,
0
]
},
"radius": 5,
"id": "c1"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "HoleB",
"operation": "cut",
"profiles": [
{
"sketch": "HoleB",
"loops": [
{
"outer": true,
"curves": [
"c1"
]
}
]
}
],
"extent": {
"type": "through_all",
"direction": "positive"
},
"result_bodies": [
"Plate"
]
},
{
"op": "circular_pattern",
"name": "RingPattern",
"pattern_of": "features",
"features": [
"HoleB (1)"
],
"axis": {
"ref": "world Z axis",
"origin": [
0,
0,
0
],
"dir": [
0,
0,
1
]
},
"count": 8,
"total_angle": 360,
"symmetric": false
}
]
}
Binary file not shown.
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "two boxes 35x20x20 (x 0..35 and 45..80): V = 2abc, A = 2*2(ab+bc+ca)",
"body_count": 2,
"volume_mm3": 28000,
"area_mm2": 7200,
"center_of_mass": [
40.0,
10.0,
10.0
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
80.0,
20.0,
20.0
]
},
"faces": 12
}
+282
View File
@@ -0,0 +1,282 @@
{
"id": "43-cut-splits-body",
"name": "Cut that splits a body in two",
"description": "80x20x20 box; rectangle x 35..45 (wider than the box in Y) cut through all -> two separate bodies.",
"exercises": [
"extrude_cut",
"through_all",
"multi_body_result"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "Extrude1_sketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
80,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
80.0,
0.0
]
},
"end": {
"at": [
80,
20
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
80.0,
20.0
]
},
"end": {
"at": [
0,
20
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
0.0,
20.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "Extrude1_sketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 20,
"direction": "positive"
},
"result_bodies": [
"Bar"
]
},
{
"op": "sketch",
"name": "CutSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
35,
-5
]
},
"end": {
"at": [
45,
-5
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
45.0,
-5.0
]
},
"end": {
"at": [
45,
25
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
45.0,
25.0
]
},
"end": {
"at": [
35,
25
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
35.0,
25.0
]
},
"end": {
"ref": "l1.start",
"at": [
35.0,
-5.0
]
},
"id": "l4"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Cut1",
"operation": "cut",
"profiles": [
{
"sketch": "CutSketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4"
]
}
]
}
],
"extent": {
"type": "through_all",
"direction": "positive"
},
"result_bodies": [
"Bar",
"Bar (1)"
]
}
]
}
@@ -0,0 +1,25 @@
{
"source": "analytic",
"method": "L prism (area 736, perimeter 200) x 20 minus cavity = L shrunk by 2 (SolidCraft's intersection-join shell convention: inner faces offset by 2 and extended to meet, sharp inner corner at (6,6); area 352) from z=2 to 20. A rounded (arc) join would give V 8368.5487, A 8768.5487, 16 faces",
"body_count": 1,
"volume_mm3": 8384.000000000004,
"area_mm2": 8784.000000000004,
"center_of_mass": [
21.26717557251906,
11.267175572519093,
9.244274809160306
],
"bbox": {
"min": [
0.0,
0.0,
0.0
],
"max": [
60.0,
40.0,
20.0
]
},
"faces": 15
}
+217
View File
@@ -0,0 +1,217 @@
{
"id": "44-shell-l-bracket",
"name": "Shelled L block",
"description": "L profile extruded 20, shelled 2 mm inward with the top face (z=20) removed - non-convex shell.",
"exercises": [
"shell",
"non_convex"
],
"units": {
"length": "mm",
"angle": "deg",
"area": "mm2",
"volume": "mm3"
},
"conventions": {
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
"extrude_direction": "positive = along sketch plane normal unless stated",
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
},
"parameters": [],
"features": [
{
"op": "sketch",
"name": "LSketch",
"plane": {
"ref": "XY",
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1.0,
0.0,
0.0
],
"y_dir": [
0.0,
1.0,
0.0
],
"normal": [
0.0,
0.0,
1.0
]
},
"entities": [
{
"type": "line",
"start": {
"at": [
0,
0
]
},
"end": {
"at": [
60,
0
]
},
"id": "l1"
},
{
"type": "line",
"start": {
"ref": "l1.end",
"at": [
60.0,
0.0
]
},
"end": {
"at": [
60,
8
]
},
"id": "l2"
},
{
"type": "line",
"start": {
"ref": "l2.end",
"at": [
60.0,
8.0
]
},
"end": {
"at": [
8,
8
]
},
"id": "l3"
},
{
"type": "line",
"start": {
"ref": "l3.end",
"at": [
8.0,
8.0
]
},
"end": {
"at": [
8,
40
]
},
"id": "l4"
},
{
"type": "line",
"start": {
"ref": "l4.end",
"at": [
8.0,
40.0
]
},
"end": {
"at": [
0,
40
]
},
"id": "l5"
},
{
"type": "line",
"start": {
"ref": "l5.end",
"at": [
0.0,
40.0
]
},
"end": {
"ref": "l1.start",
"at": [
0.0,
0.0
]
},
"id": "l6"
}
],
"constraints": [],
"dimensions": []
},
{
"op": "extrude",
"name": "Extrude1",
"operation": "new",
"profiles": [
{
"sketch": "LSketch",
"loops": [
{
"outer": true,
"curves": [
"l1",
"l2",
"l3",
"l4",
"l5",
"l6"
]
}
]
}
],
"extent": {
"type": "distance",
"distance": 20,
"direction": "positive"
},
"result_bodies": [
"L"
]
},
{
"op": "shell",
"name": "Shell1",
"faces_removed": [
{
"type": "plane",
"normal_at_point_on_face": [
0.0,
0.0,
1.0
],
"plane_normal_outward": [
0.0,
0.0,
1.0
],
"point": [
30.0,
4.0,
20.0
]
}
],
"face_selection": "top face (z=20)",
"inside_thickness": 2,
"outside_thickness": 0,
"tangent_chain": false
}
]
}
Loaded 100 of 204 files, more files were not shown because too many files have changed in this diff. Show more