gzz-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gzz-commits] gzz metacode/uml.py metacode/umlhelper.mp doc/u...


From: Tuomas J. Lukka
Subject: [Gzz-commits] gzz metacode/uml.py metacode/umlhelper.mp doc/u...
Date: Thu, 29 Aug 2002 05:19:00 -0400

CVSROOT:        /cvsroot/gzz
Module name:    gzz
Changes by:     Tuomas J. Lukka <address@hidden>        02/08/29 05:18:59

Modified files:
        metacode       : uml.py umlhelper.mp 
Added files:
        doc/uml/gl     : Helvetica.tfm renderableseq.mp 
                         renderableseq.uml 

Log message:
        Improve sequence diagrams

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/doc/uml/gl/Helvetica.tfm?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/doc/uml/gl/renderableseq.mp?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/doc/uml/gl/renderableseq.uml?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/metacode/uml.py.diff?tr1=1.16&tr2=1.17&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/metacode/umlhelper.mp.diff?tr1=1.10&tr2=1.11&r1=text&r2=text

Patches:
Index: gzz/metacode/uml.py
diff -c gzz/metacode/uml.py:1.16 gzz/metacode/uml.py:1.17
*** gzz/metacode/uml.py:1.16    Wed Aug 28 10:22:38 2002
--- gzz/metacode/uml.py Thu Aug 29 05:18:59 2002
***************
*** 97,170 ****
        return self.repl(s)
  
  class mpsequence:
      class call:
!       def __init__(self, parent, sourcename, toks, l):
            self.var = randomVar()
            self.parent = parent
!           self.sourcename = sourcename
            self.targetname = toks[1]
            if len(toks) > 2:
                self.text = " ".join(toks[2:])
-           self.list = parent.parseContents(self.targetname, l)
-       def setupCode(self):
-           if self.sourcename:
-               srcx = "xpart("+self.sourcename + ".c)"
-           else:
-               srcx = " %%.xd - 100 "
-           dstx = "xpart("+self.targetname + ".c)"
-           srcx, dstx = [self.repl(i) for i in [srcx, dstx]]
-           s = self.repl("""
-               numeric %%.yu, %%.yl, %%.xs, %%.xd;
-               %%.xs = %(srcx)s;
-               %%.xd = %(dstx)s;
-           """) % locals()
-           return s + " ".join([e.setupCode() for e in self.list])
-       def drawCode_meas(self):
-           yprev = self.parent.yvar
-           if yprev:
-               s = self.repl("""
-                   %%.yu = %(yprev)s - 30;
-               """) % locals()
            else:
!               s = ""
!           self.parent.yvar = self.var + ".yu"
!           s += " ".join([e.drawCode_meas() for e in self.list])
!           yprev = self.parent.yvar
!           s += self.repl("""
!               %%.yl = %(yprev)s - 15;
!           """) % locals()
!           self.parent.yvar = self.var + ".yl"
!           return self.repl(s)
        def drawCode_draw(self):
!           wid = 5
!           if hasattr(self,"text"):
!               text = self.repl(
!                   """ 
label.top("""+self.text+""",(0.5[%%.xd,%%.xs],%%.yu));"""
!                   )
!           else:
!               text = ""
!           return self.repl("""
!               know(%%.yu);
!               drawarrow (%%.xs,%%.yu) -- (%%.xd,%%.yu)
!                   withpen sequencecallpen;
!               drawarrow (%%.xd,%%.yl) -- (%%.xs,%%.yl) dashed evenly
!                   withpen sequencecallpen;
!               draw (%%.xd-%(wid)s, %%.yu) --
!                   (%%.xd-%(wid)s, %%.yl) --
!                   (%%.xd+%(wid)s, %%.yl) --
!                   (%%.xd+%(wid)s, %%.yu) --  cycle
!                   withpen sequenceactivepen;
!               %(text)s
!           """)%locals() + " ".join([e.drawCode_draw() for e in self.list])
!       def repl(self, s):
!           s = s.replace("%%", self.var)
!           return s
      def __init__(self, var, s, l):
        toks = s.split(" ");
        s = toks[0]
        self.var = var or s
        self.name = s
        self.list = self.parseContents(None, l)
        
      def parseContents(self, sourceName, list):
        l = []
--- 97,180 ----
        return self.repl(s)
  
  class mpsequence:
