You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
278 lines
9.3 KiB
278 lines
9.3 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkSphereWidget.h,v $
|
|
|
|
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.
|
|
|
|
=========================================================================*/
|
|
// .NAME vtkSphereWidget - 3D widget for manipulating a sphere
|
|
// .SECTION Description
|
|
// This 3D widget defines a sphere that can be interactively placed in a
|
|
// scene.
|
|
//
|
|
// To use this object, just invoke SetInteractor() with the argument of the
|
|
// method a vtkRenderWindowInteractor. You may also wish to invoke
|
|
// "PlaceWidget()" to initially position the widget. The interactor will act
|
|
// normally until the "i" key (for "interactor") is pressed, at which point the
|
|
// vtkSphereWidget will appear. (See superclass documentation for information
|
|
// about changing this behavior.)
|
|
// Events that occur outside of the widget (i.e., no part of
|
|
// the widget is picked) are propagated to any other registered obsevers
|
|
// (such as the interaction style). Turn off the widget by pressing the "i"
|
|
// key again (or invoke the Off() method).
|
|
//
|
|
// The vtkSphereWidget has several methods that can be used in conjunction
|
|
// with other VTK objects. The Set/GetThetaResolution() and
|
|
// Set/GetPhiResolution() methods control the number of subdivisions of the
|
|
// sphere in the theta and phi directions; the GetPolyData() method can be
|
|
// used to get the polygonal representation and can be used for things like
|
|
// seeding streamlines. The GetSphere() method returns a sphere implicit
|
|
// function that can be used for cutting and clipping. Typical usage of the
|
|
// widget is to make use of the StartInteractionEvent, InteractionEvent, and
|
|
// EndInteractionEvent events. The InteractionEvent is called on mouse
|
|
// motion; the other two events are called on button down and button up
|
|
// (any mouse button).
|
|
//
|
|
// Some additional features of this class include the ability to control the
|
|
// properties of the widget. You can set the properties of the selected and
|
|
// unselected representations of the sphere.
|
|
|
|
// .SECTION Caveats
|
|
// Note that the sphere can be picked even when they are "behind" other
|
|
// actors. This is an intended feature and not a bug.
|
|
|
|
// .SECTION See Also
|
|
// vtk3DWidget vtkLineWidget vtkBoxWidget vtkPlaneWidget
|
|
|
|
|
|
#ifndef __vtkSphereWidget_h
|
|
#define __vtkSphereWidget_h
|
|
|
|
#include "vtk3DWidget.h"
|
|
#include "vtkSphereSource.h" // Needed for faster access to the sphere source
|
|
|
|
class vtkActor;
|
|
class vtkPolyDataMapper;
|
|
class vtkPoints;
|
|
class vtkPolyData;
|
|
class vtkSphereSource;
|
|
class vtkSphere;
|
|
class vtkCellPicker;
|
|
class vtkProperty;
|
|
|
|
#define VTK_SPHERE_OFF 0
|
|
#define VTK_SPHERE_WIREFRAME 1
|
|
#define VTK_SPHERE_SURFACE 2
|
|
|
|
class VTK_WIDGETS_EXPORT vtkSphereWidget : public vtk3DWidget
|
|
{
|
|
public:
|
|
// Description:
|
|
// Instantiate the object.
|
|
static vtkSphereWidget *New();
|
|
|
|
vtkTypeRevisionMacro(vtkSphereWidget,vtk3DWidget);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description:
|
|
// Methods that satisfy the superclass' API.
|
|
virtual void SetEnabled(int);
|
|
virtual void PlaceWidget(double bounds[6]);
|
|
void PlaceWidget()
|
|
{this->Superclass::PlaceWidget();}
|
|
void PlaceWidget(double xmin, double xmax, double ymin, double ymax,
|
|
double zmin, double zmax)
|
|
{this->Superclass::PlaceWidget(xmin,xmax,ymin,ymax,zmin,zmax);}
|
|
|
|
// Description:
|
|
// Set the representation of the sphere. Different representations are
|
|
// useful depending on the application.
|
|
vtkSetClampMacro(Representation,int,VTK_SPHERE_OFF,VTK_SPHERE_SURFACE);
|
|
vtkGetMacro(Representation,int);
|
|
void SetRepresentationToOff()
|
|
{ this->SetRepresentation(VTK_SPHERE_OFF);}
|
|
void SetRepresentationToWireframe()
|
|
{ this->SetRepresentation(VTK_SPHERE_WIREFRAME);}
|
|
void SetRepresentationToSurface()
|
|
{ this->SetRepresentation(VTK_SPHERE_SURFACE);}
|
|
|
|
// Description:
|
|
// Set/Get the resolution of the sphere in the Theta direction.
|
|
void SetThetaResolution(int r)
|
|
{ this->SphereSource->SetThetaResolution(r); }
|
|
int GetThetaResolution()
|
|
{ return this->SphereSource->GetThetaResolution(); }
|
|
|
|
// Description:
|
|
// Set/Get the resolution of the sphere in the Phi direction.
|
|
void SetPhiResolution(int r)
|
|
{ this->SphereSource->SetPhiResolution(r); }
|
|
int GetPhiResolution()
|
|
{ return this->SphereSource->GetPhiResolution(); }
|
|
|
|
// Description:
|
|
// Set/Get the radius of sphere. Default is .5.
|
|
void SetRadius(double r)
|
|
{
|
|
if ( r <= 0 )
|
|
{
|
|
r = .00001;
|
|
}
|
|
this->SphereSource->SetRadius(r);
|
|
}
|
|
double GetRadius()
|
|
{ return this->SphereSource->GetRadius(); }
|
|
|
|
// Description:
|
|
// Set/Get the center of the sphere.
|
|
void SetCenter(double x, double y, double z)
|
|
{
|
|
this->SphereSource->SetCenter(x,y,z);
|
|
}
|
|
void SetCenter(double x[3])
|
|
{
|
|
this->SetCenter(x[0], x[1], x[2]);
|
|
}
|
|
double* GetCenter()
|
|
{return this->SphereSource->GetCenter();}
|
|
void GetCenter(double xyz[3])
|
|
{this->SphereSource->GetCenter(xyz);}
|
|
|
|
// Description:
|
|
// Enable translation and scaling of the widget. By default, the widget
|
|
// can be translated and rotated.
|
|
vtkSetMacro(Translation,int);
|
|
vtkGetMacro(Translation,int);
|
|
vtkBooleanMacro(Translation,int);
|
|
vtkSetMacro(Scale,int);
|
|
vtkGetMacro(Scale,int);
|
|
vtkBooleanMacro(Scale,int);
|
|
|
|
// Description:
|
|
// The handle sits on the surface of the sphere and may be moved around
|
|
// the surface by picking (left mouse) and then moving. The position
|
|
// of the handle can be retrieved, this is useful for positioning cameras
|
|
// and lights. By default, the handle is turned off.
|
|
vtkSetMacro(HandleVisibility,int);
|
|
vtkGetMacro(HandleVisibility,int);
|
|
vtkBooleanMacro(HandleVisibility,int);
|
|
|
|
// Description:
|
|
// Set/Get the direction vector of the handle relative to the center of
|
|
// the sphere.
|
|
vtkSetVector3Macro(HandleDirection,double);
|
|
vtkGetVector3Macro(HandleDirection,double);
|
|
|
|
// Description:
|
|
// Get the position of the handle.
|
|
vtkGetVector3Macro(HandlePosition,double);
|
|
|
|
// Description:
|
|
// Grab the polydata (including points) that defines the sphere. The
|
|
// polydata consists of n+1 points, where n is the resolution of the
|
|
// sphere. These point values are guaranteed to be up-to-date when either the
|
|
// InteractionEvent or EndInteraction events are invoked. The user provides
|
|
// the vtkPolyData and the points and polysphere are added to it.
|
|
void GetPolyData(vtkPolyData *pd);
|
|
|
|
// Description:
|
|
// Get the spherical implicit function defined by this widget. Note that
|
|
// vtkPlanes is a subclass of vtkImplicitFunction, meaning that it can be
|
|
// used by a variety of filters to perform clipping, cutting, and selection
|
|
// of data.
|
|
void GetSphere(vtkSphere *sphere);
|
|
|
|
// Description:
|
|
// Get the sphere properties. The properties of the sphere when selected
|
|
// and unselected can be manipulated.
|
|
vtkGetObjectMacro(SphereProperty,vtkProperty);
|
|
vtkGetObjectMacro(SelectedSphereProperty,vtkProperty);
|
|
|
|
// Description:
|
|
// Get the handle properties (the little ball on the sphere is the
|
|
// handle). The properties of the handle when selected and unselected
|
|
// can be manipulated.
|
|
vtkGetObjectMacro(HandleProperty,vtkProperty);
|
|
vtkGetObjectMacro(SelectedHandleProperty,vtkProperty);
|
|
|
|
protected:
|
|
vtkSphereWidget();
|
|
~vtkSphereWidget();
|
|
|
|
//BTX - manage the state of the widget
|
|
int State;
|
|
enum WidgetState
|
|
{
|
|
Start=0,
|
|
Moving,
|
|
Scaling,
|
|
Positioning,
|
|
Outside
|
|
};
|
|
//ETX
|
|
|
|
//handles the events
|
|
static void ProcessEvents(vtkObject* object,
|
|
unsigned long event,
|
|
void* clientdata,
|
|
void* calldata);
|
|
|
|
// ProcessEvents() dispatches to these methods.
|
|
void OnLeftButtonDown();
|
|
void OnLeftButtonUp();
|
|
void OnRightButtonDown();
|
|
void OnRightButtonUp();
|
|
void OnMouseMove();
|
|
|
|
// the sphere
|
|
vtkActor *SphereActor;
|
|
vtkPolyDataMapper *SphereMapper;
|
|
vtkSphereSource *SphereSource;
|
|
void HighlightSphere(int highlight);
|
|
void SelectRepresentation();
|
|
|
|
// The representation of the sphere
|
|
int Representation;
|
|
|
|
// Do the picking
|
|
vtkCellPicker *Picker;
|
|
|
|
// Methods to manipulate the sphere widget
|
|
int Translation;
|
|
int Scale;
|
|
void Translate(double *p1, double *p2);
|
|
void ScaleSphere(double *p1, double *p2, int X, int Y);
|
|
void MoveHandle(double *p1, double *p2, int X, int Y);
|
|
void PlaceHandle(double *center, double radius);
|
|
|
|
// Properties used to control the appearance of selected objects and
|
|
// the manipulator in general.
|
|
vtkProperty *SphereProperty;
|
|
vtkProperty *SelectedSphereProperty;
|
|
vtkProperty *HandleProperty;
|
|
vtkProperty *SelectedHandleProperty;
|
|
void CreateDefaultProperties();
|
|
|
|
// Managing the handle
|
|
vtkActor *HandleActor;
|
|
vtkPolyDataMapper *HandleMapper;
|
|
vtkSphereSource *HandleSource;
|
|
void HighlightHandle(int);
|
|
int HandleVisibility;
|
|
double HandleDirection[3];
|
|
double HandlePosition[3];
|
|
virtual void SizeHandles();
|
|
|
|
private:
|
|
vtkSphereWidget(const vtkSphereWidget&); //Not implemented
|
|
void operator=(const vtkSphereWidget&); //Not implemented
|
|
};
|
|
|
|
#endif
|
|
|