00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkSpatialObjectTreeNode_h
00018 #define __itkSpatialObjectTreeNode_h
00019
00020 #include "itkTreeNode.h"
00021 #include "itkSpatialObject.h"
00022 #include "itkScalableAffineTransform.h"
00023
00024 namespace itk
00025 {
00026
00027 template <unsigned int TDimension> class SpatialObject;
00028
00029 template <unsigned int TDimension>
00030 class SpatialObjectTreeNode : public TreeNode< SpatialObject<TDimension> * >
00031 {
00032
00033 public:
00034
00036 typedef SpatialObject<TDimension> SpatialObjectType;
00037 typedef TreeNode< SpatialObject<TDimension> *> Superclass;
00038 typedef SpatialObjectTreeNode<TDimension> Self;
00039 typedef SmartPointer<Self> Pointer;
00040 typedef SmartPointer<const Self> ConstPointer;
00041 typedef ScalableAffineTransform< double, TDimension>
00042 TransformType;
00043 typedef typename TransformType::Pointer TransformPointer;
00044 typedef const TransformType* TransformConstPointer;
00045 typedef typename Superclass::ChildrenListType ChildrenListType;
00046
00048 itkNewMacro( Self );
00049
00051 itkTypeMacro( SpatialObjectTreeNode, TreeNode );
00052
00054 virtual void SetData(SpatialObjectType* data);
00055
00057 itkSetObjectMacro(NodeToParentNodeTransform,TransformType);
00058 itkGetConstReferenceObjectMacro(NodeToParentNodeTransform,TransformType);
00060
00062 itkSetObjectMacro(NodeToWorldTransform,TransformType);
00063 itkGetConstReferenceObjectMacro(NodeToWorldTransform,TransformType);
00065
00067 void ComputeNodeToWorldTransform();
00068
00070 #if !defined(CABLE_CONFIGURATION)
00071 virtual ChildrenListType* GetChildren( unsigned int depth=0,
00072 char * name=NULL) const;
00073 #endif
00074
00075 protected:
00076
00078 SpatialObjectTreeNode();
00079 virtual ~SpatialObjectTreeNode(){};
00081
00082 TransformPointer m_NodeToParentNodeTransform;
00083 TransformPointer m_NodeToWorldTransform;
00084
00085 private:
00086
00087 SpatialObjectTreeNode(const Self&);
00088 void operator=(const Self&);
00089
00090 };
00091
00093 template <unsigned int TDimension>
00094 SpatialObjectTreeNode<TDimension>
00095 ::SpatialObjectTreeNode() : TreeNode<SpatialObject<TDimension> *>()
00096 {
00097 m_NodeToParentNodeTransform = TransformType::New();
00098 m_NodeToParentNodeTransform->SetIdentity();
00099 m_NodeToWorldTransform = TransformType::New();
00100 m_NodeToWorldTransform->SetIdentity();
00101 this->m_Parent = NULL;
00102 }
00104
00105
00107 template <unsigned int TDimension>
00108 void
00109 SpatialObjectTreeNode<TDimension>
00110 ::SetData(SpatialObjectType* data)
00111 {
00112 Superclass::Set(data);
00113 data->SetTreeNode(this);
00114 }
00116
00118 template <unsigned int TDimension>
00119 void SpatialObjectTreeNode<TDimension>
00120 ::ComputeNodeToWorldTransform()
00121 {
00122 m_NodeToWorldTransform->SetMatrix(m_NodeToParentNodeTransform->GetMatrix());
00123 m_NodeToWorldTransform->SetOffset(m_NodeToParentNodeTransform->GetOffset());
00124 if(this->HasParent())
00125 {
00126 static_cast<Self*>(this->GetParent())->ComputeNodeToWorldTransform();
00127 m_NodeToWorldTransform->Compose( static_cast<Self*>(this->GetParent())
00128 ->GetNodeToWorldTransform(), false);
00129 }
00130 }
00132
00133
00135 #if !defined(CABLE_CONFIGURATION)
00136 template <unsigned int TDimension>
00137 typename SpatialObjectTreeNode<TDimension>::ChildrenListType*
00138 SpatialObjectTreeNode<TDimension>
00139 ::GetChildren( unsigned int depth, char * name) const
00140 {
00141 ChildrenListType * children = new ChildrenListType;
00142
00143 typename ChildrenListType::const_iterator childrenListIt =
00144 this->m_Children.begin();
00145 typename ChildrenListType::const_iterator childrenListEnd =
00146 this->m_Children.end();
00147
00148 while( childrenListIt != childrenListEnd )
00149 {
00150 if( name == NULL || strstr(typeid(*((*childrenListIt)->Get())).name(),
00151 name) )
00152 {
00153 children->push_back(*childrenListIt);
00154 }
00155 if( depth > 0 )
00156 {
00157 ChildrenListType * nextchildren =
00158 (**childrenListIt).GetChildren(depth-1, name);
00159
00160 typename ChildrenListType::const_iterator nextIt = nextchildren->begin();
00161 while(nextIt != nextchildren->end())
00162 {
00163 children->push_back(*nextIt);
00164 nextIt++;
00165 }
00166 delete nextchildren;
00167 }
00168 childrenListIt++;
00169 }
00170
00171 return children;
00172 }
00173 #endif
00174
00175 }
00176
00177
00178 #endif
00179