You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为多格零件料箱内部创建弧形斜坡底?

为可变行列的舀取式料盘添加弧形斜坡底

我正在尝试为螺丝及小型零件制作一款可动态调整的舀取式料盘,需求为:可设置可变行数与列数,料格底部带弧形斜坡以便轻松取放零件。目前已完成平底多格料盘的建模,以下是我的OpenSCAD脚本,请指导如何添加弧形斜坡底:

// ========================================
// GLOBAL VARIABLES - Customize Here
// ========================================

// Number of rows and columns
num_rows = 2;        // 1-3 rows
num_columns = 2;     // 1-4 columns

tray_height = 40;

// Depth of each row (array/vector)
row_depths = [40, 40];  // Depth for each row in mm

// Width of each column (array/vector)
column_widths = [80, 60];  // Width for each column in mm

// Wall and base settings
wall_thickness = 2;      // Thickness of walls between compartments
base_thickness = 3;      // Thickness of the bottom
outer_wall_thickness = 3; // Thickness of outer walls

// Corner radius for rounded edges (set to 0 for sharp corners)
corner_radius = 2;

// ========================================
// CALCULATED VALUES
// ========================================

total_width = sum(column_widths) + (num_columns + 1) * wall_thickness;
total_depth = sum(row_depths) + (num_rows + 1) * wall_thickness;
max_height = max(row_depths) + base_thickness;

// ========================================
// MAIN TRAY CONSTRUCTION
// ========================================

module scoop_tray() {
    difference() {
        // Outer shell
        rounded_cube([total_width, total_depth, max_height], corner_radius);
        
        // Carve out each bin compartment
        for (row = [0:num_rows-1]) {
            for (col = [0:num_columns-1]) {
                x_pos = outer_wall_thickness + sum_up_to(column_widths, col) + col * wall_thickness;
                y_pos = outer_wall_thickness + sum_up_to(row_depths, row) + row * wall_thickness;
                
                // Simple rectangular bin (open at top)
                translate([x_pos, y_pos, base_thickness]) {
                    cube([column_widths[col], row_depths[row], max_height]);
                }
            }
        }
    }
}

// ========================================
// HELPER FUNCTIONS
// ========================================

// Sum all elements in an array
function sum(arr, i=0, acc=0) = 
    i >= len(arr) ? acc : sum(arr, i+1, acc + arr[i]);

// Sum elements up to index (exclusive)
function sum_up_to(arr, idx) = 
    idx <= 0 ? 0 : sum([for (i=[0:idx-1]) arr[i]]);

// Find maximum value in array
function max(arr, i=0, m=undef) = 
    i >= len(arr) ? m : max(arr, i+1, m == undef || arr[i] > m ? arr[i] : m);

// Rounded cube module
module rounded_cube(size, r) {
    if (r <= 0) {
        cube(size);
    } else {
        hull() {
            translate([r, r, 0])
                cube([size[0]-2*r, size[1]-2*r, size[2]]);
            translate([r, r, 0])
                cylinder(h=size[2], r=r);
            translate([size[0]-r, r, 0])
                cylinder(h=size[2], r=r);
            translate([r, size[1]-r, 0])
                cylinder(h=size[2], r=r);
            translate([size[0]-r, size[1]-r, 0])
                cylinder(h=size[2], r=r);
        }
    }
}

// ========================================
// RENDER
// ========================================

scoop_tray();

修改方案:添加弧形斜坡底

核心思路是将原平底料格替换为带弧形斜坡的腔体,通过差集运算在矩形料格中挖出半圆柱形状的斜坡,同时保留参数化的灵活性。以下是修改后的完整代码:

// ========================================
// GLOBAL VARIABLES - Customize Here
// ========================================

// Number of rows and columns
num_rows = 2;        // 1-3 rows
num_columns = 2;     // 1-4 columns

tray_height = 40;

// Depth of each row (array/vector)
row_depths = [40, 40];  // Depth for each row in mm

// Width of each column (array/vector)
column_widths = [80, 60];  // Width for each column in mm

// Wall and base settings
wall_thickness = 2;      // Thickness of walls between compartments
base_thickness = 3;      // Thickness of the bottom
outer_wall_thickness = 3; // Thickness of outer walls

