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.
		
		
		
		
		
			
		
			
				
					
					
						
							269 lines
						
					
					
						
							9.1 KiB
						
					
					
				
			
		
		
	
	
							269 lines
						
					
					
						
							9.1 KiB
						
					
					
				| /*=========================================================================
 | |
| 
 | |
|   Program:   Visualization Toolkit
 | |
|   Module:    $RCSfile: vtkPointWidget.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 vtkPointWidget - position a point in 3D space
 | |
| // .SECTION Description
 | |
| // This 3D widget allows the user to position a point in 3D space using a 3D
 | |
| // cursor. The cursor has an outline bounding box, axes-aligned cross-hairs,
 | |
| // and axes shadows. (The outline and shadows can be turned off.) Any of
 | |
| // these can be turned off. A nice feature of the object is that the
 | |
| // vtkPointWidget, like any 3D widget, will work with the current interactor
 | |
| // style. That is, if vtkPointWidget does not handle an event, then all other
 | |
| // registered observers (including the interactor style) have an opportunity
 | |
| // to process the event. Otherwise, the vtkPointWidget will terminate the
 | |
| // processing of the event that it handles.
 | |
| //
 | |
| // 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 vtkPointWidget will appear. (See superclass documentation for
 | |
| // information about changing this behavior.) To move the point, the user can
 | |
| // grab (left mouse) on any widget line and "slide" the point into
 | |
| // position. Scaling is achieved by using the right mouse button "up" the
 | |
| // render window (makes the widget bigger) or "down" the render window (makes
 | |
| // the widget smaller). To translate the widget use the middle mouse button.
 | |
| // (Note: all of the translation interactions can be constrained to one of
 | |
| // the x-y-z axes by using the "shift" key.) The vtkPointWidget produces as
 | |
| // output a polydata with a single point and a vertex cell.
 | |
| //
 | |
| // Some additional features of this class include the ability to control the
 | |
| // rendered properties of the widget. You can set the properties of the
 | |
| // selected and unselected representations of the parts of the widget. For
 | |
| // example, you can set the property of the 3D cursor in its normal and
 | |
| // selected states.
 | |
| 
 | |
| // .SECTION Caveats
 | |
| // Note that widget can be picked even when it is "behind" other actors.
 | |
| // This is an intended feature and not a bug.
 | |
| //
 | |
| // The constrained translation/sliding action (i.e., when the "shift" key is
 | |
| // depressed) along the axes is based on a combination of a "hot" spot around
 | |
| // the cursor focus plus the initial mouse motion after selection. That is,
 | |
| // if the user selects an axis outside of the hot spot, then the motion is
 | |
| // constrained along that axis. If the user selects the point widget near the
 | |
| // focus (within the hot spot), the initial motion defines a vector which is
 | |
| // compared to the x-y-z axes. The motion is constrained to the axis that is
 | |
| // most parallel to the initial motion vector.
 | |
| // 
 | |
| 
 | |
| // .SECTION See Also
 | |
| // vtk3DWidget vtkLineWidget vtkBoxWidget vtkPlaneWidget
 | |
| 
 | |
| #ifndef __vtkPointWidget_h
 | |
| #define __vtkPointWidget_h
 | |
| 
 | |
| #include "vtk3DWidget.h"
 | |
| #include "vtkCursor3D.h" // Needed for faster access to the Cursor3D
 | |
| 
 | |
| class vtkActor;
 | |
| class vtkPolyDataMapper;
 | |
| class vtkCellPicker;
 | |
| class vtkPolyData;
 | |
| class vtkProperty;
 | |
| 
 | |
| class VTK_WIDGETS_EXPORT vtkPointWidget : public vtk3DWidget
 | |
| {
 | |
| public:
 | |
|   // Description:
 | |
|   // Instantiate this widget
 | |
|   static vtkPointWidget *New();
 | |
| 
 | |
|   vtkTypeRevisionMacro(vtkPointWidget,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:
 | |
|   // Grab the polydata (including points) that defines the point. A
 | |
|   // single point and a vertex compose the vtkPolyData.
 | |
|   void GetPolyData(vtkPolyData *pd);
 | |
|   
 | |
|   // Description:
 | |
|   // Set/Get the position of the point. Note that if the position is set
 | |
|   // outside of the bounding box, it will be clamped to the boundary of
 | |
|   // the bounding box.
 | |
|   void SetPosition(double x, double y, double z)
 | |
|     {this->Cursor3D->SetFocalPoint(x,y,z);}
 | |
|   void SetPosition(double x[3])
 | |
|     {this->SetPosition(x[0],x[1],x[2]);}
 | |
|   double* GetPosition() 
 | |
|     {return this->Cursor3D->GetFocalPoint();}
 | |
|   void GetPosition(double xyz[3]) 
 | |
|     {this->Cursor3D->GetFocalPoint(xyz);}
 | |
| 
 | |
|   // Description:
 | |
|   // Turn on/off the wireframe bounding box.
 | |
|   void SetOutline(int o)
 | |
|     {this->Cursor3D->SetOutline(o);}
 | |
|   int GetOutline()
 | |
|     {return this->Cursor3D->GetOutline();}
 | |
|   void OutlineOn()
 | |
|     {this->Cursor3D->OutlineOn();}
 | |
|   void OutlineOff()
 | |
|     {this->Cursor3D->OutlineOff();}
 | |
| 
 | |
|   // Description:
 | |
|   // Turn on/off the wireframe x-shadows.
 | |
|   void SetXShadows(int o)
 | |
|     {this->Cursor3D->SetXShadows(o);}
 | |
|   int GetXShadows()
 | |
|     {return this->Cursor3D->GetXShadows();}
 | |
|   void XShadowsOn()
 | |
|     {this->Cursor3D->XShadowsOn();}
 | |
|   void XShadowsOff()
 | |
|     {this->Cursor3D->XShadowsOff();}
 | |
| 
 | |
|   // Description:
 | |
|   // Turn on/off the wireframe y-shadows.
 | |
|   void SetYShadows(int o)
 | |
|     {this->Cursor3D->SetYShadows(o);}
 | |
|   int GetYShadows()
 | |
|     {return this->Cursor3D->GetYShadows();}
 | |
|   void YShadowsOn()
 | |
|     {this->Cursor3D->YShadowsOn();}
 | |
|   void YShadowsOff()
 | |
|     {this->Cursor3D->YShadowsOff();}
 | |
| 
 | |
|   // Description:
 | |
|   // Turn on/off the wireframe z-shadows.
 | |
|   void SetZShadows(int o)
 | |
|     {this->Cursor3D->SetZShadows(o);}
 | |
|   int GetZShadows()
 | |
|     {return this->Cursor3D->GetZShadows();}
 | |
|   void ZShadowsOn()
 | |
|     {this->Cursor3D->ZShadowsOn();}
 | |
|   void ZShadowsOff()
 | |
|     {this->Cursor3D->ZShadowsOff();}
 | |
| 
 | |
|   // Description:
 | |
|   // If translation mode is on, as the widget is moved the bounding box,
 | |
|   // shadows, and cursor are all translated simultaneously as the point
 | |
|   // moves.
 | |
|   void SetTranslationMode(int mode)
 | |
|     { this->Cursor3D->SetTranslationMode(mode); this->Cursor3D->Update(); }
 | |
|   int GetTranslationMode()
 | |
|     { return this->Cursor3D->GetTranslationMode(); }
 | |
|   void TranslationModeOn()
 | |
|     { this->SetTranslationMode(1); }
 | |
|   void TranslationModeOff()
 | |
|     { this->SetTranslationMode(0); }
 | |
|   
 | |
|   // Description:
 | |
|   // Convenience methods to turn outline and shadows on and off.
 | |
|   void AllOn()
 | |
|     {
 | |
|       this->OutlineOn();
 | |
|       this->XShadowsOn();
 | |
|       this->YShadowsOn();
 | |
|       this->ZShadowsOn();
 | |
|     }
 | |
|   void AllOff()
 | |
|     {
 | |
|       this->OutlineOff();
 | |
|       this->XShadowsOff();
 | |
|       this->YShadowsOff();
 | |
|       this->ZShadowsOff();
 | |
|     }
 | |
| 
 | |
|   // Description:
 | |
|   // Get the handle properties (the little balls are the handles). The 
 | |
|   // properties of the handles when selected and normal can be 
 | |
|   // set.
 | |
|   vtkGetObjectMacro(Property,vtkProperty);
 | |
|   vtkGetObjectMacro(SelectedProperty,vtkProperty);
 | |
|   
 | |
|   // Description:
 | |
|   // Set the "hot spot" size; i.e., the region around the focus, in which the
 | |
|   // motion vector is used to control the constrained sliding action. Note the
 | |
|   // size is specified as a fraction of the length of the diagonal of the 
 | |
|   // point widget's bounding box.
 | |
|   vtkSetClampMacro(HotSpotSize,double,0.0,1.0);
 | |
|   vtkGetMacro(HotSpotSize,double);
 | |
|   
 | |
| protected:
 | |
|   vtkPointWidget();
 | |
|   ~vtkPointWidget();
 | |
| 
 | |
| //BTX - manage the state of the widget
 | |
|   friend class vtkLineWidget;
 | |
|   
 | |
|   int State;
 | |
|   enum WidgetState
 | |
|   {
 | |
|     Start=0,
 | |
|     Moving,
 | |
|     Scaling,
 | |
|     Translating,
 | |
|     Outside
 | |
|   };
 | |
| //ETX
 | |
|     
 | |
|   // Handles the events
 | |
|   static void ProcessEvents(vtkObject* object, 
 | |
|                             unsigned long event,
 | |
|                             void* clientdata, 
 | |
|                             void* calldata);
 | |
| 
 | |
|   // ProcessEvents() dispatches to these methods.
 | |
|   virtual void OnMouseMove();
 | |
|   virtual void OnLeftButtonDown();
 | |
|   virtual void OnLeftButtonUp();
 | |
|   virtual void OnMiddleButtonDown();
 | |
|   virtual void OnMiddleButtonUp();
 | |
|   virtual void OnRightButtonDown();
 | |
|   virtual void OnRightButtonUp();
 | |
|   
 | |
|   // the cursor3D
 | |
|   vtkActor          *Actor;
 | |
|   vtkPolyDataMapper *Mapper;
 | |
|   vtkCursor3D       *Cursor3D;
 | |
|   void Highlight(int highlight);
 | |
| 
 | |
|   // Do the picking
 | |
|   vtkCellPicker *CursorPicker;
 | |
|   
 | |
|   // Methods to manipulate the cursor
 | |
|   int ConstraintAxis;
 | |
|   void Translate(double *p1, double *p2);
 | |
|   void Scale(double *p1, double *p2, int X, int Y);
 | |
|   void MoveFocus(double *p1, double *p2);
 | |
|   int TranslationMode;
 | |
| 
 | |
|   // Properties used to control the appearance of selected objects and
 | |
|   // the manipulator in general.
 | |
|   vtkProperty *Property;
 | |
|   vtkProperty *SelectedProperty;
 | |
|   void CreateDefaultProperties();
 | |
|   
 | |
|   // The size of the hot spot.
 | |
|   double HotSpotSize;
 | |
|   int DetermineConstraintAxis(int constraint, double *x);
 | |
|   int WaitingForMotion;
 | |
|   int WaitCount;
 | |
|   
 | |
| private:
 | |
|   vtkPointWidget(const vtkPointWidget&);  //Not implemented
 | |
|   void operator=(const vtkPointWidget&);  //Not implemented
 | |
| };
 | |
| 
 | |
| #endif
 | |
| 
 |