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,59 @@
1
+ {
2
+ "name": "lpbf-intercooler-core",
3
+ "description": "A small air-to-coolant intercooler core printed in AlSi10Mg by laser powder-bed fusion, built along +z: hot boost air across x, 50% glycol across y. Nothing inside a metal part can be supported, so the internal flat ceiling must stay near zero; each fluid gets one plugged powder clean-out.",
4
+ "core": {
5
+ "type": "box",
6
+ "min": [
7
+ 0,
8
+ 0,
9
+ 0
10
+ ],
11
+ "max": [
12
+ 48,
13
+ 36,
14
+ 30
15
+ ]
16
+ },
17
+ "type": "gyroid",
18
+ "layout": "cross",
19
+ "axes": "xy",
20
+ "fluids": [
21
+ "air",
22
+ "coolant"
23
+ ],
24
+ "cell": 8,
25
+ "wall": 1.0,
26
+ "shell": 1.6,
27
+ "header": 8,
28
+ "portDiameter": 12,
29
+ "portLength": 6,
30
+ "build": "z",
31
+ "process": "lpbf",
32
+ "cleanouts": 1,
33
+ "step": 0.45,
34
+ "duty": {
35
+ "air": {
36
+ "fluid": "air",
37
+ "kgPerS": 0.006,
38
+ "tIn": 150
39
+ },
40
+ "coolant": {
41
+ "fluid": "glycol50",
42
+ "lPerMin": 4,
43
+ "tIn": 40
44
+ },
45
+ "wall": "alsi10mg"
46
+ },
47
+ "expect": {
48
+ "maxMass": 140,
49
+ "minWallBetweenFluids": 0.9,
50
+ "maxInternalFlatArea": 200,
51
+ "maxTrappedVolume": 5,
52
+ "minEffectiveness": 0.7,
53
+ "maxPressureDrop": {
54
+ "air": 20000,
55
+ "coolant": 2000
56
+ },
57
+ "maxSeconds": 300
58
+ }
59
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "mbb-beam",
3
+ "description": "Textbook sanity case: a simply supported beam (pinned left, roller right) with a centre load. The optimum is a well-known truss; this case guards against regressions in the solver itself. It is the planar textbook problem, so buckling is reported, not required: nothing holds the 12 mm wide truss sideways, and the light designs sway out of plane at under half the load (0.34x, 0.42x with the roller held sideways too).",
4
+ "designSpace": [
5
+ {
6
+ "type": "box",
7
+ "min": [0, 0, 0],
8
+ "max": [180, 12, 30]
9
+ }
10
+ ],
11
+ "supports": [
12
+ {
13
+ "shape": {
14
+ "type": "box",
15
+ "min": [-1, -1, -1],
16
+ "max": [4, 13, 0.3]
17
+ }
18
+ },
19
+ {
20
+ "shape": {
21
+ "type": "box",
22
+ "min": [176, -1, -1],
23
+ "max": [181, 13, 0.3]
24
+ },
25
+ "fix": "z"
26
+ }
27
+ ],
28
+ "loadCases": [
29
+ {
30
+ "name": "centre",
31
+ "loads": [
32
+ {
33
+ "shape": {
34
+ "type": "box",
35
+ "min": [87, -1, 29.7],
36
+ "max": [93, 13, 31]
37
+ },
38
+ "force": [0, 0, -400]
39
+ }
40
+ ]
41
+ }
42
+ ],
43
+ "material": "pa12",
44
+ "goal": {
45
+ "safetyFactor": 1.5,
46
+ "volumeFraction": 0.3,
47
+ "buckling": false
48
+ },
49
+ "symmetry": [
50
+ "x",
51
+ "y"
52
+ ],
53
+ "resolution": {
54
+ "maxElements": 30000
55
+ },
56
+ "expect": {
57
+ "bodies": 1,
58
+ "minSafetyFactor": 1.5,
59
+ "minMassReduction": 0.4
60
+ }
61
+ }
Binary file
@@ -0,0 +1,265 @@
1
+ {
2
+ "name": "motor-mount",
3
+ "description": "NEMA 17 stepper bracket. Only the interfaces are fixed: pads round the four M3 holes on a 31mm square and a locating ring round the 22mm pilot on the motor face, and bosses round two M4 holes in the base. The motor body (an STL, as an agent would hand over modeled geometry) and screwdriver access above the M4 bosses are keep-outs. Belt tension pulls the motor sideways or up; returns a 20/30/45% trade-off gallery.",
4
+ "designSpace": [
5
+ {
6
+ "type": "box",
7
+ "min": [-25, 0, 0],
8
+ "max": [25, 50, 62]
9
+ }
10
+ ],
11
+ "preserve": [
12
+ {
13
+ "id": "pad-a",
14
+ "shape": {
15
+ "type": "cylinder",
16
+ "p0": [15.5, 0, 50.5],
17
+ "p1": [15.5, 5, 50.5],
18
+ "r": 4.5
19
+ }
20
+ },
21
+ {
22
+ "id": "pad-b",
23
+ "shape": {
24
+ "type": "cylinder",
25
+ "p0": [-15.5, 0, 50.5],
26
+ "p1": [-15.5, 5, 50.5],
27
+ "r": 4.5
28
+ }
29
+ },
30
+ {
31
+ "id": "pad-c",
32
+ "shape": {
33
+ "type": "cylinder",
34
+ "p0": [15.5, 0, 19.5],
35
+ "p1": [15.5, 5, 19.5],
36
+ "r": 4.5
37
+ }
38
+ },
39
+ {
40
+ "id": "pad-d",
41
+ "shape": {
42
+ "type": "cylinder",
43
+ "p0": [-15.5, 0, 19.5],
44
+ "p1": [-15.5, 5, 19.5],
45
+ "r": 4.5
46
+ }
47
+ },
48
+ {
49
+ "id": "pilot-ring",
50
+ "shape": {
51
+ "type": "cylinder",
52
+ "p0": [0, 0, 35],
53
+ "p1": [0, 5, 35],
54
+ "r": 14.5,
55
+ "rInner": 11.5
56
+ }
57
+ },
58
+ {
59
+ "id": "boss-a",
60
+ "shape": {
61
+ "type": "cylinder",
62
+ "p0": [15, 35, 0],
63
+ "p1": [15, 35, 5],
64
+ "r": 6
65
+ }
66
+ },
67
+ {
68
+ "id": "boss-b",
69
+ "shape": {
70
+ "type": "cylinder",
71
+ "p0": [-15, 35, 0],
72
+ "p1": [-15, 35, 5],
73
+ "r": 6
74
+ }
75
+ }
76
+ ],
77
+ "keepOut": [
78
+ {
79
+ "id": "pilot",
80
+ "shape": {
81
+ "type": "cylinder",
82
+ "center": [0, 2.5, 35],
83
+ "axis": "y",
84
+ "length": 20,
85
+ "r": 11.5
86
+ }
87
+ },
88
+ {
89
+ "id": "m3-a",
90
+ "shape": {
91
+ "type": "cylinder",
92
+ "center": [15.5, 2.5, 50.5],
93
+ "axis": "y",
94
+ "length": 20,
95
+ "r": 1.7
96
+ }
97
+ },
98
+ {
99
+ "id": "m3-b",
100
+ "shape": {
101
+ "type": "cylinder",
102
+ "center": [-15.5, 2.5, 50.5],
103
+ "axis": "y",
104
+ "length": 20,
105
+ "r": 1.7
106
+ }
107
+ },
108
+ {
109
+ "id": "m3-c",
110
+ "shape": {
111
+ "type": "cylinder",
112
+ "center": [15.5, 2.5, 19.5],
113
+ "axis": "y",
114
+ "length": 20,
115
+ "r": 1.7
116
+ }
117
+ },
118
+ {
119
+ "id": "m3-d",
120
+ "shape": {
121
+ "type": "cylinder",
122
+ "center": [-15.5, 2.5, 19.5],
123
+ "axis": "y",
124
+ "length": 20,
125
+ "r": 1.7
126
+ }
127
+ },
128
+ {
129
+ "id": "m4-a",
130
+ "shape": {
131
+ "type": "cylinder",
132
+ "center": [15, 35, 2.5],
133
+ "axis": "z",
134
+ "length": 20,
135
+ "r": 2.2
136
+ }
137
+ },
138
+ {
139
+ "id": "m4-b",
140
+ "shape": {
141
+ "type": "cylinder",
142
+ "center": [-15, 35, 2.5],
143
+ "axis": "z",
144
+ "length": 20,
145
+ "r": 2.2
146
+ }
147
+ },
148
+ {
149
+ "id": "motor-body",
150
+ "shape": {
151
+ "type": "mesh",
152
+ "path": "motor-body.stl"
153
+ }
154
+ },
155
+ {
156
+ "id": "access-a",
157
+ "shape": {
158
+ "type": "cylinder",
159
+ "p0": [15, 35, 5],
160
+ "p1": [15, 35, 62],
161
+ "r": 4.5
162
+ }
163
+ },
164
+ {
165
+ "id": "access-b",
166
+ "shape": {
167
+ "type": "cylinder",
168
+ "p0": [-15, 35, 5],
169
+ "p1": [-15, 35, 62],
170
+ "r": 4.5
171
+ }
172
+ }
173
+ ],
174
+ "supports": [
175
+ {
176
+ "region": "m4-a"
177
+ },
178
+ {
179
+ "region": "m4-b"
180
+ },
181
+ {
182
+ "shape": {
183
+ "type": "cylinder",
184
+ "p0": [15, 35, -1],
185
+ "p1": [15, 35, 0.3],
186
+ "r": 6
187
+ },
188
+ "fix": "z"
189
+ },
190
+ {
191
+ "shape": {
192
+ "type": "cylinder",
193
+ "p0": [-15, 35, -1],
194
+ "p1": [-15, 35, 0.3],
195
+ "r": 6
196
+ },
197
+ "fix": "z"
198
+ }
199
+ ],
200
+ "loadCases": [
201
+ {
202
+ "name": "belt-side",
203
+ "loads": [
204
+ {
205
+ "region": "m3-a",
206
+ "force": [25, 0, 0]
207
+ },
208
+ {
209
+ "region": "m3-b",
210
+ "force": [25, 0, 0]
211
+ },
212
+ {
213
+ "region": "m3-c",
214
+ "force": [25, 0, 0]
215
+ },
216
+ {
217
+ "region": "m3-d",
218
+ "force": [25, 0, 0]
219
+ }
220
+ ]
221
+ },
222
+ {
223
+ "name": "belt-up",
224
+ "loads": [
225
+ {
226
+ "region": "m3-a",
227
+ "force": [0, 0, 25]
228
+ },
229
+ {
230
+ "region": "m3-b",
231
+ "force": [0, 0, 25]
232
+ },
233
+ {
234
+ "region": "m3-c",
235
+ "force": [0, 0, 25]
236
+ },
237
+ {
238
+ "region": "m3-d",
239
+ "force": [0, 0, 25]
240
+ }
241
+ ]
242
+ }
243
+ ],
244
+ "material": "petg",
245
+ "goal": {
246
+ "volumeFraction": 0.3,
247
+ "outcomes": [0.2, 0.45]
248
+ },
249
+ "minMember": 3.0,
250
+ "symmetry": [
251
+ "x"
252
+ ],
253
+ "resolution": {
254
+ "maxElements": 45000
255
+ },
256
+ "expect": {
257
+ "minMassReduction": 0.6,
258
+ "minSafetyFactor": 2.0,
259
+ "maxDeflection": 0.5,
260
+ "maxKeepOutIntrusion": 1.0,
261
+ "maxPreserveMissing": 1.0,
262
+ "bodies": 1,
263
+ "minMemberAtLeast": 2.0
264
+ }
265
+ }
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "printed-hook",
3
+ "description": "Wall hook printed upright (layers along +z) with no support material, fixed to the wall over its back face; an eye with a 7mm pin 92mm out carries 300N. Only the eye is preserved. Overhang control must keep the optimizer's own surfaces self-supporting at 45 degrees; the eye's underside is the user's geometry and does not count.",
4
+ "designSpace": [
5
+ {
6
+ "type": "box",
7
+ "min": [0, -10, 0],
8
+ "max": [100, 10, 60]
9
+ }
10
+ ],
11
+ "preserve": [
12
+ {
13
+ "id": "eye",
14
+ "shape": {
15
+ "type": "cylinder",
16
+ "center": [92, 0, 30],
17
+ "axis": "y",
18
+ "length": 20,
19
+ "r": 7
20
+ }
21
+ }
22
+ ],
23
+ "keepOut": [
24
+ {
25
+ "id": "pin",
26
+ "shape": {
27
+ "type": "cylinder",
28
+ "center": [92, 0, 30],
29
+ "axis": "y",
30
+ "length": 30,
31
+ "r": 3.5
32
+ }
33
+ }
34
+ ],
35
+ "supports": [
36
+ {
37
+ "shape": {
38
+ "type": "box",
39
+ "min": [-1, -11, -1],
40
+ "max": [0.5, 11, 61]
41
+ }
42
+ }
43
+ ],
44
+ "loadCases": [
45
+ {
46
+ "name": "hang",
47
+ "loads": [
48
+ {
49
+ "region": "pin",
50
+ "force": [0, 0, -300]
51
+ }
52
+ ]
53
+ }
54
+ ],
55
+ "material": "petg",
56
+ "printDirection": "+z",
57
+ "goal": {
58
+ "safetyFactor": 2.5,
59
+ "volumeFraction": 0.2
60
+ },
61
+ "minMember": 3.0,
62
+ "symmetry": [
63
+ "y"
64
+ ],
65
+ "resolution": {
66
+ "maxElements": 25000
67
+ },
68
+ "expect": {
69
+ "minSafetyFactor": 2.5,
70
+ "minMassReduction": 0.6,
71
+ "maxOverhangFraction": 0.04,
72
+ "maxKeepOutIntrusion": 1.0,
73
+ "maxPreserveMissing": 1.0,
74
+ "bodies": 1,
75
+ "minMemberAtLeast": 2.4
76
+ }
77
+ }
@@ -0,0 +1,125 @@
1
+ {
2
+ "name": "wall-bracket-fasteners",
3
+ "description": "The wall bracket with its screws as fasteners: seat and wall-face rings preserved, not solid bosses, and a preload case. The screws hold the bores across (yz) only; along the screw the joint is the preload and the wall.",
4
+ "designSpace": [
5
+ {
6
+ "type": "box",
7
+ "min": [
8
+ 0,
9
+ -15,
10
+ -100
11
+ ],
12
+ "max": [
13
+ 120,
14
+ 15,
15
+ 0
16
+ ]
17
+ }
18
+ ],
19
+ "preserve": [],
20
+ "keepOut": [],
21
+ "supports": [
22
+ {
23
+ "region": "top-bore",
24
+ "fix": "yz"
25
+ },
26
+ {
27
+ "region": "bottom-bore",
28
+ "fix": "yz"
29
+ },
30
+ {
31
+ "shape": {
32
+ "type": "box",
33
+ "min": [
34
+ -1,
35
+ -16,
36
+ -101
37
+ ],
38
+ "max": [
39
+ 0.3,
40
+ 16,
41
+ 1
42
+ ]
43
+ },
44
+ "fix": "x"
45
+ }
46
+ ],
47
+ "loadCases": [
48
+ {
49
+ "name": "shelf",
50
+ "loads": [
51
+ {
52
+ "shape": {
53
+ "type": "box",
54
+ "min": [
55
+ 10,
56
+ -16,
57
+ -1.5
58
+ ],
59
+ "max": [
60
+ 121,
61
+ 16,
62
+ 1
63
+ ]
64
+ },
65
+ "force": [
66
+ 0,
67
+ 0,
68
+ -150
69
+ ]
70
+ }
71
+ ]
72
+ }
73
+ ],
74
+ "material": "pla",
75
+ "goal": {
76
+ "safetyFactor": 2.5,
77
+ "volumeFraction": 0.15
78
+ },
79
+ "minMember": 4.0,
80
+ "symmetry": [
81
+ "y"
82
+ ],
83
+ "resolution": {
84
+ "maxElements": 40000
85
+ },
86
+ "expect": {
87
+ "minSafetyFactor": 2.5,
88
+ "maxDeflection": 1.5,
89
+ "maxKeepOutIntrusion": 1.0,
90
+ "maxPreserveMissing": 1.0,
91
+ "bodies": 1,
92
+ "minMemberAtLeast": 3.0,
93
+ "minMassReduction": 0.6,
94
+ "maxClosedBores": 0,
95
+ "coarse": {
96
+ "skip": "fastener contact makes it the slowest case (6 min coarse) and its 2.5 mm load pad is lost below ~10k cells"
97
+ }
98
+ },
99
+ "fasteners": [
100
+ {
101
+ "id": "top",
102
+ "size": "M5",
103
+ "seat": [
104
+ 6,
105
+ 0,
106
+ -20
107
+ ],
108
+ "direction": "-x",
109
+ "grip": 6,
110
+ "end": "face"
111
+ },
112
+ {
113
+ "id": "bottom",
114
+ "size": "M5",
115
+ "seat": [
116
+ 6,
117
+ 0,
118
+ -85
119
+ ],
120
+ "direction": "-x",
121
+ "grip": 6,
122
+ "end": "face"
123
+ }
124
+ ]
125
+ }
@@ -0,0 +1,126 @@
1
+ {
2
+ "name": "wall-bracket",
3
+ "description": "Shelf bracket: 120mm deep, 100mm tall, 30mm wide, screwed to a wall with two M5 screws. Only the interfaces are fixed: bosses round the screws. The shelf board rests on the top edge (150N, a loaded 30kg shelf on two brackets with margin) and the wall can push back on the back face; where the bracket touches either is the optimizer's choice. Each screw needs a clear path for its head, washer and driver from the boss face out through the bracket (head-* keep-outs: M5 pan head and washer, 11mm).",
4
+ "designSpace": [
5
+ {
6
+ "type": "box",
7
+ "min": [0, -15, -100],
8
+ "max": [120, 15, 0]
9
+ }
10
+ ],
11
+ "preserve": [
12
+ {
13
+ "id": "boss-top",
14
+ "shape": {
15
+ "type": "cylinder",
16
+ "center": [3, 0, -20],
17
+ "axis": "x",
18
+ "length": 6,
19
+ "r": 6
20
+ }
21
+ },
22
+ {
23
+ "id": "boss-bottom",
24
+ "shape": {
25
+ "type": "cylinder",
26
+ "center": [3, 0, -85],
27
+ "axis": "x",
28
+ "length": 6,
29
+ "r": 6
30
+ }
31
+ }
32
+ ],
33
+ "keepOut": [
34
+ {
35
+ "id": "screw-top",
36
+ "shape": {
37
+ "type": "cylinder",
38
+ "center": [3, 0, -20],
39
+ "axis": "x",
40
+ "length": 20,
41
+ "r": 2.75
42
+ }
43
+ },
44
+ {
45
+ "id": "screw-bottom",
46
+ "shape": {
47
+ "type": "cylinder",
48
+ "center": [3, 0, -85],
49
+ "axis": "x",
50
+ "length": 20,
51
+ "r": 2.75
52
+ }
53
+ },
54
+ {
55
+ "id": "head-top",
56
+ "shape": {
57
+ "type": "cylinder",
58
+ "p0": [6, 0, -20],
59
+ "p1": [121, 0, -20],
60
+ "r": 5.5
61
+ }
62
+ },
63
+ {
64
+ "id": "head-bottom",
65
+ "shape": {
66
+ "type": "cylinder",
67
+ "p0": [6, 0, -85],
68
+ "p1": [121, 0, -85],
69
+ "r": 5.5
70
+ }
71
+ }
72
+ ],
73
+ "supports": [
74
+ {
75
+ "region": "screw-top"
76
+ },
77
+ {
78
+ "region": "screw-bottom"
79
+ },
80
+ {
81
+ "shape": {
82
+ "type": "box",
83
+ "min": [-1, -16, -101],
84
+ "max": [0.3, 16, 1]
85
+ },
86
+ "fix": "x"
87
+ }
88
+ ],
89
+ "loadCases": [
90
+ {
91
+ "name": "shelf",
92
+ "loads": [
93
+ {
94
+ "shape": {
95
+ "type": "box",
96
+ "min": [10, -16, -1.5],
97
+ "max": [121, 16, 1]
98
+ },
99
+ "force": [0, 0, -150]
100
+ }
101
+ ]
102
+ }
103
+ ],
104
+ "material": "pla",
105
+ "goal": {
106
+ "safetyFactor": 2.5,
107
+ "volumeFraction": 0.15
108
+ },
109
+ "minMember": 4.0,
110
+ "symmetry": [
111
+ "y"
112
+ ],
113
+ "resolution": {
114
+ "maxElements": 40000
115
+ },
116
+ "expect": {
117
+ "minSafetyFactor": 2.5,
118
+ "maxDeflection": 1.5,
119
+ "maxKeepOutIntrusion": 1.0,
120
+ "maxPreserveMissing": 1.0,
121
+ "bodies": 1,
122
+ "minMemberAtLeast": 3.0,
123
+ "minMassReduction": 0.6,
124
+ "maxClosedBores": 0
125
+ }
126
+ }