CadQueryチュートリアル
CQ-editor上に入力していくものとしてコードを紹介します。
CQ-editorの導入・起動は済ませておいてください。
本家のドキュメントはこちらを参照:CadQuery 2 Documentation
箱を作る
基本的な箱を作る方法です。
import cadquery as cq
result = cq.Workplane("XY").box(20.0, 10.0, 5.0)
show_object(result)
解説
1行目の「import cadquery as cq」でCadQueryモジュールを読み込んでいます。
ここはPythonの機能になりますが、「as cq」部分で別名を付けてモジュールを読み込んでいるため、CadQueryの機能を「cq」で呼び出すことができます。
「import cadquery」だけであると、「cadquery」と記述しないと呼び出すことができません。
2行目の「result = 」で変数を用意しています。これから作る3Dモデルを保管しておく箱のイメージです。
Pythonでの変数は、アルファベット・数字・アンダースコアが使用可能のため、任意に名付けることが可能です。
次に変数に代入される右辺「cq.Workplane("XY").box(20.0, 10.0, 5.0)」を見ていきましょう。
「cq.」でCadQueryの機能を呼び出します。
続いてWorkplane関数で作業する平面を指定しています。
「XY」を指定していますが、XY, YZ, XZ, front, back, top, bottom, left, rightが指定できるようです。
3次元のモデルを作る際には軸方向を気にしなくてはいけません。
それぞれの次元を、X, Y, Zで表すのが一般的ですが、方向に関しては統一された決まりはありません。
CQ-editorに関しては、XY平面で高さ方向がZ軸となっているため、「Workplane("XY")」をよく使うことになるでしょう。
「box(20.0, 10.0, 5.0)」はその名の通り3Dの箱(ボックス)を作る関数で、引数でX, Y, Z軸方向のサイズを指定します。
幅が20mm・奥行きが10mm・高さが5mmの箱が生成されます。
3行目の「show_object(result)」では、変数に保存された3DモデルをCQ-editorに表示する関数です。
先ほど用意した変数「result」に保存されているものを表示します。
座標系の設定メモ
自分がよく使うCAD類についてまとめておきます。
- CQ-editor(CadQuery)XY平面・高さ方向Z軸・変更不可
- Altium Designer XY平面・高さ方向Z軸・変更不可
- Autodesk Inventor XZ平面・高さ方向Y軸・ViewCube設定変更にて変更可能
- SOLIDWORKS XZ平面・高さ方向Y軸・表示方向ツールバーからZ上方向ビューを適用を選択して変更可能
- FreeCAD XY平面・高さ方向Z軸・変更不可
以上のことから、XY平面(高さ方向Z軸)を使用するモデル作りをしていくのが良いのではと思っています。
使用した関数
オフセットを付けて箱を作る
先程の方法では、生成した箱の中心が原点となります。
上下にシンメトリーなモデルを作成するときには良いかもしれませんが、私の用途では原点の上、プラス方向にモデルを作ることが多いので、その方法を紹介します。
import cadquery as cq
result = cq.Workplane("XY").box(20.0, 10.0, 5.0, centered=[True, True, False])
show_object(result)
解説
2行目のbox関数ですが、オプションにて各軸の中心を使用するかが選べます。
「box(20.0, 10.0, 5.0, centered=[True, True, False])」最後に追記されたcentered=指定で、X軸、Y軸、Z軸を中心にするか選択しています。
今回は高さ方向(Z軸)のみ、プラス方向にモデルを作成してほしかったので、3つ目のZ軸のみFalseにしています。
もちろん全部Falseにすれば各座標のマイナス方向にはモデルが作成されません。
なお、「centered=」は省略も可能なので、「box(20.0, 10.0, 5.0, [True, True, False])」と表記することも可能です。
使用した関数
2Dスケッチから押し出して箱を作る
2次元の長方形のスケッチから押し出しして3Dモデルを作る方法です。
単純な箱ならbox関数で良いと思いますが、例えば円筒形のような形状など複雑になるに従って、断面図を描き、それを押し出して3Dモデル化することが多くなると思います。
import cadquery as cq
result = cq.Workplane("XY").rect(20.0, 10.0).extrude(5.0)
show_object(result)
解説
四角形を描くrect関数と、2次元のスケッチから押し出しして3Dモデルを作成するextrude関数を使用しています。
使用した関数
箱を2個作る
箱を2個作り、それを1つの3Dモデルとして結合する方法です。
import cadquery as cq
result = (
cq.Workplane("XY")
.box(20.0, 10.0, 5.0, centered=[True, True, False])
.faces(">Z")
.workplane()
.box(6.0, 6.0, 3.0, centered=[True, True, False], combine=True)
)
show_object(result)
解説
resultに代入する文が長くなるので、「()」で囲って複数行で記述しています。
箱を作るところまでは同じなのでその後の解説をします。
「faces(">Z")」では、最初に作成した箱の上面を指定しています。
faces関数は”面”を指定する関数であり、フィルター内容に「>Z」を指定しているため、一番大きなZ軸の値の面、つまり最初に作成した箱の上部の面を指し示すことになります。
その面に対して、workplane関数で平面を作成し、その平面上にまたbox関数で箱を作成しています。
今までのbox関数との違いは「combine=True」の指定です。
この指定によって、その下に存在するモデルとの結合を示し、2個の別々の3Dモデルではなく、結合された1個の3Dモデルを生成しています。
使用した関数
箱を3個作る
箱を3個作り、それを1つの3Dモデルとして結合する方法です。
import cadquery as cq
result = (
cq.Workplane("XY")
.box(20.0, 10.0, 5.0, centered=[True, True, False])
.faces(">Z")
.workplane()
.moveTo(4.0, 0.0)
.box(6.0, 6.0, 3.0, centered=[True, True, False], combine=True)
.moveTo(-4.0, 0.0)
.box(6.0, 6.0, 3.0, centered=[True, True, False], combine=True)
)
show_object(result)
import cadquery as cq
result = (
cq.Workplane("XY")
.box(20.0, 10.0, 5.0, centered=[True, True, False])
.faces(">Z")
.workplane()
.center(4.0, 0.0)
.box(6.0, 6.0, 3.0, centered=[True, True, False], combine=True)
.center(-8.0, 0.0)
.box(6.0, 6.0, 3.0, centered=[True, True, False], combine=True)
)
show_object(result)
import cadquery as cq
result = (
cq.Workplane("XY")
.box(20.0, 10.0, 5.0, centered=[True, True, False])
.faces(">Z")
.workplane()
.moveTo(4.0, 0.0)
.rect(6.0, 6.0)
.moveTo(-4.0, 0.0)
.rect(6.0, 6.0)
.extrude(3.0, combine=True)
)
show_object(result)
どのコードも同じ動きをします。
解説
原点に対する位置を指定できるmoveTo関数にてboxを作る位置を変えています。
1個目のコードがmoveTo関数にて座標を絶対値指定する方法。
原点は0, 0のまま動きません。
2個目のコードがcenter関数にて原点を移動してしまう方法。
これは相対的にしか指定できず、原点も移動するためあまりオススメはできません。
3個目のコードはmoveTo関数を使用しているが、boxではなく押し出しで箱を作る方法。
前回の例と違って、rect関数を2回記述しているのに対して、extrude関数は1回しか記述していません。
これは押し出し出来るものは同時に全て押し出されるためです。
使用した関数
- Workplane()
- Workplane.box()
- Workplane.faces()
- Workplane.workplane()
- Workplane.moveTo()
- Workplane.center()
- Workplane.rect()
- Workplane.extrude()
- show_object()
箱を4個以上作る
箱を4個以上作り、それを1つの3Dモデルとして結合する方法です。
import cadquery as cq
result = (
cq.Workplane("XY")
.box(20.0, 10.0, 5.0, centered=[True, True, False])
.faces(">Z")
.workplane()
.rect(6.0, 6.0, forConstruction=True)
.vertices()
.box(2.0, 2.0, 1.5, centered=[True, True, False], combine=True)
)
show_object(result)
import cadquery as cq
result = (
cq.Workplane("XY")
.box(20.0, 10.0, 5.0, centered=[True, True, False])
.faces(">Z")
.workplane()
.pushPoints([(3.0, 3.0), (3.0, -3.0), (-3.0, 3.0), (-3.0, -3.0)])
.box(2.0, 2.0, 1.5, centered=[True, True, False], combine=True)
)
show_object(result)
どのコードも同じ動きをします。
解説
workplane関数までは共通なのでそれ以降の解説をします。
1個目のコードではrect関数とvertices関数を使用しています。
しかもrect関数には謎の「forConstruction=True」オプションが渡されています。
これは、rect関数で描ける長方形を描かずに、下書きとして使用しているイメージです。
その長方形に対して、vertices関数で頂点を取得します。
長方形ですので、4個の頂点が存在します。
その頂点群に対してbox関数で箱を作成しています。
2個目のコードでは、pushPoints関数を使用して、複数の点を自分で指定しています。
この関数の場合は点の数は任意に設定できます。
使用した関数
- Workplane()
- Workplane.box()
- Workplane.faces()
- Workplane.workplane()
- Workplane.rect()
- Workplane.vertices()
- Workplane.pushPoints()
- show_object()
参考リンク
- CadQuery 2 Documentation - Examples
- CadQuery 2 Documentation - Cheatsheet
- CadQuery 2 Documentation - API Reference
- medicationforall/Cadquery_Notes.md
- medicationforall/Installing CadQuery on Windows.md
- medicationforall/Installing_CQ-editor.md
- medicationforall/CadQuery_Python_Packaging-Making_your_own_plugin.md
- medicationforall/Cadquery_Workplane_and_the_Stack.md
- medicationforall/cadquery_shape_primitives.md
- medicationforall/cadquery_array_operations.md
- medicationforall/irregular_grid.md
- プログラミングで 3D モデリングの魅力