SMLib 与 OCCT 布尔运算对比报告

整理日期:2026-10-17;实测数据日期:2026-10-16(Asia/Shanghai)。本版独立收录布尔运算内容,覆盖 120 个场景、3720 次正式观测。重复和容差档会再次使用同一场景,不能当成新的独立模型。网页展示真实内核输出,可以旋转查看输入 A、输入 B 和结果。

主要结果

同组判据、场景及配置 SMLib OCCT 每场景重复
12 个基础盒体布尔,默认配置 12/12 12/12 10
45 个微小间隙、接触、薄重叠,默认配置 21/45 33/45 10
同 45 例,目标输入容差 1e-7 31/45 33/45 10
同 45 例,目标输入容差 1e-5 21/45 25/45 10
15 个球/圆柱/盒体布尔,默认配置 15/15 15/15 10
27 个复杂曲面布尔,具有独立解析体积答案,目标 1e-7 24/27 27/27 5
21 个复杂曲面布尔,只有必要条件,目标 1e-7 17/21 21/21 5

表中通过指通过各场景声明的全部检查,包括原生有效性和点归属。必要条件通过不是完整正确性证明。不能把不同判据、不同容差、重复使用的模型混成内核总体能力分数。微小特征位于建模容差带内时,严格数学真值与内核容差语义可能冲突,表中失配也不能一概称为布尔算法错误。

3720 次正式观测没有崩溃或超时。每个固定场景/配置/内核的状态、离散结果一致,测量在声明阈值内可重复;稳定失配依然是失配。这不是跨版本、跨平台、长时间内存可靠性或随机扰动稳定性认证。测试是隔离进程运行,部分批次并发;耗时只供诊断,不用于性能排名。

证据组成与计数

批次 场景或场景×容差档 内核数 每项重复 正式观测
basic-default 12 2 10 240
challenge-default 60 2 10 1200
aligned-tolerances 45×2 2 10 1800
complex-aligned 48 2 5 480
合计 210 个场景/配置组合 — — 3720

独立模型场景数为 12+60+48=120。另有 144 次默认模型显示重放与 2 次近外切球薄透镜显示细化重放,它们存放在 data/replays/,不计入正式次数或提高重复分母。默认显示重放逐指标核对历史结果;近切薄透镜两次重放核对正式首轮的原生量与离散判据。

公开数据中的每条记录标有 public_provenance(批次、正式/重放角色、来源快照)。各批次 cases.json 冻结输入尺寸、操作、探测点、期望值及阈值;observations.jsonl 为逐次原始观测;summary.json/csv 为逐场景聚合;manifest.json 保存版本、原始源文件和二进制摘要以及公开副本的处理说明。不同批次判定器版本有差别,保留原有状态名,未事后重新打分。

版本和调用方法

项目 实际测试配置
SMLib 10.0.0;NVIDIA USD BRep 源码 commit c9c5979f04cea8c38213004d4f04df0dcfb40d05
SMLib Python 接口 本项目 C ABI 薄桥接 + Python ctypes 调用官方 C++ core;不是官方 SmPyLib wheel
OCCT cadquery-ocp==7.9.3.1.1,OCP 运行版本 7.9.3.1,OCCT 7.9.3 系列
OCCT 操作 原生 Fuse / Cut / Common,parallel=false,额外 fuzzy=0
系统 macOS 26.6.2 arm64;公开副本保留软件与架构信息,删除个人机器路径
基础 12 例来源 brepjs commit ee674d6ccbf86499bf87cf508b32a77e4ca75ed9 的固定盒体布尔定义;扩充场景由本项目参数化生成

两边均未自动修复、简化结果或修改布尔算法。SMLib 构建排除了未使用且缺少声明的 ImportExport 编译单元,官方内核源码未改。复现配置、获取上游源码与构建入口见仓库 README.md;本报告覆盖上述已实测版本,不将其他版本的文档或代码研究当成本次运行证据。

正确性判据

基础盒体。 独立 Python 参考程序按轴对齐盒体边界划分空间单元,由集合真值推导体积、外露面积、质心、包围盒、材料实体数、有界空腔数和内外点;没有调用任一被测引擎。基础阈值为体积/面积 5e-6、质心和包围盒坐标 1e-6;离散计数、空集和点状态要求一致。12 例每次 27–125 个点,整个基础批次每内核每轮 735 点。

