【FreeCAD使い方講座】Pythonコンソールから操作する方法① ~ 簡単なモデルを生成・保存する


※ 当ページには【広告/PR】を含む場合があります。
2021/02/09
2022/08/18
【FreeCAD使い方講座】Draftでべシェ曲線・Bスプライン曲線を描く〜Pythonコンソールの使い方②




FreeCADの使い方に関する書籍は洋書では目にするのですが、邦書になるとなかなか数が少ないのが難点です。 更にいうと、FreeCADの基礎をまとめた書籍さえ少ないので、Pythonスクリプトによる対話型操作のモデリングなんてのは更に情報を仕入れにくい状況にあります。
時間がある時に整理しておきたいなとずっと思っていたのですが、FreeCADの3dモデル作成の大きなアドバンテージであるPythonコンソールからの対話的な操作方法を細かく解説してみるコーナーです。
初回の今回はとりあえずPythonコンソールの立ち上げと、FreeCADでいうところの対話的な操作とやらの雰囲気を説明出来たらいいなと考えています。

合同会社タコスキングダム|蛸壺の技術ブログ
【FreeCAD初心者ガイド】SVG画像から印鑑を3dモデリングして光学3dプリンターで出力する

FreeCADでSVG画像から印鑑の3dモデルの作成し、光学形成の3dプリンターを利用するまでの手順をまとめてご紹介します。


Pythonスクリプティング ~ 3Dモデリングを極限まで効率化する



無償で使える工業製品向けのモデリングソフトウェアといえば、日本で圧倒的な知名度を誇っているのがAutodeskの「Fusion 360」と言われていますが、海外の方に目を向けると、かなり多種多様なフリーウェアがあり、みなさん思い思いでお気に入りのものを使っているようです。
とはいえ、3Dモデリングにおいて手動では作成しにくい、もしくは到底作成不可能な図形というものがあり、その場合には機械的にノードの座標値を計算してメッシュを張っていくという操作が必要になるシーンがあります。
パラメトリック・モデラーを謳っている
FreeCAD であれば、Pythonのプログラミングの知識は多少必要になるものの、高度な3dモデルの作成を可能としてくれる数少ないフリーソフトではないかと思います。
ということで、まず今回は、Pythonスクリプティングによる3Dモデル作成の導入編としてFreeCADの対話的な操作で簡単な例を挙げて説明していこうかと思います。


利用例 ~ 対話型でモデルを作る・保存する



今回はPythonコンソールを直にコマンドを一行づつ入力していく感じの
言語対話的モデリング をやってみます。

FreeCAD起動 〜 Pythonコンソールの表示



まずは利用するFreeCADのバージョンですが、安定版の0.18を利用しています。

合同会社タコスキングダム|蛸壺の技術ブログ


ついでにですが、トップのメニューバーから
[ヘルプ] をみると、Pythonスクリプトの技術リファレンスとして以下の2つのリンクが利用できます。

合同会社タコスキングダム|蛸壺の技術ブログ
Python スクリプト ドキュメント のほうは Power users hub というWiki内のドキュメントにリンクされています。
このページの中ほどからPythonスクリプトのチュートリアルなどに関する解説が載っているようです。

合同会社タコスキングダム|蛸壺の技術ブログ


もう一つの
Python モジュールのマニュアル では、FreeCAD内で使う関連モジュールのAPIリファレンスにリンクしています。

合同会社タコスキングダム|蛸壺の技術ブログ


慣れてくるとこちらの方を重宝するかもしれません。
なお、これはオンラインのドキュメントではなく、内部のヘルプドキュメントをブラウザ表示しているようです。 なのでFreeCADのプログラムを立ち上げている状態でないと閲覧はできないことに注意してください。
さて、FreeCADの初回起動時などは、Pythonコンソールが非表示になっている場合があります。 このコンソールを立ち上げるためには、
[表示] > [パネル] > [Pythonコンソール] をチェックします。

合同会社タコスキングダム|蛸壺の技術ブログ


ではここから3dモデルを対話的に作成していきます。

簡単なモデルの作成



複雑な操作になるとpyファイルにスクリプトをまとめて実行するやり方を行いますが、今回は簡単な操作の説明を順に説明しますので、一行一行をコンソールに手で入力していきます。
まずはコアモジュール
FreeCAD を読み込みます。

            import FreeCAD

        

そして新規ドキュメント(FCStdファイルの本体)を作成します。

            App.newDocument("my_doc")

        

これが実行されると左のツリービューのモデルに
my_doc という空のドキュメントが新規に追加されるはずです。

合同会社タコスキングダム|蛸壺の技術ブログ


このドキュメントに基本図形を追加してみます。

            App.ActiveDocument.addObject("Part::Cylinder", "cylinder_1")

        

