/
vtp2multi-piece_vtp.cxx
104 lines (76 loc) · 3.36 KB
/
vtp2multi-piece_vtp.cxx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
////program to write a VTP-file as a multi-piece VTP-file (that can be streamed)
//01: based on vtp2pvtp.cxx
#include <vtkSmartPointer.h>
#include <vtkXMLPolyDataReader.h>
#include <vtkExtractPolyDataPiece.h>//opposite of vtkPolyDataStreamer, use vtkDistributedDataFilter (D3) for more equally sized pieces
#include <vtkPieceScalars.h>
#include <vtkXMLPolyDataWriter.h>
#include <vtkCallbackCommand.h>
#include <vtkCommand.h>
#define VTK_CREATE(type, name) vtkSmartPointer<type> name = vtkSmartPointer<type>::New()
void FilterEventHandlerVTK(vtkObject* caller, long unsigned int eventId, void* clientData, void* callData){
vtkAlgorithm *filter= static_cast<vtkAlgorithm*>(caller);
switch(eventId){
case vtkCommand::ProgressEvent:
fprintf(stderr, "\r%s progress: %5.1f%%", filter->GetClassName(), 100.0 * filter->GetProgress());//stderr is flushed directly
break;
case vtkCommand::EndEvent:
std::cerr << std::endl << std::flush;
break;
//// VTK does not throw errors (http://public.kitware.com/pipermail/vtkusers/2009-February/050805.html) use Error-Events: http://www.cmake.org/Wiki/VTK/Examples/Cxx/Utilities/ObserveError
case vtkCommand::ErrorEvent:
std::cerr << "Error: " << static_cast<char*>(callData) << std::endl << std::flush;
break;
case vtkCommand::WarningEvent:
std::cerr << "Warning: " << static_cast<char*>(callData) << std::endl << std::flush;
break;
}
}
int main (int argc, char *argv[]){
if (argc != 5){
std::cerr << "Usage: " << argv[0]
<< " input"
<< " output"
<< " compress"
<< " #pieces"
<< std::endl;
return EXIT_FAILURE;
}
if(!(strcasestr(argv[1],".vtp"))) {
std::cerr << "The input should end with .vtp" << std::endl;
return -1;
}
if(!(strcasestr(argv[2],".vtp"))) {
std::cerr << "The output should end with .vtp" << std::endl;
return -1;
}
VTK_CREATE(vtkCallbackCommand, eventCallbackVTK);
eventCallbackVTK->SetCallback(FilterEventHandlerVTK);
VTK_CREATE(vtkXMLPolyDataReader, reader);
reader->SetFileName(argv[1]);
reader->AddObserver(vtkCommand::AnyEvent, eventCallbackVTK);
reader->UpdateInformation();
VTK_CREATE(vtkExtractPolyDataPiece, filter);
filter->SetInputConnection(reader->GetOutputPort());
filter->AddObserver(vtkCommand::AnyEvent, eventCallbackVTK);
// filter->Update(); //this is called by writer
VTK_CREATE(vtkPieceScalars, ps);
ps->SetInputConnection(filter->GetOutputPort());
ps->SetScalarModeToPointData();// pointData can be rendered much faster in paraview
ps->AddObserver(vtkCommand::AnyEvent, eventCallbackVTK);
int numPieces= atoi(argv[4]);
VTK_CREATE(vtkXMLPolyDataWriter, writer);
writer->SetInputConnection(ps->GetOutputPort());
writer->SetFileName(argv[2]);
writer->SetHeaderTypeToUInt64();
writer->SetNumberOfPieces(numPieces);
//writer->SetGhostLevel(atoi(argv[5]));
writer->SetDataModeToBinary();//SetDataModeToAscii()//SetDataModeToAppended()
if(atoi(argv[3]))
writer->SetCompressorTypeToZLib();//default
else
writer->SetCompressorTypeToNone();
writer->AddObserver(vtkCommand::AnyEvent, eventCallbackVTK);
writer->Write();
return EXIT_SUCCESS;
}