@jwc/jscad-raspberrypi 3.2.1 → 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 +74 -30
  3. package/dist/examples/bplus.jscad +73 -29
  4. package/dist/examples/bplus3.jscad +73 -29
  5. package/dist/examples/camera-module-v1.jscad +73 -29
  6. package/dist/examples/camera-module-v2.jscad +73 -29
  7. package/dist/examples/example.jscad +79 -35
  8. package/dist/examples/hat-standoff.jscad +73 -29
  9. package/dist/examples/hat.jscad +73 -29
  10. package/dist/examples/hq_camera-module.jscad +75 -31
  11. package/dist/examples/hyper-pixel-4-rectangular.jscad +2781 -0
  12. package/dist/examples/miniPiTFT.jscad +73 -29
  13. package/dist/examples/pi-tft22.jscad +73 -29
  14. package/dist/examples/pi-tft24 copy.jscad +2750 -0
  15. package/dist/examples/pi-tft24.jscad +73 -29
  16. package/dist/examples/pi4.jscad +74 -30
  17. package/dist/examples/pi5.jscad +79 -38
  18. package/dist/examples/spacer.jscad +73 -29
  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 +1 -1
  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
@@ -18,5 +18,8 @@
18
18
  "titleBar.inactiveBackground": "#83256199",
19
19
  "titleBar.inactiveForeground": "#e7e7e799"
20
20
  },
21
- "peacock.color": "#832561"
21
+ "peacock.color": "#832561",
22
+ "cSpell.words": [
23
+ "statusled"
24
+ ]
22
25
  }
