@jwc/jscad-raspberrypi 3.1.0 → 3.2.1

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.
package/dist/v1compat.js CHANGED
@@ -35,19 +35,113 @@ function initJscadRPi() {
35
35
  // include:compat
36
36
  // ../dist/index.js
37
37
  /*
38
- * @jwc/jscad-raspberrypi version 3.0.3
38
+ * @jwc/jscad-raspberrypi version 3.2.0
39
39
  * https://johnwebbcole.gitlab.io/jscad-raspberrypi
40
40
  */
41
41
  var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
42
42
  'use strict';
43
43
 
44
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
44
+ /**
45
+ * Returns an Adafruit miniPiTFT Hat with buttons.
46
+ *
47
+ * Default parts: board,screen,display,button1,button2
48
+ *
49
+ * All parts: board,screen,display,display-clearance,button1,button1-base,button1-push,button2,button2-base,button2-push,buttonCap1,buttonCap1-cap,buttonCap1-clearance,buttonCap2,buttonCap2-cap,buttonCap2-clearance,button-connector,button-connector-clearance,standoff
50
+ *
51
+ * ![miniPiTFT example](../images/miniPiTFT.png)
52
+ * @function activeCoolingFan
53
+ */
54
+ function activeCoolingFan() {
55
+ var g = jscadUtils.Group('ActiveCoolingFan');
56
+ var board = jscadUtils.parts.Cube([64, 42.5, 1]).subtract(jscadUtils.parts.Cube([64 - 58, 31.3, 1]).translate([0, 42.5 - 31.3, 0]).color('orange').union(jscadUtils.parts.Cube([28, 42.5 - 31.3, 1]).translate([64 - 28, 0, 0]).color('blue'))).union(jscadUtils.parts.Cube([19, 40, 9]).translate([64 - 58, 2.5, 0])).color('silver').union(jscadUtils.parts.Cube([30, 30, 9]).translate([64 - 58 + 19, 42.5 - 31.3, 0]).color('black'));
57
+ g.add(board, 'board');
45
58
 
46
- var jsCadCSG__default = /*#__PURE__*/_interopDefaultLegacy(jsCadCSG);
47
- var scadApi__default = /*#__PURE__*/_interopDefaultLegacy(scadApi);
59
+ // g.add(
60
+ // Parts.Cube([31, 18, 2])
61
+ // .color('white')
62
+ // .snap(board, 'x', 'inside+')
63
+ // .snap(board, 'y', 'inside-')
64
+ // .snap(board, 'z', 'outside-'),
65
+ // 'screen'
66
+ // );
67
+
68
+ // g.add(
69
+ // Parts.Cube([util.inch(0.98), util.inch(0.58), 2.01])
70
+ // .color('black')
71
+ // .snap(board, 'x', 'inside-', util.inch(0.34))
72
+ // .snap(board, 'y', 'inside+', -util.inch(0.32))
73
+ // .snap(board, 'z', 'outside-'),
74
+ // 'display'
75
+ // );
76
+
77
+ // g.add(
78
+ // g.parts.display
79
+ // .stretch('z', 5)
80
+ // .chamfer(-5, 'z+')
81
+ // .align(g.parts.display, 'xy')
82
+ // .color('red'),
83
+ // 'display-clearance',
84
+ // true
85
+ // );
86
+
87
+ // g.add(
88
+ // boardButton('button1', board, util.inch(0.53)),
89
+ // 'button1',
90
+ // false,
91
+ // 'button1-'
92
+ // );
93
+
94
+ // g.add(
95
+ // boardButton('button2', board, util.inch(0.18)),
96
+ // 'button2',
97
+ // false,
98
+ // 'button2-'
99
+ // );
100
+
101
+ // g.add(
102
+ // buttonCap('buttonCap1', g.parts.button1),
103
+ // 'buttonCap1',
104
+ // true,
105
+ // 'buttonCap1-'
106
+ // );
107
+ // g.add(
108
+ // buttonCap('buttonCap2', g.parts.button2),
109
+ // 'buttonCap2',
110
+ // true,
111
+ // 'buttonCap2-'
112
+ // );
113
+
114
+ // g.add(
115
+ // Parts.Cube([1, 5, 0.5])
116
+ // .color('blue')
117
+ // .align(g.parts.buttonCap1, 'x')
118
+ // .snap(g.parts.buttonCap1, 'y', 'outside+', 1)
119
+ // .snap(g.parts.buttonCap1, 'z', 'inside-'),
120
+ // 'button-connector',
121
+ // true
122
+ // );
123
+
124
+ // g.add(
125
+ // g.parts['button-connector'].enlarge(0.5, 0.5, 0.5).color('red'),
126
+ // 'button-connector-clearance',
127
+ // true
128
+ // );
129
+
130
+ // g.add(
131
+ // Parts.Tube(7, 3, 7.5)
132
+ // .snap(board, 'x', 'inside-')
133
+ // .snap(board, 'y', 'inside+')
134
+ // .snap(board, 'z', 'outside+')
135
+ // .color('yellow'),
136
+ // 'standoff',
137
+ // true
138
+ // );
48
139
 
49
- var CSG$1 = jsCadCSG__default['default'].CSG;
50
- var union = scadApi__default['default'].booleanOps.union;
140
+ return g;
141
+ }
142
+
143
+ jsCadCSG.CSG;
144
+ scadApi.booleanOps.union;
51
145
  function RightSide(o, mb) {
52
146
  return o.translate(jscadUtils.array.add(o.calcSnap(mb, 'z', 'outside-'), o.calcSnap(mb, 'x', 'inside+'), o.calcSnap(mb, 'y', 'inside-'), [2, 0, 0]));
53
147
  }
@@ -114,18 +208,20 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
114
208
  return jscadUtils.parts.Cube([1, 2, 0.7]);
115
209
  }
