diff --git a/Applications/DataExplorer/VtkVis/VtkMeshSource.cpp b/Applications/DataExplorer/VtkVis/VtkMeshSource.cpp index fd9aceddf340c42804777d43ea0cc4da730de18c..d41879fb99c05a8aaca3fa68f4de59adfba759cf 100644 --- a/Applications/DataExplorer/VtkVis/VtkMeshSource.cpp +++ b/Applications/DataExplorer/VtkVis/VtkMeshSource.cpp @@ -20,6 +20,7 @@ #include "Elements/Element.h" #include "Mesh.h" #include "MeshLib/Node.h" +#include "MeshLib/VtkOGSEnum.h" #include "VtkColorLookupTable.h" #include "Color.h" @@ -45,8 +46,6 @@ #include <vtkTriangle.h> #include <vtkWedge.h> // == Prism -#include "MeshLib/VtkOGSEnum.h" - vtkStandardNewMacro(VtkMeshSource); VtkMeshSource::VtkMeshSource() : @@ -147,12 +146,15 @@ int VtkMeshSource::RequestData( vtkInformation* request, point_ids->SetId(j, elem->getNode(j)->getID()); type = OGSToVtkCellType(elem->getCellType()); - if (type==0) { + if (type==0) + { ERR("VtkMeshSource::RequestData(): Unknown element type \"%s\".", CellType2String(elem->getCellType()).c_str()); return 0; } - if (elem->getCellType() == CellType::PRISM6) { + + if (elem->getCellType() == CellType::PRISM6) + { for (unsigned i=0; i<3; ++i) { const unsigned prism_swap_id = point_ids->GetId(i); @@ -160,6 +162,24 @@ int VtkMeshSource::RequestData( vtkInformation* request, point_ids->SetId(i+3, prism_swap_id); } } + else if (elem->getCellType() == CellType::PRISM15) + { + std::array<vtkIdType, 15> ogs_nodeIds; + for (unsigned i=0; i<15; ++i) + ogs_nodeIds[i] = point_ids->GetId(i); + for (unsigned i=0; i<3; ++i) + { + point_ids->SetId(i, ogs_nodeIds[i+3]); + point_ids->SetId(i+3, ogs_nodeIds[i]); + } + for (unsigned i=0; i<3; ++i) + point_ids->SetId(6+i, ogs_nodeIds[8-i]); + for (unsigned i=0; i<3; ++i) + point_ids->SetId(9+i, ogs_nodeIds[14-i]); + point_ids->SetId(12, ogs_nodeIds[9]); + point_ids->SetId(13, ogs_nodeIds[11]); + point_ids->SetId(14, ogs_nodeIds[10]); + } output->InsertNextCell(type, point_ids); } diff --git a/InSituLib/VtkMappedMesh.cpp b/InSituLib/VtkMappedMesh.cpp index 2dcb4d37a2d8139460b510570ddb6dc90bcede61..483ad7e979cfeb08fc4d6b6fd5dc01494e8a010b 100644 --- a/InSituLib/VtkMappedMesh.cpp +++ b/InSituLib/VtkMappedMesh.cpp @@ -82,6 +82,24 @@ void VtkMappedMeshImpl::GetCellPoints(vtkIdType cellId, vtkIdList *ptIds) ptIds->SetId(i+3, prism_swap_id); } } + else if(GetCellType(cellId) == VTK_QUADRATIC_WEDGE) + { + std::array<vtkIdType, 15> ogs_nodeIds; + for (unsigned i=0; i<15; ++i) + ogs_nodeIds[i] = ptIds->GetId(i); + for (unsigned i=0; i<3; ++i) + { + ptIds->SetId(i, ogs_nodeIds[i+3]); + ptIds->SetId(i+3, ogs_nodeIds[i]); + } + for (unsigned i=0; i<3; ++i) + ptIds->SetId(6+i, ogs_nodeIds[8-i]); + for (unsigned i=0; i<3; ++i) + ptIds->SetId(9+i, ogs_nodeIds[14-i]); + ptIds->SetId(12, ogs_nodeIds[9]); + ptIds->SetId(13, ogs_nodeIds[11]); + ptIds->SetId(14, ogs_nodeIds[10]); + } } void VtkMappedMeshImpl::GetPointCells(vtkIdType ptId, vtkIdList *cellIds) diff --git a/MeshLib/MeshGenerators/VtkMeshConverter.cpp b/MeshLib/MeshGenerators/VtkMeshConverter.cpp index f163ef46260491623a514f2ba8bec54428a7b010..f7735f1da23370b4c3116bb9371ccbfa183e252f 100644 --- a/MeshLib/MeshGenerators/VtkMeshConverter.cpp +++ b/MeshLib/MeshGenerators/VtkMeshConverter.cpp @@ -41,7 +41,20 @@ #include <vtkUnstructuredGrid.h> #include <vtkFloatArray.h> -namespace MeshLib { +namespace MeshLib +{ + +namespace detail +{ +template <class T_ELEMENT> +MeshLib::Element* createElementWithSameNodeOrder(const std::vector<MeshLib::Node*> &nodes, const std::vector<unsigned> &node_ids, unsigned material) +{ + MeshLib::Node** ele_nodes = new MeshLib::Node*[T_ELEMENT::n_all_nodes]; + for (unsigned k(0); k<T_ELEMENT::n_all_nodes; k++) + ele_nodes[k] = nodes[node_ids[k]]; + return new T_ELEMENT(ele_nodes, material); +} +} MeshLib::Mesh* VtkMeshConverter::convertImgToMesh(vtkImageData* img, const double origin[3], @@ -280,24 +293,15 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(vtkUnstructuredGrid* gr switch (cell_type) { case VTK_LINE: { - MeshLib::Node** line_nodes = new MeshLib::Node*[2]; - line_nodes[0] = nodes[node_ids[0]]; - line_nodes[1] = nodes[node_ids[1]]; - elem = new MeshLib::Line(line_nodes, material); + elem = detail::createElementWithSameNodeOrder<MeshLib::Line>(nodes, node_ids, material); break; } case VTK_TRIANGLE: { - MeshLib::Node** tri_nodes = new MeshLib::Node*[3]; - for (unsigned k(0); k<3; k++) - tri_nodes[k] = nodes[node_ids[k]]; - elem = new MeshLib::Tri(tri_nodes, material); + elem = detail::createElementWithSameNodeOrder<MeshLib::Tri>(nodes, node_ids, material); break; } case VTK_QUAD: { - MeshLib::Node** quad_nodes = new MeshLib::Node*[4]; - for (unsigned k(0); k<4; k++) - quad_nodes[k] = nodes[node_ids[k]]; - elem = new MeshLib::Quad(quad_nodes, material); + elem = detail::createElementWithSameNodeOrder<MeshLib::Quad>(nodes, node_ids, material); break; } case VTK_PIXEL: { @@ -310,17 +314,11 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(vtkUnstructuredGrid* gr break; } case VTK_TETRA: { - MeshLib::Node** tet_nodes = new MeshLib::Node*[4]; - for (unsigned k(0); k<4; k++) - tet_nodes[k] = nodes[node_ids[k]]; - elem = new MeshLib::Tet(tet_nodes, material); + elem = detail::createElementWithSameNodeOrder<MeshLib::Tet>(nodes, node_ids, material); break; } case VTK_HEXAHEDRON: { - MeshLib::Node** hex_nodes = new MeshLib::Node*[8]; - for (unsigned k(0); k<8; k++) - hex_nodes[k] = nodes[node_ids[k]]; - elem = new MeshLib::Hex(hex_nodes, material); + elem = detail::createElementWithSameNodeOrder<MeshLib::Hex>(nodes, node_ids, material); break; } case VTK_VOXEL: { @@ -337,10 +335,7 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(vtkUnstructuredGrid* gr break; } case VTK_PYRAMID: { - MeshLib::Node** pyramid_nodes = new MeshLib::Node*[5]; - for (unsigned k(0); k<5; k++) - pyramid_nodes[k] = nodes[node_ids[k]]; - elem = new MeshLib::Pyramid(pyramid_nodes, material); + elem = detail::createElementWithSameNodeOrder<MeshLib::Pyramid>(nodes, node_ids, material); break; } case VTK_WEDGE: { @@ -353,6 +348,51 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(vtkUnstructuredGrid* gr elem = new MeshLib::Prism(prism_nodes, material); break; } + case VTK_QUADRATIC_EDGE: { + elem = detail::createElementWithSameNodeOrder<MeshLib::Line3>(nodes, node_ids, material); + break; + } + case VTK_QUADRATIC_TRIANGLE: { + elem = detail::createElementWithSameNodeOrder<MeshLib::Tri6>(nodes, node_ids, material); + break; + } + case VTK_QUADRATIC_QUAD: { + elem = detail::createElementWithSameNodeOrder<MeshLib::Quad8>(nodes, node_ids, material); + break; + } + case VTK_BIQUADRATIC_QUAD: { + elem = detail::createElementWithSameNodeOrder<MeshLib::Quad9>(nodes, node_ids, material); + break; + } + case VTK_QUADRATIC_TETRA: { + elem = detail::createElementWithSameNodeOrder<MeshLib::Tet10>(nodes, node_ids, material); + break; + } + case VTK_QUADRATIC_HEXAHEDRON: { + elem = detail::createElementWithSameNodeOrder<MeshLib::Hex20>(nodes, node_ids, material); + break; + } + case VTK_QUADRATIC_PYRAMID: { + elem = detail::createElementWithSameNodeOrder<MeshLib::Pyramid13>(nodes, node_ids, material); + break; + } + case VTK_QUADRATIC_WEDGE: { + MeshLib::Node** prism_nodes = new MeshLib::Node*[15]; + for (unsigned i=0; i<3; ++i) + { + prism_nodes[i] = nodes[node_ids[i+3]]; + prism_nodes[i+3] = nodes[node_ids[i]]; + } + for (unsigned i=0; i<3; ++i) + prism_nodes[6+i] = nodes[node_ids[8-i]]; + prism_nodes[9] = nodes[node_ids[12]]; + prism_nodes[10] = nodes[node_ids[14]]; + prism_nodes[11] = nodes[node_ids[13]]; + for (unsigned i=0; i<3; ++i) + prism_nodes[12+i] = nodes[node_ids[11-i]]; + elem = new MeshLib::Prism15(prism_nodes, material); + break; + } default: ERR("VtkMeshConverter::convertUnstructuredGrid(): Unknown mesh element type \"%d\".", cell_type); return nullptr;