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ボタンを押したとき、
renderボタンを押すと、きれいに描画
カッターを移動させる。
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])
追記 : 練習帳です。





