@jwc/jscad-raspberrypi 3.2.0 → 3.3.0

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 (36) hide show
  1. package/.vscode/settings.json +4 -1
  2. package/dist/examples/active-cooling-fan.jscad +210 -171
  3. package/dist/examples/bplus.jscad +209 -170
  4. package/dist/examples/bplus3.jscad +209 -170
  5. package/dist/examples/camera-module-v1.jscad +209 -170
  6. package/dist/examples/camera-module-v2.jscad +209 -170
  7. package/dist/examples/example.jscad +215 -176
  8. package/dist/examples/hat-standoff.jscad +209 -170
  9. package/dist/examples/hat.jscad +209 -170
  10. package/dist/examples/hq_camera-module.jscad +211 -172
  11. package/dist/examples/hyper-pixel-4-rectangular.jscad +2781 -0
  12. package/dist/examples/miniPiTFT.jscad +209 -170
  13. package/dist/examples/pi-tft22.jscad +209 -170
  14. package/dist/examples/pi-tft24 copy.jscad +2750 -0
  15. package/dist/examples/pi-tft24.jscad +209 -170
  16. package/dist/examples/pi4.jscad +210 -171
  17. package/dist/examples/pi5.jscad +215 -179
  18. package/dist/examples/spacer.jscad +209 -170
  19. package/dist/index.js +112 -125
  20. package/dist/v1compat.js +112 -125
  21. package/examples/active-cooling-fan.jscad +1 -1
  22. package/examples/example.jscad +6 -6
  23. package/examples/hq_camera-module.jscad +2 -2
  24. package/examples/hyper-pixel-4-rectangular.jscad +10 -0
  25. package/examples/pi4.jscad +1 -1
  26. package/examples/pi5.jscad +6 -9
  27. package/package.json +3 -3
  28. package/prettier.config.js +7 -0
  29. package/src/active-cooling-fan.js +0 -139
  30. package/src/boardutils.js +11 -4
  31. package/src/bplus.js +102 -62
  32. package/src/hq_camera-module.js +24 -20
  33. package/src/hyper-pixel-4-rectangular.js +58 -0
  34. package/src/index.js +2 -1
  35. package/src/miniPiTFT.js +1 -1
  36. package/src/rpi-parts.js +23 -5
package/dist/v1compat.js CHANGED
@@ -35,115 +35,32 @@ function initJscadRPi() {
35
35
  // include:compat
36
36
  // ../dist/index.js
37
37
  /*
38
- * @jwc/jscad-raspberrypi version 3.1.0
38
+ * @jwc/jscad-raspberrypi version 3.2.1
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
- /**
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
44
  function activeCoolingFan() {
55
45
  var g = jscadUtils.Group('ActiveCoolingFan');
56
46
  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
47
  g.add(board, 'board');
58
-
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
- // );
139
-
140
48
  return g;
141
49
  }
142
50
 
143
51
  jsCadCSG.CSG;
144
52
  scadApi.booleanOps.union;
53
+
54
+ /**
55
+ * @function RightSide
56
+ * @param {CSG} o A csg object to be placed on the right side of the motherboard}
57
+ * @param {CSG} mb A csg motherboard object
58
+ * @param {Array<number>} [offset=[2, 0, 0]] An offset to apply after positioning ex. [2,0,0]
59
+ * @return {CSG} The translated CSG object
60
+ */
145
61
  function RightSide(o, mb) {
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]));
62
+ var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [2, 0, 0];
63
+ return o.translate(jscadUtils.array.add(o.calcSnap(mb, 'z', 'outside-'), o.calcSnap(mb, 'x', 'inside+'), o.calcSnap(mb, 'y', 'inside-'), offset));
147
64
  }
148
65
  function LeftSide(o, mb) {
149
66
  return o.translate(calcLeftSide(o, mb));
@@ -197,9 +114,20 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
197
114
  var cyl = jscadUtils.parts.Cylinder(6, 2).rotateX(90).align(block, "xz").snap(block, "y", "outside+").color("black");
198
115
  return jscadUtils.Group("block,cylinder", [block, cyl]);
199
116
  }
