pyfemtet 0.8.6__py3-none-any.whl → 0.8.7__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.

pyfemtet/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.8.6"
1
+ __version__ = "0.8.7"
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: PROJECT VERSION\n"
9
9
  "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
10
- "POT-Creation-Date: 2024-12-27 09:45+0900\n"
10
+ "POT-Creation-Date: 2025-01-29 15:47+0900\n"
11
11
  "PO-Revision-Date: 2024-07-22 14:05+0900\n"
12
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
13
  "Language: ja\n"
@@ -190,351 +190,355 @@ msgstr ""
190
190
  msgid "Restore Femtet setting of autosave."
191
191
  msgstr "Femtet の自動保存設定を元に戻します。"
192
192
 
193
- #: pyfemtet/_message/messages.py:90
193
+ #: pyfemtet/_message/messages.py:88
194
+ msgid "Failed to make output from Femtet. Please check output settings of Parametric Analysis."
195
+ msgstr "パラメトリック解析結果出力に失敗しました。結果出力設定を確認してください。"
196
+
197
+ #: pyfemtet/_message/messages.py:92
194
198
  msgid "The following features are not supported by the specified optimization method. "
195
199
  msgstr "以下の機能は現在の最適化手法では利用できません。"
196
200
 
197
- #: pyfemtet/_message/messages.py:91
201
+ #: pyfemtet/_message/messages.py:93
198
202
  msgid "The parameter set does not match the one added with add_init_parameter."
199
203
  msgstr "変数の組合せが add_init_parameter で与えられた変数の組合せと一致しません。"
200
204
 
201
- #: pyfemtet/_message/messages.py:92
205
+ #: pyfemtet/_message/messages.py:94
202
206
  msgid "An exception has occurred during FEM update. Current parameters are: "
203
207
  msgstr "FEM 解析中に例外が発生しました。現在の変数の組合せは以下の通りです。"
204
208
 
205
- #: pyfemtet/_message/messages.py:93
209
+ #: pyfemtet/_message/messages.py:95
206
210
  msgid "The constraints were not satisfied for the following sets of variables:"
207
211
  msgstr "以下の変数の組合せで拘束が満たされませんでした。"
208
212
 
209
- #: pyfemtet/_message/messages.py:94
213
+ #: pyfemtet/_message/messages.py:96
210
214
  msgid "Current parameter set cannot update FEM and this optimization method cannot skip current parameter set. The optimization process will be terminated."
211
215
  msgstr "現在の変数の組合せで FEM 解析を行うことができません。現在の最適化手法では変数の組合せをスキップすることができません。最適化プログラムは停止されます。"
212
216
 
213
- #: pyfemtet/_message/messages.py:95
217
+ #: pyfemtet/_message/messages.py:97
214
218
  msgid "Optimization has been interrupted. Note that you cannot acquire the OptimizationResult in case of `trust-constr`, `TNC`, `SLSQP` or `COBYLA`."
215
219
  msgstr "最適化が中断されました。`trust-constr`, `TNC`, `SLSQP` 又は `COBYLA` メソッドを使っている場合は、OptimizationResult オブジェクトが取得できないことに注意してください。"
216
220
 
217
- #: pyfemtet/_message/messages.py:96
221
+ #: pyfemtet/_message/messages.py:98
218
222
  msgid "You can use parameter constraint only with BoTorchSampler."
219
223
  msgstr "BoTorchSampler でのみパラメーター制約を使用できます。"
220
224
 
221
- #: pyfemtet/_message/messages.py:97
225
+ #: pyfemtet/_message/messages.py:99
222
226
  msgid "Scipy is deterministic, so whether you set a seed or not will not change the results."
223
227
  msgstr ""
224
228
 
225
- #: pyfemtet/_message/messages.py:98
229
+ #: pyfemtet/_message/messages.py:100
226
230
  msgid "Start to candidate new parameter set with constraints. This process may take a long time."
227
231
  msgstr ""
228
232
 
229
- #: pyfemtet/_message/messages.py:99
233
+ #: pyfemtet/_message/messages.py:101
230
234
  msgid "Updating FEM parameter during evaluating constraints take a long time. Please consider not to use FEM variables in constraint functions and set `update_fem` to False."
231
235
  msgstr ""
232
236
 
233
- #: pyfemtet/_message/messages.py:103
237
+ #: pyfemtet/_message/messages.py:105
234
238
  msgid "Connect to Femtet"
235
239
  msgstr "Femtet に接続する"
236
240
 
237
- #: pyfemtet/_message/messages.py:104
241
+ #: pyfemtet/_message/messages.py:106
238
242
  msgid "Analysis model name described in csv does not exist in project."
239
243
  msgstr "履歴 csv ファイルに記載されている解析モデル名はプロジェクトに含まれていません。"
240
244
 
241
- #: pyfemtet/_message/messages.py:105
245
+ #: pyfemtet/_message/messages.py:107
242
246
  msgid "History csv is not read yet. Open your project manually."
243
247
  msgstr "履歴 csv が読み込まれていません。目的のプロジェクトを手動で開いてください。"
244
248
 
245
- #: pyfemtet/_message/messages.py:106
249
+ #: pyfemtet/_message/messages.py:108
246
250
  msgid "Cannot read project data from csv. Open your project manually."
247
251
  msgstr "履歴 csv ファイルからプロジェクトに関するデータを読み込めませんでした。目的のプロジェクトを手動で開いてください。"
248
252
 
249
- #: pyfemtet/_message/messages.py:107
253
+ #: pyfemtet/_message/messages.py:109
250
254
  msgid ".femprj file described in csv is not found. Open your project manually."
251
255
  msgstr "履歴 csv ファイルに記載されているプロジェクトファイルが見つかりませんでした。目的のプロジェクトを手動で開いてください。"
252
256
 
253
- #: pyfemtet/_message/messages.py:108
257
+ #: pyfemtet/_message/messages.py:110
254
258
  msgid "Analysis model name is not specified. Open your model in the project manually."
255
259
  msgstr "解析モデル名が指定されていません。目的の解析モデルをプロジェクト内で手動で開いてください。"
256
260
 
257
- #: pyfemtet/_message/messages.py:110
261
+ #: pyfemtet/_message/messages.py:112
258
262
  msgid "Constraint"
259
263
  msgstr "拘束条件"
260
264
 
261
- #: pyfemtet/_message/messages.py:111
265
+ #: pyfemtet/_message/messages.py:113
262
266
  msgid "feasible"
263
267
  msgstr "満たす"
264
268
 
265
- #: pyfemtet/_message/messages.py:112
269
+ #: pyfemtet/_message/messages.py:114
266
270
  msgid "infeasible"
267
271
  msgstr "満たさない"
268
272
 
269
- #: pyfemtet/_message/messages.py:113
273
+ #: pyfemtet/_message/messages.py:115
270
274
  msgid "Optimality"
271
275
  msgstr "最適性"
272
276
 
273
- #: pyfemtet/_message/messages.py:114
277
+ #: pyfemtet/_message/messages.py:116
274
278
  msgid "non dominated"
275
279
  msgstr "適"
276
280
 
277
- #: pyfemtet/_message/messages.py:115
281
+ #: pyfemtet/_message/messages.py:117
278
282
  msgid "dominated"
279
283
  msgstr "不適"
280
284
 
281
- #: pyfemtet/_message/messages.py:116
285
+ #: pyfemtet/_message/messages.py:118
282
286
  msgid "Hypervolume Plot"
283
287
  msgstr "Hypervolume プロット"
284
288
 
285
- #: pyfemtet/_message/messages.py:117
289
+ #: pyfemtet/_message/messages.py:119
286
290
  msgid "Objective Plot"
287
291
  msgstr "目的関数プロット"
288
292
 
289
- #: pyfemtet/_message/messages.py:118
293
+ #: pyfemtet/_message/messages.py:120
290
294
  msgid "Multi Objective Pair Plot"
291
295
  msgstr "目的関数ペアプロット"
292
296
 
293
- #: pyfemtet/_message/messages.py:119
297
+ #: pyfemtet/_message/messages.py:121
294
298
  msgid "Succeeded trial number"
295
299
  msgstr "成功した解析数"
296
300
 
