IGSTK
/tmp/buildd/igstk-4.4.0/Source/igstkReslicerPlaneSpatialObject.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Image Guided Surgery Software Toolkit
00004   Module:    $RCSfile: igstkReslicerPlaneSpatialObject.h,v $
00005   Language:  C++
00006   Date:      $Date: 2009-06-15 21:35:41 $
00007   Version:   $Revision: 1.2 $
00008 
00009   Copyright (c) ISC  Insight Software Consortium.  All rights reserved.
00010   See IGSTKCopyright.txt or http://www.igstk.org/copyright.htm for details.
00011 
00012      This software is distributed WITHOUT ANY WARRANTY; without even
00013      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00014      PURPOSE.  See the above copyright notices for more information.
00015 
00016 =========================================================================*/
00017 
00018 #ifndef __igstkReslicerPlaneSpatialObject_h
00019 #define __igstkReslicerPlaneSpatialObject_h
00020 
00021 #include "igstkMacros.h"
00022 #include "igstkTransform.h"
00023 #include "igstkSpatialObject.h"
00024 #include "igstkStateMachine.h"
00025 
00026 
00027 namespace igstk
00028 {
00029 
00063 class ReslicerPlaneSpatialObject : public SpatialObject
00064 {
00065 
00066 public:
00067 
00069   igstkStandardClassTraitsMacro( ReslicerPlaneSpatialObject, SpatialObject )
00070 
00071 public:
00072 
00074   typedef SpatialObject            BoundingBoxProviderSpatialObjectType;
00075   typedef BoundingBoxProviderSpatialObjectType::ConstPointer
00076                                    BoundingBoxProviderSpatialObjectConstPointer;
00077 
00078   typedef SpatialObject                               ToolSpatialObjectType;
00079   typedef ToolSpatialObjectType::Pointer              ToolSpatialObjectPointer;
00080 
00081   typedef igstk::Transform::VectorType                  VectorType;
00082   typedef igstk::Transform::VersorType                  VersorType;
00083 
00084   igstkLoadedEventMacro( ToolTipPositionEvent, IGSTKEvent, VectorType );
00085   igstkLoadedEventMacro( ReslicerPlaneNormalEvent, IGSTKEvent, VectorType );
00086   igstkLoadedEventMacro( ReslicerPlaneCenterEvent, IGSTKEvent, VectorType );
00087 
00089   enum ReslicingMode
00090     { 
00091     Orthogonal, 
00092     OffOrthogonal, 
00093     Oblique 
00094     }; 
00095 
00097   enum OrientationType
00098     { 
00099     Axial, 
00100     Sagittal, 
00101     Coronal, 
00102     OffAxial,
00103     OffSagittal,
00104     OffCoronal,
00105     PlaneOrientationWithZAxesNormal,
00106     PlaneOrientationWithXAxesNormal,
00107     PlaneOrientationWithYAxesNormal
00108     };
00109 
00111   void RequestSetReslicingMode( ReslicingMode reslicingMode ); 
00112 
00114   void RequestSetOrientationType( OrientationType orientationType ); 
00115 
00117   void RequestSetBoundingBoxProviderSpatialObject( const
00118      BoundingBoxProviderSpatialObjectType * boundingBoxProviderSpatialObject ); 
00119 
00124   void RequestSetToolSpatialObject( const ToolSpatialObjectType * 
00125                                                             toolSpatialObject );
00126 
00128   void RequestSetCursorPosition( const double *point);
00129 
00131   void RequestGetToolPosition();
00132 
00134   void RequestGetReslicingPlaneParameters();
00135 
00137   void RequestComputeReslicingPlane(); 
00138 
00140   OrientationType GetOrientationType() const;
00141 
00143   ReslicingMode GetReslicingMode() const;
00144 
00147   void RequestUpdateToolTransformWRTImageCoordinateSystem();
00148 
00150   igstk::Transform GetToolTransform() const;
00151 
00153   VectorType GetToolPosition() const;
00154 
00156   bool  IsToolSpatialObjectSet();
00157 
00159   igstkLoggerMacro();
00160 
00161 protected:
00162 
00164   ReslicerPlaneSpatialObject( void );
00165 
00167   ~ReslicerPlaneSpatialObject( void );
00168 
00170   virtual void PrintSelf( std::ostream& os, itk::Indent indent ) const; 
00171 
00172 private:
00173   ReslicerPlaneSpatialObject(const Self&);   //purposely not implemented
00174   void operator=(const Self&);   //purposely not implemented
00175 
00177   igstkDeclareInputMacro( SetBoundingBoxProviderSpatialObject );
00178   igstkDeclareInputMacro( ValidReslicingMode );
00179   igstkDeclareInputMacro( InValidReslicingMode );
00180   igstkDeclareInputMacro( ValidOrientationType );
00181   igstkDeclareInputMacro( InValidOrientationType );
00182   igstkDeclareInputMacro( ValidBoundingBoxProviderSpatialObject );
00183   igstkDeclareInputMacro( InValidBoundingBoxProviderSpatialObject );
00184   igstkDeclareInputMacro( ValidToolSpatialObject );
00185   igstkDeclareInputMacro( InValidToolSpatialObject );
00186   igstkDeclareInputMacro( SetCursorPosition );
00187   igstkDeclareInputMacro( ValidCursorPosition );
00188   igstkDeclareInputMacro( InValidCursorPosition );
00189   igstkDeclareInputMacro( GetToolPosition );
00190   igstkDeclareInputMacro( GetReslicingPlaneParameters );
00191   igstkDeclareInputMacro( GetToolTransformWRTImageCoordinateSystem );
00192   igstkDeclareInputMacro( ToolTransformWRTImageCoordinateSystem );
00193   igstkDeclareInputMacro( ComputeReslicePlane );
00194   
00196   igstkDeclareStateMacro( Initial );
00197   igstkDeclareStateMacro( ReslicingModeSet );
00198   igstkDeclareStateMacro( OrientationTypeSet );
00199   igstkDeclareStateMacro( BoundingBoxProviderSpatialObjectSet );
00200   igstkDeclareStateMacro( AttemptingToSetCursorPosition );
00201   igstkDeclareStateMacro( AttemptingToSetBoundingBoxProviderSpatialObject );  
00202   igstkDeclareStateMacro( AttemptingToGetToolTransformWRTImageCoordinateSystem);
00203 
00205   void NoProcessing();
00206 
00208   void SetOrientationTypeProcessing( void );
00209 
00211   void SetReslicingModeProcessing( void );
00212 
00214   void AttemptSetBoundingBoxProviderSpatialObjectProcessing();
00215 
00217   void AttemptSetCursorPositionProcessing( void );
00218   void SetCursorPositionProcessing( void );
00219  
00221   void ComputeReslicePlaneProcessing();
00222  
00224   void SetBoundingBoxProviderSpatialObjectProcessing( void );
00225 
00227   void SetToolSpatialObjectProcessing( void );
00228 
00230   void ReportInvalidReslicingModeProcessing( void );
00231 
00233   void ReportInvalidOrientationTypeProcessing( void );
00234 
00236   void ReportInvalidBoundingBoxProviderSpatialObjectProcessing( void );
00237 
00239   void ReportInvalidToolSpatialObjectProcessing( void );
00240 
00242   void ReportInvalidCursorPositionProcessing( void );
00243 
00245   void ReportInvalidRequestProcessing( void );
00246 
00249   void RequestGetToolTransformWRTImageCoordinateSystemProcessing( void );
00250 
00253   void ReceiveToolTransformWRTImageCoordinateSystemProcessing( void );
00254 
00256   void ReportToolPositionProcessing( void );
00257 
00259   void ReportReslicingPlaneParametersProcessing( void );
00260 
00262   void ComputeOrthogonalReslicingPlane();
00263   void ComputeObliqueReslicingPlane();
00264   void ComputeOffOrthogonalReslicingPlane();
00265 
00267   ReslicingMode     m_ReslicingModeToBeSet;
00268   ReslicingMode     m_ReslicingMode;
00269 
00271   OrientationType     m_OrientationTypeToBeSet;
00272   OrientationType     m_OrientationType;
00273 
00275   BoundingBoxProviderSpatialObjectConstPointer
00276                                       m_BoundingBoxProviderSpatialObjectToBeSet;
00277   BoundingBoxProviderSpatialObjectConstPointer
00278                                       m_BoundingBoxProviderSpatialObject;
00279 
00281   ToolSpatialObjectPointer     m_ToolSpatialObjectToBeSet;
00282   ToolSpatialObjectPointer     m_ToolSpatialObject;  
00283   
00285   VectorType                        m_PlaneNormal;
00286   VectorType                        m_PlaneCenter;
00287 
00288   // Event macro setup to receive the tool spatial object transform
00289   // with respect to the reference spatial object coordinate system
00290   igstkLoadedEventTransductionMacro( CoordinateSystemTransformTo, 
00291                                         ToolTransformWRTImageCoordinateSystem );
00292   
00293 
00294   // Tool transform with respect to the reference spatial object 
00295   // coordinate system
00296   igstk::Transform m_ToolTransformWRTImageCoordinateSystem;
00297 
00299   igstkObserverObjectMacro( BoundingBox, SpatialObject::BoundingBoxEvent,
00300                                               SpatialObject::BoundingBoxType);
00301 
00303   double                        m_CursorPositionToBeSet[3];
00304   double                        m_CursorPosition[3];
00305   bool                          m_CursorPositionSetFlag;
00306 
00307   VectorType                    m_ToolPosition;
00308 
00309   double                        m_Bounds[6];
00310 
00311   BoundingBoxType::Pointer      m_BoundingBox;
00312    
00314   bool                          m_ToolSpatialObjectSet;
00315 
00316 };
00317 
00318 } // end namespace igstk
00319 
00320 #endif // __igstkReslicerPlaneSpatialObject_h