Python3スクリプトでFreeCADモデリング（Ubuntu18.04）

##はじめに
Python3のスクリプトを使って、FreeCAD上でモデルの寸法パラメータを変更する方法のメモです。
基本的な形状はGUIで作っておいて、寸法だけをPythonスクリプトで変更します。
ゼロからPythonでモデル作成するわけではありませんので注意。

##対象
Python3スクリプトでFreeCAD(0.18)を操作したい人。
まだPython2を使っている人はこちらも参考にして下さい。
>Qiita
> [-FreeCAD 0.18をPython2スクリプトで実行するときのメモ（Ubuntu18.04）][link-1]
[link-1]:https://qiita.com/hiro_kuramoto/items/217503240ceacf86dbec

##インストール方法とか操作方法とか
以下のサイトが参考になります。
>FreeCAD 使い方メモ
>[-FreeCAD Linux でのインストール方法][link-2]
[link-2]:https://www.xsim.info/articles/FreeCAD/HowTo/Install-on-Linux.html

##環境
OS Ubuntu 18.04
FreeCAD 0.18.4
Python 3.6.9

##準備
まずは、適当に形状を作っておきます。今回は直方体の寸法を変更していきます。
変更したいパラメータを x, y, z とします。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439095/f2b50cde-80d4-2b82-d8c9-3d7da0cbeb19.png)

次に、FreeCADのスプレッドシートで x, y, z のパラメータを入力しておきます。ここではB1,B2,B3セルに値を入れています。(A1,A2,A3は目印です。無くても問題ありません)
![図6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439095/e763c16d-44a9-bdc7-ea31-b6788a665fee.png)

ここで、モデルとパラメータを紐付けするために、エイリアスの設定もしておきます。
ここで設定したエイリアス名を使って、後ほどパラメータ変更をしていきます。
![図7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439095/992dd9b4-f482-1a6f-f6d7-11e975bd1a3f.png)

最後に、モデルとスプレッドシートのパラメータ値を紐付けます。
モデル寸法の設定画面から、スプレッドシートのエイリアスを指定します。
![図8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439095/b67fdf5d-4d07-e329-3f8b-4a484fc2713a.png)

準備完了です。

##スクリプト
このスクリプトをコンソール画面から実行してください。
内容は、スプレッドシートで設定したパラメータの値を変更→中間ファイル形式(ここではSTEP形式)で保存するスクリプトです。
スクリプト自体はFreeCADのマクロ機能を使って記録したものです。再利用できるようにクラス化をしていますが、モジュールのインポートが省略されているため、そのままでは使えません。
そこで、FreeCADのモジュール（FreeCAD.soとImport.so）をインポートするために、FREECADPATHでモジュール検索パスを追加しています。
各自のインストール状況によってパスは変わると思いますので、確認の上設定して下さい。

```python
FREECADPATH = "/usr/lib/freecad-python3/lib"
import sys
sys.path.append(FREECADPATH)
import FreeCAD
import Import

class FreecadParams:
    """FreeCADのスプレッドシート操作＆STEP形式で保存をクラス化"""
    def __init__(self, fc):
        self.fcpath = fc # FreeCADモデルの保存場所
        self.stpath = st # STEPファイルの保存場所

    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"))  # 押し出し3Dモデルの名称“Pad”
        del __objs__

    def export_step(self):
        '''STEP形式で保存'''
        __objs__=[]
        __objs__.append(FreeCAD.getDocument("original_model").getObject("Pad"))
        Import.export(__objs__, self.stpath)
        del __objs__

if __name__ == '__main__':
    fcpath = '/（ワークディレクトリ）/original_model.FCStd' # FreeCADモデルの保存場所
    stpath = '/（ワークディレクトリ）/original_model.step'  # STEPファイルの保存場所
    f = FreecadParams(fcpath, stpath)
    f.import_fcstd()
    f.set_value('x', '10')
    f.set_value('y', '40')
    f.set_value('z', '20')
    f.export_step()  
```
##結果
寸法が変更されたモデルをSTEP形式で保存することができます。
自動で寸法を変更させながら、繰り返しFEM解析をする事などに応用が可能です。
![図9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439095/ebe7a0f8-5f25-a5c3-d2e2-e5e5846f7b6e.png)