微小特征与初级曲面。 采用独立盒体集合和球、圆柱解析公式,保存每例 expected 与 tolerances。微特征采样可能进入建模容差带,因此单独检查体积、面积、范围、区域数及点归属,不能仅凭点状态判定模型错误。

复杂曲面。 16 种几何配置分别执行并、差、交,共 48 例,涵盖偏心等/异半径球、近外切球薄透镜、正交圆柱、斜轴贯穿圆柱、斜孔盒、环面截半、环面与偏心球/圆柱、正交环面、圆锥/圆台与球/盒、三轴椭球与斜圆柱/球/盒,以及正交双孔组合工具。27 例有独立解析体积;21 例只用体积上下界、有效性、远边界点和跨操作恒等式。每例 74–96 个解析输入归属点,与输入边界的保守距离大于 1e-3。没有将 OCCT 输出作为 SMLib 标准答案。

原生自检。 SMLib 使用递归 AssertValid 与非空流形检查;OCCT 使用 BRepCheck_Analyzer,两者覆盖不完全等价,因此同时使用共同数学判据。复杂批次还检查输入有效性。质量属性缺失标为未取得或测量问题,不能当成具体数值误差;明确 native_valid=false 单独记为无效结果。无材料、无有界空腔且无面边顶点的合法空集不查询未定义的质心,不把网格失败伪装为空集。

跨操作检查。 同一对输入应满足 V(A∪B)+V(A∩B)=V(A)+V(B) 和 V(A−B)+V(A∩B)=V(A)。复杂组 16 配置×5 次:OCCT 80/80 通过;SMLib 75 次通过,5 次正交环面并集质量属性不可得而未评估。这些只是必要条件,互相抵消的误差可能通过体积恒等式。

容差对齐与因果证据

SMLib 默认观察到 Zone 约 1e-5;OCCT 常见新建输入存储容差为 1e-7。受控实验把新建精确输入的边/点最大存储容差设为目标,分别读回输入与结果容差,结果不强制压低。1800 次微特征对齐调用的输入边/点最大值均匹配目标。复杂组 SMLib 输入最大值为 1e-7,OCCT 因变换/组合保留约 1e-7–3e-7,不宣称全过程完全一致。

设置项 SMLib OCCT
输入设置 创建上下文/基本体前 SetModelSizeEstimate,随后对新建 Brep、Face、Edge、Vertex 显式 SetTolerance(tol,FALSE,FALSE) BRep_Builder UpdateFace/UpdateEdge/UpdateVertex;不强制压低已有误差
1e-7 受控档 model-size estimate=0.0005,实际模型坐标未缩放 输入 1e-7,fuzzy=0
1e-5 受控档 estimate=50,输入显式设 1e-5 输入提高到 1e-5,fuzzy=0
读回证据 微特征为输入边/点最大值;不声称全部节点逐项读回已证实 微特征保存 A/B 面、边、点 min/max/count
未统一部分 SM_USE_OLDTOL;Approx/XSect、context 和局部策略各自管理 Precision.Confusion=1e-7、Intersection=1e-9、Angular=1e-12

SMLib estimate=0.0005 对 2 mm 模型不是按真实尺度推荐的生产配置,而是利用公开容差映射开展受控实验。只降低新建精确基本体存储容差,不能直接照搬到具有近似误差的导入模型。单改全局值的审计显示请求 Zone=1e-7 时输入最大值仍为 1e-5,薄交集仍丢失,因此请求值和实际输入值必须区分。

两个边长 2 mm 的盒体,B 的 x 起点为 1.999999 mm,交集应为宽 1e-6 mm、体积 4e-6 mm³ 的薄片:

配置 SMLib 体积 mm³ OCCT 体积 mm³ 观察
各自默认 0 3.9999999996709334e-6 SMLib 丢失薄片
输入目标 1e-7 4.0000000001150227e-6 3.9999999996709334e-6 两边保留
输入目标 1e-5 0 0 两边丢失

这说明默认/输入容差是该差异的重要原因,不能进一步把每个内部阈值贡献精确拆开。采样厚度下,1e-7 档最薄通过交集均为 1e-6 mm,1e-5 档均为 1e-4 mm;只能证明已测点,不是精确临界阈值。

