2018年10月14日日曜日

FreeCADでCadQueryを動かして箱を作ってみた


背景

CadQueryとは、3Dモデルを作れるpythonのライブラリです。
CadQueryが作成する3Dモデルは、FreeCADというCADプログラムで確認できます。

KiCadの3DモデルをCadQueryで作るスクリプトを以前見つけたときにCadQueryの存在を知り、興味を持っていたので、操作や記述方法を調べてみました。

FreeCADでCadQueryを使うにあたり自分が、戸惑った操作方法やスクリプトの書き方を、美容録を兼ねて共有します。

使ったもの

FreeCAD


FreeCAD 0.17を利用しました。

Download FreeCAD

CadQuery


下記の手順に従いcadquery-freecad-moduleをインストールして、FreeCADでCadQueryを使える状態にしました。

cadquery-freecad-module/docs/installation.md

例として用意されたスクリプトを実行

下記のページにスクリプトと実行結果のモデルが一覧として表示されています。
どんな形が作れるか想像することや、具体的なスクリプト記述方法の参考になると思います。

CadQueryのスクリプト集

このスクリプトはFreeCADから呼び出せるようになっているため、試しに実行してみます。

FreeCAD上部のモードをCadQueryにします。


モードを変更するとCadQuery用のメニューが表示されるので、CadQuery -> Examples -> Ex001_simple_blockを選択します。


このサンプルは80x60x10の箱を出力します。


show_objectが定義されていないというエラーが表示されますが、これは既知の不具合として認識されてるようです。
show_objectが無いと実行しても何も表示されないので、このエラーは無視します。



CadQueryのスクリプトは、F2を押すか、CadQuery -> Execute Scriptを選択すると実行できます。


実行すると灰色の画面が表示されると思います。


これは、生成したモデルで画面が覆われているため灰色になっています。
灰色の部分にマウスカーソルを移動し、スクロールするとモデルの全体像を確認できます。


視点を変更してメジャー機能で測ってみると、期待通りに80x60x10mmの箱が出力されているようでした。


スクリプトのタブを選択すれば、スクリプトの編集画面に戻れます。


スクリプトの扱い方

自分でスクリプトを作る際のファイルの操作方法です。
CadQueryのスクリプトはFreeCADのプロジェクトとは異なるファイルの扱い方をするので、把握していないと保存できなかったり、開いても実行できなかったりします。

スクリプトを新規作成

CadQuery -> New Scriptを選択するか、「Alt + n」を入力すると、CadQueryのスクリプトを新規作成できます。
File -> Newではありません。


CadQeryがインポートされただけのファイルが表示されます。


スクリプトを保存する

CadQuery -> Save Scriptを選択するか、「Alt + s」を入力するとスクリプトを保存できます。
「Ctl + s」ではCadQueryのスクリプトは保存できないことに注意です。


スクリプトを開く

CadQuery -> Open Scriptを選択するか、「Alt + o」を入力するとスクリプトを開けます。
File -> Openで開いてもCadQueryのスクリプトとして認識されないことに注意です。


記述方法

基本操作の参照先と、個人的にやり方が分かるまでに手間取っだ操作を紹介します。

基本操作

boxで箱を作ったり、unionでオブジェクトを結合したり、基本的な操作は前の章でも紹介したスクリプト集を見ると雰囲気が分かると思います。


知りたい操作はCadQueryの説明ページの検索機能を使うと、見つかるかも知れません。


面や角を選択する

facesedgesに文字列を渡すことで特定の面や角を選択できます。
この文字列はFilteringFacesFilteringEdgesを見ると、どのように選択できるかが分かります。

例えば、図の左上の角(緑色の線になっている部分)を選択したい場合、


その角は「最もz座標が大きい角」かつ「最もy座標の小さい角」なので、">Z and <Y"と書けます。

先ほど実行したスクリプトの左上の角を半径2mmで丸める(fillet)のは、このように書けます。
filletRadius = 2.0

result = cq.Workplane("XY").box(length, height, thickness)\
    .edges("> Z and <Y").fillet(filletRadius)

実行するとこのようになります。


特定の角だけを丸められました。

物体を移動させる + 差分をとる

物体の移動にはtranslateを使います。
movemoveToは線画時に利用する関数なので、物体の移動には利用できないようです。

物体の差分をとるには、cutを使います。
FreeCADではunionの対比としてdifferenceがありますが、CadQueryでは別の関数名だったので、探し当てるのに手間取りました。

下記のように記述すると、他の物体に半径1.5mmの穴を空けられます。
cylinderRadius = 1.5

cylinder = cq.Workplane("XY").circle(cylinderRadius).extrude(thickness)\
    .translate((0, -height/2, -thickness/2))

result = result.cut(cylinder)

実行するとこのようになります。


物体の特定の場所をくり抜けました。

ネジ穴付きの箱を作る

スクリプト集で使われている操作(shell, union, chamferなど)や先ほど紹介した操作を組み合わせて、ネジ穴付きの箱を作ってみました。
# This is a CadQuery script
import cadquery as cq

xLength = 100.0
yLength = 50.0
zLength = 40.0
thikness = 1.5

screwHoleDiamiter = 2.9
screwMountZLength = 8.0
screwMountWidth = 5.0
screwMountChamferLength = 2

box = cq.Workplane("XY").box(xLength, yLength, zLength) \
    .faces("+Z").shell(thikness)

screwHole = cq.Workplane("XY").circle(screwHoleDiamiter/2)\
    .extrude(screwMountZLength)\
    .translate((0, 0, -screwMountZLength/2))
screwMount = cq.Workplane("XY")\
    .box(screwMountWidth, screwMountWidth, screwMountZLength)\
    .edges("<Z and <Y").chamfer(screwMountWidth - 0.1)\
    .edges("<Y and |Z").fillet(screwHoleDiamiter/2)\
    .cut(screwHole)
screwMountTopRight = screwMount.translate((
    xLength/2 - thikness,
    yLength/2 - thikness,
    zLength/2 - screwMountZLength/2))
screwMountTopLeft = screwMount.translate((
    - xLength/2 + thikness,
    yLength/2 - thikness,
    zLength/2 - screwMountZLength/2))
screwMountBottomRight = screwMount.mirror(mirrorPlane="XZ").translate((
    xLength/2 - thikness,
    - yLength/2 + thikness,
    zLength/2 - screwMountZLength/2))
screwMountBottomLeft = screwMount.mirror(mirrorPlane="XZ").translate((
    - xLength/2 + thikness,
    - yLength/2 + thikness,
    zLength/2 - screwMountZLength/2))

box = box.union(screwMountTopRight).union(screwMountTopLeft)\
    .union(screwMountBottomRight).union(screwMountBottomLeft)

show_object(box)

実行して半透明にすると、このようになります。


モデルの透明度はモデルを選択 -> Viewタブを選択 -> Transparentの値で変更できます。


View -> Panels -> Report Viewを選択してレポートビューを出しておくと、不具合の情報が見れて便利です、



箱の大きさを変えたいときは変数の値を変えれば良いので、特定の法則でいろんな大きさの箱を作りたいときなどに役立ちそうです。

まとめ

CadQueryでスクリプトを書き、3Dモデルを作成できました。

何かの参考になれば嬉しいです。

変更履歴

2018.10.16 レポートビューの表示方法を追加しました。

0 件のコメント :