PolyScript 入門

PolyScriptとは

PolyScript は、パラメトリック 3D モデルを簡潔に書くための CAD DSL です。 基本の考え方はシンプルで、プリミティブを作り、| で操作をつなぎ、必要な箇所だけ選択して加工します。

box 80 60 10 | fillet 2 | diff cylinder 10 10

この 1 行は、次の意味になります。

PolyScript の特徴は次の 3 点です。

最初に覚える考え方

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. コンテキストが切り替わる

初心者が最初につまずきやすいのは、どの操作がどこで使えるかです。まずは次の流れだけ覚えれば十分です。

  1. box 80 60 10 などを作ると 3D コンテキストになる
  2. faces top で面を選ぶ(暗黙的にワークプレーンが作られる)
  3. そのまま 2D プリミティブを描く
  4. cuthole で加工する
  5. 加工が終わると 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

読み方はこうです。

at は「その形をその位置に置く」という糖衣構文です。単純な座標(数値・変数・算術式)ではカッコを省略できます。単発の配置では translate より読みやすくなります。配列複製には | grid| polar パイプ操作を使います。

面を選んで加工する

PolyScript らしさが最も出るのは、面を選んでそこに加工を入れる部分です。

上面にポケットを作る

box 80 60 10
 | faces top
 | rect 20 10
 | cut 3

複数の穴を一度に開ける

box 80 60 10
 | faces top
 | points (polar 4 15)
 | hole 5

pointshole の組み合わせは、ボルト穴や固定穴を作るときの基本形です。

2D から 3D を作る

2D プリミティブは、そのままでは輪郭です。extruderevolve で 3D にします。

rect 60 40 | extrude 15
circle 20 | revolve 360

最初のうちは、次の使い分けで十分です。

よく使う操作

入門段階では、次の操作を先に使えるようになるのがおすすめです。

操作 役割
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)]

この形にしておくと、穴径や高さだけを変えて部品を再利用できます。