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.

218 lines
5.9 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkHyperTreeGridAxisClip.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 vtkHyperTreeGridAxisClip
* @brief Axis aligned hyper tree grid clip
*
*
* Clip an hyper tree grid along an axis aligned plane or box and output
* a hyper tree grid with same dimensionality.
* This filter also allows for reversal of the direction of what is inside
* versus what is outside by setting the InsideOut instance variable.
*
* @sa
* vtkHyperTreeGrid vtkHyperTreeGridAlgorithm
*
* @par Thanks:
* This class was written by Philippe Pebay on a idea of Guenole Harel and Jacques-Bernard Lekien,
* 2016 This class was modified by Jacques-Bernard Lekien, 2018 This work was supported by
* Commissariat a l'Energie Atomique CEA, DAM, DIF, F-91297 Arpajon, France.
*/
#ifndef vtkHyperTreeGridAxisClip_h
#define vtkHyperTreeGridAxisClip_h
#include "vtkFiltersHyperTreeModule.h" // For export macro
#include "vtkHyperTreeGridAlgorithm.h"
class vtkBitArray;
class vtkHyperTreeGrid;
class vtkQuadric;
class vtkHyperTreeGridNonOrientedCursor;
class vtkHyperTreeGridNonOrientedGeometryCursor;
class VTKFILTERSHYPERTREE_EXPORT vtkHyperTreeGridAxisClip : public vtkHyperTreeGridAlgorithm
{
public:
static vtkHyperTreeGridAxisClip* New();
vtkTypeMacro(vtkHyperTreeGridAxisClip, vtkHyperTreeGridAlgorithm);
void PrintSelf(ostream&, vtkIndent) override;
/**
* Methods by which the hyper tree grid input may be clipped:
* PLANE: Clip with an axis-aligned plane defined by normal and intercept.
* BOX: Clip with an axis-aligned rectangular prism defined by its extremal coordinates.
* QUADRIC: Clip with an axis-aligned quadric defined by its coefficients.
*/
enum ClipType
{
PLANE = 0,
BOX,
QUADRIC,
};
//@{
/**
* Set/get type of clip.
* Default value is 0 (plane clip).
*/
vtkSetClampMacro(ClipType, int, 0, 2);
vtkGetMacro(ClipType, int);
void SetClipTypeToPlane() { this->SetClipType(vtkHyperTreeGridAxisClip::PLANE); }
void SetClipTypeToBox() { this->SetClipType(vtkHyperTreeGridAxisClip::BOX); }
void SetClipTypeToQuadric() { this->SetClipType(vtkHyperTreeGridAxisClip::QUADRIC); }
//@}
//@{
/**
* Set/get normal axis of clipping plane: 0=X, 1=Y, 2=Z.
* Default value is 0 (X-axis normal).
*/
vtkSetClampMacro(PlaneNormalAxis, int, 0, 2);
vtkGetMacro(PlaneNormalAxis, int);
//@}
//@{
/**
* Set/get position of clipping plane: intercept along normal axis.
* Default value is 0.0.
*/
vtkSetMacro(PlanePosition, double);
vtkGetMacro(PlanePosition, double);
//@}
//@{
/**
* Set/get bounds of clipping box.
*/
vtkSetVector6Macro(Bounds, double);
vtkGetVectorMacro(Bounds, double, 6);
void GetMinimumBounds(double[3]);
void GetMaximumBounds(double[3]);
//@}
//@{
/**
* Set/Get the InsideOut flag, in the case of clip by hyperplane.
* When off, a cell is clipped out when its origin is above said plane
* intercept along the considered direction, inside otherwise.
* When on, a cell is clipped out when its origin + size is below said
* said plane intercept along the considered direction.
*/
vtkSetMacro(InsideOut, bool);
vtkGetMacro(InsideOut, bool);
vtkBooleanMacro(InsideOut, bool);
//@}
//@{
/**
* Set/Get the clipping quadric function.
*/
virtual void SetQuadric(vtkQuadric*);
vtkGetObjectMacro(Quadric, vtkQuadric);
//@}
//@{
/**
* Helpers to set/get the 10 coefficients of the quadric function
*/
void SetQuadricCoefficients(double a, double b, double c, double d, double e, double f, double g,
double h, double i, double j)
{
double array[10] = { a, b, c, d, e, f, g, h, i, j };
this->SetQuadricCoefficients(array);
}
void SetQuadricCoefficients(double[10]);
void GetQuadricCoefficients(double[10]);
double* GetQuadricCoefficients();
//@}
/**
* Override GetMTime because we delegate to a vtkQuadric.
*/
vtkMTimeType GetMTime() override;
protected:
vtkHyperTreeGridAxisClip();
~vtkHyperTreeGridAxisClip() override;
// For this algorithm the output is a vtkHyperTreeGrid instance
int FillOutputPortInformation(int, vtkInformation*) override;
/**
* Decide whether the cell is clipped out
*/
bool IsClipped(vtkHyperTreeGridNonOrientedGeometryCursor*);
/**
* Main routine to generate hyper tree grid clip
*/
int ProcessTrees(vtkHyperTreeGrid*, vtkDataObject*) override;
/**
* Recursively descend into tree down to leaves
*/
void RecursivelyProcessTree(vtkHyperTreeGridNonOrientedGeometryCursor* inCursor,
vtkHyperTreeGridNonOrientedCursor* outCursor);
/**
* Type of clip to be performed
*/
int ClipType;
/**
* Direction of clipping plane normal
*/
int PlaneNormalAxis;
/**
* Intercept of clipping plane along normal
*/
double PlanePosition;
double PlanePositionRealUse;
/**
* Bounds of axis-aligned clipping box
*/
double Bounds[6];
/**
* Coefficients of axis-aligned quadric
*/
vtkQuadric* Quadric;
/**
* Decide what is inside versus what is out
*/
bool InsideOut;
/**
* Output material mask constructed by this filter
*/
vtkBitArray* InMask;
vtkBitArray* OutMask;
/**
* Keep track of current index in output hyper tree grid
*/
vtkIdType CurrentId;
private:
vtkHyperTreeGridAxisClip(const vtkHyperTreeGridAxisClip&) = delete;
void operator=(const vtkHyperTreeGridAxisClip&) = delete;
};
#endif // vtkHyperTreeGridAxisClip_h