Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkUnstructuredGridVtkWriter.h"
00019 class vtkDataObject;
00020 #include <vtkConfigure.h>
00021 #include <vtkUnstructuredGrid.h>
00022 #include <vtkLinearTransform.h>
00023 #include <vtkTransformFilter.h>
00024 #include <sstream>
00025 #include <sys/stat.h>
00026 #include <sys/types.h>
00027 #include <stdio.h>
00028
00029 template <class VTKWRITER>
00030 mitk::UnstructuredGridVtkWriter<VTKWRITER>::UnstructuredGridVtkWriter()
00031 : m_WriterWriteHasReturnValue( false )
00032 {
00033 this->SetNumberOfRequiredInputs( 1 );
00034
00035 m_VtkWriter = VtkWriterType::New();
00036
00037
00038
00039
00040 SetDefaultExtension();
00041 }
00042
00043 template <class VTKWRITER>
00044 mitk::UnstructuredGridVtkWriter<VTKWRITER>::~UnstructuredGridVtkWriter()
00045 {
00046 m_VtkWriter->Delete();
00047 }
00048
00049 template <class VTKWRITER>
00050 void mitk::UnstructuredGridVtkWriter<VTKWRITER>::SetDefaultExtension()
00051 {
00052 m_Extension = ".vtk";
00053 }
00054
00055 template<class VTKWRITER>
00056 void mitk::UnstructuredGridVtkWriter<VTKWRITER>::ExecuteWrite( VtkWriterType* m_VtkWriter, vtkTransformFilter* )
00057 {
00058 struct stat fileStatus;
00059 time_t timeBefore=0;
00060 if (!stat(m_VtkWriter->GetFileName(),&fileStatus))
00061 {
00062 timeBefore = fileStatus.st_mtime;
00063 }
00064 if (!m_VtkWriter->Write())
00065 {
00066 itkExceptionMacro(<<"Error during surface writing.");
00067 }
00068
00069 if (stat(m_VtkWriter->GetFileName(),&fileStatus)||(timeBefore==fileStatus.st_mtime))
00070 {
00071 itkExceptionMacro(<<"Error during surface writing: file could not be written");
00072 }
00073 }
00074
00075 template <class VTKWRITER>
00076 void mitk::UnstructuredGridVtkWriter<VTKWRITER>::GenerateData()
00077 {
00078 if ( m_FileName == "" )
00079 {
00080 itkWarningMacro( << "Sorry, filename has not been set!" );
00081 return ;
00082 }
00083
00084 mitk::UnstructuredGrid::Pointer input = const_cast<mitk::UnstructuredGrid*>(this->GetInput());
00085
00086 vtkTransformFilter* transformPointSet = vtkTransformFilter::New();
00087 vtkUnstructuredGrid * unstructuredGrid;
00088 Geometry3D* geometry;
00089
00090 if(input->GetTimeSlicedGeometry()->GetTimeSteps()>1)
00091 {
00092
00093 int t, timesteps;
00094
00095 timesteps = input->GetTimeSlicedGeometry()->GetTimeSteps();
00096 for(t = 0; t < timesteps; ++t)
00097 {
00098 ::itk::OStringStream filename;
00099 geometry = input->GetGeometry(t);
00100 if(input->GetTimeSlicedGeometry()->IsValidTime(t))
00101 {
00102 const mitk::TimeBounds& timebounds = geometry->GetTimeBounds();
00103 filename << m_FileName.c_str() << "_S" << std::setprecision(0) << timebounds[0] << "_E" << std::setprecision(0) << timebounds[1] << "_T" << t << m_Extension;
00104 }
00105 else
00106 {
00107 itkWarningMacro(<<"Error on write: TimeSlicedGeometry invalid of unstructured grid " << filename << ".");
00108 filename << m_FileName.c_str() << "_T" << t << m_Extension;
00109 }
00110 geometry->TransferItkToVtkTransform();
00111 transformPointSet->SetInput(input->GetVtkUnstructuredGrid(t));
00112 transformPointSet->SetTransform(geometry->GetVtkTransform());
00113 transformPointSet->UpdateWholeExtent();
00114 unstructuredGrid = static_cast<vtkUnstructuredGrid*>(transformPointSet->GetOutput());
00115
00116 m_VtkWriter->SetFileName(filename.str().c_str());
00117 #if VTK_MAJOR_VERSION >= 5
00118 m_VtkWriter->SetInput((vtkDataObject*)unstructuredGrid);
00119 #else
00120 m_VtkWriter->SetInput(unstructuredGrid);
00121 #endif
00122
00123 ExecuteWrite( m_VtkWriter, transformPointSet );
00124 }
00125 }
00126 else
00127 {
00128 geometry = input->GetGeometry();
00129 geometry->TransferItkToVtkTransform();
00130 transformPointSet->SetInput(input->GetVtkUnstructuredGrid());
00131 transformPointSet->SetTransform(geometry->GetVtkTransform());
00132 transformPointSet->UpdateWholeExtent();
00133 unstructuredGrid = static_cast<vtkUnstructuredGrid*>(transformPointSet->GetOutput());
00134
00135 m_VtkWriter->SetFileName(m_FileName.c_str());
00136 #if VTK_MAJOR_VERSION >= 5
00137 m_VtkWriter->SetInput((vtkDataObject*)unstructuredGrid);
00138 #else
00139 m_VtkWriter->SetInput(unstructuredGrid);
00140 #endif
00141
00142 ExecuteWrite( m_VtkWriter, transformPointSet );
00143 }
00144 transformPointSet->Delete();
00145 m_MimeType = "image/ug";
00146 }
00147
00148 template <class VTKWRITER>
00149 void mitk::UnstructuredGridVtkWriter<VTKWRITER>::SetInput( mitk::UnstructuredGrid* ug )
00150 {
00151 this->ProcessObject::SetNthInput( 0, ug );
00152 }
00153
00154 template <class VTKWRITER>
00155 const mitk::UnstructuredGrid* mitk::UnstructuredGridVtkWriter<VTKWRITER>::GetInput()
00156 {
00157 if ( this->GetNumberOfInputs() < 1 )
00158 {
00159 return NULL;
00160 }
00161 else
00162 {
00163 return static_cast< const mitk::UnstructuredGrid * >( this->ProcessObject::GetInput( 0 ) );
00164 }
00165 }
00166
00167 template <class VTKWRITER>
00168 bool mitk::UnstructuredGridVtkWriter<VTKWRITER>::CanWriteDataType( DataNode* input )
00169 {
00170 if ( input )
00171 {
00172 mitk::BaseData* data = input->GetData();
00173 if ( data )
00174 {
00175 mitk::UnstructuredGrid::Pointer ug = dynamic_cast<mitk::UnstructuredGrid*>( data );
00176 if( ug.IsNotNull() )
00177 {
00178 SetDefaultExtension();
00179 return true;
00180 }
00181 }
00182 }
00183 return false;
00184 }
00185
00186 template <class VTKWRITER>
00187 void mitk::UnstructuredGridVtkWriter<VTKWRITER>::SetInput( DataNode* input )
00188 {
00189 if( input && CanWriteDataType( input ) )
00190 SetInput( dynamic_cast<mitk::UnstructuredGrid*>( input->GetData() ) );
00191 }
00192
00193 template <class VTKWRITER>
00194 std::string mitk::UnstructuredGridVtkWriter<VTKWRITER>::GetWritenMIMEType()
00195 {
00196 return m_MimeType;
00197 }
00198
00199 template <class VTKWRITER>
00200 std::string mitk::UnstructuredGridVtkWriter<VTKWRITER>::GetFileExtension()
00201 {
00202 return m_Extension;
00203 }