"""
1999 Manuel Gutierrez Algaba
You are free to use , modify, distribute and copy this piece of
python code, if you keep this free copyright notice in it.
grapher.py Version 1.0
This small programm produces state diagrams, just specifying the
relationship among the different states
def do_size(self, s):
"""
valid sizes are: 0.9 and 0.8, or greater
"""
self.size = s
def rel(self,n=None, l= None, f = None, g=[] ):
"""
This makes a relationship among this state and those stated
in n and g.
n = the next one state,
g = a list of states where this state goes
l = label of the transition of this state to the next one
f = forced_next , this forces f to be the next node to be visited.
"""
self.next = n
self.label_next = l
self.goto = g
self.forced_next = f
def make_width(self):
if self.label2 is None:
t = len(self.label1)
else:
t = max(len(self.label1), len(self.label2))
def assign_numberlabel(self, numberlabel= None):
"""
We go through all the states in the drawing. And we label them.
"""
if not self.numberlabel is None:
return
# first we assign our own numberlabel
if numberlabel is None:
self.numberlabel = ('L', 0)
else:
#print "line 224",self.numberlabel
self.numberlabel = ('L', numberlabel + 1)
# then we propagate the numberlabels
propagated_numberlabel = self.numberlabel[1]
if not self.forced_next is None:
propagated_numberlabel = self.forced_next.assign_numberlabel( propagated_numberlabel)
if not self.next is None:
propagated_numberlabel = self.next.assign_numberlabel( propagated_numberlabel)
for i in self.goto:
if i[0].what_numberlabel() is None:
propagated_numberlabel = i[0].assign_numberlabel(propagated_numberlabel)
def write_arrows(self, file):
'''
Cases:
arrow next:
arrow "health" rjust from Gairst.s to Econd.n
arrow from Econd.s to Erd.n
arrow self:
PAPER : spline from Erd.e then up 0.2 right 0.3 then down 0.4 then up 0.2 left 0.3 ->
box invis "apteros" at PAPER + ( 0.6, 0.0)
arrow goto:
D: arc -> from Erd.e to Gairst.e
sprintf("zoom") ljust at D.e + (0.2, 0.0)
def write_arrow_next(self, f):
if not self.forced_next is None:
self.arrow_forced_west((self.next, self.label_next),f )
return
if not self.next is None:
if not self.label_next is None:
f.write('arrow "'+self.label_next+'" rjust from '+self.convert_numberlabel()+'.s to '+ self.next.convert_numberlabel()+'.n\n')
else:
f.write('arrow from '+self.convert_numberlabel()+'.s to '+ self.next.convert_numberlabel()+'.n\n')
def write_arrow_goto(self,f):
'''
arrow goto down to up:
D: arc -> from Erd.e to Gairst.e
sprintf("zoom") ljust at D.e + (0.2, 0.0)
arrow goto up to down :
D: arc -> from Erd.w to Gairst.w
sprintf("zoom") rjust at D.e + (-0.2, 0.0)
'''
for i in self.goto:
if i[0] != self:
self.make_arrow(i,f)
else:
self.write_arrow_self(i,f)
def make_arrow(self,arrow,f):
if self.is_lower(arrow[0]):
self.arrow_down_up(arrow,f)
else:
self.arrow_up_down(arrow,f)
def generate_arc(self, arrow, f, location):
if location =="DOWN-UP":
f.write('arc -> from '+self.convert_numberlabel()+'.w to '+ arrow[0].convert_numberlabel()+'.w\n')
elif location =="UP-DOWN":
f.write('arc -> from '+self.convert_numberlabel()+'.e to '+ arrow[0].convert_numberlabel()+'.e\n')
elif location=="FORCED-WEST":
f.write('arc -> from '+self.convert_numberlabel()+'.w to '+ arrow[0].convert_numberlabel()+'.w\n')
def generate_goto_arrow_label(self, arrow,f,intlabel,location):
if arrow[1] is None:
return
if location =="DOWN-UP":
#print "line 163", `arrow[1]`, intlabel
f.write('sprintf("'+arrow[1]+'") ljust at '+intlabel[:-2]+'.w +(0.2, 0.0)\n')
elif location =="UP-DOWN":
f.write('sprintf("'+arrow[1]+'") rjust at '+intlabel[:-2]+'.e +(-0.2, 0.0)\n')
elif location=="FORCED-WEST":
f.write('sprintf("'+arrow[1]+'") ljust at '+intlabel[:-2]+'.w +(0.2, 0.0)\n')
def write_arrow_self(self, arrow, f):
'''
PAPER : spline from Erd.e then up 0.2 right 0.3 then down 0.4 then up 0.2 left 0.3 ->
box invis "apteros" at PAPER + ( 0.6, 0.0)
'''
intlabel = self.generate_goto_arrow_internal_label(f)
if arrow[1] is None:
label= ""
else:
label = arrow[1]
f.write(' spline from '+ self.convert_numberlabel()+'.e then up 0.2 right 0.3 then down 0.4 then up 0.2 left 0.3 -> \n \
box invis "'+label +'" at '+ intlabel[:-2] + " +( 0.6, 0.0)\n")
st1 = graphstate("consideraciones metafisicas up")
st2 = graphstate("kuntakinte en norte america")
st3 = graphstate("burros y otros", "el burro espa'nol")