👋

GPT-4oに丸いテーブルのSTLを生成するコードを教えてもらいました。

2024/06/01に公開

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