You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
4.5 KiB
196 lines
4.5 KiB
2 years ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: $RCSfile: vtkWriter.cxx,v $
|
||
|
|
||
|
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 "vtkWriter.h"
|
||
|
|
||
|
#include "vtkCommand.h"
|
||
|
#include "vtkDataObject.h"
|
||
|
#include "vtkDemandDrivenPipeline.h"
|
||
|
#include "vtkErrorCode.h"
|
||
|
#include "vtkInformation.h"
|
||
|
#include "vtkInformationVector.h"
|
||
|
|
||
|
vtkCxxRevisionMacro(vtkWriter, "$Revision: 1.43 $");
|
||
|
|
||
|
// Construct with no start and end write methods or arguments.
|
||
|
vtkWriter::vtkWriter()
|
||
|
{
|
||
|
this->SetNumberOfInputPorts(1);
|
||
|
this->SetNumberOfOutputPorts(0);
|
||
|
}
|
||
|
|
||
|
vtkWriter::~vtkWriter()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void vtkWriter::SetInput(vtkDataObject *input)
|
||
|
{
|
||
|
this->SetInput(0, input);
|
||
|
}
|
||
|
|
||
|
void vtkWriter::SetInput(int index, vtkDataObject *input)
|
||
|
{
|
||
|
if (input)
|
||
|
{
|
||
|
this->SetInputConnection(index, input->GetProducerPort());
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Setting a NULL input remove the connection.
|
||
|
this->SetInputConnection(index, 0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
vtkDataObject *vtkWriter::GetInput()
|
||
|
{
|
||
|
return this->GetInput(0);
|
||
|
}
|
||
|
|
||
|
vtkDataObject *vtkWriter::GetInput(int port)
|
||
|
{
|
||
|
if (this->GetNumberOfInputConnections(port) < 1)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
return this->GetExecutive()->GetInputData(port, 0);
|
||
|
}
|
||
|
|
||
|
|
||
|
// Write data to output. Method executes subclasses WriteData() method, as
|
||
|
// well as StartMethod() and EndMethod() methods.
|
||
|
int vtkWriter::Write()
|
||
|
{
|
||
|
// Make sure we have input.
|
||
|
if (this->GetNumberOfInputConnections(0) < 1)
|
||
|
{
|
||
|
vtkErrorMacro("No input provided!");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// always write even if the data hasn't changed
|
||
|
this->Modified();
|
||
|
this->UpdateWholeExtent();
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
int vtkWriter::ProcessRequest(vtkInformation *request,
|
||
|
vtkInformationVector **inputVector,
|
||
|
vtkInformationVector *outputVector)
|
||
|
{
|
||
|
// generate the data
|
||
|
if(request->Has(vtkDemandDrivenPipeline::REQUEST_DATA()))
|
||
|
{
|
||
|
return this->RequestData(request, inputVector, outputVector);
|
||
|
}
|
||
|
|
||
|
return this->Superclass::ProcessRequest(request, inputVector, outputVector);
|
||
|
}
|
||
|
|
||
|
int vtkWriter::RequestData(
|
||
|
vtkInformation *,
|
||
|
vtkInformationVector **,
|
||
|
vtkInformationVector *)
|
||
|
{
|
||
|
this->SetErrorCode(vtkErrorCode::NoError);
|
||
|
|
||
|
vtkDataObject *input = this->GetInput();
|
||
|
int idx;
|
||
|
|
||
|
// make sure input is available
|
||
|
if ( !input )
|
||
|
{
|
||
|
vtkErrorMacro(<< "No input!");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
for (idx = 0; idx < this->GetNumberOfInputPorts(); ++idx)
|
||
|
{
|
||
|
if (this->GetInput(idx) != NULL)
|
||
|
{
|
||
|
this->GetInput(idx)->Update();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
unsigned long lastUpdateTime = this->GetInput(0)->GetUpdateTime();
|
||
|
for (idx = 1; idx < this->GetNumberOfInputPorts(); ++idx)
|
||
|
{
|
||
|
unsigned long updateTime = this->GetInput(idx)->GetUpdateTime();
|
||
|
if ( updateTime > lastUpdateTime )
|
||
|
{
|
||
|
lastUpdateTime = updateTime;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (lastUpdateTime < this->WriteTime && this->GetMTime() < this->WriteTime)
|
||
|
{
|
||
|
// we are up to date
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
this->InvokeEvent(vtkCommand::StartEvent,NULL);
|
||
|
this->WriteData();
|
||
|
this->InvokeEvent(vtkCommand::EndEvent,NULL);
|
||
|
|
||
|
// Release any inputs if marked for release
|
||
|
for (idx = 0; idx < this->GetNumberOfInputPorts(); ++idx)
|
||
|
{
|
||
|
if (this->GetInput(idx) && this->GetInput(idx)->ShouldIReleaseData())
|
||
|
{
|
||
|
this->GetInput(idx)->ReleaseData();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this->WriteTime.Modified();
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
void vtkWriter::PrintSelf(ostream& os, vtkIndent indent)
|
||
|
{
|
||
|
this->Superclass::PrintSelf(os,indent);
|
||
|
|
||
|
}
|
||
|
|
||
|
void vtkWriter::EncodeArrayName(char* resname, const char* name)
|
||
|
{
|
||
|
if ( !name || !resname )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
int cc = 0;
|
||
|
ostrstream str;
|
||
|
|
||
|
char buffer[10];
|
||
|
|
||
|
while( name[cc] )
|
||
|
{
|
||
|
// Encode spaces and %'s (and most non-printable ascii characters)
|
||
|
// The reader does not support spaces in array names.
|
||
|
if ( name[cc] < 33 || name[cc] > 126 ||
|
||
|
name[cc] == '\"' || name[cc] == '%' )
|
||
|
{
|
||
|
sprintf(buffer, "%2X", name[cc]);
|
||
|
str << "%%" << buffer; // Two % because it goes through printf format
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
str << name[cc];
|
||
|
}
|
||
|
cc++;
|
||
|
}
|
||
|
str << ends;
|
||
|
strcpy(resname, str.str());
|
||
|
str.rdbuf()->freeze(0);
|
||
|
}
|