pyfemtet 0.1.12__py3-none-any.whl → 0.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pyfemtet might be problematic. Click here for more details.

Files changed (33) hide show
  1. pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.femprj +0 -0
  2. pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.prt +0 -0
  3. pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.py +69 -32
  4. pyfemtet/FemtetPJTSample/gau_ex08_parametric.femprj +0 -0
  5. pyfemtet/FemtetPJTSample/gau_ex08_parametric.py +37 -25
  6. pyfemtet/FemtetPJTSample/her_ex40_parametric.py +57 -35
  7. pyfemtet/FemtetPJTSample/wat_ex14_parallel_parametric.py +62 -0
  8. pyfemtet/FemtetPJTSample/wat_ex14_parametric.femprj +0 -0
  9. pyfemtet/FemtetPJTSample/wat_ex14_parametric.py +61 -0
  10. pyfemtet/__init__.py +1 -1
  11. pyfemtet/opt/_FemtetWithNX/update_model.py +6 -2
  12. pyfemtet/opt/__init__.py +1 -1
  13. pyfemtet/opt/base.py +457 -86
  14. pyfemtet/opt/core.py +77 -17
  15. pyfemtet/opt/interface.py +217 -137
  16. pyfemtet/opt/monitor.py +181 -98
  17. pyfemtet/opt/{_optuna.py → optimizer.py} +70 -30
  18. pyfemtet/tools/DispatchUtils.py +46 -44
  19. {pyfemtet-0.1.12.dist-info → pyfemtet-0.2.1.dist-info}/LICENSE +1 -1
  20. pyfemtet-0.2.1.dist-info/METADATA +42 -0
  21. pyfemtet-0.2.1.dist-info/RECORD +31 -0
  22. pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01 - original.x_t +0 -359
  23. pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.x_t +0 -359
  24. pyfemtet/FemtetPJTSample/fem4 = Femtet(femprj_path=None, model_name=None, connect_method='catch').femprj +0 -0
  25. pyfemtet/FemtetPJTSample/gal_ex11_parametric.femprj +0 -0
  26. pyfemtet/FemtetPJTSample/gal_ex11_parametric.py +0 -54
  27. pyfemtet/FemtetPJTSample/pas_ex1_parametric.femprj +0 -0
  28. pyfemtet/FemtetPJTSample/pas_ex1_parametric.py +0 -66
  29. pyfemtet/FemtetPJTSample/pas_ex1_parametric2.py +0 -68
  30. pyfemtet/tools/FemtetClassConst.py +0 -9
  31. pyfemtet-0.1.12.dist-info/METADATA +0 -205
  32. pyfemtet-0.1.12.dist-info/RECORD +0 -37
  33. {pyfemtet-0.1.12.dist-info → pyfemtet-0.2.1.dist-info}/WHEEL +0 -0
@@ -1,44 +1,81 @@
1
- import numpy as np
1
+ """外部 CAD ソフト NX との連携
2
2
 
3
- from PyFemtet.opt._NX_Femtet import NX_Femtet
4
- from PyFemtet.opt import FemtetOptuna
3
+ 外部 CAD ソフト NX で作成したパラメトリックモデルを
4
+ Femtet にインポートして最適化を行います。
5
5
 
6
- from win32com.client import constants
7
- from win32com.client import Dispatch
6
+ 事前準備として、以下の作業を行ってください。
7
+ - NX_ex01.prt NX_ex01.femprj を同じフォルダに配置する
8
+ - C:\temp フォルダを作成する
9
+ ※ 最適化の実行中に NX から .x_t ファイルがエクスポートされます。
10
+ """
8
11
 
9
12
  import os
13
+ from pyfemtet.opt import FemtetWithNXInterface, OptimizerOptuna
14
+
15
+
16
+ here, me = os.path.split(__file__)
17
+ os.chdir(here)
18
+
10
19
 
11
20
  def disp(Femtet):
12
- '''評価指標を定義する関数は、第一引数に Femtet のインスタンスを取るようにしてください。'''
13
- # Femtet = Dispatch('FemtetMacro.Femtet')
14
- # Femtet.OpenCurrentResult(True)
15
- Gogh = Femtet.Gogh
16
- _, _, ret = Gogh.Galileo.GetMaxDisplacement_py()
21
+ """解析結果から Z 方向最大変位を取得します。
22
+ 目的関数の第一引数は Femtet インスタンスである必要があります。
23
+ """
24
+ _, _, ret = Femtet.Gogh.Galileo.GetMaxDisplacement_py()
17
25
  return ret
