IGSTK
|
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