草图教程
本节的目的是演示如何使用不同的方法构建草图。
Face-based API
构建草图的主要方法是基于构建面并使用布尔运算将它们组合起来。
import cadquery as cq
result = (
cq.Sketch()
.trapezoid(4, 3, 90)
.vertices()
.circle(0.5, mode="s")
.reset()
.vertices()
.fillet(0.25)
.reset()
.rarray(0.6, 1, 5, 1)
.slot(1.5, 0.4, mode="s", angle=90)
)
请注意,选择器已实现,但必须显式重置选择。Sketch 类不实现历史记录,所有修改都就地发生。
Modes
Face API 的每个操作都接受一个模式参数,用来定义如何将创建的对象与现有对象组合。它可以被融合 ( mode='a'
)、切割 ( mode='s'
)、相交 ( mode='i'
) 或只是用于构造的存储 ( mode='c'
)。在最后一种情况下,必须指定 一个tag
以便稍后能够引用该对象。默认情况下,面会融合在一起。请注意上例中减法和加法模式的使用。下面将演示另外两种情况。
result = (
cq.Sketch()
.rect(1, 2, mode="c", tag="base")
.vertices(tag="base")
.circle(0.7)
.reset()
.edges("|Y", tag="base")
.ellipse(1.2, 1, mode="i")
.reset()
.rect(2, 2, mode="i")
.clean()
)
Edge-based API
如果需要,可以通过单独放置边来构建草图。
import cadquery as cq
result = (
cq.Sketch()
.segment((0.0, 0), (0.0, 2.0))
.segment((2.0, 0))
.close()
.arc((0.6, 0.6), 0.4, 0.0, 360.0)
.assemble(tag="face")
.edges("%LINE", tag="face")
.vertices()
.chamfer(0.2)
)
构建完成后,必须使用 assemble()
将其转换为基于面的表示。之后,可以应用基于面部的操作。
Convex hull
::: warning 警告
凸面功能目前处于实验阶段。
对于某些特殊用例,凸面可以由直线段和圆构造。
:::
result = (
cq.Sketch()
.arc((0, 0), 1.0, 0.0, 360.0)
.arc((1, 1.5), 0.5, 0.0, 360.0)
.segment((0.0, 2), (-1, 3.0))
.hull()
)
Constraint-based sketches
::: warning 警告
2D 草图约束和求解器目前处于实验阶段。
最后,如果需要,可以使用几何约束来构建草图。
:::
到目前为止,在此类用例中只能使用线段和圆弧。
import cadquery as cq
result = (
cq.Sketch()
.segment((0, 0), (0, 3.0), "s1") # 线段
.arc((0.0, 3.0), (1.5, 1.5), (0.0, 0.0), "a1") # 弧线
.constrain("s1", "Fixed", None)
.constrain("s1", "a1", "Coincident", None)
.constrain("a1", "s1", "Coincident", None)
.constrain("s1", "a1", "Angle", 45)
.solve()
.assemble()
)
实施以下约束。参数作为一个元组传入constrain()
。在此表中,0…1指 0 和 1 之间的浮点数,其中 0 将创建相对于元素开头的约束,1 将创建相对于元素结尾的约束。
|名称 |数量 |实体 |参数 |描述 |
|:–|
|Fixed |1 |全部 |None 表示圆弧中心
0…1 表示线段/圆弧上的点 |指定点是固定的 |
|FixedPoint |2 |全部 |没有任何 |固定点 |
|Coincident |2 |全部 |没有任何 |指定点重合 |
|Angle |2 |全部 |角度 |两个实体的切线之间的角度是固定的 |
|Length |1 |全部 |长度 |指定实体具有固定长度 |
|Distance |2 |全部 |无或 0…1、无或 0…1、距离 |两点之间的距离是固定的 |
|Radius |1 |弧 |半径 |指定实体具有固定半径 |
|Orientation |1 |部分 |x,y |指定实体平行于(x,y) |
|ArcAngle |1 |弧 |角度 |指定实体为固定角度跨度 |
Workplane integration
草图创建后,可用于在工作平面上构建各种特征。支持的操作包括extrude()
、 twistExtrude()
、revolve()
、 sweep()
、cutBlind()
、cutThruAll()
、loft()
。
草图可以作为单独的实体创建并重复使用,也可以在一个流畅的调用链中临时创建,如下所示。
请注意,草图放置在堆栈顶部的所有位置。
就地构建草图可以按如下方式完成。
import cadquery as cq
result = (
cq.Workplane()
.box(5, 5, 1)
.faces(">Z")
.sketch()
.regularPolygon(2, 3, tag="outer")
.regularPolygon(1.5, 3, mode="s")
.vertices(tag="outer")
.fillet(0.2)
.finalize()
.extrude(0.5)
)
Sketch API 在调用 sketch()
和原始工作平面后可用。
当在构建草图之前选择多个元素时,将创建多个草图。
import cadquery as cq
result = (
cq.Workplane()
.box(5, 5, 1)
.faces(">Z")
.workplane()
.rarray(2, 2, 2, 2) # 生成一个矩形位置阵列
.rect(1.5, 1.5)
.extrude(0.5)
.faces(">Z")
.sketch()
.circle(0.4)
.wires()
.distribute(6) # 沿选定的边缘或导线分布位置
.circle(0.1, mode="a")
.clean()
.finalize() # 完成草图绘制并返回父级
.cutBlind(-0.5, taper=10)
)
有时需要重复使用现有草图,并将其原样放置在工作平面上。
import cadquery as cq
s = cq.Sketch().trapezoid(3, 1, 110).vertices().fillet(0.2) # 构建一个梯形面
result = (
cq.Workplane()
.box(5, 5, 5)
.faces(">X")
.workplane()
.transformed((0, 0, -90))
.placeSketch(s)
.cutThruAll()
)
使用loft()
时需要重用现有草图。
from cadquery import Workplane, Sketch, Vector, Location
s1 = Sketch().trapezoid(3, 1, 110).vertices().fillet(0.2)
s2 = Sketch().rect(2, 1).vertices().fillet(0.2)
result = Workplane().placeSketch(s1, s2.moved(Location(Vector(0, 0, 3)))).loft()
放样时仅考虑外部线,而忽略内部线。请注意,当前操作仅考虑堆栈顶部的草图(即没有待处理的草图),因此在放样或扫描时,必须将所有相关草图添加到一个地方草图调用中。