From 3ef7ba2d9d2a921e55c987b92e4084a90e75b888 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 2 May 2025 07:28:59 +0000 Subject: [PATCH] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/Mod/Fem/App/AppFemPy.cpp | 13 +-- src/Mod/Fem/App/FemPostFilter.cpp | 15 ++-- src/Mod/Fem/App/FemPostFilter.h | 3 +- src/Mod/Fem/App/FemPostFilterPyImp.cpp | 23 ++--- src/Mod/Fem/App/PropertyPostDataObject.cpp | 6 +- src/Mod/Fem/Gui/TaskPostBoxes.cpp | 87 +++++++++---------- src/Mod/Fem/Gui/TaskPostBoxes.h | 3 +- src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp | 20 +++-- src/Mod/Fem/Gui/ViewProviderFemPostFilter.h | 3 +- src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp | 2 +- src/Mod/Fem/InitGui.py | 1 + src/Mod/Fem/ObjectsFem.py | 4 + src/Mod/Fem/femcommands/commands.py | 6 +- src/Mod/Fem/femcommands/manager.py | 16 ++-- .../Fem/femguiutils/vtk_module_handling.py | 44 +++++++--- src/Mod/Fem/femobjects/post_glyphfilter.py | 28 +++--- .../femtaskpanels/task_post_glyphfilter.py | 30 +++---- .../femviewprovider/view_post_glyphfilter.py | 2 +- 18 files changed, 166 insertions(+), 140 deletions(-) diff --git a/src/Mod/Fem/App/AppFemPy.cpp b/src/Mod/Fem/App/AppFemPy.cpp index fa93907637..69ab7fc502 100644 --- a/src/Mod/Fem/App/AppFemPy.cpp +++ b/src/Mod/Fem/App/AppFemPy.cpp @@ -84,9 +84,10 @@ public: &Module::getVtkVersion, "Returns the VTK version FreeCAD is linked against"); #ifdef FC_USE_VTK_PYTHON - add_varargs_method("isVtkCompatible", - &Module::isVtkCompatible, - "Checks if the passed vtkObject is compatible with the c++ VTK version FreeCAD uses"); + add_varargs_method( + "isVtkCompatible", + &Module::isVtkCompatible, + "Checks if the passed vtkObject is compatible with the c++ VTK version FreeCAD uses"); #endif #endif add_varargs_method("show", @@ -334,7 +335,7 @@ private: Py::Object getVtkVersion(const Py::Tuple& args) { - if (!PyArg_ParseTuple(args.ptr(),"")) { + if (!PyArg_ParseTuple(args.ptr(), "")) { throw Py::Exception(); } @@ -345,13 +346,13 @@ private: Py::Object isVtkCompatible(const Py::Tuple& args) { PyObject* pcObj = nullptr; - if (!PyArg_ParseTuple(args.ptr(),"O", &pcObj)) { + if (!PyArg_ParseTuple(args.ptr(), "O", &pcObj)) { throw Py::Exception(); } // if non is returned the VTK object was created by annother VTK library, and the // python api used to create it cannot be used with FreeCAD - vtkObjectBase *obj = vtkPythonUtil::GetPointerFromObject(pcObj, "vtkObject"); + vtkObjectBase* obj = vtkPythonUtil::GetPointerFromObject(pcObj, "vtkObject"); if (!obj) { PyErr_Clear(); return Py::False(); diff --git a/src/Mod/Fem/App/FemPostFilter.cpp b/src/Mod/Fem/App/FemPostFilter.cpp index 3501860a3e..24531c1790 100644 --- a/src/Mod/Fem/App/FemPostFilter.cpp +++ b/src/Mod/Fem/App/FemPostFilter.cpp @@ -226,14 +226,14 @@ vtkSmartPointer FemPostFilter::getInputData() } vtkAlgorithmOutput* output = active.source->GetInputConnection(0, 0); - if(!output) { + if (!output) { return nullptr; } vtkAlgorithm* algo = output->GetProducer(); - if(!algo) { + if (!algo) { return nullptr; } - if (Frame.getValue()>0) { + if (Frame.getValue() > 0) { algo->UpdateTimeStep(Frame.getValue()); } else { @@ -302,11 +302,13 @@ namespace App { /// @cond DOXERR PROPERTY_SOURCE_TEMPLATE(Fem::PostFilterPython, Fem::FemPostFilter) -template<> const char* Fem::PostFilterPython::getViewProviderName(void) const +template<> +const char* Fem::PostFilterPython::getViewProviderName(void) const { return "FemGui::ViewProviderPostFilterPython"; } -template<> PyObject* Fem::PostFilterPython::getPyObject() +template<> +PyObject* Fem::PostFilterPython::getPyObject() { if (PythonObject.is(Py::_None())) { // ref counter is set to 1 @@ -319,8 +321,7 @@ template<> PyObject* Fem::PostFilterPython::getPyObject() // explicit template instantiation template class FemExport FeaturePythonT; -}// namespace App - +} // namespace App // *************************************************************************** diff --git a/src/Mod/Fem/App/FemPostFilter.h b/src/Mod/Fem/App/FemPostFilter.h index d3becd9783..273bd63c0f 100644 --- a/src/Mod/Fem/App/FemPostFilter.h +++ b/src/Mod/Fem/App/FemPostFilter.h @@ -72,7 +72,7 @@ protected: std::vector> algorithmStorage; }; - //pipeline handling + // pipeline handling void addFilterPipeline(const FilterPipeline& p, std::string name); FilterPipeline& getFilterPipeline(std::string name); void setActiveFilterPipeline(std::string name); @@ -81,6 +81,7 @@ protected: void setTransformLocation(TransformLocation loc); friend class FemPostFilterPy; + public: /// Constructor FemPostFilter(); diff --git a/src/Mod/Fem/App/FemPostFilterPyImp.cpp b/src/Mod/Fem/App/FemPostFilterPyImp.cpp index 479e6d55d2..dddf9048e1 100644 --- a/src/Mod/Fem/App/FemPostFilterPyImp.cpp +++ b/src/Mod/Fem/App/FemPostFilterPyImp.cpp @@ -36,9 +36,9 @@ // clang-format on #ifdef FC_USE_VTK_PYTHON - #include - #include -#endif //BUILD_FEM_VTK +#include +#include +#endif // BUILD_FEM_VTK using namespace Fem; @@ -56,20 +56,20 @@ PyObject* FemPostFilterPy::addFilterPipeline(PyObject* args) { #ifdef FC_USE_VTK_PYTHON const char* name; - PyObject *source = nullptr; - PyObject *target = nullptr; + PyObject* source = nullptr; + PyObject* target = nullptr; if (PyArg_ParseTuple(args, "sOO", &name, &source, &target)) { // extract the algorithms - vtkObjectBase *obj = vtkPythonUtil::GetPointerFromObject(source, "vtkAlgorithm"); + vtkObjectBase* obj = vtkPythonUtil::GetPointerFromObject(source, "vtkAlgorithm"); if (!obj) { // error marker is set by PythonUtil return nullptr; } auto source_algo = static_cast(obj); - obj = vtkPythonUtil::GetPointerFromObject(target,"vtkAlgorithm"); + obj = vtkPythonUtil::GetPointerFromObject(target, "vtkAlgorithm"); if (!obj) { // error marker is set by PythonUtil return nullptr; @@ -130,7 +130,8 @@ PyObject* FemPostFilterPy::getInputData(PyObject* args) copy = vtkUnstructuredGrid::New(); break; default: - PyErr_SetString(PyExc_TypeError, "cannot return datatype object; not unstructured grid"); + PyErr_SetString(PyExc_TypeError, + "cannot return datatype object; not unstructured grid"); Py_Return; } @@ -138,7 +139,7 @@ PyObject* FemPostFilterPy::getInputData(PyObject* args) copy->DeepCopy(dataset); PyObject* py_dataset = vtkPythonUtil::GetObjectFromPointer(copy); - return Py::new_reference_to(py_dataset); + return Py::new_reference_to(py_dataset); #else PyErr_SetString(PyExc_NotImplementedError, "VTK python wrapper not available"); Py_Return; @@ -160,7 +161,7 @@ PyObject* FemPostFilterPy::getInputVectorFields(PyObject* args) list.append(Py::String(field)); } - return Py::new_reference_to(list); + return Py::new_reference_to(list); } @@ -179,7 +180,7 @@ PyObject* FemPostFilterPy::getInputScalarFields(PyObject* args) list.append(Py::String(field)); } - return Py::new_reference_to(list); + return Py::new_reference_to(list); } PyObject* FemPostFilterPy::getCustomAttributes(const char* /*attr*/) const diff --git a/src/Mod/Fem/App/PropertyPostDataObject.cpp b/src/Mod/Fem/App/PropertyPostDataObject.cpp index 86821e1ac7..786d58f783 100644 --- a/src/Mod/Fem/App/PropertyPostDataObject.cpp +++ b/src/Mod/Fem/App/PropertyPostDataObject.cpp @@ -169,12 +169,12 @@ int PropertyPostDataObject::getDataType() PyObject* PropertyPostDataObject::getPyObject() { #ifdef FC_USE_VTK_PYTHON - //create a copy first + // create a copy first auto copy = static_cast(Copy()); // get the data python wrapper PyObject* py_dataset = vtkPythonUtil::GetObjectFromPointer(copy->getValue()); - auto result = Py::new_reference_to(py_dataset); + auto result = Py::new_reference_to(py_dataset); delete copy; return result; @@ -187,7 +187,7 @@ PyObject* PropertyPostDataObject::getPyObject() void PropertyPostDataObject::setPyObject(PyObject* value) { #ifdef FC_USE_VTK_PYTHON - vtkObjectBase *obj = vtkPythonUtil::GetPointerFromObject(value, "vtkDataObject"); + vtkObjectBase* obj = vtkPythonUtil::GetPointerFromObject(value, "vtkDataObject"); if (!obj) { throw Base::TypeError("Can only set vtkDataObject"); } diff --git a/src/Mod/Fem/Gui/TaskPostBoxes.cpp b/src/Mod/Fem/Gui/TaskPostBoxes.cpp index ea51bdf8bf..db0ed493be 100644 --- a/src/Mod/Fem/Gui/TaskPostBoxes.cpp +++ b/src/Mod/Fem/Gui/TaskPostBoxes.cpp @@ -204,9 +204,9 @@ void DataAlongLineMarker::customEvent(QEvent*) // *************************************************************************** // main task dialog TaskPostWidget::TaskPostWidget(Gui::ViewProviderDocumentObject* view, - const QPixmap& icon, - const QString& title, - QWidget* parent) + const QPixmap& icon, + const QString& title, + QWidget* parent) : QWidget(parent) , m_object(view->getObject()) , m_view(view) @@ -272,13 +272,14 @@ QDialogButtonBox::StandardButtons TaskDlgPost::getStandardButtons() const { bool guionly = true; for (auto& widget : Content) { - if(auto task_box = dynamic_cast(widget)) { + if (auto task_box = dynamic_cast(widget)) { // get the task widget and check if it is a post widget auto widget = task_box->groupLayout()->itemAt(0)->widget(); - if(auto post_widget = dynamic_cast(widget)) { + if (auto post_widget = dynamic_cast(widget)) { guionly = guionly && post_widget->isGuiTaskOnly(); - } else { + } + else { // unknown panel, we can only assume guionly = false; } @@ -334,10 +335,10 @@ void TaskDlgPost::clicked(int button) { if (button == QDialogButtonBox::Apply) { for (auto& widget : Content) { - if(auto task_box = dynamic_cast(widget)) { + if (auto task_box = dynamic_cast(widget)) { // get the task widget and check if it is a post widget auto widget = task_box->groupLayout()->itemAt(0)->widget(); - if(auto post_widget = dynamic_cast(widget)) { + if (auto post_widget = dynamic_cast(widget)) { post_widget->apply(); } } @@ -350,10 +351,10 @@ bool TaskDlgPost::accept() { try { for (auto& widget : Content) { - if(auto task_box = dynamic_cast(widget)) { + if (auto task_box = dynamic_cast(widget)) { // get the task widget and check if it is a post widget auto widget = task_box->groupLayout()->itemAt(0)->widget(); - if(auto post_widget = dynamic_cast(widget)) { + if (auto post_widget = dynamic_cast(widget)) { post_widget->applyPythonCode(); } } @@ -396,14 +397,13 @@ void TaskDlgPost::modifyStandardButtons(QDialogButtonBox* box) // *************************************************************************** // box to set the coloring TaskPostDisplay::TaskPostDisplay(ViewProviderFemPostObject* view, QWidget* parent) - : TaskPostWidget(view, - Gui::BitmapFactory().pixmap("FEM_ResultShow"), QString(), - parent) + : TaskPostWidget(view, Gui::BitmapFactory().pixmap("FEM_ResultShow"), QString(), parent) , ui(new Ui_TaskPostDisplay) { // setup the ui ui->setupUi(this); - setWindowTitle(tr("Result display options")); // set title here as setupUi overrides the constructor title + setWindowTitle( + tr("Result display options")); // set title here as setupUi overrides the constructor title setupConnections(); // update all fields @@ -480,16 +480,16 @@ void TaskPostDisplay::applyPythonCode() // functions TaskPostFunction::TaskPostFunction(ViewProviderFemPostFunction* view, QWidget* parent) : TaskPostWidget(view, - Gui::BitmapFactory().pixmap("fem-post-geo-plane"), - tr("Implicit function"), - parent) + Gui::BitmapFactory().pixmap("fem-post-geo-plane"), + tr("Implicit function"), + parent) { // we load the views widget FunctionWidget* w = getTypedView()->createControlWidget(); w->setParent(this); w->setViewProvider(getTypedView()); - QVBoxLayout *layout = new QVBoxLayout; + QVBoxLayout* layout = new QVBoxLayout; layout->addWidget(w); setLayout(layout); } @@ -566,10 +566,7 @@ void TaskPostFrames::applyPythonCode() // *************************************************************************** // Branch TaskPostBranch::TaskPostBranch(ViewProviderFemPostBranchFilter* view, QWidget* parent) - : TaskPostWidget(view, - Gui::BitmapFactory().pixmap("FEM_PostBranchFilter"), - QString(), - parent) + : TaskPostWidget(view, Gui::BitmapFactory().pixmap("FEM_PostBranchFilter"), QString(), parent) , ui(new Ui_TaskPostBranch) { // setup the ui @@ -621,9 +618,9 @@ void TaskPostBranch::applyPythonCode() TaskPostDataAlongLine::TaskPostDataAlongLine(ViewProviderFemPostDataAlongLine* view, QWidget* parent) : TaskPostWidget(view, - Gui::BitmapFactory().pixmap("FEM_PostFilterDataAlongLine"), - QString(), - parent) + Gui::BitmapFactory().pixmap("FEM_PostFilterDataAlongLine"), + QString(), + parent) , ui(new Ui_TaskPostDataAlongLine) , marker(nullptr) { @@ -1041,9 +1038,9 @@ plt.show()\n"; // data at point filter TaskPostDataAtPoint::TaskPostDataAtPoint(ViewProviderFemPostDataAtPoint* view, QWidget* parent) : TaskPostWidget(view, - Gui::BitmapFactory().pixmap("FEM_PostFilterDataAtPoint"), - QString(), - parent) + Gui::BitmapFactory().pixmap("FEM_PostFilterDataAtPoint"), + QString(), + parent) , viewer(nullptr) , connSelectPoint(QMetaObject::Connection()) , ui(new Ui_TaskPostDataAtPoint) @@ -1396,9 +1393,9 @@ TaskPostClip::TaskPostClip(ViewProviderFemPostClip* view, App::PropertyLink* function, QWidget* parent) : TaskPostWidget(view, - Gui::BitmapFactory().pixmap("FEM_PostFilterClipRegion"), - QString(), - parent) + Gui::BitmapFactory().pixmap("FEM_PostFilterClipRegion"), + QString(), + parent) , ui(new Ui_TaskPostClip) { assert(function); @@ -1554,10 +1551,7 @@ void TaskPostClip::onInsideOutToggled(bool val) // *************************************************************************** // contours filter TaskPostContours::TaskPostContours(ViewProviderFemPostContours* view, QWidget* parent) - : TaskPostWidget(view, - Gui::BitmapFactory().pixmap("FEM_PostFilterContours"), - QString(), - parent) + : TaskPostWidget(view, Gui::BitmapFactory().pixmap("FEM_PostFilterContours"), QString(), parent) , ui(new Ui_TaskPostContours) { // setup the ui @@ -1709,9 +1703,9 @@ void TaskPostContours::onRelaxationChanged(double value) // cut filter TaskPostCut::TaskPostCut(ViewProviderFemPostCut* view, App::PropertyLink* function, QWidget* parent) : TaskPostWidget(view, - Gui::BitmapFactory().pixmap("FEM_PostFilterCutFunction"), - QString(), - parent) + Gui::BitmapFactory().pixmap("FEM_PostFilterCutFunction"), + QString(), + parent) , ui(new Ui_TaskPostCut) { assert(function); @@ -1847,9 +1841,9 @@ void TaskPostCut::onFunctionBoxCurrentIndexChanged(int idx) // scalar clip filter TaskPostScalarClip::TaskPostScalarClip(ViewProviderFemPostScalarClip* view, QWidget* parent) : TaskPostWidget(view, - Gui::BitmapFactory().pixmap("FEM_PostFilterClipScalar"), - QString(), - parent) + Gui::BitmapFactory().pixmap("FEM_PostFilterClipScalar"), + QString(), + parent) , ui(new Ui_TaskPostScalarClip) { // setup the ui @@ -1970,10 +1964,7 @@ void TaskPostScalarClip::onInsideOutToggled(bool val) // *************************************************************************** // warp vector filter TaskPostWarpVector::TaskPostWarpVector(ViewProviderFemPostWarpVector* view, QWidget* parent) - : TaskPostWidget(view, - Gui::BitmapFactory().pixmap("FEM_PostFilterWarp"), - QString(), - parent) + : TaskPostWidget(view, Gui::BitmapFactory().pixmap("FEM_PostFilterWarp"), QString(), parent) , ui(new Ui_TaskPostWarpVector) { // setup the ui @@ -2145,9 +2136,9 @@ static const std::vector calculatorOperators = { TaskPostCalculator::TaskPostCalculator(ViewProviderFemPostCalculator* view, QWidget* parent) : TaskPostWidget(view, - Gui::BitmapFactory().pixmap("FEM_PostFilterCalculator"), - tr("Calculator options"), - parent) + Gui::BitmapFactory().pixmap("FEM_PostFilterCalculator"), + tr("Calculator options"), + parent) , ui(new Ui_TaskPostCalculator) { // we load the views widget diff --git a/src/Mod/Fem/Gui/TaskPostBoxes.h b/src/Mod/Fem/Gui/TaskPostBoxes.h index 85ea7f21eb..d37742dd27 100644 --- a/src/Mod/Fem/Gui/TaskPostBoxes.h +++ b/src/Mod/Fem/Gui/TaskPostBoxes.h @@ -317,8 +317,7 @@ class TaskPostBranch: public TaskPostWidget Q_OBJECT public: - explicit TaskPostBranch(ViewProviderFemPostBranchFilter* view, - QWidget* parent = nullptr); + explicit TaskPostBranch(ViewProviderFemPostBranchFilter* view, QWidget* parent = nullptr); ~TaskPostBranch() override; void applyPythonCode() override; diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp index be1bff14be..4cbacb5cad 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp @@ -37,7 +37,8 @@ using namespace FemGui; PROPERTY_SOURCE(FemGui::ViewProviderFemPostFilterPythonBase, FemGui::ViewProviderFemPostObject) -ViewProviderFemPostFilterPythonBase::ViewProviderFemPostFilterPythonBase() {} +ViewProviderFemPostFilterPythonBase::ViewProviderFemPostFilterPythonBase() +{} ViewProviderFemPostFilterPythonBase::~ViewProviderFemPostFilterPythonBase() = default; @@ -46,10 +47,13 @@ std::vector ViewProviderFemPostFilterPythonBase::getDisplayModes() return std::vector(); } -namespace Gui { -PROPERTY_SOURCE_TEMPLATE(FemGui::ViewProviderPostFilterPython, FemGui::ViewProviderFemPostFilterPythonBase) +namespace Gui +{ +PROPERTY_SOURCE_TEMPLATE(FemGui::ViewProviderPostFilterPython, + FemGui::ViewProviderFemPostFilterPythonBase) -template<> PyObject* FemGui::ViewProviderPostFilterPython::getPyObject() +template<> +PyObject* FemGui::ViewProviderPostFilterPython::getPyObject() { if (!pyViewObject) { pyViewObject = new ViewProviderFemPostFilterPy(this); @@ -61,7 +65,7 @@ template<> PyObject* FemGui::ViewProviderPostFilterPython::getPyObject() // explicit template instantiation template class FemGuiExport ViewProviderFeaturePythonT; -} +} // namespace Gui // *************************************************************************** // in the following, the different filters sorted alphabetically @@ -154,7 +158,8 @@ void ViewProviderFemPostClip::setupTaskDialog(TaskDlgPost* dlg) // add the function box assert(dlg->getView() == this); - auto panel = new TaskPostClip(this, &dlg->getView()->getObject()->Function); + auto panel = + new TaskPostClip(this, &dlg->getView()->getObject()->Function); dlg->addTaskBox(panel->getIcon(), panel); // add the display options @@ -197,7 +202,8 @@ void ViewProviderFemPostCut::setupTaskDialog(TaskDlgPost* dlg) { // add the function box assert(dlg->getView() == this); - auto panel = new TaskPostCut(this, &dlg->getView()->getObject()->Function); + auto panel = + new TaskPostCut(this, &dlg->getView()->getObject()->Function); dlg->addTaskBox(panel->getIcon(), panel); // add the display options diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostFilter.h b/src/Mod/Fem/Gui/ViewProviderFemPostFilter.h index 771ce5ef16..82b7f16bf8 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostFilter.h +++ b/src/Mod/Fem/Gui/ViewProviderFemPostFilter.h @@ -50,7 +50,8 @@ public: // Viewprovider for the python filters -using ViewProviderPostFilterPython = Gui::ViewProviderFeaturePythonT; +using ViewProviderPostFilterPython = + Gui::ViewProviderFeaturePythonT; // *************************************************************************** diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp index 7113155471..4cbb97b414 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp @@ -932,7 +932,7 @@ void ViewProviderFemPostObject::onChanged(const App::Property* prop) } if (prop == &Field && setupPipeline()) { - if(!isRestoring()) { + if (!isRestoring()) { updateProperties(); } WriteColorData(ResetColorBarRange); diff --git a/src/Mod/Fem/InitGui.py b/src/Mod/Fem/InitGui.py index 9b48177bba..8ac271d379 100644 --- a/src/Mod/Fem/InitGui.py +++ b/src/Mod/Fem/InitGui.py @@ -82,6 +82,7 @@ class FemWorkbench(Workbench): # check vtk version to potentially find missmatchs from femguiutils.vtk_module_handling import vtk_module_handling + vtk_module_handling() def GetClassName(self): diff --git a/src/Mod/Fem/ObjectsFem.py b/src/Mod/Fem/ObjectsFem.py index 92ca918d40..c05ecc6108 100644 --- a/src/Mod/Fem/ObjectsFem.py +++ b/src/Mod/Fem/ObjectsFem.py @@ -652,6 +652,7 @@ def makePostVtkFilterContours(doc, base_vtk_result, name="VtkFilterContours"): base_vtk_result.addObject(obj) return obj + def makePostFilterGlyph(doc, base_vtk_result, name="Glyph"): """makePostVtkFilterGlyph(document, [name]): creates a FEM post processing filter that visualizes vector fields with glyphs @@ -663,9 +664,11 @@ def makePostFilterGlyph(doc, base_vtk_result, name="Glyph"): base_vtk_result.addObject(obj) if FreeCAD.GuiUp: from femviewprovider import view_post_glyphfilter + view_post_glyphfilter.VPPostGlyphFilter(obj.ViewObject) return obj + def makePostVtkResult(doc, result_data, name="VtkResult"): """makePostVtkResult(document, base_result, [name]): creates a FEM post processing result data (vtk based) to hold FEM results @@ -682,6 +685,7 @@ def makePostVtkResult(doc, result_data, name="VtkResult"): obj.ViewObject.DisplayMode = "Surface" return obj + # ********* solver objects *********************************************************************** def makeEquationDeformation(doc, base_solver=None, name="Deformation"): """makeEquationDeformation(document, [base_solver], [name]): diff --git a/src/Mod/Fem/femcommands/commands.py b/src/Mod/Fem/femcommands/commands.py index 5e260f7765..0c61dcff2b 100644 --- a/src/Mod/Fem/femcommands/commands.py +++ b/src/Mod/Fem/femcommands/commands.py @@ -1216,6 +1216,7 @@ class _SolverZ88(CommandManager): self.is_active = "with_analysis" self.do_activated = "add_obj_on_gui_expand_noset_edit" + class _PostFilterGlyph(CommandManager): "The FEM_PostFilterGlyph command definition" @@ -1223,7 +1224,10 @@ class _PostFilterGlyph(CommandManager): super().__init__() self.menutext = Qt.QT_TRANSLATE_NOOP("FEM_PostFilterGlyph", "Glyph filter") self.accel = "F, G" - self.tooltip = Qt.QT_TRANSLATE_NOOP("FEM_PostFilterGlyph", "Post processing filter that adds glyphs to the mesh vertices for vertex data visualization") + self.tooltip = Qt.QT_TRANSLATE_NOOP( + "FEM_PostFilterGlyph", + "Post processing filter that adds glyphs to the mesh vertices for vertex data visualization", + ) self.is_active = "with_vtk_selresult" self.do_activated = "add_filter_set_edit" diff --git a/src/Mod/Fem/femcommands/manager.py b/src/Mod/Fem/femcommands/manager.py index 18614b8a22..44c5d2dc0a 100644 --- a/src/Mod/Fem/femcommands/manager.py +++ b/src/Mod/Fem/femcommands/manager.py @@ -91,9 +91,7 @@ class CommandManager: and self.result_selected() ) elif self.is_active == "with_vtk_selresult": - active = ( - self.vtk_result_selected() - ) + active = self.vtk_result_selected() elif self.is_active == "with_part_feature": active = FreeCADGui.ActiveDocument is not None and self.part_feature_selected() elif self.is_active == "with_femmesh": @@ -401,8 +399,12 @@ class CommandManager: "FreeCAD.ActiveDocument, FreeCAD.ActiveDocument.{})".format(filtertype, group.Name) ) # set display and selection style to assure the user sees the new object - FreeCADGui.doCommand("FreeCAD.ActiveDocument.ActiveObject.ViewObject.DisplayMode = \"Surface\""); - FreeCADGui.doCommand("FreeCAD.ActiveDocument.ActiveObject.ViewObject.SelectionStyle = \"BoundBox\""); + FreeCADGui.doCommand( + 'FreeCAD.ActiveDocument.ActiveObject.ViewObject.DisplayMode = "Surface"' + ) + FreeCADGui.doCommand( + 'FreeCAD.ActiveDocument.ActiveObject.ViewObject.SelectionStyle = "BoundBox"' + ) # hide selected filter FreeCADGui.doCommand( @@ -411,9 +413,7 @@ class CommandManager: # recompute, expand selobj in tree view expandParentObject() - FreeCADGui.doCommand( - "FreeCAD.ActiveDocument.ActiveObject.recompute()" - ) + FreeCADGui.doCommand("FreeCAD.ActiveDocument.ActiveObject.recompute()") # set edit FreeCADGui.Selection.clearSelection() diff --git a/src/Mod/Fem/femguiutils/vtk_module_handling.py b/src/Mod/Fem/femguiutils/vtk_module_handling.py index b9feae6638..dd5934af7e 100644 --- a/src/Mod/Fem/femguiutils/vtk_module_handling.py +++ b/src/Mod/Fem/femguiutils/vtk_module_handling.py @@ -49,6 +49,7 @@ __url__ = "https://www.freecad.org" __user_input_received = False + def vtk_module_compatible(): # checks if the VTK library FreeCAD is build against is the one used by # the python module @@ -76,6 +77,7 @@ def vtk_module_compatible(): def _vtk_is_loaded(): import sys + return any("vtkmodules" in module for module in sys.modules) @@ -84,6 +86,7 @@ def _unload_vtk_modules(): # NOTE: does not remove any stored references in objects import sys + for module in sys.modules.copy(): if "vtkmodules" in module: del sys.modules[module] @@ -157,7 +160,9 @@ def vtk_module_handling(): if not vtk_module_compatible(): if not FreeCAD.GuiUp: - FreeCAD.Console.PrintError("FEM: vtk python module is not compatible with internal vtk library") + FreeCAD.Console.PrintError( + "FEM: vtk python module is not compatible with internal vtk library" + ) return import FreeCAD, Fem @@ -168,11 +173,16 @@ def vtk_module_handling(): translate = FreeCAD.Qt.translate path = inspect.getfile(vtkVersion) - path = path[:path.find("vtkmodules")] + path = path[: path.find("vtkmodules")] - message = translate("FEM", ("FreeCAD is linked to a different VTK library then the imported " - "VTK python module. This is incompatible and will lead to errors." - "\n\nWrong python module is imported from: \n{}")).format(path) + message = translate( + "FEM", + ( + "FreeCAD is linked to a different VTK library then the imported " + "VTK python module. This is incompatible and will lead to errors." + "\n\nWrong python module is imported from: \n{}" + ), + ).format(path) buttons = QtGui.QMessageBox.Discard @@ -181,7 +191,9 @@ def vtk_module_handling(): if compatible_module: # there is a compatible module of VTK available. - message += translate("FEM", "\n\nCorrect module found in: \n{}").format(compatible_module) + message += translate("FEM", "\n\nCorrect module found in: \n{}").format( + compatible_module + ) if not loaded: # vtk was not loaded beforehand, therefore we can realistically reload @@ -190,15 +202,22 @@ def vtk_module_handling(): buttons = QtGui.QMessageBox.Yes | QtGui.QMessageBox.No else: - message += translate("FEM", ("\n\nAs the wrong module was already loaded, a reload is not possible. " - "Restart FreeCAD to get the option for loading this module.")) + message += translate( + "FEM", + ( + "\n\nAs the wrong module was already loaded, a reload is not possible. " + "Restart FreeCAD to get the option for loading this module." + ), + ) else: - message += translate("FEM", "\n\nNo matching module was found in the current python path.") - + message += translate( + "FEM", "\n\nNo matching module was found in the current python path." + ) # raise a dialog to the user import FreeCADGui + button = QtGui.QMessageBox.critical( FreeCADGui.getMainWindow(), translate("FEM", "VTK module conflict"), @@ -222,12 +241,15 @@ def vtk_compatibility_abort(inform=True): import FreeCAD import FreeCADGui from PySide import QtGui + translate = FreeCAD.Qt.translate button = QtGui.QMessageBox.critical( FreeCADGui.getMainWindow(), translate("FEM", "VTK module conflict"), - translate("FEM", "This functionality is not available due to VTK python module conflict"), + translate( + "FEM", "This functionality is not available due to VTK python module conflict" + ), buttons=QtGui.QMessageBox.Discard, ) diff --git a/src/Mod/Fem/femobjects/post_glyphfilter.py b/src/Mod/Fem/femobjects/post_glyphfilter.py index e86eb51872..936c47e233 100644 --- a/src/Mod/Fem/femobjects/post_glyphfilter.py +++ b/src/Mod/Fem/femobjects/post_glyphfilter.py @@ -33,6 +33,7 @@ import FreeCAD # check vtk version to potentially find missmatchs from femguiutils.vtk_module_handling import vtk_module_handling + vtk_module_handling() # IMPORTANT: Never import vtk directly. Often vtk is compiled with different QT @@ -43,8 +44,10 @@ from vtkmodules.vtkFiltersCore import vtkGlyph3D import vtkmodules.vtkFiltersSources as vtkSources from . import base_fempythonobject + _PropHelper = base_fempythonobject._PropHelper + class PostGlyphFilter(base_fempythonobject.BaseFemPythonObject): """ A post processing filter adding glyphs @@ -96,7 +99,7 @@ class PostGlyphFilter(base_fempythonobject.BaseFemPythonObject): name="ScaleFactor", group="Scale", doc="A constant multiplier the glyphs are scaled with", - value= (1, 0, 1e12, 1e-12), + value=(1, 0, 1e12, 1e-12), ), _PropHelper( type="App::PropertyEnumeration", @@ -109,15 +112,15 @@ class PostGlyphFilter(base_fempythonobject.BaseFemPythonObject): type="App::PropertyIntegerConstraint", name="Stride", group="Masking", - doc="Define the stride for \"Every Nth\" masking mode", - value= (2, 1, 999999999, 1), + doc='Define the stride for "Every Nth" masking mode', + value=(2, 1, 999999999, 1), ), _PropHelper( type="App::PropertyIntegerConstraint", name="MaxNumber", group="Masking", - doc="Defines the maximal number of vertices used for \"Uniform Sampling\" masking mode", - value= (1000, 1, 999999999, 1), + doc='Defines the maximal number of vertices used for "Uniform Sampling" masking mode', + value=(1000, 1, 999999999, 1), ), ] return prop @@ -155,14 +158,14 @@ class PostGlyphFilter(base_fempythonobject.BaseFemPythonObject): else: glyph.SetScaleModeToScaleByVectorComponents() - glyph.SetInputArrayToProcess(2,0,0,0,obj.ScaleData) + glyph.SetInputArrayToProcess(2, 0, 0, 0, obj.ScaleData) else: # scalar scaling mode if obj.VectorScaleMode != "Not a vector": obj.VectorScaleMode = ["Not a vector"] - glyph.SetInputArrayToProcess(2,0,0,0,obj.ScaleData) + glyph.SetInputArrayToProcess(2, 0, 0, 0, obj.ScaleData) glyph.SetScaleModeToScaleByScalar() else: glyph.ScalingOff() @@ -172,11 +175,10 @@ class PostGlyphFilter(base_fempythonobject.BaseFemPythonObject): # Orientation if obj.OrientationData != "None": glyph.OrientOn() - glyph.SetInputArrayToProcess(1,0,0,0,obj.OrientationData) + glyph.SetInputArrayToProcess(1, 0, 0, 0, obj.OrientationData) else: glyph.OrientOff() - def __setupFilterPipeline(self, obj): # store of all algorithms for later access @@ -184,8 +186,7 @@ class PostGlyphFilter(base_fempythonobject.BaseFemPythonObject): self._algorithms = {} # create all vtkalgorithm combinations and set them as filter pipeline - sources = {"Arrow": vtkSources.vtkArrowSource, - "Cube": vtkSources.vtkCubeSource} + sources = {"Arrow": vtkSources.vtkArrowSource, "Cube": vtkSources.vtkCubeSource} for source_name in sources: @@ -204,7 +205,6 @@ class PostGlyphFilter(base_fempythonobject.BaseFemPythonObject): obj.setActiveFilterPipeline(obj.Glyph) - def onDocumentRestored(self, obj): # resetup the pipeline self.__setupFilterPipeline(obj) @@ -213,7 +213,7 @@ class PostGlyphFilter(base_fempythonobject.BaseFemPythonObject): # we check what new inputs vector_fields = obj.getInputVectorFields() - all_fields = (vector_fields + obj.getInputScalarFields()) + all_fields = vector_fields + obj.getInputScalarFields() vector_fields.sort() all_fields.sort() @@ -233,7 +233,6 @@ class PostGlyphFilter(base_fempythonobject.BaseFemPythonObject): # make sure parent class execute is called! return False - def onChanged(self, obj, prop): # check if we are setup already @@ -270,4 +269,3 @@ class PostGlyphFilter(base_fempythonobject.BaseFemPythonObject): for filter in self._algorithms: glyph = self._algorithms[filter][2] glyph.SetScaleFactor(obj.ScaleFactor) - diff --git a/src/Mod/Fem/femtaskpanels/task_post_glyphfilter.py b/src/Mod/Fem/femtaskpanels/task_post_glyphfilter.py index 85e050c18e..a0658812e6 100644 --- a/src/Mod/Fem/femtaskpanels/task_post_glyphfilter.py +++ b/src/Mod/Fem/femtaskpanels/task_post_glyphfilter.py @@ -63,7 +63,9 @@ class _TaskPanel(base_femtaskpanel._BaseTaskPanel): # ########################## def getStandardButtons(self): - return QtGui.QDialogButtonBox.Apply | QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel + return ( + QtGui.QDialogButtonBox.Apply | QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel + ) def clicked(self, button): # apply button hit? @@ -71,16 +73,15 @@ class _TaskPanel(base_femtaskpanel._BaseTaskPanel): self.obj.Document.recompute() def accept(self): - #self.obj.CharacteristicLength = self.elelen - #self.obj.References = self.selection_widget.references - #self.selection_widget.finish_selection() + # self.obj.CharacteristicLength = self.elelen + # self.obj.References = self.selection_widget.references + # self.selection_widget.finish_selection() return super().accept() def reject(self): - #self.selection_widget.finish_selection() + # self.selection_widget.finish_selection() return super().reject() - # Helper functions # ################## @@ -99,7 +100,6 @@ class _TaskPanel(base_femtaskpanel._BaseTaskPanel): cbox.setCurrentText(getattr(obj, prop)) cbox.blockSignals(False) - # Setup functions # ############### @@ -113,8 +113,8 @@ class _TaskPanel(base_femtaskpanel._BaseTaskPanel): self._enumPropertyToCombobox(self.obj, "MaskMode", self.widget.MaskModeComboBox) self.widget.ScaleFactorBox.setValue(self.obj.ScaleFactor) - self.__slide_min = self.obj.ScaleFactor*0.5 - self.__slide_max = self.obj.ScaleFactor*1.5 + self.__slide_min = self.obj.ScaleFactor * 0.5 + self.__slide_max = self.obj.ScaleFactor * 1.5 self.widget.ScaleSlider.setValue(50) self.widget.StrideBox.setValue(self.obj.Stride) self.widget.MaxBox.setValue(self.obj.MaxNumber) @@ -132,7 +132,6 @@ class _TaskPanel(base_femtaskpanel._BaseTaskPanel): self.widget.StrideBox.valueChanged.connect(self._stride_changed) self.widget.MaxBox.valueChanged.connect(self._max_number_changed) - def __update_scaling_ui(self): enabled = self.widget.ScaleComboBox.currentIndex() != 0 self.widget.VectorModeComboBox.setEnabled(enabled) @@ -144,7 +143,6 @@ class _TaskPanel(base_femtaskpanel._BaseTaskPanel): self.widget.StrideBox.setEnabled(enabled) self.widget.MaxBox.setEnabled(enabled) - # callbacks and logic # ################### @@ -169,9 +167,9 @@ class _TaskPanel(base_femtaskpanel._BaseTaskPanel): def _scale_factor_changed(self, value): # set slider - self.__slide_min = value*0.5 - self.__slide_max = value*1.5 - slider_value = (value - self.__slide_min) / (self.__slide_max - self.__slide_min) * 100. + self.__slide_min = value * 0.5 + self.__slide_max = value * 1.5 + slider_value = (value - self.__slide_min) / (self.__slide_max - self.__slide_min) * 100.0 self.widget.ScaleSlider.blockSignals(True) self.widget.ScaleSlider.setValue(slider_value) self.widget.ScaleSlider.blockSignals(False) @@ -186,7 +184,7 @@ class _TaskPanel(base_femtaskpanel._BaseTaskPanel): # factor = min + ( slider_value x ------------- ) # 100 # - f = self.__slide_min + (value * (self.__slide_max - self.__slide_min)/100) + f = self.__slide_min + (value * (self.__slide_max - self.__slide_min) / 100) # sync factor spin box self.widget.ScaleFactorBox.blockSignals(True) @@ -197,7 +195,6 @@ class _TaskPanel(base_femtaskpanel._BaseTaskPanel): self.obj.ScaleFactor = f self._recompute() - def _mask_mode_changed(self, value): self.obj.MaskMode = value self.__update_masking_ui() @@ -210,4 +207,3 @@ class _TaskPanel(base_femtaskpanel._BaseTaskPanel): def _max_number_changed(self, value): self.obj.MaxNumber = value self._recompute() - diff --git a/src/Mod/Fem/femviewprovider/view_post_glyphfilter.py b/src/Mod/Fem/femviewprovider/view_post_glyphfilter.py index 4df2a7698b..c35299f42a 100644 --- a/src/Mod/Fem/femviewprovider/view_post_glyphfilter.py +++ b/src/Mod/Fem/femviewprovider/view_post_glyphfilter.py @@ -70,7 +70,7 @@ class VPPostGlyphFilter: # build up the task panel taskd = task_post_glyphfilter._TaskPanel(vobj) - #show it + # show it FreeCADGui.Control.showDialog(taskd) return True