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