297
- #: pyfemtet/_message/messages.py:120
301
+ #: pyfemtet/_message/messages.py:122
298
302
  msgid "All solutions"
299
303
  msgstr "すべての解"
300
304
 
301
- #: pyfemtet/_message/messages.py:121
305
+ #: pyfemtet/_message/messages.py:123
302
306
  msgid "Transition of<br>optimal solutions"
303
307
  msgstr "最適解の推移"
304
308
 
305
- #: pyfemtet/_message/messages.py:122
309
+ #: pyfemtet/_message/messages.py:124
306
310
  msgid "Target value"
307
311
  msgstr "ターゲット値"
308
312
 
309
- #: pyfemtet/_message/messages.py:124
313
+ #: pyfemtet/_message/messages.py:126
310
314
  msgid "Objectives"
311
315
  msgstr "目的関数"
312
316
 
313
- #: pyfemtet/_message/messages.py:125
317
+ #: pyfemtet/_message/messages.py:127
314
318
  msgid "Objectives (all)"
315
319
  msgstr "全ての目的関数"
316
320
 
317
- #: pyfemtet/_message/messages.py:127
321
+ #: pyfemtet/_message/messages.py:129
318
322
  msgid "Prediction Model"
319
323
  msgstr "予測モデル"
320
324
 
321
- #: pyfemtet/_message/messages.py:128
325
+ #: pyfemtet/_message/messages.py:130
322
326
  msgid " Recalculate Model"
323
327
  msgstr " 予測モデルの再計算"
324
328
 
325
- #: pyfemtet/_message/messages.py:129
329
+ #: pyfemtet/_message/messages.py:131
326
330
  msgid " Redraw graph"
327
331
  msgstr " 描画の更新"
328
332
 
329
- #: pyfemtet/_message/messages.py:130
333
+ #: pyfemtet/_message/messages.py:132
330
334
  msgid "Parameter"
331
335
  msgstr "変数"
332
336
 
333
- #: pyfemtet/_message/messages.py:131
337
+ #: pyfemtet/_message/messages.py:133
334
338
  msgid "Parameter2"
335
339
  msgstr "変数2"
336
340
 
337
- #: pyfemtet/_message/messages.py:132
341
+ #: pyfemtet/_message/messages.py:134
338
342
  msgid "Objective"
339
343
  msgstr "目的関数"
340
344
 
341
- #: pyfemtet/_message/messages.py:133
345
+ #: pyfemtet/_message/messages.py:135
342
346
  msgid "No history selected."
343
347
  msgstr "履歴 csv が選択されていません。"
344
348
 
345
- #: pyfemtet/_message/messages.py:134
349
+ #: pyfemtet/_message/messages.py:136
346
350
  msgid "No FEM result (yet)."
347
351
  msgstr "FEM 解析結果が(まだ)存在しません。"
348
352
 
349
- #: pyfemtet/_message/messages.py:135
353
+ #: pyfemtet/_message/messages.py:137
350
354
  msgid "Prediction model is not calculated yet."
351
355
  msgstr "予測モデルがまだ計算されていません。"
352
356
 
353
- #: pyfemtet/_message/messages.py:136
357
+ #: pyfemtet/_message/messages.py:138
354
358
  msgid "Cannot select same parameter"
355
359
  msgstr "同じ変数を設定できません。"
356
360
 
357
- #: pyfemtet/_message/messages.py:137
361
+ #: pyfemtet/_message/messages.py:139
358
362
  msgid "3D graph (two or more parameters required)"
359
363
  msgstr "3D (2 つ以上の設計変数が必要です)"
360
364
 
361
- #: pyfemtet/_message/messages.py:139
365
+ #: pyfemtet/_message/messages.py:141
362
366
  msgid "Prediction Model of Objective"
363
367
  msgstr "目的関数に対する予測モデル"
364
368
 
365
- #: pyfemtet/_message/messages.py:140
369
+ #: pyfemtet/_message/messages.py:142
366
370
  msgid "prediction model"
367
371
  msgstr "モデルによる予測値"
368
372
 
369
- #: pyfemtet/_message/messages.py:141
373
+ #: pyfemtet/_message/messages.py:143
370
374
  msgid "std. dev. of model"
371
375
  msgstr "予測値の標準偏差"
372
376
 
373
- #: pyfemtet/_message/messages.py:143
377
+ #: pyfemtet/_message/messages.py:145
374
378
  msgid "Progress"
375
379
  msgstr "進捗"
376
380
 
377
- #: pyfemtet/_message/messages.py:144
381
+ #: pyfemtet/_message/messages.py:146
378
382
  msgid "Prediction"
379
383
  msgstr "予測"
380
384
 
381
- #: pyfemtet/_message/messages.py:145
385
+ #: pyfemtet/_message/messages.py:147
382
386
  msgid "Workers"
383
387
  msgstr "並列プロセス"
384
388
 
385
- #: pyfemtet/_message/messages.py:146
389
+ #: pyfemtet/_message/messages.py:148
386
390
  msgid "Details"
387
391
  msgstr "詳細分析"
388
392
 
389
- #: pyfemtet/_message/messages.py:148
393
+ #: pyfemtet/_message/messages.py:150
390
394
  msgid "Optimization status will be shown here."
391
395
  msgstr "最適化の状態がここに表示されます。"
392
396
 
393
- #: pyfemtet/_message/messages.py:149
397
+ #: pyfemtet/_message/messages.py:151
394
398
  msgid "Auto-update graph"
395
399
  msgstr "グラフの自動更新"
396
400
 
397
- #: pyfemtet/_message/messages.py:150
401
+ #: pyfemtet/_message/messages.py:152
398
402
  msgid "Interrupt Optimization"
399
403
  msgstr "最適化を中断する"
400
404
 
401
- #: pyfemtet/_message/messages.py:152
405
+ #: pyfemtet/_message/messages.py:154
402
406
  msgid "Result"
403
407
  msgstr "結果"
404
408
 
405
- #: pyfemtet/_message/messages.py:154
409
+ #: pyfemtet/_message/messages.py:156
406
410
  msgid "Open Result in Femtet"
407
411
  msgstr "Femtet で結果を開く"
408
412
 
409
- #: pyfemtet/_message/messages.py:155
413
+ #: pyfemtet/_message/messages.py:157
410
414
  msgid "Reconstruct Model"
411
415
  msgstr "モデルの再構築"
412
416
 
413
- #: pyfemtet/_message/messages.py:156
417
+ #: pyfemtet/_message/messages.py:158
414
418
  msgid "Drag and drop or select csv file"
415
419
  msgstr "履歴 csv をドラッグ&ドロップ"
416
420
 
417
- #: pyfemtet/_message/messages.py:157
421
+ #: pyfemtet/_message/messages.py:159
418
422
  msgid "Connection to Femtet is not established. Launch Femtet and Open a project."
419
423
  msgstr "Femtet との接続ができていません。Femtet を起動し、プロジェクトを開いてください。"
420
424
 
421
- #: pyfemtet/_message/messages.py:158
425
+ #: pyfemtet/_message/messages.py:160
422
426
  msgid "No result plot is selected."
423
427
  msgstr "グラフ上で結果プロットが選択されていません。"
424
428
 
425
- #: pyfemtet/_message/messages.py:159
429
+ #: pyfemtet/_message/messages.py:161
426
430
  msgid "The femprj file path in the history csv is not found or valid."
427
431
  msgstr "履歴 csv に記載の femprj ファイルが見つからないか不正です。"
428
432
 
429
- #: pyfemtet/_message/messages.py:160
433
+ #: pyfemtet/_message/messages.py:162
430
434
  msgid "The model name in the history csv is not found."
431
435
  msgstr "履歴 csv に記載の解析モデル名が見つかりませんでした。"
432
436
 
433
- #: pyfemtet/_message/messages.py:161
437
+ #: pyfemtet/_message/messages.py:163
434
438
  msgid ".pdt file is not found. Please check the .Results folder. Note that .pdt file save mode depends on the `save_pdt` argument of FemtetInterface in optimization script(default to `all`)."
435
439
  msgstr "結果(.pdt)ファイルが見つかりませんでした。.Result フォルダ内を確認してください。.pdt ファイルが作成されるかどうかは最適化スクリプトの FemtetInterface の引数 `save_pdt` の挙動に左右されることに注意してください(デフォルトは `all`, すべての trial の結果が保存されます)。"
