PythonSCADコミュニティ・開発者に感謝申し上げます。ありがとうございます。
今回は、厚み2、幅40の正方形の板に、半径2、高さ2の円柱を等間隔で4 x 4の配置合成します。
【製品概要】
- 一辺40mm・厚み2mmの正方形プレートの上面に、半径2mm・高さ2mmの円柱突起を 4×4(合計16本) 等間隔で配置し、ブーリアンの 和集合(union:複数形状をくっつけて一体化) で合成した形状
- 等間隔配置は「端に余白を残す配置」:円柱中心が x,y = 5, 15, 25, 35 に来る
【主要パラメータと点群データ】
変数名、初期値、意味。断面を点群で構成した場合はその具体的な座標リスト記載
-
plate_size = 40:プレートの一辺 [mm] -
plate_thick = 2:プレート厚み [mm] -
cyl_r = 2:円柱半径 [mm] -
cyl_h = 2:円柱高さ [mm] -
n = 4:グリッド数(n×n本) - 配置用(端に余白を残す配置)
-
pitch = plate_size / n:円柱中心の間隔(ピッチ) -
margin = pitch / 2:外周から円柱中心までの余白
-
- 形状は回転体ではないため、断面点群データは不要
【モデリング手順(アルゴリズム)】
(PythonSCADで実装するステップ。例:1.点群リストによる断面の定義、2.回転体によるベース生成、3.ブーリアン演算によるディテール付加…など。
-
パラメータ定義
- 上記の
plate_size, plate_thick, cyl_r, cyl_h, nを変数として定義 -
pitch = plate_size / n、margin = pitch / 2を計算
- 上記の
-
プレート(板)の作成
- 3D形状として、原点基準でプレートを作る
- 座標系は分かりやすく「板の底面が z=0、板の左下隅が (x,y)=(0,0)」に置く
- 具体的には、直方体(cube)を
size=[plate_size, plate_size, plate_thick]で生成し、3D移動(XYZの3要素) が必要ならtranslate([0, 0, 0])相当で配置
-
円柱突起1本の定義
- 円柱(cylinder)を半径
cyl_r、高さcyl_h、Z軸方向に生成 - 円柱はプレート上面に載せるため、円柱の底面Zを
z = plate_thickに合わせる(突起が上向きに生える)
- 円柱(cylinder)を半径
-
4×4の等間隔配置(A案)
- 2重ループで i=0..n-1、j=0..n-1 を回す
- 各円柱中心座標を
x = margin + i * pitchy = margin + j * pitch-
z = plate_thick
とし、円柱を 3D移動(XYZの3要素)translate([x, y, plate_thick])で配置。
- 注意:ここでの translate は3D(XYZ)で行う。2D図形移動は使わない
-
合成(union)
- プレートと、ループで生成した16本の円柱を union(和集合) で一体化して完成形状にする
-
(任意)表示品質
- 円柱の滑らかさが必要なら分割数(例:
fn=48〜96)を設定して見た目を改善する
- 円柱の滑らかさが必要なら分割数(例:
完成コード(PythonSCAD)
# ==========================================
# 4x4 突起つき正方形プレート(端に余白を残す配置)
# 作成日: 2026/08/12
# ==========================================
from pythonscad import *
# --- パラメータ設定 (単位: mm) ---
plate_size = 40.0 # プレート一辺
plate_thick = 2.0 # プレート厚み
cyl_r = 2.0 # 突起円柱 半径
cyl_h = 2.0 # 突起円柱 高さ
n = 4 # グリッド数(n×n本)
fn_val = 64 # 円柱の滑らかさ
# (端に余白を残す配置)の一般化
pitch = plate_size / n
margin = pitch / 2
# --- 関数定義 ---
def create_plate(size_xy, thick_z):
"""左下隅が (0,0)、底面が z=0 のプレートを作る(center=False)"""
return cube([size_xy, size_xy, thick_z], center=False)
def create_bump(r, h, fn):
"""突起1本(原点中心・底面z=0基準、center=False)"""
return cylinder(h=h, r=r, center=False, fn=fn)
def create_bumps_grid(n, pitch, margin, plate_thick, r, h, fn):
"""端に余白を残す配置:x,y = margin + i*pitch の格子状に突起を生成して 1つに結合(+)"""
bumps = None
for i in range(n):
for j in range(n):
x = margin + i * pitch
y = margin + j * pitch
bump_ij = translate(create_bump(r, h, fn), [x, y, plate_thick])
if bumps is None:
bumps = bump_ij
else:
bumps = bumps + bump_ij
return bumps
# --- メイン処理 ---
plate = create_plate(plate_size, plate_thick)
bumps = create_bumps_grid(n, pitch, margin, plate_thick, cyl_r, cyl_h, fn_val)
result = plate + bumps
show(result)
円柱の半径や高さを変更してみてください。グリッド数(n×n本)も変更してみましょう。
cyl_r = 3.0 # 突起円柱 半径
cyl_h = 1.0 # 突起円柱 高さ
n = 6 # グリッド数(n×n本)
解説
プログラミングの基本である「変数」や「繰り返し処理(ループ)」をフル活用して、無駄のないスマートな設計ができています。
1. 変数を使った「パラメトリックな設計」が完璧!
コードの冒頭で plate_size や n(グリッド数)を変数として定義し、それを使って pitch(突起と突起の間隔)や margin(端の余白)を計算しています。
- pitch = 40.0 / 4 = 10.0mm
- margin = 10.0 / 2 = 5.0mm
数値を直接書く(ハードコーディング)のではなく、このように数式で定義しておくと、あとから n = 6 や plate_size = 60.0 に変更するだけで、全体のバランスを保ったまま自動的に再計算されます。 これは工業的な3D CAD設計において非常に重要な「パラメトリック設計」の考え方です。
2. 二重ループ(for文)による自動配置
突起を16個も手作業で配置するのは大変ですが、Pythonの for 文を2つ重ねる(二重ループ)ことで、縦横のマス目を自動的に作り出しています。
-
for i in range(n):がX方向(左右)の動き -
for j in range(n):がY方向(前後)の動き
x = margin + i * pitch という計算式によって、1個目は5mmの位置、2個目は15mmの位置…というように、等間隔に座標が決定されます。プログラミングの計算力をものづくりに活かせている素晴らしい処理です。
3. + 演算子を使ったパーツの結合テクニック
create_bumps_grid 関数の中で、変数 bumps に突起をどんどん足していく処理(累積処理)を行っています。
if bumps is None:
bumps = bump_ij # 1つ目の突起をセット
else:
bumps = bumps + bump_ij # 2つ目以降を「+」で結合していく
PythonSCADでは、形状同士を + 演算子で足し算することで1つのパーツに結合できます。この「最初は空っぽ(None)にしておき、ループの中でどんどん合体させていく」という手法は、今後の複雑なモデリングでも大活躍する必須テクニックです。
基本原則として「形状は center=True(原点中心)で作る」ことを推奨していますが、今回のように「左下を (0,0) の基準にして、マス目状に配置したい」という明確な目的がある場合は、center=False を使うのが大正解です。マイナスの座標を考えずに済むため、配置の計算がとてもシンプルになっています。