18
26
 
27
+
19
28
  def volume(Femtet):
20
- '''評価指標を定義する関数は、第一引数に Femtet のインスタンスを取るようにしてください。'''
21
- Gogh = Femtet.Gogh
22
- _, ret = Gogh.CalcVolume_py([0])
29
+ """解析結果からモデル体積を取得します。
30
+ 目的関数の第一引数は Femtet インスタンスである必要があります。
31
+ """
32
+ _, ret = Femtet.Gogh.CalcVolume_py([0])
23
33
  return ret
24
34
 
25
35
 
26
- if __name__=='__main__':
27
- here, me = os.path.split(__file__)
28
- os.chdir(here)
29
- FEM = NX_Femtet('NX_ex01.prt') # この機能を使う際はエントリポイントをガードしてください。
30
- FEMOpt = FemtetOptuna(FEM)
31
- FEMOpt.add_parameter('A_x', 50, lower_bound=25, upper_bound=95)
32
- FEMOpt.add_parameter('A_y', 45, lower_bound=5, upper_bound=45)
33
- FEMOpt.add_parameter('B_x', 30, lower_bound=25, upper_bound=95)
34
- FEMOpt.add_parameter('B_y', 12, lower_bound=5, upper_bound=45)
35
- FEMOpt.add_parameter('C_x', 90, lower_bound=25, upper_bound=95)
36
- FEMOpt.add_parameter('C_y', 45, lower_bound=5, upper_bound=45)
37
- FEMOpt.add_parameter('Cut_x', 10, lower_bound=5, upper_bound=45)
38
- FEMOpt.add_parameter('Cut_y', 20, lower_bound=5, upper_bound=45)
39
- FEMOpt.add_objective(disp, direction=0)
40
- FEMOpt.add_objective(volume, direction='minimize')
41
-
42
- FEMOpt.set_process_monitor()
43
- FEMOpt.main()
44
-
36
+ def C_minus_B(_, femopt):
37
+ """C 寸法と B 寸法の差を計算します。
38
+
39
+ 拘束関数の第一引数は Femtet インスタンスである必要がありますが、
40
+ この例では使用していません。
41
+
42
+ ほかの例では設計変数にアクセスする際以下のスニペットを用いますが、
43
+ CAD 連携を行う場合、Femtet に設計変数が設定されていないためです。
44
+ A = Femtet.GetVariableValue('A')
45
+
46
+ pyfemtet.opt では目的関数・拘束関数の第二引数以降に任意の変数を設定できます。
47
+ この例では、第二引数に OptimizerOptuna クラスのオブジェクトを取り、
48
+ そのメソッド get_parameter() を用いて設計変数を取得しています。
49
+
50
+ """
51
+ A, B, C = femopt.get_parameter('values')
52
+ return C - B
53
+
54
+
55
+ if __name__ == '__main__':
56
+
57
+ # NX-Femtet 連携オブジェクトを用意
58
+ # ここで起動している Femtet と紐づけがされます。
59
+ fem = FemtetWithNXInterface(
60
+ prt_path='NX_ex01.prt',
61
+ femprj_path='NX_ex01.femprj',
62
+ )
63
+
64
+ # 最適化処理を行うオブジェクトに連携オブジェクトを紐づけ
65
+ femopt = OptimizerOptuna(fem)
66
+
67
+ # 設計変数の設定
68
+ femopt.add_parameter('A', 10, lower_bound=1, upper_bound=59)
69
+ femopt.add_parameter('B', 10, lower_bound=1, upper_bound=40)
70
+ femopt.add_parameter('C', 20, lower_bound=5, upper_bound=59)
71
+
72
+ # 拘束関数の設定
73
+ femopt.add_constraint(C_minus_B, 'C>B', lower_bound=1, args=femopt)
74
+
75
+ # 目的関数の設定
76
+ femopt.add_objective(disp, name='変位', direction=0)
77
+ femopt.add_objective(volume, name='体積', direction='minimize')
78
+
79
+ # 最適化の実行
80
+ femopt.set_random_seed(42)
81
+ femopt.main(n_trials=20, use_lhs_init=False)
@@ -1,34 +1,46 @@
1
- from PyFemtet.opt import FemtetScipy
1
+ """有限長ソレノイドコイルの自己インダクタンス
2
2
 
3
- def L(Femtet):
4
- # L の取得
3
+ gau_ex08_parametric.femprj に対し磁場解析を行い、
4
+ 自己インダクタンスを特定の値にする
5
+ 有限長さソレノイドコイルの寸法を探索します。
6
+ """
7
+
8
+ from pyfemtet.opt import OptimizerOptuna
9
+
10
+
11
+ def inductance(Femtet):
12
+ """Femtet の解析結果から自己インダクタンスを取得します。
13
+
14
+ Femtet : マクロを使用するためのインスタンスです。詳しくは "Femtet マクロヘルプ / CFemtet クラス" をご覧ください。
15
+ 目的関数は第一引数に Femtet インスタンスを取る必要があります。
16
+
17
+ l : 計算された自己インダクタンスです。
18
+ 目的関数は単一の float を返す必要があります。
19
+
20
+ """
5
21
  Gogh = Femtet.Gogh
