CadQuery

TD11 CadQuery LLM ボルトナット

この記事は約10分で読めます。

CadQueryで作成したモデルです。LLMによるコード生成で行います。

VScodeとLLMを使っています。作業環境上、規模の大きなローカルLLMは使用できないので、githubのCopilotを使っています。(Claude 3.5 Sonnet → GPT-4o モデル作成は切り替えています。2025/4月現在、github Copilotの自律的なAI機能が抜きんでているので、他だと手順が異なると思います)

プロジェクト設定

cadqueryでナットのモデルを作成したいので、フォルダ構成を作成してもらえますか。

プロジェクトのフォルダを作成してもらいます。

ワークスペースになんとなくフォルダとファイルを設定してくれます。
中身はあまり整備されたものではないので、指示を繰り返して作成したいものに近づけます。

モデル修正

Cad-Queryに関しては、GPT-4oの方がよさそう、こちらで作業します。

ナット単体から、アッシーを確認するため、ボルトナットの構成にしています。

(・・・確認と修正をいくらか実施)

現在のナットのコードをnut.pyへ移行して、ボルトのファイルを作成して、main.pyでアッシー形状を定義するように構成を含めて修正できますか。
・・・いくつかエラー修正を実施

cad-query-app/
├── src/
│ ├── models/
│ │ ├── nut.py # ナットのモデルを定義
│ │ ├── bolt.py # ボルトのモデルを定義
│ └── main.py # アッシー形状を生成するエントリーポイント
├── README.md # プロジェクトの説明
  • README.md
  • main.py
  • bolt.py
  • nut.py
# README.md

# CadQuery Nut and Bolt Assembly Project

このプロジェクトは、CadQueryを使用してナットとボルトの3Dモデルを作成し、それらを組み合わせたアッシー形状を生成するアプリケーションです。

## プロジェクト構成

```
cad-query-app/
├── src/
│ ├── models/
│ │ ├── nut.py # ナットのモデルを定義
│ │ ├── bolt.py # ボルトのモデルを定義
│ └── main.py # アッシー形状を生成するエントリーポイント
├── README.md # プロジェクトの説明
```

## 使用方法

1. 必要なパッケージを手動でインストールします。
```
pip install cadquery
```

2. アプリケーションを実行します。
```
python src/main.py
```

3. CQ-editorを使用して3Dモデルを表示する場合は、`src/main.py`を開いて実行します。

## 主な仕様

- **ナットモデル (`Nut`)**
- パラメータ:
- `diameter`: ナットの内径
- `height`: ナットの高さ
- `thread_pitch`: ネジピッチ(オプション)
- 六角形の外形を持ち、中心に穴が開いた形状を生成します。

- **ボルトモデル (`Bolt`)**
- パラメータ:
- `diameter`: ボルトのシャフト直径
- `length`: ボルトの長さ
- シャフトとボルト頭を持つ形状を生成します。

- **アッシー形状**
- ナットとボルトを組み合わせ、ナットをボルトの下に配置した形状を生成します。

## ライセンス

このプロジェクトはMITライセンスの下で提供されています。
import sys
from pathlib import Path

# Pythonパスを確認
print(f"Python path: {sys.path}")

# srcディレクトリをPythonパスに追加
sys.path.append(str(Path(__file__).parent))

import cadquery as cq
from models.nut import Nut
from models.bolt import Bolt

# グローバルスコープでresult変数を定義
result = None

def create_assembly():
    # ナットとボルトを作成
    nut = Nut(diameter=10, height=5, thread_pitch=1.5).build()  # thread_pitchを指定
    bolt = Bolt(diameter=10, length=20).build()

    # ナットをボルトの下に配置
    nut = nut.translate((0, 0, -5))  # ナットをボルトの下に移動

    # アッシー形状を結合
    assembly = nut.union(bolt)
    return assembly

# CQ-editorで動作するために、グローバルスコープでresultを設定
result = create_assembly()
import cadquery as cq

