diff --git a/Gui/DataView/MeshLayerEditDialog.cpp b/Gui/DataView/MeshLayerEditDialog.cpp index 88a92f4f681dfc6f274e643d1f5046c9192ee81e..c6d79d92f6115fc290f369586e3c8b1e7c3ed4cf 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 038535da871cb0bcaf576cb7d143ae0ca0a3038a..51ee03ba327071a61476a70fe0706db83312dd6b 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 31f978ebcd6c0129a3343522b7864fb265c489c4..543896d0650edcc192407493acb25b5adcd93c72 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.