/*========================================================================= Program: Visualization Toolkit Module: vtkLabelHierarchyIterator.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. =========================================================================*/ /*------------------------------------------------------------------------- Copyright 2008 Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains certain rights in this software. -------------------------------------------------------------------------*/ /** * @class vtkLabelHierarchyIterator * @brief iterator over vtkLabelHierarchy * * * Abstract superclass for iterators over vtkLabelHierarchy. */ #ifndef vtkLabelHierarchyIterator_h #define vtkLabelHierarchyIterator_h #include "vtkRenderingLabelModule.h" // For export macro #include "vtkObject.h" #include "vtkStdString.h" // for std string #include "vtkUnicodeString.h" // for unicode string class vtkIdTypeArray; class vtkLabelHierarchy; class vtkPolyData; class VTKRENDERINGLABEL_EXPORT vtkLabelHierarchyIterator : public vtkObject { public: vtkTypeMacro(vtkLabelHierarchyIterator,vtkObject); void PrintSelf( ostream& os, vtkIndent indent ) override; /** * Initializes the iterator. lastLabels is an array holding labels * which should be traversed before any other labels in the hierarchy. * This could include labels placed during a previous rendering or * a label located under the mouse pointer. You may pass a null pointer. */ virtual void Begin( vtkIdTypeArray* ) { } /** * Advance the iterator. */ virtual void Next() { } /** * Returns true if the iterator is at the end. */ virtual bool IsAtEnd() { return true; } /** * Retrieves the current label location. */ virtual void GetPoint( double x[3] ); /** * Retrieves the current label size. */ virtual void GetSize( double sz[2] ); /** * Retrieves the current label maximum width in world coordinates. */ virtual void GetBoundedSize( double sz[2] ); /** * Retrieves the current label type. */ virtual int GetType(); /** * Retrieves the current label string. */ virtual vtkStdString GetLabel(); /** * Retrieves the current label as a unicode string. */ virtual vtkUnicodeString GetUnicodeLabel(); /** * Retrieves the current label orientation. */ virtual double GetOrientation(); /** * Retrieves the current label id. */ virtual vtkIdType GetLabelId() { return -1; } //@{ /** * Get the label hierarchy associated with the current label. */ vtkGetObjectMacro(Hierarchy, vtkLabelHierarchy); //@} /** * Sets a polydata to fill with geometry representing * the bounding boxes of the traversed octree nodes. */ virtual void SetTraversedBounds( vtkPolyData* ); /** * Retrieve the coordinates of the center of the current hierarchy node * and the size of the node. * Nodes are n-cubes, so the size is the length of any edge of the cube. * This is used by BoxNode(). */ virtual void GetNodeGeometry( double ctr[3], double& size ) = 0; /** * Add a representation to TraversedBounds for the current octree node. * This should be called by subclasses inside Next(). * Does nothing if TraversedBounds is NULL. */ virtual void BoxNode(); /** * Add a representation for all existing octree nodes to the specified polydata. * This is equivalent to setting TraversedBounds, iterating over the entire hierarchy, * and then resetting TraversedBounds to its original value. */ virtual void BoxAllNodes( vtkPolyData* ); //@{ /** * Set/get whether all nodes in the hierarchy should be added to the TraversedBounds * polydata or only those traversed. * When non-zero, all nodes will be added. * By default, AllBounds is 0. */ vtkSetMacro(AllBounds,int); vtkGetMacro(AllBounds,int); //@} protected: vtkLabelHierarchyIterator(); ~vtkLabelHierarchyIterator() override; void BoxNodeInternal3( const double* ctr, double sz ); void BoxNodeInternal2( const double* ctr, double sz ); /** * The hierarchy being traversed by this iterator. */ virtual void SetHierarchy( vtkLabelHierarchy* h ); vtkLabelHierarchy* Hierarchy; vtkPolyData* TraversedBounds; double BoundsFactor; int AllBounds; int AllBoundsRecorded; private: vtkLabelHierarchyIterator( const vtkLabelHierarchyIterator& ) = delete; void operator = ( const vtkLabelHierarchyIterator& ) = delete; }; #endif // vtkLabelHierarchyIterator_h