6
- # コイル名の取得
7
- cName = Gogh.Gauss.GetCoilList()[0]
8
- # インダクタンスの取得
9
- return Gogh.Gauss.GetL(cName, cName)
10
22
 
23
+ # インダクタンスの取得
24
+ cName = Gogh.Gauss.GetCoilList()[0]
25
+ l = Gogh.Gauss.GetL(cName, cName)
26
+ return l # F
11
27
 
12
- # 最適化処理を行うオブジェクトを用意
13
- FEMOpt = FemtetScipy()
14
28
 
15
- # 解析モデルで登録された変数
16
- FEMOpt.add_parameter("h", 3, 1.5, memo='1巻きピッチ')
17
- FEMOpt.add_parameter("r", 5, 3, memo='コイル半径')
18
- FEMOpt.add_parameter("n", 5, 1, 20, memo='コイル半径')
29
+ if __name__ == '__main__':
19
30
 
20
- # インダクタンスが 0.44 uF に近づくようにゴールを設定する
21
- FEMOpt.add_objective(
22
- L,
23
- name='自己インダクタンス',
24
- direction=4.4e-07
25
- )
31
+ # 最適化処理を行うオブジェクトを用意
32
+ femopt = OptimizerOptuna() # ここで起動している Femtet が紐づけされます
26
33
 
27
- # 最適化実行中にその収束状況を表示する(experimental)
28
- FEMOpt.set_process_monitor()
34
+ # 設計変数の登録
35
+ femopt.add_parameter("h", 3, lower_bound=1.5, upper_bound=6, memo='1巻きピッチ')
36
+ femopt.add_parameter("r", 5, lower_bound=1, upper_bound=10, memo='コイル半径')
37
+ femopt.add_parameter("n", 3, lower_bound=1, upper_bound=5, memo='コイル巻き数')
29
38
 
30
- # 最適化の実行 ※実行すると、csv ファイルでの最適化過程の保存が始まります。
31
- FEMOpt.main()
39
+ # インダクタンスが 0.44 uF に近づくようにゴールを設定
40
+ femopt.add_objective(
41
+ inductance, name='自己インダクタンス', direction=0.1e-06
42
+ )
32
43
 
33
- # 最適化過程の一覧表示(最適化終了時点での csv ファイルの内容と同じです)
34
- print(FEMOpt.history)
44
+ # 最適化の実行
45
+ femopt.set_random_seed(42)
46
+ femopt.main(n_trials=20, method='botorch', use_lhs_init=False)
@@ -4,15 +4,12 @@ import numpy as np
4
4
  from scipy.signal import find_peaks
5
5
  from tqdm import tqdm
6
6
 
7
- from pythoncom import com_error
7
+ from pyfemtet.opt import OptimizerOptuna
8
8
 
9
- from PyFemtet.opt import FemtetOptuna
10
9
 
11
- from win32com.client import Dispatch
12
- from win32com.client import constants
13
10
 
14
- # S パラメータ・共振周波数計算用クラス
15
11
  class SParameterCalculator:
12
+ """S パラメータ・共振周波数計算用クラスです。"""
16
13
 
17
14
  def __init__(self):
18
15
  self.freq = []
@@ -22,6 +19,8 @@ class SParameterCalculator:
22
19
  self.minimum_S = None
23
20
 
24
21
  def get_result_from_Femtet(self, Femtet):
22
+ """Femtet の解析結果から周波数と S パラメータの関係を取得します。"""
23
+
25
24
  # 前準備
26
25
  Femtet.OpenCurrentResult(True)
27
26
  Gogh = Femtet.Gogh
@@ -33,7 +32,7 @@ class SParameterCalculator:
33
32
  for mode in tqdm(range(Gogh.Hertz.nMode), '結果取得中'):
