00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __igstkCoordinateSystemInterfaceMacros_h
00019 #define __igstkCoordinateSystemInterfaceMacros_h
00020
00021 #include "igstkCoordinateSystemTransformToResult.h"
00022 #include "igstkCoordinateSystemTransformToErrorResult.h"
00023 #include "igstkCoordinateSystemDelegator.h"
00024
00025 namespace igstk
00026 {
00027
00039 #define igstkCoordinateSystemClassInterfaceMacro() \
00040 public: \
00041 template <class TTargetPointer> \
00042 void RequestComputeTransformTo(const TTargetPointer & target) \
00043 { \
00044 m_CoordinateSystemDelegator->RequestComputeTransformTo(target);\
00045 } \
00046 void RequestGetTransformToParent() \
00047 { \
00048 m_CoordinateSystemDelegator->RequestGetTransformToParent(); \
00049 } \
00050 void RequestDetachFromParent()\
00051 { \
00052 m_CoordinateSystemDelegator->RequestDetachFromParent();\
00053 } \
00054 template < class TParentPointer > \
00055 void RequestSetTransformAndParent( const ::igstk::Transform & transformToParent, \
00056 TParentPointer parent ) \
00057 { \
00058 if ( this->IsInternalTransformRequired() == false ) \
00059 { \
00060 m_CoordinateSystemDelegator->RequestSetTransformAndParent( \
00061 transformToParent, parent); \
00062 } \
00063 else \
00064 { \
00065 ::igstk::Transform internalTransform = this->GetInternalTransform(); \
00066 ::igstk::Transform transformToParentWithInternalTransform = \
00067 ::igstk::Transform::TransformCompose( \
00068 transformToParent, \
00069 internalTransform ); \
00070 m_CoordinateSystemDelegator->RequestSetTransformAndParent( \
00071 transformToParentWithInternalTransform, parent); \
00072 }\
00073 } \
00074 void RequestUpdateTransformToParent( const ::igstk::Transform & transformToParent ) \
00075 { \
00076 if ( this->IsInternalTransformRequired() == false ) \
00077 { \
00078 m_CoordinateSystemDelegator->RequestUpdateTransformToParent( transformToParent ); \
00079 } \
00080 else \
00081 { \
00082 ::igstk::Transform internalTransform = this->GetInternalTransform(); \
00083 ::igstk::Transform transformToParentWithInternalTransform = \
00084 ::igstk::Transform::TransformCompose( \
00085 transformToParent, \
00086 internalTransform ); \
00087 m_CoordinateSystemDelegator->RequestUpdateTransformToParent( \
00088 transformToParentWithInternalTransform); \
00089 }\
00090 } \
00091 bool IsCoordinateSystem(const ::igstk::CoordinateSystem* inCS) const \
00092 { \
00093 return m_CoordinateSystemDelegator-> \
00094 IsCoordinateSystem( inCS ); \
00095 } \
00096 protected: \
00097 virtual bool IsInternalTransformRequired() \
00098 { \
00099 return false; \
00100 } \
00101 virtual ::igstk::Transform GetInternalTransform() const \
00102 { \
00103 ::igstk::Transform identity; \
00104 identity.SetToIdentity( igstk::TimeStamp::GetLongestPossibleTime() ); \
00105 return identity; \
00106 } \
00107 const ::igstk::CoordinateSystem* GetCoordinateSystem() const \
00108 { \
00109 return \
00110 igstk::Friends::CoordinateSystemHelper:: \
00111 GetCoordinateSystem( \
00112 m_CoordinateSystemDelegator.GetPointer() ); \
00113 } \
00114 private: \
00115 ::igstk::CoordinateSystemDelegator::Pointer \
00116 m_CoordinateSystemDelegator; \
00117 typedef ::itk::ReceptorMemberCommand< Self > CoordinateSystemObserverType; \
00118 CoordinateSystemObserverType::Pointer m_CoordinateSystemObserver; \
00119 void ObserverCallback(const ::itk::EventObject & eventvar) \
00120 { \
00121 this->InvokeEvent( eventvar ); \
00122 } \
00123 igstkFriendClassMacro( igstk::Friends::CoordinateSystemHelper );
00124
00131 #define igstkCoordinateSystemClassInterfaceConstructorMacro() \
00132 m_CoordinateSystemObserver = CoordinateSystemObserverType::New(); \
00133 m_CoordinateSystemObserver->SetCallbackFunction(this, \
00134 &Self::ObserverCallback); \
00135 m_CoordinateSystemDelegator = \
00136 ::igstk::CoordinateSystemDelegator::New(); \
00137 m_CoordinateSystemDelegator->AddObserver( \
00138 ::igstk::CoordinateSystemTransformToNullTargetEvent() \
00139 , m_CoordinateSystemObserver ); \
00140 m_CoordinateSystemDelegator->AddObserver( \
00141 ::igstk::CoordinateSystemTransformToDisconnectedEvent() \
00142 , m_CoordinateSystemObserver ); \
00143 m_CoordinateSystemDelegator->AddObserver( \
00144 ::igstk::CoordinateSystemNullParentEvent() \
00145 , m_CoordinateSystemObserver ); \
00146 m_CoordinateSystemDelegator->AddObserver( \
00147 ::igstk::CoordinateSystemThisParentEvent() \
00148 , m_CoordinateSystemObserver ); \
00149 m_CoordinateSystemDelegator->AddObserver( \
00150 ::igstk::CoordinateSystemParentCycleEvent() \
00151 , m_CoordinateSystemObserver ); \
00152 m_CoordinateSystemDelegator->AddObserver( \
00153 ::igstk::CoordinateSystemTransformToEvent() \
00154 , m_CoordinateSystemObserver ); \
00155 std::stringstream tempStream; \
00156 tempStream << this->GetNameOfClass() << " 0x"; \
00157 tempStream << static_cast<void*>(this); \
00158 std::string name = tempStream.str(); \
00159 m_CoordinateSystemDelegator->SetName( name.c_str() );
00160
00161 }
00162
00163 #endif // #ifndef __igstkCoordinateSystemInterfaceMacros_h