IGSTK
/tmp/buildd/igstk-4.4.0/Source/igstkCrossHairSpatialObject.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Image Guided Surgery Software Toolkit
00004   Module:    $RCSfile: igstkCrossHairSpatialObject.h,v $
00005   Language:  C++
00006   Date:      $Date: 2010-11-16 04:43:41 $
00007   Version:   $Revision: 1.3 $
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 __igstkCrossHairSpatialObject_h
00019 #define __igstkCrossHairSpatialObject_h
00020 
00021 #include "igstkMacros.h"
00022 #include "igstkTransform.h"
00023 #include "igstkSpatialObject.h"
00024 #include "itkGroupSpatialObject.h"
00025 #include "igstkStateMachine.h"
00026 
00027 namespace igstk
00028 {
00029 
00042 class CrossHairSpatialObject : public SpatialObject
00043 {
00044 
00045 public:
00046 
00048   igstkStandardClassTraitsMacro( CrossHairSpatialObject, SpatialObject )
00049 
00050   
00051   typedef igstk::Transform::PointType          PointType;
00052   typedef igstk::Transform::VectorType         VectorType;
00053 
00054   typedef SpatialObject                        SpatialObjectType;
00055 
00056   typedef SpatialObjectType::BoundingBoxType   BoundingBoxType;
00057   typedef SpatialObjectType::Pointer           SpatialObjectPointerType;
00058 
00059 public:  
00060 
00062   bool IsToolSpatialObjectSet();
00063 
00065   bool IsInsideBounds();
00066 
00068   void RequestGetCrossHairPosition();
00069 
00071   void RequestSetToolSpatialObject( const SpatialObjectType * spatialObject );
00072 
00074   void RequestSetBoundingBoxProviderSpatialObject( 
00075                                       const SpatialObjectType * spatialObject );
00076 
00078   void RequestSetCursorPosition( PointType point);
00079 
00081   igstk::Transform GetToolTransform() const;
00082 
00084   double GetBoundingBoxDimensionByIndex(unsigned int index) const;
00085  
00086 protected:
00087 
00088   CrossHairSpatialObject( void );
00089   ~CrossHairSpatialObject( void );
00090 
00092   virtual void PrintSelf( std::ostream& os, itk::Indent indent ) const; 
00093 
00094   igstkObserverMacro( ImageTransform, CoordinateSystemTransformToEvent, 
00095      CoordinateSystemTransformToResult );
00096 
00097 private:
00098 
00100   typedef itk::GroupSpatialObject<3>     CrossHairSpatialObjectType;
00101 
00102   CrossHairSpatialObject(const Self&);         //purposely not implemented
00103   void operator=(const Self&);     //purposely not implemented  
00104    
00106   void SetCursorPositionProcessing( void );
00107 
00109   void AttemptSetCursorPositionProcessing( void );
00110 
00112   void AttemptSetBoundingBoxProviderSpatialObjectProcessing( void );
00113 
00115   void SetToolSpatialObjectProcessing( void );
00116 
00118   void SetBoundingBoxProviderSpatialObjectProcessing( void );
00119 
00121   void GetCrossHairPositionProcessing( void );
00122 
00124   void ReportInvalidToolSpatialObjectProcessing( void );
00125 
00127   void ReportInvalidBoundingBoxProviderSpatialObjectProcessing( void );
00128 
00130   void ReportInvalidCursorPositionProcessing( void );
00131 
00133   void ReportInvalidRequestProcessing( void );
00134 
00136   void RequestGetToolTransformWRTImageCoordinateSystemProcessing( void );
00137 
00139   void RequestUpdateToolTransformWRTImageCoordinateSystem();
00140 
00142   void ReceiveToolTransformWRTImageCoordinateSystemProcessing( void );
00143 
00144   CrossHairSpatialObjectType::Pointer     m_CrossHairSpatialObject;
00145 
00146   PointType                               m_Position;
00147 
00149   double               m_CursorPositionToBeSet[3];
00150   double               m_CursorPosition[3];
00151   bool                 m_CursorPositionSetFlag;
00152 
00154   bool                         m_ToolSpatialObjectSet;
00155   bool                         m_InsideBounds;
00156   SpatialObjectPointerType     m_ToolSpatialObjectToBeSet;
00157   SpatialObjectPointerType     m_ToolSpatialObject;
00158 
00160   SpatialObjectPointerType     m_BoundingBoxProviderSpatialObjectToBeSet;
00161   SpatialObjectPointerType     m_BoundingBoxProviderSpatialObject;
00162 
00164   BoundingBoxType::ConstPointer           m_BoundingBox;
00165 
00167   igstk::Transform m_ToolTransformWRTImageCoordinateSystem;
00168 
00170   igstkDeclareStateMacro( Initial );
00171   igstkDeclareStateMacro( BoundingBoxProviderSpatialObjectSet );
00172   igstkDeclareStateMacro( AttemptingToSetBoundingBoxProviderSpatialObject );
00173   igstkDeclareStateMacro( AttemptingToSetCursorPosition );
00174   igstkDeclareStateMacro( AttemptingToGetToolTransformWRTImageCoordinateSystem);
00175 
00177   igstkDeclareInputMacro( SetBoundingBoxProviderSpatialObject );
00178   igstkDeclareInputMacro( ValidBoundingBoxProviderSpatialObject );
00179   igstkDeclareInputMacro( InValidBoundingBoxProviderSpatialObject );
00180   igstkDeclareInputMacro( ValidToolSpatialObject );
00181   igstkDeclareInputMacro( InValidToolSpatialObject );
00182   igstkDeclareInputMacro( SetCursorPosition );
00183   igstkDeclareInputMacro( ValidCursorPosition );
00184   igstkDeclareInputMacro( InValidCursorPosition );
00185   igstkDeclareInputMacro( GetToolTransformWRTImageCoordinateSystem );
00186   igstkDeclareInputMacro( ToolTransformWRTImageCoordinateSystem );
00187   igstkDeclareInputMacro( GetCrossHairPosition );
00188 
00189   // Event macro setup to receive the tool spatial object transform
00190   // with respect to the image coordinate system
00191   igstkLoadedEventTransductionMacro( CoordinateSystemTransformTo, 
00192                                         ToolTransformWRTImageCoordinateSystem );
00193 
00194   igstkObserverConstObjectMacro( BoundingBox, 
00195                                             SpatialObjectType::BoundingBoxEvent,
00196                                             SpatialObjectType::BoundingBoxType);
00197 
00198   inline 
00199   PointType 
00200   TransformToPoint( igstk::Transform transform )
00201     {
00202     PointType point;
00203     for (unsigned int i=0; i<3; i++)
00204       {
00205       point[i] = transform.GetTranslation()[i];
00206       }
00207     return point;
00208     }
00209 
00210 };
00211 
00212 } // end namespace igstk
00213 
00214 #endif // __igstkCrossHairSpatialObject_h