From 61e289036ea62c72f96625bbc305fd63c2bfa625 Mon Sep 17 00:00:00 2001 From: jriegel Date: Thu, 28 Nov 2013 19:51:34 +0100 Subject: [PATCH] Starting Displacement post-processing to the FemMesh ViewProvider --- src/Mod/Fem/Gui/ViewProviderFemMesh.cpp | 29 ++++++++++++++++++++ src/Mod/Fem/Gui/ViewProviderFemMesh.h | 9 ++++++ src/Mod/Fem/Gui/ViewProviderFemMeshPy.xml | 20 +++++++++----- src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp | 29 ++++++++++++++++++++ 4 files changed, 80 insertions(+), 7 deletions(-) diff --git a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp index c1ddf0a13e15..1335d2b0f3b3 100755 --- a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp @@ -523,6 +523,35 @@ void ViewProviderFemMesh::resetColorByNodeId(void) } +void ViewProviderFemMesh::setDisplacementByNodeId(const std::map &NodeDispMap) +{ + DisplacementVector.resize(vNodeElementIdx.size()); + int i=0; + for(std::vector::const_iterator it=vNodeElementIdx.begin() + ;it!=vNodeElementIdx.end() + ;++it,i++){ + const std::map::const_iterator pos = NodeDispMap.find(*it); + if(pos == NodeDispMap.end()) + DisplacementVector[i] = Base::Vector3d(0.0,0.0,0.0); + else + DisplacementVector[i] = pos->second; + } + animateNodes(1.0); + +} + +void ViewProviderFemMesh::resetDisplacementByNodeId(void) +{ + animateNodes(0.0); + DisplacementVector.clear(); +} +/// reaply the node displacement with a certain factor and do a redraw +void ViewProviderFemMesh::animateNodes(double factor) +{ + + +} + // ---------------------------------------------------------------------------- diff --git a/src/Mod/Fem/Gui/ViewProviderFemMesh.h b/src/Mod/Fem/Gui/ViewProviderFemMesh.h index 223a772e91bd..a2d2666edd2b 100755 --- a/src/Mod/Fem/Gui/ViewProviderFemMesh.h +++ b/src/Mod/Fem/Gui/ViewProviderFemMesh.h @@ -107,6 +107,12 @@ class FemGuiExport ViewProviderFemMesh : public Gui::ViewProviderGeometryObject void setColorByNodeId(const std::map &NodeColorMap); /// reset the view of the node colors void resetColorByNodeId(void); + /// set the displacement for each node + void setDisplacementByNodeId(const std::map &NodeDispMap); + /// reset the view of the node displacement + void resetDisplacementByNodeId(void); + /// reaply the node displacement with a certain factor and do a redraw + void animateNodes(double factor); //@} const std::vector &getVisibleElementFaces(void)const{return vFaceElementIdx;} @@ -126,6 +132,9 @@ class FemGuiExport ViewProviderFemMesh : public Gui::ViewProviderGeometryObject /// index of elements to their triangles std::vector vFaceElementIdx; std::vector vNodeElementIdx; + + std::vector DisplacementVector; + double DisplacementFactor; SoMaterial * pcPointMaterial; SoDrawStyle * pcPointStyle; diff --git a/src/Mod/Fem/Gui/ViewProviderFemMeshPy.xml b/src/Mod/Fem/Gui/ViewProviderFemMeshPy.xml index 37085dbde00d..17298fb0a171 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMeshPy.xml +++ b/src/Mod/Fem/Gui/ViewProviderFemMeshPy.xml @@ -20,13 +20,19 @@ - - - Postprocessing color of the the nodes. The faces between the nodes gets interpolated. - - - - + + + Postprocessing color of the the nodes. The faces between the nodes gets interpolated. + + + + + + Postprocessing color of the the nodes. The faces between the nodes gets interpolated. + + + + List of nodes which gets highlighted diff --git a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp index 5d35195e4afe..75d738713627 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp @@ -1,6 +1,9 @@ #include "PreCompiled.h" +#include +#include + #include "Mod/Fem/Gui/ViewProviderFemMesh.h" // inclusion of the generated files (generated out of ViewProviderFemMeshPy.xml) @@ -49,6 +52,32 @@ void ViewProviderFemMeshPy::setNodeColor(Py::Dict arg) } } +Py::Dict ViewProviderFemMeshPy::getNodeDisplacement(void) const +{ + //return Py::Dict(); + throw Py::AttributeError("Not yet implemented"); +} + +void ViewProviderFemMeshPy::setNodeDisplacement(Py::Dict arg) +{ + if(arg.size() == 0) + this->getViewProviderFemMeshPtr()->resetColorByNodeId(); + else { + std::map NodeDispMap; + union PyType_Object pyType = {&(Base::VectorPy::Type)}; + Py::Type vType(pyType.o); + + for( Py::Dict::iterator it = arg.begin(); it!= arg.end();++it){ + Py::Int id((*it).first); + if ((*it).second.isType(vType)) { + Py::Vector p((*it).second); + NodeDispMap[id] = p.toVector(); + } + } + this->getViewProviderFemMeshPtr()->setDisplacementByNodeId(NodeDispMap); + } +} + Py::List ViewProviderFemMeshPy::getHighlightedNodes(void) const { //return Py::List();