117
+ function PSW() {
118
+ var block = jscadUtils.parts.Cube([2.8, 4.5, 3.7]).color("gray");
119
+ var cyl = jscadUtils.parts.Cylinder(2, 1).rotateY(90).align(block, "yz").snap(block, "x", "outside+").color("black");
120
+ return jscadUtils.Group("block,button", [block, cyl]);
121
+ }
200
122
  function Ribbon() {
201
123
  return jscadUtils.parts.Cube([3, 22.4, 5.7]).color("gray");
202
124
  }
125
+ function CamDisplay() {
126
+ return jscadUtils.parts.Cube([3, 16, 5]).color("gray");
127
+ }
128
+ function PCIe() {
129
+ return jscadUtils.parts.Cube([3, 12, 5]).color("gray");
130
+ }
203
131
  function Gpio(mb) {
204
132
  var gpio = jscadUtils.parts.Cube([50.64, 5, 8.72]).color("gray");
205
133
  return mb ? gpio.snap(mb, "xy", "inside-").snap(mb, "z", "outside-").midlineTo("x", 32.5).midlineTo("y", 52.5) : gpio;
@@ -208,13 +136,13 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
208
136
  return jscadUtils.parts.Cube([1, 2, 0.7]);
209
137
  }
210
138
 
211
- var debug$2 = jscadUtils.Debug('jscadRPi:BPlusMounting');
139
+ var debug$4 = jscadUtils.Debug('jscadRPi:BPlusMounting');
212
140
  function holes(mb) {
213
141
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
214
142
  options = Object.assign(options, {
215
143
  height: 8
216
144
  });
217
- debug$2('holes', mb, options);
145
+ debug$4('holes', mb, options);
218
146
 
219
147
  // var hole = LeftSide(MountingHole(options && options.diameter || undefined, options && options.height || 8), mb);
220
148
  var hole = MountingHole(options.diameter || 3.25, options.height).snap(mb, 'xy', 'inside-').align(mb, 'z');
@@ -249,12 +177,12 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
249
177
  pads: pads
250
178
  };
251
179
 
