You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
208 lines
5.4 KiB
C++
208 lines
5.4 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkAMRCutPlane.h
|
|
|
|
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.
|
|
|
|
=========================================================================*/
|
|
/**
|
|
* @class vtkAMRCutPlane
|
|
*
|
|
*
|
|
* A concrete instance of vtkMultiBlockDataSet that provides functionality for
|
|
* cutting an AMR dataset (an instance of vtkOverlappingAMR) with user supplied
|
|
* implicit plane function defined by a normal and center.
|
|
*/
|
|
|
|
#ifndef vtkAMRCutPlane_h
|
|
#define vtkAMRCutPlane_h
|
|
|
|
#include "vtkFiltersAMRModule.h" // For export macro
|
|
#include "vtkMultiBlockDataSetAlgorithm.h"
|
|
|
|
#include <vector> // For STL vector
|
|
#include <map> // For STL map
|
|
|
|
class vtkMultiBlockDataSet;
|
|
class vtkOverlappingAMR;
|
|
class vtkMultiProcessController;
|
|
class vtkInformation;
|
|
class vtkInformationVector;
|
|
class vtkIndent;
|
|
class vtkPlane;
|
|
class vtkUniformGrid;
|
|
class vtkCell;
|
|
class vtkPoints;
|
|
class vtkCellArray;
|
|
class vtkPointData;
|
|
class vtkCellData;
|
|
|
|
class VTKFILTERSAMR_EXPORT vtkAMRCutPlane : public vtkMultiBlockDataSetAlgorithm
|
|
{
|
|
public:
|
|
static vtkAMRCutPlane *New();
|
|
vtkTypeMacro(vtkAMRCutPlane, vtkMultiBlockDataSetAlgorithm);
|
|
void PrintSelf(ostream &oss, vtkIndent indent );
|
|
|
|
//@{
|
|
/**
|
|
* Sets the center
|
|
*/
|
|
vtkSetVector3Macro(Center, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Sets the normal
|
|
*/
|
|
vtkSetVector3Macro(Normal, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Sets the level of resolution
|
|
*/
|
|
vtkSetMacro(LevelOfResolution, int);
|
|
vtkGetMacro(LevelOfResolution, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
|
|
*/
|
|
vtkSetMacro(UseNativeCutter, bool);
|
|
vtkGetMacro(UseNativeCutter, bool);
|
|
vtkBooleanMacro(UseNativeCutter, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get a multiprocess controller for parallel processing.
|
|
* By default this parameter is set to NULL by the constructor.
|
|
*/
|
|
vtkSetMacro(Controller, vtkMultiProcessController*);
|
|
vtkGetMacro(Controller, vtkMultiProcessController*);
|
|
//@}
|
|
|
|
// Standard pipeline routines
|
|
|
|
virtual int RequestData(
|
|
vtkInformation*,vtkInformationVector**,vtkInformationVector*);
|
|
virtual int FillInputPortInformation(int port, vtkInformation *info);
|
|
virtual int FillOutputPortInformation(int port, vtkInformation *info);
|
|
|
|
|
|
/**
|
|
* Gets the metadata from upstream module and determines which blocks
|
|
* should be loaded by this instance.
|
|
*/
|
|
virtual int RequestInformation(
|
|
vtkInformation *rqst,
|
|
vtkInformationVector **inputVector,
|
|
vtkInformationVector *outputVector );
|
|
|
|
/**
|
|
* Performs upstream requests to the reader
|
|
*/
|
|
virtual int RequestUpdateExtent(
|
|
vtkInformation*, vtkInformationVector**, vtkInformationVector* );
|
|
|
|
protected:
|
|
vtkAMRCutPlane();
|
|
virtual ~vtkAMRCutPlane();
|
|
|
|
/**
|
|
* Returns the cut-plane defined by a vtkCutPlane instance based on the
|
|
* user-supplied center and normal.
|
|
*/
|
|
vtkPlane* GetCutPlane( vtkOverlappingAMR *metadata );
|
|
|
|
/**
|
|
* Extracts cell
|
|
*/
|
|
void ExtractCellFromGrid(
|
|
vtkUniformGrid *grid, vtkCell* cell,
|
|
std::map<vtkIdType,vtkIdType>& gridPntMapping,
|
|
vtkPoints *nodes,
|
|
vtkCellArray *cells );
|
|
|
|
/**
|
|
* Given the grid and a subset ID pair, grid IDs mapping to the extracted
|
|
* grid IDs, extract the point data.
|
|
*/
|
|
void ExtractPointDataFromGrid(
|
|
vtkUniformGrid *grid,
|
|
std::map<vtkIdType,vtkIdType>& gridPntMapping,
|
|
vtkIdType NumNodes,
|
|
vtkPointData *PD );
|
|
|
|
/**
|
|
* Given the grid and the list of cells that are extracted, extract the
|
|
* corresponding cell data.
|
|
*/
|
|
void ExtractCellDataFromGrid(
|
|
vtkUniformGrid *grid,
|
|
std::vector<vtkIdType>& cellIdxList,
|
|
vtkCellData *CD);
|
|
|
|
/**
|
|
* Given a cut-plane, p, and the metadata, m, this method computes which
|
|
* blocks need to be loaded. The corresponding block IDs are stored in
|
|
* the internal STL vector, blocksToLoad, which is then propagated upstream
|
|
* in the RequestUpdateExtent.
|
|
*/
|
|
void ComputeAMRBlocksToLoad( vtkPlane* p, vtkOverlappingAMR* m);
|
|
|
|
// Descriription:
|
|
// Initializes the cut-plane center given the min/max bounds.
|
|
void InitializeCenter( double min[3], double max[3] );
|
|
|
|
//@{
|
|
/**
|
|
* Determines if a plane intersects with an AMR box
|
|
*/
|
|
bool PlaneIntersectsAMRBox( vtkPlane* pl, double bounds[6] );
|
|
bool PlaneIntersectsAMRBox( double plane[4], double bounds[6] );
|
|
//@}
|
|
|
|
/**
|
|
* Determines if a plane intersects with a grid cell
|
|
*/
|
|
bool PlaneIntersectsCell( vtkPlane *pl, vtkCell *cell );
|
|
|
|
/**
|
|
* A utility function that checks if the input AMR data is 2-D.
|
|
*/
|
|
bool IsAMRData2D( vtkOverlappingAMR *input );
|
|
|
|
/**
|
|
* Applies cutting to an AMR block
|
|
*/
|
|
void CutAMRBlock(
|
|
vtkPlane *cutPlane,
|
|
unsigned int blockIdx,
|
|
vtkUniformGrid *grid, vtkMultiBlockDataSet *dataSet );
|
|
|
|
int LevelOfResolution;
|
|
double Center[3];
|
|
double Normal[3];
|
|
bool initialRequest;
|
|
bool UseNativeCutter;
|
|
vtkMultiProcessController *Controller;
|
|
|
|
std::vector<int> BlocksToLoad;
|
|
|
|
private:
|
|
vtkAMRCutPlane(const vtkAMRCutPlane& ) VTK_DELETE_FUNCTION;
|
|
void operator=(const vtkAMRCutPlane& ) VTK_DELETE_FUNCTION;
|
|
};
|
|
|
|
#endif /* vtkAMRCutPlane_h */
|