diff --git a/src/Mod/Fem/femobjects/solver_ccxtools.py b/src/Mod/Fem/femobjects/solver_ccxtools.py index c96033334b..c722f9faad 100644 --- a/src/Mod/Fem/femobjects/solver_ccxtools.py +++ b/src/Mod/Fem/femobjects/solver_ccxtools.py @@ -33,6 +33,7 @@ import FreeCAD from . import base_fempythonobject from femsolver.calculix.solver import add_attributes +from femsolver.calculix.solver import on_restore_of_document class SolverCcxTools(base_fempythonobject.BaseFemPythonObject): @@ -46,6 +47,10 @@ class SolverCcxTools(base_fempythonobject.BaseFemPythonObject): ccx_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem/Ccx") + # add attributes + # implemented in framework calculix solver module + add_attributes(obj, ccx_prefs) + obj.addProperty( "App::PropertyPath", "WorkingDir", @@ -55,5 +60,9 @@ class SolverCcxTools(base_fempythonobject.BaseFemPythonObject): # the working directory is not set, the solver working directory is # only used if the preferences working directory is left blank - # add attributes from framework calculix solver - add_attributes(obj, ccx_prefs) + def onDocumentRestored(self, obj): + + ccx_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem/Ccx") + + # implemented in framework calculix solver module + on_restore_of_document(obj, ccx_prefs) diff --git a/src/Mod/Fem/femsolver/calculix/solver.py b/src/Mod/Fem/femsolver/calculix/solver.py index 309172d91a..b189c63f25 100644 --- a/src/Mod/Fem/femsolver/calculix/solver.py +++ b/src/Mod/Fem/femsolver/calculix/solver.py @@ -61,6 +61,13 @@ class Proxy(solverbase.Proxy): ccx_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem/Ccx") add_attributes(obj, ccx_prefs) + def onDocumentRestored(self, obj): + ccx_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem/Ccx") + # since it is needed for the ccxtools solver too + # the method is implemented outside of the class + # thus we need to pass the prefs + on_restore_of_document(obj, ccx_prefs) + def createMachine(self, obj, directory, testmode=False): return run.Machine( solver=obj, directory=directory, @@ -87,8 +94,52 @@ class ViewProxy(solverbase.ViewProxy): pass -# helper add properties, this is outside of the class to be able -# to use the attribute setter from framework solver and ccxtools solver +# ************************************************************************************************ +# helper +# these methods are outside of the class to be able +# to use them from framework solver and ccxtools solver + + +def on_restore_of_document(obj, ccx_prefs): + + # ANALYSIS_TYPES + # They have been extended. If file was saved with a old FC version + # not all enum types are available, because they are saved in the FC file + # thus refresh the list of known ANALYSIS_TYPES + # print("onRestoredFromSuperClass") + # print(obj.AnalysisType) + # print(obj.getEnumerationsOfProperty("AnalysisType")) + + temp_analysis_type = obj.AnalysisType + # self.add_properties(obj) + obj.AnalysisType = ANALYSIS_TYPES + if temp_analysis_type in ANALYSIS_TYPES: + obj.AnalysisType = temp_analysis_type + else: + FreeCAD.Console.PrintWarning( + "Analysis type {} not found. Standard is used.\n" + .format(temp_analysis_type) + ) + analysis_type = ccx_prefs.GetInt("AnalysisType", 0) + obj.AnalysisType = ANALYSIS_TYPES[analysis_type] + + # BucklingFactors + # TODO + # just call add_attributes but in add_attributes + # every attribute needs to be checked if exist + # see object mesh_gmsh for information + # HACK + if not hasattr(obj, "BucklingFactors"): + obj.addProperty( + "App::PropertyIntegerConstraint", + "BucklingFactors", + "Fem", + "Calculates the lowest buckling modes to the corresponding buckling factors" + ) + bckl = ccx_prefs.GetInt("BucklingFactors", 1) + obj.BucklingFactors = bckl + + def add_attributes(obj, ccx_prefs): obj.addProperty(