剩余差异包含容差带内合并、包围盒查询和点归属。1e-7 档 SMLib 有 2 例仅点归属不符;去掉这项后两边各 33/45,但通过集合不同。间隙等于输入容差的并集,SMLib 保留两实体和严格体积/面积但间隙点为 boundary;OCCT 合为一实体并改变面积/体积。重叠等于输入容差的并集,SMLib 严格体积/面积通过,OCCT 略有偏离。差异不是单向一方全面更强。

复杂曲面主要差异

SMLib 场景 实测问题 解释边界
两个正交环面·并 输入有效;结果自检失败、非流形,合法实体质量属性不可得 网格外观看似实体不能替代自检;输出最大容差约 1.316e-5
两个正交环面·差/交 自检通过,多个独立远边界归属点不符 差集把处于两环面孔洞中的原点判为内部,难以仅用边界容差解释
圆锥台与偏心球·并 自检通过,10 个归属点不符 点 (-1.2,0,0) 在解析圆台内部,结果查询却为外部;尚未定位造型还是分类算法
三轴椭球截半·并/差/交 输入有效,解析体积符合,但 AssertValid 失败 自检失败与体积错误是不同结论

OCCT 在对应 48 例当前声明检查中未出现这些问题。这里覆盖解析曲面、非均匀变换和组合工具,尚未覆盖任意 NURBS 自由曲面、修剪退化面、大规模工业零件或复杂装配。

48 个复杂布尔场景的逐例结果

分母均为 5,PASS 表示该场景全部声明检查通过。必要条件组仍保留证据限制。

场景 证据等级 SMLib OCCT
等半径偏心球透镜 · 并集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
等半径偏心球透镜 · 差集 A−B 解析体积及声明检查 5/5 · PASS 5/5 · PASS
等半径偏心球透镜 · 交集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
异半径偏心球透镜 · 并集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
异半径偏心球透镜 · 差集 A−B 解析体积及声明检查 5/5 · PASS 5/5 · PASS
异半径偏心球透镜 · 交集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
近外切球薄透镜 · 并集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
近外切球薄透镜 · 差集 A−B 解析体积及声明检查 5/5 · PASS 5/5 · PASS
近外切球薄透镜 · 交集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
正交圆柱 Steinmetz 交体 · 并集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
正交圆柱 Steinmetz 交体 · 差集 A−B 解析体积及声明检查 5/5 · PASS 5/5 · PASS
正交圆柱 Steinmetz 交体 · 交集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
球与斜轴贯穿圆柱 · 并集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
球与斜轴贯穿圆柱 · 差集 A−B 解析体积及声明检查 5/5 · PASS 5/5 · PASS
球与斜轴贯穿圆柱 · 交集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
盒体与偏心斜孔圆柱 · 并集 必要条件 5/5 · PASS 5/5 · PASS
盒体与偏心斜孔圆柱 · 差集 A−B 必要条件 5/5 · PASS 5/5 · PASS
盒体与偏心斜孔圆柱 · 交集 必要条件 5/5 · PASS 5/5 · PASS
环面沿对称平面截半 · 并集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
环面沿对称平面截半 · 差集 A−B 解析体积及声明检查 5/5 · PASS 5/5 · PASS
环面沿对称平面截半 · 交集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
环面与偏心球多曲线交界 · 并集 必要条件 5/5 · PASS 5/5 · PASS
环面与偏心球多曲线交界 · 差集 A−B 必要条件 5/5 · PASS 5/5 · PASS
环面与偏心球多曲线交界 · 交集 必要条件 5/5 · PASS 5/5 · PASS
环面与偏心竖直圆柱 · 并集 必要条件 5/5 · PASS 5/5 · PASS
环面与偏心竖直圆柱 · 差集 A−B 必要条件 5/5 · PASS 5/5 · PASS
环面与偏心竖直圆柱 · 交集 必要条件 5/5 · PASS 5/5 · PASS
两个正交环面 · 并集 必要条件 0/5 · INVALID_RESULT 5/5 · PASS
两个正交环面 · 差集 A−B 必要条件 0/5 · CHECK_MISMATCH 5/5 · PASS
两个正交环面 · 交集 必要条件 0/5 · CHECK_MISMATCH 5/5 · PASS
圆锥台与偏心球 · 并集 必要条件 0/5 · CHECK_MISMATCH 5/5 · PASS
圆锥台与偏心球 · 差集 A−B 必要条件 5/5 · PASS 5/5 · PASS
圆锥台与偏心球 · 交集 必要条件 5/5 · PASS 5/5 · PASS
圆锥顶点与母线截半 · 并集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
圆锥顶点与母线截半 · 差集 A−B 解析体积及声明检查 5/5 · PASS 5/5 · PASS
圆锥顶点与母线截半 · 交集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
三轴椭球与偏心斜圆柱 · 并集 必要条件 5/5 · PASS 5/5 · PASS
三轴椭球与偏心斜圆柱 · 差集 A−B 必要条件 5/5 · PASS 5/5 · PASS
三轴椭球与偏心斜圆柱 · 交集 必要条件 5/5 · PASS 5/5 · PASS
三轴椭球与偏心球 · 并集 必要条件 5/5 · PASS 5/5 · PASS
三轴椭球与偏心球 · 差集 A−B 必要条件 5/5 · PASS 5/5 · PASS
三轴椭球与偏心球 · 交集 必要条件 5/5 · PASS 5/5 · PASS
盒体与正交双孔组合工具 · 并集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
盒体与正交双孔组合工具 · 差集 A−B 解析体积及声明检查 5/5 · PASS 5/5 · PASS
盒体与正交双孔组合工具 · 交集 解析体积及声明检查 5/5 · PASS 5/5 · PASS
三轴椭球对称平面截半 · 并集 解析体积及声明检查 0/5 · INVALID_RESULT 5/5 · PASS
三轴椭球对称平面截半 · 差集 A−B 解析体积及声明检查 0/5 · INVALID_RESULT 5/5 · PASS
三轴椭球对称平面截半 · 交集 解析体积及声明检查 0/5 · INVALID_RESULT 5/5 · PASS

