Skip to content

Commit 6c839fe

Browse files
committed
Merge branch (revised pr) 'Joilnen-master'
2 parents 4653d02 + a95d273 commit 6c839fe

6 files changed

Lines changed: 62 additions & 18 deletions

File tree

examples/heapsort.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@
157157
{
158158
"data": {
159159
"application/vnd.jupyter.widget-view+json": {
160-
"model_id": "6f45a62e8def48d38d9720bde9ab736b",
160+
"model_id": "0f5267abc9e3478587dd7b61d9cb0c1c",
161161
"version_major": 2,
162162
"version_minor": 0
163163
},

examples/simple.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
ae 1 2
22
ae 1 "a \"node\""
33
ae 2 "a \"node\""
4+
le 1 2 "an \"edge\""
45
ns
56
hn 1
67
ns
78
hn 2
8-
ln 2 "foo bar"
9+
ln 2 "foo \"bar\""
10+
ue 1 2
911
ns
1012
hn "a \"node\""
1113
# this is a comment

gvanim/action.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,15 @@ def __init__( self, v, label ):
4242
self.label = label
4343
def __call__( self, steps ):
4444
steps[ -1 ].V.add( self.v )
45-
steps[ -1 ].L[ self.v ] = self.label
45+
steps[ -1 ].lV[ self.v ] = self.label
4646

4747
class UnlabelNode( object ):
4848
def __init__( self, v ):
4949
self.v = v
5050
def __call__( self, steps ):
5151
steps[ -1 ].V.add( self.v )
5252
try:
53-
del steps[ -1 ].L[ self.v ]
53+
del steps[ -1 ].lV[ self.v ]
5454
except KeyError:
5555
pass
5656

@@ -64,7 +64,7 @@ def __call__( self, steps ):
6464
except KeyError:
6565
pass
6666
try:
67-
del steps[ -1 ].L[ self.v ]
67+
del steps[ -1 ].lV[ self.v ]
6868
except KeyError:
6969
pass
7070
dE = set( e for e in steps[ -1 ].E if self.v in e )
@@ -93,6 +93,30 @@ def __call__( self, steps ):
9393
steps[ -1 ].E.add( ( self.u, self.v ) )
9494
steps[ -1 ].hE[ ( self.u, self.v ) ] = self.color
9595

96+
class LabelEdge( object ):
97+
def __init__( self, u, v, label ):
98+
self.u = u
99+
self.v = v
100+
self.label_edge = label
101+
def __call__( self, steps ):
102+
steps[ -1 ].V.add( self.u )
103+
steps[ -1 ].V.add( self.v )
104+
steps[ -1 ].E.add( ( self.u, self.v ) )
105+
steps[ -1 ].lE[ ( self.u, self.v ) ] = self.label_edge
106+
107+
class UnlabelEdge( object ):
108+
def __init__( self, u, v ):
109+
self.u = u
110+
self.v = v
111+
def __call__( self, steps ):
112+
steps[ -1 ].V.add( self.u )
113+
steps[ -1 ].V.add( self.v )
114+
steps[ -1 ].E.add( ( self.u, self.v ) )
115+
try:
116+
del steps[ -1 ].lE[ ( self.u, self.v ) ]
117+
except KeyError:
118+
pass
119+
96120
class RemoveEdge( object ):
97121
def __init__( self, u, v ):
98122
self.u = u
@@ -101,5 +125,6 @@ def __call__( self, steps ):
101125
steps[ -1 ].E.discard( ( self.u, self.v ) )
102126
try:
103127
del steps[ -1 ].hE[ ( self.u, self.v ) ]
128+
del steps[ -1 ].lE[ ( self.u, self.v ) ]
104129
except KeyError:
105130
pass

gvanim/animation.py

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,36 +31,42 @@ def __init__( self, step = None ):
3131
if step:
3232
self.V = step.V.copy()
3333
self.E = step.E.copy()
34-
self.L = step.L.copy()
34+
self.lV = step.lV.copy()
35+
self.lE = step.lE.copy()
3536
else:
3637
self.V = set()
3738
self.E = set()
38-
self.L = dict()
39+
self.lV = dict()
40+
self.lE = dict()
3941
self.hV = dict()
4042
self.hE = dict()
4143

4244
def node_format( self, v ):
4345
fmt = []
44-
try:
45-
fmt.append( 'label="{}"'.format( self.L[ v ] ) )
46-
except KeyError:
47-
pass
46+
if v in self.lV:
47+
fmt.append( 'label="{}"'.format( quote( str( self.lV[ v ] ) ) ) )
4848
if v in self.hV:
4949
fmt.append( 'color={}'.format( self.hV[ v ] ) )
5050
elif v not in self.V:
5151
fmt.append( 'style=invis' )
52-
if fmt: return '[{}]'.format( ','.join( fmt ) )
52+
if fmt:
53+
return '[{}]'.format( ', '.join( fmt ) )
5354
return ''
5455

5556
def edge_format( self, e ):
57+
fmt = []
58+
if e in self.lE:
59+
fmt.append('label="{}"'.format( quote( str( self.lE[ e ] ) ) ) )
5660
if e in self.hE:
57-
return '[color={}]'.format( self.hE[ e ] )
58-
elif e in self.E:
59-
return ''
60-
return '[style=invis]'
61+
fmt.append('color={}'.format( self.hE[ e ] ) )
62+
elif e not in self.E:
63+
fmt.append('style=invis')
64+
if fmt:
65+
return '[{}]'.format( ', '.join( fmt ) )
66+
return ''
6167

6268
def __repr__( self ):
63-
return '{{ V = {}, E = {}, hV = {}, hE = {}, L = {} }}'.format( self.V, self.E, self.hV, self.hE, self.L )
69+
return '{{ V = {}, E = {}, hV = {}, hE = {}, L = {}, lE = {} }}'.format( self.V, self.E, self.hV, self.hE, self.lV, self.lE )
6470

6571
class Animation( object ):
6672

@@ -91,6 +97,12 @@ def add_edge( self, u, v ):
9197
def highlight_edge( self, u, v, color = 'red' ):
9298
self._actions.append( action.HighlightEdge( u, v, color = color ) )
9399

100+
def label_edge( self, u, v, label ):
101+
self._actions.append( action.LabelEdge( u, v, label ) )
102+
103+
def unlabel_edge( self, u, v ):
104+
self._actions.append( action.UnlabelEdge( u, v ) )
105+
94106
def remove_edge( self, u, v ):
95107
self._actions.append( action.RemoveEdge( u, v ) )
96108

@@ -104,6 +116,8 @@ def parse( self, lines ):
104116
'rn' : self.remove_node,
105117
'ae' : self.add_edge,
106118
'he' : self.highlight_edge,
119+
'le' : self.label_edge,
120+
'ue' : self.unlabel_edge,
107121
're' : self.remove_edge,
108122
}
109123
for line in lines:
@@ -137,4 +151,5 @@ def graphs( self ):
137151
for e in E: graph.append( '"{}" -> "{}" {};'.format( quote( str( e[ 0 ] ) ), quote( str( e[ 1 ] ) ), s.edge_format( e ) ) )
138152
graph.append( '}' )
139153
graphs.append( '\n'.join( graph ) )
154+
140155
return graphs

gvanim/render.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ def render( graphs, basename, fmt = 'png', size = 320 ):
3434
_map = map
3535
return _map( _render, [ ( '{}_{:03}.{}'.format( basename, n, fmt ), fmt, size, graph ) for n, graph in enumerate( graphs ) ] )
3636

37-
def gif( files, basename, delay = 100 ):
37+
def gif( files, basename, delay = 100, size = 320 ):
38+
for file in files:
39+
call([ 'mogrify', '-gravity', 'center', '-background', 'white', '-extent', str(size), file ])
3840
cmd = [ 'convert' ]
3941
for file in files:
4042
cmd.extend( ( '-delay', str( delay ), file ) )

tests/action.pyc

-1.47 KB
Binary file not shown.

0 commit comments

Comments
 (0)