From a8ad8918c26a882db655c5ad44d3cc5bfe20e851 Mon Sep 17 00:00:00 2001 From: Karsten Rink <karsten.rink@ufz.de> Date: Tue, 15 Oct 2013 18:26:25 +0200 Subject: [PATCH] placed removeMeshNodes() outside of new class again, does not fit anymore --- Gui/DataView/MshLayerMapper.cpp | 2 +- MeshLib/MeshEditing/removeMeshEntities.cpp | 33 ------------- MeshLib/MeshEditing/removeMeshEntities.h | 3 -- MeshLib/MeshEditing/removeMeshNodes.cpp | 57 ++++++++++++++++++++++ MeshLib/MeshEditing/removeMeshNodes.h | 30 ++++++++++++ Utils/MeshEdit/removeMeshNodes.cpp | 2 +- 6 files changed, 89 insertions(+), 38 deletions(-) create mode 100644 MeshLib/MeshEditing/removeMeshNodes.cpp create mode 100644 MeshLib/MeshEditing/removeMeshNodes.h diff --git a/Gui/DataView/MshLayerMapper.cpp b/Gui/DataView/MshLayerMapper.cpp index e699dc1fd7a..7a1bd056bb3 100644 --- a/Gui/DataView/MshLayerMapper.cpp +++ b/Gui/DataView/MshLayerMapper.cpp @@ -219,7 +219,7 @@ int MshLayerMapper::LayerMapping(MeshLib::Mesh* new_mesh, const std::string &ras if (noData_nodes.size() < (nNodes - 2)) { WARN("MshLayerMapper::LayerMapping(): Removing %d mesh nodes at NoData values.", noData_nodes.size()); - MeshLib::Mesh* red_mesh = MeshLib::removeMeshNodes(*new_mesh, noData_nodes); + MeshLib::Mesh* red_mesh = MeshLib::removeMeshNodes(new_mesh, noData_nodes); if (new_mesh->getNElements() == 0) { delete new_mesh; diff --git a/MeshLib/MeshEditing/removeMeshEntities.cpp b/MeshLib/MeshEditing/removeMeshEntities.cpp index c7e56397230..86c5dfcf16a 100644 --- a/MeshLib/MeshEditing/removeMeshEntities.cpp +++ b/MeshLib/MeshEditing/removeMeshEntities.cpp @@ -144,39 +144,6 @@ void MeshElementRemoval::copyNodesElements( const std::vector<MeshLib::Node*> &s } -MeshLib::Mesh* removeMeshNodes(const MeshLib::Mesh &mesh, const std::vector<size_t> &nodes) -{ - MeshLib::Mesh* new_mesh (new MeshLib::Mesh(mesh)); - - // delete nodes and their connected elements and replace them with null pointers - const size_t delNodes = nodes.size(); - std::vector<MeshLib::Node*> mesh_nodes = new_mesh->getNodes(); - for (size_t i = 0; i < delNodes; ++i) - { - const MeshLib::Node* node = new_mesh->getNode(i); - std::vector<MeshLib::Element*> conn_elems = node->getElements(); - - for (size_t j = 0; j < conn_elems.size(); ++j) - { - delete conn_elems[j]; - conn_elems[j] = nullptr; - } - delete mesh_nodes[i]; - mesh_nodes[i] = nullptr; - } - - // erase null pointers from node- and element vectors - std::vector<MeshLib::Element*> elements = new_mesh->getElements(); - auto elem_vec_end = std::remove(elements.begin(), elements.end(), nullptr); - elements.erase(elem_vec_end, elements.end()); - - auto node_vec_end = std::remove(mesh_nodes.begin(), mesh_nodes.end(), nullptr); - mesh_nodes.erase(node_vec_end, mesh_nodes.end()); - - new_mesh->resetNodeIDs(); // after removing nodes set new node-IDs - - return new_mesh; -} diff --git a/MeshLib/MeshEditing/removeMeshEntities.h b/MeshLib/MeshEditing/removeMeshEntities.h index b82cd103e18..29819fc5e7b 100644 --- a/MeshLib/MeshEditing/removeMeshEntities.h +++ b/MeshLib/MeshEditing/removeMeshEntities.h @@ -32,9 +32,6 @@ public: MeshElementRemoval::~MeshElementRemoval(); - /// Removes the mesh nodes (and connected elements) given in the nodes-list from the mesh. - MeshLib::Mesh* removeMeshNodes(const std::vector<std::size_t> &nodes) const; - /// Removes all mesh elements marked by search-methods. MeshLib::Mesh* removeMeshElements() const; diff --git a/MeshLib/MeshEditing/removeMeshNodes.cpp b/MeshLib/MeshEditing/removeMeshNodes.cpp new file mode 100644 index 00000000000..98b494015fd --- /dev/null +++ b/MeshLib/MeshEditing/removeMeshNodes.cpp @@ -0,0 +1,57 @@ +/** + * \file + * \author Karsten Rink + * \date 2013-04-04 + * \brief Implementation of removeMeshNodes. + * + * \copyright + * Copyright (c) 2013, OpenGeoSys Community (http://www.opengeosys.org) + * Distributed under a Modified BSD License. + * See accompanying file LICENSE.txt or + * http://www.opengeosys.org/project/license + * + */ + +#include "removeMeshNodes.h" +#include "Mesh.h" +#include "Node.h" +#include "Elements/Element.h" + +namespace MeshLib { + +MeshLib::Mesh* removeMeshNodes(const MeshLib::Mesh &mesh, const std::vector<size_t> &nodes) +{ + MeshLib::Mesh* new_mesh (new MeshLib::Mesh(mesh)); + + // delete nodes and their connected elements and replace them with null pointers + const size_t delNodes = nodes.size(); + std::vector<MeshLib::Node*> mesh_nodes = new_mesh->getNodes(); + for (size_t i = 0; i < delNodes; ++i) + { + const MeshLib::Node* node = new_mesh->getNode(i); + std::vector<MeshLib::Element*> conn_elems = node->getElements(); + + for (size_t j = 0; j < conn_elems.size(); ++j) + { + delete conn_elems[j]; + conn_elems[j] = nullptr; + } + delete mesh_nodes[i]; + mesh_nodes[i] = nullptr; + } + + // erase null pointers from node- and element vectors + std::vector<MeshLib::Element*> elements = new_mesh->getElements(); + auto elem_vec_end = std::remove(elements.begin(), elements.end(), nullptr); + elements.erase(elem_vec_end, elements.end()); + + auto node_vec_end = std::remove(mesh_nodes.begin(), mesh_nodes.end(), nullptr); + mesh_nodes.erase(node_vec_end, mesh_nodes.end()); + + new_mesh->resetNodeIDs(); // after removing nodes set new node-IDs + + return new_mesh; +} + + +} // end namespace MeshLib diff --git a/MeshLib/MeshEditing/removeMeshNodes.h b/MeshLib/MeshEditing/removeMeshNodes.h new file mode 100644 index 00000000000..d1ecde3c986 --- /dev/null +++ b/MeshLib/MeshEditing/removeMeshNodes.h @@ -0,0 +1,30 @@ +/** + * \file + * \author Karsten Rink + * \date 2013-04-04 + * \brief Definition of the removeMeshNodes + * + * \copyright + * Copyright (c) 2013, OpenGeoSys Community (http://www.opengeosys.org) + * Distributed under a Modified BSD License. + * See accompanying file LICENSE.txt or + * http://www.opengeosys.org/project/license + * + */ + +#ifndef REMOVEMESHNODES_H +#define REMOVEMESHNODES_H + +#include <vector> + +namespace MeshLib { + +// forward declarations +class Mesh; + + /// Removes the mesh nodes (and connected elements) given in the nodes-list from the mesh. + MeshLib::Mesh* removeMeshNodes(const MeshLib::Mesh &mesh, const std::vector<std::size_t> &nodes); + +} // end namespace MeshLib + +#endif //REMOVEMESHNODES_H diff --git a/Utils/MeshEdit/removeMeshNodes.cpp b/Utils/MeshEdit/removeMeshNodes.cpp index 06f6b10267c..d4b46edd386 100644 --- a/Utils/MeshEdit/removeMeshNodes.cpp +++ b/Utils/MeshEdit/removeMeshNodes.cpp @@ -8,7 +8,7 @@ #include "Legacy/MeshIO.h" #include "Mesh.h" #include "Node.h" -#include "MeshEditing/removeMeshEntities.h" +#include "MeshEditing/removeMeshNodes.h" int main (int argc, char* argv[]) { -- GitLab