diff --git a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp index 8a2f3d060e..7c85778d32 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp @@ -424,8 +424,13 @@ std::string ViewProviderFemMesh::getElement(const SoDetail* detail) const else if (detail->getTypeId() == SoPointDetail::getClassTypeId()) { const SoPointDetail* point_detail = static_cast(detail); int idx = point_detail->getCoordinateIndex(); - if (idx < static_cast(vNodeElementIdx.size())) { - int vertex = vNodeElementIdx[point_detail->getCoordinateIndex()]; + // first check if the index is part of the highlighted nodes (#0003618) + if (idx < static_cast(vHighlightedIdx.size())) { + int vertex = vHighlightedIdx[idx]; + str << "Node" << vertex; + } + else if (idx < static_cast(vNodeElementIdx.size())) { + int vertex = vNodeElementIdx[idx]; str << "Node" << vertex; } else { @@ -471,15 +476,22 @@ std::vector ViewProviderFemMesh::getSelectionShape(const char* / return std::vector(); } +std::set ViewProviderFemMesh::getHighlightNodes() const +{ + std::set nodes; + nodes.insert(vHighlightedIdx.begin(), vHighlightedIdx.end()); + return nodes; +} + void ViewProviderFemMesh::setHighlightNodes(const std::set& HighlightedNodes) { - if(!HighlightedNodes.empty()){ + if (!HighlightedNodes.empty()) { SMESHDS_Mesh* data = const_cast((static_cast(this->pcObject)->FemMesh).getValue().getSMesh())->GetMeshDS(); pcAnoCoords->point.setNum(HighlightedNodes.size()); SbVec3f* verts = pcAnoCoords->point.startEditing(); int i=0; - for(std::set::const_iterator it=HighlightedNodes.begin();it!=HighlightedNodes.end();++it,i++){ + for (std::set::const_iterator it=HighlightedNodes.begin();it!=HighlightedNodes.end();++it,i++){ const SMDS_MeshNode *Node = data->FindNode(*it); if (Node) verts[i].setValue((float)Node->X(),(float)Node->Y(),(float)Node->Z()); @@ -487,13 +499,22 @@ void ViewProviderFemMesh::setHighlightNodes(const std::set& HighlightedNod verts[i].setValue(0,0,0); } pcAnoCoords->point.finishEditing(); - }else{ + + // save the node ids + vHighlightedIdx.clear(); + vHighlightedIdx.insert(vHighlightedIdx.end(), + HighlightedNodes.begin(), HighlightedNodes.end()); + } + else { pcAnoCoords->point.setNum(0); + vHighlightedIdx.clear(); } } + void ViewProviderFemMesh::resetHighlightNodes(void) { pcAnoCoords->point.setNum(0); + vHighlightedIdx.clear(); } PyObject * ViewProviderFemMesh::getPyObject() diff --git a/src/Mod/Fem/Gui/ViewProviderFemMesh.h b/src/Mod/Fem/Gui/ViewProviderFemMesh.h index cbd424d368..60d1647f8e 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMesh.h +++ b/src/Mod/Fem/Gui/ViewProviderFemMesh.h @@ -99,6 +99,7 @@ public: // interface methods void setHighlightNodes(const std::set&); + std::set getHighlightNodes() const; void resetHighlightNodes(void); /** @name Postprocessing @@ -145,6 +146,7 @@ protected: /// index of elements to their triangles std::vector vFaceElementIdx; std::vector vNodeElementIdx; + std::vector vHighlightedIdx; std::vector DisplacementVector; double DisplacementFactor; diff --git a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp index 3a976462a0..cad9fac752 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp @@ -219,21 +219,26 @@ void ViewProviderFemMeshPy::setNodeDisplacement(Py::Dict arg) Py::List ViewProviderFemMeshPy::getHighlightedNodes(void) const { - //return Py::List(); - throw Py::AttributeError("Not yet implemented"); + Py::List list; + ViewProviderFemMesh* vp = this->getViewProviderFemMeshPtr(); + std::set nodeIds = vp->getHighlightNodes(); + for (auto it : nodeIds) { + list.append(Py::Long(it)); + } + return list; } -void ViewProviderFemMeshPy::setHighlightedNodes(Py::List arg) +void ViewProviderFemMeshPy::setHighlightedNodes(Py::List arg) { ViewProviderFemMesh* vp = this->getViewProviderFemMeshPtr(); SMESHDS_Mesh* data = const_cast((static_cast (vp->getObject())->FemMesh).getValue().getSMesh())->GetMeshDS(); std::set res; - for(Py::List::iterator it = arg.begin(); it!= arg.end();++it){ + for (Py::List::iterator it = arg.begin(); it!= arg.end();++it) { long id = static_cast(Py::Long(*it)); const SMDS_MeshNode *node = data->FindNode(id); - if(node) + if (node) res.insert(id); }