#'21/02/13更新
本記事ではpandasを使用しない雛形コードを載せました。この理由は、FreeCAD内のPythonのみを使用することでpythonのver違いの干渉によるエラーを回避するためです(FreeCADのインストール方法は次のリンク先に記載していますhttps://hk29.hatenablog.jp/entry/2020/07/04/122953)。Linuxの場合の雛形コードは次のリンク先ですhttps://hk29.hatenablog.jp/entry/2021/02/13/235536)。
以降では、本題のPythonスクリプトについて説明します。
FreeCADで作成したCADデータ(.FCStdファイル)を元に、Pythonスクリプトで自動で寸法を変更し、CADファイルの汎用フォーマット.stepで保存してゆく仕様です。下図はFreeCADで作成した3次元構造の例です。

下図のように、Sketcherワークベンチで定義した寸法を自動で変更したいとします。

こういった場合、下図のようにSpreadsheetワークベンチで定義した値をリンクしておきます。これにより、変数をひとつの表で一元管理できます。この方法は次のリンク先が参考になります。FreeCAD 寸法をスプレッドシートで管理する - XSim

次に、寸法をパラメータとした水準表をcsvファイルで下図のように作成します。一番左の列は水準Noです。csvファイルに記載する列名は、FreeCADのSpreadsheetのプロパティにあるエイリアスで定義した名称と同じです。大文字小文字は区別されることに注意。

大量の水準を作成したい場合は次のリンクを参考下さい。VBA エクセルで水準表を作成する - PythonとVBAで世の中を便利にする
PythonのFreeCADライブラリをインポートするため、本コード内でFREECADPATHにFreeCADのbinフォルダの絶対パスを通します。下図がその例で、Pythonスクリプトの冒頭で定義します。

本スクリプトのPython実行には、FreeCAD内にあるPythonの絶対パスで指定する
下図は、実行例です。00_freecad2.pyが本雛形コードのファイル名でその左側にある長いのがFreeCADにあるPythonのパスです。ここで、そのパスの両端をダブルクォーテーション""で挟むことでパス内にスペース等があっても確実に指定できます。(図中のprint出力は、csvファイルをpandasでなくて読み込んだ結果です)
その後、最終的に下図のようにCADファイルのひとつである汎用フォーマットの.stepで複数出力します。

下図は、上記8つのCADファイルです。異なる寸法の構造が作成されたことがわかります。

■本プログラム
FREECADPATH = r'D:\00_backup\01_new\FreeCAD_0.19.21280-Win-Conda_vc14.x-x86_64\bin'
import os, sys
sys.path.append(FREECADPATH)
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]
self.output_path = output_dirpath
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__
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():
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)
for i, data_list in enumerate(list_of_data_list, start=1):
f = Make_CADfiles(input_path, output_dirpath)
f.load_fcstd_file()
check_params = []
for column_name, data in zip(column_name_list, data_list):
f.replace_param(column_name, str(data) + 'mm')
check_params.append((column_name, str(data)))
f.export_cadfile(i)
print(i, check_params)
del f
if __name__ == '__main__':
input_path ='./test7.FCStd'
output_dirpath ='./CAD_stepfiles'
parameter_list_path = 'parameter_list.csv'
my_object = 'BooleanFragments'
main()
print('finished')
最後に、Python向けのFreeCADモジュールの説明は、FreeCADのGUIのメニューバーにある「ヘルプ>Pythonモジュールのマニュアル」で調べることが出来ます。
以上
<広告>
リンク