部材の長さを足すだけでは、切断時に失われる幅を見落とします。ここでは配置最適化に進む前の小さな入力チェックとして、一列に並べた部材と、その間の切断幅が占める最小スパンをPythonで計算します。
まず、式が表す範囲を決める
部材の長さを lengths、部材間の切断幅を kerf とすると、部材がn個ある場合の部材間の隙間はn−1個です。
minimum_span = sum(lengths) + kerf * (n - 1)
この式では、寸法を正の整数mm、切断幅を0以上の整数mmとして扱います。両端の切りそろえ、仕上げ代、残材を切り離すために必要な追加の切断は含めません。したがって、これは必要な占有長さの簡単な検算であり、加工できることの保証ではありません。余った端材から最後の部材を分離する場合などは、実際の切断手順に合わせた余裕を別に計上します。
実行できる最小例
def minimum_span(lengths, kerf):
if not lengths or any(type(x) is not int or x <= 0 for x in lengths):
raise ValueError("lengths must be positive integer millimetres")
if type(kerf) is not int or kerf < 0:
raise ValueError("kerf must be nonnegative integer millimetres")
return sum(lengths) + kerf * (len(lengths) - 1)
for pieces in ([300, 300, 394], [300, 300, 400]):
occupied = minimum_span(pieces, 3)
print(pieces, occupied, occupied <= 1000)
実行結果は次のとおりでした。
[300, 300, 394] 1000 True
[300, 300, 400] 1006 False
300mm、300mm、394mmの合計は994mmです。部材間の切断幅が3mmずつなら、二つの隙間で6mmを使い、占有長さは1000mmになります。最後の部材を400mmにすると、部材だけで1000mmあり、切断幅を含めると1006mmです。
True は、このモデルの占有長さが設定した1000mm以下という意味だけです。「1000mmの板から必ず加工できる」「歩留まりが最適」とは読み替えません。
入力の境界も確かめる
上の関数では、空のリスト、0、負数、小数の長さを拒否します。負の切断幅も拒否します。これらの例が ValueError になること、部材が一つなら部材間の隙間が0になること、切断幅0なら単純な合計になることを別途実行確認しました。
type(x) is int を使ったのは、この小さな例で真偽値や小数を暗黙に寸法として受け取らないためです。小数mmが必要な用途は、この整数版の適用外です。入力単位を統一し、必要なら小さい単位の整数に変換する設計を先に決めます。
一次元の検算から二次元の配置へ
ここでは幅方向、部材の回転、木目、板の枚数、切断順序を扱っていません。シート材から長方形の部材を取る配置は別の問題です。一列の長さが収まるという条件だけで、二次元の配置が成立するとは判断できません。
長方形の部材をシートに配置する工程には、関連ツールとしてCutListEngineがあります。画面は英語です。本稿のPython関数はその実装の説明、性能検証、または最適解の証明ではありません。必要寸法と切断幅を整理し、配置結果を実際の加工条件で確認する、という手順のための補助的な例です。
本稿はCutListEngineの紹介を目的に含む記事です。文章の作成にAIを利用し、掲載したPythonコードと数値例、記載した入力境界は実行して確認しました。実際の木工作業や製品の加工テストを行ったという主張はしていません。