diff --git a/Gui/DataView/MshLayerMapper.cpp b/Gui/DataView/MshLayerMapper.cpp index b5614bc24fd85f585f87e0fe8ae4340d9d382184..f718910e14f8fa37a1cba03e02adbb7f84dff200 100644 --- a/Gui/DataView/MshLayerMapper.cpp +++ b/Gui/DataView/MshLayerMapper.cpp @@ -29,7 +29,6 @@ #include "Elements/Hex.h" #include "Elements/Pyramid.h" #include "Elements/Prism.h" -#include "MeshEditing/removeMeshNodes.h" #include "MeshSurfaceExtraction.h" #include "MathTools.h" diff --git a/Gui/mainwindow.cpp b/Gui/mainwindow.cpp index 57c1a2502e57358ac22eac44096941da1bf93876..26e223cf2f45f561224ed1de80a05d7d9d5f2a94 100644 --- a/Gui/mainwindow.cpp +++ b/Gui/mainwindow.cpp @@ -11,6 +11,7 @@ * http://www.opengeosys.org/project/license * */ + #include "Configure.h" #include "mainwindow.h" @@ -88,6 +89,7 @@ #include "MeshSurfaceExtraction.h" #include "readMeshFromFile.h" #include "convertMeshToGeo.h" +#include "MeshQuality/MeshQualityController.h" // Qt includes #include <QDesktopWidget> @@ -1276,6 +1278,9 @@ void MainWindow::showDataExplorerSettingsDialog() void MainWindow::FEMTestStart() { + + MeshLib::MeshQualityController mqc(*(const_cast<MeshLib::Mesh*>(this->_meshModels->getMesh("mshtest")))); + } diff --git a/MeshLib/Mesh.cpp b/MeshLib/Mesh.cpp index 62dca49178dc1fe825d857857c76e196747e29c4..ee6f0f9bad967d56f7e05355557ae7962f7a16ae 100644 --- a/MeshLib/Mesh.cpp +++ b/MeshLib/Mesh.cpp @@ -41,7 +41,6 @@ Mesh::Mesh(const std::string &name, //this->setNodesConnectedByEdges(); //this->setNodesConnectedByElements(); this->setElementsConnectedToElements(); - this->removeUnusedMeshNodes(); _edge_length[0] = std::numeric_limits<double>::max(); _edge_length[1] = -std::numeric_limits<double>::max(); @@ -245,29 +244,5 @@ void Mesh::setNodesConnectedByElements() } } -void Mesh::removeUnusedMeshNodes() -{ - unsigned count(0); - std::vector<MeshLib::Node*>::iterator it (this->_nodes.begin()); - while(it != this->_nodes.end()) - { - if ((*it)->getNElements() == 0) - { - delete *it; - *it = nullptr; - ++it; - ++count; - } - else ++it; - } - auto node_vec_end = std::remove(_nodes.begin(), _nodes.end(), nullptr); - _nodes.erase(node_vec_end, _nodes.end()); - - if (count) - { - INFO("Removed %d unused mesh nodes.", count ); - this->resetNodeIDs(); - } -} } diff --git a/MeshLib/Mesh.h b/MeshLib/Mesh.h index 5f3626c3596f5515004cf72b466d64da4e4fad1b..ecb597dbd11889bebee9c2f9f79dcb1b362a146e 100644 --- a/MeshLib/Mesh.h +++ b/MeshLib/Mesh.h @@ -20,6 +20,7 @@ #include <vector> #include "MeshEnums.h" +#include "MeshQuality/MeshQualityController.h" #include "BaseLib/Counter.h" @@ -33,6 +34,9 @@ namespace MeshLib */ class Mesh : BaseLib::Counter<Mesh> { + /* friend functions: */ + friend void removeMeshNodes(MeshLib::Mesh &mesh, const std::vector<std::size_t> &nodes); + public: /// Constructor using a mesh name and an array of nodes and elements Mesh(const std::string &name, @@ -91,11 +95,11 @@ public: std::size_t getID() const {return _id; } protected: - // Set the minimum and maximum length over the edges of the mesh. + /// Set the minimum and maximum length over the edges of the mesh. void calcEdgeLengthRange(); - /// Removes nodes that are not part of any element. - void removeUnusedMeshNodes(); + /// Returns an editable reference of the node vector + std::vector<Node*>& getNodesVector() { return _nodes; } /// Sets the dimension of the mesh. void setDimension(); diff --git a/MeshLib/MeshEditing/removeMeshNodes.cpp b/MeshLib/MeshEditing/removeMeshNodes.cpp index 98b494015fd1d6190b789ed79725f6886d1e8714..9ed1460b4c613ebb8b0de864893ed60f3d48be5a 100644 --- a/MeshLib/MeshEditing/removeMeshNodes.cpp +++ b/MeshLib/MeshEditing/removeMeshNodes.cpp @@ -19,16 +19,14 @@ namespace MeshLib { -MeshLib::Mesh* removeMeshNodes(const MeshLib::Mesh &mesh, const std::vector<size_t> &nodes) +void removeMeshNodes(MeshLib::Mesh &mesh, const std::vector<std::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(); + std::vector<MeshLib::Node*>& mesh_nodes = mesh.getNodesVector(); for (size_t i = 0; i < delNodes; ++i) { - const MeshLib::Node* node = new_mesh->getNode(i); + const MeshLib::Node* node = mesh.getNode(nodes[i]); std::vector<MeshLib::Element*> conn_elems = node->getElements(); for (size_t j = 0; j < conn_elems.size(); ++j) @@ -41,16 +39,14 @@ MeshLib::Mesh* removeMeshNodes(const MeshLib::Mesh &mesh, const std::vector<size } // erase null pointers from node- and element vectors - std::vector<MeshLib::Element*> elements = new_mesh->getElements(); + std::vector<MeshLib::Element*> elements = 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; + mesh.resetNodeIDs(); // after removing nodes set new node-IDs } diff --git a/MeshLib/MeshEditing/removeMeshNodes.h b/MeshLib/MeshEditing/removeMeshNodes.h index d1ecde3c98631abc83f3b0804ab7a72bc1245785..b1769121699b6e3e702342a79978eb626de151c2 100644 --- a/MeshLib/MeshEditing/removeMeshNodes.h +++ b/MeshLib/MeshEditing/removeMeshNodes.h @@ -23,7 +23,8 @@ namespace MeshLib { 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); + /// Warning: this function actually modifies the mesh, it might make sense to copy the mesh before using this function. + void removeMeshNodes(MeshLib::Mesh &mesh, const std::vector<std::size_t> &nodes); } // end namespace MeshLib diff --git a/MeshLib/MeshQuality/MeshQualityController.cpp b/MeshLib/MeshQuality/MeshQualityController.cpp new file mode 100644 index 0000000000000000000000000000000000000000..77ec47128a83f0763b66223e126ddd635e218459 --- /dev/null +++ b/MeshLib/MeshQuality/MeshQualityController.cpp @@ -0,0 +1,57 @@ +/** + * \file MeshQualityController.cpp + * \author Karsten Rink + * \date 2013-04-04 + * \brief Implementation of the MeshQualityController class. + * + * \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 "MeshQualityController.h" +#include "Mesh.h" +#include "Node.h" +#include "MeshEditing/removeMeshNodes.h" + + +#include "logog/include/logog.hpp" + +namespace MeshLib { + +MeshQualityController::MeshQualityController(MeshLib::Mesh &mesh) +{ + this->removeUnusedMeshNodes(mesh); +} + +void MeshQualityController::removeUnusedMeshNodes(MeshLib::Mesh &mesh) +{ + std::vector<MeshLib::Node*> nodes (mesh.getNodes()); + std::vector<std::size_t> del_node_idx; + std::size_t nNodes (mesh.getNNodes()); + for (std::size_t i=0; i<nNodes; ++i) + { + if (nodes[i]->getNElements() == 0) + del_node_idx.push_back(i); + } + MeshLib::removeMeshNodes(mesh, del_node_idx); + + if (!del_node_idx.empty()) + INFO("Removed %d unused mesh nodes.", del_node_idx.size()); +} + +void MeshQualityController::testElementGeometry(MeshLib::Mesh &mesh) +{ + unsigned count(0); + const std::size_t nElements (mesh.getNElements()); + for (std::size_t i=0; i<nElements; ++i) + { + + } +} + +} // end namespace MeshLib diff --git a/MeshLib/MeshQuality/MeshQualityController.h b/MeshLib/MeshQuality/MeshQualityController.h new file mode 100644 index 0000000000000000000000000000000000000000..2a3d486e6bd18e211873292b17e18878360639a8 --- /dev/null +++ b/MeshLib/MeshQuality/MeshQualityController.h @@ -0,0 +1,44 @@ +/** + * \file MeshQualityController.h + * \author Karsten Rink + * \date 2013-04-04 + * \brief Definition of the MeshQualityController class + * + * \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 MESHQUALITYCONTROLLER_H +#define MESHQUALITYCONTROLLER_H + +#include <vector> + +namespace MeshLib { + class Mesh; + +/** + * \brief A set of methods for manipulating mesh element values + */ +class MeshQualityController +{ +public: + MeshQualityController(MeshLib::Mesh &mesh); + ~MeshQualityController() {} + + /// Removes nodes from the mesh that are not part of any element. + static void removeUnusedMeshNodes(MeshLib::Mesh &mesh); + + /// Tests if elements are geometrically correct + static void testElementGeometry(MeshLib::Mesh &mesh); + +private: + +}; + +} // end namespace MeshLib + +#endif //MESHQUALITYCONTROLLER_H diff --git a/MeshLib/Node.h b/MeshLib/Node.h index 0ac6e2d93dd2c9b60952b45000cc1f40d04a781a..d91a14c194f924f076cc3ef26ac0cb53d9a471ec 100644 --- a/MeshLib/Node.h +++ b/MeshLib/Node.h @@ -38,7 +38,6 @@ class Element; class Node : public GeoLib::PointWithID { /* friend functions: */ - friend MeshLib::Mesh* removeMeshNodes(MeshLib::Mesh const*const mesh, const std::vector<std::size_t> &nodes); #ifdef OGS_BUILD_GUI friend int MshLayerMapper::LayerMapping(MeshLib::Mesh* msh, const std::string &rasterfile, const unsigned nLayers, const unsigned layer_id, double noDataReplacementValue); diff --git a/Utils/MeshEdit/moveMeshNodes.cpp b/Utils/MeshEdit/moveMeshNodes.cpp index e8dede492e3bbf499e7300518d4292cb2430a46e..d45ef8e066319bcb91309fa7d00fb439b4a425fa 100644 --- a/Utils/MeshEdit/moveMeshNodes.cpp +++ b/Utils/MeshEdit/moveMeshNodes.cpp @@ -1,5 +1,5 @@ /** - * \file removeMeshNodes.cpp + * \file moveMeshNodes.cpp * 2012/03/07 KR Initial implementation */ @@ -11,7 +11,6 @@ #include "AABB.h" #include "Mesh.h" #include "Node.h" -#include "MeshEditing/removeMeshNodes.h" #include "MathTools.h" int find_closest_point(MeshLib::Node const*const point, std::vector<MeshLib::Node*> const& nodes, double const& max_dist) diff --git a/Utils/MeshEdit/removeMeshNodes.cpp b/Utils/MeshEdit/removeMeshNodes.cpp index 54d2b680d24d63a59581cc76df8daef99b710710..a1043678bc81dfa359058def33a1630de34b52f7 100644 --- a/Utils/MeshEdit/removeMeshNodes.cpp +++ b/Utils/MeshEdit/removeMeshNodes.cpp @@ -82,16 +82,14 @@ int main (int argc, char* argv[]) /**** add other keywords here ****/ // remove nodes and write new file - MeshLib::Mesh* new_mesh = MeshLib::removeMeshNodes(*mesh, del_nodes); + MeshLib::removeMeshNodes(*mesh, del_nodes); FileIO::Legacy::MeshIO meshIO; meshIO.setMesh(mesh); meshIO.setPrecision(9); meshIO.writeToFile(msh_name.substr(0, msh_name.length()-4) + "_new.msh"); delete mesh; - delete new_mesh; return 1; - }