@@ -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
@@ -2254,7 +2254,8 @@ function initJscadRPi() {
2254
2254
  jsCadCSG.CSG;
2255
2255
  scadApi.booleanOps.union;
2256
2256
  function RightSide(o, mb) {
2257
- return o.translate(jscadUtils.array.add(o.calcSnap(mb, "z", "outside-"), o.calcSnap(mb, "x", "inside+"), o.calcSnap(mb, "y", "inside-"), [ 2, 0, 0 ]));
2257
+ var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [ 2, 0, 0 ];
2258
+ return o.translate(jscadUtils.array.add(o.calcSnap(mb, "z", "outside-"), o.calcSnap(mb, "x", "inside+"), o.calcSnap(mb, "y", "inside-"), offset));
2258
2259
  }
2259
2260
  function LeftSide(o, mb) {
2260
2261
  return o.translate(calcLeftSide(o, mb));
@@ -2307,9 +2308,20 @@ function initJscadRPi() {
2307
2308
  var cyl = jscadUtils.parts.Cylinder(6, 2).rotateX(90).align(block, "xz").snap(block, "y", "outside+").color("black");
2308
2309
  return jscadUtils.Group("block,cylinder", [ block, cyl ]);
2309
2310
  }
2311
+ function PSW() {
2312
+ var block = jscadUtils.parts.Cube([ 2.8, 4.5, 3.7 ]).color("gray");
2313
+ var cyl = jscadUtils.parts.Cylinder(2, 1).rotateY(90).align(block, "yz").snap(block, "x", "outside+").color("black");
2314
+ return jscadUtils.Group("block,button", [ block, cyl ]);
2315
+ }
2310
2316
  function Ribbon() {
2311
2317
  return jscadUtils.parts.Cube([ 3, 22.4, 5.7 ]).color("gray");
2312
2318
  }
2319
+ function CamDisplay() {
2320
+ return jscadUtils.parts.Cube([ 3, 16, 5 ]).color("gray");
2321
+ }
2322
+ function PCIe() {
2323
+ return jscadUtils.parts.Cube([ 3, 12, 5 ]).color("gray");
2324
+ }
2313
2325
  function Gpio(mb) {
2314
2326
  var gpio = jscadUtils.parts.Cube([ 50.64, 5, 8.72 ]).color("gray");
2315
2327
  return mb ? gpio.snap(mb, "xy", "inside-").snap(mb, "z", "outside-").midlineTo("x", 32.5).midlineTo("y", 52.5) : gpio;
@@ -2317,13 +2329,13 @@ function initJscadRPi() {
2317
2329
  function BoardLed() {
2318
2330
  return jscadUtils.parts.Cube([ 1, 2, .7 ]);
2319
2331
  }
2320
- var debug$2 = jscadUtils.Debug("jscadRPi:BPlusMounting");
2332
+ var debug$4 = jscadUtils.Debug("jscadRPi:BPlusMounting");
2321
2333
  function holes(mb) {
2322
2334
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2323
2335
  options = Object.assign(options, {
2324
2336
  height: 8
2325
2337
  });
2326
- debug$2("holes", mb, options);
2338
+ debug$4("holes", mb, options);
2327
2339
  var hole = MountingHole(options.diameter || 3.25, options.height).snap(mb, "xy", "inside-").align(mb, "z");
2328
2340
  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) ];
2329
2341
  return jscadUtils.Group("hole1,hole2,hole3,hole4", holes);
@@ -2342,9 +2354,9 @@ function initJscadRPi() {
2342
2354
  holes,
2343
2355
  pads
2344
2356
  };
2345
- var debug$1 = jscadUtils.Debug("jscadRPi:BPlus");
2357
+ var debug$3 = jscadUtils.Debug("jscadRPi:BPlus");
2346
2358
  function pi4(group, clearance, mb) {
2347
- group.add(RightSide(jscadUtils.parts.Cube([ 21.5, 16.5, 13.5 ]).color("lightgray"), mb).translate([ 2, 0, 0 ]).midlineTo("y", 45.75), "ethernet");
2359
+ group.add(RightSide(jscadUtils.parts.Cube([ 21.5, 16.5, 13.5 ]).color("lightgray"), mb, [ 3, 0, 0 ]).midlineTo("y", 45.75), "ethernet");
2348
2360
  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");
2349
2361
  var usb = jscadUtils.Group();
2350
2362
  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");
@@ -2368,30 +2380,31 @@ function initJscadRPi() {
2368
2380
  group.add(BoardLed().snap(mb, "z", "outside-").midlineTo("x", 1.1).midlineTo("y", 12).color("red"), "powerled");
2369
2381
  }
2370
2382
  function pi5(group, clearance, mb) {
2371
- group.add(jscadUtils.parts.Cube([ 12, 12, 3 ]).color("lightgray").translate([ 24, 15, 2 ]), "cpu");
2372
- group.add(jscadUtils.parts.Cube([ 12, 12, clearance ]).color("red").translate([ 24, 15, 2 ]), "clearance-cpu", true, "clearance");
2373
- group.add(RightSide(jscadUtils.parts.Cube([ 21.5, 16.5, 13.5 ]).color("lightgray"), mb).translate([ 2, 0, 0 ]).midlineTo("y", 10.2), "ethernet");
2383
+ 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");
2384
+ 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");
2385
+ group.add(RightSide(jscadUtils.parts.Cube([ 21.5, 16.5, 13.5 ]).color("lightgray"), mb, [ 3, 0, 0 ]).midlineTo("y", 10.2), "ethernet");
2374
2386
  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");
2375
2387
  var usb = jscadUtils.Group();
2376
- 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");
2377
- usb.add(jscadUtils.parts.Cube([ 1, 15, 16 ]).snap(usb.parts.body, "x", "outside-").align(usb.parts.body, "yz").color("lightgray"), "flange");
2378
- group.add(usb.clone().translate(jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 29.7)), "usb1", false, "usb1");
2379
- group.add(jscadUtils.parts.Cube([ clearance, 15, 16 ]).align(group.parts.usb1, "yz").snap(group.parts.usb1, "x", "outside-").color("red"), "clearance-usb1", true);
2388
+ usb.add(jscadUtils.parts.Cube([ 17, 13.1, 15 ]).snap(group.parts.ethernet, "x", "inside+", -1).snap(mb, "z", "outside-", .5).color("lightgray"), "body");
2389
+ usb.add(jscadUtils.parts.Cube([ 1, 15, 16.5 ]).snap(usb.parts.body, "x", "outside-").align(usb.parts.body, "yz").color("lightgray"), "flange");
2390
+ group.add(usb.clone().translate(jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 29.1)), "usb1", false, "usb1");
2391
+ 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);
2380
2392
  group.add(usb.clone().translate(jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 47)), "usb2", false, "usb2");
2381
2393
  group.add(jscadUtils.parts.Cube([ clearance, 15, 16 ]).align(group.parts.usb2, "yz").snap(group.parts.usb2, "x", "outside-").color("red"), "clearance-usb2", true);
2382
- 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");
2394
+ 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");
2383
2395
  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);
2384
- 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");
2396
+ 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");
2385
2397
  group.add(jscadUtils.parts.Cube([ 7, clearance, 3 ]).align(group.parts.hdmi1, "xz").snap(group.parts.hdmi1, "y", "outside+").color("red"), "clearance-hdmi1", true);
2386
- 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");
2398
+ 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");
2387
2399
  group.add(jscadUtils.parts.Cube([ 7, clearance, 3 ]).align(group.parts.hdmi2, "xz").snap(group.parts.hdmi2, "y", "outside+").color("red"), "clearance-hdmi2", true);