// Corner radius for rounded edges (set to 0 for sharp corners)
corner_radius = 2;

// 斜坡参数
ramp_radius_factor = 0.8; // 斜坡半径占料格最小边长的比例(0.5~1.0)
ramp_min_height = 5;      // 斜坡最低点的高度(从底座向上)

// ========================================
// CALCULATED VALUES
// ========================================

total_width = sum(column_widths) + (num_columns + 1) * wall_thickness;
total_depth = sum(row_depths) + (num_rows + 1) * wall_thickness;
max_height = max(row_depths) + base_thickness;

// ========================================
// MAIN TRAY CONSTRUCTION
// ========================================

module scoop_tray() {
    difference() {
        // Outer shell
        rounded_cube([total_width, total_depth, max_height], corner_radius);
        
        // Carve out each bin compartment with ramped bottom
        for (row = [0:num_rows-1]) {
            for (col = [0:num_columns-1]) {
                x_pos = outer_wall_thickness + sum_up_to(column_widths, col) + col * wall_thickness;
                y_pos = outer_wall_thickness + sum_up_to(row_depths, row) + row * wall_thickness;
                bin_w = column_widths[col];
                bin_d = row_depths[row];
                
                // 生成带弧形斜坡的料格腔体
                translate([x_pos, y_pos, base_thickness]) {
                    ramped_bin(bin_w, bin_d, max_height, ramp_min_height, ramp_radius_factor);
                }
            }
        }
    }
}

// 带弧形斜坡的料格腔体模块
module ramped_bin(width, depth, height, min_height, radius_factor) {
    difference() {
        // 基础矩形料格
        cube([width, depth, height]);
        
        // 挖弧形斜坡:沿料格宽度方向的半圆柱
        // 调整translate参数可改变斜坡的倾斜方向
        ramp_radius = min(width, depth) * radius_factor;
        translate([width/2, 0, min_height]) {
            cylinder(r=ramp_radius, h=depth, center=true, $fn=60);
        }
        
        // 如果需要沿深度方向倾斜,替换上面的cylinder为:
        // translate([0, depth/2, min_height]) {
        //     cylinder(r=ramp_radius, h=width, center=true, $fn=60, rotate=[90,0,0]);
        // }
    }
}

// ========================================
// HELPER FUNCTIONS
// ========================================

// Sum all elements in an array
function sum(arr, i=0, acc=0) = 
    i >= len(arr) ? acc : sum(arr, i+1, acc + arr[i]);

// Sum elements up to index (exclusive)
function sum_up_to(arr, idx) = 
    idx <= 0 ? 0 : sum([for (i=[0:idx-1]) arr[i]]);

// Find maximum value in array
function max(arr, i=0, m=undef) = 
    i >= len(arr) ? m : max(arr, i+1, m == undef || arr[i] > m ? arr[i] : m);

// Rounded cube module
module rounded_cube(size, r) {
    if (r <= 0) {
        cube(size);
    } else {
        hull() {
            translate([r, r, 0])
                cube([size[0]-2*r, size[1]-2*r, size[2]]);
            translate([r, r, 0])
                cylinder(h=size[2], r=r);
            translate([size[0]-r, r, 0])
                cylinder(h=size[2], r=r);
            translate([r, size[1]-r, 0])
                cylinder(h=size[2], r=r);
            translate([size[0]-r, size[1]-r, 0])
                cylinder(h=size[2], r=r);
        }
    }
}

// ========================================
// RENDER
// ========================================

scoop_tray();

关键修改说明

  1. 新增斜坡参数:添加了ramp_radius_factor和ramp_min_height,可自由调整斜坡的弧度大小和最低点高度,适配不同尺寸的零件。
  2. 新增ramped_bin模块:通过差集运算,在矩形料格中挖出半圆柱形状的弧形斜坡,支持两种倾斜方向(宽度/深度方向),注释中已给出切换方法。
  3. 替换料格生成逻辑:将原脚本中简单的cube替换为ramped_bin模块,保持了原有的行列坐标计算逻辑,确保参数化的灵活性不受影响。

内容的提问来源于stack exchange,提问作者seanbo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 00:47:32