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.

204 lines
6.8 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkPlaneCutter.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 vtkPlaneCutter
* @brief cut any dataset with a plane and generate a
* polygonal cut surface
*
* vtkPlaneCutter is a specialization of the vtkCutter algorithm to cut a
* dataset grid with a single plane. It is designed for performance and an
* exploratory, fast workflow. It produces output polygons that result from
* cutting the icnput dataset with the specified plane.
*
* This algorithm is fast because it is threaded, and may build (in a
* preprocessing step) a spatial search structure that accelerates the plane
* cuts. The search structure, which is typically a sphere tree, is used to
* quickly cull candidate cells. (Note that certain types of input data are
* delegated to other, internal classes; for example image data is delegated
* to vtkFlyingEdgesPlaneCutter.)
*
* Because this filter may build an initial data structure during a
* preprocessing step, the first execution of the filter may take longer than
* subsequent operations. Typically the first execution is still faster than
* vtkCutter (especially with threading enabled), but for certain types of
* data this may not be true. However if you are using the filter to cut a
* dataset multiple times (as in an exploratory or interactive workflow) this
* filter typically works well.
*
* @warning
* This filter outputs a vtkMultiBlockeDataSet. Each piece in the multiblock
* output corresponds to the output from one thread.
*
* @warning
* This filter produces non-merged, potentially coincident points for all
* input dataset types except vtkImageData (which uses
* vtkFlyingEdgesPlaneCutter under the hood - which does merge points).
*
* @warning
* This filter delegates to vtkFlyingEdgesPlaneCutter to process image
* data, but output and input have been standardized when possible.
*
* @warning
* This class has been threaded with vtkSMPTools. Using TBB or other
* non-sequential type (set in the CMake variable
* VTK_SMP_IMPLEMENTATION_TYPE) may improve performance significantly.
*
* @sa
* vtkFlyingEdgesPlaneCutter vtk3DLinearGridPlaneCutter vtkCutter vtkPlane
*/
#ifndef vtkPlaneCutter_h
#define vtkPlaneCutter_h
#include "vtkDataSetAlgorithm.h"
#include "vtkFiltersCoreModule.h" // For export macro
#include "vtkSmartPointer.h" // For SmartPointer
#include <vector> // For vector
class vtkCellArray;
class vtkCellData;
class vtkImageData;
class vtkMultiPieceDataSet;
class vtkPlane;
class vtkPointData;
class vtkPoints;
class vtkSphereTree;
class vtkStructuredGrid;
class vtkUnstructuredGrid;
class VTKFILTERSCORE_EXPORT vtkPlaneCutter : public vtkDataSetAlgorithm
{
public:
//@{
/**
* Standard construction and print methods.
*/
static vtkPlaneCutter* New();
vtkTypeMacro(vtkPlaneCutter, vtkDataSetAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@}
/**
* The modified time depends on the delegated cut plane.
*/
vtkMTimeType GetMTime() override;
//@{
/**
* Specify the plane (an implicit function) to perform the cutting. The
* definition of the plane (its origin and normal) is controlled via this
* instance of vtkPlane.
*/
virtual void SetPlane(vtkPlane*);
vtkGetObjectMacro(Plane, vtkPlane);
//@}
//@{
/**
* Set/Get the computation of normals. The normal generated is simply the
* cut plane normal. The normal, if generated, is defined by cell data
* associated with the output polygons. By default computing of normals is
* disabled.
*/
vtkSetMacro(ComputeNormals, bool);
vtkGetMacro(ComputeNormals, bool);
vtkBooleanMacro(ComputeNormals, bool);
//@}
//@{
/**
* Indicate whether to interpolate attribute data. By default this is
* enabled. Note that both cell data and point data is interpolated and
* outputted, except for image data input where only point data are outputted.
*/
vtkSetMacro(InterpolateAttributes, bool);
vtkGetMacro(InterpolateAttributes, bool);
vtkBooleanMacro(InterpolateAttributes, bool);
//@}
//@{
/**
* Indicate whether to generate polygons instead of triangles when cutting
* structured and rectilinear grid.
* No effect with other kinds of inputs, enabled by default.
*/
vtkSetMacro(GeneratePolygons, bool);
vtkGetMacro(GeneratePolygons, bool);
vtkBooleanMacro(GeneratePolygons, bool);
//@}
//@{
/**
* Indicate whether to build the sphere tree. Computing the sphere
* will take some time on the first computation
* but if the input does not change, the computation of all further
* slice will be much faster. Default is on.
*/
vtkSetMacro(BuildTree, bool);
vtkGetMacro(BuildTree, bool);
vtkBooleanMacro(BuildTree, bool);
//@}
//@{
/**
* Indicate whether to build tree hierarchy. Computing the tree
* hierarchy can take some time on the first computation but if
* the input does not change, the computation of all further
* slice will be faster. Default is on.
*/
vtkSetMacro(BuildHierarchy, bool);
vtkGetMacro(BuildHierarchy, bool);
vtkBooleanMacro(BuildHierarchy, bool);
//@}
/**
* See vtkAlgorithm for details.
*/
vtkTypeBool ProcessRequest(
vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
protected:
vtkPlaneCutter();
~vtkPlaneCutter() override;
vtkPlane* Plane;
bool ComputeNormals;
bool InterpolateAttributes;
bool GeneratePolygons;
bool BuildTree;
bool BuildHierarchy;
// Helpers
std::vector<vtkSmartPointer<vtkSphereTree> > SphereTrees;
// Pipeline-related methods
int RequestDataObject(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int RequestUpdateExtent(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int FillInputPortInformation(int port, vtkInformation* info) override;
int FillOutputPortInformation(int port, vtkInformation* info) override;
virtual int ExecuteDataSet(vtkDataSet* input, vtkSphereTree* tree, vtkMultiPieceDataSet* output);
static void AddNormalArray(double* planeNormal, vtkDataSet* ds);
static void InitializeOutput(vtkMultiPieceDataSet* output);
private:
vtkPlaneCutter(const vtkPlaneCutter&) = delete;
void operator=(const vtkPlaneCutter&) = delete;
};
#endif