Abaqus脚本报错:多实例顶点集合创建代码问题排查
问题:Abaqus Python脚本定义顶点集合时使用"+"拼接报错
我在通过Python脚本给Abaqus定义顶点集合时遇到报错,已确认所有坐标与对应实例的顶点位置完全匹配。代码改编自Abaqus日志文件,我将原代码中的.getSequenceFromMask()替换为.findAt()后,报错显示不支持用"+"定义顶点集合,但原日志代码正是用"+"拼接的,特此求助。
报错代码
mdb.models['Model-8'].rootAssembly.Set(name='Set-3', vertices= mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+''+'1'].vertices.findAt((75.0, 125.0, 0))+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'2'].vertices.findAt((75, 125, 35), )+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'3'].vertices.findAt((75, 125, 30), )+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'4'].vertices.findAt((75, 125, 25), )+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'5'].vertices.findAt((75, 125, 20), )+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'6'].vertices.findAt((75, 125, 15), )+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'7'].vertices.findAt((75, 125, 10), )+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'8'].vertices.findAt((75, 125, 5), ))
原日志文件代码
mdb.models['Model-8'].rootAssembly.Set(name='Set-2', vertices= mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'1'].vertices.getSequenceFromMask(mask=('[#1 ]', ), )+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'2'].vertices.getSequenceFromMask(mask=('[#1 ]', ), )+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'3'].vertices.getSequenceFromMask(mask=('[#1 ]', ), )+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'4'].vertices.getSequenceFromMask(mask=('[#1 ]', ), )+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'5'].vertices.getSequenceFromMask(mask=('[#1 ]', ), )+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'6'].vertices.getSequenceFromMask(mask=('[#1 ]', ), )+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'7'].vertices.getSequenceFromMask(mask=('[#1 ]', ), )+\ mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'8'].vertices.getSequenceFromMask(mask=('[#1 ]', ), ))
解决方案
问题根源
getSequenceFromMask()方法返回的是Sequence类型对象(可迭代集合),Abaqus为该类型实现了+运算符以支持拼接;而findAt()方法返回的是单个Vertex对象,单个对象无法直接用+拼接,这就是报错的核心原因。
修复方法(两种任选其一)
方法1:将单个顶点放入列表后拼接
把每个findAt()的结果用列表包裹,再通过+拼接所有列表,最终传入Set()的vertices参数:
mdb.models['Model-8'].rootAssembly.Set(name='Set-3', vertices= [mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+''+'1'].vertices.findAt((75.0, 125.0, 0))]+\ [mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'2'].vertices.findAt((75, 125, 35), )]+\ [mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'3'].vertices.findAt((75, 125, 30), )]+\ [mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'4'].vertices.findAt((75, 125, 25), )]+\ [mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'5'].vertices.findAt((75, 125, 20), )]+\ [mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'6'].vertices.findAt((75, 125, 15), )]+\ [mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'7'].vertices.findAt((75, 125, 10), )]+\ [mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'8'].vertices.findAt((75, 125, 5), )])
方法2:提前收集所有顶点到一个列表
更简洁易维护的写法是先创建空列表,逐个添加顶点后再传入Set():
vertices_list = [] # 逐个添加顶点 vertices_list.append(mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+''+'1'].vertices.findAt((75.0, 125.0, 0))) vertices_list.append(mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'2'].vertices.findAt((75, 125, 35), )) vertices_list.append(mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'3'].vertices.findAt((75, 125, 30), )) vertices_list.append(mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'4'].vertices.findAt((75, 125, 25), )) vertices_list.append(mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'5'].vertices.findAt((75, 125, 20), )) vertices_list.append(mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'6'].vertices.findAt((75, 125, 15), )) vertices_list.append(mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'7'].vertices.findAt((75, 125, 10), )) vertices_list.append(mdb.models['Model-8'].rootAssembly.instances[myModule+'_'+myRigidBeamName+'-'+'8'].vertices.findAt((75, 125, 5), )) # 创建顶点集合 mdb.models['Model-8'].rootAssembly.Set(name='Set-3', vertices=vertices_list)
内容的提问来源于stack exchange,提问作者Heng Si Hwa
相关产品推荐
相关产品推荐

