Dear List,
I've written a Plugin to read custom text files.
I'm using vtkPolyDataAlgorithm as Master-Class.
The code compiles fine and my Plugin is working in Paraview 3.12.
But if the plugin is active, it's not possible to open legecy VTK
files, because everytime my own reader class is used.
I think I should use another Superclass, but don't know which one I
should shoose.
I attached you the source code.
Thanks for help,
C. Richter
#include "vtkCSVImageReader.h"
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkObjectFactory.h"
#include "vtkDataArray.h"
#include "vtkImageData.h"
#include "vtkPointData.h"
#include "vtkStreamingDemandDrivenPipeline.h"
#include "vtkTable.h"
#include "vtkVariant.h"
#include "vtkObject.h"
#include "vtkSmartPointer.h"
#include "vtkStreamingDemandDrivenPipeline.h"
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkObjectFactory.h"
#include "vtkByteSwap.h"
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkCellArray.h"
#include "vtkDataArray.h"
#include "vtkDoubleArray.h"
#include "vtkIntArray.h"
#include "vtkFloatArray.h"
#include <vtkstd/algorithm>
#include <vtkstd/vector>
#include <vtkstd/string>
#include <vtksys/ios/sstream>
vtkCxxRevisionMacro(vtkCSVImageReader, "$Revision: 0.5 $");
vtkStandardNewMacro(vtkCSVImageReader);
vtkCSVImageReader::vtkCSVImageReader()
{
this->FileName = 0;
this->File=0;
this->SetNumberOfInputPorts(0);
this->SetNumberOfOutputPorts(1);
}
vtkCSVImageReader::~vtkCSVImageReader()
{
if (this->File)
{
this->File->close();
delete this->File;
this->File = NULL;
}
this->SetFileName(0);
}
void vtkCSVImageReader::OpenFile()
{
if (!this->FileName)
{
vtkErrorMacro(<<"FileName must be specified.");
return;
}
// If the file was open close it.
if (this->File)
{
this->File->close();
delete this->File;
this->File = NULL;
}
// Open the new file.
#ifdef _WIN32
this->File = new ifstream(this->FileName, ios::in | ios::binary);
#else
this->File = new ifstream(this->FileName, ios::in);
#endif
if (! this->File || this->File->fail())
{
vtkErrorMacro(<< "Initialize: Could not open file " << this->FileName);
return;
}
}
int vtkCSVImageReader::RequestData(vtkInformation *request,
vtkInformationVector **inputVector, vtkInformationVector *outputVector)
{
this->OpenFile();
char line[256]; //increase to get more chars !
this->File->getline(line,sizeof(line),'\r\n');
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
points->SetDataTypeToFloat();
points->Reset();
vtkSmartPointer<vtkFloatArray> PointID =
vtkSmartPointer<vtkFloatArray>::New();
PointID->SetNumberOfComponents(1);
PointID->Reset();
PointID->SetName("Point ID");
PointID->SetComponentName(0,"Point ID");
vtkSmartPointer<vtkFloatArray> scalars =
vtkSmartPointer<vtkFloatArray>::New();
scalars->SetNumberOfComponents(1);
scalars->Reset();
scalars->SetName("Scalars");
scalars->SetComponentName(0,"Scalar");
vtkSmartPointer<vtkFloatArray> colors =
vtkSmartPointer<vtkFloatArray>::New();
colors->SetNumberOfComponents(4);
colors->SetComponentName(0,"Color 1");
colors->SetComponentName(1,"Color 2");
colors->SetComponentName(2,"Color 3");
colors->SetComponentName(3,"Color 4");
colors->SetName("color");
vtkSmartPointer<vtkFloatArray> v = vtkSmartPointer<vtkFloatArray>::New();
v->SetNumberOfComponents(3);
v->SetComponentName(0,"X");
v->SetComponentName(0,"Y");
v->SetComponentName(0,"Z");
v->SetName("v");
vtkSmartPointer<vtkFloatArray> w = vtkSmartPointer<vtkFloatArray>::New();
w->SetNumberOfComponents(3);
w->SetComponentName(0,"X");
w->SetComponentName(0,"Y");
w->SetComponentName(0,"Z");
w->SetName("omega");
vtkSmartPointer<vtkFloatArray> radius =
vtkSmartPointer<vtkFloatArray>::New();
radius->SetNumberOfComponents(1);
radius->SetName("radius");
float val[3];
val[0]=val[1]=val[2]=0;
float scal[1];
scal[0]=0;
float vel[3];
vel[0]=vel[1]=vel[2]=0;
float omega[3];
omega[0]=omega[1]=omega[2]=0;
float c[4];
c[0]=c[1]=c[2]=c[3]=0;
int lc=0;
while ( this->File->getline(line,sizeof(line),'\r\n') ) {
if (int(line[1])!=0) {
int l = sizeof(line);
int numberOfNumbers = 0;
//Alle Leerzeichen durch '\0' = StringEnde ersetzen
for (int i = 0; i < l; i++)
{
if (line[i] == ' ')
{
line[i] = '\0';
numberOfNumbers++;
}
}
//Pointer auf den ersten Zahlenstring setzen
char* startp = line;
double id = atof(startp);
startp += strlen(startp) + 1;
PointID->InsertNextTuple1(id);
//position
for (int i = 0; i < 3; i++)
{
//Umwandlung nach double
double d = atof(startp);
val[i]=d;
//Auf den Beginn des n�chsten Zahlenstrings setzen
startp += strlen(startp) + 1;
}
points->InsertNextPoint(val[0], val[1], val[2]);
//radius
double rad = atof(startp);
startp += strlen(startp) + 1;
radius->InsertNextTuple1(rad);
//velocity
for (int i = 0; i < 3; i++)
{
//Umwandlung nach double
double d = atof(startp);
vel[i]=d;
//Auf den Beginn des n�chsten Zahlenstrings setzen
startp += strlen(startp) + 1;
}
v->InsertNextTuple(vel);
//omega
for (int i = 0; i < 3; i++)
{
//Umwandlung nach double
double d = atof(startp);
omega[i]=d;
//Auf den Beginn des n�chsten Zahlenstrings setzen
startp += strlen(startp) + 1;
}
w->InsertNextTuple(omega);
//scalar
double sc = atof(startp);
startp += strlen(startp) + 1;
scalars->InsertNextTuple1(sc);
//colors
for (int i = 1; i <= 4; i++)
{
//Umwandlung nach double
double d = atof(startp);
c[i]=d;
//Auf den Beginn des n�chsten Zahlenstrings setzen
startp += strlen(startp) + 1;
}
colors->InsertNextTuple(c);
lc++;
} //endif
}
vtkSmartPointer<vtkCellArray> vertices =
vtkSmartPointer<vtkCellArray>::New();
vertices->Reset();
this->NumberOfPoints = points->GetNumberOfPoints();
for( vtkIdType j = 0; j < (vtkIdType)this->NumberOfPoints; ++j )
{
vertices->InsertNextCell( 1 );
vertices->InsertCellPoint( j );
}
// get the info object
vtkInformation *outInfo = outputVector->GetInformationObject(0);
// get the ouptut
vtkPolyData *myoutput = vtkPolyData::SafeDownCast(
outInfo->Get(vtkDataObject::DATA_OBJECT()));
myoutput->SetPoints(points);
myoutput->SetVerts(vertices);
myoutput->GetPointData()->AddArray(PointID);
myoutput->GetPointData()->AddArray(radius);
myoutput->GetPointData()->AddArray(v);
myoutput->GetPointData()->AddArray(w);
myoutput->GetPointData()->AddArray(scalars);
myoutput->GetPointData()->AddArray(colors);
myoutput->Modified();
return 1;
}
int vtkCSVImageReader::RequestInformation(vtkInformation *request,
vtkInformationVector **inputVector, vtkInformationVector *outputVector)
{
vtkInformation *outInfo = outputVector->GetInformationObject(0);
outInfo->Set(vtkStreamingDemandDrivenPipeline::MAXIMUM_NUMBER_OF_PIECES(),
-1);
return 1;
}
void vtkCSVImageReader::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
os << indent << "FileName: "
<< (this->FileName ? this->FileName : "(NULL)") << endl;
}
int vtkCSVImageReader::CanReadFile(const char *fname)
{
return 1;
}
#ifndef _vtkCSVImageReader_h
#define _vtkCSVImageReader_h
//#include "vtkImageAlgorithm.h"
#include <vtkPolyDataAlgorithm.h>
//#include <vtkImageAlgorithm.h>
class VTK_EXPORT vtkCSVImageReader : public vtkPolyDataAlgorithm
{
public:
static vtkCSVImageReader *New();
vtkTypeRevisionMacro(vtkCSVImageReader,vtkPolyDataAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent);
// Specify file name.
vtkSetStringMacro(FileName);
vtkGetStringMacro(FileName);
int CanReadFile(const char* fname);
protected:
vtkCSVImageReader();
~vtkCSVImageReader();
int RequestInformation(vtkInformation *, vtkInformationVector **,
vtkInformationVector *);
int RequestData(vtkInformation *, vtkInformationVector **,
vtkInformationVector *);
int Canreadfile(const char *fname);
char *FileName;
char *FieldDelimiterCharacters;
size_t NumberOfPoints;
void OpenFile();
ifstream *File;
private:
vtkCSVImageReader(const vtkCSVImageReader&);
void operator = (const vtkCSVImageReader&);
};
#endif
<ServerManagerConfiguration>
<ProxyGroup name="internal_sources">
<SourceProxy name="legacyreader"
class="vtkCSVImageReader"
label="CeParTec Reader">
<StringVectorProperty
name="FileName"
animateable="0"
command="SetFileName"
number_of_elements="1">
<FileListDomain name="files"/>
<Documentation>
This property specifies the file name for the reader.
</Documentation>
</StringVectorProperty>
<Hints>
<ReaderFactory extensions="txt"
file_description="CeParTec files" />
</Hints>
</SourceProxy>
</ProxyGroup>
<ProxyGroup name="sources">
<SourceProxy name="CeParTecReader"
si_class="vtkSIFileSeriesReaderProxy"
class="vtkFileSeriesReader"
file_name_method="SetFileName">
<SubProxy>
<Proxy name="Reader"
proxygroup="internal_sources"
proxyname="legacyreader">
<!--proxygroup="sources" proxyname="PhysicsReader"> -->
</Proxy>
</SubProxy>
<StringVectorProperty name="FileNames"
clean_command="RemoveAllFileNames"
command="AddFileName"
animateable="0"
number_of_elements="0"
repeat_command="1">
<FileListDomain name="files" />
<Documentation>
The file or list of files to be read by the reader.
A list of files will be sequenced over time.
</Documentation>
</StringVectorProperty>
<DoubleVectorProperty name="TimestepValues"
repeatable="1"
information_only="1">
<TimeStepsInformationHelper />
<Documentation>
Available timestep values.
</Documentation>
</DoubleVectorProperty>
<Hints>
<ReaderFactory extensions="txt"
file_description="CeParTec files" />
</Hints>
</SourceProxy>
</ProxyGroup>
</ServerManagerConfiguration>
<ParaViewReaders>
<!-- No information about file extension association -->
<Proxy group="sources" name="CeParTecReader" />
</ParaViewReaders>
<!-- EOF -->
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the ParaView Wiki at:
http://paraview.org/Wiki/ParaView
Follow this link to subscribe/unsubscribe:
http://www.paraview.org/mailman/listinfo/paraview