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.
 
 
 
 
 
 

260 lines
7.6 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkStructuredGridOutlineFilter.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 "vtkStructuredGridOutlineFilter.h"
#include "vtkCellArray.h"
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkObjectFactory.h"
#include "vtkPolyData.h"
#include "vtkStreamingDemandDrivenPipeline.h"
#include "vtkStructuredGrid.h"
vtkCxxRevisionMacro(vtkStructuredGridOutlineFilter, "$Revision: 1.48 $");
vtkStandardNewMacro(vtkStructuredGridOutlineFilter);
//----------------------------------------------------------------------------
// ComputeDivisionExtents has done most of the work for us.
// Now just connect the points.
int vtkStructuredGridOutlineFilter::RequestData(
vtkInformation *vtkNotUsed(request),
vtkInformationVector **inputVector,
vtkInformationVector *outputVector)
{
// get the info objects
vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
vtkInformation *outInfo = outputVector->GetInformationObject(0);
// get the input and ouptut
vtkStructuredGrid *input = vtkStructuredGrid::SafeDownCast(
inInfo->Get(vtkDataObject::DATA_OBJECT()));
vtkPolyData *output = vtkPolyData::SafeDownCast(
outInfo->Get(vtkDataObject::DATA_OBJECT()));
int *ext, *wExt, cExt[6];
int xInc, yInc, zInc;
vtkPoints *inPts;
vtkPoints *newPts;
vtkCellArray *newLines;
int idx;
vtkIdType ids[2], numPts, offset;
// for marching through the points along an edge.
vtkIdType start = 0, id;
int num = 0, inc = 0;
int edgeFlag;
int i;
inPts = input->GetPoints();
if (!inPts)
{
return 1;
}
newLines = vtkCellArray::New();
newPts = vtkPoints::New();
ext = input->GetExtent();
wExt = inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT());
// Since it is possible that the extent is larger than the whole extent,
// and we want the outline to be the whole extent,
// compute the clipped extent.
inInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), cExt);
for (i = 0; i < 3; ++i)
{
if (cExt[2*i] < wExt[2*i])
{
cExt[2*i] = wExt[2*i];
}
if (cExt[2*i+1] > wExt[2*i+1])
{
cExt[2*i+1] = wExt[2*i+1];
}
}
for (i = 0; i < 12; i++ )
{
// Find the start of this edge, the length of this edge, and increment.
xInc = 1;
yInc = ext[1]-ext[0]+1;
zInc = yInc * (ext[3]-ext[2]+1);
edgeFlag = 0;
switch (i)
{
case 0:
// start (0, 0, 0) increment z axis.
if (cExt[0] <= wExt[0] && cExt[2] <= wExt[2])
{
edgeFlag = 1;
}
num = cExt[5]-cExt[4]+1;
start = (cExt[0]-ext[0])*xInc + (cExt[2]-ext[2])*yInc + (cExt[4]-ext[4])*zInc;
inc = zInc;
break;
case 1:
// start (xMax, 0, 0) increment z axis.
if (cExt[1] >= wExt[1] && cExt[2] <= wExt[2])
{
edgeFlag = 1;
}
num = cExt[5]-cExt[4]+1;
start = (cExt[1]-ext[0])*xInc + (cExt[2]-ext[2])*yInc + (cExt[4]-ext[4])*zInc;
inc = zInc;
break;
case 2:
// start (0, yMax, 0) increment z axis.
if (cExt[0] <= wExt[0] && cExt[3] >= wExt[3])
{
edgeFlag = 1;
}
num = cExt[5]-cExt[4]+1;
start = (cExt[0]-ext[0])*xInc + (cExt[3]-ext[2])*yInc + (cExt[4]-ext[4])*zInc;
inc = zInc;
break;
case 3:
// start (xMax, yMax, 0) increment z axis.
if (cExt[1] >= wExt[1] && cExt[3] >= wExt[3])
{
edgeFlag = 1;
}
num = cExt[5]-cExt[4]+1;
start = (cExt[1]-ext[0])*xInc + (cExt[3]-ext[2])*yInc + (cExt[4]-ext[4])*zInc;
inc = zInc;
break;
case 4:
// start (0, 0, 0) increment y axis.
if (cExt[0] <= wExt[0] && cExt[4] <= wExt[4])
{
edgeFlag = 1;
}
num = cExt[3]-cExt[2]+1;
start = (cExt[0]-ext[0])*xInc + (cExt[2]-ext[2])*yInc + (cExt[4]-ext[4])*zInc;
inc = yInc;
break;
case 5:
// start (xMax, 0, 0) increment y axis.
if (cExt[1] >= wExt[1] && cExt[4] <= wExt[4])
{
edgeFlag = 1;
}
num = cExt[3]-cExt[2]+1;
start = (cExt[1]-ext[0])*xInc + (cExt[2]-ext[2])*yInc + (cExt[4]-ext[4])*zInc;
inc = yInc;
break;
case 6:
// start (0, 0, zMax) increment y axis.
if (cExt[0] <= wExt[0] && cExt[5] >= wExt[5])
{
edgeFlag = 1;
}
num = cExt[3]-cExt[2]+1;
start = (cExt[0]-ext[0])*xInc + (cExt[2]-ext[2])*yInc + (cExt[5]-ext[4])*zInc;
inc = yInc;
break;
case 7:
// start (xMax, 0, zMax) increment y axis.
if (cExt[1] >= wExt[1] && cExt[5] >= wExt[5])
{
edgeFlag = 1;
}
num = cExt[3]-cExt[2]+1;
start = (cExt[1]-ext[0])*xInc + (cExt[2]-ext[2])*yInc + (cExt[5]-ext[4])*zInc;
inc = yInc;
break;
case 8:
// start (0, 0, 0) increment x axis.
if (cExt[2] <= wExt[2] && cExt[4] <= wExt[4])
{
edgeFlag = 1;
}
num = cExt[1]-cExt[0]+1;
start = (cExt[0]-ext[0])*xInc + (cExt[2]-ext[2])*yInc + (cExt[4]-ext[4])*zInc;
inc = xInc;
break;
case 9:
// start (0, yMax, 0) increment x axis.
if (cExt[3] >= wExt[3] && cExt[4] <= wExt[4])
{
edgeFlag = 1;
}
num = cExt[1]-cExt[0]+1;
start = (cExt[0]-ext[0])*xInc + (cExt[3]-ext[2])*yInc + (cExt[4]-ext[4])*zInc;
inc = xInc;
break;
case 10:
// start (0, 0, zMax) increment x axis.
if (cExt[2] <= wExt[2] && cExt[5] >= wExt[5])
{
edgeFlag = 1;
}
num = cExt[1]-cExt[0]+1;
start = (cExt[0]-ext[0])*xInc + (cExt[2]-ext[2])*yInc + (cExt[5]-ext[4])*zInc;
inc = xInc;
break;
case 11:
// start (0, yMax, zMax) increment x axis.
if (cExt[3] >= wExt[3] && cExt[5] >= wExt[5])
{
edgeFlag = 1;
}
num = cExt[1]-cExt[0]+1;
start = (cExt[0]-ext[0])*xInc + (cExt[3]-ext[2])*yInc + (cExt[5]-ext[4])*zInc;
inc = xInc;
break;
}
if (edgeFlag && num > 1)
{
offset = newPts->GetNumberOfPoints();
numPts = inPts->GetNumberOfPoints();
// add points
for (idx = 0; idx < num; ++idx)
{
id = start + idx * inc;
// sanity check
if (id < 0 || id >= numPts)
{
vtkErrorMacro("Error stepping through points.");
return 0;
}
newPts->InsertNextPoint(inPts->GetPoint(id));
}
// add lines
for (idx = 1; idx < num; ++idx)
{
ids[0] = idx+offset-1;
ids[1] = idx+offset;
newLines->InsertNextCell(2, ids);
}
}
}
output->SetPoints(newPts);
newPts->Delete();
output->SetLines(newLines);
newLines->Delete();
return 1;
}
int vtkStructuredGridOutlineFilter::FillInputPortInformation(
int, vtkInformation *info)
{
info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkStructuredGrid");
return 1;
}