116
210
 
117
- var debug = jscadUtils.Debug('jscadRPi:BPlusMounting');
211
+ var debug$2 = jscadUtils.Debug('jscadRPi:BPlusMounting');
118
212
  function holes(mb) {
119
213
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
120
214
  options = Object.assign(options, {
121
215
  height: 8
122
216
  });
123
- debug('holes', mb, options); // var hole = LeftSide(MountingHole(options && options.diameter || undefined, options && options.height || 8), mb);
217
+ debug$2('holes', mb, options);
124
218
 
219
+ // var hole = LeftSide(MountingHole(options && options.diameter || undefined, options && options.height || 8), mb);
125
220
  var hole = MountingHole(options.diameter || 3.25, options.height).snap(mb, 'xy', 'inside-').align(mb, 'z');
126
221
  var holes = [hole.midlineTo('x', 3.5).midlineTo('y', 3.5), hole.midlineTo('x', 61.5).midlineTo('y', 3.5), hole.midlineTo('x', 3.5).midlineTo('y', 52.5), hole.midlineTo('x', 61.5).midlineTo('y', 52.5)];
127
222
  return jscadUtils.Group('hole1,hole2,hole3,hole4', holes);
128
223
  }
224
+
129
225
  /**
130
226
  * Create mounting pads for a Raspberry PI model B.
131
227
  * @function pads
@@ -135,7 +231,6 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
135
231
  * @param {number} [options.height=4] An options object.
136
232
  * @return {JsCadUtilsGroup} {description}
137
233
  */
138
-
139
234
  function pads(mb) {
140
235
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
141
236
  options = Object.assign({
@@ -143,9 +238,11 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
143
238
  height: 4
144
239
  }, options);
145
240
  var pad = Mountingpad(undefined, options.height).snap(mb, 'z', options.snap).snap(mb, 'xy', 'inside-');
146
- var pads = [pad.midlineTo('x', 3.5).midlineTo('y', 3.5), pad.midlineTo('x', 61.5).midlineTo('y', 3.5), pad.midlineTo('x', 3.5).midlineTo('y', 52.5), pad.midlineTo('x', 61.5).midlineTo('y', 52.5)]; // var b = mb.getBounds();
241
+ var pads = [pad.midlineTo('x', 3.5).midlineTo('y', 3.5), pad.midlineTo('x', 61.5).midlineTo('y', 3.5), pad.midlineTo('x', 3.5).midlineTo('y', 52.5), pad.midlineTo('x', 61.5).midlineTo('y', 52.5)];
147
242
 
148
- return jscadUtils.Group('pad1,pad2,pad3,pad4', pads); // });
243
+ // var b = mb.getBounds();
244
+ return jscadUtils.Group('pad1,pad2,pad3,pad4', pads);
245
+ // });
149
246
  }
150
247
  var BPlusMounting = {
151
248
  holes: holes,
@@ -153,7 +250,6 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
153
250
  };
154
251
 
155
252
  var debug$1 = jscadUtils.Debug('jscadRPi:BPlus');
