#pragma once /** * @file brep_heal.h * @brief B-Rep 拓扑修复 * * 对 BrepModel 执行拓扑修复操作,处理导入 STEP/IGES 文件时常见的 * 几何缺陷:重复顶点、冗余边、间隙和方向不一致。 * * ## 修复流水线 * * 1. heal_merge_vertices — 合并重合顶点 * 2. heal_merge_edges — 合并重合边 * 3. heal_close_gaps — 闭合小间隙 * 4. heal_orientation — 统一面方向 * * 建议通过 heal_topology() 一次性执行完整流水线。 * * @ingroup brep */ #include "vde/brep/brep.h" #include "vde/brep/brep_validate.h" namespace vde::brep { /** * @brief 合并重合顶点 * * 扫描所有顶点对,将距离小于 tolerance 的顶点合并为一个。 * 更新所有引用被合并顶点的边,使其指向保留的顶点。 * * @param body 待修复的 B-Rep 模型(原地修改) * @param tolerance 距离容差,默认 1e-6 * @return 合并的顶点对数 * * @note 合并后 body.vertices_ 的大小会减小。 * @note 顶点 ID 引用的重定向使用 Edges → Loops 层次。 */ int heal_merge_vertices(BrepModel& body, double tolerance = 1e-6); /** * @brief 合并重合边 * * 查找共享端点且曲线几何几乎相同的边对,将其中一条边合并到另一条。 * 更新所有引用被合并边的环,使其指向保留的边。 * * @param body 待修复的 B-Rep 模型(原地修改) * @param tolerance 曲线几何比较容差,默认 1e-6 * @return 合并的边对数 */ int heal_merge_edges(BrepModel& body, double tolerance = 1e-6); /** * @brief 闭合面之间的微小间隙 * * 检查每条边的端点是否在 max_gap 范围内接近另一条边的端点。 * 将接近的顶点吸附到一起,消除拓扑间隙。 * * @param body 待修复的 B-Rep 模型(原地修改) * @param max_gap 最大间隙尺寸,默认 1e-4 * @return 闭合的间隙数 */ int heal_close_gaps(BrepModel& body, double max_gap = 1e-4); /** * @brief 统一面方向(全部向外) * * 通过符号体积计算确保所有面法向量朝外。 * 对于方向朝内的面,翻转其 reversed 标志。 * * @param body 待修复的 B-Rep 模型(原地修改) * @return 翻转的面数 */ int heal_orientation(BrepModel& body); /** * @brief 执行完整拓扑修复流水线 * * 按推荐顺序执行所有修复步骤: * 顶点合并 → 边合并 → 间隙闭合 → 方向统一 * 最后调用 validate() 检查修复结果。 * * @param body 待修复的 B-Rep 模型(原地修改) * @param tolerance 用于顶点/边合并的距离容差,默认 1e-6 * @return true 如果修复后模型通过验证 * * @code{.cpp} * BrepModel body = import_step("part.step"); * if (heal_topology(body)) { * // 模型已修复,可以安全执行布尔运算等操作 * auto result = validate(body); * assert(result.valid); * } * @endcode */ bool heal_topology(BrepModel& body, double tolerance = 1e-6); } // namespace vde::brep