最近做的项目中需要生成大量的数据,研究不同部件相对位置变化对结果的影响。然而,每次部件移动后,接触面Set必须更新!
今天,我将分享一段HyperMesh二次开发代码,一键批量更新所有接触Set,让DOE分析效率飞起来!
将整个部件的所有单元都加入Set,这样无论部件如何运动,Set始终包含该部件的完整单元集 合,接触定义永远有效,接触主从面的大小对于计算效率的影响微乎其微!
# 批量更新接触Set的核心代码
*createmark set113-24
set set_name [hm_getvalue set mark=1 dataname=name]
foreach set_n $set_name {
# 步骤1:获取当前Set包含的所有单元
*createmark elem 1"by set"$set_n
# 步骤2:获取这些单元所属的组件列表
set nc [hm_parentcomplist id {*}[hm_getmark elems 1]]
# 步骤3:选择这些组件的所有单元
*createmark elem 1"by comps id" {*}$nc
# 步骤4:将单元添加到Segment Set中
*segmentsetaddshells "$set_n"10
} *createmark set 1 13-24set set_name [hm_getvalue set mark=1 dataname=name]set_name中 foreach set_n $set_name {
# 逐个处理
} # 获取Set内的单元
*createmark elem 1 "by set" $set_n
# 获取单元所属的组件ID(去重)
set nc [hm_parentcomplist id {*}[hm_getmark elems 1]]
# 选择这些组件的全部单元
*createmark elem 1 "by comps id" {*}$nc
# 重新定义Segment Set
*segmentsetaddshells "$set_n" 1 0 *createmark set 1 13-24 # 修改为你的Set ID范围 .tcl文件,通过source命令调用 # 获取模型中所有Segment Set
*createmark set1"all"
set all_contact_sets [hm_getmark set1]
# 过滤只保留接触Set(名称包含"CONTACT")
foreach set_id $all_contact_sets {
*createmark set1$set_id
set set_name [hm_getvalue set mark=1 dataname=name]
if {[string match "*CONTACT*"$set_name]} {
# 处理该Set
}
} foreach set_n $set_name {
# 检查Set是否为空
*createmark elem 1 "by set" $set_n
set elem_count [llength [hm_getmark elems 1]]
if {$elem_count == 0} {
puts "警告:Set $set_n 不包含任何单元,跳过"
continue
}
# 正常处理...
}