vtkVisItCutter.h 7.33 KB
Newer Older
hrchilds's avatar
hrchilds committed
1 2 3 4 5
/*=========================================================================

  Program:   Visualization Toolkit
  Module:    $RCSfile: vtkVisItCutter.h,v $
  Language:  C++
hrchilds's avatar
hrchilds committed
6 7
  Date:      $Date: 2003/07/01 11:20:39 $
  Version:   $Revision: 1.60 $
hrchilds's avatar
hrchilds committed
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

  Copyright (c) 1993-2002 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.

=========================================================================*/
// .NAME vtkVisItCutter - Cut vtkDataSet with user-specified implicit function
// .SECTION Description
// vtkVisItCutter is a filter to cut through data using any subclass of 
// vtkImplicitFunction. That is, a polygonal surface is created
// corresponding to the implicit function F(x,y,z) = value(s), where
// you can specify one or more values used to cut with.
//
// In VTK, cutting means reducing a cell of dimension N to a cut surface
// of dimension N-1. For example, a tetrahedron when cut by a plane (i.e.,
hrchilds's avatar
hrchilds committed
27 28
// vtkPlane implicit function) will generate triangles. (In comparison,
// clipping takes a N dimensional cell and creates N dimension primitives.)
hrchilds's avatar
hrchilds committed
29 30 31 32 33 34 35 36 37 38 39 40 41
//
// vtkVisItCutter is generally used to "slice-through" a dataset, generating
// a surface that can be visualized. It is also possible to use vtkVisItCutter
// to do a form of volume rendering. vtkVisItCutter does this by generating
// multiple cut surfaces (usually planes) which are ordered (and rendered)
// from back-to-front. The surfaces are set translucent to give a 
// volumetric rendering effect.

// .SECTION See Also
// vtkImplicitFunction vtkClipPolyData

#ifndef __vtkVisItCutter_h
#define __vtkVisItCutter_h
42
#include <visit_vtk_exports.h>
hrchilds's avatar
hrchilds committed
43

44
#include "vtkPolyDataAlgorithm.h"
hrchilds's avatar
hrchilds committed
45

hrchilds's avatar
hrchilds committed
46
#include "vtkContourValues.h" // Needed for inline methods
hrchilds's avatar
hrchilds committed
47 48 49 50

#define VTK_SORT_BY_VALUE 0
#define VTK_SORT_BY_CELL 1

hrchilds's avatar
hrchilds committed
51 52 53
class vtkImplicitFunction;
class vtkPointLocator;

54 55 56 57 58 59 60 61 62 63
// ***************************************************************************
//  Class: vtkVisItCutter
//
//  Modifications:
//    Eric Brugger, Thu Jan 10 11:42:08 PST 2013
//    Modified to inherit from vtkPolyDataAlgorithm.
//
// ***************************************************************************

