はじめに

基本の考え方と最初のモデル。

PolyScriptを試す

ブラウザで今すぐ試せます。以下のPlaygroundを開いて、コードを入力してみましょう。

PolyScript Playground

コードを書くと、右側に3Dモデルがリアルタイムで表示されます。 このページの例をコピーして貼り付けるだけで始められます。

PolyScriptとは

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

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

この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)         # ドーナツ形状
✎ Edit

at:(x, y, z) で配置位置を指定できます。省略すると原点に置かれるため、複数のプリミティブを並べて見せるときは上の例のようにずらして配置してください。

2. 操作はパイプでつなぐ

PolyScriptは「作る → 選ぶ → 加工する」を | でつなぎます。パイプは直前の引数リストを閉じる役割も果たします。

box 80 60 10
 | edges =Z
 | fillet 3
✎ Edit

セレクタ記号の覚え方: > は「一番大きい方向」、< は「一番小さい方向」、= は「平行」です。>Z は「Z方向で一番上」= 上面、=Z は「Z方向にまっすぐ伸びている」エッジです。

3. コンテキストが切り替わる

PolyScriptでは、今どんな「作業モード」にいるかによって使える操作が変わります。これをコンテキストと呼びます。最初につまずきやすいポイントですが、まずは次の流れだけ覚えれば十分です。

  1. box 80 60 10 などを作ると3Dコンテキストになる
  2. faces top で面を選ぶ(その面の上に仮想の作業台 = ワークプレーンが自動で作られる)
  3. そのまま2Dプリミティブを描く
  4. cuthole で加工する
  5. 加工が終わると3Dに戻る
box 80 60 10
 | faces top
 | circle 5
 | cut
✎ Edit

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
✎ Edit

読み方はこうです。

  • 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プリミティブは、そのままでは輪郭です。extruderevolve で3Dにします。

rect 60 40 | extrude 15
rect 10 30 at:(15, 0) | revolve Y
✎ Edit

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

  • 板やブロックは rect 60 40 | extrude 15
  • 軸対称形状は rect 10 30 at:(15, 0) | revolve Y(プロファイルは回転軸の片側に配置する)
  • 既製の立体は box 80 60 10cylinder 5 10 から始める

面を選んで加工する

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

上面にポケットを作る

box 80 60 10
 | faces top
 | rect 20 10
 | cut 3
✎ Edit
  • faces top は最上面を選びます(暗黙的にワークプレーンが作られます)
  • rect 20 10 で矩形を描きます
  • cut 3 で深さ3のポケットを切ります

面の中心に穴を開ける

hole はFace選択から直接使えます。選択した面の中心に穴を開けます。

box 80 60 10
 | faces top
 | hole 5
✎ Edit

hole 5 は半径5(直径10)の貫通穴を開けます。faces top | circle 5 | cut と同じ結果で、1ステップ省略できて楽。

複数の穴を一度に開ける

穴の位置を指定したいときは、points で配置してから hole を使います。

box 80 60 10
 | faces top
 | points (polar 4 15)
 | hole 5
✎ Edit
  • 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
✎ Edit

どちらの書き方でも結果は同じです。短い方がお好みならどうぞ。

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

よく使う操作

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

操作 役割
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
✎ Edit

関数

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)]
✎ Edit

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

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

パラメータの優先順位は次のとおりです(上が優先)。

  1. CLI -D
  2. --params-file
  3. .poly.params.jsonparameterSets.default
  4. @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
✎ Edit

CLIで値を変えてビルドしてみましょう。

poly build my_box.poly -D width=100 -D height=30
poly build my_box.poly --params-file variations/large.json

GUIで触るのも楽しいですが、CLIでサクッとバリエーションを量産できるのもパラメトリックモデリングの醍醐味です。