Salome-Meca やFrontISTR など、オープンソースの構造解析ソフト が近年充実してきていますね。そんなソフトを使ってFEM解析を大量に行うときに、3Dモデルを作り直すのが本当に手間なので、PythonスクリプトでFreeCAD操作を自動化 してしまおうという試みです。
自動化自体については別記事で紹介するとして、今回は、FreeCADのバージョンを0.17から最新の0.18にアップグレードした事で、以前から使っていたPython2で書いたモデル化スクリプトが使えなくなってしまったので、その解決方法の備忘録として残しておきます。
##対象
Python2スクリプトでFreeCAD 0.18を操作したい人向け。
Python3で操作したいよ!という人はこちらを参考にして下さい。
Qiita
[-Python3スクリプトでFreeCADモデリング(Ubuntu18.04)][link-2]
[link-2]:https://qiita.com/hiro_kuramoto/items/3f1253002fc2ab7d46ab
##環境
OS Ubuntu 18.04
Python 2.7.15(Anaconda)
##解決方法
そもそもFreeCAD 0.18からはPython3に移行した事により、0.17までのPython2スクリプトでは動作してくれません。Ubuntuには、 freecad-python2(2系)とfreecad-python3(3系)の 2つのパッケージが用意されており、通常何も考えずにインストールすると、3系のパッケージがインストールされるようです。
今回のような場合、2系のパッケージとそれ用のライブラリをインストールすることで、無事解決しました。
参考にしたのは下記のサイト。
FreeCAD FORUM
[-FreeCAD 0.18 and Python3][link-1]
[link-1]:https://forum.freecadweb.org/viewtopic.php?t=35577
##インストール
FreeCAD 0.18のpython2パッケージとライブラリをインストールします。
$ sudo apt install freecad-common freecad-python2 libfreecad-python2-0.18
インストール先のディレクトリ(/usr/lib)にfreecadとfreecad-python2という2つのディレクトリができます。
##リンクの作成
/usr/lib/freecadのディレクトリ内にあるModのシンボリックリンクを**/usr/lib/freecad-python2**のディレクトリにも作成します。
ちなみに元ファイルは /usr/share/freecad 内にあります。
$ sudo ln -s /usr/lib/freecad/Mod /usr/lib/freecad-python2/Mod
準備は以上です。
##テスト
テストに用いたコードは以下の通りです。コマンドラインから実行することで、FreeCADを呼び出し、スプレッドシートの寸法値を変更してSTEP形式で保存してくれます。スクリプトのほとんどはFreeCADのマクロを利用して作成しています。
以下のコードでは、スプレッドシートから寸法パラメータの変更ができるように、事前にエイリアスの設定をしておく必要があります。
テストとして適当に作った平板の厚さと幅を変更してみます。
#_*_ coding:utf=8 _*_
#FreeCADのスプレッドシート操作&STEP形式で保存をクラス化
FREECADPATH = "/usr/lib/freecad/lib"
import sys
sys.path.append(FREECADPATH)
import FreeCAD
import Import
class FreecadParams:
"""set parameters for FreeCAD and output STEP data"""
def __init__(self, fc, st):
self.fcpath = fc
self.stpath = st
def import_fcstd(self):
FreeCAD.open(self.fcpath)
def set_value(self, params, value):
FreeCAD.setActiveDocument("original_model")
FreeCAD.ActiveDocument.Spreadsheet.set(params, value)
FreeCAD.ActiveDocument.recompute()
__objs__=[]
__objs__.append(FreeCAD.getDocument("original_model").getObject("Pad"))
del __objs__
def export_step(self):
__objs__=[]
__objs__.append(FreeCAD.getDocument("original_model").getObject("Pad"))
Import.export(__objs__, self.stpath)
del __objs__
if __name__ == '__main__':
fcpath = "/home/Work/original_model.fcstd"
stpath = "/home/Work/original_model.step"
f = FreecadParams(fcpath,stpath)
f.import_fcstd()
f.set_value('a', '5') #厚さ
f.set_value('b', '30') #幅
f.export_step()
ターミナルから実行します
$ python param_b.py
図の縮尺は違いますが、うまく寸法変更できています。
以前使っていたPythonスクリプトを何とか再利用することができました。
Python2はサポート終了が迫っていますので、3系への移行作業は進めていかなければなりませんね。