From 6a3f0dc93631cba44eb9cb05ab0df561a62678f0 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Thu, 21 Mar 2019 21:35:28 +0100 Subject: [PATCH] FEM: solver run, add method to run fem solver and use in commands and example module --- src/Mod/Fem/femcommands/commands.py | 35 +--------------- src/Mod/Fem/femexamples/manager.py | 7 +--- src/Mod/Fem/femsolver/run.py | 62 +++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 38 deletions(-) diff --git a/src/Mod/Fem/femcommands/commands.py b/src/Mod/Fem/femcommands/commands.py index 93d784486f..c6459368d5 100644 --- a/src/Mod/Fem/femcommands/commands.py +++ b/src/Mod/Fem/femcommands/commands.py @@ -761,39 +761,8 @@ class _CommandFemSolverRun(CommandManager): self.is_active = 'with_solver' def Activated(self): - import femsolver.run - from PySide import QtGui - - self.solver = self.selobj - if self.solver.Proxy.Type == 'Fem::FemSolverCalculixCcxTools': - print('CalxuliX ccx tools solver!') - from femtools import ccxtools - self.fea = ccxtools.FemToolsCcx(None, self.solver) - self.fea.reset_mesh_purge_results_checked() - self.fea.run() - else: - print('Frame work solver!') - try: - machine = femsolver.run.getMachine(self.solver) - except femsolver.run.MustSaveError: - QtGui.QMessageBox.critical( - FreeCADGui.getMainWindow(), - "Can't start Solver", - "Please save the file before executing the solver. " - "This must be done because the location of the working " - "directory is set to \"Beside .FCStd File\".") - return - except femsolver.run.DirectoryDoesNotExist: - QtGui.QMessageBox.critical( - FreeCADGui.getMainWindow(), - "Can't start Solver", - "Selected working directory doesn't exist.") - return - if not machine.running: - machine.reset() - machine.target = femsolver.run.RESULTS - machine.start() - machine.join() # wait for the machine to finish. + from femsolver.run import run_fem_solver + run_fem_solver(self.selobj) FreeCADGui.Selection.clearSelection() FreeCAD.ActiveDocument.recompute() diff --git a/src/Mod/Fem/femexamples/manager.py b/src/Mod/Fem/femexamples/manager.py index 8ca223dd7f..8a9a2a2951 100644 --- a/src/Mod/Fem/femexamples/manager.py +++ b/src/Mod/Fem/femexamples/manager.py @@ -61,11 +61,8 @@ def run_analysis(doc, base_name, filepath=''): working_dir = getpath(solver) # run analysis - from femsolver.run import RESULTS - machine = solver.Proxy.createMachine(solver, working_dir) - machine.target = RESULTS - machine.start() - machine.join() # wait for the machine to finish. + from femsolver.run import run_fem_solver + run_fem_solver(solver, working_dir) # save doc once again with results doc.save() diff --git a/src/Mod/Fem/femsolver/run.py b/src/Mod/Fem/femsolver/run.py index c577e04fa6..3979b29708 100644 --- a/src/Mod/Fem/femsolver/run.py +++ b/src/Mod/Fem/femsolver/run.py @@ -50,6 +50,68 @@ _machines = {} _dirTypes = {} +def run_fem_solver(solver, working_dir=None): + + if App.GuiUp: + import FreeCADGui + from PySide import QtGui + + if solver.Proxy.Type == 'Fem::FemSolverCalculixCcxTools': + App.Console.PrintMessage("CalxuliX ccx tools solver!\n") + from femtools import ccxtools + fea = ccxtools.FemToolsCcx(None, solver) + fea.reset_mesh_purge_results_checked() + if working_dir is None: + fea.run() + else: + fea.update_objects() + fea.setup_working_dir(working_dir) + fea.setup_ccx() + message = fea.check_prerequisites() + if not message: + fea.write_inp_file() + fea.ccx_run() + fea.load_results() + else: + App.Console.PrintError("Houston, we have a problem! {}\n".format(message)) + else: + App.Console.PrintMessage("Frame work solver!\n") + try: + if working_dir is not None: + machine = getMachine(solver, working_dir) + else: + machine = getMachine(solver) + except MustSaveError: + error_message = ( + "Please save the file before executing the solver. " + "This must be done because the location of the working " + "directory is set to \"Beside .FCStd File\"." + ) + App.Console.PrintError(error_message + "\n") + if App.GuiUp: + QtGui.QMessageBox.critical( + FreeCADGui.getMainWindow(), + "Can't start Solver", + error_message + ) + return + except DirectoryDoesNotExist: + error_message = "Selected working directory doesn't exist." + App.Console.PrintError(error_message + "\n") + if App.GuiUp: + QtGui.QMessageBox.critical( + FreeCADGui.getMainWindow(), + "Can't start Solver", + error_message + ) + return + if not machine.running: + machine.reset() + machine.target = RESULTS + machine.start() + machine.join() # wait for the machine to finish. + + def getMachine(solver, path=None): _DocObserver.attach() m = _machines.get(solver)