属性关联如下:sectionAssignment将section连接到set
set是{}的容器
section将sectionAssignment连接到material
instance连接到{}(可以来自另一个模型的部件)
part连接到model
model连接到section
如果可以,请使用.inp或.cae文件。下面的代码从一个打开的cae文件中获取它。为了从materials中彻底获取elements,假设您在rootAssembly.instances开始搜索,您可以执行如下操作:找到创建instances的parts。在
找到包含这些parts的models。在
在这些parts中查找所有带有material_name的{},并存储与此部分相关联的所有{}
查找引用这些sectionAssignments的所有sectionNames
在每个sectionAssignments下,都有一个关联的region对象,它的名称是elementSet,名称是part。从这个part中的elements获取所有elements。在
清理:使用Pythonset对象删除对同一元素的任何多个引用。在
将此集合中的元素数乘以rootAssembly中引用此材料的相同零件实例的数量。在
例如,对于一些名为cae的模型变量model:model_part_repeats = {}
model_part_elemLabels = {}
for instance in model.rootAssembly.instances.values():
p = instance.part.name
m = instance.part.modelName
try:
model_part_repeats[(m, p)] += 1
continue
except KeyError:
model_part_repeats[(m, p)] = 1
# Get all sections in model
sectionNames = []
for s in mdb.models[m].sections.values():
if s.material == material_name: # material_name is already known
# This is a valid section - search for section assignments
# in part for this section, and then the associated set
sectionNames.append(s.name)
if sectionNames:
labels = []
for sa in mdb.models[m].parts[p].sectionAssignments:
if sa.sectionName in sectionNames:
eset = sa.region[0]
labels = labels + [e.label for e in mdb.models[m].parts[p].sets[eset].elements]
labels = list(set(labels))
model_part_elemLabels[(m,p)] = labels
else:
model_part_elemLabels[(m,p)] = []
num_elements_with_material = sum([model_part_repeats[k]*len(model_part_elemLabels[k]) for k in model_part_repeats])
最后,获取与material_name相关的材料密度,然后乘以num_elements_with_material。在
当然,对于更大的模型,这种方法会非常慢,为了获得更快的性能,在.inp文件上使用字符串技术更为可取。在