line — 描かれた線
boundary /pathA /pathB …
line <始点> <終点>
line は 境界の直下に字下げ一段で書く。境界の実現を、隣接からの導出ではなく設計の行為として与える一行である。
koyu の位置はふつう「書かれない」— 壁は二つの空間が接する所に現れ、柱は通り芯の交点に現れる。だが所与の斜めは導出されない。隣地境界なりの隅切り、既存擁壁の折れ、斜線制限のセットバック — これらは設計者が引いた線そのものであって、他の何かから出てくるものではない。line はそのために在る。
一つの境界に線は一本である。
端点は通り語の対
boundary /L1/w04 /out t:300 spec:カーテンウォール
line X1,Y5+2000 X2,Y6
端点は <X通り>,<Y通り> の対で書く。どちらの通りにも +600 / -900 のオフセットを付けられる。生の座標も角度も書けない — 位置を定めるのは常に線であり、線の端点は通りである。X の通りを先に、Y の通りを後に書く。
両端が同じ点なら parse がその場で止める。
線は向きを持たない
同じ二点を結ぶ線は、どちらの端から書いても同じ線である。parse の出口で、端点は解決座標の (x, 次いで y) 昇順へ揃えられる。綴り (通り参照) も一緒に入れ替わるので、診断が引用する綴りは書いたとおりのまま順だけが入れ替わる。
line X1+3000,Y2 X1,Y2-3000
と書いても、モデルにも正準JSONにも X1,Y2-3000 X1+3000,Y2 の順で入る。
これは整形ではない。この正準の始端が、線に載る開口の at: の起点である。揃えなければ、正準JSONがバイト同一のまま扉が別の位置に出ることになる — 実測で line X1,Y1+2000 X2,Y1+4000 と line X2,Y1+4000 X1,Y1+2000 が同じハッシュのまま扉を (1500, 2500) と (4500, 3500) に置いていた。
斜めの線分の上では、開口の at: は 0..1 の比率でしか書けない。通り参照は斜めの上の位置を一意に定めないからである。吊元も始端側に固定される — hinge の N/E/S/W は軸の言葉なので斜めには当たらない。そして edge: は効かない — 線がそのまま線分だからである。
何を切るか
線は無限直線ではない。線に沿っては限られた区間を、線を横切っては相手を含む範囲を切る。線の向きは |Δy| ≥ |Δx| なら縦向きで、縦向きなら「沿う」軸が y、「横切る」軸が x になる (ちょうど 45 度と退化した点も縦向きに数える)。
| 場合 | 沿う軸 | 横切る軸 |
|---|---|---|
| 二空間を分け直す (両側が領域を持つ) | 二つの領域の外接矩形の積 | 二つの外接矩形の和 |
| 外皮を切る (片側が領域を持たない) | 線分自身の区間 | 領域を持つ側の外接矩形全体 |
この非対称が要である。無限直線として扱えば離れた翼を巻き込んで室が消え、線分の外接矩形として扱えば軸平行の線で退化して何も切れない。
切り分けは窓の中の割付を合併してから両側へ分け直すので、二空間の場合は合計面積が保存される — 一方が失う三角形をもう一方が得る。外皮を切る場合は領域を持つ側だけが減り、相手は面積を得ない。
残す側は書かない。窓に触れる凸片を丸ごと測り、線の左右の面積を比べて偏った側を残す。外皮を切る場合は領域を持つ側の偏りがそのまま残す側になる。二空間の場合は両側の偏りを取り、片方だけが 0 なら他方の反対を当てる。
koyu 1.0
unit mm
grid X 0 6000
grid Y 0 6000
level L1 0 h:2700 slab:200
space /L1/a room X1..X2 Y1..Y2 name:隅切りの室
space /out exterior name:外部
boundary /L1/a /out t:150 spec:RC
line X1,Y2-3000 X1+3000,Y2
6000 × 6000 の割付から北西の三角形 (3000 × 3000 ÷ 2 = 4.5 m2) が落ちる。
/L1/a 隅切りの室 room 31.50 m2
Subtotal 31.50 m2
Total 31.50 m2 (indoor floor area)
面積も、壁の位置も、屋根の輪郭も、この切られた形から出る。形を読む入口は一つであり、書かれた割付ではなく導出された凸片がそれである。
切り分けの帰結 — effect
線が実際に何をしたかは、導出したその場で記録される。公開型 DrawnLine の effect がそれを持つ。
| 値 | 意味 | 診断 |
|---|---|---|
"cut" | 実際に形を切った | — |
"nothing" | 何も切らなかった — 既定の隣接線と同じか、線の及ぶ範囲に割付が無い | LIN03 (warning) |
"undetermined" | 残す側が決まらない — 両側の偏りが同じ、または割付をちょうど二等分した | LIN01 (error) |
後から計算し直さないのは、そのときには既に切られた形が相手になっていて、母集団が食い違うからである。effect は導出の帰結であって書かれた構成ではないので、正準JSONには出ない。
既定の隣接線をなぞった線は何も切らない。
koyu 1.0
unit mm
grid X 0 6000
grid Y 0 6000
level L1 0 h:2700 slab:200
space /L1/a room X1..X2 Y1..Y2 name:室
space /out exterior name:外部
boundary /L1/a /out t:150
line X1,Y1 X2,Y1
⚠ Line X1,Y1..X2,Y1 cuts nothing (it is the same as the default adjacency line, or falls outside the allocation)
正方形を対角に割る線は、左右の面積が等しいので残す側が決まらない。
koyu 1.0
unit mm
grid X 0 6000
grid Y 0 6000
level L1 0 h:2700 slab:200
space /L1/a room X1..X2 Y1..Y2 name:室
space /out exterior name:外部
boundary /L1/a /out t:150
line X1,Y1 X2,Y2
✖ Line X1,Y1..X2,Y2 bisects the allocation exactly, so which side to keep is undetermined
直し方は「どちらを残したいのかが分かるように線を引き直す」である。既定値を選んで黙って進むことはしない。
一本の線は複数の境界に共有される
貫通通路の壁は、その前を通る区画の数だけ境界を持つ。各境界が線の全長を実現すると、平面には同じ壁が何本も重なる。
そうならないよう、線は両空間の凸片の辺で切られ、左右がちょうど a と b になっている区間だけが残る。判定は a と b について対称である。だから同じ綴りの line を複数の境界に書いてよく、それぞれが自分の受け持つ区間だけを実現する。
切り分けの順序
線の切り分けは parse の出口で一度だけ、正準の境界順に効く。冪等ではない — 先に効いた線が縮めた領域が、後の線の窓を縮める。
順序は宣言順ではない。正準JSONは境界の宣言順を捨てるので、宣言順に切ると同じ正準形から違う面積が出てしまう。並びの規則は正準JSONと同じで、between の辞書順、同じ between は直列化順である。合成で境界が挟まっても並びは動かない。
診断
| コード | severity | 何を言うか |
|---|---|---|
| LIN01 | error | 二つの空間を分離しない — 両側の偏りが同じ、または割付をちょうど二等分して残す側が決まらない |
| LIN02 | error | 垂直の境界に描かれた線 — 線は平面を区切る行為である |
| LIN03 | warning | 何も切っていない |
領域を持たない空間同士の境界に線は引けない (LIN01)。同じ空間対に二本の線を引くのは矛盾ではない — 二箇所の隅切りは別々の線であり、境界の同一性の鍵には線の綴りが入る。
コードから原因と直し方を引くなら 診断コードの一覧 がある。
隣り合う頁
- boundary — 線が実現する関係
- space — 線に切られる割付
- door — 斜めの線分の上での
at:と吊元 - polygon — もう一つの「書かれる形」
- koyu check