436
440
 
437
- #: pyfemtet/_message/messages.py:166
441
+ #: pyfemtet/_message/messages.py:168
438
442
  msgid "Failed to open "
439
443
  msgstr "以下のファイルが開けません: "
440
444
 
441
- #: pyfemtet/_message/messages.py:167
445
+ #: pyfemtet/_message/messages.py:169
442
446
  msgid "Specified model is not in current project. Please check opened project. For example, not \"analysis model only\" but your .femprj file."
443
447
  msgstr "指定された解析モデルは現在のプロジェクトに含まれていません。現在開かれているプロジェクトが正しいか確認してください。例えば、「解析結果単体」の画面になっていないことを確認してください。"
444
448
 
445
- #: pyfemtet/_message/messages.py:170
449
+ #: pyfemtet/_message/messages.py:172
446
450
  msgid ".femprj file path of the history csv is invalid. Please certify matching between csv and opening .femprj file."
447
451
  msgstr "履歴 csv に記載のプロジェクトファイルのパスが不正です。現在開かれているプロジェクトファイルと履歴 csv に記載のプロジェクトファイルのパスが一致することを確認してください。"
448
452
 
449
- #: pyfemtet/_message/messages.py:171
453
+ #: pyfemtet/_message/messages.py:173
450
454
  msgid "Analysis model name of the history csv is invalid. Please certify matching between csv and opening analysis model."
451
455
  msgstr "履歴 csv に記載の解析モデル名が不正です。現在開かれている解析モデル名と履歴 csv に記載の解析モデル名が一致することを確認してください。"
452
456
 
453
- #: pyfemtet/_message/messages.py:172
457
+ #: pyfemtet/_message/messages.py:174
454
458
  msgid "Analysis model name of the history csv and opened in Femtet is inconsistent. Please certify matching between csv and opening analysis model."
455
459
  msgstr "履歴 csv に記載の解析モデル名と Femtet で開かれている解析モデル名が一致しません。"
456
460
 
457
- #: pyfemtet/_message/messages.py:173
461
+ #: pyfemtet/_message/messages.py:175
458
462
  msgid "tutorial mode"
459
463
  msgstr "チュートリアルモード"
460
464
 
461
- #: pyfemtet/_message/messages.py:174
465
+ #: pyfemtet/_message/messages.py:176
462
466
  msgid "Load Sample CSV"
463
467
  msgstr "サンプル履歴 CSV 読み込み"
464
468
 
465
- #: pyfemtet/_message/messages.py:175
469
+ #: pyfemtet/_message/messages.py:177
466
470
  msgid "Load CSV"
467
471
  msgstr "履歴 CSV 読み込み"
468
472
 
469
- #: pyfemtet/_message/messages.py:176
473
+ #: pyfemtet/_message/messages.py:178
470
474
  msgid "Open your optimization result. Then connecting to femtet will start automatically. Note that in tutorial mode, this button loads the ready-made sample csv and open sample femprj."
471
475
  msgstr "最適化を実行した結果生成される csv ファイル(履歴 csv)を開きます。その後、Femtet の起動・接続が自動的に行われます。チュートリアルモードではこのボタンを押すと自動的に用意されたサンプルファイルが開きます。"
472
476
 
473
- #: pyfemtet/_message/messages.py:178
477
+ #: pyfemtet/_message/messages.py:180
474
478
  msgid "Main Graph"
475
479
  msgstr "メイングラフ"
476
480
 
477
- #: pyfemtet/_message/messages.py:179
481
+ #: pyfemtet/_message/messages.py:181
478
482
  msgid "Here the optimization history is shown. Each plot represents single FEM result. You can pick a result to open the corresponding result in Femtet. "
479
483
  msgstr "ここに最適化の履歴が表示されます。プロットの 1 個の点が 1 個の変数の組合せに対する FEM 解析結果を示します。グラフ中の結果ファイルを選択し、Femtet で対応する結果ファイルを開くことができます。"
480
484
 
481
- #: pyfemtet/_message/messages.py:182
485
+ #: pyfemtet/_message/messages.py:184
482
486
  msgid "Open Result"
483
487
  msgstr "結果を開く"
484
488
 
485
- #: pyfemtet/_message/messages.py:183
489
+ #: pyfemtet/_message/messages.py:185
486
490
  msgid "After pick a point in the main graph, This button shows the corresponding FEM result in Femtet."
487
491
  msgstr "メイングラフで点を選択した後でこのボタンを押すと、対応する FEM 解析結果が Femtet で開かれます。"
488
492
 
489
- #: pyfemtet/_message/messages.py:185
493
+ #: pyfemtet/_message/messages.py:187
490
494
  msgid "Re-connect to Femtet."
491
495
  msgstr "手動で Femtet と接続します。"
492
496
 
493
- #: pyfemtet/_message/messages.py:186
497
+ #: pyfemtet/_message/messages.py:188
494
498
  msgid "Sample csv is not found. Please consider to re-install pyfemtet by `py -m pip install pyfemtet -U --force-reinstall`"
495
499
  msgstr "サンプル履歴 csv が見つかりませんでした。以下のコマンドで pyfemtet の再インストールを検討して下さい。 `py -m pip install pyfemtet -U --force-reinstall`"
496
500
 
497
- #: pyfemtet/_message/messages.py:187
501
+ #: pyfemtet/_message/messages.py:189
498
502
  msgid "Sample femprj file is not found. Please consider to re-install pyfemtet by `py -m pip install pyfemtet -U --force-reinstall`"
499
503
  msgstr "サンプルプロジェクトファイルが見つかりませんでした。以下のコマンドで pyfemtet の再インストールを検討して下さい。 `py -m pip install pyfemtet -U --force-reinstall`"
500
504
 
501
- #: pyfemtet/_message/messages.py:188
505
+ #: pyfemtet/_message/messages.py:190
502
506
  msgid "Sample femprj result folder is not found. Please consider to re-install pyfemtet by `py -m pip install pyfemtet -U --force-reinstall`"
503
507
  msgstr "サンプル結果フォルダが見つかりませんでした。以下のコマンドで pyfemtet の再インストールを検討して下さい。 `py -m pip install pyfemtet -U --force-reinstall`"
504
508
 
505
- #: pyfemtet/_message/messages.py:190
509
+ #: pyfemtet/_message/messages.py:192
506
510
  msgid "Loading data..."
507
511
  msgstr ""
508
512
 
509
- #: pyfemtet/_message/messages.py:191
513
+ #: pyfemtet/_message/messages.py:193
510
514
  msgid "Plots of objectives versus trials"
511
515
  msgstr "試行回数に対する各目的関数のプロット"
512
516
 
513
- #: pyfemtet/_message/messages.py:192
517
+ #: pyfemtet/_message/messages.py:194
514
518
  msgid "The vertical axis is the objective, and the horizontal axis is the number of trials."
515
519
  msgstr "縦軸は目的関数、横軸は試行回数です。"
516
520
 
517
- #: pyfemtet/_message/messages.py:193
521
+ #: pyfemtet/_message/messages.py:195
518
522
  msgid "Parallel coordinate plots"
519
523
  msgstr "並行座標プロット"
520
524
 
521
- #: pyfemtet/_message/messages.py:194
525
+ #: pyfemtet/_message/messages.py:196
522
526
  msgid "The vertical axis is an objective or parameters, and one polyline indicates one result."
523
527
  msgstr "縦軸は目的関数及び各設計変数、折れ線ひとつはひとつの試行に対応します。"
524
528
 
525
- #: pyfemtet/_message/messages.py:195
529
+ #: pyfemtet/_message/messages.py:197
526
530
  msgid "The heatmap of objectives"
527
531
  msgstr "目的関数のヒートマップ"
528
532
 
529
- #: pyfemtet/_message/messages.py:196
533
+ #: pyfemtet/_message/messages.py:198
530
534
  msgid "The axes are parameters, and the color shows objective value."
531
535
  msgstr "軸は設計変数、色は目的関数の値を示します。"
532
536
 
533
- #: pyfemtet/_message/messages.py:197
537
+ #: pyfemtet/_message/messages.py:199
534
538
  msgid "The response of an objective versus one parameter"
535
539
  msgstr "ひとつの設計変数に対する目的関数の変化"
536
540
 
537
- #: pyfemtet/_message/messages.py:198
541
+ #: pyfemtet/_message/messages.py:200
538
542
  msgid "The vertical axis is objective, and the horizontal axis is parameter."
539
543
  msgstr "縦軸は目的関数、横軸は設計変数です。"
540
544
 
@@ -1,14 +1,14 @@
1
1
  # Translations template for PROJECT.
2
- # Copyright (C) 2024 ORGANIZATION
2
+ # Copyright (C) 2025 ORGANIZATION
3
3
  # This file is distributed under the same license as the PROJECT project.
4
- # FIRST AUTHOR <EMAIL@ADDRESS>, 2024.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, 2025.
5
5
  #
6
6
  #, fuzzy
7
7
  msgid ""
8
8
  msgstr ""
9
9
  "Project-Id-Version: PROJECT VERSION\n"
10
10
  "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
11
- "POT-Creation-Date: 2024-12-27 09:45+0900\n"
11
+ "POT-Creation-Date: 2025-01-29 15:47+0900\n"
12
12
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -189,351 +189,355 @@ msgstr ""
189
189
  msgid "Restore Femtet setting of autosave."
190
190
  msgstr ""
191
191
 
192
- #: pyfemtet/_message/messages.py:90
192
+ #: pyfemtet/_message/messages.py:88
193
+ msgid "Failed to make output from Femtet. Please check output settings of Parametric Analysis."
194
+ msgstr ""
195
+
196
+ #: pyfemtet/_message/messages.py:92
193
197
  msgid "The following features are not supported by the specified optimization method. "
194
198
  msgstr ""
195
199
 
196
- #: pyfemtet/_message/messages.py:91
200
+ #: pyfemtet/_message/messages.py:93
197
201
  msgid "The parameter set does not match the one added with add_init_parameter."
198
202
  msgstr ""
199
203
 
200
- #: pyfemtet/_message/messages.py:92
204
+ #: pyfemtet/_message/messages.py:94
201
205
  msgid "An exception has occurred during FEM update. Current parameters are: "
202
206
  msgstr ""
203
207
 
204
- #: pyfemtet/_message/messages.py:93
208
+ #: pyfemtet/_message/messages.py:95
205
209
  msgid "The constraints were not satisfied for the following sets of variables:"
206
210
  msgstr ""
207
211
 
208
- #: pyfemtet/_message/messages.py:94
212
+ #: pyfemtet/_message/messages.py:96
209
213
  msgid "Current parameter set cannot update FEM and this optimization method cannot skip current parameter set. The optimization process will be terminated."
210
214
  msgstr ""
211
215
 
212
- #: pyfemtet/_message/messages.py:95
216
+ #: pyfemtet/_message/messages.py:97
213
217
  msgid "Optimization has been interrupted. Note that you cannot acquire the OptimizationResult in case of `trust-constr`, `TNC`, `SLSQP` or `COBYLA`."
214
218
  msgstr ""
215
219
 
216
- #: pyfemtet/_message/messages.py:96
220
+ #: pyfemtet/_message/messages.py:98
217
221
  msgid "You can use parameter constraint only with BoTorchSampler."
218
222
  msgstr ""
219
223
 
220
- #: pyfemtet/_message/messages.py:97
224
+ #: pyfemtet/_message/messages.py:99
221
225
  msgid "Scipy is deterministic, so whether you set a seed or not will not change the results."
222
226
  msgstr ""
223
227
 
224
- #: pyfemtet/_message/messages.py:98
228
+ #: pyfemtet/_message/messages.py:100
225
229
  msgid "Start to candidate new parameter set with constraints. This process may take a long time."
226
230
  msgstr ""
227
231
 
228
- #: pyfemtet/_message/messages.py:99
232
+ #: pyfemtet/_message/messages.py:101
229
233
  msgid "Updating FEM parameter during evaluating constraints take a long time. Please consider not to use FEM variables in constraint functions and set `update_fem` to False."
230
234
  msgstr ""
231
235
 
232
- #: pyfemtet/_message/messages.py:103
236
+ #: pyfemtet/_message/messages.py:105
233
237
  msgid "Connect to Femtet"
234
238
  msgstr ""
235
239
 
236
- #: pyfemtet/_message/messages.py:104
240
+ #: pyfemtet/_message/messages.py:106
237
241
  msgid "Analysis model name described in csv does not exist in project."
238
242
  msgstr ""
239
243
 
240
- #: pyfemtet/_message/messages.py:105
244
+ #: pyfemtet/_message/messages.py:107
241
245
  msgid "History csv is not read yet. Open your project manually."
242
246
  msgstr ""
243
247
 
244
- #: pyfemtet/_message/messages.py:106
248
+ #: pyfemtet/_message/messages.py:108
245
249
  msgid "Cannot read project data from csv. Open your project manually."
246
250
  msgstr ""
247
251
 
248
- #: pyfemtet/_message/messages.py:107
252
+ #: pyfemtet/_message/messages.py:109
249
253
  msgid ".femprj file described in csv is not found. Open your project manually."
250
254
  msgstr ""
251
255
 
252
- #: pyfemtet/_message/messages.py:108
256
+ #: pyfemtet/_message/messages.py:110
253
257
  msgid "Analysis model name is not specified. Open your model in the project manually."
254
258
  msgstr ""
255
259
 
256
- #: pyfemtet/_message/messages.py:110
260
+ #: pyfemtet/_message/messages.py:112
257
261
  msgid "Constraint"
258
262
  msgstr ""
259
263
 
260
- #: pyfemtet/_message/messages.py:111
264
+ #: pyfemtet/_message/messages.py:113
261
265
  msgid "feasible"
262
266
  msgstr ""
263
267
 
264
- #: pyfemtet/_message/messages.py:112
268
+ #: pyfemtet/_message/messages.py:114
265
269
  msgid "infeasible"
266
270
  msgstr ""
267
271
 
268
- #: pyfemtet/_message/messages.py:113
272
+ #: pyfemtet/_message/messages.py:115
269
273
  msgid "Optimality"
270
274
  msgstr ""
271
275
 
272
- #: pyfemtet/_message/messages.py:114
276
+ #: pyfemtet/_message/messages.py:116
273
277
  msgid "non dominated"
274
278
  msgstr ""
275
279
 
276
- #: pyfemtet/_message/messages.py:115
280
+ #: pyfemtet/_message/messages.py:117
277
281
  msgid "dominated"
278
282
  msgstr ""
279
283
 
280
- #: pyfemtet/_message/messages.py:116
284
+ #: pyfemtet/_message/messages.py:118
281
285
  msgid "Hypervolume Plot"
282
286
  msgstr ""
283
287
 
284
- #: pyfemtet/_message/messages.py:117
288
+ #: pyfemtet/_message/messages.py:119
285
289
  msgid "Objective Plot"
286
290
  msgstr ""
287
291
 
288
- #: pyfemtet/_message/messages.py:118
292
+ #: pyfemtet/_message/messages.py:120
289
293
  msgid "Multi Objective Pair Plot"
290
294
  msgstr ""
291
295
 
292
- #: pyfemtet/_message/messages.py:119
296
+ #: pyfemtet/_message/messages.py:121
293
297
  msgid "Succeeded trial number"
294
298
  msgstr ""
295
299
 
296
- #: pyfemtet/_message/messages.py:120
300
+ #: pyfemtet/_message/messages.py:122
297
301
  msgid "All solutions"
298
302
  msgstr ""
299
303
 
300
- #: pyfemtet/_message/messages.py:121
304
+ #: pyfemtet/_message/messages.py:123
301
305
  msgid "Transition of<br>optimal solutions"
302
306
  msgstr ""
303
307
 
304
- #: pyfemtet/_message/messages.py:122
308
+ #: pyfemtet/_message/messages.py:124
305
309
  msgid "Target value"
306
310
  msgstr ""
307
311
 
308
- #: pyfemtet/_message/messages.py:124
312
+ #: pyfemtet/_message/messages.py:126
309
313
  msgid "Objectives"
310
314
  msgstr ""
311
315
 
312
- #: pyfemtet/_message/messages.py:125
316
+ #: pyfemtet/_message/messages.py:127
313
317
  msgid "Objectives (all)"
314
318
  msgstr ""
315
319
 
316
- #: pyfemtet/_message/messages.py:127
320
+ #: pyfemtet/_message/messages.py:129
317
321
  msgid "Prediction Model"
318
322
  msgstr ""
319
323
 
320
- #: pyfemtet/_message/messages.py:128
324
+ #: pyfemtet/_message/messages.py:130
321
325
  msgid " Recalculate Model"
322
326
  msgstr ""
323
327
 
324
- #: pyfemtet/_message/messages.py:129
328
+ #: pyfemtet/_message/messages.py:131
325
329
  msgid " Redraw graph"
326
330
  msgstr ""
327
331
 
328
- #: pyfemtet/_message/messages.py:130
332
+ #: pyfemtet/_message/messages.py:132
329
333
  msgid "Parameter"
330
334
  msgstr ""
331
335
 
332
- #: pyfemtet/_message/messages.py:131
336
+ #: pyfemtet/_message/messages.py:133
333
337
  msgid "Parameter2"
334
338
  msgstr ""
335
339
 
336
- #: pyfemtet/_message/messages.py:132
340
+ #: pyfemtet/_message/messages.py:134
337
341
  msgid "Objective"
338
342
  msgstr ""
339
343
 
340
- #: pyfemtet/_message/messages.py:133
344
+ #: pyfemtet/_message/messages.py:135
341
345
  msgid "No history selected."
342
346
  msgstr ""
343
347
 
344
- #: pyfemtet/_message/messages.py:134
348
+ #: pyfemtet/_message/messages.py:136
345
349
  msgid "No FEM result (yet)."
346
350
  msgstr ""
347
351
 
348
- #: pyfemtet/_message/messages.py:135
352
+ #: pyfemtet/_message/messages.py:137
349
353
  msgid "Prediction model is not calculated yet."
350
354
  msgstr ""
351
355
 
352
- #: pyfemtet/_message/messages.py:136
356
+ #: pyfemtet/_message/messages.py:138
353
357
  msgid "Cannot select same parameter"
354
358
  msgstr ""
355
359
 
356
- #: pyfemtet/_message/messages.py:137
360
+ #: pyfemtet/_message/messages.py:139
357
361
  msgid "3D graph (two or more parameters required)"
358
362
  msgstr ""
359
363
 
360
- #: pyfemtet/_message/messages.py:139
364
+ #: pyfemtet/_message/messages.py:141
361
365
  msgid "Prediction Model of Objective"
362
366
  msgstr ""
363
367
 
364
- #: pyfemtet/_message/messages.py:140
368
+ #: pyfemtet/_message/messages.py:142
365
369
  msgid "prediction model"
366
370
  msgstr ""
367
371
 
368
- #: pyfemtet/_message/messages.py:141
372
+ #: pyfemtet/_message/messages.py:143
369
373
  msgid "std. dev. of model"
370
374
  msgstr ""
371
375
 
372
- #: pyfemtet/_message/messages.py:143
376
+ #: pyfemtet/_message/messages.py:145
373
377
  msgid "Progress"
374
378
  msgstr ""
375
379
 
376
- #: pyfemtet/_message/messages.py:144
380
+ #: pyfemtet/_message/messages.py:146
377
381
  msgid "Prediction"
378
382
  msgstr ""
379
383
 
380
- #: pyfemtet/_message/messages.py:145
384
+ #: pyfemtet/_message/messages.py:147
381
385
  msgid "Workers"
382
386
  msgstr ""
383
387
 
384
- #: pyfemtet/_message/messages.py:146
388
+ #: pyfemtet/_message/messages.py:148
385
389
  msgid "Details"
386
390
  msgstr ""
387
391
 
388
- #: pyfemtet/_message/messages.py:148
392
+ #: pyfemtet/_message/messages.py:150
389
393
  msgid "Optimization status will be shown here."
390
394
  msgstr ""
391
395
 
392
- #: pyfemtet/_message/messages.py:149
396
+ #: pyfemtet/_message/messages.py:151
393
397
  msgid "Auto-update graph"
394
398
  msgstr ""
395
399
 
396
- #: pyfemtet/_message/messages.py:150
400
+ #: pyfemtet/_message/messages.py:152
397
401
  msgid "Interrupt Optimization"
398
402
  msgstr ""
399
403
 
400
- #: pyfemtet/_message/messages.py:152
404
+ #: pyfemtet/_message/messages.py:154
401
405
  msgid "Result"
402
406
  msgstr ""
403
407
 
404
- #: pyfemtet/_message/messages.py:154
408
+ #: pyfemtet/_message/messages.py:156
405
409
  msgid "Open Result in Femtet"
406
410
  msgstr ""
407
411
 
408
- #: pyfemtet/_message/messages.py:155
412
+ #: pyfemtet/_message/messages.py:157
409
413
  msgid "Reconstruct Model"
410
414
  msgstr ""
411
415
 
412
- #: pyfemtet/_message/messages.py:156
416
+ #: pyfemtet/_message/messages.py:158
413
417
  msgid "Drag and drop or select csv file"
414
418
  msgstr ""
415
419
 
416
- #: pyfemtet/_message/messages.py:157
420
+ #: pyfemtet/_message/messages.py:159
417
421
  msgid "Connection to Femtet is not established. Launch Femtet and Open a project."
418
422
  msgstr ""
419
423
 
420
- #: pyfemtet/_message/messages.py:158
424
+ #: pyfemtet/_message/messages.py:160
421
425
  msgid "No result plot is selected."
422
426
  msgstr ""
423
427
 
424
- #: pyfemtet/_message/messages.py:159
428
+ #: pyfemtet/_message/messages.py:161
425
429
  msgid "The femprj file path in the history csv is not found or valid."
426
430
  msgstr ""
427
431
 
428
- #: pyfemtet/_message/messages.py:160
432
+ #: pyfemtet/_message/messages.py:162
429
433
  msgid "The model name in the history csv is not found."
430
434
  msgstr ""
431
435
 
432
- #: pyfemtet/_message/messages.py:161
436
+ #: pyfemtet/_message/messages.py:163
433
437
  msgid ".pdt file is not found. Please check the .Results folder. Note that .pdt file save mode depends on the `save_pdt` argument of FemtetInterface in optimization script(default to `all`)."
434
438
  msgstr ""
435
439
 
436
- #: pyfemtet/_message/messages.py:166
440
+ #: pyfemtet/_message/messages.py:168
437
441
  msgid "Failed to open "
438
442
  msgstr ""
439
443
 
440
- #: pyfemtet/_message/messages.py:167
444
+ #: pyfemtet/_message/messages.py:169
441
445
  msgid "Specified model is not in current project. Please check opened project. For example, not \"analysis model only\" but your .femprj file."
442
446
  msgstr ""
443
447
 
444
- #: pyfemtet/_message/messages.py:170
448
+ #: pyfemtet/_message/messages.py:172
445
449
  msgid ".femprj file path of the history csv is invalid. Please certify matching between csv and opening .femprj file."
446
450
  msgstr ""
447
451
 
448
- #: pyfemtet/_message/messages.py:171
452
+ #: pyfemtet/_message/messages.py:173
449
453
  msgid "Analysis model name of the history csv is invalid. Please certify matching between csv and opening analysis model."
450
454
  msgstr ""
451
455
 
452
- #: pyfemtet/_message/messages.py:172
456
+ #: pyfemtet/_message/messages.py:174
453
457
  msgid "Analysis model name of the history csv and opened in Femtet is inconsistent. Please certify matching between csv and opening analysis model."
454
458
  msgstr ""
455
459
 
456
- #: pyfemtet/_message/messages.py:173
460
+ #: pyfemtet/_message/messages.py:175
457
461
  msgid "tutorial mode"
458
462
  msgstr ""
459
463
 
460
- #: pyfemtet/_message/messages.py:174
464
+ #: pyfemtet/_message/messages.py:176
461
465
  msgid "Load Sample CSV"
462
466
  msgstr ""
463
467
 
464
- #: pyfemtet/_message/messages.py:175
468
+ #: pyfemtet/_message/messages.py:177
465
469
  msgid "Load CSV"
466
470
  msgstr ""
467
471
 
468
- #: pyfemtet/_message/messages.py:176
472
+ #: pyfemtet/_message/messages.py:178
469
473
  msgid "Open your optimization result. Then connecting to femtet will start automatically. Note that in tutorial mode, this button loads the ready-made sample csv and open sample femprj."
470
474
  msgstr ""
471
475
 
472
- #: pyfemtet/_message/messages.py:178
476
+ #: pyfemtet/_message/messages.py:180
473
477
  msgid "Main Graph"
474
478
  msgstr ""
475
479
 
476
- #: pyfemtet/_message/messages.py:179
480
+ #: pyfemtet/_message/messages.py:181
477
481
  msgid "Here the optimization history is shown. Each plot represents single FEM result. You can pick a result to open the corresponding result in Femtet. "
478
482
  msgstr ""
479
483
 
480
- #: pyfemtet/_message/messages.py:182
484
+ #: pyfemtet/_message/messages.py:184
481
485
  msgid "Open Result"
482
486
  msgstr ""
483
487
 
484
- #: pyfemtet/_message/messages.py:183
488
+ #: pyfemtet/_message/messages.py:185
485
489
  msgid "After pick a point in the main graph, This button shows the corresponding FEM result in Femtet."
486
490
  msgstr ""
487
491
 
488
- #: pyfemtet/_message/messages.py:185
492
+ #: pyfemtet/_message/messages.py:187
489
493
  msgid "Re-connect to Femtet."
490
494
  msgstr ""
491
495
 
492
- #: pyfemtet/_message/messages.py:186
496
+ #: pyfemtet/_message/messages.py:188
493
497
  msgid "Sample csv is not found. Please consider to re-install pyfemtet by `py -m pip install pyfemtet -U --force-reinstall`"
494
498
  msgstr ""
495
499
 
496
- #: pyfemtet/_message/messages.py:187
500
+ #: pyfemtet/_message/messages.py:189
497
501
  msgid "Sample femprj file is not found. Please consider to re-install pyfemtet by `py -m pip install pyfemtet -U --force-reinstall`"
498
502
  msgstr ""
499
503
 
500
- #: pyfemtet/_message/messages.py:188
504
+ #: pyfemtet/_message/messages.py:190
501
505
  msgid "Sample femprj result folder is not found. Please consider to re-install pyfemtet by `py -m pip install pyfemtet -U --force-reinstall`"
502
506
  msgstr ""
503
507
 
504
- #: pyfemtet/_message/messages.py:190
508
+ #: pyfemtet/_message/messages.py:192
505
509
  msgid "Loading data..."
506
510
  msgstr ""
507
511
 
508
- #: pyfemtet/_message/messages.py:191
512
+ #: pyfemtet/_message/messages.py:193
509
513
  msgid "Plots of objectives versus trials"
510
514
  msgstr ""
511
515
 
512
- #: pyfemtet/_message/messages.py:192
516
+ #: pyfemtet/_message/messages.py:194
513
517
  msgid "The vertical axis is the objective, and the horizontal axis is the number of trials."
514
518
  msgstr ""
515
519
 
516
- #: pyfemtet/_message/messages.py:193
520
+ #: pyfemtet/_message/messages.py:195
517
521
  msgid "Parallel coordinate plots"
518
522
  msgstr ""
519
523
 
520
- #: pyfemtet/_message/messages.py:194
524
+ #: pyfemtet/_message/messages.py:196
521
525
  msgid "The vertical axis is an objective or parameters, and one polyline indicates one result."
522
526
  msgstr ""
523
527
 
524
- #: pyfemtet/_message/messages.py:195
528
+ #: pyfemtet/_message/messages.py:197
525
529
  msgid "The heatmap of objectives"
526
530
  msgstr ""
527
531
 
528
- #: pyfemtet/_message/messages.py:196
532
+ #: pyfemtet/_message/messages.py:198
529
533
  msgid "The axes are parameters, and the color shows objective value."
530
534
  msgstr ""
531
535
 
532
- #: pyfemtet/_message/messages.py:197
536
+ #: pyfemtet/_message/messages.py:199
533
537
  msgid "The response of an objective versus one parameter"
534
538
  msgstr ""
535
539
 
536
- #: pyfemtet/_message/messages.py:198
540
+ #: pyfemtet/_message/messages.py:200
537
541
  msgid "The vertical axis is objective, and the horizontal axis is parameter."
538
542
  msgstr ""
539
543
 
@@ -85,6 +85,8 @@ class Message:
85
85
  INFO_TERMINATING_EXCEL = _('Terminating Excel process...')
86
86
  INFO_TERMINATED_EXCEL = _('Excel process is terminated.')
87
87
  INFO_RESTORING_FEMTET_AUTOSAVE = _('Restore Femtet setting of autosave.')
88
+ ERR_PARAMETRIC_CSV_CONTAINS_ERROR = _('Failed to make output from Femtet. '
89
+ 'Please check output settings of Parametric Analysis.')
88
90
 
89
91
  # ===== pyfemtet.opt.optimizer =====
90
92
  ERR_NOT_IMPLEMENTED = _('The following features are not supported by the specified optimization method. ')
@@ -1,3 +1,4 @@
1
+ import warnings
1
2
  from typing import Optional, List, Final
2
3
 
3
4
  import os
@@ -90,6 +91,19 @@ class FemtetInterface(FEMInterface):
90
91
  it will be None and no parametric outputs are used
91
92
  as objectives.
92
93
 
94
+
95
+ Note:
96
+ Indexes start at 0, but the parametric analysis
97
+ output settings in the Femtet dialog box indicate
98
+ setting numbers starting at 1.
99
+
100
+
101
+ Warning:
102
+ **Setting this argument deletes the parametric
103
+ analysis swept table set in the femprj file.**
104
+ If you do not want to delete the swept table,
105
+ make a copy of the original file.
106
+
93
107
  **kwargs: Additional arguments from inherited classes.
94
108
 
95
109
  Warning:
@@ -117,6 +131,9 @@ class FemtetInterface(FEMInterface):
117
131
  parametric_output_indexes_use_as_objective: dict[int, str or float] = None,
118
132
  **kwargs # 継承されたクラスからの引数
119
133
  ):
134
+ # warning
135
+ if parametric_output_indexes_use_as_objective is not None:
136
+ warnings.warn('解析モデルに設定された既存のスイープテーブルは削除されます。')
120
137
 
121
138
  # win32com の初期化
122
139
  CoInitialize()
@@ -1,12 +1,147 @@
1
+ import os
2
+ import ctypes
3
+ # from ctypes import wintypes
1
4
  import logging
5
+ import warnings
6
+ from time import sleep, time
7
+ from packaging.version import Version
8
+
9
+ import numpy as np
10
+ import pandas as pd
11
+ from femtetutils import util
12
+ from femtetutils import logger as util_logger
2
13
 
3
- from femtetutils import util, logger
4
14
  from pyfemtet.dispatch_extensions import _get_pid
15
+ from pyfemtet.core import SolveError
16
+ from pyfemtet._message.messages import encoding, Message
17
+ from pyfemtet.logger import get_module_logger
5
18
 
