pyfemtet 0.7.0__py3-none-any.whl → 0.8.0__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 (46) hide show
  1. pyfemtet/__init__.py +1 -1
  2. pyfemtet/_message/locales/ja/LC_MESSAGES/messages.mo +0 -0
  3. pyfemtet/_message/locales/ja/LC_MESSAGES/messages.po +112 -90
  4. pyfemtet/_message/locales/messages.pot +105 -89
  5. pyfemtet/_message/messages.py +6 -2
  6. pyfemtet/_util/dask_util.py +10 -0
  7. pyfemtet/_util/excel_macro_util.py +16 -4
  8. pyfemtet/_util/excel_parse_util.py +138 -0
  9. pyfemtet/_util/sample.xlsx +0 -0
  10. pyfemtet/brep/__init__.py +0 -3
  11. pyfemtet/brep/_impl.py +7 -3
  12. pyfemtet/opt/_femopt.py +69 -31
  13. pyfemtet/opt/_femopt_core.py +100 -36
  14. pyfemtet/opt/advanced_samples/excel_ui/(ref) original_project.femprj +0 -0
  15. pyfemtet/opt/advanced_samples/excel_ui/femtet-macro.xlsm +0 -0
  16. pyfemtet/opt/advanced_samples/excel_ui/pyfemtet-core.py +291 -0
  17. pyfemtet/opt/advanced_samples/excel_ui/test-pyfemtet-core.cmd +22 -0
  18. pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_create_training_data.py +60 -0
  19. pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_create_training_data_jp.py +57 -0
  20. pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_optimize_with_surrogate.py +100 -0
  21. pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_optimize_with_surrogate_jp.py +90 -0
  22. pyfemtet/opt/advanced_samples/surrogate_model/gal_ex13_parametric.femprj +0 -0
  23. pyfemtet/opt/interface/__init__.py +2 -0
  24. pyfemtet/opt/interface/_base.py +3 -0
  25. pyfemtet/opt/interface/_excel_interface.py +565 -204
  26. pyfemtet/opt/interface/_femtet.py +26 -29
  27. pyfemtet/opt/interface/_surrogate/__init__.py +5 -0
  28. pyfemtet/opt/interface/_surrogate/_base.py +85 -0
  29. pyfemtet/opt/interface/_surrogate/_chaospy.py +71 -0
  30. pyfemtet/opt/interface/_surrogate/_singletaskgp.py +70 -0
  31. pyfemtet/opt/optimizer/_base.py +30 -19
  32. pyfemtet/opt/optimizer/_optuna/_optuna.py +20 -8
  33. pyfemtet/opt/optimizer/_optuna/_pof_botorch.py +60 -18
  34. pyfemtet/opt/prediction/_base.py +8 -0
  35. pyfemtet/opt/prediction/single_task_gp.py +85 -62
  36. pyfemtet/opt/visualization/_complex_components/main_figure_creator.py +5 -5
  37. pyfemtet/opt/visualization/_complex_components/main_graph.py +7 -1
  38. pyfemtet/opt/visualization/_complex_components/pm_graph.py +1 -1
  39. pyfemtet/opt/visualization/_process_monitor/application.py +2 -2
  40. pyfemtet/opt/visualization/_process_monitor/pages.py +1 -1
  41. pyfemtet/opt/visualization/result_viewer/pages.py +1 -1
  42. {pyfemtet-0.7.0.dist-info → pyfemtet-0.8.0.dist-info}/METADATA +3 -2
  43. {pyfemtet-0.7.0.dist-info → pyfemtet-0.8.0.dist-info}/RECORD +46 -29
  44. {pyfemtet-0.7.0.dist-info → pyfemtet-0.8.0.dist-info}/WHEEL +1 -1
  45. {pyfemtet-0.7.0.dist-info → pyfemtet-0.8.0.dist-info}/LICENSE +0 -0
  46. {pyfemtet-0.7.0.dist-info → pyfemtet-0.8.0.dist-info}/entry_points.txt +0 -0
@@ -8,7 +8,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-11-27 21:24+0900\n"
11
+ "POT-Creation-Date: 2024-12-27 09:45+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"
@@ -173,351 +173,367 @@ msgstr ""
173
173
  msgid "Failed to update model in solidworks."
174
174
  msgstr ""
175
175
 