2388
- 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");
2389
- 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);
2390
- group.add(Ribbon().snap(mb, "z", "outside-").midlineTo("x", 3.5 + 7.7 + 14.8 + 13.5 + 7), "camera");
2391
- group.add(Ribbon().snap(mb, "z", "outside-").midlineTo("x", 4).midlineTo("y", 24.5 + 3.5), "display");
2400
+ group.add(CamDisplay().snap(mb, "z", "outside-").midlineTo("x", 55), "camera0");
2401
+ group.add(CamDisplay().snap(mb, "z", "outside-").midlineTo("x", 50), "camera1");
2402
+ group.add(PCIe().snap(mb, "z", "outside-").midlineTo("x", 3.5).midlineTo("y", 30), "display");
2392
2403
  group.add(Gpio().snap(mb, "z", "outside-").midlineTo("x", 29 + 3.5).midlineTo("y", 56 - 3.5), "gpio");
2393
- group.add(BoardLed().snap(mb, "z", "outside-").midlineTo("x", 1.1).midlineTo("y", 8).color("lightgreen"), "activityled");
2394
- group.add(BoardLed().snap(mb, "z", "outside-").midlineTo("x", 1.1).midlineTo("y", 12).color("red"), "powerled");
2404
+ group.add(BoardLed().snap(mb, "z", "outside-").midlineTo("x", 1.1).midlineTo("y", 13.3).color("lightgreen"), "statusled");
2405
+ group.add(jscadUtils.parts.Cylinder(2, clearance).rotateY(90).align(group.parts.statusled, "yz").snap(mb, "x", "outside+").color("red"), "clearance-statusled", true);
2406
+ group.add(PSW().snap("block", mb, "z", "outside-").snap("block", mb, "x", "inside-").midlineTo("block", "y", 18.4), "powerswitch");
2407
+ 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);
2395
2408
  }
2396
2409
  function BPlus() {
2397
2410
  var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 2;
@@ -2400,15 +2413,15 @@ function initJscadRPi() {
2400
2413
  clearance: 5
2401
2414
  }, options), clearance = _Object$assign.clearance;
2402
2415
  model = !model ? 2 : model === true ? 3 : model;
2403
- debug$1("BPlus model:", model);
2416
+ debug$3("BPlus model:", model);
2404
2417
  var mb = BPlusMotherboard(model == 4 ? 3 : 2);
2405
2418
  var group = jscadUtils.Group("mb", mb);
2406
2419
  if (model < 4) {
2407
2420
  group.add(RightSide(EthernetJack(), mb).midlineTo("y", 10.25), "ethernet");
2408
- debug$1("mb", mb);
2421
+ debug$3("mb", mb);
2409
2422
  var usb = UsbJack();
2410
2423
  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-"));
2411
- debug$1("usbTranslation", usbTranslation, jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 29));
2424
+ debug$3("usbTranslation", usbTranslation, jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 29));
2412
2425
  group.add(usb.clone().translate(usbTranslation).translate(jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 29)), "usb1", false, "usb1");
2413
2426
  group.add(usb.clone().translate(usbTranslation).translate(jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 47)), "usb2", false, "usb2");
2414
2427
  group.add(MicroUsb().snap(mb, "z", "outside-").midlineTo("x", 10.6).translate([ 0, -2, 0 ]), "microusb");
@@ -2436,10 +2449,13 @@ function initJscadRPi() {
2436
2449
  group.add(group.holes[2], "hole3", true);
2437
2450
  group.add(group.holes[3], "hole4", true);
2438
2451
  if (model >= 5) {
2439
- group.holes.push(MountingHole(3.25, 8).snap(mb, "xy", "inside-").align(mb, "z").midlineTo("x", 3.5).midlineTo("y", 6 + 3.5));
2452
+ group.holes.push(MountingHole(3.25, 1.32).snap(mb, "xy", "inside-").align(mb, "z").midlineTo("x", 3.5).midlineTo("y", 6 + 3.5));
2440
2453
  group.add(group.holes[4], "fan1hole", true);
2441
- group.holes.push(MountingHole(3.25, 8).snap(mb, "xy", "inside-").align(mb, "z").midlineTo("x", 3.5 + 58).midlineTo("y", 52.5 - 6));
2454
+ 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));
2442
2455
  group.add(group.holes[5], "fan2hole", true);
