2 Qanava - Graph drawing library for QT
3 Copyright (C) 2005 Benoit AUTHEMAN
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 //-----------------------------------------------------------------------------
21 // This file is a part of the Qanava software.
24 // \author Benoit Autheman (benoit@faktiss.net)
25 // \date 2004 February 15
26 //-----------------------------------------------------------------------------
37 namespace qan
{ // ::qan
38 namespace la
{ // ::qan::la
41 /* Graph Constructor/Destructor *///-------------------------------------------
51 //-----------------------------------------------------------------------------
55 /* Edge/Node Management *///---------------------------------------------------
56 void Graph::dumpNeato( const std::string
& fileName
)
59 ofs
.open( fileName
.c_str( ) );
61 ofs
<< "\t center=true; \n";
62 ofs
<< "#\t page=\"18,18\"; \n";
63 ofs
<< "\t size=\"20,20\"; \n";
64 ofs
<< "\t ratio=compress; \n";
65 ofs
<< "\t concentrate=true; \n";
66 ofs
<< "\t overlap=true; \n";
67 ofs
<< "\t orientation=paysage; \n";
69 ofs
<< "\t node [ shape=box, style=filled, fontsize=10, height=0.2, width=0.4 ];\n";
70 ofs
<< "\t edge [ len=0.5 ];\n";
73 Node::Nodes::iterator nodeIter
= _nodes
.begin( );
74 for ( ; nodeIter
!= _nodes
.end( ); nodeIter
++ )
76 Node
* node
= *nodeIter
;
77 ofs
<< "\t" << node
->getId( ) << " [label=\"" << node
->getLabel( ).c_str( ) << "\"];\n";
81 for ( nodeIter
= _nodes
.begin( ); nodeIter
!= _nodes
.end( ); nodeIter
++ )
83 Node
* node
= *nodeIter
;
84 const Edge::Edges
& edges
= node
->getOutEdges( );
85 Edge::Edges::const_iterator edgeIter
= edges
.begin( );
86 for ( ; edgeIter
!= edges
.end( ); edgeIter
++ )
88 Edge
* edge
= *edgeIter
;
89 ofs
<< "\t" << edge
->getSrc( ).getId( ) << " -- " << edge
->getDst( ).getId( ) << "\n";
95 /*! There is no checking on multiple (same) node addition.
96 \param node Node to register in this graph.
97 \param object Optional object that act as a unique key associed to the node.
99 void Graph::registerNode( Node
& node
, void* object
)
101 _nodes
.push_back( &node
);
102 node
.setId( _nodes
.size( ) - 1 );
104 // Map the registered node to a given memory object that act as a key
107 _objectNodeMap
.insert( std::pair
< void*, Node
* >( object
, &node
) );
108 _nodeObjectMap
.insert( std::pair
< Node
*, void* >( &node
, object
) );
112 Edge
* Graph::createEdge( Node
& a
, Node
& b
)
114 Edge
* edge
= new Edge( a
, b
);
115 _edges
.push_back( edge
);
116 a
.addOutEdge( *edge
);
117 b
.addInEdge( *edge
);
122 \return a pointer on the node of request label. 0 if no such node exists.
124 Node
* Graph::findNode( const std::string
& label
)
126 for ( Node::Nodes::iterator nodeIter
= _nodes
.begin( ); nodeIter
!= _nodes
.end( ); nodeIter
++ )
128 Node
* node
= *nodeIter
;
129 if ( node
->getLabel( ) == label
)
135 Node
* Graph::findNode( void* object
)
137 ObjectNodeMap::iterator objectNodeIter
= _objectNodeMap
.find( object
);
138 return ( objectNodeIter
!= _objectNodeMap
.end( ) ? objectNodeIter
->second
: 0 );
141 void* Graph::findObject( Node
* node
)
143 NodeObjectMap::iterator objectIter
= _nodeObjectMap
.find( node
);
144 return ( objectIter
!= _nodeObjectMap
.end( ) ? objectIter
->second
: 0 );
147 Node::NodesSet
* Graph::getNodesSet( )
149 Node::NodesSet
* nodesSet
= new Node::NodesSet( );
150 std::copy( _nodes
.begin( ), _nodes
.end( ),
151 std::insert_iterator
< Node::NodesSet
>( *nodesSet
, nodesSet
->begin( ) ) );
154 //-----------------------------------------------------------------------------