enclosure-designer

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Enclosure Designer

外壳设计工具

Creates 3D-printable enclosures for electronics projects.
为电子项目创建可3D打印的外壳。

Resources

资源

This skill includes bundled tools and templates:
  • scripts/generate_enclosure.py - Parametric OpenSCAD generator with PCB database
  • assets/basic-template.scad - Customizable OpenSCAD template
本工具包含配套的工具与模板:
  • scripts/generate_enclosure.py - 带PCB数据库的参数化OpenSCAD生成器
  • assets/basic-template.scad - 可自定义的OpenSCAD模板

Quick Start

快速开始

Generate for specific PCB:
bash
uv run --no-project scripts/generate_enclosure.py --pcb "Arduino Uno" --output uno_case.scad
uv run --no-project scripts/generate_enclosure.py --pcb "ESP32 DevKit" --output esp32_case.scad
Custom dimensions:
bash
uv run --no-project scripts/generate_enclosure.py --width 100 --depth 60 --height 30 --output custom.scad
Interactive mode:
bash
uv run --no-project scripts/generate_enclosure.py --interactive
List supported PCBs:
bash
uv run --no-project scripts/generate_enclosure.py --list
为特定PCB生成外壳:
bash
uv run --no-project scripts/generate_enclosure.py --pcb "Arduino Uno" --output uno_case.scad
uv run --no-project scripts/generate_enclosure.py --pcb "ESP32 DevKit" --output esp32_case.scad
自定义尺寸:
bash
uv run --no-project scripts/generate_enclosure.py --width 100 --depth 60 --height 30 --output custom.scad
交互模式:
bash
uv run --no-project scripts/generate_enclosure.py --interactive
列出支持的PCB:
bash
uv run --no-project scripts/generate_enclosure.py --list

When to Use

适用场景

  • "I need a case for my project"
  • "How do I make an enclosure?"
  • "Design a box for my Arduino"
  • User has working circuit, needs housing
  • Preparing for deployment/presentation
  • "我需要为我的项目制作一个外壳"
  • "如何制作电子设备外壳?"
  • "为我的Arduino设计一个盒子"
  • 用户已有可用电路,需要外壳
  • 为部署或展示做准备

Design Workflow

设计流程

Step 1: Gather Measurements

步骤1:收集尺寸数据

Ask user for:
1. Main board dimensions (L × W × H in mm)
2. Component clearances (tallest component height)
3. Connectors/ports that need access (USB, power jack, etc.)
4. Mounting holes (positions, diameters)
5. Any displays, buttons, LEDs that need cutouts
6. Environment (indoor/outdoor, waterproof?)
向用户确认以下信息:
1. 主电路板尺寸(长×宽×高,单位:毫米)
2. 元件间隙(最高元件的高度)
3. 需要预留接口的连接器(USB、电源接口等)
4. 安装孔(位置、直径)
5. 需要开孔的显示屏、按钮、LED等部件
6. 使用环境(室内/室外、是否需要防水)

Step 2: Design Parameters

步骤2:设计参数

Enclosure Type: [Box/Clamshell/Snap-fit/Screw-mount]
Material: [PLA/PETG/ABS]
Wall Thickness: [2-3mm typical]
Mounting Style: [Standoffs/Clips/Rails]
Ventilation: [None/Slots/Holes]
Access: [Top-remove/Front-panel/Side-openings]
外壳类型:[普通盒式/翻盖式/卡扣式/螺丝固定式]
材料:[PLA/PETG/ABS]
壁厚:[典型值2-3毫米]
安装方式:[支撑柱/卡扣/导轨]
通风:[无/槽式/孔式]
开启方式:[顶部开启/前面板/侧面开口]

Step 3: Generate Design

步骤3:生成设计方案

Choose approach:
  1. Parametric OpenSCAD - Full customization
  2. Pre-made generator - Quick results
  3. Manual Fusion360/TinkerCAD - Visual design

选择合适的实现方式:
  1. 参数化OpenSCAD - 完全自定义
  2. 预制生成器 - 快速得到结果
  3. 手动使用Fusion360/TinkerCAD - 可视化设计

Parametric OpenSCAD Template

参数化OpenSCAD模板

Basic Project Box

基础项目外壳

openscad
// === PARAMETRIC PROJECT BOX ===
// Customize these values for your project