2456
+ var fanClearance = jscadUtils.parts.Cylinder(4.5, 4).color("red").align(group.parts.fan1hole, "xy").snap(group.parts.mb, "z", "outside+");
2457
+ group.add(fanClearance, "clearance-fan1", true, "clearance");
2458
+ group.add(fanClearance.align(group.parts.fan2hole, "xy").snap(group.parts.mb, "z", "outside+"), "clearance-fan2", true, "clearance");
2443
2459
  }
2444
2460
  return group;
2445
2461
  }
@@ -2555,8 +2571,10 @@ function initJscadRPi() {
2555
2571
  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;
2556
2572
  }
2557
2573
  }
2574
+ var debug$2 = jscadUtils.Debug("jscadRPi:HQCameraModule");
2558
2575
  function HQCameraModule() {
2559
2576
  var _camera$holes;
2577
+ var flipTripodMount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
2560
2578
  var t = 1.1;
2561
2579
  var camera = jscadUtils.Group();
2562
2580
  camera.add(jscadUtils.parts.RoundedCube(38, 38, t, 1.4).Center().color("green", .75), "board");
@@ -2572,12 +2590,37 @@ function initJscadRPi() {
2572
2590
  var mountInside = jscadUtils.parts.Cylinder(30.75, 10.2).snap(camera.parts.board, "z", "outside-").align(camera.parts.board, "xy").color("black");
2573
2591
  camera.add(mount.subtract(mountInside), "mount");
2574
2592
  camera.add(mount, "mount-clearance", true);
2575
- var tripodMount = jscadUtils.parts.Cube([ 13.97, 12, 11 ]).snap(mount, "z", "inside+").snap(camera.parts.board, "y", "outside+").align(mount, "x").color("gray");
2576
- 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");
2593
+ 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);
2594
+ 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");
2595
+ camera.add(tripodMountBase.union(tripodMount), "tripodMount");
2577
2596
  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");
2578
2597
  camera.add(camera.parts.ribbon.enlarge(2, 4, -1).snap(camera.parts.ribbon, "y", "outside+").color("red"), "ribbon-nogo");
2598
+ debug$2("camera parts", camera.parts);
2579
2599
  return camera;
2580
2600
  }
2601
+ scadApi.booleanOps.union;
2602
+ var debug$1 = jscadUtils.Debug("jscadRPi:HyperPixel4Rectangular");
2603
+ function HyperPixel4Rectangular(pi) {
2604
+ var group = jscadUtils.Group();
2605
+ var board = jscadUtils.parts.Cube([ 97.85, 58.14, 1.65 ]).Center();
2606
+ 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 ]);
2607
+ group.add(board.subtract(notch).color("green", .75), "mb");
2608
+ var lcd = jscadUtils.parts.Cube([ 97.1, 58.44, 6.84 - 1.65 ]).color("black");
2609
+ group.add(lcd.align(board, "xy").translate(lcd.calcSnap(board, "z", "outside-")).translate([ 0, 0, .5 ]), "lcd");
2610
+ 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 ]);
2611
+ var pads = [ pad, pad.translate([ -58, 0, 0 ]), pad.translate([ 0, -49, 0 ]), pad.translate([ -58, -49, 0 ]) ];
2612
+ group.add(pads[0], "pad1");
2613
+ group.add(pads[1], "pad2");
2614
+ group.add(pads[2], "pad3");
2615
+ group.add(pads[3], "pad4");
2616
+ group.rotate("mb", "z", 180);
2617
+ debug$1("pi.parts", pi ? pi.parts : null);
2618
+ debug$1("group.parts", group.parts);
2619
+ if (pi) {
2620
+ group.align("pad1", pi.parts.hole1, "xy").snap("pad1", pi.parts.mb, "z", "outside-");
2621
+ }
2622
+ return group;
2623
+ }
2581
2624
  function boardButton(name, board, midline) {
2582
2625
  var g = jscadUtils.Group(name);
2583
2626
  g.add(jscadUtils.parts.Cube([ 6.5, 6.5, 2 ]).color("silver").snap(board, "xy", "inside-").snap(board, "z", "outside-").midlineTo("y", midline), "base");
@@ -2603,7 +2646,7 @@ function initJscadRPi() {
2603
2646
  g.add(buttonCap("buttonCap2", g.parts.button2), "buttonCap2", true, "buttonCap2-");
2604
2647
  g.add(jscadUtils.parts.Cube([ 1, 5, .5 ]).color("blue").align(g.parts.buttonCap1, "x").snap(g.parts.buttonCap1, "y", "outside+", 1).snap(g.parts.buttonCap1, "z", "inside-"), "button-connector", true);
2605
2648
  g.add(g.parts["button-connector"].enlarge(.5, .5, .5).color("red"), "button-connector-clearance", true);
2606
- 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);
2649
+ 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);
2607
2650
  return g;
