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.
278 lines
11 KiB
C
278 lines
11 KiB
C
|
3 weeks ago
|
/*=========================================================================
|
||
|
|
|
||
|
|
Program: Visualization Toolkit
|
||
|
|
Module: vtkBoxClipDataSet.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.
|
||
|
|
|
||
|
|
=========================================================================*/
|
||
|
|
/*----------------------------------------------------------------------------
|
||
|
|
Copyright (c) Sandia Corporation
|
||
|
|
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
|
||
|
|
----------------------------------------------------------------------------*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @class vtkBoxClipDataSet
|
||
|
|
* @brief clip an unstructured grid
|
||
|
|
*
|
||
|
|
*
|
||
|
|
* Clipping means that is actually 'cuts' through the cells of the dataset,
|
||
|
|
* returning tetrahedral cells inside of the box.
|
||
|
|
* The output of this filter is an unstructured grid.
|
||
|
|
*
|
||
|
|
* This filter can be configured to compute a second output. The
|
||
|
|
* second output is the part of the cell that is clipped away. Set the
|
||
|
|
* GenerateClippedData boolean on if you wish to access this output data.
|
||
|
|
*
|
||
|
|
* The vtkBoxClipDataSet will triangulate all types of 3D cells (i.e, create tetrahedra).
|
||
|
|
* This is necessary to preserve compatibility across face neighbors.
|
||
|
|
*
|
||
|
|
* To use this filter,you can decide if you will be clipping with a box or a hexahedral box.
|
||
|
|
* 1) Set orientation
|
||
|
|
* if(SetOrientation(0)): box (parallel with coordinate axis)
|
||
|
|
* SetBoxClip(xmin,xmax,ymin,ymax,zmin,zmax)
|
||
|
|
* if(SetOrientation(1)): hexahedral box (Default)
|
||
|
|
* SetBoxClip(n[0],o[0],n[1],o[1],n[2],o[2],n[3],o[3],n[4],o[4],n[5],o[5])
|
||
|
|
* PlaneNormal[] normal of each plane
|
||
|
|
* PlanePoint[] point on the plane
|
||
|
|
* 2) Apply the GenerateClipScalarsOn()
|
||
|
|
* 3) Execute clipping Update();
|
||
|
|
*/
|
||
|
|
|
||
|
|
#ifndef vtkBoxClipDataSet_h
|
||
|
|
#define vtkBoxClipDataSet_h
|
||
|
|
|
||
|
|
#include "vtkFiltersGeneralModule.h" // For export macro
|
||
|
|
#include "vtkUnstructuredGridAlgorithm.h"
|
||
|
|
|
||
|
|
class vtkCell3D;
|
||
|
|
class vtkCellArray;
|
||
|
|
class vtkCellData;
|
||
|
|
class vtkDataArray;
|
||
|
|
class vtkDataSetAttributes;
|
||
|
|
class vtkIdList;
|
||
|
|
class vtkGenericCell;
|
||
|
|
class vtkPointData;
|
||
|
|
class vtkIncrementalPointLocator;
|
||
|
|
class vtkPoints;
|
||
|
|
|
||
|
|
class VTKFILTERSGENERAL_EXPORT vtkBoxClipDataSet : public vtkUnstructuredGridAlgorithm
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
vtkTypeMacro(vtkBoxClipDataSet,vtkUnstructuredGridAlgorithm);
|
||
|
|
void PrintSelf(ostream& os, vtkIndent indent) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Constructor of the clipping box. The initial box is (0,1,0,1,0,1).
|
||
|
|
* The hexahedral box and the parallel box parameters are set to match this
|
||
|
|
* box.
|
||
|
|
*/
|
||
|
|
static vtkBoxClipDataSet *New();
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Specify the Box with which to perform the clipping.
|
||
|
|
* If the box is not parallel to axis, you need to especify
|
||
|
|
* normal vector of each plane and a point on the plane.
|
||
|
|
*/
|
||
|
|
void SetBoxClip(double xmin, double xmax,
|
||
|
|
double ymin, double ymax,
|
||
|
|
double zmin, double zmax);
|
||
|
|
void SetBoxClip(const double *n0, const double *o0,
|
||
|
|
const double *n1, const double *o1,
|
||
|
|
const double *n2, const double *o2,
|
||
|
|
const double *n3, const double *o3,
|
||
|
|
const double *n4, const double *o4,
|
||
|
|
const double *n5, const double *o5);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* If this flag is enabled, then the output scalar values will be
|
||
|
|
* interpolated, and not the input scalar data.
|
||
|
|
*/
|
||
|
|
vtkSetMacro(GenerateClipScalars,int);
|
||
|
|
vtkGetMacro(GenerateClipScalars,int);
|
||
|
|
vtkBooleanMacro(GenerateClipScalars,int);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Control whether a second output is generated. The second output
|
||
|
|
* contains the polygonal data that's been clipped away.
|
||
|
|
*/
|
||
|
|
vtkSetMacro(GenerateClippedOutput,int);
|
||
|
|
vtkGetMacro(GenerateClippedOutput,int);
|
||
|
|
vtkBooleanMacro(GenerateClippedOutput,int);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Set the tolerance for merging clip intersection points that are near
|
||
|
|
* the vertices of cells. This tolerance is used to prevent the generation
|
||
|
|
* of degenerate primitives. Note that only 3D cells actually use this
|
||
|
|
* instance variable.
|
||
|
|
* vtkSetClampMacro(MergeTolerance,double,0.0001,0.25);
|
||
|
|
* vtkGetMacro(MergeTolerance,double);
|
||
|
|
*/
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Return the Clipped output.
|
||
|
|
*/
|
||
|
|
vtkUnstructuredGrid *GetClippedOutput();
|
||
|
|
virtual int GetNumberOfOutputs();
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Specify a spatial locator for merging points. By default, an
|
||
|
|
* instance of vtkMergePoints is used.
|
||
|
|
*/
|
||
|
|
void SetLocator(vtkIncrementalPointLocator *locator);
|
||
|
|
vtkGetObjectMacro(Locator,vtkIncrementalPointLocator);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Create default locator. Used to create one when none is specified. The
|
||
|
|
* locator is used to merge coincident points.
|
||
|
|
*/
|
||
|
|
void CreateDefaultLocator();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Return the mtime also considering the locator.
|
||
|
|
*/
|
||
|
|
vtkMTimeType GetMTime() VTK_OVERRIDE;
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Tells if clipping happens with a box parallel with coordinate axis
|
||
|
|
* (0) or with an hexahedral box (1). Initial value is 1.
|
||
|
|
*/
|
||
|
|
vtkGetMacro(Orientation,unsigned int);
|
||
|
|
vtkSetMacro(Orientation,unsigned int);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
|
||
|
|
static void InterpolateEdge(vtkDataSetAttributes *attributes,
|
||
|
|
vtkIdType toId,
|
||
|
|
vtkIdType fromId1, vtkIdType fromId2,
|
||
|
|
double t);
|
||
|
|
|
||
|
|
void MinEdgeF(const unsigned int *id_v, const vtkIdType *cellIds,
|
||
|
|
unsigned int *edgF );
|
||
|
|
void PyramidToTetra(const vtkIdType *pyramId, const vtkIdType *cellIds,
|
||
|
|
vtkCellArray *newCellArray);
|
||
|
|
void WedgeToTetra(const vtkIdType *wedgeId, const vtkIdType *cellIds,
|
||
|
|
vtkCellArray *newCellArray);
|
||
|
|
void CellGrid(vtkIdType typeobj, vtkIdType npts, const vtkIdType *cellIds,
|
||
|
|
vtkCellArray *newCellArray);
|
||
|
|
void CreateTetra(vtkIdType npts, const vtkIdType *cellIds,
|
||
|
|
vtkCellArray *newCellArray);
|
||
|
|
void ClipBox(vtkPoints *newPoints,vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray *tets,vtkPointData *inPD,
|
||
|
|
vtkPointData *outPD,vtkCellData *inCD,vtkIdType cellId,
|
||
|
|
vtkCellData *outCD);
|
||
|
|
void ClipHexahedron(vtkPoints *newPoints, vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray *tets,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD,
|
||
|
|
vtkCellData *inCD, vtkIdType cellId, vtkCellData *outCD);
|
||
|
|
void ClipBoxInOut(vtkPoints *newPoints, vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray **tets,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD,
|
||
|
|
vtkCellData *inCD, vtkIdType cellId, vtkCellData **outCD);
|
||
|
|
void ClipHexahedronInOut(vtkPoints *newPoints,vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray **tets,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD,
|
||
|
|
vtkCellData *inCD, vtkIdType cellId,
|
||
|
|
vtkCellData **outCD);
|
||
|
|
|
||
|
|
void ClipBox2D(vtkPoints *newPoints, vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray *tets,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD, vtkCellData *inCD,
|
||
|
|
vtkIdType cellId, vtkCellData *outCD);
|
||
|
|
void ClipBoxInOut2D(vtkPoints *newPoints,vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray **tets,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD,
|
||
|
|
vtkCellData *inCD, vtkIdType cellId, vtkCellData **outCD);
|
||
|
|
void ClipHexahedron2D(vtkPoints *newPoints,vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray *tets,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD,
|
||
|
|
vtkCellData *inCD, vtkIdType cellId,
|
||
|
|
vtkCellData *outCD);
|
||
|
|
void ClipHexahedronInOut2D(vtkPoints *newPoints, vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray **tets,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD,
|
||
|
|
vtkCellData *inCD,vtkIdType cellId,
|
||
|
|
vtkCellData **outCD);
|
||
|
|
|
||
|
|
void ClipBox1D(vtkPoints *newPoints, vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray *lines,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD, vtkCellData *inCD,
|
||
|
|
vtkIdType cellId, vtkCellData *outCD);
|
||
|
|
void ClipBoxInOut1D(vtkPoints *newPoints, vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray **lines,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD,
|
||
|
|
vtkCellData *inCD, vtkIdType cellId, vtkCellData **outCD);
|
||
|
|
void ClipHexahedron1D(vtkPoints *newPoints, vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray *lines,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD,
|
||
|
|
vtkCellData *inCD, vtkIdType cellId,
|
||
|
|
vtkCellData *outCD);
|
||
|
|
void ClipHexahedronInOut1D(vtkPoints *newPoints, vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray **lines,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD,
|
||
|
|
vtkCellData *inCD, vtkIdType cellId,
|
||
|
|
vtkCellData **outCD);
|
||
|
|
|
||
|
|
void ClipBox0D(vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray *verts,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD, vtkCellData *inCD,
|
||
|
|
vtkIdType cellId, vtkCellData *outCD);
|
||
|
|
void ClipBoxInOut0D(vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray **verts,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD,
|
||
|
|
vtkCellData *inCD,
|
||
|
|
vtkIdType cellId, vtkCellData **outCD);
|
||
|
|
void ClipHexahedron0D(vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray *verts,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD,
|
||
|
|
vtkCellData *inCD,
|
||
|
|
vtkIdType cellId, vtkCellData *outCD);
|
||
|
|
void ClipHexahedronInOut0D(vtkGenericCell *cell,
|
||
|
|
vtkIncrementalPointLocator *locator, vtkCellArray **verts,
|
||
|
|
vtkPointData *inPD, vtkPointData *outPD,
|
||
|
|
vtkCellData *inCD,
|
||
|
|
vtkIdType cellId, vtkCellData **outCD);
|
||
|
|
protected:
|
||
|
|
vtkBoxClipDataSet();
|
||
|
|
~vtkBoxClipDataSet() VTK_OVERRIDE;
|
||
|
|
|
||
|
|
int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *) VTK_OVERRIDE;
|
||
|
|
int FillInputPortInformation(int port, vtkInformation *info) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
vtkIncrementalPointLocator *Locator;
|
||
|
|
int GenerateClipScalars;
|
||
|
|
|
||
|
|
int GenerateClippedOutput;
|
||
|
|
|
||
|
|
//double MergeTolerance;
|
||
|
|
|
||
|
|
double BoundBoxClip[3][2];
|
||
|
|
unsigned int Orientation;
|
||
|
|
double PlaneNormal[6][3]; //normal of each plane
|
||
|
|
double PlanePoint[6][3]; //point on the plane
|
||
|
|
|
||
|
|
private:
|
||
|
|
vtkBoxClipDataSet(const vtkBoxClipDataSet&) VTK_DELETE_FUNCTION;
|
||
|
|
void operator=(const vtkBoxClipDataSet&) VTK_DELETE_FUNCTION;
|
||
|
|
};
|
||
|
|
|
||
|
|
#endif
|