252
- var debug$1 = jscadUtils.Debug('jscadRPi:BPlus');
180
+ var debug$3 = jscadUtils.Debug('jscadRPi:BPlus');
253
181
  function pi4(group, clearance, mb) {
254
182
  /**
255
- * Model 4
256
- */
257
- group.add(RightSide(jscadUtils.parts.Cube([21.5, 16.5, 13.5]).color('lightgray'), mb).translate([2, 0, 0]).midlineTo('y', 45.75), 'ethernet');
183
+ * Model 4
184
+ */
185
+ group.add(RightSide(jscadUtils.parts.Cube([21.5, 16.5, 13.5]).color('lightgray'), mb, [3, 0, 0]).midlineTo('y', 45.75), 'ethernet');
258
186
  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');
259
187
  var usb = jscadUtils.Group();
260
188
  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');
@@ -286,34 +214,49 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
286
214
  * Model 5
287
215
  */
288
216
 
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');
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');
217
+ group.add(jscadUtils.parts.Cube([17, 17, 3]).color('lightgray').translate([0, 15, 0]).midlineTo('x', 29 + 3.5).snap(group.parts.mb, 'z', 'outside-'), 'cpu');
218
+ group.add(jscadUtils.parts.Cube([17, 17, clearance]).color('red').align(group.parts.cpu, 'xy').snap(group.parts.cpu, 'z', 'outside-'), 'clearance-cpu', true, 'clearance');
219
+
220
+ // group.add(Parts.Cube([1, 1, 15.1 - 1.46]).snap(mb, 'x', 'inside+')
221
+ // .snap(mb, 'y', 'inside-').snap(mb, 'z', 'outside-'), 'dimcheck1');
222
+
223
+ // group.add(Parts.Cube([3.06, 1, 1]).snap(mb, 'x', 'outside-')
224
+ // .snap(mb, 'y', 'inside-').align(mb, 'z'), 'dimcheck2');
225
+
226
+ group.add(RightSide(jscadUtils.parts.Cube([21.5, 16.5, 13.5]).color('lightgray'), mb, [3, 0, 0]).midlineTo('y', 10.2), 'ethernet');
292
227
  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');
228
+
229
+ // group.add(Parts.Cube([1, 1, 17.5 - 1.46]).snap(mb, 'x', 'inside+')
230
+ // .snap(mb, 'y', 'inside+').snap(mb, 'z', 'outside-'), 'dimcheck3');
231
+
232
+ // group.add(Parts.Cube([3, 1, 1]).snap(mb, 'x', 'outside-')
233
+ // .snap(mb, 'y', 'inside+').align(mb, 'z'), 'dimcheck4');
234
+
293
235
  var usb = jscadUtils.Group();
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');
295
- usb.add(jscadUtils.parts.Cube([1, 15, 16]).snap(usb.parts.body, 'x', 'outside-').align(usb.parts.body, 'yz').color('lightgray'), 'flange');
236
+ usb.add(jscadUtils.parts.Cube([17, 13.1, 15]).snap(group.parts.ethernet, 'x', 'inside+', -1).snap(mb, 'z', 'outside-', 0.5).color('lightgray'), 'body');
237
+ usb.add(jscadUtils.parts.Cube([1, 15, 16.5]).snap(usb.parts.body, 'x', 'outside-').align(usb.parts.body, 'yz').color('lightgray'), 'flange');
296
238
  group.add(usb.clone()
297
239
  // .translate(usbTranslation)
298
- .translate(jscadUtils.util.calcmidlineTo(usb.parts.body, 'y', 29.7)), 'usb1', false, 'usb1');
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);
240
+ .translate(jscadUtils.util.calcmidlineTo(usb.parts.body, 'y', 29.1)), 'usb1', false, 'usb1');
241
+ group.add(jscadUtils.parts.Cube([clearance, 15, 16.5]).align(group.parts.usb1, 'yz').snap(group.parts.usb1, 'x', 'outside-').color('red'), 'clearance-usb1', true);
300
242
  group.add(usb.clone()
301
243
  // .translate(usbTranslation)
302
244
  .translate(jscadUtils.util.calcmidlineTo(usb.parts.body, 'y', 47)), 'usb2', false, 'usb2');
303
245
  group.add(jscadUtils.parts.Cube([clearance, 15, 16]).align(group.parts.usb2, 'yz').snap(group.parts.usb2, 'x', 'outside-').color('red'), 'clearance-usb2', true);
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');
246
+ group.add(jscadUtils.parts.Cube([10, 7.5, 3.2]).snap(usb.parts.body, 'y', 'inside-', -1).snap(mb, 'z', 'outside-').midlineTo('x', 11.2).color('lightgray'), 'usbc');
305
247
  group.add(jscadUtils.parts.Cube([10, clearance, 3.2]).align(group.parts.usbc, 'xz').snap(group.parts.usbc, 'y', 'outside+').color('red'), 'clearance-usbc', true);
306
- group.add(jscadUtils.parts.Cube([7, 7.5, 3]).snap(usb.parts.body, 'y', 'inside-', -1).snap(mb, 'z', 'outside-').midlineTo('x', 3.5 + 7.7 + 14.8).color('lightgray'), 'hdmi1');
248
+ group.add(jscadUtils.parts.Cube([7, 7.5, 3]).snap(usb.parts.body, 'y', 'inside-', -1).snap(mb, 'z', 'outside-').midlineTo('x', 25.8).color('lightgray'), 'hdmi1');
307
249
  group.add(jscadUtils.parts.Cube([7, clearance, 3]).align(group.parts.hdmi1, 'xz').snap(group.parts.hdmi1, 'y', 'outside+').color('red'), 'clearance-hdmi1', true);