2608
2651
  }
2609
2652
  function PiTFT22() {
@@ -2723,6 +2766,7 @@ function initJscadRPi() {
2723
2766
  exports.HQCameraModule = HQCameraModule;
2724
2767
  exports.Hat = Hat;
2725
2768
  exports.HatStandoff = HatStandoff;
2769
+ exports.HyperPixel4Rectangular = HyperPixel4Rectangular;
2726
2770
  exports.MiniPiTFT = miniPiTFT;
2727
2771
  exports.PiTFT22 = PiTFT22;
2728
2772
  exports.PiTFT24 = PiTFT24;
@@ -2254,7 +2254,8 @@ function initJscadRPi() {
2254
2254
  jsCadCSG.CSG;
2255
2255
  scadApi.booleanOps.union;
2256
2256
  function RightSide(o, mb) {
2257
- return o.translate(jscadUtils.array.add(o.calcSnap(mb, "z", "outside-"), o.calcSnap(mb, "x", "inside+"), o.calcSnap(mb, "y", "inside-"), [ 2, 0, 0 ]));
2257
+ var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [ 2, 0, 0 ];
2258
+ return o.translate(jscadUtils.array.add(o.calcSnap(mb, "z", "outside-"), o.calcSnap(mb, "x", "inside+"), o.calcSnap(mb, "y", "inside-"), offset));
2258
2259
  }
2259
2260
  function LeftSide(o, mb) {
2260
2261
  return o.translate(calcLeftSide(o, mb));
@@ -2307,9 +2308,20 @@ function initJscadRPi() {
2307
2308
  var cyl = jscadUtils.parts.Cylinder(6, 2).rotateX(90).align(block, "xz").snap(block, "y", "outside+").color("black");
2308
2309
  return jscadUtils.Group("block,cylinder", [ block, cyl ]);
2309
2310
  }
2311
+ function PSW() {
2312
+ var block = jscadUtils.parts.Cube([ 2.8, 4.5, 3.7 ]).color("gray");
2313
+ var cyl = jscadUtils.parts.Cylinder(2, 1).rotateY(90).align(block, "yz").snap(block, "x", "outside+").color("black");
2314
+ return jscadUtils.Group("block,button", [ block, cyl ]);
2315
+ }
2310
2316
  function Ribbon() {
2311
2317
  return jscadUtils.parts.Cube([ 3, 22.4, 5.7 ]).color("gray");
2312
2318
  }
2319
+ function CamDisplay() {
2320
+ return jscadUtils.parts.Cube([ 3, 16, 5 ]).color("gray");
2321
+ }
2322
+ function PCIe() {
2323
+ return jscadUtils.parts.Cube([ 3, 12, 5 ]).color("gray");
2324
+ }
2313
2325
  function Gpio(mb) {
2314
2326
  var gpio = jscadUtils.parts.Cube([ 50.64, 5, 8.72 ]).color("gray");
2315
2327
  return mb ? gpio.snap(mb, "xy", "inside-").snap(mb, "z", "outside-").midlineTo("x", 32.5).midlineTo("y", 52.5) : gpio;
@@ -2317,13 +2329,13 @@ function initJscadRPi() {
2317
2329
  function BoardLed() {
2318
2330
  return jscadUtils.parts.Cube([ 1, 2, .7 ]);
2319
2331
  }
2320
- var debug$2 = jscadUtils.Debug("jscadRPi:BPlusMounting");
2332
+ var debug$4 = jscadUtils.Debug("jscadRPi:BPlusMounting");
2321
2333
  function holes(mb) {
2322
2334
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2323
2335
  options = Object.assign(options, {
2324
2336
  height: 8
2325
2337
  });
2326
- debug$2("holes", mb, options);
2338
+ debug$4("holes", mb, options);
2327
2339
  var hole = MountingHole(options.diameter || 3.25, options.height).snap(mb, "xy", "inside-").align(mb, "z");
2328
2340
  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) ];
2329
2341
  return jscadUtils.Group("hole1,hole2,hole3,hole4", holes);
@@ -2342,9 +2354,9 @@ function initJscadRPi() {
2342
2354
  holes,
2343
2355
  pads
2344
2356
  };
2345
- var debug$1 = jscadUtils.Debug("jscadRPi:BPlus");
2357
+ var debug$3 = jscadUtils.Debug("jscadRPi:BPlus");
2346
2358
  function pi4(group, clearance, mb) {
2347
- group.add(RightSide(jscadUtils.parts.Cube([ 21.5, 16.5, 13.5 ]).color("lightgray"), mb).translate([ 2, 0, 0 ]).midlineTo("y", 45.75), "ethernet");
2359
+ group.add(RightSide(jscadUtils.parts.Cube([ 21.5, 16.5, 13.5 ]).color("lightgray"), mb, [ 3, 0, 0 ]).midlineTo("y", 45.75), "ethernet");
2348
2360
  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");
2349
2361
  var usb = jscadUtils.Group();
2350
2362
  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");
@@ -2368,30 +2380,31 @@ function initJscadRPi() {
2368
2380
  group.add(BoardLed().snap(mb, "z", "outside-").midlineTo("x", 1.1).midlineTo("y", 12).color("red"), "powerled");
2369
2381
  }
2370
2382
  function pi5(group, clearance, mb) {
2371
- group.add(jscadUtils.parts.Cube([ 12, 12, 3 ]).color("lightgray").translate([ 24, 15, 2 ]), "cpu");
2372
- group.add(jscadUtils.parts.Cube([ 12, 12, clearance ]).color("red").translate([ 24, 15, 2 ]), "clearance-cpu", true, "clearance");
2373
- group.add(RightSide(jscadUtils.parts.Cube([ 21.5, 16.5, 13.5 ]).color("lightgray"), mb).translate([ 2, 0, 0 ]).midlineTo("y", 10.2), "ethernet");
2383
+ 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");
2384
+ 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");
2385
+ group.add(RightSide(jscadUtils.parts.Cube([ 21.5, 16.5, 13.5 ]).color("lightgray"), mb, [ 3, 0, 0 ]).midlineTo("y", 10.2), "ethernet");
2374
2386
  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");
2375
2387
  var usb = jscadUtils.Group();
2376
- 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");
2377
- usb.add(jscadUtils.parts.Cube([ 1, 15, 16 ]).snap(usb.parts.body, "x", "outside-").align(usb.parts.body, "yz").color("lightgray"), "flange");
2378
- group.add(usb.clone().translate(jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 29.7)), "usb1", false, "usb1");
2379
- group.add(jscadUtils.parts.Cube([ clearance, 15, 16 ]).align(group.parts.usb1, "yz").snap(group.parts.usb1, "x", "outside-").color("red"), "clearance-usb1", true);
2388
+ usb.add(jscadUtils.parts.Cube([ 17, 13.1, 15 ]).snap(group.parts.ethernet, "x", "inside+", -1).snap(mb, "z", "outside-", .5).color("lightgray"), "body");
2389
+ usb.add(jscadUtils.parts.Cube([ 1, 15, 16.5 ]).snap(usb.parts.body, "x", "outside-").align(usb.parts.body, "yz").color("lightgray"), "flange");
2390
+ group.add(usb.clone().translate(jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 29.1)), "usb1", false, "usb1");
2391
+ 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);
2380
2392
  group.add(usb.clone().translate(jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 47)), "usb2", false, "usb2");
2381
2393
  group.add(jscadUtils.parts.Cube([ clearance, 15, 16 ]).align(group.parts.usb2, "yz").snap(group.parts.usb2, "x", "outside-").color("red"), "clearance-usb2", true);
2382
- 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");
2394
+ 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");
2383
2395
  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);
2384
- 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");
2396
+ 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");
2385
2397
  group.add(jscadUtils.parts.Cube([ 7, clearance, 3 ]).align(group.parts.hdmi1, "xz").snap(group.parts.hdmi1, "y", "outside+").color("red"), "clearance-hdmi1", true);
2386
- 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");
2398
+ 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");
2387
2399
  group.add(jscadUtils.parts.Cube([ 7, clearance, 3 ]).align(group.parts.hdmi2, "xz").snap(group.parts.hdmi2, "y", "outside+").color("red"), "clearance-hdmi2", true);
2388
- 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");
2389
- 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);
2390
- group.add(Ribbon().snap(mb, "z", "outside-").midlineTo("x", 3.5 + 7.7 + 14.8 + 13.5 + 7), "camera");
2391
- group.add(Ribbon().snap(mb, "z", "outside-").midlineTo("x", 4).midlineTo("y", 24.5 + 3.5), "display");
2400
+ group.add(CamDisplay().snap(mb, "z", "outside-").midlineTo("x", 55), "camera0");
2401
+ group.add(CamDisplay().snap(mb, "z", "outside-").midlineTo("x", 50), "camera1");
2402
+ group.add(PCIe().snap(mb, "z", "outside-").midlineTo("x", 3.5).midlineTo("y", 30), "display");
2392
2403
  group.add(Gpio().snap(mb, "z", "outside-").midlineTo("x", 29 + 3.5).midlineTo("y", 56 - 3.5), "gpio");
2393
- group.add(BoardLed().snap(mb, "z", "outside-").midlineTo("x", 1.1).midlineTo("y", 8).color("lightgreen"), "activityled");
2394
- group.add(BoardLed().snap(mb, "z", "outside-").midlineTo("x", 1.1).midlineTo("y", 12).color("red"), "powerled");
2404
+ group.add(BoardLed().snap(mb, "z", "outside-").midlineTo("x", 1.1).midlineTo("y", 13.3).color("lightgreen"), "statusled");
2405
+ group.add(jscadUtils.parts.Cylinder(2, clearance).rotateY(90).align(group.parts.statusled, "yz").snap(mb, "x", "outside+").color("red"), "clearance-statusled", true);
2406
+ group.add(PSW().snap("block", mb, "z", "outside-").snap("block", mb, "x", "inside-").midlineTo("block", "y", 18.4), "powerswitch");
2407
+ 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);
2395
2408
  }
