pyfemtet 0.6.5__tar.gz → 0.7.0__tar.gz
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-0.6.5 → pyfemtet-0.7.0}/PKG-INFO +3 -1
- pyfemtet-0.7.0/pyfemtet/__init__.py +1 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/_femtet_config_util/exit.py +3 -2
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/_util/excel_macro_util.py +9 -12
- pyfemtet-0.7.0/pyfemtet/brep/__init__.py +3 -0
- pyfemtet-0.7.0/pyfemtet/brep/_impl.py +14 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/dispatch_extensions/__init__.py +0 -1
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/dispatch_extensions/_impl.py +2 -5
- pyfemtet-0.7.0/pyfemtet/logger/__init__.py +22 -0
- pyfemtet-0.7.0/pyfemtet/logger/_impl.py +231 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/_femopt_core.py +29 -28
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/_test_utils/control_femtet.py +0 -6
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/interface/__init__.py +1 -1
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/interface/_base.py +2 -4
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/interface/_excel_interface.py +202 -55
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/interface/_femtet.py +7 -1
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/interface/_femtet_parametric.py +1 -1
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/interface/_femtet_with_nx/_interface.py +1 -1
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/interface/_femtet_with_sldworks.py +1 -1
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/optimizer/_base.py +3 -4
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/optimizer/_optuna/_botorch_patch/enable_nonlinear_constraint.py +4 -1
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/constrained_pipe.py +0 -1
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_base.py +4 -4
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyproject.toml +6 -1
- pyfemtet-0.6.5/pyfemtet/__init__.py +0 -1
- pyfemtet-0.6.5/pyfemtet/logger/__init__.py +0 -3
- pyfemtet-0.6.5/pyfemtet/logger/_impl.py +0 -107
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/LICENSE +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/README.md +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/_femtet_config_util/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/_femtet_config_util/autosave.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/_message/1. make_pot.bat +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/_message/2. make_mo.bat +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/_message/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/_message/babel.cfg +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/_message/locales/ja/LC_MESSAGES/messages.po +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/_message/locales/messages.pot +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/_message/messages.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/_util/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/_warning.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/core.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/_femopt.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/_test_utils/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/_test_utils/hyper_sphere.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/_test_utils/record_history.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/interface/_femtet_with_nx/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/interface/_femtet_with_nx/update_model.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/optimizer/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/optimizer/_optuna/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/optimizer/_optuna/_botorch_patch/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/optimizer/_optuna/_optuna.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/optimizer/_optuna/_pof_botorch.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/optimizer/_scipy.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/optimizer/_scipy_scalar.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/optimizer/parameter.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/prediction/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/prediction/_base.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/prediction/single_task_gp.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/ParametricIF.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/ParametricIF.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/ParametricIF_test_result.reccsv +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/cad_ex01_NX.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/cad_ex01_NX.prt +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/cad_ex01_NX.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/cad_ex01_NX_test_result.reccsv +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/cad_ex01_SW.SLDPRT +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/cad_ex01_SW.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/cad_ex01_SW.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/cad_ex01_SW_test_result.reccsv +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/constrained_pipe.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/constrained_pipe_test_result.reccsv +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/gal_ex58_parametric.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/gal_ex58_parametric.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/gal_ex58_parametric_test_result.reccsv +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/gau_ex08_parametric.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/gau_ex08_parametric.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/gau_ex08_parametric_test_result.reccsv +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/her_ex40_parametric.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/her_ex40_parametric.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/her_ex40_parametric_test_result.reccsv +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/paswat_ex1_parametric.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/paswat_ex1_parametric.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/paswat_ex1_parametric_parallel.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/paswat_ex1_parametric_test_result.reccsv +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/wat_ex14_parametric.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/wat_ex14_parametric.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/wat_ex14_parametric_parallel.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample/wat_ex14_parametric_test_result.reccsv +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/ParametricIF_jp.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/ParametricIF_jp.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/cad_ex01_NX_jp.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/cad_ex01_NX_jp.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/cad_ex01_SW_jp.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/cad_ex01_SW_jp.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/constrained_pipe_jp.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/gal_ex58_parametric_jp.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/gal_ex58_parametric_jp.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/gau_ex08_parametric_jp.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/gau_ex08_parametric_jp.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/her_ex40_parametric_jp.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/her_ex40_parametric_jp.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/paswat_ex1_parametric_jp.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/paswat_ex1_parametric_jp.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/paswat_ex1_parametric_parallel_jp.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/wat_ex14_parametric_jp.femprj +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/wat_ex14_parametric_jp.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/samples/femprj_sample_jp/wat_ex14_parametric_parallel_jp.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_complex_components/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_complex_components/alert_region.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_complex_components/control_femtet.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_complex_components/main_figure_creator.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_complex_components/main_graph.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_complex_components/pm_graph.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_complex_components/pm_graph_creator.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_create_wrapped_components.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_process_monitor/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_process_monitor/application.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_process_monitor/pages.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_wrapped_components/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_wrapped_components/dbc.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_wrapped_components/dcc.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_wrapped_components/html.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/_wrapped_components/str_enum.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/result_viewer/.gitignore +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/result_viewer/__init__.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/result_viewer/application.py +0 -0
- {pyfemtet-0.6.5 → pyfemtet-0.7.0}/pyfemtet/opt/visualization/result_viewer/pages.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pyfemtet
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: Design parameter optimization using Femtet.
|
|
5
5
|
Home-page: https://github.com/pyfemtet/pyfemtet
|
|
6
6
|
License: BSD-3-Clause
|
|
@@ -12,8 +12,10 @@ Classifier: Programming Language :: Python :: 3
|
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.10
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.11
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Provides-Extra: brep
|
|
15
16
|
Requires-Dist: babel (>=2.15.0,<3.0.0)
|
|
16
17
|
Requires-Dist: botorch (==0.9.5)
|
|
18
|
+
Requires-Dist: brepmatching (>=0.1.6,<0.2.0) ; extra == "brep"
|
|
17
19
|
Requires-Dist: colorlog (>=6.8.0,<7.0.0)
|
|
18
20
|
Requires-Dist: dash (>=2.17.0,<3.0.0)
|
|
19
21
|
Requires-Dist: dash-bootstrap-components (>=1.5.0,<2.0.0)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.7.0"
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
from time import time, sleep
|
|
2
|
-
import logging
|
|
3
2
|
|
|
4
3
|
from win32com.client import CDispatch
|
|
5
4
|
from femtetutils import util
|
|
@@ -9,7 +8,9 @@ from pyfemtet.dispatch_extensions._impl import _get_pid
|
|
|
9
8
|
from pyfemtet.core import _version
|
|
10
9
|
from pyfemtet._message import Msg
|
|
11
10
|
|
|
12
|
-
logger
|
|
11
|
+
from pyfemtet.logger import get_module_logger
|
|
12
|
+
|
|
13
|
+
logger = get_module_logger('util.femtet.exit', __name__)
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
def _exit_or_force_terminate(timeout, Femtet: CDispatch, force=True):
|
|
@@ -1,25 +1,19 @@
|
|
|
1
1
|
"""Excel のエラーダイアログを補足します。"""
|
|
2
|
-
import sys
|
|
3
2
|
from time import sleep
|
|
4
3
|
from threading import Thread
|
|
5
|
-
import logging
|
|
6
4
|
import asyncio # for timeout
|
|
7
5
|
import win32gui
|
|
8
6
|
import win32con
|
|
9
7
|
import win32api
|
|
10
8
|
|
|
11
|
-
logger
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
handler = logging.StreamHandler(sys.stdout)
|
|
15
|
-
handler.setFormatter(formatter)
|
|
16
|
-
logger.addHandler(handler)
|
|
17
|
-
logger.setLevel(logging.DEBUG)
|
|
9
|
+
from pyfemtet.logger import get_module_logger
|
|
10
|
+
|
|
11
|
+
logger = get_module_logger('util.excel', __name__)
|
|
18
12
|
|
|
19
13
|
|
|
20
14
|
class _ExcelDialogProcessor:
|
|
21
15
|
|
|
22
|
-
def __init__(self, excel_, timeout):
|
|
16
|
+
def __init__(self, excel_, timeout, restore_book=True):
|
|
23
17
|
self.excel = excel_
|
|
24
18
|
self.__excel_window_title = f' - Excel' # {basename} - Excel
|
|
25
19
|
self.__error_dialog_title = 'Microsoft Visual Basic'
|
|
@@ -31,6 +25,7 @@ class _ExcelDialogProcessor:
|
|
|
31
25
|
self.__error_raised = False
|
|
32
26
|
self.__excel_state_stash = dict()
|
|
33
27
|
self.__watch_thread = None
|
|
28
|
+
self.restore_book = restore_book
|
|
34
29
|
|
|
35
30
|
async def watch(self):
|
|
36
31
|
|
|
@@ -133,15 +128,17 @@ class _ExcelDialogProcessor:
|
|
|
133
128
|
# if exc_type is not None:
|
|
134
129
|
# if issubclass(exc_type, com_error) and self.__error_raised:
|
|
135
130
|
if self.__error_raised:
|
|
131
|
+
if self.restore_book:
|
|
136
132
|
logger.debug('エラーハンドリングの副作用でブックを閉じているので'
|
|
137
133
|
'Excel のブックを開きなおします。')
|
|
138
134
|
for wb_path in self.__workbook_paths:
|
|
139
135
|
self.excel.Workbooks.Open(wb_path)
|
|
140
136
|
|
|
141
137
|
|
|
142
|
-
def watch_excel_macro_error(excel_, timeout):
|
|
138
|
+
def watch_excel_macro_error(excel_, timeout, restore_book=True):
|
|
143
139
|
"""Excel のエラーダイアログの出現を監視し、検出されればブックを閉じます。"""
|
|
144
|
-
return _ExcelDialogProcessor(excel_, timeout)
|
|
140
|
+
return _ExcelDialogProcessor(excel_, timeout, restore_book)
|
|
141
|
+
|
|
145
142
|
|
|
146
143
|
|
|
147
144
|
if __name__ == '__main__':
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
try:
|
|
2
|
+
import brepmatching
|
|
3
|
+
except ModuleNotFoundError as e:
|
|
4
|
+
import warnings
|
|
5
|
+
warnings.warn(
|
|
6
|
+
'There is no installation of `brepmatching`. '
|
|
7
|
+
'Please confirm installation via '
|
|
8
|
+
'`pip install pyfemtet[brep]` or '
|
|
9
|
+
'`pip install brepmatching` command.'
|
|
10
|
+
)
|
|
11
|
+
raise e
|
|
12
|
+
|
|
13
|
+
from brepmatching.pyfemtet_scripts.replace_model_considering_their_matching import ModelUpdater
|
|
14
|
+
|
|
@@ -18,14 +18,11 @@ from multiprocessing.context import BaseContext, SpawnProcess, _concrete_context
|
|
|
18
18
|
from multiprocessing.process import _children, _cleanup
|
|
19
19
|
from multiprocessing.managers import SyncManager
|
|
20
20
|
|
|
21
|
-
import logging
|
|
22
|
-
from pyfemtet.logger import get_logger
|
|
23
|
-
|
|
24
21
|
from pyfemtet._message import Msg
|
|
25
22
|
|
|
23
|
+
from pyfemtet.logger import get_module_logger
|
|
26
24
|
|
|
27
|
-
logger =
|
|
28
|
-
logger.setLevel(logging.INFO)
|
|
25
|
+
logger = get_module_logger('dispatch', __name__)
|
|
29
26
|
|
|
30
27
|
|
|
31
28
|
DISPATCH_TIMEOUT = 120
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from pyfemtet.logger._impl import (
|
|
3
|
+
get_module_logger,
|
|
4
|
+
add_file_output,
|
|
5
|
+
set_stdout_output,
|
|
6
|
+
remove_file_output,
|
|
7
|
+
remove_stdout_output,
|
|
8
|
+
remove_all_output,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def get_dask_logger():
|
|
13
|
+
return logging.getLogger('distributed')
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def get_optuna_logger():
|
|
17
|
+
import optuna
|
|
18
|
+
return optuna.logging.get_logger('optuna')
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def get_dash_logger():
|
|
22
|
+
return logging.getLogger('werkzeug')
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
import sys
|
|
4
|
+
import datetime
|
|
5
|
+
import locale
|
|
6
|
+
from threading import Lock
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import platform
|
|
9
|
+
|
|
10
|
+
from colorlog import ColoredFormatter
|
|
11
|
+
from dask.distributed import get_worker
|
|
12
|
+
|
|
13
|
+
LOCALE, LOCALE_ENCODING = locale.getlocale()
|
|
14
|
+
if platform.system() == 'Windows':
|
|
15
|
+
DATEFMT = '%#m/%#d %#H:%M'
|
|
16
|
+
else:
|
|
17
|
+
DATEFMT = '%-m/%-d %-H:%M'
|
|
18
|
+
|
|
19
|
+
__lock = Lock() # thread 並列されたタスクがアクセスする場合に備えて
|
|
20
|
+
|
|
21
|
+
__initialized_root_packages: list[str] = list()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# ===== set dask worker prefix to ``ROOT`` logger =====
|
|
25
|
+
|
|
26
|
+
def _get_dask_worker_name():
|
|
27
|
+
name = '(Main)'
|
|
28
|
+
try:
|
|
29
|
+
worker = get_worker()
|
|
30
|
+
if isinstance(worker.name, str): # local なら index, cluster なら tcp address
|
|
31
|
+
name = f'({worker.name})'
|
|
32
|
+
else:
|
|
33
|
+
name = f'(Sub{worker.name})'
|
|
34
|
+
except ValueError:
|
|
35
|
+
pass
|
|
36
|
+
return name
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class _DaskLogRecord(logging.LogRecord):
|
|
40
|
+
def getMessage(self):
|
|
41
|
+
msg = str(self.msg)
|
|
42
|
+
if self.args:
|
|
43
|
+
msg = msg % self.args
|
|
44
|
+
msg = _get_dask_worker_name() + ' ' + msg
|
|
45
|
+
return msg
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
logging.setLogRecordFactory(_DaskLogRecord)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
# ===== format config =====
|
|
52
|
+
|
|
53
|
+
def __create_formatter(colored=True):
|
|
54
|
+
|
|
55
|
+
if colored:
|
|
56
|
+
# colorized
|
|
57
|
+
header = "%(log_color)s" + "[%(name)s %(levelname).4s]" + " %(asctime)s" + "%(reset)s"
|
|
58
|
+
|
|
59
|
+
formatter = ColoredFormatter(
|
|
60
|
+
f"{header} %(message)s",
|
|
61
|
+
datefmt=DATEFMT,
|
|
62
|
+
reset=True,
|
|
63
|
+
log_colors={
|
|
64
|
+
"DEBUG": "purple",
|
|
65
|
+
"INFO": "cyan",
|
|
66
|
+
"WARNING": "yellow",
|
|
67
|
+
"ERROR": "light_red",
|
|
68
|
+
"CRITICAL": "red",
|
|
69
|
+
},
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
else:
|
|
73
|
+
header = "[%(name)s %(levelname).4s]"
|
|
74
|
+
formatter = logging.Formatter(
|
|
75
|
+
f"{header} %(message)s",
|
|
76
|
+
datefmt=DATEFMT,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
return formatter
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
# ===== handler config =====
|
|
83
|
+
|
|
84
|
+
STDOUT_HANDLER_NAME = 'stdout-handler'
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def __get_stdout_handler():
|
|
88
|
+
stdout_handler = logging.StreamHandler(sys.stdout)
|
|
89
|
+
stdout_handler.set_name(STDOUT_HANDLER_NAME)
|
|
90
|
+
stdout_handler.setFormatter(__create_formatter(colored=True))
|
|
91
|
+
return stdout_handler
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def __has_stdout_handler(logger):
|
|
95
|
+
return any([handler.get_name() != STDOUT_HANDLER_NAME for handler in logger.handlers])
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def set_stdout_output(logger, level=logging.INFO):
|
|
99
|
+
|
|
100
|
+
if not __has_stdout_handler(logger):
|
|
101
|
+
logger.addHandler(__get_stdout_handler())
|
|
102
|
+
|
|
103
|
+
logger.setLevel(level)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def remove_stdout_output(logger):
|
|
107
|
+
if __has_stdout_handler(logger):
|
|
108
|
+
logger.removeHandler(__get_stdout_handler())
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def add_file_output(logger, filepath=None, level=logging.INFO) -> str:
|
|
112
|
+
"""Add FileHandler to the logger.
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
str: THe name of the added handler.
|
|
116
|
+
Its format is 'filehandler-{os.path.basename(filepath)}'
|
|
117
|
+
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
# certify filepath
|
|
121
|
+
if filepath is None:
|
|
122
|
+
filepath = datetime.datetime.now().strftime('%Y%m%d-%H%M%S') + f'_{logger.name}.log'
|
|
123
|
+
|
|
124
|
+
# add file handler
|
|
125
|
+
file_handler = logging.FileHandler(filename=filepath, encoding=LOCALE_ENCODING)
|
|
126
|
+
file_handler.set_name(f'filehandler-{os.path.basename(filepath)}')
|
|
127
|
+
file_handler.setFormatter(__create_formatter(colored=False))
|
|
128
|
+
logger.addHandler(file_handler)
|
|
129
|
+
|
|
130
|
+
# set (default) log level
|
|
131
|
+
logger.setLevel(level)
|
|
132
|
+
|
|
133
|
+
return file_handler.get_name()
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def remove_file_output(logger, filepath=None):
|
|
137
|
+
"""Removes FileHandler from the logger.
|
|
138
|
+
|
|
139
|
+
If filepath is None, remove all FileHandler.
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
if filepath is None:
|
|
143
|
+
for handler in logger.handlers:
|
|
144
|
+
if 'filehandler-' in handler.name:
|
|
145
|
+
logger.removeHandler(handler)
|
|
146
|
+
|
|
147
|
+
else:
|
|
148
|
+
handler_name = f'filehandler-{os.path.basename(filepath)}'
|
|
149
|
+
for handler in logger.handlers:
|
|
150
|
+
if handler_name == handler.name:
|
|
151
|
+
logger.removeHandler(handler)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def remove_all_output(logger):
|
|
155
|
+
for handler in logger.handlers:
|
|
156
|
+
logger.removeHandler(handler)
|
|
157
|
+
|
|
158
|
+
logger.addHandler(logging.NullHandler())
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
# ===== root-package logger =====
|
|
162
|
+
|
|
163
|
+
def setup_package_root_logger(package_name):
|
|
164
|
+
global __initialized_root_packages
|
|
165
|
+
if package_name not in __initialized_root_packages:
|
|
166
|
+
with __lock:
|
|
167
|
+
logger = logging.getLogger(package_name)
|
|
168
|
+
logger.propagate = True
|
|
169
|
+
set_stdout_output(logger)
|
|
170
|
+
logger.setLevel(logging.INFO)
|
|
171
|
+
__initialized_root_packages.append(package_name)
|
|
172
|
+
else:
|
|
173
|
+
logger = logging.getLogger(package_name)
|
|
174
|
+
return logger
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
# ===== module logger =====
|
|
178
|
+
|
|
179
|
+
def get_module_logger(name: str, __module_name__: str, ) -> logging.Logger:
|
|
180
|
+
"""Return the module-level logger.
|
|
181
|
+
|
|
182
|
+
The format is defined in the package_root_logger.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
name (str): The logger name to want.
|
|
186
|
+
__module_name__ (str): __name__ of the module.
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
logging.Logger:
|
|
190
|
+
The logger its name is ``root_package.subpackage.module``.
|
|
191
|
+
child level logger's signal propagates to the parent logger
|
|
192
|
+
and is shown in the parent(s)'s handler(s).
|
|
193
|
+
|
|
194
|
+
"""
|
|
195
|
+
|
|
196
|
+
# check root logger initialized
|
|
197
|
+
name_arr = name.split('.')
|
|
198
|
+
if name_arr[0] not in __initialized_root_packages:
|
|
199
|
+
setup_package_root_logger(name_arr[0])
|
|
200
|
+
|
|
201
|
+
# get logger
|
|
202
|
+
logger = logging.getLogger(name)
|
|
203
|
+
|
|
204
|
+
# If not root logger, ensure propagate is True.
|
|
205
|
+
if len(name_arr) > 1:
|
|
206
|
+
logger.propagate = True
|
|
207
|
+
|
|
208
|
+
# If debug mode, set specific level.
|
|
209
|
+
if __module_name__ == '__main__':
|
|
210
|
+
logger.setLevel(logging.DEBUG)
|
|
211
|
+
|
|
212
|
+
return logger
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
if __name__ == '__main__':
|
|
216
|
+
|
|
217
|
+
root_logger = setup_package_root_logger('logger')
|
|
218
|
+
optimizer_logger = get_module_logger('logger.optimizer', __name__); optimizer_logger.setLevel(logging.INFO)
|
|
219
|
+
interface_logger = get_module_logger('logger.interface', __name__)
|
|
220
|
+
|
|
221
|
+
root_logger.info("This is root logger's info.")
|
|
222
|
+
optimizer_logger.info("This is optimizer logger's info.")
|
|
223
|
+
|
|
224
|
+
add_file_output(interface_logger, 'test-module-log.log', level=logging.DEBUG)
|
|
225
|
+
interface_logger.debug('debugging...')
|
|
226
|
+
remove_file_output(interface_logger, 'test-module-log.log')
|
|
227
|
+
|
|
228
|
+
interface_logger.debug('debug is finished.')
|
|
229
|
+
root_logger.debug("This message will not be shown "
|
|
230
|
+
"even if the module_logger's level "
|
|
231
|
+
"is logging.DEBUG.")
|
|
@@ -22,7 +22,7 @@ if version.parse(optuna.version.__version__) < version.parse('4.0.0'):
|
|
|
22
22
|
else:
|
|
23
23
|
from optuna._hypervolume import wfg
|
|
24
24
|
compute_hypervolume = wfg.compute_hypervolume
|
|
25
|
-
from dask.distributed import Lock, get_client
|
|
25
|
+
from dask.distributed import Lock, get_client, Client
|
|
26
26
|
|
|
27
27
|
# win32com
|
|
28
28
|
from win32com.client import constants, Constants
|
|
@@ -32,10 +32,9 @@ from pyfemtet.opt.interface import FEMInterface, FemtetInterface
|
|
|
32
32
|
from pyfemtet._message import encoding, Msg
|
|
33
33
|
|
|
34
34
|
# logger
|
|
35
|
-
import
|
|
36
|
-
|
|
37
|
-
logger =
|
|
38
|
-
logger.setLevel(logging.INFO)
|
|
35
|
+
from pyfemtet.logger import get_module_logger
|
|
36
|
+
|
|
37
|
+
logger = get_module_logger('opt.core', __name__)
|
|
39
38
|
|
|
40
39
|
|
|
41
40
|
__all__ = [
|
|
@@ -503,19 +502,6 @@ class ObjectivesFunc:
|
|
|
503
502
|
return f
|
|
504
503
|
|
|
505
504
|
|
|
506
|
-
class _HistoryDfCore:
|
|
507
|
-
"""Class for managing a DataFrame object in a distributed manner."""
|
|
508
|
-
|
|
509
|
-
def __init__(self):
|
|
510
|
-
self.df = pd.DataFrame()
|
|
511
|
-
|
|
512
|
-
def set_df(self, df):
|
|
513
|
-
self.df = df
|
|
514
|
-
|
|
515
|
-
def get_df(self):
|
|
516
|
-
return self.df
|
|
517
|
-
|
|
518
|
-
|
|
519
505
|
class History:
|
|
520
506
|
"""Class for managing the history of optimization results.
|
|
521
507
|
|
|
@@ -543,8 +529,6 @@ class History:
|
|
|
543
529
|
is_restart = False
|
|
544
530
|
is_processing = False
|
|
545
531
|
_df = None # in case without client
|
|
546
|
-
_future = None # in case with client
|
|
547
|
-
_actor_data = None # in case with client
|
|
548
532
|
|
|
549
533
|
def __init__(
|
|
550
534
|
self,
|
|
@@ -565,6 +549,7 @@ class History:
|
|
|
565
549
|
self.obj_names = obj_names
|
|
566
550
|
self.cns_names = cns_names
|
|
567
551
|
self.additional_metadata = additional_metadata or ''
|
|
552
|
+
self.__scheduler_address = client.scheduler.address if client is not None else None
|
|
568
553
|
|
|
569
554
|
# 最適化実行中かどうか
|
|
570
555
|
self.is_processing = client is not None
|
|
@@ -572,10 +557,6 @@ class History:
|
|
|
572
557
|
# 最適化実行中の process monitor である場合
|
|
573
558
|
if self.is_processing:
|
|
574
559
|
|
|
575
|
-
# actor の生成
|
|
576
|
-
self._future = client.submit(_HistoryDfCore, actor=True)
|
|
577
|
-
self._actor_data = self._future.result()
|
|
578
|
-
|
|
579
560
|
# csv が存在すれば続きからモード
|
|
580
561
|
self.is_restart = os.path.isfile(self.path)
|
|
581
562
|
|
|
@@ -641,16 +622,36 @@ class History:
|
|
|
641
622
|
self.set_df(df)
|
|
642
623
|
|
|
643
624
|
def get_df(self) -> pd.DataFrame:
|
|
644
|
-
if self.
|
|
625
|
+
if self.__scheduler_address is None:
|
|
645
626
|
return self._df
|
|
646
627
|
else:
|
|
647
|
-
|
|
628
|
+
# scheduler がまだ存命か確認する
|
|
629
|
+
try:
|
|
630
|
+
with Lock('access-df'):
|
|
631
|
+
client_: 'Client' = get_client(self.__scheduler_address)
|
|
632
|
+
if 'df' in client_.list_datasets():
|
|
633
|
+
return client_.get_dataset('df')
|
|
634
|
+
else:
|
|
635
|
+
logger.debug('Access df of History before it is initialized.')
|
|
636
|
+
return pd.DataFrame()
|
|
637
|
+
except OSError:
|
|
638
|
+
logger.error('Scheduler is already dead. Most frequent reasen to show this message is that the pyfemtet monitor UI is not refreshed even if the main optimization process is terminated.')
|
|
639
|
+
return pd.DataFrame()
|
|
648
640
|
|
|
649
641
|
def set_df(self, df: pd.DataFrame):
|
|
650
|
-
if self.
|
|
642
|
+
if self.__scheduler_address is None:
|
|
651
643
|
self._df = df
|
|
652
644
|
else:
|
|
653
|
-
|
|
645
|
+
try:
|
|
646
|
+
with Lock('access-df'):
|
|
647
|
+
client_: 'Client' = get_client(self.__scheduler_address)
|
|
648
|
+
if 'df' in client_.list_datasets():
|
|
649
|
+
client_.unpublish_dataset('df') # 更新する場合は前もって削除が必要、本来は dask collection をここに入れる使い方をする。
|
|
650
|
+
client_.publish_dataset(**dict(
|
|
651
|
+
df=df
|
|
652
|
+
))
|
|
653
|
+
except OSError:
|
|
654
|
+
logger.error('Scheduler is already dead. Most frequent reasen to show this message is that the pyfemtet monitor UI is not refreshed even if the main optimization process is terminated.')
|
|
654
655
|
|
|
655
656
|
def create_df_columns(self):
|
|
656
657
|
"""Create columns of history."""
|
|
@@ -5,12 +5,6 @@ from tqdm import tqdm
|
|
|
5
5
|
from win32com.client import Dispatch
|
|
6
6
|
from femtetutils import util
|
|
7
7
|
|
|
8
|
-
import logging
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
logger = logging.getLogger("test")
|
|
12
|
-
logger.setLevel(logging.DEBUG)
|
|
13
|
-
|
|
14
8
|
|
|
15
9
|
def _open_femprj(femprj_path):
|
|
16
10
|
Femtet = Dispatch("FemtetMacro.Femtet")
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from pyfemtet.opt.interface._base import FEMInterface
|
|
1
|
+
from pyfemtet.opt.interface._base import FEMInterface
|
|
2
2
|
from pyfemtet.opt.interface._base import NoFEM
|
|
3
3
|
from pyfemtet.opt.interface._femtet import FemtetInterface
|
|
4
4
|
from pyfemtet.opt.interface._femtet_with_sldworks import FemtetWithSolidworksInterface
|
|
@@ -5,11 +5,9 @@ from abc import ABC, abstractmethod
|
|
|
5
5
|
|
|
6
6
|
import pandas as pd
|
|
7
7
|
|
|
8
|
-
import
|
|
9
|
-
from pyfemtet.logger import get_logger
|
|
10
|
-
logger = get_logger('FEM')
|
|
11
|
-
logger.setLevel(logging.INFO)
|
|
8
|
+
from pyfemtet.logger import get_module_logger
|
|
12
9
|
|
|
10
|
+
logger = get_module_logger('opt.interface', __name__)
|
|
13
11
|
|
|
14
12
|
here, me = os.path.split(__file__)
|
|
15
13
|
|