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);