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 "igstkCoordinateSystemSetTransformResult.h"
00024 #include "igstkCoordinateSystemDelegator.h"
00025 #include "igstkConfigure.h"
00026
00027 #ifdef IGSTK_USE_SceneGraphVisualization
00028 #include "igstkSceneGraphObserver.h"
00029 #endif
00030
00031 namespace igstk
00032 {
00033
00046 #ifdef IGSTK_USE_SceneGraphVisualization
00047 #define igstkCoordinateSystemClassInterfaceMacro() \
00048 public: \
00049 template <class TTargetPointer> \
00050 void RequestComputeTransformTo(const TTargetPointer & target) \
00051 { \
00052 m_CoordinateSystemDelegator->RequestComputeTransformTo(target);\
00053 } \
00054 void RequestGetTransformToParent() \
00055 { \
00056 m_CoordinateSystemDelegator->RequestGetTransformToParent(); \
00057 } \
00058 void RequestDetachFromParent()\
00059 { \
00060 m_CoordinateSystemDelegator->RequestDetachFromParent();\
00061 } \
00062 template < class TParentPointer > \
00063 void RequestSetTransformAndParent( const ::igstk::Transform & transformToParent,\
00064 TParentPointer parent ) \
00065 { \
00066 if ( this->IsInternalTransformRequired() == false ) \
00067 { \
00068 m_CoordinateSystemDelegator->RequestSetTransformAndParent( \
00069 transformToParent, parent); \
00070 } \
00071 else \
00072 { \
00073 ::igstk::Transform internalTransform = this->GetInternalTransform(); \
00074 ::igstk::Transform transformToParentWithInternalTransform = \
00075 ::igstk::Transform::TransformCompose( \
00076 transformToParent, \
00077 internalTransform ); \
00078 m_CoordinateSystemDelegator->RequestSetTransformAndParent( \
00079 transformToParentWithInternalTransform, parent); \
00080 }\
00081 } \
00082 void RequestUpdateTransformToParent( const ::igstk::Transform & transformToParent )\
00083 { \
00084 if ( this->IsInternalTransformRequired() == false ) \
00085 { \
00086 m_CoordinateSystemDelegator->RequestUpdateTransformToParent( transformToParent );\
00087 } \
00088 else \
00089 { \
00090 ::igstk::Transform internalTransform = this->GetInternalTransform(); \
00091 ::igstk::Transform transformToParentWithInternalTransform = \
00092 ::igstk::Transform::TransformCompose( \
00093 transformToParent, \
00094 internalTransform ); \
00095 m_CoordinateSystemDelegator->RequestUpdateTransformToParent( \
00096 transformToParentWithInternalTransform); \
00097 }\
00098 } \
00099 bool IsCoordinateSystem(const ::igstk::CoordinateSystem* inCS) const \
00100 { \
00101 return m_CoordinateSystemDelegator-> \
00102 IsCoordinateSystem( inCS ); \
00103 } \
00104 void RequestSetCoordinateSystemName(const char * name) \
00105 { \
00106 m_CoordinateSystemDelegator->SetName( name ); \
00107 } \
00108 const char * RequestGetCoordinateSystemName() const \
00109 { \
00110 return m_CoordinateSystemDelegator->GetName(); \
00111 } \
00112 protected: \
00113 virtual bool IsInternalTransformRequired() \
00114 { \
00115 return false; \
00116 } \
00117 virtual ::igstk::Transform GetInternalTransform() const \
00118 { \
00119 ::igstk::Transform identity; \
00120 identity.SetToIdentity( igstk::TimeStamp::GetLongestPossibleTime() ); \
00121 return identity; \
00122 } \
00123 const ::igstk::CoordinateSystem* GetCoordinateSystem() const \
00124 { \
00125 return \
00126 igstk::Friends::CoordinateSystemHelper:: \
00127 GetCoordinateSystem( \
00128 m_CoordinateSystemDelegator.GetPointer() ); \
00129 } \
00130 private: \
00131 ::igstk::CoordinateSystemDelegator::Pointer \
00132 m_CoordinateSystemDelegator; \
00133 typedef ::itk::ReceptorMemberCommand< Self > CoordinateSystemObserverType; \
00134 CoordinateSystemObserverType::Pointer m_CoordinateSystemObserver; \
00135 SceneGraphObserver::Pointer m_SceneGraphObserver; \
00136 void ObserverCallback(const ::itk::EventObject & eventvar) \
00137 { \
00138 this->InvokeEvent( eventvar ); \
00139 } \
00140 igstkFriendClassMacro( igstk::Friends::CoordinateSystemHelper );
00141
00142 #else
00143
00144 #define igstkCoordinateSystemClassInterfaceMacro() \
00145 public: \
00146 template <class TTargetPointer> \
00147 void RequestComputeTransformTo(const TTargetPointer & target) \
00148 { \
00149 m_CoordinateSystemDelegator->RequestComputeTransformTo(target);\
00150 } \
00151 void RequestGetTransformToParent() \
00152 { \
00153 m_CoordinateSystemDelegator->RequestGetTransformToParent(); \
00154 } \
00155 void RequestDetachFromParent()\
00156 { \
00157 m_CoordinateSystemDelegator->RequestDetachFromParent();\
00158 } \
00159 template < class TParentPointer > \
00160 void RequestSetTransformAndParent( const ::igstk::Transform & transformToParent,\
00161 TParentPointer parent ) \
00162 { \
00163 std::stringstream tempStream; \
00164 tempStream << this->GetNameOfClass() << " 0x"; \
00165 tempStream << static_cast<void*>(this); \
00166 std::string name = tempStream.str(); \
00167 m_CoordinateSystemDelegator->SetName( name.c_str() );\
00168 if ( this->IsInternalTransformRequired() == false ) \
00169 { \
00170 m_CoordinateSystemDelegator->RequestSetTransformAndParent( \
00171 transformToParent, parent); \
00172 } \
00173 else \
00174 { \
00175 ::igstk::Transform internalTransform = this->GetInternalTransform(); \
00176 ::igstk::Transform transformToParentWithInternalTransform = \
00177 ::igstk::Transform::TransformCompose( \
00178 transformToParent, \
00179 internalTransform ); \
00180 m_CoordinateSystemDelegator->RequestSetTransformAndParent( \
00181 transformToParentWithInternalTransform, parent); \
00182 }\
00183 } \
00184 void RequestUpdateTransformToParent( const ::igstk::Transform & transformToParent )\
00185 { \
00186 if ( this->IsInternalTransformRequired() == false ) \
00187 { \
00188 m_CoordinateSystemDelegator->RequestUpdateTransformToParent( transformToParent );\
00189 } \
00190 else \
00191 { \
00192 ::igstk::Transform internalTransform = this->GetInternalTransform(); \
00193 ::igstk::Transform transformToParentWithInternalTransform = \
00194 ::igstk::Transform::TransformCompose( \
00195 transformToParent, \
00196 internalTransform ); \
00197 m_CoordinateSystemDelegator->RequestUpdateTransformToParent( \
00198 transformToParentWithInternalTransform); \
00199 }\
00200 } \
00201 bool IsCoordinateSystem(const ::igstk::CoordinateSystem* inCS) const \
00202 { \
00203 return m_CoordinateSystemDelegator-> \
00204 IsCoordinateSystem( inCS ); \
00205 } \
00206 protected: \
00207 virtual bool IsInternalTransformRequired() \
00208 { \
00209 return false; \
00210 } \
00211 virtual ::igstk::Transform GetInternalTransform() const \
00212 { \
00213 ::igstk::Transform identity; \
00214 identity.SetToIdentity( igstk::TimeStamp::GetLongestPossibleTime() ); \
00215 return identity; \
00216 } \
00217 const ::igstk::CoordinateSystem* GetCoordinateSystem() const \
00218 { \
00219 return \
00220 igstk::Friends::CoordinateSystemHelper:: \
00221 GetCoordinateSystem( \
00222 m_CoordinateSystemDelegator.GetPointer() ); \
00223 } \
00224 private: \
00225 ::igstk::CoordinateSystemDelegator::Pointer \
00226 m_CoordinateSystemDelegator; \
00227 typedef ::itk::ReceptorMemberCommand< Self > CoordinateSystemObserverType; \
00228 CoordinateSystemObserverType::Pointer m_CoordinateSystemObserver; \
00229 void ObserverCallback(const ::itk::EventObject & eventvar) \
00230 { \
00231 this->InvokeEvent( eventvar ); \
00232 } \
00233 igstkFriendClassMacro( igstk::Friends::CoordinateSystemHelper );
00234
00235 #endif
00236
00242 #ifdef IGSTK_USE_SceneGraphVisualization
00243 #define igstkCoordinateSystemClassInterfaceConstructorMacro() \
00244 m_CoordinateSystemObserver = CoordinateSystemObserverType::New(); \
00245 m_CoordinateSystemObserver->SetCallbackFunction(this, \
00246 &Self::ObserverCallback); \
00247 m_CoordinateSystemDelegator = \
00248 ::igstk::CoordinateSystemDelegator::New(); \
00249 m_SceneGraphObserver = SceneGraphObserver::New(); \
00250 m_CoordinateSystemDelegator->AddObserver( \
00251 ::igstk::CoordinateSystemTransformToNullTargetEvent() \
00252 , m_CoordinateSystemObserver ); \
00253 m_CoordinateSystemDelegator->AddObserver( \
00254 ::igstk::CoordinateSystemSetTransformEvent() \
00255 , m_CoordinateSystemObserver); \
00256 m_SceneGraphObserver->ObserveTransformEventsFrom(this);\
00257 m_CoordinateSystemDelegator->AddObserver( \
00258 ::igstk::CoordinateSystemTransformToDisconnectedEvent() \
00259 , m_CoordinateSystemObserver ); \
00260 m_CoordinateSystemDelegator->AddObserver( \
00261 ::igstk::CoordinateSystemNullParentEvent() \
00262 , m_CoordinateSystemObserver ); \
00263 m_CoordinateSystemDelegator->AddObserver( \
00264 ::igstk::CoordinateSystemThisParentEvent() \
00265 , m_CoordinateSystemObserver ); \
00266 m_CoordinateSystemDelegator->AddObserver( \
00267 ::igstk::CoordinateSystemParentCycleEvent() \
00268 , m_CoordinateSystemObserver ); \
00269 m_CoordinateSystemDelegator->AddObserver( \
00270 ::igstk::CoordinateSystemTransformToEvent() \
00271 , m_CoordinateSystemObserver ); \
00272 std::stringstream tempStream; \
00273 tempStream << this->GetNameOfClass() << " 0x"; \
00274 tempStream << static_cast<void*>(this); \
00275 std::string name = tempStream.str(); \
00276 m_CoordinateSystemDelegator->SetType( this->GetNameOfClass() );\
00277 m_CoordinateSystemDelegator->SetName( name.c_str() );
00278
00279 #else
00280
00281 #define igstkCoordinateSystemClassInterfaceConstructorMacro() \
00282 m_CoordinateSystemObserver = CoordinateSystemObserverType::New(); \
00283 m_CoordinateSystemObserver->SetCallbackFunction(this, \
00284 &Self::ObserverCallback); \
00285 m_CoordinateSystemDelegator = \
00286 ::igstk::CoordinateSystemDelegator::New(); \
00287 m_CoordinateSystemDelegator->AddObserver( \
00288 ::igstk::CoordinateSystemTransformToNullTargetEvent() \
00289 , m_CoordinateSystemObserver ); \
00290 m_CoordinateSystemDelegator->AddObserver( \
00291 ::igstk::CoordinateSystemSetTransformEvent() \
00292 , m_CoordinateSystemObserver); \
00293 m_CoordinateSystemDelegator->AddObserver( \
00294 ::igstk::CoordinateSystemTransformToDisconnectedEvent() \
00295 , m_CoordinateSystemObserver ); \
00296 m_CoordinateSystemDelegator->AddObserver( \
00297 ::igstk::CoordinateSystemNullParentEvent() \
00298 , m_CoordinateSystemObserver ); \
00299 m_CoordinateSystemDelegator->AddObserver( \
00300 ::igstk::CoordinateSystemThisParentEvent() \
00301 , m_CoordinateSystemObserver ); \
00302 m_CoordinateSystemDelegator->AddObserver( \
00303 ::igstk::CoordinateSystemParentCycleEvent() \
00304 , m_CoordinateSystemObserver ); \
00305 m_CoordinateSystemDelegator->AddObserver( \
00306 ::igstk::CoordinateSystemTransformToEvent() \
00307 , m_CoordinateSystemObserver ); \
00308 std::stringstream tempStream; \
00309 tempStream << this->GetNameOfClass() << " 0x"; \
00310 tempStream << static_cast<void*>(this); \
00311 std::string name = tempStream.str(); \
00312 m_CoordinateSystemDelegator->SetType( this->GetNameOfClass() );\
00313 m_CoordinateSystemDelegator->SetName( name.c_str() );
00314 #endif
00315
00316 }
00317
00318 #endif // #ifndef __igstkCoordinateSystemInterfaceMacros_h