@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
@@ -1,66 +1,6 @@
1
1
  import { Group, parts as Parts } from '@jwc/jscad-utils';
2
2
 
3
- function boardButton(name, board, midline) {
4
- var g = Group(name);
5
- g.add(
6
- Parts.Cube([6.5, 6.5, 2])
7
- .color('silver')
8
- .snap(board, 'xy', 'inside-')
9
- .snap(board, 'z', 'outside-')
10
- .midlineTo('y', midline),
11
- 'base'
12
- );
13
- g.add(
14
- Parts.Cylinder(3, 1)
15
- .color('black')
16
- .align(g.parts.base, 'xy')
17
- .snap(g.parts.base, 'z', 'outside-'),
18
- 'push'
19
- );
20
3
 
21
- return g;
22
- }
23
-
24
- function buttonCap(name, button) {
25
- var g = Group(name);
26
- g.add(
27
- Parts.Cylinder(4, 3)
28
- .fillet(1, 'z+')
29
- // .translate([0, 0, 1])
30
- .union(
31
- Parts.Cylinder(6, 0.5).bisect('x', -0.5).parts.negative //.translate([0, 0, 1])
32
- )
33
-
34
- .color('blue')
35
- .align(button, 'xy')
36
- .snap(button, 'z', 'outside-'),
37
- 'cap'
38
- );
39
-
40
- g.add(
41
- Parts.Cylinder(7, 0.75)
42
- .bisect('x', -0.5)
43
- .parts.negative.color('green')
44
- .union(Parts.Cylinder(4.5, 2).color('yellow').translate([0, 0, 0]))
45
- .align(g.parts.cap, 'xy')
46
- .snap(g.parts.cap, 'z', 'inside-'),
47
- // .color('red'),
48
- 'clearance',
49
- true
50
- );
51
- return g;
52
- }
53
-
54
- /**
55
- * Returns an Adafruit miniPiTFT Hat with buttons.
56
- *
57
- * Default parts: board,screen,display,button1,button2
58
- *
59
- * 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
60
- *
61
- * ![miniPiTFT example](../images/miniPiTFT.png)
62
- * @function activeCoolingFan
63
- */
64
4
  export default function activeCoolingFan() {
65
5
  var g = Group('ActiveCoolingFan');
66
6
 
@@ -75,86 +15,7 @@ export default function activeCoolingFan() {
75
15
 
76
16
  g.add(board, 'board');
77
17
 
78
- // g.add(
79
- // Parts.Cube([31, 18, 2])
80
- // .color('white')
81
- // .snap(board, 'x', 'inside+')
82
- // .snap(board, 'y', 'inside-')
83
- // .snap(board, 'z', 'outside-'),
84
- // 'screen'
85
- // );
86
-
87
- // g.add(
88
- // Parts.Cube([util.inch(0.98), util.inch(0.58), 2.01])
89
- // .color('black')
90
- // .snap(board, 'x', 'inside-', util.inch(0.34))
91
- // .snap(board, 'y', 'inside+', -util.inch(0.32))
92
- // .snap(board, 'z', 'outside-'),
93
- // 'display'
94
- // );
95
-
96
- // g.add(
97
- // g.parts.display
98
- // .stretch('z', 5)
99
- // .chamfer(-5, 'z+')
100
- // .align(g.parts.display, 'xy')
101
- // .color('red'),
102
- // 'display-clearance',
103
- // true
104
- // );
105
-
106
- // g.add(
107
- // boardButton('button1', board, util.inch(0.53)),
108
- // 'button1',
109
- // false,
110
- // 'button1-'
111
- // );
112
-
113
- // g.add(
114
- // boardButton('button2', board, util.inch(0.18)),
115
- // 'button2',
116
- // false,
117
- // 'button2-'
118
- // );
119
-
120
- // g.add(
121
- // buttonCap('buttonCap1', g.parts.button1),
122
- // 'buttonCap1',
123
- // true,
124
- // 'buttonCap1-'
125
- // );
126
- // g.add(
127
- // buttonCap('buttonCap2', g.parts.button2),
128
- // 'buttonCap2',
129
- // true,
130
- // 'buttonCap2-'
131
- // );
132
-
133
- // g.add(
134
- // Parts.Cube([1, 5, 0.5])
135
- // .color('blue')
136
- // .align(g.parts.buttonCap1, 'x')
137
- // .snap(g.parts.buttonCap1, 'y', 'outside+', 1)
138
- // .snap(g.parts.buttonCap1, 'z', 'inside-'),
139
- // 'button-connector',
140
- // true
141
- // );
142
-
143
- // g.add(
144
- // g.parts['button-connector'].enlarge(0.5, 0.5, 0.5).color('red'),
145
- // 'button-connector-clearance',
146
- // true
147
- // );
148
18
 
149
- // g.add(
150
- // Parts.Tube(7, 3, 7.5)
151
- // .snap(board, 'x', 'inside-')
152
- // .snap(board, 'y', 'inside+')
153
- // .snap(board, 'z', 'outside+')
154
- // .color('yellow'),
155
- // 'standoff',
156
- // true
157
- // );
158
19
 
159
20
  return g;
160
21
  }
package/src/boardutils.js CHANGED
@@ -1,7 +1,7 @@
1
- import { util, array } from '@jwc/jscad-utils';
2
1
  import jsCadCSG from '@jscad/csg';
3
- const { CSG } = jsCadCSG;
4
2
  import scadApi from '@jscad/scad-api';
3
+ import { array, util } from '@jwc/jscad-utils';
4
+ const { CSG } = jsCadCSG;
5
5
  const { union } = scadApi.booleanOps;
6
6
 
7
7
  export function CornerHole(r, size, center) {
@@ -62,13 +62,20 @@ export function CornerHoles(hole_r, boardinfo) {
62
62
  return util.mirrored4(CornerHole(hole_r, boardinfo.size, 3.5));
63
63
  }
64
64
 
65
- export function RightSide(o, mb) {
65
+ /**
66
+ * @function RightSide
67
+ * @param {CSG} o A csg object to be placed on the right side of the motherboard}
68
+ * @param {CSG} mb A csg motherboard object
69
+ * @param {Array<number>} [offset=[2, 0, 0]] An offset to apply after positioning ex. [2,0,0]
70
+ * @return {CSG} The translated CSG object
71
+ */
72
+ export function RightSide(o, mb, offset = [2, 0, 0]) {
66
73
  return o.translate(
67
74
  array.add(
68
75
  o.calcSnap(mb, 'z', 'outside-'),
69
76
  o.calcSnap(mb, 'x', 'inside+'),
70
77
  o.calcSnap(mb, 'y', 'inside-'),
71
- [2, 0, 0]
78
+ offset
72
79
  )
73
80
  );
74
81
  }
package/src/bplus.js CHANGED
@@ -4,15 +4,16 @@ import * as BPlusMounting from './bplus-mounting';
4
4
  import * as RPiParts from './rpi-parts';
5
5
  const debug = Debug('jscadRPi:BPlus');
6
6
 
7
-
8
7
  function pi4(group, clearance, mb) {
9
8
  /**
10
- * Model 4
11
- */
9
+ * Model 4
10
+ */
12
11
  group.add(
13
- RightSide(Parts.Cube([21.5, 16.5, 13.5]).color('lightgray'), mb)
14
- .translate([2, 0, 0])
15
- .midlineTo('y', 45.75),
12
+ RightSide(
13
+ Parts.Cube([21.5, 16.5, 13.5]).color('lightgray'),
14
+ mb,
15
+ [3, 0, 0]
16
+ ).midlineTo('y', 45.75),
16
17
  'ethernet'
17
18
  );
18
19
 
@@ -196,30 +197,42 @@ function pi4(group, clearance, mb) {
196
197
  );
197
198
  }
198
199
 
199
-
200
200
  function pi5(group, clearance, mb) {
201
201
  /**
202
202
  * Model 5
203
203
  */
204
204
 
205
205
  group.add(
206
- Parts.Cube([12, 12, 3]).color('lightgray')
207
- .translate([24, 15, 2]),
206
+ Parts.Cube([17, 17, 3])
207
+ .color('lightgray')
208
+ .translate([0, 15, 0])
209
+ .midlineTo('x', 29 + 3.5)
210
+ .snap(group.parts.mb, 'z', 'outside-'),
208
211
  'cpu'
209
212
  );
210
213
 
211
214
  group.add(
212
- Parts.Cube([12, 12, clearance]).color('red')
213
- .translate([24, 15, 2]),
215
+ Parts.Cube([17, 17, clearance])
216
+ .color('red')
217
+ .align(group.parts.cpu, 'xy')
218
+ .snap(group.parts.cpu, 'z', 'outside-'),
214
219
  'clearance-cpu',
215
220
  true,
216
221
  'clearance'
217
222
  );
218
223
 
224
+ // group.add(Parts.Cube([1, 1, 15.1 - 1.46]).snap(mb, 'x', 'inside+')
225
+ // .snap(mb, 'y', 'inside-').snap(mb, 'z', 'outside-'), 'dimcheck1');
226
+
227
+ // group.add(Parts.Cube([3.06, 1, 1]).snap(mb, 'x', 'outside-')
228
+ // .snap(mb, 'y', 'inside-').align(mb, 'z'), 'dimcheck2');
229
+
219
230
  group.add(
220
- RightSide(Parts.Cube([21.5, 16.5, 13.5]).color('lightgray'), mb)
221
- .translate([2, 0, 0])
222
- .midlineTo('y', 10.2),
231
+ RightSide(
232
+ Parts.Cube([21.5, 16.5, 13.5]).color('lightgray'),
233
+ mb,
234
+ [3, 0, 0]
235
+ ).midlineTo('y', 10.2),
223
236
  'ethernet'
224
237
  );
225
238
 
@@ -233,17 +246,23 @@ function pi5(group, clearance, mb) {
233
246
  'clearance'
234
247
  );
235
248
 
249
+ // group.add(Parts.Cube([1, 1, 17.5 - 1.46]).snap(mb, 'x', 'inside+')
250
+ // .snap(mb, 'y', 'inside+').snap(mb, 'z', 'outside-'), 'dimcheck3');
251
+
252
+ // group.add(Parts.Cube([3, 1, 1]).snap(mb, 'x', 'outside-')
253
+ // .snap(mb, 'y', 'inside+').align(mb, 'z'), 'dimcheck4');
254
+
236
255
  var usb = Group();
237
256
  usb.add(
238
257
  Parts.Cube([17, 13.1, 15])
239
258
  .snap(group.parts.ethernet, 'x', 'inside+', -1)
240
- .snap(mb, 'z', 'outside-', 1.5)
259
+ .snap(mb, 'z', 'outside-', 0.5)
241
260
  .color('lightgray'),
242
261
  'body'
243
262
  );
244
263
 
245
264
  usb.add(
246
- Parts.Cube([1, 15, 16])
265
+ Parts.Cube([1, 15, 16.5])
247
266
  .snap(usb.parts.body, 'x', 'outside-')
248
267
  .align(usb.parts.body, 'yz')
249
268
  .color('lightgray'),
@@ -255,14 +274,14 @@ function pi5(group, clearance, mb) {
255
274
  .clone()
256
275
  // .translate(usbTranslation)
257
276
 
258
- .translate(util.calcmidlineTo(usb.parts.body, 'y', 29.7)),
277
+ .translate(util.calcmidlineTo(usb.parts.body, 'y', 29.1)),
259
278
  'usb1',
260
279
  false,
261
280
  'usb1'
262
281
  );
263
282
 
264
283
  group.add(
265
- Parts.Cube([clearance, 15, 16])
284
+ Parts.Cube([clearance, 15, 16.5])
266
285
  .align(group.parts.usb1, 'yz')
267
286
  .snap(group.parts.usb1, 'x', 'outside-')
268
287
  .color('red'),
@@ -293,7 +312,7 @@ function pi5(group, clearance, mb) {
293
312
  Parts.Cube([10, 7.5, 3.2])
294
313
  .snap(usb.parts.body, 'y', 'inside-', -1)
295
314
  .snap(mb, 'z', 'outside-')
296
- .midlineTo('x', 3.5 + 7.7)
315
+ .midlineTo('x', 11.2)
297
316
  .color('lightgray'),
298
317
  'usbc'
299
318
  );
@@ -311,7 +330,7 @@ function pi5(group, clearance, mb) {
311
330
  Parts.Cube([7, 7.5, 3])
312
331
  .snap(usb.parts.body, 'y', 'inside-', -1)
313
332
  .snap(mb, 'z', 'outside-')
314
- .midlineTo('x', 3.5 + 7.7 + 14.8)
333
+ .midlineTo('x', 25.8)
315
334
  .color('lightgray'),
316
335
  'hdmi1'
317
336
  );
@@ -329,7 +348,7 @@ function pi5(group, clearance, mb) {
329
348
  Parts.Cube([7, 7.5, 3])
330
349
  .snap(usb.parts.body, 'y', 'inside-', -1)
331
350
  .snap(mb, 'z', 'outside-')
332
- .midlineTo('x', 3.5 + 7.7 + 14.8 + 13.5)
351
+ .midlineTo('x', 39.2)
333
352
  .color('lightgray'),
334
353
  'hdmi2'
335
354
  );
@@ -344,36 +363,20 @@ function pi5(group, clearance, mb) {
344
363
  );
345
364
 
346
365
  group.add(
347
- RPiParts.AvJack()
348
- .snap('block', mb, 'z', 'outside-')
349
- .midlineTo('block', 'x', 3.5 + 7.7 + 14.8 + 13.5 + 7 + 7.5),
350
- 'avjack',
351
- false,
352
- 'avjack'
353
- );
354
-
355
- group.add(
356
- Parts.Cylinder(6, clearance)
357
- .rotateX(90)
358
- .align(group.parts.avjack, 'xz')
359
- .snap(group.parts.avjack, 'y', 'outside+')
360
- .color('red'),
361
- 'clearance-avjack',
362
- true
366
+ RPiParts.CamDisplay().snap(mb, 'z', 'outside-').midlineTo('x', 55),
367
+ 'camera0'
363
368
  );
364
369
 
365
370
  group.add(
366
- RPiParts.Ribbon()
367
- .snap(mb, 'z', 'outside-')
368
- .midlineTo('x', 3.5 + 7.7 + 14.8 + 13.5 + 7),
369
- 'camera'
371
+ RPiParts.CamDisplay().snap(mb, 'z', 'outside-').midlineTo('x', 50),
372
+ 'camera1'
370
373
  );
371
374
 
372
375
  group.add(
373
- RPiParts.Ribbon()
376
+ RPiParts.PCIe()
374
377
  .snap(mb, 'z', 'outside-')
375
- .midlineTo('x', 4)
376
- .midlineTo('y', 24.5 + 3.5),
378
+ .midlineTo('x', 3.5)
379
+ .midlineTo('y', 30),
377
380
  'display'
378
381
  );
379
382
 
@@ -389,20 +392,38 @@ function pi5(group, clearance, mb) {
389
392
  RPiParts.BoardLed()
390
393
  .snap(mb, 'z', 'outside-')
391
394
  .midlineTo('x', 1.1)
392
- .midlineTo('y', 8)
395
+ .midlineTo('y', 13.3)
393
396
  .color('lightgreen'),
394
- 'activityled'
397
+ 'statusled'
395
398
  );
399
+
396
400
  group.add(
397
- RPiParts.BoardLed()
398
- .snap(mb, 'z', 'outside-')
399
- .midlineTo('x', 1.1)
400
- .midlineTo('y', 12)
401
+ Parts.Cylinder(2, clearance)
402
+ .rotateY(90)
403
+ .align(group.parts.statusled, 'yz')
404
+ .snap(mb, 'x', 'outside+')
401
405
  .color('red'),
402
- 'powerled'
406
+ 'clearance-statusled',
407
+ true
403
408
  );
404
409
 
410
+ group.add(
411
+ RPiParts.PSW()
412
+ .snap('block', mb, 'z', 'outside-')
413
+ .snap('block', mb, 'x', 'inside-')
414
+ .midlineTo('block', 'y', 18.4),
415
+ 'powerswitch'
416
+ );
405
417
 
418
+ group.add(
419
+ Parts.Cylinder(3, clearance)
420
+ .rotateY(90)
421
+ .align(group.parts.powerswitch, 'yz')
422
+ .snap(group.parts.powerswitch, 'x', 'outside+')
423
+ .color('red'),
424
+ 'clearance-powerswitch',
425
+ true
426
+ );
406
427
  }
407
428
 
408
429
  /**
@@ -570,7 +591,6 @@ export default function BPlus(model = 2, options) {
570
591
  }
571
592
  } else if (model == 4) {
572
593
  pi4(group, clearance, mb);
573
-
574
594
  } else {
575
595
  pi5(group, clearance, mb);
576
596
  }
@@ -593,21 +613,41 @@ export default function BPlus(model = 2, options) {
593
613
 
594
614
  /** Add fan mounting holes for PI 5 */
595
615
  if (model >= 5) {
596
- group.holes.push(RPiParts.MountingHole(3.25, 8)
597
- .snap(mb, 'xy', 'inside-')
598
- .align(mb, 'z')
599
- .midlineTo('x', 3.5)
600
- .midlineTo('y', 6 + 3.5));
616
+ group.holes.push(
617
+ RPiParts.MountingHole(3.25, 1.32)
618
+ .snap(mb, 'xy', 'inside-')
619
+ .align(mb, 'z')
620
+ .midlineTo('x', 3.5)
621
+ .midlineTo('y', 6 + 3.5)
622
+ );
601
623
 
602
624
  group.add(group.holes[4], 'fan1hole', true);
603
625
 
604
- group.holes.push(RPiParts.MountingHole(3.25, 8)
605
- .snap(mb, 'xy', 'inside-')
606
- .align(mb, 'z')
607
- .midlineTo('x', 3.5 + 58)
608
- .midlineTo('y', 52.5 - 6));
626
+ group.holes.push(
627
+ RPiParts.MountingHole(3.25, 1.32)
628
+ .snap(mb, 'xy', 'inside-')
629
+ .align(mb, 'z')
630
+ .midlineTo('x', 3.5 + 58)
631
+ .midlineTo('y', 52.5 - 6)
632
+ );
609
633
 
610
634
  group.add(group.holes[5], 'fan2hole', true);
635
+
636
+ const fanClearance = Parts.Cylinder(4.5, 4)
637
+ .color('red')
638
+ .align(group.parts.fan1hole, 'xy')
639
+ .snap(group.parts.mb, 'z', 'outside+');
640
+
641
+ group.add(fanClearance, 'clearance-fan1', true, 'clearance');
642
+
643
+ group.add(
644
+ fanClearance
645
+ .align(group.parts.fan2hole, 'xy')
646
+ .snap(group.parts.mb, 'z', 'outside+'),
647
+ 'clearance-fan2',
648
+ true,
649
+ 'clearance'
650
+ );
611
651
  }
612
652
 
613
653
  return group;
@@ -1,6 +1,7 @@
1
- import { Group, parts as Parts } from '@jwc/jscad-utils';
1
+ import { Debug, Group, parts as Parts } from '@jwc/jscad-utils';
2
+ const debug = Debug('jscadRPi:HQCameraModule');
2
3
 
3
- /** @typedef {typeof import("@jwc/jscad-utils/src/group").JsCadUtilsGroup} JsCadUtilsGroup */
4
+ /** @typedef {import("@jwc/jscad-utils/src/group").JsCadUtilsGroup} JsCadUtilsGroup */
4
5
 
5
6
  /**
6
7
  * Returns a Raspberry Pi HQ camera JsCadUtilsGroup object.
@@ -34,19 +35,20 @@ import { Group, parts as Parts } from '@jwc/jscad-utils';
34
35
  * ]
35
36
  *
36
37
  * @function CameraModuleV2
38
+ * @param {boolean} [flipTripodMount=false] - Flip the tripod mount to the other side of the board.
37
39
  * @return {JsCadUtilsGroup} {description}
38
40
  */
39
- export default function HQCameraModule() {
40
- var t = 1.1;
41
- var height = { sensor: 4 - t, board: t };
42
- var camera = Group();
41
+ export default function HQCameraModule(flipTripodMount = false) {
42
+ const t = 1.1;
43
+ const height = { sensor: 4 - t, board: t };
44
+ const camera = Group();
43
45
 
44
46
  camera.add(
45
47
  Parts.RoundedCube(38, 38, t, 1.4).Center().color('green', 0.75),
46
48
  'board'
47
49
  );
48
50
 
49
- var hole = Parts.Cylinder(3.25, 10)
51
+ const hole = Parts.Cylinder(3.25, 10)
50
52
  .snap(camera.parts.board, 'xy', 'inside+', 1.25)
51
53
  .translate([-4, -4, -5])
52
54
 
@@ -57,18 +59,18 @@ export default function HQCameraModule() {
57
59
  camera.add(hole.rotateZ(-90), 'hole4', true);
58
60
  camera.holes.push(...camera.array('hole1,hole2,hole3,hole4'));
59
61
 
60
- var sensor = Parts.Cube([8.5, 8.5, 1])
62
+ const sensor = Parts.Cube([8.5, 8.5, 1])
61
63
  .snap(camera.parts.board, 'z', 'outside-')
62
64
  .align(camera.parts.board, 'xy')
63
65
  .color('white');
64
66
  camera.add(sensor, 'sensor');
65
67
 
66
- var mount = Parts.Cylinder(36, 10.2)
68
+ const mount = Parts.Cylinder(36, 10.2)
67
69
  .snap(camera.parts.board, 'z', 'outside-')
68
70
  .align(camera.parts.board, 'xy')
69
71
  .color('black');
70
72
 
71
- var mountInside = Parts.Cylinder(30.75, 10.2)
73
+ const mountInside = Parts.Cylinder(30.75, 10.2)
72
74
  .snap(camera.parts.board, 'z', 'outside-')
73
75
  .align(camera.parts.board, 'xy')
74
76
  .color('black');
@@ -76,21 +78,21 @@ export default function HQCameraModule() {
76
78
 
77
79
  camera.add(mount, 'mount-clearance', true);
78
80
 
79
- var tripodMount = Parts.Cube([13.97, 12, 11])
81
+ const tripodMountBase = Parts.Cube([24.5, 10, 7.62])
80
82
  .snap(mount, 'z', 'inside+')
81
- .snap(camera.parts.board, 'y', 'outside+')
83
+ .snap(camera.parts.board, 'y', 'inside-', -1)
84
+ .align(mount, 'x')
85
+ .color('darkgray')
86
+ .subtract(mountInside)
87
+
88
+ const tripodMount = Parts.Cube([14, 11.5, 11.5])
89
+ .snap(tripodMountBase, 'z', flipTripodMount ? 'inside-' : 'inside+')
90
+ .snap(tripodMountBase, 'y', 'outside+')
82
91
  .align(mount, 'x')
83
92
  .color('gray');
84
93
 
85
94
  camera.add(
86
- tripodMount.union(
87
- Parts.Cube([24.5, 10, 7.62])
88
- .snap(mount, 'z', 'inside+')
89
- .snap(tripodMount, 'y', 'outside-')
90
- .align(mount, 'x')
91
- .color('darkgray')
92
- .subtract(mountInside)
93
- ),
95
+ tripodMountBase.union(tripodMount),
94
96
  'tripodMount'
95
97
  );
96
98
 
@@ -110,5 +112,7 @@ export default function HQCameraModule() {
110
112
  'ribbon-nogo'
111
113
  );
112
114
 
115
+ debug("camera parts", camera.parts);
116
+
113
117
  return camera;
114
118
  }
@@ -0,0 +1,58 @@
1
+ import { booleanOps } from '@jscad/scad-api';
2
+ import { Debug, Group, parts as Parts } from '@jwc/jscad-utils';
3
+ import { Mountingpad } from './rpi-parts';
4
+
5
+ const { union } = booleanOps;
6
+ const debug = Debug('jscadRPi:HyperPixel4Rectangular');
7
+
8
+ /** @typedef {typeof import("@jwc/jscad-utils/src/group").JsCadUtilsGroup} JsCadUtilsGroup */
9
+
10
+
11
+ export default function HyperPixel4Rectangular(pi) {
12
+ const group = Group();
13
+
14
+ const board = Parts.Cube([97.85, 58.14, 1.65]).Center();
15
+ const notch = 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]);
16
+
17
+ group.add(board.subtract(notch).color('green', 0.75), 'mb');
18
+
19
+ const lcd = Parts.Cube([97.1, 58.44, 6.84 - 1.65]).color('black');
20
+ group.add(
21
+ lcd
22
+ .align(board, 'xy')
23
+ .translate(lcd.calcSnap(board, 'z', 'outside-'))
24
+ .translate([0, 0, 0.5]),
25
+ 'lcd'
26
+ );
27
+
28
+ // group.add(Parts.Cube([15.35, 1, 10]).snap(board, 'x', 'inside+').snap(board, 'y', 'outside+').snap(board, 'z', 'outside+'), 'connector1');
29
+
30
+ // group.add(Parts.Cube([1, 1, 1.36]).snap(board, 'x', 'inside-').snap(board, 'y', 'inside-').snap(board, 'z', 'outside+'), 'dimcheck2');
31
+
32
+ // group.add(Parts.Cube([1, 1, 17.04]).snap(board, 'x', 'inside-').snap(board, 'y', 'inside+').snap(board, 'z', 'outside+'), 'dimcheck3');
33
+
34
+
35
+ const pad = Mountingpad(5.5, 22.78 - 5.8)
36
+ .snap(board, 'z', 'outside+')
37
+ .snap(board, 'xy', 'inside+').translate([-15.35 + (5.5 - 2), -4.57 + (5.5 - 2), 0]);
38
+
39
+ const pads = [
40
+ pad,
41
+ pad.translate([-58, 0, 0]),
42
+ pad.translate([0, -49, 0]),
43
+ pad.translate([-58, -49, 0]),
44
+ ];
45
+
46
+ group.add(pads[0], 'pad1');
47
+ group.add(pads[1], 'pad2');
48
+ group.add(pads[2], 'pad3');
49
+ group.add(pads[3], 'pad4');
50
+
51
+ group.rotate('mb', 'z', 180);
52
+ debug('pi.parts', pi ? pi.parts : null);
53
+ debug('group.parts', group.parts);
54
+ if (pi) {
55
+ group.align('pad1', pi.parts.hole1, 'xy').snap('pad1', pi.parts.mb, 'z', 'outside-');
56
+ }
57
+ return group;
58
+ }
package/src/index.js CHANGED
@@ -5,6 +5,7 @@ import CameraModuleV2 from './camera-module-v2';
5
5
  import Hat from './hat';
6
6
  import HatStandoff from './hat-standoff';
7
7
  import HQCameraModule from './hq_camera-module';
8
+ import HyperPixel4Rectangular from './hyper-pixel-4-rectangular';
8
9
  import MiniPiTFT from './miniPiTFT';
9
10
  import PiTFT22 from './pi-tft22';
10
11
  import PiTFT24 from './pi-tft24';
@@ -14,7 +15,7 @@ export {
14
15
  ActiveCoolingFan, BPlus,
15
16
  CameraModuleV1,
16
17
  CameraModuleV2, Hat,
17
- HatStandoff, HQCameraModule, MiniPiTFT, PiTFT22,
18
+ HatStandoff, HQCameraModule, HyperPixel4Rectangular, MiniPiTFT, PiTFT22,
18
19
  PiTFT24, Spacer
19
20
  };
20
21
 
package/src/miniPiTFT.js CHANGED
@@ -143,7 +143,7 @@ export default function miniPiTFT() {
143
143
  );
144
144
 
145
145
  g.add(
146
- Parts.Tube(7, 3, 7.5)
146
+ Parts.Tube(7, 3, 8.5)
147
147
  .snap(board, 'x', 'inside-')
148
148
  .snap(board, 'y', 'inside+')
149
149
  .snap(board, 'z', 'outside+')