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.

147 lines
4.9 KiB
C

/*=========================================================================
Program: Visualization Toolkit
Module: vtkDicer.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 vtkDicer
* @brief abstract superclass to divide dataset into pieces
*
* Subclasses of vtkDicer divides the input dataset into separate
* pieces. These pieces can then be operated on by other filters
* (e.g., vtkThreshold). One application is to break very large
* polygonal models into pieces and performing viewing and occlusion
* culling on the pieces. Multiple pieces can also be streamed through
* the visualization pipeline.
*
* To use this filter, you must specify the execution mode of the
* filter; i.e., set the way that the piece size is controlled (do
* this by setting the DiceMode ivar). The filter does not change the
* geometry or topology of the input dataset, rather it generates
* integer numbers that indicate which piece a particular point
* belongs to (i.e., it modifies the point and cell attribute
* data). The integer number can be placed into the output scalar
* data, or the output field data.
*
* @warning
* The number of pieces generated may not equal the specified number
* of pieces. Use the method GetNumberOfActualPieces() after filter
* execution to get the actual number of pieces generated.
*
* @sa
* vtkOBBDicer vtkConnectedDicer vtkSpatialDicer
*/
#ifndef vtkDicer_h
#define vtkDicer_h
#include "vtkDataSetAlgorithm.h"
#include "vtkFiltersGeneralModule.h" // For export macro
#define VTK_DICE_MODE_NUMBER_OF_POINTS 0
#define VTK_DICE_MODE_SPECIFIED_NUMBER 1
#define VTK_DICE_MODE_MEMORY_LIMIT 2
class VTKFILTERSGENERAL_EXPORT vtkDicer : public vtkDataSetAlgorithm
{
public:
vtkTypeMacro(vtkDicer, vtkDataSetAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@{
/**
* Set/Get the flag which controls whether to generate point scalar
* data or point field data. If this flag is off, scalar data is
* generated. Otherwise, field data is generated. Note that the
* generated the data are integer numbers indicating which piece a
* particular point belongs to.
*/
vtkSetMacro(FieldData, vtkTypeBool);
vtkGetMacro(FieldData, vtkTypeBool);
vtkBooleanMacro(FieldData, vtkTypeBool);
//@}
//@{
/**
* Specify the method to determine how many pieces the data should be
* broken into. By default, the number of points per piece is used.
*/
vtkSetClampMacro(DiceMode, int, VTK_DICE_MODE_NUMBER_OF_POINTS, VTK_DICE_MODE_MEMORY_LIMIT);
vtkGetMacro(DiceMode, int);
void SetDiceModeToNumberOfPointsPerPiece() { this->SetDiceMode(VTK_DICE_MODE_NUMBER_OF_POINTS); }
void SetDiceModeToSpecifiedNumberOfPieces() { this->SetDiceMode(VTK_DICE_MODE_SPECIFIED_NUMBER); }
void SetDiceModeToMemoryLimitPerPiece() { this->SetDiceMode(VTK_DICE_MODE_MEMORY_LIMIT); }
//@}
//@{
/**
* Use the following method after the filter has updated to
* determine the actual number of pieces the data was separated
* into.
*/
vtkGetMacro(NumberOfActualPieces, int);
//@}
//@{
/**
* Control piece size based on the maximum number of points per piece.
* (This ivar has effect only when the DiceMode is set to
* SetDiceModeToNumberOfPoints().)
*/
vtkSetClampMacro(NumberOfPointsPerPiece, int, 1000, VTK_INT_MAX);
vtkGetMacro(NumberOfPointsPerPiece, int);
//@}
//@{
/**
* Set/Get the number of pieces the object is to be separated into.
* (This ivar has effect only when the DiceMode is set to
* SetDiceModeToSpecifiedNumber()). Note that the ivar
* NumberOfPieces is a target - depending on the particulars of the
* data, more or less number of pieces than the target value may be
* created.
*/
vtkSetClampMacro(NumberOfPieces, int, 1, VTK_INT_MAX);
vtkGetMacro(NumberOfPieces, int);
//@}
//@{
/**
* Control piece size based on a memory limit. (This ivar has
* effect only when the DiceMode is set to
* SetDiceModeToMemoryLimit()). The memory limit should be set in
* kibibytes (1024 bytes).
*/
vtkSetClampMacro(MemoryLimit, unsigned long, 100, VTK_INT_MAX);
vtkGetMacro(MemoryLimit, unsigned long);
//@}
protected:
vtkDicer();
~vtkDicer() override {}
virtual void UpdatePieceMeasures(vtkDataSet* input);
int NumberOfPointsPerPiece;
int NumberOfPieces;
unsigned long MemoryLimit;
int NumberOfActualPieces;
vtkTypeBool FieldData;
int DiceMode;
private:
vtkDicer(const vtkDicer&) = delete;
void operator=(const vtkDicer&) = delete;
};
#endif