/** * \file * \copyright * Copyright (c) 2012-2021, 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 "ConstructMeshesFromGeometries.h" #include "BaseLib/Logging.h" #include "MeshLib/Elements/Element.h" #include "MeshLib/MeshEditing/DuplicateMeshComponents.h" #include "MeshLib/Node.h" #include "BoundaryElementsSearcher.h" #include "MeshNodeSearcher.h" namespace MeshGeoToolsLib { std::string meshNameFromGeometry(std::string const& geometrical_set_name, std::string const& geometry_name) { return geometrical_set_name + "_" + geometry_name; } template std::vector> constructAdditionalMeshesFromGeometries( std::vector const& geometries, MeshGeoToolsLib::BoundaryElementsSearcher& boundary_element_searcher, bool const multiple_nodes_allowed) { std::vector> additional_meshes; for (GeometryVec* const geometry_vec : geometries) { // Each geometry_vec has a name, this is the first part of the full // name. auto const& vec_name = geometry_vec->getName(); auto const& vec_data = *geometry_vec->getVector(); auto const vec_size = geometry_vec->size(); for (std::size_t i = 0; i < vec_size; ++i) { // Each geometry has a name, this is the second part of the full // name. std::string geometry_name; bool const is_geometry_named = geometry_vec->getNameOfElementByID(i, geometry_name); if (!is_geometry_named) { continue; } auto const& geometry = *vec_data[i]; DBUG("Creating mesh from geometry {:s} {:s}.", vec_name, geometry_name); additional_meshes.emplace_back(createMeshFromElementSelection( meshNameFromGeometry(vec_name, geometry_name), MeshLib::cloneElements( boundary_element_searcher.getBoundaryElements( geometry, multiple_nodes_allowed)))); } } return additional_meshes; } std::vector> constructAdditionalMeshesFromGeoObjects(GeoLib::GEOObjects const& geo_objects, MeshLib::Mesh const& mesh, std::unique_ptr search_length_algorithm, bool const multiple_nodes_allowed) { std::vector> additional_meshes; auto const& mesh_node_searcher = MeshGeoToolsLib::MeshNodeSearcher::getMeshNodeSearcher( mesh, std::move(search_length_algorithm)); MeshGeoToolsLib::BoundaryElementsSearcher boundary_element_searcher( mesh, mesh_node_searcher); // // Points // { auto point_meshes = constructAdditionalMeshesFromGeometries( geo_objects.getPoints(), boundary_element_searcher, multiple_nodes_allowed); std::move(begin(point_meshes), end(point_meshes), std::back_inserter(additional_meshes)); } // // Polylines // { auto polyline_meshes = constructAdditionalMeshesFromGeometries( geo_objects.getPolylines(), boundary_element_searcher, multiple_nodes_allowed); std::move(begin(polyline_meshes), end(polyline_meshes), std::back_inserter(additional_meshes)); } // Surfaces { auto surface_meshes = constructAdditionalMeshesFromGeometries( geo_objects.getSurfaces(), boundary_element_searcher, multiple_nodes_allowed); std::move(begin(surface_meshes), end(surface_meshes), std::back_inserter(additional_meshes)); } // Set axial symmetry for the additional meshes to the same value as the // "bulk" mesh. std::for_each(begin(additional_meshes), end(additional_meshes), [axial_symmetry = mesh.isAxiallySymmetric()](auto& m) { m->setAxiallySymmetric(axial_symmetry); }); return additional_meshes; } } // namespace MeshGeoToolsLib