From defecae33987aa3ac96728f01d760b0f5f896359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Fri, 1 Jan 2016 17:58:06 +0100 Subject: [PATCH] FEM Post: Fix and extend file handling -Fix crash on saving due to bad result to pipeline transfer -fix vtk smart pointer usage -support more file types(new vtk xml formats) --- src/Mod/Fem/App/FemPostFilter.cpp | 10 ++-- src/Mod/Fem/App/FemPostFunction.cpp | 4 +- src/Mod/Fem/App/FemPostPipeline.cpp | 53 +++++++++++-------- src/Mod/Fem/App/FemPostPipeline.h | 8 +++ src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp | 12 ++--- src/Mod/Fem/Init.py | 2 +- 6 files changed, 53 insertions(+), 36 deletions(-) diff --git a/src/Mod/Fem/App/FemPostFilter.cpp b/src/Mod/Fem/App/FemPostFilter.cpp index 35e8b38fd..f20e36d6f 100644 --- a/src/Mod/Fem/App/FemPostFilter.cpp +++ b/src/Mod/Fem/App/FemPostFilter.cpp @@ -110,13 +110,13 @@ FemPostClipFilter::FemPostClipFilter(void) : FemPostFilter() { ADD_PROPERTY_TYPE(CutCells, (false), "Clip", App::Prop_None, "Decides if cells are cuttet and interpolated or if the cells are kept as a whole"); FilterPipeline clip; - m_clipper = vtkTableBasedClipDataSet::New(); + m_clipper = vtkSmartPointer::New(); clip.source = m_clipper; clip.target = m_clipper; addFilterPipeline(clip, "clip"); FilterPipeline extr; - m_extractor = vtkExtractGeometry::New(); + m_extractor = vtkSmartPointer::New(); extr.source = m_extractor; extr.target = m_extractor; addFilterPipeline(extr, "extract"); @@ -179,7 +179,7 @@ FemPostScalarClipFilter::FemPostScalarClipFilter(void) : FemPostFilter() { Value.setConstraints(&m_constraints); FilterPipeline clip; - m_clipper = vtkTableBasedClipDataSet::New(); + m_clipper = vtkSmartPointer::New(); clip.source = m_clipper; clip.target = m_clipper; addFilterPipeline(clip, "clip"); @@ -277,7 +277,7 @@ FemPostWarpVectorFilter::FemPostWarpVectorFilter(void): FemPostFilter() { ADD_PROPERTY_TYPE(Vector, (long(0)), "Warp", App::Prop_None, "The field added to the node position"); FilterPipeline warp; - m_warp = vtkWarpVector::New(); + m_warp = vtkSmartPointer::New(); warp.source = m_warp; warp.target = m_warp; addFilterPipeline(warp, "warp"); @@ -354,7 +354,7 @@ FemPostCutFilter::FemPostCutFilter(void) : FemPostFilter() { ADD_PROPERTY_TYPE(Function, (0), "Cut", App::Prop_None, "The function object which defines the clip cut function"); FilterPipeline clip; - m_cutter = vtkCutter::New(); + m_cutter = vtkSmartPointer::New(); clip.source = m_cutter; clip.target = m_cutter; addFilterPipeline(clip, "cut"); diff --git a/src/Mod/Fem/App/FemPostFunction.cpp b/src/Mod/Fem/App/FemPostFunction.cpp index ebf259bb3..2fea92888 100644 --- a/src/Mod/Fem/App/FemPostFunction.cpp +++ b/src/Mod/Fem/App/FemPostFunction.cpp @@ -71,7 +71,7 @@ FemPostPlaneFunction::FemPostPlaneFunction(void): FemPostFunction() { ADD_PROPERTY(Origin,(Base::Vector3d(0.0,0.0,0.0))); ADD_PROPERTY(Normal,(Base::Vector3d(0.0,0.0,1.0))); - m_plane = vtkPlane::New(); + m_plane = vtkSmartPointer::New(); m_implicit = m_plane; m_plane->SetOrigin(0., 0., 0.); @@ -107,7 +107,7 @@ FemPostSphereFunction::FemPostSphereFunction(void): FemPostFunction() { ADD_PROPERTY(Radius,(5)); ADD_PROPERTY(Center,(Base::Vector3d(1.0,0.0,0.0))); - m_sphere = vtkSphere::New(); + m_sphere = vtkSmartPointer::New(); m_implicit = m_sphere; m_sphere->SetCenter(0., 0., 0.); diff --git a/src/Mod/Fem/App/FemPostPipeline.cpp b/src/Mod/Fem/App/FemPostPipeline.cpp index 4b9e72da8..304d10fc5 100644 --- a/src/Mod/Fem/App/FemPostPipeline.cpp +++ b/src/Mod/Fem/App/FemPostPipeline.cpp @@ -46,6 +46,13 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include using namespace Fem; using namespace App; @@ -97,23 +104,26 @@ bool FemPostPipeline::canRead(Base::FileInfo File) { return false; } - void FemPostPipeline::read(Base::FileInfo File) { // checking on the file if (!File.isReadable()) throw Base::Exception("File to load not existing or not readable"); - if (canRead(File)) { - - vtkSmartPointer reader = vtkSmartPointer::New(); - reader->SetFileName(File.filePath().c_str()); - reader->Update(); - Data.setValue(reader->GetOutput()); - } - else{ + if (File.hasExtension("vtu")) + readXMLFile(File.filePath()); + else if (File.hasExtension("vtp")) + readXMLFile(File.filePath()); + else if (File.hasExtension("vts")) + readXMLFile(File.filePath()); + else if (File.hasExtension("vtr")) + readXMLFile(File.filePath()); + else if (File.hasExtension("vti")) + readXMLFile(File.filePath()); + else if (File.hasExtension("vtk")) + readXMLFile(File.filePath()); + else throw Base::Exception("Unknown extension"); - } } @@ -214,7 +224,7 @@ bool FemPostPipeline::holdsPostObject(FemPostObject* obj) { void FemPostPipeline::load(FemResultObject* res) { - vtkSmartPointer grid = vtkUnstructuredGrid::New(); + vtkSmartPointer grid = vtkSmartPointer::New(); //first copy the mesh over //######################## @@ -228,7 +238,7 @@ void FemPostPipeline::load(FemResultObject* res) { const SMDS_MeshInfo& info = meshDS->GetMeshInfo(); //start with the nodes - vtkSmartPointer points = vtkPoints::New(); + vtkSmartPointer points = vtkSmartPointer::New(); SMDS_NodeIteratorPtr aNodeIter = meshDS->nodesIterator(); points->SetNumberOfPoints(info.NbNodes()); @@ -238,7 +248,7 @@ void FemPostPipeline::load(FemResultObject* res) { points->SetPoint(node->GetID()-1, coords); } grid->SetPoints(points); - + //start with 2d elements vtkSmartPointer triangleArray = vtkSmartPointer::New(); vtkSmartPointer quadTriangleArray = vtkSmartPointer::New(); @@ -250,7 +260,7 @@ void FemPostPipeline::load(FemResultObject* res) { //triangle if(aFace->NbNodes() == 3) { - vtkSmartPointer tria = vtkTriangle::New(); + 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); @@ -259,7 +269,7 @@ void FemPostPipeline::load(FemResultObject* res) { } //quad else if(aFace->NbNodes() == 4) { - vtkSmartPointer quad = vtkQuad::New(); + 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); @@ -267,7 +277,7 @@ void FemPostPipeline::load(FemResultObject* res) { quadArray->InsertNextCell(quad); } else if (aFace->NbNodes() == 6) { - vtkSmartPointer tria = vtkQuadraticTriangle::New(); + 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); @@ -291,14 +301,13 @@ void FemPostPipeline::load(FemResultObject* res) { vtkSmartPointer tetraArray = vtkSmartPointer::New(); vtkSmartPointer quadTetraArray = vtkSmartPointer::New(); - tetraArray->SetNumberOfCells(info.NbTetras()); SMDS_VolumeIteratorPtr aVolIter = meshDS->volumesIterator(); for (;aVolIter->more();) { const SMDS_MeshVolume* aVol = aVolIter->next(); //tetrahedra if(aVol->NbNodes() == 4) { - vtkSmartPointer tetra = vtkTetra::New(); + 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); @@ -309,7 +318,7 @@ void FemPostPipeline::load(FemResultObject* res) { //quadratic tetrahedra else if( aVol->NbNodes() == 10) { - vtkSmartPointer tetra = vtkQuadraticTetra::New(); + 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); @@ -330,13 +339,13 @@ void FemPostPipeline::load(FemResultObject* res) { if(quadTetraArray->GetNumberOfCells()>0) grid->SetCells(VTK_QUADRATIC_TETRA, quadTetraArray); - + //Now copy the point data over //############################ if(!res->StressValues.getValues().empty()) { const std::vector& vec = res->StressValues.getValues(); - vtkSmartPointer data = vtkDoubleArray::New(); + vtkSmartPointer data = vtkSmartPointer::New(); data->SetNumberOfValues(vec.size()); data->SetName("Stress"); @@ -348,7 +357,7 @@ void FemPostPipeline::load(FemResultObject* res) { if(!res->StressValues.getValues().empty()) { const std::vector& vec = res->DisplacementVectors.getValues(); - vtkSmartPointer data = vtkDoubleArray::New(); + vtkSmartPointer data = vtkSmartPointer::New(); data->SetNumberOfComponents(3); data->SetName("Displacement"); diff --git a/src/Mod/Fem/App/FemPostPipeline.h b/src/Mod/Fem/App/FemPostPipeline.h index 6a23acef1..9118886e3 100644 --- a/src/Mod/Fem/App/FemPostPipeline.h +++ b/src/Mod/Fem/App/FemPostPipeline.h @@ -72,6 +72,14 @@ protected: private: static const char* ModeEnums[]; + + template void readXMLFile(std::string file) { + + vtkSmartPointer reader = vtkSmartPointer::New(); + reader->SetFileName(file.c_str()); + reader->Update(); + Data.setValue(reader->GetOutput()); + } }; } //namespace Fem diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp index 318dfaa16..c346007b2 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp @@ -95,15 +95,15 @@ ViewProviderFemPostObject::ViewProviderFemPostObject() : m_blockPropertyChanges( m_seperator->ref(); //create the vtk algorithms we use for visualisation - m_outline = vtkOutlineCornerFilter::New(); - m_points = vtkVertexGlyphFilter::New(); - m_surface = vtkGeometryFilter::New(); - m_wireframe = vtkExtractEdges::New(); - m_surfaceEdges = vtkAppendPolyData::New(); + m_outline = vtkSmartPointer::New(); + m_points = vtkSmartPointer::New(); + m_surface = vtkSmartPointer::New(); + m_wireframe = vtkSmartPointer::New(); + m_surfaceEdges = vtkSmartPointer::New(); m_surfaceEdges->AddInputConnection(m_surface->GetOutputPort()); m_surfaceEdges->AddInputConnection(m_wireframe->GetOutputPort()); - m_lookup = vtkLookupTable::New(); + m_lookup = vtkSmartPointer::New(); m_lookup->SetRampToLinear(); m_currentAlgorithm = m_outline; diff --git a/src/Mod/Fem/Init.py b/src/Mod/Fem/Init.py index c6f5c3978..95dcfb7c0 100644 --- a/src/Mod/Fem/Init.py +++ b/src/Mod/Fem/Init.py @@ -31,7 +31,7 @@ import FreeCAD FreeCAD.addExportType("TetGen file (*.poly)", "convert2TetGen") FreeCAD.addImportType("FEM formats (*.unv *.med *.dat *.bdf)", "Fem") -FreeCAD.addImportType("FEM results (*.vtk)","Fem") +FreeCAD.addImportType("FEM results (*.vtk *.vtp *.vts *.vtr *.vtu *.vti)","Fem") FreeCAD.addExportType("FEM formats (*.unv *.med *.dat *.inp)", "Fem") FreeCAD.addImportType("CalculiX result (*.frd)", "ccxFrdReader") FreeCAD.addImportType("Abaqus file (*.inp)", "FemGui")