Cloned library of VTK-5.0.0 with extra build files for internal package management.
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.

184 lines
5.2 KiB

2 years ago
/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkGenericProbeFilter.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 "vtkGenericProbeFilter.h"
#include "vtkCell.h"
#include "vtkIdTypeArray.h"
#include "vtkImageData.h"
#include "vtkObjectFactory.h"
#include "vtkPointData.h"
#include "vtkGenericDataSet.h"
#include "vtkDoubleArray.h"
#include "vtkGenericCellIterator.h"
#include "vtkGenericAdaptorCell.h"
#include "vtkGenericAttribute.h"
#include "vtkGenericAttributeCollection.h"
vtkCxxRevisionMacro(vtkGenericProbeFilter, "$Revision: 1.4 $");
vtkStandardNewMacro(vtkGenericProbeFilter);
//----------------------------------------------------------------------------
vtkGenericProbeFilter::vtkGenericProbeFilter()
{
this->ValidPoints = vtkIdTypeArray::New();
}
//----------------------------------------------------------------------------
vtkGenericProbeFilter::~vtkGenericProbeFilter()
{
this->ValidPoints->Delete();
this->ValidPoints = NULL;
}
//----------------------------------------------------------------------------
void vtkGenericProbeFilter::SetSource(vtkGenericDataSet *input)
{
this->vtkProcessObject::SetNthInput(1, input);
}
//----------------------------------------------------------------------------
vtkGenericDataSet *vtkGenericProbeFilter::GetSource()
{
if (this->NumberOfInputs < 2)
{
return NULL;
}
return (vtkGenericDataSet *)(this->Inputs[1]);
}
//----------------------------------------------------------------------------
void vtkGenericProbeFilter::Execute()
{
vtkIdType ptId, numPts;
double x[3], tol2;
// vtkCell *cell;
vtkPointData *outPD;
int subId;
vtkGenericDataSet *source = this->GetSource();
vtkDataSet *input = this->GetInput();
vtkDataSet *output= this->GetOutput();
double pcoords[3], *weights;
double fastweights[256];
vtkDebugMacro(<<"Probing data");
if (source == NULL)
{
vtkErrorMacro (<< "Source is NULL.");
return;
}
// pd = source->GetPointData();
//pd = NULL;
//int size = input->GetNumberOfPoints();
// lets use a stack allocated array if possible for performance reasons
int mcs = 255; //source->GetMaxCellSize(); //FIXME
if (mcs<=256)
{
weights = fastweights;
}
else
{
weights = new double[mcs];
}
// First, copy the input to the output as a starting point
output->CopyStructure( input );
numPts = input->GetNumberOfPoints();
this->ValidPoints->Allocate(numPts);
// Allocate storage for output PointData
//
outPD = output->GetPointData();
//outPD->InterpolateAllocate(pd, size, size);
vtkDoubleArray *foobar = vtkDoubleArray::New();
outPD->SetScalars( foobar );
// Use tolerance as a function of size of source data
//
// tol2 = source->GetLength();
tol2 = 1000; //FIXME
tol2 = tol2 ? tol2*tol2 / 1000.0 : 0.001;
// Loop over all input points, interpolating source data
//
int abort=0;
// Need to use source to create a cellIt since this class is virtual
vtkGenericCellIterator *cellIt = source->NewCellIterator();
vtkIdType progressInterval=numPts/20 + 1;
for (ptId=0; ptId < numPts && !abort; ptId++)
{
if ( !(ptId % progressInterval) )
{
this->UpdateProgress((double)ptId/numPts);
abort = GetAbortExecute();
}
// Get the xyz coordinate of the point in the input dataset
input->GetPoint(ptId, x);
// Find the cell that contains xyz and get it
if(source->FindCell(x,cellIt,tol2,subId,pcoords))
{
// Interpolate the point data
vtkGenericAdaptorCell *cellProbe = cellIt->GetCell();
double s[3]; // FIXME: should be double *s=new double[source->GetAttributes()->GetNumberOfComponents()]
//cellProbe->EvaluateShapeFunction(x,s);
//source->GetAttributes()->EvaluateTuple(cellProbe, x,s);
cellProbe->InterpolateTuple(source->GetAttributes(), x,s);
foobar->InsertTuple( ptId, s);
this->ValidPoints->InsertNextValue(ptId);
}
else
{
outPD->NullPoint(ptId);
}
}
cellIt->Delete();
// BUG FIX: JB.
// Output gets setup from input, but when output is imagedata, scalartype
// depends on source scalartype not input scalartype
if (output->IsA("vtkImageData"))
{
vtkImageData *out = (vtkImageData*)output;
vtkDataArray *s = outPD->GetScalars();
out->SetScalarType(s->GetDataType());
out->SetNumberOfScalarComponents(s->GetNumberOfComponents());
}
if (mcs>256)
{
delete [] weights;
}
}
//----------------------------------------------------------------------------
void vtkGenericProbeFilter::PrintSelf(ostream& os, vtkIndent indent)
{
vtkGenericDataSet *source = this->GetSource();
this->Superclass::PrintSelf(os,indent);
os << indent << "Source: " << source << "\n";
os << indent << "ValidPoints: " << this->ValidPoints << "\n";
}