Technical note

网格边界与几何修复

记录 CAD/CAE 几何修复中的一个工程判断:shape 有效不代表适合网格。free edge、open boundary、T-junction、non-manifold 和 near contact 等风险,需要结合网格边界反向分析几何问题。


背景

在 CAD 几何修复里,我们经常会先看一个 shape 是否有效。

比如用 BRepCheck_Analyzer 检查基础拓扑和几何有效性,看 shape 是否存在明显的坏边、坏面、无效 wire 或其他 BRep 问题。

这一步当然很重要,但它只能回答一个基础问题:

这个 shape 在 OCCT 的规则下是否有效。

在 CAD/CAE 工程里,这还不够。

因为很多模型即使 BRepCheck_Analyzer 通过了,后续做网格时仍然可能出问题。尤其是前处理场景里,模型不仅要“几何上成立”,还要能稳定生成网格、保持预期接触关系,并让边界条件、材料区域等信息能继续继承。

这时问题会变得复杂:

shape 本身是 valid 的,但局部边界在网格阶段开裂;
几何面看起来贴近,但网格无法形成稳定共形界面;
两个区域非常接近,导致局部网格尺寸异常;
局部存在 T-junction,几何检查不一定直接暴露;
某些自由边不是几何缺陷,但会影响后续体网格;
拓扑上看似连通,网格边界却表现出 non-manifold 风险。

所以几何修复不能只从 BRep 检查出发。

在 CAD/CAE 场景里,还需要从网格边界反向观察模型质量。

这篇文章主要记录一个工程判断:

网格边界不是几何修复之后才出现的结果,
它也可以反过来指导几何修复。

BRep 检查为什么不够

BRep 检查关注的是拓扑和几何对象本身是否满足基础规则。

例如:

edge 是否有效;
wire 是否闭合;
face 是否有效;
shell 是否合理;
solid 是否闭合;
拓扑引用是否一致。

这些检查对 CAD 内核很重要,但 CAE 前处理关心的问题还要再往后走一步。

CAE 关心的是:

模型能否稳定生成表面网格;
表面网格能否形成封闭边界;
体网格区域能否正确识别;
接触面是否能保持预期关系;
相邻几何是否会形成很差的局部单元;
边界条件对应的拓扑是否稳定;
修复后是否会破坏原有区域语义。

这两类问题有关联,但不是一回事。

一个 shape 可以是 valid 的,但存在非常近的面间距。从 BRep 角度看,它没有错;但从网格角度看,这个区域可能会产生非常细碎的单元,甚至导致网格失败。

一个 shell 可以看起来完整,但某些局部边界在网格离散后暴露出 open boundary。这可能是容差、面间连接或局部小缝隙导致的。

所以如果只用 IsValid() 判断修复结果,就容易漏掉很多面向网格的风险。

网格边界看到什么

网格边界可以理解成几何模型离散之后的拓扑信号。

当几何被离散成网格后,很多原本隐藏在 CAD 拓扑里的问题,会以更直观的方式表现出来。

例如:

某些边界没有被相邻面共享;
某些区域形成开放边界;
某些节点或边被多个面异常引用;
局部出现 T-junction;
面之间没有形成期望的共形关系;
原本接近的区域在网格上发生混淆。

这些信号不一定说明几何本身无效,但它们说明模型对后续网格流程不友好。

这类问题在 CAD/CAE 里非常关键。因为最终进入仿真求解的通常不是 BRep,而是网格。如果网格边界已经暴露出不稳定信号,那么即使原始 shape 是 valid 的,也不能简单认为模型没有问题。

因此,几何修复模块可以把网格边界检测作为一个反馈入口:

BRep 检查发现基础几何问题;
网格边界检测发现离散后的拓扑风险;
两者结合,才能更接近 CAE 前处理需要的模型质量判断。

Free edge 的两种含义

free edge 在几何修复里经常出现,在网格边界检查里也会出现。

但它们的含义不完全相同。

在 BRep 层面,free edge 通常表示某条 edge 只被一个 face 使用。

在网格层面,自由边通常表示某条网格边只被一个三角形或单元面使用。

这两者可能对应,也可能不完全对应。

例如几何上存在 open shell,网格后大概率会出现边界自由边。但也有一些情况,几何拓扑看起来没有明显问题,网格离散后仍然出现局部开放边界。这可能来自局部容差、面离散不一致、面间连接关系不稳定,或者几何边界没有被正确识别。

