MeVisLabToolboxReference
|
00001 // **InsertLicense** code 00011 #ifndef __mlGraph_H 00012 #define __mlGraph_H 00013 00014 // Include dll-specific settings. 00015 #include "mlVesselGraphSystem.h" 00016 00017 // ThirdParty/System includes 00018 #include "mlSystemWarningsDisable.h" 00019 #include <boost/iterator/transform_iterator.hpp> 00020 #include <boost/shared_ptr.hpp> 00021 #include <map> 00022 #include "mlSystemWarningsRestore.h" 00023 00024 // ML includes 00025 #include "mlBase.h" 00026 #include "mlImageVector.h" 00027 #include "mlSubImageBoxd.h" 00028 #include "mlVector3.h" 00029 00030 // MLVesselGraph includes 00031 #include "Properties/mlPropertyManager.h" 00032 00033 // Be sure that all your modules are part of the ml. So collisions 00034 // with names in system files or other libraries are minimized. 00035 ML_START_NAMESPACE 00036 00037 // Forward-declarations 00038 class GraphAction; 00039 class VesselEdge; 00040 class VesselNode; 00041 00042 00059 class VESSELGRAPH_EXPORT Graph : public Base 00060 { 00061 00062 friend class GraphAnalyser; 00063 friend class SaveTreeData; 00064 friend class LoadTreeData; 00065 public: 00066 00069 enum {node,edge}; 00070 00072 enum ActionType{ 00073 NoAction =0, // Not changed. 00074 LabelGraph, // Skeleton label values changed. 00075 EditGraph, // Skeleton label colors changed. 00076 ModifyRoots, // Roots modified: graph is redirected 00077 ModifyNodesEdges, // Remove/Insert edges, insert nodes 00078 NewGraph, // Everything new 00079 NumActionTypes // 00080 }; 00081 00082 //---------------------------------------------------------- 00084 00085 //---------------------------------------------------------- 00087 Graph(); 00088 00090 Graph( const Graph& g, bool reorder=false ); 00091 00093 Graph( const Graph& g, const VesselNode* root, bool reorder=false ); 00094 00096 Graph( const Graph& g, const std::vector<const VesselNode*> &roots, bool reorder=false ); 00097 00099 Graph( Graph& g, int clusterId, bool reorder=false); 00100 00102 virtual Graph* deepCopy() const { return new Graph(*this); }; 00103 00105 virtual ~Graph(); 00107 00108 //------------------------------------------------------ 00110 00111 //------------------------------------------------------ 00114 static bool hasVesselVoxels; 00116 00117 //--------------------------------------------------------- 00119 00120 //--------------------------------------------------------- 00121 00123 VesselEdge* createEdge(VesselNode* predNode, VesselNode* succNode, MLint useId=-1); 00125 VesselEdge* createEdge(MLint predNodeId, MLint succNodeId, MLint useId=-1); 00126 00128 VesselNode* createNode(const Vector3& pos=Vector3(0), MLint useId=-1); 00130 VesselNode* createNode(const ImageVector& pos, MLint useId=-1) { return this->createNode(Vector3(pos.x, pos.y, pos.z), useId); }; 00131 00133 void insertRoot(VesselNode* node); 00134 00136 00137 00138 //--------------------------------------------------------- 00140 00141 //--------------------------------------------------------- 00142 00144 void addGraph(const Graph& g) { 00145 std::map<const VesselNode*, VesselNode*> nodeMapping; 00146 std::map<const VesselEdge*, VesselEdge*> edgeMapping; 00147 std::map<const VesselNode*, VesselNode*> rootMapping; 00148 this->addGraph(g, nodeMapping, edgeMapping, rootMapping); 00149 } 00150 00154 void addGraph(const Graph& g, std::map<const VesselNode*, VesselNode*>& nodeMapping, std::map<const VesselEdge*, VesselEdge*>& edgeMapping, std::map<const VesselNode*, VesselNode*>& rootMapping); 00155 00157 void addSubtrees(const std::vector<const VesselNode*>& roots); 00158 00161 void copyParts(const std::vector<const VesselNode*>& nodes, const std::vector<const VesselEdge*>& edges, const std::vector<const VesselNode*>& roots) { 00162 std::map<const VesselNode*, VesselNode*> nodeMapping; 00163 std::map<const VesselEdge*, VesselEdge*> edgeMapping; 00164 std::map<const VesselNode*, VesselNode*> rootMapping; 00165 this->copyParts(nodes, edges, roots, nodeMapping, edgeMapping, rootMapping); 00166 } 00167 00171 void copyParts(const std::vector<const VesselNode*>& nodes, const std::vector<const VesselEdge*>& edges, const std::vector<const VesselNode*>& roots, std::map<const VesselNode*, VesselNode*>& nodeMapping, std::map<const VesselEdge*, VesselEdge*>& edgeMapping, std::map<const VesselNode*, VesselNode*>& rootMapping); 00172 00174 00175 //-------------------------------------------------------- 00177 00178 //-------------------------------------------------------- 00180 bool removeEdge(VesselEdge* edge, bool removeEmptyNodes=true); 00182 bool removeNode(VesselNode* node); 00184 void removeRoot(VesselNode* r); 00186 void clearRoots(); 00188 void clearGraph(); 00190 00191 00193 typedef std::map<MLint, VesselNode*> NodeMap; 00195 typedef boost::function< VesselNode* (const NodeMap::value_type &) > NodeAccess; 00197 typedef boost::function< const VesselNode* (const NodeMap::value_type &) > ConstNodeAccess; 00199 typedef boost::transform_iterator<NodeAccess, NodeMap::iterator> NodeIterator; 00201 typedef boost::transform_iterator<ConstNodeAccess, NodeMap::const_iterator> ConstNodeIterator; 00202 00204 typedef std::map<MLint, VesselEdge*> EdgeMap; 00206 typedef boost::function< VesselEdge* (const EdgeMap::value_type &) > EdgeAccess; 00208 typedef boost::function< const VesselEdge* (const EdgeMap::value_type &) > ConstEdgeAccess; 00210 typedef boost::transform_iterator<EdgeAccess, EdgeMap::iterator> EdgeIterator; 00212 typedef boost::transform_iterator<ConstEdgeAccess, EdgeMap::const_iterator> ConstEdgeIterator; 00213 00214 //--------------------------------------------------------- 00216 00217 //-------------------------------------------------------- 00218 00220 NodeIterator beginNode() { return boost::make_transform_iterator( _nodes.begin(), &getSecond< VesselNode*, NodeMap::value_type > ); } 00222 NodeIterator endNode () { return boost::make_transform_iterator( _nodes.end(), &getSecond< VesselNode*, NodeMap::value_type > ); } 00223 00225 ConstNodeIterator beginNode() const { return boost::make_transform_iterator( _nodes.begin(), &getSecond< const VesselNode*, NodeMap::value_type > ); } 00227 ConstNodeIterator endNode () const { return boost::make_transform_iterator( _nodes.end(), &getSecond< const VesselNode*, NodeMap::value_type > ); } 00228 00230 EdgeIterator beginEdge() { return boost::make_transform_iterator( _edges.begin(), &getSecond< VesselEdge*, EdgeMap::value_type > ); } 00232 EdgeIterator endEdge () { return boost::make_transform_iterator( _edges.end(), &getSecond< VesselEdge*, EdgeMap::value_type > ); } 00233 00235 ConstEdgeIterator beginEdge() const { return boost::make_transform_iterator( _edges.begin(), &getSecond< const VesselEdge*, EdgeMap::value_type > ); } 00237 ConstEdgeIterator endEdge () const { return boost::make_transform_iterator( _edges.end(), &getSecond< const VesselEdge*, EdgeMap::value_type > ); } 00238 00240 NodeIterator beginRoot() { return boost::make_transform_iterator( _roots.begin(), &getSecond< VesselNode*, NodeMap::value_type > ); } 00242 NodeIterator endRoot () { return boost::make_transform_iterator( _roots.end(), &getSecond< VesselNode*, NodeMap::value_type > ); } 00243 00245 ConstNodeIterator beginRoot() const { return boost::make_transform_iterator( _roots.begin(), &getSecond< const VesselNode*, NodeMap::value_type > ); } 00247 ConstNodeIterator endRoot () const { return boost::make_transform_iterator( _roots.end(), &getSecond< const VesselNode*, NodeMap::value_type > ); } 00248 00250 size_t numNodes() const {return _nodes.size();}; 00252 size_t numEdges() const {return _edges.size();}; 00254 size_t numRoots() const {return _roots.size();}; 00255 00257 const VesselNode* getIdNode(MLint id) const; 00259 VesselNode* getIdNode(MLint id); 00261 const VesselEdge* getIdEdge(MLint id) const; 00263 VesselEdge* getIdEdge(MLint id); 00264 00266 const VesselNode* getNode(Vector3 pos) const; 00268 VesselNode* getNode(Vector3 pos); 00270 const VesselEdge* getEdge(Vector3 pos) const; 00272 VesselEdge* getEdge(Vector3 pos); 00274 const VesselNode* getRoot(Vector3 pos) const; 00276 VesselNode* getRoot(Vector3 pos); 00277 00280 const VesselNode* getNode(size_t index) const; 00283 VesselNode* getNode(size_t index); 00284 00287 const VesselEdge* getEdge(size_t index) const; 00290 VesselEdge* getEdge(size_t index); 00291 00294 const VesselNode* getRoot(size_t index) const; 00297 VesselNode* getRoot(size_t index); 00298 00300 size_t getIndex(const VesselNode* node) const; 00302 size_t getIndex(const VesselEdge* edge) const; 00304 00305 00307 00308 00309 PropertyManager::Pointer getNodePropertyManager() { return _nodePropertyManager; } 00310 PropertyManager::ConstPointer getNodePropertyManager() const { return _nodePropertyManager; } 00311 00313 PropertyManager::Pointer getEdgePropertyManager() { return _edgePropertyManager; } 00314 PropertyManager::ConstPointer getEdgePropertyManager() const { return _edgePropertyManager; } 00315 00317 PropertyManager::Pointer getSkeletonPropertyManager() { return _skeletonPropertyManager; } 00318 PropertyManager::ConstPointer getSkeletonPropertyManager() const { return _skeletonPropertyManager; } 00320 00321 //--------------------------------------------------------- 00323 00324 //--------------------------------------------------------- 00325 void transform(const Matrix4& m); 00326 00328 void setToWorldMatrix(const Matrix4 *m); 00330 void setToWorldMatrix(const Matrix4 &m); 00332 const Matrix4 *getToWorldMatrix() const; 00334 void getToWorldMatrix(float *mat) const; 00336 Matrix4 getToVoxelMatrix() const; 00337 00339 void setToWorld(void) {_isWorld=true;} 00341 void setToVoxel(void) {_isWorld=false;} 00343 bool isWorld() const {return _isWorld;} 00345 void worldVoxelConvert(); 00348 void convertToVoxel(void); 00351 void convertToWorld(void); 00352 00354 void setImgExt(ImageVector v) {_imgExt = v;} 00355 ImageVector getImgExt() const {return _imgExt;} 00356 int extX() const {return _imgExt.x;} 00357 int extY() const {return _imgExt.y;} 00358 int extZ() const {return _imgExt.z;} 00359 00360 void setVoxelExt(Vector3 v) {_voxelExt = v;} 00361 Vector3 getVoxelExt() const {return _voxelExt;} 00363 00364 int getNumCluster() const { return _numCluster; } 00365 00366 bool getFlag() const { return _bFlag;} 00367 void setFlag(bool bFlag) { _bFlag = bFlag;} 00368 00371 void closeSkeletonGaps(); 00372 00376 MLint splitEdge (MLint edgeID, size_t skeletonIndex); 00377 bool mergeEdges(VesselEdge* parent, VesselEdge* child); 00378 00379 void clampToImage(); 00380 00381 //------------------------------------------------------- 00383 00384 //------------------------------------------------------- 00387 virtual void addStateToTree(TreeNode* parent) const; 00389 ML_SET_ADDSTATE_VERSION(3); 00391 virtual void readStateFromTree(TreeNode* parent); 00392 00395 int getVersion( void ) { return _version; } 00397 void setCurrentVersion( void ) { _version = getAddStateVersion(); } 00399 void setVersion( int version ) { _version = version; } 00401 00402 //-------------------------------------------------------- 00404 00405 //-------------------------------------------------------- 00407 Graph &operator = (const Graph& g); 00408 //Allocate new graph with same properties as this (slowly). 00409 Graph *newGraph(bool bXml=true) const; 00410 //friend void copyVessels(Graph ©,const Graph &source); 00412 00413 //--------------------------------------------------------- 00415 00416 //--------------------------------------------------------- 00419 int separateGraph(); 00420 00441 bool directGraph(float FloodThresh); 00442 00446 void stripCycles(); 00447 00450 void setRootIdToAllChildren(); 00451 00455 void purifyGraph(); 00457 00458 //------------------------------------------------------ 00460 00461 //------------------------------------------------------ 00463 SubImageBoxd getBoundingBox() const; 00465 00466 //------------------------------------------------------ 00468 00469 //------------------------------------------------------ 00470 void setAction( ActionType action, std::string sender ); 00471 ActionType getActionValue(void) const; 00472 void setActionValue( ActionType action ); 00473 void setActionCallBack( GraphAction *cbObj ); 00475 00476 //----------------------------------------------------------- 00478 00479 00480 static double getMinSkeletonLabel( void ) { return MIN_SKELETON_LABEL; } 00481 static double getMaxSkeletonLabel( void ) { return MAX_SKELETON_LABEL; } 00483 00484 #ifdef ML_DEPRECATED 00485 ML_DEPRECATED static Graph* skeletonGraphFromBase( Base* a_base ); 00486 #endif 00487 00488 protected: 00489 template <typename ResultType, typename ParameterType> 00490 static ResultType getSecond(const ParameterType& p) { return p.second; } 00491 00493 bool _bFlag; 00494 00496 bool _isWorld; 00498 Matrix4 _toWorldMatrix; 00500 ImageVector _imgExt; 00502 Vector3 _voxelExt; 00503 00505 std::map<MLint, VesselNode*> _nodes; 00506 std::map<MLint, VesselEdge*> _edges; 00507 std::map<MLint, VesselNode*> _roots; 00508 00511 int _numCluster; 00512 00513 private: 00516 int _version; 00517 00518 PropertyManager::Pointer _nodePropertyManager; 00519 PropertyManager::Pointer _edgePropertyManager; 00520 PropertyManager::Pointer _skeletonPropertyManager; 00521 00522 //------------------------------------------------------ 00524 00525 //------------------------------------------------------ 00526 ActionType _action; 00527 GraphAction *_actionCBObject; 00529 00530 MLint nextNodeId() { return _nodes.empty() ? 1 : _nodes.rbegin()->first + 1; }; 00531 MLint nextEdgeId() { return _edges.empty() ? 1 : _edges.rbegin()->first + 1; }; 00532 MLint nextRootId() { return _roots.empty() ? 1 : _roots.rbegin()->first + 1; }; 00533 00536 void _setRootIdToChildren(int rootId, VesselNode* node, VesselEdge* predEdge); 00537 00538 //----------------------------------------------------------- 00540 00541 00542 static double MIN_SKELETON_LABEL; 00543 static double MAX_SKELETON_LABEL; 00545 00548 void reorderItems(); 00549 00550 bool _isContainedInImageExtent(const Vector3& pos, const Matrix4& toVoxelMatrix); 00551 00552 ML_CLASS_HEADER(Graph); 00553 }; 00554 00555 ML_END_NAMESPACE 00556 00557 00558 #endif