
一个支架改小之后,单件估算成本从 17.22 EUR 降到 14.69 EUR,低于 16 EUR 的目标,却仍被拒绝。DFM 评审还发现,两个 M5 底座孔的落座一侧被加强筋压住,螺钉头和内六角扳手放不进去;而这个变体在不加任何 DFM 要求时,就已未通过孔边距检查。这是 pai-design-workbench 的三轴铣削可制造性(DFM)检查在项目自己的端到端测试里给出的结论。本文按固定提交的源码,讲这套检查怎样从 B-Rep 几何算出装夹次数、孔的可钻性、螺钉空间和单件成本估算,以及每一项只在什么模型、什么假设下成立。
下文依据固定在 commit d095382 的四个文件:检查脚本 native/cad_dfm.py、车间参数 native/dfm-shop.json、端到端测试 scripts/cad-e2e.ts 和需求表 docs/REQUIREMENTS.md([O],项目自述)。17.22 EUR 与 14.69 EUR 出自需求表 F21 的验收记录,测试脚本只断言它们与 16 EUR 的大小关系;本站没有运行 CadQuery、测试或任何求解器,也没有核实车间参数。同一仓库把已验收零件装上机械臂仿真的做法,见 把验收过的 CAD 零件装上机械臂仿真:质量核对、可移植的 MJCF 与 OpenUSD 导出;本文讲的是验收之前的另一道门:这个零件能不能用三轴铣床做出来、大约多少钱。
一次保存的对照:参考件超预算,紧凑件装不上螺钉
测试的项目是一个 NEMA 17 电机支架,项目写下的决策是“只有壁厚、接口和装配检查仍然通过时,才接受更轻的支架”。DFM 那一段用参考件作基线、compact 变体作候选,并在本次评审的要求里加上 dfm: { maxSetups: 2, maxUnitCostEur: 16 }。测试断言与需求表记录的结果如下:
| 检查 | 参考件(基线) | 紧凑件(候选) | 要求 |
|---|---|---|---|
machining-setups | 测试未断言 | 2 次(测试注释:+Y 面、+Z 底座) | ≤ 2 |
unit-cost | 17.22 EUR,未通过 | 14.69 EUR,通过 | ≤ 16 EUR |
fastener-access | 通过,M5 与 M3 螺钉都能落座 | 2 个孔被挡住,未通过 | 0 个 |
| 本次评审结论 | — | rejected | — |
测试注释给出了原因:宽度 W = 50 时,侧边加强筋(x ≥ 21)伸到固定位置的 M5 底座孔(x = ±20,Ø5.5)上方,M5 螺钉头无法落座。需要注意,同一个测试在不加 DFM 要求时,compact 已经因为 hole-edge-distance(孔边距)被拒绝;DFM 那一段只断言了上表几项,没有列出全部未通过的检查。所以“被拒绝”不能只归因于螺钉空间。
装夹次数:六个主方向上的精确覆盖
脚本用 CadQuery 读入 STEP,遍历 B-Rep 的面:平面记下外法线 n;凹的圆柱面(面方向为 TopAbs_REVERSED)记为孔,取直径、沿轴向的深度和轴线方向。刀具方向只考虑 ±X、±Y、±Z 六个主方向 d。一个平面从方向 d 可达的条件是 n·d ≥ 0,即端铣(法线朝刀)或侧铣(法线与刀轴垂直);一个孔从某一端可达的条件是那一端的钻削通道里没有材料。脚本按 1 到 6 个方向的全部组合依次尝试,第一个能覆盖全部平面和孔的组合就是装夹方向,候选只有 6 个,所以穷举是精确的集合覆盖。
这个“精确”只在它自己的可达性模型里成立。按代码推一步就能看到模型有多宽松:一个与坐标轴对齐的平面,除了正对它法线反方向的那一个,其余五个方向都算可达;因此只要零件的平面都与坐标轴对齐,任意两个不同方向就能覆盖全部平面。需要第三个方向的,只能是孔的通道或斜面。脚本注释也写明,平面被零件其他部分遮挡的情况没有建模;斜孔一律记为不可达。没有算进来的还有刀具长度、夹具和工件怎样固定。
另一处要留意:代码把每个凹圆柱面都当作孔,参与孔数、钻孔时间和深径比检查。较大的轴承孔或凹圆角,只要是凹圆柱面,也会被这样计入;所给材料没有展示这个支架的各个面被怎样分类。
孔与螺钉:两种圆柱探针
两项检查都用同一个办法:沿孔轴在孔的一端外侧放一个圆柱探针,与零件求交,交集体积超过 0.001 mm³ 就算被挡住。区别在探针的尺寸和看哪一端:
- 可钻性(
hole-drillability):探针半径为孔半径的 0.98 倍,长 30 mm(drillAccessMm)。只要有一端通畅就算能钻;两端都被挡住的孔不能钻。深径比由孔深除以直径,与车间上限 4.0 比较,深度取不到的孔也算超限。 - 螺钉空间(
fastener-access,DFA):孔径与dfm-shop.json中的螺钉通孔径相差小于 0.05 mm 时,认定为对应螺钉的通孔(3.4 → M3、5.5 → M5、9.0 → M8,ISO 273 中等配合)。探针直径为螺钉头直径加 1 mm,长度为头高加扳手空间(ISO 4762 内六角圆柱头螺钉)。落座一侧是不在零件包围盒上的那一端,即离开基准面或配合面的一端;两端都在或都不在包围盒上时,任一端都算。
以 M5 为例,按车间参数手算探针尺寸:头径 8.5 mm、头高 5 mm、扳手空间 20 mm,探针半径 8.5 / 2 + 0.5 = 4.75 mm,长 5 + 20 = 25 mm。孔心在 x = 20 时,探针覆盖 x = 15.25 到 24.75 mm,与测试注释里 x ≥ 21 的加强筋位置重叠。这是本站按参数做的几何算术,不是一次新的运行。两项检查的规则不同,也意味着同一个孔可以从基准面一侧钻出来,螺钉却在另一侧落不了座。
成本估算:每一项都来自 dfm-shop.json
估算的结构写在脚本里,参数集中在车间文件中,文件注释说它们是“6061-T6、小型立式加工中心的经验值”,要改就改这个文件,不改代码:
# 代入 dfm-shop.json 的数值;长度单位 mm,area 为 mm²
stock_cm3 = (bb.xlen + 2*2.0) * (bb.ylen + 2*2.0) * (bb.zlen + 2*2.0) / 1000
material = stock_cm3 * 2.7 / 1000 * 6.5 # EUR
minutes = (stock_cm3 - part_cm3) / 20 + (area / 100) / 25 + len(holes) * 20 / 60
setup_minutes = setups * 15
unit = material + (minutes + setup_minutes / 50) / 60 * 75 # EUR
这是脚本公式代入车间参数后的写法:2.0 mm 余量、密度 2.7 g/cm³、材料 6.5 EUR/kg、粗加工 20 cm³/min、精加工 25 cm²/min、每孔 20 s、每次装夹 15 min、批量 50、机时 75 EUR/h。
脚本输出里同时写出毛坯体积、零件体积、买入与成品体积之比(buyToFly)、加工分钟和材料费,方便逐项复核,并在检查说明里注明“not a quote”(不是报价)。
下面两笔是本站按公式做的算术,用来说明各项的量级,不是测量结果。其一,测试断言参考件的名义包围盒为 60 × 30 × 50 mm;若 DFM 用的是同一包围盒,毛坯为 64 × 34 × 54 mm = 117.504 cm³,约 317 g,材料费约 2.06 EUR。17.22 EUR 里其余约 15.16 EUR 来自机时,按 75 EUR/h 约合 12.1 分钟(含分摊的装夹时间)。也就是说,在这套假设下,参考件超出 16 EUR 主要是机时而不是材料。其二,每次装夹在批量 50 下分摊 15 ÷ 50 = 0.3 分钟,约 0.375 EUR;如果把批量假设改成 1,每次装夹就是 18.75 EUR,两次装夹仅这一项就超过 16 EUR。成本门的结论直接取决于批量和费率这些假设,换一个车间就要换一份参数。
作为冻结要求进入评审
需求表 F21 把 DFM 写作“可选冻结要求”,进入 CAD 检查和 EvalArc。在测试里,DFM 阈值随这一次 CAD 评审请求的 requirements 一起提交,项目本身的验收条件没有改动。脚本的默认值也说明它是可选的:不传 maxSetups 时上限为 3,不传 maxUnitCostEur 时上限为 10⁹ EUR,相当于不设成本门。
阈值要在评审之前定下来,而不是看到结果再调整。同一个测试在另一段里演示了这条规则:修复一个壁厚问题时,如果复测请求把 minWallMm 放宽到 2,评审以 INVALID_RECHECK 失败。那一段针对的是壁厚,不是 DFM;但对成本门同样适用的做法是,先冻结 maxUnitCostEur 和车间参数,再比较候选件。
有一项结果只报告、不拦截:尖锐内角。三轴铣出的内角会留下刀具半径,脚本统计选定方向上做不出尖角的凹边数,并在 notes 里建议加不小于 1.5 mm(最小刀径 3.0 mm 的一半)的圆角,或改用电火花加工;它不在四项检查里,不影响结论。
局限 / 注意
- 成本是按车间文件中的经验参数算出的估算,不是报价,不是生产实测,也不保证改设计能省下这笔钱。需求表 F21 写明未做 CAM 刀路仿真;仓库另有 F29 的 CAM 检查,本文没有涉及。
- 装夹覆盖只在“六个主方向、
n·d ≥ 0、平面遮挡不建模”的模型里精确,不说明零件在一般意义上可以制造。曲面、刀具长度、夹持和公差都不在模型内。 - 17.22 EUR、14.69 EUR 和“2 次装夹”是项目自报的开发结果,测试断言是项目自己写的检查;本站没有独立运行原生 CAD,也没有测量车间的切削速率或节拍。本文的材料费与机时拆分基于参考件包围盒与 DFM 所用包围盒相同的假设。
- 紧凑件在不加 DFM 要求时已因孔边距被拒绝,DFM 段的结论不能只归因于螺钉空间。
- 测试报告记录
physicalValidation: false、feaPerformed: false、toleranceStackUp: false;零件只是名义几何,本文的任何内容都不构成强度或实物安全结论。需求表也把“把仿真当作物理验证”列为范围外。



