導出される情報
.muro に形は無い。平面図も面積も内外の別も動線も、原本には書かれず、すべて導出される。
これは節約ではなく役割の定義である。幾何は、これから現実側から取れる。スキャン、SLAM、写真測量、splat — 形を得る手段は安くなり続ける。取れるようになるものを、わざわざ原本に書いて持つ理由はない。
点群からは決して出てこないものがある。ここが何の空間か。この境界は誰と誰の境か。この扉は通ってよいのか。いつからそうなのか。意味と関係と同一性は、観測では得られない。書くしかない。
したがってこの記述は、書くしかないものを持つ。形を原本に持たないことは妥協ではなく、役割の定義である。そして書くしかないものだけを持てば軽い。軽ければ一棟が丸ごと機械の視野に入る — 軽さは目的ではなく、役割から出る結果である。
一枚の表
左右は対応する組ではなく、それぞれ独立した一覧である。
| 書かれるもの (原本) | 導出されるもの |
|---|---|
| 空間の領域 (通り参照の矩形合併) | 壁芯の線分 |
| 境界の関係 (両端・種別・属性) | 既定境界 (水平の壁・垂直の床) |
開口 (door / window) | 面積 (壁芯) と屋内床面積 |
grid と level | 垂直の隣接 |
敷地形状 (polygon) | 半屋外・庇下 |
| アセット・ゾーン | 通行可能性 |
数えない分節 (area / seg)・uid | 平面図・採光の入力・接道と建蔽率・正準 JSON |
この表が、初学者の二つの疑問に同時に答える。
「床はどこに書くのか」 — 書かない。上下のレベルで平面が重なる空間どうしは垂直に隣接し、既定の解釈は「床がある」である。例外 (階段・シャフト・吹抜け) だけを境界で宣言する。
「この空間を半屋外だと宣言したい」 — できない。半屋外は導出である。外部に対して open または air:1 の境界を持つ、領域つきの空間が半屋外になる (既定の境界)。
座標を持つのは与件だけである
原本の中で層が三つに割れている。
| 層 | 何か | 座標 | 実体 |
|---|---|---|---|
| 与件 | 通り芯・レベル・敷地形状 | 持つ。唯一の絶対の出所 | 持たない |
| 関係 | 二つの空間の間に何があるか | 与件から一意に決まる | ここに宿る |
| 空間 | 名前・用途・意味を担う | 持たない。与件を参照して相対的に位置づく | 持たない |
与件が座標を与え、関係が実体を持ち、空間は名を持つ。
通り芯・レベル・敷地形状は測量と決めごとに由来する所与であり、設計の生成物ではない。だから座標を持ってよい。逆に言えば、書かれるのは与件であり、書かれないのは設計の生成物である。これで「形は書かない」と「敷地形状は書く」が矛盾しなくなる。
grid X 0 8400 16800 25200 # 与件 — 測量と構造計画が決める
level L1 0 h:4200 slab:1400 # 与件
polygon /site -2600,-7000 38000,-7000 38000,15600 2000,16800 # 与件 — 唯一、書かれる形
space /L1/lobby hall X1..X3 Y1..Y2 # 与件を参照する。座標は持たない
空間の位置は常に通り参照 (X2+450 の形) で書かれる。生の座標を空間に書く道は無い。
位置を持たないものは、内包だけを持つ
関係に宿らない物 — 空間に置かれる機器のような — は、型への参照と、どの空間に含まれるかだけで持つ。内包からは形が作れない。
内包は意味であって場所ではない。逆に内包から場所を導こうとすれば配置の仕組みが要る。そうなればこの記述は配置の道具になってしまう。内包が座を与えないと定めることが、その入口を閉じている。
柱はその中間にある。柱の位置はどこにも書かれず、通り芯の交点と床の交わりから現れる — 与件と与件の交わりだから、座を持つ。壁が境界から現れるのと同型の規則である (column)。
導出と生成は違う
導出のもう一段外側に生成がある。
- 導出 — 書かれた構成から一意に決まるもの。面積・線分・柱・段数・床と屋根。同じ原本からは常に同じものが出る
- 生成 — 導出された形をどう見せるか。線幅・色・記号・注記・縮尺
「同じ構成から複数の形が出る」ことは欠陥である。複数あってよいのは見た目であって、形ではない。この線引きは機械が縛っている — 導出の決定性。
段数を例に取る。原本に段数も踏面も勾配も書かれていない。領域と階高と「上る向き」の宣言だけから導かれる。
npx tsx src/cli.ts runs examples/complex/main.muro
B2→B1 ramp 車路 rise 4200mm return slope 1/9.2 going 38800mm /B2/ramp
B2→B1 stair 階段1 rise 4200mm return 24 risers of 175mm, tread 300mm going 6600mm /B2/st1
L1→L2 escalator エスカレーター rise 6600mm straight slope 1/1.5 going 9800mm /L1/es
L1→L2 stair 階段1 rise 6600mm return 37 risers of 178mm, tread 300mm going 10800mm /L1/st1
同じ大きさの階段室に、階高に応じて 37 段・24 段が入る。階高を変えれば段数が変わる。原本の側で数え直す作業は無い。
機械形式も導出を持たない
正準 JSON が持つのは合成の結果であって、導出の結果ではない。導出された既定境界は書かれた構成ではないので、正準 JSON には出ない。
だから check の「境界 1」と koyu json の "boundaries": [] は食い違って見える。前者は導出後の意味を、後者は書かれた原本を数えている。規則が仕様として明文であり、参照実装が API として提供される以上、消費者が意味を再実装する必要はない (正準 JSON)。