真实模型与展示重放

网页模型来自原生输入与布尔输出的三角化,几何量来自精确 BRep 测量。没有依据期望体积或包围盒重建外观;失败结果能三角化时保留实际网格并标记失败。空结果、无效模型、网格导出失败分别显示。原坐标为 double,绘图前居中;“原始比例”保持 X/Y/Z 比例,不意味着屏幕毫米等于模型毫米。微特征局部放大只辅助观察,不改内核输入。

布尔专版共 420 个场景/配置/内核显示模型包:默认 72×2=144;两档微特征 45×2×2=180;复杂曲面 48×2=96。默认模型来自独立重放,对齐/复杂模型通常来自正式首轮。两份近外切球交集显示资源采用独立细化重放;原始正式统计和原始网格哈希保留。

近外切薄透镜默认弦高 1e-3 太粗,显示用结果弦高改为 1e-5(输入仍 1e-3);原生体积、面积、质心、包围盒、点归属、有效性和容差与正式首轮相同。细化后网格体积相对原生体积误差 SMLib 约 0.051655%、OCCT 约 0.10795%。这改善显示准确性,没有增加正式重复次数。独立重放的 measurements/verification 保存在 data/replays/display-refinement/。

如何复现和审计

公开复现仓库 · v0.1.0 报告与数据包 · 完整网页包

  1. 按仓库 README.md 创建两侧运行环境、获取锁定提交的上游源码、构建 SMLib 桥接;不使用原作者机器路径或预编译私有库。
  2. 使用冻结场景及原运行设置分别运行内核,结果写入新的运行目录,不覆盖发布证据。完整批次重复 10 次,复杂批次 5 次;先运行小样本验证环境。
  3. 对照每场景阈值、点状态、原生有效性和实际输入/结果容差;错误与缺失指标要保留,不自动当成零或 PASS。
  4. 通过 data/CHECKSUMS.sha256 验证公开数据文件;各 sanitized manifest 另存原始输入文件 SHA256,可追溯其快照。公开副本已过滤无关操作,并将个人绝对路径改为符号位置,因此公开副本本身不与原件逐字节相同。
  5. 网页为预计算结果浏览器,不在浏览器实时运行 CAD。代码、构建、运行、测试结果和网页部署是不同验证边界;公开数据可独立查看,不要求先成功构建全部依赖。

本报告的整理和网站发布没有重新运行全量内核。平台或编译器不同可能导致数值差异,应使用同一判据比较,不只比较文件哈希。公开数据保存原始测量值和状态,没有因发布而调整通过标准。

上游入口

上游源码、依赖与资源各自遵循其许可证;本仓库实验结论仅对应固定版本和已声明场景。