第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建模操作:

  1. 拉伸操作

    • 基本拉伸、锥度拉伸
    • 切除拉伸(cutThruAll、cutBlind)
  2. 旋转操作

    • 回转体创建
    • 部分旋转和旋转切除
  3. 扫略操作

    • 沿路径扫略
    • 螺旋扫略
  4. 放样操作

    • 多截面连接
    • 放样选项
  5. 孔特征

    • 各类孔(简单孔、沉头孔、埋头孔)
    • 孔阵列
  6. 圆角与倒角

    • 选择性处理边
  7. 薄壳操作

  8. 布尔运算

通过本章的学习,您应该能够:

  • 使用各种方法将2D草图转换为3D实体
  • 创建复杂的回转体和扫略体
  • 添加孔、圆角、倒角等特征
  • 使用布尔运算组合实体

下一章我们将学习选择器系统,这是CadQuery中非常强大的特性,用于精确选择几何元素。


posted @ 2026-01-10 13:15  我才是银古  阅读(15)  评论(0)    收藏  举报