00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __igstkCoordinateSystem_h
00019 #define __igstkCoordinateSystem_h
00020
00021 #include "igstkObject.h"
00022 #include "igstkStateMachine.h"
00023 #include "igstkTransform.h"
00024
00025 namespace igstk
00026 {
00027
00052 class CoordinateSystem;
00053
00054 namespace Friends
00055 {
00056
00067 class CoordinateSystemHelper
00068 {
00069 public:
00074 template <class T>
00075 static const CoordinateSystem*
00076 GetCoordinateSystem( const T & input )
00077 {
00078 return input->GetCoordinateSystem();
00079 }
00080 };
00081
00082 }
00083
00084
00085 class CoordinateSystem : public Object
00086 {
00087 public:
00088
00090 igstkStandardClassTraitsMacro( CoordinateSystem, Object )
00091
00092
00096 void RequestSetTransformAndParent(const Transform & t,
00097 const CoordinateSystem* parent);
00098
00099
00100 void RequestUpdateTransformToParent(const Transform & t);
00101
00103 void RequestGetTransformToParent();
00104
00115 void RequestComputeTransformTo(const
00116 CoordinateSystem* targetCoordSys);
00117
00120 void RequestDetachFromParent();
00121
00126 igstkSetStringMacro( Name );
00127 igstkGetStringMacro( Name );
00128
00130 igstkSetStringMacro( Type );
00131 igstkGetStringMacro( Type );
00132
00133 protected:
00134
00136 CoordinateSystem( void );
00137
00139 ~CoordinateSystem( void );
00140
00142 virtual void PrintSelf( std::ostream& os, itk::Indent indent ) const;
00143
00144 private:
00146 CoordinateSystem(const Self&);
00147
00149 void operator=(const Self&);
00150
00152 Self::ConstPointer m_Parent;
00153
00158 Transform m_TransformToParent;
00159
00161 std::string m_Name;
00162
00164 std::string m_Type;
00165
00171 igstkDeclareStateMacro( Initialized );
00172
00174 igstkDeclareStateMacro( ParentSet );
00175
00177 igstkDeclareStateMacro( AttemptingComputeTransformTo );
00178 igstkDeclareStateMacro( AttemptingComputeTransformToInInitialized );
00179
00185 igstkDeclareInputMacro( NullCoordinateSystem );
00186 igstkDeclareInputMacro( ThisCoordinateSystem );
00187 igstkDeclareInputMacro( ValidCoordinateSystem );
00188
00190 igstkDeclareInputMacro( NullParent );
00191 igstkDeclareInputMacro( ThisParent );
00192 igstkDeclareInputMacro( ValidParent );
00193 igstkDeclareInputMacro( ParentCausesCycle );
00194
00198 igstkDeclareInputMacro( AncestorFound );
00199 igstkDeclareInputMacro( Disconnected );
00200
00203 igstkDeclareInputMacro( DetachFromParent );
00204
00206 igstkDeclareInputMacro( UpdateTransformToParent );
00207
00211 Transform m_TransformFromRequestSetTransformAndParent;
00212 Self::ConstPointer m_ParentFromRequestSetTransformAndParent;
00213
00215 void SetTransformAndParentNullParentProcessing();
00216
00218 void SetTransformAndParentThisParentProcessing();
00219
00223 void SetTransformAndParentCycleProcessing();
00224
00226 void SetTransformAndParentProcessing();
00227
00229 void UpdateTransformToParentProcessing();
00230
00235 Self::ConstPointer m_TargetFromRequestComputeTransformTo;
00236
00240 void ComputeTransformToThisTargetProcessing();
00241
00245 void ComputeTransformToNullTargetProcessing();
00246
00250 void ComputeTransformToValidTargetProcessing();
00251
00255 void ComputeTransformToDisconnectedProcessing();
00256
00261 void ComputeTransformToAncestorFoundProcessing();
00262
00268 void FindLowestCommonAncestor(const Self* targetCoordinateSystem);
00269
00276 Self::ConstPointer m_LowestCommonAncestor;
00277
00282 Transform ComputeTransformTo(const CoordinateSystem* ancestor) const;
00283
00288 bool CanReach(const CoordinateSystem* target) const;
00289
00293 void InvalidRequestProcessing();
00294
00296 void DoNothingProcessing();
00297
00299 void DetachFromParentProcessing();
00300
00304 const CoordinateSystem* GetCoordinateSystem() const;
00305
00307 igstkFriendClassMacro( igstk::Friends::CoordinateSystemHelper );
00308
00309 };
00310
00311
00312
00313
00314
00315 igstkEventMacro( CoordinateSystemErrorEvent, IGSTKErrorEvent );
00316 igstkEventMacro( CoordinateSystemSetParentError, CoordinateSystemErrorEvent );
00317
00321 igstkEventMacro( CoordinateSystemNullParentEvent,
00322 CoordinateSystemSetParentError );
00323
00327 igstkEventMacro( CoordinateSystemThisParentEvent,
00328 CoordinateSystemSetParentError );
00329
00333 igstkLoadedConstObjectEventMacro( CoordinateSystemParentCycleEvent,
00334 CoordinateSystemSetParentError,
00335 CoordinateSystem );
00336
00337 }
00338
00339 #endif // __igstkCoordinateSystem_h