class Bolt:
    def __init__(self, diameter=10, length=20):
        self.diameter = diameter
        self.length = length
        self.head_diameter = diameter * 1.5  # ボルト頭の直径
        self.head_height = diameter * 0.5   # ボルト頭の高さ

    def build(self):
        # ボルトの基本形状を作成
        shaft = (cq.Workplane("XY")
                 .circle(self.diameter / 2)  # シャフトの円
                 .extrude(self.length))      # 長さ方向に押し出し

        head = (cq.Workplane("XY")
                .circle(self.head_diameter / 2)  # ボルト頭の円
                .extrude(self.head_height))     # 高さ方向に押し出し

        # ボルト頭をシャフトに結合
        bolt = shaft.union(head.translate((0, 0, self.length)))
        return bolt
import cadquery as cq

class Nut:
    def __init__(self, diameter=10, height=5, thread_pitch=1.5):
        self.diameter = diameter
        self.height = height
        self.thread_pitch = thread_pitch
        self.hex_size = diameter * 1.5  # 六角ナットの対辺距離

    def build(self):
        # 六角ナットの基本形状を作成
        result = (cq.Workplane("XY")
                 .polygon(6, self.hex_size)  # 六角形の基本形状
                 .extrude(self.height)       # 高さ方向に押し出し
                 # 中心に穴を開ける
                 .faces(">Z")
                 .workplane()
                 .hole(self.diameter))
        return result

パーツ分割

上記のままだとパーツが一体化されているので、個別にしておくように変更します。

ボルトナットを別部品にできますか。

パーツに分ける 個別で出力も行える。
import cadquery as cq
from models.nut import Nut
from models.bolt import Bolt

# グローバルスコープでresult変数を定義
result = None

def create_assembly():
    # ナットとボルトを作成
    nut = Nut(diameter=10, height=5, thread_pitch=1.5).build()  # thread_pitchを指定
    bolt = Bolt(diameter=10, length=20).build()

    # ナットをボルトの下に配置
    nut = nut.translate((0, 0, -5))  # ナットをボルトの下に移動

    # アッシー形状を結合
    assembly = nut.union(bolt)
    return nut, bolt, assembly

# CQ-editorで動作するために、グローバルスコープでresultを設定
nut, bolt, result = create_assembly()

# 個別に表示
show_object(nut, name="Nut", options={"color": "blue"})  # ナットを青色で表示
show_object(bolt, name="Bolt", options={"color": "red"})  # ボルトを赤色で表示

CQ-editorshow_object関数を使用して、各部品を個別に登録します。

パラメータ定義

パラメータをjson形式で定義して入力を少し整理した場合です。(main.py修正)

# パラメータの定義
nut_params = {
"diameter": 10, # ナットの内径
"height": 5, # ナットの高さ
"thread_pitch": 1.5 # ナットのネジピッチ
}

bolt_params = {
"diameter": 10, # ボルトのシャフト直径
"length": 20 # ボルトの長さ
}
import cadquery as cq
from models.nut import Nut
from models.bolt import Bolt

# グローバルスコープでresult変数を定義
result = None

def create_assembly(nut_params, bolt_params):
    # ナットとボルトを作成
    nut = Nut(**nut_params).build()  # ナットのパラメータを展開して渡す
    bolt = Bolt(**bolt_params).build()  # ボルトのパラメータを展開して渡す

    # ナットをボルトの下に配置
    nut = nut.translate((0, 0, -nut_params["height"]))  # ナットをボルトの下に移動

    # アッシー形状を結合
    assembly = nut.union(bolt)
    return nut, bolt, assembly

# パラメータの定義
nut_params = {
    "diameter": 10,       # ナットの内径
    "height": 5,          # ナットの高さ
    "thread_pitch": 1.5   # ナットのネジピッチ
}

bolt_params = {
    "diameter": 10,       # ボルトのシャフト直径
    "length": 20          # ボルトの長さ
}

# CQ-editorで動作するために、グローバルスコープでresultを設定
nut, bolt, result = create_assembly(nut_params, bolt_params)

# 個別に表示
show_object(nut, name="Nut", options={"color": "blue"})  # ナットを青色で表示
show_object(bolt, name="Bolt", options={"color": "red"})  # ボルトを赤色で表示

コメント

Translate »
タイトルとURLをコピーしました