1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 設計の全体像
[English](../architecture.md) | 日本語
## 処理の流れ
```
上位系(経路生成、ロボット・工作機械の動作)
│ 工具の姿勢(先端と軸)、または直線・円弧の区間
▼
SegmentBuilder(任意)────► MotionSegment
▼
sweep:区間と工具から掃引体積を作る(弦誤差で分割した凸包の列)
▼
engine:重なるタイルを選び、カーネルで差分し、検証して確定する
▼
kernel::manifold:Manifold によるメッシュブーリアン
▼
出力:タイルごとの表示メッシュ、STL / OBJ / glTF / 3MF、B-rep の STEP、設計モデルとの比較
```
## 素材の表現
素材は閉じた三角形メッシュで、カーネル(既定は [manifold-rust](https://crates.io/crates/manifold-rust))が保持する。切削は「素材 \ 掃引体積」のブーリアンで、結果は常に多様体であることがカーネルによって保証される。
B-rep を正本にして区間ごとに差分する方式は採らなかった。切削では同じ深さの底面や同じ経路の側壁が毎回一致し、B-rep カーネルのブーリアンはこの一致・接触で失敗しやすい。実際に複数の Rust 製 B-rep カーネルで試したところ、共面・接触を含む入力ではほぼ確実に失敗し、連続した切削では 1 回の演算時間が面数に比例して増えた。メッシュブーリアンは同じ入力をすべて処理でき、1,000 区間の連続切削でも失敗がなかった。B-rep は入出力(STEP の読込と、解析面の復元による STEP 書出)に限って使う。
## 掃引体積
工具は凸な回転体なので、平行移動の掃引体積は始点と終点の工具インスタンスの凸包に一致する。工具インスタンスは回転プロファイル(半径と先端からの高さ)を円周方向に分割した点群で表し、凸包はカーネルが作る。
軸が回る区間と円弧移動は、工具の最遠点の弦誤差が `sweep_tolerance` 以下になるように姿勢列をサンプリングし、連続する 2 姿勢の凸包を順に引く。和集合を作ってから引く方式は、交線が増えて三角形が増えるため使わない。
## タイル化
素材を立方体タイルに分けて別々のメッシュとして保持し、掃引体積の境界ボックスと重なるタイルだけに差分を適用する。1 回の差分の相手がそのタイルの中身だけになるため、処理時間が加工の履歴に依存しない。タイル境界の共面はメッシュブーリアンでは問題にならない。表示メッシュはタイルごとにキャッシュし、変更されたタイルだけを取り出せる。
分割しない設定(部品単位)では、差分で分かれた部品を別々に追跡し、内部空洞は外殻に戻す。
## 由来情報と B-rep の復元
Manifold は差分の結果でも三角形ごとに「どの入力から来たか」を保持する。エンジンは素材と掃引体積の凸な部分ごとに固有の ID を与え、工具の幾何(半径、始点・終点の姿勢)を記録する。B-rep を出力するときは、この情報から三角形を平面・円柱に分類し、面と稜線を組み直す([brep-export.md](brep-export.md))。
## モジュール
| モジュール | 役割 |
|---|---|
| `engine` | 素材の状態(部品またはタイル)、差分の適用、検証、履歴、設計モデルとの比較、B-rep 復元の呼び出し |
| `kernel` | 形状演算の抽象境界 `Kernel` と `kernel::manifold` 実装 |
| `sweep` | 掃引体積(凸包の列)の生成、円の分割数、回転のサブステップ |
| `tool` | 工具(切削部の回転プロファイル、シャンク・ホルダー) |
| `motion` | 姿勢、直線・円弧の区間、補間 |
| `stock` | 素材の初期形状 |
| `mesh` | 三角形メッシュの入出力と頂点の併合 |
| `brep` | 解析面の復元と STEP 書出 |
| `compare` | 設計モデルとの比較結果 |
| `stream` | 姿勢の列を区間にまとめるアダプター |
| `step`(feature `stepio`) | STEP の読込(truck-stepio) |
`Kernel` トレイトは、ソリッドの生成(素材、メッシュ、掃引体積)、差分・交差・和集合、体積、メッシュ化、由来情報の取得を定義する。別のメッシュブーリアンや体積表現(Dexel 等)を同じ境界の裏に置ける。