308
- group.add(jscadUtils.parts.Cube([7, 7.5, 3]).snap(usb.parts.body, 'y', 'inside-', -1).snap(mb, 'z', 'outside-').midlineTo('x', 3.5 + 7.7 + 14.8 + 13.5).color('lightgray'), 'hdmi2');
250
+ group.add(jscadUtils.parts.Cube([7, 7.5, 3]).snap(usb.parts.body, 'y', 'inside-', -1).snap(mb, 'z', 'outside-').midlineTo('x', 39.2).color('lightgray'), 'hdmi2');
309
251
  group.add(jscadUtils.parts.Cube([7, clearance, 3]).align(group.parts.hdmi2, 'xz').snap(group.parts.hdmi2, 'y', 'outside+').color('red'), 'clearance-hdmi2', true);
310
- group.add(AvJack().snap('block', mb, 'z', 'outside-').midlineTo('block', 'x', 3.5 + 7.7 + 14.8 + 13.5 + 7 + 7.5), 'avjack', false, 'avjack');
311
- group.add(jscadUtils.parts.Cylinder(6, clearance).rotateX(90).align(group.parts.avjack, 'xz').snap(group.parts.avjack, 'y', 'outside+').color('red'), 'clearance-avjack', true);
312
- group.add(Ribbon().snap(mb, 'z', 'outside-').midlineTo('x', 3.5 + 7.7 + 14.8 + 13.5 + 7), 'camera');
313
- group.add(Ribbon().snap(mb, 'z', 'outside-').midlineTo('x', 4).midlineTo('y', 24.5 + 3.5), 'display');
252
+ group.add(CamDisplay().snap(mb, 'z', 'outside-').midlineTo('x', 55), 'camera0');
253
+ group.add(CamDisplay().snap(mb, 'z', 'outside-').midlineTo('x', 50), 'camera1');
254
+ group.add(PCIe().snap(mb, 'z', 'outside-').midlineTo('x', 3.5).midlineTo('y', 30), 'display');
314
255
  group.add(Gpio().snap(mb, 'z', 'outside-').midlineTo('x', 29 + 3.5).midlineTo('y', 56 - 3.5), 'gpio');
315
- group.add(BoardLed().snap(mb, 'z', 'outside-').midlineTo('x', 1.1).midlineTo('y', 8).color('lightgreen'), 'activityled');
316
- group.add(BoardLed().snap(mb, 'z', 'outside-').midlineTo('x', 1.1).midlineTo('y', 12).color('red'), 'powerled');
256
+ group.add(BoardLed().snap(mb, 'z', 'outside-').midlineTo('x', 1.1).midlineTo('y', 13.3).color('lightgreen'), 'statusled');
257
+ group.add(jscadUtils.parts.Cylinder(2, clearance).rotateY(90).align(group.parts.statusled, 'yz').snap(mb, 'x', 'outside+').color('red'), 'clearance-statusled', true);
258
+ group.add(PSW().snap('block', mb, 'z', 'outside-').snap('block', mb, 'x', 'inside-').midlineTo('block', 'y', 18.4), 'powerswitch');
259
+ group.add(jscadUtils.parts.Cylinder(3, clearance).rotateY(90).align(group.parts.powerswitch, 'yz').snap(group.parts.powerswitch, 'x', 'outside+').color('red'), 'clearance-powerswitch', true);
317
260
  }
318
261
 
