使用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
相关产品推荐
相关产品推荐

