FEM: Test ccx binary before use

Signed-off-by: Przemo Firszt <przemo@firszt.eu>
This commit is contained in:
Przemo Firszt 2015-09-22 17:08:54 +01:00 committed by wmayer
parent 554f4f5fc9
commit ac0f3a650d
2 changed files with 24 additions and 5 deletions

View File

@ -31,9 +31,10 @@ class FemTools(QtCore.QRunnable, QtCore.QObject):
## The constructor ## The constructor
# @param analysis - analysis object to be used as the core object. # @param analysis - analysis object to be used as the core object.
# @param test_mode - True indicates that no real calculations will take place, so ccx bianry is not required. Used by test module.
# "__init__" tries to use current active analysis in analysis is left empty. # "__init__" tries to use current active analysis in analysis is left empty.
# Rises exception if analysis is not set and there is no active analysis # Rises exception if analysis is not set and there is no active analysis
def __init__(self, analysis=None): def __init__(self, analysis=None, test_mode=False):
QtCore.QRunnable.__init__(self) QtCore.QRunnable.__init__(self)
QtCore.QObject.__init__(self) QtCore.QObject.__init__(self)
@ -58,7 +59,11 @@ class FemTools(QtCore.QRunnable, QtCore.QObject):
# boolean variable indicating if there are calculation results ready for use # boolean variable indicating if there are calculation results ready for use
self.results_present = False self.results_present = False
self.setup_working_dir() self.setup_working_dir()
self.setup_ccx() if test_mode:
self.ccx_binary_present = True
else:
self.ccx_binary_present = False
self.setup_ccx()
else: else:
raise Exception('FEM: No active analysis found!') raise Exception('FEM: No active analysis found!')
@ -241,7 +246,7 @@ class FemTools(QtCore.QRunnable, QtCore.QObject):
import multiprocessing import multiprocessing
import os import os
import subprocess import subprocess
if self.inp_file_name != "": if self.inp_file_name != "" and self.ccx_binary_present:
ont_backup = os.environ.get('OMP_NUM_THREADS') ont_backup = os.environ.get('OMP_NUM_THREADS')
if not ont_backup: if not ont_backup:
ont_backup = "" ont_backup = ""
@ -313,7 +318,11 @@ class FemTools(QtCore.QRunnable, QtCore.QObject):
# Update inp file name # Update inp file name
self.set_inp_file_name() self.set_inp_file_name()
def setup_ccx(self, ccx_binary=None): ## Sets CalculiX ccx binary path and velidates if the binary can be executed
# @param self The python object self
# @ccx_binary path to ccx binary, default is guessed: "bin/ccx" windows, "ccx" for other systems
# @ccx_binary_sig expected output form ccx when run empty. Default value is "CalculiX.exe -i jobname"
def setup_ccx(self, ccx_binary=None, ccx_binary_sig="CalculiX"):
if not ccx_binary: if not ccx_binary:
self.fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem") self.fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem")
ccx_binary = self.fem_prefs.GetString("ccxBinaryPath", "") ccx_binary = self.fem_prefs.GetString("ccxBinaryPath", "")
@ -326,6 +335,16 @@ class FemTools(QtCore.QRunnable, QtCore.QObject):
else: else:
ccx_binary = "ccx" ccx_binary = "ccx"
self.ccx_binary = ccx_binary self.ccx_binary = ccx_binary
import subprocess
try:
p = subprocess.Popen([self.ccx_binary], stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=False)
ccx_stdout, ccx_stderr = p.communicate()
if ccx_binary_sig in ccx_stdout:
self.ccx_binary_present = True
except:
raise Exception("FEM: CalculiX ccx {} output {} doesn't contain expected phrase \'{}\'. Please use ccx 2.6 or newer".
format(ccx_binary, ccx_stdout, ccx_binary_sig))
## Load results of ccx calculations from .frd file. ## Load results of ccx calculations from .frd file.
# @param self The python object self # @param self The python object self

View File

@ -181,7 +181,7 @@ class FemTest(unittest.TestCase):
self.assertTrue(self.pressure_constraint, "FemTest of new pressure constraint failed") self.assertTrue(self.pressure_constraint, "FemTest of new pressure constraint failed")
self.analysis.Member = self.analysis.Member + [self.pressure_constraint] self.analysis.Member = self.analysis.Member + [self.pressure_constraint]
fea = FemTools.FemTools(self.analysis) fea = FemTools.FemTools(self.analysis, test_mode=True)
fcc_print('Checking FEM inp file prerequisites...') fcc_print('Checking FEM inp file prerequisites...')
error = fea.check_prerequisites() error = fea.check_prerequisites()
self.assertFalse(error, "FemTools check_prerequisites returned error message: {}".format(error)) self.assertFalse(error, "FemTools check_prerequisites returned error message: {}".format(error))