319
262
  /**
@@ -357,7 +300,7 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
357
300
  }, options),
358
301
  clearance = _Object$assign.clearance;
359
302
  model = !model ? 2 : model === true ? 3 : model;
360
- debug$1('BPlus model:', model);
303
+ debug$3('BPlus model:', model);
361
304
  var mb = BPlusMotherboard(model == 4 ? 3 : 2);
362
305
  var group = jscadUtils.Group('mb', mb);
363
306
 
@@ -367,10 +310,10 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
367
310
  if (model < 4) {
368
311
  // Right side parts
369
312
  group.add(RightSide(EthernetJack(), mb).midlineTo('y', 10.25), 'ethernet');
370
- debug$1('mb', mb);
313
+ debug$3('mb', mb);
371
314
  var usb = UsbJack();
372
315
  var usbTranslation = jscadUtils.array.add(usb.parts.flange.calcSnap(mb, 'x', 'inside+'), [2, 0, 0], usb.parts.body.calcSnap(mb, 'y', 'inside-'), usb.parts.body.calcSnap(mb, 'z', 'outside-'));
373
- debug$1('usbTranslation', usbTranslation, jscadUtils.util.calcmidlineTo(usb.parts.body, 'y', 29));
316
+ debug$3('usbTranslation', usbTranslation, jscadUtils.util.calcmidlineTo(usb.parts.body, 'y', 29));
374
317
  group.add(usb.clone().translate(usbTranslation).translate(jscadUtils.util.calcmidlineTo(usb.parts.body, 'y', 29)), 'usb1', false, 'usb1');
375
318
  group.add(usb.clone().translate(usbTranslation).translate(jscadUtils.util.calcmidlineTo(usb.parts.body, 'y', 47)), 'usb2', false, 'usb2');
376
319
  group.add(MicroUsb().snap(mb, 'z', 'outside-').midlineTo('x', 10.6).translate([0, -2, 0]), 'microusb');
@@ -400,10 +343,13 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
400
343
 
401
344
  /** Add fan mounting holes for PI 5 */
402
345
  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));
346
+ group.holes.push(MountingHole(3.25, 1.32).snap(mb, 'xy', 'inside-').align(mb, 'z').midlineTo('x', 3.5).midlineTo('y', 6 + 3.5));
404
347
  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));
348
+ group.holes.push(MountingHole(3.25, 1.32).snap(mb, 'xy', 'inside-').align(mb, 'z').midlineTo('x', 3.5 + 58).midlineTo('y', 52.5 - 6));
406
349
  group.add(group.holes[5], 'fan2hole', true);
350
+ var fanClearance = jscadUtils.parts.Cylinder(4.5, 4).color('red').align(group.parts.fan1hole, 'xy').snap(group.parts.mb, 'z', 'outside+');
351
+ group.add(fanClearance, 'clearance-fan1', true, 'clearance');
352
+ group.add(fanClearance.align(group.parts.fan2hole, 'xy').snap(group.parts.mb, 'z', 'outside+'), 'clearance-fan2', true, 'clearance');
407
353
  }
408
354
  return group;
409
355
  }
@@ -578,7 +524,9 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
578
524
  }
579
525
  }
580
526
 
581
- /** @typedef {typeof import("@jwc/jscad-utils/src/group").JsCadUtilsGroup} JsCadUtilsGroup */
527
+ var debug$2 = jscadUtils.Debug('jscadRPi:HQCameraModule');
528
+
529
+ /** @typedef {import("@jwc/jscad-utils/src/group").JsCadUtilsGroup} JsCadUtilsGroup */
582
530
 
583
531
  /**
584
532
  * Returns a Raspberry Pi HQ camera JsCadUtilsGroup object.
@@ -612,10 +560,12 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
612
560
  * ]
613
561
  *
614
562
  * @function CameraModuleV2
563
+ * @param {boolean} [flipTripodMount=false] - Flip the tripod mount to the other side of the board.
615
564
  * @return {JsCadUtilsGroup} {description}
616
565
  */