2396
2409
  function BPlus() {
2397
2410
  var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 2;
@@ -2400,15 +2413,15 @@ function initJscadRPi() {
2400
2413
  clearance: 5
2401
2414
  }, options), clearance = _Object$assign.clearance;
2402
2415
  model = !model ? 2 : model === true ? 3 : model;
2403
- debug$1("BPlus model:", model);
2416
+ debug$3("BPlus model:", model);
2404
2417
  var mb = BPlusMotherboard(model == 4 ? 3 : 2);
2405
2418
  var group = jscadUtils.Group("mb", mb);
2406
2419
  if (model < 4) {
2407
2420
  group.add(RightSide(EthernetJack(), mb).midlineTo("y", 10.25), "ethernet");
2408
- debug$1("mb", mb);
2421
+ debug$3("mb", mb);
2409
2422
  var usb = UsbJack();
2410
2423
  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-"));
2411
- debug$1("usbTranslation", usbTranslation, jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 29));
2424
+ debug$3("usbTranslation", usbTranslation, jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 29));
2412
2425
  group.add(usb.clone().translate(usbTranslation).translate(jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 29)), "usb1", false, "usb1");
2413
2426
  group.add(usb.clone().translate(usbTranslation).translate(jscadUtils.util.calcmidlineTo(usb.parts.body, "y", 47)), "usb2", false, "usb2");
