You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
7.3 KiB
196 lines
7.3 KiB
2 years ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: $RCSfile: vtkSelectPolyData.h,v $
|
||
|
|
||
|
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.
|
||
|
|
||
|
=========================================================================*/
|
||
|
// .NAME vtkSelectPolyData - select portion of polygonal mesh; generate selection scalars
|
||
|
// .SECTION Description
|
||
|
// vtkSelectPolyData is a filter that selects polygonal data based on
|
||
|
// defining a "loop" and indicating the region inside of the loop. The
|
||
|
// mesh within the loop consists of complete cells (the cells are not
|
||
|
// cut). Alternatively, this filter can be used to generate scalars.
|
||
|
// These scalar values, which are a distance measure to the loop, can
|
||
|
// be used to clip, contour. or extract data (i.e., anything that an
|
||
|
// implicit function can do).
|
||
|
//
|
||
|
// The loop is defined by an array of x-y-z point coordinates.
|
||
|
// (Coordinates should be in the same coordinate space as the input
|
||
|
// polygonal data.) The loop can be concave and non-planar, but not
|
||
|
// self-intersecting. The input to the filter is a polygonal mesh
|
||
|
// (only surface primitives such as triangle strips and polygons); the
|
||
|
// output is either a) a portion of the original mesh laying within
|
||
|
// the selection loop (GenerateSelectionScalarsOff); or b) the same
|
||
|
// polygonal mesh with the addition of scalar values
|
||
|
// (GenerateSelectionScalarsOn).
|
||
|
//
|
||
|
// The algorithm works as follows. For each point coordinate in the
|
||
|
// loop, the closest point in the mesh is found. The result is a loop
|
||
|
// of closest point ids from the mesh. Then, the edges in the mesh
|
||
|
// connecting the closest points (and laying along the lines forming
|
||
|
// the loop) are found. A greedy edge tracking procedure is used as
|
||
|
// follows. At the current point, the mesh edge oriented in the
|
||
|
// direction of and whose end point is closest to the line is
|
||
|
// chosen. The edge is followed to the new end point, and the
|
||
|
// procedure is repeated. This process continues until the entire loop
|
||
|
// has been created.
|
||
|
//
|
||
|
// To determine what portion of the mesh is inside and outside of the
|
||
|
// loop, three options are possible. 1) the smallest connected region,
|
||
|
// 2) the largest connected region, and 3) the connected region
|
||
|
// closest to a user specified point. (Set the ivar SelectionMode.)
|
||
|
//
|
||
|
// Once the loop is computed as above, the GenerateSelectionScalars
|
||
|
// controls the output of the filter. If on, then scalar values are
|
||
|
// generated based on distance to the loop lines. Otherwise, the cells
|
||
|
// laying inside the selection loop are output. By default, the mesh
|
||
|
// lying within the loop is output; however, if InsideOut is on, then
|
||
|
// the portion of the mesh lying outside of the loop is output.
|
||
|
//
|
||
|
// The filter can be configured to generate the unselected portions of
|
||
|
// the mesh as output by setting GenerateUnselectedOutput. Use the
|
||
|
// method GetUnselectedOutput to access this output. (Note: this flag
|
||
|
// is pertinent only when GenerateSelectionScalars is off.)
|
||
|
|
||
|
// .SECTION Caveats
|
||
|
// Make sure that the points you pick are on a connected surface. If
|
||
|
// not, then the filter will generate an empty or partial result. Also,
|
||
|
// self-intersecting loops will generate unpredictable results.
|
||
|
//
|
||
|
// During processing of the data, non-triangular cells are converted to
|
||
|
// triangles if GenerateSelectionScalars is off.
|
||
|
|
||
|
// .SECTION See Also
|
||
|
// vtkImplicitSelectionLoop
|
||
|
|
||
|
#ifndef __vtkSelectPolyData_h
|
||
|
#define __vtkSelectPolyData_h
|
||
|
|
||
|
#include "vtkPolyDataAlgorithm.h"
|
||
|
|
||
|
#define VTK_INSIDE_SMALLEST_REGION 0
|
||
|
#define VTK_INSIDE_LARGEST_REGION 1
|
||
|
#define VTK_INSIDE_CLOSEST_POINT_REGION 2
|
||
|
|
||
|
class vtkCharArray;
|
||
|
class vtkPoints;
|
||
|
class vtkIdList;
|
||
|
|
||
|
class VTK_GRAPHICS_EXPORT vtkSelectPolyData : public vtkPolyDataAlgorithm
|
||
|
{
|
||
|
public:
|
||
|
// Description:
|
||
|
// Instantiate object with InsideOut turned off, and
|
||
|
// GenerateSelectionScalars turned off. The unselected output
|
||
|
// is not generated, and the inside mode is the smallest region.
|
||
|
static vtkSelectPolyData *New();
|
||
|
|
||
|
vtkTypeRevisionMacro(vtkSelectPolyData,vtkPolyDataAlgorithm);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent);
|
||
|
|
||
|
// Description:
|
||
|
// Set/Get the flag to control behavior of the filter. If
|
||
|
// GenerateSelectionScalars is on, then the output of the filter
|
||
|
// is the same as the input, except that scalars are generated.
|
||
|
// If off, the filter outputs the cells laying inside the loop, and
|
||
|
// does not generate scalars.
|
||
|
vtkSetMacro(GenerateSelectionScalars,int);
|
||
|
vtkGetMacro(GenerateSelectionScalars,int);
|
||
|
vtkBooleanMacro(GenerateSelectionScalars,int);
|
||
|
|
||
|
// Description:
|
||
|
// Set/Get the InsideOut flag. When off, the mesh within the loop is
|
||
|
// extracted. When on, the mesh outside the loop is extracted.
|
||
|
vtkSetMacro(InsideOut,int);
|
||
|
vtkGetMacro(InsideOut,int);
|
||
|
vtkBooleanMacro(InsideOut,int);
|
||
|
|
||
|
// Description:
|
||
|
// Set/Get the array of point coordinates defining the loop. There must
|
||
|
// be at least three points used to define a loop.
|
||
|
virtual void SetLoop(vtkPoints*);
|
||
|
vtkGetObjectMacro(Loop,vtkPoints);
|
||
|
|
||
|
// Description:
|
||
|
// Control how inside/outside of loop is defined.
|
||
|
vtkSetClampMacro(SelectionMode,int,
|
||
|
VTK_INSIDE_SMALLEST_REGION,VTK_INSIDE_CLOSEST_POINT_REGION);
|
||
|
vtkGetMacro(SelectionMode,int);
|
||
|
void SetSelectionModeToSmallestRegion()
|
||
|
{this->SetSelectionMode(VTK_INSIDE_SMALLEST_REGION);};
|
||
|
void SetSelectionModeToLargestRegion()
|
||
|
{this->SetSelectionMode(VTK_INSIDE_LARGEST_REGION);};
|
||
|
void SetSelectionModeToClosestPointRegion()
|
||
|
{this->SetSelectionMode(VTK_INSIDE_CLOSEST_POINT_REGION);};
|
||
|
const char *GetSelectionModeAsString();
|
||
|
|
||
|
// Description:
|
||
|
// Control whether a second output is generated. The second output
|
||
|
// contains the polygonal data that's not been selected.
|
||
|
vtkSetMacro(GenerateUnselectedOutput,int);
|
||
|
vtkGetMacro(GenerateUnselectedOutput,int);
|
||
|
vtkBooleanMacro(GenerateUnselectedOutput,int);
|
||
|
|
||
|
// Description:
|
||
|
// Return output that hasn't been selected (if GenreateUnselectedOutput is
|
||
|
// enabled).
|
||
|
vtkPolyData *GetUnselectedOutput();
|
||
|
|
||
|
// Description:
|
||
|
// Return the (mesh) edges of the selection region.
|
||
|
vtkPolyData *GetSelectionEdges();
|
||
|
|
||
|
// Overload GetMTime() because we depend on Loop
|
||
|
unsigned long int GetMTime();
|
||
|
|
||
|
protected:
|
||
|
vtkSelectPolyData();
|
||
|
~vtkSelectPolyData();
|
||
|
|
||
|
int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
|
||
|
|
||
|
int GenerateSelectionScalars;
|
||
|
int InsideOut;
|
||
|
vtkPoints *Loop;
|
||
|
int SelectionMode;
|
||
|
double ClosestPoint[3];
|
||
|
int GenerateUnselectedOutput;
|
||
|
|
||
|
private:
|
||
|
vtkPolyData *Mesh;
|
||
|
void GetPointNeighbors (vtkIdType ptId, vtkIdList *nei);
|
||
|
private:
|
||
|
vtkSelectPolyData(const vtkSelectPolyData&); // Not implemented.
|
||
|
void operator=(const vtkSelectPolyData&); // Not implemented.
|
||
|
};
|
||
|
|
||
|
// Description:
|
||
|
// Return the method of determining in/out of loop as a string.
|
||
|
inline const char *vtkSelectPolyData::GetSelectionModeAsString(void)
|
||
|
{
|
||
|
if ( this->SelectionMode == VTK_INSIDE_SMALLEST_REGION )
|
||
|
{
|
||
|
return "InsideSmallestRegion";
|
||
|
}
|
||
|
else if ( this->SelectionMode == VTK_INSIDE_LARGEST_REGION )
|
||
|
{
|
||
|
return "InsideLargestRegion";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return "InsideClosestPointRegion";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|