11 Commits

Author SHA1 Message Date
Edward Kisiel
7fbb5d5f12 updated readme.md, sbc_case_builder.gif, increased possible case size to 300mm, added m1 cases, added pine64 cases, other fixes 2022-12-09 22:19:05 -05:00
Edward Kisiel
2f32d3c3b5 added part view in gui, added n2l and n2lq cases, updated sbc model framework 2022-12-07 21:07:16 -05:00
Edward Kisiel
2ed95c20d1 added h3_tallboy-ssd and h3_shell_drivebox2.5 cases 2022-11-03 17:21:10 -04:00
Edward Kisiel
788c6568ed added part selection for debug to facilitate individual part work and prints 2022-11-03 11:31:22 -04:00
Edward Kisiel
dd2162b480 added h3 tallboy case with internal fan 2022-11-02 19:50:26 -04:00
Edward Kisiel
934f88523a updated sbc model framework with h3 and h3+, added 3mm to h2 and h3 case bottoms that use an access port, access port tab and opening adjustment, additional rockpi5b changes 2022-11-01 16:44:20 -04:00
Edward Kisiel
98b8baa08d fixed panel case left hook size, added access panel and standoff trim to all rockpi5b cases, readme.md changes 2022-10-25 14:26:57 -04:00
Edward Kisiel
1d2826d015 added mask for microsdcard2, updated rockpi5b case data and sbc model framework 2022-10-22 18:16:54 -04:00
Edward Kisiel
2ccca31882 added hdmi_a_vertical mask, usbc single_vertical mask, created base cases and updated readme.md and sbc_model_framework in support of rockpi5b. 2022-10-13 20:48:17 -04:00
Edward Kisiel
3a757b95a4 changed .gitmodules from ssh to https access 2022-10-12 20:20:09 -04:00
Edward Kisiel
d59191109e adjusted cases and accessories, updated README.md and SBC_Case_Builder_Cases.gif 2022-10-11 14:45:48 -04:00
9 changed files with 6579 additions and 2827 deletions

2
.gitmodules vendored
View File

@@ -1,3 +1,3 @@
[submodule "SBC_Model_Framework"]
path = SBC_Model_Framework
url = git@github.com:hominoids/SBC_Model_Framework.git
url = https://github.com/hominoids/SBC_Model_Framework.git

View File