// Internal dimensions (mm)
inner_length = 70;    // X axis
inner_width = 50;     // Y axis  
inner_height = 30;    // Z axis (internal depth)

// Wall and tolerances
wall = 2.5;           // Wall thickness
lid_tolerance = 0.4;  // Gap for lid fit
corner_radius = 3;    // Rounded corners

// Mounting standoffs
standoff_height = 5;  // PCB clearance from bottom
standoff_dia = 6;     // Standoff outer diameter
screw_hole_dia = 2.5; // M2.5 screw hole

// PCB mounting hole positions (from corner)
// Measure from your board!
pcb_holes = [
    [5, 5],           // Bottom-left
    [65, 5],          // Bottom-right
    [5, 45],          // Top-left
    [65, 45]          // Top-right
];

// Lid attachment
lid_screw_dia = 3;    // M3 screws
lid_screw_positions = [
    [5, 5],
    [inner_length-5, 5],
    [5, inner_width-5],
    [inner_length-5, inner_width-5]
];

// Cutouts (add as needed)
usb_cutout = true;
usb_x = 35;           // Center position
usb_width = 12;
usb_height = 8;

// === MODULES ===

module rounded_box(l, w, h, r) {
    hull() {
        for (x = [r, l-r])
            for (y = [r, w-r])
                translate([x, y, 0])
                    cylinder(h=h, r=r, $fn=32);
    }
}

module standoff(h, outer_d, inner_d) {
    difference() {
        cylinder(h=h, d=outer_d, $fn=24);
        cylinder(h=h+1, d=inner_d, $fn=24);
    }
}

module box_base() {
    outer_l = inner_length + 2*wall;
    outer_w = inner_width + 2*wall;
    outer_h = inner_height + wall;  // Bottom wall
    
    difference() {
        // Outer shell
        rounded_box(outer_l, outer_w, outer_h, corner_radius);
        
        // Inner cavity
        translate([wall, wall, wall])
            rounded_box(inner_length, inner_width, inner_height+1, corner_radius-wall);
        
        // USB cutout
        if (usb_cutout) {
            translate([wall + usb_x - usb_width/2, -1, wall + standoff_height])
                cube([usb_width, wall+2, usb_height]);
        }
    }
    
    // Add standoffs
    for (pos = pcb_holes) {
        translate([wall + pos[0], wall + pos[1], wall])
            standoff(standoff_height, standoff_dia, screw_hole_dia);
    }
}

module box_lid() {
    lid_wall = wall - lid_tolerance;
    outer_l = inner_length + 2*wall;
    outer_w = inner_width + 2*wall;
    lip_h = 5;  // How deep lid inserts
    
    // Lid top
    rounded_box(outer_l, outer_w, wall, corner_radius);
    
    // Lid lip (inserts into box)
    translate([wall + lid_tolerance, wall + lid_tolerance, -lip_h])
        difference() {
            rounded_box(inner_length - 2*lid_tolerance, 
                       inner_width - 2*lid_tolerance, 
                       lip_h, corner_radius - wall);
        }
}

// === RENDER ===

// Uncomment one at a time for printing:
box_base();
// translate([0, inner_width + 20, 0]) box_lid();
openscad
// === PARAMETRIC PROJECT BOX ===
// Customize these values for your project

// Internal dimensions (mm)
inner_length = 70;    // X axis
inner_width = 50;     // Y axis  
inner_height = 30;    // Z axis (internal depth)

// Wall and tolerances
wall = 2.5;           // Wall thickness
lid_tolerance = 0.4;  // Gap for lid fit
corner_radius = 3;    // Rounded corners

// Mounting standoffs
standoff_height = 5;  // PCB clearance from bottom
standoff_dia = 6;     // Standoff outer diameter
screw_hole_dia = 2.5; // M2.5 screw hole

// PCB mounting hole positions (from corner)
// Measure from your board!
pcb_holes = [
    [5, 5],           // Bottom-left
    [65, 5],          // Bottom-right
    [5, 45],          // Top-left
    [65, 45]          // Top-right
];

// Lid attachment
lid_screw_dia = 3;    // M3 screws
lid_screw_positions = [
    [5, 5],
    [inner_length-5, 5],
    [5, inner_width-5],
    [inner_length-5, inner_width-5]
];

// Cutouts (add as needed)
usb_cutout = true;
usb_x = 35;           // Center position
usb_width = 12;
usb_height = 8;