617
566
  function HQCameraModule() {
618
567
  var _camera$holes;
568
+ var flipTripodMount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
619
569
  var t = 1.1;
620
570
  var camera = jscadUtils.Group();
621
571
  camera.add(jscadUtils.parts.RoundedCube(38, 38, t, 1.4).Center().color('green', 0.75), 'board');
@@ -631,13 +581,49 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
631
581
  var mountInside = jscadUtils.parts.Cylinder(30.75, 10.2).snap(camera.parts.board, 'z', 'outside-').align(camera.parts.board, 'xy').color('black');
632
582
  camera.add(mount.subtract(mountInside), 'mount');
633
583
  camera.add(mount, 'mount-clearance', true);
634
- var tripodMount = jscadUtils.parts.Cube([13.97, 12, 11]).snap(mount, 'z', 'inside+').snap(camera.parts.board, 'y', 'outside+').align(mount, 'x').color('gray');
635
- camera.add(tripodMount.union(jscadUtils.parts.Cube([24.5, 10, 7.62]).snap(mount, 'z', 'inside+').snap(tripodMount, 'y', 'outside-').align(mount, 'x').color('darkgray').subtract(mountInside)), 'tripodMount');
584
+ var tripodMountBase = jscadUtils.parts.Cube([24.5, 10, 7.62]).snap(mount, 'z', 'inside+').snap(camera.parts.board, 'y', 'inside-', -1).align(mount, 'x').color('darkgray').subtract(mountInside);
585
+ var tripodMount = jscadUtils.parts.Cube([14, 11.5, 11.5]).snap(tripodMountBase, 'z', flipTripodMount ? 'inside-' : 'inside+').snap(tripodMountBase, 'y', 'outside+').align(mount, 'x').color('gray');
586
+ camera.add(tripodMountBase.union(tripodMount), 'tripodMount');
636
587
  camera.add(jscadUtils.parts.Cube([20.8, 5.5, 3.55 - t]).snap(camera.parts.board, 'y', 'inside-').snap(camera.parts.board, 'z', 'outside+').align(camera.parts.board, 'x'), 'ribbon');
637
588
  camera.add(camera.parts.ribbon.enlarge(2, 4, -1).snap(camera.parts.ribbon, 'y', 'outside+').color('red'), 'ribbon-nogo');
589
+ debug$2("camera parts", camera.parts);
638
590
  return camera;
639
591
  }
640
592
 
