You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/3rd/VTK7.1/source/VTK-7.1.1/IO/Legacy/vtkGenericDataObjectReader.cxx

546 lines
15 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkGenericDataObjectReader.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "vtkGenericDataObjectReader.h"
#include "vtkCompositeDataReader.h"
#include "vtkDirectedGraph.h"
#include "vtkGraph.h"
#include "vtkGraphReader.h"
#include "vtkHierarchicalBoxDataSet.h"
#include "vtkImageData.h"
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkMolecule.h"
#include "vtkMultiBlockDataSet.h"
#include "vtkMultiPieceDataSet.h"
#include "vtkNonOverlappingAMR.h"
#include "vtkObjectFactory.h"
#include "vtkOverlappingAMR.h"
#include "vtkPolyData.h"
#include "vtkPolyDataReader.h"
#include "vtkRectilinearGrid.h"
#include "vtkRectilinearGridReader.h"
#include "vtkStreamingDemandDrivenPipeline.h"
#include "vtkStructuredGrid.h"
#include "vtkStructuredGridReader.h"
#include "vtkStructuredPoints.h"
#include "vtkStructuredPointsReader.h"
#include "vtkTable.h"
#include "vtkTableReader.h"
#include "vtkTree.h"
#include "vtkTreeReader.h"
#include "vtkUndirectedGraph.h"
#include "vtkUnstructuredGrid.h"
#include "vtkUnstructuredGridReader.h"
vtkStandardNewMacro(vtkGenericDataObjectReader);
template<typename ReaderT, typename DataT>
void vtkGenericDataObjectReader::ReadData(const char* DataClass, vtkDataObject* Output)
{
ReaderT* const reader = ReaderT::New();
reader->SetFileName(this->GetFileName());
reader->SetInputArray(this->GetInputArray());
reader->SetInputString(this->GetInputString(),
this->GetInputStringLength());
reader->SetReadFromInputString(this->GetReadFromInputString());
reader->SetScalarsName(this->GetScalarsName());
reader->SetVectorsName(this->GetVectorsName());
reader->SetNormalsName(this->GetNormalsName());
reader->SetTensorsName(this->GetTensorsName());
reader->SetTCoordsName(this->GetTCoordsName());
reader->SetLookupTableName(this->GetLookupTableName());
reader->SetFieldDataName(this->GetFieldDataName());
reader->SetReadAllScalars(this->GetReadAllScalars());
reader->SetReadAllVectors(this->GetReadAllVectors());
reader->SetReadAllNormals(this->GetReadAllNormals());
reader->SetReadAllTensors(this->GetReadAllTensors());
reader->SetReadAllColorScalars(this->GetReadAllColorScalars());
reader->SetReadAllTCoords(this->GetReadAllTCoords());
reader->SetReadAllFields(this->GetReadAllFields());
reader->Update();
// copy the header from the reader.
this->SetHeader(reader->GetHeader());
// Can we use the old output?
if(!(Output && strcmp(Output->GetClassName(), DataClass) == 0))
{
// Hack to make sure that the object is not modified
// with SetNthOutput. Otherwise, extra executions occur.
const vtkTimeStamp mtime = this->MTime;
Output = DataT::New();
this->GetExecutive()->SetOutputData(0, Output);
Output->Delete();
this->MTime = mtime;
}
Output->ShallowCopy(reader->GetOutput());
reader->Delete();
}
vtkGenericDataObjectReader::vtkGenericDataObjectReader()
{
}
vtkGenericDataObjectReader::~vtkGenericDataObjectReader()
{
}
int vtkGenericDataObjectReader::RequestDataObject(
vtkInformation* /*information*/,
vtkInformationVector** /*inputVector*/,
vtkInformationVector* outputVector)
{
if(this->GetFileName() == NULL &&
(this->GetReadFromInputString() == 0 ||
(this->GetInputArray() == NULL && this->GetInputString() == NULL)))
{
vtkWarningMacro(<< "FileName must be set");
return 0;
}
int outputType = this->ReadOutputType();
vtkInformation* const info = outputVector->GetInformationObject(0);
vtkDataObject* output = info->Get(vtkDataObject::DATA_OBJECT());
if(output && (output->GetDataObjectType() == outputType))
{
return 1;
}
if(!output || output->GetDataObjectType() != outputType)
{
switch (outputType)
{
case VTK_DIRECTED_GRAPH:
output = vtkDirectedGraph::New();
break;
case VTK_MOLECULE:
case VTK_UNDIRECTED_GRAPH:
output = vtkUndirectedGraph::New();
break;
case VTK_IMAGE_DATA:
output = vtkImageData::New();
break;
case VTK_POLY_DATA:
output = vtkPolyData::New();
break;
case VTK_RECTILINEAR_GRID:
output = vtkRectilinearGrid::New();
break;
case VTK_STRUCTURED_GRID:
output = vtkStructuredGrid::New();
break;
case VTK_STRUCTURED_POINTS:
output = vtkStructuredPoints::New();
break;
case VTK_TABLE:
output = vtkTable::New();
break;
case VTK_TREE:
output = vtkTree::New();
break;
case VTK_UNSTRUCTURED_GRID:
output = vtkUnstructuredGrid::New();
break;
case VTK_MULTIBLOCK_DATA_SET:
output = vtkMultiBlockDataSet::New();
break;
case VTK_MULTIPIECE_DATA_SET:
output = vtkMultiPieceDataSet::New();
break;
case VTK_HIERARCHICAL_BOX_DATA_SET:
output = vtkHierarchicalBoxDataSet::New();
break;
case VTK_OVERLAPPING_AMR:
output = vtkOverlappingAMR::New();
break;
case VTK_NON_OVERLAPPING_AMR:
output = vtkNonOverlappingAMR::New();
break;
default:
return 0;
}
info->Set(vtkDataObject::DATA_OBJECT(), output);
output->Delete();
}
return 1;
}
int vtkGenericDataObjectReader::RequestInformation(
vtkInformation* /*information*/,
vtkInformationVector** /*inputVector*/,
vtkInformationVector* outputVector)
{
vtkInformation *outInfo = outputVector->GetInformationObject(0);
if(this->GetFileName() == NULL &&
(this->GetReadFromInputString() == 0 ||
(this->GetInputArray() == NULL && this->GetInputString() == NULL)))
{
vtkWarningMacro(<< "FileName must be set");
return 0;
}
vtkDataReader *reader = 0;
int retVal;
switch (this->ReadOutputType())
{
case VTK_MOLECULE:
case VTK_UNDIRECTED_GRAPH:
case VTK_DIRECTED_GRAPH:
reader = vtkGraphReader::New();
break;
case VTK_IMAGE_DATA:
reader = vtkStructuredPointsReader::New();
break;
case VTK_POLY_DATA:
reader = vtkPolyDataReader::New();
break;
case VTK_RECTILINEAR_GRID:
reader = vtkRectilinearGridReader::New();
break;
case VTK_STRUCTURED_GRID:
reader = vtkStructuredGridReader::New();
break;
case VTK_STRUCTURED_POINTS:
reader = vtkStructuredPointsReader::New();
break;
case VTK_TABLE:
reader = vtkTableReader::New();
break;
case VTK_TREE:
reader = vtkTreeReader::New();
break;
case VTK_UNSTRUCTURED_GRID:
reader = vtkUnstructuredGridReader::New();
break;
case VTK_MULTIBLOCK_DATA_SET:
case VTK_HIERARCHICAL_BOX_DATA_SET:
case VTK_MULTIPIECE_DATA_SET:
case VTK_OVERLAPPING_AMR:
case VTK_NON_OVERLAPPING_AMR:
reader = vtkCompositeDataReader::New();
break;
default:
reader = NULL;
}
if(reader)
{
reader->SetFileName(this->GetFileName());
reader->SetReadFromInputString(this->GetReadFromInputString());
reader->SetInputArray(this->GetInputArray());
reader->SetInputString(this->GetInputString());
retVal = reader->ReadMetaData(outInfo);
reader->Delete();
return retVal;
}
return 1;
}
int vtkGenericDataObjectReader::RequestData(
vtkInformation *,
vtkInformationVector **,
vtkInformationVector *outputVector)
{
vtkInformation *outInfo = outputVector->GetInformationObject(0);
vtkDataObject *output = outInfo->Get(vtkDataObject::DATA_OBJECT());
vtkDebugMacro(<<"Reading vtk dataset...");
switch (this->ReadOutputType())
{
case VTK_MOLECULE:
{
this->ReadData<vtkGraphReader, vtkMolecule>("vtkMolecule", output);
return 1;
}
case VTK_DIRECTED_GRAPH:
{
this->ReadData<vtkGraphReader, vtkDirectedGraph>("vtkDirectedGraph", output);
return 1;
}
case VTK_UNDIRECTED_GRAPH:
{
this->ReadData<vtkGraphReader, vtkUndirectedGraph>("vtkUndirectedGraph", output);
return 1;
}
case VTK_IMAGE_DATA:
{
this->ReadData<vtkStructuredPointsReader, vtkImageData>("vtkImageData", output);
return 1;
}
case VTK_POLY_DATA:
{
this->ReadData<vtkPolyDataReader, vtkPolyData>("vtkPolyData", output);
return 1;
}
case VTK_RECTILINEAR_GRID:
{
this->ReadData<vtkRectilinearGridReader, vtkRectilinearGrid>("vtkRectilinearGrid", output);
return 1;
}
case VTK_STRUCTURED_GRID:
{
this->ReadData<vtkStructuredGridReader, vtkStructuredGrid>("vtkStructuredGrid", output);
return 1;
}
case VTK_STRUCTURED_POINTS:
{
this->ReadData<vtkStructuredPointsReader, vtkStructuredPoints>("vtkStructuredPoints", output);
return 1;
}
case VTK_TABLE:
{
this->ReadData<vtkTableReader, vtkTable>("vtkTable", output);
return 1;
}
case VTK_TREE:
{
this->ReadData<vtkTreeReader, vtkTree>("vtkTree", output);
return 1;
}
case VTK_UNSTRUCTURED_GRID:
{
this->ReadData<vtkUnstructuredGridReader, vtkUnstructuredGrid>("vtkUnstructuredGrid", output);
return 1;
}
case VTK_MULTIBLOCK_DATA_SET:
{
this->ReadData<vtkCompositeDataReader, vtkMultiBlockDataSet>(
"vtkMultiBlockDataSet", output);
return 1;
}
case VTK_MULTIPIECE_DATA_SET:
{
this->ReadData<vtkCompositeDataReader, vtkMultiPieceDataSet>(
"vtkMultiPieceDataSet", output);
return 1;
}
case VTK_HIERARCHICAL_BOX_DATA_SET:
{
this->ReadData<vtkCompositeDataReader, vtkHierarchicalBoxDataSet>(
"vtkHierarchicalBoxDataSet", output);
return 1;
}
case VTK_OVERLAPPING_AMR:
{
this->ReadData<vtkCompositeDataReader, vtkOverlappingAMR>(
"vtkHierarchicalBoxDataSet", output);
return 1;
}
case VTK_NON_OVERLAPPING_AMR:
{
this->ReadData<vtkCompositeDataReader, vtkNonOverlappingAMR>(
"vtkHierarchicalBoxDataSet", output);
return 1;
}
default:
vtkErrorMacro("Could not read file " << this->FileName);
}
return 0;
}
int vtkGenericDataObjectReader::ReadOutputType()
{
char line[256];
vtkDebugMacro(<<"Reading vtk data object...");
if(!this->OpenVTKFile() || !this->ReadHeader())
{
return -1;
}
// Determine dataset type
//
if(!this->ReadString(line))
{
vtkDebugMacro(<< "Premature EOF reading dataset keyword");
return -1;
}
if(!strncmp(this->LowerCase(line),"dataset",static_cast<unsigned long>(7)))
{
// See iftype is recognized.
//
if(!this->ReadString(line))
{
vtkDebugMacro(<< "Premature EOF reading type");
this->CloseVTKFile ();
return -1;
}
this->CloseVTKFile();
if(!strncmp(this->LowerCase(line), "molecule", 8))
{
return VTK_MOLECULE;
}
if(!strncmp(this->LowerCase(line), "directed_graph", 14))
{
return VTK_DIRECTED_GRAPH;
}
if(!strncmp(this->LowerCase(line), "undirected_graph", 16))
{
return VTK_UNDIRECTED_GRAPH;
}
if(!strncmp(this->LowerCase(line), "polydata",8))
{
return VTK_POLY_DATA;
}
if(!strncmp(this->LowerCase(line), "rectilinear_grid",16))
{
return VTK_RECTILINEAR_GRID;
}
if(!strncmp(this->LowerCase(line), "structured_grid",15))
{
return VTK_STRUCTURED_GRID;
}
if(!strncmp(this->LowerCase(line), "structured_points",17))
{
return VTK_STRUCTURED_POINTS;
}
if(!strncmp(this->LowerCase(line), "table", 5))
{
return VTK_TABLE;
}
if(!strncmp(this->LowerCase(line), "tree", 4))
{
return VTK_TREE;
}
if(!strncmp(this->LowerCase(line), "unstructured_grid",17))
{
return VTK_UNSTRUCTURED_GRID;
}
if(!strncmp(this->LowerCase(line), "multiblock", strlen("multiblock")))
{
return VTK_MULTIBLOCK_DATA_SET;
}
if(!strncmp(this->LowerCase(line), "multipiece", strlen("multipiece")))
{
return VTK_MULTIPIECE_DATA_SET;
}
if(!strncmp(this->LowerCase(line), "hierarchical_box",
strlen("hierarchical_box")))
{
return VTK_HIERARCHICAL_BOX_DATA_SET;
}
if (strncmp(this->LowerCase(line), "overlapping_amr", strlen("overlapping_amr")) == 0)
{
return VTK_OVERLAPPING_AMR;
}
if (strncmp(this->LowerCase(line), "non_overlapping_amr", strlen("non_overlapping_amr")) == 0)
{
return VTK_NON_OVERLAPPING_AMR;
}
vtkDebugMacro(<< "Cannot read dataset type: " << line);
return -1;
}
else if(!strncmp(this->LowerCase(line),"field",static_cast<unsigned long>(5)))
{
vtkDebugMacro(<<"This object can only read data objects, not fields");
}
else
{
vtkDebugMacro(<<"Expecting DATASET keyword, got " << line << " instead");
}
return -1;
}
vtkGraph *vtkGenericDataObjectReader::GetGraphOutput()
{
return vtkGraph::SafeDownCast(this->GetOutput());
}
vtkMolecule *vtkGenericDataObjectReader::GetMoleculeOutput()
{
return vtkMolecule::SafeDownCast(this->GetOutput());
}
vtkPolyData *vtkGenericDataObjectReader::GetPolyDataOutput()
{
return vtkPolyData::SafeDownCast(this->GetOutput());
}
vtkRectilinearGrid *vtkGenericDataObjectReader::GetRectilinearGridOutput()
{
return vtkRectilinearGrid::SafeDownCast(this->GetOutput());
}
vtkStructuredGrid *vtkGenericDataObjectReader::GetStructuredGridOutput()
{
return vtkStructuredGrid::SafeDownCast(this->GetOutput());
}
vtkStructuredPoints *vtkGenericDataObjectReader::GetStructuredPointsOutput()
{
return vtkStructuredPoints::SafeDownCast(this->GetOutput());
}
vtkTable *vtkGenericDataObjectReader::GetTableOutput()
{
return vtkTable::SafeDownCast(this->GetOutput());
}
vtkTree *vtkGenericDataObjectReader::GetTreeOutput()
{
return vtkTree::SafeDownCast(this->GetOutput());
}
vtkUnstructuredGrid *vtkGenericDataObjectReader::GetUnstructuredGridOutput()
{
return vtkUnstructuredGrid::SafeDownCast(this->GetOutput());
}
void vtkGenericDataObjectReader::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os,indent);
}
vtkDataObject *vtkGenericDataObjectReader::GetOutput()
{
return this->GetOutputDataObject(0);
}
vtkDataObject *vtkGenericDataObjectReader::GetOutput(int idx)
{
return this->GetOutputDataObject(idx);
}
int vtkGenericDataObjectReader::FillOutputPortInformation(int, vtkInformation *info)
{
info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkDataObject");
return 1;
}
int vtkGenericDataObjectReader::ProcessRequest(vtkInformation* request,
vtkInformationVector** inputVector,
vtkInformationVector* outputVector)
{
// generate the data
if(request->Has(vtkDemandDrivenPipeline::REQUEST_DATA_OBJECT()))
{
return this->RequestDataObject(request, inputVector, outputVector);
}
return this->Superclass::ProcessRequest(request, inputVector, outputVector);
}