MeVisLabToolboxReference
|
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