実体 — 壁・開口・柱・面
境界線分は芯線である。そこに厚みと z が乗って壁になり、開口が壁を割り、通り芯と床の交わりから柱が立ち、レベルの宣言から床と天井と屋根が現れる。どれも「置く操作」を持たない。
階高 — 壁と柱がどこまで立つか
境界が立つレベルは「a が領域を持てば a、でなければ b」の空間のレベルである。壁の下端はそのレベルの FL。
階高は次で決まる。
上のレベルがある : 階高 = 上のレベルの z − このレベルの z
上のレベルが無い : 階高 = その階の最大天井高 + ROOF_T (200mm)
上が無いときに屋根の頂点へ揃えるのは、屋根が同じ式で架かるからである。揃えなければ壁が屋根を突き抜けるか、下に隙間が空く。
天井高が一つも決まらなければ階高も決まらず、そのレベルには壁も柱も立たない。SUF01 が既に error として言う。
levelPitch(model, level) が単独でこれを答える。
壁の厚みと z 範囲
| 厚み | 上端 | |
|---|---|---|
壁 (type:wall) | t: があればその値、無ければ WALL_T (100mm) | FL + 階高 |
遮蔽しない境界 (air:1) | t: があればその値、ただし RAIL_T_MAX (80mm) で頭打ち。無ければ RAIL_T (60mm) | FL + 境界の h:、無ければ RAIL_H (1100mm) |
厚みは芯線に対して両側へ半分ずつ振り分ける。斜めの線分でも同じで、単位法線へ ±t/2 だけ振った四辺形になる(thicken)。
type:open の境界は線分を持つが材を持たない — FormBoundary.material が無い。
帯の位置 — 開口と seg
開口も seg も「境界線分上の区間」であり、同じ規則で置かれる。順序が意味を持つ。
- 境界の線分を取る(境界の
edge:は既に適用済み)。帯にもedge:があればさらに絞る - 線分が一つも無ければ置けない(OPN04 / SEG04)
- 線分が二つ以上あれば辺を選ばなければ置けない(OPN05 / SEG05)
- 帯の幅が線分の長さを超えれば置けない(OPN06 / SEG06)。等しい場合は置ける
- 通り参照(
at:X2+450)なら、斜めの線分には置けず、水平の線分は X 系・垂直の線分は Y 系でなければならず(OPN07 / SEG07)、はみ出せば置けない(OPN08 / SEG08) - 比率(
at:0.2、既定 0.5)なら、両端で中心が納まる範囲へクランプされる(診断は出ない)
中心の座標は、線分の始点から終点へのパラメータで取る — 軸平行でも斜めでも同じ一つの式である。したがって線分の向きが変われば同じ at: が別の場所を指す。線分は導出されたものも描かれた線のものも常に座標の昇順に向くので、a/b の書き順にも線の端点の書き順にも依らない。
開口の z 範囲
開口の頭はまぐさ高に揃う。扉は床から立ち上がってまぐさ高に達し、それ以外の開口はまぐさ高から高さのぶん下がる。
door : z0 = FL ; z1 = FL + (h ?? OPENING_HEAD)
opening : z0 = FL + OPENING_HEAD − (h ?? OPENING_H) ; z1 = FL + OPENING_HEAD
OPENING_HEAD は 2000mm、OPENING_H は 1200mm。
窓台の高さは書かない。頭を揃えた結果として決まる。sill は運搬層なので core は見ない。window w:2600 h:1100 を FL 0 の階に書けば、z は 900 から 2000 になる。
{ kind: "window", w: 2600, z0: 900, z1: 2000, t: 150 }
建具の見付け厚 t は壁厚と同じである。
壁は、開口で割られた区間の列である
線分に載る開口を始点からの距離の順に並べ、開口の間には全高の区間を、開口の位置には腰壁(床から開口の下端まで)と垂れ壁(開口の上端から天端まで)を残す。長さか高さが SPAN_EPS 以下の区間は作らない。
examples/two-rooms.muro の間仕切り(t:120、door w:780 h:2000、階高 2600)は、実際にこう割れる。
panels:
(3600,0) → (3600,1860) z 0 … 2600 全高
(3600,1860) → (3600,2640) z 2000 … 2600 垂れ壁
(3600,2640) → (3600,4500) z 0 … 2600 全高
扉は床から立ち上がるので腰壁は出ない。窓なら腰壁と垂れ壁の二枚が出る。
「壁の黒帯を紙の色で塗り潰して穴に見せる」という操作は、この規則があれば存在しない。平面でも立体でも、壁は最初から穴の空いた区間の列である。
扉の開く先と軌跡
開く先は swing:a/b、書かれていなければ「a が領域を持てば a、でなければ b」である。
開く向きは、開く先の導出された形のうち開口に最も近い凸片の外接矩形の中心へ向かう成分で決める。割付ではなく形を読む — 描かれた線で切られた空間では、最も近い割付の中心が線の反対側に落ちうる。
吊元は次で決まる。
| 線分 | 吊元 |
|---|---|
| 水平 | hinge:E で東端、でなければ西端 |
| 垂直 | hinge:N で北端、でなければ南端 |
| 斜め | 始端側に固定。hinge の N/E/S/W は軸の言葉なので斜めには当たらない |
軌跡は吊元を中心とする半径 = 開口の幅の 1/4 円で、葉の先端(吊元から開く側へ幅のぶん)から開口の反対の側柱(吊元から線分に沿って幅のぶん)へ回る。掃く向きは、この二点と吊元の外積の符号が決める。
swing: { into: "/L1/b", hinge: {...}, leaf: {...}, jamb: {...}, ccw: false }
style:sliding / style:auto の開口は軌跡を持たない — 吊元の側へ引き込まれる。FormOpening.sliding が立つ。
柱
柱の位置はどこにも書かれない。通り芯の交点と床の交わりから現れる。
母集団の床は、そのレベルにあり、exterior でも void でもなく、領域を持ち、空しか支えない半屋外ではない空間である。最後の条件は、屋上庭園やテラスのように半屋外で上に床も無い空間を外す — 柱が持ち上げるものを持たないからである。
宣言が通りを名指していればその通りだけを、していなければすべての通りを見る。走査は X が外側、Y が内側。交点が床のいずれかの凸片の内側(辺の上も POINT_EPS の幅で内側に数える)にあれば、そこに柱が立つ。
同じ交点に二本は立たない — 先に書かれた宣言が勝つ。だから柱の宣言順は意味であり、正準 JSON も並べ替えない。
柱の z 範囲は、そのレベルの FL から FL + 階高までである。
床・天井・屋根
母集団はレベルを z の昇順に、その中で空間を宣言順に、一空間の中で床 → 天井 → 屋根の順に走査する。輪郭はすべて導出された凸片である。
| 面 | 生成の条件 | z 範囲 |
|---|---|---|
| 床 | void でも exterior でもなく、レベルに slab がある | FL − slab … FL |
| 天井 | ceiling:0 でなく、void・exterior・半屋外・縦動線のいずれでもなく、天井高が決まる | FL + h − CEILING_T … FL + h |
| 屋根 | exterior でも半屋外でもない。上に空間が重なっていない範囲だけ | 頂点 − 厚さ … 頂点 |
床の不在は屋根の不在ではない — 吹抜けにも屋根は架かる。上に何も無い吹抜けは、天窓で塞がれた竪穴か、空に開いた中庭かのどちらかであり、後者は半屋外として導出される。逆に覆っている側には吹抜けも半屋外も数える。覆いは直上のレベルだけでなく上のすべてのレベルから取り、導出された形で引く。割付で引くと、上階を斜めに切った範囲まで「覆われている」と数えてしまい、その真下に屋根が架からない。
屋根の頂点と厚さは上のレベルの有無で式が切り替わる。
上のレベルがある : 頂点 = 上のレベルの z ; 厚さ = 上のレベルの slab ?? ROOF_T
上のレベルが無い : 頂点 = FL + h + ROOF_T ; 厚さ = ROOF_T
上のレベルがあるときは天井高を読まない。したがって天井高が決まらなくても屋根は生成される。上が無く天井高も決まらなければ形は痩せるが、その状態は SUF01 が error として塞いでいる。
引いた残りの面積が AREA_EPS 以下のタイルは屋根にしない。
基壇の上に塔屋が載る建物では、この規則がそのまま基壇屋上として現れる。書いていない。