(empty message)
[qanava.git] / src / la / laGraph.cpp
blob0bb5f954f2bd073a364b2419b37b3dfe396ff3b9
1 /*
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.
23 // \file laGraph.cpp
24 // \author Benoit Autheman (benoit@faktiss.net)
25 // \date 2004 February 15
26 //-----------------------------------------------------------------------------
29 // Qanava headers
30 #include "laGraph.h"
33 // Standard headers
34 #include <fstream>
37 namespace qan { // ::qan
38 namespace la { // ::qan::la
41 /* Graph Constructor/Destructor *///-------------------------------------------
42 Graph::Graph( )
47 Graph::~Graph( )
49 // Delete nodes
51 //-----------------------------------------------------------------------------
55 /* Edge/Node Management *///---------------------------------------------------
56 void Graph::dumpNeato( const std::string& fileName )
58 std::ofstream ofs;
59 ofs.open( fileName.c_str( ) );
60 ofs << "graph g {\n";
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";
72 // Dump nodes
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";
80 // Dump nodes edges
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";
92 ofs << "}\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
105 if ( object != 0 )
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 );
118 return 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 )
130 return node;
132 return 0;
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( ) ) );
152 return nodesSet;
154 //-----------------------------------------------------------------------------
157 } // ::qan::la
158 } // ::qan