loadpath 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. loadpath/README.md +294 -0
  2. loadpath/SKILL.md +584 -0
  3. loadpath/__init__.py +17 -0
  4. loadpath/__main__.py +1202 -0
  5. loadpath/am.py +316 -0
  6. loadpath/amgfast.py +326 -0
  7. loadpath/assembly.py +985 -0
  8. loadpath/benchmarks/__init__.py +0 -0
  9. loadpath/benchmarks/beams.py +266 -0
  10. loadpath/benchmarks/cases/ge-bracket.json +380 -0
  11. loadpath/benchmarks/evaluate.py +172 -0
  12. loadpath/benchmarks/mechanisms.py +416 -0
  13. loadpath/benchmarks/problems.py +140 -0
  14. loadpath/benchmarks/reference/bridge-3d.top3d.npz +0 -0
  15. loadpath/benchmarks/reference/cantilever-3d.top3d.npz +0 -0
  16. loadpath/benchmarks/reference/lbracket-2d.top88-ft2.npz +0 -0
  17. loadpath/benchmarks/reference/mbb-2d.top88-ft1.npz +0 -0
  18. loadpath/benchmarks/reference/mbb-2d.top88-ft2.npz +0 -0
  19. loadpath/benchmarks/reference.py +138 -0
  20. loadpath/benchmarks/run.py +301 -0
  21. loadpath/brep.py +1470 -0
  22. loadpath/bucklingopt.py +300 -0
  23. loadpath/buildsim.py +1490 -0
  24. loadpath/cadimport.py +904 -0
  25. loadpath/calibration.py +885 -0
  26. loadpath/cavities.py +211 -0
  27. loadpath/checks/__init__.py +0 -0
  28. loadpath/checks/dfm.py +354 -0
  29. loadpath/checks/exchanger.py +7 -0
  30. loadpath/checks/fea.py +212 -0
  31. loadpath/checks/fit.py +475 -0
  32. loadpath/checks/networks.py +260 -0
  33. loadpath/checks/opening.py +67 -0
  34. loadpath/checks/sdf_kit.py +7 -0
  35. loadpath/conjugate.py +267 -0
  36. loadpath/constrained.py +329 -0
  37. loadpath/contact.py +691 -0
  38. loadpath/coopt.py +342 -0
  39. loadpath/cores.py +163 -0
  40. loadpath/crease.py +1138 -0
  41. loadpath/critic.py +212 -0
  42. loadpath/crosscheck.py +1107 -0
  43. loadpath/cutcell.py +510 -0
  44. loadpath/data/lattice_buckling.json +439 -0
  45. loadpath/data/lattice_tensors.json +27449 -0
  46. loadpath/data/published_experiments.json +71 -0
  47. loadpath/decimate.py +177 -0
  48. loadpath/delivery.py +190 -0
  49. loadpath/directions.py +262 -0
  50. loadpath/domain.py +630 -0
  51. loadpath/drains.py +615 -0
  52. loadpath/durability.py +413 -0
  53. loadpath/editor.html +3135 -0
  54. loadpath/editor.py +610 -0
  55. loadpath/escape.py +354 -0
  56. loadpath/evals/__init__.py +0 -0
  57. loadpath/evals/baselines/coarse.json +1543 -0
  58. loadpath/evals/baselines/full.json +1497 -0
  59. loadpath/evals/brief_kinds/__init__.py +1 -0
  60. loadpath/evals/brief_kinds/heatx.py +387 -0
  61. loadpath/evals/brief_kinds/lattice.py +571 -0
  62. loadpath/evals/brief_kinds/multimat.py +593 -0
  63. loadpath/evals/briefs/assets/bracket.step +1201 -0
  64. loadpath/evals/briefs/assets/desk_arm.urdf +22 -0
  65. loadpath/evals/briefs/assets/elbow-gearbox.stl +0 -0
  66. loadpath/evals/briefs/assets/motor-body.stl +0 -0
  67. loadpath/evals/briefs/assets/sketch.png +0 -0
  68. loadpath/evals/briefs/base-adapter-fdm.json +492 -0
  69. loadpath/evals/briefs/bell-crank-lpbf.json +180 -0
  70. loadpath/evals/briefs/belt-tensioner-fdm.json +151 -0
  71. loadpath/evals/briefs/camera-boom-mjf.json +339 -0
  72. loadpath/evals/briefs/camera-mount-pla.json +203 -0
  73. loadpath/evals/briefs/coolant-isolator-petg.json +100 -0
  74. loadpath/evals/briefs/elbow-bearing-bracket-sls.json +300 -0
  75. loadpath/evals/briefs/elbow-gearbox-forearm-mjf.json +558 -0
  76. loadpath/evals/briefs/elbow-link-fatigue-fdm.json +251 -0
  77. loadpath/evals/briefs/elbow-stop-pad-tpu.json +39 -0
  78. loadpath/evals/briefs/forearm-fdm.json +146 -0
  79. loadpath/evals/briefs/forearm-servo-link-fdm.json +327 -0
  80. loadpath/evals/briefs/grip-pad-finger-mm.json +354 -0
  81. loadpath/evals/briefs/gripper-bracket-creep-fdm.json +340 -0
  82. loadpath/evals/briefs/gripper-finger-fdm.json +155 -0
  83. loadpath/evals/briefs/gripper-jaw-fatigue-mjf.json +328 -0
  84. loadpath/evals/briefs/gripper-palm-fdm.json +715 -0
  85. loadpath/evals/briefs/hot-stepper-mount-asa-fdm.json +471 -0
  86. loadpath/evals/briefs/hpu-oil-cooler-lpbf.json +121 -0
  87. loadpath/evals/briefs/isolated-camera-mount-mm.json +675 -0
  88. loadpath/evals/briefs/kart-charge-cooler-lpbf.json +93 -0
  89. loadpath/evals/briefs/lighten-step-bracket.json +220 -0
  90. loadpath/evals/briefs/nema17-mount-stl.json +429 -0
  91. loadpath/evals/briefs/pillow-block-sls.json +220 -0
  92. loadpath/evals/briefs/polyjet-fingertip-mm.json +305 -0
  93. loadpath/evals/briefs/rod-hook-pla.json +154 -0
  94. loadpath/evals/briefs/sensor-arm-resin.json +150 -0
  95. loadpath/evals/briefs/shelf-bracket-pla.json +158 -0
  96. loadpath/evals/briefs/shoulder-riser-mjf.json +487 -0
  97. loadpath/evals/briefs/sketch-clevis.json +229 -0
  98. loadpath/evals/briefs/spring-bracket-pacf.json +294 -0
  99. loadpath/evals/briefs/tool-flange-ti64.json +280 -0
  100. loadpath/evals/briefs/tray-arm-lattice-fdm.json +260 -0
  101. loadpath/evals/briefs/turret-fdm.json +281 -0
  102. loadpath/evals/briefs/upper-arm-sls.json +179 -0
  103. loadpath/evals/briefs/urdf-forearm.json +233 -0
  104. loadpath/evals/briefs/wrist-link-mjf.json +278 -0
  105. loadpath/evals/briefs/wrist-yoke-mjf.json +245 -0
  106. loadpath/evals/briefs.py +393 -0
  107. loadpath/evals/cases/arm-link-cast.json +157 -0
  108. loadpath/evals/cases/arm-link-driven.json +171 -0
  109. loadpath/evals/cases/arm-link-sandwich.json +315 -0
  110. loadpath/evals/cases/arm-link.json +111 -0
  111. loadpath/evals/cases/bell-crank.json +116 -0
  112. loadpath/evals/cases/grip-turret.json +479 -0
  113. loadpath/evals/cases/grip-upper-arm.json +253 -0
  114. loadpath/evals/cases/grip-wrist-link-mjf.json +929 -0
  115. loadpath/evals/cases/grip-wrist-yoke.json +831 -0
  116. loadpath/evals/cases/lpbf-intercooler-core.json +59 -0
  117. loadpath/evals/cases/mbb-beam.json +61 -0
  118. loadpath/evals/cases/motor-body.stl +0 -0
  119. loadpath/evals/cases/motor-mount.json +265 -0
  120. loadpath/evals/cases/printed-hook.json +77 -0
  121. loadpath/evals/cases/wall-bracket-fasteners.json +125 -0
  122. loadpath/evals/cases/wall-bracket.json +126 -0
  123. loadpath/evals/corpus.py +179 -0
  124. loadpath/evals/pareto.py +90 -0
  125. loadpath/evals/run.py +860 -0
  126. loadpath/examples/arm-link.json +25 -0
  127. loadpath/examples/bumpered-bracket-compression.json +225 -0
  128. loadpath/examples/bumpered-bracket-lattice.json +204 -0
  129. loadpath/examples/bumpered-bracket.json +34 -0
  130. loadpath/examples/gripper-finger-mm.json +185 -0
  131. loadpath/examples/heat-exchanger-counterflow.json +21 -0
  132. loadpath/examples/heat-exchanger-crossflow-tuned.json +48 -0
  133. loadpath/examples/heat-exchanger-crossflow.json +20 -0
  134. loadpath/examples/pedal-lattice.json +23 -0
  135. loadpath/examples/pressure-plenum.json +12 -0
  136. loadpath/examples/shelf-bracket.json +27 -0
  137. loadpath/exchanger.py +831 -0
  138. loadpath/fasteners.py +199 -0
  139. loadpath/fem.py +668 -0
  140. loadpath/femops.py +70 -0
  141. loadpath/fieldjit.py +981 -0
  142. loadpath/fieldops.py +119 -0
  143. loadpath/fields.py +3697 -0
  144. loadpath/fieldtorch.py +464 -0
  145. loadpath/flow.py +984 -0
  146. loadpath/flowtopo.py +300 -0
  147. loadpath/gpu.py +521 -0
  148. loadpath/heatx.py +1067 -0
  149. loadpath/heatx_thermal.py +432 -0
  150. loadpath/homogenized.py +886 -0
  151. loadpath/ibrep.py +552 -0
  152. loadpath/impact.py +693 -0
  153. loadpath/infill.py +376 -0
  154. loadpath/interface_library.py +340 -0
  155. loadpath/interlock.py +186 -0
  156. loadpath/isolator.py +149 -0
  157. loadpath/knn.py +204 -0
  158. loadpath/lattice.py +1065 -0
  159. loadpath/lattice3mf.py +760 -0
  160. loadpath/lattice_buckling.py +245 -0
  161. loadpath/lattice_grade.py +325 -0
  162. loadpath/lattice_orient.py +595 -0
  163. loadpath/lattice_print.py +159 -0
  164. loadpath/lattice_tensors.py +558 -0
  165. loadpath/latticestep.py +1210 -0
  166. loadpath/manufacture.py +446 -0
  167. loadpath/material_library.py +489 -0
  168. loadpath/materials.py +144 -0
  169. loadpath/mcp_server.py +786 -0
  170. loadpath/mechanism.py +218 -0
  171. loadpath/mechanism_nl.py +811 -0
  172. loadpath/meshops.py +452 -0
  173. loadpath/mg.py +853 -0
  174. loadpath/mma.py +214 -0
  175. loadpath/modal.py +210 -0
  176. loadpath/multimat.py +1788 -0
  177. loadpath/narrowband.py +418 -0
  178. loadpath/nlkernel.py +241 -0
  179. loadpath/nonlinear.py +1095 -0
  180. loadpath/orient.py +334 -0
  181. loadpath/porous.py +994 -0
  182. loadpath/pressure.py +171 -0
  183. loadpath/preview.py +335 -0
  184. loadpath/printcheck.py +263 -0
  185. loadpath/printsetup.py +207 -0
  186. loadpath/processcheck.py +376 -0
  187. loadpath/quick.py +113 -0
  188. loadpath/recall.py +406 -0
  189. loadpath/reconstruct.py +797 -0
  190. loadpath/render.py +436 -0
  191. loadpath/resolved.py +189 -0
  192. loadpath/schema.py +1701 -0
  193. loadpath/sdf_kit.py +843 -0
  194. loadpath/selfx.py +292 -0
  195. loadpath/shapes.py +584 -0
  196. loadpath/sharp.py +717 -0
  197. loadpath/simp.py +1170 -0
  198. loadpath/sizing.py +312 -0
  199. loadpath/slicer.py +321 -0
  200. loadpath/spec.py +1072 -0
  201. loadpath/step.py +806 -0
  202. loadpath/struts.py +639 -0
  203. loadpath/study.py +1937 -0
  204. loadpath/tasks.py +822 -0
  205. loadpath/thermal.py +1691 -0
  206. loadpath/threemf.py +487 -0
  207. loadpath/tune.py +437 -0
  208. loadpath/validation.py +145 -0
  209. loadpath/verify.py +1215 -0
  210. loadpath/viewer.html +694 -0
  211. loadpath/viewer.py +446 -0
  212. loadpath/viscoelastic.py +106 -0
  213. loadpath/voxelprint.py +582 -0
  214. loadpath/voxels.py +402 -0
  215. loadpath-0.1.1.dist-info/METADATA +319 -0
  216. loadpath-0.1.1.dist-info/RECORD +220 -0
  217. loadpath-0.1.1.dist-info/WHEEL +5 -0
  218. loadpath-0.1.1.dist-info/entry_points.txt +2 -0
  219. loadpath-0.1.1.dist-info/licenses/LICENSE +21 -0
  220. loadpath-0.1.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "arm-link",