@@ -3,9 +3,9 @@
## Introduction
This project is about autonomous SBC case creation. It utilizes the SBC Model Framework project to automatically generate cases based on the data for any given SBC contained within the framework. This allows legacy, current and future SBC to have multiple cases available on day one of their inclusion in the framework. There are multiple base case designs(shell, panel, stacked, tray, round, hex, snap, fitted) available and each allows for different styles within the design.
This project is about autonomous SBC case creation. It utilizes the SBC Model Framework project to automatically generate cases based on the data for any of the 53 current SBC contained within the framework. This allows legacy, current and future SBC to have multiple cases available on day one of their inclusion in the framework. There are multiple base case designs(shell, panel, stacked, tray, tray-sides, round, hex, snap, fitted) available and each allows for different styles within the design.
All case openings are created automatically based on SBC data and, the dimensions of any case design can be expanded in any axis allowing for the creation of larger cases. If you reposition the SBC in a case, you will see i/o openings created or removed appropriately based on its proximity to the case geometry. These cases might be useful for prototypes or other in house uses to quickly and easily create standard, specialized and custom SBC cases thru different case designs, styles and accessories.
All case openings are created automatically based on SBC data and the dimensions of any case design can be expanded in any axis allowing for the creation of larger cases. If you reposition the SBC in a case, you will see i/o openings created or removed appropriately based on its proximity to the case geometry. These cases might be useful for prototypes or other in house uses to quickly and easily create standard, specialized and custom SBC cases thru different case designs, styles and accessories.
License: GPLv3.
@@ -21,9 +21,9 @@ License: GPLv3.
```
### SBC Case Builder Features:
- Autonomous Multi-SBC, Parametric Multi-Case Generation
- Autonomous Multi-SBC, Multi-Case Parametric Generation
- Autonomous Case Standoffs with Variable Height
- Extended Standoff sbc collision detection
- Extended Standoff SBC collision detection
- Accessory Customization Framework
- Accessory Multi-Associative Parametric Positioning
- Absolute Location
@@ -47,6 +47,7 @@ License: GPLv3.
- Sliding
- Cylinder
- Rack
- Folded
- CNC Cases
All case data is stored in the json file sbc_case_builder.json with the accessory data stored in a separate file structure in sbc_case_builder_accessories.cfg. An accessory group name for a given case is stored as part of the case data in the json file. This allows for the reuse or sharing of an accessory set by different cases and can be used to manage groups of accessories.
@@ -82,21 +83,29 @@ There are currently 47 SBC represented by 43 models, from 8 manufactures in SBC
- ORANGE = unverified, may be usable but missing component data
- RED = unverified, not usable due to incomplete component data
### Utility
Additionally, template creation and i/o panel layouts in a dxf format can be easily created and integrated into other designs or for hand fabrication by sectioning a case panel for the desired SBC. The case design “panel” will most likely work best.
The SBC that I do not own have been created using manufacturer supplied mechanical drawings. Some of the drawings are missing information or have errors that effect all or part of the drawings and subsequent SBC models. If you own an SBC that is not represented or verified in SBC Model Framework, please consider adding it or helping to correct errors in existing SBC data. An SBC can be verified to be accurate if a printed shell case from SBC Case Builder fits. Any misalignment is corrected in the SBC Model Framework model data(sbc_models.cfg).
### Future Development
There are a few more ideas for base cases to be worked on as well as a host of supporting accessory models that need to be created. It would also be nice to have all of the OEM accessories for each SBC in the library as well. Im still looking for a better way to create accessory entries and groups, and continue to expand and verify as many SBC as possible. With that and the obvious benefit of autonomously making SBC cases, this project has also been helping fulfill another personal goal.
Computer aided design(CAD) has been around along time but I have been interested in exploring approaches to the next step, computer autonomous design. Regardless of the current or future object creation method, whether it be manufactured or materialized, I believe a universal approach to autonomous design will be needed to advance the human condition. This application has helped me explore and think about practical approaches that might be possible right now in autonomous design and I hope to continue this work by developing new tools and techniques for the new CAD, Computer Autonomous Design.
### Notes
Notes:
Due to the number of possibilities, no pre-compiled case stls are included.
“tol”, located at the bottom of the Adjustments Tab, is a tolerance fitment adjustment for the snap, fitted, round and hex tops. Adjust accordingly if the tops are too tight or loose.
Template creation and i/o panel layouts in a dxf format can be easily created and integrated into other designs or for hand fabrication by sectioning a case panel for the desired SBC. The case design “panel” will most likely work best.
### Case Designs and Styles
The case naming convention for standard cases in the configuration file follow the basic form of “sbc”_”design”_”style” e.g. c4_shell or c4_tray_vu5.
#### Current Case Count 368
#### Current Case Count 423
##### Hardkernel
##### Hardkernel - 182
**Odorid-C1+ cases** - 16 : c1+_shell, c1+_panel, c1+_panel_lcd3.5, c1+_desktop_lcd3.5, c1+_stacked, c1+_tray, c1+_tray_sides, c1+_tray_vu5,
c1+_tray_vu7, c1+_shell_boombox, c1+_panel_boombox, c1+_tray_boombox, c1+_round, c1+_hex, c1+_snap, c1+_fitted
@@ -116,23 +125,36 @@ c4_tray_vu7, c4_shell_boombox, c4_panel_boombox, c4_deskboom_lcd3.5, c4_tray_boo
**Odorid-N2+ cases** - 9 :n2+_panel, n2+_tray, n2+_tray_sides, n2+_tray_vu5, n2+_tray_vu7, n2+_round, n2+_hex, n2+_snap, n2+_fitted
**Odorid-N2L cases** - 9 :n2l_shell, n2l_panel, n2l_stacked, n2l_tray, n2l_tray_sides, n2l_tray_vu5, n2l_tray_vu7, n2l_snap, n2l_fitted
**Odorid-N2LQ cases** - 9 :n2lq_shell, n2lq_panel, n2lq_stacked, n2lq_tray, n2lq_tray_sides, n2lq_tray_vu5, n2lq_tray_vu7, n2lq_snap, n2lq_fitted
**Odorid-M1 cases** - 12 : m1_panel, m1_tray, m1_tray_drive, m1_tray_sides, m1_tray_vu5, m1_tray_vu7, m1_snap, m1_fitted, m1_fitted_drivebox2.5, m1_fitted_drivebox3.5, m1_fitted_pizzabox, m1_fitted_drivebox3.5v
**Odorid-XU4 cases** - 11 : xu4_shell, xu4_panel, xu4_stacked, xu4_tray, xu4_tray_sides, xu4_tray_vu5, xu4_tray_vu7, xu4_round, xu4_hex, xu4_snap, xu4_fitted
**Odorid-XU4Q cases** - 11 : xu4q_shell, xu4q_panel, xu4q_stacked, xu4q_tray, xu4q_tray_sides, xu4q_tray_vu5, xu4q_tray_vu7, xu4q_round, xu4q_hex, xu4q_snap, xu4q_fitted
**Odroid-H2 cases** - 17 : h2_shell, h2_lowboy, h2_lowboy_router, h2_shell_router, h2_shell_routerssd, h2_panel, h2_stacked, h2_tray, h2_tray_sides, h2_tray_vu5, h2_tray_vu7, h2_tray_router, h2_router_station, h2_round, h2_hex, h2_snap, h2_fitted
**Odroid-H2 cases** - 17 : h2_shell, h2_lowboy, h2_lowboy_router, h2_shell_router, h2_shell_router-ssd, h2_panel, h2_stacked, h2_tray, h2_tray_sides, h2_tray_vu5, h2_tray_vu7, h2_tray_router, h2_router_station, h2_round, h2_hex, h2_snap, h2_fitted
**Odroid-H3 cases** - 18 : h3_shell, h3_shell-internalfan, h3_lowboy, h3_lowboy_router, h3_shell_router, h3_shell_router-ssd, h3_panel, h3_stacked, h3_tray, h3_tray_sides, h3_tray_vu5, h3_tray_vu7, h3_tray_router, h3_router_station, h3_round, h3_hex, h3_snap, h3_fitted
**Odroid-Show2** cases - 1 : show2_shell
##### Pine64
##### Pine64 - 24
**Rock64** - 9 : rockp64_shell, rock64_panel, rock64_stacked, rock64_tray, rock64_tray_sides, rock64_round, rock64_hex, rock64_snap, rock64_fitted
**RockPro64** - 9 : rockpro64_shell, rockpro64_panel, rockpro64_stacked, rockpro64_tray, rockpro64_tray_sides, rockpro64_round, rockpro64_hex, rockpro64_snap, rockpro64_fitted
**Quartz64a** - 2 : quartz64a_shell, quartz64a_panel
##### Raspberry PI
**Quartz64b** - 2 : quartz64b_shell, quartz64b_panel
**h64b** - 2 : h64b_shell, h64b_panel
##### Raspberry PI - 72
**RPIzero** - 9 : rpizero_shell, rpizero_panel, rpizero_stacked, rpizero_tray, rpizero_tray_sides, rpizero_round, rpizero_hex, rpizero_snap, rpizero_fitted
@@ -151,12 +173,12 @@ c4_tray_vu7, c4_shell_boombox, c4_panel_boombox, c4_deskboom_lcd3.5, c4_tray_boo
**RPI4b** - 9 : rpi4b_shell, rpi4b_panel, rpi4b_stacked, rpi4b_tray, rpi4b_tray_sides, rpi4b_round, rpi4b_hex, rpi4b_snap, rpi4b_fitted
##### Nivida
##### Nivida - 1
**Jetson Nano** - 9 : jetsonnano_shell, jetsonnano_panel, jetsonnano_stacked, jetsonnano_tray, jetsonnano_tray_sides, jetsonnano_round, jetsonnano_hex, jetsonnano_snap, jetsonnano_fitted
##### Radxa
##### Radxa - 36
**ROCKPi 4b+** - 9 : rockpi4b+_shell, rockpi4b+_panel, rockpi4b+_stacked, rockpi4b+_tray, rockpi4b+_tray_sides, rockpi4b+_round, rockpi4b+_hex, rockpi4b+_snap, rockpi4b+_fitted
@@ -164,8 +186,10 @@ c4_tray_vu7, c4_shell_boombox, c4_panel_boombox, c4_deskboom_lcd3.5, c4_tray_boo
**ROCKPi 4c+** - 9 : rockpi4c+_shell, rockpi4c+_panel, rockpi4c+_stacked, rockpi4c+_tray, rockpi4c+_tray_sides, rockpi4c+_round, rockpi4c+_hex, rockpi4c+_snap, rockpi4c+_fitted
**ROCKPi5b** - 9 : rockpi5b_shell, rockpi5b_panel, rockpi5b_stacked, rockpi5b_tray, rockpi5b_tray_sides, rockpi5b_round, rockpi5b_hex, rockpi5b_snap, rockpi5b_fitted
##### Khadas
##### Khadas - 45
**Vim1** - 9 : vim1_shell, vim1_panel, vim1_stacked, vim1_tray, vim1_tray_sides, vim1_round, vim1_hex, vim1_snap, vim1_fitted
@@ -178,7 +202,7 @@ c4_tray_vu7, c4_shell_boombox, c4_panel_boombox, c4_deskboom_lcd3.5, c4_tray_boo
**Vim4** - 9 : vim4_shell, vim4_panel, vim4_stacked, vim4_tray, vim4_tray_sides, vim4_round, vim4_hex, vim4_snap, vim4_fitted
##### Asus
##### Asus - 36
**Tinkerboard** - 9 : tinkerboard_shell, tinkerboard_panel, tinkerboard_stacked, tinkerboard_tray, tinkerboard_tray_sides, tinkerboard_round, tinkerboard_hex, tinkerboard_snap, tinkerboard_fitted
@@ -189,7 +213,7 @@ c4_tray_vu7, c4_shell_boombox, c4_panel_boombox, c4_deskboom_lcd3.5, c4_tray_boo
**Tinkerboard R2/R2S** - 9 : tinkerboard-r2_shell, tinkerboard-r2_panel, tinkerboard-r2_stacked, tinkerboard-r2_tray, tinkerboard-r2_tray_sides, tinkerboard-r2_round, tinkerboard-r2_hex, tinkerboard-r2_snap, tinkerboard-r2_fitted
##### Orange PI
##### Orange PI - 27
**OPI Zero/ZeroPlus** - 9 : opizero_shell, opizero_panel, opizero_stacked, opizero_tray, opizero_tray_sides, opizero_round, opizero_hex, opizero_snap, opizero_fitted

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 3.8 MiB

View File

@@ -1,9 +1,9 @@
// Gets a list of SBCs from the SBC Model Framework and Accessory sets
// for use with SBC Case Builder.
// After running this script, copy the output from the first Echo command into the
// list of SBC boards in `sbc_case_builder.scad:80`
// list of SBC boards in `sbc_case_builder.scad:83`
// Also copy the output from the second Echo command into the list of case acceessory
// sets in `sbc_case_builder.scad:160`
// sets in `sbc_case_builder.scad:164`
include <./SBC_Model_Framework/sbc_models.cfg>;
include <./sbc_case_builder_accessories.cfg>;
@@ -14,4 +14,4 @@ echo(boards);
accessory_sets = [for(i=[0:1:len(accessory_data)-1]) accessory_data[i][0]];
echo("Copy the following to `sbc_case_builder.scad` for the `accessory_name` variable");
echo(accessory_sets);
echo(accessory_sets);

File diff suppressed because it is too large Load Diff

View File

@@ -36,10 +36,15 @@
changed tray top design.
20221005 Version 2.0.0 full customizer user interface,case configuration file changed to json,
accessories kept in sbc_case_builder_accessories.cfg,
added round, hexagon, snap and fitted cases, setup additional sbc from SBC_Model_Framework,
added components and masks, added multi-associative parametric positioning for accessories,
added individual variable height sbc standoffs, added cutaway view when case face
is not movable, finished indents for select components and orientations.
added round, hexagon, snap and fitted cases, setup additional sbc from
SBC_Model_Framework, added components and masks, added multi-associative
parametric positioning for accessories, added individual variable height
sbc standoffs, added cutaway view when case face is not movable, finished
indents for select components and orientations.
20221011 Version 2.0.1 adjusted cases and accessories, updated README.md and SBC_Case_Builder_Cases.gif
20221101 Version 2.0.2 updated sbc model framework, h3/h3+ model and rockpi5b adjustments
20221207 Version 2.0.3 added part view to facilitate individual part prints, updated sbc model framework,
added n2l and m1 cases
see https://github.com/hominoids/SBC_Case_Builder
*/
@@ -51,8 +56,9 @@ include <./SBC_Model_Framework/sbc_models.cfg>;
include <./sbc_case_builder_accessories.cfg>;
/* [View] */
// viewing mode "platter", "model", "debug"
view = "model"; // [platter, model, debug]
// viewing mode "model", "platter", "part"
view = "model"; // [model, platter, part]
individual_part = "bottom"; // [top, bottom, right, left, front, rear, accessories]
// sbc off in model view
sbc_off = false;
// enable highlight for sbc component subtarctive geometry
@@ -78,21 +84,21 @@ case_design = "shell"; // [shell,panel,stacked,tray,round,hex,snap,fitted]
// base case style
case_style = "none"; // ["none","vu5","vu7","sides"]
// single board computer model
sbc_model = "c1+"; // ["c1+", "c2", "c4", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2+_noheatsink", "m1", "m1_noheatsink", "h2", "hc4", "show2", "rpizero", "rpizero2w", "rpi1a+", "rpi1b+", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "a64", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "atomicpi", "jetsonnano", "rockpi4b+", "rockpi4c", "rockpi4c+", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-r2", "opizero", "opizero2", "opir1plus_lts", "test"]
sbc_model = "c1+"; // ["c1+", "c2", "c4", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2+_noheatsink", "n2l", "n2lq", "m1", "m1_noheatsink", "h2", "h3", "hc4", "show2", "rpizero", "rpizero2w", "rpi1a+", "rpi1b+", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "a64", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "atomicpi", "jetsonnano", "rockpi4b+", "rockpi4c", "rockpi4c+", "rockpi5b", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-r2", "opizero", "opizero2", "opir1plus_lts"]
// sbc location x axis
pcb_loc_x = 0; //[0:.5:200]
pcb_loc_x = 0; //[0:.5:300]
// sbc location y axis
pcb_loc_y = 0; //[0:.5:200]
pcb_loc_y = 0; //[0:.5:300]
// sbc location z axis
pcb_loc_z = 0; //[0:.25:50]
pcb_loc_z = 0; //[0:.25:100]
// additional x axis case size
case_offset_x = 0; //[0:.5:200]
case_offset_x = 0; //[0:.5:300]
// additional y axis case size
case_offset_y = 0; //[0:.5:200]
case_offset_y = 0; //[0:.5:300]
// additional z axis case top size
case_offset_tz = 0; //[0:.5:50]
case_offset_tz = 0; //[0:.5:100]
// additional z axis case bottom size
case_offset_bz = 0; //[0:.5:50]
case_offset_bz = 0; //[0:.5:100]
// case wall thickness
wallthick = 2; //[1:.5:5]
// case floor thickness
@@ -119,7 +125,7 @@ case_ext_standoffs = false;
sidewall_support = true;
// top case standoff - [diameter,height(not used),holesize,supportsize,supportheight,type(0=none, 1=countersink, 2=recessed, 3=nut holder, 4=blind),style(0=hex, 1=cylinder),reverse,insert,insert hole dia.,insert depth]
top_standoff = [6.75,18,2.5,10,4,4,0,1,0,4.5,5.1];
top_standoff = [5.75,18,2.5,10,4,4,0,1,0,4.5,5.1];
// case top - lower left standoff
top_rear_left = 0; //[-20:.25:20]
// case top - upper left standoff
@@ -130,7 +136,7 @@ top_rear_right = 0; //[-20:.25:20]
top_front_right = 0; //[-20:.25:20]
// bottom case standoff - [diameter,height(not used),holesize,supportsize,supportheight,type(0=none, 1=countersink, 2=recessed, 3=nut holder, 4=blind),style(0=hex, 1=cylinder),reverse,insert,insert hole dia.,insert depth]
bottom_standoff = [6.75,7,3.6,10,4,1,0,0,0,4.5,5.1];
bottom_standoff = [5.75,7,3.6,10,4,1,0,0,0,4.5,5.1];
// case bottom - rear left standoff
bottom_rear_left = 0; //[-20:.25:20]
// case bottom - upper left standoff
@@ -141,10 +147,10 @@ bottom_rear_right = 0; //[-20:.25:20]
bottom_front_right = 0; //[-20:.25:20]
// top case extened standoff - [diameter,height(not used),holesize,supportsize,supportheight,type(0=none, 1=countersink, 2=recessed, 3=nut holder, 4=blind),style(0=hex, 1=cylinder),reverse,insert,insert hole dia.,insert depth]
top_ext_standoff = [6.75,18,2.5,10,4,4,0,1,0,4.5,5.1];
top_ext_standoff = [5.75,18,2.5,10,4,4,0,1,0,4.5,5.1];
// bottom case extended standoff - [diameter,height(not used),holesize,supportsize,supportheight,type(0=none, 1=countersink, 2=recessed, 3=nut holder, 4=blind),style(0=hex, 1=cylinder),reverse,insert,insert hole dia.,insert depth]
bottom_ext_standoff = [6.75,5,3.6,10,4,1,0,0,0,4.5,5.1];
bottom_ext_standoff = [5.75,5,3.6,10,4,1,0,0,0,4.5,5.1];
/* [Features and Accessories] */
// enable indentations around io openings
@@ -159,7 +165,7 @@ cooling = "fan"; // [none,vents,fan,custom]
exhaust_vents = "vent"; // [none,vent]
// case accessory group to load
accessory_name = "none"; // ["none", "c1+_shell_boombox", "c1+_panel_boombox", "c1+_panel_lcd3.5", "c1+_desktop_lcd3.5", "c1+_deskboom_lcd3.5", "c1+_tray_boombox", "c1+_round", "c1+_hex", "c2_shell_boombox", "c2_panel_boombox", "c2_panel_lcd3.5", "c2_desktop_lcd3.5", "c2_deskboom_lcd3.5", "c2_tray_boombox", "c2_round", "c2_hex", "c4_shell_boombox", "c4_panel_lcd3.5", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_tray_boombox", "c4_round", "c4_hex", "hc4_tray_drivebox2.5", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "n1_round", "n1_hex", "n2+_tray_vu7_fan", "m1_panel", "m1_tray", "m1_tray_drive", "m1_tray_sides", "m1_tray_vu5", "m1_tray_vu7", "h2_shell", "h2_shell_router", "h2_shell_router-ssd", "h2_lowboy", "h2_lowboy_router", "h2_tray", "h2_tray_sides", "h2_tray_router", "h2_router_station", "h2_round", "h2_hex", "jetsonnano_shell", "jetsonnano_panel", "jetsonnano_stacked", "jetsonnano_tray", "jetsonnano_tray_sides", "jetsonnano_round", "jetsonnano_hex", "jetsonnano_snap", "jetsonnano_fitted", "rock64_shell", "rock64_panel", "rock64_stacked", "rock64_tray", "rock64_tray_sides", "rock64_round", "rock64_hex", "rock64_snap", "rock64_fitted", "rockpro64_shell", "rockpro64_panel", "rockpro64_stacked", "rockpro64_tray", "rockpro64_tray_sides", "rockpro64_round", "rockpro64_hex", "rockpro64_snap", "rockpro64_fitted", "quartz64b_stacked_poe_hat", "show2_shell", "rpi1a+_shell", "rpi1a+_panel", "rpi1a+_stacked", "rpi1a+_tray", "rpi1a+_tray_sides", "rpi1a+_round", "rpi1a+_hex", "rpi1a+_snap", "rpi1a+_fitted", "rpi1b+_shell", "rpi1b+_panel", "rpi1b+_stacked", "rpi1b+_tray", "rpi1b+_tray_sides", "rpi1b+_round", "rpi1b+_hex", "rpi1b+_snap", "rpi1b+_fitted", "rpi3a+_shell", "rpi3a+_panel", "rpi3a+_stacked", "rpi3a+_tray", "rpi3a+_tray_sides", "rpi3a+_round", "rpi3a+_hex", "rpi3a+_snap", "rpi3a+_fitted", "rpi3b_shell", "rpi3b_panel", "rpi3b_stacked", "rpi3b_tray", "rpi3b_tray_sides", "rpi3b_round", "rpi3b_hex", "rpi3b_snap", "rpi3b_fitted", "rpi3b+_shell", "rpi3b+_panel", "rpi3b+_stacked", "rpi3b+_tray", "rpi3b+_tray_sides", "rpi3b+_round", "rpi3b+_hex", "rpi3b+_snap", "rpi3b+_fitted", "rpi4b_shell", "rpi4b_shell_geeekpi_poe_hat", "rpi4b_panel", "rpi4b_stacked", "rpi4b_stacked_geeekpi_poe_hat", "rpi4b_tray", "rpi4b_tray_sides", "rpi4b_round", "rpi4b_hex", "rpi4b_snap", "rpi4b_fitted", "rockpi4b+_shell", "rockpi4b+_panel", "rockpi4b+_stacked", "rockpi4b+_tray", "rockpi4b+_tray_sides", "rockpi4b+_round", "rockpi4b+_hex", "rockpi4b+_snap", "rockpi4b+_fitted", "rockpi4c_shell", "rockpi4c_panel", "rockpi4c_stacked", "rockpi4c_tray", "rockpi4c_tray_sides", "rockpi4c_round", "rockpi4c_hex", "rockpi4c_snap", "rockpi4c_fitted", "rockpi4c+_shell", "rockpi4c+_panel", "rockpi4c+_stacked", "rockpi4c+_tray", "rockpi4c+_tray_sides", "rockpi4c+_round", "rockpi4c+_hex", "rockpi4c+_snap", "rockpi4c+_fitted", "vim1_shell", "vim1_panel", "vim1_stacked", "vim1_tray", "vim1_tray_sides", "vim1_round", "vim1_hex", "vim1_snap", "vim1_fitted", "vim2_shell", "vim2_panel", "vim2_stacked", "vim2_tray", "vim2_tray_sides", "vim2_round", "vim2_hex", "vim2_snap", "vim2_fitted", "vim3l_shell", "vim3l_panel", "vim3l_stacked", "vim3l_tray", "vim3l_tray_sides", "vim3l_round", "vim3l_hex", "vim3l_snap", "vim3l_fitted", "vim3_shell", "vim3_panel", "vim3_stacked", "vim3_tray", "vim3_tray_sides", "vim3_round", "vim3_hex", "vim3_snap", "vim3_fitted", "vim4_shell", "vim4_panel", "vim4_stacked", "vim4_tray", "vim4_tray_sides", "vim4_round", "vim4_hex", "vim4_snap", "vim4_fitted", "tinkerboard_shell", "tinkerboard_panel", "tinkerboard_stacked", "tinkerboard_tray", "tinkerboard_tray_sides", "tinkerboard_round", "tinkerboard_hex", "tinkerboard_snap", "tinkerboard_fitted", "tinkerboard-s_shell", "tinkerboard-s_panel", "tinkerboard-s_stacked", "tinkerboard-s_tray", "tinkerboard-s_tray_sides", "tinkerboard-s_round", "tinkerboard-s_hex", "tinkerboard-s_snap", "tinkerboard-s_fitted", "tinkerboard-2_shell", "tinkerboard-2_panel", "tinkerboard-2_stacked", "tinkerboard-2_tray", "tinkerboard-2_tray_sides", "tinkerboard-2_round", "tinkerboard-2_hex", "tinkerboard-2_snap", "tinkerboard-2_fitted", "tinkerboard-r2_shell", "tinkerboard-r2_panel", "tinkerboard-r2_stacked", "tinkerboard-r2_tray", "tinkerboard-r2_tray_sides", "tinkerboard-r2_round", "tinkerboard-r2_hex", "tinkerboard-r2_snap", "tinkerboard-r2_fitted", "hk_uart"]
accessory_name = "none"; // ["none", "c1+_shell_boombox", "c1+_panel_boombox", "c1+_panel_lcd3.5", "c1+_desktop_lcd3.5", "c1+_deskboom_lcd3.5", "c1+_tray_boombox", "c1+_round", "c1+_hex", "c2_shell_boombox", "c2_panel_boombox", "c2_panel_lcd3.5", "c2_desktop_lcd3.5", "c2_deskboom_lcd3.5", "c2_tray_boombox", "c2_round", "c2_hex", "c4_shell_boombox", "c4_panel_lcd3.5", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_tray_boombox", "c4_round", "c4_hex", "hc4_tray_drivebox2.5", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "n1_round", "n1_hex", "n2l_tray", "n2+_tray_vu7_fan", "m1_panel", "m1_tray", "m1_tray_ssd", "m1_tray_sides", "m1_tray_vu5", "m1_tray_vu7", "m1_fitted_drivebox2.5", "m1_fitted_drivebox3.5", "m1_fitted_pizzabox", "m1_fitted_drivebox3.5v", "h2_shell", "h2_shell_router", "h2_shell_router-ssd", "h2_lowboy", "h2_lowboy_router", "h2_tray", "h2_tray_sides", "h2_tray_router", "h2_router_station", "h2_round", "h2_hex", "h3_shell", "h3_lowboy", "h3_lowboy_router", "h3_tallboy", "h3_tallboy-ssd", "h3_shell_drivebox2.5v", "jetsonnano_shell", "jetsonnano_panel", "jetsonnano_stacked", "jetsonnano_tray", "jetsonnano_tray_sides", "jetsonnano_round", "jetsonnano_hex", "jetsonnano_snap", "jetsonnano_fitted", "rock64_shell", "rock64_panel", "rock64_stacked", "rock64_tray", "rock64_tray_sides", "rock64_round", "rock64_hex", "rock64_snap", "rock64_fitted", "rockpro64_shell", "rockpro64_panel", "rockpro64_stacked", "rockpro64_tray", "rockpro64_tray_sides", "rockpro64_round", "rockpro64_hex", "rockpro64_snap", "rockpro64_fitted", "quartz64b_stacked_poe_hat", "show2_shell", "rpi1a+_shell", "rpi1a+_panel", "rpi1a+_stacked", "rpi1a+_tray", "rpi1a+_tray_sides", "rpi1a+_round", "rpi1a+_hex", "rpi1a+_snap", "rpi1a+_fitted", "rpi1b+_shell", "rpi1b+_panel", "rpi1b+_stacked", "rpi1b+_tray", "rpi1b+_tray_sides", "rpi1b+_round", "rpi1b+_hex", "rpi1b+_snap", "rpi1b+_fitted", "rpi3a+_shell", "rpi3a+_panel", "rpi3a+_stacked", "rpi3a+_tray", "rpi3a+_tray_sides", "rpi3a+_round", "rpi3a+_hex", "rpi3a+_snap", "rpi3a+_fitted", "rpi3b_shell", "rpi3b_panel", "rpi3b_stacked", "rpi3b_tray", "rpi3b_tray_sides", "rpi3b_round", "rpi3b_hex", "rpi3b_snap", "rpi3b_fitted", "rpi3b+_shell", "rpi3b+_panel", "rpi3b+_stacked", "rpi3b+_tray", "rpi3b+_tray_sides", "rpi3b+_round", "rpi3b+_hex", "rpi3b+_snap", "rpi3b+_fitted", "rpi4b_shell", "rpi4b_shell_geeekpi_poe_hat", "rpi4b_panel", "rpi4b_stacked", "rpi4b_tray", "rpi4b_tray_sides", "rpi4b_round", "rpi4b_hex", "rpi4b_snap", "rpi4b_fitted", "rockpi4b+_shell", "rockpi4b+_panel", "rockpi4b+_stacked", "rockpi4b+_tray", "rockpi4b+_tray_sides", "rockpi4b+_round", "rockpi4b+_hex", "rockpi4b+_snap", "rockpi4b+_fitted", "rockpi4c_shell", "rockpi4c_panel", "rockpi4c_stacked", "rockpi4c_tray", "rockpi4c_tray_sides", "rockpi4c_round", "rockpi4c_hex", "rockpi4c_snap", "rockpi4c_fitted", "rockpi4c+_shell", "rockpi4c+_panel", "rockpi4c+_stacked", "rockpi4c+_tray", "rockpi4c+_tray_sides", "rockpi4c+_round", "rockpi4c+_hex", "rockpi4c+_snap", "rockpi4c+_fitted", "rockpi5b", "vim1_shell", "vim1_panel", "vim1_stacked", "vim1_tray", "vim1_tray_sides", "vim1_round", "vim1_hex", "vim1_snap", "vim1_fitted", "vim2_shell", "vim2_panel", "vim2_stacked", "vim2_tray", "vim2_tray_sides", "vim2_round", "vim2_hex", "vim2_snap", "vim2_fitted", "vim3l_shell", "vim3l_panel", "vim3l_stacked", "vim3l_tray", "vim3l_tray_sides", "vim3l_round", "vim3l_hex", "vim3l_snap", "vim3l_fitted", "vim3_shell", "vim3_panel", "vim3_stacked", "vim3_tray", "vim3_tray_sides", "vim3_round", "vim3_hex", "vim3_snap", "vim3_fitted", "vim4_shell", "vim4_panel", "vim4_stacked", "vim4_tray", "vim4_tray_sides", "vim4_round", "vim4_hex", "vim4_snap", "vim4_fitted", "tinkerboard_shell", "tinkerboard_panel", "tinkerboard_stacked", "tinkerboard_tray", "tinkerboard_tray_sides", "tinkerboard_round", "tinkerboard_hex", "tinkerboard_snap", "tinkerboard_fitted", "tinkerboard-s_shell", "tinkerboard-s_panel", "tinkerboard-s_stacked", "tinkerboard-s_tray", "tinkerboard-s_tray_sides", "tinkerboard-s_round", "tinkerboard-s_hex", "tinkerboard-s_snap", "tinkerboard-s_fitted", "tinkerboard-2_shell", "tinkerboard-2_panel", "tinkerboard-2_stacked", "tinkerboard-2_tray", "tinkerboard-2_tray_sides", "tinkerboard-2_round", "tinkerboard-2_hex", "tinkerboard-2_snap", "tinkerboard-2_fitted", "tinkerboard-r2_shell", "tinkerboard-r2_panel", "tinkerboard-r2_stacked", "tinkerboard-r2_tray", "tinkerboard-r2_tray_sides", "tinkerboard-r2_round", "tinkerboard-r2_hex", "tinkerboard-r2_snap", "tinkerboard-r2_fitted", "hk_uart"]
a = search([accessory_name],accessory_data);
s = search([sbc_model],sbc_data);
@@ -187,7 +193,6 @@ case_ffn = 90; // circle segments for fillet of
lip = 5;
vu_rotation = [15,0,0];
// platter view
if (view == "platter") {
if(case_design == "shell") {
@@ -264,6 +269,12 @@ if (view == "platter") {
}
}
}
if(case_design == "tray") {
echo(width=width+2*sidethick,depth=depth,top=top_height,bottom=bottom_height);
}
else {
echo(width=width,depth=depth,top=top_height,bottom=bottom_height);
}
}
// model view
@@ -286,8 +297,8 @@ if (view == "model") {
cube([gap+wallthick+1.01,depth+2,case_z+2]);
}
if(move_rightside < 0) {
translate([width-gap-wallthick-2.01,-gap-wallthick-1,-lower_bottom])
cube([gap+wallthick+1,depth+2,case_z+2]);
translate([width-gap-(2*wallthick)-adjust,-gap-wallthick-1,-lower_bottom])
cube([gap+wallthick,depth+2,case_z+2]);
}
}
}
@@ -310,8 +321,8 @@ if (view == "model") {
cube([gap+wallthick+1.01,depth+2,case_z+2]);
}
if(move_rightside < 0) {
translate([width-gap-wallthick-2.01,-gap-wallthick-1,raise_top])
cube([gap+wallthick+1,depth+2,case_z+2]);
translate([width-gap-(2*wallthick)-adjust,-gap-wallthick-1,raise_top])
cube([gap+wallthick,depth+2,case_z+2]);
}
}
}
@@ -538,14 +549,108 @@ if (view == "model") {
}
}
//}
// debug
if (view == "debug") {
case_top(case_design);
// case_bottom(case_design);
// case_side(case_design,case_style,"rear");
// case_side(case_design,case_style,"front");
// case_side(case_design,case_style,"left");
// case_side(case_design,case_style,"right");
// part
if (view == "part") {
if(individual_part == "top") {
if(case_design == "shell") {
translate([0,depth,case_z]) rotate([180,0,0]) case_top(case_design);
}
if(case_design == "panel") {
translate([0,depth,case_z]) rotate([180,0,0]) case_top(case_design);
}
if(case_design == "stacked") {
translate([0,depth,case_z]) rotate([180,0,0]) case_top(case_design);
}
if(case_design == "tray") {
translate([0,depth,case_z]) rotate([180,0,0]) case_top(case_design);
}
if(case_design == "round") {
translate([width+30,depth,case_z-floorthick-gap]) rotate([180,0,0]) case_top(case_design);
}
if(case_design == "hex") {
translate([2*width,depth,case_z]) rotate([180,0,0]) case_top(case_design);
}
if(case_design == "snap") {
translate([0,depth,case_z+2*floorthick]) rotate([180,0,0]) case_top(case_design);
}
if(case_design == "fitted") {
translate([0,depth,case_z+floorthick]) rotate([180,0,0]) case_top(case_design);
}
}
if(individual_part == "bottom") {
case_bottom(case_design);
}
if(individual_part == "front") {
if(case_design == "panel") {
translate([0,case_z,-depth+wallthick+gap+floorthick])
rotate([90,0,0]) case_side(case_design,case_style,"front");
}
}
if(individual_part == "rear") {
if(case_design == "panel") {
translate([0,0,-gap]) rotate([-90,0,0]) case_side(case_design,case_style,"rear");
}
}
if(individual_part == "right") {
if(case_design == "panel") {
translate([gap,0,-width+(2*wallthick)+gap]) rotate([0,-90,-90])
case_side(case_design,case_style,"right");
}
if(case_design == "tray") {
if(case_style == "vu5" || case_style == "vu7" || case_style == "sides") {
translate([depth,0,width-gap]) rotate([0,90,90])
case_side(case_design,case_style,"right");
}
}
}
if(individual_part == "left") {
if(case_design == "panel") {
translate([depth,0,-gap]) rotate([0,90,90])
case_side(case_design,case_style,"left");
}
if(case_design == "tray") {
if(case_style == "vu5" || case_style == "vu7" || case_style == "sides") {
translate([gap,0,2*sidethick+gap]) rotate([0,-90,-90])
case_side(case_design,case_style,"left");
}
}
}
if(individual_part == "accessories") {
if(accessory_name != "none") {
for (i=[1:15:len(accessory_data[a[0]])-1]) {
class = accessory_data[a[0]][i];
type = accessory_data[a[0]][i+1];
loc_x = accessory_data[a[0]][i+2];
loc_y = accessory_data[a[0]][i+3];
loc_z = accessory_data[a[0]][i+4];
face = accessory_data[a[0]][i+5];
rotation = accessory_data[a[0]][i+6];
parametric = accessory_data[a[0]][i+7];
size_x = accessory_data[a[0]][i+8];
size_y = accessory_data[a[0]][i+9];
size_z = accessory_data[a[0]][i+10];
data_1 = accessory_data[a[0]][i+11];
data_2 = accessory_data[a[0]][i+12];
data_3 = accessory_data[a[0]][i+13];
data_4 = accessory_data[a[0]][i+14];
if (class == "platter" && type != "button_top") {
add(type,loc_x,loc_y,loc_z,face,rotation,size_x,size_y,size_z,data_1,data_2,data_3,data_4);
}
if (class == "platter" && type == "button_top") {
translate([loc_x,loc_y,loc_z+1.25]) rotate([-90,0,0]) button_plunger(data_3, size_x, size_z);
translate([loc_x-20,loc_y-10,loc_z+3]) rotate([0,0,0]) button_top(data_3, size_x, size_z);
translate([loc_x-20,loc_y-20,loc_z]) rotate([0,0,0]) button_clip(data_3);
}
}
}
}
if(case_design == "tray") {
echo(width=width+2*sidethick,depth=depth,top=top_height,bottom=bottom_height);
}
else {
echo(width=width,depth=depth,top=top_height,bottom=bottom_height);
}
}
@@ -1751,6 +1856,7 @@ module case_side(case_design,case_style,side) {
union() {
translate([-gap,-wallthick-gap,-floorthick])
cube([width-2*wallthick,wallthick,case_z+2*floorthick]);
// right hook
difference() {
translate([width-(2*wallthick)-gap-adjust,-wallthick-gap,
((case_z)/2)-4])
@@ -1759,8 +1865,9 @@ module case_side(case_design,case_style,side) {
((case_z)/2)-4-adjust])
cube([wallthick+.25,wallthick+(2*adjust),4.25]);
}
// left hook
difference() {
translate([-(2*wallthick)-gap-adjust,-wallthick-gap,
translate([-(2*wallthick)-gap-adjust-.25,-wallthick-gap,
((case_z)/2)-4])
cube([(2*wallthick)+.5,wallthick,8]);
translate([-wallthick-gap-adjust-.25,-wallthick-gap-adjust,
@@ -1787,6 +1894,7 @@ module case_side(case_design,case_style,side) {
union() {
translate([-gap,depth-2*(wallthick)-gap,-floorthick])
cube([width-2*wallthick,wallthick,case_z+2*floorthick]);
// right hook
difference() {
translate([width-(2*wallthick)-gap-adjust,depth-2*(wallthick)-gap-adjust,
((case_z)/2)-4])
@@ -1795,8 +1903,9 @@ module case_side(case_design,case_style,side) {
depth-2*(wallthick)-adjust-gap-adjust,((case_z)/2)-4-adjust])
cube([wallthick+.25,wallthick+(2*adjust),4.25]);
}
// left hook
difference() {
translate([-(2*wallthick)-gap-adjust,depth-2*(wallthick)-gap-adjust,(
translate([-(2*wallthick)-gap-adjust-.25,depth-2*(wallthick)-gap-adjust,(
(case_z)/2)-4])
cube([(2*wallthick)+.5,wallthick,8]);
translate([-wallthick-gap-adjust-.25,depth-2*(wallthick)-adjust-gap-adjust,
@@ -2099,7 +2208,7 @@ module open_io() {
}
}
// top cooling openings
if(side == "top" && cooling == "fan" && class == "heatsink"
if(side == "top" && cooling == "fan" && class == "heatsink" && type != "h3_oem"
&& type != "h2_oem" && type != "n2_oem" && type != "n2+_oem") {
translate([loc_x+6,loc_y-28,case_z-(floorthick+adjust)-5])
fan_mask(40,floorthick+(2*adjust)+8,2);
@@ -2118,6 +2227,10 @@ module open_io() {
translate([loc_x-28,loc_y-28,case_z-(floorthick+adjust)])
fan_mask(90,floorthick+6,2);
}
if(side == "top" && cooling == "fan" && class == "heatsink" && type == "h3_oem" ) {
translate([loc_x-5,loc_y-16,case_z-(floorthick+adjust)])
fan_mask(90,floorthick+6,2);
}
if(side == "top" && cooling == "vents" && class == "heatsink") {
for(r=[loc_x+7:4:48+loc_x]) {
translate([r,loc_y-20,case_z-(floorthick+adjust)-6])
@@ -2198,7 +2311,7 @@ module open_io() {
}
if(side == "top" && type == "uart_micro" && rotation == 270) {
translate([loc_x-2*(wallthick),loc_y-1,bottom_height+5]) rotate([90,0,90])
punchout(15,8,1,wallthick+(2*adjust)+5,2,"rectangle");
punchout(15,8,1,wallthick+(2*adjust)+12,2,"rectangle");
}
// sata openings

View File

@@ -14,25 +14,8 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
Code released under GPLv3: http://www.gnu.org/licenses/gpl.html
20220212 Version 1.1.0 SBC Case Builder configuration file
20220220 Version 1.1.1 changed accessory rotation to an array,
added commands add1,add2,model,platter
added top_ext_standoff[],bottom_ext_standoff
20220227 Version 1.1.2 added cases hc4_shell_drivebox2.5, hc4_shell_drivebox3.5, hc4_shell_drivebox2.5v
20220306 Version 1.1.3 added cases h2_shell_router, h2_shell_router-ssd, h2_lowboy_router, h2_lowboy, h2_tray_router, h2_router_station
20220312 Version 1.2.0 added cases c4_panel_lcd3.5, c2_panel_lcd3.5, c1+_panel_lcd3.5, c1+_desktop_lcd3.5, c2_desktop_lcd3.5,
c4_desktop_lcd3.5, adjusted h2_lowboy
20220320 Version 1.2.1 added cases c1+_shell_boombox, c1+_panel_boombox, c1+_tray_boombox,
c2_shell_boombox, c2_panel_boombox, c2_deskboom_lcd3.5, c2_tray_boombox,
c4_shell_boombox, c4_panel_boombox, c4_deskboom_lcd3.5, c4_tray_boombox
20220406 Version 1.2.2 various case adjustments
20220515 Version 1.2.3 added m1_panel,m1_tray,m1_tray_drive,m1_tray_sides,m1_tray_vu5,m1_tray_vu7,show2_shell
jetsonnano_shell,jetsonnano_panel,jetsonnano_stacked,jetsonnano_tray
rockpro64_shell,rockpro64_panel,rockpro64_stacked,rockpro64_tray
20221005 Version 2.0.0 added cusotmizer graphical ui, seperated case data from accessory data, moved case data to customizer json format,
added multi-associative parametric positioning of accessories, added variable height sbc standoffs to accomidate
add-on pcb, converted all existing accessories to use parametric positioning.
SBC Case Builder accessory configuration file
see https://github.com/hominoids/SBC_Case_Builder
*/
@@ -417,10 +400,10 @@ accessory_data = [
"add2","hc4_oled_holder",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],0,0,2,0,0,"",0, // model hc4 holder
"add2","hd_holder",10,-21,1.99,"bottom",[0,0,0],["case",true,true,false],0,0,0,2.5,0,"portrait",0, // add hd holder
"sub","hd_holes",10,-21,-.01,"bottom",[0,0,0],["case",true,true,false],0,0,0,2.5,3,"portrait",0, // sub hd bottom holes
"sub","round",92,47,5,"bottom",[0,90,0],["case",true,false,false],3,0,3,0,0,"",0, // sub hd side screw hole
"sub","round",92,123.6,5,"bottom",[0,90,0],["case",true,false,false],3,0,3,0,0,"",0, // sub hd side screw hole
"sub","round",92,47,23,"bottom",[0,90,0],["case",true,false,false],3,0,3,0,0,"",0, // sub hd side screw hole
"sub","round",92,123.6,23,"bottom",[0,90,0],["case",true,false,false],3,0,3,0,0,"",0, // sub hd side screws hole
"sub","round",92,-5,5,"bottom",[0,90,0],["case",true,true,false],3,0,3,0,0,"",0, // sub hd side screw hole
"sub","round",92,69.6,5,"bottom",[0,90,0],["case",true,true,false],3,0,3,0,0,"",0, // sub hd side screw hole
"sub","round",92,-5,23,"bottom",[0,90,0],["case",true,true,false],3,0,3,0,0,"",0, // sub hd side screw hole
"sub","round",92,69.6,23,"bottom",[0,90,0],["case",true,true,false],3,0,3,0,0,"",0, // sub hd side screws hole
"sub","vent",71.85,88,30,"top",[0,0,0],["case",false,true,false],2,13,4,1,4,"vertical",1, // sub vent
"suball","fan",39,-.1,7,"bottom",[90,0,0],["case",true,false,false],40,0,3,1,0,"",0, // sub fan
"sub","vent",-3.5,35,34,"top",[0,0,90],["case",false,false,false],2,10,4,1,17,"vertical",1, // vent opening
@@ -472,6 +455,10 @@ accessory_data = [
["n1_hex",
"sub","fan",50,25,24.5,"top",[0,0,45],["case",false,false,false],40,0,6,2,0,"",0], // sub fan opening
// Odroid-N2L
["n2l_tray",
"sub","rectangle",65,36,-2.5,"bottom",[0,0,0],["case",true,true,true],5,13,15.5,0,0,"vertical",[1,1,1,1]], // sub hdmi opening
// Odroid-N2+
// internal fan
["n2+_tray_vu7_fan",
@@ -493,7 +480,7 @@ accessory_data = [
"sub","vent",94.5,32,10,"top",[0,0,90],["case",true,false,false],2,15,4,1,17,"vertical",1, // vent opening
"sub","vent",-6.5,32,10,"top",[0,0,90],["case",false,false,false],2,15,4,1,17,"vertical",1], // vent opening
["m1_tray_drive",
["m1_tray_ssd",
"sub","hd_holes",10,22,33,"top",[0,0,0],["sbc-case_z",true,true,true],0,0,0,2.5,3,"portrait",0, // sub hd bottom holes
"model","hd25",10,122,25.5,"top",[0,0,-90],["sbc-case_z",true,true,true],0,0,0,7.5,0,"",0, // model 2.5 hd
"sub","vent",22,32,33,"top",[0,0,0],["sbc-case_z",true,true,true],2,15,8,2,12,"horizontal",1, // top vent opening
@@ -516,6 +503,74 @@ accessory_data = [
"sub","vent",93,32,10,"right",[0,0,90],["case",true,false,false],2,15,6,1,17,"vertical",1, // vent opening
"sub","vent",-7,32,10,"left",[0,0,90],["case",false,false,false],2,15,6,1,17,"vertical",1], // vent opening
["m1_fitted_drivebox2.5",
"add2","hd_holder",10,20,1.99,"bottom",[0,0,0],["case",true,true,false],0,0,0,2.5,0,"portrait",0, // add hd holder
"sub","hd_holes",10,20,-.01,"bottom",[0,0,0],["case",true,true,false],0,0,0,2.5,3,"portrait",0, // sub hd bottom holes
"sub","round",92,34,5,"bottom",[0,90,0],["case",true,true,false],3,0,3,0,0,"",0, // sub hd side screw hole
"sub","round",92,110.6,5,"bottom",[0,90,0],["case",true,true,false],3,0,3,0,0,"",0, // sub hd side screw hole
"sub","round",92,34,23,"bottom",[0,90,0],["case",true,true,false],3,0,3,0,0,"",0, // sub hd side screw hole
"sub","round",92,110.6,23,"bottom",[0,90,0],["case",true,true,false],3,0,3,0,0,"",0, // sub hd side screws hole
"suball","fan",39,-.1,7,"bottom",[90,0,0],["case",true,false,false],40,0,3,1,0,"",0, // sub fan
"sub","vent",-3.75,25,30,"bottom",[0,0,90],["case",false,false,false],2,10,4,1,17,"vertical",1, // vent opening
"sub","vent",92,25,30,"bottom",[0,0,90],["case",true,false,false],2,10,4,1,17,"vertical",1, // vent opening
"sub","vent",-3.75,25,9,"bottom",[0,0,90],["case",false,false,false],2,10,4,1,17,"vertical",1, // vent opening
"sub","vent",92,25,9,"bottom",[0,0,90],["case",true,false,false],2,10,4,1,17,"vertical",1, // vent opening
"model","hd25",10,120,2,"bottom",[0,0,-90],["case",true,true,false],0,0,0,15,0,"",0, // model 2.5 hd
"model","hd25",10,120,20,"bottom",[0,0,-90],["case",true,true,false],0,0,0,15,0,"",0, // model 2.5 hd
"model","fan_cover",39,-4,7,"bottom",[90,0,0],["case",true,false,false],40,0,3,2,0,"",0, // model fan
"platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],40,0,3,2,0,"",0], // model fan
["m1_fitted_drivebox3.5",
"add2","hd_holder",-19.4,-27,3,"bottom",[0,0,0],["case",true,true,false],0,0,0,3.5,0,"portrait",0, // add hd holder
"sub","hd_holes",-19.4,-27,-.01,"bottom",[0,0,0],["case",true,true,false],0,0,0,3.5,3,"portrait",0, // sub hd bottom holes
"sub","round",91.6,1.5,9.35,"bottom",[0,90,0],["case",true,true,false],3,0,4,0,0,"",0, // sub hd side screw hole
"sub","round",91.6,43.4,9.35,"bottom",[0,90,0],["case",true,true,false],3,0,4,0,0,"",0, // sub hd side screw hole
"sub","round",91.6,103.1,9.35,"bottom",[0,90,0],["case",true,true,false],3,0,4,0,0,"",0, // sub hd side screw hole
"sub","vent",-3.75,60,40,"bottom",[0,0,90],["case",false,false,false],2,10,4,1,17,"vertical",1, // vent opening
"sub","vent",92,60,40,"bottom",[0,0,90],["case",true,false,false],2,10,4,1,17,"vertical",1, // vent opening
"sub","vent",-3.75,60,20,"bottom",[0,0,90],["case",false,false,false],2,10,4,1,17,"vertical",1, // vent opening
"sub","vent",92,60,20,"bottom",[0,0,90],["case",true,false,false],2,10,4,1,17,"vertical",1, // vent opening
"suball","vent",29,126,29,"bottom",[0,0,0],["case",false,true,false],2,13,4,1,4,"vertical",1, // sub vent
"suball","fan",5.6,-1.5,7,"bottom",[90,0,0],["case",true,false,false],40,0,3,1,0,"",0, // sub fan
"model","hd35",-19.4,120,3,"bottom",[0,0,-90],["case",true,true,false],0,0,0,0,0,"",0, // model 3.5 hd
"model","hd35",-19.4,120,35,"bottom",[0,0,-90],["case",true,true,false],0,0,0,0,0,"",0, // model 3.5 hd
"model","fan_cover",5.6,-4,7,"bottom",[90,0,0],["case",true,false,false],40,0,3,2,0,"",0, // model fan
"platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],40,0,3,2,0,"",0], // model fan
["m1_fitted_pizzabox",
"sub","hd_holes",-12,-27,-.01,"bottom",[0,0,0],["case",true,true,false],0,0,0,3.5,3,"portrait",0, // sub hd bottom holes
"sub","round",91.6,1.5,9.35,"bottom",[0,90,0],["case",true,true,false],3,0,4,0,0,"",0, // sub hd side screw hole
"sub","round",91.6,43.4,9.35,"bottom",[0,90,0],["case",true,true,false],3,0,4,0,0,"",0, // sub hd side screw hole
"sub","round",91.6,103.1,9.35,"bottom",[0,90,0],["case",true,true,false],3,0,4,0,0,"",0, // sub hd side screw hole
"sub","vent",-3.75,60,9,"bottom",[0,0,90],["case",false,false,false],2,10,4,1,17,"vertical",1, // vent opening
"sub","vent",92,60,9,"bottom",[0,0,90],["case",true,false,false],2,10,4,1,17,"vertical",1, // vent opening
"suball","vent",-89,126,15,"bottom",[0,0,0],["case",true,true,false],2,13,4,1,4,"vertical",1, // sub vent
"suball","fan",-30,60,48,"top",[0,0,0],["case",true,false,false],80,0,3,2,0,"",0, // sub fan
"model","hd35",-12,120,2.5,"bottom",[0,0,-90],["case",true,true,false],0,0,0,0,0,"",0, // model 3.5 hd
// "model","fan_cover",5.6,-4,7,"bottom",[90,0,0],["case",true,false,false],40,0,3,2,0,"",0, // model fan
"platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],40,0,3,2,0,"",0], // model fan
["m1_fitted_drivebox3.5v",
// "add2","hd_vertright",45.6,-21,2.49,"bottom",[0,0,0],["case",true,true,false],0,0,0,3.5,0,"portrait",0, // sub hd bottom holes
// "sub","hd_vertright_holes",45.6,-21,-.01,"bottom",[0,0,0],["case",true,true,false],0,0,0,3.5,2.5,"portrait",0, // sub hd bottom holes
// "add2","hd_vertleft",0,-27,2.49,"bottom",[0,0,0],["case",true,true,false],0,0,0,3.5,0,"portrait",0, // add hd holder
// "sub","hd_vertleft_holes",0,-27,-.01,"bottom",[0,0,0],["case",true,true,false],0,0,0,3.5,0,"portrait",0, // sub hd bottom holes
"add2","hd_vertleft",80,-27,2.49,"bottom",[0,0,0],["case",true,true,false],0,0,0,3.5,0,"portrait",0, // add hd holder
"sub","hd_vertleft_holes",80,-27,-.01,"bottom",[0,0,0],["case",true,true,false],0,0,0,3.5,0,"portrait",0, // sub hd bottom holes
"sub","round",91.6,14.5,6,"bottom",[0,90,0],["case",true,true,false],3,0,4,0,0,"",0, // sub hd side screw hole
"sub","round",91.6,58.55,6,"bottom",[0,90,0],["case",true,true,false],3,0,4,0,0,"",0, // sub hd side screw hole
"sub","round",91.6,90.1,6,"bottom",[0,90,0],["case",true,true,false],3,0,4,0,0,"",0, // sub hd side screw hole
"sub","vent",-3.75,60,40,"bottom",[0,0,90],["case",false,false,false],2,10,4,1,17,"vertical",1, // vent opening
"sub","vent",92,60,40,"bottom",[0,0,90],["case",true,false,false],2,10,4,1,17,"vertical",1, // vent opening
"sub","vent",-3.75,60,20,"bottom",[0,0,90],["case",false,false,false],2,10,4,1,17,"vertical",1, // vent opening
"sub","vent",92,60,20,"bottom",[0,0,90],["case",true,false,false],2,10,4,1,17,"vertical",1, // vent opening
"suball","vent",29,126,29,"bottom",[0,0,0],["case",false,true,false],2,13,4,1,4,"vertical",1, // sub vent
"suball","fan",5.6,-1.5,50,"bottom",[90,0,0],["case",true,false,false],40,0,3,1,0,"",0, // sub fan
// "model","hd35",-19.4,120,104.1,"bottom",[-90,0,-90],["case",true,true,false],0,0,0,0,0,"",0, // model 3.5 hd
"model","hd35",80,120,2.5,"bottom",[90,0,-90],["case",true,true,false],0,0,0,0,0,"",0, // model 3.5 hd
"model","fan_cover",5.6,-4,50,"bottom",[90,0,0],["case",true,false,false],40,0,3,2,0,"",0, // model fan
"platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],40,0,3,2,0,"",0], // model fan
// Odroid-H2
["h2_shell",
@@ -582,7 +637,7 @@ accessory_data = [
"sub","vent",111.5,30,18,"top",[0,0,90],["case",true,false,false],2,6,4,1,17,"vertical",1, // vent opening
"sub","vent",-3.5,30,4,"bottom",[0,0,90],["case",false,false,false],2,6,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,4,"bottom",[0,0,90],["case",true,false,false],2,6,4,1,17,"vertical",1, // vent opening
"add2","batt_holder",98,40,44,"top",[180,0,-18],["case",false,false,false],10,10,0,0,0,"",0, // add uart
"add2","batt_holder",98,40,53,"top",[180,0,-18],["case",false,false,true],10,10,0,0,0,"",0, // add uart
"add1","access_port",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,false],100,80,2,0,0,"landscape",0, // access port
"add2","button",12.34,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,11,0,0,"recess",0, // button
"add2","button",23.77,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,11,0,0,"recess",0, // button
@@ -701,6 +756,134 @@ accessory_data = [
"platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],10,0,32,0,0,"recess",0, // button top
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],100,80,2,0,0,"landscape",0], // access port cover
// Odroid-H3
["h3_shell",
"sub","vent",-3.5,30,18,"top",[0,0,90],["case",false,false,true],2,6,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,18,"top",[0,0,90],["case",true,false,true],2,6,4,1,17,"vertical",1, // vent opening
"sub","vent",-3.5,30,4,"bottom",[0,0,90],["case",false,false,true],2,6,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,4,"bottom",[0,0,90],["case",true,false,true],2,6,4,1,17,"vertical",1, // vent opening
"add1","access_port",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,false],100,79.5,2,0,0,"landscape",0, // access port
"add2","batt_holder",98,40,53,"top",[180,0,-18],["sbc-case_z",true,true,true],10,10,0,0,0,"",0, // add battery holder
"add2","button",12.34,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,32,0,0,"recess",0, // button
"add2","button",23.77,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,32,0,0,"recess",0, // button
"model","button_top",12.34,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,32,0,0,"recess",0, // button top
"model","button_top",23.77,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,32,0,0,"recess",0, // button top
"model","access_cover",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,false],100,80,2,0,0,"landscape",0, // access port cover
"platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],10,0,32,0,0,"recess",0, // button top
"platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],10,0,32,0,0,"recess",0, // button top
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],100,80,2,0,0,"landscape",0], // access port cover
["h3_lowboy",
"sub","rectangle",94.5,-4,32,"top",[0,0,0],["sbc-case_z",true,true,true],14,24.5,22,0,0,"vertical",[.25,.25,.25,.25], // sub rectangle
"sub","rectangle",68,-4,32,"top",[0,0,0],["sbc-case_z",true,true,true],19.5,21.5,22,0,0,"vertical",[.25,.25,.25,.25], // sub rectangle
"sub","rectangle",44.5,-4,32,"top",[0,0,0],["sbc-case_z",true,true,true],20.5,31,22,0,0,"vertical",[.25,.25,.25,.25], // sub rectangle
"sub","rectangle",19.5,-4,32,"top",[0,0,0],["sbc-case_z",true,true,true],20.5,31,22,0,0,"vertical",[.25,.25,.25,.25], // sub rectangle
"sub","rectangle",9.5,26.5,50,"top",[0,0,0],["sbc-case_z",true,true,true],79.5,74.5,5,0,0,"vertical",[.25,.25,.25,.25], // sub rectangle
"sub","vent",-3.5,30,18,"top",[0,0,90],["case",false,false,false],2,6,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,18,"top",[0,0,90],["case",true,false,false],2,6,4,1,17,"vertical",1, // vent opening
"sub","vent",-3.5,30,4,"bottom",[0,0,90],["case",false,false,false],2,6,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,4,"bottom",[0,0,90],["case",true,false,false],2,6,4,1,17,"vertical",1, // vent opening
"add2","-batt_holder",111.6,45,38,"top",[180,90,0],["sbc-case_z",true,true,true],10,10,0,0,0,"",0, // add battery holder
"add1","access_port",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,false],100,80,2,0,0,"landscape",0, // access port
"add2","button",12.34,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,11,0,0,"recess",0, // button
"add2","button",23.77,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,11,0,0,"recess",0, // button
"model","button_top",12.34,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,11,0,0,"recess",0, // button top
"model","button_top",23.77,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,11,0,0,"recess",0, // button top
"model","access_cover",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,false],100,80,2,0,0,"landscape",0, // access port cover
"platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],10,0,11,0,0,"recess",0, // button top
"platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],10,0,11,0,0,"recess",0, // button top
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],100,80,2,0,0,"landscape",0], // access port cover
["h3_lowboy_router",
"sub","rectangle",94.5,-4,32,"top",[0,0,0],["sbc-case_z",true,true,true],14,24.5,22,0,0,"vertical",[.25,.25,.25,.25], // sub rectangle
"sub","rectangle",68,-4,32,"top",[0,0,0],["sbc-case_z",true,true,true],19.5,21.5,22,0,0,"vertical",[.25,.25,.25,.25], // sub rectangle
"sub","rectangle",44.5,-4,32,"top",[0,0,0],["sbc-case_z",true,true,true],20.5,31,22,0,0,"vertical",[.25,.25,.25,.25], // sub rectangle
"sub","rectangle",19.5,-4,32,"top",[0,0,0],["sbc-case_z",true,true,true],20.5,31,22,0,0,"vertical",[.25,.25,.25,.25], // sub rectangle
"sub","rectangle",9.5,26.5,50,"top",[0,0,0],["sbc-case_z",true,true,true],79.5,74.5,5,0,0,"vertical",[.25,.25,.25,.25], // sub rectangle
"sub","vent",-3.5,30,30,"top",[0,0,90],["case",false,false,false],2,10,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,30,"top",[0,0,90],["case",true,false,false],2,10,4,1,17,"vertical",1, // vent opening
"sub","vent",-3.5,30,4,"bottom",[0,0,90],["case",false,false,false],2,10,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,4,"bottom",[0,0,90],["case",true,false,false],2,10,4,1,17,"vertical",1, // vent opening
"add2","-batt_holder",98,40,44,"top",[180,0,-18],["case",false,false,false],10,10,0,0,0,"",0, // add uart
"add1","access_port",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,false],100,80,2,0,0,"landscape",0, // access port
"add2","button",12.34,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,11,0,0,"recess",0, // button
"add2","button",23.77,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,11,0,0,"recess",0, // button
"model","button_top",12.34,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,11,0,0,"recess",0, // button top
"model","button_top",23.77,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,11,0,0,"recess",0, // button top
"model","access_cover",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,false],100,80,2,0,0,"landscape",0, // access port cover
"model","h2_netcard",0,0,19,"bottom",[0,0,0],["sbc",true,true,true],0,0,0,0,0,"portrait",0, // h2 network card
"platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],10,0,11,0,0,"recess",0, // button top
"platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],10,0,11,0,0,"recess",0, // button top
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],100,80,2,0,0,"landscape",0], // access port cover
["h3_tallboy",
"sub","vent",-3.5,30,58,"top",[0,0,90],["case",false,false,false],2,12,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,58,"top",[0,0,90],["case",true,false,false],2,12,4,1,17,"vertical",1, // vent opening
"sub","vent",-3.5,30,28,"top",[0,0,90],["case",false,false,false],2,12,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,28,"top",[0,0,90],["case",true,false,false],2,12,4,1,17,"vertical",1, // vent opening
"sub","vent",-3.5,30,4,"bottom",[0,0,90],["case",false,false,false],2,6,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,4,"bottom",[0,0,90],["case",true,false,false],2,6,4,1,17,"vertical",1, // vent opening
"sub","fan",99,10,48,"top",[0,0,90],["sbc-case_z",true,true,true],90,0,6,2,0,"",0, // fan opening
"add2","batt_holder",113.5,45,20,"top",[90,0,270],["sbc-case_z",true,true,true],10,10,0,0,0,"",0, // add battery holder
"add1","access_port",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,false],100,80,2,0,0,"landscape",0, // access port
"add2","button",12.34,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,53,0,0,"recess",0, // button
"add2","button",23.77,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,53,0,0,"recess",0, // button
"model","button_top",12.34,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,58,0,0,"recess",0, // button top
"model","button_top",23.77,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,58,0,0,"recess",0, // button top
"model","access_cover",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,false],100,80,2,0,0,"landscape",0, // access port cover
"platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],10,0,58,0,0,"recess",0, // button top
"platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],10,0,58,0,0,"recess",0, // button top
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],100,80,2,0,0,"landscape",0], // access port cover
["h3_tallboy-ssd",
"sub","vent",-3.5,30,58,"top",[0,0,90],["case",false,false,false],2,12,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,58,"top",[0,0,90],["case",true,false,false],2,12,4,1,17,"vertical",1, // vent opening
"sub","vent",-3.5,30,28,"top",[0,0,90],["case",false,false,false],2,12,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,28,"top",[0,0,90],["case",true,false,false],2,12,4,1,17,"vertical",1, // vent opening
"sub","vent",-3.5,30,4,"bottom",[0,0,90],["case",false,false,false],2,6,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,4,"bottom",[0,0,90],["case",true,false,false],2,6,4,1,17,"vertical",1, // vent opening
"sub","fan",99,10,48,"top",[0,0,90],["sbc-case_z",true,true,true],90,0,6,2,0,"",0, // fan opening
"add1","access_port",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,false],100,80,2,0,0,"landscape",0, // access port
"add2","button",12.34,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,53,0,0,"recess",0, // button
"add2","button",23.77,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,53,0,0,"recess",0, // button
"model","button_top",12.34,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,58,0,0,"recess",0, // button top
"model","button_top",23.77,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,58,0,0,"recess",0, // button top
"model","access_cover",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,false],100,80,2,0,0,"landscape",0, // access port cover
"platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],10,0,58,0,0,"recess",0, // button top
"platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],10,0,58,0,0,"recess",0, // button top
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],100,80,2,0,0,"landscape",0, // access port cover
"sub","round",111,34,6.07,"bottom",[0,90,0],["case",true,false,false],3,0,3,0,0,"",0, // sub hd side screw hole
"sub","round",111,110.6,6.07,"bottom",[0,90,0],["case",true,false,false],3,0,3,0,0,"",0, // sub hd side screw hole
"add2","hd_vertleft",98,10,1.99,"bottom",[0,0,0],["case",true,true,false],0,0,0,2.5,3,"portrait",0, // add hd holder
"sub","hd_vertleft_holes",98,10,-.01,"bottom",[0,0,0],["case",true,true,false],0,0,0,2.5,3,"portrait",0, // sub hd bottom holes
"model","hd25",98,110,2,"bottom",[90,0,-90],["case",true,true,false],0,0,0,7,0,"",0], // model 2.5 hd
["h3_shell_drivebox2.5v",
"sub","vent",-3.5,30,58,"top",[0,0,90],["case",false,false,false],2,12,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,58,"top",[0,0,90],["case",true,false,false],2,12,4,1,17,"vertical",1, // vent opening
"sub","vent",-3.5,30,28,"top",[0,0,90],["case",false,false,false],2,12,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,28,"top",[0,0,90],["case",true,false,false],2,12,4,1,17,"vertical",1, // vent opening
"sub","vent",-3.5,30,4,"bottom",[0,0,90],["case",false,false,false],2,6,4,1,17,"vertical",1, // vent opening
"sub","vent",111.5,30,4,"bottom",[0,0,90],["case",true,false,false],2,6,4,1,17,"vertical",1, // vent opening
"sub","fan",99,10,48,"top",[0,0,90],["sbc-case_z",true,true,true],90,0,6,2,0,"",0, // fan opening
"add1","access_port",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,false],100,80,2,0,0,"landscape",0, // access port
"add2","button",12.34,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,53,0,0,"recess",0, // button
"add2","button",23.77,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,53,0,0,"recess",0, // button
"model","button_top",12.34,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,58,0,0,"recess",0, // button top
"model","button_top",23.77,106.43,53,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,58,0,0,"recess",0, // button top
"model","access_cover",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,false],100,80,2,0,0,"landscape",0, // access port cover
"platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],10,0,58,0,0,"recess",0, // button top
"platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],10,0,58,0,0,"recess",0, // button top
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],100,80,2,0,0,"landscape",0, // access port cover
"sub","round",111,24,6.07,"bottom",[0,90,0],["case",true,true,false],3,0,3,0,0,"",0, // sub hd side screw hole
"sub","round",111,100.6,6.07,"bottom",[0,90,0],["case",true,true,false],3,0,3,0,0,"",0, // sub hd side screw hole
"add2","hd_vertleft",100,10,1.99,"bottom",[0,0,0],["case",true,true,false],0,0,0,2.5,3,"portrait",0, // add hd holder
"add2","hd_vertright",65,10,1.99,"bottom",[0,0,0],["case",true,true,false],0,0,0,2.5,0,"portrait",0, // sub hd bottom holes
"sub","hd_vertleft_holes",100,10,-.01,"bottom",[0,0,0],["case",true,true,false],0,0,0,2.5,3,"portrait",0, // sub hd bottom holes
"sub","hd_vertright_holes",65,10,-.01,"bottom",[0,0,0],["case",true,true,false],0,0,0,2.5,2,"portrait",0, // sub hd bottom holes
"model","hd25",65,110,71.85,"bottom",[-90,0,-90],["case",true,true,false],0,0,0,15,0,"",0, // model 2.5 hd
"model","hd25",100,110,2,"bottom",[90,0,-90],["case",true,true,false],0,0,0,15,0,"",0], // model 2.5 hd
// Nvidia
["jetsonnano_shell",
@@ -1086,6 +1269,14 @@ accessory_data = [
["rockpi4c+_fitted",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi5b",
"sub","rectangle",-1,66.5,13,"top",[0,0,0],["sbc",true,true,false],10,2,8,0,0,"",[.25,.25,.25,.25], // UL standoff adjustment
"sub","rectangle",92,17.5,13,"top",[0,0,0],["sbc",true,true,false],10,2,15,0,0,"",[.25,.25,.25,.25], // LR standoff adjustment
"sub","rectangle",77,67,-1,"bottom",[0,0,0],["sbc",true,true,false],15,18,12.5,0,0,"",[.25,.25,.25,.25], // sdcard opening
"add1","access_port",10,0,-0.01,"bottom",[0,0,0],["sbc",true,true,false],80,75,2,0,0,"portrait",0, // access port
"model","access_cover",10,0,-0.01,"bottom",[0,0,0],["sbc",true,true,false],80,75,2,0,0,"portrait",0, // model access port cover
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],80,75,2,0,0,"portrait",0], // platter access port cover
// Khadas
["vim1_shell",

View File

@@ -44,8 +44,11 @@
printer friendly punchout(),added remaining mask() entries, standardized mask()
20221005 version 2.0.0 increased mask projection for ir_1, added mask for usb2 and usb3 single_horizontal_a, hdmi_micro,
video-hdmi_mini,microsdcard,momentary_7x3x3_90,rj45_single_short, added subtraction microusb and sphere
20221011 Version 2.0.1 adjusted cases and accessories, updated README.md and SBC_Case_Builder_Cases.gif
20221101 version 2.0.2 added hdmi_a_vertical mask, increased jack_3.5 mask dia.to 6mm, lowered hdmi_a_vertical mask by 2mm,
added mask for microsdcard2
20221207 version 2.0.3 added double_stacked_usb3-usb2, hd35_vtab(side) and supporting code
see https://github.com/hominoids/SBC_Case_Builder
place(x,y,z,size_x,size_y,rotation,side)
@@ -73,6 +76,7 @@
hd25_tab(side)
hd25_vtab(side)
hd35_tab(side)
hd35_vtab(side)
hd_bottom_holes(hd,orientation,position,side,thick)
hd25(height)
hd35()
@@ -824,20 +828,46 @@ module hd_mount(hd,orientation,position,side) {
}
if(hd == 3.5) {
if(orientation == "portrait") {
translate([-.5,28.5,0]) hd35_tab("left");
translate([-.5,69.75,0]) hd35_tab("left");
translate([-.5,130.1,0]) hd35_tab("left");
translate([101.6+.5,28.5,0]) hd35_tab("right");
translate([101.6+.5,69.75,0]) hd35_tab("right");
translate([101.6+.5,130.1,0]) hd35_tab("right");
if(position == "vertical") {
if(side == "left") {
translate([0,41.28,0]) rotate([0,0,0]) hd35_vtab("right");
translate([0,41.28+44.45,0]) rotate([0,0,0]) hd35_vtab("right");
translate([0,41.28+76.20,0]) rotate([0,0,0]) hd35_vtab("right");
}
else { // right
translate([0,41.28,0]) rotate([0,0,0]) hd35_vtab("left");
translate([0,41.28+44.45,0]) rotate([0,0,0]) hd35_vtab("left");
translate([0,41.28+76.20,0]) rotate([0,0,0]) hd35_vtab("left");
}
}
else {
translate([-.5,28.5,0]) hd35_tab("left");
translate([-.5,69.75,0]) hd35_tab("left");
translate([-.5,130.1,0]) hd35_tab("left");
translate([101.6+.5,28.5,0]) hd35_tab("right");
translate([101.6+.5,69.75,0]) hd35_tab("right");
translate([101.6+.5,130.1,0]) hd35_tab("right");
}
}
if(orientation == "landscape") {
translate([16.9,-.5,0]) rotate([0,0,90]) hd35_tab("left");
translate([76.6,-.5,0]) rotate([0,0,90]) hd35_tab("left");
translate([118.5,-.5,0]) rotate([0,0,90]) hd35_tab("left");
translate([16.9,101.6-.5,0]) rotate([0,0,90]) hd35_tab("right");
translate([76.6,101.6-.5,0]) rotate([0,0,90]) hd35_tab("right");
translate([118.5,101.6-.5,0]) rotate([0,0,90]) hd35_tab("right");
if(position == "vertical") {
if(side == "left") {
translate([9.4,0,0]) rotate([0,0,90]) hd35_vtab("right");
translate([86,0,0]) rotate([0,0,90]) hd35_vtab("right");
}
else { // right
translate([9.4,0,0]) rotate([0,0,90]) hd35_vtab("left");
translate([86,0,0]) rotate([0,0,90]) hd35_vtab("left");
}
}
else {
translate([16.9,-.5,0]) rotate([0,0,90]) hd35_tab("left");
translate([76.6,-.5,0]) rotate([0,0,90]) hd35_tab("left");
translate([118.5,-.5,0]) rotate([0,0,90]) hd35_tab("left");
translate([16.9,101.6-.5,0]) rotate([0,0,90]) hd35_tab("right");
translate([76.6,101.6-.5,0]) rotate([0,0,90]) hd35_tab("right");
translate([118.5,101.6-.5,0]) rotate([0,0,90]) hd35_tab("right");
}
}
}
}
@@ -1033,6 +1063,66 @@ module hd35_tab(side) {
}
}
module hd35_vtab(side) {
width = 15;
l_width = 16;
depth = 15;
height = 4;
fillet = 2;
hole = 3.6;
length = 3;
adjust = .01;
$fn = 90;
if(side == "left") {
difference() {
union() {
translate([0,-depth/2,0]) rotate([0,-90,0])
slab_r([l_width,depth,height], [fillet,fillet,fillet,fillet]);
translate([-height,-depth/2,0]) cube([height,depth,height]);
translate([adjust,-5.5,depth])
rotate([90,0,0])
linear_extrude(height = 2)
polygon(points = [ [-height,height-5],
[-depth+4,-depth],
[-height,-depth]]);
translate([adjust,7.5,depth])
rotate([90,0,0])
linear_extrude(height = 2)
polygon(points = [ [-height,height-5],
[-depth+4,-depth],
[-height,-depth]]);
}
translate([3,0,-adjust]) rotate([0,0,0]) cylinder(d=hole, h=3);
translate([-height-adjust,1.5+(width/2)-(length/2)-depth/2,5.57]) rotate([90,90,90]) slot(hole,length,height+(2*adjust));
}
}
if(side == "right") {
difference() {
union() {
translate([height,-depth/2,0]) rotate([0,-90,0])
slab_r([l_width,depth,height], [fillet,fillet,fillet,fillet]);
translate([0,-depth/2,0]) cube([height,depth,height]);
translate([adjust,-7.5,depth])
rotate([90,0,180])
linear_extrude(height = 2)
polygon(points = [ [-height,height-5],
[-depth+4,-depth],
[-height,-depth]]);
translate([adjust,5.5,depth])
rotate([90,0,180])
linear_extrude(height = 2)
polygon(points = [ [-height,height-5],
[-depth+4,-depth],
[-height,-depth]]);
}
translate([-3,0,-adjust]) rotate([0,0,0]) cylinder(d=hole, h=3);
translate([-adjust,1.5+(width/2)-(length/2)-depth/2,5.57]) rotate([90,90,90]) slot(hole,length,height+(2*adjust));
}
}
}
module hd_bottom_holes(hd,orientation,position,side,thick) {
@@ -1063,13 +1153,13 @@ module hd_bottom_holes(hd,orientation,position,side,thick) {
if(orientation == "landscape") {
if(position == "vertical") {
if(side == "left") {
translate([9.4,-3,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([86,-3,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([9.4,-3,0]) cylinder(d=3.6,h=thick+5);
translate([86,-3,0]) cylinder(d=3.6,h=thick+5);
}
else {
echo(side);
translate([9.4,3,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([86,3,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([9.4,3,0]) cylinder(d=3.6,h=thick+5);
translate([86,3,0]) cylinder(d=3.6,h=thick+5);
}
}
else {
@@ -1083,13 +1173,28 @@ module hd_bottom_holes(hd,orientation,position,side,thick) {
}
if(hd == 3.5) {
if(orientation == "portrait") {
// portrait 3.5" bottom screw holes
translate([3.18,41.28,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([3.18,85.73,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([3.18,117.48,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([98.43,41.28,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([98.43,85.73,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([98.43,117.48,0]) cylinder(d=3.6,h=thick+(adjust*2));
if(position == "vertical") {
if(side == "left") {
translate([-6,28.5,0]) cylinder(d=3.6,h=thick+5);
translate([-6,70.5,0]) cylinder(d=3.6,h=thick+5);
translate([-6,28.5+101.6,0]) cylinder(d=3.6,h=thick+5);
}
else {
// portrait 3.5" bottom screw holes
translate([6,28.5,0]) cylinder(d=3.6,h=thick+5);
translate([6,70.5,0]) cylinder(d=3.6,h=thick+5);
translate([6,28.5+101.6,0]) cylinder(d=3.6,h=thick+5);
}
}
else {
// portrait 3.5" bottom screw holes
translate([3.18,41.28,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([3.18,85.73,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([3.18,117.48,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([98.43,41.28,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([98.43,85.73,0]) cylinder(d=3.6,h=thick+(adjust*2));
translate([98.43,117.48,0]) cylinder(d=3.6,h=thick+(adjust*2));
}
}
if(orientation == "landscape") {
// landscape 3.5" bottom screw holes
@@ -2264,7 +2369,7 @@ module access_port(size,orientation) {
translate([.5,6,-adjust]) cube([size[0]-1.15,size[1]-17,floorthick+(adjust*2)]);
translate([(size[0]/2)-5,size[1]-12,-adjust]) slab([10.5,5.5,floorthick],5.5);
translate([(size[0]/2)+.25,size[1]-6.5,floorthick+2])
cylinder(r=3.3,h=floorthick+(adjust*2)+5,$fn=6);
cylinder(r=3.2,h=floorthick+(adjust*2)+5,$fn=6);
translate([(size[0]/2)+.25,size[1]-6.5,-adjust])
cylinder(d=3.2,h=floorthick+(adjust*2)+5);
translate([4,2+adjust,floorthick]) cube([7.75,3,2.75]);
@@ -2279,15 +2384,15 @@ module access_port(size,orientation) {
union() {
translate([0,-1,0]) cube([size[0],size[1],size[2]]);
// access panel support
translate([size[0]-6.5,(size[1]/2)-.75,0]) cylinder(d=9,h=floorthick+(adjust*2)+5);
translate([size[0]-11,(size[1]/2)-10,floorthick-adjust]) cube([9.5,20,floorthick]);
translate([size[0]-6.5,(size[1]/2)-.5,0]) cylinder(d=9,h=floorthick+(adjust*2)+5);
translate([size[0]-11,(size[1]/2)-10.5,floorthick-adjust]) cube([9.5,20,floorthick]);
translate([0,0,floorthick-adjust]) cube([5,size[1]-2,4.5]);
}
// access opening
translate([6,-.5,-adjust]) cube([size[0]-17,size[1]-1.15,floorthick+(adjust*3)]);
translate([size[0]-12,(size[1]/2)-6,-adjust]) slab([5.5,10.5,floorthick],5.5);
translate([size[0]-6.5,(size[1]/2)-.5,floorthick+2]) rotate([0,0,30])
cylinder(r=3.3,h=floorthick+(adjust*2)+5,$fn=6);
cylinder(r=3.2,h=floorthick+(adjust*2)+5,$fn=6);
translate([size[0]-6.5,(size[1]/2)-.5,-adjust])
cylinder(d=3.2,h=floorthick+(adjust*2)+5);
translate([2+adjust,3,floorthick]) cube([3,8.25,2.75]);
@@ -2327,8 +2432,8 @@ module access_cover(size,orientation) {
if(orientation == "landscape") {
difference() {
union() {
translate([6.25,-.25,0]) cube([size[0]-17.5,size[1]-2,floorthick]);
translate([size[0]-12.25,(size[1]/2)-6,0]) slab([5,10,floorthick], 5);
translate([6.25,0,0]) cube([size[0]-17.75,size[1]-2,floorthick]);
translate([size[0]-12.25,(size[1]/2)-5.75,0]) slab([5,10,floorthick], 5);
translate([6.25,0,floorthick-adjust]) cube([6,size[1]-2.15,floorthick]);
translate([3.5+adjust,3.25,floorthick]) cube([4,7.25,2]);
translate([3.5+adjust,size[1]-12.75,floorthick]) cube([4,7.25,2]);
@@ -2562,6 +2667,19 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
if(type == "hdmi_a" && side == "bottom" && rotation == 270) {
place(loc_x-1,loc_y-1,loc_z-pcb_z,15,11.5,rotation,side) hdmi_open("hdmi_a");
}
// hdmi vertical opening
if(type == "hdmi_a_vertical" && side == "top" && rotation == 0) {
place(loc_x-.5,loc_y,loc_z,15,11.5,rotation,side) translate([-.25,0,15.4]) rotate([0,90,0]) hdmi_open("hdmi_a");
}
if(type == "hdmi_a_vertical" && side == "top" && rotation == 90) {
place(loc_x-1,loc_y,loc_z,15,11.5,rotation,side) translate([-.25,0,15.4]) rotate([0,90,0]) hdmi_open("hdmi_a");
}
if(type == "hdmi_a_vertical" && side == "top" && rotation == 180) {
place(loc_x,loc_y+1,loc_z,15,11.5,rotation,side) translate([-.25,0,15.4]) rotate([0,90,0]) hdmi_open("hdmi_a");
}
if(type == "hdmi_a_vertical" && side == "top" && rotation == 270) {
place(loc_x+1,loc_y-.5,loc_z,15,11.5,rotation,side) translate([-.25,0,15.4]) rotate([0,90,0]) hdmi_open("hdmi_a");
}
// hdmi micro opening
if(class == "video" && type == "hdmi_micro" && rotation == 0 && side == "top") {
place(loc_x,loc_y,loc_z,7.25,6.5,rotation,side) hdmi_open("hdmi_micro");
@@ -2725,8 +2843,8 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
cube([14.5,19.5,floorthick+(2*adjust)]);
}
if(type == "emmc" && side == "bottom" && rotation == 270) {
place(loc_x-.5,loc_y-.5,floorthick+adjust,14.5,19.5,rotation,side)
cube([14.5,19.5,floorthick+(2*adjust)]);
place(loc_x-.5,loc_y-.5,floorthick+adjust+7,15,19.5,rotation,side)
cube([14.5,19.5,floorthick+(2*adjust)+12]);
}
// sd storage
if(type == "sdcard" && side == "bottom" && rotation == 0) {
@@ -2809,6 +2927,38 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
place(loc_x-12.1,loc_y+.125,loc_z-pcb_z,13.2,14.1,rotation,side)
cube([13.5,14.1,2]);
}
if(type == "microsdcard2" && side == "bottom" && rotation == 0) {
place(loc_x-1,loc_y-15,loc_z-pcb_z,12,15.5,rotation,side)
cube([13,15.5,2]);
}
if(type == "microsdcard2" && side == "bottom" && rotation == 90) {
place(loc_x+5,loc_y,loc_z-pcb_z,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "microsdcard2" && side == "bottom" && rotation == 180) {
place(loc_x,loc_y+5,loc_z-pcb_z,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "microsdcard2" && side == "bottom" && rotation == 270) {
place(loc_x+5,loc_y-18,loc_z-pcb_z,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "microsdcard2" && side == "top" && rotation == 0) {
place(loc_x,loc_y-15,loc_z+1.75,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "microsdcard2" && side == "top" && rotation == 90) {
place(loc_x-15,loc_y-.5,loc_z+1.75,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "microsdcard2" && side == "top" && rotation == 180) {
place(loc_x-.5,loc_y+5,loc_z+1.75,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "microsdcard2" && side == "top" && rotation == 270) {
place(loc_x+5,loc_y,loc_z+1.75,12,15.5,rotation,side)
cube([12,15.5,2]);
}
// rj45 opening
if(type == "rj45_single" && rotation == 0) {
place(loc_x,loc_y-6,loc_z,16,17.5,rotation,side)
@@ -2869,19 +3019,19 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
place(loc_x-3,loc_y,loc_z-1.25,8,3,rotation,side) microusb_open();
}
// double stack usb opening
if((type == "double_stacked_a" || type == "double_stacked_usb3-usbc") && rotation == 0) {
if((type == "double_stacked_a" || type == "double_stacked_usb3-usbc" || type == "double_stacked_usb3-usb2") && rotation == 0) {
place(loc_x-1,loc_y-6,loc_z,15.5,16,rotation,side)
cube([15.5,8,16.5]);
}
if((type == "double_stacked_a" || type == "double_stacked_usb3-usbc") && rotation == 90) {
if((type == "double_stacked_a" || type == "double_stacked_usb3-usbc" || type == "double_stacked_usb3-usb2") && rotation == 90) {
place(loc_x-6,loc_y-1.25,loc_z,15.5,16,rotation,side)
cube([15.5,8,16.5]);
}
if((type == "double_stacked_a" || type == "double_stacked_usb3-usbc") && rotation == 180) {
if((type == "double_stacked_a" || type == "double_stacked_usb3-usbc" || type == "double_stacked_usb3-usb2") && rotation == 180) {
place(loc_x-1,loc_y+7.5,loc_z,15.5,16,rotation,side)
cube([15.5,8,16.5]);
}
if((type == "double_stacked_a" || type == "double_stacked_usb3-usbc") && rotation == 270) {
if((type == "double_stacked_a" || type == "double_stacked_usb3-usbc" || type == "double_stacked_usb3-usb2") && rotation == 270) {
place(loc_x+6.25,loc_y-1,loc_z,15.5,16,rotation,side)
cube([15.5,8,16.5]);
}
@@ -2952,6 +3102,23 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
place(loc_x+2,loc_y+1.5,loc_z-3.25,6,8,rotation,side)
rotate([90,0,0]) slot(3.75,6,8);
}
// single vertical usbc opening
if(class == "usbc" && type == "single_vertical" && rotation == 0 && side == "top") {
place(loc_x+1.5,loc_y+2,loc_z+1.75,6,8,rotation,side)
translate([.25,0,5.5]) rotate([90,90,0]) slot(3.75,5.5,8);
}
if(class == "usbc" && type == "single_vertical" && rotation == 90 && side == "top") {
place(loc_x+2,loc_y+1.5,loc_z+1.75,6,8,rotation,side)
translate([.25,0,5.5]) rotate([90,90,0]) slot(3.75,5.5,8);
}
if(class == "usbc" && type == "single_vertical" && rotation == 180 && side == "top") {
place(loc_x+1.5,loc_y-3-adjust,loc_z+2,6,8,rotation,side)
translate([.25,0,5.5]) rotate([90,90,0]) slot(3.75,5.5,8);
}
if(class == "usbc" && type == "single_vertical" && rotation == 270 && side == "top") {
place(loc_x-3-adjust,loc_y+1.5,loc_z+1.75,6,8,rotation,side)
translate([.25,0,5.5]) rotate([90,90,0]) slot(3.75,5.5,8);
}
// ir opening
if(type == "ir_1" && rotation == 0) {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
@@ -3075,56 +3242,56 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
if(type == "jack_3.5" && rotation == 0 && side == "top") {
place(loc_x,loc_y,loc_z,7.5,7.5,rotation,side)
union() {
translate([3.15,2,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([3.15,2,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([-.5,-.5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 90 && side == "top") {
place(loc_x,loc_y,loc_z,7.5,7.5,rotation,side)
union() {
translate([4.1,2,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([4.1,2,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([.5,-.5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 180 && side == "top") {
place(loc_x,loc_y,loc_z,7.5,7.5,rotation,side)
union() {
translate([4.1,-2.5,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([4.1,-2.5,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([.5,-5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 270 && side == "top") {
place(loc_x,loc_y,loc_z,7.5,7.5,rotation,side)
union() {
translate([3.15,-2.5,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([3.15,-2.5,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([-.5,-5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 0 && side == "bottom") {
place(loc_x-1,loc_y,loc_z-1.5,7.5,7.5,rotation,side)
union() {
translate([3.15,2,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([3.15,2,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([-.5,-.5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 90 && side == "bottom") {
place(loc_x+4.1,loc_y,loc_z-1.5,7.5,7.5,rotation,side)
union() {
translate([4.1,2,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([4.1,2,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([.5,-.5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 180 && side == "bottom") {
place(loc_x-1,loc_y,loc_z-1.5,7.5,7.5,rotation,side)
union() {
translate([4.1,-2.5,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([4.1,-2.5,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([.5,-5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 270 && side == "bottom") {
place(loc_x+4.1,loc_y,loc_z-1.5,7.5,7.5,rotation,side)
union() {
translate([3,-2.5,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([3,-2.5,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([-.5,-5,0]) cube([7.5,2.5,4.5]);
}
}