+     def getVarForY(self, before, after):
+       """Get a variable name for a Y coordinate.
+       Padding before and after.
+       """
+       v1 = randomVar()
+       v2 = randomVar()
+       yvar = self.yvar
+       self.ycode += """
+           numeric %(v1)s, %(v2)s;
+           %(v2)s = %(yvar)s - %(before)s - %(after)s;
+           %(v1)s = %(yvar)s - %(before)s;
+       """ % locals()
+       self.yvar = v2
+       return v1;
      class call:
!       def __init__(self, parent, sourcex, toks, l):
            self.var = randomVar()
            self.parent = parent
!           self.targetx = "(xpart(%s.c))" % (toks[1])
            self.targetname = toks[1]
+           if toks[1] not in parent.seqobjs:
+               parent.seqobjs.append(toks[1])
+           if sourcex == None:
+               # self.sourcex = "(" + self.targetx + " - 100)"
+               self.sourcex = "-50"
+           else:
+               self.sourcex = sourcex
            if len(toks) > 2:
                self.text = " ".join(toks[2:])
            else:
!               self.text = "\"\""
!           self.list = parent.parseContents(self.targetx, l)
!       def setupCode(self):
!           return " ".join([e.setupCode() for e in self.list])
!       def measure(self):
!           self.yu = self.parent.getVarForY(10,10)
!           for e in self.list:
!               e.measure()
!           self.yl = self.parent.getVarForY(0, 20)
!       def drawCode_measure(self):
!           s = """
!               sequencecallmeasure(%(sourcex)s, %(targetx)s, %(yu)s, %(yl)s, 
%(text)s);
!           """ % self.__dict__;
!           return s + " ".join([e.drawCode_measure() for e in self.list])
        def drawCode_draw(self):
!           s = """
!               sequencecall(%(sourcex)s, %(targetx)s, %(yu)s, %(yl)s, 
%(text)s);
!           """ % self.__dict__;
!           return s + " ".join([e.drawCode_draw() for e in self.list])
! 
!     class create(call):
!       def measure(self):
!           self.yu = self.parent.getVarForY(10,10)
!           for e in self.list:
!               e.measure()
!           self.yl = self.parent.getVarForY(20, 20)
!       def drawCode_measure(self):
!           s = """
!               sequencecreatemeasure(%(sourcex)s, %(targetname)s, %(yu)s, 
%(yl)s, %(text)s);
!           """ % self.__dict__;
!           return s + " ".join([e.drawCode_measure() for e in self.list])
! 
!       def drawCode_draw(self):
!           s = """
!               sequencecreate(%(sourcex)s, %(targetname)s, %(yu)s, %(yl)s, 
%(text)s);
!           """ % self.__dict__;
!           return s + " ".join([e.drawCode_draw() for e in self.list])
! 
!       
! 
      def __init__(self, var, s, l):
+       self.seqobjs = []
        toks = s.split(" ");
        s = toks[0]
        self.var = var or s
        self.name = s
        self.list = self.parseContents(None, l)
+       self.ycode = ""
        
      def parseContents(self, sourceName, list):
        l = []
***************
*** 173,190 ****
            s = toks[0]
            if s == "call":
                l.append(self.call(self,  sourceName, toks, el[1:]))
!           elif s == "return":
                pass
            else:
!               assert 0, "Must have call or return"
        return l
      def setupCode(self):
        return self.repl(
            " ".join([e.setupCode() for e in self.list])
            )
      def drawCode(self):
!       self.yvar = None
!       m = " ".join([e.drawCode_meas() for e in self.list])
        m += " ".join([e.drawCode_draw() for e in self.list])
        return self.repl(m)
      def repl(self, s):
--- 183,210 ----
            s = toks[0]
            if s == "call":
                l.append(self.call(self,  sourceName, toks, el[1:]))
!           elif s == "create":
!               l.append(self.create(self,  sourceName, toks, el[1:]))
!           elif s == "return" or s == "delete":
                pass
            else:
!               assert 0, "Must have call or return, not '"+s+"'"
        return l
      def setupCode(self):
        return self.repl(
            " ".join([e.setupCode() for e in self.list])
            )
      def drawCode(self):
!       self.yvar = randomVar()
!       self.ycode = "numeric %(yvar)s; %(yvar)s = -50;" % self.__dict__;
!       for e in self.list:
!           e.measure()
!       m = self.ycode
!       m += " ".join([e.drawCode_measure() for e in self.list])
!       m += " ".join([
!           "sequencedrawlifeline(%s, %s);" % (so, self.yvar)
!               for so in self.seqobjs
!       ])
        m += " ".join([e.drawCode_draw() for e in self.list])
        return self.repl(m)
      def repl(self, s):
