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)
This commit is contained in:
Stefan Tröger 2016-01-01 17:58:06 +01:00 committed by wmayer
parent c2df92cd76
commit defecae339
6 changed files with 53 additions and 36 deletions

View File

@ -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<vtkTableBasedClipDataSet>::New();
clip.source = m_clipper;
clip.target = m_clipper;
addFilterPipeline(clip, "clip");
FilterPipeline extr;
m_extractor = vtkExtractGeometry::New();
m_extractor = vtkSmartPointer<vtkExtractGeometry>::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<vtkTableBasedClipDataSet>::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<vtkWarpVector>::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<vtkCutter>::New();
clip.source = m_cutter;
clip.target = m_cutter;
addFilterPipeline(clip, "cut");

View File

@ -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<vtkPlane>::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<vtkSphere>::New();
m_implicit = m_sphere;
m_sphere->SetCenter(0., 0., 0.);

View File

@ -46,6 +46,13 @@
#include <vtkTriangle.h>
#include <vtkQuadraticTriangle.h>
#include <vtkQuad.h>
#include <vtkImageData.h>
#include <vtkRectilinearGrid.h>
#include <vtkXMLUnstructuredGridReader.h>
#include <vtkXMLPolyDataReader.h>
#include <vtkXMLStructuredGridReader.h>
#include <vtkXMLRectilinearGridReader.h>
#include <vtkXMLImageDataReader.h>
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<vtkDataSetReader> reader = vtkSmartPointer<vtkDataSetReader>::New();
reader->SetFileName(File.filePath().c_str());
reader->Update();
Data.setValue(reader->GetOutput());
}
else{
if (File.hasExtension("vtu"))
readXMLFile<vtkXMLUnstructuredGridReader>(File.filePath());
else if (File.hasExtension("vtp"))
readXMLFile<vtkXMLPolyDataReader>(File.filePath());
else if (File.hasExtension("vts"))
readXMLFile<vtkXMLStructuredGridReader>(File.filePath());
else if (File.hasExtension("vtr"))
readXMLFile<vtkXMLRectilinearGridReader>(File.filePath());
else if (File.hasExtension("vti"))
readXMLFile<vtkXMLImageDataReader>(File.filePath());
else if (File.hasExtension("vtk"))
readXMLFile<vtkDataSetReader>(File.filePath());
else
throw Base::Exception("Unknown extension");
}
}
@ -214,7 +224,7 @@ bool FemPostPipeline::holdsPostObject(FemPostObject* obj) {
void FemPostPipeline::load(FemResultObject* res) {
vtkSmartPointer<vtkUnstructuredGrid> grid = vtkUnstructuredGrid::New();
vtkSmartPointer<vtkUnstructuredGrid> grid = vtkSmartPointer<vtkUnstructuredGrid>::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<vtkPoints> points = vtkPoints::New();
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::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<vtkCellArray> triangleArray = vtkSmartPointer<vtkCellArray>::New();
vtkSmartPointer<vtkCellArray> quadTriangleArray = vtkSmartPointer<vtkCellArray>::New();
@ -250,7 +260,7 @@ void FemPostPipeline::load(FemResultObject* res) {
//triangle
if(aFace->NbNodes() == 3) {
vtkSmartPointer<vtkTriangle> tria = vtkTriangle::New();
vtkSmartPointer<vtkTriangle> tria = vtkSmartPointer<vtkTriangle>::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<vtkQuad> quad = vtkQuad::New();
vtkSmartPointer<vtkQuad> quad = vtkSmartPointer<vtkQuad>::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<vtkQuadraticTriangle> tria = vtkQuadraticTriangle::New();
vtkSmartPointer<vtkQuadraticTriangle> tria = vtkSmartPointer<vtkQuadraticTriangle>::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<vtkCellArray> tetraArray = vtkSmartPointer<vtkCellArray>::New();
vtkSmartPointer<vtkCellArray> quadTetraArray = vtkSmartPointer<vtkCellArray>::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<vtkTetra> tetra = vtkTetra::New();
vtkSmartPointer<vtkTetra> tetra = vtkSmartPointer<vtkTetra>::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<vtkQuadraticTetra> tetra = vtkQuadraticTetra::New();
vtkSmartPointer<vtkQuadraticTetra> tetra = vtkSmartPointer<vtkQuadraticTetra>::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<double>& vec = res->StressValues.getValues();
vtkSmartPointer<vtkDoubleArray> data = vtkDoubleArray::New();
vtkSmartPointer<vtkDoubleArray> data = vtkSmartPointer<vtkDoubleArray>::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<Base::Vector3d>& vec = res->DisplacementVectors.getValues();
vtkSmartPointer<vtkDoubleArray> data = vtkDoubleArray::New();
vtkSmartPointer<vtkDoubleArray> data = vtkSmartPointer<vtkDoubleArray>::New();
data->SetNumberOfComponents(3);
data->SetName("Displacement");

View File

@ -72,6 +72,14 @@ protected:
private:
static const char* ModeEnums[];
template<class TReader> void readXMLFile(std::string file) {
vtkSmartPointer<TReader> reader = vtkSmartPointer<TReader>::New();
reader->SetFileName(file.c_str());
reader->Update();
Data.setValue(reader->GetOutput());
}
};
} //namespace Fem

View File

@ -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<vtkOutlineCornerFilter>::New();
m_points = vtkSmartPointer<vtkVertexGlyphFilter>::New();
m_surface = vtkSmartPointer<vtkGeometryFilter>::New();
m_wireframe = vtkSmartPointer<vtkExtractEdges>::New();
m_surfaceEdges = vtkSmartPointer<vtkAppendPolyData>::New();
m_surfaceEdges->AddInputConnection(m_surface->GetOutputPort());
m_surfaceEdges->AddInputConnection(m_wireframe->GetOutputPort());
m_lookup = vtkLookupTable::New();
m_lookup = vtkSmartPointer<vtkLookupTable>::New();
m_lookup->SetRampToLinear();
m_currentAlgorithm = m_outline;

View File

@ -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")