2414
2427
  group.add(MicroUsb().snap(mb, "z", "outside-").midlineTo("x", 10.6).translate([ 0, -2, 0 ]), "microusb");
@@ -2436,10 +2449,13 @@ function initJscadRPi() {
2436
2449
  group.add(group.holes[2], "hole3", true);
2437
2450
  group.add(group.holes[3], "hole4", true);
2438
2451
  if (model >= 5) {
2439
- group.holes.push(MountingHole(3.25, 8).snap(mb, "xy", "inside-").align(mb, "z").midlineTo("x", 3.5).midlineTo("y", 6 + 3.5));
2452
+ group.holes.push(MountingHole(3.25, 1.32).snap(mb, "xy", "inside-").align(mb, "z").midlineTo("x", 3.5).midlineTo("y", 6 + 3.5));
2440
2453
  group.add(group.holes[4], "fan1hole", true);
2441
- group.holes.push(MountingHole(3.25, 8).snap(mb, "xy", "inside-").align(mb, "z").midlineTo("x", 3.5 + 58).midlineTo("y", 52.5 - 6));
2454
+ 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));
2442
2455
  group.add(group.holes[5], "fan2hole", true);
2456
+ var fanClearance = jscadUtils.parts.Cylinder(4.5, 4).color("red").align(group.parts.fan1hole, "xy").snap(group.parts.mb, "z", "outside+");
2457
+ group.add(fanClearance, "clearance-fan1", true, "clearance");
2458
+ group.add(fanClearance.align(group.parts.fan2hole, "xy").snap(group.parts.mb, "z", "outside+"), "clearance-fan2", true, "clearance");
2443
2459
  }
2444
2460
  return group;
2445
2461
  }
@@ -2555,8 +2571,10 @@ function initJscadRPi() {
2555
2571
  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;
2556
2572
  }
2557
2573
  }
