Abaqus:表面上 select 个元素的脚本
Abaqus: script to select elements on a surface
我正在尝试编写一个 Abaqus/Python 脚本,它将 select 所有 "belong" 的元素添加到某个面孔。 IE。取与网格立方体的一个面有连接的所有元素(稍后我将计算作用在该面上的总力,用于力-位移或应力-应变曲线)。
如果我使用 GUI 执行此操作,我会得到:
mdb.models['Model-1'].rootAssembly.Set(elements=
mdb.models['Model-1'].rootAssembly.instances['Part-1-1'].elements.getSequenceFromMask(
mask=('[#0:5 #fff80000 #ff #f #ffe00000 #f000000f #3f',
' #0:6 #fffe #c0003f00 #3 #3fff8 #ffc00 ]', ), ), name='Set-1')
但是,getSequenceFromMask
在一般情况下不起作用。我尝试使用 findat
但没有成功。
有办法吗?
几天前我自己也遇到过这个问题。也许我错了,但据我所知,没有办法直接 select 特定元素。您可以使用 "Bounding Box" 或 "Bounding Sphere" select 它们,或者您可以通过零件/实例的面和单元格来获取它们。如果您需要以更具体的方式 select 元素,那么您可以通过它们所连接的节点来获取它们。您可以对这些节点使用 "findAt" 命令,并通过 "getElements()" 命令获取元素。
我就是这样解决的,效果很好。如果有其他方法可以解决这个问题,我会很高兴听到它们,因为这有时真的很令人沮丧。
干杯
在零件或装配体上定义面集:
part.Set('facename',faces=part.faces.findAt(((1,0,0),),))
其中 (1,0,0)
是面部任意位置的坐标。 (不过不要在 edge/corner 上使用点)
然后在网格化之后,您可以访问附加到该面的元素,例如:
instance.sets['facename'].elements
请注意,如果您想在 运行 分析后获取 odb 上的那些元素,则有点不同:
instance.elementSets['FACENAME'].elements
请注意,设置名称在 odb 上是大写的..
您显然是在使用宏来获取表面的位置,以便使用 Python 选择集合。问题是:Macro 工具默认使用 getSequenceFromMask() 并且不是很用户友好...
幸运的是,这个默认选项是可以更改的!只需要 运行 下面一行代码:
session.journalOptions.setValues(replayGeometry=COORDINATE,recoverGeometry=COORDINATE)
现在,当您使用 MacroManager 录制宏时,您会得到 findAt(),这就是您想要的。
额外提示:
您可以将这段代码包含在 custom_v6.env 文件的 onCaeStartup() 函数中。每次打开 CAE 时它都会 运行。
C:\Program Files\Dassault Systemes\SimulationServices\V6R2018x\win_b64\SMA\site\custom_v6.env
您可以 select 使用其标签中的特定元素:
mdb.models['model-name'].parts['part_name'].elements.getFromLabel(lable=element_id)
这样就不需要元素的坐标信息了。只需要元素id就可以访问了
我正在尝试编写一个 Abaqus/Python 脚本,它将 select 所有 "belong" 的元素添加到某个面孔。 IE。取与网格立方体的一个面有连接的所有元素(稍后我将计算作用在该面上的总力,用于力-位移或应力-应变曲线)。
如果我使用 GUI 执行此操作,我会得到:
mdb.models['Model-1'].rootAssembly.Set(elements=
mdb.models['Model-1'].rootAssembly.instances['Part-1-1'].elements.getSequenceFromMask(
mask=('[#0:5 #fff80000 #ff #f #ffe00000 #f000000f #3f',
' #0:6 #fffe #c0003f00 #3 #3fff8 #ffc00 ]', ), ), name='Set-1')
但是,getSequenceFromMask
在一般情况下不起作用。我尝试使用 findat
但没有成功。
有办法吗?
几天前我自己也遇到过这个问题。也许我错了,但据我所知,没有办法直接 select 特定元素。您可以使用 "Bounding Box" 或 "Bounding Sphere" select 它们,或者您可以通过零件/实例的面和单元格来获取它们。如果您需要以更具体的方式 select 元素,那么您可以通过它们所连接的节点来获取它们。您可以对这些节点使用 "findAt" 命令,并通过 "getElements()" 命令获取元素。
我就是这样解决的,效果很好。如果有其他方法可以解决这个问题,我会很高兴听到它们,因为这有时真的很令人沮丧。
干杯
在零件或装配体上定义面集:
part.Set('facename',faces=part.faces.findAt(((1,0,0),),))
其中 (1,0,0)
是面部任意位置的坐标。 (不过不要在 edge/corner 上使用点)
然后在网格化之后,您可以访问附加到该面的元素,例如:
instance.sets['facename'].elements
请注意,如果您想在 运行 分析后获取 odb 上的那些元素,则有点不同:
instance.elementSets['FACENAME'].elements
请注意,设置名称在 odb 上是大写的..
您显然是在使用宏来获取表面的位置,以便使用 Python 选择集合。问题是:Macro 工具默认使用 getSequenceFromMask() 并且不是很用户友好...
幸运的是,这个默认选项是可以更改的!只需要 运行 下面一行代码:
session.journalOptions.setValues(replayGeometry=COORDINATE,recoverGeometry=COORDINATE)
现在,当您使用 MacroManager 录制宏时,您会得到 findAt(),这就是您想要的。
额外提示:
您可以将这段代码包含在 custom_v6.env 文件的 onCaeStartup() 函数中。每次打开 CAE 时它都会 运行。
C:\Program Files\Dassault Systemes\SimulationServices\V6R2018x\win_b64\SMA\site\custom_v6.env
您可以 select 使用其标签中的特定元素:
mdb.models['model-name'].parts['part_name'].elements.getFromLabel(lable=element_id)
这样就不需要元素的坐标信息了。只需要元素id就可以访问了