こうすることで現在アクティブになっているドキュメントのインスタンスに、
cylinder という空の円柱の部品が付与されます。
少し解説しますと、
App が現在起動しているFreeCADプログラムの本体を指しており、具体的には FreeCADGui クラスのインスタンス(実体)になります。
このAppの持つ
ActiveDocument プロパティから現在アクティブになっているドキュメントを取得します。
ここから3dオブジェクトをドキュメントに追加したい場合、
addObject 、既にあるオブジェクトを操作・取得したい場合、 getObject などを使ってドキュメントを編集するのですが、如何せんこの辺のAPIリファレンスの出来が非常に悪いのでどう使って良いものかがユーザーとしては悩ましいのが残念なところです。
詳しく知りたい方は
FreeCAD source documentation から色々な情報が探れますが、ここもソースコードにリンク切れな状態のまま放置されていることが多く、あまり親切な作りをされておりません。
なお、ドキュメントは
App::Document クラスのインスタンスで、addObjectなどのメンバ関数の記載は この辺 にちょこっとあるだけなので、関数の引数なども用法をよく読んで使いましょう。
ちなみに今回は円柱をターゲットにオブジェクト新規作成しました。
ドキュメント内の3Dオブジェクトは
App::DocumentObject クラスのインスタンスであり、そのメンバ関数の excute から指定されるプロパティ値で、どのように操作したいのかを選択するような使い方をしているようです。
つまりはaddObject関数に
Part::Cylinder というプロパティを指定すると円柱が追加される、と解釈されるのですが、なんとも分かりずらい仕様です。
さて、作業を続けます。 新規に3Dオブジェクトを追加した時点では寸法情報がデフォルト設定になっているので、何も図形が表示されていません。
そこでドキュメントの再描画にあたる
recompute を呼び出してみます。

            App.ActiveDocument.recompute()

        

すると再描画処理で画面が更新され、新規に追加した円柱が表示されました。

合同会社タコスキングダム|蛸壺の技術ブログ


寸法がデフォルトのままではつまらないので、円柱の寸法を変更してみます。
以下のように、
cylinder_1 のオブジェクトをgetObjectで取得し、寸法のプロパティ値を変えてみます。

            cyl_1 = FreeCAD.getDocument("my_doc").getObject("cylinder_1")
cyl_1.Radius = '20 mm'
cyl_1.Height = '12 mm'

        

このプロパティ値の変更は即時に画面に反映され、以下のような円柱にすることができました。

合同会社タコスキングダム|蛸壺の技術ブログ


なお、
Cylinder の固有のプロパティ値は左のツリービューの プロパティ から確認できます。


ドキュメントの保存



仕上がったFreeCADのドキュメントを保存する際にも、コンソールから保存出来る機能があるので、先程の
my_doc をローカルに保存してみます。
保存の際にはドキュメントの
saveAs メソッドを利用できます。

            App.getDocument("my_doc").saveAs("/home/hoge/デスクトップ/test.FCStd")

        

saveAsを使う際の注意点としては、保存したいディレクトリまでの絶対パスを与えてあげると混乱が少なくて済みます。 このサンプルでは現在利用中のDebian Linux上のデスクトップに保存したときの設定です。
相対パスを使うと、FreeCADがインストールされている場所がシステム環境によってまちまちですので、保存した場所を忘れてしまうと、ファイルを探す手間がかかります。
以上でFreeCADにおける対話的な操作で、モデルの生成から保存までを一通りできるようになったかと思います。


もっとPythonスクリプトに親しむ



先程の節でも触れましたが、FreeCADのPythonスクリプトのためのAPIリファレンスの内容はかなり完成度が低く、ほぼソースコードの実装を読み込んでいるのと大差がありません。
なので、アレをこうしたい、ソレをこうしたい...というときにどの関数を使ったらいいものかリファレンスを眺めていても行き詰まると思います。
そこで、お目当てのPythonスクリプトの処理内容を知るのに一番手っ取り早い方法は、
実際に手でその操作をやってみること です。
一例として先程のシリンダーの追加の操作相当のことを手動でやってみましょう。
適当なドキュメントを新規作成させた後で、
[Part] モジュールに切り替えて、円柱形のアイコンがありますので、このボタンを押すとシリンダーのモデルが生成する操作になります。

合同会社タコスキングダム|蛸壺の技術ブログ


このとき、Pythonコンソールも表示させておくのがポイントで、実際にシステム側がバックグランド行った処理がトレースできるようになっています。

合同会社タコスキングダム|蛸壺の技術ブログ


手動で行った操作を詳細を実際に確認することで、例えば円柱を追加するための最低限のスクリプトは

            App.ActiveDocument.addObject("Part::Cylinder","Cylinder")
App.ActiveDocument.recompute()

        

であることが分かります。
これはAPIリファレンスを紐解くより圧倒的に早いので、これからPythonスクリプトでFreeCADによる3Dモデリングしたい方には必須のテクニックになります。


まとめ



今回の記事では以下の主に以下の内容を解説しました。

            + Pythonコンソールからドキュメントを新規作成する
+ ドキュメントにPrimitiveなモデルを追加する
+ ドキュメントをコマンドからローカルに名前を付けて保存する
+ Pythonスクリプトの構築のための調べ方

        

基本的には、FreeCADのPythonスクリプトの真髄は、
人の手でやっていた操作をテキストで写し取る ことに他ならないのですが、そこにはモデリングする人の地道で泥臭い努力が必要になってくることを念頭においておかれたほうがいいかもしれません。
次回以降は、もっと突っ込んで実用的なPythonスクリプティングの話ができたら良いなと思っています。

参考サイト

FreeCADPython:入門Python3スクリプトでFreeCADモデリング(Ubuntu18.04)