class VISIT_VTK_API vtkVisItCutter : public vtkPolyDataAlgorithm
hrchilds's avatar
hrchilds committed
64 65
{
public:
66
  vtkTypeMacro(vtkVisItCutter,vtkPolyDataAlgorithm);
hrchilds's avatar
hrchilds committed
67 68 69 70 71 72 73 74 75 76
  void PrintSelf(ostream& os, vtkIndent indent);

  // Description:
  // Construct with user-specified implicit function; initial value of 0.0; and
  // generating cut scalars turned off.
  static vtkVisItCutter *New();

  // Description:
  // Set a particular contour value at contour number i. The index i ranges 
  // between 0<=i<NumberOfContours.
hrchilds's avatar
hrchilds committed
77
  void SetValue(int i, double value) 
hrchilds's avatar
hrchilds committed
78 79 80 81
    {this->ContourValues->SetValue(i,value);}
  
  // Description:
  // Get the ith contour value.
hrchilds's avatar
hrchilds committed
82
  double GetValue(int i) 
hrchilds's avatar
hrchilds committed
83 84 85 86 87
    {return this->ContourValues->GetValue(i);}

  // Description:
  // Get a pointer to an array of contour values. There will be
  // GetNumberOfContours() values in the list.
hrchilds's avatar
hrchilds committed
88
  double *GetValues() 
hrchilds's avatar
hrchilds committed
89 90 91 92 93 94
    {return this->ContourValues->GetValues();}

  // Description:
  // Fill a supplied list with contour values. There will be
  // GetNumberOfContours() values in the list. Make sure you allocate
  // enough memory to hold the list.
hrchilds's avatar
hrchilds committed
95
  void GetValues(double *contourValues)
hrchilds's avatar
hrchilds committed
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
    {this->ContourValues->GetValues(contourValues);}
  
  // Description:
  // Set the number of contours to place into the list. You only really
  // need to use this method to reduce list size. The method SetValue()
  // will automatically increase list size as needed.
  void SetNumberOfContours(int number) 
    {this->ContourValues->SetNumberOfContours(number);}

  // Description:
  // Get the number of contours in the list of contour values.
  int GetNumberOfContours() 
    {return this->ContourValues->GetNumberOfContours();}

  // Description:
  // Generate numContours equally spaced contour values between specified
  // range. Contour values will include min/max range values.
hrchilds's avatar
hrchilds committed
113
  void GenerateValues(int numContours, double range[2]) 
hrchilds's avatar
hrchilds committed
114 115 116 117 118
    {this->ContourValues->GenerateValues(numContours, range);}

  // Description:
  // Generate numContours equally spaced contour values between specified
  // range. Contour values will include min/max range values.
hrchilds's avatar
hrchilds committed
119
  void GenerateValues(int numContours, double rangeStart, double rangeEnd) 
hrchilds's avatar
hrchilds committed
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
    {this->ContourValues->GenerateValues(numContours, rangeStart, rangeEnd);}

  // Description:
  // Override GetMTime because we delegate to vtkContourValues and refer to
  // vtkImplicitFunction.
  unsigned long GetMTime();

  // Description
  // Specify the implicit function to perform the cutting.
  virtual void SetCutFunction(vtkImplicitFunction*);
  vtkGetObjectMacro(CutFunction,vtkImplicitFunction);

  // Description:
  // If this flag is enabled, then the output scalar values will be
  // interpolated from the implicit function values, and not the input scalar
  // data.
  vtkSetMacro(GenerateCutScalars,int);
  vtkGetMacro(GenerateCutScalars,int);
  vtkBooleanMacro(GenerateCutScalars,int);

  // Description:
  // Specify a spatial locator for merging points. By default, 
  // an instance of vtkMergePoints is used.
  void SetLocator(vtkPointLocator *locator);
  vtkGetObjectMacro(Locator,vtkPointLocator);

  // Description:
  // Set the sorting order for the generated polydata. There are two
  // possibilities:
  //   Sort by value = 0 - This is the most efficient sort. For each cell,
  //      all contour values are processed. This is the default.
  //   Sort by cell = 1 - For each contour value, all cells are processed.
  //      This order should be used if the extracted polygons must be rendered
  //      in a back-to-front or front-to-back order. This is very problem 
  //      dependent.
  // For most applications, the default order is fine (and faster).
  vtkSetClampMacro(SortBy,int,VTK_SORT_BY_VALUE,VTK_SORT_BY_CELL);
  vtkGetMacro(SortBy,int);
  void SetSortByToSortByValue() 
    {this->SetSortBy(VTK_SORT_BY_VALUE);}
  void SetSortByToSortByCell() 
    {this->SetSortBy(VTK_SORT_BY_CELL);}
  const char *GetSortByAsString();

  // Description:
  // Create default locator. Used to create one when none is specified. The 
  // locator is used to merge coincident points.
  void CreateDefaultLocator();

protected:
  vtkVisItCutter(vtkImplicitFunction *cf=NULL);
  ~vtkVisItCutter();

173 174 175 176 177
  virtual int RequestData(vtkInformation *,
                          vtkInformationVector **,
                          vtkInformationVector *);
  virtual int FillInputPortInformation(int port, vtkInformation *info);

hrchilds's avatar
hrchilds committed
178 179
  void UnstructuredGridCutter();
  void DataSetCutter();
hrchilds's avatar
hrchilds committed
180 181
  vtkImplicitFunction *CutFunction;
  
182 183 184
  vtkDataSet *input;
  vtkPolyData *output;

hrchilds's avatar
hrchilds committed
185 186 187 188
  vtkPointLocator *Locator;
  int SortBy;
  vtkContourValues *ContourValues;
  int GenerateCutScalars;
189

hrchilds's avatar
hrchilds committed
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
private:
  vtkVisItCutter(const vtkVisItCutter&);  // Not implemented.
  void operator=(const vtkVisItCutter&);  // Not implemented.
};

// Description:
// Return the sorting procedure as a descriptive character string.
inline const char *vtkVisItCutter::GetSortByAsString(void)
{
  if ( this->SortBy == VTK_SORT_BY_VALUE ) 
    {
    return "SortByValue";
    }
  else 
    {
    return "SortByCell";
    }
}

#endif