FEM: solver run, add method to run fem solver and use in commands and example module

This commit is contained in:
Bernd Hahnebach
2019-03-21 21:35:28 +01:00
committed by wmayer
parent caacf94578
commit 6a3f0dc936
3 changed files with 66 additions and 38 deletions

View File

@@ -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()

View File

@@ -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()

View File

@@ -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)