所以网格 free edge 不能简单等同于几何 free edge。

它更像是一个后验信号:

这里在网格化之后没有形成预期连接;
需要回头检查对应几何边界、面邻接关系和局部容差。

如果能把网格 free edge 映射回几何 face 或 edge,就可以帮助修复模块定位问题区域。

Open boundary 不一定是错误

网格里的 open boundary 很常见。

对于开放曲面,它是正常结果。对于应该闭合的 solid 或 shell,它就是风险。

所以 open boundary 的关键不在于“有没有”,而在于“它是否符合模型目标”。

例如:

如果模型本来就是开放面,open boundary 是正常边界;
如果模型用于封闭体网格,open boundary 可能导致体域识别失败;
如果 open boundary 出现在局部修复区域,可能说明补面或 Sewing 没有真正成功;
如果 open boundary 出现在接触区域,可能说明界面没有形成预期连接。

因此,网格边界检查不能只输出“存在 open boundary”。

它还应该尽量说明:

open boundary 位于哪里;
属于哪个局部区域;
是否形成闭合 loop;
是否对应几何 free edge;
是否和用户期望的实体类型冲突;
是否需要进入修复流程。

这和前面几篇文章提到的 free edge region 是同一个思想:单条边意义有限,区域结构更有价值。

Non-manifold 风险

Non-manifold 是 CAD/CAE 前处理里非常敏感的问题。

在几何层面,它可能表现为某条 edge 被异常数量的 face 共享,或者局部拓扑不是一个清晰的二维流形边界。

在网格层面,它可能表现为某条网格边被超过两个三角形共享,或者局部区域无法形成明确的内外关系。

这类问题对于体网格和物理区域识别非常危险。

因为体网格通常需要清晰的封闭边界。如果边界不是流形结构,系统很难判断哪里是内部、哪里是外部,也很难稳定生成体单元。

Non-manifold 的来源可能很多:

多个面在同一条边上异常汇合;
局部面重叠;
薄片结构和实体结构混在一起;
修复时错误 Sewing;
补面后局部连接关系异常;
导入模型本身拓扑结构不清晰。

这里特别要注意:修复流程本身也可能引入 non-manifold。

例如过大容差 Sewing,可能把原本不应该连接的面缝在一起;补面后如果没有正确处理邻域,也可能形成异常连接。

所以修复后必须做 non-manifold 检查,不能只看 free edge 是否减少。

T-junction 风险

T-junction 是 CAD/CAE 中很容易造成麻烦的一类问题。

简单理解,就是一条边或一个面边界在另一个边界中间“插入”或终止,形成类似 T 字的连接关系。

在几何层面,它不一定总是表现为明显的 invalid shape;但在网格阶段,它会破坏局部边界的一致性。

例如一个面边界的端点落在另一个面边界中间,但两个拓扑结构没有被正确切分。从显示上看可能只是一个局部交界;但生成共形网格时,这个位置很容易出现不匹配。

T-junction 可能带来:

相邻面网格节点不对齐;
局部边界无法共形;
产生小单元或畸形单元;
接触界面不稳定;
后续布尔或切分结果异常。

这类问题很适合通过网格边界或离散边界关系来发现。

一旦发现 T-junction 风险,几何修复模块可以反向检查:

对应几何边是否需要 split;
相邻 face 是否需要重新分割;
界面是否需要 imprint;
局部是否应该进入布尔切分或共形聚合流程。

这也能和之前的 OCCT Splitter、共形聚合文章衔接起来。

很多时候,T-junction 不是简单补面能解决的问题,而是需要几何切分或拓扑重建。

从边到 Region

如果只看单条边,很多问题判断不出来。

所以网格边界检测更适合把边聚合成区域。

例如:

GapPair:两段边界互相靠近,可能存在面缝隙;
GapChain:一组连续边界形成开放链;
GapLoop:一组边界形成闭合环,可能对应缺面或孔洞;
OpenBoundary:开放边界区域;
T-junction Region:局部 T 型连接风险区域。

这些名字只是描述思路,不一定要作为固定术语。

重点是把边界问题从“边”提升到“区域”。

因为修复策略通常不是对单条边做决策,而是对一个局部区域做决策。

例如:

GapPair 可能适合局部 Sewing 或面贴合;
GapLoop 可能适合补面;
OpenBoundary 可能需要判断是否为合法开放边界;
T-junction 可能需要 split 或 imprint;
NonManifold Region 可能需要拓扑重组。