***************
*** 292,304 ****
      def setupCode(self):
        s = """
            picture %%.titl, %%.pict;
            %%.titl = classTitle("%name%");
            %%.pict = %%.titl;
            addto %%.pict doublepath bbox %%.titl;
! 
            picmeasurements(%%);
            """
        return self.repl(s)
  
  
  
--- 312,336 ----
      def setupCode(self):
        s = """
            picture %%.titl, %%.pict;
+           picture %%.ghost.pict;
            %%.titl = classTitle("%name%");
            %%.pict = %%.titl;
            addto %%.pict doublepath bbox %%.titl;
!           %%.ghost.pict = %%.titl;
            picmeasurements(%%);
+           picmeasurements(%%.ghost);
+           xpart(%%.c) = xpart(%%.ghost.c);
+           """
+       return self.repl(s)
+     def drawCode(self):
+       s = """
+           if not known(ypart(%%.c)):
+               ypart(%%.c) = ypart(%%.ghost.c);
+           fi
+           drawmeasuredpic(%%);
            """
        return self.repl(s)
+ 
  
  
  
Index: gzz/metacode/umlhelper.mp
diff -c gzz/metacode/umlhelper.mp:1.10 gzz/metacode/umlhelper.mp:1.11
*** gzz/metacode/umlhelper.mp:1.10      Mon Aug 26 11:43:27 2002
--- gzz/metacode/umlhelper.mp   Thu Aug 29 05:18:59 2002
***************
*** 371,378 ****
--- 371,439 ----
      final.c = cur - had/2 * spacing;
  enddef;
  
+ %%%%%%%%%%%%%%%%%%%%%%%%%
+ %
+ % Graphics for sequence diagrams
+ 
  pen sequencecallpen, sequenceactivepen;
  
  sequencecallpen = pencircle scaled 3pt;
  sequenceactivepen = pencircle scaled 1.5pt;
+ pair sequencebwid;
+ sequencebwid = (5,0);
+ 
+ vardef sequenceactivation(expr u,l) =
+     save rectpath;
+     path rectpath;
+    rectpath = (u+sequencebwid) -- (l+sequencebwid) --
+               (l-sequencebwid) -- (u-sequencebwid) -- cycle;
+    fill rectpath withcolor white;
+    draw rectpath withpen sequenceactivepen;
+ enddef;
+ 
+ vardef sequencedrawlifeline(suffix name)(expr y) =
+     show "drawlifeline", name.c;
+     if not known(ypart(name.c)):
+       name.c = name.ghost.c;
+       show "drawlifeline SET", name.c;
+     fi
+     draw name.s -- (xpart(name.s),y) withpen sequenceactivepen;
+ enddef;
+ 
+ vardef sequencecallmeasure(expr sourcex, destx, starty, endy, labelstring) =
+    know(sourcex);
+    know(destx);
+    know(starty);
+    know(endy);
+ enddef;
+ 
+ vardef sequencecall(expr sourcex, destx, starty, endy, labelstring) =
+    save u, l, rectpath;
+    pair u, l;
+    u = (destx, starty);
+    l = (destx, endy);
+    sequenceactivation(u, l);
+    drawarrow (sourcex, starty) -- u withpen sequencecallpen;
+    drawarrow l -- (sourcex, endy) withpen sequencecallpen dashed evenly;
+    label.top(labelstring, 0.5[(sourcex,starty), u]);
+ enddef;
  
+ vardef sequencecreatemeasure(expr sourcex)(suffix target)(expr starty, endy, 
labelstring) =
+     know(sourcex);
+     know(starty);
+     know(endy);
+     ypart(target.c) = starty;
+ enddef;
+ vardef sequencecreate(expr sourcex)(suffix target)(expr starty, endy, 
labelstring) =
+     save dx;
+     pair dx;
+     if sourcex < xpart(target.c): dx = target.w; else: dx = target.e; fi
+     save u,l;
+     pair u,l;
+     u = target.s;
+     l = (xpart(target.c), endy);
+     sequenceactivation(u, l);
+     drawarrow (sourcex, starty) -- dx withpen sequencecallpen;
+     drawarrow l -- (sourcex, endy) withpen sequencecallpen dashed evenly;
+    label.top(labelstring, 0.5[(sourcex,starty), dx]);
+ enddef;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]