Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

Hybrid/vtkSplineWidget.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkSplineWidget.h,v $
00005   Language:  C++
00006 
00007   Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 
00008   All rights reserved.
00009   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00010 
00011      This software is distributed WITHOUT ANY WARRANTY; without even 
00012      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00013      PURPOSE.  See the above copyright notice for more information.
00014 
00015 =========================================================================*/
00099 #ifndef __vtkSplineWidget_h
00100 #define __vtkSplineWidget_h
00101 
00102 #include "vtk3DWidget.h"
00103 
00104 class vtkActor;
00105 class vtkCellPicker;
00106 class vtkPlaneSource;
00107 class vtkPoints;
00108 class vtkPolyData;
00109 class vtkPolyDataMapper;
00110 class vtkProp;
00111 class vtkProperty;
00112 class vtkSphereSource;
00113 class vtkSpline;
00114 class vtkTransform;
00115 
00116 #define VTK_PROJECTION_YZ 0
00117 #define VTK_PROJECTION_XZ 1
00118 #define VTK_PROJECTION_XY 2
00119 #define VTK_PROJECTION_OBLIQUE 3
00120 
00121 class VTK_HYBRID_EXPORT vtkSplineWidget : public vtk3DWidget
00122 {
00123 public:
00125   static vtkSplineWidget *New();
00126 
00127   vtkTypeRevisionMacro(vtkSplineWidget,vtk3DWidget);
00128   void PrintSelf(ostream& os, vtkIndent indent);
00129 
00131 
00132   virtual void SetEnabled(int);
00133   virtual void PlaceWidget(float bounds[6]);
00134   void PlaceWidget()
00135     {this->Superclass::PlaceWidget();}
00136   void PlaceWidget(float xmin, float xmax, float ymin, float ymax, 
00137                    float zmin, float zmax)
00138     {this->Superclass::PlaceWidget(xmin,xmax,ymin,ymax,zmin,zmax);}
00140 
00142 
00148   vtkSetMacro(ProjectToPlane,int);
00149   vtkGetMacro(ProjectToPlane,int);
00150   vtkBooleanMacro(ProjectToPlane,int);
00152 
00155   void SetPlaneSource(vtkPlaneSource* plane);
00156 
00157   vtkSetClampMacro(ProjectionNormal,int,VTK_PROJECTION_YZ,VTK_PROJECTION_OBLIQUE);
00158   vtkGetMacro(ProjectionNormal,int);
00159   void SetProjectionNormalToXAxes()
00160     { this->SetProjectionNormal(0); }
00161   void SetProjectionNormalToYAxes()
00162     { this->SetProjectionNormal(1); }
00163   void SetProjectionNormalToZAxes()
00164     { this->SetProjectionNormal(2); }
00165   void SetProjectionNormalToOblique()
00166     { this->SetProjectionNormal(3); }
00167 
00169 
00174   void SetProjectionPosition(float position);
00175   vtkGetMacro(ProjectionPosition, float);
00177 
00183   void GetPolyData(vtkPolyData *pd);
00184 
00186 
00189   virtual void SetHandleProperty(vtkProperty*);
00190   vtkGetObjectMacro(HandleProperty, vtkProperty);
00191   virtual void SetSelectedHandleProperty(vtkProperty*);
00192   vtkGetObjectMacro(SelectedHandleProperty, vtkProperty);
00194 
00196 
00198   virtual void SetLineProperty(vtkProperty*);
00199   vtkGetObjectMacro(LineProperty, vtkProperty);
00200   virtual void SetSelectedLineProperty(vtkProperty*);
00201   vtkGetObjectMacro(SelectedLineProperty, vtkProperty);
00203 
00205 
00206   void SetNumberOfHandles(int npts);
00207   vtkGetMacro(NumberOfHandles, int);
00209 
00211 
00213   void SetResolution(int resolution);
00214   vtkGetMacro(Resolution,int);
00216 
00218 
00222   void SetXSpline(vtkSpline*);
00223   void SetYSpline(vtkSpline*);
00224   void SetZSpline(vtkSpline*);
00226 
00228 
00230   void SetHandlePosition(int handle, float x, float y, float z);
00231   void SetHandlePosition(int handle, float xyz[3]);
00232   void GetHandlePosition(int handle, float xyz[3]);
00233   float* GetHandlePosition(int handle);
00235 
00237 
00241   void SetClosed(int closed);
00242   vtkGetMacro(Closed,int);
00243   vtkBooleanMacro(Closed,int);
00245 
00249   float GetSummedLength();
00250 
00251 protected:
00252   vtkSplineWidget();
00253   ~vtkSplineWidget();
00254 
00255 //BTX - manage the state of the widget
00256   int State;
00257   enum WidgetState
00258   {
00259     Start=0,
00260     Moving,
00261     Scaling,
00262     Spinning,
00263     Outside
00264   };
00265 //ETX
00266 
00267   //handles the events
00268   static void ProcessEvents(vtkObject* object,
00269                             unsigned long event,
00270                             void* clientdata,
00271                             void* calldata);
00272 
00273   // ProcessEvents() dispatches to these methods.
00274   void OnLeftButtonDown();
00275   void OnLeftButtonUp();
00276   void OnMiddleButtonDown();
00277   void OnMiddleButtonUp();
00278   void OnRightButtonDown();
00279   void OnRightButtonUp();
00280   void OnMouseMove();
00281 
00282   // Controlling vars
00283   int   ProjectionNormal;
00284   float ProjectionPosition;
00285   int   ProjectToPlane;
00286   vtkPlaneSource* PlaneSource;
00287 
00288   // Projection capabilities
00289   void ProjectPointsToPlane();
00290   void ProjectPointsToOrthoPlane();
00291   void ProjectPointsToObliquePlane();
00292 
00293   // The spline
00294   vtkSpline *XSpline;
00295   vtkSpline *YSpline;
00296   vtkSpline *ZSpline;
00297   int NumberOfHandles;
00298   float* HandlePositions;
00299   vtkSpline* CreateDefaultSpline();// default is vtkCardinalSpline
00300   int Closed;
00301   float Offset;
00302 
00303   // The line segments
00304   vtkActor          *LineActor;
00305   vtkPolyDataMapper *LineMapper;
00306   vtkPolyData       *LineData;
00307   void HighlightLine(int highlight);
00308   int NumberOfSplinePoints;
00309   int Resolution;
00310   float* SplinePositions;
00311 
00312   // Glyphs representing hot spots (e.g., handles)
00313   vtkActor          **Handle;
00314   vtkPolyDataMapper **HandleMapper;
00315   vtkSphereSource   **HandleGeometry;
00316   void Initialize();
00317   int  HighlightHandle(vtkProp *prop); //returns handle index or -1 on fail
00318   virtual void SizeHandles();
00319   void BuildRepresentation();
00320 
00321   // Do the picking
00322   vtkCellPicker *HandlePicker;
00323   vtkCellPicker *LinePicker;
00324   vtkActor *CurrentHandle;
00325   int CurrentHandleIndex;
00326 
00327   // Methods to manipulate the spline.
00328   void MovePoint(double *p1, double *p2);
00329   void Scale(double *p1, double *p2, int X, int Y);
00330   void Translate(double *p1, double *p2);
00331   void Spin(double *p1, double *p2, double *vpn);
00332 
00333   // Transform the control points (used for spinning)
00334   vtkTransform *Transform;
00335 
00336   // Properties used to control the appearance of selected objects and
00337   // the manipulator in general.
00338   vtkProperty *HandleProperty;
00339   vtkProperty *SelectedHandleProperty;
00340   vtkProperty *LineProperty;
00341   vtkProperty *SelectedLineProperty;
00342   void CreateDefaultProperties();
00343 
00344 private:
00345   vtkSplineWidget(const vtkSplineWidget&);  //Not implemented
00346   void operator=(const vtkSplineWidget&);  //Not implemented
00347 };
00348 
00349 #endif