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

Hybrid/vtkImagePlaneWidget.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkImagePlaneWidget.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 =========================================================================*/
00110 #ifndef __vtkImagePlaneWidget_h
00111 #define __vtkImagePlaneWidget_h
00112 
00113 #include "vtkPolyDataSourceWidget.h"
00114 
00115 class vtkActor;
00116 class vtkCellPicker;
00117 class vtkDataSetMapper;
00118 class vtkImageData;
00119 class vtkImageMapToColors;
00120 class vtkImageReslice;
00121 class vtkLookupTable;
00122 class vtkMatrix4x4;
00123 class vtkPlaneSource;
00124 class vtkPoints;
00125 class vtkPolyData;
00126 class vtkPolyDataMapper;
00127 class vtkProperty;
00128 class vtkTextActor;
00129 class vtkTextProperty;
00130 class vtkTexture;
00131 class vtkTextureMapToPlane;
00132 class vtkTransform;
00133 
00134 #define VTK_NEAREST_RESLICE 0
00135 #define VTK_LINEAR_RESLICE  1
00136 #define VTK_CUBIC_RESLICE   2
00137 
00138 class VTK_EXPORT vtkImagePlaneWidget : public vtkPolyDataSourceWidget
00139 {
00140 public:
00142   static vtkImagePlaneWidget *New();
00143 
00144   vtkTypeRevisionMacro(vtkImagePlaneWidget,vtkPolyDataSourceWidget);
00145   void PrintSelf(ostream& os, vtkIndent indent);
00146 
00148 
00149   virtual void SetEnabled(int);
00150   virtual void PlaceWidget(double bounds[6]);
00151   void PlaceWidget()
00152     {this->Superclass::PlaceWidget();}
00153   void PlaceWidget(double xmin, double xmax, double ymin, double ymax,
00154                    double zmin, double zmax)
00155     {this->Superclass::PlaceWidget(xmin,xmax,ymin,ymax,zmin,zmax);}
00157 
00159   void SetInput(vtkDataSet* input);
00160 
00162 
00163   void SetOrigin(double x, double y, double z);
00164   void SetOrigin(double xyz[3]);
00165   double* GetOrigin();
00166   void GetOrigin(double xyz[3]);
00168 
00170 
00172   void SetPoint1(double x, double y, double z);
00173   void SetPoint1(double xyz[3]);
00174   double* GetPoint1();
00175   void GetPoint1(double xyz[3]);
00177 
00179 
00181   void SetPoint2(double x, double y, double z);
00182   void SetPoint2(double xyz[3]);
00183   double* GetPoint2();
00184   void GetPoint2(double xyz[3]);
00186 
00188 
00189   double* GetCenter();
00190   void GetCenter(double xyz[3]);
00192 
00194 
00195   double* GetNormal();
00196   void GetNormal(double xyz[3]);
00198 
00200   void GetVector1(double v1[3]);
00201 
00203   void GetVector2(double v2[3]);
00204 
00206   int GetSliceIndex();
00207 
00209   void SetSliceIndex(int index);
00210 
00212   double GetSlicePosition();
00213 
00215   void SetSlicePosition(double position);
00216 
00218 
00219   void SetResliceInterpolate(int);
00220   vtkGetMacro(ResliceInterpolate,int);
00221   void SetResliceInterpolateToNearestNeighbour()
00222     { this->SetResliceInterpolate(VTK_NEAREST_RESLICE); }
00223   void SetResliceInterpolateToLinear()
00224     { this->SetResliceInterpolate(VTK_LINEAR_RESLICE); }
00225   void SetResliceInterpolateToCubic()
00226     { this->SetResliceInterpolate(VTK_CUBIC_RESLICE); }
00228 
00230   vtkImageData* GetResliceOutput();
00231 
00233 
00234   vtkSetMacro(RestrictPlaneToVolume,int);
00235   vtkGetMacro(RestrictPlaneToVolume,int);
00236   vtkBooleanMacro(RestrictPlaneToVolume,int);
00238 
00240 
00242   vtkSetMacro(UserControlledLookupTable,int);
00243   vtkGetMacro(UserControlledLookupTable,int);
00244   vtkBooleanMacro(UserControlledLookupTable,int);
00246 
00248 
00252   vtkSetMacro(TextureInterpolate,int);
00253   vtkGetMacro(TextureInterpolate,int);
00254   vtkBooleanMacro(TextureInterpolate,int);
00256 
00258 
00260   virtual void SetTextureVisibility(int);
00261   vtkGetMacro(TextureVisibility,int);
00262   vtkBooleanMacro(TextureVisibility,int);
00264   
00272   void GetPolyData(vtkPolyData *pd);
00273 
00279   vtkPolyDataSource* GetPolyDataSource();
00280 
00283   void UpdatePlacement(void);
00284 
00287   vtkTexture *GetTexture();
00288 
00290 
00294   vtkGetObjectMacro(ColorMap, vtkImageMapToColors);
00295   virtual void SetColorMap(vtkImageMapToColors *);
00297 
00299 
00301   virtual void SetPlaneProperty(vtkProperty*);
00302   vtkGetObjectMacro(PlaneProperty,vtkProperty);
00303   virtual void SetSelectedPlaneProperty(vtkProperty*);
00304   vtkGetObjectMacro(SelectedPlaneProperty,vtkProperty);
00306 
00308 
00310   void SetPlaneOrientation(int);
00311   vtkGetMacro(PlaneOrientation,int);
00312   void SetPlaneOrientationToXAxes()
00313     { this->SetPlaneOrientation(0); }
00314   void SetPlaneOrientationToYAxes()
00315     { this->SetPlaneOrientation(1); }
00316   void SetPlaneOrientationToZAxes()
00317     { this->SetPlaneOrientation(2); }
00319 
00324   void SetPicker(vtkCellPicker*);
00325 
00327 
00332   virtual void SetLookupTable(vtkLookupTable*);
00333   vtkGetObjectMacro(LookupTable,vtkLookupTable);
00335 
00337 
00339   vtkSetMacro(DisplayText,int);
00340   vtkGetMacro(DisplayText,int);
00341   vtkBooleanMacro(DisplayText,int);
00343 
00345 
00346   virtual void SetCursorProperty(vtkProperty*);
00347   vtkGetObjectMacro(CursorProperty,vtkProperty);
00349 
00351 
00352   virtual void SetMarginProperty(vtkProperty*);
00353   vtkGetObjectMacro(MarginProperty,vtkProperty);
00355 
00357 
00359   void SetTextProperty(vtkTextProperty* tprop);
00360   vtkTextProperty* GetTextProperty();
00362 
00364 
00365   virtual void SetTexturePlaneProperty(vtkProperty*);
00366   vtkGetObjectMacro(TexturePlaneProperty,vtkProperty);
00368 
00370 
00372   void SetWindowLevel(double window, double level);
00373   void GetWindowLevel(double wl[2]);
00375 
00378   int GetCursorData(double xyzv[4]);
00379 
00381 
00382   void SetInteraction(int interact);
00383   vtkGetMacro(Interaction,int);
00384   vtkBooleanMacro(Interaction,int);
00386 
00388 
00389   enum
00390   {
00391     CURSOR_ACTION       = 0,
00392     SLICE_MOTION_ACTION = 1,
00393     WINDOW_LEVEL_ACTION = 2
00394   };
00395   //ETX
00396   vtkSetClampMacro(LeftButtonAction,int, CURSOR_ACTION, WINDOW_LEVEL_ACTION);
00397   vtkGetMacro(LeftButtonAction, int);
00398   vtkSetClampMacro(MiddleButtonAction,int, CURSOR_ACTION, WINDOW_LEVEL_ACTION);
00399   vtkGetMacro(MiddleButtonAction, int);
00400   vtkSetClampMacro(RightButtonAction,int, CURSOR_ACTION, WINDOW_LEVEL_ACTION);
00401   vtkGetMacro(RightButtonAction, int);
00403 
00405 
00411   enum
00412   {
00413     NO_MODIFIER         = 0,
00414     SHIFT_MODIFIER      = 1,
00415     CONTROL_MODIFIER    = 2
00416   };
00417   //ETX
00418   vtkSetClampMacro(LeftButtonAutoModifier,int, SHIFT_MODIFIER, CONTROL_MODIFIER);
00419   vtkGetMacro(LeftButtonAutoModifier, int);
00420   vtkSetClampMacro(MiddleButtonAutoModifier,int, SHIFT_MODIFIER, CONTROL_MODIFIER);
00421   vtkGetMacro(MiddleButtonAutoModifier, int);
00422   vtkSetClampMacro(RightButtonAutoModifier,int, SHIFT_MODIFIER, CONTROL_MODIFIER);
00423   vtkGetMacro(RightButtonAutoModifier, int);
00425 
00426 protected:
00427   vtkImagePlaneWidget();
00428   ~vtkImagePlaneWidget();
00429 
00430   int TextureVisibility;
00431   
00432   int LeftButtonAction;
00433   int MiddleButtonAction;
00434   int RightButtonAction;
00435 
00436   int LeftButtonAutoModifier;
00437   int MiddleButtonAutoModifier;
00438   int RightButtonAutoModifier;
00439 
00440   //BTX
00441   enum
00442   {
00443     NO_BUTTON     = 0,
00444     LEFT_BUTTON   = 1,
00445     MIDDLE_BUTTON = 2,
00446     RIGHT_BUTTON  = 3
00447   };
00448   //ETX
00449   int LastButtonPressed;
00450 
00451   //BTX - manage the state of the widget
00452   int State;
00453   enum WidgetState
00454   {
00455     Start=0,
00456     Cursoring,
00457     WindowLevelling,
00458     Pushing,
00459     Spinning,
00460     Rotating,
00461     Moving,
00462     Scaling,
00463     Outside
00464   };
00465   //ETX
00466 
00467   // Handles the events
00468   static void ProcessEvents(vtkObject* object,
00469                             unsigned long event,
00470                             void* clientdata,
00471                             void* calldata);
00472 
00473   // internal utility method that adds observers to the RenderWindowInteractor
00474   // so that our ProcessEvents is eventually called.  this method is called
00475   // by SetEnabled as well as SetInteraction
00476   void AddObservers();
00477 
00478   // ProcessEvents() dispatches to these methods.
00479   virtual void OnMouseMove();
00480   virtual void OnLeftButtonDown();
00481   virtual void OnLeftButtonUp();
00482   virtual void OnMiddleButtonDown();
00483   virtual void OnMiddleButtonUp();
00484   virtual void OnRightButtonDown();
00485   virtual void OnRightButtonUp();
00486 
00487   virtual void StartCursor();
00488   virtual void StopCursor();
00489   virtual void StartSliceMotion();
00490   virtual void StopSliceMotion();
00491   virtual void StartWindowLevel();
00492   virtual void StopWindowLevel();
00493 
00494   // controlling ivars
00495   int   Interaction; // Is the widget responsive to mouse events  
00496   int   PlaneOrientation;
00497   int   RestrictPlaneToVolume;
00498   double OriginalWindow;
00499   double OriginalLevel;
00500   double CurrentWindow;
00501   double CurrentLevel;
00502   int   ResliceInterpolate;
00503   int   TextureInterpolate;
00504   int   UserControlledLookupTable;
00505   int   DisplayText;
00506 
00507   // The geometric represenation of the plane and it's outline
00508   vtkPlaneSource    *PlaneSource;
00509   double              Normal[3]; // plane normal normalized
00510   vtkPolyData       *PlaneOutlinePolyData;
00511   vtkActor          *PlaneOutlineActor;
00512   vtkPolyDataMapper *PlaneOutlineMapper;
00513   void               HighlightPlane(int highlight);
00514   void               GeneratePlaneOutline();
00515 
00516   // Re-builds the plane outline based on the plane source
00517   void BuildRepresentation();
00518 
00519   // Do the picking
00520   vtkCellPicker *PlanePicker;
00521 
00522   // Methods to manipulate the plane
00523   void WindowLevel(int X, int Y);
00524   void Push(double *p1, double *p2);
00525   void Spin(double *p1, double *p2);
00526   void Rotate(double *p1, double *p2, double *vpn);
00527   void Scale(double *p1, double *p2, int X, int Y);
00528   void Translate(double *p1, double *p2);
00529 
00530   vtkImageData         *ImageData;
00531   vtkImageReslice      *Reslice;
00532   vtkMatrix4x4         *ResliceAxes;
00533   vtkTransform         *Transform;
00534   vtkTextureMapToPlane *TexturePlaneCoords;
00535   vtkPolyDataMapper    *TexturePlaneMapper;
00536   vtkActor             *TexturePlaneActor;
00537   vtkImageMapToColors  *ColorMap;
00538   vtkTexture           *Texture;
00539   vtkLookupTable       *LookupTable;
00540   vtkLookupTable       *CreateDefaultLookupTable();
00541 
00542   // Properties used to control the appearance of selected objects and
00543   // the manipulator in general.  The plane property is actually that for
00544   // the outline.  The TexturePlaneProperty can be used to control the
00545   // lighting etc. of the resliced image data.
00546   vtkProperty   *PlaneProperty;
00547   vtkProperty   *SelectedPlaneProperty;
00548   vtkProperty   *CursorProperty;
00549   vtkProperty   *MarginProperty;
00550   vtkProperty   *TexturePlaneProperty;
00551   void           CreateDefaultProperties();
00552 
00553   // Reslice and texture management
00554   void UpdateNormal();
00555   void UpdateOrigin();
00556   void GenerateTexturePlane();
00557 
00558   // The cross-hair cursor
00559   vtkPolyData       *CursorPolyData;
00560   vtkPolyDataMapper *CursorMapper;
00561   vtkActor          *CursorActor;
00562   int                CurrentCursorPosition[3];
00563   double             CurrentImageValue; // Set to VTK_FLOAT_MAX when invalid
00564   void               GenerateCursor();
00565   void               UpdateCursor(int,int);
00566   void               ActivateCursor(int);
00567 
00568   // The text to display W/L, image data
00569   vtkTextActor *TextActor;
00570   char          TextBuff[128];
00571   void          GenerateText();
00572   void          ManageTextDisplay();
00573   void          ActivateText(int);
00574 
00575   // Oblique reslice control
00576   double RotateAxis[3];
00577   double RadiusVector[3];
00578   void  AdjustState();
00579 
00580   // Visible margins to assist user interaction
00581   vtkPolyData       *MarginPolyData;
00582   vtkPolyDataMapper *MarginMapper;
00583   vtkActor          *MarginActor;
00584   int                MarginSelectMode;
00585   void               GenerateMargins();
00586   void               UpdateMargins();
00587   void               ActivateMargins(int);
00588 
00589 private:
00590   vtkImagePlaneWidget(const vtkImagePlaneWidget&);  //Not implemented
00591   void operator=(const vtkImagePlaneWidget&);  //Not implemented
00592 };
00593 
00594 #endif