做HyperMesh二次开发的工程师几乎都踩过同一个坑:拿到点集 合直接调用.x疯狂报错,分不清集 合容器和单点实体,调试半天找不到根源。今天用真实控制台输出案例,一次性讲透Altair官方SWIG封装对象层级,看完再也不会踩同类API大坑。
日常做几何批量处理、制动盘/支架坐标提取、批量筛选显示点时,代码经常出现两类迷惑问题:
collection_1,看着明明里面有点,直接写collection_1.x直接抛出属性不存在报错;collection_1[0]能正常运行,一旦忘记下标,全流程代码崩溃;proxy of Swig Object对象,不知道两种内存地址分别代表什么实体。先放一段大家日常写的错误示范:
# 错误写法,直接用集 合读取坐标,必报错
collection_1 = hm.CollectionByDisplayed(model, ent.Point)
x = collection_1.x # AttributeError: 'hm.Collection' object has no attribute 'x' 很多人百思不解:控制台明明能看到集 合里存在点,为什么读取坐标就不行?核心根源是两种完全不同的SWIG代理对象,层级完全割裂。
直接沿用你本地Jupyter控制台真实输出,分层拆解每一行返回内容,直观区分容器与实体。
collection_1 = hm.CollectionByDisplayed(model, ent.Point)
collection_1
# Out[42]: <hm.Collection; proxy of <Swig Object of type 'std::shared_ptr< hwDescriptor::Collection > *' at 0x0000019C55F660A0> > hm.Collection,底层是C++通用容器Collection;len()统计数量、下标索引[i]、循环遍历、清空/删除实体;.x/.y/.z。 collection_1[0]
# Out[40]: <hm.mdi.entities.Point; proxy of <Swig Object of type 'hwDescriptor::Metaobject *' at 0x0000019C55F72E80> >
collection_1[1]
# Out[41]: <hm.mdi.entities.Point; proxy of <Swig Object of type 'hwDescriptor::Metaobject *' at 0x0000019C55F72A90> > hm.mdi.entities.Point,代表模型里单个几何点;hwDescriptor::Metaobject,HM所有几何、网格实体统一基类;.x/.y/.z坐标、实体ID、组件、颜色等属性。 collection_1[2].x
# Out[44]: -35.63371658325195
collection_1[2].y
# Out[45]: 481.554931640625 执行逻辑分层:集 合容器(collection_1) → 下标提取单点实体(Point) → 读取实体坐标属性 → 输出纯数字浮点数。
.x/.y/.z调取后输出纯数值,用于计算、批量导出 import hm
import hm.entities as ent
# 获取当前屏幕显示的全部点集 合(容器对象)
pt_collection = hm.CollectionByDisplayed(model, ent.Point)
# 判断集 合是否存在点
if len(pt_collection) > 0:
# 循环遍历每一个单点实体
for pt in pt_collection:
# 仅Point对象具备x/y/z坐标属性
px = pt.x
py = pt.y
pz = pt.z
print(f"点坐标 X:{px:.3f}, Y:{py:.3f}, Z:{pz:.3f}") point_collection = hm.Collection(model, ent.Point)
if len(point_collection) > 0:
model.deletemark(collection=point_collection) collection.xcollection[0].xhm.Collection是收纳盒;带hm.mdi.entities.Point才是几何点for pt in collection,循环内操作pt读取坐标CollectionByDisplayed作用,误以为能直接取坐标HyperMesh Python API基于SWIG封装C++底层,所有几何实体都会分为「容器集 合」和「实体对象」两层结构,不搞懂层级关系,写自动化脚本极易出现属性报错。
记住核心口诀:集 合只收纳,实体存参数,下标取单点,再读XYZ。
不管是制动盘几何提取、支架批量测点、网格节点筛选,这套逻辑通用,彻底解决二次开发中90%的实体属性读取报错。