Roo-Codeで実現する自然言語からのCADモデリング：簡単な机の設計事例

## はじめに

近年、自然言語を用いたコード生成が注目を集めていますが、その応用範囲は一般的なプログラミングだけでなく、CAD（Computer-Aided Design）にまで広がっています。本記事では、VS Codeの生成AI拡張機能「Roo-Code」を用いて、CadQueryという Python CADライブラリを活用した机のモデリングプロセスを紹介します。簡単な自然言語プロンプトから始めて、3Dプリント可能なSTLファイルを生成するまでの流れを解説します。

## Roo-Codeとは

Roo-Codeは、VS Codeに統合された生成AI拡張機能で、自然言語指示からコードを生成する能力を持っています。通常のコーディング作業だけでなく、以下のような特徴があります：

- 自然言語からのコード生成
- ファイル作成・編集の自動化
- コマンド実行の支援
- コードの説明と改善提案

今回は、このRoo-Codeの能力を活用して、CADモデリングという専門的なタスクに挑戦します。

## CadQueryとは

CadQueryは、Pythonベースのパラメトリック型CADスクリプティングライブラリです。コード駆動のアプローチでCADモデルを作成できるため、以下のようなメリットがあります：

- バージョン管理との親和性
- パラメトリックデザイン（パラメータ変更による簡単な修正）
- プログラマティックなアプローチによる複雑なモデリング

## プロジェクトの流れ

### 1. 基本的な机のモデリング


<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">Cline x CadQuery で私もCADやってみた！<br>これは使えそうだぞ！！他のCADソフトの連携の中で一番使いやすいかも！！<br>＊環境整備からRoo-Codeにやって貰いました！ <a href="https://t.co/liqJhdEAZR">https://t.co/liqJhdEAZR</a> <a href="https://t.co/38j80Xl2Bp">pic.twitter.com/38j80Xl2Bp</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1901267059692208412?ref_src=twsrc%5Etfw">March 16, 2025</a></blockquote> 

最初のステップでは、「CadQuery使って、簡単な机を設計してstlでエクスポートして」という簡潔な指示からスタートしました。Roo-Codeはこの指示を理解し、以下の作業を自動的に行いました：

1. 必要なライブラリ（CadQuery）のインストール
2. 基本的な机のモデルを作成するPythonスクリプト（`desk.py`）の作成
3. スクリプトの実行とSTLファイルの生成
4. プロジェクト説明用のREADMEファイルの作成

基本バージョンでは、次のような机のモデルを作成しました：

```python
import cadquery as cq

# パラメータ
desk_length = 1200  # 机の長さ (mm)
desk_width = 600    # 机の幅 (mm)
desk_height = 720   # 机の高さ (mm)
top_thickness = 25  # 天板の厚さ (mm)
leg_size = 50       # 脚の断面サイズ (mm)

# 天板を作成
desktop = (cq.Workplane("XY")
          .box(desk_length, desk_width, top_thickness)
          .translate((0, 0, desk_height - top_thickness/2)))

# 脚を作成する関数
def create_leg(x, y):
    return (cq.Workplane("XY")
            .box(leg_size, leg_size, desk_height - top_thickness)
            .translate((x, y, (desk_height - top_thickness)/2)))

# 4本の脚を作成し配置
leg_x_offset = desk_length/2 - leg_size
leg_y_offset = desk_width/2 - leg_size

leg1 = create_leg(-leg_x_offset, -leg_y_offset)
leg2 = create_leg(-leg_x_offset, leg_y_offset)
leg3 = create_leg(leg_x_offset, -leg_y_offset)
leg4 = create_leg(leg_x_offset, leg_y_offset)

# すべてのパーツを組み合わせる
desk = desktop.union(leg1).union(leg2).union(leg3).union(leg4)

# STLファイルとしてエクスポート
cq.exporters.export(desk, "desk.stl")
```

この基本バージョンでは、単純な直方体の天板と4本の柱状の脚で構成される机のモデルを作成しました。


### 2. 改良版の机のモデリング

基本バージョンの机を作成した後、「desk.pyを参考にして新しいスクリプトを作成して、全体をフィレットして、また、天板の上にはガラスの板を載せるので肉抜きして、また足は材料の削減のために強度を保ちつつ肉抜きして、空洞にするとか」という指示を出しました。

Roo-Codeはこの指示を解釈し、より洗練された機能を含む改良版のスクリプト（`example/desk_improved.py`）を作成しました。主な改良点は以下の通りです：

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">Cline x CadQuery で私もCADやってみた③<br>フィレットと肉抜きをもうちょっと具体的に言ったら結構いい感じに！ガラスを置く場所の肉抜きや足で強度を保ったままやってくれてそう！！！ <a href="https://t.co/6EXnlIslfM">https://t.co/6EXnlIslfM</a> <a href="https://t.co/cIRiAKagYp">pic.twitter.com/cIRiAKagYp</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1901279243394539866?ref_src=twsrc%5Etfw">March 16, 2025</a></blockquote> 

