はじめに
PolyScriptを試す
ブラウザで今すぐ試せます。以下のPlaygroundを開いて、コードを入力してみましょう。
コードを書くと、右側に3Dモデルがリアルタイムで表示されます。 このページの例をコピーして貼り付けるだけで始められます。
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として、安全に実行しやすい
単位について: PolyScriptの数値に固定の単位はありません。3Dプリンティングではmmとして扱うのが慣例です。
box 80 60 10は 80mm × 60mm × 10mm のつもりで書くとよいでしょう。
最初に覚える考え方
1. 形はプリミティブから始まる
3Dモデルは基本の形(プリミティブと呼びます)から始めます。立体なら box(箱)、cylinder(円柱)、sphere(球)、平面なら rect(四角)、circle(円)などがあります。引数はスペースで区切って並べます。
box 40 30 10
cylinder 5 10 at:(40, 0, 0)
cone 10 0 20 at:(70, 0, 0) # 完全な円錐(上面半径0)
torus 20 5 at:(120, 0, 0) # ドーナツ形状
at:(x, y, z)で配置位置を指定できます。省略すると原点に置かれるため、複数のプリミティブを並べて見せるときは上の例のようにずらして配置してください。
2. 操作はパイプでつなぐ
PolyScriptは「作る → 選ぶ → 加工する」を | でつなぎます。パイプは直前の引数リストを閉じる役割も果たします。
box 80 60 10
| edges =Z
| fillet 3
セレクタ記号の覚え方:
>は「一番大きい方向」、<は「一番小さい方向」、=は「平行」です。>Zは「Z方向で一番上」= 上面、=Zは「Z方向にまっすぐ伸びている」エッジです。
3. コンテキストが切り替わる
PolyScriptでは、今どんな「作業モード」にいるかによって使える操作が変わります。これをコンテキストと呼びます。最初につまずきやすいポイントですが、まずは次の流れだけ覚えれば十分です。
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 とは書けません。
角丸の箱を作る
diff は「くり抜く」操作です。指定した形の部分を元の形から取り除きます。まずは1つの完成形を、短いコードで作ります。
box 80 60 10
| fillet 2
| diff cylinder 10 10
| diff cylinder 2.5 10 at:20 10
読み方はこうです。
box 80 60 10で中心原点に箱を作るfillet 2でエッジを丸めるdiff cylinder 10 10で中央に円柱の形をくり抜くdiff cylinder 2.5 10 at:20 10で位置をずらした小さな穴を追加する
at: は「その形をその位置に置く」名前付き引数です。単純な座標(数値・変数)ではカッコを省略できます(at:20 10)。式を含む場合はカッコが必要です(at:($x+1, $y+1))。単発の配置では translate より読みやすくなります。配列複製には | grid や | polar パイプ操作を使います。
2Dから3Dを作る
2Dプリミティブは、そのままでは輪郭です。extrude や revolve で3Dにします。
rect 60 40 | extrude 15
rect 10 30 at:(15, 0) | revolve Y
最初のうちは、次の使い分けで十分です。
- 板やブロックは
rect 60 40 | extrude 15 - 軸対称形状は
rect 10 30 at:(15, 0) | revolve Y(プロファイルは回転軸の片側に配置する) - 既製の立体は
box 80 60 10やcylinder 5 10から始める
面を選んで加工する
PolyScriptらしさが最も出るのは、面を選んでそこに加工を入れる部分です。
上面にポケットを作る
box 80 60 10
| faces top
| rect 20 10
| cut 3
faces topは最上面を選びます(暗黙的にワークプレーンが作られます)rect 20 10で矩形を描きますcut 3で深さ3のポケットを切ります
面の中心に穴を開ける
hole はFace選択から直接使えます。選択した面の中心に穴を開けます。
box 80 60 10
| faces top
| hole 5
hole 5 は半径5(直径10)の貫通穴を開けます。faces top | circle 5 | cut と同じ結果で、1ステップ省略できて楽。
複数の穴を一度に開ける
穴の位置を指定したいときは、points で配置してから hole を使います。
box 80 60 10
| faces top
| points (polar 4 15)
| hole 5
faces topで上面を選ぶと、そのまま2D操作に入れますpoints (polar 4 15)で4点を円形配置します。演算(関数呼び出し)の結果を引数にする場合はカッコが必要です。hole 5で各点に半径5の貫通穴を開けます
面を選択した後なら、points を省略して polar / grid を直接書くこともできます。
box 80 60 10
| faces top
| polar 4 15
| hole 5
どちらの書き方でも結果は同じです。短い方がお好みならどうぞ。
points と hole の組み合わせは、ボルト穴や固定穴を作るときの基本形です。
よく使う操作
入門段階では、次の操作を先に使えるようになるのがおすすめです。
| 操作 | 役割 | 例 |
|---|---|---|
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 |
頂点を選択する(2D/3Dプリミティブを配置可) | rect 70 50 | verts |
cut |
スケッチ形状で削る | circle 5 | cut |
hole r |
穴を開ける(面の中心 or 各ポイント) | faces top | hole 5 |
at:x y |
配置する(名前付き引数) | cylinder 2 10 at:20 0 |
変数と関数でパラメトリック化する
寸法を固定値で書くだけでも使えますが、PolyScriptの強みはパラメータ化にあります。
変数
$w = 80
$h = 60
$t = 10
box $w $h $t
| fillet 2
関数
def standoff($r, $h, $hole_r) =
cylinder $r $h
| diff cylinder $hole_r $h
box 80 60 3
| union standoff 4 10 1.5 at:[(10, 10), (70, 10), (10, 50), (70, 50)]
この形にしておくと、穴径や高さだけを変えて部品を再利用できます。
CLIからパラメータを上書きする
パラメータ付きのモデルは、poly build コマンドでソースを編集せずに値を変更できます。
-D key=value で直接指定
poly build my_box.poly -D width=100 -o out.stl
複数のパラメータをまとめて渡せます。
poly build my_box.poly -D width=100 -D height=30
値の型は自動推論されます。100 はint、1.5 はfloat、true/false はbool、それ以外はstringです。
--params-file でJSONから読み込む
パラメータが多いときはJSONファイルにまとめると便利です。
{
"width": 120,
"height": 80,
"material": "ABS"
}
poly build my_box.poly --params-file dims.json
組み合わせ
-D と --params-file は同時に使えます。同じキーがあれば -D が勝ちます。
poly build my_box.poly --params-file presets/small.json -D width=120
パラメータの優先順位は次のとおりです(上が優先)。
- CLI
-D --params-file.poly.params.jsonのparameterSets.default@paramのデフォルト値
試してみよう
次のファイルを my_box.poly として保存してください。
@param 10..200 step:5 desc:"Box width"
width = 60
@param 5..50 desc:"Height"
height = 20
box width width height
CLIで値を変えてビルドしてみましょう。
poly build my_box.poly -D width=100 -D height=30
poly build my_box.poly --params-file variations/large.json
GUIで触るのも楽しいですが、CLIでサクッとバリエーションを量産できるのもパラメトリックモデリングの醍醐味です。