4. 模型导入与几何清理自动化
在完成 HyperMesh 批处理环境搭建与 Tcl 命令基础之后,真正决定自动化收益的环节是“模型进入 HyperMesh 之后到网格划分之前”的这一段。实际项目中,一个整车或整机模型往往包含几十到几百个 CAD 零件,格式可能是 STEP、IGES、Parasolid、CATIA、JT 等,来源不同、精度不同、命名混乱,几何缺陷也各不相同。如果逐个手动导入、逐个修补,时间成本极高且不可复现。本节的目标是把这一段变成可重复执行的脚本流程:批量导入 → 自动识别缺陷 → 分类修复 → 输出清理报告。
一、批量导入:从文件清单到统一模型
批量导入的核心不是“循环打开文件”,而是先建立一份可控的输入清单。推荐做法是用外部文本文件或 CSV 维护零件列表,每行包含文件路径、零件名、单位、导入层(component)等字段,再由 Tcl 读取并逐条执行。这样文件增删、顺序调整、单位修正都不需要改脚本。
# 读取零件清单并批量导入
set fp [open "part_list.csv" r]
set lines [split [read $fp] "\n"]
close $fp
foreach line $lines {
if {[string trim $line] eq ""} { continue }
lassign [split $line ","] file partname unit
*createmark components 1 "all"
*deletemark components 1
*readfile "$file" 1
*createmark components 1 "all"
*renamemark components 1 "$partname"
}
这里有两个关键点。第一,导入前清空当前模型,避免多个零件叠加导致后续识别混乱;第二,导入后立即重命名 component,使零件名与清单一致,便于后续按零件定位缺陷。对于单位不一致的模型,可在导入后统一执行缩放,例如 *scalemark components 1 1000 1000 1000,把米制模型转为毫米制。实际项目中建议在清单中显式标注单位,而不是依赖脚本猜测。
二、几何清理命令:HyperMesh 中真正可脚本化的操作
HyperMesh 的几何清理命令大多以 * 开头的 Tcl 命令形式暴露,常见的有:*surfacecleanup 用于曲面清理,*edges 用于边检测,*findmark 用于查找自由边、T 型边、重复面,*equivalence 用于合并重合节点/边,*defeature 用于去除小特征,*fillhole 用于补孔,*replace 用于替换边或面。这些命令的共同特点是:先“标记”(mark),再“操作”(operate),最后“清除标记”。脚本化的关键就是把“标记—操作—清除”写成可复用的过程。
例如,查找并合并自由边附近的重复节点,典型写法是:
# 查找自由边并合并重合节点
*createmark edges 1 "free"
*equivalence edges 1 0.01 0 0 0 0 0
*clearmark edges 1
其中 0.01 是容差,单位与模型一致。容差过大会把本不该合并的边合并,导致几何变形;容差过小则漏合并。工程上通常先用 0.01 mm 试跑,再根据报告调整。
三、自动识别与修复几何缺陷的脚本实现
几何缺陷的自动识别,本质上是把“人眼判断”翻译成“可量化的几何条件”。常见缺陷与对应判断条件如下:自由边(free edge)——只被一个面共享;T 型边(T-junction)——被三个及以上面共享;重复面(duplicate surface)——两个面法向相反、位置重合;小孔(small hole)——孔周长小于阈值;小面(sliver surface)——面积或最短边小于阈值;缺失面(missing surface)——封闭区域出现开口。脚本可以按“检测 → 分类 → 修复 → 复检”的顺序组织。
下面是一个可参考的缺陷识别与修复主循环框架,实际使用时把各修复函数替换为项目验证过的命令组合:
proc clean_geometry {tol} {
# 1. 合并重合节点/边
*createmark edges 1 "free"
*equivalence edges 1 $tol 0 0 0 0 0
*clearmark edges 1
# 2. 查找 T 型边并标记
*createmark edges 1 "t-junction"
set tj_count [llength [hm_getmark edges 1]]
*clearmark edges 1
# 3. 查找重复面
*createmark surfaces 1 "duplicate"
set dup_count [llength [hm_getmark surfaces 1]]
*deletemark surfaces 1
# 4. 去除小面
*createmark surfaces 1 "area" 0.5
*defeature surfaces 1 0.5 0
*clearmark surfaces 1
return [list $tj_count $dup_count]
}
这段脚本返回 T 型边数量和重复面数量,便于写入日志。实际工程中,修复顺序很重要:先合并重合边,再处理 T 型边,最后处理小面和小孔。如果顺序颠倒,可能把本应保留的特征误删,或者把已经合并的边再次拆开。
四、结果判断与日志输出
脚本跑完后,不能只看“有没有报错”,而要看“缺陷数量是否下降、模型是否仍然封闭”。建议在脚本末尾输出一份清理报告,至少包含:导入零件数、自由边数量(修复前/后)、T 型边数量、重复面数量、小面数量、总耗时。判断标准可以设为:自由边数量为 0 或低于设定阈值,重复面为 0,T 型边数量下降 80% 以上。如果复检不通过,脚本应自动回退到上一轮容差或调整修复顺序,而不是直接进入网格划分。