# 作業：寸法つきの図面から、ファミレスの店の形のデータを起こす

## 目的
店から寸法つきの図面が届いたとき、店の形のデータをどこまで自動で起こせるかを試す。
人の手直しや店の人への質問なしで、図面と標準の家具の大きさだけから起こす。
前回は寸法のない手描きの見取り図で試し、縮尺が読めないことが一番の問題だった。今回は寸法がある。

## 使ってよいもの（このフォルダの中だけ）
- `drawing.png`：ファミレスの平面図。寸法は mm。上・左・右・下の辺に寸法線がある。点線は通り芯。家具（天板・椅子・ソファ）は縮尺どおりに描かれている
- `example_p1_efficient_corner.json`：別の店の店の形のデータ。書き方の見本。中身はこの店とは関係ない
- `evaluate_layout.py`：起こした店の形を、決まり・ロボットの届き方の計算で確かめる道具。`python3 evaluate_layout.py <JSON> <出力フォルダ>`
- 形の解釈を確かめるために `/home/claude/p2m-site/tools/sim_layouts/famires_v3.py` の関数（fp・lsofa_sides・t2_sides・table_sides・check_rules・check_outline など）は読んでよい（書き換えない）

## 見てはいけないもの（比べる相手なので、見ると試しにならない）
- `/home/claude/p2m-site/public/sim/layouts/` と `/home/claude/p2m-site/public/sim/layouts/unity/` の p0 で始まるファイル
- `/home/claude/p2m-site/tools/sim_layouts/` の `layout_v11.json`・`famires_p0.py`・`README.md`
- `/home/claude/blind/`・`/home/claude/blind3/`・`/home/claude/drawn2/` の中のもの
- `/mnt/user-data/` の中のもの

## 起こし方の前提
- 入力は3つだけ：(1) この図面、(2) 標準の家具の大きさ（下の家具の種類）、(3) 図面から読めるキッチンまわりの点
- 寸法は図面の数字を正とする。まず数字から画素あたりの mm を決め、縦と横で縮尺が違わないかを確かめて記録する
- 卓の位置・大きさ・席数は、図面に描かれたとおりに読む（椅子の数で席数を決める）。家具の種類に合わない形は、近い種類で置き、元の形と大きさ・置いた種類・ずれを記録する
- 図面に描かれていないことは、ふつうの形で仮に置き、仮に置いたことを記録する。特に：
  - ロボットが料理を受け取る所（dish_up）：図面の「受け渡し口」を使う。複数あれば、ロボットが客席へ出やすい方を1つ目にし、理由を記録する
  - ロボットの待機場所：受け渡し口の近くで、ロボットの道をふさがない所
  - ドリンクバー：図面にあれば rooms に kind="drink" で入れる
- 決まりの違反が出たら、図面の意図からなるべく離れない最小の動かし方で直してよい。直した所はすべて記録する
- 図面にある通路の幅（卓と卓、卓と壁の間）は、図面から読んだ値を何か所か記録する（ロボットが通れるかに効くため）

## データの形（famires-layout/0.3 の layout 部分）
単位はm。原点は店の外形（outer）の左下の角。x は右、y は奥（上）。rect は [x0, y0, x1, y1]。
- `name`・`style`（"効率重視" か "ゆったり"）
- `outer`：{w, d} 店をすっぽり囲む四角
- `outline`：建物が四角でないとき、輪郭の点の並び（縦と横の辺だけ）。使うなら、輪郭の外を `rooms` に kind="outside" の部屋として入れる（両方が同じ所を表していることを確かめる決まりがある）
- `entrance`：{side: bottom/top/left/right, a0, a1} 入口がその辺のどこからどこまでか。outline を使う店では、入口がある辺の位置に注意（check_rules と entrance_zone を読むこと）
- `rooms`：{label, rect, kind}。kind は back（厨房側など客が入らない）、guest（トイレ・レジ・待合）、drink（ドリンクバー）、outside（建物の外）。レジは guest の「レジ」と back の「レジ内」の2つ
- `walls`：{label, rect} 壁・仕切り・柱・カウンターの台など、通れない物
- `doors`：店員の出入り口 {label, rect, kind:"staff", door: true/false}
- `toilet_doors`：トイレの入口 [x0,y0,x1,y1] の並び
- `dish_up`：受け渡し口 [{label, rect}]（1つ目を使う。道具はその下の辺の前を出発点にするので、向きに注意。prepare を読むこと）
- `robot_standby`：{label, rect, slots} ロボットの待機・充電の場所。1台あたり0.8m×0.8m以上
- `tables`：{type, x, y, w, h, seats, id, …}。type ごとの追加：booth は axis（v/h）、t2 は side、booth6L は flip・mirror

## 家具の種類（標準の大きさ。図面に描かれた大きさが違えば、図面を正として w・h を変えてよい）
- booth：ボックス席。向かい合うベンチ2つと間のテーブル。4人は1.2m×1.85m、6人は1.8m×1.85m。axis v はベンチが上下（座る側が左右）、h はベンチが左右
- t2：2人席0.8m×1.4m。壁側がベンチ、通路側が椅子
- booth6L：L字ソファの6人席
- t4：4人の角テーブル（外形1.2m四方）。椅子は2脚ずつ向かい合わせ
- r4：4人の丸テーブル（外形1.1m四方）
- long6：6人の長テーブル（外形3.2m×1.94m）
- 上にない形（斜めに置いた卓・半円のブース・カウンター席など）は、近い種類で置くか、置けなければ通れない物（walls）として置いて席は数えない。どちらにしたかを記録する

## 決まり（evaluate_layout.py が確かめるもの）
- ロボット（BellaBot）が通れる幅0.8m、ふだん走らせる幅1.0m、人が通れる幅0.5m
- 入口から1.5m、受け渡し口の前1.2m、トイレの入口の前1.2mには何も置かない
- トイレから1m以内に席を置くなら、席とトイレの入口の間に壁
- レジは2.5m以上。会計に立つ点・並ぶ点はロボットの道から0.75m以上
- 待機場所の各台が、ほかの台が止まったままで受け渡し口の前に出られること

## 出すもの（`/home/claude/blind3/out/` に）
1. `auto_v0.json` と `check_v0/`：図面を読んで最初に起こしたもの（直す前）
2. `auto_final.json` と `check_final/`：決まりの違反を直したもの（違反0）
3. `notes.md`（日本語）：
   - 縮尺の決め方（縦横の mm/画素、全体の寸法が合っているか）
   - 図面から読めたこと（卓の数・種類・席数、部屋、入口、受け渡し口、洗い場、トイレ）
   - 図面から読んだ通路の幅（何か所か）
   - 家具の種類に合わなかった形（元の形・置いた種類・ずれ）
   - 図面に描かれておらず、仮に置いたこと
   - 決まりの違反と、どう直したか（v0 → final）。日本のファミレス向けの決まりと合わなかった所
   - 店の人に聞けば確かになること（質問の形で）