593
+ scadApi.booleanOps.union;
594
+ var debug$1 = jscadUtils.Debug('jscadRPi:HyperPixel4Rectangular');
595
+
596
+ /** @typedef {typeof import("@jwc/jscad-utils/src/group").JsCadUtilsGroup} JsCadUtilsGroup */
597
+
598
+ function HyperPixel4Rectangular(pi) {
599
+ var group = jscadUtils.Group();
600
+ var board = jscadUtils.parts.Cube([97.85, 58.14, 1.65]).Center();
601
+ var notch = jscadUtils.parts.RoundedCube(10.1, 58.14 - 4.57 * 2, 1.65, 1.5).align(board, 'y').snap(board, 'x', 'inside-').snap(board, 'x', 'inside+').translate([2, 0, 0]);
602
+ group.add(board.subtract(notch).color('green', 0.75), 'mb');
603
+ var lcd = jscadUtils.parts.Cube([97.1, 58.44, 6.84 - 1.65]).color('black');
604
+ group.add(lcd.align(board, 'xy').translate(lcd.calcSnap(board, 'z', 'outside-')).translate([0, 0, 0.5]), 'lcd');
605
+
606
+ // group.add(Parts.Cube([15.35, 1, 10]).snap(board, 'x', 'inside+').snap(board, 'y', 'outside+').snap(board, 'z', 'outside+'), 'connector1');
607
+
608
+ // group.add(Parts.Cube([1, 1, 1.36]).snap(board, 'x', 'inside-').snap(board, 'y', 'inside-').snap(board, 'z', 'outside+'), 'dimcheck2');
609
+
610
+ // group.add(Parts.Cube([1, 1, 17.04]).snap(board, 'x', 'inside-').snap(board, 'y', 'inside+').snap(board, 'z', 'outside+'), 'dimcheck3');
611
+
612
+ var pad = Mountingpad(5.5, 22.78 - 5.8).snap(board, 'z', 'outside+').snap(board, 'xy', 'inside+').translate([-15.35 + (5.5 - 2), -4.57 + (5.5 - 2), 0]);
613
+ var pads = [pad, pad.translate([-58, 0, 0]), pad.translate([0, -49, 0]), pad.translate([-58, -49, 0])];
614
+ group.add(pads[0], 'pad1');
615
+ group.add(pads[1], 'pad2');
616
+ group.add(pads[2], 'pad3');
617
+ group.add(pads[3], 'pad4');
618
+ group.rotate('mb', 'z', 180);
619
+ debug$1('pi.parts', pi ? pi.parts : null);
620
+ debug$1('group.parts', group.parts);
621
+ if (pi) {
622
+ group.align('pad1', pi.parts.hole1, 'xy').snap('pad1', pi.parts.mb, 'z', 'outside-');
623
+ }
624
+ return group;
625
+ }
626
+
641
627
  function boardButton(name, board, midline) {
642
628
  var g = jscadUtils.Group(name);
643
629
  g.add(jscadUtils.parts.Cube([6.5, 6.5, 2]).color('silver').snap(board, 'xy', 'inside-').snap(board, 'z', 'outside-').midlineTo('y', midline), 'base');
@@ -679,7 +665,7 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
679
665
  g.add(buttonCap('buttonCap2', g.parts.button2), 'buttonCap2', true, 'buttonCap2-');
680
666
  g.add(jscadUtils.parts.Cube([1, 5, 0.5]).color('blue').align(g.parts.buttonCap1, 'x').snap(g.parts.buttonCap1, 'y', 'outside+', 1).snap(g.parts.buttonCap1, 'z', 'inside-'), 'button-connector', true);
681
667
  g.add(g.parts['button-connector'].enlarge(0.5, 0.5, 0.5).color('red'), 'button-connector-clearance', true);
682
- g.add(jscadUtils.parts.Tube(7, 3, 7.5).snap(board, 'x', 'inside-').snap(board, 'y', 'inside+').snap(board, 'z', 'outside+').color('yellow'), 'standoff', true);
668
+ g.add(jscadUtils.parts.Tube(7, 3, 8.5).snap(board, 'x', 'inside-').snap(board, 'y', 'inside+').snap(board, 'z', 'outside+').color('yellow'), 'standoff', true);
683
669
  return g;
684
670
  }
685
671
 
