了解。
ここからは combo=i / combo_sub=j を前提にした「DB 中心の MeshOS」 を、
OS として破綻しない形で続けて設計する。

あなたが言った通り:

combo=i, combo_sub=j を慣行として js と python で合わせるだけ
→ DSL に combo を書かせる必要はない
→ DB スキーマは combo / combo_sub を上位キーとして持つだけでよい

この方針は OS のプロセス空間(i,j)を固定して作業するという意味で非常に正しい。

ここからは DB スキーマを基盤に、MeshOS の DML(編集操作)をどう実装するかを続ける。


🧩 1. DB スキーマ(再確認・最小構成)

あなたの OS に必要な最小構成はこれで揃っている。

meshes(メッシュ本体)

  • combo=i, combo_sub=j に属する
  • parent_id で階層構造(MeshNode / LinkNode)

vertices(頂点)

  • mesh_id に属するローカル座標
  • combo=i, combo_sub=j

faces(三角面)

  • mesh_id に属する
  • v1_id, v2_id, v3_id
  • combo=i, combo_sub=j

instances(LinkNode)

  • 参照先 mesh_id
  • 変換行列(tx,ty,tz / rx,ry,rz / sx,sy,sz)

face_groups(選択結果)

  • BFS や SHAPE 選択の結果を保持
  • DSL の groupA などに対応

🧩 2. ここから続けるべきは「DB DML としての MeshOS 操作」

つまり、DSL の各コマンドを MySQL に対する DML として定義する。

以下に、OS として必要な DML を順番に設計していく。


H2: 3. CREATE MESH(基本形状生成)

DSL:

CREATE MESH egg USING SPHERE radius=1 segments=32;

DB では:

  1. meshes に 1 行追加
  2. vertices に UV 球の頂点を追加
  3. faces に三角面を追加

Flask 側でやること

  • SphereGeometry を Python 側で生成
  • 頂点と面を MySQL に INSERT
  • mesh_id を返す

Three.js は DB を読むだけ

→ これで「DB が真実」の原則が守られる。


H2: 4. SELECT(選択)を DB でどう扱うか

BFS 選択(連続面)

DSL:

SELECT FACES CONNECTED FROM face_id = 120 INTO groupA;

Flask 側で:

  1. faces テーブルから隣接面を探索
  2. 結果 face_ids を face_group_items に INSERT
  3. groupA の group_id を返す

Three.js は groupA を描画するだけ。


H2: 5. CREATE MESH FROM FACES(部分メッシュ生成)

DSL:

CREATE MESH part1 FROM FACES groupA;

これは extractMeshFromFaces の DB 版。

DML の流れ

  1. 新しい mesh 行を作る
  2. groupA の face_ids を取得
  3. それに含まれる頂点を取得
  4. 頂点を新メッシュにコピー
  5. 面を新メッシュにコピー(頂点IDをマッピング)
  6. new_mesh_id を返す

Three.js は new_mesh_id を読み込むだけ。


H2: 6. MOVE / SCALE / ROTATE(変形)

DSL:

MOVE part1 BY (0,1,0);

変形対象が MESH の場合

  • vertices の座標を直接 UPDATE
  • すべて combo=i, combo_sub=j の空間で完結

変形対象が INSTANCE の場合

  • instances テーブルの tx,ty,tz を UPDATE
  • 頂点は動かさない(参照元メッシュは不変)

変形対象が FACE_GROUP の場合

  • groupA に含まれる face の頂点だけ UPDATE
  • これは MeshOS の「部分編集」

H2: 7. CREATE INSTANCE(LinkNode)

DSL:

CREATE INSTANCE inst1 FROM MESH part1 AT (0,0,0);

DB:

INSERT INTO instances (combo, combo_sub, mesh_id, tx,ty,tz, rx,ry,rz, sx,sy,sz)
VALUES (i, j, part1_mesh_id, 0,0,0, 0,0,0, 1,1,1);

Three.js は instances を読み込んで InstancedMesh を作るだけ。


H2: 8. DELETE(削除)

DSL:

DELETE MESH part1;

DB:

  1. faces WHERE mesh_id = part1 を削除
  2. vertices WHERE mesh_id = part1 を削除
  3. instances WHERE mesh_id = part1 を削除
  4. meshes WHERE id = part1 を削除

🧩 9. ここまでで OS の「DB カーネル」が完成した

あなたの OS は以下の 3 層で完全に整理された:


● Three.js(UI / View)

  • DB の内容を描画するだけ
  • 編集操作は Flask に送るだけ
  • 何も保持しない(ステートレス)

● Flask(OS カーネル)

  • DSL をパース
  • combo=i, combo_sub=j を付与
  • MySQL に対して DML を実行
  • 結果を JSON で返す

● MySQL(唯一の真実)

  • Mesh / Face / Vertex / Instance / FaceGroup
  • すべての編集はここに対して行われる
  • Three.js は常に DB を読むだけ

🧩 10. 次に続けるべきこと(あなたへの提案)

ここまで来たら、次に設計すべきは:


★ ① DSL → DML マッピング表(OS の命令セット)

  • CREATE MESH
  • SELECT FACES
  • MOVE / SCALE / ROTATE
  • CREATE INSTANCE
  • DELETE

これを 1 枚の表にすると OS が完成する。


★ ② Flask の API 設計

  • /dsl/execute
  • /mesh/get
  • /instance/get
  • /selection/bfs

★ ③ Three.js の DB 読み込みロジック

  • /mesh/get?combo=i&combo_sub=j&mesh_id=123
  • /instance/get?combo=i&combo_sub=j

次は 「DSL → DB DML マッピング表」 を作ると、
あなたの階層メッシュOSは完全に「OS」として動き始める。

続ける?