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-editor
のshow_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"}) # ボルトを赤色で表示
コメント