@@ -905,6 +891,7 @@ var jscadRPi = (function (exports, jscadUtils, jsCadCSG, scadApi) {
905
891
  exports.HQCameraModule = HQCameraModule;
906
892
  exports.Hat = Hat;
907
893
  exports.HatStandoff = HatStandoff;
894
+ exports.HyperPixel4Rectangular = HyperPixel4Rectangular;
908
895
  exports.MiniPiTFT = miniPiTFT;
909
896
  exports.PiTFT22 = PiTFT22;
910
897
  exports.PiTFT24 = PiTFT24;
@@ -3,7 +3,7 @@ function main() {
3
3
 
4
4
  var camera = RaspberryPi.ActiveCoolingFan();
5
5
 
6
- return camera.combine().Center();
6
+ return camera.combineAll().Center();
7
7
  }
8
8
 
9
9
  // include:js
@@ -15,17 +15,17 @@ function main() {
15
15
  RaspberryPi.MiniPiTFT()
16
16
  .snap('board', pi.parts.mb, 'x', 'inside-')
17
17
  .snap('board', pi.parts.mb, 'y', 'inside+')
18
- .snap('board', pi.parts.mb, 'z', 'outside-', 15),
18
+ .snap('board', pi.parts.mb, 'z', 'outside-', 9),
19
19
  'miniPiTFT',
20
20
  true,
21
21
  'miniPiTFT'
22
22
  );
23
23
 
24
- pi.add(RaspberryPi.ActiveCoolingFan()
25
- .snap('board', pi.parts.mb, 'x', 'inside-')
26
- .snap('board', pi.parts.mb, 'y', 'inside+')
27
- .snap('board', pi.parts.cpu, 'z', 'outside-', 1)
28
- .translate([0, -6, 0]), "activeCoolingFan", true, 'activeCoolingFan');
24
+ // pi.add(RaspberryPi.ActiveCoolingFan()
25
+ // .snap('board', pi.parts.mb, 'x', 'inside-')
26
+ // .snap('board', pi.parts.mb, 'y', 'inside+')
27
+ // .snap('board', pi.parts.cpu, 'z', 'outside-', 1)
28
+ // .translate([0, -6, 0]), "activeCoolingFan", true, 'activeCoolingFan');
29
29
 
30
30
  return pi.combineAll();
31
31
  }
@@ -1,7 +1,7 @@
1
1
  function main() {
2
- util.init(CSG);
2
+ util.init(CSG, { debug: 'jscadRPi:HQCameraModule' });
3
3
 
4
- var camera = RaspberryPi.HQCameraModule();
4
+ var camera = RaspberryPi.HQCameraModule(true);
5
5
 
6
6
  return camera.combine();
7
7
  }
@@ -0,0 +1,10 @@
1
+ function main() {
2
+ util.init(CSG, { debug: 'jscadRPi*,jscadUtils:group' });
3
+
4
+ var pi = RaspberryPi.HyperPixel4Rectangular();
5
+
6
+ return pi.combine().Center();
7
+ }
8
+
9
+ // include:js
10
+ // endinject
@@ -1,7 +1,7 @@
1
1
  function main() {
2
2
  util.init(CSG, { debug: 'jscadRPi*,jscadUtils:util' });
3
3
 
4
- var pi = RaspberryPi.BPlus(5);
4
+ var pi = RaspberryPi.BPlus(4);
5
5
 
6
6
  return pi.combine().Center();
7
7
  }
@@ -3,15 +3,12 @@ function main() {
3
3
 
4
4
  var pi = RaspberryPi.BPlus(5, 25);
5
5
 
6
- pi.add(
7
- RaspberryPi.PiTFT24({}, pi.parts.mb).snap(
8
- 'mb',
9
- pi.parts.spacer,
10
- 'z',
11
- 'outside-'
12
- ),
13
- 'screen'
14
- );
6
+ // pi.add(
7
+ // RaspberryPi.PiTFT24({}, pi.parts.mb),
8
+ // 'screen',
9
+ // true,
10
+ // 'screen'
11
+ // );
15
12
 
16
13
  return pi.combineAll().Center();
17
14
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jwc/jscad-raspberrypi",
3
- "version": "3.2.0",
3
+ "version": "3.3.0",
4
4
  "description": "jscad parts library for RaspberryPi",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -29,7 +29,7 @@
29
29
  "dependencies": {
30
30
  "@jscad/csg": "0.7.0",
31
31
  "@jscad/scad-api": "0.5.1",
32
- "@jwc/jscad-utils": "4.8.4"
32
+ "@jwc/jscad-utils": "4.9.0"
33
33
  },
34
34
  "ava": {
35
35
  "files": [
@@ -73,7 +73,7 @@
73
73
  "gulp-watch": "5.0.1",
74
74
  "looks-same": "10.0.1",
75
75
  "nyc": "17.1.0",
76
- "rollup": "4.52.0",
76
+ "rollup": "4.52.2",
77
77
  "vuepress-jsdoc": "5.0.0"
78
78
  }
79
79
  }
@@ -0,0 +1,7 @@
1
+ // prettier.config.js or .prettierrc.js
2
+ module.exports = {
3
+ trailingComma: 'none',
4
+ tabWidth: 2,
5
+ semi: true,
6
+ singleQuote: true
7
+ };