第03章-3D建模操作
第03章:3D建模操作
3.1 拉伸操作(Extrude)
3.1.1 基本拉伸
拉伸是将2D草图转换为3D实体的最基本操作。CadQuery提供了多种拉伸方法:
标准拉伸:
import cadquery as cq
# 基本拉伸 - 将矩形拉伸成长方体
result = (
cq.Workplane("XY")
.rect(20, 10) # 创建20x10的矩形
.extrude(15) # 向上拉伸15mm
)
cq.exporters.export(result, "basic_extrude.step")
负方向拉伸:
# 向负方向拉伸
result = (
cq.Workplane("XY")
.rect(20, 10)
.extrude(-15) # 向Z负方向拉伸
)
双向拉伸:
# 向两个方向同时拉伸
result = (
cq.Workplane("XY")
.rect(20, 10)
.extrude(15, both=True) # 上下各拉伸15mm,总高30mm
)
3.1.2 锥度拉伸
拉伸时可以添加锥度,使截面逐渐收缩或扩大:
# 带锥度的拉伸
result = (
cq.Workplane("XY")
.rect(20, 20)
.extrude(30, taper=10) # 锥度10度
)
# 创建锥台(截头圆锥)
cone = (
cq.Workplane("XY")
.circle(20)
.extrude(30, taper=15)
)
锥度的正负值含义:
- 正值:截面向上逐渐收小
- 负值:截面向上逐渐扩大
3.1.3 切除拉伸
使用拉伸操作从现有实体中切除材料:
cutThruAll - 完全贯穿切除:
# 创建贯穿孔
result = (
cq.Workplane("XY")
.box(30, 30, 20)
.faces(">Z")
.workplane()
.circle(5)
.cutThruAll() # 完全贯穿
)
cutBlind - 盲孔切除:
# 创建盲孔
result = (
cq.Workplane("XY")
.box(30, 30, 20)
.faces(">Z")
.workplane()
.rect(10, 10)
.cutBlind(-10) # 向下切除10mm
)
3.1.4 偏移拉伸
创建偏移草图后再拉伸:
# 偏移草图并拉伸
result = (
cq.Workplane("XY")
.rect(20, 20)
.offset2D(5) # 向外偏移5mm
.extrude(10)
)
3.2 旋转操作(Revolve)
3.2.1 基本旋转
旋转操作将2D草图绕轴线旋转生成3D实体,常用于创建回转体:
import cadquery as cq
# 创建一个花瓶形状
result = (
cq.Workplane("XZ") # 在XZ平面上绘制轮廓
.moveTo(0, 0)
.lineTo(20, 0)
.lineTo(20, 5)
.lineTo(15, 10)
.lineTo(12, 30)
.lineTo(15, 50)
.lineTo(10, 55)
.lineTo(10, 60)
.lineTo(0, 60)
.close()
.revolve(360, (0, 0, 0), (0, 1, 0)) # 绕Y轴旋转360度
)
cq.exporters.export(result, "vase.step")
revolve参数说明:
- 第一个参数:旋转角度(度)
- 第二个参数:旋转轴经过的点
- 第三个参数:旋转轴的方向向量
3.2.2 部分旋转
可以只旋转部分角度:
# 创建90度的扇形
result = (
cq.Workplane("XZ")
.moveTo(0, 0)
.lineTo(20, 0)
.lineTo(20, 30)
.lineTo(0, 30)
.close()
.revolve(90, (0, 0, 0), (0, 1, 0)) # 只旋转90度
)
3.2.3 旋转切除
类似拉伸切除,可以使用旋转进行切除操作:
# 在圆柱上旋转切除一个凹槽
result = (
cq.Workplane("XY")
.circle(30)
.extrude(50)
# 在侧面切除凹槽
.faces(">Z")
.workplane()
.transformed(rotate=(90, 0, 0))
.moveTo(0, 25)
.rect(5, 10)
.revolve(360, (0, 0, 0), (0, 0, 1), clean=True)
)
3.2.4 常见回转体示例
创建球体:
# 创建球体
sphere = (
cq.Workplane("XZ")
.moveTo(0, 0)
.threePointArc((20, 20), (0, 40))
.close()
.revolve(360, (0, 0, 0), (0, 1, 0))
)
创建圆环:
# 创建圆环(甜甜圈形状)
torus = (
cq.Workplane("XZ")
.center(30, 0) # 将圆心移到距离轴30mm处
.circle(10) # 小圆半径10mm
.revolve(360, (0, 0, 0), (0, 1, 0))
)
3.3 扫略操作(Sweep)
3.3.1 基本扫略
扫略操作将草图沿路径移动生成3D实体:
import cadquery as cq
# 沿直线扫略
result = (
cq.Workplane("XY")
.rect(10, 10)
.sweep(
cq.Workplane("XZ").spline([(0, 0), (30, 20), (60, 0)])
)
)
cq.exporters.export(result, "sweep_basic.step")
3.3.2 螺旋扫略
创建螺旋形状:
# 创建螺旋弹簧
# 首先创建螺旋线路径
helix_path = (
cq.Wire.makeHelix(
pitch=5, # 螺距
height=50, # 总高度
radius=15 # 半径
)
)
# 然后沿螺旋线扫略圆形截面
spring = (
cq.Workplane("XY")
.circle(2) # 弹簧丝直径4mm
.sweep(helix_path, isFrenet=True)
)
cq.exporters.export(spring, "spring.step")
3.3.3 沿样条曲线扫略
# 创建弯曲的管道
path_points = [
(0, 0, 0),
(50, 20, 10),
(100, 0, 30),
(150, -20, 20),
(200, 0, 0)
]
path = cq.Workplane("XY").spline(path_points)
pipe = (
cq.Workplane("YZ")
.circle(5)
.sweep(path)
)
cq.exporters.export(pipe, "curved_pipe.step")
3.3.4 扫略选项
扫略支持多种选项来控制截面在路径上的行为:
# isFrenet - 使用Frenet坐标系(截面保持垂直于路径)
result = cq.Workplane("XY").circle(5).sweep(path, isFrenet=True)
# transition - 指定截面过渡方式
# "right" - 右手规则
# "transformed" - 变换
# "round" - 圆滑
result = cq.Workplane("XY").circle(5).sweep(path, transition="round")
# makeSolid - 是否生成实体(默认True)
# 设为False可以生成薄壳
result = cq.Workplane("XY").circle(5).sweep(path, makeSolid=False)
3.4 放样操作(Loft)
3.4.1 基本放样
放样操作连接多个截面生成平滑的3D实体:
import cadquery as cq
# 从正方形渐变到圆形
result = (
cq.Workplane("XY")
.rect(20, 20) # 底部正方形
.workplane(offset=30) # 移动到高度30
.circle(15) # 顶部圆形
.loft() # 放样连接
)
cq.exporters.export(result, "loft_basic.step")
3.4.2 多截面放样
可以使用多个截面进行放样:
# 三个截面的放样
result = (
cq.Workplane("XY")
.rect(30, 30) # 底部
.workplane(offset=20)
.rect(20, 20) # 中间
.workplane(offset=20)
.circle(5) # 顶部
.loft()
)
3.4.3 放样选项
# ruled - 直纹曲面(截面间直线连接)
result = cq.Workplane("XY").rect(20, 20).workplane(offset=30).circle(10).loft(ruled=True)
# combine - 是否与现有实体合并
result = cq.Workplane("XY").rect(20, 20).workplane(offset=30).circle(10).loft(combine=True)
3.4.4 使用Sketch进行放样
from cadquery import Sketch
# 使用Sketch API创建更复杂的放样
s1 = Sketch().rect(30, 30).vertices().fillet(5)
s2 = Sketch().circle(10)
result = (
cq.Workplane("XY")
.placeSketch(s1)
.workplane(offset=40)
.placeSketch(s2)
.loft()
)
3.5 孔特征操作
3.5.1 简单孔
import cadquery as cq
# 创建简单的贯穿孔
result = (
cq.Workplane("XY")
.box(40, 40, 20)
.faces(">Z")
.workplane()
.hole(10) # 直径10mm的贯穿孔
)
3.5.2 沉头孔
# 创建沉头孔
result = (
cq.Workplane("XY")
.box(40, 40, 20)
.faces(">Z")
.workplane()
.cboreHole(
diameter=8, # 孔直径
cboreDiameter=16, # 沉头直径
cboreDepth=5 # 沉头深度
)
)
3.5.3 埋头孔
# 创建埋头孔(锥形沉头)
result = (
cq.Workplane("XY")
.box(40, 40, 20)
.faces(">Z")
.workplane()
.cskHole(
diameter=8, # 孔直径
cskDiameter=16, # 锥形顶部直径
cskAngle=82 # 锥形角度
)
)
3.5.4 盲孔
# 创建指定深度的盲孔
result = (
cq.Workplane("XY")
.box(40, 40, 20)
.faces(">Z")
.workplane()
.hole(10, depth=15) # 深度15mm的盲孔
)
3.5.5 多孔阵列
# 创建孔阵列
result = (
cq.Workplane("XY")
.box(100, 60, 10)
.faces(">Z")
.workplane()
.rarray(20, 15, 4, 3) # 4x3的矩形阵列
.hole(5)
)
# 圆周阵列孔
result = (
cq.Workplane("XY")
.box(60, 60, 10)
.faces(">Z")
.workplane()
.polarArray(20, 0, 360, 8) # 半径20,8个孔均布
.hole(4)
)
3.6 圆角与倒角
3.6.1 圆角(Fillet)
import cadquery as cq
# 对所有边进行圆角
result = (
cq.Workplane("XY")
.box(20, 20, 10)
.edges()
.fillet(2)
)
# 只对竖直边进行圆角
result = (
cq.Workplane("XY")
.box(20, 20, 10)
.edges("|Z") # 选择平行于Z轴的边
.fillet(3)
)
# 只对顶面边缘进行圆角
result = (
cq.Workplane("XY")
.box(20, 20, 10)
.edges(">Z") # 选择Z最大的边
.fillet(2)
)
3.6.2 倒角(Chamfer)
# 对所有边进行倒角
result = (
cq.Workplane("XY")
.box(20, 20, 10)
.edges()
.chamfer(1)
)
# 不对称倒角
result = (
cq.Workplane("XY")
.box(20, 20, 10)
.edges("|Z")
.chamfer(2, 1) # 长度2mm和1mm的不对称倒角
)
# 只对某些边倒角
result = (
cq.Workplane("XY")
.box(20, 20, 10)
.edges(">Z")
.chamfer(1.5)
)
3.6.3 选择性圆角/倒角
# 使用标签选择特定边
result = (
cq.Workplane("XY")
.box(20, 20, 10)
.edges("|Z and >X") # 平行于Z轴且X最大的边
.fillet(2)
)
# 排除某些边
result = (
cq.Workplane("XY")
.box(20, 20, 10)
.edges("not |Z") # 不是平行于Z轴的边
.chamfer(1)
)
3.7 薄壳操作(Shell)
3.7.1 基本薄壳
import cadquery as cq
# 创建一个盒子并挖空
result = (
cq.Workplane("XY")
.box(30, 20, 15)
.faces(">Z") # 选择要开口的面
.shell(-2) # 壁厚2mm(负值表示向内偏移)
)
cq.exporters.export(result, "shell_box.step")
3.7.2 多面开口
# 选择多个面开口
result = (
cq.Workplane("XY")
.box(30, 20, 15)
.faces(">Z or <Z") # 顶面和底面开口
.shell(2)
)
3.7.3 保持某些面不开口
# 只保留顶面开口
result = (
cq.Workplane("XY")
.box(30, 20, 15)
.faces(">Z")
.shell(-2)
)
# 等效于将其他5个面挖空
3.8 布尔运算
3.8.1 并集(Union)
import cadquery as cq
# 两个实体的并集
box = cq.Workplane("XY").box(20, 20, 10)
cylinder = cq.Workplane("XY").cylinder(15, 8)
result = box.union(cylinder)
3.8.2 差集(Cut)
# 从盒子中减去圆柱
box = cq.Workplane("XY").box(20, 20, 10)
cylinder = cq.Workplane("XY").cylinder(15, 5)
result = box.cut(cylinder)
3.8.3 交集(Intersect)
# 两个实体的交集
box = cq.Workplane("XY").box(20, 20, 20)
sphere = cq.Workplane("XY").sphere(15)
result = box.intersect(sphere)
3.8.4 组合操作
# 复杂的布尔运算组合
base = cq.Workplane("XY").box(50, 50, 10)
# 添加圆柱凸台
boss = cq.Workplane("XY").center(0, 0).circle(10).extrude(20)
result = base.union(boss)
# 在凸台上钻孔
hole = cq.Workplane("XY").center(0, 0).circle(5).extrude(30)
result = result.cut(hole)
# 对边缘倒圆角
result = result.edges().fillet(2)
3.9 综合实例
3.9.1 创建法兰盘
import cadquery as cq
# 参数定义
outer_diameter = 100
inner_diameter = 50
flange_thickness = 15
bolt_circle_diameter = 75
bolt_hole_diameter = 10
num_bolts = 6
hub_diameter = 60
hub_height = 30
# 创建法兰盘
result = (
cq.Workplane("XY")
# 外圆盘
.circle(outer_diameter / 2)
.extrude(flange_thickness)
# 中心凸台
.faces(">Z")
.workplane()
.circle(hub_diameter / 2)
.extrude(hub_height)
# 中心孔
.faces(">Z")
.workplane()
.hole(inner_diameter)
# 螺栓孔
.faces("<Z")
.workplane(invert=True)
.polarArray(bolt_circle_diameter / 2, 0, 360, num_bolts)
.hole(bolt_hole_diameter)
# 圆角
.edges("|Z")
.fillet(3)
)
cq.exporters.export(result, "flange.step")
3.9.2 创建支架
import cadquery as cq
# 参数
base_width = 80
base_depth = 50
base_height = 10
rib_height = 60
rib_thickness = 8
hole_diameter = 20
# 创建L型支架
result = (
cq.Workplane("XY")
# 底板
.box(base_width, base_depth, base_height)
# 立板
.faces(">Z")
.workplane()
.center(-base_width/2 + rib_thickness/2, 0)
.rect(rib_thickness, base_depth)
.extrude(rib_height)
# 立板上的孔
.faces(">X")
.workplane()
.center(0, rib_height/2 + base_height/2)
.hole(hole_diameter)
# 加强筋
.faces(">Z")
.workplane(offset=-rib_height)
.moveTo(-base_width/2 + rib_thickness, 0)
.lineTo(-base_width/2 + rib_thickness + 20, 0)
.lineTo(-base_width/2 + rib_thickness, 20)
.close()
.extrude(base_depth, both=True)
# 圆角
.edges("|Y and >Z")
.fillet(5)
)
cq.exporters.export(result, "bracket.step")
3.10 本章小结
本章详细介绍了CadQuery的核心3D建模操作:
-
拉伸操作
- 基本拉伸、锥度拉伸
- 切除拉伸(cutThruAll、cutBlind)
-
旋转操作
- 回转体创建
- 部分旋转和旋转切除
-
扫略操作
- 沿路径扫略
- 螺旋扫略
-
放样操作
- 多截面连接
- 放样选项
-
孔特征
- 各类孔(简单孔、沉头孔、埋头孔)
- 孔阵列
-
圆角与倒角
- 选择性处理边
-
薄壳操作
-
布尔运算
通过本章的学习,您应该能够:
- 使用各种方法将2D草图转换为3D实体
- 创建复杂的回转体和扫略体
- 添加孔、圆角、倒角等特征
- 使用布尔运算组合实体
下一章我们将学习选择器系统,这是CadQuery中非常强大的特性,用于精确选择几何元素。

浙公网安备 33010602011771号