34
33
  # Femtet 結果画面のモード設定
35
34
  Gogh.Hertz.Mode = mode
36
- sleep(0.1) # mode 変更が反映されるまでの猶予時間
35
+ sleep(0.01)
37
36
  # 周波数の取得
38
37
  freq = Gogh.Hertz.GetFreq().Real
39
38
  # S パラメータの取得
@@ -47,56 +46,79 @@ class SParameterCalculator:
47
46
  self.S = dB_S_list
48
47
 
49
48
  def calc_resonance_frequency(self):
50
- # S に対して最初のピークを与える freq を計算
49
+ """S に対して最初のピークを与える freq を計算します。"""
51
50
  x = -np.array(self.S)
52
51
  peaks, _ = find_peaks(x, height=None, threshold=None, distance=None, prominence=0.5, width=None, wlen=None, rel_height=0.5, plateau_size=None)
53
- from PyFemtet.opt.core import SolveError
52
+ from pyfemtet.opt.core import SolveError
54
53
  if len(peaks)==0:
55
54
  raise SolveError('ピークが検出されませんでした。')
56
55
  self.resonance_frequency = self.freq[peaks[0]]
57
56
  self.minimum_S = self.S[peaks[0]]
58
57
 
59
58
  def get_resonance_frequency(self, Femtet):
59
+ """共振周波数を計算します。
60
+
61
+ Femtet : マクロを使用するためのインスタンスです。詳しくは "Femtet マクロヘルプ / CFemtet クラス" をご覧ください。
62
+ 目的関数は第一引数に Femtet インスタンスを取る必要があります。
63
+
64
+ f : 計算された共振周波数です。
65
+ 目的関数は単一の float を返す必要があります。
66
+
67
+ """
60
68
  self.get_result_from_Femtet(Femtet)
61
69
  self.calc_resonance_frequency()
62
- return self.resonance_frequency * 1e-9
70
+ f = self.resonance_frequency * 1e-9
71
+ return f # GHz
63
72
 
64
73
 
65
- # サイズ拘束用関数
66
74
  def anntena_is_smaller_than_substrate(Femtet):
75
+ """アンテナのサイズと基板のサイズの関係を計算します。
76
+
77
+ Femtet : マクロを使用するためのインスタンスです。詳しくは "Femtet マクロヘルプ / CFemtet クラス" をご覧ください。
78
+ 拘束関数は第一引数に Femtet インスタンスを取る必要があります。
79
+
80
+ Sx/2 - ant_r : 基板サイズとアンテナサイズの差です。
81
+ 拘束関数は単一の float を返す必要があります。
82
+
83
+ """
67
84
  ant_r = Femtet.GetVariableValue('ant_r')
68
85
  Sx = Femtet.GetVariableValue('sx')
69
- return Sx/2 - ant_r # 1 以上になるようにする
86
+ return Sx/2 - ant_r
87
+
70
88
 
71
89
  def port_is_inside_anntena(Femtet):
90
+ """給電ポートの位置とアンテナのサイズの関係を計算します。
91
+
92
+ Femtet : マクロを使用するためのインスタンスです。詳しくは "Femtet マクロヘルプ / CFemtet クラス" をご覧ください。
93
+ 拘束関数は第一引数に Femtet インスタンスを取る必要があります。
94
+
95
+ ant_r - xf : アンテナ辺縁と給電ポートの位置の差です。
96
+ 拘束関数は単一の float を返す必要があります。
97
+
98
+ """
72
99
  ant_r = Femtet.GetVariableValue('ant_r')
73
100
  xf = Femtet.GetVariableValue('xf')
74
- return ant_r - xf # 1 以上になるようにする
75
-
76
- def size(Femtet):
77
- Sx = Femtet.GetVariableValue('sx')
78
- return Sx**2
79
-
101
+ return ant_r - xf
102
+
103
+
80
104
  if __name__=='__main__':
81
105
  # S パラメータ計算用クラス
82
106
  s = SParameterCalculator()
83
107
 
