From f1ed030b6da6ff03e35452f968f10e67618bf326 Mon Sep 17 00:00:00 2001 From: Karsten Rink <karsten.rink@ufz.de> Date: Wed, 10 Sep 2014 17:00:48 +0200 Subject: [PATCH] slightly changed creation of static subsurface layers --- Gui/DataView/MeshLayerEditDialog.cpp | 4 ++-- MeshLib/MeshGenerators/MeshLayerMapper.cpp | 23 ++++++++-------------- MeshLib/MeshGenerators/MeshLayerMapper.h | 3 ++- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/Gui/DataView/MeshLayerEditDialog.cpp b/Gui/DataView/MeshLayerEditDialog.cpp index 88a92f4f681..c6d79d92f61 100644 --- a/Gui/DataView/MeshLayerEditDialog.cpp +++ b/Gui/DataView/MeshLayerEditDialog.cpp @@ -189,7 +189,7 @@ MeshLib::Mesh* MeshLayerEditDialog::createPrismMesh() } MeshLayerMapper const mapper; - MeshLib::Mesh* new_mesh = mapper.createLayers(*_msh, layer_thickness); + MeshLib::Mesh* new_mesh = mapper.createStaticLayers(*_msh, layer_thickness); if (_use_rasters) { @@ -248,7 +248,7 @@ MeshLib::Mesh* MeshLayerEditDialog::createTetMesh() for (unsigned i=0; i<nLayers; ++i) layer_thickness.push_back(this->_edits[i]->text().toFloat()); MeshLayerMapper const mapper; - tg_mesh = mapper.createLayers(*_msh, layer_thickness); + tg_mesh = mapper.createStaticLayers(*_msh, layer_thickness); std::vector<MeshLib::Node> tg_attr; FileIO::TetGenInterface tetgen_interface; tetgen_interface.writeTetGenSmesh(filename.toStdString(), *tg_mesh, tg_attr); diff --git a/MeshLib/MeshGenerators/MeshLayerMapper.cpp b/MeshLib/MeshGenerators/MeshLayerMapper.cpp index 038535da871..51ee03ba327 100644 --- a/MeshLib/MeshGenerators/MeshLayerMapper.cpp +++ b/MeshLib/MeshGenerators/MeshLayerMapper.cpp @@ -32,7 +32,7 @@ #include "MeshSurfaceExtraction.h" #include "MathTools.h" -MeshLib::Mesh* MeshLayerMapper::createLayers(MeshLib::Mesh const& mesh, std::vector<float> const& layer_thickness_vector) const +MeshLib::Mesh* MeshLayerMapper::createStaticLayers(MeshLib::Mesh const& mesh, std::vector<float> const& layer_thickness_vector, std::string const& mesh_name) const { std::vector<float> thickness; for (std::size_t i=0; i<layer_thickness_vector.size(); ++i) @@ -44,7 +44,7 @@ MeshLib::Mesh* MeshLayerMapper::createLayers(MeshLib::Mesh const& mesh, std::vec const std::size_t nLayers(thickness.size()); if (nLayers < 1 || mesh.getDimension() != 2) { - ERR("MshLayerMapper::CreateLayers(): A 2D mesh with nLayers > 0 is required as input."); + ERR("MeshLayerMapper::createStaticLayers(): A 2D mesh with nLayers > 0 is required as input."); return nullptr; } @@ -56,8 +56,7 @@ MeshLib::Mesh* MeshLayerMapper::createLayers(MeshLib::Mesh const& mesh, std::vec const std::size_t nOrgElems (mesh.getNElements()); const std::vector<MeshLib::Node*> &nodes = mesh.getNodes(); const std::vector<MeshLib::Element*> &elems = mesh.getElements(); - std::vector<MeshLib::Node*> new_nodes; - new_nodes.reserve(nNodes + (nLayers * nNodes)); + std::vector<MeshLib::Node*> new_nodes(nNodes + (nLayers * nNodes)); std::vector<MeshLib::Element*> new_elems; new_elems.reserve(nElems * nLayers); double z_offset (0.0); @@ -67,11 +66,9 @@ MeshLib::Mesh* MeshLayerMapper::createLayers(MeshLib::Mesh const& mesh, std::vec // add nodes for new layer unsigned node_offset (nNodes * layer_id); if (layer_id > 0) z_offset += thickness[layer_id-1]; - for (unsigned i = 0; i < nNodes; ++i) - { - const double* coords = nodes[i]->getCoords(); - new_nodes.push_back (new MeshLib::Node(coords[0], coords[1], coords[2]-z_offset, node_offset+i)); - } + + std::transform(nodes.cbegin(), nodes.cend(), new_nodes.begin() + node_offset, + [&z_offset](MeshLib::Node* node){ return new MeshLib::Node((*node)[0], (*node)[1], (*node)[2]-z_offset); }); // starting with 2nd layer create prism or hex elements connecting the last layer with the current one if (layer_id > 0) @@ -82,12 +79,8 @@ MeshLib::Mesh* MeshLayerMapper::createLayers(MeshLib::Mesh const& mesh, std::vec for (unsigned i = 0; i < nOrgElems; ++i) { const MeshLib::Element* sfc_elem( elems[i] ); - if (sfc_elem->getDimension() != 2) - { - WARN("MshLayerMapper::CreateLayers() - Method can only handle 2D mesh elements."); - WARN("Skipping Element %d of type \"%s\".", i, MeshElemType2String(sfc_elem->getGeomType()).c_str()); + if (sfc_elem->getDimension() < 2) // ignore line-elements continue; - } const unsigned nElemNodes(sfc_elem->getNNodes()); MeshLib::Node** e_nodes = new MeshLib::Node*[2*nElemNodes]; @@ -105,7 +98,7 @@ MeshLib::Mesh* MeshLayerMapper::createLayers(MeshLib::Mesh const& mesh, std::vec } } } - return new MeshLib::Mesh("SubsurfaceMesh", new_nodes, new_elems); + return new MeshLib::Mesh(mesh_name, new_nodes, new_elems); } bool MeshLayerMapper::layerMapping(MeshLib::Mesh &new_mesh, const std::string &rasterfile, diff --git a/MeshLib/MeshGenerators/MeshLayerMapper.h b/MeshLib/MeshGenerators/MeshLayerMapper.h index 31f978ebcd6..543896d0650 100644 --- a/MeshLib/MeshGenerators/MeshLayerMapper.h +++ b/MeshLib/MeshGenerators/MeshLayerMapper.h @@ -39,9 +39,10 @@ public: * \param mesh The triangle/quad mesh that is the basis for the new prism/hex mesh * \param nLayers The number of layers of prism/hex elements that will be extruded from the triangle/quad elements of the original mesh * \param thickness The thickness of each of these newly added layers + * \param mesh_name The name of the newly created mesh * \return A mesh with the requested number of layers of prism/hex elements */ - MeshLib::Mesh* createLayers(MeshLib::Mesh const& mesh, std::vector<float> const& layer_thickness_vector) const; + MeshLib::Mesh* createStaticLayers(MeshLib::Mesh const& mesh, std::vector<float> const& layer_thickness_vector, std::string const& mesh_name = "SubsurfaceMesh") const; /** * Maps the z-values of nodes in the designated layer of the given mesh according to the given raster. -- GitLab