176
+ #: pyfemtet/_message/messages.py:84
177
+ msgid "Probability of feasibility is less than threshold."
178
+ msgstr ""
179
+
180
+ #: pyfemtet/_message/messages.py:85
181
+ msgid "Terminating Excel process..."
182
+ msgstr ""
183
+
176
184
  #: pyfemtet/_message/messages.py:86
177
- msgid "The following features are not supported by the specified optimization method. "
185
+ msgid "Excel process is terminated."
178
186
  msgstr ""
179
187
 
180
188
  #: pyfemtet/_message/messages.py:87
189
+ msgid "Restore Femtet setting of autosave."
190
+ msgstr ""
191
+
192
+ #: pyfemtet/_message/messages.py:90
193
+ msgid "The following features are not supported by the specified optimization method. "
194
+ msgstr ""
195
+
196
+ #: pyfemtet/_message/messages.py:91
181
197
  msgid "The parameter set does not match the one added with add_init_parameter."
182
198
  msgstr ""
183
199
 
184
- #: pyfemtet/_message/messages.py:88
200
+ #: pyfemtet/_message/messages.py:92
185
201
  msgid "An exception has occurred during FEM update. Current parameters are: "
186
202
  msgstr ""
187
203
 
188
- #: pyfemtet/_message/messages.py:89
204
+ #: pyfemtet/_message/messages.py:93
189
205
  msgid "The constraints were not satisfied for the following sets of variables:"
190
206
  msgstr ""
191
207
 
192
- #: pyfemtet/_message/messages.py:90
208
+ #: pyfemtet/_message/messages.py:94
193
209
  msgid "Current parameter set cannot update FEM and this optimization method cannot skip current parameter set. The optimization process will be terminated."
194
210
  msgstr ""
195
211
 
196
- #: pyfemtet/_message/messages.py:91
212
+ #: pyfemtet/_message/messages.py:95
197
213
  msgid "Optimization has been interrupted. Note that you cannot acquire the OptimizationResult in case of `trust-constr`, `TNC`, `SLSQP` or `COBYLA`."
198
214
  msgstr ""
199
215
 
200
- #: pyfemtet/_message/messages.py:92
216
+ #: pyfemtet/_message/messages.py:96
201
217
  msgid "You can use parameter constraint only with BoTorchSampler."
202
218
  msgstr ""
203
219
 
204
- #: pyfemtet/_message/messages.py:93
220
+ #: pyfemtet/_message/messages.py:97
205
221
  msgid "Scipy is deterministic, so whether you set a seed or not will not change the results."
206
222
  msgstr ""
207
223
 
208
- #: pyfemtet/_message/messages.py:94
224
+ #: pyfemtet/_message/messages.py:98
209
225
  msgid "Start to candidate new parameter set with constraints. This process may take a long time."
210
226
  msgstr ""
211
227
 
212
- #: pyfemtet/_message/messages.py:95
228
+ #: pyfemtet/_message/messages.py:99
213
229
  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."
214
230
  msgstr ""
215
231
 
216
- #: pyfemtet/_message/messages.py:99
232
+ #: pyfemtet/_message/messages.py:103
217
233
  msgid "Connect to Femtet"
218
234
  msgstr ""
219
235
 
220
- #: pyfemtet/_message/messages.py:100
236
+ #: pyfemtet/_message/messages.py:104
221
237
  msgid "Analysis model name described in csv does not exist in project."
222
238
  msgstr ""
223
239
 
224
- #: pyfemtet/_message/messages.py:101
240
+ #: pyfemtet/_message/messages.py:105
225
241
  msgid "History csv is not read yet. Open your project manually."
226
242
  msgstr ""
227
243
 
228
- #: pyfemtet/_message/messages.py:102
244
+ #: pyfemtet/_message/messages.py:106
229
245
  msgid "Cannot read project data from csv. Open your project manually."
230
246
  msgstr ""
231
247
 
232
- #: pyfemtet/_message/messages.py:103
248
+ #: pyfemtet/_message/messages.py:107
233
249
  msgid ".femprj file described in csv is not found. Open your project manually."
234
250
  msgstr ""
235
251
 
236
- #: pyfemtet/_message/messages.py:104
252
+ #: pyfemtet/_message/messages.py:108
237
253
  msgid "Analysis model name is not specified. Open your model in the project manually."
238
254
  msgstr ""
239
255
 
240
- #: pyfemtet/_message/messages.py:106
256
+ #: pyfemtet/_message/messages.py:110
241
257
  msgid "Constraint"
242
258
  msgstr ""
243
259
 
244
- #: pyfemtet/_message/messages.py:107
260
+ #: pyfemtet/_message/messages.py:111
245
261
  msgid "feasible"
246
262
  msgstr ""
247
263
 
248
- #: pyfemtet/_message/messages.py:108
264
+ #: pyfemtet/_message/messages.py:112
249
265
  msgid "infeasible"
250
266
  msgstr ""
251
267
 
252
- #: pyfemtet/_message/messages.py:109
268
+ #: pyfemtet/_message/messages.py:113
253
269
  msgid "Optimality"
254
270
  msgstr ""
255
271
 
256
- #: pyfemtet/_message/messages.py:110
272
+ #: pyfemtet/_message/messages.py:114
257
273
  msgid "non dominated"
258
274
  msgstr ""
259
275
 
260
- #: pyfemtet/_message/messages.py:111
276
+ #: pyfemtet/_message/messages.py:115
261
277
  msgid "dominated"
262
278
  msgstr ""
263
279
 
264
- #: pyfemtet/_message/messages.py:112
280
+ #: pyfemtet/_message/messages.py:116
265
281
  msgid "Hypervolume Plot"
266
282
  msgstr ""
267
283
 
268
- #: pyfemtet/_message/messages.py:113
284
+ #: pyfemtet/_message/messages.py:117
269
285
  msgid "Objective Plot"
270
286
  msgstr ""
271
287
 
272
- #: pyfemtet/_message/messages.py:114
288
+ #: pyfemtet/_message/messages.py:118
273
289
  msgid "Multi Objective Pair Plot"
274
290
  msgstr ""
275
291
 
276
- #: pyfemtet/_message/messages.py:115
277
- msgid "trial number"
292
+ #: pyfemtet/_message/messages.py:119
293
+ msgid "Succeeded trial number"
278
294
  msgstr ""
279
295
 
280
- #: pyfemtet/_message/messages.py:116
296
+ #: pyfemtet/_message/messages.py:120
281
297
  msgid "All solutions"
282
298
  msgstr ""
283
299
 
284
- #: pyfemtet/_message/messages.py:117
285
- msgid "Transition of optimal solutions"
300
+ #: pyfemtet/_message/messages.py:121
301
+ msgid "Transition of<br>optimal solutions"
286
302
  msgstr ""
287
303
 
288
- #: pyfemtet/_message/messages.py:118
304
+ #: pyfemtet/_message/messages.py:122
289
305
  msgid "Target value"
290
306
  msgstr ""
291
307
 
292
- #: pyfemtet/_message/messages.py:120
308
+ #: pyfemtet/_message/messages.py:124
293
309
  msgid "Objectives"
294
310
  msgstr ""
295
311
 
296
- #: pyfemtet/_message/messages.py:121
312
+ #: pyfemtet/_message/messages.py:125
297
313
  msgid "Objectives (all)"
298
314
  msgstr ""
299
315
 
300
- #: pyfemtet/_message/messages.py:123
316
+ #: pyfemtet/_message/messages.py:127
301
317
  msgid "Prediction Model"
302
318
  msgstr ""
303
319
 
304
- #: pyfemtet/_message/messages.py:124
320
+ #: pyfemtet/_message/messages.py:128
305
321
  msgid " Recalculate Model"
306
322
  msgstr ""
307
323
 
308
- #: pyfemtet/_message/messages.py:125
324
+ #: pyfemtet/_message/messages.py:129
309
325
  msgid " Redraw graph"
310
326
  msgstr ""
311
327
 
312
- #: pyfemtet/_message/messages.py:126
328
+ #: pyfemtet/_message/messages.py:130
313
329
  msgid "Parameter"
314
330
  msgstr ""
315
331
 
316
- #: pyfemtet/_message/messages.py:127
332
+ #: pyfemtet/_message/messages.py:131
317
333
  msgid "Parameter2"
318
334
  msgstr ""
319
335
 
320
- #: pyfemtet/_message/messages.py:128
336
+ #: pyfemtet/_message/messages.py:132
321
337
  msgid "Objective"
322
338
  msgstr ""
323
339
 
