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,251 @@
1
+ {
2
+ "id": "elbow-link-fatigue-fdm",
3
+ "brief": "Forearm link for my desktop robot arm, PA-CF (carbon-fibre nylon) on an FDM printer, printed flat\nwith layers along +Z. The elbow servo's 25 mm aluminium horn has its face at z = 0 and its axis on Z\nthrough the origin; the link sits on that face and is held by four M3 socket screws on a 16 mm\ncircle (at (8,0), (-8,0), (0,8), (0,-8)) through 3.4 mm holes, heads on top of a 5 mm thick hub (z =\n0 to 5), each with a 7.5 mm diameter column kept clear above it for the head and the hex key. Keep a\n6 mm hole clear on the axis (z = 0 up) for the horn's centre screw. The wrist end, 100 mm out along\n+X, carries two 10 mm OD bearings on a vertical axis at (100, 0): a 10 mm bore through z = 0 to 12\nwith at least 3 mm of wall round it. The wrist cable goes through an 8 mm vertical hole at (50, 0).\nThe link fits in x = -16 to 116, y = -16 to 16, z = 0 to 12. The elbow axis is horizontal, so the\nwrist's 0.8 kg swings in the link's plane (along -Y) on every move, at 2 g: that is 2 million cycles\nover its life, and I want a fatigue safety factor of 1.5 on it. It must also survive the elbow servo\nstalling at 2.5 N·m with the wrist jammed (once, not cycled) and a 10 N push on the wrist bearings\nalong the axis. Static safety factor 2, as light as you can, under 16 g.",
4
+ "attachments": [],
5
+ "tags": [
6
+ "arm",
7
+ "fdm",
8
+ "fatigue",
9
+ "fasteners"
10
+ ],
11
+ "gold": {
12
+ "name": "elbow-link-fatigue-fdm",
13
+ "designSpace": [
14
+ {
15
+ "type": "box",
16
+ "min": [
17
+ -16.0,
18
+ -16.0,
19
+ 0.0
20
+ ],
21
+ "max": [
22
+ 116.0,
23
+ 16.0,
24
+ 12.0
25
+ ]
26
+ }
27
+ ],
28
+ "preserve": [
29
+ {
30
+ "id": "wrist-boss",
31
+ "shape": {
32
+ "type": "cylinder",
33
+ "p0": [
34
+ 100.0,
35
+ 0.0,
36
+ 0.0
37
+ ],
38
+ "p1": [
39
+ 100.0,
40
+ 0.0,
41
+ 12.0
42
+ ],
43
+ "r": 8.0,
44
+ "rInner": 5.0
45
+ }
46
+ }
47
+ ],
48
+ "keepOut": [
49
+ {
50
+ "id": "horn-screw",
51
+ "shape": {
52
+ "type": "cylinder",
53
+ "p0": [
54
+ 0.0,
55
+ 0.0,
56
+ -1.0
57
+ ],
58
+ "p1": [
59
+ 0.0,
60
+ 0.0,
61
+ 13.0
62
+ ],
63
+ "r": 3.0
64
+ }
65
+ },
66
+ {
67
+ "id": "wrist-bearings",
68
+ "shape": {
69
+ "type": "cylinder",
70
+ "p0": [
71
+ 100.0,
72
+ 0.0,
73
+ -1.0
74
+ ],
75
+ "p1": [
76
+ 100.0,
77
+ 0.0,
78
+ 13.0
79
+ ],
80
+ "r": 5.0
81
+ }
82
+ },
83
+ {
84
+ "id": "cable",
85
+ "shape": {
86
+ "type": "cylinder",
87
+ "p0": [
88
+ 50.0,
89
+ 0.0,
90
+ -1.0
91
+ ],
92
+ "p1": [
93
+ 50.0,
94
+ 0.0,
95
+ 13.0
96
+ ],
97
+ "r": 4.0
98
+ }
99
+ }
100
+ ],
101
+ "fasteners": [
102
+ {
103
+ "id": "h1",
104
+ "size": "M3",
105
+ "seat": [
106
+ 8,
107
+ 0,
108
+ 5.0
109
+ ],
110
+ "direction": "-z",
111
+ "grip": 5.0,
112
+ "end": "face"
113
+ },
114
+ {
115
+ "id": "h2",
116
+ "size": "M3",
117
+ "seat": [
118
+ -8,
119
+ 0,
120
+ 5.0
121
+ ],
122
+ "direction": "-z",
123
+ "grip": 5.0,
124
+ "end": "face"
125
+ },
126
+ {
127
+ "id": "h3",
128
+ "size": "M3",
129
+ "seat": [
130
+ 0,
131
+ 8,
132
+ 5.0
133
+ ],
134
+ "direction": "-z",
135
+ "grip": 5.0,
136
+ "end": "face"
137
+ },
138
+ {
139
+ "id": "h4",
140
+ "size": "M3",
141
+ "seat": [
142
+ 0,
143
+ -8,
144
+ 5.0
145
+ ],
146
+ "direction": "-z",
147
+ "grip": 5.0,
148
+ "end": "face"
149
+ }
150
+ ],
151
+ "supports": [
152
+ {
153
+ "region": "h1-bore",
154
+ "fix": "xy"
155
+ },
156
+ {
157
+ "region": "h2-bore",
158
+ "fix": "xy"
159
+ },
160
+ {
161
+ "region": "h3-bore",
162
+ "fix": "xy"
163
+ },
164
+ {
165
+ "region": "h4-bore",
166
+ "fix": "xy"
167
+ },
168
+ {
169
+ "shape": {
170
+ "type": "cylinder",
171
+ "p0": [
172
+ 0.0,
173
+ 0.0,
174
+ -0.5
175
+ ],
176
+ "p1": [
177
+ 0.0,
178
+ 0.0,
179
+ 0.3
180
+ ],
181
+ "r": 12.5
182
+ },
183
+ "fix": "z"
184
+ }
185
+ ],
186
+ "loadCases": [
187
+ {
188
+ "name": "duty",
189
+ "cycles": 2000000.0,
190
+ "loads": [
191
+ {
192
+ "region": "wrist-bearings",
193
+ "force": [
194
+ 0,
195
+ -15.696000000000002,
196
+ 0
197
+ ],
198
+ "distribution": "bearing"
199
+ }
200
+ ]
201
+ },
202
+ {
203
+ "name": "stall",
204
+ "loads": [
205
+ {
206
+ "region": "wrist-bearings",
207
+ "force": [
208
+ 0,
209
+ -25.0,
210
+ 0
211
+ ],
212
+ "distribution": "bearing"
213
+ }
214
+ ]
215
+ },
216
+ {
217
+ "name": "push",
218
+ "loads": [
219
+ {
220
+ "region": "wrist-bearings",
221
+ "force": [
222
+ 0,
223
+ 0,
224
+ -10.0
225
+ ]
226
+ }
227
+ ]
228
+ }
229
+ ],
230
+ "material": "pa-cf",
231
+ "process": {
232
+ "type": "fdm",
233
+ "buildDirection": "+z"
234
+ },
235
+ "durability": {
236
+ "safetyFactor": 1.5,
237
+ "constrain": true
238
+ },
239
+ "goal": {
240
+ "safetyFactor": 2
241
+ },
242
+ "resolution": {
243
+ "maxElements": 60000
244
+ }
245
+ },
246
+ "pass": {
247
+ "safetyFactor": 2,
248
+ "durabilitySafetyFactor": 1.5,
249
+ "maxMass": 16.0
250
+ }
251
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "id": "elbow-stop-pad-tpu",
3
+ "kind": "lattice",
4
+ "brief": "My GRIP arm's elbow has a hard stop, and when the controller overshoots, the forearm slams into it.\nI want a TPU 95A pad, printed on my FDM printer (0.4 mm nozzle), to glue onto the stop. Worst case\nthe forearm arrives with about 1.2 kg of effective mass at 1 m/s, square onto the pad's top face.\nThe force on the stop has to stay under 220 N or the servo's gears are at risk, and the pad must not\nsquash more than 8 mm. It has a 30 x 30 mm footprint and can be at most 15 mm tall: put the stop face\nat z = 0, the pad centred on x = y = 0 and going up from there. Give it flat solid faces about 1 mm\nthick top and bottom, so it glues on and the forearm hits a surface rather than cell edges.",
5
+ "attachments": [],
6
+ "tags": [
7
+ "fdm",
8
+ "tpu",
9
+ "impact",
10
+ "lattice",
11
+ "arm"
12
+ ],
13
+ "pass": {
14
+ "impact": {
15
+ "material": "tpu",
16
+ "lattice": "gyroid",
17
+ "axis": "z",
18
+ "mass": 1.2,
19
+ "velocity": 1.0,
20
+ "forceLimit": 220,
21
+ "maxCrush": 8,
22
+ "box": {
23
+ "min": [
24
+ -15,
25
+ -15,
26
+ 0
27
+ ],
28
+ "max": [
29
+ 15,
30
+ 15,
31
+ 15
32
+ ]
33
+ },
34
+ "faces": true,
35
+ "cell": 8,
36
+ "minWall": 0.5
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,146 @@
1
+ {
2
+ "id": "forearm-fdm",
3
+ "brief": "Forearm for a small robot arm, PETG on my FDM printer, printed lying flat so the layers stack\nalong Z. The elbow end has an 8 mm steel shaft running through it along Z at the origin (make\nthe hole 8.2 mm, with at least 3 mm of wall). At the wrist end the wrist servo bolts onto a flat\npad: the pad occupies x = 110 to 115, y = -12 to 12, z = -6 to 6, and it has two M3 clearance\nholes along X at y = +8 and y = -8 (z = 0). The whole part has to fit in x = -12 to 115,\ny = -15 to 15, z = -8 to 8. The wrist and gripper weigh 600 g and swing around. The shaft\nholds the forearm. It must not sag more than 0.5 mm at the wrist and needs a safety factor of 2.",
4
+ "attachments": [],
5
+ "tags": [
6
+ "arm",
7
+ "fdm",
8
+ "deflection"
9
+ ],
10
+ "gold": {
11
+ "designSpace": [
12
+ {
13
+ "type": "box",
14
+ "min": [
15
+ -12.0,
16
+ -15.0,
17
+ -8.0
18
+ ],
19
+ "max": [
20
+ 115.0,
21
+ 15.0,
22
+ 8.0
23
+ ]
24
+ }
25
+ ],
26
+ "preserve": [
27
+ {
28
+ "id": "elbow-boss",
29
+ "shape": {
30
+ "type": "cylinder",
31
+ "center": [
32
+ 0.0,
33
+ 0.0,
34
+ 0.0
35
+ ],
36
+ "axis": "z",
37
+ "length": 8.0,
38
+ "r": 7.1
39
+ }
40
+ },
41
+ {
42
+ "id": "wrist-pad",
43
+ "shape": {
44
+ "type": "box",
45
+ "min": [
46
+ 110.0,
47
+ -12.0,
48
+ -6.0
49
+ ],
50
+ "max": [
51
+ 115.0,
52
+ 12.0,
53
+ 6.0
54
+ ]
55
+ }
56
+ }
57
+ ],
58
+ "keepOut": [
59
+ {
60
+ "id": "shaft",
61
+ "shape": {
62
+ "type": "cylinder",
63
+ "center": [
64
+ 0.0,
65
+ 0.0,
66
+ 0.0
67
+ ],
68
+ "axis": "z",
69
+ "length": 20.0,
70
+ "r": 4.1
71
+ }
72
+ },
73
+ {
74
+ "id": "m3-a",
75
+ "shape": {
76
+ "type": "cylinder",
77
+ "p0": [
78
+ 105.0,
79
+ 8.0,
80
+ 0.0
81
+ ],
82
+ "p1": [
83
+ 120.0,
84
+ 8.0,
85
+ 0.0
86
+ ],
87
+ "r": 1.7
88
+ }
89
+ },
90
+ {
91
+ "id": "m3-b",
92
+ "shape": {
93
+ "type": "cylinder",
94
+ "p0": [
95
+ 105.0,
96
+ -8.0,
97
+ 0.0
98
+ ],
99
+ "p1": [
100
+ 120.0,
101
+ -8.0,
102
+ 0.0
103
+ ],
104
+ "r": 1.7
105
+ }
106
+ }
107
+ ],
108
+ "supports": [
109
+ {
110
+ "region": "shaft"
111
+ }
112
+ ],
113
+ "loadCases": [
114
+ {
115
+ "name": "payload",
116
+ "loads": [
117
+ {
118
+ "region": "wrist-pad",
119
+ "force": [
120
+ 0,
121
+ -8.829,
122
+ 0
123
+ ]
124
+ }
125
+ ]
126
+ }
127
+ ],
128
+ "material": "petg",
129
+ "process": {
130
+ "type": "fdm",
131
+ "buildDirection": "+z"
132
+ },
133
+ "goal": {
134
+ "safetyFactor": 2,
135
+ "maxDeflection": 0.5
136
+ },
137
+ "name": "forearm-fdm",
138
+ "resolution": {
139
+ "maxElements": 60000
140
+ }
141
+ },
142
+ "pass": {
143
+ "safetyFactor": 2,
144
+ "maxDeflection": 0.5
145
+ }
146
+ }