CadQuery选择器(Selectors)完全指南:精准控制3D建模元素
选择器概述
在CadQuery中,选择器(Selectors)是用于筛选各种类型对象列表的强大工具。它们允许开发者精确地定位和操作3D模型中的特定元素,如边(Edges)、面(Faces)和顶点(Vertices)等。选择器可以理解为一种高级过滤器,能够基于多种条件从复杂模型中提取所需部分。
基础选择方法
CadQuery提供了几种基础方法来收集不同类型的几何元素:
vertices()
:选择顶点edges()
:选择边faces()
:选择面shells()
:选择壳solids()
:选择实体
这些方法既可以接受字符串形式的快捷选择器,也可以接受完整的选择器对象。字符串选择器实际上是完整选择器类的简写形式,使用起来更加便捷。
选择器组合逻辑
CadQuery的选择器支持逻辑组合,使得筛选条件更加灵活多变。当前支持以下逻辑运算符:
- and:逻辑与
- or:逻辑或
- not:逻辑非
- exc[ept]:集合差
例如,以下代码选择所有平行于Z轴且位于Y轴正方向的边,并对其进行倒角处理:
result = cq.Workplane("XY").box(2, 2, 2).edges("|Z and >Y").chamfer(0.2)
更复杂的组合也是可能的,如下例所示:
result = (
cq.Workplane("XY")
.box(2, 2, 2)
.faces(">Z")
.shell(-0.2)
.faces(">Z")
.edges("not(<X or >X or <Y or >Y)")
.chamfer(0.1)
)
面(Faces)选择器详解
面选择器通常基于面的法向量方向进行筛选。以下是常用的面选择器及其功能:
| 选择器 | 描述 | 对应选择器类 | |--------|------|--------------| | +Z | 选择法向量指向+Z方向的面 | DirectionSelector | | |Z | 选择法向量平行于Z轴的面 | ParallelDirSelector | | -X | 选择法向量指向-X方向的面 | DirectionSelector | | #Z | 选择法向量垂直于Z轴的面 | PerpendicularDirSelector | | %Plane | 选择平面类型的面 | TypeSelector | | >Y | 选择在Y轴正方向最远的面 | DirectionMinMaxSelector | | <Y | 选择在Y轴负方向最远的面 | DirectionMinMaxSelector | | >Y[-2] | 选择法向量指向Y轴正方向第二远的面 | DirectionNthSelector | | <Y[0] | 选择法向量指向Y轴负方向最近的面 | DirectionNthSelector | | >>Y[-2] | 选择在Y轴方向第二远的面 | CenterNthSelector | | <<Y[0] | 选择在Y轴方向最近的面 | CenterNthSelector |
重要提示:对于非平面面,选择器将在面的质心处进行评估,这可能导致意外的结果。
边(Edges)选择器详解
边选择器通常基于边的方向进行筛选。以下是常用的边选择器:
| 选择器 | 描述 | 对应选择器类 | |--------|------|--------------| | +Z | 选择沿Z轴方向的边 | DirectionSelector | | |Z | 选择平行于Z轴的边 | ParallelDirSelector | | -X | 选择沿-X轴方向的边 | DirectionSelector | | #Z | 选择垂直于Z轴的边 | PerpendicularDirSelector | | %Line | 选择直线类型的边 | TypeSelector | | >Y | 选择在Y轴正方向最远的边 | DirectionMinMaxSelector | | <Y | 选择在Y轴负方向最远的边 | DirectionMinMaxSelector | | >Y[1] | 选择在Y轴正方向第二近的平行边 | DirectionNthSelector | | <Y[-2] | 选择在Y轴负方向第二远的平行边 | DirectionNthSelector | | >>Y[-2] | 选择在Y轴方向第二远的边 | CenterNthSelector | | <<Y[0] | 选择在Y轴方向最近的边 | CenterNthSelector |
注意:非线性边(如圆弧)只能通过类型选择器(%)和中心选择器(>>)进行选择。
顶点(Vertices)选择器详解
顶点选择器基于顶点的位置进行筛选,可用的选择器较少:
| 选择器 | 描述 | 对应选择器类 | |--------|------|--------------| | >Y | 选择在Y轴正方向最远的顶点 | DirectionMinMaxSelector | | <Y | 选择在Y轴负方向最远的顶点 | DirectionMinMaxSelector | | >>Y[-2] | 选择在Y轴方向第二远的顶点 | CenterNthSelector | | <<Y[0] | 选择在Y轴方向最近的顶点 | CenterNthSelector |
自定义方向选择器
CadQuery允许使用自定义向量作为选择器的基础。例如:
result = cq.Workplane("XY").box(10, 10, 10)
# 仅对特定方向的边进行倒角
result = result.edges(">(-1, 1, 0)").chamfer(1)
拓扑选择器
CadQuery还支持基于拓扑关系的选择方法:
-
ancestors()
:选择包含当前选定对象的所有对象result = cq.Workplane("XY").box(10, 10, 10).faces(">Z").edges("<Y") result = result.ancestors("Face")
-
siblings()
:选择通过指定类型元素连接的同类对象result = cq.Workplane("XY").box(10, 10, 10).faces(">Z") result = result.siblings("Edge")
特殊选择方法
对于快速原型设计,CadQuery提供了几个特殊方法,无需创建完整的选择器子类:
filter()
:基于自定义条件过滤对象sort()
:对对象进行排序__getitem__
:通过索引选择对象
例如,选择体积小于等于3的盒子:
from cadquery.occ_impl.shapes import box
result = (
cq.Workplane()
.add([box(1,1,i+1).moved(x=2*i) for i in range(5)])
)
# 选择体积<=3的盒子
result = result.filter(lambda s: s.Volume() <= 3)
或者使用排序方法实现相同效果:
result = result.sort(lambda s: s.Volume())[:3]
总结
CadQuery的选择器系统提供了强大而灵活的方式来操作3D模型中的各种元素。通过掌握这些选择器,开发者可以精确控制建模过程中的每一个细节,从简单的方向选择到复杂的逻辑组合,再到自定义的筛选条件。无论是初学者还是高级用户,都能从中找到适合自己需求的选择方式,大大提高了3D建模的效率和精确度。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考