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


2021/02/09

FreeCADの話題としてはなんだかんだあって久々の更新です。

FreeCADの使い方に関する書籍は洋書では目にするのですが、邦書になるとなかなか数が少ないのが難点です。更にいうと、FreeCADの基礎をまとめた書籍さえ少ないので、Pythonスクリプトによる対話型操作のモデリングなんてのは更に情報を仕入れにくい状況にあります。

時間がある時に整理しておきたいなとずっと思っていたのですが、FreeCADの3dモデル作成の大きなアドバンテージであるPythonコンソールからの対話的な操作方法を細かく解説してみるコーナーです。

初回の今回はとりあえずPythonコンソールの立ち上げと、FreeCADでいうところの対話的な操作とやらの雰囲気を説明出来たらいいなと考えています。


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)

記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。