外部 CAD (Solidworks) 連携
PyFemtet では外部 CAD (Solidworks) で作成したモデルを Femtet にインポートしたモデルにおいても、パラメトリック最適化を実行することができます。
Femtet の応力解析ソルバーを用いて 外部 CAD (Solidworks) でパラメトリックモデリングを行った H 型鋼について 体積を最小化しつつ 変位を最小にする 例題を解説します。
注釈
サンプルコード及び実行結果以外の項目は 外部 CAD (NX) 連携 とほぼ同じです。
サンプルファイル
注釈
サンプルモデル と サンプルプロジェクト を同じフォルダに配置し、 プロジェクトを Femtet で開いたまま、 サンプルコード をダブルクリックして実行してください。
FEM 問題としての詳細
モデルの外観 (解析条件)
fix … 完全固定
load … -Z 方向の荷重 (1N)
mirror … XZ 平面対称
設計変数
モデルの外観 (設計変数)
変数名 |
説明 |
|---|---|
A |
ウェブ板厚 |
B |
フランジ板厚 |
C |
フランジ曲げ |
サンプルコード
cad_ex01_SW.py
1"""外部 CAD (SOLIDWORKS) 連携
2
3Femtet の応力解析ソルバ、および
4Dassault Systemes 社製 CAD ソフト SOLIDWORKS を用いて
5軽量かつ高剛性な H 型鋼の設計を行います。
6
7事前準備として、下記の手順を実行してください。
8- SOLIDWORKS のインストール
9- C:\temp フォルダを作成する
10 - Note: SOLIDWORKS が .x_t ファイルをこのフォルダに保存します。
11- 以下のファイルを同じフォルダに配置
12 - cad_ex01_SW_jp.py (このファイル)
13 - cad_ex01_SW.SLDPRT
14 - cad_ex01_SW_jp.femprj
15"""
16
17import os
18
19from win32com.client import constants
20
21from pyfemtet.opt import FEMOpt
22from pyfemtet.opt.interface import FemtetWithSolidworksInterface
23from pyfemtet.opt.exceptions import ModelError
24
25
26here, me = os.path.split(__file__)
27os.chdir(here)
28
29
30def von_mises(Femtet):
31 """モデルの最大フォン・ミーゼス応力を取得します。
32
33 Note:
34 目的関数または制約関数は、
35 第一引数としてFemtetを受け取り、
36 戻り値としてfloat型を返す必要があります。
37
38 Warning:
39 CAD 連携機能では、意図しない位置に境界条件が設定される可能性があります。
40
41 この例では、境界条件が意図したとおりに割り当てられている場合、
42 最大変位は常に負になります。最大変位が正の場合、境界条件の割り当てが
43 失敗したとみなし、ModelError を送出します。
44
45 最適化中に ModelError、MeshError、または SolveError が発生した場合、
46 最適化プロセスは試行を失敗とみなし、次のトライアルにスキップします。
47 """
48
49 # 簡易的な境界条件の正しさチェック
50 dx, dy, dz = Femtet.Gogh.Galileo.GetMaxDisplacement_py()
51 if dz >= 0:
52 raise ModelError('境界条件の設定が間違っています。')
53
54 # ミーゼス応力計算
55 Gogh = Femtet.Gogh
56 Gogh.Galileo.Potential = constants.GALILEO_VON_MISES_C
57 succeed, (x, y, z), mises = Gogh.Galileo.GetMAXPotentialPoint_py(constants.CMPX_REAL_C)
58
59 return mises
60
61
62def mass(Femtet):
63 """モデルの質量を取得します。"""
64 return Femtet.Gogh.Galileo.GetMass('H_beam')
65
66
67def C_minus_B(Femtet, opt):
68 """C 寸法と B 寸法の差を計算します。
69
70 別の例では、次のスニペットを使用して設計変数にアクセスします。
71
72 A = Femtet.GetVariableValue('A')
73
74 ただし、CAD 連携機能を使用する場合、設計変数が .femprj ファイルに
75 設定されていないため、この方法は機能しません。
76
77 CAD 連携機能を使用する場合、以下の方法で設計変数にアクセスすることができます。
78
79 # add_parameter() で追加したパラメータの変数名をキーとする辞書を得る方法
80 params: dict = opt.get_parameter()
81 A = params['A']
82
83 又は
84
85 # add_parameter() で追加した順のパラメータの値の配列を得る方法
86 values: np.ndarray = opt.get_parameter('values')
87 A, B, C = values
88
89 目的関数と拘束関数は、最初の引数の後に任意の変数を取ることができます。
90 FEMOpt のメンバ変数 opt には get_parameter() というメソッドがあります。
91 このメソッドによって add_parameter() で追加された設計変数を取得できます。
92 opt を第 2 引数として取ることにより、目的関数または拘束関数内で
93 get_parameter() を実行して設計変数を取得できます。
94 """
95 A, B, C = opt.get_parameter('values')
96 return C - B
97
98
99if __name__ == '__main__':
100
101 # SW-Femtet 連携オブジェクトの初期化
102 # この処理により、Python プロセスは Femtet に接続を試みます。
103 fem = FemtetWithSolidworksInterface(
104 sldprt_path='cad_ex01_SW.SLDPRT',
105 open_result_with_gui=False,
106 )
107
108 # FEMOpt オブジェクトの初期化 (最適化問題とFemtetとの接続を行います)
109 femopt = FEMOpt(fem=fem)
110
111 # 設計変数を最適化問題に追加 (.SLDPRT ファイルに登録されている変数を指定してください)
112 femopt.add_parameter('A', 10, lower_bound=1, upper_bound=59)
113 femopt.add_parameter('B', 10, lower_bound=1, upper_bound=40)
114 femopt.add_parameter('C', 20, lower_bound=5, upper_bound=59)
115
116 # 拘束関数を最適化問題に追加
117 femopt.add_constraint(fun=C_minus_B, name='C>B', lower_bound=1, args=(femopt.opt,))
118
119 # 目的関数を最適化問題に追加
120 femopt.add_objective(fun=von_mises, name='von Mises (Pa)')
121 femopt.add_objective(fun=mass, name='mass (kg)')
122
123 # 最適化を実行
124 femopt.set_random_seed(42)
125 femopt.optimize(n_trials=20)
サンプルコードの実行結果
Sldworks_ex01.py の実行結果。 横軸が ミーゼス応力 、 縦軸が 質量 です。
20 回の反復計算の結果、 ミーゼス応力と質量のパレート集合が得られます。
注釈
Femtet, PyFemtet および依存する最適化エンジンのバージョンにより、結果は多少異なる場合があります。