关于 lab-hardware-cad
面向设计或检查实验室硬件的研究人员,使用参数化 Python 模型描述零件。技能可导出 STEP 文件,并结合接口尺寸、几何检查和必需的图像审查,在制造前验证设计。
主要功能
- 01参数化 Python CAD 模型
- 02导出 STEP 与 STL
- 03基于标准的接口检查
- 04几何量规与装配间隙检查
- 05记录模型来源的清单
- 06PNG 快照审查
适用场景
- 01按实验室器皿尺寸设计支架
- 02为光学装置制作并验证安装件
- 03检查或修改现有 STEP 模型
- 04制造前检查装配间隙
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ k-dense-ai/ scientific-agent-skills --skill lab-hardware-cad安装后在 Claude Code 中输入/lab-hardware-cad确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/standards.jsonreferences/behavior-rigs.mdbuild123d-patterns.mdfabrication-limits.mdlabware-adapters.mdmicrofluidics.mdoptomechanics.mdvalidation.mdscripts/_common.pycheck.pygen.pysnapshot.py详细介绍
实验室硬件 CAD
将物理研究硬件设计为参数化 Python 源码,导出 STEP 作为权威产物,并在任何制造之前从数值和视觉两方面验证结果。
实验室硬件的难点几乎从来不是几何形状。而在于该零件必须与尺寸由已发布标准或供应商图纸固定的设备配合。宽了 0.5 mm 的支架装不进酶标仪;纵横比错误的通道会在键合过程中塌陷;螺栓孔距为 25.4 mm 而不是 25.0 mm 的安装座无法够到光学平台。本技能的存在就是为了让这些数字保持正确并经过检查。
何时使用
用于任何为实验室设计、建模或制造物理零件的请求:芯片、模具、安装座、转接头、支架、管架、托架、外壳、夹具、固定装置、场地或迷宫。也用于检查或修改现有的 STEP 文件。
不要用于有限元分析、计算流体动力学、分子结构或科学绘图。那些是不同的技能。
安装
uv venv --python 3.12 .venv-labcad
uv pip install --python .venv-labcad/bin/python "build123d==0.13.0" "matplotlib>=3.8"
build123d 0.13.0 要求 Python >=3.11,<3.15,并通过 cadquery-ocp-novtk 引入 OpenCascade 内核。该 wheel 很大;每个项目安装一次并重复使用。
所有随附脚本都接受 --help。check.py standards 在未安装 build123d 的情况下也能运行。
模型文件是被执行而非解析的。 gen.py、check.py 和 snapshot.py 会导入 *_model.py 并调用其 build(),这会在当前环境中运行任意 Python 代码。这是参数化 CAD 的固有特性——源码即设计。只运行本次会话中编写的模型文件,或用户从可信位置提供的模型文件。如果模型来自互联网、共享驱动器或不可信的同事,请在运行前阅读它,并说明你已这样做。
必需的工作流
按顺序执行以下步骤。步骤 5 和步骤 6 不是可选的,并且步骤 5 通过并不免除步骤 6。
1. 路由到某个设备族
阅读请求,对其进行分类,并加载恰好一个设备族参考。不要加载全部四个——它们很长,而且在设备族之间混用约定是常见的错误来源。
| 如果零件是 | 加载 |
|---|---|
| 芯片、模具、通道网络、流通池、垫圈,或任何带流体端口的部件 | references/microfluidics.md |
| 光路中的安装座、支柱、面包板转接件、笼式系统部件、滤光片或样品架 | references/optomechanics.md |
| 用于孔板、比色皿、试管、载玻片或培养皿的转接头、插片、管架或支架 | references/labware-adapters.md |
| 用于动物实验的场地、迷宫、头部固定部件、饮水嘴、系绳,或安装到型材上的外壳 | references/behavior-rigs.md |
如果零件确实跨越两个设备族——例如用螺栓固定到光学平台上的微流控芯片——加载拥有关键接口的那个设备族,然后只阅读第二个设备族的接口部分。在你的回复中说明你路由到了哪个设备族。
2. 在绘制任何几何形状之前,先确定接口尺寸
每个零件都至少有一个配合接口。在编写代码之前,为每个接口写下:
- 尺寸的来源:已发布的标准、供应商图纸,或用户测量值;
- 标称值与公差;
- 你预期的间隙或过盈,以及原因。
在 assets/standards.json 或系列参考中查找该数值。绝不要凭记忆写下接口尺寸。 如果该数值不在标准文件或参考中,请向用户索取供应商图纸或测量值,而不是猜测。猜出来的接口尺寸是本技能中代价最高的失败模式。
用于容纳外部组件的凹槽,其尺寸依据该组件的最大实体包络——标称值加上其正公差——然后才给定间隙。而插入孔的轴则相反,使用孔的最小直径;envelope 不建模这种情况。
python scripts/check.py standards --list
python scripts/check.py standards --show slas-microplate-footprint
随附的标准 ID(精确字符串;不要猜测变体):slas-microplate-footprint、slas-microplate-height、slas-microplate-flange、slas-well-positions-96、slas-well-positions-384、slas-well-positions-1536、cuvette-standard-10mm、optical-breadboard-metric、optical-breadboard-imperial、cage-system-30mm、sm1-lens-tube-thread。
如果该零件与此列表中的任何内容都不配合,这很常见也没问题:声明无接口,并在报告中将每个接口尺寸连同其来源(用户规格、供应商图纸、测量值)标注为未检查。绝不要为了填补空缺而声明一个不相关的标准——虚假的声明比诚实的“无人检查过”更糟糕。
3. 在选择几何形状之前先选择工艺
阅读 references/fabrication-limits.md。工艺决定了最小壁厚、最小特征、可实现的公差,以及零件能否经受高压灭菌或与你所用溶剂的接触。不要假设 FDM 未经校准就能保持 ±0.05 mm。接触细胞的 SLA 零件需要经过验证的材料和后处理工作流,以及针对特定检测的测试。在模型 docstring 中记录工艺和材料。
4. 编写参数化模型
编写 <part>_model.py。源文件是权威产物——切勿手动编辑导出的 STEP 文件,也切勿从网格重新生成。
要求:
- 用户可能更改的每个尺寸都是一个模块级命名常量,名称中带有单位:
bore_d_mm、wall_t_mm、post_h_mm。除 0、1 和 2 外,主体中不得出现裸数字。 - 暴露
build() -> Part。gen.py会调用它。 - 将参数分组到
INTERFACE块(由标准固定的尺寸,附注标准 ID)和DESIGN块(你可以自由选择的尺寸)中。 - 在函数内部推导每个计算尺寸,绝不要在模块级进行,这样
--param覆盖才能真正生效。 - 声明一个
interfaces()函数,返回该零件必须适配的尺寸,每个都带有其标准 ID 和意图。这正是让接口在第 5 步中可机器检查的原因。 当特征必须接受任何符合标准的零件(凹槽、孔或槽——在最大实体条件下加上你的间隙进行单侧检查)时,intent为"envelope";当与标称带(经任何显式余量扩展)进行比较时,intent为"match"。 这不是符合性证书。clearance是以 mm 为单位的总预期间隙,必须为非负值。只声明约束该零件配合特征的尺寸——配合设备的属性(桌子的边缘边框、典型板厚)不是你的接口。如果没有适用的捆绑标准,返回[]。 - 声明一个
checks()函数,由从构建实体测量的通/止规组成:一个clear区域,用于所有必须穿过或装入的物体(螺杆轴、梁通道、最大实体条件下的配合零件落入其凹槽);一个material区域,带有按需求尺寸设定的最小体积,用于所有必须保留的物体(凸脊、凸台、螺钉座);以及针对用户声明的每个尺寸限制的bbox_*边界。将请求中的每项几何要求映射到一条目;这些能捕捉is_valid、包围盒和已声明数值无法发现的错误。gen.py在每次生成时运行它们,并在其中一个失败时使构建失败。模式和示例:references/build123d-patterns.md。 - 将工艺、材料和每个接口来源放入模块文档字符串中。
"""SLAS base-footprint fit coupon; confirm upper plate body/draft before a full holder.
Process: FDM, PETG, 0.2 mm layer. Tolerance budget +/-0.3 mm.
Interfaces:
- Plate pocket: ANSI/SLAS 1-2004 (R2012) footprint 127.76 x 85.48 mm, +/-0.50 overall.
- Upper plate body, lid and stage mounting: not represented in this coupon.
"""
from build123d import *
# --- INTERFACE (fixed by standard; do not tune) ---
plate_l_mm = 127.76 # ANSI/SLAS 1-2004 nominal
plate_w_mm = 85.48 # ANSI/SLAS 1-2004 nominal
plate_tol_mm = 0.50 # ANSI/SLAS 1-2004; the pocket is sized to nominal + this
# --- DESIGN (free) ---
pocket_clearance_mm = 0.40 # per-side; FDM, see fabrication-limits.md
wall_t_mm = 3.0
floor_t_mm = 2.5
body_h_mm = 12.0
def pocket_mm() -> tuple[float, float]:
"""Pocket at the plate's maximum material condition plus clearance per side.
A pocket sized from nominal can jam on conforming plates.
"""
growth = plate_tol_mm + 2 * pocket_clearance_mm
return plate_l_mm + growth, plate_w_mm + growth
def interfaces() -> list[dict]:
"""What this part must fit. `check.py interfaces` verifies every entry."""
pocket_l, pocket_w = pocket_mm()
return [
{"feature": "plate pocket length", "standard": "slas-microplate-footprint",
"dimension": "footprint_length", "value": pocket_l,
"intent": "envelope", "clearance": 2 * pocket_clearance_mm},
{"feature": "plate pocket width", "standard": "slas-microplate-footprint",
"dimension": "footprint_width", "value": pocket_w,
"intent": "envelope", "clearance": 2 * pocket_clearance_mm},
]
def checks() -> list[dict]:
"""Gauges measured from the built solid. Sized from the REQUIREMENT's numbers
(plate MMC, the user's height limit), not from the pocket parameters, so a
wrong parameter cannot shrink the gauge to match the wrong geometry."""
depth = body_h_mm - floor_t_mm
return [
{"feature": "plate at MMC drops into the pocket",
"clear": {"box": (plate_l_mm + plate_tol_mm, plate_w_mm + plate_tol_mm, depth),
"at": [(0.0, 0.0, floor_t_mm + depth / 2)]}},
{"feature": "under 15 mm for the stage", "bbox_z": {"max": 15.0}},
]
def build() -> Part:
pocket_l, pocket_w = pocket_mm()
with BuildPart() as carrier:
Box(pocket_l + 2 * wall_t_mm, pocket_w + 2 * wall_t_mm, body_h_mm,
align=(Align.CENTER, Align.CENTER, Align.MIN))
with Locations((0, 0, floor_t_mm)):
Box(pocket_l, pocket_w, body_h_mm, mode=Mode.SUBTRACT,
align=(Align.CENTER, Align.CENTER, Align.MIN))
return carrier.part
关于 builder 与代数方式的选择、interfaces() 契约、草图绘制、选择器、圆角以及螺纹嵌件孔,请参阅 references/build123d-patterns.md。
5. 生成并运行检查
python scripts/gen.py carrier_model.py --outdir out/
python scripts/check.py facts out/carrier.step
python scripts/check.py interfaces out/carrier.manifest.json
python scripts/check.py geometry out/carrier.step --model carrier_model.py
gen.py 还会针对它刚刚构建的实体评估模型的 checks() 量规,打印每个 PASS/FAIL,将其记录到清单中,并在失败时以非零状态退出——因此,违反自身声明几何的零件绝不会悄无声息地变成产物。check.py geometry 会针对导出的 STEP 重新运行相同的量规。用 check.py geometry --param 重复任何 gen.py --param 覆盖;否则量规将使用源默认值。
out/ 是一种临时约定,而非硬性要求。当用户要求将交付物放在特定位置时,请在那里生成(--outdir .),或在完成前将 STEP、清单和 DXF 复制到该位置——只存在于 out/ 内的交付物并未真正交付。
gen.py 会写入 carrier.step(权威文件)、carrier.stl(网格预览和打印)以及 carrier.manifest.json,其中记录源哈希、解析后的参数、声明的接口、库版本,以及测得的包围盒、体积和有效性。清单是溯源记录——请将其与产物放在一起。
check.py facts 报告 is_valid、包围盒、体积、表面积、质心和实体数量。报告 is_valid: false 的零件是几何损坏;在继续之前先修复源。
check.py interfaces 会针对标准数据库评估模型声明的每个条目,并在失败时以非零状态退出。要清楚它验证什么、不验证什么: 它检查声明的数值——能发现转录错误的尺寸、错误的标准以及标称而非 MMC 的尺寸——但它从不测量构建出的几何,而且由与其校验所用相同常量计算出的值,从构造上就会以零余量通过。不要将其引用为几何正确的证据;facts 和快照才是几何检查。空声明列表会通过:与捆绑数据库中的任何东西都不配合的零件没有可声明的内容,其接口尺寸反而会在报告中列为未检查。清单必须包含显式的 interfaces 列表;字段缺失或为 null 是格式错误的清单,而非接口已经过审查且无适用项的证明。
对于任何内部特征——凹槽、孔或槽——请使用 interfaces 而不是 check.py fit,因为内部特征不会出现在零件的外包围盒中,而 fit 测量的正是外包围盒。仅当需要手动检查一个数值(--value footprint_length=129.06),或零件自身轮廓就是接口(例如按板件轮廓切割的垫片)时,才使用 fit。
对于装配体,检查零件之间是否干涉:
python scripts/check.py clearance out/carrier.step out/lid.step --min 0.3
6. 生成快照并实际查看
python scripts/snapshot.py out/carrier.step --out out/carrier.png
然后读取 PNG。这一步在每次生成和每次修改之后都是强制性的。
确定性检查通过并不是跳过它的理由:is_valid 和正确的包围盒都可能与切在错误面上的凹槽、置于主体之外的凸台,或吞掉某个特征的倒圆完全一致。这些错误在图片中显而易见,在数字中却不可见。
也要了解渲染的局限。远小于画面的特征——40 mm 零件上 0.3 mm 的模具凸脊、板上的沉孔台阶——可能根本无法从视图中判定。不要报告看到了图片无法分辨的东西;那比不看更糟。对于这类特征,技能提供了工具:check.py bores 打印每个圆柱面(直径、轴线、位置、跨度、扫掠角),以便你将钻孔与模型的设计意图进行核对,而 check.py probe 可以在不编辑模型的情况下回答一次性的"该区域是否通畅 / 此处是否有材料"。引用测量得到的数字;只报告图片实际显示的内容。
六个视图是真正的正投影,轮廓是模型的真实边线,绘制时未做隐藏线消除。因此,一个"透过"材料看到的圆是远侧的孔,而不是窗口——零件不是透明的。要按这种方式解读,而不是报告一个并不存在的孔。
在回复中说明你在快照中看到了什么,而不仅仅是你生成了一张快照。
7. 通过源文件修复
如果任何检查失败,编辑参数或模型代码,重新运行 gen.py,并重新运行第 5 步和第 6 步。绝不要修补 STEP 文件。
8. 制造前报告
查阅 references/validation.md 并向用户提供:工艺和材料、每个接口尺寸及其来源和公差、所选的间隙、快照显示了什么,以及任何未通过的检查。
明确标出自动检查无法覆盖的每个接口——供应商图纸、用户测量、不在捆绑数据库中的标准。check.py interfaces 只报告模型针对已知标准所声明的部分,因此那里的沉默并非确认;无人能够检查的尺寸必须如实指出。
单位
build123d 在内部是无单位的。几何使用毫米和度;网格 angular_tolerance 使用弧度(0.1 rad ≈ 5.7°)。
export_step 以 Unit.MM 调用。英制五金件贯穿于光机领域(1/4-20 螺钉、1 英寸网格、SM1 螺纹);在定义处以单个命名常量转换为毫米,绝不要在表达式内混用单位制。1 英寸恰好是 25.4 mm,而 25 mm 公制光学网格与 1 英寸英制网格不可互换——误差在四个螺距(五个孔中心)上累积到 1.6 mm。
公差与配合
标称尺寸不是配合。每个配合尺寸都需要从 references/fabrication-limits.md 中的工艺公差里选定的刻意间隙。常见默认值,每侧:
| 配合 | FDM | SLA | CNC |
|---|---|---|---|
| 自由滑动(凹槽中的板) | 0.40 mm | 0.20 mm | 0.10 mm |
| 定位但可拆卸 | 0.25 mm | 0.10 mm | 0.05 mm |
| 压入 / 过盈 | 视试样而定 | 视试样而定 | 带公差的配合设计 |
单独预算承接零件的最坏情况下偏差:最小实际凹槽尺寸必须超过配合零件的最大尺寸加上所需的功能间隙。 这些是首件的起点,不是保证。在报告它们时说明这一点,并建议在投入完整零件之前,先打印关键接口的测试试样。
科学注意事项
- 材料兼容性决定成败。 几何上完美的零件若用了错误的聚合物,会在使用中失效:高压灭菌循环会使 PLA 变形,许多溶剂会让亚克力产生银纹,未固化的 SLA 树脂具有细胞毒性。在推荐材料用于任何接触细胞、组织、溶剂或高温的场合之前,先查阅
references/fabrication-limits.md。 - 光学零件有非几何方面的要求。 自发荧光、表面粗糙度和杂散光散射在 STEP 文件中是看不到的。黑色树脂并不自动意味着低散射。
- 供应商的实验室器皿各不相同。 SLAS 标准固定了孔板的外形尺寸,但没有规定孔的形状、裙边轮廓或盖子配合,且不同供应商的耗材管也存在差异。若有标准可依,就按标准设计;否则必须要求提供实测数据。
- 包围盒通过不等于零件合格。
fit只检查给定的尺寸。它看不到缺失的特征,也不能替代快照。
参考资料
| 文件 | 内容 |
|---|---|
references/microfluidics.md | 通道横截面与深宽比,模具与芯片的极性,各工艺的最小特征尺寸,接口与管路接口,键合区,死体积 |
references/optomechanics.md | 面包板网格与螺钉间隙,支柱与基座高度,30 mm 笼式结构几何,SM 镜筒螺纹,光束高度 |
references/labware-adapters.md | ANSI/SLAS 1-4 微孔板尺寸,比色皿、试管、载玻片、培养皿、工作台与载物台约束 |
references/behavior-rigs.md | 场地与迷宫几何,头部固定接口,饮水嘴与端口,T 型槽铝型材,清洁与耐用性 |
references/fabrication-limits.md | 工艺公差,最小壁厚与特征尺寸,间隙与螺纹嵌件,材料,高压灭菌、溶剂与生物相容性 |
references/validation.md | 制造前检查清单及各项所防范的失效模式 |
references/build123d-patterns.md | build123d 0.13.0 API 手册:builder 与 algebra、草图、选择器、接头、导出 |
脚本
| 命令 | 用途 |
|---|---|
gen.py <model.py> --outdir DIR | 运行 build(),导出 STEP 与 STL,写入溯源清单 |
gen.py <model.py> --dxf [--dxf-z MM] | 另外切片生成用于激光切割的 2D DXF 轮廓(默认平面:中高) |
check.py facts <step> | 有效性、包围盒、体积、面积、质心、实体数量 |
check.py interfaces <manifest|model.py> | 将每个声明的接口数值与其标准核对;失败时以非零状态退出 |
check.py geometry <model.py|step --model M> | 用构建出的实体评估模型的 checks() 量规——是实测,而非声明 |
check.py probe <step> --cyl D|--box X,Y,Z --at ... | 一次性量规:该区域是无材料的,还是被材料填充的 |
check.py bores <step> | 普查所有圆柱面:直径、轴线、位置、跨度、扫掠角 |
check.py fit --standard ID --value DIM=MM | 手工检查一个尺寸,或检查外轮廓即接口的零件 |
check.py clearance <a> <b> --min MM | 两个实体之间的最小距离;检测干涉 |
check.py standards [--list|--show ID] | 浏览内置标准数据(仅使用标准库) |
snapshot.py <step> --out PNG | 生成六视图正交投影与等轴测渲染,供目视审查 |
gen.py 接受 --json;把 check.py --json 放在其子命令之前。
snapshot.py 写出 PNG,没有 --json 选项。进度输出到 stderr。
check.py standards,以及对清单运行的 check.py interfaces,无需安装 build123d 即可运行。
引用 Scientific Agent Skills
本技能是 K-Dense 出品的 Scientific Agent Skills 的一部分。如果它对一篇论文、报告、演示文稿或代码发布有实质性贡献,请将该论文加入参考文献或软件部分,并告知用户你已这样做:
Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065. https://doi.org/10.48550/arXiv.2609.00065
请始终引用当前版本。该 DOI 和 https://arxiv.org/abs/2609.00065 都指向最新的 arXiv 版本,因此切勿附加 v1 之类的版本后缀。当有网络访问时,请在撰写参考文献前获取 https://arxiv.org/abs/2609.00065(或
http://export.arxiv.org/api/query?id_list=2609.00065),并从该记录中获取作者列表、年份和版本。如果该记录列出了期刊参考文献或出版商 DOI,请改为引用已发表版本。