324
- #: pyfemtet/_message/messages.py:129
340
+ #: pyfemtet/_message/messages.py:133
325
341
  msgid "No history selected."
326
342
  msgstr ""
327
343
 
328
- #: pyfemtet/_message/messages.py:130
344
+ #: pyfemtet/_message/messages.py:134
329
345
  msgid "No FEM result (yet)."
330
346
  msgstr ""
331
347
 
332
- #: pyfemtet/_message/messages.py:131
348
+ #: pyfemtet/_message/messages.py:135
333
349
  msgid "Prediction model is not calculated yet."
334
350
  msgstr ""
335
351
 
336
- #: pyfemtet/_message/messages.py:132
352
+ #: pyfemtet/_message/messages.py:136
337
353
  msgid "Cannot select same parameter"
338
354
  msgstr ""
339
355
 
340
- #: pyfemtet/_message/messages.py:133
356
+ #: pyfemtet/_message/messages.py:137
341
357
  msgid "3D graph (two or more parameters required)"
342
358
  msgstr ""
343
359
 
344
- #: pyfemtet/_message/messages.py:135
360
+ #: pyfemtet/_message/messages.py:139
345
361
  msgid "Prediction Model of Objective"
346
362
  msgstr ""
347
363
 
348
- #: pyfemtet/_message/messages.py:136
364
+ #: pyfemtet/_message/messages.py:140
349
365
  msgid "prediction model"
350
366
  msgstr ""
351
367
 
352
- #: pyfemtet/_message/messages.py:137
368
+ #: pyfemtet/_message/messages.py:141
353
369
  msgid "std. dev. of model"
354
370
  msgstr ""
355
371
 
356
- #: pyfemtet/_message/messages.py:139
372
+ #: pyfemtet/_message/messages.py:143
357
373
  msgid "Progress"
358
374
  msgstr ""
359
375
 
360
- #: pyfemtet/_message/messages.py:140
376
+ #: pyfemtet/_message/messages.py:144
361
377
  msgid "Prediction"
362
378
  msgstr ""
363
379
 
364
- #: pyfemtet/_message/messages.py:141
380
+ #: pyfemtet/_message/messages.py:145
365
381
  msgid "Workers"
366
382
  msgstr ""
367
383
 
368
- #: pyfemtet/_message/messages.py:142
384
+ #: pyfemtet/_message/messages.py:146
369
385
  msgid "Details"
370
386
  msgstr ""
371
387
 
372
- #: pyfemtet/_message/messages.py:144
388
+ #: pyfemtet/_message/messages.py:148
373
389
  msgid "Optimization status will be shown here."
374
390
  msgstr ""
375
391
 
376
- #: pyfemtet/_message/messages.py:145
392
+ #: pyfemtet/_message/messages.py:149
377
393
  msgid "Auto-update graph"
378
394
  msgstr ""
379
395
 
380
- #: pyfemtet/_message/messages.py:146
396
+ #: pyfemtet/_message/messages.py:150
381
397
  msgid "Interrupt Optimization"
382
398
  msgstr ""
383
399
 
384
- #: pyfemtet/_message/messages.py:148
400
+ #: pyfemtet/_message/messages.py:152
385
401
  msgid "Result"
386
402
  msgstr ""
387
403
 
388
- #: pyfemtet/_message/messages.py:150
404
+ #: pyfemtet/_message/messages.py:154
389
405
  msgid "Open Result in Femtet"
390
406
  msgstr ""
391
407
 
392
- #: pyfemtet/_message/messages.py:151
408
+ #: pyfemtet/_message/messages.py:155
393
409
  msgid "Reconstruct Model"
394
410
  msgstr ""
395
411
 
396
- #: pyfemtet/_message/messages.py:152
412
+ #: pyfemtet/_message/messages.py:156
397
413
  msgid "Drag and drop or select csv file"
398
414
  msgstr ""
399
415
 
400
- #: pyfemtet/_message/messages.py:153
416
+ #: pyfemtet/_message/messages.py:157
401
417
  msgid "Connection to Femtet is not established. Launch Femtet and Open a project."
402
418
  msgstr ""
403
419
 
404
- #: pyfemtet/_message/messages.py:154
420
+ #: pyfemtet/_message/messages.py:158
405
421
  msgid "No result plot is selected."
406
422
  msgstr ""
407
423
 