// === MODULES ===

module rounded_box(l, w, h, r) {
    hull() {
        for (x = [r, l-r])
            for (y = [r, w-r])
                translate([x, y, 0])
                    cylinder(h=h, r=r, $fn=32);
    }
}

module standoff(h, outer_d, inner_d) {
    difference() {
        cylinder(h=h, d=outer_d, $fn=24);
        cylinder(h=h+1, d=inner_d, $fn=24);
    }
}

module box_base() {
    outer_l = inner_length + 2*wall;
    outer_w = inner_width + 2*wall;
    outer_h = inner_height + wall;  // Bottom wall
    
    difference() {
        // Outer shell
        rounded_box(outer_l, outer_w, outer_h, corner_radius);
        
        // Inner cavity
        translate([wall, wall, wall])
            rounded_box(inner_length, inner_width, inner_height+1, corner_radius-wall);
        
        // USB cutout
        if (usb_cutout) {
            translate([wall + usb_x - usb_width/2, -1, wall + standoff_height])
                cube([usb_width, wall+2, usb_height]);
        }
    }
    
    // Add standoffs
    for (pos = pcb_holes) {
        translate([wall + pos[0], wall + pos[1], wall])
            standoff(standoff_height, standoff_dia, screw_hole_dia);
    }
}

module box_lid() {
    lid_wall = wall - lid_tolerance;
    outer_l = inner_length + 2*wall;
    outer_w = inner_width + 2*wall;
    lip_h = 5;  // How deep lid inserts
    
    // Lid top
    rounded_box(outer_l, outer_w, wall, corner_radius);
    
    // Lid lip (inserts into box)
    translate([wall + lid_tolerance, wall + lid_tolerance, -lip_h])
        difference() {
            rounded_box(inner_length - 2*lid_tolerance, 
                       inner_width - 2*lid_tolerance, 
                       lip_h, corner_radius - wall);
        }
}

// === RENDER ===

// Uncomment one at a time for printing:
box_base();
// translate([0, inner_width + 20, 0]) box_lid();

Adding Cutouts

添加开孔

openscad
// === CUTOUT LIBRARY ===

// Round hole (for buttons, LEDs)
module round_cutout(x, y, z, diameter, depth) {
    translate([x, y, z])
        rotate([90, 0, 0])
            cylinder(h=depth, d=diameter, $fn=32);
}

// Rectangle (for displays, SD cards)
module rect_cutout(x, y, z, width, height, depth) {
    translate([x - width/2, -0.1, z])
        cube([width, depth + 0.2, height]);
}

// Slot (for ventilation, cables)
module slot_cutout(x, y, z, width, height, depth) {
    translate([x, y, z])
        hull() {
            translate([0, 0, 0])
                cylinder(h=depth, d=height, $fn=24);
            translate([width-height, 0, 0])
                cylinder(h=depth, d=height, $fn=24);
        }
}

// OLED display cutout (128x64 module)
module oled_cutout() {
    // Visible area
    rect_cutout(inner_length/2, wall, inner_height - 15, 26, 14, wall+1);
    // Mounting holes (if needed)
}

// Common connector dimensions
usb_micro = [8, 3];      // USB Micro
usb_c = [9, 3.5];        // USB-C
barrel_jack = [12, 12];  // 5.5mm DC jack (round)
sd_card = [15, 3];       // SD card slot

openscad
// === CUTOUT LIBRARY ===

// Round hole (for buttons, LEDs)
module round_cutout(x, y, z, diameter, depth) {
    translate([x, y, z])
        rotate([90, 0, 0])
            cylinder(h=depth, d=diameter, $fn=32);
}

// Rectangle (for displays, SD cards)
module rect_cutout(x, y, z, width, height, depth) {
    translate([x - width/2, -0.1, z])
        cube([width, depth + 0.2, height]);
}

// Slot (for ventilation, cables)
module slot_cutout(x, y, z, width, height, depth) {
    translate([x, y, z])
        hull() {
            translate([0, 0, 0])
                cylinder(h=depth, d=height, $fn=24);
            translate([width-height, 0, 0])
                cylinder(h=depth, d=height, $fn=24);
        }
}

// OLED display cutout (128x64 module)
module oled_cutout() {
    // Visible area
    rect_cutout(inner_length/2, wall, inner_height - 15, 26, 14, wall+1);
    // Mounting holes (if needed)
}

