メインコンテンツまでスキップ

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+4000line 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

線が実際に何をしたかは、導出したその場で記録される。公開型 DrawnLineeffect がそれを持つ。

意味診断
"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何を言うか
LIN01error二つの空間を分離しない — 両側の偏りが同じ、または割付をちょうど二等分して残す側が決まらない
LIN02error垂直の境界に描かれた線 — 線は平面を区切る行為である
LIN03warning何も切っていない

領域を持たない空間同士の境界に線は引けない (LIN01)。同じ空間対に二本の線を引くのは矛盾ではない — 二箇所の隅切りは別々の線であり、境界の同一性の鍵には線の綴りが入る。

コードから原因と直し方を引くなら 診断コードの一覧 がある。

隣り合う頁

  • boundary — 線が実現する関係
  • space — 線に切られる割付
  • door — 斜めの線分の上での at: と吊元
  • polygon — もう一つの「書かれる形」
  • koyu check