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 型边,最后处理小面和小孔。如果顺序颠倒,可能把本应保留的特征误删,或者把已经合并的边再次拆开。

几何清理自动化流程:导入 → 识别 → 修复 → 复检 输入清单 part_list.csv 路径 / 零件名 / 单位 STEP / IGES / JT 批量导入 *readfile *renamemark 单位统一缩放 缺陷识别 自由边 / T型边 重复面 / 小面 小孔 / 缺失面 分类修复 *equivalence *defeature *fillhole 复检未通过 → 调整容差/顺序 常见几何缺陷与脚本判断条件 缺陷类型 判断条件 修复命令 风险提示 自由边 仅被 1 个面共享 *equivalence 容差过大会变形 T 型边 被 ≥3 个面共享 *edges + *replace 需先合并再替换 重复面 法向相反、位置重合 *deletemark 勿删保留面 小面 / 小孔 面积或周长 < 阈值 *defeature / *fillhole 阈值需按零件定

四、结果判断与日志输出

脚本跑完后,不能只看“有没有报错”,而要看“缺陷数量是否下降、模型是否仍然封闭”。建议在脚本末尾输出一份清理报告,至少包含:导入零件数、自由边数量(修复前/后)、T 型边数量、重复面数量、小面数量、总耗时。判断标准可以设为:自由边数量为 0 或低于设定阈值,重复面为 0,T 型边数量下降 80% 以上。如果复检不通过,脚本应自动回退到上一轮容差或调整修复顺序,而不是直接进入网格划分。

建议把容差、面积阈值、孔周长阈值写成脚本顶部的变量,而不是散落在命令里。这样换零件、换项目时只需改几个数字,脚本主体不动。
批量导入时不要忽略单位。一个米制零件混入毫米制模型,缩放后尺寸差 1000 倍,后续所有缺陷判断都会失效。清单中必须显式记录单位,并在导入后立即统一。