前两期我们搞定了环境(Python Window)和钥匙(Model对象)。现在,面对模型里成千上万的节点和单元,我们如何精准地“抓住”我们想要的那一部分?Tcl 老手肯定对 *createmark 又爱又恨:它只有两个“卡槽”(1号和2号),逻辑稍微复杂点就得反复清空、覆盖。今天,我们将介绍 HyperMesh 2026 的实体选择神器 —— Collection(集合)。它像一个无限容量的智能购物车,让你的筛选逻辑像做数学题一样简单。
1. 痛点:被 *createmark 支配的恐惧在 Tcl 时代,我们像是在玩杂耍,手里只能同时扔两个球(Mark 1 和 Mark 2)。如果你想做这件事:“选中 A 集合,减去 B 集合,再和 C 集合取交集”,在 Tcl 里你得写几十行代码来倒腾这两个 Mark ID。
在 Python 2026 中,Collection 对象解决了这个问题。
无限数量:你可以创建 col_A, col_B, col_final 无数个变量。
持久存在:除非你主动删除,否则它们一直在内存里,随时待命。
创建一个集合,就像是推一辆购物车。最简单的用法是“全部装进去”。
import hm
import hm.entities as ent
model = hm.Model()
# 我要选中模型里所有的单元
# Tcl: *createmark elements 1 "all"
all_elems = hm.Collection(
model,
ent.Element
)
print(f"选中了 {len(all_elems)} 个单元")
当然,我们很少需要全选。我们需要的是精准打击。Python API 使用 hm.FilterBy... 系列类来充当“筛子”。
场景 1:只选特定 ID 的单元
# 目标:选中 ID 为 101, 102, 103 的单元
# Tcl: *createmark elements 1 "by id" 101 102 103
# Python: 使用 FilterByEnumeration (枚举过滤器)
target_ids = [101, 102, 103]
my_col = hm.Collection(
model,
hm.FilterByEnumeration(
ent.Element,
ids=target_ids
)
)
场景 2:选中某个 Component 里的所有单元
这是一个非常经典的“套娃”操作:先选 Component,再通过 Component 找 Element。
# 1. 先选中名为 "B_Pillar" 的组件
comps = hm.Collection(
model,
hm.FilterByAttribute(
ent.Component,
name='B_Pillar
)
)
# 2. 再选中属于这些组件的单元
# FilterByCollection:意思就是“依据另一个集合来筛选”
elems_in_comp = hm.Collection(
model,
hm.FilterByCollection(
ent.Element,
ent.Component
comps
)
)
这是 Python 最爽的地方。你可以直接对集合进行加减法!
并集 (+):把两个选区合在一起。
差集 (-):从一堆里剔除掉一部分。
# 假设我们有两个集合
col_A = hm.Collection(model, ...) # 比如:所有六面体
# 实例化
col_B = hm.Collection(model, ...) # 比如:质量差的单元
# ✅ 需求:从六面体中,剔除掉质量差的
final_col = col_A - col_B
# ✅ 需求:把两个区域合并
total_col = col_A + col_B
# 执行删除操作
model.delete(final_col)
选中了集合后,我们经常需要遍历它,查看每个实体的属性。
# 打印集合中每个单元的 ID
for e in my_col:
print(f"单元ID: {e.id}, 颜色: {e.color}")
Python 的 Collection 不仅仅是 Tcl mark 的替代品,它是对选择逻辑的一次降维打击。记住三个关键词:Filter(筛选)、Set(运算)、Object(持久对象)。掌握了这三点,你就掌握了 HyperMesh 自动化的半壁江山。
👉 下期预告:
东西选好了,接下来该动刀子了。我想把选中的节点向 X 轴移动 10mm,或者把选中的单元放入一个新的 Component。下一期,我们将进入**《实战篇:修改与编辑》**,看看 Python 如何操控模型发生改变。