惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security Affairs
S
Schneier on Security
T
Tenable Blog
G
GRAHAM CLULEY
Latest news
Latest news
D
Darknet – Hacking Tools, Hacker News & Cyber Security
A
Arctic Wolf
I
Intezer
Cyberwarzone
Cyberwarzone
T
The Exploit Database - CXSecurity.com
T
Tailwind CSS Blog
K
Kaspersky official blog
Blog — PlanetScale
Blog — PlanetScale
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threat Research - Cisco Blogs
爱范儿
爱范儿
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园 - 叶小钗
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Recent Commits to openclaw:main
Recent Commits to openclaw:main
P
Palo Alto Networks Blog
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
The Cloudflare Blog
Help Net Security
Help Net Security
罗磊的独立博客
博客园 - 聂微东
Jina AI
Jina AI
Project Zero
Project Zero
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LINUX DO - 最新话题
V
V2EX
人人都是产品经理
人人都是产品经理
美团技术团队
博客园 - 【当耐特】
Spread Privacy
Spread Privacy
J
Java Code Geeks
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Security Latest
Security Latest
The Last Watchdog
The Last Watchdog
Stack Overflow Blog
Stack Overflow Blog
雷峰网
雷峰网
S
Securelist
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
Microsoft Azure Blog
Microsoft Azure Blog
P
Privacy International News Feed
宝玉的分享
宝玉的分享
C
CERT Recently Published Vulnerability Notes

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第09章:列表推导、递归与算法建模 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第06章:CSG 布尔建模方法 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第17章:与 Qt VTK Python pythonOCC 生态集成 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第十章:定时任务与自动化(Cron) 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 07-核心工具链 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 05-TDD系统化调试与完成前验证 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
第04章:参数、变量、函数、模块与作用域
我才是银古 · 2026-05-06 · via 博客园 - 我才是银古

第04章:参数、变量、函数、模块与作用域

1. 参数化设计的核心

OpenSCAD 最有价值的能力是参数化。参数化不是简单地把数字放到变量里,而是建立一套稳定的尺寸关系。一个好的 OpenSCAD 模型应该能回答:哪些参数允许用户修改?哪些尺寸由公式推导?哪些约束必须检查?哪些误差来自制造工艺?

wall = 2.4;
clearance = 0.3;
box = [80, 50, 24];
inner = [box[0] - 2*wall, box[1] - 2*wall, box[2] - wall];

如果模型中到处都是魔法数字,后期修改会非常痛苦。建议在文件顶部集中定义公开参数,在模块内部定义局部派生参数。

2. 模块 module

module 用于生成几何或组织子对象。它类似“可复用几何组件”。

module screw_hole(d = 3.2, h = 10, countersink = false) {
    cylinder(h = h, d = d, center = true);
    if (countersink)
        translate([0, 0, h/2 - 1]) cylinder(h = 2, d1 = 7, d2 = d, center = true);
}

调用时可以使用位置参数或命名参数:

screw_hole(3.2, 8, true);
screw_hole(d = 4.2, h = 12, countersink = true);

复杂项目推荐使用命名参数,尤其是参数数量较多时。

3. 函数 function

function 返回值,不直接生成几何。它适合计算尺寸、点集、角度、列表和条件结果。

function clamp(x, lo, hi) = min(max(x, lo), hi);
function polar(r, a) = [r * cos(a), r * sin(a)];

points = [for (i = [0:5]) polar(20, i * 60)];
polygon(points);

函数应该保持纯粹:同样输入得到同样输出,不依赖隐含状态。这样更容易测试和复用。

4. 作用域

OpenSCAD 有全局作用域、模块作用域、函数作用域和 let 局部作用域。理解作用域可以避免变量名冲突。

thickness = 4;

module plate(size = [40, 20]) {
    local_thickness = thickness;
    cube([size[0], size[1], local_thickness], center = true);
}

建议:

  • 全局参数使用清晰长名,如 base_plate_thickness
  • 模块内部派生变量使用短名但不泄露到外部。
  • 库文件避免使用容易冲突的全局变量。
  • 对外参数尽量通过模块参数传入,而不是依赖全局变量。

5. children() 与高阶模块

children() 允许模块接收调用处的子对象,类似几何过滤器或包装器。

module mirrored_x() {
    children();
    mirror([1, 0, 0]) children();
}

mirrored_x()
    translate([15, 0, 0]) cylinder(h = 5, d = 6);

这类模块适合封装对称、阵列、颜色、调试显示、局部坐标系和重复变换。

6. include 与 use

OpenSCAD 用 includeuse 引入其他文件:

include <config.scad>
use <parts/bracket.scad>

一般理解:

  • include 会引入变量、函数和模块,适合配置文件或共享常量。
  • use 更偏向只使用模块和函数,避免执行被引入文件中的顶层几何。

实际项目中建议把库文件设计为“顶层不生成几何”,这样无论 use 还是 include 都更可控。

7. 参数校验

OpenSCAD 没有强类型系统,但可以通过 assert 或条件输出保护模型。

module box_shell(size = [60, 40, 20], wall = 2) {
    assert(wall > 0, "wall must be positive");
    assert(size[0] > 2*wall && size[1] > 2*wall, "wall too thick for box size");

    difference() {
        cube(size, center = true);
        translate([0, 0, wall])
            cube([size[0]-2*wall, size[1]-2*wall, size[2]], center = true);
    }
}

公开库模块应尽量校验关键参数,例如负半径、零厚度、孔径大于外径、阵列数量小于 1 等。

8. 命名规范

推荐命名风格:

  • 模块名使用小写加下划线:mounting_plate
  • 函数名使用动词或数学含义:bolt_circle_pointsdeg_to_rad
  • 参数名体现单位或语义:hole_dwall_tclearance
  • 布尔参数使用 has_use_show_ 前缀。
  • 避免 abtmp 这类无法说明设计意图的名字。

9. 可配置模型的分层

一个可维护模型通常分三层:

  1. 配置层:公开参数、产品规格、制造补偿。
  2. 零件层:各模块负责单个零件或几何特征。
  3. 装配层:放置零件、显示参考、导出单件或整件。
part = "assembly"; // "base", "cover", "assembly"

if (part == "base") base();
else if (part == "cover") cover();
else assembly();

这种模式便于命令行批量导出不同零件。

10. 设计 API 的原则

当你编写给别人使用的 OpenSCAD 模块时,应像设计软件 API 一样认真:

  • 参数默认值能生成有效模型。
  • 参数顺序从最重要到最少改动。
  • 单位、坐标原点和朝向在文档中明确。
  • 不在模块内部随意改变全局特殊变量,必要时作为参数传入。
  • 不把导出、调试、颜色和真实几何混在一起。