IGSTK
|
00001 /*========================================================================= 00002 00003 Program: Image Guided Surgery Software Toolkit 00004 Module: $RCSfile: igstkTransformObserver.h,v $ 00005 Language: C++ 00006 Date: $Date: 2011-01-18 21:40:17 $ 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 #ifndef __igstkTransformObserver_h 00018 #define __igstkTransformObserver_h 00019 00020 #if defined(_MSC_VER) 00021 // Warning about: identifier was truncated to '255' characters 00022 // in the debug information (MVC6.0 Debug) 00023 #pragma warning( disable : 4786 ) 00024 #endif 00025 00026 #include "igstkTransform.h" 00027 #include "igstkCoordinateSystemTransformToResult.h" 00028 #include "igstkCoordinateSystemTransformToErrorResult.h" 00029 00030 namespace igstk 00031 { 00032 00033 class TransformObserver : public ::itk::Command 00034 { 00035 public: 00036 igstkStandardClassBasicTraitsMacro( TransformObserver, ::itk::Command ); 00037 igstkNewMacro( Self ); 00038 00039 protected: 00040 TransformObserver() 00041 { 00042 m_GotTransform = false; 00043 m_GotTransformNotAvailableMessage = false; 00044 } 00045 ~TransformObserver() {} 00046 public: 00047 00048 typedef CoordinateSystemTransformToEvent PositiveEventType; 00049 typedef TransformNotAvailableEvent NegativeEventType; 00050 00054 typedef CoordinateSystemTransformToResult PayloadType; 00055 00056 void ObserveTransformEventsFrom( Object * objectToObserve ) 00057 { 00058 if( objectToObserve ) 00059 { 00060 objectToObserve->AddObserver( PositiveEventType(), this ); 00061 objectToObserve->AddObserver( NegativeEventType(), this ); 00062 } 00063 } 00064 00065 void Execute(itk::Object *caller, const itk::EventObject & event) 00066 { 00067 const itk::Object * constCaller = caller; 00068 this->Execute( constCaller, event ); 00069 } 00070 00071 void Execute(const itk::Object * itkNotUsed(caller), 00072 const itk::EventObject & event) 00073 { 00074 00075 m_GotTransform = false; 00076 m_GotTransformNotAvailableMessage = false; 00077 00078 if( PositiveEventType().CheckEvent( &event ) ) 00079 { 00080 const PositiveEventType * transformEvent = 00081 dynamic_cast< const PositiveEventType *>( &event ); 00082 if( transformEvent ) 00083 { 00084 m_TransformBetweenCoordinateSystems = transformEvent->Get(); 00085 this->m_Transform = m_TransformBetweenCoordinateSystems.GetTransform(); 00086 m_GotTransform = true; 00087 m_GotTransformNotAvailableMessage = false; 00088 } 00089 } 00090 00091 if( NegativeEventType().CheckEvent( &event ) ) 00092 { 00093 const NegativeEventType * negativeEvent = 00094 dynamic_cast< const NegativeEventType *>( &event ); 00095 if( negativeEvent ) 00096 { 00097 m_GotTransform = false; 00098 m_GotTransformNotAvailableMessage = true; 00099 } 00100 } 00101 } 00102 00103 bool GotTransform() const 00104 { 00105 return m_GotTransform; 00106 } 00107 00108 bool GotTransformNotAvailableMessage() const 00109 { 00110 return m_GotTransformNotAvailableMessage; 00111 } 00112 00113 const Transform & GetTransform() const 00114 { 00115 return this->m_Transform; 00116 } 00117 00118 const PayloadType & GetTransformBetweenCoordinateSystems() const 00119 { 00120 return m_TransformBetweenCoordinateSystems; 00121 } 00122 00123 void Clear() 00124 { 00125 this->m_GotTransform = false; 00126 this->m_GotTransformNotAvailableMessage = false; 00127 } 00128 00129 private: 00130 00131 PayloadType m_TransformBetweenCoordinateSystems; 00132 Transform m_Transform; 00133 00134 bool m_GotTransform; 00135 bool m_GotTransformNotAvailableMessage; 00136 }; 00137 00138 } // end namespace igstk 00139 00140 #endif