6
- import ctypes
19
+ logger = get_module_logger('opt.fem.ParametricIF', __name__)
20
+
21
+ util_logger.setLevel(logging.ERROR)
22
+
23
+ # singleton pattern
24
+ _P_CSV: 'ParametricResultCSVProcessor' = None
25
+
26
+
27
+ def get_csv_processor(Femtet):
28
+ global _P_CSV
29
+ if _P_CSV is None:
30
+ _P_CSV = ParametricResultCSVProcessor(Femtet)
31
+ return _P_CSV
32
+
33
+
34
+ class ParametricResultCSVProcessor:
35
+
36
+ def __init__(self, Femtet):
37
+ self.Femtet = Femtet
38
+
39
+ def refresh_csv(self):
40
+ # 存在するならば削除する
41
+ csv_paths = self.get_csv_paths()
42
+ for path in csv_paths:
43
+ if os.path.exists(path):
44
+ os.remove(path)
45
+
46
+ def get_csv_paths(self):
47
+ # 結果フォルダを取得
48
+ path: str = self.Femtet.Project
49
+ res_dir_path = path.removesuffix('.femprj') + '.Results'
50
+
51
+ # csv を取得
52
+ model_name = self.Femtet.AnalysisModelName
53
+ csv_path = os.path.join(res_dir_path, f'{model_name}.csv')
54
+ table_csv_path = os.path.join(res_dir_path, f'{model_name}_table.csv')
55
+
56
+ return csv_path, table_csv_path
57
+
58
+ def check_csv_after_succeeded_PrmCalcExecute(self):
59
+ """Parametric Solve の後に呼ぶこと。"""
60
+
61
+ csv_path, table_csv_path = self.get_csv_paths()
62
+
63
+ # csv が生成されているか
64
+ start = time()
65
+ while not os.path.exists(csv_path):
66
+ # solve が succeeded であるにもかかわらず
67
+ # 数秒経過しても csv が存在しないのはおかしい
68
+ if time() - start > 3.:
69
+ return False
70
+ sleep(0.25)
71
+
72
+ # csv は存在するが、Femtet が古いと
73
+ # table は生成されない
74
+ if not os.path.exists(table_csv_path):
75
+ warnings.warn('テーブル形式 csv が生成されていないため、'
76
+ '結果出力エラーチェックが行われません。'
77
+ 'そのため、結果出力にエラーがある場合は'
78
+ '目的関数が 0 と記録される場合があります。'
79
+ '結果出力エラーチェック機能を利用するためには、'
80
+ 'Femtet を最新バージョンにアップデートして'
81
+ 'ください。')
82
+
83
+ return True
84
+
85
+ def is_succeeded(self, parametric_output_index):
86
+
87
+ # まず csv 保存が成功しているかどうか。通常あるはず。
88
+ if not self.check_csv_after_succeeded_PrmCalcExecute():
89
+ return False, 'Reason: output csv not found.'
90
+
91
+ # 成功しているならば table があるかどうか
92
+ csv_path, table_csv_path = self.get_csv_paths()
93
+
94
+ # なければエラーチェックできないので
95
+ # エラーなしとみなす (warning の記載通り)
96
+ if not os.path.exists(table_csv_path):
97
+ return True, None
98
+
99
+ # table があれば読み込む
100
+ df = pd.read_csv(table_csv_path, encoding=encoding)
7
101
 
102
+ # 結果出力用に行番号を付記する
103
+ df['row_num'] = range(2, len(df) + 2) # row=0 は header, excel は 1 始まり
8
104
 
9
- logger.setLevel(logging.ERROR)
105
+ # 「結果出力設定番号」カラムが存在するか
106
+ if '結果出力設定番号' in df.columns: # TODO: 英語版対応
107
+
108
+ # 与えられた output_number に関連する行だけ抜き出し
109
+ # エラーがあるかどうかチェックする
110
+ pdf = df['結果出力設定番号'] == parametric_output_index + 1
111
+
112
+ # 結果出力設定番号 カラムが存在しない
113
+ else:
114
+ # output_number に関係なくエラーがあればエラーにする
115
+ pdf = df
116
+
117
+ # エラーの有無を確認
118
+ if 'エラー' in pdf.columns: # TODO: 英語版対応
119
+ is_no_error = np.all(pdf['エラー'].isna().values)
120
+
121
+ if not is_no_error:
122
+ error_message_row_numbers = pdf['row_num'][~pdf['エラー'].isna()].values.astype(str)
123
+ error_messages = pdf['エラー'][~pdf['エラー'].isna()].values.astype(str)
124
+
125
+ def add_st_or_nd_or_th(n_: int):
126
+ if n_ == 1:
127
+ return f'{n_}st'
128
+ elif n_ == 2:
129
+ return f'{n_}nd'
130
+ elif n_ == 3:
131
+ return f'{n_}rd'
132
+ else:
133
+ return f'{n_}th'
134
+
135
+ error_msg = f'Error message(s) from {os.path.basename(table_csv_path)}: ' + ', '.join(
136
+ [f'({add_st_or_nd_or_th(row)} row) {message}' for row, message in zip(error_message_row_numbers, error_messages)])
137
+ else:
138
+ error_msg = None
139
+
140
+ else:
141
+ raise RuntimeError('Internal Error! Parametric Analysis '
142
+ 'output csv has no error column.')
143
+
144
+ return is_no_error, error_msg
10
145
 
11
146
 
12
147
  def _get_dll():
@@ -46,7 +181,6 @@ def add_parametric_results_as_objectives(femopt, indexes, directions) -> bool:
46
181
 
47
182
  # get objective names
48
183
  dll.GetPrmnResult.restype = ctypes.c_int
49
- n = dll.GetPrmnResult()
50
184
  for i, direction in zip(indexes, directions):
51
185
  # objective name
52
186
  dll.GetPrmResultName.restype = ctypes.c_char_p
@@ -58,6 +192,15 @@ def add_parametric_results_as_objectives(femopt, indexes, directions) -> bool:
58
192
 
59
193
 
60
194
  def _parametric_objective(Femtet, parametric_result_index):
195
+ # csv から結果取得エラーの有無を確認する
196
+ # (解析自体は成功していないと objective は呼ばれないはず)
197
+ csv_processor = get_csv_processor(Femtet)
198
+ succeeded, error_msg = csv_processor.is_succeeded(parametric_result_index)
199
+ if not succeeded:
200
+ logger.error(Message.ERR_PARAMETRIC_CSV_CONTAINS_ERROR)
201
+ logger.error(error_msg)
202
+ raise SolveError
203
+
61
204
  # load dll and set target femtet
62
205
  dll = _get_dll_with_set_femtet(Femtet)
63
206
  dll.GetPrmResult.restype = ctypes.c_double # 複素数の場合は実部しか取らない
@@ -65,9 +208,65 @@ def _parametric_objective(Femtet, parametric_result_index):
65
208
 
66
209
 
67
210
  def solve_via_parametric_dll(Femtet) -> bool:
211
+ csv_processor = get_csv_processor(Femtet)
212
+
213
+ # remove previous csv if exists
214
+ # 消さなくても解析はできるが
215
+ # エラーハンドリングのため
216
+ csv_processor.refresh_csv()
217
+
68
218
  # load dll and set target femtet
69
219
  dll = _get_dll_with_set_femtet(Femtet)
220
+
221
+ # reset existing sweep table
222
+ dll.ClearPrmSweepTable.restype = ctypes.c_bool
223
+ succeed = dll.ClearPrmSweepTable()
224
+ if not succeed:
225
+ logger.error('Failed to remove existing sweep table!') # 通常ありえないので error
226
+ return False
227
+
70
228
  # solve
71
229
  dll.PrmCalcExecute.restype = ctypes.c_bool
72
230
  succeed = dll.PrmCalcExecute()
231
+ if not succeed:
232
+ logger.warning('Failed to solve!') # 通常起こりえるので warn
233
+ return False
234
+
235
+ # Check post-processing error
236
+ # 現時点では table csv に index の情報がないので、
237
+ # エラーがどの番号のものかわからない。
238
+ # ただし、エラーがそのまま出力されるよりマシなので
239
+ # 安全目に引っ掛けることにする
240
+ succeed = csv_processor.check_csv_after_succeeded_PrmCalcExecute()
241
+ if not succeed:
242
+ logger.error('Failed to save parametric result csv!')
243
+ return False # 通常ありえないので error
244
+
73
245
  return succeed # 成功した場合はTRUE、失敗した場合はFALSEを返す
246
+
247
+
248
+ if __name__ == '__main__':
249
+ from win32com.client import Dispatch
250
+
251
+ g_Femtet = Dispatch('FemtetMacro.Femtet')
252
+ g_dll = _get_dll_with_set_femtet(g_Femtet)
253
+
254
+ # solve
255
+ g_succeeded = solve_via_parametric_dll(g_Femtet)
256
+ if not g_succeeded:
257
+ g_dll.GetLastErrorMsg.restype = ctypes.c_char_p # or wintypes.LPCSTR
258
+ g_error_msg: bytes = g_dll.GetLastErrorMsg()
259
+ g_error_msg: str = g_error_msg.decode(encoding='932')
260
+
261
+ # 結果取得:内部的にはエラーになっているはず
262
+ g_parametric_result_index = 1
263
+ g_dll = _get_dll_with_set_femtet(g_Femtet)
264
+ g_dll.GetPrmResult.restype = ctypes.c_double # 複素数やベクトルの場合は実部や第一成分しか取らない PIF の仕様
265
+ g_output = g_dll.GetPrmResult(g_parametric_result_index)
266
+
267
+ # ... だが、下記のコードでそれは出てこない。
268
+ # 値が実際に 0 である場合と切り分けられないので、
269
+ # csv を見てエラーがあるかどうか判断せざるを得ない。
270
+ g_dll.GetLastErrorMsg.restype = ctypes.c_char_p # or wintypes.LPCSTR
271
+ g_error_msg: bytes = g_dll.GetLastErrorMsg()
272
+ g_error_msg: str = g_error_msg.decode(encoding='932')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pyfemtet
3
- Version: 0.8.6
3
+ Version: 0.8.7
4
4
  Summary: Design parameter optimization using Femtet.