3
+ "description": "A robot arm link between two 22 mm bearings, 140 mm apart, with a cable channel through it: 1 kg at the wrist with a dynamic factor of 2, plus a side load. Printed in PA12 (SLS). Shows bores as keep-outs, a deflection-and-strength goal and symmetry.",
4
+ "designSpace": [{"type": "box", "min": [-16, -18, -12], "max": [156, 18, 12]}],
5
+ "preserve": [
6
+ {"id": "shoulder-boss", "shape": {"type": "cylinder", "center": [0, 0, 0], "axis": "z", "length": 24, "r": 16}},
7
+ {"id": "wrist-boss", "shape": {"type": "cylinder", "center": [140, 0, 0], "axis": "z", "length": 24, "r": 15}}
8
+ ],
9
+ "keepOut": [
10
+ {"id": "shoulder-bearing", "shape": {"type": "cylinder", "center": [0, 0, 0], "axis": "z", "length": 30, "r": 11}},
11
+ {"id": "wrist-bearing", "shape": {"type": "cylinder", "center": [140, 0, 0], "axis": "z", "length": 30, "r": 11}},
12
+ {"id": "cable-channel", "shape": {"type": "cylinder", "p0": [30, 0, 0], "p1": [110, 0, 0], "r": 5}}
13
+ ],
14
+ "supports": [{"region": "shoulder-bearing"}],
15
+ "loadCases": [
16
+ {"name": "payload", "loads": [{"region": "wrist-bearing", "force": [0, -20, 0], "distribution": "bearing"}]},
17
+ {"name": "side", "loads": [{"region": "wrist-bearing", "force": [0, 0, 8]}]}
18
+ ],
19
+ "material": "pa12",
20
+ "process": "sls",
21
+ "goal": {"safetyFactor": 3.0, "maxDeflection": 0.5},
22
+ "minMember": 3.0,
23
+ "symmetry": ["z"],
24
+ "resolution": {"maxElements": 40000}
25
+ }
@@ -0,0 +1,225 @@
1
+ {
2
+ "name": "bumpered-bracket-compression",
3
+ "description": "The bumpered bracket with its bumper's rubber in compression: a PETG nose plate takes the knock and every path from it to the arm runs through TPU (cells within 15 mm of the nose), with a gap keeping the shelf pad off the nose. The knock (0.2 J) is judged at its own safety factor of 1.5. Does not pass yet: the bond at the rubber block's edges reads 0.57 at the knock (see docs/MULTIMATERIAL.md).",
4
+ "designSpace": [
5
+ {
6
+ "type": "box",
7
+ "min": [
8
+ 0,
9
+ 0,
10
+ -15
11
+ ],
12
+ "max": [
13
+ 100,
14
+ 80,
15
+ 15
16
+ ]
17
+ }
18
+ ],
19
+ "fasteners": [
20
+ {
21
+ "id": "upper",
22
+ "size": "M5",
23
+ "seat": [
24
+ 6,
25
+ 65,
26
+ 0
27
+ ],
28
+ "direction": "-x",
29
+ "grip": 6,
30
+ "end": "face"
31
+ },
32
+ {
33
+ "id": "lower",
34
+ "size": "M5",
35
+ "seat": [
36
+ 6,
37
+ 15,
38
+ 0
39
+ ],
40
+ "direction": "-x",
41
+ "grip": 6,
42
+ "end": "face"
43
+ }
44
+ ],
45
+ "preserve": [
46
+ {
47
+ "id": "shelf-pad",
48
+ "shape": {
49
+ "type": "box",
50
+ "min": [
51
+ 60,
52
+ 76,
53
+ -15
54
+ ],
55
+ "max": [
56
+ 92,
57
+ 80,
58
+ 15
59
+ ]
60
+ }
61
+ },
62
+ {
63
+ "id": "nose",
64
+ "shape": {
65
+ "type": "box",
66
+ "min": [
67
+ 97,
68
+ 40,
69
+ -15
70
+ ],
71
+ "max": [
72
+ 100,
73
+ 80,
74
+ 15
75
+ ]
76
+ }
77
+ }
78
+ ],
79
+ "supports": [
80
+ {
81
+ "region": "upper-bore",
82
+ "fix": "yz"
83
+ },
84
+ {
85
+ "region": "lower-bore",
86
+ "fix": "yz"
87
+ },
88
+ {
89
+ "shape": {
90
+ "type": "box",
91
+ "min": [
92
+ 0,
93
+ 0,
94
+ -15
95
+ ],
96
+ "max": [
97
+ 1,
98
+ 80,
99
+ 15
100
+ ]
101
+ },
102
+ "fix": "x"
103
+ }
104
+ ],
105
+ "loadCases": [
106
+ {
107
+ "name": "shelf",
108
+ "loads": [
109
+ {
110
+ "region": "shelf-pad",
111
+ "force": [
112
+ 0,
113
+ -100,
114
+ 0
115
+ ]
116
+ }
117
+ ]
118
+ },
119
+ {
120
+ "name": "pull",
121
+ "loads": [
122
+ {
123
+ "region": "shelf-pad",
124
+ "force": [
125
+ 0,
126
+ -40,
127
+ 15
128
+ ]
129
+ }
130
+ ]
131
+ },
132
+ {
133
+ "name": "knock",
134
+ "loads": [
135
+ {
136
+ "shape": {
137
+ "type": "box",
138
+ "min": [
139
+ 99.5,
140
+ 40,
141
+ -15
142
+ ],
143
+ "max": [
144
+ 100,
145
+ 80,
146
+ 15
147
+ ]
148
+ },
149
+ "force": [
150
+ -100,
151
+ 0,
152
+ 0
153
+ ]
154
+ }
155
+ ]
156
+ }
157
+ ],
158
+ "process": {
159
+ "type": "fdm",
160
+ "buildDirection": "+z"
161
+ },
162
+ "multiMaterial": {
163
+ "materials": [
164
+ "petg",
165
+ "tpu"
166
+ ],
167
+ "assign": [
168
+ {
169
+ "region": "shelf-pad",
170
+ "material": "petg"
171
+ },
172
+ {
173
+ "region": "nose",
174
+ "material": "petg"
175
+ },
176
+ {
177
+ "near": {
178
+ "region": "nose",
179
+ "distance": 15
180
+ },
181
+ "material": "tpu"
182
+ }
183
+ ],
184
+ "requirements": [
185
+ {
186
+ "case": "knock",
187
+ "knock": {
188
+ "energy": 0.2,
189
+ "maxForce": 150,
190
+ "safetyFactor": 1.5
191
+ }
192
+ }
193
+ ],
194
+ "interlock": true,
195
+ "export": {
196
+ "slicer": "all"
197
+ }
198
+ },
199
+ "goal": {
200
+ "volumeFraction": 0.35,
201
+ "safetyFactor": 3.0
202
+ },
203
+ "minMember": 4.0,
204
+ "resolution": {
205
+ "maxElements": 20000
206
+ },
207
+ "keepOut": [
208
+ {
209
+ "id": "nose-gap",
210
+ "shape": {
211
+ "type": "box",
212
+ "min": [
213
+ 92,
214
+ 70,
215
+ -15
216
+ ],
217
+ "max": [
218
+ 97,
219
+ 80,
220
+ 15
221
+ ]
222
+ }
223
+ }
224
+ ]
225
+ }
@@ -0,0 +1,204 @@
1
+ {
2
+ "name": "bumpered-bracket-lattice-arm",
3
+ "description": "The bumpered bracket with a crushable bumper: the PETG arm optimized here carries the shelf (10 kg, factor 3) and the knock as the TPU gyroid pad's force on its seat (150 N, the limit; the graded pad peaks at 89 N). The pad is examples/impact/bracket-bumper.json (x 89..97), the striker plate a 3 mm PETG plate on the nose (x 97..100). See docs/MULTIMATERIAL.md.",
4
+ "designSpace": [
5
+ {
6
+ "type": "box",
7
+ "min": [
8
+ 0,
9
+ 0,
10
+ -15
11
+ ],
12
+ "max": [
13
+ 100,
14
+ 80,
15
+ 15
16
+ ]
17
+ }
18
+ ],
19
+ "fasteners": [
20
+ {
21
+ "id": "upper",
22
+ "size": "M5",
23
+ "seat": [
24
+ 6,
25
+ 65,
26
+ 0
27
+ ],
28
+ "direction": "-x",
29
+ "grip": 6,
30
+ "end": "face"
31
+ },
32
+ {
33
+ "id": "lower",
34
+ "size": "M5",
35
+ "seat": [
36
+ 6,
37
+ 15,
38
+ 0
39
+ ],
40
+ "direction": "-x",
41
+ "grip": 6,
42
+ "end": "face"
43
+ }
44
+ ],
45
+ "preserve": [
46
+ {
47
+ "id": "shelf-pad",
48
+ "shape": {
49
+ "type": "box",
50
+ "min": [
51
+ 60,
52
+ 76,
53
+ -15
54
+ ],
55
+ "max": [
56
+ 92,
57
+ 80,
58
+ 15
59
+ ]
60
+ }
61
+ },
62
+ {
63
+ "id": "pad-seat",
64
+ "shape": {
65
+ "type": "box",
66
+ "min": [
67
+ 86,
68
+ 46,
69
+ -10
70
+ ],
71
+ "max": [
72
+ 89,
73
+ 74,
74
+ 10
75
+ ]
76
+ }
77
+ }
78
+ ],
79
+ "supports": [
80
+ {
81
+ "region": "upper-bore",
82
+ "fix": "yz"
83
+ },
84
+ {
85
+ "region": "lower-bore",
86
+ "fix": "yz"
87
+ },
88
+ {
89
+ "shape": {
90
+ "type": "box",
91
+ "min": [
92
+ 0,
93
+ 0,
94
+ -15
95
+ ],
96
+ "max": [
97
+ 1,
98
+ 80,
99
+ 15
100
+ ]
101
+ },
102
+ "fix": "x"
103
+ }
104
+ ],
105
+ "loadCases": [
106
+ {
107
+ "name": "shelf",
108
+ "loads": [
109
+ {
110
+ "region": "shelf-pad",
111
+ "force": [
112
+ 0,
113
+ -100,
114
+ 0
115
+ ]
116
+ }
117
+ ]
118
+ },
119
+ {
120
+ "name": "pull",
121
+ "loads": [
122
+ {
123
+ "region": "shelf-pad",
124
+ "force": [
125
+ 0,
126
+ -40,
127
+ 15
128
+ ]
129
+ }
130
+ ]
131
+ },
132
+ {
133
+ "name": "knock",
134
+ "loads": [
135
+ {
136
+ "shape": {
137
+ "type": "box",
138
+ "min": [
139
+ 88.5,
140
+ 48,
141
+ -8
142
+ ],
143
+ "max": [
144
+ 89,
145
+ 72,
146
+ 8
147
+ ]
148
+ },
149
+ "force": [
150
+ -150,
151
+ 0,
152
+ 0
153
+ ]
154
+ }
155
+ ]
156
+ }
157
+ ],
158
+ "process": {
159
+ "type": "fdm",
160
+ "buildDirection": "+z"
161
+ },
162
+ "goal": {
163
+ "safetyFactor": 3.0
164
+ },
165
+ "minMember": 4.0,
166
+ "resolution": {
167
+ "maxElements": 20000
168
+ },
169
+ "material": "petg",
170
+ "keepOut": [
171
+ {
172
+ "id": "bumper",
173
+ "shape": {
174
+ "type": "box",
175
+ "min": [
176
+ 89,
177
+ 0,
178
+ -15
179
+ ],
180
+ "max": [
181
+ 100,
182
+ 74,
183
+ 15
184
+ ]
185
+ }
186
+ },
187
+ {
188
+ "id": "nose-gap",
189
+ "shape": {
190
+ "type": "box",
191
+ "min": [
192
+ 92,
193
+ 74,
194
+ -15
195
+ ],
196
+ "max": [
197
+ 100,
198
+ 80,
199
+ 15
200
+ ]
201
+ }
202
+ }
203
+ ]
204
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "bumpered-bracket",
3
+ "description": "The PETG shelf bracket with a bumper: two M5 screws into the wall, 10 kg of shelf load with a factor of 3, and a knock on the bracket's nose (0.2 J, a 1 kg tool swung at 0.63 m/s) that must stop under 150 N. Printed on a two-material FDM printer (Bambu AMS) in PETG and TPU 95A: the optimizer chooses where each goes. Shows multiMaterial, a knock requirement and interface strength.",
4
+ "designSpace": [{"type": "box", "min": [0, 0, -15], "max": [100, 80, 15]}],
5
+ "fasteners": [
6
+ {"id": "upper", "size": "M5", "seat": [6, 65, 0], "direction": "-x", "grip": 6, "end": "face"},
7
+ {"id": "lower", "size": "M5", "seat": [6, 15, 0], "direction": "-x", "grip": 6, "end": "face"}
8
+ ],
9
+ "preserve": [
10
+ {"id": "shelf-pad", "shape": {"type": "box", "min": [60, 76, -15], "max": [96, 80, 15]}},
11
+ {"id": "nose", "shape": {"type": "box", "min": [97, 40, -15], "max": [100, 80, 15]}}
12
+ ],
13
+ "supports": [
14
+ {"region": "upper-bore", "fix": "yz"},
15
+ {"region": "lower-bore", "fix": "yz"},
16
+ {"shape": {"type": "box", "min": [0, 0, -15], "max": [1, 80, 15]}, "fix": "x"}
17
+ ],
18
+ "loadCases": [
19
+ {"name": "shelf", "loads": [{"region": "shelf-pad", "force": [0, -100, 0]}]},
20
+ {"name": "pull", "loads": [{"region": "shelf-pad", "force": [0, -40, 15]}]},
21
+ {"name": "knock", "loads": [{"shape": {"type": "box", "min": [99.5, 40, -15], "max": [100, 80, 15]}, "force": [-100, 0, 0]}]}
22
+ ],
23
+ "process": {"type": "fdm", "buildDirection": "+z"},
24
+ "multiMaterial": {
25
+ "materials": ["petg", "tpu"],
26
+ "assign": [{"region": "shelf-pad", "material": "petg"}],
27
+ "requirements": [{"case": "knock", "knock": {"energy": 0.2, "maxForce": 150}}],
28
+ "interlock": true,
29
+ "export": {"slicer": "all"}
30
+ },
31
+ "goal": {"volumeFraction": 0.2, "safetyFactor": 3.0},
32
+ "minMember": 4.0,
33
+ "resolution": {"maxElements": 20000}
34
+ }
@@ -0,0 +1,185 @@
1
+ {
2
+ "name": "gripper-finger",
3
+ "description": "A GRIP-like gripper finger, 70 x 16 x 12 mm, pinned at its base, printed in PETG and TPU 95A on a two-material FDM printer. The 2.5 mm TPU contact pad is placed by a distance field from the gripping face; the optimizer designs the stiff core behind it and chooses the material of everything else. Grip: 20 N squeeze over the 40 mm face. Pull: the squeeze plus 10 N of friction along the face, the load that peels a pad off its core. Shows multiMaterial with an assigned pad and a shear-loaded bond.",
4
+ "designSpace": [
5
+ {
6
+ "type": "box",
7
+ "min": [
8
+ 0,
9
+ -8,
10
+ -6
11
+ ],
12
+ "max": [
13
+ 70,
14
+ 8,
15
+ 6
16
+ ]
17
+ }
18
+ ],
19
+ "preserve": [
20
+ {
21
+ "id": "base-boss",
22
+ "shape": {
23
+ "type": "cylinder",
24
+ "center": [
25
+ 6,
26
+ 0,
27
+ 0
28
+ ],
29
+ "axis": "z",
30
+ "length": 12,
31
+ "r": 5.5
32
+ }
33
+ },
34
+ {
35
+ "id": "pad",
36
+ "shape": {
37
+ "type": "box",
38
+ "min": [
39
+ 30,
40
+ 5.5,
41
+ -6
42
+ ],
43
+ "max": [
44
+ 70,
45
+ 8,
46
+ 6
47
+ ]
48
+ }
49
+ }
50
+ ],
51
+ "keepOut": [
52
+ {
53
+ "id": "pin",
54
+ "shape": {
55
+ "type": "cylinder",
56
+ "center": [
57
+ 6,
58
+ 0,
59
+ 0
60
+ ],
61
+ "axis": "z",
62
+ "length": 14,
63
+ "r": 2.6
64
+ }
65
+ }
66
+ ],
67
+ "supports": [
68
+ {
69
+ "region": "pin"
70
+ },
71
+ {
72
+ "shape": {
73
+ "type": "box",
74
+ "min": [
75
+ 0,
76
+ -8,
77
+ -6
78
+ ],
79
+ "max": [
80
+ 1,
81
+ 8,
82
+ 6
83
+ ]
84
+ },
85
+ "fix": "y"
86
+ }
87
+ ],
88
+ "loadCases": [
89
+ {
90
+ "name": "grip",
91
+ "loads": [
92
+ {
93
+ "shape": {
94
+ "type": "box",
95
+ "min": [
96
+ 30,
97
+ 7.9,
98
+ -6
99
+ ],
100
+ "max": [
101
+ 70,
102
+ 8,
103
+ 6
104
+ ]
105
+ },
106
+ "force": [
107
+ 0,
108
+ -20,
109
+ 0
110
+ ]
111
+ }
112
+ ]
113
+ },
114
+ {
115
+ "name": "pull",
116
+ "loads": [
117
+ {
118
+ "shape": {
119
+ "type": "box",
120
+ "min": [
121
+ 30,
122
+ 7.9,
123
+ -6
124
+ ],
125
+ "max": [
126
+ 70,
127
+ 8,
128
+ 6
129
+ ]
130
+ },
131
+ "force": [
132
+ -10,
133
+ -20,
134
+ 0
135
+ ]
136
+ }
137
+ ],
138
+ "weight": 0.5
139
+ }
140
+ ],
141
+ "process": {
142
+ "type": "fdm",
143
+ "buildDirection": "+z"
144
+ },
145
+ "multiMaterial": {
146
+ "materials": [
147
+ "petg",
148
+ "tpu"
149
+ ],
150
+ "assign": [
151
+ {
152
+ "region": "base-boss",
153
+ "material": "petg"
154
+ },
155
+ {
156
+ "near": {
157
+ "shape": {
158
+ "type": "box",
159
+ "min": [
160
+ 30,
161
+ 8,
162
+ -6
163
+ ],
164
+ "max": [
165
+ 70,
166
+ 9,
167
+ 6
168
+ ]
169
+ },
170
+ "distance": 2.5
171
+ },
172
+ "material": "tpu"
173
+ }
174
+ ],
175
+ "interlock": true
176
+ },
177
+ "goal": {
178
+ "volumeFraction": 0.4,
179
+ "safetyFactor": 2.0
180
+ },
181
+ "minMember": 2.0,
182
+ "resolution": {
183
+ "pitch": 0.8
184
+ }
185
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "oil-cooler",
3
+ "description": "A cylindrical counterflow oil-to-water cooler: a 40 mm x 60 mm gyroid core, oil through the end caps, water in and out through the side. Prints upright on FDM without supports. Rated for 1 L/min of 80 °C oil against 2 L/min of 20 °C water.",
4
+ "core": {"type": "cylinder", "center": [0, 0, 30], "axis": "z", "length": 60, "r": 20},
5
+ "type": "gyroid",
6
+ "layout": "counter",
7
+ "axes": "zx",
8
+ "fluids": ["oil", "water"],
9
+ "cell": 8,
10
+ "wall": 1.0,
11
+ "header": 5,
12
+ "portDiameter": 6,
13
+ "portLength": 6,
14
+ "build": "z",
15
+ "step": 0.4,
16
+ "duty": {
17
+ "oil": {"fluid": "oil", "lPerMin": 1.0, "tIn": 80},
18
+ "water": {"fluid": "water", "lPerMin": 2.0, "tIn": 20},
19
+ "wall": "petg"
20
+ }
21
+ }