From 4d5424e422b2f2eeb786f6f13588369fb788d1fa Mon Sep 17 00:00:00 2001 From: marioalexis Date: Fri, 20 Dec 2024 12:18:12 -0300 Subject: [PATCH] Fem: Add suppressible extension to objects - fixes #12115 --- src/Mod/Fem/App/FemMeshObject.cpp | 2 ++ src/Mod/Fem/App/FemMeshObject.h | 4 ++++ src/Mod/Fem/Gui/ViewProviderFemMesh.cpp | 2 ++ src/Mod/Fem/Gui/ViewProviderFemMesh.h | 2 ++ src/Mod/Fem/femobjects/base_femelement.py | 5 +++++ src/Mod/Fem/femobjects/material_common.py | 5 +++++ src/Mod/Fem/femobjects/material_mechanicalnonlinear.py | 4 ++++ src/Mod/Fem/femtools/checksanalysis.py | 2 +- src/Mod/Fem/femtools/membertools.py | 6 +----- src/Mod/Fem/femviewprovider/view_base_femelement.py | 4 ++++ src/Mod/Fem/femviewprovider/view_base_femmaterial.py | 4 ++++ 11 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/Mod/Fem/App/FemMeshObject.cpp b/src/Mod/Fem/App/FemMeshObject.cpp index 43b31db040..a5a7077171 100644 --- a/src/Mod/Fem/App/FemMeshObject.cpp +++ b/src/Mod/Fem/App/FemMeshObject.cpp @@ -41,6 +41,8 @@ FemMeshObject::FemMeshObject() ADD_PROPERTY_TYPE(FemMesh, (), "FEM Mesh", Prop_NoRecompute, "FEM Mesh object"); // in the regard of recomputes see: // https://forum.freecad.org/viewtopic.php?f=18&t=33329#p279203 + + suppressibleExt.initExtension(this); } FemMeshObject::~FemMeshObject() = default; diff --git a/src/Mod/Fem/App/FemMeshObject.h b/src/Mod/Fem/App/FemMeshObject.h index 97d51b44db..02ec4d7c38 100644 --- a/src/Mod/Fem/App/FemMeshObject.h +++ b/src/Mod/Fem/App/FemMeshObject.h @@ -25,6 +25,7 @@ #include #include +#include #include "FemMesh.h" #include "FemMeshProperty.h" @@ -63,6 +64,9 @@ public: protected: /// get called by the container when a property has changed void onChanged(const App::Property* prop) override; + +private: + App::SuppressibleExtension suppressibleExt; }; using FemMeshObjectPython = App::FeaturePythonT; diff --git a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp index 0c794fb5a9..a8f7e7c446 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp @@ -220,6 +220,8 @@ ViewProviderFemMesh::ViewProviderFemMesh() App::Prop_Hidden, "Node diffuse color array"); + suppressibleExt.initExtension(this); + ColorMode.setEnums(colorModeEnum); onlyEdges = false; diff --git a/src/Mod/Fem/Gui/ViewProviderFemMesh.h b/src/Mod/Fem/Gui/ViewProviderFemMesh.h index 0a3d738b4a..108afb5418 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMesh.h +++ b/src/Mod/Fem/Gui/ViewProviderFemMesh.h @@ -26,6 +26,7 @@ #include #include #include +#include #include class SoCoordinate3; @@ -144,6 +145,7 @@ public: private: static App::PropertyFloatConstraint::Constraints floatRange; static const char* colorModeEnum[]; + Gui::ViewProviderSuppressibleExtension suppressibleExt; protected: /// get called by the container whenever a property has been changed diff --git a/src/Mod/Fem/femobjects/base_femelement.py b/src/Mod/Fem/femobjects/base_femelement.py index 950c1e70a9..a81e906a36 100644 --- a/src/Mod/Fem/femobjects/base_femelement.py +++ b/src/Mod/Fem/femobjects/base_femelement.py @@ -45,6 +45,8 @@ class BaseFemElement(base_fempythonobject.BaseFemPythonObject): for prop in self._get_properties(): prop.add_to_object(obj) + obj.addExtension("App::SuppressibleExtensionPython") + def _get_properties(self): prop = [] @@ -71,3 +73,6 @@ class BaseFemElement(base_fempythonobject.BaseFemPythonObject): if prop.name == "References": # change References to App::PropertyLinkSubListGlobal prop.handle_change_type(obj, old_type="App::PropertyLinkSubList") + + if not obj.hasExtension("App::SuppressibleExtensionPython"): + obj.addExtension("App::SuppressibleExtensionPython") diff --git a/src/Mod/Fem/femobjects/material_common.py b/src/Mod/Fem/femobjects/material_common.py index 10011c7978..c4b1280a5d 100644 --- a/src/Mod/Fem/femobjects/material_common.py +++ b/src/Mod/Fem/femobjects/material_common.py @@ -49,6 +49,8 @@ class MaterialCommon(base_fempythonobject.BaseFemPythonObject): for prop in self._get_properties(): prop.add_to_object(obj) + obj.addExtension("App::SuppressibleExtensionPython") + def _get_properties(self): prop = [] @@ -95,6 +97,9 @@ class MaterialCommon(base_fempythonobject.BaseFemPythonObject): # change References to App::PropertyLinkSubListGlobal prop.handle_change_type(obj, old_type="App::PropertyLinkSubList") + if not obj.hasExtension("App::SuppressibleExtensionPython"): + obj.addExtension("App::SuppressibleExtensionPython") + """ Some remarks to the category. Not finished, thus to be continued. diff --git a/src/Mod/Fem/femobjects/material_mechanicalnonlinear.py b/src/Mod/Fem/femobjects/material_mechanicalnonlinear.py index 8aa8ca4c94..6c60437b63 100644 --- a/src/Mod/Fem/femobjects/material_mechanicalnonlinear.py +++ b/src/Mod/Fem/femobjects/material_mechanicalnonlinear.py @@ -43,6 +43,8 @@ class MaterialMechanicalNonlinear(base_fempythonobject.BaseFemPythonObject): super().__init__(obj) self.add_properties(obj) + obj.addExtension("App::SuppressibleExtensionPython") + def onDocumentRestored(self, obj): # YieldPoints was (until 0.19) stored as 3 separate variables. Consolidate them if present. @@ -64,6 +66,8 @@ class MaterialMechanicalNonlinear(base_fempythonobject.BaseFemPythonObject): if yield_points: obj.YieldPoints = yield_points + if not obj.hasExtension("App::SuppressibleExtensionPython"): + obj.addExtension("App::SuppressibleExtensionPython") # TODO: If in the future more nonlinear options are added, update choices here. def add_properties(self, obj): diff --git a/src/Mod/Fem/femtools/checksanalysis.py b/src/Mod/Fem/femtools/checksanalysis.py index a3cc34480d..b6f67f5c1a 100644 --- a/src/Mod/Fem/femtools/checksanalysis.py +++ b/src/Mod/Fem/femtools/checksanalysis.py @@ -60,7 +60,7 @@ def check_member_for_solver_calculix(analysis, solver, mesh, member): # mesh if not mesh: - message += "No mesh object defined in the analysis.\n" + message += "A single mesh object must be defined in the analysis.\n" if mesh: if ( mesh.FemMesh.VolumeCount == 0 diff --git a/src/Mod/Fem/femtools/membertools.py b/src/Mod/Fem/femtools/membertools.py index 4ba30c7f6e..44fbfd5340 100644 --- a/src/Mod/Fem/femtools/membertools.py +++ b/src/Mod/Fem/femtools/membertools.py @@ -141,11 +141,7 @@ def get_mesh_to_solve(analysis): """ mesh_to_solve = None for m in analysis.Group: - if ( - m.isDerivedFrom("Fem::FemMeshObject") - # the next line should not be needed as the result mesh is not a analysis member - and not femutils.is_of_type(m, "Fem::MeshResult") - ): + if m.isDerivedFrom("Fem::FemMeshObject") and not m.Suppressed: if not mesh_to_solve: mesh_to_solve = m else: diff --git a/src/Mod/Fem/femviewprovider/view_base_femelement.py b/src/Mod/Fem/femviewprovider/view_base_femelement.py index 0dc33f9a99..6b116ae264 100644 --- a/src/Mod/Fem/femviewprovider/view_base_femelement.py +++ b/src/Mod/Fem/femviewprovider/view_base_femelement.py @@ -35,5 +35,9 @@ from femviewprovider import view_base_femobject class VPBaseFemElement(view_base_femobject.VPBaseFemObject): """Proxy View Provider for Python base element.""" + def __init__(self, vobj): + super().__init__(vobj) + vobj.addExtension("Gui::ViewProviderSuppressibleExtensionPython") + def isShow(self): return self.ViewObject.Visibility diff --git a/src/Mod/Fem/femviewprovider/view_base_femmaterial.py b/src/Mod/Fem/femviewprovider/view_base_femmaterial.py index 2fb3c75a8d..7613a9ba5a 100644 --- a/src/Mod/Fem/femviewprovider/view_base_femmaterial.py +++ b/src/Mod/Fem/femviewprovider/view_base_femmaterial.py @@ -35,5 +35,9 @@ from femviewprovider import view_base_femobject class VPBaseFemMaterial(view_base_femobject.VPBaseFemObject): """Proxy View Provider for Python base material.""" + def __init__(self, vobj): + super().__init__(vobj) + vobj.addExtension("Gui::ViewProviderSuppressibleExtensionPython") + def isShow(self): return self.ViewObject.Visibility