408
- #: pyfemtet/_message/messages.py:155
424
+ #: pyfemtet/_message/messages.py:159
409
425
  msgid "The femprj file path in the history csv is not found or valid."
410
426
  msgstr ""
411
427
 
412
- #: pyfemtet/_message/messages.py:156
428
+ #: pyfemtet/_message/messages.py:160
413
429
  msgid "The model name in the history csv is not found."
414
430
  msgstr ""
415
431
 
416
- #: pyfemtet/_message/messages.py:157
432
+ #: pyfemtet/_message/messages.py:161
417
433
  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`)."
418
434
  msgstr ""
419
435
 
420
- #: pyfemtet/_message/messages.py:162
436
+ #: pyfemtet/_message/messages.py:166
421
437
  msgid "Failed to open "
422
438
  msgstr ""
423
439
 
424
- #: pyfemtet/_message/messages.py:163
440
+ #: pyfemtet/_message/messages.py:167
425
441
  msgid "Specified model is not in current project. Please check opened project. For example, not \"analysis model only\" but your .femprj file."
426
442
  msgstr ""
427
443
 
428
- #: pyfemtet/_message/messages.py:166
444
+ #: pyfemtet/_message/messages.py:170
429
445
  msgid ".femprj file path of the history csv is invalid. Please certify matching between csv and opening .femprj file."
430
446
  msgstr ""
431
447
 
432
- #: pyfemtet/_message/messages.py:167
448
+ #: pyfemtet/_message/messages.py:171
433
449
  msgid "Analysis model name of the history csv is invalid. Please certify matching between csv and opening analysis model."
434
450
  msgstr ""
435
451
 
436
- #: pyfemtet/_message/messages.py:168
452
+ #: pyfemtet/_message/messages.py:172
437
453
  msgid "Analysis model name of the history csv and opened in Femtet is inconsistent. Please certify matching between csv and opening analysis model."
438
454
  msgstr ""
439
455
 
440
- #: pyfemtet/_message/messages.py:169
456
+ #: pyfemtet/_message/messages.py:173
441
457
  msgid "tutorial mode"
442
458
  msgstr ""
443
459
 
444
- #: pyfemtet/_message/messages.py:170
460
+ #: pyfemtet/_message/messages.py:174
445
461
  msgid "Load Sample CSV"
446
462
  msgstr ""
447
463
 
448
- #: pyfemtet/_message/messages.py:171
464
+ #: pyfemtet/_message/messages.py:175
449
465
  msgid "Load CSV"
450
466
  msgstr ""
451
467
 
452
- #: pyfemtet/_message/messages.py:172
468
+ #: pyfemtet/_message/messages.py:176
453
469
  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."
454
470
  msgstr ""
455
471
 
456
- #: pyfemtet/_message/messages.py:174
472
+ #: pyfemtet/_message/messages.py:178
457
473
  msgid "Main Graph"
458
474
  msgstr ""
459
475
 
460
- #: pyfemtet/_message/messages.py:175
476
+ #: pyfemtet/_message/messages.py:179
461
477
  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. "
462
478
  msgstr ""
463
479
 
464
- #: pyfemtet/_message/messages.py:178
480
+ #: pyfemtet/_message/messages.py:182
465
481
  msgid "Open Result"
466
482
  msgstr ""
467
483
 
468
- #: pyfemtet/_message/messages.py:179
484
+ #: pyfemtet/_message/messages.py:183
469
485
  msgid "After pick a point in the main graph, This button shows the corresponding FEM result in Femtet."
470
486
  msgstr ""
471
487
 
472
- #: pyfemtet/_message/messages.py:181
488
+ #: pyfemtet/_message/messages.py:185
473
489
  msgid "Re-connect to Femtet."
474
490
  msgstr ""
475
491
 
476
- #: pyfemtet/_message/messages.py:182
492
+ #: pyfemtet/_message/messages.py:186
477
493
  msgid "Sample csv is not found. Please consider to re-install pyfemtet by `py -m pip install pyfemtet -U --force-reinstall`"
478
494
  msgstr ""
479
495
 
480
- #: pyfemtet/_message/messages.py:183
496
+ #: pyfemtet/_message/messages.py:187
481
497
  msgid "Sample femprj file is not found. Please consider to re-install pyfemtet by `py -m pip install pyfemtet -U --force-reinstall`"
482
498
  msgstr ""
483
499
 
484
- #: pyfemtet/_message/messages.py:184
500
+ #: pyfemtet/_message/messages.py:188
485
501
  msgid "Sample femprj result folder is not found. Please consider to re-install pyfemtet by `py -m pip install pyfemtet -U --force-reinstall`"
486
502
  msgstr ""
487
503
 
488
- #: pyfemtet/_message/messages.py:186
504
+ #: pyfemtet/_message/messages.py:190
489
505
  msgid "Loading data..."
490
506
  msgstr ""
491
507
 
492
- #: pyfemtet/_message/messages.py:187
508
+ #: pyfemtet/_message/messages.py:191
493
509
  msgid "Plots of objectives versus trials"
494
510
  msgstr ""
495
511
 
496
- #: pyfemtet/_message/messages.py:188
512
+ #: pyfemtet/_message/messages.py:192
497
513
  msgid "The vertical axis is the objective, and the horizontal axis is the number of trials."
498
514
  msgstr ""
499
515
 
500
- #: pyfemtet/_message/messages.py:189
516
+ #: pyfemtet/_message/messages.py:193
501
517
  msgid "Parallel coordinate plots"
502
518
  msgstr ""
503
519
 
504
- #: pyfemtet/_message/messages.py:190
520
+ #: pyfemtet/_message/messages.py:194
505
521
  msgid "The vertical axis is an objective or parameters, and one polyline indicates one result."
506
522
  msgstr ""
507
523
 
508
- #: pyfemtet/_message/messages.py:191
524
+ #: pyfemtet/_message/messages.py:195
509
525
  msgid "The heatmap of objectives"
510
526
  msgstr ""
511
527
 
512
- #: pyfemtet/_message/messages.py:192
528
+ #: pyfemtet/_message/messages.py:196
513
529
  msgid "The axes are parameters, and the color shows objective value."
514
530
  msgstr ""
515
531
 
516
- #: pyfemtet/_message/messages.py:193
532
+ #: pyfemtet/_message/messages.py:197
517
533
  msgid "The response of an objective versus one parameter"
518
534
  msgstr ""
519
535
 
520
- #: pyfemtet/_message/messages.py:194
536
+ #: pyfemtet/_message/messages.py:198
521
537
  msgid "The vertical axis is objective, and the horizontal axis is parameter."
522
538
  msgstr ""
523
539
 
@@ -81,6 +81,10 @@ class Message:
81
81
  ERR_FAILED_TO_SAVE_JPG = _('Failed to save screenshot (.jpg).')
82
82
  ERR_JPG_NOT_FOUND = _('Screenshot (.jpg) is not found.')
83
83
  ERR_UPDATE_SOLIDWORKS_MODEL_FAILED = _('Failed to update model in solidworks.')
84
+ INFO_POF_IS_LESS_THAN_THRESHOLD = _('Probability of feasibility is less than threshold.')
85
+ INFO_TERMINATING_EXCEL = _('Terminating Excel process...')
86
+ INFO_TERMINATED_EXCEL = _('Excel process is terminated.')
87
+ INFO_RESTORING_FEMTET_AUTOSAVE = _('Restore Femtet setting of autosave.')
84
88
 
85
89
  # ===== pyfemtet.opt.optimizer =====
86
90
  ERR_NOT_IMPLEMENTED = _('The following features are not supported by the specified optimization method. ')
@@ -112,9 +116,9 @@ class Message:
112
116
  GRAPH_TITLE_HYPERVOLUME = _('Hypervolume Plot')
113
117
  GRAPH_TITLE_SINGLE_OBJECTIVE = _('Objective Plot')
114
118
  GRAPH_TITLE_MULTI_OBJECTIVE = _('Multi Objective Pair Plot')
115
- GRAPH_AXIS_LABEL_TRIAL = _('trial number')
119
+ GRAPH_AXIS_LABEL_TRIAL = _('Succeeded trial number')
116
120
  LEGEND_LABEL_ALL_SOLUTIONS = _('All solutions')
117
- LEGEND_LABEL_OPTIMAL_SOLUTIONS = _('Transition of optimal solutions')
121
+ LEGEND_LABEL_OPTIMAL_SOLUTIONS = _('Transition of<br>optimal solutions')
118
122
  LEGEND_LABEL_OBJECTIVE_TARGET = _('Target value')
119
123
  # main_graph.py
120
124
  TAB_LABEL_OBJECTIVE_PLOT = _('Objectives')
@@ -0,0 +1,10 @@
1
+ from contextlib import nullcontext
2
+ from dask.distributed import Lock
3
+
4
+
5
+ def lock_or_no_lock(name: str, client=None):
6
+ lock = Lock(name, client)
7
+ if lock.client is None:
8
+ return nullcontext()
9
+ else:
10
+ return lock
@@ -5,16 +5,27 @@ import asyncio # for timeout
5
5
  import win32gui
6
6
  import win32con
7
7
  import win32api
8
+ import win32process
8
9
 
9
10
  from pyfemtet.logger import get_module_logger
10
11
 
11
12
  logger = get_module_logger('util.excel', __name__)
12
13
 
13
14
 
15
+ def _get_pid(hwnd):
16
+ """Window handle から process ID を取得します."""
17
+ if hwnd > 0:
18
+ _, pid = win32process.GetWindowThreadProcessId(hwnd)
19
+ else:
20
+ pid = 0
21
+ return pid
22
+
23
+
14
24
  class _ExcelDialogProcessor:
15
25
 
16
26
  def __init__(self, excel_, timeout, restore_book=True):
17
27
  self.excel = excel_
28
+ self.excel_pid = _get_pid(excel_.hWnd)
18
29
  self.__excel_window_title = f' - Excel' # {basename} - Excel
19
30
  self.__error_dialog_title = 'Microsoft Visual Basic'
20
31
  self.__vbe_window_title = f'Microsoft Visual Basic for Applications - ' # Microsoft Visual Basic for Applications - {basename}
@@ -42,6 +53,7 @@ class _ExcelDialogProcessor:
42
53
  win32gui.EnumWindows(self.enum_callback_to_close_dialog, found)
43
54
  await asyncio.sleep(0.5)
44
55
  if any(found):
56
+ await asyncio.sleep(1.)
45
57
  break
46
58
 
47
59
  logger.debug('ブックを閉じます。')
@@ -56,7 +68,7 @@ class _ExcelDialogProcessor:
56
68
  def enum_callback_to_activate(self, hwnd, _):
57
69
  title = win32gui.GetWindowText(hwnd)
58
70
  # Excel 本体
59
- if self.__excel_window_title in title:
71
+ if (self.excel_pid == _get_pid(hwnd)) and (self.__excel_window_title in title):
60
72
  # Visible == True の際、エラーが発生した際、
61
73
  # 一度 Excel ウィンドウをアクティブ化しないと dialog が出てこない
62
74
  # が、これだけではダメかも。
@@ -65,7 +77,7 @@ class _ExcelDialogProcessor:
65
77
  def enum_callback_to_close_dialog(self, hwnd, found):
66
78
  title = win32gui.GetWindowText(hwnd)
67
79
  # エラーダイアログ
68
- if self.__error_dialog_title == title:
80
+ if (self.excel_pid == _get_pid(hwnd)) and (self.__error_dialog_title == title):
69
81
  # 何故かこのコマンド以外受け付けず、
70
82
  # このコマンドで問答無用でデバッグモードに入る
71
83
  logger.debug('エラーダイアログを見つけました。')
@@ -77,14 +89,14 @@ class _ExcelDialogProcessor:
77
89
  def enum_callback_to_close_confirm_dialog(self, hwnd, _):
78
90
  title = win32gui.GetWindowText(hwnd)
79
91
  # 確認ダイアログ
80
- if "Microsoft Excel" in title:
92
+ if (self.excel_pid == _get_pid(hwnd)) and ("Microsoft Excel" in title):
81
93
  # DisplayAlerts が False の場合は不要
82
94
  win32gui.SendMessage(hwnd, win32con.WM_SYSCOMMAND, win32con.SC_CLOSE, 0)
83
95
 
84
96
  def enum_callback_to_close_book(self, hwnd, _):
85
97
  title = win32gui.GetWindowText(hwnd)
86
98
  # VBE
87
- if self.__vbe_window_title in title:
99
+ if (self.excel_pid == _get_pid(hwnd)) and (self.__vbe_window_title in title):
88
100
  # 何故かこれで book 本体が閉じる
89
101
  win32gui.SendMessage(hwnd, win32con.WM_CLOSE, 0, 0)
90
102