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.
166 lines
6.0 KiB
C++
166 lines
6.0 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtk3DWidget.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 vtk3DWidget
|
|
* @brief an abstract superclass for 3D widgets
|
|
*
|
|
* vtk3DWidget is an abstract superclass for 3D interactor observers. These
|
|
* 3D widgets represent themselves in the scene, and have special callbacks
|
|
* associated with them that allows interactive manipulation of the widget.
|
|
* Inparticular, the difference between a vtk3DWidget and its abstract
|
|
* superclass vtkInteractorObserver is that vtk3DWidgets are "placed" in 3D
|
|
* space. vtkInteractorObservers have no notion of where they are placed,
|
|
* and may not exist in 3D space at all. 3D widgets also provide auxiliary
|
|
* functions like producing a transformation, creating polydata (for seeding
|
|
* streamlines, probes, etc.) or creating implicit functions. See the
|
|
* concrete subclasses for particulars.
|
|
*
|
|
* Typically the widget is used by specifying a vtkProp3D or VTK dataset as
|
|
* input, and then invoking the "On" method to activate it. (You can also
|
|
* specify a bounding box to help position the widget.) Prior to invoking the
|
|
* On() method, the user may also wish to use the PlaceWidget() to initially
|
|
* position it. The 'i' (for "interactor") keypresses also can be used to
|
|
* turn the widgets on and off (methods exist to change the key value
|
|
* and enable keypress activiation).
|
|
*
|
|
* To support interactive manipulation of objects, this class (and
|
|
* subclasses) invoke the events StartInteractionEvent, InteractionEvent, and
|
|
* EndInteractionEvent. These events are invoked when the vtk3DWidget enters
|
|
* a state where rapid response is desired: mouse motion, etc. The events can
|
|
* be used, for example, to set the desired update frame rate
|
|
* (StartInteractionEvent), operate on the vtkProp3D or other object
|
|
* (InteractionEvent), and set the desired frame rate back to normal values
|
|
* (EndInteractionEvent).
|
|
*
|
|
* Note that the Priority attribute inherited from vtkInteractorObserver has
|
|
* a new default value which is now 0.5 so that all 3D widgets have a higher
|
|
* priority than the usual interactor styles.
|
|
*
|
|
* @sa
|
|
* vtkBoxWidget vtkPlaneWidget vtkLineWidget vtkPointWidget
|
|
* vtkSphereWidget vtkImplicitPlaneWidget
|
|
*/
|
|
|
|
#ifndef vtk3DWidget_h
|
|
#define vtk3DWidget_h
|
|
|
|
#include "vtkInteractionWidgetsModule.h" // For export macro
|
|
#include "vtkInteractorObserver.h"
|
|
|
|
class vtk3DWidgetConnection;
|
|
class vtkAlgorithmOutput;
|
|
class vtkDataSet;
|
|
class vtkProp3D;
|
|
|
|
class VTKINTERACTIONWIDGETS_EXPORT vtk3DWidget : public vtkInteractorObserver
|
|
{
|
|
public:
|
|
vtkTypeMacro(vtk3DWidget, vtkInteractorObserver);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
//@{
|
|
/**
|
|
* This method is used to initially place the widget. The placement of the
|
|
* widget depends on whether a Prop3D or input dataset is provided. If one
|
|
* of these two is provided, they will be used to obtain a bounding box,
|
|
* around which the widget is placed. Otherwise, you can manually specify a
|
|
* bounds with the PlaceWidget(bounds) method. Note: PlaceWidget(bounds)
|
|
* is required by all subclasses; the other methods are provided as
|
|
* convenience methods.
|
|
*/
|
|
virtual void PlaceWidget(double bounds[6]) = 0;
|
|
virtual void PlaceWidget();
|
|
virtual void PlaceWidget(
|
|
double xmin, double xmax, double ymin, double ymax, double zmin, double zmax);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Specify a vtkProp3D around which to place the widget. This
|
|
* is not required, but if supplied, it is used to initially
|
|
* position the widget.
|
|
*/
|
|
virtual void SetProp3D(vtkProp3D*);
|
|
vtkGetObjectMacro(Prop3D, vtkProp3D);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Specify the input dataset. This is not required, but if supplied,
|
|
* and no vtkProp3D is specified, it is used to initially position
|
|
* the widget.
|
|
*/
|
|
virtual void SetInputData(vtkDataSet*);
|
|
virtual void SetInputConnection(vtkAlgorithmOutput*);
|
|
virtual vtkDataSet* GetInput();
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get a factor representing the scaling of the widget upon placement
|
|
* (via the PlaceWidget() method). Normally the widget is placed so that
|
|
* it just fits within the bounding box defined in PlaceWidget(bounds).
|
|
* The PlaceFactor will make the widget larger (PlaceFactor > 1) or smaller
|
|
* (PlaceFactor < 1). By default, PlaceFactor is set to 0.5.
|
|
*/
|
|
vtkSetClampMacro(PlaceFactor, double, 0.01, VTK_DOUBLE_MAX);
|
|
vtkGetMacro(PlaceFactor, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the factor that controls the size of the handles that
|
|
* appear as part of the widget. These handles (like spheres, etc.)
|
|
* are used to manipulate the widget, and are sized as a fraction of
|
|
* the screen diagonal.
|
|
*/
|
|
vtkSetClampMacro(HandleSize, double, 0.001, 0.5);
|
|
vtkGetMacro(HandleSize, double);
|
|
//@}
|
|
|
|
protected:
|
|
vtk3DWidget();
|
|
~vtk3DWidget() override;
|
|
|
|
// Used to position and scale the widget initially
|
|
vtkProp3D* Prop3D;
|
|
|
|
vtk3DWidgetConnection* ConnectionHolder;
|
|
|
|
// has the widget ever been placed
|
|
double PlaceFactor;
|
|
int Placed;
|
|
void AdjustBounds(double bounds[6], double newBounds[6], double center[3]);
|
|
|
|
// control the size of handles (if there are any)
|
|
double InitialBounds[6];
|
|
double InitialLength;
|
|
double HandleSize;
|
|
double SizeHandles(double factor);
|
|
virtual void SizeHandles() {} // subclass in turn invokes parent's SizeHandles()
|
|
|
|
// used to track the depth of the last pick; also interacts with handle sizing
|
|
int ValidPick;
|
|
double LastPickPosition[3];
|
|
|
|
void UpdateInput();
|
|
|
|
private:
|
|
vtk3DWidget(const vtk3DWidget&) = delete;
|
|
void operator=(const vtk3DWidget&) = delete;
|
|
};
|
|
|
|
#endif
|