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.

244 lines
7.5 KiB
C++

/*=========================================================================
Program: ParaView
Module: vtkSelection.h
Copyright (c) Kitware, Inc.
All rights reserved.
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html 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 vtkSelection
* @brief data object that represents a "selection" in VTK.
*
* vtkSelection is a data object that represents a selection definition. It is
* used to define the elements that are selected. The criteria of the selection
* is defined using one or more vtkSelectionNode instances. Parameters of the
* vtkSelectionNode define what kind of elements are being selected
* (vtkSelectionNode::GetFieldType), how the selection criteria is defined
* (vtkSelectionNode::GetContentType), etc.
*
* Filters like vtkExtractSelection, vtkExtractDataArraysOverTime can be used to
* extract the selected elements from a dataset.
*
* @section CombiningSelection Combining Selections
*
* When a vtkSelection contains multiple vtkSelectionNode instances, the
* selection defined is a union of all the elements identified by each of the
* nodes.
*
* Optionally, one can use `vtkSelection::SetExpression` to define a boolean
* expression to build arbitrarily complex combinations. The expression can be
* defined using names assigned to the selection nodes when the nodes are added
* to vtkSelection (either explicitly or automatically).
*
* @sa
* vtkSelectionNode
*/
#ifndef vtkSelection_h
#define vtkSelection_h
#include "vtkCommonDataModelModule.h" // For export macro
#include "vtkDataObject.h"
#include "vtkSmartPointer.h" // for vtkSmartPointer.
#include <memory> // for unique_ptr.
#include <string> // for string.
class vtkSelectionNode;
class vtkSignedCharArray;
class VTKCOMMONDATAMODEL_EXPORT vtkSelection : public vtkDataObject
{
public:
vtkTypeMacro(vtkSelection, vtkDataObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
static vtkSelection* New();
/**
* Restore data object to initial state,
*/
void Initialize() override;
/**
* Returns VTK_SELECTION enumeration value.
*/
int GetDataObjectType() override { return VTK_SELECTION; }
/**
* Returns the number of nodes in this selection.
* Each node contains information about part of the selection.
*/
unsigned int GetNumberOfNodes() const;
/**
* Returns a node given it's index. Performs bound checking
* and will return nullptr if out-of-bounds.
*/
virtual vtkSelectionNode* GetNode(unsigned int idx) const;
/**
* Returns a node with the given name, if present, else nullptr is returned.
*/
virtual vtkSelectionNode* GetNode(const std::string& name) const;
/**
* Adds a selection node. Assigns the node a unique name and returns that
* name. This API is primarily provided for backwards compatibility and
* `SetNode` is the preferred method.
*/
virtual std::string AddNode(vtkSelectionNode*);
/**
* Adds a vtkSelectionNode and assigns it the specified name. The name
* must be a non-empty string. If an item with the same name
* has already been added, it will be removed.
*/
virtual void SetNode(const std::string& name, vtkSelectionNode*);
/**
* Returns the name for a node at the given index.
*/
virtual std::string GetNodeNameAtIndex(unsigned int idx) const;
//@{
/**
* Removes a selection node.
*/
virtual void RemoveNode(unsigned int idx);
virtual void RemoveNode(const std::string& name);
virtual void RemoveNode(vtkSelectionNode*);
//@}
/**
* Removes all selection nodes.
*/
virtual void RemoveAllNodes();
//@{
/**
* Get/Set the expression that defines the boolean expression to combine the
* selection nodes. Expression consists of node name identifiers, `|` for
* boolean-or, '&' for boolean and, '!' for boolean not, and parenthesis `(`
* and `)`. If the expression consists of a node name identifier that is not
* assigned any `vtkSelectionNode` (using `SetNode`) then it is evaluates to
* `false`.
*
* `SetExpression` does not validate the expression. It will be validated in
* `Evaluate` call.
*/
vtkSetMacro(Expression, std::string);
vtkGetMacro(Expression, std::string);
//@}
/**
* Copy selection nodes of the input.
*/
void DeepCopy(vtkDataObject* src) override;
/**
* Copy selection nodes of the input.
* This is a shallow copy: selection lists and pointers in the
* properties are passed by reference.
*/
void ShallowCopy(vtkDataObject* src) override;
/**
* Union this selection with the specified selection.
* Attempts to reuse selection nodes in this selection if properties
* match exactly. Otherwise, creates new selection nodes.
*/
virtual void Union(vtkSelection* selection);
/**
* Union this selection with the specified selection node.
* Attempts to reuse a selection node in this selection if properties
* match exactly. Otherwise, creates a new selection node.
*/
virtual void Union(vtkSelectionNode* node);
/**
* Remove the nodes from the specified selection from this selection.
* Assumes that selection node internal arrays are vtkIdTypeArrays.
*/
virtual void Subtract(vtkSelection* selection);
/**
* Remove the nodes from the specified selection from this selection.
* Assumes that selection node internal arrays are vtkIdTypeArrays.
*/
virtual void Subtract(vtkSelectionNode* node);
/**
* Return the MTime taking into account changes to the properties
*/
vtkMTimeType GetMTime() override;
//@{
/**
* Dumps the contents of the selection, giving basic information only.
*/
virtual void Dump();
virtual void Dump(ostream& os);
//@}
//@{
/**
* Retrieve a vtkSelection stored inside an invormation object.
*/
static vtkSelection* GetData(vtkInformation* info);
static vtkSelection* GetData(vtkInformationVector* v, int i = 0);
//@}
/**
* Evaluates the expression for each element in the values. The order
* matches the order of the selection nodes. If not expression is set or if
* it's an empty string, then an expression that simply combines all selection
* nodes in an binary-or is assumed.
*/
vtkSmartPointer<vtkSignedCharArray> Evaluate(
vtkSignedCharArray* const* values, unsigned int num_values) const;
/**
* Convenience method to pass a map of vtkSignedCharArray ptrs (or
* vtkSmartPointers).
*/
template <typename MapType>
vtkSmartPointer<vtkSignedCharArray> Evaluate(const MapType& values_map) const;
protected:
vtkSelection();
~vtkSelection() override;
std::string Expression;
private:
vtkSelection(const vtkSelection&) = delete;
void operator=(const vtkSelection&) = delete;
class vtkInternals;
vtkInternals* Internals;
};
//----------------------------------------------------------------------------
template <typename MapType>
inline vtkSmartPointer<vtkSignedCharArray> vtkSelection::Evaluate(const MapType& values_map) const
{
const unsigned int num_nodes = this->GetNumberOfNodes();
std::unique_ptr<vtkSignedCharArray*[]> values(new vtkSignedCharArray*[num_nodes]);
for (unsigned int cc = 0; cc < num_nodes; ++cc)
{
auto iter = values_map.find(this->GetNodeNameAtIndex(cc));
values[cc] = iter != values_map.end() ? iter->second : nullptr;
}
return this->Evaluate(&values[0], num_nodes);
}
#endif