「CAD as a Language」：コードと生成AIが拓く新たな設計アプローチ

## はじめに

本記事は「CAD as a Language」という新しいコンセプトを、はじめて定義・提示するものです。従来のCAD（Computer Aided Design）は、主にGUIを用いた直感的な操作でモデルを構築する手法が一般的でした。しかしここでは、CADを「プログラミング言語のように扱う」ことで、設計を再定義し、新しいものづくりの可能性を提示します。そして、その実践的な例として生成AI（Generative AI）を活用し、CADスクリプトを自然言語から動的に生成・編集する手法を紹介します。

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">生成AIでCAD制御させてみた！<br>けっこう良いのでは！！！ <a href="https://t.co/pYzpP8vosR">pic.twitter.com/pYzpP8vosR</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1869688747199184899?ref_src=twsrc%5Etfw">December 19, 2024</a></blockquote>

## CADを「言語」としてとらえる意義

「CAD as a Language」とは、CADモデルをコード（プログラム）として記述し、扱うアプローチです。つまり、3Dオブジェクトや建築物、工業製品などを、関数やパラメータ、ループ処理で定義する「言語としてのCAD」です。これにより、設計の段階から以下のような恩恵が得られます。

1. パラメトリック性・再現性：  
   すべての寸法や形状特性がコードで表現できるため、数値を変更するだけで様々なバリエーションを即時に再生成可能です。

2. バージョン管理・ナレッジ共有：  
   テキストとしてのコードは、Gitなどのバージョン管理システムで容易に履歴追跡・共有ができ、複数の設計者が協働しやすくなります。

3. 自動化・アルゴリズミックデザイン：  
   forループやif文、関数、再帰的なロジックなどを用い、複雑なパターンや構造を容易に生成できます。人手では困難な繰り返し配置やアルゴリズミックな形状探索が、プログラミングを通じて可能になります。

## 生成AIとの組み合わせがもたらす革新

「CAD as a Language」を真に強力なものにするのが、近年急速に進歩した生成AIとの統合です。生成AI（たとえばOpenAIやAnthropicの大規模言語モデル）は、以下の点でCADを言語化するメリットをさらに拡大します。

- 自然言語からのコード生成：  
  「高さ80の塔を中央に配置し、半径12の小型塔を4方向に設置した城をつくりたい」といった自然言語の要求を、AIが直接OpenSCADなどのCADスクリプトへと変換できます。設計者はプログラミング言語を詳しく学ばなくても、意図を伝えるだけで基本的なモデルが得られます。

- インタラクティブな設計プロセス：  
  デザイナーが「塔をもう少し低く」「窓を拡大したい」などの要望を、自然言語で投げかけるたびにAIはコードを再生成。対話的なプロトタイピングと繰り返し改善が飛躍的に容易になります。

- 設計知識の蓄積と流通：  
  AIが蓄えた巨大な知識と設計パターンは、あらゆる分野のユーザーが恩恵を受けるリソースとなります。機械部品から建築モデル、家具デザインまで、再利用可能な設計「文法」が蓄積され、誰でも活用できるエコシステムを生み出します。

## 実例：OpenSCADと生成AIによるモデル生成

たとえば、下記はOpenSCADというテキストベースの3D CADツール用スクリプト例です。これは、生成AIにスクリプトを生成させたものです。

```openscad
// メインの城の塔
module tower(height, radius) {
    difference() {
        // 塔の本体
        cylinder(h=height, r=radius);
        // 上部の装飾的な切り込み
        translate([0, 0, height-5])
            for(i = [0:45:360]) {
                rotate([0, 0, i])
                    translate([radius-1, 0, 0])
                        cube([3, 2, 6]);
            }
    }
    
    // 塔の上部の円錐形の屋根
    translate([0, 0, height])
        cylinder(h=radius*1.2, r1=radius, r2=0);
}

// 城壁のモジュール
module wall(length, height, thickness) {
    difference() {
        cube([length, thickness, height]);
        // 城壁の上部の装飾
        for(i = [2:thickness*2:length-2]) {
            translate([i, 0, height-2])
                cube([thickness, thickness, 3]);
        }
    }
}

// 窓のモジュール
module window(size) {
    translate([0, 0, size/2]) {
        rotate([90, 0, 0]) {
            cylinder(h=10, r=size/2, center=true);
        }
        translate([0, 0, -size/2])
            rotate([90, 0, 0])
                cylinder(h=10, r=size/2, center=true);
    }
}

// メインの構造を組み立て
union() {
    // 中央の大きな塔
    tower(80, 20);
    
    // 4つの小さな塔を配置
    for(i = [0:90:270]) {
        rotate([0, 0, i])
            translate([50, 0, 0])
                tower(60, 12);
    }
    
    // 城壁を配置
    for(i = [0:90:270]) {
        rotate([0, 0, i])
            translate([20, -5, 0])
                wall(30, 40, 10);
    }
    
    // ベースとなる土台
    translate([-60, -60, -2])
        cube([120, 120, 2]);
    
    // 窓を追加
    for(i = [0:90:270]) {
        rotate([0, 0, i]) {
            translate([20, -5, 20])
                window(8);
            translate([40, -5, 20])
                window(8);
        }
    }
}
```

このようなコードは、本来ならプログラマブルなCADツールの知識やスキルが必要ですが、生成AIを使えば、自然言語での指示をもとに瞬時に生成できます。これが「CAD as a Language」という発想の強みであり、筆者が初めてここで提示する設計プロセスの新たな地平線なのです。

## 今後の展望

「CAD as a Language」は、設計を言語・知識・スクリプトによる抽象化と再利用可能な資産化へと導く新たな概念です。この先、生成AIとの連携はますます緊密になり、より高度なデザインパターン、複雑なアルゴリズム、そして大量の参照事例からの自動最適化などが可能になるでしょう。

将来的には、  
- 設計者が自然言語でコンセプトを語る  
- AIがそれを最適化し、コードに落とし込み3Dモデルを生成する  
- 再度、人間が視覚的なモデルを確認し、微調整を要求する

という人間とAIの対話的サイクルが標準的なワークフローとなるかもしれません。

本記事は「CAD as a Language」の初出定義として、今後のものづくりや設計分野での新たなパラダイムを示唆します。私たちは、デザインの未来が、単なるツール操作ではなく、言語を操り、知識を構築・共有し、生成AIと共創するプロセスへと移行しつつある現場に立ち会っているのです。

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