FEM: ccx tools solver task panel, switch to self.fea instead of lots of fea instances

This commit is contained in:
Bernd Hahnebach
2019-02-24 22:18:30 +01:00
committed by wmayer
parent 91a1a4b6d6
commit 972bb5ee1b

View File

@@ -121,11 +121,9 @@ class _TaskPanelFemSolverCalculix:
else:
self.CalculixBinary = 'ccx'
self.solver_object = solver_object
fea = ccxtools.FemToolsCcx(None, self.solver_object)
fea.setup_working_dir()
self.working_dir = fea.working_dir
# TODO: switch to one self.fea in all task panel defs
# since open the task panel is only possible with an active analysis, we do not need to pass the analysis. it will be found
self.fea = ccxtools.FemToolsCcx(None, solver_object)
self.fea.setup_working_dir()
self.Calculix = QtCore.QProcess()
self.Timer = QtCore.QTimer()
@@ -161,12 +159,12 @@ class _TaskPanelFemSolverCalculix:
def update(self):
'fills the widgets'
self.form.le_working_dir.setText(self.working_dir)
if self.solver_object.AnalysisType == 'static':
self.form.le_working_dir.setText(self.fea.working_dir)
if self.fea.solver.AnalysisType == 'static':
self.form.rb_static_analysis.setChecked(True)
elif self.solver_object.AnalysisType == 'frequency':
elif self.fea.solver.AnalysisType == 'frequency':
self.form.rb_frequency_analysis.setChecked(True)
elif self.solver_object.AnalysisType == 'thermomech':
elif self.fea.solver.AnalysisType == 'thermomech':
self.form.rb_thermomech_analysis.setChecked(True)
return
@@ -251,15 +249,14 @@ class _TaskPanelFemSolverCalculix:
self.form.pb_run_ccx.setText("Re-run CalculiX")
self.femConsoleMessage("Loading result sets...")
self.form.l_time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start))
fea = ccxtools.FemToolsCcx(None, self.solver_object)
fea.reset_mesh_purge_results_checked()
fea.inp_file_name = self.inp_file_name
self.fea.reset_mesh_purge_results_checked()
self.fea.inp_file_name = self.fea.inp_file_name
QApplication.setOverrideCursor(Qt.WaitCursor)
try:
fea.load_results()
self.fea.load_results()
except:
QApplication.restoreOverrideCursor()
majorVersion, minorVersion = fea.get_ccx_version()
majorVersion, minorVersion = self.fea.get_ccx_version()
if majorVersion == 2 and minorVersion <= 10:
message = "The used CalculiX version {}.{} creates broken output files.\n" \
"Please upgrade to a newer version.".format(majorVersion, minorVersion)
@@ -270,13 +267,11 @@ class _TaskPanelFemSolverCalculix:
self.form.l_time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start))
def choose_working_dir(self):
current_wd = self.setup_working_dir()
wd = QtGui.QFileDialog.getExistingDirectory(None, 'Choose CalculiX working directory',
current_wd)
if not (os.path.isdir(wd)):
wd = current_wd
self.working_dir = wd
self.form.le_working_dir.setText(wd)
self.fea.working_dir)
if os.path.isdir(wd):
self.fea.setup_working_dir(wd)
self.form.le_working_dir.setText(self.fea.working_dir)
def write_input_file_handler(self):
self.Start = time.time()
@@ -284,13 +279,8 @@ class _TaskPanelFemSolverCalculix:
QApplication.restoreOverrideCursor()
if self.check_prerequisites_helper():
QApplication.setOverrideCursor(Qt.WaitCursor)
self.inp_file_name = ""
fea = ccxtools.FemToolsCcx(None, self.solver_object)
fea.update_objects()
fea.setup_working_dir(self.working_dir) # we made a new fea which sets the working dir, but we the one from task panel
fea.write_inp_file()
if fea.inp_file_name != "":
self.inp_file_name = fea.inp_file_name
self.fea.write_inp_file()
if self.fea.inp_file_name != "":
self.femConsoleMessage("Write completed.")
self.form.pb_edit_inp.setEnabled(True)
self.form.pb_run_ccx.setEnabled(True)
@@ -304,9 +294,8 @@ class _TaskPanelFemSolverCalculix:
self.femConsoleMessage("Check dependencies...")
self.form.l_time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start))
fea = ccxtools.FemToolsCcx(None, self.solver_object)
fea.update_objects()
message = fea.check_prerequisites()
self.fea.update_objects()
message = self.fea.check_prerequisites()
if message != "":
QtGui.QMessageBox.critical(None, "Missing prerequisite(s)", message)
return False
@@ -319,16 +308,16 @@ class _TaskPanelFemSolverCalculix:
self.ext_editor_process.start(ext_editor_path, [filename])
def editCalculixInputFile(self):
print('editCalculixInputFile {}'.format(self.inp_file_name))
print('editCalculixInputFile {}'.format(self.fea.inp_file_name))
if self.ccx_prefs.GetBool("UseInternalEditor", True):
FemGui.open(self.inp_file_name)
FemGui.open(self.fea.inp_file_name)
else:
ext_editor_path = self.ccx_prefs.GetString("ExternalEditorPath", "")
if ext_editor_path:
self.start_ext_editor(ext_editor_path, self.inp_file_name)
self.start_ext_editor(ext_editor_path, self.fea.inp_file_name)
else:
print("External editor is not defined in FEM preferences. Falling back to internal editor")
FemGui.open(self.inp_file_name)
FemGui.open(self.fea.inp_file_name)
def runCalculix(self):
print('runCalculix')
@@ -338,19 +327,19 @@ class _TaskPanelFemSolverCalculix:
self.femConsoleMessage("Run CalculiX...")
# run Calculix
print('run CalculiX at: {} with: {}'.format(self.CalculixBinary, os.path.splitext(self.inp_file_name)[0]))
print('run CalculiX at: {} with: {}'.format(self.CalculixBinary, os.path.splitext(self.fea.inp_file_name)[0]))
# change cwd because ccx may crash if directory has no write permission
# there is also a limit of the length of file names so jump to the document directory
self.cwd = QtCore.QDir.currentPath()
fi = QtCore.QFileInfo(self.inp_file_name)
fi = QtCore.QFileInfo(self.fea.inp_file_name)
QtCore.QDir.setCurrent(fi.path())
self.Calculix.start(self.CalculixBinary, ['-i', fi.baseName()])
QApplication.restoreOverrideCursor()
def select_analysis_type(self, analysis_type):
if self.solver_object.AnalysisType != analysis_type:
self.solver_object.AnalysisType = analysis_type
if self.fea.solver.AnalysisType != analysis_type:
self.fea.solver.AnalysisType = analysis_type
self.form.pb_edit_inp.setEnabled(False)
self.form.pb_run_ccx.setEnabled(False)
@@ -362,16 +351,3 @@ class _TaskPanelFemSolverCalculix:
def select_thermomech_analysis(self):
self.select_analysis_type('thermomech')
# That function overlaps with ccxtools setup_working_dir and could be removed when the one from ccxtools would be used
def setup_working_dir(self):
wd = self.working_dir
if not (os.path.isdir(wd)):
try:
os.makedirs(wd)
except:
print("Dir \'{}\' from FEM preferences doesn't exist and cannot be created.".format(wd))
import tempfile
wd = tempfile.gettempdir()
print("Dir \'{}\' will be used instead.".format(wd))
return wd