240 lines
7.5 KiB
C
240 lines
7.5 KiB
C
|
|
/*=========================================================================
|
||
|
|
|
||
|
|
Program: Visualization Toolkit
|
||
|
|
Module: vtkSelection.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 vtkSelection
|
||
|
|
* @brief data object that represents a "selection" in VTK.
|
||
|
|
*
|
||
|
|
* vtkSelection defines a selection. A selection is a data-object that defines
|
||
|
|
* which entities from another data-object are to treated as "selected". Filters like
|
||
|
|
* `vtkExtractSelection` or `vtkExtractDataArraysOverTime` can then be used to
|
||
|
|
* extract these selected entities from the *other* data-object.
|
||
|
|
*
|
||
|
|
* vtkSelection comprises of `vtkSelectionNode`s and optionally, an expression
|
||
|
|
* specified using `vtkSelection::SetExpression`. If non-empty, the expression
|
||
|
|
* is a boolean expression that defines now the selection nodes present in the
|
||
|
|
* selection are to be combined together to form the selection. If no expression
|
||
|
|
* is specified and there are multiple selection nodes, then the default
|
||
|
|
* expression simply combines all the selection nodes using an `or` operator.
|
||
|
|
*
|
||
|
|
* Each vtkSelectionNode is used to define the selection criteria.
|
||
|
|
* vtkSelectionNode API lets one select what kind of entities are being selected
|
||
|
|
* (vtkSelectionNode::FieldType) and how they are being selected
|
||
|
|
* (vtkSelectionNode::ContentType).
|
||
|
|
*
|
||
|
|
* @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-xor, '&' 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
|