156
-
157
253
  function pi4(group, clearance, mb) {
158
254
  /**
159
255
  * Model 4
@@ -163,10 +259,12 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
163
259
  var usb = jscadUtils.Group();
164
260
  usb.add(jscadUtils.parts.Cube([17, 13.1, 15]).snap(group.parts.ethernet, 'x', 'inside+', -1).snap(mb, 'z', 'outside-', 1.5).color('lightgray'), 'body');
165
261
  usb.add(jscadUtils.parts.Cube([1, 15, 16]).snap(usb.parts.body, 'x', 'outside-').align(usb.parts.body, 'yz').color('lightgray'), 'flange');
166
- group.add(usb.clone() // .translate(usbTranslation)
262
+ group.add(usb.clone()
263
+ // .translate(usbTranslation)
167
264
  .translate(jscadUtils.util.calcmidlineTo(usb.parts.body, 'y', 27)), 'usb1', false, 'usb1');
168
265
  group.add(jscadUtils.parts.Cube([clearance, 15, 16]).align(group.parts.usb1, 'yz').snap(group.parts.usb1, 'x', 'outside-').color('red'), 'clearance-usb1', true);
169
- group.add(usb.clone() // .translate(usbTranslation)
266
+ group.add(usb.clone()
267
+ // .translate(usbTranslation)
170
268
  .translate(jscadUtils.util.calcmidlineTo(usb.parts.body, 'y', 9)), 'usb2', false, 'usb2');
171
269
  group.add(jscadUtils.parts.Cube([clearance, 15, 16]).align(group.parts.usb2, 'yz').snap(group.parts.usb2, 'x', 'outside-').color('red'), 'clearance-usb2', true);
172
270
  group.add(jscadUtils.parts.Cube([10, 7.5, 3.2]).snap(usb.parts.body, 'y', 'inside-', -1).snap(mb, 'z', 'outside-').midlineTo('x', 3.5 + 7.7).color('lightgray'), 'usbc');
@@ -183,20 +281,24 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
183
281
  group.add(BoardLed().snap(mb, 'z', 'outside-').midlineTo('x', 1.1).midlineTo('y', 8).color('lightgreen'), 'activityled');
184
282
  group.add(BoardLed().snap(mb, 'z', 'outside-').midlineTo('x', 1.1).midlineTo('y', 12).color('red'), 'powerled');
185
283
  }
186
-
187
284
  function pi5(group, clearance, mb) {
188
285
  /**
189
- * Model 5
190
- */
286
+ * Model 5
287
+ */
288
+
289
+ group.add(jscadUtils.parts.Cube([12, 12, 3]).color('lightgray').translate([24, 15, 2]), 'cpu');
290
+ group.add(jscadUtils.parts.Cube([12, 12, clearance]).color('red').translate([24, 15, 2]), 'clearance-cpu', true, 'clearance');
191
291
  group.add(RightSide(jscadUtils.parts.Cube([21.5, 16.5, 13.5]).color('lightgray'), mb).translate([2, 0, 0]).midlineTo('y', 10.2), 'ethernet');
192
292
  group.add(jscadUtils.parts.Cube([clearance, 16.5, 13.5]).align(group.parts.ethernet, 'yz').snap(group.parts.ethernet, 'x', 'outside-').color('red'), 'clearance-ethernet', true, 'clearance');
193
293
  var usb = jscadUtils.Group();
194
294
  usb.add(jscadUtils.parts.Cube([17, 13.1, 15]).snap(group.parts.ethernet, 'x', 'inside+', -1).snap(mb, 'z', 'outside-', 1.5).color('lightgray'), 'body');
195
295
  usb.add(jscadUtils.parts.Cube([1, 15, 16]).snap(usb.parts.body, 'x', 'outside-').align(usb.parts.body, 'yz').color('lightgray'), 'flange');
196
- group.add(usb.clone() // .translate(usbTranslation)
296
+ group.add(usb.clone()
297
+ // .translate(usbTranslation)
197
298
  .translate(jscadUtils.util.calcmidlineTo(usb.parts.body, 'y', 29.7)), 'usb1', false, 'usb1');
198
299
  group.add(jscadUtils.parts.Cube([clearance, 15, 16]).align(group.parts.usb1, 'yz').snap(group.parts.usb1, 'x', 'outside-').color('red'), 'clearance-usb1', true);
199
- group.add(usb.clone() // .translate(usbTranslation)
300
+ group.add(usb.clone()
301
+ // .translate(usbTranslation)
200
302
  .translate(jscadUtils.util.calcmidlineTo(usb.parts.body, 'y', 47)), 'usb2', false, 'usb2');
201
303
  group.add(jscadUtils.parts.Cube([clearance, 15, 16]).align(group.parts.usb2, 'yz').snap(group.parts.usb2, 'x', 'outside-').color('red'), 'clearance-usb2', true);
202
304
  group.add(jscadUtils.parts.Cube([10, 7.5, 3.2]).snap(usb.parts.body, 'y', 'inside-', -1).snap(mb, 'z', 'outside-').midlineTo('x', 3.5 + 7.7).color('lightgray'), 'usbc');
@@ -213,6 +315,7 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
213
315
  group.add(BoardLed().snap(mb, 'z', 'outside-').midlineTo('x', 1.1).midlineTo('y', 8).color('lightgreen'), 'activityled');
214
316
  group.add(BoardLed().snap(mb, 'z', 'outside-').midlineTo('x', 1.1).midlineTo('y', 12).color('red'), 'powerled');
215
317
  }
318
+
216
319
  /**
217
320
  * Returns a complete RaspberryPi B Plus model.
218
321
  * ![bplus example](../images/bplus.png)
@@ -246,25 +349,21 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
246
349
  // include:js
247
350
  // endinject
248
351
  */
249
-
250
-
251
352
  function BPlus() {
252
353
  var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 2;
253
354
  var options = arguments.length > 1 ? arguments[1] : undefined;
254
-
255
355
  var _Object$assign = Object.assign({
256
- clearance: 5
257
- }, options),
258
- clearance = _Object$assign.clearance;
259
-
356
+ clearance: 5
357
+ }, options),
358
+ clearance = _Object$assign.clearance;
260
359
  model = !model ? 2 : model === true ? 3 : model;
261
360
  debug$1('BPlus model:', model);
262
361
  var mb = BPlusMotherboard(model == 4 ? 3 : 2);
263
362
  var group = jscadUtils.Group('mb', mb);
363
+
264
364
  /**
265
365
  * Model 1, 2, 3
266
366
  */
267
-
268
367
  if (model < 4) {
269
368
  // Right side parts
270
369
  group.add(RightSide(EthernetJack(), mb).midlineTo('y', 10.25), 'ethernet');
@@ -280,7 +379,6 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
280
379
  group.add(Ribbon().snap(mb, 'z', 'outside-').midlineTo('x', 45), 'camera');
281
380
  group.add(Ribbon().snap(mb, 'z', 'outside-').midlineTo('x', 3.5).midlineTo('y', 28), 'display');
282
381
  group.add(Gpio().snap(mb, 'z', 'outside-').midlineTo('x', 32.5).midlineTo('y', 52.5), 'gpio');
283
-
284
382
  if (model == 3) {
285
383
  group.add(BoardLed().snap(mb, 'z', 'outside-').midlineTo('x', 1.1).midlineTo('y', 7.9).color('lightgreen'), 'activityled');
286
384
  group.add(BoardLed().snap(mb, 'z', 'outside-').midlineTo('x', 1.1).midlineTo('y', 11.5).color('red'), 'powerled');
@@ -293,13 +391,20 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
293
391
  } else {
294
392
  pi5(group, clearance, mb);
295
393
  }
296
-
297
394
  group.add(jscadUtils.parts.Cube([15.2, 12, 1.5]).snap(mb, 'z', 'outside+').midlineTo('y', 28).translate([-2.5, 0, 0]).color('silver'), 'microsd');
298
395
  group.holes = holes(mb).array();
299
396
  group.add(group.holes[0], 'hole1', true);
300
397
  group.add(group.holes[1], 'hole2', true);
301
398
  group.add(group.holes[2], 'hole3', true);
302
399
  group.add(group.holes[3], 'hole4', true);
400
+
401
+ /** Add fan mounting holes for PI 5 */
402
+ if (model >= 5) {
403
+ group.holes.push(MountingHole(3.25, 8).snap(mb, 'xy', 'inside-').align(mb, 'z').midlineTo('x', 3.5).midlineTo('y', 6 + 3.5));
404
+ group.add(group.holes[4], 'fan1hole', true);
405
+ group.holes.push(MountingHole(3.25, 8).snap(mb, 'xy', 'inside-').align(mb, 'z').midlineTo('x', 3.5 + 58).midlineTo('y', 52.5 - 6));
406
+ group.add(group.holes[5], 'fan2hole', true);
407
+ }
303
408
  return group;
304
409
  }
305
410
 
@@ -313,8 +418,7 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
313
418
  * @exports CameraModuleV1
314
419
  * @memberof RaspberryPi
315
420
  */
316
-
317
- function CameraModuleV1() {
421
+ function CameraModuleV1$1() {
318
422
  var t = 1.1;
319
423
  var height = {
320
424
  sensor: 5.9 - t,
@@ -322,11 +426,9 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
322
426
  };
323
427
  var g = jscadUtils.Group();
324
428
  g.add(jscadUtils.parts.Cube([24, 25, t]).Center().color('green', 0.75), 'board');
325
-
326
429
  function Hole(x, y) {
327
430
  return jscadUtils.parts.Cylinder(2.2, t).snap(g.parts.board, 'xy', 'inside-').midlineTo('x', x).midlineTo('y', y);
328
431
  }
329
-
330
432
  g.holes = [Hole(2, 2).color('yellow'), Hole(2, 23), Hole(12.5 + 2, 2), Hole(12.5 + 2, 23)];
331
433
  g.add(jscadUtils.Group('hole0,hole1,hole2,hole3', g.holes), 'hole', false, 'holes');
332
434
  var mounts = g.holes.reduce(function (m, h, i) {
@@ -340,7 +442,9 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
340
442
  }, {});
341
443
  g.add(jscadUtils.Group(pins), 'pins', true, 'pins');
342
444
  g.add(jscadUtils.parts.Cube([8.5, 8.5, 2]).snap(g.parts.board, 'xy', 'inside-').snap(g.parts.board, 'z', 'outside-').midlineTo('x', 12.5 + 2).midlineTo('y', 8.5 + 4).color('black'), 'sensor');
343
- g.add(jscadUtils.parts.Cube([8.5, 8.5, height.sensor - 2]).align(g.parts.sensor, 'xy').snap(g.parts.sensor, 'z', 'outside-').color('gray'), 'lense'); // var lenseribbon = Parts.Cube([7.56, 10, 2])
445
+ g.add(jscadUtils.parts.Cube([8.5, 8.5, height.sensor - 2]).align(g.parts.sensor, 'xy').snap(g.parts.sensor, 'z', 'outside-').color('gray'), 'lense');
446
+
447
+ // var lenseribbon = Parts.Cube([7.56, 10, 2])
344
448
  // .snap(board, 'z', 'outside-')
345
449
  // .midlineTo('x', 12.5)
346
450
  // .snap(lense, 'y', 'outside-')
@@ -363,8 +467,7 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
363
467
  * @function CameraModuleV2
364
468
  * @return {JsCadUtilsGroup} {description}
365
469
  */
366
-
367
- function CameraModuleV1$1() {
470
+ function CameraModuleV1() {
368
471
  var t = 1.1;
369
472
  var height = {
370
473
  sensor: 4 - t,
@@ -372,11 +475,9 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
372
475
  };
373
476
  var g = jscadUtils.Group();
374
477
  g.add(jscadUtils.parts.RoundedCube(23.862, 25, t, 2).Center().color('green', 0.75), 'board');
375
-
376
478
  function Hole(x, y) {
377
479
  return jscadUtils.parts.Cylinder(2.2, t).snap(g.parts.board, 'xy', 'inside-').midlineTo('x', x).midlineTo('y', y);
378
480
  }
379
-
380
481
  g.holes = [Hole(2, 2).color('yellow'), Hole(2, 23), Hole(14.5, 2), Hole(14.5, 23)];
381
482
  g.add(jscadUtils.Group('hole0,hole1,hole2,hole3', g.holes), 'hole', false, 'holes');
382
483
  var mounts = g.holes.reduce(function (m, h, i) {
@@ -401,6 +502,7 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
401
502
  }
402
503
 
403
504
  var union$1 = scadApi.booleanOps.union;
505
+
404
506
  /** @typedef {typeof import("@jwc/jscad-utils/src/group").JsCadUtilsGroup} JsCadUtilsGroup */
405
507
 
406
508
  /**
@@ -410,24 +512,24 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
410
512
  * @param {CSG} [pi] A CSG object, intended to be a RaspberryPi CSG to align the Hat with.
411
513
  * @return {JsCadUtilsGroup} A group object with the `mb`, `gpio` and `holes` for a blank RPi hat.
412
514
  */
413
-
414
515
  function Hat(pi) {
415
516
  var hat = jscadUtils.Group();
416
- hat.add(jscadUtils.parts.Board(65.02, 56.39, 3.56, 1.62).color('darkgreen', 0.75), 'mb'); // if (pi) {
517
+ hat.add(jscadUtils.parts.Board(65.02, 56.39, 3.56, 1.62).color('darkgreen', 0.75), 'mb');
518
+
519
+ // if (pi) {
417
520
  // mb = mb.translate(mb.calcSnap(pi, 'xy', 'inside-'));
418
521
  // }
419
522
 
420
523
  var hole = MountingHole().snap(hat.parts.mb, 'xy', 'inside-');
421
524
  var holes = union$1(hole.midlineTo('x', 3.56).midlineTo('y', 3.56), hole.midlineTo('x', 61.47).midlineTo('y', 3.56), hole.midlineTo('x', 3.56).midlineTo('y', 52.46), hole.midlineTo('x', 61.47).midlineTo('y', 52.46));
422
- hat.add(Gpio(hat.parts.mb).snap(hat.parts.mb, 'z', 'outside+'), 'gpio'); // var gpio = Gpio(mb).snap(mb, 'z', 'outside+');
423
- // var hat = Group('mb,gpio', [mb, gpio]);
525
+ hat.add(Gpio(hat.parts.mb).snap(hat.parts.mb, 'z', 'outside+'), 'gpio');
526
+ // var gpio = Gpio(mb).snap(mb, 'z', 'outside+');
424
527
 
528
+ // var hat = Group('mb,gpio', [mb, gpio]);
425
529
  hat.holes = holes;
426
-
427
530
  if (pi) {
428
531
  hat.translate(hat.parts.mb.calcSnap(pi, 'xy', 'inside-')).translate(hat.parts.gpio.calcSnap(pi, 'z', 'outside-'));
429
532
  }
430
-
431
533
  return hat;
432
534
  }
433
535
 
@@ -441,7 +543,6 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
441
543
  * @param {number} [options.height] The height of the standoff.
442
544
  * @return {JsCadUtilsGroup} A group object with the `mb`, `gpio` and `holes` for a blank RPi hat.
443
545
  */
444
-
445
546
  function HatStandoff() {
446
547
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
447
548
  options = Object.assign({
@@ -452,38 +553,30 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
452
553
  return standoff.union(peg);
453
554
  }
454
555
 
455
- function _toConsumableArray(arr) {
456
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
556
+ function _arrayLikeToArray(r, a) {
557
+ (null == a || a > r.length) && (a = r.length);
558
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
559
+ return n;
457
560
  }
458
-
459
- function _arrayWithoutHoles(arr) {
460
- if (Array.isArray(arr)) return _arrayLikeToArray(arr);
461
- }
462
-
463
- function _iterableToArray(iter) {
464
- if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
465
- }
466
-
467
- function _unsupportedIterableToArray(o, minLen) {
468
- if (!o) return;
469
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
470
- var n = Object.prototype.toString.call(o).slice(8, -1);
471
- if (n === "Object" && o.constructor) n = o.constructor.name;
472
- if (n === "Map" || n === "Set") return Array.from(o);
473
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
561
+ function _arrayWithoutHoles(r) {
562
+ if (Array.isArray(r)) return _arrayLikeToArray(r);
474
563
  }
475
-
476
- function _arrayLikeToArray(arr, len) {
477
- if (len == null || len > arr.length) len = arr.length;
478
-
479
- for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
480
-
481
- return arr2;
564
+ function _iterableToArray(r) {
565
+ if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
482
566
  }
483
-
484
567
  function _nonIterableSpread() {
485
568
  throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
486
569
  }
570
+ function _toConsumableArray(r) {
571
+ return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
572
+ }
573
+ function _unsupportedIterableToArray(r, a) {
574
+ if (r) {
575
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
576
+ var t = {}.toString.call(r).slice(8, -1);
577
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
578
+ }
579
+ }
487
580
 
488
581
  /** @typedef {typeof import("@jwc/jscad-utils/src/group").JsCadUtilsGroup} JsCadUtilsGroup */
489
582
 
@@ -521,10 +614,8 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
521
614
  * @function CameraModuleV2
522
615
  * @return {JsCadUtilsGroup} {description}
523
616
  */
524
-
525
617
  function HQCameraModule() {
526
618
  var _camera$holes;
527
-
528
619
  var t = 1.1;
529
620
  var camera = jscadUtils.Group();
530
621
  camera.add(jscadUtils.parts.RoundedCube(38, 38, t, 1.4).Center().color('green', 0.75), 'board');
@@ -533,9 +624,7 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
533
624
  camera.add(hole.rotateZ(90), 'hole2', true);
534
625
  camera.add(hole.rotateZ(180), 'hole3', true);
535
626
  camera.add(hole.rotateZ(-90), 'hole4', true);
536
-
537
627
  (_camera$holes = camera.holes).push.apply(_camera$holes, _toConsumableArray(camera.array('hole1,hole2,hole3,hole4')));
538
-
539
628
  var sensor = jscadUtils.parts.Cube([8.5, 8.5, 1]).snap(camera.parts.board, 'z', 'outside-').align(camera.parts.board, 'xy').color('white');
540
629
  camera.add(sensor, 'sensor');
541
630
  var mount = jscadUtils.parts.Cylinder(36, 10.2).snap(camera.parts.board, 'z', 'outside-').align(camera.parts.board, 'xy').color('black');
@@ -555,16 +644,18 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
555
644
  g.add(jscadUtils.parts.Cylinder(3, 1).color('black').align(g.parts.base, 'xy').snap(g.parts.base, 'z', 'outside-'), 'push');
556
645
  return g;
557
646
  }
558
-
559
647
  function buttonCap(name, button) {
560
648
  var g = jscadUtils.Group(name);
561
- g.add(jscadUtils.parts.Cylinder(4, 3).fillet(1, 'z+') // .translate([0, 0, 1])
649
+ g.add(jscadUtils.parts.Cylinder(4, 3).fillet(1, 'z+')
650
+ // .translate([0, 0, 1])
562
651
  .union(jscadUtils.parts.Cylinder(6, 0.5).bisect('x', -0.5).parts.negative //.translate([0, 0, 1])
563
652
  ).color('blue').align(button, 'xy').snap(button, 'z', 'outside-'), 'cap');
564
- g.add(jscadUtils.parts.Cylinder(7, 0.75).bisect('x', -0.5).parts.negative.color('green').union(jscadUtils.parts.Cylinder(4.5, 2).color('yellow').translate([0, 0, 0])).align(g.parts.cap, 'xy').snap(g.parts.cap, 'z', 'inside-'), // .color('red'),
653
+ g.add(jscadUtils.parts.Cylinder(7, 0.75).bisect('x', -0.5).parts.negative.color('green').union(jscadUtils.parts.Cylinder(4.5, 2).color('yellow').translate([0, 0, 0])).align(g.parts.cap, 'xy').snap(g.parts.cap, 'z', 'inside-'),
654
+ // .color('red'),
565
655
  'clearance', true);
566
656
  return g;
567
657
  }
658
+
568
659
  /**
569
660
  * Returns an Adafruit miniPiTFT Hat with buttons.
570
661
  *
@@ -575,8 +666,6 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
575
666
  * ![miniPiTFT example](../images/miniPiTFT.png)
576
667
  * @function miniPiTFT
577
668
  */
578
-
579
-
580
669
  function miniPiTFT() {
581
670
  var g = jscadUtils.Group('miniPiTFT');
582
671
  var board = jscadUtils.parts.RoundedCube(jscadUtils.util.inch(2), jscadUtils.util.inch(1), 2, 2).bisect('x', jscadUtils.util.inch(1.5)).parts.negative.bisect('y', -jscadUtils.util.inch(0.96)).parts.negative.color('darkgreen');
@@ -600,7 +689,6 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
600
689
  * @function PiTFT22
601
690
  * @return {Group} A group of objects to build a PiTFT22.
602
691
  */
603
-
604
692
  function PiTFT22() {
605
693
  var hat = Hat();
606
694
  var mb = hat.parts.mb;
@@ -621,8 +709,9 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
621
709
  return group;
622
710
  }
623
711
 
624
- var union$2 = scadApi.booleanOps.union;
625
- var debug$2 = jscadUtils.Debug('jscadRPi:PiTFT24');
712
+ var union = scadApi.booleanOps.union;
713
+ var debug = jscadUtils.Debug('jscadRPi:PiTFT24');
714
+
626
715
  /** @typedef {typeof import("@jwc/jscad-utils/src/group").JsCadUtilsGroup} JsCadUtilsGroup */
627
716
 
628
717
  /**
@@ -664,7 +753,6 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
664
753
  // include:js
665
754
  // endinject
666
755
  */
667
-
668
756
  function PiTFT24() {
669
757
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
670
758
  var pi = arguments.length > 1 ? arguments[1] : undefined;
@@ -675,23 +763,25 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
675
763
  buttonWireYOffset: 5,
676
764
  clearance: 0.9
677
765
  });
678
- debug$2('PiTFT24', options);
766
+ debug('PiTFT24', options);
679
767
  var hat = Hat(pi);
680
768
  var mb = hat.parts.mb;
681
769
  var group = jscadUtils.Group();
682
770
  group.add(hat.parts.mb, 'mb');
683
771
  group.add(hat.parts.gpio, 'gpio');
684
- group.holes = hat.holes; // var gpio = hat.parts.gpio;
772
+ group.holes = hat.holes;
685
773
 
774
+ // var gpio = hat.parts.gpio;
686
775
  var sink = 0; // lower the lcd bevel above actual position, and raise LCD up so cases will mould around the lcd better
687
776
 
688
777
  var lcd = jscadUtils.parts.Cube([50, 40, 3.72]).color('black');
689
- group.add(lcd.translate(lcd.calcSnap(mb, 'xy', 'inside-')).translate(lcd.calcSnap(mb, 'z', 'outside-')).translate([7, 0, 0]).translate(lcd.calcmidlineTo('y', 28.32)), 'lcd'); // var lcdbevel = LeftSide(Parts.Cube([60, 42, (5.3 - 1.62) - sink]), mb)
778
+ group.add(lcd.translate(lcd.calcSnap(mb, 'xy', 'inside-')).translate(lcd.calcSnap(mb, 'z', 'outside-')).translate([7, 0, 0]).translate(lcd.calcmidlineTo('y', 28.32)), 'lcd');
779
+
780
+ // var lcdbevel = LeftSide(Parts.Cube([60, 42, (5.3 - 1.62) - sink]), mb)
690
781
  // .snap(mb, 'z', 'outside-')
691
782
  // .translate([4.5, 7, 0])
692
783
  // .color('white');
693
784
  //
694
-
695
785
  var lcdbevel = jscadUtils.parts.Cube([60, 42, 5.3 - 1.62 - sink]).color('white');
696
786
  group.add(lcdbevel.translate(lcdbevel.calcSnap(mb, 'xy', 'inside-')).translate(lcdbevel.calcSnap(mb, 'z', 'outside-')).translate([4.5, 7, 0]), 'lcdbevel');
697
787
  var buttonBase = jscadUtils.parts.Cube([6.1, 3.5, 3.55]).color('beige').snap(mb, 'z', 'outside-').snap(mb, 'xy', 'inside-').midlineTo('y', 2.5);
@@ -704,21 +794,21 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
704
794
  var buttonCapBase = jscadUtils.parts.Cube([6.6, 4, capBaseHeight]).color('blue');
705
795
  var buttonCapTop = jscadUtils.parts.Cube([6.1, 3.5, options.buttonCapHeight - capBaseHeight]).snap(buttonCapBase, 'z', 'outside-').align(buttonCapBase, 'xy').fillet(1, 'z+').color('deepskyblue');
706
796
  var buttonCaps = buttons.map(function (button) {
707
- return union$2([buttonCapBase, buttonCapTop]).snap(button, 'z', 'outside-').align(button, 'xy');
797
+ return union([buttonCapBase, buttonCapTop]).snap(button, 'z', 'outside-').align(button, 'xy');
708
798
  });
709
- group.add(union$2(buttonCaps), 'buttonCaps', hiddenPart);
710
- group.add(union$2(buttonCaps.map(function (button) {
711
- return union$2([buttonCapBase.align(button, 'xy').snap(button, 'z', 'inside-').enlarge([options.clearance, options.clearance, 1]), jscadUtils.parts.Cube([6.1, 3.5, options.buttonCapHeight - capBaseHeight]).align(button, 'xy').snap(button, 'z', 'inside-').enlarge([options.clearance, options.clearance, 1])]);
799
+ group.add(union(buttonCaps), 'buttonCaps', hiddenPart);
800
+ group.add(union(buttonCaps.map(function (button) {
801
+ return union([buttonCapBase.align(button, 'xy').snap(button, 'z', 'inside-').enlarge([options.clearance, options.clearance, 1]), jscadUtils.parts.Cube([6.1, 3.5, options.buttonCapHeight - capBaseHeight]).align(button, 'xy').snap(button, 'z', 'inside-').enlarge([options.clearance, options.clearance, 1])]);
712
802
  })), 'buttonCapClearance', hiddenPart);
713
803
  var bwthickness = options.capBaseHeight;
714
804
  var connector = LeftSide(jscadUtils.parts.Cube([bwthickness, options.buttonWireYOffset, bwthickness]), mb).snap(buttonCaps[0], 'z', 'inside-').snap(buttonCaps[0], 'y', 'outside+').color('blue');
715
805
  var buttonWire = jscadUtils.parts.Cube([40, bwthickness, bwthickness]).snap(buttonCaps[0], 'x', 'center-').snap(buttonCaps[0], 'z', 'inside-').snap(connector, 'y', 'inside-').color('blue');
716
- group.add(union$2(buttonWire), 'buttonWire', hiddenPart);
806
+ group.add(union(buttonWire), 'buttonWire', hiddenPart);
717
807
  var buttonWireConnector = buttonCaps.map(function (buttonCap) {
718
808
  return connector.align(buttonCap, 'x');
719
809
  });
720
- group.add(union$2(buttonWireConnector), 'buttonWireConnector', hiddenPart);
721
- var buttonWireClearance = union$2(buttonWireConnector.map(function (connector) {
810
+ group.add(union(buttonWireConnector), 'buttonWireConnector', hiddenPart);
811
+ var buttonWireClearance = union(buttonWireConnector.map(function (connector) {
722
812
  return connector.enlarge([options.clearance, options.clearance, options.buttonCapHeight]);
723
813
  })).union(buttonWire.enlarge([options.clearance, options.clearance, options.buttonCapHeight])).snap(buttonWire, 'z', 'inside+').color('red');
724
814
  group.add(buttonWireClearance, 'buttonWireClearance', hiddenPart);
@@ -726,7 +816,8 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
726
816
  return group;
727
817
  }
728
818
 
729
- var debug$3 = jscadUtils.Debug('jscadRPi:Spacer');
819
+ jscadUtils.Debug('jscadRPi:Spacer');
820
+
730
821
  /** @typedef {typeof import("@jwc/jscad-utils/src/triangle")} triangle */
731
822
 
732
823
  /**
@@ -771,7 +862,6 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
771
862
  // include:js
772
863
  // endinject
773
864
  */
774
-
775
865
  function Spacer() {
776
866
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
777
867
  var mb = arguments.length > 1 ? arguments[1] : undefined;
@@ -792,7 +882,6 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
792
882
  });
793
883
  var spacers = spacer.combine();
794
884
  if (options.postOnly) return spacers.color('yellow');
795
-
796
885
  if (!options.hollow) {
797
886
  var p1 = spacer.parts.pad1.centroid();
798
887
  var p2 = spacer.parts.pad4.centroid();
@@ -802,7 +891,6 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
802
891
  var x = jscadUtils.parts.Board(tri.C + 5.5, 6.2, 3.1, options.thickness).rotateZ(tri.b).translate([dx, dy, 0]).snap(spacer.parts.pad1, 'z', 'inside+');
803
892
  var cross = x.union(x.mirroredY().translate([0, 56, 0])).snap(spacer.parts.pad1, 'xy', 'inside-').color('red');
804
893
  }
805
-
806
894
  var gussetInterior = jscadUtils.parts.Board(options.gussetInside[0], options.gussetInside[1], 3, options.thickness).align(spacers, 'xy');
807
895
  var gusset = jscadUtils.parts.Board(options.gussetOutside[0], options.gussetOutside[1], 3, options.thickness).align(spacers, 'xy').subtract(gussetInterior).snap(spacer.parts.pad1, 'z', 'inside+');
808
896
  var gpio = Gpio(mb);
@@ -810,9 +898,10 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
810
898
  return assembly.color('yellow');
811
899
  }
812
900
 
901
+ exports.ActiveCoolingFan = activeCoolingFan;
813
902
  exports.BPlus = BPlus;
814
- exports.CameraModuleV1 = CameraModuleV1;
815
- exports.CameraModuleV2 = CameraModuleV1$1;
903
+ exports.CameraModuleV1 = CameraModuleV1$1;
904
+ exports.CameraModuleV2 = CameraModuleV1;
816
905
  exports.HQCameraModule = HQCameraModule;
817
906
  exports.Hat = Hat;
818
907
  exports.HatStandoff = HatStandoff;
@@ -823,7 +912,7 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
823
912
 
824
913
  return exports;
825
914
 
826
- }({}, jscadUtils, jsCadCSG, scadApi));
915
+ })({}, jscadUtils, jsCadCSG, scadApi);
827
916
  /* @jwc/jscad-raspberrypi follow me on Twitter! @johnwebbcole */
828
917
 
829
918
  // end:compat
@@ -0,0 +1,10 @@
1
+ function main() {
2
+ util.init(CSG);
3
+
4
+ var camera = RaspberryPi.ActiveCoolingFan();
5
+
6
+ return camera.combine().Center();
7
+ }
8
+
9
+ // include:js
10
+ // endinject