84
- # 最適化連携クラス
85
- FEMOpt = FemtetOptuna() # ここで起動している Femtet が紐づけされます
86
-
87
- # 最適化の設定
88
- FEMOpt.add_parameter('ant_r', 10, 5, 100, memo='円形アンテナの半径')
89
- FEMOpt.add_parameter('sx', 50, 5, 100, memo='基板のサイズ')
90
- FEMOpt.add_parameter('xf', 5, 1, 100, memo='給電ポートの偏心量')
91
- FEMOpt.add_constraint(anntena_is_smaller_than_substrate, lower_bound=1)
92
- FEMOpt.add_constraint(port_is_inside_anntena, lower_bound=1)
93
- FEMOpt.add_objective(s.get_resonance_frequency, '第一共振周波数(GHz)', direction=3.5)
94
- FEMOpt.add_objective(size, '基板サイズ(mm2)')
95
-
96
- FEMOpt.set_process_monitor()
97
-
98
- FEMOpt.main()
99
-
100
- import matplotlib.pyplot as plt
101
- plt.show()
108
+ # 最適化処理を行うオブジェクトを用意
109
+ femopt = OptimizerOptuna() # ここで起動している Femtet が紐づけされます
102
110
 
111
+ # 設計変数の設定
112
+ femopt.add_parameter('ant_r', 10, 5, 20, memo='円形アンテナの半径')
113
+ femopt.add_parameter('sx', 50, 40, 60, memo='基板のサイズ')
114
+ femopt.add_parameter('xf', 5, 1, 20, memo='給電ポートの偏心量')
115
+
116
+ # 拘束の設定
117
+ femopt.add_constraint(anntena_is_smaller_than_substrate, 'アンテナサイズ', lower_bound=1)
118
+ femopt.add_constraint(port_is_inside_anntena, 'ポート位置', lower_bound=1)
119
+
120
+ # 目的の設定
121
+ femopt.add_objective(s.get_resonance_frequency, '第一共振周波数(GHz)', direction=3.0)
122
+
123
+ femopt.set_random_seed(42)
124
+ femopt.main(method='botorch', n_trials=20)
@@ -0,0 +1,62 @@
1
+ """基板上の発熱体
2
+
3
+ wat_ex14_parametric.femprj に対し熱伝導解析を行い、
4
+ チップの発熱による温度上昇を最小にしつつ
5
+ 基板寸法を最小にする
6
+ 基板寸法・チップ配置寸法を探索します。
7
+ """
8
+
9
+ from pyfemtet.opt import OptimizerOptuna
10
+
11
+
12
+ def maxtemp(Femtet, body_name):
13
+ """Femtet の解析結果からチップの最高温度を取得します。
14
+
15
+ Femtet : マクロを使用するためのインスタンスです。詳しくは "Femtet マクロヘルプ / CFemtet クラス" をご覧ください。
16
+ 目的関数は第一引数に Femtet インスタンスを取る必要があります。
17
+
18
+ max_temp : 計算された最高温度です。
19
+ 目的関数は単一の float を返す必要があります。
20
+
21
+ """
22
+ Gogh = Femtet.Gogh
23
+
24
+ maxtemp, _, _ = Gogh.Watt.GetTemp_py(body_name)
25
+
26
+ return maxtemp # degree
27
+
28
+
29
+ def substrate_size(Femtet):
30
+ """Femtet の設計変数から基板サイズを取得します。
31
+
32
+ Femtet : マクロを使用するためのインスタンスです。詳しくは "Femtet マクロヘルプ / CFemtet クラス" をご覧ください。
33
+ 目的関数は第一引数に Femtet インスタンスを取る必要があります。
34
+
35
+ subs_w * subs_d : XY 平面における基板の専有面積です。
36
+ 目的関数は単一の float を返す必要があります。
37
+
38
+ """
39
+ subs_w = Femtet.GetVariableValue('substrate_w')
40
+ subs_d = Femtet.GetVariableValue('substrate_d')
41
+
42
+ return subs_w * subs_d # mm2
43
+
44
+
45
+ if __name__ == '__main__':
46
+
47
+ # 最適化処理を行うオブジェクトを用意
48
+ femopt = OptimizerOptuna()
49
+
50
+ # 設計変数の設定
51
+ femopt.add_parameter("substrate_w", 40, lower_bound=22, upper_bound=40, memo='基板サイズ X')
52
+ femopt.add_parameter("substrate_d", 60, lower_bound=33, upper_bound=60, memo='基板サイズ Y')
53
+
54
+ # 目的関数の設定
55
+ femopt.add_objective(maxtemp, name='メインチップ温度', args=('MAINCHIP',))
56
+ femopt.add_objective(maxtemp, name='サブチップ温度', args=('SUBCHIP',))
57
+ femopt.add_objective(substrate_size, name='基板サイズ')
58
+
59
+ # 最適化の実行
60
+ femopt.set_random_seed(42)
61
+ # femopt.main(n_trials=20)
62
+ femopt.main(n_trials=20, n_parallel=3) # ここのみ wat_ex14_parametric.py から変更しました。
@@ -0,0 +1,61 @@
1
+ """基板上の発熱体
2
+
3
+ wat_ex14_parametric.femprj に対し熱伝導解析を行い、
4
+ チップの発熱による温度上昇を最小にしつつ
5
+ 基板寸法を最小にする
6
+ 基板寸法・チップ配置寸法を探索します。
7
+ """
8
+
9
+ from pyfemtet.opt import OptimizerOptuna
10
+
11
+
12
+ def maxtemp(Femtet, body_name):
13
+ """Femtet の解析結果からチップの最高温度を取得します。
14
+
15
+ Femtet : マクロを使用するためのインスタンスです。詳しくは "Femtet マクロヘルプ / CFemtet クラス" をご覧ください。
16
+ 目的関数は第一引数に Femtet インスタンスを取る必要があります。
17
+
18
+ max_temp : 計算された最高温度です。
19
+ 目的関数は単一の float を返す必要があります。
20
+
21
+ """
22
+ Gogh = Femtet.Gogh
23
+
24
+ maxtemp, _, _ = Gogh.Watt.GetTemp_py(body_name)
25
+
26
+ return maxtemp # degree
27
+
28
+
29
+ def substrate_size(Femtet):
30
+ """Femtet の設計変数から基板サイズを取得します。
31
+
32
+ Femtet : マクロを使用するためのインスタンスです。詳しくは "Femtet マクロヘルプ / CFemtet クラス" をご覧ください。
33
+ 目的関数は第一引数に Femtet インスタンスを取る必要があります。
34
+
35
+ subs_w * subs_d : XY 平面における基板の専有面積です。
36
+ 目的関数は単一の float を返す必要があります。
37
+
38
+ """
39
+ subs_w = Femtet.GetVariableValue('substrate_w')
40
+ subs_d = Femtet.GetVariableValue('substrate_d')
41
+
42
+ return subs_w * subs_d # mm2
43
+
44
+
45
+ if __name__ == '__main__':
46
+
47
+ # 最適化処理を行うオブジェクトを用意
48
+ femopt = OptimizerOptuna()
49
+
50
+ # 設計変数の設定
51
+ femopt.add_parameter("substrate_w", 40, lower_bound=22, upper_bound=40, memo='基板サイズ X')
52
+ femopt.add_parameter("substrate_d", 60, lower_bound=33, upper_bound=60, memo='基板サイズ Y')
53
+
54
+ # 目的関数の設定
55
+ femopt.add_objective(maxtemp, name='メインチップ温度', args=('MAINCHIP',))
56
+ femopt.add_objective(maxtemp, name='サブチップ温度', args=('SUBCHIP',))
57
+ femopt.add_objective(substrate_size, name='基板サイズ')
58
+
59
+ # 最適化の実行
60
+ femopt.set_random_seed(42)
61
+ femopt.main(n_trials=20)
pyfemtet/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.1.12"
1
+ __version__ = "0.2.1"
@@ -42,7 +42,12 @@ def main(prtPath:str, parameters:'dict as str', x_tPath:str = None):
42
42
  # 式を更新
43
43
  unit_mm = workPart.UnitCollection.FindObject("MilliMeter")
44
44
  for k, v in parameters.items():
45
- exp = workPart.Expressions.FindObject(k)
45
+ try:
46
+ exp = workPart.Expressions.FindObject(k)
47
+ except NXOpen.NXException:
48
+ print(f'変数{k}は .prt ファイルに含まれていません。無視されます。')
49
+ continue
50
+
46
51
  workPart.Expressions.EditWithUnits(exp, unit_mm, str(v))
47
52
  # 式の更新を適用
48
53
  id1 = theSession.NewestVisibleUndoMark
@@ -51,7 +56,6 @@ def main(prtPath:str, parameters:'dict as str', x_tPath:str = None):
51
56
  # 更新に失敗
52
57
  except NXOpen.NXException as e:
53
58
  print(' 形状が破綻しました。操作を取り消します。')
54
- print('---script end---')
55
59
  return
56
60
 
57
61
 
pyfemtet/opt/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- from ._optuna import OptimizerOptuna
1
+ from .optimizer import OptimizerOptuna
2
2
  from .interface import (
3
3
  NoFEM,
4
4
  FemtetInterface,