我正在尝试获取曲面中每个面的法线(编辑:曲面是从实体中提取的,而不是从壳中提取的)。我似乎无法获得面部物体。根据scripting reference guide这应该是语法:
mdb.models[name].rootAssembly.instances[name].surfaces[name].faces[i]
我试过这个:
femur_instance.surfaces['IMPLANT_SHAFT'].faces[0]
但是当尝试使用 pointOn[1]
属性获得正常时,它给了我一个属性错误。当我查看属性时,我得到了这个:
['__class__', '__copy__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getstate__', '__hash__', '__init__', '__lt__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_addToCache', '_cache', '_counter', '_id', '_p', '_scdId', 'getId', 'getText', 'name']
返回对象的类型是:'symbolicConstant'
我做错了什么?
编辑:femur_instance
被定义为 odb.rootAssembly.instances['FEMUR_SHAFT_1']
导致错误,请参阅答案。
最佳答案
您在帖子和评论中指的是两个不同的对象。一个是mdb中的Face对象,一个是odb中的OdbSet对象。尽管它们的名称相似,但它们的含义、属性或方法并不相同。这是您提到的错误消息的来源。
例如,在您的原始帖子中,您引用了 mdb 中的几何 Face 对象。例如:
`f = mdb.rootAssembly.instances[name].surfaces[name].faces[N]`
其中 N
引用 faces
数组中的特定 Face 对象,我们将其分配给变量 f
。现在,f
有一些“成员”或属性。其中之一是 f.pointOn
。在下面查看如何使用它。
但是,在您的评论中,您提到了 OdbSet 对象。例如:
`g = odb.rootAssembly.instances[name].surfaces[name].faces[N]`
在这种情况下,faces
是一个符号常量元组,用于指定几何面上的元素面。您似乎正在尝试使用 g
,但实际上您应该使用 mdb Face 对象 f
。
使用 mdb 面对象:如果您的零件是实体(使用 2D 中的 CPS4 或 3D 中的 C3D8 等连续元素划分网格),则:
((x,y,z),) = f.pointOn
pointOn
成员是 float 元组的元组。实际上只有一个内元组,它包含了一个点在脸上的坐标。
如果您的零件是壳(使用壳元素(例如 S4)进行网格划分),那么您将得到:
((x,y,z),(a,b,c)) = f.pointOn
这又是一个 float 元组的元组。有两个内部元组。第一个包含面上点的坐标,第二个包含全局坐标系中面的法线分量。
不过,我感觉你的部分是实体的,所以这种技术不会使表面恢复正常。
关于python - Abaqus 获取人脸对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49661543/