了解。
ここからは 「DSL → DB DML マッピング表」 を OS として完成させる流れを続けるね。
あなたの前提(combo=i, combo_sub=j を js と python で共有)により、
DB は combo / combo_sub を上位キーとして持つだけでよく、
Flask は常に i, j を自動付与して DML を実行する

という OS 構造が確定した。

ここでは、
MeshOS の命令セット(DSL)を MySQL DML にマッピングする「OS カーネル表」
を完成させる。


🧩 MeshOS DSL → MySQL DML マッピング表(OS カーネル)

以下は Flask が DSL をパースした後に実行する DB 操作を
OS の命令セットとしてまとめたもの。

combo=i, combo_sub=j は Flask が自動付与する。


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

DSL

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

Flask の動作

  • Python 側で SphereGeometry を生成
  • 頂点と面を DB に INSERT

MySQL DML

INSERT INTO meshes (combo, combo_sub, name)
VALUES (:i, :j, 'egg');

SET @mesh_id = LAST_INSERT_ID();

頂点 INSERT(Python ループ)

INSERT INTO vertices (combo, combo_sub, mesh_id, x, y, z)
VALUES (:i, :j, @mesh_id, :x, :y, :z);

面 INSERT

INSERT INTO faces (combo, combo_sub, mesh_id, v1_id, v2_id, v3_id)
VALUES (:i, :j, @mesh_id, :v1, :v2, :v3);

H2: 2. SELECT(選択)

2.1 連続面(BFS)

DSL

SELECT FACES CONNECTED FROM face_id = 120 INTO groupA;

Flask の動作

  • faces テーブルから隣接面を BFS
  • 結果を face_groups に保存

MySQL DML

INSERT INTO face_groups (combo, combo_sub, name)
VALUES (:i, :j, 'groupA');

SET @group_id = LAST_INSERT_ID();
INSERT INTO face_group_items (group_id, face_id)
VALUES (@group_id, :face_id);

2.2 SHAPE 選択

DSL

SELECT FACES INSIDE SHAPE almond1 INTO groupB;

Flask の動作

  • SHAPE 定義を Python 側で評価
  • faces の重心が SHAPE 内か判定
  • 結果を face_group_items に保存

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

DSL

CREATE MESH part1 FROM FACES groupA;

Flask の動作

  • groupA の face_ids を取得
  • それに含まれる頂点を取得
  • 新しい mesh を作成
  • 頂点と面をコピー(ID マッピング)

MySQL DML

新メッシュ作成:

INSERT INTO meshes (combo, combo_sub, name)
VALUES (:i, :j, 'part1');

SET @new_mesh_id = LAST_INSERT_ID();

頂点コピー(Python ループ):

INSERT INTO vertices (combo, combo_sub, mesh_id, x, y, z)
VALUES (:i, :j, @new_mesh_id, :x, :y, :z);

面コピー:

INSERT INTO faces (combo, combo_sub, mesh_id, v1_id, v2_id, v3_id)
VALUES (:i, :j, @new_mesh_id, :new_v1, :new_v2, :new_v3);

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

4.1 MESH 全体の移動

DSL

MOVE part1 BY (0,1,0);

MySQL DML

UPDATE vertices
SET x = x + 0,
    y = y + 1,
    z = z + 0
WHERE combo = :i AND combo_sub = :j AND mesh_id = :mesh_id;

4.2 FACE_GROUP の移動

DSL

MOVE groupA BY (0,1,0);

MySQL DML

UPDATE vertices
SET x = x + 0,
    y = y + 1,
    z = z + 0
WHERE id IN (
    SELECT DISTINCT v1_id FROM faces WHERE id IN (SELECT face_id FROM face_group_items WHERE group_id=:groupA)
    UNION
    SELECT DISTINCT v2_id ...
    UNION
    SELECT DISTINCT v3_id ...
);

4.3 INSTANCE の移動

DSL

MOVE inst1 BY (0,1,0);

MySQL DML

UPDATE instances
SET ty = ty + 1
WHERE id = :instance_id AND combo = :i AND combo_sub = :j;

H2: 5. CREATE INSTANCE(LinkNode)

DSL

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

MySQL DML

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

H2: 6. DELETE(削除)

DSL

DELETE MESH part1;

MySQL DML

DELETE FROM faces WHERE combo=:i AND combo_sub=:j AND mesh_id=:mesh_id;
DELETE FROM vertices WHERE combo=:i AND combo_sub=:j AND mesh_id=:mesh_id;
DELETE FROM instances WHERE combo=:i AND combo_sub=:j AND mesh_id=:mesh_id;
DELETE FROM meshes WHERE combo=:i AND combo_sub=:j AND id=:mesh_id;

🧩 ここまでで「MeshOS の命令セット(DSL)→ DB DML」が完成した

つまり:

  • Three.js は DB を読むだけ
  • Flask は DSL をパースして DB に DML を実行
  • DB が唯一の真実
  • combo=i, combo_sub=j がプロジェクト空間
  • MeshOS が完全に DB 上で動く

という OS が成立した。


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

ここまで来たら、次は Flask の DSL 実行エンジンの内部構造を設計する。

具体的には:


★ ① DSL パーサ(SQL 風 DSL → AST)

  • CREATE
  • SELECT
  • MOVE
  • SCALE
  • ROTATE
  • DELETE
  • INSTANCE

を AST に変換する。


★ ② AST → DML 実行器(Executor)

  • AST ノードごとに DB DML を実行
  • combo=i, combo_sub=j を自動付与
  • 結果を JSON で返す

★ ③ Three.js の DB 読み込み API

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

次は DSL パーサ(AST 設計) に進める?
それとも Flask API 設計から行く?