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++
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
|