1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonSCADコミュニティ・開発者に感謝申し上げます。ありがとうございます。

今回は、お皿の断面を描画し、回転体をつくるrotate_extrude()を使いました。さらに、断面形状を確認できるように手作りカッターで切り取って視覚化しています。一歩一歩です。ありがとうございます。

お皿の断面確認(+X方向カット)

# ==========================================
# [お皿の断面確認(+X方向カット)]
# 作成日: 2026/08/01
# ==========================================

from pythonscad import *
from math import pi, sin, cos, radians  # 数学関数(円弧の計算などに必須)

# --- パラメータ設定 (単位: mm) ---
# 座標系の約束: X軸=半径方向(左右) / Y軸=上下方向(Z軸の代わり)

plate_r   = 60      # お皿の外側半径
plate_h   = 20      # お皿の高さ
thickness = 3       # お皿の厚み

foot_r    = 25      # 高台(底の出っ張り)の中心半径
foot_w    = 4       # 高台の幅(太さ)
foot_h    = 5       # 高台の高さ(地面からお皿の底までの空間)

# 自動計算されるパラメータ
rim_r        = thickness / 2  # 縁(フチ)の丸みの半径
foot_round_r = foot_w / 2     # 高台の接地部分の丸み半径

cutter_size  = 130  # 断面カット用キューブの一辺の長さ

fn_val    = 80      # 円周・球の滑らかさ
eps       = 0.1     # 面のチラつき防止用の微小値

# --- 関数(モジュール)定義 ---

# 1. 2次ベジエ曲線の座標リストを生成する関数
def calc_bezier(p0, p1, p2, steps):
    pts = []
    for i in range(steps + 1):
        t = i / steps
        x = (1 - t)**2 * p0[0] + 2 * (1 - t) * t * p1[0] + t**2 * p2[0]
        y = (1 - t)**2 * p0[1] + 2 * (1 - t) * t * p1[1] + t**2 * p2[1]
        pts.append([x, y])
    return pts

# 2. 円弧(丸み)の座標リストを生成する関数
def calc_arc(cx, cy, r, start_deg, end_deg, steps):
    pts = []
    for i in range(steps + 1):
        deg = start_deg + (end_deg - start_deg) * (i / steps)
        rad = radians(deg)
        x = cx + r * cos(rad)
        y = cy + r * sin(rad)
        pts.append([x, y])
    return pts

# 3. お皿の断面(一筆書きの2Dポリゴン)を生成する関数
def make_continuous_profile():
    points = []
    
    # A. 底面
    points.append([0, foot_h])
    points.append([foot_r - foot_round_r, foot_h])
    # B. 高台の内側の壁
    points.append([foot_r - foot_round_r, foot_round_r])
    # C. 高台の接地部分(丸み)
    foot_arc = calc_arc(foot_r, foot_round_r, foot_round_r, 180, 360, 10)
    points.extend(foot_arc)
    # D. 高台の外側の壁
    points.append([foot_r + foot_round_r, foot_h])
    # E. お皿の外側のカーブ
    p0_out = [foot_r + foot_round_r, foot_h]
    p1_out = [plate_r * 0.6, foot_h]
    p2_out = [plate_r, plate_h - rim_r]
    outer_curve = calc_bezier(p0_out, p1_out, p2_out, 20)
    points.extend(outer_curve)
    # F. お皿の縁(フチの丸み)
    rim_cx = plate_r - rim_r
    rim_cy = plate_h - rim_r
    rim_arc = calc_arc(rim_cx, rim_cy, rim_r, 0, 180, 10)
    points.extend(rim_arc)
    # G. お皿の内側のカーブ
    p0_in = [plate_r - thickness, plate_h - rim_r]
    p1_in = [plate_r * 0.6, foot_h + thickness]
    p2_in = [0, foot_h + thickness]
    inner_curve = calc_bezier(p0_in, p1_in, p2_in, 20)
    points.extend(inner_curve)
    
    return polygon(points)

# 4. 断面確認用のカッター(+X方向を覆うブロック)を生成する関数
def make_cross_section_cutter(size):
    # center=True で原点中心に大きなブロックを作成
    base_cube = cube([size, size, size], center=True)
    # ブロックの幅の半分だけ +X 方向へ移動させる
    # これにより、ブロックの左側の面がピッタリ「X=0」の平面に合います
    return translate(base_cube, [size / 2, 0, 0])

# --- メイン処理 ---

# 1. 2Dの一筆書き断面を生成し、Z軸中心に360度回転させて立体にする
profile_2d = make_continuous_profile()
plate_3d = rotate_extrude(profile_2d, angle=360, fn=fn_val)

# 2. カッター(+X半分を覆うブロック)を生成
cutter = make_cross_section_cutter(cutter_size)

# 3. 引き算(- 演算子)で、お皿から右半分を削り落とす
result = plate_3d - cutter

# 3Dプレビュー表示
show(result)

previewボタンを押したとき、

スクリーンショット 2026-08-03 131919.png

renderボタンを押すと、きれいに描画

スクリーンショット 2026-08-03 132017.png

スクリーンショット 2026-08-03 132146.png

スクリーンショット 2026-08-03 132220.png

カッターを移動させる。

center=Falseにし、ブロックを移動させます。

def make_cross_section_cutter(size):
    # center=False z=0にブロックを作成
    base_cube = cube([size, size, size], center=False)

    return translate(base_cube, [0, 0, -10])

result = plate_3d + cutter
スクリーンショット 2026-08-03 133657.png

result = plate_3d - cutter
スクリーンショット 2026-08-03 133812.png

追記 : 練習帳です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?