IGSTK
|
00001 /*========================================================================= 00002 00003 Program: Image Guided Surgery Software Toolkit 00004 Module: $RCSfile: igstkTransformObserver.h,v $ 00005 Language: C++ 00006 Date: $Date: 2008-02-11 01:41:51 $ 00007 Version: $Revision: 1.1 $ 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 *caller, const itk::EventObject & event) 00072 { 00073 00074 m_GotTransform = false; 00075 m_GotTransformNotAvailableMessage = false; 00076 00077 if( PositiveEventType().CheckEvent( &event ) ) 00078 { 00079 const PositiveEventType * transformEvent = 00080 dynamic_cast< const PositiveEventType *>( &event ); 00081 if( transformEvent ) 00082 { 00083 m_TransformBetweenCoordinateSystems = transformEvent->Get(); 00084 this->m_Transform = m_TransformBetweenCoordinateSystems.GetTransform(); 00085 m_GotTransform = true; 00086 m_GotTransformNotAvailableMessage = false; 00087 } 00088 } 00089 00090 if( NegativeEventType().CheckEvent( &event ) ) 00091 { 00092 const NegativeEventType * negativeEvent = 00093 dynamic_cast< const NegativeEventType *>( &event ); 00094 if( negativeEvent ) 00095 { 00096 m_GotTransform = false; 00097 m_GotTransformNotAvailableMessage = true; 00098 } 00099 } 00100 } 00101 00102 bool GotTransform() const 00103 { 00104 return m_GotTransform; 00105 } 00106 00107 bool GotTransformNotAvailableMessage() const 00108 { 00109 return m_GotTransformNotAvailableMessage; 00110 } 00111 00112 const Transform & GetTransform() const 00113 { 00114 return this->m_Transform; 00115 } 00116 00117 const PayloadType & GetTransformBetweenCoordinateSystems() const 00118 { 00119 return m_TransformBetweenCoordinateSystems; 00120 } 00121 00122 void Clear() 00123 { 00124 this->m_GotTransform = false; 00125 this->m_GotTransformNotAvailableMessage = false; 00126 } 00127 00128 private: 00129 00130 PayloadType m_TransformBetweenCoordinateSystems; 00131 Transform m_Transform; 00132 00133 bool m_GotTransform; 00134 bool m_GotTransformNotAvailableMessage; 00135 }; 00136 00137 } // end namespace igstk 00138 00139 #endif