LoginSignup
1
3

More than 3 years have passed since last update.

FreeCAD 0.18をPython2スクリプトで実行するときのメモ(Ubuntu18.04)

Last updated at Posted at 2019-06-17

Salome-MecaFrontISTR など、オープンソースの構造解析ソフト が近年充実してきていますね。そんなソフトを使ってFEM解析を大量に行うときに、3Dモデルを作り直すのが本当に手間なので、PythonスクリプトでFreeCAD操作を自動化 してしまおうという試みです。
自動化自体については別記事で紹介するとして、今回は、FreeCADのバージョンを0.17から最新の0.18にアップグレードした事で、以前から使っていたPython2で書いたモデル化スクリプトが使えなくなってしまったので、その解決方法の備忘録として残しておきます。

対象

Python2スクリプトでFreeCAD 0.18を操作したい人向け。
Python3で操作したいよ!という人はこちらを参考にして下さい。

Qiita
-Python3スクリプトでFreeCADモデリング(Ubuntu18.04)

環境

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

インストール

FreeCAD 0.18のpython2パッケージとライブラリをインストールします。

$ sudo apt install freecad-common freecad-python2 libfreecad-python2-0.18

インストール先のディレクトリ(/usr/lib)にfreecadfreecad-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のマクロを利用して作成しています。
以下のコードでは、スプレッドシートから寸法パラメータの変更ができるように、事前にエイリアスの設定をしておく必要があります。

テストとして適当に作った平板の厚さと幅を変更してみます。

param_b.py
#_*_ 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

結果

元の形状
image.png

実行後
image.png

図の縮尺は違いますが、うまく寸法変更できています。
以前使っていたPythonスクリプトを何とか再利用することができました。

Python2はサポート終了が迫っていますので、3系への移行作業は進めていかなければなりませんね。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3