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

over / drop — 上書きと削除

over は既にあるものの属性を差し替え、drop は既にあるものを消す。over の直下に字下げして書く + / - / = は、開口や area のような集合を編集する。

三つとも muro 1.0 の語である。koyu 0.5 以前を宣言したファイルに書けば checkVER04 (error) で止める。

対象の種別は、行の形で読む

over にも drop にも「これは空間だ」と言う語は無い。行の形が種別を決める。

書き方対象
over /path …空間。その名の空間が無ければゾーン
over /pathA /pathB …境界 (二つの空間パスを結ぶ関係)
over level <名> …レベル
over asset <名> …建具アセット
drop /path空間。その名の空間が無ければゾーン
drop /pathA /pathB境界
drop column <名>柱の宣言

パスは先頭が / かどうかで見分けられ、levelasset は行頭の語で見分けられる。パスが三つ以上並べばエラーである。

✖ x.muro:line 1: Too many paths on the over target: /L1/a /L1/b /out
✖ x.muro:line 1: over takes the form over /path … / over /pathA /pathB … / over level <name> … / over asset <name> …

over — 属性を差し替える

over /L1/a h:2400 spec:実測          # 空間
over /site area:1097.80              # ゾーン (同名の空間が無いので)
over /L1/a /L1/b t:150 type:open     # 境界
over level L3 h:2600                 # レベル
over asset SD1 w:900 style:hinged    # アセット

over は定義ではない。対象が既に合成されていなければエラーになる。

✖ e1.muro:line 1: No such target for over: /L1/nowhere (place it after the layer that defines it)

存在しないものに意見だけを足すのは、たいてい綴り違いか、層の順序の思い違いである。

over は自由属性だけでなく、parse が持ち上げる典型化された値にも届く — 境界の type t air edge、レベルの h slab underground はいずれも上書きできる。

レベルに書けるのは三語だけである。

✖ x.muro:line 1: Only h / slab / underground may be overridden on a level: spec

同じ空間対に境界が複数あるとき

edge: で辺を限定した境界を同じ空間対に複数書くことがある。over /L1/a /L1/b t:250その対の境界すべてに届く。一枚だけを狙う言葉は無い。

既定の壁は上書きできない

接する空間の間には、宣言が無くても wall の境界が導かれる。この既定の境界はすべての層を合成し終えてから作られるので、合成の途中である over からは見えない。

✖ o.muro:line 1: No such boundary for over: /L1/a | /L1/b

厚みや仕様を与えたい壁は、既定に頼らず boundary として宣言する。

強度

どの層の over が勝つかは、層の並びが決める。後の層ほど強い。同じ層が同じ属性に二度意見を持てばエラーである。規則は 合成の六規則 にある。

集合の編集 — + / - / =

同じ座に複数の層が意見を持ちうるもの — 開口・segarea — は、暗黙にマージされない。over の直下に字下げして、明示された編集を書く。

over /L1/a /L1/b
  - door D2                              # 削除
  = door D1 w:1000                       # 置換
  + window w:600 h:1200 at:0.9 name:W1   # 追加

over の直下に置けるのはこの三つだけである。

✖ x.muro:line 2: Only + (add) / - (remove) / = (replace) may sit directly under over: door

対象によって、編集できる集合が違う。

over の対象編集できるもの
境界door / window / seg
空間area
ゾーン・レベル・アセット無い
✖ x.muro:line 2: over on a space edits area: door

同一性は「容れ物 + その中で一意な名」

-= は要素を名で指すname: を持たない要素は編集の対象にできない — 指す言葉が無いからである。

boundary /L1/a /L1/b t:120
  door w:900 name:D1     # 名がある — 後から編集できる
  door w:800 at:0.8      # 名が無い — 後から指せない

+ で足す要素には name: が要る。同じ容れ物の中で名が重複すればエラー、-= の指す名が一意でなければエラーである。

✖ e2.muro:line 2: A door added with + requires name: (it is the name later statements point to)
✖ x.muro:line 2: Duplicate door name: D1
✖ x.muro:line 2: No such door: D9
✖ x.muro:line 2: The door name D9 is not unique

= が差し替えるもの

=全置換ではない — 名は残り、書いた属性だけが差し替わる。寸法として届くのは w:h: の二つである。

over /L1/a /L1/b
  = door D1 w:1000        # 幅が 1000 になる

位置 (at:) や辺 (edge:) は = では動かない。書けば要素の属性としては残るが、開口はその場から移動しない。位置を変えたいときは消して書き直す。

over /L1/a /L1/b
  - door D1
  + door w:900 at:0.2 name:D1

drop — 消す

消えるのは、消すと書いたものだけである。

drop /L1/store        # 空間
drop /L1/a /L1/b      # 境界
drop column C1        # 柱の宣言

対象が無ければエラーになる。黙って何もしないということはない。

✖ x.muro:line 1: No such target for drop: /L1/nowhere
✖ x.muro:line 1: No such column: C9

drop が取れるのは空間・ゾーン・境界・柱の四つだけである。アセットとレベルは消せない。

✖ y.muro:line 1: drop takes the form drop /path / drop /pathA /pathB / drop column <name>

空間を消せば、その関係も消える

境界は二つの空間のにしか存在しない。だから空間が消えれば、その空間を端に持つ境界も一緒に消える。他の境界は無傷である。

境界を消しても、壁は戻ってくることがある

drop /L1/a /L1/b が消すのは宣言である。二つの空間が平面で接しているなら、合成の後に既定の wall が導かれ、そこに壁が立つ。消えるのは厚み・仕様・そしてその境界が持っていた開口である。

扉を含んだ壁を drop すると、扉の無い既定の壁が残る — 通れなくなる。

drop column は同名が複数なら拒む

柱の同一性も「名」である。同じ名の柱の宣言が二つあれば、どちらを消すのかが書かれていないので、drop黙って両方消さずに拒む

column 700 L1 x:X1,X2 name:C1
column 600 L1 x:X3 name:C1
drop column C1
✖ dropcol.muro:line 1: The column name C1 is not unique

名を分ければ通る。開口や seg の集合編集と同じ規律である。

上書きの跡は残らない

overdrop も、合成後のモデルにも正準JSONにも残らない。overh:2400 にした建物と、最初から h:2400 と書いた建物は、同じ正準JSONを与える。drop した空間は、最初から書かれていなかったのと区別がつかない。

正準形が答えるのは「同じ建物か」であって「どう書かれたか」ではない。

どの層が最終値を与えたかを知りたいときは、合成の途中を記録した出所を引く。

$ koyu layers main.muro --attrs
Layers (weakest first — later layers are stronger):
  0	main.muro
  1	plan.muro
  2	as-built.muro

Attribute provenance:
  boundary:/L1/a|/L1/b:t	← 2 as-built.muro
  space:/L1/a:h	← 2 as-built.muro
  space:/L1/a:spec	← 2 as-built.muro

関連

  • 合成の六規則 — 強度・定義と上書きの区別・決定性・出所
  • import — 層を読む一語と、層の並びの作られ方
  • boundary — 境界の宣言と開口
  • space — 空間の宣言と area
  • koyu layers — どの層が最終値を与えたかを印字する