diff --git a/Gui/DataView/MshLayerMapper.cpp b/Gui/DataView/MshLayerMapper.cpp index 5c9d5f475e683deb8cf33646e0313eff1ee74bd8..547a7a16a5a37fb53fc5f259955b678f9092315c 100644 --- a/Gui/DataView/MshLayerMapper.cpp +++ b/Gui/DataView/MshLayerMapper.cpp @@ -40,8 +40,8 @@ MeshLib::Mesh* MshLayerMapper::CreateLayers(const MeshLib::Mesh &mesh, const std if (layer_thickness_vector[i] > std::numeric_limits<float>::epsilon()) thickness.push_back(layer_thickness_vector[i]); else - WARN ("Ignoring layer %d with thickness %f. (Layer thickness needs to be > 0)", i, layer_thickness_vector[i]); - + WARN ("Ignoring layer %d with thickness %f.", i, layer_thickness_vector[i]); + const std::size_t nLayers(thickness.size()); if (nLayers < 1 || mesh.getDimension() != 2) { @@ -54,66 +54,57 @@ MeshLib::Mesh* MshLayerMapper::CreateLayers(const MeshLib::Mesh &mesh, const std const std::size_t nElems (std::count_if(mesh.getElements().begin(), mesh.getElements().end(), [](MeshLib::Element const* elem) { return (elem->getDimension() == 2);})); - const std::vector<MeshLib::Node*> nodes = mesh.getNodes(); - const std::vector<MeshLib::Element*> elems = mesh.getElements(); - std::vector<MeshLib::Node*> new_nodes(nNodes + (nLayers * nNodes)); - std::vector<MeshLib::Element*> new_elems(nElems * nLayers); - double z_offset(0.0); + 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::Element*> new_elems; + new_elems.reserve(nElems * nLayers); + double z_offset (0.0); for (unsigned layer_id = 0; layer_id <= nLayers; ++layer_id) { // add nodes for new layer unsigned node_offset (nNodes * layer_id); - unsigned elem_offset (nElems * (layer_id-1)); - if (layer_id>0) z_offset += thickness[layer_id-1]; + 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[node_offset+i] = new MeshLib::Node(coords[0], coords[1], coords[2]-z_offset, node_offset+i); + new_nodes.push_back (new MeshLib::Node(coords[0], coords[1], coords[2]-z_offset, node_offset+i)); } // starting with 2nd layer create prism or hex elements connecting the last layer with the current one + const unsigned elem_offset (nElems * (layer_id-1)); if (layer_id > 0) { - if (thickness[layer_id-1] > 0) - { - node_offset -= nNodes; - const unsigned mat_id (nLayers - layer_id); + node_offset -= nNodes; + const unsigned mat_id (nLayers - layer_id); - // counts the 2d elements (within the layer), - // used as a part of index computation in new_elems - std::size_t cnt(0); - for (unsigned i = 0; i < mesh.getNElements(); ++i) + for (unsigned i = 0; i < nOrgElems; ++i) + { + const MeshLib::Element* sfc_elem( elems[i] ); + if (sfc_elem->getDimension() == 2) { - const MeshLib::Element* sfc_elem( elems[i] ); - if (sfc_elem->getDimension() == 2) - { - const unsigned nElemNodes(sfc_elem->getNNodes()); - MeshLib::Node** e_nodes = new MeshLib::Node*[2*nElemNodes]; - - for (unsigned j=0; j<nElemNodes; ++j) - { - const unsigned node_id = sfc_elem->getNode(j)->getID() + node_offset; - e_nodes[j] = new_nodes[node_id+nNodes]; - e_nodes[j+nElemNodes] = new_nodes[node_id]; - } - if (sfc_elem->getGeomType() == MeshElemType::TRIANGLE) // extrude triangles to prism - new_elems[elem_offset+cnt] = new MeshLib::Prism(e_nodes, mat_id); - else if (sfc_elem->getGeomType() == MeshElemType::QUAD) // extrude quads to hexes - new_elems[elem_offset+cnt] = new MeshLib::Hex(e_nodes, mat_id); - cnt++; - } - else + const unsigned nElemNodes(sfc_elem->getNNodes()); + MeshLib::Node** e_nodes = new MeshLib::Node*[2*nElemNodes]; + + for (unsigned j=0; j<nElemNodes; ++j) { - WARN("MshLayerMapper::CreateLayers() - Method can only handle 2D mesh elements."); - WARN("Skipping Element %d of type \"%s\".", i, MeshElemType2String(sfc_elem->getGeomType()).c_str()); + const unsigned node_id = sfc_elem->getNode(j)->getID() + node_offset; + e_nodes[j] = new_nodes[node_id+nNodes]; + e_nodes[j+nElemNodes] = new_nodes[node_id]; } + if (sfc_elem->getGeomType() == MeshElemType::TRIANGLE) // extrude triangles to prism + new_elems.push_back (new MeshLib::Prism(e_nodes, mat_id)); + else if (sfc_elem->getGeomType() == MeshElemType::QUAD) // extrude quads to hexes + new_elems.push_back (new MeshLib::Hex(e_nodes, mat_id)); + } + else + { + WARN("MshLayerMapper::CreateLayers() - Method can only handle 2D mesh elements."); + WARN("Skipping Element %d of type \"%s\".", i, MeshElemType2String(sfc_elem->getGeomType()).c_str()); } - } - else - { - ERR("Error in MshLayerMapper::CreateLayers() - Layer thickness for layer %d is %f (needs to be >0).", (layer_id-1), thickness[layer_id-1]); - return nullptr; } } }