diff --git a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp index dd4e182ce0..7c7e311152 100755 --- a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp @@ -574,6 +574,39 @@ void ViewProviderFemMesh::animateNodes(double factor) DisplacementFactor = factor; } +void ViewProviderFemMesh::setColorByElementId(const std::map &ElementColorMap) +{ + pcShapeMaterial->diffuseColor; + + pcMatBinding->value = SoMaterialBinding::PER_FACE ; + + // resizing and writing the color vector: + pcShapeMaterial->diffuseColor.setNum(vFaceElementIdx.size()); + SbColor* colors = pcShapeMaterial->diffuseColor.startEditing(); + + int i=0; + for(std::vector::const_iterator it=vFaceElementIdx.begin() + ;it!=vFaceElementIdx.end() + ;++it,i++){ + unsigned long ElemIdx = ((*it)>>3); + const std::map::const_iterator pos = ElementColorMap.find(ElemIdx); + if(pos == ElementColorMap.end()) + colors[i] = SbColor(0,1,0); + else + colors[i] = SbColor(pos->second.r,pos->second.g,pos->second.b); + } + + pcShapeMaterial->diffuseColor.finishEditing(); +} + +void ViewProviderFemMesh::resetColorByElementId(void) +{ + pcMatBinding->value = SoMaterialBinding::OVERALL; + pcShapeMaterial->diffuseColor.setNum(0); + const App::Color& c = ShapeColor.getValue(); + pcShapeMaterial->diffuseColor.setValue(c.r,c.g,c.b); + +} // ---------------------------------------------------------------------------- diff --git a/src/Mod/Fem/Gui/ViewProviderFemMesh.h b/src/Mod/Fem/Gui/ViewProviderFemMesh.h index a2d2666edd..e697c5911f 100755 --- a/src/Mod/Fem/Gui/ViewProviderFemMesh.h +++ b/src/Mod/Fem/Gui/ViewProviderFemMesh.h @@ -113,6 +113,11 @@ public: void resetDisplacementByNodeId(void); /// reaply the node displacement with a certain factor and do a redraw void animateNodes(double factor); + /// set the color for each element + void setColorByElementId(const std::map &ElementColorMap); + /// reset the view of the element colors + void resetColorByElementId(void); + //@} const std::vector &getVisibleElementFaces(void)const{return vFaceElementIdx;} diff --git a/src/Mod/Fem/Gui/ViewProviderFemMeshPy.xml b/src/Mod/Fem/Gui/ViewProviderFemMeshPy.xml index 17298fb0a1..ff9104cec8 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMeshPy.xml +++ b/src/Mod/Fem/Gui/ViewProviderFemMeshPy.xml @@ -20,12 +20,18 @@ - - - Postprocessing color of the the nodes. The faces between the nodes gets interpolated. - - - + + + Postprocessing color of the nodes. The faces between the nodes gets interpolated. + + + + + + Postprocessing color of the elements. All faces of the element get the same color. + + + Postprocessing color of the the nodes. The faces between the nodes gets interpolated. diff --git a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp index 8a18f6e06f..5c21472832 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp @@ -57,6 +57,28 @@ void ViewProviderFemMeshPy::setNodeColor(Py::Dict arg) } } +Py::Dict ViewProviderFemMeshPy::getElementColor(void) const +{ + //return Py::List(); + throw Py::AttributeError("Not yet implemented"); +} + +void ViewProviderFemMeshPy::setElementColor(Py::Dict arg) +{ + if(arg.size() == 0) + this->getViewProviderFemMeshPtr()->resetColorByNodeId(); + else { + std::map NodeColorMap; + + for( Py::Dict::iterator it = arg.begin(); it!= arg.end();++it){ + Py::Int id((*it).first); + Py::Tuple color((*it).second); + NodeColorMap[id] = App::Color(Py::Float(color[0]),Py::Float(color[1]),Py::Float(color[2]),0); + } + this->getViewProviderFemMeshPtr()->setColorByElementId(NodeColorMap); + } +} + Py::Dict ViewProviderFemMeshPy::getNodeDisplacement(void) const { //return Py::Dict();