57 Commits

Author SHA1 Message Date
Edward Kisiel
59b894d738 updated sbc model framework and header info. 2023-11-10 12:18:07 -05:00
Edward Kisiel
2e7cd76f20 adjusted indent and cooling options for all rpi5 cases 2023-11-04 17:02:38 -04:00
Edward Kisiel
7eab4fe790 added rpi5 cases 2023-11-04 15:52:38 -04:00
Edward Kisiel
501da93cad fixed snap case top, removed support pieces from non-shell cases for rock5b, fixed tray bottom mounting hole location for top and interference with standoff. 2023-08-26 14:39:08 -04:00
Edward Kisiel
c83301debf opir1 added, updated sbc_model_framework and sbc_case_builder and readme.md 2023-05-30 20:58:56 -04:00
Edward Kisiel
c2d7cc3352 added rock5bq cases panel, stacked, tray, tray-sides, snap and fitted, updated sbc_model_framework 2023-05-14 17:21:51 -04:00
Edward Kisiel
20ab01b924 adjustments to rock5b-v1.42 and added rock5bq-v1.42 with updated sbc model framework, adjusted all rock5b case openings in sbc_case_builder_accessories.cfg, rock5b is now green-verified 2023-05-14 15:09:00 -04:00
Edward Kisiel
0770c17468 updated sbc model framework for visionfive2q, added visionfive2q cases, adjusted tray design side screw locations due to interference 2023-03-09 17:56:35 -05:00
Edward Kisiel
3a1ba0f811 h3_ultimate2 support added at corners 2023-03-09 12:01:28 -05:00
Edward Kisiel
572293170d reverted bottom height calc and added support ribs for h3_ultimate2 case 2023-03-06 13:26:29 -05:00
Edward Kisiel
b59f99c0b6 updated sbc model framework for h2 and h3 pcb thickness increase, changed bottom_height calc to include pcb thickness. 2023-03-05 14:57:42 -05:00
Edward Kisiel
a6795b3383 updated sbc model framework for usbc_vertical changes 2023-03-04 18:11:28 -05:00
Edward Kisiel
00648a52e9 updated sbc model framework, renamed radax rockpi to rock, rock 5b io adjustments, visionfive2 io overhang adjusted, readme.md and file comments updated. 2023-03-04 17:16:01 -05:00
Edward Kisiel
f24d3e918b implemented header_26 as a gpio, added opi5 remaining base design. 2023-02-22 19:23:42 -05:00
Edward Kisiel
b4189a6cee added opi5 sbc and updated sbc_model_framework and documentation. 2023-02-22 10:21:20 -05:00
Edward Kisiel
6aa68c568e updated sbc_model_framework 2023-02-21 12:58:08 -05:00
Edward Kisiel
efed91db76 Merge pull request #29 from amazingfate/rock5b-v1.3
add mask fix for rock5b v1.3
2023-02-21 17:55:14 +00:00
amazingfate
30d709a00e add mask fix for rock5b v1.3 2023-02-21 14:53:25 +08:00
Edward Kisiel
bb5fb69cab added visionfive2 cases, split rockpi5b into rockpi5b-v1.3 and rockpi5b-v1.42 with addtions and modifications to support pre-release and released versions. 2023-02-20 13:09:38 -05:00
Edward Kisiel
f7d06bb311 added cableholder_spacer 2023-02-11 19:32:42 -05:00
Edward Kisiel
2aad1fef87 made h3_port_extender_holder parametric and updated associated cases. 2023-02-09 22:56:59 -05:00
Edward Kisiel
adf4101e3c Merge pull request #27 from Icenowy/star64
Refinements to Star64
2023-01-31 22:58:38 +00:00
Icenowy Zheng
fa1d426130 add star64-shell accessory (fan+pcie holes) and preset
Signed-off-by: Icenowy Zheng <uwu@icenowy.me>
2023-01-31 21:12:04 +08:00
Icenowy Zheng
3af7520d67 add stacked dual rj45
Used on star64.

Signed-off-by: Icenowy Zheng <uwu@icenowy.me>
2023-01-31 21:11:35 +08:00
Edward Kisiel
d5f718ca59 updated to latest sbc_model_framework 2023-01-29 10:16:45 -05:00
Edward Kisiel
236be28bdd added h3_port_extender_holder and updated h3_ultimate2 case. 2023-01-24 22:39:50 -05:00
Edward Kisiel
6ef186018f added wall support for h3_ultimate2 2023-01-22 15:37:25 -05:00
Edward Kisiel
bf7377efbb fixed access_port and access_cover 180 rotation in portrait and landscape. 2023-01-21 20:38:03 -05:00
Edward Kisiel
addb512b7f fixed 60mm fan mask crossarms 2023-01-21 17:17:41 -05:00
Edward Kisiel
6cb1ad2e5d added nut_holder module and amended h3_ultimate2 case. 2023-01-18 17:19:43 -05:00
Edward Kisiel
eb01bb2829 work on h3_ultimate case 2023-01-15 17:44:58 -05:00
Edward Kisiel
8b11dea464 fixed other standoff opening issue and set color in vent_panel_hex. 2023-01-15 16:46:07 -05:00
Edward Kisiel
489e953d09 Merge pull request #25 from tomek-szczesny/main
h3_ultimate2 development
2023-01-15 21:27:21 +00:00
Edward Kisiel
dca4858007 fixed standoff auto openings for z height, fixed standoff sidewall supports distance on top face 2023-01-15 16:12:17 -05:00
Tomek Szczęsny
4b24af0f4b h3_ultimate2 development 2023-01-15 20:41:12 +01:00
Edward Kisiel
33e9c04da1 Merge pull request #22 from Icenowy/licheerv
Add LicheeRV + Dock support
2023-01-15 17:39:28 +00:00
Icenowy Zheng
c0da9dc727 add bigger usbc hole for LicheeRV + Dock Type-C
This Type-C port is on SoM and behind the edge of the Dock.

Signed-off-by: Icenowy Zheng <uwu@icenowy.me>
2023-01-16 01:17:44 +08:00
Icenowy Zheng
36e6538090 add licheerv+dock to model selection
Signed-off-by: Icenowy Zheng <uwu@icenowy.me>
2023-01-16 01:17:44 +08:00
Edward Kisiel
8d1d9bdaf0 updated submodule sbc model framework and n2l_gpio case gpio opening. 2023-01-15 12:06:52 -05:00
Edward Kisiel
17e4e9dd97 Merge pull request #23 from tomek-szczesny/main
h3_ultimate2 development
2023-01-15 16:53:04 +00:00
Tomek Szczęsny
44a0697e2b Changes to h3_ultimate2 2023-01-15 16:31:59 +01:00
Tomek Szczęsny
a068940140 Added mounting holes to vent_panel_hex() 2023-01-15 16:30:48 +01:00
Tomek Szczęsny
e109837ae7 added vent_panel_hex(), minor fix in vent_hex() 2023-01-15 15:08:15 +01:00
Edward Kisiel
51f453be04 added db9 model and mask, n2l sidewall support changed, work on n2l_gpio and h3_ultimate2 cases, updated readme.md. 2023-01-08 19:34:48 -05:00
Edward Kisiel
c23033d819 Merge pull request #21 from tomek-szczesny/main
h3_ultimate2 development
2023-01-06 15:58:03 +00:00
Tomek Szczęsny
c29341d1d6 h3_ultimate2 changes and adjustments 2023-01-06 16:36:16 +01:00
Tomek Szczęsny
61446a322f Adjusted Port Extender hole positions 2023-01-06 16:14:12 +01:00
Edward Kisiel
949af488aa added xu4_keyhole case 2023-01-05 19:34:38 -05:00
Edward Kisiel
d565be1614 Merge pull request #20 from tomek-szczesny/main
Added vent_hex(), updated h3_ultimate2
2023-01-05 15:53:06 +00:00
Tomek Szczęsny
000724340b Added vent_hex() sub, updated h3_ultimate2 2023-01-05 16:25:04 +01:00
Edward Kisiel
79985241c0 fixed standoff sidewall support placement, added fan masks for 60mm and code cleanup, finished h3_port_extender, created h3_ultimate2 for remote mount of port_extender. 2023-01-03 22:39:45 -05:00
Edward Kisiel
d070e829f0 added hk_pwr_button model, keyhole accessory and h3_port_extender models for header and remote mount, updated h3_ultimate case. 2023-01-01 23:23:26 -05:00
Edward Kisiel
e9b5d5508e changed parametrics for n2l_gpio case 2022-12-31 19:49:54 -05:00
Edward Kisiel
c330f3fcad added n2l_gpio case 2022-12-31 19:37:16 -05:00
Edward Kisiel
610a432a86 added accessory entry n2l_gpio 2022-12-29 21:47:15 -05:00
Edward Kisiel
7806e8d578 more port extender integration 2022-12-25 20:46:36 -05:00
Edward Kisiel
6c46501c69 initial h3 port extender work 2022-12-23 16:25:03 -05:00
13 changed files with 5701 additions and 2129 deletions

View File

