From b0273a0736e82ba2dca0cc31bc1f65fa3d1f766e Mon Sep 17 00:00:00 2001 From: qingfengxia Date: Mon, 10 Oct 2016 23:20:22 +0100 Subject: [PATCH] Fem: add CfdResult import for FemPostPipeline --- src/Mod/Fem/App/FemPostPipeline.cpp | 217 ++-------------------------- 1 file changed, 11 insertions(+), 206 deletions(-) diff --git a/src/Mod/Fem/App/FemPostPipeline.cpp b/src/Mod/Fem/App/FemPostPipeline.cpp index a26fb87b0..8451ac67f 100644 --- a/src/Mod/Fem/App/FemPostPipeline.cpp +++ b/src/Mod/Fem/App/FemPostPipeline.cpp @@ -29,23 +29,17 @@ #include "FemPostPipeline.h" #include "FemMesh.h" #include "FemMeshObject.h" +#include "FemVTKTools.h" + #include #include #include #include + #include #include -#include #include -#include #include -#include -#include -#include -#include -#include -#include -#include #include #include #include @@ -249,213 +243,24 @@ bool FemPostPipeline::holdsPostObject(FemPostObject* obj) { return false; } - void FemPostPipeline::load(FemResultObject* res) { - vtkSmartPointer grid = vtkSmartPointer::New(); - - //first copy the mesh over - //######################## - if(!res->Mesh.getValue() || !res->Mesh.getValue()->isDerivedFrom(Fem::FemMeshObject::getClassTypeId())) return; + //first copy the mesh over + //######################## const FemMesh& mesh = static_cast(res->Mesh.getValue())->FemMesh.getValue(); - SMESH_Mesh* smesh = const_cast(mesh.getSMesh()); - SMESHDS_Mesh* meshDS = smesh->GetMeshDS(); - const SMDS_MeshInfo& info = meshDS->GetMeshInfo(); - - //start with the nodes - vtkSmartPointer points = vtkSmartPointer::New(); - SMDS_NodeIteratorPtr aNodeIter = meshDS->nodesIterator(); - - points->SetNumberOfPoints(info.NbNodes()); - for(; aNodeIter->more(); ) { - const SMDS_MeshNode* node = aNodeIter->next(); - float coords[3] = {float(node->X()), float(node->Y()), float(node->Z())}; - points->SetPoint(node->GetID()-1, coords); - } - grid->SetPoints(points); - - //start with 2d elements - vtkSmartPointer triangleArray = vtkSmartPointer::New(); - vtkSmartPointer quadTriangleArray = vtkSmartPointer::New(); - vtkSmartPointer quadArray = vtkSmartPointer::New(); - - SMDS_FaceIteratorPtr aFaceIter = meshDS->facesIterator(); - for (;aFaceIter->more();) { - const SMDS_MeshFace* aFace = aFaceIter->next(); - - //triangle - if(aFace->NbNodes() == 3) { - vtkSmartPointer tria = vtkSmartPointer::New(); - tria->GetPointIds()->SetId(0, aFace->GetNode(0)->GetID()-1); - tria->GetPointIds()->SetId(1, aFace->GetNode(1)->GetID()-1); - tria->GetPointIds()->SetId(2, aFace->GetNode(2)->GetID()-1); - - triangleArray->InsertNextCell(tria); - } - //quad - else if(aFace->NbNodes() == 4) { - vtkSmartPointer quad = vtkSmartPointer::New(); - quad->GetPointIds()->SetId(0, aFace->GetNode(0)->GetID()-1); - quad->GetPointIds()->SetId(1, aFace->GetNode(1)->GetID()-1); - quad->GetPointIds()->SetId(2, aFace->GetNode(2)->GetID()-1); - - quadArray->InsertNextCell(quad); - } - else if (aFace->NbNodes() == 6) { - vtkSmartPointer tria = vtkSmartPointer::New(); - tria->GetPointIds()->SetId(0, aFace->GetNode(0)->GetID()-1); - tria->GetPointIds()->SetId(1, aFace->GetNode(1)->GetID()-1); - tria->GetPointIds()->SetId(2, aFace->GetNode(2)->GetID()-1); - tria->GetPointIds()->SetId(3, aFace->GetNode(3)->GetID()-1); - tria->GetPointIds()->SetId(4, aFace->GetNode(4)->GetID()-1); - tria->GetPointIds()->SetId(5, aFace->GetNode(5)->GetID()-1); - quadTriangleArray->InsertNextCell(tria); - } - } - if(triangleArray->GetNumberOfCells()>0) - grid->SetCells(VTK_TRIANGLE, triangleArray); - - if(quadArray->GetNumberOfCells()>0) - grid->SetCells(VTK_QUAD, quadArray); - - if(quadTriangleArray->GetNumberOfCells()>0) - grid->SetCells(VTK_QUADRATIC_TRIANGLE, quadTriangleArray); - - - //now all volumes - vtkSmartPointer tetraArray = vtkSmartPointer::New(); - vtkSmartPointer quadTetraArray = vtkSmartPointer::New(); - - SMDS_VolumeIteratorPtr aVolIter = meshDS->volumesIterator(); - for (;aVolIter->more();) { - const SMDS_MeshVolume* aVol = aVolIter->next(); - - //tetrahedra - if(aVol->NbNodes() == 4) { - vtkSmartPointer tetra = vtkSmartPointer::New(); - tetra->GetPointIds()->SetId(0, aVol->GetNode(0)->GetID()-1); - tetra->GetPointIds()->SetId(1, aVol->GetNode(1)->GetID()-1); - tetra->GetPointIds()->SetId(2, aVol->GetNode(2)->GetID()-1); - tetra->GetPointIds()->SetId(3, aVol->GetNode(3)->GetID()-1); - - tetraArray->InsertNextCell(tetra); - } - //quadratic tetrahedra - else if( aVol->NbNodes() == 10) { - - vtkSmartPointer tetra = vtkSmartPointer::New(); - tetra->GetPointIds()->SetId(0, aVol->GetNode(0)->GetID()-1); - tetra->GetPointIds()->SetId(1, aVol->GetNode(1)->GetID()-1); - tetra->GetPointIds()->SetId(2, aVol->GetNode(2)->GetID()-1); - tetra->GetPointIds()->SetId(3, aVol->GetNode(3)->GetID()-1); - tetra->GetPointIds()->SetId(4, aVol->GetNode(4)->GetID()-1); - tetra->GetPointIds()->SetId(5, aVol->GetNode(5)->GetID()-1); - tetra->GetPointIds()->SetId(6, aVol->GetNode(6)->GetID()-1); - tetra->GetPointIds()->SetId(7, aVol->GetNode(7)->GetID()-1); - tetra->GetPointIds()->SetId(8, aVol->GetNode(8)->GetID()-1); - tetra->GetPointIds()->SetId(9, aVol->GetNode(9)->GetID()-1); - - quadTetraArray->InsertNextCell(tetra); - } - } - if(tetraArray->GetNumberOfCells()>0) - grid->SetCells(VTK_TETRA, tetraArray); - - if(quadTetraArray->GetNumberOfCells()>0) - grid->SetCells(VTK_QUADRATIC_TETRA, quadTetraArray); - + vtkSmartPointer grid = vtkSmartPointer::New(); + FemVTKTools::exportVTKMesh(&mesh, grid); //Now copy the point data over //############################ - - if(!res->StressValues.getValues().empty()) { - const std::vector& vec = res->StressValues.getValues(); - vtkSmartPointer data = vtkSmartPointer::New(); - data->SetNumberOfValues(vec.size()); - data->SetName("Von Mises stress"); - - for(size_t i=0; iSetValue(i, vec[i]); - - grid->GetPointData()->AddArray(data); + if(res->getPropertyByName("Velocity")){ + FemVTKTools::exportFluidicResult(res, grid); } - - if(!res->StressValues.getValues().empty()) { - const std::vector& vec = res->MaxShear.getValues(); - vtkSmartPointer data = vtkSmartPointer::New(); - data->SetNumberOfValues(vec.size()); - data->SetName("Max shear stress (Tresca)"); - - for(size_t i=0; iSetValue(i, vec[i]); - - grid->GetPointData()->AddArray(data); - } - - if(!res->StressValues.getValues().empty()) { - const std::vector& vec = res->PrincipalMax.getValues(); - vtkSmartPointer data = vtkSmartPointer::New(); - data->SetNumberOfValues(vec.size()); - data->SetName("Maximum Principal stress"); - - for(size_t i=0; iSetValue(i, vec[i]); - - grid->GetPointData()->AddArray(data); - } - - if(!res->StressValues.getValues().empty()) { - const std::vector& vec = res->PrincipalMin.getValues(); - vtkSmartPointer data = vtkSmartPointer::New(); - data->SetNumberOfValues(vec.size()); - data->SetName("Minimum Principal stress"); - - for(size_t i=0; iSetValue(i, vec[i]); - - grid->GetPointData()->AddArray(data); - } - - if(!res->StressValues.getValues().empty()) { - const std::vector& vec = res->Temperature.getValues(); - vtkSmartPointer data = vtkSmartPointer::New(); - data->SetNumberOfValues(vec.size()); - data->SetName("Temperature"); - - for(size_t i=0; iSetValue(i, vec[i]); - - grid->GetPointData()->AddArray(data); - } - - if(!res->StressValues.getValues().empty()) { - const std::vector& vec = res->UserDefined.getValues(); - vtkSmartPointer data = vtkSmartPointer::New(); - data->SetNumberOfValues(vec.size()); - data->SetName("User Defined Results"); - - for(size_t i=0; iSetValue(i, vec[i]); - - grid->GetPointData()->AddArray(data); - } - - - if(!res->StressValues.getValues().empty()) { - const std::vector& vec = res->DisplacementVectors.getValues(); - vtkSmartPointer data = vtkSmartPointer::New(); - data->SetNumberOfComponents(3); - data->SetName("Displacement"); - - for(std::vector::const_iterator it=vec.begin(); it!=vec.end(); ++it) { - double tuple[] = {it->x, it->y, it->z}; - data->InsertNextTuple(tuple); - } - - grid->GetPointData()->AddArray(data); + else{ + FemVTKTools::exportMechanicalResult(res, grid); } Data.setValue(grid);