Skip to content

Commit

Permalink
fixes 0003618: FEM, GUI, mesh view provider, highlighted node show wr…
Browse files Browse the repository at this point in the history
…ong node number on selection
  • Loading branch information
wwmayer committed Sep 26, 2018
1 parent 0c744f2 commit 00bf21d
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 10 deletions.
31 changes: 26 additions & 5 deletions src/Mod/Fem/Gui/ViewProviderFemMesh.cpp
Expand Up @@ -424,8 +424,13 @@ std::string ViewProviderFemMesh::getElement(const SoDetail* detail) const
else if (detail->getTypeId() == SoPointDetail::getClassTypeId()) {
const SoPointDetail* point_detail = static_cast<const SoPointDetail*>(detail);
int idx = point_detail->getCoordinateIndex();
if (idx < static_cast<int>(vNodeElementIdx.size())) {
int vertex = vNodeElementIdx[point_detail->getCoordinateIndex()];
// first check if the index is part of the highlighted nodes (#0003618)
if (idx < static_cast<int>(vHighlightedIdx.size())) {
int vertex = vHighlightedIdx[idx];
str << "Node" << vertex;
}
else if (idx < static_cast<int>(vNodeElementIdx.size())) {
int vertex = vNodeElementIdx[idx];
str << "Node" << vertex;
}
else {
Expand Down Expand Up @@ -471,29 +476,45 @@ std::vector<Base::Vector3d> ViewProviderFemMesh::getSelectionShape(const char* /
return std::vector<Base::Vector3d>();
}

std::set<long> ViewProviderFemMesh::getHighlightNodes() const
{
std::set<long> nodes;
nodes.insert(vHighlightedIdx.begin(), vHighlightedIdx.end());
return nodes;
}

void ViewProviderFemMesh::setHighlightNodes(const std::set<long>& HighlightedNodes)
{
if(!HighlightedNodes.empty()){
if (!HighlightedNodes.empty()) {
SMESHDS_Mesh* data = const_cast<SMESH_Mesh*>((static_cast<Fem::FemMeshObject*>(this->pcObject)->FemMesh).getValue().getSMesh())->GetMeshDS();

pcAnoCoords->point.setNum(HighlightedNodes.size());
SbVec3f* verts = pcAnoCoords->point.startEditing();
int i=0;
for(std::set<long>::const_iterator it=HighlightedNodes.begin();it!=HighlightedNodes.end();++it,i++){
for (std::set<long>::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());
else
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()
Expand Down
2 changes: 2 additions & 0 deletions src/Mod/Fem/Gui/ViewProviderFemMesh.h
Expand Up @@ -99,6 +99,7 @@ class FemGuiExport ViewProviderFemMesh : public Gui::ViewProviderGeometryObject

// interface methods
void setHighlightNodes(const std::set<long>&);
std::set<long> getHighlightNodes() const;
void resetHighlightNodes(void);

/** @name Postprocessing
Expand Down Expand Up @@ -145,6 +146,7 @@ class FemGuiExport ViewProviderFemMesh : public Gui::ViewProviderGeometryObject
/// index of elements to their triangles
std::vector<unsigned long> vFaceElementIdx;
std::vector<unsigned long> vNodeElementIdx;
std::vector<unsigned long> vHighlightedIdx;

std::vector<Base::Vector3d> DisplacementVector;
double DisplacementFactor;
Expand Down
15 changes: 10 additions & 5 deletions src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp
Expand Up @@ -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<long> 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<SMESH_Mesh*>((static_cast<Fem::FemMeshObject*>
(vp->getObject())->FemMesh).getValue().getSMesh())->GetMeshDS();

std::set<long> 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<long>(Py::Long(*it));
const SMDS_MeshNode *node = data->FindNode(id);
if(node)
if (node)
res.insert(id);
}

Expand Down

0 comments on commit 00bf21d

Please sign in to comment.