Skip to content
Snippets Groups Projects
Commit 7500ab12 authored by Norihiro Watanabe's avatar Norihiro Watanabe
Browse files

move findUnusedMeshNodes in MeshValidation to NodeSearch, replace...

move findUnusedMeshNodes in MeshValidation to NodeSearch, replace removeUnusedMeshNodes() with removeNodes()
parent 50782705
No related branches found
No related tags found
No related merge requests found
......@@ -16,6 +16,7 @@
#include "Mesh.h"
#include "MeshQuality/MeshValidation.h"
#include "MeshEditing/MeshRevision.h"
#include "MeshSearch/NodeSearch.h"
#include "StrictDoubleValidator.h"
......@@ -49,7 +50,9 @@ void MeshAnalysisDialog::on_startButton_pressed()
{
const MeshLib::Mesh* mesh (_mesh_vec[this->meshListBox->currentIndex()]);
const std::vector<std::size_t> unusedNodesIdx (MeshLib::MeshValidation::removeUnusedMeshNodes(*const_cast<MeshLib::Mesh*>(mesh)));
MeshLib::NodeSearch ns(*mesh);
ns.searchUnused();
const std::vector<std::size_t> unusedNodesIdx (ns.getSearchedNodeIDs());
MeshLib::MeshRevision rev(const_cast<MeshLib::Mesh&>(*mesh));
std::vector<std::size_t> const& collapsibleNodeIds (rev.collapseNodeIndices(
this->collapsibleNodesThreshold->text().toDouble() + std::numeric_limits<double>::epsilon()));
......
......@@ -25,6 +25,8 @@
#include "MeshLib/Node.h"
#include "MeshLib/Elements/Element.h"
#include "MeshLib/MeshQuality/MeshValidation.h"
#include "MeshLib/MeshSearch/NodeSearch.h"
#include "MeshLib/MeshEditing/RemoveMeshComponents.h"
LayeredMeshGenerator::LayeredMeshGenerator()
: _elevation_epsilon(0.0001), _minimum_thickness(std::numeric_limits<float>::epsilon())
......@@ -55,7 +57,12 @@ MeshLib::Mesh* LayeredMeshGenerator::getMesh(std::string const& mesh_name) const
return nullptr;
MeshLib::Mesh* result (new MeshLib::Mesh(mesh_name, _nodes, _elements));
MeshLib::MeshValidation::removeUnusedMeshNodes(*result);
MeshLib::NodeSearch ns(*result);
if (ns.searchUnused() > 0) {
auto new_mesh = MeshLib::removeNodes(*result, ns.getSearchedNodeIDs(), mesh_name);
delete result;
return new_mesh;
}
return result;
}
......
......@@ -24,7 +24,7 @@
#include "MeshLib/Node.h"
#include "MeshLib/Elements/Element.h"
#include "MeshLib/MeshEditing/MeshRevision.h"
#include "MeshLib/MeshEditing/RemoveMeshComponents.h"
#include "MeshLib/MeshSearch/NodeSearch.h"
#include "MeshLib/MeshSurfaceExtraction.h"
namespace MeshLib {
......@@ -32,7 +32,12 @@ namespace MeshLib {
MeshValidation::MeshValidation(MeshLib::Mesh &mesh)
{
INFO ("Mesh Quality Control:");
this->removeUnusedMeshNodes(mesh);
INFO ("%Looking for unused nodes...");
NodeSearch ns(mesh);
ns.searchUnused();
if (!ns.getSearchedNodeIDs().empty()) {
INFO ("%d unused mesh nodes found.", ns.getSearchedNodeIDs().size());
}
MeshRevision rev(mesh);
INFO ("Found %d potentially collapsable nodes.", rev.getNCollapsableNodes());
......@@ -42,38 +47,7 @@ MeshValidation::MeshValidation(MeshLib::Mesh &mesh)
INFO (output_str[i].c_str());
}
std::vector<std::size_t> MeshValidation::findUnusedMeshNodes(const MeshLib::Mesh &mesh)
{
INFO ("Looking for unused mesh nodes...");
unsigned count(0);
const size_t nNodes (mesh.getNNodes());
const std::vector<MeshLib::Node*> &nodes (mesh.getNodes());
std::vector<std::size_t> del_node_idx;
for (unsigned i=0; i<nNodes; ++i)
if (nodes[i]->getNElements() == 0)
{
del_node_idx.push_back(i);
++count;
}
std::string nUnusedNodesStr = (count) ? std::to_string(count) : "No";
INFO ("%s unused mesh nodes found.", nUnusedNodesStr.c_str());
return del_node_idx;
}
std::vector<std::size_t> MeshValidation::removeUnusedMeshNodes(MeshLib::Mesh &mesh)
{
std::vector<std::size_t> del_node_idx = MeshValidation::findUnusedMeshNodes(mesh);
MeshLib::removeNodes(mesh, del_node_idx, mesh.getName());
if (!del_node_idx.empty())
INFO("Removed %d unused mesh nodes.", del_node_idx.size());
return del_node_idx;
}
std::vector<ElementErrorCode> MeshValidation::testElementGeometry(const MeshLib::Mesh &mesh, double min_volume)
std::vector<ElementErrorCode> MeshValidation::testElementGeometry(const MeshLib::Mesh &mesh, double min_volume)
{
INFO ("Testing mesh element geometry:");
const std::size_t nErrorCodes (static_cast<std::size_t>(ElementErrorFlag::MaxValue));
......
......@@ -36,19 +36,6 @@ public:
MeshValidation(MeshLib::Mesh &mesh);
~MeshValidation() {}
/**
* Find mesh nodes that are not part of any element
* @return Vector of node indices for unused mesh nodes
*/
static std::vector<std::size_t> findUnusedMeshNodes(const MeshLib::Mesh &mesh);
/**
* Removes nodes from the mesh that are not part of any element.
* Note: This method calls MeshQualityConroller::findUnusedMeshNodes() internally.
* @return Indices of nodes that have been removed
*/
static std::vector<std::size_t> removeUnusedMeshNodes(MeshLib::Mesh &mesh);
/**
* Tests if elements are geometrically correct.
* @param mesh The mesh that is tested
......
......@@ -64,6 +64,20 @@ std::size_t NodeSearch::searchByElementIDs(const std::vector<std::size_t> &eleme
return connected_nodes.size();
}
std::size_t NodeSearch::searchUnused()
{
const size_t nNodes (_mesh.getNNodes());
const std::vector<MeshLib::Node*> &nodes (_mesh.getNodes());
std::vector<std::size_t> del_node_idx;
for (unsigned i=0; i<nNodes; ++i)
if (nodes[i]->getNElements() == 0)
del_node_idx.push_back(i);
this->updateUnion(del_node_idx);
return del_node_idx.size();
}
void NodeSearch::updateUnion(const std::vector<std::size_t> &vec)
{
std::vector<std::size_t> vec_temp(vec.size() + _marked_nodes.size());
......
......@@ -34,6 +34,9 @@ public:
/// Marks all nodes connecting to any of the given elements
std::size_t searchByElementIDs(const std::vector<std::size_t> &element_ids, bool only_match_all_connected_elements = false);
/// Marks all unused nodes
std::size_t searchUnused();
private:
/// Updates the vector of marked items with values from vec.
void updateUnion(const std::vector<std::size_t> &vec);
......
......@@ -26,6 +26,8 @@
#include "MeshLib/Elements/Quad.h"
#include "MeshLib/MeshEditing/DuplicateMeshComponents.h"
#include "MeshLib/MeshQuality/MeshValidation.h"
#include "MeshLib/MeshSearch/NodeSearch.h"
#include "MeshLib/MeshEditing/RemoveMeshComponents.h"
namespace MeshLib {
......@@ -149,8 +151,14 @@ MeshLib::Mesh* MeshSurfaceExtraction::getMeshBoundary(const MeshLib::Mesh &mesh)
}
}
MeshLib::Mesh* result = new MeshLib::Mesh("Boundary Mesh", nodes, boundary_elements);
MeshLib::MeshValidation::removeUnusedMeshNodes(*result);
return result;
MeshLib::NodeSearch ns(*result);
if (ns.searchUnused() == 0) {
return result;
} else {
auto removed = MeshLib::removeNodes(*result, ns.getSearchedNodeIDs(), result->getName());
delete result;
return removed;
}
}
void MeshSurfaceExtraction::get2DSurfaceElements(const std::vector<MeshLib::Element*> &all_elements, std::vector<MeshLib::Element*> &sfc_elements, const MathLib::Vector3 &dir, double angle, unsigned mesh_dimension)
......
......@@ -25,26 +25,6 @@
#include "GeoLib/Raster.h"
TEST(MeshValidation, UnusedNodes)
{
std::array<double, 12> pix = {{0,0.1,0.2,0.1,0,0,0.1,0,0,0,-0.1,0}};
GeoLib::Raster raster(4,3,0,0,1,pix.begin(), pix.end());
MeshLib::ConvertRasterToMesh conv(raster, MeshLib::MeshElemType::TRIANGLE, MeshLib::UseIntensityAs::ELEVATION);
MeshLib::Mesh* mesh = conv.execute();
std::vector<std::size_t> u_nodes = MeshLib::MeshValidation::findUnusedMeshNodes(*mesh);
ASSERT_EQ(0, u_nodes.size());
std::vector<MeshLib::Node*> nodes = MeshLib::copyNodeVector(mesh->getNodes());
nodes.push_back(new MeshLib::Node(-1,-1,-1));
std::vector<MeshLib::Element*> elems = MeshLib::copyElementVector(mesh->getElements(),nodes);
MeshLib::Mesh mesh2("mesh2", nodes, elems);
u_nodes = MeshLib::MeshValidation::findUnusedMeshNodes(mesh2);
ASSERT_EQ(1, u_nodes.size());
ASSERT_EQ(nodes.back()->getID(), u_nodes[0]);
delete mesh;
}
void
detectHoles(MeshLib::Mesh const& mesh,
std::vector<std::size_t> erase_elems,
......
/**
* @copyright
* Copyright (c) 2012-2015, OpenGeoSys Community (http://www.opengeosys.org)
* Distributed under a Modified BSD License.
* See accompanying file LICENSE.txt or
* http://www.opengeosys.org/LICENSE.txt
*/
#include "gtest/gtest.h"
#include <memory>
#include "MeshLib/Mesh.h"
#include "MeshLib/Node.h"
#include "MeshLib/Elements/Element.h"
#include "MeshLib/MeshSearch/NodeSearch.h"
#include "MeshLib/MeshGenerators/ConvertRasterToMesh.h"
#include "MeshLib/MeshEditing/DuplicateMeshComponents.h"
#include "GeoLib/Raster.h"
TEST(NodeSearch, UnusedNodes)
{
std::array<double, 12> pix = {{0,0.1,0.2,0.1,0,0,0.1,0,0,0,-0.1,0}};
GeoLib::Raster raster(4,3,0,0,1,pix.begin(), pix.end());
MeshLib::ConvertRasterToMesh conv(raster, MeshLib::MeshElemType::TRIANGLE, MeshLib::UseIntensityAs::ELEVATION);
MeshLib::Mesh* mesh = conv.execute();
MeshLib::NodeSearch ns(*mesh);
ns.searchUnused();
std::vector<std::size_t> u_nodes = ns.getSearchedNodeIDs();
ASSERT_EQ(0, u_nodes.size());
std::vector<MeshLib::Node*> nodes = MeshLib::copyNodeVector(mesh->getNodes());
nodes.push_back(new MeshLib::Node(-1,-1,-1));
std::vector<MeshLib::Element*> elems = MeshLib::copyElementVector(mesh->getElements(),nodes);
MeshLib::Mesh mesh2("mesh2", nodes, elems);
MeshLib::NodeSearch ns2(mesh2);
ns2.searchUnused();
u_nodes = ns2.getSearchedNodeIDs();
ASSERT_EQ(1, u_nodes.size());
ASSERT_EQ(nodes.back()->getID(), u_nodes[0]);
delete mesh;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment