FEM: solver run, add method to run fem solver and use in commands and example module
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user