MeVisLabToolboxReference
MeVisLab/Standard/Sources/ML/MLVesselGraph/mlVesselEdge.h
Go to the documentation of this file.
00001 // **InsertLicense** code
00002 //----------------------------------------------------------------------------------
00006 
00011 //----------------------------------------------------------------------------------
00012 #ifndef __mlVesselEdge_H
00013 #define __mlVesselEdge_H
00014 
00015 // dll specific settings.
00016 #include "mlVesselGraphSystem.h"
00017 
00018 // ml includes 
00019 #include "mlLinearAlgebra.h"
00020 #include "mlTreeNode.h"
00021 
00022 // graph classes 
00023 #include "mlBaseGraphItem.h"
00024 #include "mlSkeleton.h"
00025 #include "mlPropertiesMacros.h"
00026 
00027 ML_START_NAMESPACE
00028 
00030 class VESSELGRAPH_EXPORT VesselEdge : public BaseGraphItem
00031 {
00032 friend class EdgeAnalyser;
00033 friend class Graph;
00034 friend class LoadTreeData;
00035 
00036 public:
00038   VesselEdge(const VesselEdge &other);
00040   ~VesselEdge();
00041 
00043 #ifdef ML_DEPRECATED
00044   ML_DEPRECATED VesselEdge& operator=(const VesselEdge& other);
00045 #endif
00046   
00048   void copyProperties(const VesselEdge* other);
00049 
00050   bool operator==(const VesselEdge& other) const;
00051   bool operator!=(const VesselEdge& other) const { return !(*this==other); }
00052 
00054 
00055 
00056   VesselNode* predNode() { return _predNode; }
00057   const VesselNode* predNode() const { return _predNode; }
00058 
00060   VesselNode* succNode() { return _succNode; }
00061   const VesselNode* succNode() const { return _succNode; }
00062 
00064   void setPred(VesselNode* node);
00065 
00067   void setSucc(VesselNode* node);
00068 
00070   bool isPred(const VesselNode* node) const { return _predNode==node; }
00072   bool isSucc(const VesselNode* node) const { return _succNode==node; }
00073 
00075   void switchDirection();
00076 
00078   //void refreshIds();
00079 
00081   void setCycle() { _cycle = true; }
00082   void unsetCycle() { _cycle = false; } 
00083   bool isCycle() const { return _cycle; }
00085 
00087 
00088 
00089 
00090   double distance(Vector3 vp) const { return getDistanceAndNearestSkeletonIndex(vp).first; };
00091 
00092   std::pair<MLdouble, size_t> getDistanceAndNearestSkeletonIndex(const Vector3& pos) const;
00093 
00095   Vector3 extent() const;
00096 
00098   SubImageBoxd getBoundingBox() const;
00099 
00101   void transform(const Matrix4& m);
00102 
00104   void convertToVoxel(Matrix4* mat);
00105   void convertToWorld(Matrix4* mat);
00107 
00109 
00110 
00111   virtual void addStateToTree(TreeNode* parent) const;
00112 
00114   ML_SET_ADDSTATE_VERSION(3);
00115 
00117   virtual void readStateFromTree(TreeNode* parent);  
00119 
00121 
00122   STATIC_GRAPH_PROPERTY(MLdouble, averageMinDistance, AverageMinDistance);
00123   STATIC_GRAPH_PROPERTY(MLdouble, length, Length);
00124   STATIC_GRAPH_PROPERTY(MLdouble, STLength, STLength);
00125   STATIC_GRAPH_PROPERTY(MLdouble, volume, Volume);
00126   STATIC_GRAPH_PROPERTY(MLdouble, STVolume, STVolume);
00127   STATIC_GRAPH_PROPERTY(Vector3, STBarycenter, STBarycenter);
00128   STATIC_GRAPH_PROPERTY(MLint, hierarchy, Hierarchy);
00129   STATIC_GRAPH_PROPERTY(MLint, label, Label);
00130   STATIC_GRAPH_PROPERTY(MLdouble, weight, Weight);
00131 
00133   typedef double (VesselEdge::*EdgeGetFkt) (void) const;     
00134   typedef void  (VesselEdge::*EdgeSetFkt) (double);          
00135 
00137   void setSTLabel(int nLabel);
00138 
00140   void setSTLabel(Graph *pGraph);
00141 
00145   bool markST( int a_label, float r, float g, float b, float a, Vector3 pos, int snap );
00146   bool markEdge( int a_label, float r, float g, float b, float a, Vector3 pos, int snap );
00148 
00149 
00151 
00152   Skeleton* createSkeleton(const Vector3& pos=Vector3(0), float minDistance = 0.0f, float maxDistance = 0.0f);
00153   Skeleton* createSkeleton(const ImageVector& pos, float minDistance = 0.0f, float maxDistance = 0.0f) { return createSkeleton(Vector3(pos.x, pos.y, pos.z), minDistance, maxDistance); }
00154   Skeleton* createSkeleton(const Skeleton* skeletonTemplate);
00155 
00156   void removeLeadingSkeletons(size_t count);
00157   void removeTrailingSkeletons(size_t count);
00158   void removeSkeleton(size_t index);
00159 
00160   size_t numSkeletons(void) const { return _skeletons.size(); }
00161   Skeleton* skeleton(size_t index) { return _skeletons.at(index); }
00162   const Skeleton* skeleton(size_t index) const { return _skeletons.at(index); }
00163 
00165   void skeletonsAscending(std::vector<Skeleton*> &skeletons);
00166 
00168   void skeletonsAscending(std::vector<const Skeleton*> &skeletons) const;
00169 
00171   void skeletonsDescending(std::vector<Skeleton*> &skeletons);
00172 
00174   void skeletonsDescending(std::vector<const Skeleton*> &skeletons) const;
00175 
00176   void orderSkeletonsAscending();
00177 
00179   void skeletonsAscending(std::vector<Skeleton>& skeletons) const;
00180 
00182   void skeletonsDescending(std::vector<Skeleton>& skeletons) const;
00183 
00185   bool skeletonsAreAscending() const;
00186 
00188   //void addSkeleton(const Skeleton &skel) { _skeletons.push_back(skel);}
00189   void clearSkeletons();
00190   Skeleton* frontSkeleton()              {return _skeletons.front();}
00191   Skeleton* backSkeleton()               {return _skeletons.back();}
00192   const Skeleton* frontSkeleton() const  {return _skeletons.front();}
00193   const Skeleton* backSkeleton() const   {return _skeletons.back();}
00194 
00198   Skeleton *skeleton(Vector3 pos,int itemType) { return const_cast<Skeleton*>(const_cast<const VesselEdge*>(this)->skeleton(pos, itemType)); }
00199 
00203   const Skeleton *skeleton(Vector3 pos,int itemType) const;
00204 
00206   size_t getVoxelNum() const;
00207 
00210   void smooth(unsigned int numSmoothingPasses, float positionSmoothingFactor, float radiusSmoothingFactor, float smoothingLimit = 0.0f );
00212 
00213 private:
00215   VesselEdge(Graph& graph, MLint id);
00216 
00218   void readOldGraphEdgeStateFromTree(TreeNode* parent);
00220   void readOldVesselEdgeStateFromTree(TreeNode* parent);
00221 
00223   VesselNode* _predNode;
00225   VesselNode* _succNode;
00226 
00228   //long _succId;
00230   //long _predId;
00231 
00234   bool _cycle;
00235 
00237   std::vector <Skeleton*> _skeletons;
00238 
00239   ML_ABSTRACT_CLASS_HEADER(VesselEdge)
00240 };
00241 
00242 #ifdef ML_DEPRECATED
00243 
00244 
00245 
00246 
00247 ML_DEPRECATED typedef VesselEdge GraphEdge;
00249 #endif // ML_DEPRECATED
00250 
00251 ML_END_NAMESPACE
00252 
00253 #endif // __mlVesselEdge_H