Python 「FreeCAD」のAppImageでpython操作する【Linux用】

 本記事では、Linux環境下におけるFreeCADのAppImageでpython操作する雛形コードを載せました。(FreeCADのインストール方法は次のリンクに載せています。https://hk29.hatenablog.jp/entry/2020/07/04/122953。そして、本プログラムの動作は次のリンク先のWindows版と同じです。https://hk29.hatenablog.jp/entry/2021/01/25/235943

 実行コマンドは、次のようにします。「00_freecad2.py」は本プログラム(pythonスクリプトのファイル名)です。

$ [FreeCADのAppImageのパス] python 00_freecad2.py

下図がその実施例です。pythonはAppImage内のpythonを指定しています。図中にいくつかパスが表示されているのは、本プログラム中でFreeCADのAppImage内のpythonライブラリへのパスを検索して通した結果です。

f:id:HK29:20210214000933p:plain

■本プログラム

import os, sys
# FreeCADのAppImage内のpythonのライブラリパスをsys.path.appendで追記する
for mypath in sys.path:
    path_taple = os.path.split(mypath)
    dir_path = path_taple[0]
    check_str = os.path.split(dir_path)[1]
    if check_str == 'lib':
        sys.path.append(dir_path)
        break
for mypath in sys.path:
    print(mypath)

import FreeCAD
import Import

class Make_CADfiles:
    # 初期化(インスタンス化)
    def __init__(self, input_path, output_dirpath):
        self.input_path = input_path
        num = os.path.basename(input_path).rfind('.')
        self.file_name = os.path.basename(input_path)[:num]
        #print(self.file_name)
        self.output_path = output_dirpath

    # FreeCADファイルを読み込む(.FCStd)
    def load_fcstd_file(self):
        FreeCAD.open(self.input_path)

    # パラメータ変更
    def replace_param(self, param, value):
        FreeCAD.setActiveDocument(self.file_name)
        FreeCAD.ActiveDocument.Spreadsheet.set(param, value)
        FreeCAD.ActiveDocument.recompute()
        __objs__=[]
        __objs__.append(FreeCAD.getDocument(self.file_name).getObject(my_object))
        del __objs__

    # CADファイル出力(.step)
    def export_cadfile(self, num):
        save_file_path = os.path.join(self.output_path, self.file_name + '_' + str(num) + '.step')
        __objs__=[]
        __objs__.append(FreeCAD.getDocument(self.file_name).getObject(my_object))
        Import.export(__objs__, save_file_path)
        del __objs__


def main():
    # csvファイルを読み出し
    with open(parameter_list_path, 'r') as f:
        list_of_data_list = []
        for i, row in enumerate(f, 1):
            row = row.rstrip('\n')
            if i==1:
                column_name_list = row.split(',')[1:]
                print(column_name_list)
            else:
                data = row.split(',')[1:]
                list_of_data_list.append(data)
    print(len(list_of_data_list))
    print(list_of_data_list)

    # csvの行データを順に取り出し
    for i, data_list in enumerate(list_of_data_list, start=1):
        # オブジェクト生成
        f = Make_CADfiles(input_path, output_dirpath)
        # ファイルを読み出し
        f.load_fcstd_file()

        # csvの列方向へループして、パラメータを抽出する
        check_params = []
        for column_name, data in zip(column_name_list, data_list):
            #print(column_name, data)
            # データを置換
            f.replace_param(column_name, str(data) + 'mm')
            check_params.append((column_name, str(data)))

        # ループが終わったとこでCADファイルへ書き出す
        f.export_cadfile(i)
        print(i, check_params)
        
        # オブジェクト削除
        del f


if __name__ == '__main__':
    input_path ='./test7.FCStd' # 雛形のFreeCADファイルパ>ス
    output_dirpath ='./CAD_stepfiles' # 保存するフォルダパス
    parameter_list_path = 'parameter_list.csv' # パラメー>タ記載のcsvファイル
    my_object = 'BooleanFragments' # FreeCADで作成した対象のオブジェクト
          
    main()
    print('finished')

以上

<広告>