// Common connector dimensions
usb_micro = [8, 3];      // USB Micro
usb_c = [9, 3.5];        // USB-C
barrel_jack = [12, 12];  // 5.5mm DC jack (round)
sd_card = [15, 3];       // SD card slot

Online Generators (No CAD Needed)

在线生成工具(无需CAD软件)

Ultimate Box Maker (Thingiverse)

Ultimate Box Maker(Thingiverse)

Parameters:
  • Enter internal dimensions
  • Choose wall thickness
  • Select lid type (snap/screw/slide)
  • Add ventilation slots
  • Download STL
参数选项:
  • 输入内部尺寸
  • 选择壁厚
  • 选择盖子类型(卡扣/螺丝/滑动)
  • 添加通风槽
  • 下载STL文件

Parametric Box by Heartman

Parametric Box by Heartman(Thingiverse)

Good for:
  • Simple project boxes
  • Snap-fit lids
  • Basic customization
适用场景:
  • 简单项目外壳
  • 卡扣式盖子
  • 基础自定义需求

FreeCAD + Parametric Enclosure

FreeCAD + 参数化外壳

  1. Install FreeCAD
  2. Use Spreadsheet workbench for parameters
  3. Generate enclosure with formulas
  4. Export STL

  1. 安装FreeCAD
  2. 使用电子表格工作台设置参数
  3. 通过公式生成外壳
  4. 导出STL文件

Common Board Dimensions

常见开发板尺寸

Arduino Family

Arduino系列

BoardL × W × H (mm)Mounting Holes
UNO R368.6 × 53.4 × 154 holes, 3.2mm
Nano45 × 18 × 82 holes, 1.5mm
Mega 2560101.5 × 53.4 × 154 holes, 3.2mm
Pro Mini33 × 18 × 5None standard
开发板长×宽×高(毫米)安装孔
UNO R368.6 × 53.4 × 154个孔,直径3.2mm
Nano45 × 18 × 82个孔,直径1.5mm
Mega 2560101.5 × 53.4 × 154个孔,直径3.2mm
Pro Mini33 × 18 × 5无标准安装孔

ESP32 Family

ESP32系列

BoardL × W × H (mm)Mounting Holes
DevKit V1 (38pin)55 × 28 × 10None (use clips)
DevKit V1 (30pin)49 × 26 × 10None
NodeMCU-32S51 × 25 × 102 holes, 3mm
ESP32-CAM40 × 27 × 122 holes, 2mm
开发板长×宽×高(毫米)安装孔
DevKit V1(38针)55 × 28 × 10无(使用卡扣固定)
DevKit V1(30针)49 × 26 × 10
NodeMCU-32S51 × 25 × 102个孔,直径3mm
ESP32-CAM40 × 27 × 122个孔,直径2mm

Raspberry Pi Pico

Raspberry Pi Pico

BoardL × W × H (mm)Mounting Holes
Pico/Pico W51 × 21 × 44 holes, 2.1mm
开发板长×宽×高(毫米)安装孔
Pico/Pico W51 × 21 × 44个孔,直径2.1mm

Common Modules

常见模块

ModuleL × W × H (mm)Notes
SSD1306 OLED 0.96"27 × 27 × 44 corners 2mm
BME28015 × 12 × 32 holes 2mm
SD Card42 × 24 × 54 corners 2mm
TP405626 × 17 × 4None
18650 holder77 × 21 × 19Varies

模块长×宽×高(毫米)说明
SSD1306 OLED 0.96"27 × 27 × 44个角落孔,直径2mm
BME28015 × 12 × 32个孔,直径2mm
SD卡模块42 × 24 × 54个角落孔,直径2mm
TP405626 × 17 × 4无安装孔
18650电池座77 × 21 × 19尺寸因型号而异

Design Guidelines

设计指南

Wall Thickness

壁厚参考

Application              Thickness
─────────────────────────────────────
Desktop/indoor           2.0 mm
Portable/handheld        2.5 mm
Outdoor                  3.0 mm
Structural/load-bearing  4.0+ mm
应用场景              壁厚
─────────────────────────────────────
桌面/室内使用           2.0 mm
便携/手持设备        2.5 mm
户外使用                  3.0 mm
结构承重/受力部件  4.0+ mm

Clearances

间隙参考

