PolyScript 入門
PolyScriptとは
PolyScript は、パラメトリック 3D モデルを簡潔に書くための CAD DSL です。
基本の考え方はシンプルで、プリミティブを作り、| で操作をつなぎ、必要な箇所だけ選択して加工します。
box 80 60 10 | fillet 2 | diff cylinder 10 10
この 1 行は、次の意味になります。
box 80 60 10で箱を作る| fillet 2で角を丸める| diff cylinder 10 10で円柱を引く
PolyScript の特徴は次の 3 点です。
- よく使う CAD 操作を短く(カッコなしで)書ける
- 操作の流れが
|で左から右へ読める - 宣言的な DSL として、安全に実行しやすい
最初に覚える考え方
1. 形はプリミティブから始まる
3D は box, cylinder, sphere、2D は rect, circle, polygon などから始めます。引数はスペースで区切って並べます。
box 40 30 10
circle 10
rect 60 40
2. 操作はパイプでつなぐ
PolyScript は「作る → 選ぶ → 加工する」を | でつなぎます。パイプは直前の引数リストを閉じる役割も果たします。
box 80 60 10
| edges =Z
| fillet 3
3. コンテキストが切り替わる
初心者が最初につまずきやすいのは、どの操作がどこで使えるかです。まずは次の流れだけ覚えれば十分です。
box 80 60 10などを作ると 3D コンテキストになるfaces topで面を選ぶ(暗黙的にワークプレーンが作られる)- そのまま 2D プリミティブを描く
cutやholeで加工する- 加工が終わると 3D に戻る
box 80 60 10
| faces top
| circle 5
| cut
cut は 3D オブジェクトの面上で使う操作です。面を選ばずにいきなり circle 5 | cut とは書けません。
角丸の箱を作る
まずは 1 つの完成形を、短いコードで作ります。
box 80 60 10
| fillet 2
| diff cylinder 10 10
| diff cylinder 10 2.5 at 20 10
読み方はこうです。
box 80 60 10で中心原点に箱を作るfillet 2でエッジを丸めるdiff cylinder 10 10で中央に大きな円柱を引くdiff cylinder 10 2.5 at 20 10で位置をずらした小さな穴を追加する
at は「その形をその位置に置く」という糖衣構文です。単純な座標(数値・変数・算術式)ではカッコを省略できます。単発の配置では translate より読みやすくなります。配列複製には | grid や | polar パイプ操作を使います。
面を選んで加工する
PolyScript らしさが最も出るのは、面を選んでそこに加工を入れる部分です。
上面にポケットを作る
box 80 60 10
| faces top
| rect 20 10
| cut 3
faces topは最上面を選びます(暗黙的にワークプレーンが作られます)rect 20 10で矩形を描きますcut 3で深さ 3 のポケットを切ります
複数の穴を一度に開ける
box 80 60 10
| faces top
| points (polar n:4 r:15)
| hole 5
faces topで上面を選ぶと、そのまま 2D 操作に入れますpoints (polar n:4 r:15)で 4 点を円形配置します。演算(関数呼び出し)の結果を引数にする場合はカッコが必要です。hole 5で各点に半径 5 の貫通穴を開けます
points と hole の組み合わせは、ボルト穴や固定穴を作るときの基本形です。
2D から 3D を作る
2D プリミティブは、そのままでは輪郭です。extrude や revolve で 3D にします。
rect 60 40 | extrude 15
circle 20 | revolve 360
最初のうちは、次の使い分けで十分です。
- 板やブロックは
rect 60 40 | extrude 15 - 軸対称形状は
circle 20 | revolve 360 - 既製の立体は
box 80 60 10やcylinder 10 5から始める
よく使う操作
入門段階では、次の操作を先に使えるようになるのがおすすめです。
| 操作 | 役割 | 例 |
|---|---|---|
fillet r |
角を丸める | box 40 30 10 | fillet 2 |
chamfer r |
面取りする | box 40 30 10 | chamfer 1 |
diff shape |
形を引く | box ... | diff cylinder ... |
union shape |
形を足す | box ... | union cylinder ... |
faces sel |
面を選ぶ | faces top |
edges sel |
エッジを選ぶ | edges =Z |
workplane "axis" |
軸を指定して 2D スケッチする | workplane "XZ" |
verts |
頂点を選択する | rect 70 50 | verts |
cut |
スケッチ形状で削る | circle 5 | cut |
hole r |
穴を開ける | points (grid 2 2 10) | hole 3 |
at x y |
配置する | cylinder 10 2 at 20 0 |
変数と関数でパラメトリック化する
寸法を固定値で書くだけでも使えますが、PolyScript の強みはパラメータ化にあります。
変数
w = 80
h = 60
t = 10
box w h t
| fillet 2
関数
def standoff(r, h, hole_r) =
cylinder h r
| diff cylinder h hole_r
box 80 60 3
| union standoff 4 10 1.5 at [(10, 10), (70, 10), (10, 50), (70, 50)]
この形にしておくと、穴径や高さだけを変えて部品を再利用できます。