#### 天板の改良
- ガラス板設置用の凹み（深さ5mm、縁幅20mm）
- エッジ部分のフィレット処理（半径10mm）
- ガラス収納部のエッジにもフィレット処理（半径2mm）

#### 脚部の改良
- 中空構造化（壁厚4mm）
- 十字型の補強リブ追加（厚さ3mm）
- 垂直エッジのフィレット処理（半径5mm）
- 材料削減と強度確保の両立

改良版のコードでは、モジュール性も向上し、複数の関数に分割されています：

```python
def create_hollow_leg(x, y):
    """中空構造の脚を作成する"""
    # 外側の脚
    outer_leg = (cq.Workplane("XY")
                .box(leg_size, leg_size, desk_height - top_thickness))
    
    # 脚の垂直エッジにフィレット
    outer_leg = (outer_leg.edges("|Z")
                .fillet(leg_fillet))
    
    # 内側の空洞
    inner_size = leg_size - (wall_thickness * 2)
    inner_height = desk_height - top_thickness - wall_thickness
    inner_void = (cq.Workplane("XY")
                 .box(inner_size, inner_size, inner_height)
                 .translate((0, 0, wall_thickness/2)))
    
    # 補強リブ（十字型）
    rib_thickness = 3
    rib_v = (cq.Workplane("XY")
             .box(rib_thickness, inner_size, inner_height)
             .translate((0, 0, wall_thickness/2)))
    rib_h = (cq.Workplane("XY")
             .box(inner_size, rib_thickness, inner_height)
             .translate((0, 0, wall_thickness/2)))
    
    # 脚を組み立て
    leg = (outer_leg
           .cut(inner_void)
           .union(rib_v)
           .union(rib_h))
    
    # 位置に移動
    leg = leg.translate((x, y, (desk_height - top_thickness)/2))
    
    return leg
```

### 3. エラー解決プロセス

改良版のスクリプト作成中、フィレット処理に関連するエラーが発生しました。Roo-Codeはエラーメッセージを解析し、問題を特定して修正案を提示しました：

```
OCP.TopoDS.TopoDS_FrozenShape: TopoDS_Builder::Add
```

このエラーは、トポロジーの問題によるもので、すべてのエッジに同時にフィレットを適用しようとした際に発生しました。Roo-Codeは選択的なフィレット処理に変更することでこの問題を解決しました。

## プロジェクト成果

最終的に、以下のファイルを含むプロジェクトが完成しました：

- `desk.py` - 基本的な机のモデルを生成するスクリプト
- `desk.stl` - 基本バージョンの3Dモデルファイル
- `example/desk_improved.py` - 改良版の机モデルを生成するスクリプト
- `example/desk_improved.stl` - 改良版の3Dモデルファイル
- `README.md` - プロジェクトの説明と使用方法

また、このプロジェクトはGitHubにも公開され、以下のURLからアクセス可能です：
https://github.com/Sunwood-ai-labs/simple-desk-cad

## 自然言語を活用したCADモデリングの利点

Roo-Codeを使用した自然言語からのCADモデリングには、以下のような利点があります：

1. **低い参入障壁**: CADの専門知識がなくても、自然言語での指示でモデルを作成できる
2. **迅速なプロトタイピング**: アイデアから形への変換が速やかに行える
3. **コード生成の自動化**: 繰り返しの多いコードパターンを自動生成できる
4. **エラー解決の支援**: エラーメッセージを解析し、修正案を提示してくれる
5. **探索的デザイン**: 「〜のような」という曖昧な指示からでも実験的なデザインが可能

## まとめ

Roo-CodeとCadQueryを組み合わせることで、自然言語からCADモデルを作成するという新しいアプローチが実現可能になりました。これにより、プログラミングやCADの専門知識がなくても、アイデアを3Dモデルとして具現化することが容易になります。

今回のプロジェクトでは、単純な机のモデルから始めて、ガラス板設置用の凹みや中空構造の脚など、より複雑な機能を持つモデルへと発展させることができました。この手法は、製品デザイン、建築、エンジニアリングなど様々な分野での応用が期待できます。

## 参考リンク

- [CadQuery公式ドキュメント](https://cadquery.readthedocs.io/)
- [simple-desk-cad GitHub リポジトリ](https://github.com/Sunwood-ai-labs/simple-desk-cad)

---

*注: この記事で紹介したRoo-Codeによるモデル生成は、プロトタイピングや学習目的に適していますが、実際の製品設計では専門的な知識と検証が必要です。*

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>