👋
GPT-4oに丸いテーブルのSTLを生成するコードを教えてもらいました。
X旧ツイッターで、GPT-4oにSTLファイルを作ってもらったという投稿が沢山ありましたので、私も試しました。
でも私の場合は、GPT-4oに、今の環境では実行できないので、コードを教えるので、ローカル環境で試してみてくださいと回答されました。
そして教えてもらったコードを試したら、コードの修正なく丸いテーブルを生成できました。
今回は、Windowsで、Pythonの仮想環境を作り試しました。
仮想環境を作ります。
python -m venv 仮想環境名
仮想環境のアクティベート
Windows
仮想環境名\Scripts\activate
macOS/Linux
source 仮想環境名/bin/activate
パッケージのインストール
pip install numpy numpy-stl
コード本体
生成条件
テーブル天板: 丸型
直径: 100 mm
厚さ: 10 mm
テーブル脚: 4本
各脚の直径: 10 mm
各脚の高さ: 80 mm
脚の間隔: 天板の中心から等間隔に配置
import numpy as np
from stl import mesh
import math
def create_tabletop(diameter, thickness):
radius = diameter / 2
segments = 50 # Number of segments to approximate the circle
vertices = []
faces = []
# Top circle vertices
for i in range(segments):
angle = 2 * math.pi * i / segments
x = radius * math.cos(angle)
y = radius * math.sin(angle)
vertices.append([x, y, thickness / 2])
# Bottom circle vertices
for i in range(segments):
angle = 2 * math.pi * i / segments
x = radius * math.cos(angle)
y = radius * math.sin(angle)
vertices.append([x, y, -thickness / 2])
# Center vertices
top_center = [0, 0, thickness / 2]
bottom_center = [0, 0, -thickness / 2]
vertices.append(top_center)
vertices.append(bottom_center)
top_center_index = len(vertices) - 2
bottom_center_index = len(vertices) - 1
# Create top and bottom faces
for i in range(segments):
next_i = (i + 1) % segments
faces.append([i, next_i, top_center_index])
faces.append([i + segments, bottom_center_index, next_i + segments])
# Create side faces
for i in range(segments):
next_i = (i + 1) % segments
faces.append([i, i + segments, next_i])
faces.append([next_i, i + segments, next_i + segments])
return np.array(vertices), np.array(faces)
def create_leg(diameter, height, segments=20):
radius = diameter / 2
vertices = []
faces = []
# Top circle vertices
for i in range(segments):
angle = 2 * math.pi * i / segments
x = radius * math.cos(angle)
y = radius * math.sin(angle)
vertices.append([x, y, height / 2])
# Bottom circle vertices
for i in range(segments):
angle = 2 * math.pi * i / segments
x = radius * math.cos(angle)
y = radius * math.sin(angle)
vertices.append([x, y, -height / 2])
# Center vertices
top_center = [0, 0, height / 2]
bottom_center = [0, 0, -height / 2]
vertices.append(top_center)
vertices.append(bottom_center)
top_center_index = len(vertices) - 2
bottom_center_index = len(vertices) - 1
# Create top and bottom faces
for i in range(segments):
next_i = (i + 1) % segments
faces.append([i, next_i, top_center_index])
faces.append([i + segments, bottom_center_index, next_i + segments])
# Create side faces
for i in range(segments):
next_i = (i + 1) % segments
faces.append([i, i + segments, next_i])
faces.append([next_i, i + segments, next_i + segments])
return np.array(vertices), np.array(faces)
def create_table(top_diameter, top_thickness, leg_diameter, leg_height):
tabletop_vertices, tabletop_faces = create_tabletop(top_diameter, top_thickness)
leg_vertices, leg_faces = create_leg(leg_diameter, leg_height)
# Translate legs to their positions
leg_positions = [
[top_diameter / 4, top_diameter / 4, -(leg_height / 2 + top_thickness / 2)],
[-top_diameter / 4, top_diameter / 4, -(leg_height / 2 + top_thickness / 2)],
[top_diameter / 4, -top_diameter / 4, -(leg_height / 2 + top_thickness / 2)],
[-top_diameter / 4, -top_diameter / 4, -(leg_height / 2 + top_thickness / 2)]
]
all_vertices = list(tabletop_vertices)
all_faces = list(tabletop_faces)
for pos in leg_positions:
leg_vertices_translated = leg_vertices + pos
leg_face_offset = len(all_vertices)
all_vertices.extend(leg_vertices_translated)
all_faces.extend(leg_faces + leg_face_offset)
all_vertices = np.array(all_vertices)
all_faces = np.array(all_faces)
table_mesh = mesh.Mesh(np.zeros(all_faces.shape[0], dtype=mesh.Mesh.dtype))
for i, f in enumerate(all_faces):
for j in range(3):
table_mesh.vectors[i][j] = all_vertices[f[j], :]
return table_mesh
# Create the table
table_mesh = create_table(100, 10, 10, 80)
# Save to file
file_path = "round_table_with_4_legs.stl"
table_mesh.save(file_path)
print(f"STL file saved to {file_path}")
プログラムの実行
hogeは、プログラムを保存したファイル名に置き換えてください。
python hoge.py
ファイル名 round_table_with_4_legs.stl で、出力されます。
作業が終わったら
作業を中断するときなどは、下記のコマンドで仮想環境を終了させましょう。
deactivate
Discussion