# 作業：手描きの見取り図から、ファミレスの店の形のデータを起こす

## 目的
店の人から図面が届いたとき、店の形のデータをどこまで自動で起こせるかを試す。
人の手直しや店の人への質問なしで、図面と標準の家具の大きさだけから起こす。

## 使ってよいもの（このフォルダの中だけ）
- `sketch.jpg`：昔働いていたファミレスを記憶から手で描いた見取り図。寸法は書かれていない
- `example_p1_efficient_corner.json`：別の店（③）の店の形のデータ。書き方の見本。中身（卓の並び・寸法）はこの店とは関係ない
- `evaluate_layout.py`：起こした店の形を、サイトと同じ決まり・同じ計算で確かめる道具。`python3 evaluate_layout.py <JSON> <出力フォルダ>`。決まりの違反と、卓ごとのロボットの届き方、図（plan.png）を出す
- 形の解釈を確かめるために `/home/claude/p2m-site/tools/sim_layouts/famires_v3.py` の関数（fp・lsofa_sides・t2_sides・table_sides・check_rules など）は読んでよい

## 見てはいけないもの（比べる相手なので、見ると試しにならない）
- `/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`
- `/mnt/user-data/uploads/` の中の LOG360 の記事・ほかの画像（sketch.jpg と同じ写真以外）
- そのほか、この店を以前に起こしたもの

## 起こし方の前提
- 入力は3つだけ：(1) この図面、(2) 標準の家具の大きさ（下の家具の種類）、(3) 図面から読めるキッチンまわりの点（受け渡し口・店員の出入り口・洗い場）
- 寸法がないので、縮尺は自分で決める。標準の家具の大きさ（4人のボックス席は1.2m×1.85mなど）を手がかりにする。決め方を記録する
- 図面に描かれていないことは、ファミレスとしてふつうの形で仮に置き、仮に置いたことを記録する（例：受け渡し口の位置、ロボットの待機場所、扉の有無）
- 卓の数・席数は図面に書かれた数字のとおりにする。図面の形と家具の種類が合わないときは、近い種類を選び、そのことを記録する
- 決まりの違反が出たら、図面の意図からなるべく離れない最小の動かし方で直してよい（これも自動の範囲）。直した所はすべて記録する

## データの形（famires-layout/0.3 の layout 部分）
単位はm。原点は店の外壁の内側の左下の角。x は右、y は奥（上）。rect は [x0, y0, x1, y1]。
- `name`・`style`（"効率重視" か "ゆったり"）
- `outer`：{w, d} 店の外形
- `outline`（なくてよい）：建物が四角でないとき、輪郭の点の並び（縦と横の辺だけ）。使うなら、輪郭の外を `rooms` に kind="outside" の部屋として入れる（両方が同じ所を表していることを確かめる決まりがある）
- `entrance`：{side: bottom/top/left/right, a0, a1} 入口がその辺のどこからどこまでか
- `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つ目を使う）
- `robot_standby`：{label, rect, slots} ロボットの待機・充電の場所。1台あたり0.8m×0.8m以上
- `tables`：{type, x, y, w, h, seats, id, …}。x, y は外形の左下。type ごとの追加：booth は axis（v/h）、t2 は side（壁がある側 bottom/top/left/right）、booth6L は flip・mirror（向き。famires_v3.py の lsofa_sides を読むこと）
- `start` は道具が受け渡し口から自動で決めるので書かなくてよい

## 家具の種類（標準の大きさ）
- 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四方・天板の直径0.8m）
- long6：6人の長テーブル（外形3.2m×1.94m、天板3.2m×0.7m、上下にスツール3つずつ）
- 上にない形（カウンター席・8人席など）は、近い種類で置くか、置けなければ置かずに記録する

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

## 出すもの（`/home/claude/blind/out/` に）
1. `auto_v0.json`：図面を読んで最初に起こしたもの（決まりで直す前）と、その確かめの結果 `check_v0/`
2. `auto_final.json`：決まりの違反を直したもの（違反0）と、その確かめの結果 `check_final/`
3. `notes.md`：
   - 縮尺の決め方
   - 図面から読めたこと（卓の数・席数・部屋・入口など）
   - 図面に描かれておらず、仮に置いたこと
   - 決まりの違反と、どう直したか（v0 → final）
   - 図面と家具の種類が合わなかった所
   - 店の人に聞けば確かになること（質問の形で）