Component           Add clearance
─────────────────────────────────────
PCB to wall         1-2 mm
USB/connector       0.5 mm extra per side
Moving parts        2-3 mm
Lid fit             0.3-0.5 mm gap
部件类型           需预留间隙
─────────────────────────────────────
PCB与外壳壁         1-2 mm
USB/连接器       每侧额外0.5 mm
活动部件        2-3 mm
盖子配合间隙             0.3-0.5 mm

Mounting Strategies

安装策略

PCB Standoffs:
    [Standoff]──┐
        │       │
    [PCB]       │ standoff_height
        │       │
    ────────────┘
     box_floor
Edge Rails:
    ┌────────────┐
    │    [PCB]   │
    │  ───────   │
    │ /       \  │  <-- Rails support PCB edges
    └───┘   └────┘
Snap-in Clips:
    ┌──╲   ╱──┐
    │   [PCB] │
    │  ───────│
    └─────────┘
     Flexible clips
PCB支撑柱:
    [支撑柱]──┐
        │       │
    [PCB]       │ 支撑柱高度
        │       │
    ────────────┘
     外壳底部
边缘导轨:
    ┌────────────┐
    │    [PCB]   │
    │  ───────   │
    │ /       \  │  <-- 导轨支撑PCB边缘
    └───┘   └────┘
卡扣固定:
    ┌──╲   ╱──┐
    │   [PCB] │
    │  ───────│
    └─────────┘
     弹性卡扣

Ventilation

通风设计

When needed:
  • MCU draws >100mA continuously
  • Motor drivers
  • Power regulators
  • Any component getting warm
Vent patterns:
// Slot pattern (easy to print, good flow)
for (i = [0:5]) {
    translate([10 + i*8, wall/2, 10])
        slot_cutout(20, 3, wall+1);
}

// Honeycomb (looks cool, harder to print)
// Use pre-made pattern from Thingiverse

需要通风的场景:
  • MCU持续功耗超过100mA
  • 电机驱动模块
  • 电源稳压模块
  • 任何会发热的部件
通风样式:
// 槽式通风(易打印,通风效果好)
for (i = [0:5]) {
    translate([10 + i*8, wall/2, 10])
        slot_cutout(20, 3, wall+1);
}

// 蜂窝状通风(外观美观,打印难度高)
// 使用Thingiverse上的预制样式

Print Settings

打印设置

Material Selection

材料选择

MaterialProsConsBest For
PLAEasy to print, cheapWeak to heat (>50°C)Indoor projects
PETGHeat resistant, strongStringing, harderOutdoor, functional
ABSHeat resistant, toughWarps, fumesProfessional
ASAUV resistantLike ABSOutdoor long-term
材料优点缺点最佳适用场景
PLA易打印、成本低耐热性差(超过50℃变形)室内项目
PETG耐热性好、强度高易拉丝、打印难度较高户外、功能性外壳
ABS耐热性好、韧性强易翘曲、有异味专业级项目
ASA抗紫外线特性类似ABS长期户外使用

Recommended Settings

推荐设置

PLA Enclosure:
Layer height: 0.2mm
Wall count: 3-4 (for 2-3mm wall)
Infill: 15-20%
Support: Usually not needed if designed right
Bed temp: 60°C
Nozzle temp: 200-210°C
PETG Enclosure:
Layer height: 0.2mm
Wall count: 3-4
Infill: 20-25%
Support: Often needed
Bed temp: 80°C
Nozzle temp: 230-245°C
Print slower than PLA
PLA外壳打印设置:
层高:0.2mm
壁厚层数:3-4层(对应2-3mm壁厚)
填充率:15-20%
支撑:设计合理的话通常不需要
热床温度:60℃
喷嘴温度:200-210℃
PETG外壳打印设置:
层高:0.2mm
壁厚层数:3-4层
填充率:20-25%
支撑:通常需要
热床温度:80℃
喷嘴温度:230-245℃
打印速度比PLA慢

Orientation Tips

打印方向建议

Print box BASE standing up (opening facing up)
- No supports needed
- Good surface finish inside
- Strong walls

Print LID flat (top surface down)
- Smooth exterior surface
- May need supports for cutouts

外壳底座竖直打印(开口朝上)
- 无需支撑
- 内部表面光洁度好
- 外壳壁强度高

外壳盖子平放打印(顶面朝下)
- 外部表面光滑
- 开孔部分可能需要支撑