这样一来,网格边界检测就不只是报错工具,而是几何修复的前置分析模块。

从 Region 到 Issue

网格边界检测输出的是信号,但修复模块需要的是问题。

这两者之间需要一层转换。

例如检测到一组 open boundary,并不意味着马上补面。系统还需要判断这个 open boundary 是否发生在应该闭合的区域,是否对应几何 free edge,是否是用户允许存在的开放边界。

可以把流程理解成:

Boundary Signal

Region

Issue

Repair Strategy

Boundary Signal 是原始检测结果。

例如某条网格边只被一个三角形使用。

Region 是局部聚类结果。

例如一组自由边形成一个开放链或闭合 loop。

Issue 是修复模块能理解的问题。

例如疑似缺面、疑似拓扑未连接、疑似 open shell、疑似 T-junction、疑似 non-manifold。

Repair Strategy 才决定是否 Sewing、补面、split、imprint、局部替换,或者只输出报告。

这一步非常重要。

如果没有 Region 到 Issue 的转换,网格检测结果很容易变成一堆难以行动的报错信息。

检测不要直接改模型

网格边界检测应该负责发现风险,而不是直接修改几何。

这和前面提到的检测层原则一致:

检测只检测,修复由策略层决定。

如果网格检测发现 open boundary,就直接补面;发现 gap,就直接移动面;发现 T-junction,就直接切分几何,这样会让系统变得不可控。

更稳妥的方式是:

网格检测输出问题区域;
几何修复模块结合 BRep 信息重新分析;
策略层判断是否自动修复;
高风险问题进入交互式修复;
修复后重新验证几何和网格边界。

这样做的好处是,网格检测不会越权修改模型。它只是提供一个新的观察角度。

真正决定如何修的,仍然是几何修复流程。

映射回几何对象

如果想让网格边界指导几何修复,就必须解决一个问题:网格边界要能映射回几何 face 或 edge。

否则检测结果只能告诉你“网格这里有问题”,却不能告诉你该修哪个几何对象。

在工程里,可以通过几类信息建立映射:

网格三角形所属 face;
离散边对应的几何 edge;
采样点到几何面的投影关系;
网格区域到原始 shape 的索引关系;
显示和选择系统中的 face / edge tag。

映射越准确,修复越可控。

例如检测到某段网格 open boundary 后,如果能找到它对应的几何 edge,就可以进一步判断这条 edge 是否是 BRep free edge。

如果能找到相邻 face,就可以判断是否适合 Sewing。

如果能找到形成 loop 的几何边界,就可以尝试补面。

如果映射缺失,修复模块只能做空间猜测,风险会高很多。

这也是为什么 CAD/CAE 系统里,拓扑索引、显示选择和网格数据最好不要完全割裂。后续很多高级修复和诊断,都依赖这些映射关系。

修复后还要复查网格边界

几何修复完成后,不能只检查 BRep 是否有效,也应该重新检查网格边界风险是否下降。

例如一个面缝隙修复流程可能是:

检测几何 free edge;
局部 Sewing;
BRepCheck_Analyzer 通过;
free edge 数量减少。

这看起来已经不错了。

但如果目标是后续网格稳定,还应该继续看:

网格 open boundary 是否减少;
局部 T-junction 是否消失;
non-manifold 风险是否下降;
near contact 区域是否仍然存在;
局部网格质量是否变差。

这样才能判断修复是否真的服务了 CAE 前处理目标。

这也是几何修复和网格检测之间的闭环:

几何检测

网格边界检测

问题分类

几何修复

几何验证

网格边界复查

如果只做前半段,很容易得到一个“几何上有效,但网格上仍然难用”的模型。

和共形网格的关系

在 CAD/CAE 中,共形网格是一个非常重要的目标。

如果两个区域需要共享界面,那么它们在几何和网格上都应该有清晰一致的边界。否则后续求解时,界面关系可能不稳定。

网格边界检测可以帮助发现共形风险。

例如:

两个面非常接近但没有明确接触关系;
相邻区域边界没有对齐;
局部存在 T-junction;
弱相交导致界面模糊;
小缝隙导致网格无法稳定闭合。

这些问题不一定会让 shape invalid,但会影响共形网格。

这也是为什么几何修复不能只做传统意义上的 ShapeFix、Sewing、Filling。

对于 CAE 前处理,还需要关注:

几何是否适合后续切分;
接触界面是否明确;
网格边界是否一致;
局部风险是否需要最小调整;
修复是否会改变装配语义。

这一部分比普通 CAD 几何修复更敏感,也更需要脱敏。

但工程原则可以公开:

几何有效性只是基础,共形网格需要更高层次的边界一致性。

导入阶段只记录风险

模型导入阶段可能发现很多问题:free edge、open shell、gap、non-manifold 风险。

如果接入网格边界检测,还可能发现更多潜在问题。

但导入阶段不应该默认把这些问题都修掉。

原因仍然是:导入阶段缺少用户意图。

一个 open boundary 可能是错误,也可能是合法开放曲面。

一个 near contact 可能是建模缺陷,也可能是设计间隙。

一个 T-junction 可能需要切分,也可能只是当前流程不关心的细节。

所以导入阶段更适合做:

基础检查;
轻量修复;
风险记录;
问题定位;
给用户提示。

复杂修复应该进入专门修复模块或交互式流程。

这样既能避免静默强修复,也能让后续修复有据可依。

一个更完整的检测视角

把几何检测和网格边界检测结合起来后,模型质量判断会更完整。

可以粗略分成三层:

BRep 有效性检查:
  shape 是否有效,face / wire / edge 是否存在基础问题。

拓扑边界检查:
  free edge、open shell、non-manifold、局部 gap。

网格边界检查:
  open boundary、T-junction、gap chain、gap loop、共形风险。

这三层不是互相替代,而是互相补充。

BRep 检查更靠近几何内核。

拓扑边界检查更靠近修复策略。

网格边界检查更靠近 CAE 后续流程。

对于 CAD 建模系统来说,前两层可能已经能解决很多问题。

但对于 CAD/CAE 前处理系统,第三层非常有价值。

因为最终目标不是只得到一个 valid shape,而是得到一个适合网格、适合分析、适合后续流程的模型。

不要变成另一个黑盒

网格边界检测也有一个风险:变成另一个黑盒。

如果检测结果只是输出:

mesh boundary error;
non-manifold detected;
gap detected;

用户和修复模块都很难使用。

更好的结果应该包含:

问题类型;
问题区域;
关联几何对象;
边界数量;
是否形成 loop;
是否可能影响体网格;
是否建议进入修复流程;
修复后是否改善。

也就是说,网格检测结果同样需要结构化。

它应该能被系统进一步消费,而不是只作为日志存在。

对于交互式修复来说,还可以把这些问题区域显示出来。例如高亮 open boundary,标记 T-junction,提示可能的 gap region,让用户选择后进入修复命令。

这样网格检测才能真正和几何修复结合。

小结

从网格边界反推几何问题,核心不是“用网格替代几何检查”,而是增加一个面向 CAE 的反馈视角。

我现在更认可的判断是:

BRepCheck_Analyzer 通过,不代表模型适合网格;
free edge、open boundary、T-junction、non-manifold 都应该按 region 分析;
网格边界检测应该输出问题区域,而不是直接修改几何;
检测结果需要映射回 face / edge;
Region 需要进一步分类成 Issue;
修复后不仅要检查 shape validity,也要复查网格边界风险;
共形网格要求几何边界和网格边界都足够清晰;
导入阶段可以记录风险,但不应该默认强修复杂问题。

这个判断对 CAD/CAE 系统尤其重要。

因为 CAE 前处理不是单纯的 CAD 修复。它要考虑后续网格、区域、接触、边界条件和求解流程。这些问题很多不是传统 shape validity 能完全覆盖的。

几何修复不能只看 shape 是否 valid。

对于 CAD/CAE 系统来说,一个模型是否“好”,还要看它能不能稳定进入后续流程。

网格边界检测提供了一个很重要的反馈视角:它能暴露 open boundary、T-junction、non-manifold、gap chain、gap loop 和共形风险。

但网格检测也不应该直接变成修复逻辑。

更合理的方式是:

网格边界发现风险;
风险聚类成 region;
region 分类成 issue;
issue 进入几何修复策略;
修复后再做几何和网格复查。

这样,几何修复就不再只是 ShapeFixSewingFilling 这些 API 的组合,而是变成一套面向后续 CAD/CAE 流程的模型质量管理能力。

这也是我现在对模型修复模块的一个基本判断:

修复的目标不是让 shape 看起来更干净,
而是让模型在后续工程流程里更稳定、更可解释、更可控。