1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
/**
* @class vtkLoopBooleanPolyDataFilter
*
*
* Computes the boundary of the union, intersection, or difference
* volume computed from the volumes defined by two input surfaces. The
* two surfaces do not need to be manifold, but if they are not,
* unexpected results may be obtained. The resulting surface is
* available in the first output of the filter. The second output
* contains a set of polylines that represent the intersection between
* the two input surfaces.
* The filter uses vtkIntersectionPolyDataFilter. Must have information
* about the cells on mesh that the intersection lines touch. Filter assumes
* this information is given.
* The output result will have data about the Original Surface,
* BoundaryPoints, Boundary Cells,
* Free Edges, and Bad Triangles
*/
#ifndef vtkLoopBooleanPolyDataFilter_h
#define vtkLoopBooleanPolyDataFilter_h
#include "vtkDataSetAttributes.h" // Needed for CopyCells() method
#include "vtkFiltersGeneralModule.h" // For export macro
#include "vtkPolyDataAlgorithm.h"
VTK_ABI_NAMESPACE_BEGIN
class vtkIdList;
/*!
* \brief Filter to perform boolean operations
* \author Adam Updegrove
*/
class VTKFILTERSGENERAL_EXPORT vtkLoopBooleanPolyDataFilter : public vtkPolyDataAlgorithm
{
public:
/**
* Construct object that computes the boolean surface.
*/
static vtkLoopBooleanPolyDataFilter* New();
vtkTypeMacro(vtkLoopBooleanPolyDataFilter, vtkPolyDataAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
///@{
/**
* Integer describing the number of intersection points and lines
*/
vtkGetMacro(NumberOfIntersectionPoints, int);
vtkGetMacro(NumberOfIntersectionLines, int);
///@}
///@{
/**
* ONLY USED IF NO INTERSECTION BETWEEN SURFACES
* Variable to determine what is output if no intersection occurs.
* 0 = neither (default), 1 = first, 2 = second, 3 = both
*/
vtkGetMacro(NoIntersectionOutput, int);
vtkSetMacro(NoIntersectionOutput, int);
vtkBooleanMacro(NoIntersectionOutput, int);
///@}
// Union intersection, or difference
enum OperationType
{
VTK_UNION = 0,
VTK_INTERSECTION,
VTK_DIFFERENCE
};
// Output if no intersection
enum NoIntersectionOutputType
{
VTK_NEITHER = 0,
VTK_FIRST,
VTK_SECOND,
VTK_BOTH,
};
///@{
/**
* Set the boolean operation to perform. Defaults to union.
*/
vtkSetClampMacro(Operation, int, VTK_UNION, VTK_DIFFERENCE);
vtkGetMacro(Operation, int);
void SetOperationToUnion() { this->SetOperation(VTK_UNION); }
void SetOperationToIntersection() { this->SetOperation(VTK_INTERSECTION); }
void SetOperationToDifference() { this->SetOperation(VTK_DIFFERENCE); }
///@}
///@{
/**
* Check the status of the filter after update. If the status is zero,
* there was an error in the operation. If status is one, everything
* went smoothly
*/
vtkGetMacro(Status, int);
///@}
///@{
/**
* Set the tolerance for geometric tests
*/
vtkGetMacro(Tolerance, double);
vtkSetMacro(Tolerance, double);
///@}
protected:
vtkLoopBooleanPolyDataFilter();
~vtkLoopBooleanPolyDataFilter() override;
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int FillInputPortInformation(int, vtkInformation*) override;
private:
vtkLoopBooleanPolyDataFilter(const vtkLoopBooleanPolyDataFilter&) = delete;
void operator=(const vtkLoopBooleanPolyDataFilter&) = delete;
///@{
/**
* Which operation to perform.
* Can be VTK_UNION, VTK_INTERSECTION, or VTK_DIFFERENCE.
*/
int Operation;
int NoIntersectionOutput;
int NumberOfIntersectionPoints;
int NumberOfIntersectionLines;
///@}
int Status;
double Tolerance;
class Impl;
};
VTK_ABI_NAMESPACE_END
#endif
|