diff --git a/src/Mod/Fem/femsolver/calculix/tasks.py b/src/Mod/Fem/femsolver/calculix/tasks.py index 40050b7d47..ebb070ae6e 100644 --- a/src/Mod/Fem/femsolver/calculix/tasks.py +++ b/src/Mod/Fem/femsolver/calculix/tasks.py @@ -52,8 +52,21 @@ class Check(run.Check): def run(self): self.pushStatus("Checking analysis...\n") - self.checkMesh() - self.checkMaterial() + self.check_mesh_exists() + + # workaround use Calculix ccxtools pre checks + from femtools.checksanalysis import check_member_for_solver_calculix + message = check_member_for_solver_calculix( + self.analysis, + self.solver, + membertools.get_mesh_to_solve(self.analysis)[0], + membertools.AnalysisMember(self.analysis) + ) + if message: + text = "CalculiX can not be started...\n" + self.report.error("{}{}".format(text, message)) + self.fail() + return class Prepare(run.Prepare): diff --git a/src/Mod/Fem/femsolver/elmer/tasks.py b/src/Mod/Fem/femsolver/elmer/tasks.py index b56792fa17..6a99843565 100644 --- a/src/Mod/Fem/femsolver/elmer/tasks.py +++ b/src/Mod/Fem/femsolver/elmer/tasks.py @@ -47,9 +47,9 @@ class Check(run.Check): def run(self): self.pushStatus("Checking analysis...\n") - if (self.checkMesh()): + if (self.check_mesh_exists()): self.checkMeshType() - self.checkMaterial() + self.check_material_exists() self.checkEquations() def checkMeshType(self): diff --git a/src/Mod/Fem/femsolver/run.py b/src/Mod/Fem/femsolver/run.py index d7fae1401c..99fa849a70 100644 --- a/src/Mod/Fem/femsolver/run.py +++ b/src/Mod/Fem/femsolver/run.py @@ -418,11 +418,11 @@ class Machine(BaseTask): class Check(BaseTask): - def checkMesh(self): - meshes = membertools.get_member( - self.analysis, - "Fem::FemMeshObject" - ) + def get_several_member(self, t): + return membertools.get_several_member(self.analysis, t) + + def check_mesh_exists(self): + meshes = self.get_several_member("Fem::FemMeshObject") if len(meshes) == 0: self.report.error("Missing a mesh object.") self.fail() @@ -436,10 +436,9 @@ class Check(BaseTask): return False return True - def checkMaterial(self): - matObjs = membertools.get_member( - self.analysis, "App::MaterialObjectPython") - if len(matObjs) == 0: + def check_material_exists(self): + objs = self.get_several_member("App::MaterialObjectPython") + if len(objs) == 0: self.report.error( "Missing a material object. " "At least one material is required." @@ -448,6 +447,42 @@ class Check(BaseTask): return False return True + def check_material_single(self): + objs = self.get_several_member("App::MaterialObjectPython") + if len(objs) > 1: + self.report.error("Only one Material allowed for this solver.") + self.fail() + return False + return True + + def check_geos_beamsection_single(self): + objs = self.get_several_member("Fem::ElementGeometry1D") + if len(objs) > 1: + self.report.error("Only one beamsection allowed for this solver.") + self.fail() + return False + return True + + def check_geos_shellthickness_single(self): + objs = self.get_several_member("Fem::ElementGeometry2D") + if len(objs) > 1: + self.report.error("Only one shellthickness allowed for this solver.") + self.fail() + return False + return True + + def check_geos_beamsection_and_shellthickness(self): + beamsec_obj = self.get_several_member("Fem::ElementGeometry1D") + shellth_obj = self.get_several_member("Fem::ElementGeometry2D") + if len(beamsec_obj) > 0 and len(shellth_obj) > 0: + self.report.error( + "Either beamsection or shellthickness objects are allowed for this solver, " + "but not both in one analysis." + ) + self.fail() + return False + return True + def checkSupported(self, allSupported): for m in self.analysis.Group: if femutils.is_of_type(m, "Fem::Constraint"): diff --git a/src/Mod/Fem/femsolver/z88/tasks.py b/src/Mod/Fem/femsolver/z88/tasks.py index dc6fe696f3..74b5f0ad8f 100644 --- a/src/Mod/Fem/femsolver/z88/tasks.py +++ b/src/Mod/Fem/femsolver/z88/tasks.py @@ -46,8 +46,12 @@ class Check(run.Check): def run(self): self.pushStatus("Checking analysis...\n") - self.checkMesh() - self.checkMaterial() + self.check_mesh_exists() + self.check_material_exists() + self.check_material_single() # no multiple material + self.check_geos_beamsection_single() # no multiple beamsection + self.check_geos_shellthickness_single() # no multiple shellsection + self.check_geos_beamsection_and_shellthickness() # either beams or shells class Prepare(run.Prepare): diff --git a/src/Mod/Fem/femtools/ccxtools.py b/src/Mod/Fem/femtools/ccxtools.py index 49b47beff9..041a1bcd2e 100644 --- a/src/Mod/Fem/femtools/ccxtools.py +++ b/src/Mod/Fem/femtools/ccxtools.py @@ -260,8 +260,8 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): "Working directory \'{}\' doesn't exist." .format(self.working_dir) ) - from femtools.checksanalysis import check_analysismember - message += check_analysismember( + from femtools.checksanalysis import check_member_for_solver_calculix + message += check_member_for_solver_calculix( self.analysis, self.solver, self.mesh, diff --git a/src/Mod/Fem/femtools/checksanalysis.py b/src/Mod/Fem/femtools/checksanalysis.py index 4cfd50b66e..ce2b7092e7 100644 --- a/src/Mod/Fem/femtools/checksanalysis.py +++ b/src/Mod/Fem/femtools/checksanalysis.py @@ -37,7 +37,7 @@ from . import femutils from femsolver.calculix.solver import ANALYSIS_TYPES -def check_analysismember(analysis, solver, mesh, member): +def check_member_for_solver_calculix(analysis, solver, mesh, member): message = ""