2574
+ var debug$2 = jscadUtils.Debug("jscadRPi:HQCameraModule");
2558
2575
  function HQCameraModule() {
2559
2576
  var _camera$holes;
2577
+ var flipTripodMount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
2560
2578
  var t = 1.1;
2561
2579
  var camera = jscadUtils.Group();
2562
2580
  camera.add(jscadUtils.parts.RoundedCube(38, 38, t, 1.4).Center().color("green", .75), "board");
@@ -2572,12 +2590,37 @@ function initJscadRPi() {
2572
2590
  var mountInside = jscadUtils.parts.Cylinder(30.75, 10.2).snap(camera.parts.board, "z", "outside-").align(camera.parts.board, "xy").color("black");
2573
2591
  camera.add(mount.subtract(mountInside), "mount");
2574
2592
  camera.add(mount, "mount-clearance", true);
2575
- var tripodMount = jscadUtils.parts.Cube([ 13.97, 12, 11 ]).snap(mount, "z", "inside+").snap(camera.parts.board, "y", "outside+").align(mount, "x").color("gray");
2576
- 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");
2593
+ 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);
2594
+ 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");
2595
+ camera.add(tripodMountBase.union(tripodMount), "tripodMount");
2577
2596
  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");
2578
2597
  camera.add(camera.parts.ribbon.enlarge(2, 4, -1).snap(camera.parts.ribbon, "y", "outside+").color("red"), "ribbon-nogo");
2598
+ debug$2("camera parts", camera.parts);
2579
2599
  return camera;
2580
2600
  }
2601
+ scadApi.booleanOps.union;
2602
+ var debug$1 = jscadUtils.Debug("jscadRPi:HyperPixel4Rectangular");
2603
+ function HyperPixel4Rectangular(pi) {
2604
+ var group = jscadUtils.Group();
2605
+ var board = jscadUtils.parts.Cube([ 97.85, 58.14, 1.65 ]).Center();
2606
+ 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 ]);
2607
+ group.add(board.subtract(notch).color("green", .75), "mb");
2608
+ var lcd = jscadUtils.parts.Cube([ 97.1, 58.44, 6.84 - 1.65 ]).color("black");
2609
+ group.add(lcd.align(board, "xy").translate(lcd.calcSnap(board, "z", "outside-")).translate([ 0, 0, .5 ]), "lcd");
2610
+ 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 ]);
2611
+ var pads = [ pad, pad.translate([ -58, 0, 0 ]), pad.translate([ 0, -49, 0 ]), pad.translate([ -58, -49, 0 ]) ];
2612
+ group.add(pads[0], "pad1");
2613
+ group.add(pads[1], "pad2");
2614
+ group.add(pads[2], "pad3");
2615
+ group.add(pads[3], "pad4");
2616
+ group.rotate("mb", "z", 180);
2617
+ debug$1("pi.parts", pi ? pi.parts : null);
2618
+ debug$1("group.parts", group.parts);
2619
+ if (pi) {
2620
+ group.align("pad1", pi.parts.hole1, "xy").snap("pad1", pi.parts.mb, "z", "outside-");
2621
+ }
2622
+ return group;
2623
+ }
2581
2624
  function boardButton(name, board, midline) {
2582
2625
  var g = jscadUtils.Group(name);
2583
2626
  g.add(jscadUtils.parts.Cube([ 6.5, 6.5, 2 ]).color("silver").snap(board, "xy", "inside-").snap(board, "z", "outside-").midlineTo("y", midline), "base");
@@ -2603,7 +2646,7 @@ function initJscadRPi() {
2603
2646
  g.add(buttonCap("buttonCap2", g.parts.button2), "buttonCap2", true, "buttonCap2-");
2604
2647
  g.add(jscadUtils.parts.Cube([ 1, 5, .5 ]).color("blue").align(g.parts.buttonCap1, "x").snap(g.parts.buttonCap1, "y", "outside+", 1).snap(g.parts.buttonCap1, "z", "inside-"), "button-connector", true);
2605
2648
  g.add(g.parts["button-connector"].enlarge(.5, .5, .5).color("red"), "button-connector-clearance", true);
2606
- 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);
2649
+ 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);
2607
2650
  return g;
2608
2651
  }
2609
2652
  function PiTFT22() {
@@ -2723,6 +2766,7 @@ function initJscadRPi() {
2723
2766
  exports.HQCameraModule = HQCameraModule;
2724
2767
  exports.Hat = Hat;
2725
2768
  exports.HatStandoff = HatStandoff;
2769
+ exports.HyperPixel4Rectangular = HyperPixel4Rectangular;
2726
2770
  exports.MiniPiTFT = miniPiTFT;
2727
2771
  exports.PiTFT22 = PiTFT22;
2728
2772
  exports.PiTFT24 = PiTFT24;