外部 CAD (NX) 連携

PyFemtet では外部 CAD (NX) で作成したモデルを Femtet にインポートする解析モデルにおいても、パラメトリック最適化を行うことができます。

サンプルファイル

注釈

サンプルモデルサンプルプロジェクト を同じフォルダに配置し、 プロジェクトを Femtet で開いたまま、 サンプルコード をダブルクリックして実行してください。

FEM 問題としての詳細

../../_images/NX_ex01_analysis.png

モデルの外観 (解析条件)

  • fix … 完全固定

  • load … -Z 方向の荷重 (1N)

  • mirror … XZ 平面対称

設計変数

../../_images/NX_ex01_model_dsgn.png

モデルの外観 (設計変数)

変数名

説明

A

ウェブ板厚

B

フランジ板厚

C

フランジ曲げ

目的関数

  • Z 方向最大変位(0 にする)

  • 体積(最小にする)

サンプルコード

cad_ex01_NX.py
  1"""外部 CAD (NX) 連携
  2
  3Femtet の応力解析ソルバ、および
  4Siemens 社製 CAD ソフト NX を用いて
  5軽量かつ高剛性な H 型鋼の設計を行います。
  6
  7事前準備として、下記の手順を実行してください。
  8- NX のインストール
  9- C:\temp フォルダを作成する
 10    - Note: NX が .x_t ファイルをこのフォルダに保存します。
 11- 以下のファイルを同じフォルダに配置
 12    - cad_ex01_NX_jp.py (このファイル)
 13    - cad_ex01_NX.prt
 14    - cad_ex01_NX_jp.femprj
 15"""
 16
 17import os
 18
 19from win32com.client import constants
 20
 21from pyfemtet.opt import FEMOpt
 22from pyfemtet.opt.interface import FemtetWithNXInterface
 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    # NX-Femtet 連携オブジェクトの初期化
102    # この処理により、Python プロセスは Femtet に接続を試みます。
103    fem = FemtetWithNXInterface(
104        prt_path='cad_ex01_NX.prt',
105        open_result_with_gui=False,
106        export_curves=False,
107        export_surfaces=False,
108        export_solids=True,
109        export_flattened_assembly=False,
110    )
111
112    # FEMOpt オブジェクトの初期化 (最適化問題とFemtetとの接続を行います)
113    femopt = FEMOpt(fem=fem)
114
115    # 設計変数を最適化問題に追加 (.prt ファイルに登録されている変数を指定してください)
116    femopt.add_parameter('A', 10, lower_bound=1, upper_bound=59)
117    femopt.add_parameter('B', 10, lower_bound=1, upper_bound=40)
118    femopt.add_parameter('C', 20, lower_bound=5, upper_bound=59)
119
120    # 拘束関数を最適化問題に追加
121    femopt.add_constraint(fun=C_minus_B, name='C>B', lower_bound=1, args=(femopt.opt,))
122
123    # 目的関数を最適化問題に追加
124    femopt.add_objective(fun=von_mises, name='von Mises (Pa)')
125    femopt.add_objective(fun=mass, name='mass (kg)')
126
127    # 最適化を実行
128    femopt.set_random_seed(42)
129    femopt.optimize(n_trials=20)

サンプルコードの実行結果

../../_images/NX_ex01_result.png

NX_ex01.py の実行結果。 横軸が ミーゼス応力、 縦軸が 質量 です。

20 回の反復計算の結果、 ミーゼス応力と質量のパレート集合が得られます。

注釈

Femtet, PyFemtet および依存する最適化エンジンのバージョンにより、結果は多少異なる場合があります。