diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp index f74a2f55ef79bd6c271f2f57db04898330ec85e2..948394586f35e5e9fce5c1f74fc6da73e689bc43 100644 --- a/Geo/GModel.cpp +++ b/Geo/GModel.cpp @@ -815,6 +815,50 @@ MVertex *GModel::getMeshVertexByTag(int n) return _vertexMapCache[n]; } +MVertex* GModel::getMeshVertexByCoordinates(double x, double y, double z, double tol){ + if(_vertexVectorCache.empty() && _vertexMapCache.empty()){ + Msg::Debug("Rebuilding mesh vertex cache"); + _vertexVectorCache.clear(); + _vertexMapCache.clear(); + bool dense = (getNumMeshVertices() == _maxVertexNum); + std::vector<GEntity*> entities; + getEntities(entities); + if(dense){ + Msg::Debug("Good: we have a dense vertex numbering in the cache"); + // numbering starts at 1 + _vertexVectorCache.resize(_maxVertexNum + 1); + for(unsigned int i = 0; i < entities.size(); i++) + for(unsigned int j = 0; j < entities[i]->mesh_vertices.size(); j++) + _vertexVectorCache[entities[i]->mesh_vertices[j]->getNum()] = + entities[i]->mesh_vertices[j]; + } + else{ + for(unsigned int i = 0; i < entities.size(); i++) + for(unsigned int j = 0; j < entities[i]->mesh_vertices.size(); j++) + _vertexMapCache[entities[i]->mesh_vertices[j]->getNum()] = + entities[i]->mesh_vertices[j]; + } + } + + for (int i=1; i< _vertexVectorCache.size(); i++){ + MVertex* v = _vertexVectorCache[i]; + double l = sqrt((v->x() -x)*(v->x()-x)+ (v->y()-y)*(v->y()-y)+ (v->z()-z)*(v->z()-z)); + if (l<tol) return v; + }; + + for (std::map<int,MVertex*>::iterator it = _vertexMapCache.begin(); it!= _vertexMapCache.end(); it++){ + MVertex* v = it->second; + double l = sqrt((v->x() -x)*(v->x()-x)+ (v->y()-y)*(v->y()-y)+ (v->z()-z)*(v->z()-z)); + if (l<tol) return v; + }; + + MVertex* v = new MVertex(x,y,z); + _vertexVectorCache.push_back(v); + _vertexMapCache[v->getNum()] = v; + + return v; +}; + void GModel::getMeshVerticesForPhysicalGroup(int dim, int num, std::vector<MVertex*> &v) { v.clear(); diff --git a/Geo/GModel.h b/Geo/GModel.h index 6bbd50bbeac967d0049d5d977973104af5251f92..6b1f52917fd013bed097d85eadc087e702d84cb3 100644 --- a/Geo/GModel.h +++ b/Geo/GModel.h @@ -371,7 +371,10 @@ class GModel // access a mesh vertex by tag, using the vertex cache MVertex *getMeshVertexByTag(int n); - + + // get a mesh vertex by coordinate, using the vertex cache + MVertex *getMeshVertexByCoordinates(double x, double y, double z, double tol); + // get all the mesh vertices associated with the physical group // of dimension "dim" and id number "num" void getMeshVerticesForPhysicalGroup(int dim, int num, std::vector<MVertex*> &);