Waterproofing

防水设计

IP Rating Guide

IP等级参考

IP65 - Dust tight, water jets OK
IP67 - Dust tight, submersible briefly
IP68 - Dust tight, continuous submersion
IP65 - 防尘防喷水
IP67 - 防尘可短暂浸水
IP68 - 防尘可持续浸水

Strategies

防水策略

Rubber Gasket:
Add groove in lid for O-ring:
    ┌───╔═══════╗───┐
    │   ║O-ring ║   │
    │   ╚═══════╝   │
    │    [box]      │
    └───────────────┘
Cable Glands:
  • Use PG7/PG9 cable glands for wires
  • Drill precise holes, thread in glands
  • Seal with silicone if needed
Conformal Coating:
  • Spray PCB with conformal coat
  • Protects electronics inside box

橡胶密封圈:
在盖子上添加O型圈凹槽:
    ┌───╔═══════╗───┐
    │   ║O型圈 ║   │
    │   ╚═══════╝   │
    │    [外壳]      │
    └───────────────┘
电缆密封接头:
  • 使用PG7/PG9规格的电缆密封接头
  • 钻出精准的孔,拧入接头
  • 必要时用硅胶密封
** conformal涂层:**
  • 在PCB上喷涂conformal涂层
  • 保护外壳内部的电子元件

Example: ESP32 Weather Station Enclosure

示例:ESP32气象站外壳

openscad
// ESP32 Weather Station Enclosure
// Components: ESP32 DevKit, BME280, SSD1306 OLED, 18650 battery

// Internal dimensions (measured from components + clearance)
inner_length = 80;
inner_width = 55;
inner_height = 50;  // Room for battery under PCB

wall = 3;  // Outdoor = thicker walls

// ESP32 on standoffs
esp_standoff_h = 25;  // Above battery
esp_holes = [[5, 5], [5, 50], [52, 5], [52, 50]];

// OLED window position (top of enclosure)
oled_x = 40;
oled_y = 15;
oled_w = 28;
oled_h = 16;

// BME280 vent hole
bme_vent_x = 70;
bme_vent_y = 30;
bme_vent_dia = 8;

// USB access
usb_x = 30;
usb_y = inner_height - 15;

// Generate with above parameters...

openscad
// ESP32 Weather Station Enclosure
// Components: ESP32 DevKit, BME280, SSD1306 OLED, 18650 battery

// Internal dimensions (measured from components + clearance)
inner_length = 80;
inner_width = 55;
inner_height = 50;  // Room for battery under PCB

wall = 3;  // Outdoor = thicker walls

// ESP32 on standoffs
esp_standoff_h = 25;  // Above battery
esp_holes = [[5, 5], [5, 50], [52, 5], [52, 50]];

// OLED window position (top of enclosure)
oled_x = 40;
oled_y = 15;
oled_w = 28;
oled_h = 16;

// BME280 vent hole
bme_vent_x = 70;
bme_vent_y = 30;
bme_vent_dia = 8;

// USB access
usb_x = 30;
usb_y = inner_height - 15;

// Generate with above parameters...

Troubleshooting

故障排查

ProblemCauseSolution
Lid too tightTolerance too smallIncrease to 0.5mm
Lid too looseTolerance too largeDecrease, add clips
Screws stripHoles too largeUse proper thread inserts
Parts don't fitMeasurement errorRemeasure, print test piece
Weak wallsToo thin, low infillIncrease wall count
WarpingABS, big flat surfacesUse brim, enclosure, PETG

问题原因解决方案
盖子过紧公差设置过小增大至0.5mm
盖子过松公差设置过大减小公差,添加卡扣
螺丝滑牙螺丝孔过大使用合适的螺纹嵌件
部件无法装入尺寸测量错误重新测量,打印测试件
外壳壁强度不足壁厚过薄、填充率低增加壁厚层数
打印翘曲使用ABS材料、大平面结构使用裙边、封闭打印舱,或更换为PETG

Resources

参考资源

  • OpenSCAD: https://openscad.org
  • Thingiverse Customizer: Parametric designs
  • Printables: More enclosure designs
  • McMaster-Carr: Reference for hardware dimensions
  • OpenSCADhttps://openscad.org
  • Thingiverse自定义器:参数化设计资源
  • Printables:更多外壳设计方案
  • McMaster-Carr:硬件尺寸参考数据库