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:
204 files changed
+27106
-932
No files matched your search
@@ -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
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
Reference in new issue
Block a user