界面已本地化;技能介绍与说明文档按所选语言由 AI 自动翻译,代码、命令、路径和专业术语保留原文,以原作者文档为准。
探索技能
设计与创意 · SKILL.md

cadquery

cadquery

【设计与创意】Use when scripting parametric 3D CAD models in Python — programmatic part generation, parametric design optimization, STEP export. CadQuery: Python-based parametric CAD built on OCCT kernel with a fluent API.

独立 GitHub 快照 · 自动分类 · 以原作者文档为准

技能说明

GitHub

name: cadquery description: "Use when scripting parametric 3D CAD models in Python — programmatic part generation, parametric design optimization, STEP export. CadQuery: Python-based parametric CAD built on OCCT kernel with a fluent API." tags:

  • python
  • 3d
  • parametric
  • brep
  • step
  • stl
  • occt
  • cad

项目地址: https://github.com/CadQuery/cadquery

官方文档: https://cadquery.readthedocs.io/en/latest/

GUI: CQ-editor(https://github.com/CadQuery/CQ-editor)

许可证: Apache-2.0

概述

CadQuery 与 OpenSCAD 的对比:

维度OpenSCADCadQuery
语言自有 DSLPython
几何内核CGAL/ManifoldOCCT
模型CSG(实体加减)BREP(带圆角/曲面/约束)
装配手动内置 Assembly
特征命名弱通过 Selector 访问面/边/顶点
输出STL/OFF/DXFSTEP/IGES/STL/glTF/DXF/SVG

安装

# Conda(推荐,自动带 OCCT)
conda install -c conda-forge cadquery
# pip
pip install cadquery
# 安装 GUI
pip install cq-editor

当前稳定版 2.8.0(截至2026年9月,参见 CadQuery GitHub Releases)。PyPI 包要求 Python ≥ 3.11;conda-forge 通道同步发布(几何依赖 cadquery-ocp,基于 OCCT)。


Hello CadQuery

import cadquery as cq

result = (
    cq.Workplane("XY")
      .box(80, 60, 10)            # 立方体
      .faces(">Z").workplane()     # 选择 +Z 面,建立工作平面
      .hole(8)                    # 钻孔
      .edges("|Z").fillet(2)      # Z 方向边圆角 2
)

cq.exporters.export(result, "out.step")
cq.exporters.export(result, "out.stl")

工作平面(Workplane)

wp = cq.Workplane("XY")               # XY/YZ/XZ 或自定义
wp = (cq.Workplane("front")           # 命名平面
        .center(10, 0)                # 偏移工作平面原点
        .rotateAboutCenter((0,0,1), 30))

二维草图与拉伸

result = (cq.Workplane("XY")
            .moveTo(0, 0)
            .lineTo(50, 0)
            .lineTo(50, 30).lineTo(0, 30).close()
            .extrude(20))

# 圆形 → 拉伸为圆柱
cyl = cq.Workplane("XY").circle(10).extrude(50)

# 矩形阵列
plate = (cq.Workplane("XY").rect(100, 60).extrude(2)
          .faces(">Z").workplane()
          .rarray(10, 10, 8, 5).hole(3))   # 8x5 阵列孔

Selector(核心特性)

result = result.faces(">Z")        # 最大 Z 的面
              .edges("|X")         # 平行 X 方向的边
              .vertices("<Y")       # 最小 Y 的顶点
              .faces("not >Z and %CIRCLE")  # 复合
表达式含义
>Z / <Z最大/最小 Z 方向
`X`
#X垂直 X 轴
%CIRCLE圆形(曲率)
%PLANE平面
>>X严格按 X 排序

修饰特征

res = (cq.Workplane("XY").box(50, 30, 10)
        .edges("|Z").fillet(2)             # 圆角
        .edges(">Z").chamfer(0.5)          # 倒角
        .faces(">Z").shell(-1.5))          # 抽壳,开口面

# 镜像 / 阵列 / 扫掠 / 放样
res = res.mirror("XY")
loft = (cq.Workplane("XY").circle(10).workplane(offset=10)
          .rect(15, 15).loft())

path = cq.Workplane("XZ").moveTo(0,0).lineTo(0,20).lineTo(20,20)
swept = cq.Workplane("XY").circle(2).sweep(path)

布尔运算

a = cq.Workplane("XY").box(20, 20, 10)
b = cq.Workplane("XY").translate((10, 0, 5)).cylinder(20, 5)

c = a.union(b)
c = a.cut(b)
c = a.intersect(b)

Sketch(新草图 API)

sk = (cq.Sketch()
        .rect(60, 40)
        .circle(10, mode='s')             # 减
        .reset().rect(50, 30, mode='i')   # 交
        .reset().vertices().fillet(3))

result = cq.Workplane().placeSketch(sk).extrude(10)

装配(Assembly)

asm = (cq.Assembly()
        .add(plate, name='base', color=cq.Color('gray'))
        .add(screw, name='screw1', loc=cq.Location((10, 10, 2))))

asm.constrain('base@faces@>Z', 'screw1@faces@<Z', 'Plane')
asm.solve()
asm.save('out.step')
asm.save('out.glb', 'GLTF')

参数化设计与脚本

def make_box(L, W, H, hole_d=8):
    return (cq.Workplane('XY').box(L, W, H)
              .faces('>Z').workplane().hole(hole_d))

for L in (40, 60, 80):
    cq.exporters.export(make_box(L, 30, 10), f'box_{L}.step')

CQ-editor / Jupyter

# 在 cq-editor 中:
show_object(result, name='part', options={'color': (0.7, 0.7, 0.9)})

# 在 Jupyter:
from jupyter_cadquery import show
show(result)

导出

cq.exporters.export(result, "out.step")   # STEP
cq.exporters.export(result, "out.brep")
cq.exporters.export(result, "out.stl",  tolerance=0.01)
cq.exporters.export(result, "out.dxf")
cq.exporters.export(result, "out.svg")

典型工作流

工作流一:从草图到 STEP 的完整零件建模

  1. 确定零件几何参数(长宽高、孔径、圆角半径等),封装为 Python 函数参数
  2. 使用 cq.Workplane("XY") 创建基准面
  3. 绘制 2D 草图轮廓(rect/circle/polyline 等)
  4. extrude(length) 生成 3D 实体
  5. 通过 Selector(.faces(">Z") / .edges("|Z"))定位特征面/边
  6. 添加修饰:fillet() / chamfer() / shell()
  7. cq.exporters.export(result, "out.step") 导出 STEP 用于下游加工

工作流二:CI 流水线批量参数化生成

  1. 编写参数化模型函数(接受尺寸参数,返回 Workplane 对象)
  2. 在 GitHub Actions / Jenkins 中安装 cadquery(conda-forge)
  3. 脚本遍历参数矩阵,调用模型函数,导出 STL/STEP
  4. 将输出文件上传为构建产物(Artifacts),或直接在 CI 中对比几何差异
  5. 对于复杂装配,使用 cq.Assembly 组合多个零件并添加约束

性能优化

  1. 使用 Sketch API 比逐边 lineTo 更高效
  2. 大量阵列用 rarray/cboreHole 等专用方法
  3. 复杂模型缓存中间 Workplane 实例
  4. 导出 STL 调整 tolerance / angularTolerance
  5. CI 中无显示运行用 headless Python,避免 cq-editor

常见问题

问题解决
OCCT 异常检查输入几何是否合法;调用 .clean()
Selector 选不到使用 result.faces().vals() 调试
圆角失败减小半径或拆分到边集合后逐一加
Conda 安装慢使用 mamba
cq.Assembly 求解失败减少冲突约束、给定初始 Location

AI 使用建议

  • 推荐工作流模式:AI 助手应将几何逻辑封装为可复用的 Python 函数,利用 CadQuery 的 fluent API 链式描述几何操作序列——遵循「基准面 → 2D 草图 → 拉伸/扫掠 → Selector 定位 → 修饰 → 导出」的模式。
  • 关键注意事项:① Selector 表达式需要调试,result.faces().vals() 可列出所有面供排查;② 圆角/倒角失败通常意味着半径过大或边不连续,可逐一添加而非批量;③ 布尔运算前确保实体无退化几何;④ Assembly 求解是数值优化,减少约束数量可提高成功率。
  • 常用代码模式:cq.Workplane("XY").rect(...).extrude(...).faces(">Z").workplane().hole(...) 是最经典的模式;多零件建模用 cq.Assembly().add(...).constrain(...).solve() 装配。

相关技能


参考资源

我的收藏