/*========================================================================= Program: Visualization Toolkit Module: vtkSelectionNode.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 vtkSelectionNode * @brief a node in a vtkSelection the defines the selection criteria. * * vtkSelectionNode helps define the selection criteria in a vtkSelection. * vtkSelection can comprise of multiple such vtkSelectionNode instances that * help define the selection. * * vtkSelectionNode has two components: a list of properties (stored in a * vtkInformation) and a selection list (a vtkAbstractArray subclass). The * properties help indicate how to interpret the values specified in a * selection-list. * * The properties can be broadly classified into three categories: core, * qualifiers, and information. The core properties must be specified other wise the * vtkSelectionNode is not considered valid. These are `FIELD_TYPE` and * `CONTENT_TYPE`. `FIELD_TYPE` defines what kinds of entities are being selected. * Since selections are used to select items in a data-object, these correspond to * things like cells, points, nodes, edges, rows, etc. Supported FIELD_TYPE * values are defined in `vtkSelectionNode::SelectionField`. `CONTENT_TYPE` * defines the how the selection is described. Supported values are * `vtkSelectionNode::SelectionContent`. For example, if CONTENT_TYPE is * `INDICES`, then selection is described as ids for entities being selected. * The ids themselves will be specified using the selection list. Thus, the * CONTENT_TYPE dictates what the selection list comprises. * * Qualifiers are used to further qualify the selection criteria. All qualifiers * are optional. When present they restrict the selection. For example, when * selecting elements from a composite-dataset, the `COMPOSITE_INDEX` qualifier * can be specified of limit the selection to a specific dataset (or subtree). * * Information properties are simply for informative purposes and generally used * to provide information about the selection when the selection is created. For * example, `PIXEL_COUNT` is used to indicate how many screen pixels resulted in * creation of this selection node. * * @section SelectionTypes Selection Types * * `CONTENT_TYPE` property is one of the required properties that helps * describe how the selection is defined. To set the content type, one can * access the properties store using `vtkSelectionNode::GetProperties()` and * then set the `CONTENT_TYPE` using the `vtkSelectionNode::CONTENT_TYPE()` key * or simply use `vtkSelectionNode::SetContentType`. * * * `vtkSelectionNode::GLOBALIDS`: indicates that the selection is defined * using global ids. In VTK data-object, global ids are specified an `vtkIdTypeArray` * added to a appropriate `vtkDataSetAttributes` and marked as global-ids * using vtkDataSetAttributes API. Since global ids are expected to be unique * for that element type over the entire dataset, it's a convenient way of * defining selections. For this content-type, the selection list must be * a single-component, `vtkIdTypeArray` that lists all the globals ids for * the selected elements. * * * `vtkSelectionNode::PEDIGREEIDS`: similar to `GLOBALIDS` except uses * pedigree ids instead of global ids. * * * `vtkSelectionNode::VALUES`: this type is used to define a selection based * on array values. The selection list specifies the values to be selected. * All elements with array values in the selection list are treated as * selected. The qualifier COMPONENT_NUMBER is used to indicate which * component to use for the checks. Use `-1` for magnitude. Current * implementation does not support checking multiple-components or non-exact * matches although support for both is conceivable in future. * The selection list array name is used to specify the name of the array from * the dataset to use for the checks. Thus, for defining a selection for a * dataset where all `TEMP` values match those specified in the selection * list, ensure that the selection list array's name is set to `TEMP` as well. * * * `vtkSelectionNode::INDICES`: this is similar to global ids except in this * case the selection list is simply the VTK element id which is 0-based * index of that element in the particular dataset. Often with this type of * selection, additional qualifiers such as `COMPOSITE_INDEX`, * `BLOCK_SELECTORS`, `PROCESS_ID` etc. are needed to correctly identify the * chosen element(s) in case of composite or distributed datasets. * * * `vtkSelectionNode::FRUSTUM`: this type is used to define a frustum in world * coordinates that identifies the selected elements. In this case, the * selection list is a vtkDoubleArray with 32 values specifying the 8 frustum * corners in homogeneous world coordinates. * * * `vtkSelectionNode::LOCATIONS`: this is used to select points (or cells) * near (or containing) specified locations. The selection list is a * 3-component vtkDoubleArray with coordinates for locations of interest. * * * `vtkSelectionNode::THRESHOLDS`: this type is used to define a selection based * on array value ranges. This is akin to thresholding. All elements with values in * the specified ranges are to be treated as selected. For this content-type, * the selection-list is a 2-component `vtkDataArray`-subclass that specifies * where each tuple defines the min and max values for a range. The selection * list can have multiple tuples to define multiple ranges. Elements with * values in any of the specified ranges are treated as selected. The * selection list array name is used to specify the name of the array from * the dataset to use for the checks. Thus, for defining a selection for a * dataset where all `TEMP` values are within a range, ensure that the * selection list array's name is set to `TEMP` as well. * * * `vtkSelectionNode::BLOCKS`: this type is used to select blocks in a * composite dataset. The term blocks is used loosely here and can correspond * to a block in a multiblock dataset or a partition in a partitioned-dataset. * The selection list is an integral type vtkDataArray subclass that can be 1- * or 2- component. If 1-component, it's interpreted as the composite-index * (also called flat index) and can be applied to any composite-dataset to * choose specific datasets. If 2-component, it's typically associated with * vtkUniformGridAMR or vtkPartitionedDataSetCollection which support 2-tuple * indexing to locate a dataset. * * * `vtkSelectionNode::BLOCK_SELECTORS`: this is similar to BLOCKS, however * instead of using indices to select datasets, here, the selection list is a * vtkStringArray which lists selector expressions to select blocks in the * composite dataset. By default, the selector expressions are applied to a * vtkDataAssembly generated from the composite dataset that represents its * hierarchy (see `vtkDataAssembly::GenerateHierarchy`). However, in case of * vtkPartitionedDataSetCollection, one can select any other data assembly * associated with the vtkPartitionedDataSetCollection by naming the array * with the name of the assembly. * * @note, currently vtkPartitionedDataSetCollection only supports a single * vtkDataAssembly but this may change in the future. * * * `vtkSelectionNode::QUERY`: this type is primarily added for ParaView where * selection expression is specified as a query string. This is likely to * change in the future and hence applications are discouraged from using this * type. * * @section Properties Properties * * Following a properties that can be used to qualify the selection. * * * `vtkSelectionNode::EPSILON()`: this is a qualifier that can be used to * indicate a fuzz-factor when comparing values for equality. Currently, this * is only used with content-type LOCATIONS, however, it can be expanded to * other selection types in the future. * * * `vtkSelectionNode::CONTAINING_CELLS()`: this qualifier is intended to be * used with field-type `POINT`. When present, it indicates that while the * selection criteria selects a collection of points the selection should be * formed using cell containing the chosen points. * * * `vtkSelectionNode::CONNECTED_LAYERS()`: a qualifier used to expand the * definition of selected elements to connected elements for the specified * number of layers. Layers can be positive or negative to grow or shrink the * selection respectively. * * * `vtkSelectionNode::INVERSE()`: a qualifier that causes the selection to be * inverted i.e. all elements not chosen by the criteria are to be treated * as selected. * * * `vtkSelectionNode::COMPONENT_NUMBER()`: for VALUES and THRESHOLDS selection * types, this qualifier identifies the array component of interest. -1 * indicates magnitude. * * * `vtkSelectionNode::PROCESS_ID()`: limits the selection to a particular * rank in a distributed environment. * * * `vtkSelectionNode::COMPOSITE_INDEX()`: a qualifier used to limit the * selection to a specific composite index for a composite-dataset. * * * `vtkSelectionNode::ASSEMBLY_NAME()`, `vtkSelectionNode::SELECTORS()`: * similar to composite index, except uses data-assembly and selectors to * limit the selection to a subset of nodes in a composite-dataset. * * * `vtkSelectionNode::HIERARCHICAL_LEVEL()`, * `vtkSelectionNode::HIERARCHICAL_INDEX()`: similar to composite index, except * uses level and index for an AMR dataset so limit the selection to a * specific AMR level or dataset. * * Following for properties that are primarily intended to provide additional * information when the selection is created. * * * `vtkSelectionNode::ZBUFFER_VALUE()`: an information qualifier representing * the z-depth for a particular selection when it was created. * * * `vtkSelectionNode::PIXEL_COUNT()`: a qualifier used to provide a count for * the number of pixels that resulted in this selection. * * * `vtkSelectionNode::SOURCE()`, `vtkSelectionNode::SOURCE_ID()`: provides * information about data producer or selection originator. The interpretation * is very specific to the creator creating the selection and varies greatly * with VTK. * * * `vtkSelectionNode::PROP(), `vtkSelectionNode::PROP_ID()`: similar to * SOURCE/SOURCE_ID except is used to represent a rendering prop from which * the selection was created. * * @warning * No SelectionList is created by default. It should be assigned. * * @section SelectionFieldMismatch vtkSelectionNode::SelectionField and * vtkDataSetAttribute::AttributeTypes * * Strictly speaking, vtkSelectionNode::SelectionField maps directly to * vtkDataSetAttribute::AttributeTypes. However, the two enum values are not * identical for historical reasons. Use * `vtkSelectionNode::ConvertSelectionFieldToAttributeType` and * `vtkSelectionNode::ConvertAttributeTypeToSelectionField` to convert between * the two. */ #ifndef vtkSelectionNode_h #define vtkSelectionNode_h #include "vtkCommonDataModelModule.h" // For export macro #include "vtkDeprecation.h" // for deprecation #include "vtkObject.h" class vtkAbstractArray; class vtkDataSetAttributes; class vtkInformation; class vtkInformationDoubleKey; class vtkInformationIntegerKey; class vtkInformationObjectBaseKey; class vtkInformationStringKey; class vtkInformationStringVectorKey; class vtkProp; class vtkTable; class VTKCOMMONDATAMODEL_EXPORT vtkSelectionNode : public vtkObject { public: vtkTypeMacro(vtkSelectionNode, vtkObject); void PrintSelf(ostream& os, vtkIndent indent) override; static vtkSelectionNode* New(); /** * Restore data object to initial state, */ virtual void Initialize(); ///@{ /** * Get/Set the selection list. The selection list is the container * that stores values that indicate the selected items. What these values * correspond to depends on the `ContentType`. `ContentType` may also dictate * the type and form of the selection list array. */ virtual void SetSelectionList(vtkAbstractArray*); virtual vtkAbstractArray* GetSelectionList(); ///@} ///@{ /** * Sets the selection table. */ virtual void SetSelectionData(vtkDataSetAttributes* data); vtkGetObjectMacro(SelectionData, vtkDataSetAttributes); ///@} ///@{ /** * Returns the property map. */ vtkGetObjectMacro(Properties, vtkInformation); ///@} /** * Copy properties, selection list and children of the input. */ virtual void DeepCopy(vtkSelectionNode* src); /** * Copy properties, selection list and children of the input. * This is a shallow copy: selection lists and pointers in the * properties are passed by reference. */ virtual void ShallowCopy(vtkSelectionNode* src); /** * Return the MTime taking into account changes to the properties */ vtkMTimeType GetMTime() override; // vtkSelectionNode specific keys follow: /** * Get the (primary) property that describes the content of a selection * node's data. This key takes on values from the SelectionContent enum. * GetContentType() returns -1 if the content type is not set. * * \sa vtkSelectionNode::SelectionContent */ static vtkInformationIntegerKey* CONTENT_TYPE(); /** * Indicate the means by which data is selected. * In some cases this implies the type of data selected. */ enum SelectionContent { GLOBALIDS, //!< Select entities called out by their globally-unique IDs. PEDIGREEIDS, //!< Select entities that have some identifiable pedigree. VALUES, //!< Select entities that take on specific array values. INDICES, //!< Select entities by their offsets into the dataset. FRUSTUM, //!< Select entities contained within a viewing frustum. LOCATIONS, //!< Select entities near the supplied world coordinates. THRESHOLDS, //!< Select entities whose array values fall within a given threshold. BLOCKS, //!< Select blocks within a composite dataset by their flat index. BLOCK_SELECTORS, //!< Select datasets within a composite dataset using selector expressions. QUERY, //!< Select entities with a text query. USER, //!< Select entities with user-supplied, application-specific logic. NUM_CONTENT_TYPES }; ///@{ /** * Get or set the content type of the selection. * This is the same as setting the CONTENT_TYPE() key on the property. */ virtual void SetContentType(int type); virtual int GetContentType(); ///@} /** * Get the content type as a string. */ static const char* GetContentTypeAsString(int type); /** * Controls whether cell, point, or field data determine what is inside and out. * The default is CELL. * Vertex and edge types are also available for graph classes. * GetFieldType() returns -1 if the field type is not set. */ static vtkInformationIntegerKey* FIELD_TYPE(); /// Indicate the types of entities to which the selection-data applies. enum SelectionField { CELL, //!< The selection data provided is cell-data. POINT, //!< The selection data provided is point-data. FIELD, //!< The selection data provided is field-data. VERTEX, //!< The selection data provided is graph vertex-data. EDGE, //!< The selection data provided is graph edge-data. ROW, //!< The selection data provided is table row-data. NUM_FIELD_TYPES }; ///@{ /** * Get or set the field type of the selection. * This is the same as setting the FIELD_TYPE() key on the property. */ virtual void SetFieldType(int type); virtual int GetFieldType(); ///@} /** * Get the field type as a string. */ static const char* GetFieldTypeAsString(int type); /** * Get field type from string. Returns NUM_FIELD_TYPES if not found. */ static int GetFieldTypeFromString(const char* type); ///@{ /** * Methods to convert vtkSelectionNode::SelectionField to * vtkDataSetAttribute::AttributeTypes and vice-versa. */ static int ConvertSelectionFieldToAttributeType(int val); static int ConvertAttributeTypeToSelectionField(int val); ///@} ///@{ /** * Set/Get the query expression string. */ vtkSetStringMacro(QueryString); vtkGetStringMacro(QueryString); ///@} /** * For location selection of points, if distance is greater than this reject. */ static vtkInformationDoubleKey* EPSILON(); /** * If present, closest zbuffer value of this selection */ static vtkInformationDoubleKey* ZBUFFER_VALUE(); /** * This flag tells the extraction filter, when FIELD_TYPE==POINT, that * it should also extract the cells that contain any of the extracted points. */ static vtkInformationIntegerKey* CONTAINING_CELLS(); /** * When specified, this indicates how many layers of *connected* elements * in addition to those chosen explicitly are being selected. Currently, * this is only supported for cells and points. */ static vtkInformationIntegerKey* CONNECTED_LAYERS(); /** * When ContentType==THRESHOLDS or ContentType==VALUES * i.e. threshold and value based selections, it is * possible pick the component number using this key. If none is specified, * the 0th component is used. If any number less than 0 is specified, then * the magnitude is used. */ static vtkInformationIntegerKey* COMPONENT_NUMBER(); /** * This flag tells the extraction filter to exclude the selection. */ static vtkInformationIntegerKey* INVERSE(); /** * A helper for visible cell selector, this is the number of pixels covered * by the actor whose cells are listed in the selection. */ static vtkInformationIntegerKey* PIXEL_COUNT(); /** * Pointer to the data or algorithm the selection belongs to. */ static vtkInformationObjectBaseKey* SOURCE(); /** * ID of the data or algorithm the selection belongs to. What * ID means is application specific. */ static vtkInformationIntegerKey* SOURCE_ID(); /** * Pointer to the prop the selection belongs to. */ static vtkInformationObjectBaseKey* PROP(); /** * ID of the prop the selection belongs to. What * ID means is application specific. */ static vtkInformationIntegerKey* PROP_ID(); /** * Process id the selection is on. */ static vtkInformationIntegerKey* PROCESS_ID(); ///@{ /** * Keys for selector-based identification of * blocks to choose from a composite dataset. `ASSEMBLY_NAME` identifies the * name for the assembly to use and `SELECTORS` provide a list of node * selectors applied to the chosen assembly. * * Use `vtkDataAssemblyUtilities::HierarchyName` as the assembly name * to use the data hierarchy */ static vtkInformationStringKey* ASSEMBLY_NAME(); static vtkInformationStringVectorKey* SELECTORS(); ///@} /** * Used to identify a node in composite datasets. */ static vtkInformationIntegerKey* COMPOSITE_INDEX(); ///@{ /** * Used to identify a dataset in a hiererchical box dataset. */ static vtkInformationIntegerKey* HIERARCHICAL_LEVEL(); static vtkInformationIntegerKey* HIERARCHICAL_INDEX(); ///@} /** * @deprecated no longer relevant. */ VTK_DEPRECATED_IN_9_1_0("no longer relevant") static vtkInformationIntegerKey* INDEXED_VERTICES(); /** * Merges the selection list between self and the other. Assumes that both has * identical properties. */ void UnionSelectionList(vtkSelectionNode* other); /** * Subtracts the items in the selection list, other, from this selection list. * Assumes that both selections have identical properties (i.e., test with EqualProperties * before using). */ void SubtractSelectionList(vtkSelectionNode* other); /** * Compares Properties of self and other to ensure that they are exactly same. */ bool EqualProperties(vtkSelectionNode* other, bool fullcompare = true); protected: vtkSelectionNode(); ~vtkSelectionNode() override; vtkInformation* Properties; vtkDataSetAttributes* SelectionData; char* QueryString; // Map from content type to content type name static const char ContentTypeNames[SelectionContent::NUM_CONTENT_TYPES][16]; // Map from integer field type to field type name static const char FieldTypeNames[SelectionField::NUM_FIELD_TYPES][8]; private: vtkSelectionNode(const vtkSelectionNode&) = delete; void operator=(const vtkSelectionNode&) = delete; }; #endif