@@ -3,7 +3,7 @@
## 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 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.
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 61 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.
@@ -76,7 +76,7 @@ An array holds a string and 3 Boolean that represent which association and axis
### Accuracy
In the past there was been no way of validating whether a SBC Model Framework model and its components were dimensionaly accurate in their size and placement other then trial and error. Along with producing cases this project provides a much needed model validation tool to assure model accuracy thru the use of test cases. It works on the very simple premise that if the real SBC fits the test case then the virtual model is accurate or otherwise shows were corrections are needed. This will further increased the overall accuracy of models.
There are currently 47 SBC represented by 43 models, from 8 manufactures in SBC Model Framework. Some SBC in SBC Model Framework have not been validated or may be missing component data and may produce one or more aspects of a case incorrectly. SBC status is noted in sbc.png, the README.md file and at the beginning of the SBC entry defined in sbc_models.cfg, all a part of SBC Model Framework. The color coded indicator of an SBCs verification and completion as indicated in sbc.png is as follows:
There are currently 58 SBC represented by 54 models, from 10 manufactures in SBC Model Framework. Some SBC in SBC Model Framework have not been validated or may be missing component data and may produce one or more aspects of a case incorrectly. SBC status is noted in sbc.png, the README.md file and at the beginning of the SBC entry defined in sbc_models.cfg, all a part of SBC Model Framework. The color coded indicator of an SBCs verification and completion as indicated in sbc.png is as follows:
- GREEN = verified, complete and passes SBC Case Builder
- YELLOW = unverified, mostlikely usable and/or missing minor information
@@ -103,7 +103,7 @@ Template creation and i/o panel layouts in a dxf format can be easily created an
### 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 423
#### Current Case Count 446
##### Hardkernel - 182
@@ -154,6 +154,9 @@ c4_tray_vu7, c4_shell_boombox, c4_panel_boombox, c4_deskboom_lcd3.5, c4_tray_boo
**h64b** - 2 : h64b_shell, h64b_panel
**star64** - 1 : star64_shell
##### Raspberry PI - 72
**RPIzero** - 9 : rpizero_shell, rpizero_panel, rpizero_stacked, rpizero_tray, rpizero_tray_sides, rpizero_round, rpizero_hex, rpizero_snap, rpizero_fitted
@@ -178,15 +181,15 @@ c4_tray_vu7, c4_shell_boombox, c4_panel_boombox, c4_deskboom_lcd3.5, c4_tray_boo
**Jetson Nano** - 9 : jetsonnano_shell, jetsonnano_panel, jetsonnano_stacked, jetsonnano_tray, jetsonnano_tray_sides, jetsonnano_round, jetsonnano_hex, jetsonnano_snap, jetsonnano_fitted
##### Radxa - 36
##### Radxa - 37
**ROCKPi 4b+** - 9 : rockpi4b+_shell, rockpi4b+_panel, rockpi4b+_stacked, rockpi4b+_tray, rockpi4b+_tray_sides, rockpi4b+_round, rockpi4b+_hex, rockpi4b+_snap, rockpi4b+_fitted
**ROCK 4b+** - 9 : rock4b+_shell, rock4b+_panel, rock4b+_stacked, rock4b+_tray, rock4b+_tray_sides, rock4b+_round, rock4b+_hex, rock4b+_snap, rock4b+_fitted
**ROCKPi 4c** - 9 : rockpi4c_shell, rockpi4c_panel, rockpi4c_stacked, rockpi4c_tray, rockpi4c_tray_sides, rockpi4c_round, rockpi4c_hex, rockpi4c_snap, rockpi4c_fitted
**ROCK 4c** - 9 : rock4c_shell, rock4c_panel, rock4c_stacked, rock4c_tray, rock4c_tray_sides, rock4c_round, rock4c_hex, rock4c_snap, rock4c_fitted
**ROCKPi 4c+** - 9 : rockpi4c+_shell, rockpi4c+_panel, rockpi4c+_stacked, rockpi4c+_tray, rockpi4c+_tray_sides, rockpi4c+_round, rockpi4c+_hex, rockpi4c+_snap, rockpi4c+_fitted
**ROCK 4c+** - 9 : rock4c+_shell, rock4c+_panel, rock4c+_stacked, rock4c+_tray, rock4c+_tray_sides, rock4c+_round, rock4c+_hex, rock4c+_snap, rock4c+_fitted
**ROCKPi5b** - 9 : rockpi5b_shell, rockpi5b_panel, rockpi5b_stacked, rockpi5b_tray, rockpi5b_tray_sides, rockpi5b_round, rockpi5b_hex, rockpi5b_snap, rockpi5b_fitted
**ROCK 5b** - 10 : rock5b_shell,rock5b_shell-v1.3, rock5b_panel, rock5b_stacked, rock5b_tray, rock5b_tray_sides, rock5b_round, rock5b_hex, rock5b_snap, rock5b_fitted
##### Khadas - 45
@@ -213,15 +216,31 @@ 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 - 27
##### Orange PI - 34
**OPI 5** - 7 : opi5_shell, opi5_panel, opi5_stacked, opi5_tray, opi5_tray_sides, opi5_snap, opi5_fitted
**OPI Zero/ZeroPlus** - 9 : opizero_shell, opizero_panel, opizero_stacked, opizero_tray, opizero_tray_sides, opizero_round, opizero_hex, opizero_snap, opizero_fitted
**OPI Zero2** - 9 : opizero2_shell, opizero2_panel, opizero2_stacked, opizero2_tray, opizero2_tray_sides, opizero2_round, opizero2_hex, opizero2_snap, opizero2_fitted
**OPI R1** - 1 : opir1_shell
**OPI R1PlusLTS** - 9 : opir1plus_lts_shell, opir1plus_lts_panel, opir1plus_lts_stacked, opir1plus_lts_tray, opir1plus_lts_tray_sides, opir1plus_lts_round, opir1plus_lts_hex, opir1plus_lts_snap, opir1plus_lts_fitted
##### Sipeed - 1
**licheerv+dock** - 0 :
##### StarFive - 14
**visionfive2** - 7 : visionfive2_shell, visionfive2_panel, visionfive2_stacked, visionfive2_tray, visionfive2_tray_sides, visionfive2_snap, visionfive2_fitted
**visionfive2q** - 7 : visionfive2q_shell, visionfive2q_panel, visionfive2q_stacked, visionfive2q_tray, visionfive2q_tray_sides, visionfive2q_snap, visionfive2q_fitted
### Accessory Schema
The schema for case accessories is documented in the beginning of the file sbc_case_builder_accessories.cfg. There is one fixed entry that is the accessory set name followed by an unlimited number of accessory entries each containing 15 entries.
```
@@ -323,6 +342,13 @@ description: circlular geometry.
*uses:* data_1=scale, data_2=height, data_3=file
**keyhole**
*description:* enclosed keyhole
*uses:* data4=[head_dia, slot_width, slot_length, floor_thick]
#### Add class only “types”
@@ -424,6 +450,13 @@ description: circlular geometry.
*uses:* data_1=tolorence
**nut_holder**
*description:* nut holder
*uses:* size_x=top diameter or x size in mm, size_y=bottom diameter or y size in mm, size_z=holder height in mm, data_0="m2" or "m2.5" or "m3" or "m4", data_1="default" or "sloped" or "trap"
#### Sub class only “types”
@@ -438,7 +471,15 @@ description: circlular geometry.
*description:* horizontal or vertical vent openings
*uses:* size_x=open_width, size_y=open_length, size_z=thick, data_4=gap, data_1=rows, data_3=columns,
*uses:* size_x=open_width, size_y=open_length, size_z=thick, data_1=rows, data_2=columns,
data_3=orientation("vertical","horizontal"), data_4=gap
**vent_hex**(cells_x, cells_y, cell_size, cell_spacing, orientation)
*description:* horizontal or vertical hex vent openings
*uses:* size_x=cells_x, size_y=cells_y, size_z=thick, data_1=cell_size, data_2=cell_spacing,
data_3=orientation("vertical","horizontal")
@@ -593,6 +634,34 @@ data_3=orientation("vertical","horizontal")
*uses:* none
**h3_port_extender**
*description:* h3 usb port extender model
*uses:* data_3="header" or "remote"
**hk_pwr_button**
*description:* hk power button model
*uses:* none
**dsub**
*description:* d-sub connectors
*uses:* data4=[pin, type("male" or "female"), floor_thick]
**vent_panel_hex**
*description:* cover for vent opening, honeycomb pattern
*uses:* size_x=x, size_y=y, size_z=thick,
data1=cell_size, data2=cell_spacing,
data3="x", "y", "none", or "default", data4=border
#### Platter class “types”
@@ -630,3 +699,13 @@ data_3=orientation("vertical","horizontal")
*description:* hk stereo boom bonnet volume wheel extention
*uses:* data_1=tolerence
**vent_panel_hex**
*description:* cover for vent opening, honeycomb pattern
*uses:* size_x=x, size_y=y, size_z=thick,
data1=cell_size, data2=cell_spacing,
data3="x", "y", "none", or "default", data4=border

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -31,7 +31,7 @@
types for additive: circle,rectangle,slot,text,art,button,standoff,batt_holder,uart_holder,hd_holder,hd_vertleft_holder,
hd_vertright_holder,hc4_oled_holder,access_port,button,pcb_holder,boom_grill,boom_speaker_holder
types for subtractive: circle,rectangle,slot,text,art,punchout,vent,fan,hd_holes,hd_vertleft_holes,hd_vertright_holes,microusb,sphere
types for subtractive: circle,rectangle,slot,text,art,punchout,vent,vent_hex,fan,hd_holes,hd_vertleft_holes,hd_vertright_holes,microusb,sphere
types for model: uart_strap,fan_cover,hd25,hd35,hc4_oled,feet,button_top,access_cover,net_card,hk35_lcd,hk_boom,boom_speaker,boom_vring,hk_uart
types for platter: uart_strap,fan_cover,button_top,boom_vring
@@ -51,6 +51,13 @@
accessory_data = [
["none"],
// hk uart group
["hk_uart",
"add2","uart_holder",-25,0,1.9,"bottom",[0,0,0],["sbc",true,false,false],10,10,0,0,0,"",0, // add uart holder
"model","hk_uart",-22.5,23,5,"bottom",[0,0,-90],["sbc",true,false,false],10,10,0,0,0,"",0, // add uart model
"model","uart_strap",-25,0,2,"bottom",[0,0,0],["sbc",true,false,false],0,0,0,0,0,"",0,
"platter","uart_strap",-35,75,-9,"bottom",[0,0,0],["case",false,false,false],0,0,0,0,0,"",0], // hk uart strap
// Odroid-C1+
["c1+_shell_boombox",
@@ -378,6 +385,11 @@ accessory_data = [
"suball","round",10.5,-2,14.5,"top",[90,0,0],["case",false,false,false],11,0,18,0,0,"",0, // sub power plug hole
"suball","rectangle",35,-26,4,"top",[0,0,0],["case",false,false,false],21,10,15.5,0,0,"vertical",[1,1,1,1]], // sub hdmi opening
// Odroid-XU4
["xu4_keyhole",
"add1","keyhole",40,30,0,"bottom",[0,0,0],["case",false,false,false],0,0,0,0,0,"",[7,3.2,6,2], // keyhole
"sub","keyhole",40,30,0,"bottom",[0,0,0],["case",false,false,false],0,0,0,0,0,"",[7,3.2,6,2]], // keyhole
// Odroid-HC4
["hc4_tray_drivebox2.5",
@@ -459,6 +471,11 @@ accessory_data = [
["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
["n2l_gpio",
"sub","vent",22,-1.99,16,"top",[0,0,0],["sbc-case_z",true,true,true],2,9,8,1,10,"vertical",1, // vent opening
"sub","fan",20,8,24.5,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0, // sub fan opening
"sub","rectangle",8.5,49,9.9,"top",[0,0,0],["sbc",true,true,true],56,18,20,0,0,"vertical",[1,1,1,1]], // gpio opening
// Odroid-N2+
// internal fan
["n2+_tray_vu7_fan",
@@ -823,7 +840,7 @@ accessory_data = [
"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
"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
@@ -835,14 +852,14 @@ accessory_data = [
"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",
["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
"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
@@ -851,13 +868,96 @@ accessory_data = [
"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
"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
"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_ultimate",
"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,19,"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
"sub","round",3.81,17.78,29,"top",[0,0,0],["sbc-case_z",true,true,true],6.5,0,26,0,0,"",0, // sub screw hole
"sub","round",3.81,106.19,29,"top",[0,0,0],["sbc-case_z",true,true,true],6.5,0,26,0,0,"",0, // sub screw hole
"sub","round",106.04,24.77,29,"top",[0,0,0],["sbc-case_z",true,true,true],6.5,0,26,0,0,"",0, // sub screw hole
"sub","round",106.04,106.2,29,"top",[0,0,0],["sbc-case_z",true,true,true],6.5,0,26,0,0,"",0, // sub screw hole
"model","h3_port_extender",6,70,18.5,"bottom",[0,0,0],["sbc",true,true,false],0,0,0,0,0,"header",0, // h3 port extender
"sub","h3_port_extender",6,70,18.5,"top",[0,0,0],["sbc",true,true,false],0,0,0,0,0,"header",0, // h3 port extender
"model","hk_pwr_button",20,110,53,"top",[0,0,0],["sbc-case_z",true,true,true],0,0,0,0,0,0,0, // hk pwr button model
"sub","hk_pwr_button",20,110,53,"top",[0,0,0],["sbc-case_z",true,true,true],0,0,0,0,0,0,0, // hk pwr button model
// "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
// "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
"add1","access_port",10,30,-0.01,"bottom",[0,0,0],["sbc",true,true,true],100,80,2,0,0,"landscape",0, // access port
"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","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_ultimate2",
"suball","fan",0,25,3,"top",[0,270,0],["case",false,false,false],60,0,6,1,0,"",0, // sub fan opening
"model","fan_cover",-4,25,3,"top",[0,270,0],["case",false,false,false],60,0,3,2,0,"",0, // model fan cover
"platter","fan_cover",-100,150,0,"top",[0,0,0],["case",false,false,false],60,0,3,2,0,"",0, // model fan cover
"model","vent_panel_hex",144,11.77,64,"top",[0,90,0],["case",false,false,false],62,107.43,3,5.0,1.6,"y",14, // model vent cover
"platter","vent_panel_hex",-200,13.77,0,"top",[0,0,0],["case",false,false,false],62,107.43,3,5.0,1.6,"y",14, // model vent cover
"suball","rectangle",111,26.77,62,"top",[0,90,0],["case",true,false,false],58,77.43,4,0,0,"",[2,2,2,2], // vent opening
"sub","round",111,16.57,57,"top",[0,90,0],["case",true,false,false],7,0,4,0,0,"",0, // vent cover screw hole
"sub","round",111,16.57,9,"bottom",[0,90,0],["case",true,false,false],7,0,4,0,0,"",0, // vent cover screw hole
"sub","round",111,114.4,57,"top",[0,90,0],["case",true,false,false],7,0,4,0,0,"",0, // vent cover screw hole
"sub","round",111,114.4,9,"bottom",[0,90,0],["case",true,false,false],7,0,4,0,0,"",0, // vent cover screw hole
"sub","round",3.81,17.78,35,"top",[0,0,0],["sbc-case_z",true,true,true],6.5,0,19,0,0,"",0, // sub screw hole
"sub","round",3.81,106.19,35,"top",[0,0,0],["sbc-case_z",true,true,true],6.5,0,19,0,0,"",0, // sub screw hole
"sub","round",106.04,24.77,35,"top",[0,0,0],["sbc-case_z",true,true,true],6.5,0,19,0,0,"",0, // sub screw hole
"sub","round",106.04,106.2,35,"top",[0,0,0],["sbc-case_z",true,true,true],6.5,0,19,0,0,"",0, // sub screw hole
"add2","nut_holder",144,16.57,57,"top",[0,270,0],["case",false,false,false],8,16,5,"m3","sloped",0,0, // vent cover nut holder
"add2","nut_holder",144,16.57,9 ,"bottom",[0,270,0],["case",false,false,false],8,16,5,"m3","sloped",0,0, // vent cover nut holder
"add2","nut_holder",144,114.4,57,"top",[0,270,0],["case",false,false,false],8,16,5,"m3","sloped",0,0, // vent cover nut holder
"add2","nut_holder",144,114.4,9 ,"bottom",[0,270,0],["case",false,false,false],8,16,5,"m3","sloped",0,0, // vent cover nut holder
"sub","rectangle",-4,100.5,3,"top",[0,0,0],["sbc-case_z",true,true,true],14,4,20,0,0,"",[1,1,1,1], // sub rectangle
"sub","rectangle",100.5,17,30,"top",[0,0,0],["sbc-case_z",true,true,true],9,4,10,0,0,"",[1,1,1,1], // sub rectangle
"add1","round",23,111.5,4,"top",[0,0,0],["case",true,true,true],4,0,47,0,0,"",0, // wall support
"add1","round",71,111.5,4,"top",[0,0,0],["case",true,true,true],4,0,47,0,0,"",0, // wall support
"add1","round",-31.5,3,4,"top",[0,0,0],["case",true,true,true],4,0,47,0,0,"",0, // wall support
"add1","round",-31.5,77,4,"top",[0,0,0],["case",true,true,true],4,0,47,0,0,"",0, // wall support
"add1","round",-10,111.5,4,"top",[0,0,0],["case",true,true,true],4,0,47,0,0,"",0, // wall support
"add1","round",101,111.5,4,"top",[0,0,0],["case",true,true,true],4,0,47,0,0,"",0, // wall support
"add1","round",91.25,-16.5,4,"top",[0,0,0],["case",true,true,true],4,0,47,0,0,"",0, // wall support
"add1","round",66.25,-16.5,4,"top",[0,0,0],["case",true,true,true],4,0,47,0,0,"",0, // wall support
"add1","round",42.25,-16.5,4,"top",[0,0,0],["case",true,true,true],4,0,47,0,0,"",0, // wall support
"add1","round",16.25,-16.5,4,"top",[0,0,0],["case",true,true,true],4,0,47,0,0,"",0, // wall support
"add1","round",-1,-16.5,4,"top",[0,0,0],["case",true,true,true],4,0,47,0,0,"",0, // wall support
"add1","round",-29,109,4,"top",[0,0,0],["case",true,true,true],3,0,47,0,0,"",0, // wall support
"add1","round",-29,-14,4,"top",[0,0,0],["case",true,true,true],3,0,47,0,0,"",0, // wall support
"add1","round",109,109,4,"top",[0,0,0],["case",true,true,true],3,0,47,0,0,"",0, // wall support
"add1","rectangle",2,7,49,"top",[0,0,0],["case",true,true,true],4,80,3,0,0,"",[.25,.25,.25,.25], // ceiling support
"add1","rectangle",27,-16.5,49,"top",[0,0,0],["case",true,true,true],4,130,3,0,0,"",[.25,.25,.25,.25], // ceiling support
"add1","rectangle",52,-16.5,49,"top",[0,0,0],["case",true,true,true],4,130,3,0,0,"",[.25,.25,.25,.25], // ceiling support
"add1","rectangle",77,-16.5,49,"top",[0,0,0],["case",true,true,true],4,130,3,0,0,"",[.25,.25,.25,.25], // ceiling support
"add1","rectangle",104,7,49,"top",[0,0,0],["case",true,true,true],4,80,3,0,0,"",[.25,.25,.25,.25], // ceiling support
"model","h3_port_extender",31,119,4,"top",[0,0,-90],["case",true,false,true],0,0,0,0,0,"remote",0, // port extender model
"sub","h3_port_extender",31,119,4,"top",[0,0,-90],["case",true,false,true],0,0,0,0,0,"remote",0, // port extender openings
"model","h3_port_extender_holder",31,119,4,"top",[0,0,-90],["case",true,false,true],0,0,0,2.5,0,"both",0, // port extender holder
"platter","h3_port_extender_holder",-170,150,0,"top",[0,0,-90],["case",true,false,true],0,0,0,2.5,0,"remote",0, // port extender holder
"model","hk_pwr_button",11,114,53,"top",[0,0,180],["case",false,false,true],0,0,0,0,0,0,0, // hk pwr button model
"sub","hk_pwr_button",11,114,53,"top",[0,0,0],["case",false,false,true],0,0,0,0,0,0,0, // hk pwr button opening
"model","dsub",12,-1,48,"top",[0,90,0],["case",false,false,false],0,0,0,0,0,0,[9,"male",4], // db9 model
"sub","dsub",12,-1,48,"top",[0,90,0],["case",false,false,false],0,0,0,0,0,0,[9,"male",4], // db9 model
"add1","access_port",19,20,-0.01,"bottom",[0,0,0],["sbc",true,true,true], 81,100,2,0,0,"portrait",0, // access port
"model","access_cover",19,20,-0.01,"bottom",[0,0,0],["sbc",true,true,false],81,100,2,0,0,"portrait",0, // access port cover
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],81,100,2,0,0,"portrait",0], // access port cover
["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
@@ -865,7 +965,7 @@ accessory_data = [
"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
"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
@@ -874,15 +974,15 @@ accessory_data = [
"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
"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
"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
"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
@@ -984,6 +1084,10 @@ accessory_data = [
["quartz64b_stacked_poe_hat",
"sub","fan",20,0,24.5,"top",[0,0,0],["case",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["star64_shell",
"sub","fan",43,28,36,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0, // sub fan opening
"sub","rectangle",43,0,36,"top",[0,0,0],["sbc-case_z",true,true,true],40,10,6,0,0,"",[1,1,1,1]], // sub pcie opening
["show2_shell",
"model","hk_wb2",6.25,24.675,16,"top",[0,0,180],["sbc",true,true,true],0,0,0,0,0,"",0, // hk weatherboard2
"suball","round",48.75,0,6,"top",[90,0,0],["sbc",true,true,true],4,0,4,0,0,"",0, // sub button access hole
@@ -1175,107 +1279,239 @@ accessory_data = [
["rpi4b_fitted",
"sub","fan",10,10,25.5,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["rpi5_noheatsink_shell",
"sub","fan",10,10,24.5,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["rpi5_noheatsink_panel",
"sub","fan",10,10,24.5,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["rpi5_noheatsink_stacked",
"sub","fan",10,10,24.5,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["rpi5_noheatsink_tray",
"sub","fan",10,10,24.5,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["rpi5_noheatsink_tray_sides",
"sub","fan",10,10,25.5,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["rpi5_noheatsink_round",
"suball","rectangle",4.5,-26,5.5,"top",[0,0,0],["case",false,false,false],11,20,8,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"suball","rectangle",21.5,-26,4,"top",[0,0,0],["case",false,false,false],21,10,15.5,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"sub","fan",10,10,24.5,"top",[0,0,0],["case",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["rpi5_noheatsink_hex",
"suball","rectangle",4.5,-20,5.5,"top",[0,0,0],["case",false,false,false],11,20,8,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"suball","rectangle",21.5,-26,4,"top",[0,0,0],["case",false,false,false],21,20,15.5,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"sub","fan",10,10,24.5,"top",[0,0,0],["case",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["rpi5_noheatsink_snap",
"sub","fan",10,10,24.5,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["rpi5_noheatsink_fitted",
"sub","fan",10,10,25.5,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
// Radxa
["rockpi4b+_shell",
["rock4b+_shell",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4b+_panel",
["rock4b+_panel",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4b+_stacked",
["rock4b+_stacked",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4b+_tray",
["rock4b+_tray",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4b+_tray_sides",
["rock4b+_tray_sides",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4b+_round",
["rock4b+_round",
"suball","rectangle",4.5,-26,14.5,"top",[0,0,0],["sbc",true,true,true],11,20,8,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"suball","rectangle",21.5,-26,13,"top",[0,0,0],["sbc",true,true,true],21,10,15.5,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4b+_hex",
["rock4b+_hex",
"suball","rectangle",4.5,-20,14.5,"top",[0,0,0],["sbc",true,true,true],11,20,8,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"suball","rectangle",21.5,-26,13,"top",[0,0,0],["sbc",true,true,true],21,20,15.5,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4b+_snap",
["rock4b+_snap",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4b+_fitted",
["rock4b+_fitted",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c_shell",
["rock4c_shell",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c_panel",
["rock4c_panel",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c_stacked",
["rock4c_stacked",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c_tray",
["rock4c_tray",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c_tray_sides",
["rock4c_tray_sides",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c_round",
["rock4c_round",
"suball","rectangle",4.5,-26,14.5,"top",[0,0,0],["sbc",true,true,true],11,20,8,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"suball","rectangle",21.5,-26,13,"top",[0,0,0],["sbc",true,true,true],21,10,15.5,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c_hex",
["rock4c_hex",
"suball","rectangle",4.5,-20,14.5,"top",[0,0,0],["sbc",true,true,true],11,20,8,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"suball","rectangle",21.5,-26,13,"top",[0,0,0],["sbc",true,true,true],21,20,15.5,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c_snap",
["rock4c_snap",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c_fitted",
["rock4c_fitted",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c+_shell",
["rock4c+_shell",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c+_panel",
["rock4c+_panel",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c+_stacked",
["rock4c+_stacked",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c+_tray",
["rock4c+_tray",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c+_tray_sides",
["rock4c+_tray_sides",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c+_round",
["rock4c+_round",
"suball","rectangle",4.5,-26,14.5,"top",[0,0,0],["sbc",true,true,true],11,20,8,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"suball","rectangle",21.5,-26,13,"top",[0,0,0],["sbc",true,true,true],21,10,15.5,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c+_hex",
["rock4c+_hex",
"suball","rectangle",4.5,-20,14.5,"top",[0,0,0],["sbc",true,true,true],11,20,8,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"suball","rectangle",21.5,-26,13,"top",[0,0,0],["sbc",true,true,true],21,20,15.5,0,0,"vertical",[1,1,1,1], // sub hdmi opening
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c+_snap",
["rock4c+_snap",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi4c+_fitted",
["rock4c+_fitted",
"sub","fan",10,10,0,"bottom",[0,0,0],["sbc",true,true,false],40,0,6,2,0,"",0], // sub fan opening
["rockpi5b",
["rock5b",
"sub","rectangle",-1,66.5,12.99,"top",[0,0,0],["sbc",true,true,true],10,2,8,0,0,"",[.25,.25,.25,.25], // UL standoff adjustment
"sub","rectangle",92,17.5,12.99,"top",[0,0,0],["sbc",true,true,true],10,2,15,0,0,"",[.25,.25,.25,.25], // LR standoff adjustment
"sub","rectangle",93,17.5,12.99,"top",[0,0,0],["sbc",true,true,true],2,10,15,0,0,"",[.25,.25,.25,.25], // LR standoff adjustment
"sub","rectangle",78,67,-1,"bottom",[0,0,0],["sbc",true,true,false],14,18,12.5,0,0,"",[.25,.25,.25,.25], // sdcard opening
"sub","slot",15,0,21.25,"top",[90,90,0],["sbc",true,true,true],3.75,6.125,5,0,0,"",[.25,.25,.25,.25], // usb-c adjustment
"sub","rectangle",81.575,-5,13,"top",[0,0,0],["sbc",true,true,true],16.75,4,14.25,0,0,"",[.25,.25,.25,.25], // rj-45 adjustment
"sub","rectangle",64.25,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb3 adjustment
"sub","rectangle",45.5,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb2 adjustment
"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 cover
"platter","access_cover",-110,40,0,"bottom",[0,0,0],["case",false,false,false],80,75,2,0,0,"portrait",0], // platter access cover
["rock5b_shell",
"sub","rectangle",-1,66.5,12.99,"top",[0,0,0],["sbc",true,true,true],10,2,8,0,0,"",[.25,.25,.25,.25], // UL standoff adjustment
"sub","rectangle",92,17.5,12.99,"top",[0,0,0],["sbc",true,true,true],10,2,15,0,0,"",[.25,.25,.25,.25], // LR standoff adjustment
"sub","rectangle",93,17.5,12.99,"top",[0,0,0],["sbc",true,true,true],2,10,15,0,0,"",[.25,.25,.25,.25], // LR standoff adjustment
"sub","rectangle",78,67,-1,"bottom",[0,0,0],["sbc",true,true,false],14,18,12.5,0,0,"",[.25,.25,.25,.25], // sdcard opening
"add1","round",62.5,-1.5,14,"top",[0,0,0],["case",true,true,true],3,0,18,0,0,"",0, // wall support
"add1","round",80.75,-1.5,14,"top",[0,0,0],["case",true,true,true],2,0,18,0,0,"",0, // wall support
"sub","slot",15,0,21.25,"top",[90,90,0],["sbc",true,true,true],3.75,6.125,5,0,0,"",[.25,.25,.25,.25], // usb-c adjustment
"sub","rectangle",81.575,-5,13,"top",[0,0,0],["sbc",true,true,true],16.75,4,14.25,0,0,"",[.25,.25,.25,.25], // rj-45 adjustment
"sub","rectangle",64.25,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb3 adjustment
"sub","rectangle",45.5,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb2 adjustment
"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 cover
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],80,75,2,0,0,"portrait",0], // platter access cover
["rock5bq",
"sub","rectangle",-1,66.5,12.99,"top",[0,0,0],["sbc",true,true,true],10,2,8,0,0,"",[.25,.25,.25,.25], // UL standoff adjustment
"sub","rectangle",92,17.5,12.99,"top",[0,0,0],["sbc",true,true,true],10,2,15,0,0,"",[.25,.25,.25,.25], // LR standoff adjustment
"sub","rectangle",93,17.5,12.99,"top",[0,0,0],["sbc",true,true,true],2,10,15,0,0,"",[.25,.25,.25,.25], // LR standoff adjustment
"sub","rectangle",89,9.25,11,"top",[0,0,0],["case",true,true,false],10,10,15,0,0,"vertical",[1,1,1,1], // sub fitting
"sub","rectangle",14,23.5,28,"top",[0,0,0],["sbc-case_z",true,true,true],43,43,6,0,0,"horizontal",[.25,.25,.25,.25], // heatsink opening
"sub","slot",15,0,21.25,"top",[90,90,0],["sbc",true,true,true],3.75,6.125,5,0,0,"",[.25,.25,.25,.25], // usb-c adjustment
"sub","rectangle",81.575,-5,13,"top",[0,0,0],["sbc",true,true,true],16.75,4,14.25,0,0,"",[.25,.25,.25,.25], // rj-45 adjustment
"sub","rectangle",64.25,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb3 adjustment
"sub","rectangle",45.5,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb2 adjustment
"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 cover
"platter","access_cover",-110,40,0,"bottom",[0,0,0],["case",false,false,false],80,75,2,0,0,"portrait",0], // platter access cover
["rock5bq_shell",
"sub","rectangle",-1,66.5,12.99,"top",[0,0,0],["sbc",true,true,true],10,2,8,0,0,"",[.25,.25,.25,.25], // UL standoff adjustment
"sub","rectangle",92,17.5,12.99,"top",[0,0,0],["sbc",true,true,true],10,2,15,0,0,"",[.25,.25,.25,.25], // LR standoff adjustment
"sub","rectangle",93,17.5,12.99,"top",[0,0,0],["sbc",true,true,true],2,10,15,0,0,"",[.25,.25,.25,.25], // LR standoff adjustment
"sub","rectangle",89,9.25,11,"top",[0,0,0],["case",true,true,false],10,10,15,0,0,"vertical",[1,1,1,1], // sub fitting
"sub","rectangle",14,23.5,28,"top",[0,0,0],["sbc-case_z",true,true,true],43,43,6,0,0,"horizontal",[.25,.25,.25,.25], // heatsink opening
"add1","round",62.5,-1.5,14,"top",[0,0,0],["case",true,true,true],3,0,18,0,0,"",0, // wall support
"add1","round",80.75,-1.5,14,"top",[0,0,0],["case",true,true,true],2,0,18,0,0,"",0, // wall support
"sub","slot",15,0,21.25,"top",[90,90,0],["sbc",true,true,true],3.75,6.125,5,0,0,"",[.25,.25,.25,.25], // usb-c adjustment
"sub","rectangle",81.575,-5,13,"top",[0,0,0],["sbc",true,true,true],16.75,4,14.25,0,0,"",[.25,.25,.25,.25], // rj-45 adjustment
"sub","rectangle",64.25,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb3 adjustment
"sub","rectangle",45.5,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb2 adjustment
"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 cover
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],80,75,2,0,0,"portrait",0], // platter access cover
["rock5bq_tray",
"sub","rectangle",89,9.25,11,"top",[0,0,0],["case",true,true,false],10,10,15,0,0,"vertical",[1,1,1,1], // sub fitting
"sub","rectangle",14,23.5,28,"top",[0,0,0],["sbc-case_z",true,true,true],43,43,6,0,0,"horizontal",[.25,.25,.25,.25], // heatsink opening
"sub","slot",15,0,21.25,"top",[90,90,0],["sbc",true,true,true],3.75,6.125,5,0,0,"",[.25,.25,.25,.25], // usb-c adjustment
"sub","rectangle",81.575,-5,13,"top",[0,0,0],["sbc",true,true,true],16.75,4,14.25,0,0,"",[.25,.25,.25,.25], // rj-45 adjustment
"sub","rectangle",64.25,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb3 adjustment
"sub","rectangle",45.5,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb2 adjustment
"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 cover
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],80,75,2,0,0,"portrait",0], // platter access cover
["rock5bq_tray_sides",
"sub","rectangle",89,9.25,11,"top",[0,0,0],["case",true,true,false],10,10,15,0,0,"vertical",[1,1,1,1], // sub fitting
"sub","rectangle",14,23.5,30,"top",[0,0,0],["sbc-case_z",true,true,true],43,43,6,0,0,"horizontal",[.25,.25,.25,.25], // heatsink opening
"sub","slot",15,0,21.25,"top",[90,90,0],["sbc",true,true,true],3.75,6.125,5,0,0,"",[.25,.25,.25,.25], // usb-c adjustment
"sub","rectangle",81.575,-5,13,"top",[0,0,0],["sbc",true,true,true],16.75,4,14.25,0,0,"",[.25,.25,.25,.25], // rj-45 adjustment
"sub","rectangle",64.25,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb3 adjustment
"sub","rectangle",45.5,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb2 adjustment
"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 cover
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],80,75,2,0,0,"portrait",0], // platter access cover
["rock5bq_snap",
"sub","rectangle",89,9.25,11,"top",[0,0,0],["case",true,true,false],10,10,15,0,0,"vertical",[1,1,1,1], // sub fitting
"sub","rectangle",14,23.5,32,"top",[0,0,0],["sbc-case_z",true,true,true],43,43,6,0,0,"horizontal",[.25,.25,.25,.25], // heatsink opening
"sub","slot",15,0,21.25,"top",[90,90,0],["sbc",true,true,true],3.75,6.125,5,0,0,"",[.25,.25,.25,.25], // usb-c adjustment
"sub","rectangle",81.575,-5,13,"top",[0,0,0],["sbc",true,true,true],16.75,4,14.25,0,0,"",[.25,.25,.25,.25], // rj-45 adjustment
"sub","rectangle",64.25,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb3 adjustment
"sub","rectangle",45.5,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb2 adjustment
"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 cover
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],80,75,2,0,0,"portrait",0], // platter access cover
["rock5bq_fitted",
"sub","rectangle",89,9.25,11,"top",[0,0,0],["case",true,true,false],10,10,15,0,0,"vertical",[1,1,1,1], // sub fitting
"sub","rectangle",14,23.5,30,"top",[0,0,0],["sbc-case_z",true,true,true],43,43,6,0,0,"horizontal",[.25,.25,.25,.25], // heatsink opening
"sub","slot",15,0,21.25,"top",[90,90,0],["sbc",true,true,true],3.75,6.125,5,0,0,"",[.25,.25,.25,.25], // usb-c adjustment
"sub","rectangle",81.575,-5,13,"top",[0,0,0],["sbc",true,true,true],16.75,4,14.25,0,0,"",[.25,.25,.25,.25], // rj-45 adjustment
"sub","rectangle",64.25,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb3 adjustment
"sub","rectangle",45.5,-5,13,"top",[0,0,0],["sbc",true,true,true],15,4,17,0,0,"",[.25,.25,.25,.25], // usb2 adjustment
"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 cover
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],80,75,2,0,0,"portrait",0], // platter access cover
["rock5b-v1.3",
"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
"platter","access_cover",-110,30,0,"bottom",[0,0,0],["case",false,false,false],80,75,2,0,0,"portrait",0], // platter access cover
// Khadas
@@ -1583,12 +1819,109 @@ accessory_data = [
["tinkerboard-r2_fitted",
"sub","fan",10,10,25.5,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["opi5_shell",
"sub","fan",35,13,18,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["opi5_panel",
"sub","fan",35,13,18,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["opi5_stacked",
"sub","fan",35,13,18,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["opi5_tray",
"sub","fan",35,13,18,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["opi5_tray-sides",
"sub","fan",35,13,19,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["opi5_snap",
"sub","fan",35,13,21,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["opi5_fitted",
"sub","fan",35,13,19,"top",[0,0,0],["sbc-case_z",true,true,true],40,0,6,2,0,"",0], // sub fan opening
["visonfive2_shell",
"sub","rectangle",89,9.25,11,"top",[0,0,0],["case",true,true,false],10,10,15,0,0,"vertical",[1,1,1,1], // sub fitting
"add1","round",11.25,-.5,10,"top",[0,0,0],["case",true,true,true],2,0,17,0,0,"",0, // wall support
"add1","round",29.75,-.5,10,"top",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"add1","round",50,-.5,10,"top",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"add1","round",60.875,-.5,10,"top",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"add1","round",81.125,-.5,10,"top",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"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
// hk uart group
["hk_uart",
"add2","uart_holder",-25,0,1.9,"bottom",[0,0,0],["sbc",true,false,false],10,10,0,0,0,"",0, // add uart holder
"model","hk_uart",-22.5,23,5,"bottom",[0,0,-90],["sbc",true,false,false],10,10,0,0,0,"",0, // add uart model
"model","uart_strap",-25,0,2,"bottom",[0,0,0],["sbc",true,false,false],0,0,0,0,0,"",0,
"platter","uart_strap",-35,75,-9,"bottom",[0,0,0],["case",false,false,false],0,0,0,0,0,"",0] // hk uart strap
["visonfive2_panel",
"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
["visonfive2_stacked",
"sub","rectangle",89,9.25,11,"top",[0,0,0],["case",true,true,false],10,10,15,0,0,"vertical",[1,1,1,1]], // sub fitting
["visonfive2_tray",
"add1","round",11.25,-.5,9,"bottom",[0,0,0],["case",true,true,true],2,0,17,0,0,"",0, // wall support
"add1","round",29.75,-.5,9,"bottom",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"add1","round",50,-.5,9,"bottom",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"add1","round",60.875,-.5,9,"bottom",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"add1","round",81.125,-.5,9,"bottom",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"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
["visonfive2_snap",
"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
["visonfive2_fitted",
"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
["visonfive2q_shell",
"sub","rectangle",89,9.25,11,"top",[0,0,0],["case",true,true,false],10,10,15,0,0,"vertical",[1,1,1,1], // sub fitting
"add1","round",11.25,-.5,10,"top",[0,0,0],["case",true,true,true],2,0,17,0,0,"",0, // wall support
"add1","round",29.75,-.5,10,"top",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"add1","round",50,-.5,10,"top",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"add1","round",60.875,-.5,10,"top",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"add1","round",81.125,-.5,10,"top",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"sub","rectangle",27,20,25,"top",[0,0,0],["sbc-case_z",true,true,true],43,43,6,0,0,"horizontal",[.25,.25,.25,.25], // sub rectangle
"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
["visonfive2q_panel",
"sub","rectangle",27,20,25,"top",[0,0,0],["sbc-case_z",true,true,true],43,43,6,0,0,"horizontal",[.25,.25,.25,.25], // sub rectangle
"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
["visonfive2q_stacked",
"sub","rectangle",27,20,25,"top",[0,0,0],["sbc-case_z",true,true,true],43,43,6,0,0,"horizontal",[.25,.25,.25,.25], // sub rectangle
"sub","rectangle",89,9.25,11,"top",[0,0,0],["case",true,true,false],10,10,15,0,0,"vertical",[1,1,1,1]], // sub fitting
["visonfive2q_tray",
"sub","rectangle",27,20,25,"top",[0,0,0],["sbc-case_z",true,true,true],43,43,6,0,0,"horizontal",[.25,.25,.25,.25], // sub rectangle
"add1","round",11.25,-.5,9,"bottom",[0,0,0],["case",true,true,true],2,0,17,0,0,"",0, // wall support
"add1","round",29.75,-.5,9,"bottom",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"add1","round",50,-.5,9,"bottom",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"add1","round",60.875,-.5,9,"bottom",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"add1","round",81.125,-.5,9,"bottom",[0,0,0],["case",true,true,true],3,0,17,0,0,"",0, // wall support
"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
["visonfive2q_snap",
"sub","rectangle",27,20,25,"top",[0,0,0],["sbc-case_z",true,true,true],43,43,6,0,0,"horizontal",[.25,.25,.25,.25], // sub rectangle
"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
["visonfive2q_fitted",
"sub","rectangle",27,20,25,"top",[0,0,0],["sbc-case_z",true,true,true],43,43,6,0,0,"horizontal",[.25,.25,.25,.25], // sub rectangle
"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
];

View File

@@ -3,6 +3,7 @@
Contributions:
hk_vu8m(brackets),u_bracket(),screw(),m1_hdmount() Copyright 2022 Tomek Szczęsny, mctom @ www.forum.odroid.com
vent_hex(), vent_panel_hex() Copyright 2023 Tomek Szczęsny, mctom @ www.forum.odroid.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -48,6 +49,11 @@
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
20231110 version 2.0.4 added h3_port_extender(style, mask = false), hk_pwr_button(mask = false), keyhole(keysize, mask = false),
vent_hex(cells_x, cells_y, cell_size, cell_spacing, orientation) and supporting code, dsub(dsubsize, mask = false),
vent_panel_hex(x, y, thick, cell_size, cell_spacing, border, borders),
added nut_holder(nut, style, dia_x, dia_y, height), fixed access_port and access_cover 180 rotation
in portrait and landscape, added h3_port_extender_holder(part,offset), cableholder_spacer()
see https://github.com/hominoids/SBC_Case_Builder
@@ -117,7 +123,15 @@
fan_mask(size, thick, style)
mask(loc_x,loc_y,rotation,side,class,type,case_z,wallthick,gap,floorthick,pcb_z)
punchout(width,depth,gap,thick,fillet,shape)
h3_port_extender(style, mask = false)
h3_port_extender_holder(part,offset)
hk_pwr_button(mask = false)
keyhole(keysize, mask = false)
vent_hex(cells_x, cells_y, cell_size, cell_spacing, orientation)
vent_panel_hex(x, y, thick, cell_size, cell_spacing, border, borders);
dsub(dsubsize, mask = false)
nut_holder(nut, style, dia_x, dia_y, height)
cableholder_spacer()
*/
use <./lib/fillets.scad>;
@@ -257,18 +271,50 @@ module add(type,loc_x,loc_y,loc_z,face,rotation,size_x,size_y,size_z,data_1,data
if(type == "fan_cover") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) fan_cover(size_x, size_z);
}
if(type == "vent_panel_hex") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) vent_panel_hex(x=size_x, y=size_y, thick=size_z,
cell_size=data_1, cell_spacing=data_2, border=data_4, borders=data_3);
}
if(type == "feet") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) feet(size_x, size_z);
}
if(type == "access_port") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) access_port([size_x,size_y,size_z],data_3);
if(rotation[2] == 180) {
translate([loc_x+size_x,loc_y+size_y,loc_z]) rotate(rotation) access_port([size_x,size_y,size_z],data_3);
}
else {
translate([loc_x,loc_y,loc_z]) rotate(rotation) access_port([size_x,size_y,size_z],data_3);
}
}
if(type == "access_cover") {
color("grey",1) translate([loc_x,loc_y,loc_z]) rotate(rotation) access_cover([size_x,size_y,size_z],data_3);
if(rotation[2] == 180) {
color("grey",1) translate([loc_x+size_x,loc_y+size_y,loc_z]) rotate(rotation) access_cover([size_x,size_y,size_z],data_3);
}
else {
color("grey",1) translate([loc_x,loc_y,loc_z]) rotate(rotation) access_cover([size_x,size_y,size_z],data_3);
}
}
if(type == "boom_vring") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) boom_vring(data_1);
}
if(type == "h3_port_extender") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) h3_port_extender(data_3);
}
if(type == "h3_port_extender_holder") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) h3_port_extender_holder(data_3,data_1);
}
if(type == "hk_pwr_button") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_pwr_button();
}
if(type == "keyhole") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) keyhole(data_4);
}
if(type == "dsub") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) dsub(data_4);
}
if(type == "nut_holder") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) nut_holder(data_1, data_2, size_x, size_y, size_z);
}
}
@@ -314,12 +360,27 @@ module sub(type,loc_x,loc_y,loc_z,face,rotation,size_x,size_y,size_z,data_1,data
if(type == "vent") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) vent(size_x,size_y,size_z,data_4,data_1,data_2,data_3);
}
if(type == "vent_hex") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) vent_hex(size_x,size_y,size_z,data_1,data_2,data_3);
}
if(type == "microusb") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) microusb_open();
}
if(type == "sphere") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) sphere(d=size_x);
}
if(type == "keyhole") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) keyhole(data_4, true);
}
if(type == "h3_port_extender") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) h3_port_extender(data_3, true);
}
if(type == "hk_pwr_button") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_pwr_button(true);
}
if(type == "dsub") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) dsub(data_4, true);
}
}
@@ -705,6 +766,38 @@ module fan_cover(size, thick) {
}
}
/* hex vent panel */
// borders:
// y - specified size along y axis
// x - specified size along x axis
// none - both borders the size of cell_spacing, no mounting holes
// anything else ("default") - all borders of specified size
//
module vent_panel_hex(x, y, thick, cell_size=8, cell_spacing=3, border=3, borders="default") {
hole = 3.2;
xb = (borders == "y" || borders == "none") ? cell_spacing : border;
yb = (borders == "x" || borders == "none") ? cell_spacing : border;
hxb = max(yb/2, cell_spacing + hole);
hyb = max(xb/2, cell_spacing + hole);
cells_x = floor((2*(x-2*xb-cell_size)/(cell_size+cell_spacing))+1);
cells_y = floor(((sqrt(12)*(y-2*yb)-4*cell_size)/(3*(cell_size+cell_spacing)))+1);
csx = cell_size + (cells_x-1)*(cell_size+cell_spacing)/2;
csy = sqrt(4/3)*cell_size + ((cell_size+cell_spacing)*sqrt(3/4)*(cells_y-1));
difference() {
color("grey",1) slab([x,y,thick],2);
color("grey",1) translate([(x-csx)/2,(y-csy)/2,-1])
vent_hex(cells_x, cells_y, thick+3, cell_size, cell_spacing, "horizontal");
if (borders != "none") {
color("grey",1) translate([ hxb, hyb, -1]) cylinder(d=hole, h=thick+3);
color("grey",1) translate([x - hxb, hyb, -1]) cylinder(d=hole, h=thick+3);
color("grey",1) translate([ hxb, y - hyb, -1]) cylinder(d=hole, h=thick+3);
color("grey",1) translate([x - hxb, y - hyb, -1]) cylinder(d=hole, h=thick+3);
}
}
}
module hk_wb2() {
difference () {
@@ -1277,11 +1370,11 @@ module hd35() {
/* 3.5" hdd to 2.5" hdd holder */
module hdd35_25holder(length) {
module hdd35_25holder(length,width=101.6) {
wallthick = 3;
floorthick = 2;
hd35_x = length; // 145mm for 3.5" drive
hd35_y = 101.6;
hd35_y = width;
hd35_z = 12;
hd25_x = 100;
hd25_y = 69.85;
@@ -1307,7 +1400,7 @@ module hdd35_25holder(length) {
// bottom vents
for ( r=[15:40:hd35_x-40]) {
for (c=[25:4:75]) {
for (c=[hd35_y-76:4:75]) {
translate ([r,c,-adjust]) cube([35,2,wallthick+(adjust*2)]);
}
}
@@ -1323,10 +1416,10 @@ module hdd35_25holder(length) {
translate([76,wallthick-adjust,7]) rotate([-90,0,0]) cylinder(d=10,h=3);
if(length >= 120) {
translate([117.5,wallthick-adjust,7]) rotate([-90,0,0]) cylinder(d=10,h=3);
translate([117.5,hd35_y-wallthick-adjust,7]) rotate([90,0,0]) cylinder(d=10,h=3);
translate([117.5,hd35_y-wallthick+adjust,7]) rotate([90,0,0]) cylinder(d=10,h=3);
}
translate([76,hd35_y-wallthick-adjust,7]) rotate([90,0,0]) cylinder(d=10,h=3);
translate([16,hd35_y-wallthick-adjust,7]) rotate([90,0,0]) cylinder(d=10,h=3);
translate([76,hd35_y-wallthick+adjust,7]) rotate([90,0,0]) cylinder(d=10,h=3);
translate([16,hd35_y-wallthick+adjust,7]) rotate([90,0,0]) cylinder(d=10,h=3);
// bottom-side support
translate([wallthick,wallthick,floorthick-2]) rotate([45,0,0]) cube([hd35_x-(wallthick*2),3,3]);
@@ -1911,11 +2004,11 @@ module header(pins) {
adjust = .01;
$fn = 90;
size_x = 2.5;
size_y = 2.5 * pins;
size_x = 2.54;
size_y = 2.54 * pins;
union() {
color("black") translate([0,0,0]) cube([size_x, size_y, 2.5]);
for (i=[1:2.5:size_y]) {
for (i=[1:2.54:size_y]) {
color("silver") translate ([1,i,2.5]) cube([.64,.64,5]);
}
}
@@ -1968,7 +2061,7 @@ module audio_jack35() {
union() {
color("dimgray") cube([size_x,size_y,3]);
color("dimgray") cube([size_x,5.6,4]);
color("dimgray") translate([size_x/2,0,2.25]) rotate([-90,0,0]) cylinder(d=4, h=size_y);
color("dimgray") translate([size_x/2,0,2.25]) rotate([-90,0,0]) cylinder(d=6, h=size_y);
}
color("gray") translate([size_x/2,0,2.25]) rotate([-90,0,0]) cylinder(d=3, h=size_y+adjust);
}
@@ -2508,15 +2601,32 @@ module microusb_open() {
/* fan mask to create opening */
module fan_mask(size, thick, style) {
$fn=90;
$fn=90;
if(style == 1) {
translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-2);
// mount holes
translate ([size-4,size-4,-1]) cylinder(h=thick+2, d=3);
translate ([size-4,4,-1]) cylinder(h=thick+2, d=3);
translate ([4,size-4,-1]) cylinder(h=thick+2, d=3);
translate ([4,4,-1]) cylinder(h=thick+2, d=3);
if(size == 40) {
// mount holes
translate ([size-4,size-4,-1]) cylinder(h=thick+2, d=3);
translate ([size-4,4,-1]) cylinder(h=thick+2, d=3);
translate ([4,size-4,-1]) cylinder(h=thick+2, d=3);
translate ([4,4,-1]) cylinder(h=thick+2, d=3);
}
if(size == 60) {
// mount holes
translate ([size-5,size-5,-1]) cylinder(h=thick+2, d=3);
translate ([size-5,5,-1]) cylinder(h=thick+2, d=3);
translate ([5,size-5,-1]) cylinder(h=thick+2, d=3);
translate ([5,5,-1]) cylinder(h=thick+2, d=3);
}
if(size >= 80) {
// mount holes
translate ([size-3.75,size-3.75,-1]) cylinder(h=thick+2, d=3);
translate ([size-3.75,3.75,-1]) cylinder(h=thick+2, d=3);
translate ([3.75,size-3.75,-1]) cylinder(h=thick+2, d=3);
translate ([3.75,3.75,-1]) cylinder(h=thick+2, d=3);
}
}
if(style == 2 && size == 40) {
difference() {
@@ -2549,7 +2659,48 @@ module fan_mask(size, thick, style) {
}
translate([6.5,5,-2]) rotate([0,0,45]) cube([size,2,thick+4]);
translate([4.5,size-6,-2]) rotate([0,0,-45]) cube([size,2,thick+4]);
}
}
}
if(style == 2 && size == 60) {
difference() {
union () {
difference() {
translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-2);
translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-6);
}
difference() {
translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-10);
translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-14);
}
difference() {
translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-18);
translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-22);
}
difference() {
translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-26);
translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-30);
}
difference() {
translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-34);
translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-38);
}
difference() {
translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-42);
translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-46);
}
difference() {
translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-50);
translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-54);
}
// mount holes
translate ([size-5,size-5,-1]) cylinder(h=thick+2, d=3);
translate ([size-5,5,-1]) cylinder(h=thick+2, d=3);
translate ([5,size-5,-1]) cylinder(h=thick+2, d=3);
translate ([5,5,-1]) cylinder(h=thick+2, d=3);
}
translate([9.5,8,-2]) rotate([0,0,45]) cube([size,2,thick+4]);
translate([8.5,size-10,-2]) rotate([0,0,-45]) cube([size,2,thick+4]);
}
}
if(style == 2 && size >= 80) {
difference() {
@@ -2582,15 +2733,21 @@ module fan_mask(size, thick, style) {
translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-74);
translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-79);
}
if(size == 92) {
difference() {
translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-86);
translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-92);
}
}
// mount holes
translate ([size-4,size-4,-1]) cylinder(h=thick+2, d=3);
translate ([size-4,4,-1]) cylinder(h=thick+2, d=3);
translate ([4,size-4,-1]) cylinder(h=thick+2, d=3);
translate ([4,4,-1]) cylinder(h=thick+2, d=3);
translate ([size-3.75,size-3.75,-1]) cylinder(h=thick+2, d=3);
translate ([size-3.75,3.75,-1]) cylinder(h=thick+2, d=3);
translate ([3.75,size-3.75,-1]) cylinder(h=thick+2, d=3);
translate ([3.75,3.75,-1]) cylinder(h=thick+2, d=3);
}
translate([6.5,4.25,-2]) rotate([0,0,45]) cube([size*1.2,3,thick+4]);
translate([4.25,size-6.5,-2]) rotate([0,0,-45]) cube([size*1.2,3,thick+4]);
}
}
}
if(style == 3) {
inner = size == 30 ? 24 :
@@ -2669,16 +2826,16 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
}
// 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");
place(loc_x-.5,loc_y,loc_z+1.5,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");
place(loc_x-1,loc_y,loc_z+1.5,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");
place(loc_x,loc_y+1,loc_z+1.5,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");
place(loc_x+1,loc_y-.5,loc_z+1.5,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") {
@@ -2956,7 +3113,7 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
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)
place(loc_x+5,loc_y,loc_z,12,15.5,rotation,side)
cube([12,15.5,2]);
}
// rj45 opening
@@ -2976,6 +3133,22 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
place(loc_x+9,loc_y,loc_z,16,17.5,rotation,side)
cube([16.5,8,14]);
}
if(type == "rj45_reverse_single" && rotation == 0) {
place(loc_x-.25,loc_y-6,loc_z,16,17.5,rotation,side)
cube([16.5,8,14]);
}
if(type == "rj45_reverse_single" && rotation == 90) {
place(loc_x-6,loc_y,loc_z,16,17.5,rotation,side)
cube([16.5,8,14]);
}
if(type == "rj45_reverse_single" && rotation == 180) {
place(loc_x,loc_y+10,loc_z,16,17.5,rotation,side)
cube([16.5,8,14]);
}
if(type == "rj45_reverse_single" && rotation == 270) {
place(loc_x+9,loc_y,loc_z,16,17.5,rotation,side)
cube([16.5,8,14]);
}
// rj45 short opening
if(type == "rj45_single_short" && rotation == 0) {
place(loc_x,loc_y-6,loc_z,16,17.5,rotation,side)
@@ -2993,6 +3166,23 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
place(loc_x+9,loc_y,loc_z,16,17.5,rotation,side)
cube([15,8,12]);
}
// double stacked rj45 opening
if(type == "rj45_double_stacked" && rotation == 0) {
place(loc_x,loc_y-7.5,loc_z,18,17.5,rotation,side)
cube([19,12,27]);
}
if(type == "rj45_double_stacked" && rotation == 90) {
place(loc_x-7.5,loc_y,loc_z,18,17.5,rotation,side)
cube([19,12,27]);
}
if(type == "rj45_double_stacked" && rotation == 180) {
place(loc_x,loc_y+11.5,loc_z,18,17.5,rotation,side)
cube([19,12,27]);
}
if(type == "rj45_double_stacked" && rotation == 270) {
place(loc_x+10.5,loc_y,loc_z,18,17.5,rotation,side)
cube([19,12,27]);
}
// micro usb opening
if(class == "usb2" && type == "micro" && rotation == 0 && side == "top") {
place(loc_x,loc_y-3,loc_z,8,3,rotation,side) microusb_open();
@@ -3102,22 +3292,28 @@ 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 horizontal usbc opening, lifted and enlarged for Lichee RV SoM
// TODO: implement other directions
if(class == "usbc" && type == "single_horizontal_on_licheerv" && rotation == 0 && side == "top") {
place(loc_x+1.5,loc_y+2,loc_z+5.05,6,8,rotation,side)
rotate([90,0,0]) slot(6,8,10);
}
// 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);
translate([.25,0,6.25]) 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);
translate([.25,0,5.75]) 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);
translate([.25,0,5.75]) 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);
translate([.25,0,5.75]) rotate([90,90,0]) slot(3.75,5.5,8);
}
// ir opening
if(type == "ir_1" && rotation == 0) {
@@ -3240,65 +3436,73 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
}
// audio jack opening
if(type == "jack_3.5" && rotation == 0 && side == "top") {
place(loc_x,loc_y,loc_z,7.5,7.5,rotation,side)
place(loc_x,loc_y,loc_z+.25,7.5,7.5,rotation,side)
union() {
translate([3.15,2,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([3.15,2,2]) rotate([90,0,0]) cylinder(d=7, 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=6, h=8);
translate([4.1,2,2]) rotate([90,0,0]) cylinder(d=7, 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=6, h=8);
translate([4.1,-2.5,2]) rotate([90,0,0]) cylinder(d=7, 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=6, h=8);
translate([3.15,-2.5,2]) rotate([90,0,0]) cylinder(d=7, 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=6, h=8);
translate([3.15,2,2]) rotate([90,0,0]) cylinder(d=7, 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=6, h=8);
translate([4.1,2,2]) rotate([90,0,0]) cylinder(d=7, 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=6, h=8);
translate([4.1,-2.5,2]) rotate([90,0,0]) cylinder(d=6.5, 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=6, h=8);
translate([3,-2.5,2]) rotate([90,0,0]) cylinder(d=7, h=8);
translate([-.5,-5,0]) cube([7.5,2.5,4.5]);
}
}
// button opening
if(type == "momentary_6x6x4") {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
translate([3,3,4]) rotate([0,0,0]) cylinder(d=5, h=50);
translate([3,3,4]) rotate([0,0,0]) cylinder(d=5, h=10);
}
if(type == "momentary_4x2x1" && rotation == 0) {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
translate([2,1.5,1.5]) rotate([270,0,0]) cylinder(d=4, h=10);
}
if(type == "momentary_4x2x1" && rotation == 180) {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
translate([4,4,1.5]) rotate([90,0,0]) cylinder(d=4, h=10);
}
if(type == "momentary_6x6x4_90" && rotation == 0) {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
@@ -3328,6 +3532,38 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
translate([-.5,-3.75,0]) cube([7,2.5,6.5]);
}
}
if(type == "momentary_4.5x3.5x2.5_90" && side == "top" && rotation == 0) {
place(loc_x,loc_y,loc_z,4.5,3.5,rotation,side)
translate([2.25,0,1.8]) rotate([90,0,0]) cylinder(d=3.5, h=8);
}
if(type == "momentary_4.5x3.5x2.5_90" && side == "top" && rotation == 90) {
place(loc_x,loc_y,loc_z,4.5,3.5,rotation,side)
translate([2.25,0,1.8]) rotate([90,0,0]) cylinder(d=3.5, h=8);
}
if(type == "momentary_4.5x3.5x2.5_90" && side == "top" && rotation == 180) {
place(loc_x,loc_y,loc_z,4.5,3.5,rotation,side)
translate([2.25,1,1.8]) rotate([90,0,0]) cylinder(d=3.5, h=8);
}
if(type == "momentary_4.5x3.5x2.5_90" && side == "top" && rotation == 270) {
place(loc_x,loc_y,loc_z,4.5,3.5,rotation,side)
translate([2.25,1,1.8]) rotate([90,0,0]) cylinder(d=3.5, h=8);
}
if(type == "momentary_4.5x3.5x2.5_90" && side == "bottom" && rotation == 0) {
place(loc_x,loc_y,loc_z,4.5,3.5,rotation,side)
translate([2.25,0,3.25]) rotate([90,0,0]) cylinder(d=3.5, h=8);
}
if(type == "momentary_4.5x3.5x2.5_90" && side == "bottom" && rotation == 90) {
place(loc_x,loc_y,loc_z,4.5,3.5,rotation,side)
translate([2.25,1.25,3.25]) rotate([90,0,0]) cylinder(d=3.5, h=8);
}
if(type == "momentary_4.5x3.5x2.5_90" && side == "bottom" && rotation == 180) {
place(loc_x,loc_y,loc_z,4.5,3.5,rotation,side)
translate([2.25,1.25,3.25]) rotate([90,0,0]) cylinder(d=3.5, h=8);
}
if(type == "momentary_4.5x3.5x2.5_90" && side == "bottom"&& rotation == 270) {
place(loc_x,loc_y,loc_z,4.5,3.5,rotation,side)
translate([2.25,0,3.25]) rotate([90,0,0]) cylinder(d=3.5, h=8);
}
if(type == "momentary_7x3x3_90" && rotation == 0) {
place(loc_x,loc_y,loc_z,7,3,rotation,side)
translate([0,-6,0]) cube([7,8,3]);
@@ -3348,6 +3584,10 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
place(loc_x,loc_y,loc_z,7.5,7.5,rotation,side)
translate([0,4,0]) cube([7.5,8,4]);
}
if(type == "audio_micro" && rotation == 90) {
place(loc_x,loc_y,loc_z,7.5,7.5,rotation,side)
translate([0,4,0]) cube([7.5,8,4]);
}
if(type == "m1_oem" && rotation == 0) {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
union() {
@@ -3442,3 +3682,331 @@ module vent(width,length,height,gap,rows,columns,orientation) {
}
}
// Hex vent opening
module vent_hex(cells_x, cells_y, thickness, cell_size, cell_spacing, orientation) {
xs = cell_size + cell_spacing;
ys = xs * sqrt(3/4);
rot = (orientation=="vertical") ? 90 : 0;
rotate([rot,0,0]) translate([cell_size/2, cell_size*sqrt(1/3),-1]) {
for (ix = [0 : ceil(cells_x/2)-1]) {
for (iy = [0 : 2 : cells_y-1]) {
translate([ix*xs, iy*ys,0]) rotate([0,0,90])
cylinder(r=cell_size/sqrt(3), h=thickness, $fn=6);
}
}
for (ix = [0 : (cells_x/2)-1]) {
for (iy = [1 : 2 : cells_y-1]) {
translate([(ix+0.5)*xs, iy*ys,0]) rotate([0,0,90])
cylinder(r=cell_size/sqrt(3), h=thickness, $fn=6);
}
}
}
}
// hk power button
module hk_pwr_button(mask = false) {
adjust=.01;
$fn = 90;
if(mask == true) {
color("silver") translate([0, 0, -19]) cylinder(h=20, d=16);
}
else {
difference() {
union() {
// light ring
difference() {
color("blue", .6) translate([0, 0, 1.67]) cylinder(h=.1, d=14.75);
color("blue", .6) translate([0, 0, 1.66]) cylinder(h=.2, d=13.75);
}
// power symbol
color("blue", .6) translate([-.5, 0, 1.65]) color("blue", .6) cube([1,3.5,.1]);
difference() {
color("blue", .6) translate([0, 0, 1.66]) cylinder(h=.1, d=5.75);
color("blue", .6) translate([0, 0, 1.65]) cylinder(h=.2, d=4.5);
color("blue", .6) translate([-1.75, 0, 1.65]) cube([3.5,4,2]);
}
// body
color("Gainsboro") cylinder(h=1.66, d1=17.75, d2=14.75);
color("silver") translate([0, 0, -19]) cylinder(h=19, d=15.8);
difference() {
color("steelblue") translate([0, 0, -27.9]) cylinder(h=9, d=15.8);
color("steelblue") translate([-1+15.8/2, -4, -19-9.1]) cube([2,8,6.1]);
color("steelblue") translate([-1-15.8/2, -4, -19-9.1]) cube([2,8,6.1]);
}
color("white") translate([-3.5, -6, -28]) cube([7,12,2]);
// nut
difference() {
translate([0, 0, -4.75]) color("Gainsboro", .6) cylinder(h=2.75, d=21.5, $fn=6);
translate([0, 0, -4.75]) color("Gainsboro", .6) cylinder(h=2.75, d=15.8);
}
// connector pins
color("silver") translate([-1.4, -.5, -34.99]) cube([2.8, 1, 7]);
color("silver") translate([-1.4, -.5+5, -34.99]) cube([2.8, 1, 7]);
color("silver") translate([-1.4, -.5-5, -34.99]) cube([2.8, 1, 7]);
color("silver") translate([-1.4-1.75, -.5+1.75, -34.99]) cube([1, 2.8, 7]);
color("silver") translate([-1.4+3.5, -.5+1.75, -34.99]) cube([1, 2.8, 7]);
}
}
}
}
// @mctom's odroid-h3 gpio port extender
module h3_port_extender(style, mask = false) {
adjust=.01;
$fn = 90;
if(style == "header") {
if(mask == true) {
translate([-20, 6.25, 15]) cube([12, 7.5, 14.75]);
translate([-20, 15.875, 15]) cube([12, 7.5, 14.75]);
translate([-20, 25.375, 15]) cube([12, 7.5, 14.75]);
translate([-20, 17, 32.2]) rotate([0, 90, 0]) cylinder(d=3.5, h=12);
}
else {
// gpio 24 pin front position
color("silver") translate([1.6, 188.5, 84]) rotate([90, 0, 270]) import("stl/h3_port_extender.stl");
// color("dimgrey") translate([-3, 15.75, 0.25]) rotate([90, 180, 180]) import("stl/header_f_2x12_90.stl");
translate([0, 2, 8.25]) rotate([0, 180, 0]) header_f(12,8);
translate([-2.54, 2, 8.25]) rotate([0, 180, 0]) header_f(12,8);
color("dimgrey") translate([-2.5, 0, 29.5]) rotate([270, 0, 90]) import("stl/header_2x2_90.stl");
}
}
if(style == "remote") {
if(mask == true) {
translate([-19, 6.25, 15]) cube([12,7.5,14.75]);
translate([-19, 15.875, 15]) cube([12,7.5,14.75]);
translate([-19, 25.375, 15]) cube([12,7.5,14.75]);
translate([-19, 17, 32.2]) rotate([0,90,0]) cylinder(d=2.5, h=12);
translate([-19, 17, 4.6]) rotate([0,90,0]) cylinder(d=2.5, h=12);
}
else {
// gpio 24 pin front position
color("silver") translate([1.6, 188.5, 84]) rotate([90, 0, 270]) import("stl/h3_port_extender.stl");
color("dimgrey") translate([-2.5, 0, 29.5]) rotate([270, 0, 90]) import("stl/header_2x2_90.stl");
color("dimgrey")translate([9,-.5,12.75]) rotate([0,270,90]) import("stl/header_encl_2x5_90.stl");
translate([2, 2, 14.08]) rotate([0, 90, 0]) header(12);
translate([2, 2, 11.54]) rotate([0, 90, 0]) header(12);
}
}
}
/*
// h3_port_extender_holder(part, offset)
// part = "both","top","bottom"
// offset = projection from inside wall in mm
// holder for the @mctom's remote h3 port extender
*/
module h3_port_extender_holder(part,offset=2) {
adjust = .01;
size = [16-offset,40,5.5];
if(part == "bottom" || part == "both") {
difference() {
translate([-10+offset,-3.5,2]) cube(size);
translate([-.25,-.25,-adjust]) cube([2.5, 33.25, 12]);
translate([2, 2, -adjust]) cube([10, 28, 12]);
translate([-12,(33.25/2)+.25,4.5]) rotate([0,90,0]) cylinder(d=2.7, h=20, $fn=60);
// translate([-7,-1.,-adjust]) cylinder(d=4.25, h=20);
}
}
if(part == "top" || part == "both") {
difference() {
translate([-10+offset,-3.5,29.5]) cube(size);
translate([-.25,-.25,28]) cube([2.5, 33.25, 12]);
translate([1.5, 2, 27.5-adjust]) cube([10, 28.5, 12]);
translate([-12, -4, 28]) cube([20, 13, 10]);
translate([1.35, 20, 25.5]) cube([10, 13, 5]);
translate([-12,(33.25/2)+.25,32]) rotate([0,90,0]) cylinder(d=2.7, h=20, $fn=60);
}
}
}
// enclosed keyhole
module keyhole(keysize, mask = false) {
adjust=.01;
$fn = 90;
if(mask == true) {
union() {
translate([0, 0, -adjust]) cylinder(h=keysize[3]+2*adjust, d=keysize[0]);
translate([-keysize[1]/2, 0, -adjust]) cube([keysize[1], keysize[2]+keysize[0]/2, keysize[3]+2*adjust]);
translate([0, -keysize[1]/2, -adjust]) cube([keysize[2]+keysize[0]/2, keysize[1], keysize[3]+2*adjust]);
}
}
else {
difference() {
union() {
translate([0, 0, -adjust])
difference() {
difference() {
translate([-keysize[2], -keysize[2], keysize[3]]) cube([keysize[2]*3, keysize[2]*3, 4.5]);
translate([0, -10, 0]) rotate([0, 0, 135]) cube([20, 10, 10]);
translate([keysize[2], keysize[2], -adjust]) cube([keysize[2]*3, keysize[2]*3, keysize[3]+5]);
}
difference() {
translate([-keysize[2]+2, -keysize[2]+2, keysize[3]-adjust])
cube([-4+keysize[2]*3, -4+keysize[2]*3, 3.5]);
translate([2, -10, 0]) rotate([0, 0, 135]) cube([20, 10, 10]);
translate([+keysize[2]-2, keysize[2]-2, -adjust])
cube([keysize[2]*3, keysize[2]*3, keysize[3]+5]);
}
}
difference() {
translate([-keysize[2], -keysize[2], 0]) cube([keysize[2]*3, keysize[2]*3, keysize[3]]);
translate([0, -10, -adjust]) rotate([0, 0, 135]) cube([20, 10, 10]);
}
}
translate([keysize[2], keysize[2], -adjust]) cube([keysize[2]*3, keysize[2]*3, keysize[3]+2*adjust]);
union() {
translate([0, 0, -adjust]) cylinder(h=keysize[3]+2*adjust, d=keysize[0]);
translate([-keysize[1]/2, 0, -adjust]) cube([keysize[1], keysize[2]+keysize[0]/2, keysize[3]+2*adjust]);
translate([0, -keysize[1]/2, -adjust]) cube([keysize[2]+keysize[0]/2, keysize[1], keysize[3]+2*adjust]);
}
}
}
}
// d-sub connector
module dsub(dsubsize, mask = false) {
adjust=.01;
$fn = 90;
if(mask == true) {
union() {
translate([-1, 1, -.75]) rotate([90,0,0]) slab_r([19,10.5,10], [4,4,4,4]);
translate([-4, 1, 4.5]) rotate([90,0,0]) cylinder(h=10, d=3);
translate([21, 1, 4.5]) rotate([90,0,0]) cylinder(h=10, d=3);
}
}
else {
if(dsubsize[0] == 9 && dsubsize[1] == "female") {
translate([8.5,0.4,4.5]) rotate([90,0,0]) import("./stl/db9_f.stl");
}
if(dsubsize[0] == 9 && dsubsize[1] == "male") {
translate([8.5,0.4,4.5]) rotate([90,0,0]) import("./stl/db9_m.stl");
}
}
}
//
// nut_holder(nut, style, dia_x, dia_y, height)
// nut = "m2", "m2.5", "m3", "m4"
// style = "default", "sloped", "trap"
// dia_x = top diameter or x size in mm
// dia_y = bottom diameter or y size in mm
// height = holder height in mm
//
module nut_holder(nut, style, dia_x, dia_y, height) {
nuts = [[2,4,1.6], // m2 size, diameter, height
[2.5,5,2], // m2.5 size, diameter, height
[3,5.5,2.4], // m3 size, diameter, height
[4,7,3.2]]; // m4 size, diameter, height
$fn = 180;
if( style == "default") {
difference() {
cylinder(d=dia_x, h=height);
if(nut == "m2") {
translate([0, 0, -1]) cylinder(d=nuts[0][0]+.25, h=height+2);
translate([0, 0, 2]) cylinder(d=nuts[0][1]*2/sqrt(3), h=height, $fn=6);
}
if(nut == "m2.5") {
translate([0, 0, -1]) cylinder(d=nuts[1][0]+.25, h=height+2);
translate([0, 0, 2]) cylinder(d=nuts[1][1]*2/sqrt(3), h=height, $fn=6);
}
if(nut == "m3") {
translate([0, 0, -1]) cylinder(d=nuts[2][0]+.5, h=height+2);
translate([0, 0, 2]) cylinder(d=nuts[2][1]*2/sqrt(3), h=height, $fn=6);
}
if(nut == "m4") {
translate([0, 0, -1]) cylinder(d=nuts[3][0]+.5, h=height+2);
translate([0, 0, 2]) cylinder(d=nuts[3][1]*2/sqrt(3), h=height, $fn=6);
}
}
}
if( style == "sloped") {
difference() {
cylinder(d2=dia_x, d1=dia_y, h=height);
if(nut == "m2") {
translate([0, 0, -1]) cylinder(d=nuts[0][0]+.25, h=height+2);
translate([0, 0, 2]) cylinder(d=nuts[0][1]*2/sqrt(3), h=height, $fn=6);
}
if(nut == "m2.5") {
translate([0, 0, -1]) cylinder(d=nuts[1][0]+.25, h=height+2);
translate([0, 0, 2]) cylinder(d=nuts[1][1]*2/sqrt(3), h=height, $fn=6);
}
if(nut == "m3") {
translate([0, 0, -1]) cylinder(d=nuts[2][0]+.5, h=height+2);
translate([0, 0, 2]) cylinder(d=nuts[2][1]*2/sqrt(3), h=height, $fn=6);
}
if(nut == "m4") {
translate([0, 0, -1]) cylinder(d=nuts[3][0]+.5, h=height+2);
translate([0, 0, 2]) cylinder(d=nuts[3][1]*2/sqrt(3), h=height, $fn=6);
}
}
}
if( style == "trap") {
if(nut == "m2") {
difference() {
translate([-dia_x/2, -dia_y/2, 0]) cube([dia_x, dia_y, height]);
translate([0, 0, -1]) cylinder(d=nuts[0][0]+.25, h=height+2);
translate([0, 0, 2]) rotate([0,0,30]) cylinder(d=nuts[0][1]*2/sqrt(3), h=nuts[0][2], $fn=6);
translate([-nuts[0][1]/2, 0, 2]) cube([nuts[0][1], dia_x, nuts[0][2]]);
}
}
if(nut == "m2.5") {
difference() {
translate([-dia_x/2, -dia_y/2, 0]) cube([dia_x, dia_y, height]);
translate([0, 0, -1]) cylinder(d=nuts[1][0]+.325, h=height+2);
translate([0, 0, 2]) rotate([0,0,30]) cylinder(d=nuts[1][1]*2/sqrt(3), h=nuts[1][2], $fn=6);
translate([-nuts[1][1]/2, 0, 2]) cube([nuts[1][1], dia_x, nuts[1][2]]);
}
}
if(nut == "m3") {
difference() {
translate([-dia_x/2, -dia_y/2, 0]) cube([dia_x, dia_y, height]);
translate([0, 0, -1]) cylinder(d=nuts[2][0]+.5, h=height+2);
translate([0, 0, 2]) rotate([0,0,30]) cylinder(d=nuts[2][1]*2/sqrt(3), h=nuts[2][2], $fn=6);
translate([-nuts[2][1]/2, 0, 2]) cube([nuts[2][1], dia_x, nuts[2][2]]);
}
}
if(nut == "m4") {
difference() {
translate([-dia_x/2, -dia_y/2, 0]) cube([dia_x, dia_y, height]);
translate([0, 0, -1]) cylinder(d=nuts[3][0]+.5, h=height+2);
translate([0, 0, 2]) rotate([0,0,30]) cylinder(d=nuts[3][1]*2/sqrt(3), h=nuts[3][2], $fn=6);
translate([-nuts[3][1]/2, 0, 2]) cube([nuts[3][1], dia_x, nuts[3][2]]);
}
}
}
}
module cableholder_spacer() {
size = [9.4,16,6];
$fn = 90;
translate([0,size[2]/2,-5]) rotate([90,0,0])
difference() {
translate([size[0]/2,size[0]/2,0]) rotate([0,0,90]) slot(size[0],size[1],size[2]);
translate([-1,5,3]) rotate([0,90,0]) cylinder(d=3.2, h=12);
translate([-1,7.5,-1]) cube([2,20,9]);
translate([5,9.5,-1]) rotate([0,0,90]) slot(4.5,11,9);
translate([3,20,-1]) rotate([0,0,45]) cube([2,6,9]);
}
}

BIN
stl/db9_f.stl Normal file

Binary file not shown.

BIN
stl/db9_m.stl Normal file

Binary file not shown.

BIN
stl/h3_port_extender.stl Normal file

Binary file not shown.

BIN
stl/header_2x2_90.stl Normal file

Binary file not shown.

BIN
stl/header_2x5_90.stl Normal file

Binary file not shown.

BIN
stl/header_encl_2x5_90.stl Normal file

Binary file not shown.

BIN
stl/header_f_2x12_90.stl Normal file

Binary file not shown.