Skip to content

Commit

Permalink
FEM Post: Fix and extend file handling
Browse files Browse the repository at this point in the history
-Fix crash on saving due to bad result to pipeline transfer
-fix vtk smart pointer usage
-support more file types(new vtk xml formats)
  • Loading branch information
ickby authored and wwmayer committed May 18, 2016
1 parent c2df92c commit defecae
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 36 deletions.
10 changes: 5 additions & 5 deletions src/Mod/Fem/App/FemPostFilter.cpp
Expand Up @@ -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");
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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");
Expand Down
4 changes: 2 additions & 2 deletions src/Mod/Fem/App/FemPostFunction.cpp
Expand Up @@ -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.);
Expand Down Expand Up @@ -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.);
Expand Down
53 changes: 31 additions & 22 deletions src/Mod/Fem/App/FemPostPipeline.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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");
}
}


Expand Down Expand Up @@ -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
//########################
Expand All @@ -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());
Expand All @@ -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();
Expand All @@ -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);
Expand All @@ -259,15 +269,15 @@ 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);

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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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");

Expand All @@ -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");

Expand Down
8 changes: 8 additions & 0 deletions src/Mod/Fem/App/FemPostPipeline.h
Expand Up @@ -72,6 +72,14 @@ class AppFemExport FemPostPipeline : public Fem::FemPostFilter

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
Expand Down
12 changes: 6 additions & 6 deletions src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/Mod/Fem/Init.py
Expand Up @@ -31,7 +31,7 @@

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")
Expand Down

0 comments on commit defecae

Please sign in to comment.