
ブラケットを小さくすると、1 個あたりの推定コストは 17.22 EUR から 14.69 EUR に下がり、16 EUR の目標を下回りました。それでも不合格になりました。DFM レビューでは、M5 用のベース穴 2 つでねじ頭が座る側を補強リブがふさぎ、ねじ頭と六角レンチが入らないことも見つかりました。ただし、この派生形は DFM 要件を加えなくても、すでに穴の縁距離のチェックで不合格です。これは pai-design-workbench の 3 軸フライス加工向け製造性(DFM)チェックが、プロジェクト自身のエンドツーエンドテストで出した結論です。本記事では固定コミットのソースコードをもとに、このチェックが B-Rep の形状から段取り回数、穴のドリル加工性、ねじの取付空間、1 個あたりのコスト推定をどう求めるのか、そしてそれぞれの結果がどのモデルと前提のもとでだけ成り立つのかを説明します。
本記事が依拠するのは、commit d095382 に固定した 4 つのファイルです。チェック用スクリプト 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 の書き出し で扱いました。本記事はその前にある別のゲート、つまりこの部品を 3 軸フライス盤で作れるか、おおよそいくらかかるかを扱います。
保存された 1 回の比較:基準部品は予算超過、コンパクト部品はねじが付かない
テスト対象は 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 の部分がアサートしているのは上の表の項目だけで、不合格になったチェックをすべて列挙してはいません。したがって、不合格の原因をねじの取付空間だけに帰すことはできません。
段取り回数:6 つの主方向での厳密な被覆
スクリプトは CadQuery で STEP を読み込み、B-Rep の面を順に調べます。平面については外向き法線 n を記録し、凹の円筒面(面の向きが TopAbs_REVERSED)は穴として、直径、軸方向の深さ、軸の向きを記録します。工具方向として考えるのは ±X、±Y、±Z の 6 つの主方向 d だけです。平面が方向 d から到達可能とされる条件は n·d ≥ 0、つまり正面フライス(法線が工具を向く)または側面フライス(法線が工具軸に垂直)です。穴がある端から到達可能とされる条件は、その端の先のドリル通路に材料がないことです。スクリプトは 1〜6 方向のすべての組み合わせを少ない順に試し、すべての平面と穴を覆える最初の組み合わせを段取り方向とします。候補は 6 つしかないので、総当たりは厳密な集合被覆になります。
この「厳密」は、スクリプト自身の到達可能性モデルの中でだけ成り立ちます。コードをもう一歩たどると、モデルがいかに寛容かがわかります。座標軸にそろった平面は、法線と逆向きの 1 方向を除く 5 方向から到達可能とみなされます。したがって部品の平面がすべて座標軸にそろっていれば、異なる 2 方向があればどの組み合わせでもすべての平面を覆えます。3 つ目の方向が必要になるのは、穴の通路か斜面がある場合だけです。スクリプトの説明文にも、部品の他の部分による平面の遮蔽はモデル化していないと明記されており、斜めの穴はすべて到達不能として扱われます。工具長、治具、ワークの固定方法も計算に入っていません。
もう 1 点注意が必要です。コードは凹の円筒面をすべて穴として扱い、穴の数、ドリル時間、深さ径比のチェックに含めます。大きな軸受穴や凹のフィレットも、凹の円筒面であれば同じように数えられます。このブラケットの各面がどう分類されたかは、提供された資料には示されていません。
穴とねじ:2 種類の円筒プローブ
どちらのチェックも同じ方法を使います。穴の軸に沿って、穴の一端のすぐ外側に円筒プローブを置き、部品との共通部分を求めます。共通部分の体積が 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 の補強リブと重なります。これはパラメータから本サイトが行った幾何の計算で、新たな実行結果ではありません。2 つのチェックは規則が異なるため、同じ穴が基準面側からはドリル加工できるのに、反対側ではねじが座れない、ということが起こりえます。
コスト推定:各項はすべて 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、1 穴 20 秒、段取り 1 回 15 分、ロット 50、機械時間 75 EUR/h。
スクリプトの出力には、素材体積、部品体積、素材と部品の体積比(buyToFly)、加工時間、材料費も書き出されるので、項目ごとに確認できます。チェックの説明には「not a quote」(見積りではない)と明記されています。
次の 2 つの計算は、各項の大きさを示すために本サイトが式から行った算術で、測定結果ではありません。1 つ目。テストは基準部品の公称バウンディングボックスを 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 を超えた主因は材料ではなく機械時間です。2 つ目。ロット 50 では段取り 1 回が 1 個あたり 15 ÷ 50 = 0.3 分、約 0.375 EUR になります。ロットの前提を 1 に変えると段取り 1 回は 18.75 EUR になり、2 回の段取りだけで 16 EUR を超えます。コストゲートの結論はロットや単価といった前提に直接左右されるので、工場が変わればパラメータファイルも変える必要があります。
凍結した要件としてレビューに入る
要件表 F21 は DFM を「任意の凍結要件」とし、CAD チェックと EvalArc に組み込まれると記しています。テストでは、DFM のしきい値はこの 1 回の CAD レビュー要求の requirements と一緒に送られ、プロジェクト自体の受け入れ基準は変わっていません。スクリプトの既定値からも任意であることがわかります。maxSetups を渡さなければ上限は 3、maxUnitCostEur を渡さなければ上限は 10⁹ EUR で、事実上コストゲートなしと同じです。
しきい値は結果を見てから調整するのではなく、レビューの前に決めておく必要があります。同じテストの別の部分がこの規則を示しています。肉厚の問題を修正する際、再チェックの要求で minWallMm を 2 に緩めると、レビューは INVALID_RECHECK で失敗します。この部分が扱っているのは肉厚で DFM ではありませんが、コストゲートにも同じやり方が当てはまります。まず maxUnitCostEur と工場パラメータを凍結し、そのうえで候補を比べます。
報告はするがゲートにはしない結果が 1 つあります。鋭い内角です。3 軸フライスで削った内角には工具半径が残ります。スクリプトは選ばれた方向から鋭角にできない凹の稜線を数え、notes で 1.5 mm 以上(最小工具径 3.0 mm の半分)の角 R を付けるか、放電加工を使うよう提案します。これは 4 つのチェックには含まれず、結論に影響しません。
制約と注意点
- コストは工場ファイルの経験的なパラメータから求めた推定値です。見積りでも生産での実測値でもなく、設計変更による節約を保証するものでもありません。要件表 F21 には CAM の工具経路シミュレーションは行っていないと明記されています。リポジトリには別途 F29 の CAM チェックがありますが、本記事では扱っていません。
- 段取りの被覆が厳密なのは「6 つの主方向、
n·d ≥ 0、平面の遮蔽はモデル化しない」というモデルの中だけで、部品が一般的な意味で製造可能であることは示しません。曲面、工具長、ワークの保持、公差はモデルの外にあります。 - 17.22 EUR、14.69 EUR、「段取り 2 回」はプロジェクトが報告した開発時の結果で、テストのアサーションもプロジェクト自身が書いたチェックです。本サイトはネイティブ CAD を独自に実行しておらず、工場の切削速度やサイクルタイムも測定していません。上の材料費と機械時間の内訳は、DFM が基準部品と同じバウンディングボックスを使うという前提に基づきます。
- コンパクト部品は DFM 要件がなくても穴の縁距離で不合格になっているため、DFM 部分の結論をねじの取付空間だけに帰すことはできません。
- テストの報告には
physicalValidation: false、feaPerformed: false、toleranceStackUp: falseと記録されています。部品は公称形状にすぎず、本記事のどの内容も強度や物理的な安全性についての結論ではありません。要件表も「シミュレーションを物理的な検証とみなすこと」を対象外としています。
リンク
- チェック用スクリプト:native/cad_dfm.py(commit d095382)
- 工場パラメータ:native/dfm-shop.json(commit d095382)
- エンドツーエンドテスト:scripts/cad-e2e.ts(commit d095382)
- 要件と受け入れ状況:docs/REQUIREMENTS.md(commit d095382)
- 本サイトの関連記事:承認済みの CAD 部品をロボットアームのシミュレーションに載せる:質量の照合と、持ち運べる MJCF・OpenUSD の書き出し
- 本サイトの関連記事:エージェントの物理推定をホールドアウトのソルバー結果で確かめる:評価は合格、それでも高さの傾向は逆だった



