chiark / gitweb /
files that make graphs
[familyTree.git] / cgiFiles / smallGraph.py
1 #!/usr/bin/python
2
3 import cgi
4 import cgitb
5
6 import pygraph
7 from pygraph.classes.graph import graph
8 from pygraph.classes.digraph import digraph
9 from pygraph.algorithms.searching import breadth_first_search
10 from pygraph.readwrite.dot import write
11 import gv
12 import StringIO
13
14 cgitb.enable()
15 def add_quotes(s):
16         return '\"'+str(s)+'\"'
17
18
19 def make_graph(Self,parents,children,otherparents,spouses):
20         # Graph creation
21         gr = digraph()
22
23         node_attr = [('fontsize',8)]
24
25         # Add nodes and edges
26         gr.add_node(Self,node_attr)
27
28
29         for p in parents:
30                 if not gr.has_node(p):
31                         gr.add_node(p,node_attr)
32                 if not gr.has_edge((p,Self)):
33                         gr.add_edge((p,Self))
34                 
35         couples=[]
36         if len(parents)==2:
37                 ps = (parents[0],parents[1])
38                 if not gr.has_edge(ps):
39                         gr.add_edge(ps)
40                         attr = [('dir','none')]
41                         gr.add_edge_attributes(ps,attr)
42                         couples.append(ps)
43
44         for i in range(len(children)):
45                 if not gr.has_node(children[i]):
46                         gr.add_node(children[i],node_attr)
47                 if not gr.has_edge ((Self,children[i])):
48                         gr.add_edge((Self,children[i]))
49                 if not gr.has_node(otherparents[i]):
50                         gr.add_node(otherparents[i],node_attr)
51                 if not gr.has_edge((otherparents[i],children[i])):
52                         gr.add_edge((otherparents[i],children[i]))
53
54                 
55                 if not gr.has_edge((otherparents[i],Self)):
56                         e = (otherparents[i],Self)
57                         attr = [('dir','none')]
58                         gr.add_edge(e)
59                         gr.add_edge_attributes(e,attr)
60                         couples.append(e)
61
62         for s in spouses:
63                 if not gr.has_node(s):
64                         gr.add_node(s,node_attr)
65                 if not gr.has_edge((s,Self)):
66                         e = (s,Self)
67                         attr = [('dir','none')]
68                         gr.add_edge(e)
69                         gr.add_edge_attributes(e,attr)
70                         couples.append(e)
71
72
73
74          #Draw as jpg
75         dot = write(gr)
76         dot = dot[:-2]
77         
78         for couple in couples:
79                 line = "\n{rank=same "+add_quotes(couple[0]) + ' '\
80                         +add_quotes(couple[1])+"}"
81
82                 dot = dot + line
83
84         dot = dot + '\n}'
85         gvv = gv.readstring(dot)
86         gv.layout(gvv,'dot')
87
88         format = 'jpg'
89
90         print "Content-type: image/" + format + "\n"
91         print gv.render(gvv,format)
92
93 form = cgi.FieldStorage()
94
95 Self = form.getvalue('Self')
96 p = form.getlist('p')
97 c = form.getlist('c')
98 op = form.getlist('op')
99 s = form.getlist('s')
100
101 make_graph(Self,p,c,op,s)
102