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.

243 lines
9.9 KiB
C++

/*=========================================================================
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) 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, vtkTypeBool);
vtkGetMacro(GenerateClipScalars, vtkTypeBool);
vtkBooleanMacro(GenerateClipScalars, vtkTypeBool);
//@}
//@{
/**
* Control whether a second output is generated. The second output
* contains the polygonal data that's been clipped away.
*/
vtkSetMacro(GenerateClippedOutput, vtkTypeBool);
vtkGetMacro(GenerateClippedOutput, vtkTypeBool);
vtkBooleanMacro(GenerateClippedOutput, vtkTypeBool);
//@}
/**
* 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() 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() override;
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int FillInputPortInformation(int port, vtkInformation* info) override;
vtkIncrementalPointLocator* Locator;
vtkTypeBool GenerateClipScalars;
vtkTypeBool 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&) = delete;
void operator=(const vtkBoxClipDataSet&) = delete;
};
#endif