diff --git a/README.md b/README.md
index c0966d7..ae1d7bd 100644
--- a/README.md
+++ b/README.md
@@ -3,9 +3,9 @@
## Introduction
-This project is about autonomous SBC case creation. It utilizes the SBC Model Framework project to automatically generate cases based on the data for any of the 84 current devices 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 84 current devices 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 available (shell, panel, stacked, tray, tray-sides, round, hex, snap, fitted, folded-paper and standard motherboard adapters) and each allows for customization 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 it’s proximity to the case geometry. These cases might be useful for prototypes or other in house uses to quickly and easily create standard, specialized and custom SBC cases thru different case designs, styles and accessories.
+All case openings are created automatically based on SBC data and the dimensions of any case design can be expanded in any axis allowing for the creation of larger cases. If you reposition the SBC in a case, you will see I/O openings created or removed appropriately based on their 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, customization and accessories.
License: GPLv3.
@@ -20,8 +20,9 @@ License: GPLv3.
```
-### SBC Case Builder Features:
+## SBC Case Builder Features:
- Autonomous Multi-SBC, Multi-Case Parametric Generation
+- Autonomous SBC and Accessory Model I/O Openings
- Autonomous Case Standoffs with Variable Height
- Extended Standoff SBC collision detection
- Accessory Customization Framework
@@ -45,12 +46,16 @@ License: GPLv3.
- Snap - complete
- Fitted - complete
- Paper, Folded - complete
+- Standard MB SBC Adapters & io plates - completed
+ + ATX, Micro-ATX, DTX, Flex-ATX, Mini-DTX, Mini-ITX, Mini-STX
+- Standard MB Cases - completed
+ + ATX, Micro-ATX, DTX, Flex-ATX, Mini-DTX, Mini-ITX, Mini-STX, Nano-ITX, NUC, Pico-ITX
- Sheet Metal, Folded
- Sliding
- Cylinder
+- Free Form
- NAS
- Rack
-- Adapters(itx, matx)
- CNC Cases
All case data is stored in the json file sbc_case_builder.json with the accessory data stored in a separate file structure in sbc_case_builder_accessories.cfg. An accessory group name for a given case is stored as part of the case data in the json file. This allows for the reuse or sharing of an accessory set by different cases and can be used to manage groups of accessories.
@@ -76,18 +81,16 @@ Multi-associative parametric positioning of accessories is implemented and allow
An array holds a string and 3 Boolean that represent which association and axis are enabled for parametric movement. In the accessory example above, the 8th parameter `["sbc-case_z",true,true,true]` means all axises are enabled for multi-associative movement with the X and Y accessory axis following the SBC X and Y axis and the accessory Z axis following the case Z axis. The other currently supported associations are “sbc” and “case”. If other associations of objects are needed or are of value, they can be added in the future. All of the existing cases have been made parametric and can serve as further working examples.
-### Notes
+## Notes
Due to the number of possibilities, no pre-compiled case stl’s are included.
“tol”, located at the bottom of the Adjustments Tab, is a tolerance fitment adjustment for the snap, fitted, round and hex tops. Adjust accordingly if the tops are too tight or loose.
-### Case Designs and Styles
+## 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.
-
-
-### Accessory Schema
+## 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 11 entries.
```
schema:
@@ -123,11 +126,11 @@ Every type, regardless of it’s class, uses a basic set of variables
but each type doesn’t necessarily use all available data fields
`(size[],data[])`
-The parametric array specifies the axis to enable for associated parametric positoning. An accessory can be associated with the sbc position("sbc"), case offset("case"),multi-associated which use sbc xy postion and case z offset(sbc-case_z) or uses absolute values if all axises are false.
+The parametric array specifies the axis to enable for associated parametric positoning. An accessory can be associated with the sbc position("sbc"), case offset("case"),multi-associated which use sbc xy postion and case z offset(sbc-case_z) or use absolute values if all axises are false.
-#### classes: add1, sub, suball, add2, model, platter
+### classes: add1, sub, suball, add2, model, platter
-Class “add1” and “add2” are used to add geometry to the case. The difference is when the addition occurs. “add1” happens at the beginning when the core case geometry is created and add2 happens after all subtractions have occurred. “suball” is used to affect all faces of a case, not just “face”. The “face” is the case piece that will be effected by the addition or subtraction. The "model" class is for placing supporting accessories in the model view. e.g. hard drives, fans. The "platter" class is for adding supporting accessories to the print platter.
+Class “add1” and “add2” are used to add geometry to the case. The difference is when the addition occurs. “add1” happens at the beginning when the core case geometry is created before any subtractions and add2 happens at the end after all subtractions have occurred. “suball” is used to affect all faces of a case, not just a single face. The “face” is the case piece that will be effected by the addition or subtraction. The "model" class is for placing supporting accessories in the model view. e.g. hard drives, fans. The "platter" class is for adding supporting accessories to the print platter.
**additive type:**
@@ -147,415 +150,1887 @@ uart_strap, fan_cover, hd25, hd35, hc4_oled, feet, access_cover, net_card, hk35_
**platter type:**
-uart_strap, fan_cover, access_cover, button_top, boom_vring
+uart_strap, fan_cover, access_cover, button_assembly, boom_vring
-#### Shared add and sub “type” commands
+## Accessory Reference Manual
-**circle**
-```
-DESCRIPTION: circlular geometry.
-
-USES: size_x=dia, size_z=height
-```
-
-**rectangle**
-```
-DESCRIPTION: rectangular geometry with individual defined corner fillets. Radius1 is lower left corner then moves clockwise.
-
-USES: size_x, size_y, size_z, data_4=[radius1, radius2, radius3, radius4]
-```
-
-**slot**
-```
-DESCRIPTION: slot geometry.
-
-USES: size_x=diameter, size_y=length, size_z=height
-```
-
-**text**
-```
-DESCRIPTION: raised or sunk text
-
-USES: data_1=size, data_3="text"
-```
-
-**art**
-```
-DESCRIPTION: art work in dxf or svg format
-
-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”
-
-
-**uart_holder**
-```
-DESCRIPTION: console uart holder
-
-USES: none
-```
-
-**batt_holder**
-```
-DESCRIPTION: rtc battery holder
-
-USES: none
-```
-
-**standoff**
-```
-DESCRIPTION: user defined standoff
-
-USES: data_4=
-
- [ 6.75, // radius
- 5, // height
- 3.6, // holesize
- 10, // supportsize
- 4, // supportheight
- 1, // 0=none, 1=countersink, 2=recessed hole, 3=nut holder, 4=blind hole
- 0, // standoff style 0=hex, 1=cylinder
- 0, // enable reverse standoff
- 0, // enable insert at top of standoff
- 4.5, // insert hole dia. mm
- 5.1] // insert depth mm
-```
-
-**hd_holder**
-```
-DESCRIPTION: double stacked holder for 2.5 and 3.5 drives
-
-USES: data_1=2.5 or 3.5, data_3=”portrait” or “landscape”
-```
-
-**hd_vertleft_holder**
-```
-DESCRIPTION: vertical left side holder for 2.5 and 3.5 drives
-
-USES: data_1=2.5 or 3.5, data_3=”portrait” or “landscape”
-```
-
-**hd_vertright_holder**
-```
-DESCRIPTION: vertical right side holder for 2.5 and 3.5 drives
-
-USES: data_1=2.5 or 3.5, data_3=”portrait” or “landscape”
-```
-
-**hc4_oled_holder**
-```
-DESCRIPTION: hc4 oled holder
+### Add1 and Add2 class “types”
-USES: size_z=floorthick
-```
-
-**access_panel**
-```
-DESCRIPTION: bottom access for sd and emmc
-
-USES: size_z=floorthick, data_3=”portrait” or “landscape”
-```
-
-**button**
-```
-DESCRIPTION: button top and plunger
-USES: size_x=diameter,size_z=height, data_0=”reccess”, data_1=radius, data_2=post height
-```
+### access_cover
-**pcb_holder**
-```
-DESCRIPTION: pcb bottom edge holder
+```
+ CLASSES: add1, add2, platter
+DESCRIPTION: creates bottom access cover for access panels.
+ MASK: no
+ USAGE: "class", "access_cover", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
-USES: size_x=pcb_x,size_y=pcb_y,size_z=pcb_z, data_1=wall_thick
+ class = "add1", "add2", "platter"
+ type = "access_cover"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = x dimension
+ size[1] = y dimension
+ size[2] = floor thickness
+ data[0] = "portrait", "landscape"
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
```
-**boom_grill**
-```
-DESCRIPTION: hk boom bonnet grill covers
-USES: data_3="flat", "dome", "frame"
-```
+### access_panel
+
+```
+ CLASSES: add2
+DESCRIPTION: creates bottom access panels.
+ MASK: yes
+ USAGE: "class", "access_panel", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add2"
+ type = "access_panel"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = x dimension
+ size[1] = y dimension
+ size[2] = floor thickness
+ data[0] = "portrait", "landscape"
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### art
+
+```
+ CLASSES: add1, add2, sub, suball
+DESCRIPTION: creates or subtracts art work geometry in dxf or svg format.
+ MASK: no
+ USAGE: "class", "art", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
-**boom_speaker_holder**
-```
-DESCRIPTION: hk boom bonnet speaker friction holder
-
-USES: data_1="friction","clamp", data_2=tolorence
-```
+ class = "add1", "add2", "sub", "suball"
+ type = "art"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = scale
+ data[1] = height
+ data[2] = "file"
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### battery_holder
+
+```
+ CLASSES: add1, add2
+DESCRIPTION: creates battery holder for coin cr2032 batteries.
+ MASK: no
+ USAGE: "class", "battery_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2"
+ type = "battery_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = tolerance adjustment
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### button
+
+```
+ CLASSES: add2
+DESCRIPTION: adds various button styles.
+ MASK: yes
+ USAGE: "add2", "button", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add2"
+ type = "button"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = diameter of button body for recess style
+ size[1] = not used
+ size[2] = height above button for recess style
+ data[0] = "recess", "cutout"
+ data[1] = radius for cutout style
+ data[2] = button post size for cutout style
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### button_assembly
+
+```
+ CLASSES: add2, platter
+DESCRIPTION: adds button assembly for recess button style.
+ MASK: yes
+ USAGE: "add2", "button_assembly", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add2"
+ type = "button_assembly"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = diameter of button body for recess style
+ size[1] = not used
+ size[2] = height above button for recess style
+ data[0] = "recess"
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### fan_cover
+
+```
+ CLASSES: add1, add2, platter
+DESCRIPTION: creates fan cover for fan openings.
+ MASK: no
+ USAGE: "class", "fan_cover", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "platter"
+ type = "fan_cover"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = fan size
+ size[1] = not used
+ size[2] = cover thickness
+ data[0] = "fan_open", "fan_1", "fan_2", "fan_hex"
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### feet
+
+```
+ CLASSES: add1, add2, platter
+DESCRIPTION: creates case feet.
+ MASK: no
+ USAGE: "class", "feet", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "platter"
+ type = "feet"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = feet diameter
+ size[1] = not used
+ size[2] = feet height
+ data[] = not used
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hd_holder
+
+```
+ CLASSES: add1, add2
+DESCRIPTION: creates a horizontal double stacked holder for 2.5 and 3.5 drives.
+ MASK: no
+ USAGE: "class", "hd_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2"
+ type = "hd_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = 2.5 or 3.5
+ data[1] = ”portrait”, “landscape”
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hd_vertleft_holder
+
+```
+ CLASSES: add1, add2
+DESCRIPTION: creates a vertical left facing holder for 2.5 and 3.5 drives.
+ MASK: no
+ USAGE: "class", "hd_vertleft_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2"
+ type = "hd_vertleft_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = 2.5 or 3.5
+ data[1] = ”portrait”, “landscape”
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hd_vertright_holder
+
+```
+ CLASSES: add1, add2
+DESCRIPTION: creates a vertical right facing holder for 2.5 and 3.5 drives.
+ MASK: no
+ USAGE: "class", "hd_vertright_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2"
+ type = "hd_vertright_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = 2.5 or 3.5
+ data[1] = ”portrait”, “landscape”
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_boom_grill
+
+```
+ CLASSES: add2
+DESCRIPTION: creates hk boom bonnet grill covers.
+ MASK: yes
+ USAGE: "class", "hk_boom_grill", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add2"
+ type = "hk_boom_grill"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = not used
+ size[1] = not used
+ size[2] = wall thickness
+ data[0] = "flat", "dome", "frame"
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_boom_speaker_holder
+
+```
+ CLASSES: add2, platter
+DESCRIPTION: creates hk boom bonnet speaker clamp and friction style holder.
+ MASK: no
+ USAGE: "class", "hk_boom_speaker_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add2"
+ type = "hk_boom_speaker_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = "friction", "clamp"
+ data[1] = tolerance adjustment
+ mask[0] = false
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_boom_vring
+
+```
+ CLASSES: add1, add2, platter
+DESCRIPTION: creates hk stereo boom bonnet volume wheel extention.
+ MASK: no
+ USAGE: "class", "hk_boom_vring", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "platter"
+ type = "hk_boom_vring"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = tolerance adjustment
+ mask[0] = false
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_h3_port_extender_holder
+
+```
+ CLASSES: add1, add2, platter
+DESCRIPTION: creates odroid-h3 port extender holder parts.
+ MASK: no
+ USAGE: "class", "hk_h3_port_extender_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "platter"
+ type = "hk_h3_port_extender_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = distance from mount face
+ data[1] = "top", "bottom", "both"
+ mask[0] = false
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_hc4_oled_holder
+
+```
+ CLASSES: add2
+DESCRIPTION: creates a holder for the hk odroid-hc4 oled display.
+ MASK: yes
+ USAGE: "class", "hk_hc4_oled_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add2"
+ type = "hk_hc4_oled_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = not used
+ size[1] = not used
+ size[2] = floor thickness
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_uart_holder
+
+```
+ CLASSES: add2
+DESCRIPTION: creates a holder for the hk micro-usb uart.
+ MASK: yes
+ USAGE: "class", "hk_uart_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add2"
+ type = "hk_uart_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_uart_strap
+
+```
+ CLASSES: add2, platter
+DESCRIPTION: creates a strap for the hk micro-usb uart holder.
+ MASK: no
+ USAGE: "class", "hk_uart_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add2"
+ type = "hk_uart_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = false
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### keyhole
+
+```
+ CLASSES: add1, add2
+DESCRIPTION: creates enclosed keyhole.
+ MASK: yes
+ USAGE: "class", "keyhole", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2"
+ type = "keyhole"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = [head_dia, slot_width, slot_length, floor_thick]
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### nut_holder
+
+```
+ CLASSES: add1, add2
+DESCRIPTION: creates nut holder of various styles.
+ MASK: no
+ USAGE: "class", "nut_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2"
+ type = "nut_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = top diameter or x size in mm
+ size[1] = bottom diameter or y size in mm
+ size[2] = holder height in mm
+ data[0] = "m2", "m2.5", "m3", "m4"
+ data[1] = "default", "sloped", "trap"
+ mask[0] = false
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### pcb_holder
+
+```
+ CLASSES: add1, add2
+DESCRIPTION: creates pcb holder for vertical mounting.
+ MASK: no
+ USAGE: "class", "pcb_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2"
+ type = "pcb_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = pcb x size in mm
+ size[1] = pcb y size in mm
+ size[2] = pcb z size in mm
+ data[0] = holder wall thickness
+ mask[0] = false
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### rectangle
+
+```
+ CLASSES: add1, add2, sub, suball
+DESCRIPTION: creates or subtracts rectangular geometry with individual defined corner fillets.
+ Radius1 is lower left corner then moves clockwise.
+ MASK: no
+ USAGE: "class", "rectangle", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "sub", "suball"
+ type = "rectangle"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = width
+ size[1] = depth
+ size[2] = height
+ data[0] = [radius1, radius2, radius3, radius4]
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### round
+
+```
+ CLASSES: add1, add2, sub, suball
+DESCRIPTION: creates or subtracts circular geometry.
+ MASK: no
+ USAGE: "class", "round", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "sub", "suball"
+ type = "round"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = diameter
+ size[1] = not used
+ size[2] = height
+ data[] = not used
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### slot
+
+```
+ CLASSES: add1, add2, sub, suball
+DESCRIPTION: creates or subtracts slot geometry.
+ MASK: no
+ USAGE: "class", "slot", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "sub", "suball"
+ type = "slot"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = diameter
+ size[1] = length
+ size[2] = height
+ data[] = not used
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### sphere
+
+```
+ CLASSES: add1, add2, sub, suball
+DESCRIPTION: creates or subtracts sphere geometry.
+ MASK: no
+ USAGE: "class", "sphere", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "sub", "suball"
+ type = "sphere"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = diameter
+ size[1] = not used
+ size[2] = not used
+ data[] = not used
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### standoff
+
+```
+ CLASSES: add2
+DESCRIPTION: creates standoffs.
+ MASK: yes
+ USAGE: "add2", "standoff", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add2"
+ type = "standoff"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = [radius,height,holesize,supportsize,supportheight,sink,pillarstyle,pillarsupport,reverse,insert_e,i_dia,i_depth]
+
+ radius = pillar radius
+ height = total height
+ holesize = hole diameter
+ supportsize = support size for sink
+ supportheight = height of support for sink
+ sink = "none", "countersunk", "recessed", "nut holder", "blind"
+ pillarstyle = "hex", "round"
+ pillarsupport = "none", "left", "rear", "front", "right"
+ reverse = true or false
+ insert_e = true or false
+ i_dia = insert diameter
+ i_depth = insert hole depth
+
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### text
+
+```
+ CLASSES: add1, add2, sub, suball
+DESCRIPTION: creates or subtracts raised or sunk text geometry.
+ MASK: no
+ USAGE: "class", "text", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "sub", "suball"
+ type = "text"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = text size
+ data[1] = "text"
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### vent_panel_hex
+
+```
+ CLASSES: add1, add2, platter
+DESCRIPTION: creates hex pattern covers for vent openings.
+ MASK: no
+ USAGE: "class", "vent_panel_hex", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2"
+ type = "vent_panel_hex"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = #rows
+ size[1] = #columns
+ size[2] = thickness
+ data[0] = size of hex
+ data[1] = space between hex
+ data[2] = size of borber
+ data[3] = type of border "none", "default"
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+## Sub and Suball class “types”
+
+
+### art
+
+```
+ CLASSES: add1, add2, sub, suball
+DESCRIPTION: creates or subtracts art work geometry in dxf or svg format.
+ MASK: no
+ USAGE: "class", "art", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "sub", "suball"
+ type = "art"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = scale
+ data[1] = height
+ data[2] = "file"
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### fan_mask
+
+```
+ CLASSES: sub, suball
+DESCRIPTION: creates fan openings in various styles and sizes.
+ MASK: no
+ USAGE: "class", "fan_mask", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "sub", "suball"
+ type = "fan_mask"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = fan size of opening
+ size[1] = not used
+ size[2] = thickness
+ data[0] = "fan_open", "fan_1", "fan_2", "fan_hex"
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hd_holes
+
+```
+ CLASSES: sub, suball
+DESCRIPTION: creates hard drive holes for 2.5 and 3.5 drives in various orientations.
+ MASK: no
+ USAGE: "class", "hd_holes", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "sub", "suball"
+ type = "hd_holes"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = 2.5 or 3.5
+ data[1] = "portrait", "landscape"
+ data[2] = "vertical", "horizontal"
+ data[3] = "left", "right", "none"
+ data[4] = floor thickness
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### knockout
+
+```
+ CLASSES: sub, suball
+DESCRIPTION: creates knockouts in rectangle, round or slot shape.
+ MASK: no
+ USAGE: "class", "knockout", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "sub", "suball"
+ type = "knockout"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = length
+ size[1] = height
+ size[2] = thickness
+ data[0] = gap
+ data[1] = fillet size
+ data[2] = "slot", "rectangle", "round"
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### rectangle
+
+```
+ CLASSES: add1, add2, sub, suball
+DESCRIPTION: creates or subtracts rectangular geometry with individual defined corner fillets.
+ Radius1 is lower left corner then moves clockwise.
+ MASK: no
+ USAGE: "class", "rectangle", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "sub", "suball"
+ type = "rectangle"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = width
+ size[1] = depth
+ size[2] = height
+ data[0] = [radius1, radius2, radius3, radius4]
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### round
+
+```
+ CLASSES: add1, add2, sub, suball
+DESCRIPTION: creates or subtracts circular geometry.
+ MASK: no
+ USAGE: "class", "round", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "sub", "suball"
+ type = "round"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = diameter
+ size[1] = not used
+ size[2] = height
+ data[] = not used
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### slot
+
+```
+ CLASSES: add1, add2, sub, suball
+DESCRIPTION: creates or subtracts slot geometry.
+ MASK: no
+ USAGE: "class", "slot", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "sub", "suball"
+ type = "slot"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = diameter
+ size[1] = length
+ size[2] = height
+ data[] = not used
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### sphere
+
+```
+ CLASSES: add1, add2, sub, suball
+DESCRIPTION: creates or subtracts sphere geometry.
+ MASK: no
+ USAGE: "class", "sphere", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "sub", "suball"
+ type = "sphere"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = diameter
+ size[1] = not used
+ size[2] = not used
+ data[] = not used
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### text
+
+```
+ CLASSES: add1, add2, sub, suball
+DESCRIPTION: creates or subtracts raised or sunk text geometry.
+ MASK: no
+ USAGE: "class", "text", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "sub", "suball"
+ type = "text"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = text size
+ data[1] = "text"
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### vent
+
+```
+ CLASSES: sub, suball
+DESCRIPTION: creates horizontal or vertical vent openings.
+ MASK: no
+ USAGE: "class", "vent", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "sub", "suball"
+ type = "vent"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = coloumn size_x
+ size[1] = column size_y
+ size[2] = height
+ data[0] = #row
+ data[1] = #columns
+ data[2] = "horizontal", "vertical"
+ data[3] = gap size
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### vent_hex
+
+```
+ CLASSES: sub, suball
+DESCRIPTION: creates horizontal or vertical hex vent openings.
+ MASK: no
+ USAGE: "class", "vent_hex", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "sub", "suball"
+ type = "vent_hex"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = #rows
+ size[1] = #columns
+ size[2] = thickness
+ data[0] = size of hex
+ data[1] = space between hex
+ data[2] = "horizontal", "vertical"
+ data[3] = gap size
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+## Model class “types”
+
+
+### adafruit_lcd
+
+```
+ CLASSES: model
+DESCRIPTION: creates bottom access cover for access panels.
+ MASK: yes
+ USAGE: "model", "adafruit_lcd", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "adafruit_lcd"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### dsub
+
+```
+ CLASSES: model
+DESCRIPTION: creates db connectors.
+ MASK: yes
+ USAGE: "model", "dsub", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "dsub"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = "db9"
+ data[1] = "female"
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### fan
+
+```
+ CLASSES: model
+DESCRIPTION: creates db connectors.
+ MASK: yes
+ USAGE: "model", "fan", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
-**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”
-
-
-**punchout**
-```
-DESCRIPTION: punchout in rectangle, round or slot shape
-
-USES: size_x=width, size_y=depth, data_1=gap, size_z=thick, data_2=fillet, data_3="rectangle","round" or "slot"
-```
-
-**vent**
-```
-DESCRIPTION: horizontal or vertical vent openings
-
-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")
-```
-
-**fan**
-```
-DESCRIPTION: fan opening
-
-USES: size_x=size, size_z=thick, date_1=style(0=open, 1=fan_1, 2=fan_2, 3=fan_hex)
-```
-
-**hd_holes**
-```
-DESCRIPTION: bottom hole pattern for 2.5 or 3.5 drives
-
-USES: data_1=2.5 or 3.5, data_2=thick, data_3=”portrait” or “landscape”
-```
-
-**hd_vertleft_holes**
-```
-DESCRIPTION: bottom hole pattern for 2.5 or 3.5 drives
-
-USES: data_1=2.5 or 3.5, data_2=thick, data_3=”portrait” or “landscape”
-```
-
-**hd_vertright_holes**
-```
-DESCRIPTION: bottom hole pattern for 2.5 or 3.5 drives
-
-USES: data_1=2.5 or 3.5, data_2=thick, data_3=”portrait” or “landscape”-component mask(incomplete)
-```
-
-**microusb**
-```
-DESCRIPTION: micro usb opening
-
-USES: none
-```
-
-**sphere**
-```
-DESCRIPTION: sphere subtraction
+ class = "model"
+ type = "fan"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = "box30x10","box40x10","box50x10","box60x10","box80x10","box80x25","box92x10","box92x25","box120x25","box140x25"
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hd25
+
+```
+ CLASSES: model
+DESCRIPTION: creates a 2.5 hard drive model.
+ MASK: yes
+ USAGE: "model", "hd25", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hd25"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = height
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hd35
+
+```
+ CLASSES: model
+DESCRIPTION: creates a 3.5 hard drive model.
+ MASK: yes
+ USAGE: "model", "hd35", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hd35"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_h3_port_extender
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk port extender model.
+ MASK: yes
+ USAGE: "model", "hk_h3_port_extender", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_h3_port_extender"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = "header", "remote"
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_boom
+
+```
+ CLASSES: model
+DESCRIPTION: creates hardkernel boom bonnet model.
+ MASK: yes
+ USAGE: "model", "hk_boom", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_boom"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = true, false speakers
+ data[1] = "front", "rear" facing
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_boom_speaker
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk stereo boom bonnet speaker model.
+ MASK: yes
+ USAGE: "model", "hk_boom_speaker", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_boom_speaker"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_boom_speaker_pcb
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk stereo boom bonnet speaker pcb mounted model.
+ MASK: yes
+ USAGE: "model", "hk_boom_speaker_pcb", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_boom_speaker_pcb"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = true, false pcb
+ data[1] = "left", "right"
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_hc4_oled
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk odroid-hc4 oled model.
+ MASK: yes
+ USAGE: "model", "hk_hc4_oled", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_hc4_oled"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_lcd35
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk 3.5" lcd model.
+ MASK: yes
+ USAGE: "model", "hk_lcd35", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_lcd35"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_m1s_ups
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk odroid-m1s ups model.
+ MASK: yes
+ USAGE: "model", "hk_m1s_ups", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_m1s_ups"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_netcard
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk 4 port 2.5gb netcard model.
+ MASK: yes
+ USAGE: "model", "hk_netcard", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_netcard"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_pwr_button
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk backlite power button model.
+ MASK: yes
+ USAGE: "model", "hk_pwr_button", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_pwr_button"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_speaker
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk speaker model.
+ MASK: yes
+ USAGE: "model", "hk_speaker", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_speaker"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_uart
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk micro-usb uart model.
+ MASK: yes
+ USAGE: "model", "hk_uart", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_uart"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+
+### hk_vu7c
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk vu7c model with optional gpio extension and tabs.
+ MASK: yes
+ USAGE: "model", "hk_vu7c", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_vu7c"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = true, false gpio_ext
+ data[1] = true, false tabs
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_vu8m
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk vu8m model with optional brackets.
+ MASK: yes
+ USAGE: "model", "hk_vu8m", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_vu8m"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = true, false brackets
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_vu8s
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk vu8s model.
+ MASK: yes
+ USAGE: "model", "hk_vu8s", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
-USES: size_x=diameter
+ class = "model"
+ type = "hk_vu8s"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_wb2
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk weather board 2 model.
+ MASK: no
+ USAGE: "model", "hk_wb2", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_wb2"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = false
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_xu4_shifter_shield
+
+```
+ CLASSES: model
+DESCRIPTION: creates hk odroid-xu5 level shifter shield model.
+ MASK: yes
+ USAGE: "model", "hk_xu4_shifter_shield", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "model"
+ type = "hk_xu4_shifter_shield"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
```
-
-
-#### Model class “types”
-
-
-**uart_strap**
-```
-DESCRIPTION: console uart holder strap
-
-USES: none
-```
-
-**fan_cover**
-```
-DESCRIPTION: cover for fan hole opening
-
-USES: size_x=fan size, size_z=thick, data_1=style (0=open, 1=fan_1, 2=fan_2, 3=fan_hex)
-```
-
-**hd25**
-```
-DESCRIPTION: 2.5 hard drive
-
-USES: data_1=height
-```
-
-**hd35**
-```
-DESCRIPTION: 3.5 hard drive
-
-USES: none
-```
-
-**hc4_oled**
-```
-DESCRIPTION: hc4_oled model
-
-USES: none
-```
-
-**feet**
-```
-DESCRIPTION: case feet
-
-USES: size_x=diameter, size_z=height
-```
-
-**access_cover**
-```
-DESCRIPTION: bottom access cover for sd and emmc
-
-USES: size_z=floorthick, data_3=”portrait” or “landscape”
-```
-
-**button_top**
-```
-DESCRIPTION: button top and plunger
-
-USES: size_x=diameter,size_z=height, data_3=”reccess”
-```
-
-**h2_netcard**
-```
-DESCRIPTION: h2 network card model
-
-USES: none
-```
-
-**hk_lcd35**
-```
-DESCRIPTION: hk 3.5 inch lcd model
-
-USES: none
-```
-
-**hk_boom**
-```
-DESCRIPTION: hk stereo boom bonnet model
-
-USES: data_1=speakers(true or false), data_3=”front” or "rear"
-```
-
-**boom_speaker**
-```
-DESCRIPTION: hk stereo boom bonnet speaker
-
-USES: data_1=pcb(true or false), data_3=”left” or "right"
-```
-
-**hk_speaker**
-```
-DESCRIPTION: hk speaker model
-
-USES: none
-```
-
-**boom_vring**
-```
-DESCRIPTION: hk stereo boom bonnet volume wheel extention
-
-USES: data_1=tolerence
-```
-
-**hk_uart**
-```
-DESCRIPTION: hk console uart model
-
-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”
-
-
-**uart_strap**
-```
-DESCRIPTION: console uart holder strap
-
-USES: none
-```
-
-**fan_cover**
-```
-DESCRIPTION: cover for fan hole opening
-
-USES: size_x=40 or 80, size_z=thick
-```
-
-**access_cover**
-```
-DESCRIPTION:bottom access cover for sd and emmc
-
-USES: size_z=floorthick, data_3=”portrait” or “landscape”
-```
-
-**button_top**
-```
-DESCRIPTION: button top and plunger
-
-USES: size_x=diameter,size_z=height, data_3=”reccess”
-```
-
-**boom_vring**
-```
-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
-```
-
-### Accuracy
+
+
+### stl_model
+
+```
+ CLASSES: add1, add2
+DESCRIPTION: adds stl models.
+ MASK: no
+ USAGE: "class", "stl_model", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2"
+ type = "stl_model"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = scale
+ data[1] = "file"
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+## Platter class “types”
+
+
+### access_cover
+
+```
+ CLASSES: add1, add2, platter
+DESCRIPTION: creates bottom access cover for access panels.
+ MASK: no
+ USAGE: "class", "access_cover", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "platter"
+ type = "access_cover"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = x dimension
+ size[1] = y dimension
+ size[2] = floor thickness
+ data[0] = "portrait", "landscape"
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### button_assembly
+
+```
+ CLASSES: add2, platter
+DESCRIPTION: adds button assembly for recess button style.
+ MASK: yes
+ USAGE: "add2", "button_assembly", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add2"
+ type = "button_assembly"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = diameter of button body for recess style
+ size[1] = not used
+ size[2] = height above button for recess style
+ data[0] = "recess"
+ mask[0] = true
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### fan_cover
+
+```
+ CLASSES: add1, add2, platter
+DESCRIPTION: creates fan cover for fan openings.
+ MASK: no
+ USAGE: "class", "fan_cover", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "platter"
+ type = "fan_cover"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = fan size
+ size[1] = not used
+ size[2] = cover thickness
+ data[0] = "fan_open", "fan_1", "fan_2", "fan_hex"
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### feet
+
+```
+ CLASSES: add1, add2, platter
+DESCRIPTION: creates case feet.
+ MASK: no
+ USAGE: "class", "feet", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "platter"
+ type = "feet"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = feet diameter
+ size[1] = not used
+ size[2] = feet height
+ data[] = not used
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_boom_speaker_holder
+
+```
+ CLASSES: add2, platter
+DESCRIPTION: creates hk boom bonnet speaker clamp and friction style holder.
+ MASK: no
+ USAGE: "class", "hk_boom_speaker_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add2"
+ type = "hk_boom_speaker_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = "friction", "clamp"
+ data[1] = tolerance adjustment
+ mask[0] = false
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_boom_vring
+
+```
+ CLASSES: add1, add2, platter
+DESCRIPTION: creates hk stereo boom bonnet volume wheel extention.
+ MASK: no
+ USAGE: "class", "hk_boom_vring", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "platter"
+ type = "hk_boom_vring"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = tolerance adjustment
+ mask[0] = false
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_h3_port_extender_holder
+
+```
+ CLASSES: add1, add2, platter
+DESCRIPTION: creates odroid-h3 port extender holder parts.
+ MASK: no
+ USAGE: "class", "hk_h3_port_extender_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2", "platter"
+ type = "hk_h3_port_extender_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[0] = distance from mount face
+ data[1] = "top", "bottom", "both"
+ mask[0] = false
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### hk_uart_strap
+
+```
+ CLASSES: add2, platter
+DESCRIPTION: creates a strap for the hk micro-usb uart holder.
+ MASK: no
+ USAGE: "class", "hk_uart_holder", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add2"
+ type = "hk_uart_holder"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[] = not used
+ data[] = not used
+ mask[0] = false
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+### vent_panel_hex
+
+```
+ CLASSES: add1, add2, platter
+DESCRIPTION: creates hex pattern covers for vent openings.
+ MASK: no
+ USAGE: "class", "vent_panel_hex", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
+
+ class = "add1", "add2"
+ type = "vent_panel_hex"
+ loc_x = x location placement
+ loc_y = y location placement
+ loc_z = z location placement
+ face = "top", "bottom", "right", "left", "front", "rear"
+ rotation[] = object rotation
+ parametric[] = "case", "sbc", "sbc-case_z"
+ size[0] = #rows
+ size[1] = #columns
+ size[2] = thickness
+ data[0] = size of hex
+ data[1] = space between hex
+ data[2] = size of borber
+ data[3] = type of border "none", "default"
+ mask[0] = false, not used
+ mask[1] = length
+ mask[2] = set back
+ mask[3] = mstyle "default"
+```
+
+
+## Accuracy
In the past there was been no way of validating whether a SBC Model Framework model and it’s 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.
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 SBC’s verification and completion as indicated in sbc.png is as follows:
@@ -567,7 +2042,7 @@ Some SBC in SBC Model Framework have not been validated or may be missing compon
The SBC that I do not own have been created using manufacturer supplied mechanical drawings. Some of the drawings are missing information or have errors that effect all or part of the drawings and subsequent SBC models. If you own an SBC that is not represented or verified in SBC Model Framework, please consider adding it or helping to correct errors in existing SBC data. An SBC can be verified to be accurate if a printed shell case from SBC Case Builder fits. Any misalignment is corrected in the SBC Model Framework model data(sbc_models.cfg).
-### Future Development
+## Future Development
There are a few more ideas for base cases to be worked on as well as a host of supporting accessory models that need to be created. It would also be nice to have all of the OEM accessories for each SBC in the library as well. I’m still looking for a better way to create accessory entries and groups, and continue to expand and verify as many SBC as possible. With that and the obvious benefit of autonomously making SBC cases, this project has also been helping fulfill another personal goal.
diff --git a/lib/custom.scad b/lib/custom.scad
index 0098b3d..adc591f 100644
--- a/lib/custom.scad
+++ b/lib/custom.scad
@@ -15,17 +15,17 @@
along with this program. If not, see
Code released under GPLv3: http://www.gnu.org/licenses/gpl.html
- h3_port_extender(style, mask = false)
- h3_port_extender_holder(part, offset)
+ hk_h3_port_extender(style, mask = false)
+ hk_h3_port_extender_holder(part, offset)
*/
/*
- NAME: h3_port_extender
+ NAME: hk_h3_port_extender
DESCRIPTION: @mctom's odroid-h3 gpio port extender
TODO: none
- USAGE: h3_port_extender(style, mask)
+ USAGE: hk_h3_port_extender(style, mask)
style = "header", "remote"
mask[0] = true enables component mask
@@ -34,7 +34,7 @@
mask[3] = mstyle "default"
*/
-module h3_port_extender(style, mask) {
+module hk_h3_port_extender(style, mask) {
enablemask = mask[0];
mlength = mask[1];
@@ -99,17 +99,17 @@ module h3_port_extender(style, mask) {
/*
- NAME: h3_port_extender_holder
+ NAME: hk_h3_port_extender_holder
DESCRIPTION: holder for the @mctom's remote h3 port extender
TODO: none
- USAGE: h3_port_extender_holder(part, offset)
+ USAGE: hk_h3_port_extender_holder(part, offset)
part = "top","bottom","both"
- mask = true or false, mask for openings
+ offset = distance from mount face
*/
-module h3_port_extender_holder(part,offset=2) {
+module hk_h3_port_extender_holder(part,offset=2) {
size = [16-offset,40,5.5];
adj = .01;
diff --git a/lib/fans.scad b/lib/fans.scad
index fd4dd2e..988ab21 100644
--- a/lib/fans.scad
+++ b/lib/fans.scad
@@ -15,12 +15,18 @@
along with this program. If not, see
Code released under GPLv3: http://www.gnu.org/licenses/gpl.html
+ fans(style, size, mask)
+ fan_cover(size, thick)
+ fan_mask(size, thick, style)
+*/
+
+/*
NAME: fans
DESCRIPTION: creates different fan styles and sizes
TODO: add vans
- USAGE: buttons(style, size, mask)
+ USAGE: fans(style, size, mask)
style = "box",
size[0] = size of fan
@@ -43,7 +49,9 @@ module fans(style, mask) {
["box140x25", 140, 25, 124.5, 4.3, 40, "#353535"],
["box120x25", 120, 25, 105, 4.3, 40, "#353535"],
["box92x25", 92, 25, 82.5, 4.3, 40, "#353535"],
+ ["box92x10", 92, 10, 82.5, 4.3, 40, "#353535"],
["box80x25", 80, 25, 72.5, 4.3, 35, "#353535"],
+ ["box80x10", 80, 10, 72.5, 4.3, 35, "#353535"],
["box60x10", 60, 10, 50, 4.3, 35, "#353535"],
["box50x10", 60, 10, 40, 4.3, 20, "#353535"],
["box40x10", 40, 10, 32, 4.3, 18, "#353535"],
@@ -92,4 +100,270 @@ module fans(style, mask) {
cylinder_fillet_inside(h=thickness, r=hub_size/2, top=1, bottom=1, $fn=90, fillet_fn=90, center=true);
}
-}
\ No newline at end of file
+}
+
+
+/*
+ NAME: fan_cover
+ DESCRIPTION: creates fan covers for fan openings
+ TODO: none
+
+ USAGE: fan_cover(size, thick, style)
+
+ size = size of fan
+ thick = thickness of cover
+ style = "fan_open", "fan_1", "fan_2", "fan_hex"
+*/
+
+module fan_cover(size, thick, style) {
+ difference() {
+ color("grey", 1) slab([size, size, thick], 3);
+ color("grey", 1) fan_mask(size, thick, style);
+ }
+}
+
+
+/*
+ DESCRIPTION: creates heatsink masks for openings
+ TODO:
+
+ USAGE: heatsink_mask(size, thick, style)
+
+ size = size of fan
+ thick = thickness of cover
+ style = "fan_open", "fan_1", "fan_2", "fan_hex"
+*/
+
+module fan_mask(size, thick, style) {
+
+ hole_pos = size == 30 ? 3 :
+ size == 40 ? 4 :
+ size == 50 || size == 60 || size == 70 ? 5 :
+ size >= 80 ? 3.75 : 3.75;
+ $fn = 90;
+ adj = .01;
+
+ if(style == "fan_open") {
+
+ translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-1);
+ // mount holes
+ translate([size-hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([size-hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
+ }
+ if(style == "fan_1" && size == 30) {
+
+ union() {
+ 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-8);
+ }
+ difference() {
+ translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-11);
+ translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-17);
+ }
+ difference() {
+ translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-20);
+ translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-25);
+ }
+ // mount holes
+ translate([size-hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([size-hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
+ }
+ translate([5, 4, -2]) rotate([0, 0, 45]) cube([size, 1.5, thick+4]);
+ translate([4, size-5, -2]) rotate([0, 0, -45]) cube([size, 1.5, thick+4]);
+ }
+ }
+ }
+ if(style == "fan_1" && size == 40) {
+
+ union() {
+ 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-8);
+ }
+ difference() {
+ translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-11);
+ translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-17);
+ }
+ difference() {
+ translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-20);
+ translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-25);
+ }
+ difference() {
+ translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-28);
+ translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-35);
+ }
+ // mount holes
+ translate([size-hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([size-hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
+ }
+ translate([6.5, 5.5, -2]) rotate([0, 0, 45]) cube([size, 1.5, thick+4]);
+ translate([5, size-6, -2]) rotate([0, 0, -45]) cube([size, 1.5, thick+4]);
+ }
+ }
+ }
+ if(style == "fan_1" && (size == 50 || size == 60 || size == 70)) {
+
+ union() {
+ 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-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-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-46);
+ }
+ if(size > 50) {
+ 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-59);
+ }
+ }
+ // mount holes
+ translate([size-hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([size-hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
+ }
+ translate([8.5, 7, -2]) rotate([0, 0, 45]) cube([size > 60 ? size+4 : size+1, 2, thick+4]);
+ translate([6.5, size-8, -2]) rotate([0, 0, -45]) cube([size > 60 ? size+4 : size+1, 2, thick+4]);
+ }
+ }
+ }
+ if(style == "fan_1" && size >= 80) {
+
+ union() {
+ 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-9);
+ }
+ difference() {
+ translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-14);
+ translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-21);
+ }
+ 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-33);
+ }
+ difference() {
+ translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-38);
+ translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-45);
+ }
+ 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-57);
+ }
+ difference() {
+ translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-62);
+ translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-68);
+ }
+ if(size == 92) {
+ difference() {
+ 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-80);
+ }
+ difference() {
+ translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-85);
+ translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-91);
+ }
+ }
+ // mount holes
+ translate([size-hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([size-hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([hole_pos, hole_pos, -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 == "fan_2") {
+
+ inner = size == 30 ? 24 :
+ size == 40 ? 32 :
+ size == 50 ? 40 :
+ size == 60 ? 50 :
+ size == 70 ? 61.9 :
+ size == 80 ? 71.5 :
+ size * 0.8; // Use 80% as default
+
+ rings = size <= 40 ? 4 : 6;
+ bar_size = size <= 40 ? 2 : 3;
+
+ screw_offset = inner / 2;
+ center_point = size * 0.5;
+ base_ring_size = size * 0.95;
+ rings_spacing = size / rings;
+
+ translate([size/2, size/2, -1])
+ union() {
+ translate([screw_offset, screw_offset, (thick+2)/2]) cylinder(d=3, h=thick+2, center=true);
+ translate([-screw_offset, screw_offset, (thick+2)/2]) cylinder(d=3, h=thick+2, center=true);
+ translate([screw_offset, -screw_offset, (thick+2)/2]) cylinder(d=3, h=thick+2, center=true);
+ translate([-screw_offset, -screw_offset, (thick+2)/2]) cylinder(d=3, h=thick+2, center=true);
+
+ difference() {
+ union() {
+ for(i=[inner:-rings_spacing:0]) {
+ difference() {
+ cylinder(d=base_ring_size - i, h=thick+2);
+ translate([0, 0, -1]) cylinder(d=base_ring_size - i - (rings_spacing/2), h=thick+4);
+ }
+ }
+ }
+
+ translate([0, 0, 2])
+ union() {
+ cylinder(d=bar_size*2+0.1, thick+2); // Add a circle to prevent any tiny holes around cross bar
+ rotate([0, 0, 45]) cube([size, bar_size, thick+2], center=true);
+ rotate([0, 0, 45]) cube([bar_size, size, thick+2], center=true);
+ }
+ }
+ }
+ }
+ if(style == "fan_hex") {
+
+ hex_pos = size == 30 ? [-11.75, -4.5, 0] :
+ size == 40 ? [-14, -11.25, 0] :
+ size == 50 ? [-16, -6.5, 0] :
+ size == 60 ? [-11, -1.5, 0] :
+ size == 70 ? [-13, -3.5, 0] :
+ size >= 80 ? [-8.25, -3.5, 0] : [-9, -4, 0];
+
+ union() {
+ difference () {
+ translate([1+(size-2)/2, 1+(size-2)/2, -1]) cylinder(h=thick+2, d=size-2);
+ union() {
+ difference() {
+ translate([1+(size-2)/2, 1+(size-2)/2, -1-adj]) cylinder(h=thick+3, d=size-2);
+ translate(hex_pos) vent_hex(15, 8, thick+4, 12, 2, "horizontal");
+ }
+ }
+ }
+ }
+ // mount holes
+ translate([size-hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([size-hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
+ translate([hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
+ }
+}
diff --git a/lib/hd.scad b/lib/hd.scad
index df1f210..d40e03f 100644
--- a/lib/hd.scad
+++ b/lib/hd.scad
@@ -26,7 +26,7 @@
hdd35_25holder(length)
*/
-
+
/*
NAME: hd_mount
DESCRIPTION: creates 2.5" and 3.5" hard drive mounts
@@ -425,7 +425,7 @@ module hd35_vtab(side) {
/*
- NAME: hd_bottom_holes
+ NAME: hd_holes
DESCRIPTION: creates 2.5" and 3.5" hard drive hole mask for mounting
TODO: none
@@ -434,11 +434,11 @@ module hd35_vtab(side) {
hd = 2.5, 3.5
orientation = "portrait", "landscape"
position = "vertical", "horizontal"
- side = "left", "right"
+ side = "left", "right", "none"
thick = floor thickness
*/
-module hd_bottom_holes(hd, orientation, position, side, thick) {
+module hd_holes(hd, orientation, position, side, thick) {
adj = .01;
$fn = 90;
diff --git a/lib/oem_adafruit.scad b/lib/oem_adafruit.scad
index 488f940..fdba613 100644
--- a/lib/oem_adafruit.scad
+++ b/lib/oem_adafruit.scad
@@ -20,17 +20,16 @@
DESCRIPTION: adafruit 4311 2in TFT IPS Display model
TODO: none
- USAGE: adafruit_lcd(enablemask, mask[])
+ USAGE: adafruit_lcd(mask[])
- enablemask = true produces mask, false produces model
- mask[0] = true enables component mask
+ mask[0] = true enables mask
mask[1] = mask length
mask[2] = mask setback
mask[3] = mstyle "default"
*/
-module adafruit_lcd(enablemask=false, mask) {
+module adafruit_lcd(mask) {
size_x = 35.5;
size_y = 59;
@@ -40,7 +39,7 @@ module adafruit_lcd(enablemask=false, mask) {
lcd_size = [34.75,48,2];
corner_radius = 2;
hole_size = 2.5;
- cmask = mask[0];
+ enablemask = mask[0];
mlen = mask[1];
back = mask[2];
mstyle = mask[3];
@@ -48,7 +47,7 @@ module adafruit_lcd(enablemask=false, mask) {
adj = .01;
$fn = 90;
- if(enablemask == true && cmask == true && mstyle == "default") {
+ if(enablemask == true && mstyle == "default") {
translate([2.25, 11, size_z+2.5-back]) cube([lcd_size[0]-4, lcd_size[1]-7, mlen]);
storage("microsdcard", 11, 44, 0, "bottom", 180, [size_x, size_z, size_y], [0], size_z, enablemask, [true, 20, 0, "default"]);
fpc("fh19", .5, 22, 0, "bottom", 270, [18,0,0], ["smt","side","white","black"], size_z, enablemask, [true,10,2,"default"]);
diff --git a/lib/oem_hk.scad b/lib/oem_hk.scad
index 0187041..88bb899 100644
--- a/lib/oem_hk.scad
+++ b/lib/oem_hk.scad
@@ -30,12 +30,12 @@
m1_hdmount()
hk_speaker()
hk_boom(speakers, orientation, mask)
- hk_boom_speaker(side, speaker, pcb, mask)
- boom_speaker(mask)
+ hk_boom_speaker_pcb(side, speaker, pcb, mask)
+ hk_boom_speaker(mask)
hk_boom_grill(style, thick)
- boom_speaker_holder(style, tolerance)
- boom_speaker_strap()
- boom_vring(tolerance)
+ hk_boom_speaker_holder(style, tolerance)
+ hk_boom_speaker_strap()
+ hk_boom_vring(tolerance)
hk_pwr_button(mask)
hk_m1s_case_holes
hk_m1s_ups()
@@ -850,7 +850,7 @@ module m1_hdmount() {
translate ([ 76, 10.15, 0]) rotate([180,0,0]) screw([3, 7, 0]);
}
- // "HDD HOLDER"
+ // hdd holder
color([0.9, 0.9, 0.9])
translate([67,8,0]) rotate([180,0,180])
linear_extrude(height=0.01) text("HDD HOLDER",5);
@@ -972,12 +972,12 @@ module hk_boom(speakers, orientation, mask) {
}
if(mstyle == "default" || mstyle == "speakers") {
if(speakers == true && orientation == "rear") {
- translate([-31.5/2,35/2,1.6]) boom_speaker(mask);
- translate([60+(31.5/2),35/2,1.6]) boom_speaker(mask);
+ translate([-31.5/2,35/2,1.6]) hk_boom_speaker(mask);
+ translate([60+(31.5/2),35/2,1.6]) hk_boom_speaker(mask);
}
if(speakers == true && orientation == "front") {
- translate([-31.5/2,35/2,0]) rotate([0,180,0]) boom_speaker(mask);
- translate([60+(31.5/2),35/2,0]) rotate([0,180,0]) boom_speaker(mask);
+ translate([-31.5/2,35/2,0]) rotate([0,180,0]) hk_boom_speaker(mask);
+ translate([60+(31.5/2),35/2,0]) rotate([0,180,0]) hk_boom_speaker(mask);
}
}
}
@@ -1047,23 +1047,23 @@ module hk_boom(speakers, orientation, mask) {
translate([10,12,1.6-adj]) color("dimgrey") cube([4,4,1]);
translate([32.5,9,1.6-adj]) color("dimgrey") cube([3.5,3,1]);
if(speakers == true && orientation == "rear") {
- translate([-31.5/2,35/2,1.6]) boom_speaker([false,10,0,"default"]);
- translate([60+(31.5/2),35/2,1.6]) boom_speaker([false,10,0,"default"]);
+ translate([-31.5/2,35/2,1.6]) hk_boom_speaker([false,10,0,"default"]);
+ translate([60+(31.5/2),35/2,1.6]) hk_boom_speaker([false,10,0,"default"]);
}
if(speakers == true && orientation == "front") {
- translate([-31.5/2,35/2,0]) rotate([0,180,0]) boom_speaker([false,10,0,"default"]);
- translate([60+(31.5/2),35/2,0]) rotate([0,180,0]) boom_speaker([false,10,0,"default"]);
+ translate([-31.5/2,35/2,0]) rotate([0,180,0]) hk_boom_speaker([false,10,0,"default"]);
+ translate([60+(31.5/2),35/2,0]) rotate([0,180,0]) hk_boom_speaker([false,10,0,"default"]);
}
}
}
/*
- NAME: hk_boom_speaker
- DESCRIPTION: hardkernel stereo boom bonnet pcb and speakers
+ NAME: hk_boom_speaker_pcb
+ DESCRIPTION: hardkernel stereo boom bonnet speakers with optional speaker pcbs
TODO: none
- USAGE: hk_boom_speaker(side, speaker, pcb, mask)
+ USAGE: hk_boom_speaker_pcb(side, speaker, pcb, mask)
side = "left, "right"
speakers = true, false
@@ -1074,7 +1074,7 @@ module hk_boom(speakers, orientation, mask) {
mask[3] = mstyle "default"
*/
-module hk_boom_speaker(side, speaker, pcb, mask) {
+module hk_boom_speaker_pcb(side, speaker, pcb, mask) {
enablemask = mask[0];
mlength = mask[1];
@@ -1085,7 +1085,7 @@ module hk_boom_speaker(side, speaker, pcb, mask) {
$fn = 90;
if(enablemask == true) {
- translate([31.5/2,35/2,0]) boom_speaker(mask);
+ translate([31.5/2,35/2,0]) hk_boom_speaker(mask);
}
if(enablemask == false) {
if(pcb == true) {
@@ -1109,28 +1109,28 @@ module hk_boom_speaker(side, speaker, pcb, mask) {
}
}
if(speaker == true && pcb == true) {
- translate([(31.5/2),35/2,1.6]) boom_speaker([false,10,0,"default"]);
+ translate([(31.5/2),35/2,1.6]) hk_boom_speaker([false,10,0,"default"]);
}
if(speaker == true && pcb == false) {
- boom_speaker([false,10,0,"default"]);
+ hk_boom_speaker([false,10,0,"default"]);
}
}
}
/*
- NAME: boom_speaker
+ NAME: hk_boom_speaker
DESCRIPTION: hardkernel stereo boom bonnet speakers
TODO: none
- USAGE: boom_speaker(mask)
+ USAGE: hk_boom_speaker(mask)
mask[0] = true enables component mask
mask[1] = mask length
mask[2] = mask setback
mask[3] = mstyle "default"
*/
-module boom_speaker(mask) {
+module hk_boom_speaker(mask) {
enablemask = mask[0];
mlength = mask[1];
@@ -1218,17 +1218,17 @@ module hk_boom_grill(style, thick) {
/*
- NAME: boom_speaker_holder
+ NAME: hk_boom_speaker_holder
DESCRIPTION: hardkernel stereo boom bonnet speaker holder
TODO: none
- USAGE: boom_speaker_holder(style, tolerance)
+ USAGE: hk_boom_speaker_holder(style, tolerance)
style = "friction", "clamp"
tolerance = friction adjustment
*/
-module boom_speaker_holder(style, tolerance=0) {
+module hk_boom_speaker_holder(style, tolerance=0) {
adj = .01;
$fn = 90;
@@ -1262,16 +1262,16 @@ module boom_speaker_holder(style, tolerance=0) {
/*
- NAME: boom_speaker_strap
+ NAME: hk_boom_speaker_strap
DESCRIPTION: hardkernel stereo boom bonnet speaker clamp holder top
TODO: none
- USAGE: boom_speaker_strap(side)
+ USAGE: hk_boom_speaker_strap(side)
side = "left", "right"
*/
-module boom_speaker_strap(side) {
+module hk_boom_speaker_strap(side) {
topthick = 2;
top_height = 14;
@@ -1319,16 +1319,16 @@ module boom_speaker_strap(side) {
/*
- NAME: boom_vring
+ NAME: hk_boom_vring
DESCRIPTION: hardkernel stereo boom bonnet volume ring
TODO: none
- USAGE: boom_vring(tolerance)
+ USAGE: hk_boom_vring(tolerance)
tolerance = friction fit adjustment
*/
-module boom_vring(tolerance) {
+module hk_boom_vring(tolerance) {
out_dia = 22;
in_dia = 16.15 + tolerance;
diff --git a/lib/vent.scad b/lib/vent.scad
index ce4daaf..7f2046a 100644
--- a/lib/vent.scad
+++ b/lib/vent.scad
@@ -18,52 +18,9 @@
vent(width, length, height, gap, rows, columns, orientation)
vent_hex(cells_x, cells_y, thickness, cell_size, cell_spacing, orientation)
vent_panel_hex(x, y, thick, cell_size, cell_spacing, border, borders);
- fan_cover(size, thick)
- fan_mask(size, thick, style)
*/
-/*
- NAME: vent
- DESCRIPTION: creates vent mask patterns
- TODO: none
-
- USAGE: vent(width, length, height, gap, rows, columns, orientation)
-
- width = coloumn size_x
- length = column size_y
- height = size_z
- gap = space between
- rows = #row
- columns = #columns
- orientation = "horizontal", "vertical"
-*/
-
-module vent(width, length, height, gap, rows, columns, orientation) {
-
- fillet = width/2;
- adj = .01;
- $fn=90;
-
- // vertical orientation
- if(orientation == "vertical") { rotate([90,0,0])
- for (r=[0:length+gap:rows*(length+gap)-1]) {
- for (c=[0:width+(2*gap):(columns*(width+(2*gap)))-1]) {
- translate ([c,r,-1]) cube([width,length,height]);
- }
- }
- }
- // horizontal orientation
- if(orientation == "horizontal") {
- for (r=[0:length+(2*gap):rows*(length+gap)]) {
- for (c=[0:width+(2*gap):(columns*(width+(2*gap)))-1]) {
- translate ([c,r,-1]) cube([width,length,height]);
- }
- }
- }
-}
-
-
/*
NAME: vent_panel_hex
DESCRIPTION: creates hex vent panel
@@ -107,267 +64,3 @@ module vent_panel_hex(x, y, thick, cell_size=8, cell_spacing=3, border=3, border
}
-/*
- NAME: fan_cover
- DESCRIPTION: creates fan covers for fan openings
- TODO: none
-
- USAGE: fan_cover(size, thick, style)
-
- size = size of fan
- thick = thickness of cover
- style = fan mask style
-*/
-
-module fan_cover(size, thick, style) {
- difference() {
- color("grey", 1) slab([size, size, thick], 3);
- color("grey", 1) fan_mask(size, thick, style);
- }
-}
-
-
-/*
- DESCRIPTION: creates heatsink masks for openings
- TODO:
-
- USAGE: heatsink_mask(size, thick, style)
-
- size = size of fan
- thick = thickness of cover
- style = 0="fan_open", 1="fan_1", 2="fan_2", 3"fan_hex"
-*/
-
-module fan_mask(size, thick, style) {
-
- hole_pos = size == 30 ? 3 :
- size == 40 ? 4 :
- size == 50 || size == 60 || size == 70 ? 5 :
- size >= 80 ? 3.75 : 3.75;
- $fn = 90;
- adj = .01;
-
- if(style == 0) {
-
- translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-1);
- // mount holes
- translate([size-hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([size-hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
- }
- if(style == 1 && size == 30) {
-
- union() {
- 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-8);
- }
- difference() {
- translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-11);
- translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-17);
- }
- difference() {
- translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-20);
- translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-25);
- }
- // mount holes
- translate([size-hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([size-hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
- }
- translate([5, 4, -2]) rotate([0, 0, 45]) cube([size, 1.5, thick+4]);
- translate([4, size-5, -2]) rotate([0, 0, -45]) cube([size, 1.5, thick+4]);
- }
- }
- }
- if(style == 1 && size == 40) {
-
- union() {
- 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-8);
- }
- difference() {
- translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-11);
- translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-17);
- }
- difference() {
- translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-20);
- translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-25);
- }
- difference() {
- translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-28);
- translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-35);
- }
- // mount holes
- translate([size-hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([size-hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
- }
- translate([6.5, 5.5, -2]) rotate([0, 0, 45]) cube([size, 1.5, thick+4]);
- translate([5, size-6, -2]) rotate([0, 0, -45]) cube([size, 1.5, thick+4]);
- }
- }
- }
- if(style == 1 && (size == 50 || size == 60 || size == 70)) {
-
- union() {
- 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-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-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-46);
- }
- if(size > 50) {
- 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-59);
- }
- }
- // mount holes
- translate([size-hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([size-hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
- }
- translate([8.5, 7, -2]) rotate([0, 0, 45]) cube([size > 60 ? size+4 : size+1, 2, thick+4]);
- translate([6.5, size-8, -2]) rotate([0, 0, -45]) cube([size > 60 ? size+4 : size+1, 2, thick+4]);
- }
- }
- }
- if(style == 1 && size >= 80) {
-
- union() {
- 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-9);
- }
- difference() {
- translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-14);
- translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-21);
- }
- 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-33);
- }
- difference() {
- translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-38);
- translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-45);
- }
- 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-57);
- }
- difference() {
- translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-62);
- translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-68);
- }
- if(size == 92) {
- difference() {
- 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-80);
- }
- difference() {
- translate([size/2, size/2, -1]) cylinder(h=thick+2, d=size-85);
- translate([size/2, size/2, -2]) cylinder(h=thick+4, d=size-91);
- }
- }
- // mount holes
- translate([size-hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([size-hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([hole_pos, hole_pos, -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 == 2) {
-
- inner = size == 30 ? 24 :
- size == 40 ? 32 :
- size == 50 ? 40 :
- size == 60 ? 50 :
- size == 70 ? 61.9 :
- size == 80 ? 71.5 :
- size * 0.8; // Use 80% as default
-
- rings = size <= 40 ? 4 : 6;
- bar_size = size <= 40 ? 2 : 3;
-
- screw_offset = inner / 2;
- center_point = size * 0.5;
- base_ring_size = size * 0.95;
- rings_spacing = size / rings;
-
- translate([size/2, size/2, -1])
- union() {
- translate([screw_offset, screw_offset, (thick+2)/2]) cylinder(d=3, h=thick+2, center=true);
- translate([-screw_offset, screw_offset, (thick+2)/2]) cylinder(d=3, h=thick+2, center=true);
- translate([screw_offset, -screw_offset, (thick+2)/2]) cylinder(d=3, h=thick+2, center=true);
- translate([-screw_offset, -screw_offset, (thick+2)/2]) cylinder(d=3, h=thick+2, center=true);
-
- difference() {
- union() {
- for(i=[inner:-rings_spacing:0]) {
- difference() {
- cylinder(d=base_ring_size - i, h=thick+2);
- translate([0, 0, -1]) cylinder(d=base_ring_size - i - (rings_spacing/2), h=thick+4);
- }
- }
- }
-
- translate([0, 0, 2])
- union() {
- cylinder(d=bar_size*2+0.1, thick+2); // Add a circle to prevent any tiny holes around cross bar
- rotate([0, 0, 45]) cube([size, bar_size, thick+2], center=true);
- rotate([0, 0, 45]) cube([bar_size, size, thick+2], center=true);
- }
- }
- }
- }
- if(style == 3) {
-
- hex_pos = size == 30 ? [-11.75, -4.5, 0] :
- size == 40 ? [-14, -11.25, 0] :
- size == 50 ? [-16, -6.5, 0] :
- size == 60 ? [-11, -1.5, 0] :
- size == 70 ? [-13, -3.5, 0] :
- size >= 80 ? [-8.25, -3.5, 0] : [-9, -4, 0];
-
- union() {
- difference () {
- translate([1+(size-2)/2, 1+(size-2)/2, -1]) cylinder(h=thick+2, d=size-2);
- union() {
- difference() {
- translate([1+(size-2)/2, 1+(size-2)/2, -1-adj]) cylinder(h=thick+3, d=size-2);
- translate(hex_pos) vent_hex(15, 8, thick+4, 12, 2, "horizontal");
- }
- }
- }
- }
- // mount holes
- translate([size-hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([size-hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([hole_pos, size-hole_pos, -1]) cylinder(h=thick+2, d=3);
- translate([hole_pos, hole_pos, -1]) cylinder(h=thick+2, d=3);
- }
-}
diff --git a/mod/add.scad b/mod/add.scad
index 2789391..3d32a68 100644
--- a/mod/add.scad
+++ b/mod/add.scad
@@ -48,108 +48,13 @@ module add(type, loc_x, loc_y, loc_z, face, rotation, size, data, mask) {
msetback = mask[2];
mstyle = mask[3];
- if(type == "rectangle") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) slab_r([size_x,size_y,size_z],data[0]);
- }
- if(type == "round") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) cylinder(d=size_x,h=size_z);
- }
- if(type == "slot") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) slot(size_x,size_y,size_z);
- }
- if(type == "text") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) linear_extrude(height = size_z) text(data[1], size=data[0]);
- }
- if(type == "art") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) art(data[0],data[1],data[2]);
- }
- if(type == "stl_model") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) stl_model(data[0],data[1]);
- }
- if(type == "standoff") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) standoff(data[0], mask);
- }
- if(type == "button") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) buttons(data[0],[size_x,size_y,size_z],data[1],data[2],mask);
- }
- if(type == "button_top") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) button_assembly(data[0],size_x,size_z);
- }
- if(type == "pcb_holder") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) pcb_holder([size_x,size_y,size_z],data[0]);
- }
- if(type == "batt_holder") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) batt_holder(data[0]);
- }
- if(type == "hk_uart_holder") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_uart_holder(mask);
- }
- if(type == "hk_uart_strap") {
- color("grey",1) translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_uart_strap();
- }
- if(type == "hd_holder") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_mount(data[0],data[1], "horizontal", "none");
- }
- if(type == "hd_vertleft") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_mount(data[0],data[1], "vertical", "left");
- }
- if(type == "hd_vertright") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_mount(data[0],data[1], "vertical", "right");
- }
- if(type == "hd25") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hd25(data[0]);
- }
- if(type == "hd35") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hd35();
- }
- if(type == "hk_wb2") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_wb2();
- }
- if(type == "hc4_oled") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_hc4_oled(mask);
- }
- if(type == "hc4_oled_holder") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_hc4_oled_holder(face, size_z, mask);
- }
- if(type == "hk_netcard") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_netcard(mask);
- }
- if(type == "hk_lcd35") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_35lcd(mask);
- }
- if(type == "hk_m1s_ups") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_m1s_ups(mask);
- }
- if(type == "hk_uart") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_uart(mask);
- }
- if(type == "hk_vu7c") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_vu7c(data[0],data[1],mask);
- }
- if(type == "hk_boom") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_boom(data[0],data[1],mask);
- }
- if(type == "boom_speaker") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_boom_speaker(data[1],true,data[0],mask);
- }
- if(type == "boom_grill") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_boom_grill(data[0],size_z);
- }
- if(type == "boom_speaker_holder") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) boom_speaker_holder(data[0],data[1]);
- }
- if(type == "hk_speaker") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_speaker(mask);
- }
- if(type == "fan_cover") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) fan_cover(size_x, size_z, data[0]);
- }
- 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[0], cell_spacing=data[1], border=data[3], borders=data[2]);
- }
- if(type == "feet") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) feet(size_x, size_z);
+ if(type == "access_cover") {
+ 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[0]);
+ }
+ else {
+ color("grey",1) translate([loc_x,loc_y,loc_z]) rotate(rotation) access_cover([size_x,size_y,size_z],data[0]);
+ }
}
if(type == "access_panel") {
if(rotation[2] == 180) {
@@ -159,33 +64,145 @@ module add(type, loc_x, loc_y, loc_z, face, rotation, size, data, mask) {
translate([loc_x,loc_y,loc_z]) rotate(rotation) access_panel([size_x,size_y,size_z],data[0],mask);
}
}
- if(type == "access_cover") {
- 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[0]);
- }
- else {
- color("grey",1) translate([loc_x,loc_y,loc_z]) rotate(rotation) access_cover([size_x,size_y,size_z],data[0]);
- }
+ if(type == "art") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) art(data[0],data[1],data[2]);
}
- if(type == "boom_vring") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) boom_vring(data[0]);
+ if(type == "batt_holder") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) batt_holder(data[0]);
}
- if(type == "h3_port_extender") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) h3_port_extender(data[0],mask);
+ if(type == "button") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) buttons(data[0],[size_x,size_y,size_z],data[1],data[2],mask);
}
- if(type == "h3_port_extender_holder") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) h3_port_extender_holder(data[1],data[0]);
+ if(type == "button_assembly") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) button_assembly(data[0],size_x,size_z);
}
- if(type == "hk_pwr_button") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_pwr_button(mask);
+ if(type == "fan_cover") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) fan_cover(size_x, size_z, data[0]);
+ }
+ if(type == "feet") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) feet(size_x, size_z);
+ }
+ if(type == "hd_holder") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_mount(data[0],data[1],data[2],data[3]);
+ }
+ if(type == "hk_boom_grill") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_boom_grill(data[0],size_z);
+ }
+ if(type == "hk_boom_speaker_holder") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_boom_speaker_holder(data[0],data[1]);
+ }
+ if(type == "hk_boom_vring") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_boom_vring(data[0]);
+ }
+ if(type == "hk_h3_port_extender_holder") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_h3_port_extender_holder(data[1],data[0]);
+ }
+ if(type == "hk_hc4_oled_holder") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_hc4_oled_holder(face, size_z, mask);
+ }
+ if(type == "hk_uart_holder") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_uart_holder(mask);
+ }
+ if(type == "hk_uart_strap") {
+ color("grey",1) translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_uart_strap();
}
if(type == "keyhole") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) keyhole(data[0],mask);
}
- if(type == "dsub") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) dsub(data[0], data[1], mask);
- }
if(type == "nut_holder") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) nut_holder(data[0], data[1], size_x, size_y, size_z);
}
+ if(type == "pcb_holder") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) pcb_holder([size_x,size_y,size_z],data[0]);
+ }
+ if(type == "rectangle") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) slab_r([size_x,size_y,size_z],data[0]);
+ }
+ if(type == "round") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) cylinder(d=size_x,h=size_z);
+ }
+ if(type == "slot") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) slot(size_x,size_y,size_z);
+ }
+ if(type == "sphere") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) sphere(d=size_x);
+ }
+ if(type == "standoff") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) standoff(data[0], mask);
+ }
+ if(type == "text") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) linear_extrude(height = size_z) text(data[1], size=data[0]);
+ }
+ if(type == "vent_panel_hex") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) vent_panel_hex(size_x, size_y, thick=size_z,
+ cell_size=data[0], cell_spacing=data[1], border=data[3], borders=data[2]);
+ }
+
+ // models
+ if(type == "adafruit_lcd") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) adafruit_lcd(mask);
+ }
+ if(type == "dsub") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) dsub(data[0], data[1], mask);
+ }
+ if(type == "fan") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) fans(data[0],mask);
+ }
+ if(type == "hd25") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hd25(data[0]);
+ }
+ if(type == "hd35") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hd35();
+ }
+ if(type == "hk_boom") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_boom(data[0],data[1],mask);
+ }
+ if(type == "hk_boom_speaker") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_boom_speaker(data[1],true,data[0],mask);
+ }
+ if(type == "hk_boom_speaker_pcb") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_boom_speaker_pcb(data[1],true,data[0],mask);
+ }
+ if(type == "hk_h3_port_extender") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_h3_port_extender(data[0],mask);
+ }
+ if(type == "hk_hc4_oled") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_hc4_oled(mask);
+ }
+ if(type == "hk_lcd35") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_35lcd(mask);
+ }
+ if(type == "hk_m1s_ups") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_m1s_ups(mask);
+ }
+ if(type == "hk_netcard") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_netcard(mask);
+ }
+ if(type == "hk_pwr_button") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_pwr_button(mask);
+ }
+ if(type == "hk_speaker") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_speaker(mask);
+ }
+ if(type == "hk_uart") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_uart(mask);
+ }
+ if(type == "hk_vu7c") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_vu7c(data[0],data[1],mask);
+ }
+ if(type == "hk_vu8m") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_vu8m(data[0],mask);
+ }
+ if(type == "hk_vu8s") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_vu8s(mask);
+ }
+ if(type == "hk_wb2") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_wb2();
+ }
+ if(type == "hk_xu4_shifter_shield") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_xu4_shifter_shield(mask);
+ }
+ if(type == "stl_model") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) stl_model(data[0],data[1]);
+ }
}
diff --git a/mod/case_bottom.scad b/mod/case_bottom.scad
index 7d3f850..0f02f8d 100644
--- a/mod/case_bottom.scad
+++ b/mod/case_bottom.scad
@@ -459,7 +459,7 @@ module case_bottom(case_design) {
// rear io plate opening for standard form motherboards
if(rear_io_plate == true) {
if(sbc_model == "mini-stx") {
- translate([6.2+pcb_loc_x,-4.5,-2+bottom_height-case_offset_bz-pcb_z+pcb_loc_z]) cube([123.95, 10+pcb_loc_y, 40]);
+ translate([6.2+pcb_loc_x,-4.5,-4.4+bottom_height-case_offset_bz-pcb_z+pcb_loc_z]) cube([123.95, 10+pcb_loc_y, 40]);
}
else {
translate([-2.62+pcb_loc_x,-4.5,-2+bottom_height-case_offset_bz-pcb_z+pcb_loc_z]) cube([158.75, 10+pcb_loc_y, 44]);
diff --git a/mod/case_top.scad b/mod/case_top.scad
index 3efccd2..b74d341 100644
--- a/mod/case_top.scad
+++ b/mod/case_top.scad
@@ -382,7 +382,7 @@ module case_top(case_design) {
// rear io plate opening for standard form motherboards
if(rear_io_plate == true) {
if(sbc_model == "mini-stx") {
- translate([6.2+pcb_loc_x,-4.5,-2+bottom_height-case_offset_bz-pcb_z+pcb_loc_z]) cube([123.95, 10+pcb_loc_y, 40]);
+ translate([6.2+pcb_loc_x,-4.5,-4.4+bottom_height-case_offset_bz-pcb_z+pcb_loc_z]) cube([123.95, 10+pcb_loc_y, 40]);
}
else {
translate([-2.62+pcb_loc_x,-4.5,-2+bottom_height-case_offset_bz-pcb_z+pcb_loc_z]) cube([158.75, 10+pcb_loc_y, 44]);
diff --git a/mod/sub.scad b/mod/sub.scad
index 241a073..61bfe4c 100644
--- a/mod/sub.scad
+++ b/mod/sub.scad
@@ -48,6 +48,18 @@ module sub(type, loc_x, loc_y, loc_z, face, rotation, size, data, mask) {
msetback = mask[2];
mstyle = mask[3];
+ if(type == "art") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) art(data[0],data[1],data[2]);
+ }
+ if(type == "fan_mask") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) fan_mask(size_x, size_z, data[0]);
+ }
+ if(type == "hd_holes") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_bottom_holes(data[0],data[1],data[2],data[3],data[4]);
+ }
+ if(type == "knockout") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) knockout(size_x,size_y,data[0],size_z,data[1],data[2]);
+ }
if(type == "rectangle") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) slab_r([size_x,size_y,size_z],data[0]);
}
@@ -57,55 +69,16 @@ module sub(type, loc_x, loc_y, loc_z, face, rotation, size, data, mask) {
if(type == "slot") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) slot(size_x,size_y,size_z);
}
+ if(type == "sphere") {
+ translate([loc_x,loc_y,loc_z]) rotate(rotation) sphere(d=size_x);
+ }
if(type == "text") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) linear_extrude(height = size_z) text(data_2, size=data[0]);
}
- if(type == "art") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) art(data[0],data[1],data[2]);
- }
- if(type == "button") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) buttons(data[0],[size_x,size_y,size_z],data[1],data[2],mask);
- }
- if(type == "hd_holes") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_bottom_holes(data[0],data[2],"none","none",data[1]);
- }
- if(type == "hd_vertleft_holes") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_bottom_holes(data[0],data[2],"vertical","left",data[1]);
- }
- if(type == "hd_vertright_holes") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_bottom_holes(data[0],data[2],"vertical","right",data[1]);
- }
- if(type == "hk_fan_top") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_fan_top();
- }
- if(type == "knockout") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) knockout(size_x,size_y,data[0],size_z,data[1],data[2]);
- }
- if(type == "fan") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) fan_mask(size_x, size_z, data[0]);
- }
if(type == "vent") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) vent(size_x,size_y,size_z,data[3],data[0],data[1],data[2]);
}
if(type == "vent_hex") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) vent_hex(size_x,size_y,size_z,data[0],data[1],data[2]);
}
- 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[0], true);
- }
- if(type == "h3_port_extender") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) h3_port_extender(data[0], true);
- }
- if(type == "hk_pwr_button") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_pwr_button(mask);
- }
- if(type == "dsub") {
- translate([loc_x,loc_y,loc_z]) rotate(rotation) dsub(data[0], true);
- }
}
diff --git a/sbc_case_builder.json b/sbc_case_builder.json
index bee638a..301b05c 100644
--- a/sbc_case_builder.json
+++ b/sbc_case_builder.json
@@ -118,6 +118,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -267,6 +268,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "1",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -416,6 +418,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -565,6 +568,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -714,6 +718,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -863,6 +868,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -1012,6 +1018,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -1161,6 +1168,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -1367,6 +1375,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "1",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -1516,6 +1525,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "1",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -1664,6 +1674,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -1813,6 +1824,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -1962,6 +1974,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -2111,6 +2124,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -2260,6 +2274,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -2409,6 +2424,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -2558,6 +2574,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -2707,6 +2724,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -2856,6 +2874,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -3005,6 +3024,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -3154,6 +3174,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -3303,6 +3324,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -3452,6 +3474,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -3601,6 +3624,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -3750,6 +3774,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -3899,6 +3924,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -4048,6 +4074,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -4197,6 +4224,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -4346,6 +4374,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -4495,6 +4524,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -4644,6 +4674,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -4793,6 +4824,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "3",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -4942,6 +4974,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -5091,6 +5124,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -5240,6 +5274,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -5389,6 +5424,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -5538,6 +5574,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -5687,6 +5724,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -5836,6 +5874,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -5985,6 +6024,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -6134,6 +6174,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -6283,6 +6324,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -6432,6 +6474,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -6581,6 +6624,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "0",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -6730,6 +6774,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -6879,6 +6924,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "1",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -7028,6 +7074,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "1",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -7177,6 +7224,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "1",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -7326,6 +7374,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "1",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -7475,6 +7524,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -7624,6 +7674,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -7773,6 +7824,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -7922,6 +7974,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -8071,6 +8124,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -8220,6 +8274,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -8369,6 +8424,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "false",
"sidethick": "2",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -8517,6 +8573,7 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "1.5",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
@@ -8548,154 +8605,6 @@
"view": "model",
"wallthick": "2"
},
- "mini-stx_shell": {
- "$fn": "90",
- "access_panel_location": "[10, 15]",
- "access_panel_orientation": "landscape",
- "access_panel_rotation": "0",
- "access_panel_size": "[70, 30]",
- "accessory_highlight": "false",
- "accessory_name": "none",
- "adj": "0.01",
- "bend_allowance": "1",
- "bottom_access_panel_enable": "false",
- "bottom_clearence": "3.5",
- "bottom_cover_pattern": "linear_horizontal",
- "bottom_front_left_adjust": "0",
- "bottom_front_left_enable": "true",
- "bottom_front_left_support": "front",
- "bottom_front_right_adjust": "0",
- "bottom_front_right_enable": "true",
- "bottom_front_right_support": "front",
- "bottom_rear_left_adjust": "0",
- "bottom_rear_left_enable": "true",
- "bottom_rear_left_support": "rear",
- "bottom_rear_right_adjust": "0",
- "bottom_rear_right_enable": "true",
- "bottom_rear_right_support": "rear",
- "bottom_sidewall_support": "false",
- "bottom_standoff_diameter": "5.75",
- "bottom_standoff_hole_size": "3.4",
- "bottom_standoff_insert": "false",
- "bottom_standoff_insert_dia": "4.2",
- "bottom_standoff_insert_height": "5.1",
- "bottom_standoff_pillar": "hex",
- "bottom_standoff_reverse": "false",
- "bottom_standoff_support_height": "4",
- "bottom_standoff_support_size": "10",
- "bottom_standoff_type": "countersunk",
- "case_design": "shell",
- "case_offset_bz": "4",
- "case_offset_tz": "35",
- "case_offset_x": "0",
- "case_offset_y": "0",
- "cooling": "default",
- "corner_fillet": "3",
- "edge_fillet": "0",
- "ext_bottom_front_left_adjust": "0",
- "ext_bottom_front_left_enable": "true",
- "ext_bottom_front_left_support": "front",
- "ext_bottom_front_right_adjust": "0",
- "ext_bottom_front_right_enable": "true",
- "ext_bottom_front_right_support": "front",
- "ext_bottom_rear_left_adjust": "0",
- "ext_bottom_rear_left_enable": "true",
- "ext_bottom_rear_left_support": "rear",
- "ext_bottom_rear_right_adjust": "0",
- "ext_bottom_rear_right_enable": "true",
- "ext_bottom_rear_right_support": "rear",
- "ext_bottom_sidewall_support": "true",
- "ext_bottom_standoff_diameter": "5.75",
- "ext_bottom_standoff_hole_size": "3.4",
- "ext_bottom_standoff_insert": "false",
- "ext_bottom_standoff_insert_dia": "4.2",
- "ext_bottom_standoff_insert_height": "5.1",
- "ext_bottom_standoff_pillar": "hex",
- "ext_bottom_standoff_reverse": "false",
- "ext_bottom_standoff_support_height": "4",
- "ext_bottom_standoff_support_size": "10",
- "ext_bottom_standoff_type": "countersunk",
- "ext_bottom_standoffs": "true",
- "ext_top_front_left_adjust": "0",
- "ext_top_front_left_enable": "true",
- "ext_top_front_left_support": "front",
- "ext_top_front_right_adjust": "0",
- "ext_top_front_right_enable": "true",
- "ext_top_front_right_support": "front",
- "ext_top_rear_left_adjust": "0",
- "ext_top_rear_left_enable": "true",
- "ext_top_rear_left_support": "rear",
- "ext_top_rear_right_adjust": "0",
- "ext_top_rear_right_enable": "true",
- "ext_top_rear_right_support": "rear",
- "ext_top_sidewall_support": "true",
- "ext_top_standoff_diameter": "6.75",
- "ext_top_standoff_hole_size": "3.4",
- "ext_top_standoff_insert": "true",
- "ext_top_standoff_insert_dia": "4.2",
- "ext_top_standoff_insert_height": "5.1",
- "ext_top_standoff_pillar": "hex",
- "ext_top_standoff_reverse": "true",
- "ext_top_standoff_support_height": "4",
- "ext_top_standoff_support_size": "10",
- "ext_top_standoff_type": "blind",
- "ext_top_standoffs": "false",
- "fan_size": "0",
- "flat_blank_section": "false",
- "floorthick": "2",
- "gap": "2",
- "gpio_opening": "default",
- "indents": "true",
- "individual_part": "top",
- "lower_bottom": "0",
- "material_thickness": "0.5",
- "move_front": "0",
- "move_leftside": "0",
- "move_rear": "0",
- "move_rightside": "0",
- "pcb_loc_x": "0",
- "pcb_loc_y": "0",
- "pcb_loc_z": "4",
- "raise_top": "0",
- "rear_io_plate": "true",
- "sbc_bottom_standoffs": "true",
- "sbc_highlight": "false",
- "sbc_information": "false",
- "sbc_model": "mini-stx",
- "sbc_off": "false",
- "sbc_top_standoffs": "true",
- "sidethick": "1.5",
- "text_color": "Green",
- "text_font": "Nimbus Mono PS",
- "tol": "0.25",
- "top_cover_pattern": "hex_8mm",
- "top_front_left_adjust": "0",
- "top_front_left_enable": "true",
- "top_front_left_support": "front",
- "top_front_right_adjust": "0",
- "top_front_right_enable": "true",
- "top_front_right_support": "front",
- "top_rear_left_adjust": "0",
- "top_rear_left_enable": "true",
- "top_rear_left_support": "left",
- "top_rear_right_adjust": "0",
- "top_rear_right_enable": "true",
- "top_rear_right_support": "right",
- "top_sidewall_support": "true",
- "top_standoff_diameter": "6.75",
- "top_standoff_hole_size": "3.4",
- "top_standoff_insert": "true",
- "top_standoff_insert_dia": "4.2",
- "top_standoff_insert_height": "5.1",
- "top_standoff_pillar": "hex",
- "top_standoff_reverse": "true",
- "top_standoff_support_height": "4",
- "top_standoff_support_size": "10",
- "top_standoff_type": "blind",
- "uart_opening": "default",
- "view": "model",
- "wallthick": "2"
- },
"mini-itx_shell": {
"$fn": "90",
"access_panel_location": "[10, 15]",
@@ -8813,6 +8722,156 @@
"sbc_off": "false",
"sbc_top_standoffs": "true",
"sidethick": "1.5",
+ "standard_motherboard_thickness": "0",
+ "text_color": "Green",
+ "text_font": "Nimbus Mono PS",
+ "tol": "0.25",
+ "top_cover_pattern": "hex_8mm",
+ "top_front_left_adjust": "0",
+ "top_front_left_enable": "true",
+ "top_front_left_support": "front",
+ "top_front_right_adjust": "0",
+ "top_front_right_enable": "true",
+ "top_front_right_support": "front",
+ "top_rear_left_adjust": "0",
+ "top_rear_left_enable": "true",
+ "top_rear_left_support": "left",
+ "top_rear_right_adjust": "0",
+ "top_rear_right_enable": "true",
+ "top_rear_right_support": "right",
+ "top_sidewall_support": "true",
+ "top_standoff_diameter": "6.75",
+ "top_standoff_hole_size": "3.4",
+ "top_standoff_insert": "true",
+ "top_standoff_insert_dia": "4.2",
+ "top_standoff_insert_height": "5.1",
+ "top_standoff_pillar": "hex",
+ "top_standoff_reverse": "true",
+ "top_standoff_support_height": "4",
+ "top_standoff_support_size": "10",
+ "top_standoff_type": "blind",
+ "uart_opening": "default",
+ "view": "model",
+ "wallthick": "2"
+ },
+ "mini-stx_shell": {
+ "$fn": "90",
+ "access_panel_location": "[10, 15]",
+ "access_panel_orientation": "landscape",
+ "access_panel_rotation": "0",
+ "access_panel_size": "[70, 30]",
+ "accessory_highlight": "false",
+ "accessory_name": "none",
+ "adj": "0.01",
+ "bend_allowance": "1",
+ "bottom_access_panel_enable": "false",
+ "bottom_clearence": "3.5",
+ "bottom_cover_pattern": "linear_horizontal",
+ "bottom_front_left_adjust": "0",
+ "bottom_front_left_enable": "true",
+ "bottom_front_left_support": "front",
+ "bottom_front_right_adjust": "0",
+ "bottom_front_right_enable": "true",
+ "bottom_front_right_support": "front",
+ "bottom_rear_left_adjust": "0",
+ "bottom_rear_left_enable": "true",
+ "bottom_rear_left_support": "rear",
+ "bottom_rear_right_adjust": "0",
+ "bottom_rear_right_enable": "true",
+ "bottom_rear_right_support": "rear",
+ "bottom_sidewall_support": "false",
+ "bottom_standoff_diameter": "5.75",
+ "bottom_standoff_hole_size": "3.4",
+ "bottom_standoff_insert": "false",
+ "bottom_standoff_insert_dia": "4.2",
+ "bottom_standoff_insert_height": "5.1",
+ "bottom_standoff_pillar": "hex",
+ "bottom_standoff_reverse": "false",
+ "bottom_standoff_support_height": "4",
+ "bottom_standoff_support_size": "10",
+ "bottom_standoff_type": "countersunk",
+ "case_design": "shell",
+ "case_offset_bz": "4",
+ "case_offset_tz": "35",
+ "case_offset_x": "0",
+ "case_offset_y": "0",
+ "cooling": "default",
+ "corner_fillet": "3",
+ "edge_fillet": "0",
+ "ext_bottom_front_left_adjust": "0",
+ "ext_bottom_front_left_enable": "true",
+ "ext_bottom_front_left_support": "front",
+ "ext_bottom_front_right_adjust": "0",
+ "ext_bottom_front_right_enable": "true",
+ "ext_bottom_front_right_support": "front",
+ "ext_bottom_rear_left_adjust": "0",
+ "ext_bottom_rear_left_enable": "true",
+ "ext_bottom_rear_left_support": "rear",
+ "ext_bottom_rear_right_adjust": "0",
+ "ext_bottom_rear_right_enable": "true",
+ "ext_bottom_rear_right_support": "rear",
+ "ext_bottom_sidewall_support": "true",
+ "ext_bottom_standoff_diameter": "5.75",
+ "ext_bottom_standoff_hole_size": "3.4",
+ "ext_bottom_standoff_insert": "false",
+ "ext_bottom_standoff_insert_dia": "4.2",
+ "ext_bottom_standoff_insert_height": "5.1",
+ "ext_bottom_standoff_pillar": "hex",
+ "ext_bottom_standoff_reverse": "false",
+ "ext_bottom_standoff_support_height": "4",
+ "ext_bottom_standoff_support_size": "10",
+ "ext_bottom_standoff_type": "countersunk",
+ "ext_bottom_standoffs": "true",
+ "ext_top_front_left_adjust": "0",
+ "ext_top_front_left_enable": "true",
+ "ext_top_front_left_support": "front",
+ "ext_top_front_right_adjust": "0",
+ "ext_top_front_right_enable": "true",
+ "ext_top_front_right_support": "front",
+ "ext_top_rear_left_adjust": "0",
+ "ext_top_rear_left_enable": "true",
+ "ext_top_rear_left_support": "rear",
+ "ext_top_rear_right_adjust": "0",
+ "ext_top_rear_right_enable": "true",
+ "ext_top_rear_right_support": "rear",
+ "ext_top_sidewall_support": "true",
+ "ext_top_standoff_diameter": "6.75",
+ "ext_top_standoff_hole_size": "3.4",
+ "ext_top_standoff_insert": "true",
+ "ext_top_standoff_insert_dia": "4.2",
+ "ext_top_standoff_insert_height": "5.1",
+ "ext_top_standoff_pillar": "hex",
+ "ext_top_standoff_reverse": "true",
+ "ext_top_standoff_support_height": "4",
+ "ext_top_standoff_support_size": "10",
+ "ext_top_standoff_type": "blind",
+ "ext_top_standoffs": "false",
+ "fan_size": "0",
+ "flat_blank_section": "false",
+ "floorthick": "2",
+ "gap": "2",
+ "gpio_opening": "default",
+ "indents": "true",
+ "individual_part": "top",
+ "lower_bottom": "0",
+ "material_thickness": "0.5",
+ "move_front": "0",
+ "move_leftside": "0",
+ "move_rear": "0",
+ "move_rightside": "0",
+ "pcb_loc_x": "0",
+ "pcb_loc_y": "0",
+ "pcb_loc_z": "4",
+ "raise_top": "0",
+ "rear_io_plate": "true",
+ "sbc_bottom_standoffs": "true",
+ "sbc_highlight": "false",
+ "sbc_information": "false",
+ "sbc_model": "mini-stx",
+ "sbc_off": "false",
+ "sbc_top_standoffs": "true",
+ "sidethick": "1.5",
+ "standard_motherboard_thickness": "0",
"text_color": "Green",
"text_font": "Nimbus Mono PS",
"tol": "0.25",
diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad
index 40b40fa..c1d10ec 100644
--- a/sbc_case_builder.scad
+++ b/sbc_case_builder.scad
@@ -253,9 +253,11 @@ ext_bottom_front_right_adjust = 0; //[-20:.01:20]
ext_bottom_front_right_support = "front"; //[none,left,rear,front,right]
/* [Accessories and Options] */
-
+// adjustment for atx, micro-atx, dtx, flex-atx, mini-dtx, mini-itx, mini-stx, nano-itx,nuc, pico-itx PCB thickness from 2mm default//
+standard_motherboard_thickness = 0; //[-3:.01:3]
// rear io plate opening for standard form motherboards
rear_io_plate = false;
+
// case accessory group to load
accessory_name = "none"; // ["none", "hk_uart", "sensors", "c4_shell_boombox", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_panel_lcd3.5", "c4_tray_boombox", "c4_round", "c4_hex", "xu4_keyhole", "hc4_tray_drivebox2.5", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "m1s_shell_nvme", "m1s_shell_ups", "m1s_tray_nvme", "m1_tray_ssd", "m1_fitted_drivebox2.5", "m1_fitted_drivebox3.5", "m1_fitted_pizzabox", "m1_fitted_drivebox3.5v", "h3_shell", "h3_tallboy-ssd", "h3_shell_router", "h3_shell_router-ssd", "h3_lowboy", "h3_lowboy_router", "h3_tray_router", "h3_router_station", "h3_ultimate", "h3_ultimate2", "h3_shell_drivebox2.5v", "show2_shell", "jetsonnano_shell", "jetsonnano_panel", "jetsonnano_stacked", "jetsonnano_tray", "jetsonnano_tray_sides", "rock5b", "visionfive2_shell", "visionfive2_stacked", "visionfive2_tray",adapter_mini-stx_m1s]
@@ -269,12 +271,13 @@ s = search([sbc_model],sbc_data);
pcb_id = sbc_data[s[0]][4];
pcb_width = sbc_data[s[0]][10][0];
pcb_depth = sbc_data[s[0]][10][1];
-pcb_z = sbc_data[s[0]][10][2];
+pcb_z_orig = sbc_data[s[0]][10][2];
pcb_tmaxz = sbc_data[s[0]][11][5];
pcb_bmaxz = sbc_data[s[0]][11][6];
pcb_color = sbc_data[s[0]][11][1];
pcb_radius = sbc_data[s[0]][11][0];
+pcb_z = sbc_model == "atx" || sbc_model == "micro-atx" || sbc_model == "dtx" || sbc_model == "flex-atx" || sbc_model == "mini-dtx" || sbc_model == "mini-itx" || sbc_model == "mini-stx" || sbc_model == "nano-itx" || sbc_model == "nuc" || sbc_model == "pico-itx" ? pcb_z_orig + standard_motherboard_thickness : pcb_z_orig;
width = pcb_width+2*(wallthick+gap)+case_offset_x;
depth = pcb_depth+2*(wallthick+gap)+case_offset_y;
top_height = pcb_tmaxz+floorthick+case_offset_tz;
@@ -426,10 +429,10 @@ if (view == "platter") {
data_4 = accessory_data[a[0]][i+9][3];
mask = accessory_data[a[0]][i+10];
- if (class == "platter" && type != "button_top") {
+ if (class == "platter" && type != "button_assembly") {
add(type, loc_x, loc_y, loc_z, face, rotation, [size_x, size_y, size_z], [data_1, data_2, data_3, data_4], mask);
}
- if (class == "platter" && type == "button_top") {
+ if (class == "platter" && type == "button_assembly") {
translate([loc_x,loc_y,loc_z+1.25]) rotate([-90,0,0]) button_plunger(data_1, size_x, size_z);
translate([loc_x-20,loc_y-10,loc_z+3]) rotate([0,0,0]) button_top(data_1, size_x, size_z);
translate([loc_x-20,loc_y-20,loc_z]) rotate([0,0,0]) button_clip(data_1);
@@ -885,10 +888,10 @@ if (view == "part") {
data_4 = accessory_data[a[0]][i+9][3];
mask = accessory_data[a[0]][i+10];
- if (class == "platter" && type != "button_top") {
+ if (class == "platter" && type != "button_assembly") {
add(type, loc_x, loc_y, loc_z, face, rotation, [size_x, size_y, size_z], [data_1, data_2, data_3, data_4], mask);
}
- if (class == "platter" && type == "button_top") {
+ if (class == "platter" && type == "button_assembly") {
translate([loc_x,loc_y,loc_z+1.25]) rotate([-90,0,0]) button_plunger(data_1, size_x, size_z);
translate([loc_x-20,loc_y-10,loc_z+3]) rotate([0,0,0]) button_top(data_1, size_x, size_z);
translate([loc_x-20,loc_y-20,loc_z]) rotate([0,0,0]) button_clip(data_1);
diff --git a/sbc_case_builder_accessories.cfg b/sbc_case_builder_accessories.cfg
index 919fb47..29c64c4 100644
--- a/sbc_case_builder_accessories.cfg
+++ b/sbc_case_builder_accessories.cfg
@@ -29,37 +29,48 @@
classes: add1, sub, suball, add2, model, platter
- 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_panel,button,pcb_holder,boom_grill,boom_speaker_holder
- 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: hk_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: hk_uart_strap,fan_cover,button_top,boom_vring
+ types for additive: access_cover,access_panel,art,batt_holder,button,button_assembly,fan_cover,feet,hd_holder,
+ hk_boom_grill,hk_boom_speaker_holder,hk_boom_vring,hk_h3_port_extender_holder,hk_hc4_oled_holder,hk_uart_holder,
+ hk_uart_strap,keyhole,nut_holder,pcb_holder,rectangle,round,slot,sphere,standoff,text,vent_panel_hex
+ types for subtractive: art,fan_mask,hd_holes,knockout,rectangle,round,slot,sphere,text,vent,vent_hex
+ types for model: adafruit_lcd,dsub,fan,hd25,hd35,hk_boom,hk_boom_speaker,hk_h3_port_extender,hk_hc4_oled,hk_lcd35,hk_m1s_ups,hk_netcard,
+ hk_pwr_button,hk_speaker,hk_uart,hk_vu7c,hk_vu8m,hk_vu8s,hk_wb2,hk_xu4_shifter_shield,stl_model
+ types for platter: access_cover,button_assembly,fan_cover,feet,hk_boom_speaker_holder,hk_boom_vring,hk_h3_port_extender_holder,hk_uart_strap,vent_panel_hex
- standoff[ 6.75, // diameter
- 0, // height (not used)
- 2.5, // holesize
- 10, // supportsize
- 4, // supportheight
- 4, // 0=none, 1=countersink, 2=recessed hole, 3=nut holder, 4=blind hole
- 0, // standoff style 0=hex, 1=cylinder
- 1, // enable reverse standoff
- 0, // enable insert at top of standoff
- 4.5, // insert hole dia. mm
- 5.1] // insert depth mm
+ stand_off[radius, height, holesize, supportsize, supportheight, sink, pillarstyle,
+ pillarsupport, reverse, insert_e, i_dia, i_depth], mask)
- p
- a
- r
- r a s
- o m e
- t e s s s l t m
- c l l l a t i i i e s
- l t o o o f t r z z z d m n b t
- a y c c c a i i e e e a a g a y
- s p c o c t s t c l
- s, e, x, y, z, e, n, s, x,y,z, a, k h k e
+ radius = pillar radius
+ height = total height
+ holesize = hole diameter
+ supportsize = support size for sink
+ supportheight = height of support for sink
+ sink = none, countersunk, recessed, nut holder, blind
+ pillarstyle = hex, round
+ pillarsupport = none, left, rear, front, right
+ reverse = true or false
+ insert_e = true or false
+ i_dia = insert diameter
+ i_depth = insert hole depth
- "sub","fan",10,10,24.5,"top",[0,0,0],["sbc-case_z",true,true,true],[40,0,6],[0],[true,10,2,"default"],
+ mask[0] = enablemask
+ mask[1] = mlength
+ mask[2] = msetback
+ mask[3] = mstyle
+
+ p
+ a
+ r
+ r a s
+ o m e
+ t e s s s l t m
+ c l l l a t i i i e s
+ l t o o o f t r z z z d m n b t
+ a y c c c a i i e e e a a g a y
+ s p c o c t s t c l
+ s, e, x, y, z, e, n, s, x,y,z, a, k h k e
+
+ "sub","fan_mask",10,10,24.5,"top",[0,0,0],["sbc-case_z",true,true,true],[40,0,6],[0],[true,10,2,"default"],
*/
@@ -95,17 +106,17 @@ accessory_data = [
// Odroid-C4
["c4_shell_boombox",
"add2","pcb_holder",.75,51.1,1.99,"bottom",[0,0,0],["case",false,true,false],[123.5,35,1.6],[2],[false,10,2,"default"],
- "add2","boom_grill",16.5,60.5,22.5,"top",[90,0,180],["case",false,true,false],[0,0,0],["dome"],[false,10,2,"default"],
- "add2","boom_grill",108,60.5,22.5,"top",[90,0,180],["case",false,true,false],[0,0,0],["dome"],[false,10,2,"default"],
+ "add2","hk_boom_grill",16.5,60.5,22.5,"top",[90,0,180],["case",false,true,false],[0,0,0],["dome"],[false,10,2,"default"],
+ "add2","hk_boom_grill",108,60.5,22.5,"top",[90,0,180],["case",false,true,false],[0,0,0],["dome"],[false,10,2,"default"],
"sub","vent",44,60,17,"top",[0,0,0],["case",false,true,false],[2,10,4],[1,10,"vertical",1],[false,10,2,"default"],
"add2","hk_uart_holder",10,-1.5,5,"bottom",[0,0,0],["case",false,false,false],[10,10,0],[0],[true,10,2,"default"],
"model","hk_uart",12.5,20.5,8,"bottom",[0,0,270],["case",false,false,false],[10,10,0],[0],[false,10,2,"default"],
"model","hk_uart_strap",25.5,15,8,"bottom",[0,0,90],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"],
"model","hk_boom",32.25,53,5,"bottom",[90,0,0],["case",false,true,false],[0,0,0],[true,"front"],[true,10,2,"default"],
- "model","boom_vring",76.75,49.5,31,"bottom",[90,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"],
+ "model","hk_boom_vring",76.75,49.5,31,"bottom",[90,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"],
"platter","hk_uart_strap",-35,75,-9,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"],
- "platter","boom_vring",-60,100,0,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"]],
+ "platter","hk_boom_vring",-60,100,0,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"]],
["c4_desktop_lcd3.5",
"add2","button",89.875,45,27,"top",[0,0,180],["sbc-case_z",false,false,true],[12,8,2],["cutout",[2,2,2,2],2.25],[true,10,2,"default"],
@@ -130,16 +141,16 @@ accessory_data = [
"add2","button",89.875,23,27,"top",[0,0,180],["sbc-case_z",false,false,true],[12,8,2],["cutout",[2,2,2,2],2.25],[true,10,2,"default"],
"add2","button",89.875,12,27,"top",[0,0,180],["sbc-case_z",false,false,true],[12,8,2],["cutout",[2,2,2,2],2.25],[true,10,2,"default"],
"add2","pcb_holder",.75,66.1,1.99,"bottom",[0,0,0],["case",false,false,false],[123.5,35,1.6],[2],[false,10,2,"default"],
- "add2","boom_grill",16.5,72.5,21.5,"front",[90,0,180],["case",false,false,false],[0,0,2],["flat"],[false,10,2,"default"],
- "add2","boom_grill",108,72.5,21.5,"front",[90,0,180],["case",false,false,false],[0,0,2],["flat"],[false,10,2,"default"],
+ "add2","hk_boom_grill",16.5,72.5,21.5,"front",[90,0,180],["case",false,false,false],[0,0,2],["flat"],[false,10,2,"default"],
+ "add2","hk_boom_grill",108,72.5,21.5,"front",[90,0,180],["case",false,false,false],[0,0,2],["flat"],[false,10,2,"default"],
"add2","hk_uart_holder",10,0,1.9,"bottom",[0,0,0],["case",false,false,false],[10,10,0],[0],[true,10,2,"default"],
"model","hk_uart",12.5,22,5,"bottom",[0,0,270],["case",false,false,false],[10,10,0],[0],[false,10,2,"default"],
"model","hk_uart_strap",25,15,5,"bottom",[0,0,90],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"],
"model","hk_boom",32.25,68,4,"bottom",[90,0,0],["case",false,false,false],[0,0,0],[true,"front"],[true,10,2,"default"],
- "model","boom_vring",76.75,64.5,31,"bottom",[90,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"],
+ "model","hk_boom_vring",76.75,64.5,31,"bottom",[90,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"],
"model","hk_lcd35",95,56,31,"bottom",[0,0,180],["case",false,false,false],[0,0,0],[0],[true,10,2,"default"],
"platter","hk_uart_strap",-35,75,-9,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"],
- "platter","boom_vring",-60,100,0,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"]],
+ "platter","hk_boom_vring",-60,100,0,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"]],
["c4_panel_boombox",
"sub","vent",-3,22,13,"left",[0,0,90],["case",false,false,false],[2,10,5],[1,8,"vertical",1],[false,10,2,"default"],
@@ -147,12 +158,12 @@ accessory_data = [
"add2","hk_uart_holder",10,0,1.9,"bottom",[0,0,0],["case",false,false,false],[10,10,0],[0],[true,10,2,"default"],
"model","hk_uart",12.5,22,5,"bottom",[0,0,270],["case",false,false,false],[10,10,0],[0],[false,10,2,"default"],
"model","hk_uart_strap",25,15,5,"bottom",[0,0,90],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"],
- "add2","boom_grill",16.5,57.5,21.5,"front",[90,0,180],["case",false,true,false],[0,0,2],["flat"],[false,10,2,"default"],
- "add2","boom_grill",108,57.5,21.5,"front",[90,0,180],["case",false,true,false],[0,0,2],["flat"],[false,10,2,"default"],
+ "add2","hk_boom_grill",16.5,57.5,21.5,"front",[90,0,180],["case",false,true,false],[0,0,2],["flat"],[false,10,2,"default"],
+ "add2","hk_boom_grill",108,57.5,21.5,"front",[90,0,180],["case",false,true,false],[0,0,2],["flat"],[false,10,2,"default"],
"model","hk_boom",32.25,53,4,"bottom",[90,0,0],["case",false,true,false],[0,0,0],[true,"front"],[true,10,2,"default"],
- "model","boom_vring",76.75,49.5,31,"bottom",[90,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"],
+ "model","hk_boom_vring",76.75,49.5,31,"bottom",[90,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"],
"platter","hk_uart_strap",-35,75,-9,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"],
- "platter","boom_vring",-60,100,0,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"]],
+ "platter","hk_boom_vring",-60,100,0,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"]],
["c4_panel_lcd3.5",
"add2","button",89.875,45,27,"top",[0,0,180],["sbc-case_z",false,false,true],[12,8,2],["cutout",[2,2,2,2],2.25],[true,10,2,"default"],
@@ -166,15 +177,15 @@ accessory_data = [
"sub","vent",44,59,12,"bottom",[0,0,0],["case",false,true,false],[2,10,4],[1,10,"vertical",1],[false,10,2,"default"],
"add2","standoff",28.5,3.5,0,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[[5.75,16,3.6,10,4,"countersunk","hex",false,false,4.5,5.1]],[true,10,2,"default"],
"add2","standoff",28.5,56.25,0,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[[5.75,16,3.6,10,4,"countersunk","hex",false,false,4.5,5.1]],[true,10,2,"default"],
- "add2","boom_speaker_holder",16.75,54.6,17.5,"bottom",[90,0,180],["case",false,true,false],[0,0,0],["friction",0],[false,10,2,"default"],
- "add2","boom_speaker_holder",108.25,54.6,17.5,"bottom",[90,0,180],["case",false,true,false],[0,0,0],["friction",0],[false,10,2,"default"],
- "add2","boom_grill",16.75,59,17.5,"bottom",[90,0,180],["case",false,true,false],[0,0,0],["dome"],[false,10,2,"default"],
- "add2","boom_grill",108.25,59,17.5,"bottom",[90,0,180],["case",false,true,false],[0,0,0],["dome"],[false,10,2,"default"],
- "model","boom_speaker",16.75,56,17.5,"bottom",[270,0,0],["case",false,true,false],[0,0,0],[false,"left"],[false,10,2,"default"],
- "model","boom_speaker",108.25,56,17.5,"bottom",[270,0,0],["case",false,true,false],[0,0,0],[false,"right"],[false,10,2,"default"],
+ "add2","hk_boom_speaker_holder",16.75,54.6,17.5,"bottom",[90,0,180],["case",false,true,false],[0,0,0],["friction",0],[false,10,2,"default"],
+ "add2","hk_boom_speaker_holder",108.25,54.6,17.5,"bottom",[90,0,180],["case",false,true,false],[0,0,0],["friction",0],[false,10,2,"default"],
+ "add2","hk_boom_grill",16.75,59,17.5,"bottom",[90,0,180],["case",false,true,false],[0,0,0],["dome"],[false,10,2,"default"],
+ "add2","hk_boom_grill",108.25,59,17.5,"bottom",[90,0,180],["case",false,true,false],[0,0,0],["dome"],[false,10,2,"default"],
+ "model","hk_boom_speaker",16.75,56,17.5,"bottom",[270,0,0],["case",false,true,false],[0,0,0],[false,"left"],[false,10,2,"default"],
+ "model","hk_boom_speaker",108.25,56,17.5,"bottom",[270,0,0],["case",false,true,false],[0,0,0],[false,"right"],[false,10,2,"default"],
"model","hk_boom",32,0,16,"bottom",[0,0,90],["case",false,false,false],[0,0,0],[false,"none"],[true,10,2,"pcb"],
- "model","boom_vring",5,44.5,20,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"],
- "platter","boom_vring",-50,0,0,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"]],
+ "model","hk_boom_vring",5,44.5,20,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"],
+ "platter","hk_boom_vring",-50,0,0,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[0],[false,10,2,"default"]],
["c4_round",
"suball","round",10.5,-2,14.5,"top",[90,0,0],["case",false,false,false],[11,0,18],[0],[false,10,2,"default"],
@@ -190,71 +201,71 @@ accessory_data = [
// Odroid-HC4
["hc4_tray_drivebox2.5",
- "add1","hc4_oled_holder",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,2],[0],[true,10,2,"default"],
+ "add1","hk_hc4_oled_holder",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,2],[0],[true,10,2,"default"],
"add2","hd_holder",10,-24,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"],
- "sub","hd_holes",10,-24,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,3,"portrait"],[false,10,2,"default"],
+ "sub","hd_holes",10,-24,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","horizontal","none",3],[false,10,2,"default"],
"sub","round",92,-10,5,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
"sub","round",92,66.6,5,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
"sub","round",92,-10,23,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
"sub","round",92,66.6,23,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
- "suball","fan",37,-.1,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],[0],[false,10,2,"default"],
+ "suball","fan_mask",37,-.1,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_open"],[false,10,2,"default"],
"suball","vent",72,87,27,"bottom",[0,0,0],["case",false,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"],
- "model","hc4_oled",20,81,2,"bottom",[0,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"],
+ "model","hk_hc4_oled",20,81,2,"bottom",[0,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"],
"model","hd25",10,76,2,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"],
"model","hd25",10,76,20,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"],
- "model","fan_cover",37,-4,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],[1],[false,10,2,"default"],
- "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],[1],[false,10,2,"default"]],
+ "model","fan_cover",37,-4,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_1"],[false,10,2,"default"],
+ "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_1"],[false,10,2,"default"]],
["hc4_shell_drivebox2.5",
- "add2","hc4_oled_holder",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,2],[0],[true,10,2,"default"],
+ "add2","hk_hc4_oled_holder",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,2],[0],[true,10,2,"default"],
"add2","hd_holder",10,-21,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"],
- "sub","hd_holes",10,-21,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,3,"portrait"],[false,10,2,"default"],
+ "sub","hd_holes",10,-21,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","horizontal","none",3],[false,10,2,"default"],
"sub","round",92,-5,5,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
"sub","round",92,69.6,5,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
"sub","round",92,-5,23,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
"sub","round",92,69.6,23,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
"sub","vent",71.85,88,30,"top",[0,0,0],["case",false,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"],
- "suball","fan",39,-.1,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],[0],[false,10,2,"default"],
+ "suball","fan_mask",39,-.1,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_open"],[false,10,2,"default"],
"sub","vent",-3.5,35,34,"top",[0,0,90],["case",false,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"sub","vent",92,35,34,"top",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"sub","vent",-3.5,35,9,"bottom",[0,0,90],["case",false,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"sub","vent",92,35,9,"bottom",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
- "model","hc4_oled",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"],
+ "model","hk_hc4_oled",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"],
"model","hd25",10,79,2,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"],
"model","hd25",10,79,20,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"],
- "model","fan_cover",39,-4,7,"top",[90,0,0],["case",true,false,false],[40,0,3],[1],[false,10,2,"default"],
- "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],[1],[false,10,2,"default"]],
+ "model","fan_cover",39,-4,7,"top",[90,0,0],["case",true,false,false],[40,0,3],["fan_1"],[false,10,2,"default"],
+ "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_1"],[false,10,2,"default"]],
["hc4_shell_drivebox2.5v",
- "add2","hd_vertright",45.6,-21,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"],
- "add2","hd_vertleft",79.6,-21,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"],
- "sub","hd_vertright_holes",45.6,-21,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,2,"portrait"],[false,10,2,"default"],
- "sub","hd_vertleft_holes",79.6,-21,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,2,"portrait"],[false,10,2,"default"],
+ "add2","hd_holder",45.6,-21,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","right"],[false,10,2,"default"],
+ "add2","hd_holder",79.6,-21,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"],
+ "sub","hd_holes",45.6,-21,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","right",3],[false,10,2,"default"],
+ "sub","hd_holes",79.6,-21,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"],
"sub","round",91.3,-5,6.07,"bottom",[0,90,0],["case",true,true,false],[3,0,6],[0],[false,10,2,"default"],
"sub","round",91.3,71.6,6.07,"bottom",[0,90,0],["case",true,true,false],[3,0,6],[0],[false,10,2,"default"],
"sub","vent",71.85,88,30,"top",[0,0,0],["case",false,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"],
- "sub","fan",45.6,-.1,30,"top",[90,0,0],["case",true,false,false],[40,0,3],[0],[false,10,2,"default"],
- "add1","hc4_oled_holder",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,2],[0],[true,10,2,"default"],
- "model","hc4_oled",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"],
- "model","fan_cover",46.6,-3,30,"top",[90,0,0],["case",true,false,false],[40,0,3],[1],[false,10,2,"default"],
+ "sub","fan_mask",45.6,-.1,30,"top",[90,0,0],["case",true,false,false],[40,0,3],["fan_open"],[false,10,2,"default"],
+ "add1","hk_hc4_oled_holder",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,2],[0],[true,10,2,"default"],
+ "model","hk_hc4_oled",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"],
+ "model","fan_cover",46.6,-3,30,"top",[90,0,0],["case",true,false,false],[40,0,3],["fan_1"],[false,10,2,"default"],
"model","hd25",45.6,79,71.85,"bottom",[-90,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"],
"model","hd25",79.3,79,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"],
- "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],[1],[false,10,2,"default"]],
+ "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_1"],[false,10,2,"default"]],
["hc4_shell_drivebox3.5",
- "add1","hc4_oled_holder",20,82,3,"bottom",[0,0,0],["case",false,true,false],[0,0,3],[0],[true,10,2,"default"],
+ "add1","hk_hc4_oled_holder",20,82,3,"bottom",[0,0,0],["case",false,true,false],[0,0,3],[0],[true,10,2,"default"],
"add2","hd_holder",-19.4,-67,3,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait"],[false,10,2,"default"],
- "sub","hd_holes",-19.4,-67,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,3,"portrait"],[false,10,2,"default"],
+ "sub","hd_holes",-19.4,-67,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","horizontal","none",3],[false,10,2,"default"],
"sub","round",91.6,-38.5,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"],
"sub","round",91.6,3.4,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"],
"sub","round",91.6,63.1,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"],
"suball","vent",72,88,29,"bottom",[0,0,0],["case",false,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"],
- "suball","fan",5.6,-1.5,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],[0],[false,10,2,"default"],
- "model","hc4_oled",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"],
+ "suball","fan_mask",5.6,-1.5,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_open"],[false,10,2,"default"],
+ "model","hk_hc4_oled",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"],
"model","hd35",-19.4,80,3,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[0],[false,10,2,"default"],
"model","hd35",-19.4,80,35,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[0],[false,10,2,"default"],
- "model","fan_cover",5.6,-4,7,"top",[90,0,0],["case",true,false,false],[40,0,3],[1],[false,10,2,"default"],
- "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],[1],[false,10,2,"default"]],
+ "model","fan_cover",5.6,-4,7,"top",[90,0,0],["case",true,false,false],[40,0,3],["fan_1"],[false,10,2,"default"],
+ "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_1"],[false,10,2,"default"]],
// Odroid-M1S
["m1s_shell_nvme",
@@ -275,8 +286,8 @@ accessory_data = [
"add2","standoff",2.5,119,0,"bottom",[0,0,0],["sbc",false,false,false],[0,0,0],[[5.75,5,3.6,10,4,"countersunk","hex",false,false,4.5,5.1]],[true,10,2,"default"],
"add2","standoff",27.5,119,0,"bottom",[0,0,0],["sbc",false,false,false],[0,0,0],[[5.75,5,3.6,10,4,"countersunk","hex",false,false,4.5,5.1]],[true,10,2,"default"],
"add2","button",2,33.5,21.2,"top",[0,0,0],["sbc-case_z",false,false,true],[10,0,23.5],["recess"],[true,10,2,"default"],
- "model","button_top",2,33.5,21.2,"top",[0,0,0],["sbc-case_z",false,false,true],[10,0,23.5],["recess"],[false,10,2,"default"],
- "platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,23.5],["recess"],[false,10,2,"default"],
+ "model","button_assembly",2,33.5,21.2,"top",[0,0,0],["sbc-case_z",false,false,true],[10,0,23.5],["recess"],[false,10,2,"default"],
+ "platter","button_assembly",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,23.5],["recess"],[false,10,2,"default"],
"sub","rectangle",73.5,5.5,2.5,"top",[0,0,45],["sbc",true,true,true],[11,3,15],[[1,1,1,1]],[false,10,2,"default"],
"sub","rectangle",5.5,56,2.5,"top",[0,0,0],["sbc",true,true,true],[3,11,15],[[1,1,1,1]],[false,10,2,"default"],
"sub","rectangle",81.5,56,2.5,"top",[0,0,0],["sbc",true,true,true],[3,11,15],[[1,1,1,1]],[false,10,2,"default"],
@@ -294,33 +305,33 @@ accessory_data = [
// Odroid-M1
["m1_tray_ssd",
// "add2","button",60,118.5,37.7,"top",[0,0,0],["sbc-case_z",false,false,true],[10,0,18.5],["recess"],[true,10,2,"default"],
-// "model","button_top",60,118.5,37.7,"top",[0,0,0],["sbc-case_z",false,false,true],[10,0,18.5],["recess"],[false,10,2,"default"],
-// "platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,11],["recess"],[false,10,2,"default"],
- "sub","hd_holes",10,22,35,"top",[0,0,0],["sbc-case_z",true,true,true],[0,0,0],[2.5,3,"portrait"],[false,10,2,"default"],
+// "model","button_assembly",60,118.5,37.7,"top",[0,0,0],["sbc-case_z",false,false,true],[10,0,18.5],["recess"],[false,10,2,"default"],
+// "platter","button_assembly",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,11],["recess"],[false,10,2,"default"],
+ "sub","hd_holes",10,22,35,"top",[0,0,0],["sbc-case_z",true,true,true],[0,0,0],[2.5,"portrait","horizontal","none",3],[false,10,2,"default"],
"model","hd25",80,122,35.5,"top",[0,180,90],["sbc-case_z",true,true,true],[0,0,0],[7],[false,10,2,"default"],
"sub","vent",94.5,32,10,"top",[0,0,90],["case",true,false,false],[2,15,4],[1,17,"vertical",1],[false,10,2,"default"],
"sub","vent",-6.5,32,10,"top",[0,0,90],["case",false,false,false],[2,15,4],[1,17,"vertical",1],[false,10,2,"default"]],
["m1_fitted_drivebox2.5",
"add2","hd_holder",10,20,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"],
- "sub","hd_holes",10,20,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,3,"portrait"],[false,10,2,"default"],
+ "sub","hd_holes",10,20,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","horizontal","none",3],[false,10,2,"default"],
"sub","round",92,34,5,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
"sub","round",92,110.6,5,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
"sub","round",92,34,23,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
"sub","round",92,110.6,23,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
- "suball","fan",39,-1,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],[0],[false,10,2,"default"],
+ "suball","fan_mask",39,-1,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_open"],[false,10,2,"default"],
"sub","vent",-3.75,25,30,"bottom",[0,0,90],["case",false,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"sub","vent",92,25,30,"bottom",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"sub","vent",-3.75,25,9,"bottom",[0,0,90],["case",false,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"sub","vent",92,25,9,"bottom",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"model","hd25",10,120,2,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"],
"model","hd25",10,120,20,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"],
- "model","fan_cover",39,-4,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],[3],[false,10,2,"default"],
- "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],[2],[false,10,2,"default"]],
+ "model","fan_cover",39,-4,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_hex"],[false,10,2,"default"],
+ "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_hex"],[false,10,2,"default"]],
["m1_fitted_drivebox3.5",
"add2","hd_holder",-19.4,-27,2.49,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait"],[false,10,2,"default"],
- "sub","hd_holes",-19.4,-27,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,3,"portrait"],[false,10,2,"default"],
+ "sub","hd_holes",-19.4,-27,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","horizontal","none",3],[false,10,2,"default"],
"sub","round",91.6,1.5,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"],
"sub","round",91.6,43.4,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"],
"sub","round",91.6,103.1,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"],
@@ -329,26 +340,26 @@ accessory_data = [
"sub","vent",-3.75,60,20,"bottom",[0,0,90],["case",false,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"sub","vent",92,60,20,"bottom",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"suball","vent",29,126,29,"bottom",[0,0,0],["case",false,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"],
- "suball","fan",5.6,-1.5,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],[0],[false,10,2,"default"],
+ "suball","fan_mask",5.6,-1.5,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_open"],[false,10,2,"default"],
"model","hd35",-19.4,120,2.49,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[0],[false,10,2,"default"],
"model","hd35",-19.4,120,34.5,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[0],[false,10,2,"default"],
- "model","fan_cover",5.6,-4,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],[3],[false,10,2,"default"],
- "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],[2],[false,10,2,"default"]],
+ "model","fan_cover",5.6,-4,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_hex"],[false,10,2,"default"],
+ "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_hex"],[false,10,2,"default"]],
["m1_fitted_pizzabox",
- "sub","hd_holes",-12,-27,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,3,"portrait"],[false,10,2,"default"],
+ "sub","hd_holes",-12,-27,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","horizontal","none",3],[false,10,2,"default"],
"sub","round",91.6,1.5,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"],
"sub","round",91.6,43.4,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"],
"sub","round",91.6,103.1,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"],
"sub","vent",-3.75,60,9,"bottom",[0,0,90],["case",false,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"sub","vent",92,60,9,"bottom",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"suball","vent",-89,126,15,"bottom",[0,0,0],["case",true,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"],
- "suball","fan",-30,60,48,"top",[0,0,0],["case",true,false,false],[80,0,3],[0],[false,10,2,"default"],
+ "suball","fan_mask",-30,60,48,"top",[0,0,0],["case",true,false,false],[80,0,3],["fan_open"],[false,10,2,"default"],
"model","hd35",-12,120,2.5,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[0],[false,10,2,"default"]],
["m1_fitted_drivebox3.5v",
- "add2","hd_vertleft",80,-27,2.49,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait"],[false,10,2,"default"],
- "sub","hd_vertleft_holes",80,-27,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait"],[false,10,2,"default"],
+ "add2","hd_holder",80,-27,2.49,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","vertical","left"],[false,10,2,"default"],
+ "sub","hd_holes",80,-27,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","vertical","left",3],[false,10,2,"default"],
"sub","round",91.6,14.5,6,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"],
"sub","round",91.6,58.55,6,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"],
"sub","round",91.6,90.1,6,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"],
@@ -357,10 +368,10 @@ accessory_data = [
"sub","vent",-3.75,60,20,"bottom",[0,0,90],["case",false,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"sub","vent",92,60,20,"bottom",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"suball","vent",29,126,29,"bottom",[0,0,0],["case",false,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"],
- "suball","fan",5.6,-1.5,35,"bottom",[90,0,0],["case",true,false,false],[60,0,3],[0],[false,10,2,"default"],
+ "suball","fan_mask",5.6,-1.5,35,"bottom",[90,0,0],["case",true,false,false],[60,0,3],["fan_open"],[false,10,2,"default"],
"model","hd35",80,120,2.5,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],[0],[false,10,2,"default"],
- "model","fan_cover",5.6,-4,35,"bottom",[90,0,0],["case",true,false,false],[60,0,3],[3],[false,10,2,"default"],
- "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[60,0,3],[3],[false,10,2,"default"]],
+ "model","fan_cover",5.6,-4,35,"bottom",[90,0,0],["case",true,false,false],[60,0,3],["fan_hex"],[false,10,2,"default"],
+ "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[60,0,3],["fan_hex"],[false,10,2,"default"]],
// Odroid-H3
["h3_shell",
@@ -371,10 +382,10 @@ accessory_data = [
"add2","batt_holder",98,40,55.25,"top",[180,0,-18],["sbc-case_z",true,true,true],[10,10,0],[0],[false,10,2,"default"],
"add2","button",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[true,10,2,"default"],
"add2","button",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[true,10,2,"default"],
- "model","button_top",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[false,10,2,"default"],
- "model","button_top",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[false,10,2,"default"],
- "platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,32],["recess"],[false,10,2,"default"],
- "platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,32],["recess"],[false,10,2,"default"]],
+ "model","button_assembly",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[false,10,2,"default"],
+ "model","button_assembly",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[false,10,2,"default"],
+ "platter","button_assembly",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,32],["recess"],[false,10,2,"default"],
+ "platter","button_assembly",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,32],["recess"],[false,10,2,"default"]],
["h3_tallboy-ssd",
"sub","vent",-3.5,30,58,"top",[0,0,90],["case",false,false,false],[2,12,4],[1,17,"vertical",1],[false,10,2,"default"],
@@ -385,14 +396,14 @@ accessory_data = [
"sub","vent",111.5,30,4,"bottom",[0,0,90],["case",true,false,false],[2,6,4],[1,17,"vertical",1],[false,10,2,"default"],
"add2","button",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,53],["recess"],[true,10,2,"default"],
"add2","button",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,53],["recess"],[true,10,2,"default"],
- "model","button_top",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,58],["recess"],[false,10,2,"default"],
- "model","button_top",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,58],["recess"],[false,10,2,"default"],
- "platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,58],["recess"],[false,10,2,"default"],
- "platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,58],["recess"],[false,10,2,"default"],
+ "model","button_assembly",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,58],["recess"],[false,10,2,"default"],
+ "model","button_assembly",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,58],["recess"],[false,10,2,"default"],
+ "platter","button_assembly",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,58],["recess"],[false,10,2,"default"],
+ "platter","button_assembly",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,58],["recess"],[false,10,2,"default"],
"sub","round",111,34,6.07,"bottom",[0,90,0],["case",true,false,false],[3,0,3],[0],[false,10,2,"default"],
"sub","round",111,110.6,6.07,"bottom",[0,90,0],["case",true,false,false],[3,0,3],[0],[false,10,2,"default"],
- "add2","hd_vertleft",98,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,3,"portrait"],[false,10,2,"default"],
- "sub","hd_vertleft_holes",98,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,3,"portrait"],[false,10,2,"default"],
+ "add2","hd_holder",98,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left"],[false,10,2,"default"],
+ "sub","hd_holes",98,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"],
"model","hd25",98,110,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],[7],[false,10,2,"default"]],
["h3_shell_router",
@@ -403,11 +414,11 @@ accessory_data = [
"add2","batt_holder",98,40,65.25,"top",[180,0,-18],["sbc",true,true,true],[10,10,0],[0],[false,10,2,"default"],
"add2","button",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[true,10,2,"default"],
"add2","button",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[true,10,2,"default"],
- "model","button_top",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[false,10,2,"default"],
- "model","button_top",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[false,10,2,"default"],
+ "model","button_assembly",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[false,10,2,"default"],
+ "model","button_assembly",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[false,10,2,"default"],
"model","hk_netcard",0,0,19,"bottom",[0,0,0],["sbc",true,true,true],[0,0,0],["portrait"],[true,10,2,"default"],
- "platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,32],["recess"],[false,10,2,"default"],
- "platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,32],["recess"],[false,10,2,"default"]],
+ "platter","button_assembly",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,32],["recess"],[false,10,2,"default"],
+ "platter","button_assembly",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,32],["recess"],[false,10,2,"default"]],
["h3_shell_router-ssd",
"sub","vent",111.5,30,40,"top",[0,0,90],["case",true,false,false],[2,15,4],[1,17,"vertical",1],[false,10,2,"default"],
@@ -419,14 +430,14 @@ accessory_data = [
"add2","batt_holder",98,40,75.25,"top",[180,0,-18],["sbc",true,true,true],[10,10,0],[0],[false,10,2,"default"],
"add2","button",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,42],["recess"],[true,10,2,"default"],
"add2","button",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,42],["recess"],[true,10,2,"default"],
- "model","button_top",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,42],["recess"],[false,10,2,"default"],
- "model","button_top",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,42],["recess"],[false,10,2,"default"],
+ "model","button_assembly",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,42],["recess"],[false,10,2,"default"],
+ "model","button_assembly",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,42],["recess"],[false,10,2,"default"],
"model","hk_netcard",0,0,19,"bottom",[0,0,0],["sbc",true,true,true],[0,0,0],["portrait"],[true,10,2,"default"],
- "add2","hd_vertleft",101,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"],
- "sub","hd_vertleft_holes",101,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,3,"portrait"],[false,10,2,"default"],
+ "add2","hd_holder",101,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left"],[false,10,2,"default"],
+ "sub","hd_holes",101,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"],
"model","hd25",101,110,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],[7],[false,10,2,"default"],
- "platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,42],["recess"],[false,10,2,"default"],
- "platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,42],["recess"],[false,10,2,"default"]],
+ "platter","button_assembly",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,42],["recess"],[false,10,2,"default"],
+ "platter","button_assembly",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,42],["recess"],[false,10,2,"default"]],
["h3_lowboy",
"sub","rectangle",94.5,-4,32,"top",[0,0,0],["sbc-case_z",true,true,true],[14,24.5,35],[[.25,.25,.25,.25]],[false,10,2,"default"],
@@ -440,10 +451,10 @@ accessory_data = [
"sub","vent",111.5,30,4,"bottom",[0,0,90],["case",true,false,false],[2,6,4],[1,17,"vertical",1],[false,10,2,"default"],
"add2","button",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,11],["recess"],[true,10,2,"default"],
"add2","button",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,11],["recess"],[true,10,2,"default"],
- "model","button_top",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,11],["recess"],[false,10,2,"default"],
- "model","button_top",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,11],["recess"],[false,10,2,"default"],
- "platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,11],["recess"],[false,10,2,"default"],
- "platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,11],["recess"],[false,10,2,"default"]],
+ "model","button_assembly",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,11],["recess"],[false,10,2,"default"],
+ "model","button_assembly",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,11],["recess"],[false,10,2,"default"],
+ "platter","button_assembly",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,11],["recess"],[false,10,2,"default"],
+ "platter","button_assembly",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,11],["recess"],[false,10,2,"default"]],
["h3_lowboy_router",
"sub","rectangle",94.5,-4,32,"top",[0,0,0],["sbc-case_z",true,true,true],[14,24.5,35],[[.25,.25,.25,.25]],[false,10,2,"default"],
@@ -457,11 +468,11 @@ accessory_data = [
"sub","vent",111.5,30,4,"bottom",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"],
"add2","button",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,11],["recess"],[true,10,2,"default"],
"add2","button",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,11],["recess"],[true,10,2,"default"],
- "model","button_top",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,11],["recess"],[false,10,2,"default"],
- "model","button_top",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,11],["recess"],[false,10,2,"default"],
+ "model","button_assembly",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,11],["recess"],[false,10,2,"default"],
+ "model","button_assembly",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,11],["recess"],[false,10,2,"default"],
"model","hk_netcard",0,0,19,"bottom",[0,0,0],["sbc",true,true,true],[0,0,0],["portrait"],[true,10,2,"default"],
- "platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,11],["recess"],[false,10,2,"default"],
- "platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,11],["recess"],[false,10,2,"default"]],
+ "platter","button_assembly",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,11],["recess"],[false,10,2,"default"],
+ "platter","button_assembly",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,11],["recess"],[false,10,2,"default"]],
["h3_tray_router",
"suball","vent",-6.5,30,45,"top",[0,0,90],["case",false,false,false],[2,10,7],[1,17,"vertical",1],[false,10,2,"default"],
@@ -470,11 +481,11 @@ accessory_data = [
"suball","vent",111.5,30,6,"top",[0,0,90],["case",true,false,false],[2,10,7],[1,17,"vertical",1],[false,10,2,"default"],
"add2","button",12.34,106.43,59.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[true,10,2,"default"],
"add2","button",23.77,106.43,59.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[true,10,2,"default"],
- "model","button_top",12.34,106.43,59.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[false,10,2,"default"],
- "model","button_top",23.77,106.43,59.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[false,10,2,"default"],
+ "model","button_assembly",12.34,106.43,59.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[false,10,2,"default"],
+ "model","button_assembly",23.77,106.43,59.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,32],["recess"],[false,10,2,"default"],
"model","hk_netcard",0,0,19,"bottom",[0,0,0],["sbc",true,true,true],[0,0,0],["portrait"],[true,10,2,"default"],
- "platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,44],["recess"],[false,10,2,"default"],
- "platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,44],["recess"],[false,10,2,"default"]],
+ "platter","button_assembly",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,44],["recess"],[false,10,2,"default"],
+ "platter","button_assembly",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,44],["recess"],[false,10,2,"default"]],
["h3_router_station",
"suball","vent",-6.5,30,45,"left",[0,0,90],["case",false,false,false],[2,10,7],[1,17,"vertical",1],[false,10,2,"default"],
@@ -493,14 +504,14 @@ accessory_data = [
"model","hk_pwr_button",20,110,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[0,0,0],[0],[true,10,2,"default"],
"sub","round",111,34,6.07,"bottom",[0,90,0],["case",true,false,false],[3,0,6],[0],[false,10,2,"default"],
"sub","round",111,110.5,6.07,"bottom",[0,90,0],["case",true,false,false],[3,0,6],[0],[false,10,2,"default"],
- "add2","hd_vertleft",98,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"],
- "sub","hd_vertleft_holes",98,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,3,"portrait"],[false,10,2,"default"],
+ "add2","hd_holder",98,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left"],[false,10,2,"default"],
+ "sub","hd_holes",98,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"],
"model","hd25",98,110,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],[7],[false,10,2,"default"]],
["h3_ultimate2",
- "suball","fan",0,25,3,"top",[0,270,0],["case",false,false,false],[60,0,6],[0],[false,10,2,"default"],
- "model","fan_cover",-4,25,3,"top",[0,270,0],["case",false,false,false],[60,0,2],[3],[false,10,2,"default"],
- "platter","fan_cover",-100,150,0,"top",[0,0,0],["case",false,false,false],[60,0,2],[3],[false,10,2,"default"],
+ "suball","fan_mask",0,25,3,"top",[0,270,0],["case",false,false,false],[60,0,6],["fan_open"],[false,10,2,"default"],
+ "model","fan_cover",-4,25,3,"top",[0,270,0],["case",false,false,false],[60,0,2],["fan_hex"],[false,10,2,"default"],
+ "platter","fan_cover",-100,150,0,"top",[0,0,0],["case",false,false,false],[60,0,2],["fan_hex"],[false,10,2,"default"],
// side panel
"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],[false,10,2,"default"],
"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],[false,10,2,"default"],
@@ -535,9 +546,9 @@ accessory_data = [
"add1","rectangle",52,-16.5,51,"top",[0,0,0],["case",true,true,true],[4,130,3],[[.25,.25,.25,.25]],[false,10,2,"default"],
"add1","rectangle",77,-16.5,51,"top",[0,0,0],["case",true,true,true],[4,130,3],[[.25,.25,.25,.25]],[false,10,2,"default"],
"add1","rectangle",104,7,51,"top",[0,0,0],["case",true,true,true],[4,80,3],[[.25,.25,.25,.25]],[false,10,2,"default"],
- "model","h3_port_extender",63.5,117,4,"top",[90,0,180],["case",true,false,true],[0,0,0],["remote"],[true,15,5,"default"],
- "model","h3_port_extender_holder",31,119,4,"top",[0,0,-90],["case",true,false,true],[0,0,0],[2.5,"both"],[false,10,2,"default"],
- "platter","h3_port_extender_holder",-170,150,0,"top",[0,0,-90],["case",true,false,true],[0,0,0],[2.5,"remote"],[false,10,2,"default"],
+ "model","hk_h3_port_extender",63.5,117,4,"top",[90,0,180],["case",true,false,true],[0,0,0],["remote"],[true,15,5,"default"],
+ "model","hk_h3_port_extender_holder",31,119,4,"top",[0,0,-90],["case",true,false,true],[0,0,0],[2.5,"both"],[false,10,2,"default"],
+ "platter","hk_h3_port_extender_holder",-170,150,0,"top",[0,0,-90],["case",true,false,true],[0,0,0],[2.5,"remote"],[false,10,2,"default"],
"model","hk_pwr_button",18,113,55.25,"top",[0,0,180],["case",false,false,true],[0,0,0],[0],[true,10,2,"default"],
"model","dsub",18,-1,46,"top",[90,90,0],["case",false,false,false],[0,0,0],["db9","female"],[true,10,2,"default"]],
@@ -550,16 +561,16 @@ accessory_data = [
"sub","vent",111.5,30,4,"bottom",[0,0,90],["case",true,false,false],[2,6,4],[1,17,"vertical",1],[false,10,2,"default"],
"add2","button",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,53],["recess"],[true,10,2,"default"],
"add2","button",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,53],["recess"],[true,10,2,"default"],
- "model","button_top",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,58],["recess"],[false,10,2,"default"],
- "model","button_top",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,58],["recess"],[false,10,2,"default"],
- "platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,58],["recess"],[false,10,2,"default"],
- "platter","button_top",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,58],["recess"],[false,10,2,"default"],
+ "model","button_assembly",12.34,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,58],["recess"],[false,10,2,"default"],
+ "model","button_assembly",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,58],["recess"],[false,10,2,"default"],
+ "platter","button_assembly",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,58],["recess"],[false,10,2,"default"],
+ "platter","button_assembly",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,58],["recess"],[false,10,2,"default"],
"sub","round",111,24,6.07,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
"sub","round",111,100.6,6.07,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"],
- "add2","hd_vertleft",100,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"],
- "add2","hd_vertright",65,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"],
- "sub","hd_vertleft_holes",100,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,3,"portrait"],[false,10,2,"default"],
- "sub","hd_vertright_holes",65,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,2,"portrait"],[false,10,2,"default"],
+ "add2","hd_holder",100,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left"],[false,10,2,"default"],
+ "add2","hd_holder",65,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","right"],[false,10,2,"default"],
+ "sub","hd_holes",100,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"],
+ "sub","hd_holes",65,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","right",3],[false,10,2,"default"],
"model","hd25",65,110,71.85,"bottom",[-90,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"],
"model","hd25",100,110,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"]],