You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ABAQUS Python的getByBoundingBox与循环选边时遇空集问题

问题分析与解决方案

你的JOINTS集合为空主要有几个核心问题,对应修正如下:

1. 循环中重复覆盖集合

每次循环执行p.Set(edges=edge_joints, name='JOINTS')会直接覆盖之前创建的同名集合,最终只有最后一次循环的选择结果。如果最后一次循环没选中边,集合就会是空的。

修正方式:先创建一个空列表收集所有关节边,循环结束后再一次性创建集合。

2. 边界框参数不匹配

  • zMin参数错误:你全选时用的是zMin=-Luc,但选关节时写成了zMin=-Luc*AR,如果模型实际z范围和全选时一致,这会导致边界框z范围不对,漏选或选不到边。
  • 固定distance尺度不匹配:distance=1e-2是固定值,如果Luc远大于这个值,边界框会太小,框不住关节边;如果Luc远小于这个值,边界框又会误选杆部分。应该用和Luc关联的比例值,比如取Luc的10%作为distance。

3. 循环位置逻辑可能偏差

关节的位置应该对应晶格的节点坐标,即x方向应为n*Luc(n从0到NoS[0]),而你当前用ii*Luc/2,如果关节不是在半单胞位置,这会导致边界框对准错误的位置,自然选不到边。


修改后的完整代码

p = mdb.models['Model-1'].parts['lattice']
e = p.edges

# 先初始化空列表收集所有关节边
joint_edges = []
# 调整循环范围:x方向关节位置为0, Luc, 2Luc,..., NoS[0]*Luc
for n in range(0, NoS[0]+1):
    # 用Luc的比例作为distance,适配不同尺度的模型
    distance = Luc * 0.1
    # 修正zMin参数,和全选时的范围一致
    selected_edges = e.getByBoundingBox(
        xMin=n*Luc - distance,
        yMin=-Luc,
        zMin=-Luc,
        xMax=n*Luc + distance,
        yMax=(NoS[1]+1)*Luc,
        zMax=(NoS[2]+1)*Luc*AR
    )
    # 将当前循环选中的边添加到总列表
    joint_edges.extend(selected_edges)

# 一次性创建JOINTS集合
if joint_edges:
    p.Set(edges=joint_edges, name='JOINTS')
else:
    print("未选中任何关节边,请检查坐标参数")

额外建议

  • 选杆部分时,可以用ALL-STRUTS集合减去JOINTS集合,无需再重复用边界框选择:
    all_struts_set = p.sets['ALL-STRUTS']
    rods_edges = [edge for edge in all_struts_set.edges if edge not in joint_edges]
    p.Set(edges=rods_edges, name='RODS')
    
  • 如果关节在y、z方向也有分布,需要对应添加y、z方向的循环,遍历所有节点位置的边界框。

内容的提问来源于stack exchange,提问作者Mesut Sahin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 10:07:32