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

**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つのパッケージが用意されており、通常何も考えずにインストールすると、３系のパッケージがインストールされるようです。
今回のような場合、**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のマクロ**を利用して作成しています。
以下のコードでは、スプレッドシートから寸法パラメータの変更ができるように、事前に**エイリアス**の設定をしておく必要があります。

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

```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439095/2fce5136-814d-4f5b-54bf-f4b0e2556155.png)

実行後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439095/d7d26f08-f6f7-a630-d873-b3fa93b3909a.png)

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

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