5
5
  License: BSD-3-Clause
6
6
  Author: kazuma.naito
@@ -1,4 +1,4 @@
1
- pyfemtet/__init__.py,sha256=B72_7DUBCOMnhKCvBwcwiuuCre398QDqqytHa0lXG-Q,21
1
+ pyfemtet/__init__.py,sha256=04WO81p8xrQAHiTKqHaDkKWih6M2Y3Hy-UCNVwih4Zc,21
2
2
  pyfemtet/_femtet_config_util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  pyfemtet/_femtet_config_util/autosave.py,sha256=dNirA9XGuFehas8_Jkj2BW9GOzMbPyhnt1WHcH_ObSU,2070
4
4
  pyfemtet/_femtet_config_util/exit.py,sha256=0BWID-tjOkmZwmgPFkcJMkWW39voccz5ARIBWvZbHaw,1877
@@ -6,10 +6,10 @@ pyfemtet/_message/1. make_pot.bat,sha256=wrTA0YaL7nUfNB0cS8zljOmwq2qgyG6RMwHQbrw
6
6
  pyfemtet/_message/2. make_mo.bat,sha256=6shJ3Yn4BXjDc0hhv_kiGUtVTq4oSRz8-iS4vW29rNE,155
7
7
  pyfemtet/_message/__init__.py,sha256=gE1-XX_PzHj9BbhqPaK5VcIHuv6_Tec5qlPMC3IRiBg,100
8
8
  pyfemtet/_message/babel.cfg,sha256=AQIFCQ7NlAA84PhV0gowHhbIXH41zA55mzhgyROniJk,73
9
- pyfemtet/_message/locales/ja/LC_MESSAGES/messages.mo,sha256=piTwHbUIWD_68JMMRvzRHD0IuIUdq0dJNYFy88ZjbQQ,18768
10
- pyfemtet/_message/locales/ja/LC_MESSAGES/messages.po,sha256=O5YDF47uPsLh4wXNgXz95p0U8895AbqLNJcLhRKIljE,25185
11
- pyfemtet/_message/locales/messages.pot,sha256=hHrjOC2W_ZOBaDedImBnLQpOeFYBF8K3G7165jYXTGo,14872
12
- pyfemtet/_message/messages.py,sha256=gvF6xwJHE2hlD3b4828Oqzv3jMO_OsZUYtQzRO6cXmk,13678
9
+ pyfemtet/_message/locales/ja/LC_MESSAGES/messages.mo,sha256=Af0m1bHsrMAjqyfLlDjW_OK09IXnuDvByaESf7BvuQU,18984
10
+ pyfemtet/_message/locales/ja/LC_MESSAGES/messages.po,sha256=CPVryK95GFl_GSSTz1uSvkKwXaYRvTboIr_aTgdfwbo,25441
11
+ pyfemtet/_message/locales/messages.pot,sha256=AxtocHuEX5VPgXgULpHBxU8swNLUzm9KEBbSP1Y6qP8,15017
12
+ pyfemtet/_message/messages.py,sha256=OsSXVLn9_YKwuHczW1A4CEnhZ0wrtHmOhxPA9OPOzHc,13856
13
13
  pyfemtet/_util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  pyfemtet/_util/dask_util.py,sha256=ufgr4m8slvyWP97lWBwolysQpJ1PmAO_-OI8IlEyvU8,233
15
15
  pyfemtet/_util/excel_macro_util.py,sha256=cF1Z3yl9FMM0J7dpMRTsle8uYxYcfHhQC0QffnVovdY,7944
@@ -42,8 +42,8 @@ pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_parametric.femprj,sha256=
42
42
  pyfemtet/opt/interface/__init__.py,sha256=na6-elI9-karOqoSxT9LfLQpjBPm1lrUWjow0NYYRP4,1349
43
43
  pyfemtet/opt/interface/_base.py,sha256=y0uQ5jdsWbgt5odyqPin7NXcK_IbUwPDcrrkV_JhpRw,2722
44
44
  pyfemtet/opt/interface/_excel_interface.py,sha256=s103vePTPXXYiPwGdAEUFgtpvGXtu1nSljDtP4HsmcY,40355
45
- pyfemtet/opt/interface/_femtet.py,sha256=teALmp66aJ_rrmtEOjCGDG1jGLTZr2AmvMFmuuXRQkw,34634
46
- pyfemtet/opt/interface/_femtet_parametric.py,sha256=0pAEhHflp0wIxWBVMXI8nCC02oAyRKLinH3Y6O8bq3M,2224
45
+ pyfemtet/opt/interface/_femtet.py,sha256=Tn0qgVMJDv-6hBPDOWYBtlfvhsb4UH3MknX0PaXb8ro,35313
46
+ pyfemtet/opt/interface/_femtet_parametric.py,sha256=rhvnpHdbjNJAKxiCkgnExnZdV5qOB6pBv6AaLeTkeF8,10155
47
47
  pyfemtet/opt/interface/_femtet_with_nx/__init__.py,sha256=-6W2g2FDEcKzGHmI5KAKQe-4U5jDpMj0CXuma-GZca0,83
48
48
  pyfemtet/opt/interface/_femtet_with_nx/_interface.py,sha256=LkaODUSpBLq05uz5Jf-JKuH6Evq8ElZoItXxFZopWeM,5994
49
49
  pyfemtet/opt/interface/_femtet_with_nx/update_model.py,sha256=P7VH0i_o-X9OUe6AGaLF1fACPeHNrMjcrOBCA3MMrI4,3092
@@ -137,8 +137,8 @@ pyfemtet/opt/visualization/result_viewer/.gitignore,sha256=ryvb4aqbbsHireHWlPQfx
137
137
  pyfemtet/opt/visualization/result_viewer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
138
  pyfemtet/opt/visualization/result_viewer/application.py,sha256=WcHBx_J5eNLKSaprpk9BGifwhO04oN8FiNGYTWorrXA,1691
139
139
  pyfemtet/opt/visualization/result_viewer/pages.py,sha256=MZAjzbuq0toZrR-iJhElM3A12_jHVCTt65gz1kdNPbw,32193
140
- pyfemtet-0.8.6.dist-info/LICENSE,sha256=sVQBhyoglGJUu65-BP3iR6ujORI6YgEU2Qm-V4fGlOA,1485
141
- pyfemtet-0.8.6.dist-info/METADATA,sha256=Nygc04MFehj-ZvJ5e3KuWq3CL2C94_tbTezHQdp5ubg,3509
142
- pyfemtet-0.8.6.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
143
- pyfemtet-0.8.6.dist-info/entry_points.txt,sha256=ZfYqRaoiPtuWqFi2_msccyrVF0LurMn-IHlYamAegZo,104
144
- pyfemtet-0.8.6.dist-info/RECORD,,
140
+ pyfemtet-0.8.7.dist-info/LICENSE,sha256=sVQBhyoglGJUu65-BP3iR6ujORI6YgEU2Qm-V4fGlOA,1485
141
+ pyfemtet-0.8.7.dist-info/METADATA,sha256=uy1fm6IKQ5OXU8kZ7bowgMIyCbyaQ9NTgaxz0r1DoV0,3509
142
+ pyfemtet-0.8.7.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
143
+ pyfemtet-0.8.7.dist-info/entry_points.txt,sha256=ZfYqRaoiPtuWqFi2_msccyrVF0LurMn-IHlYamAegZo,104
144
+ pyfemtet-0.8.7.dist-info/RECORD,,