97 |
return self.repl(s) |
return self.repl(s) |
98 |
|
|
99 |
class mpsequence: |
class mpsequence: |
100 |
|
def getVarForY(self, before, after): |
101 |
|
"""Get a variable name for a Y coordinate. |
102 |
|
Padding before and after. |
103 |
|
""" |
104 |
|
v1 = randomVar() |
105 |
|
v2 = randomVar() |
106 |
|
yvar = self.yvar |
107 |
|
self.ycode += """ |
108 |
|
numeric %(v1)s, %(v2)s; |
109 |
|
%(v2)s = %(yvar)s - %(before)s - %(after)s; |
110 |
|
%(v1)s = %(yvar)s - %(before)s; |
111 |
|
""" % locals() |
112 |
|
self.yvar = v2 |
113 |
|
return v1; |
114 |
class call: |
class call: |
115 |
def __init__(self, parent, sourcename, toks, l): |
def __init__(self, parent, sourcex, toks, l): |
116 |
self.var = randomVar() |
self.var = randomVar() |
117 |
self.parent = parent |
self.parent = parent |
118 |
self.sourcename = sourcename |
self.targetx = "(xpart(%s.c))" % (toks[1]) |
119 |
self.targetname = toks[1] |
self.targetname = toks[1] |
120 |
|
if toks[1] not in parent.seqobjs: |
121 |
|
parent.seqobjs.append(toks[1]) |
122 |
|
if sourcex == None: |
123 |
|
# self.sourcex = "(" + self.targetx + " - 100)" |
124 |
|
self.sourcex = "-50" |
125 |
|
else: |
126 |
|
self.sourcex = sourcex |
127 |
if len(toks) > 2: |
if len(toks) > 2: |
128 |
self.text = " ".join(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() |
|
129 |
else: |
else: |
130 |
s = "" |
self.text = "\"\"" |
131 |
self.parent.yvar = self.var + ".yu" |
self.list = parent.parseContents(self.targetx, l) |
132 |
s += " ".join([e.drawCode_meas() for e in self.list]) |
def setupCode(self): |
133 |
yprev = self.parent.yvar |
return " ".join([e.setupCode() for e in self.list]) |
134 |
s += self.repl(""" |
def measure(self): |
135 |
%%.yl = %(yprev)s - 15; |
self.yu = self.parent.getVarForY(10,10) |
136 |
""") % locals() |
for e in self.list: |
137 |
self.parent.yvar = self.var + ".yl" |
e.measure() |
138 |
return self.repl(s) |
self.yl = self.parent.getVarForY(0, 20) |
139 |
|
def drawCode_measure(self): |
140 |
|
s = """ |
141 |
|
sequencecallmeasure(%(sourcex)s, %(targetx)s, %(yu)s, %(yl)s, %(text)s); |
142 |
|
""" % self.__dict__; |
143 |
|
return s + " ".join([e.drawCode_measure() for e in self.list]) |
144 |
def drawCode_draw(self): |
def drawCode_draw(self): |
145 |
wid = 5 |
s = """ |
146 |
if hasattr(self,"text"): |
sequencecall(%(sourcex)s, %(targetx)s, %(yu)s, %(yl)s, %(text)s); |
147 |
text = self.repl( |
""" % self.__dict__; |
148 |
""" label.top("""+self.text+""",(0.5[%%.xd,%%.xs],%%.yu));""" |
return s + " ".join([e.drawCode_draw() for e in self.list]) |
149 |
) |
|
150 |
else: |
class create(call): |
151 |
text = "" |
def measure(self): |
152 |
return self.repl(""" |
self.yu = self.parent.getVarForY(10,10) |
153 |
know(%%.yu); |
for e in self.list: |
154 |
drawarrow (%%.xs,%%.yu) -- (%%.xd,%%.yu) |
e.measure() |
155 |
withpen sequencecallpen; |
self.yl = self.parent.getVarForY(20, 20) |
156 |
drawarrow (%%.xd,%%.yl) -- (%%.xs,%%.yl) dashed evenly |
def drawCode_measure(self): |
157 |
withpen sequencecallpen; |
s = """ |
158 |
draw (%%.xd-%(wid)s, %%.yu) -- |
sequencecreatemeasure(%(sourcex)s, %(targetname)s, %(yu)s, %(yl)s, %(text)s); |
159 |
(%%.xd-%(wid)s, %%.yl) -- |
""" % self.__dict__; |
160 |
(%%.xd+%(wid)s, %%.yl) -- |
return s + " ".join([e.drawCode_measure() for e in self.list]) |
161 |
(%%.xd+%(wid)s, %%.yu) -- cycle |
|
162 |
withpen sequenceactivepen; |
def drawCode_draw(self): |
163 |
%(text)s |
s = """ |
164 |
""")%locals() + " ".join([e.drawCode_draw() for e in self.list]) |
sequencecreate(%(sourcex)s, %(targetname)s, %(yu)s, %(yl)s, %(text)s); |
165 |
def repl(self, s): |
""" % self.__dict__; |
166 |
s = s.replace("%%", self.var) |
return s + " ".join([e.drawCode_draw() for e in self.list]) |
167 |
return s |
|
168 |
|
|
169 |
|
|
170 |
def __init__(self, var, s, l): |
def __init__(self, var, s, l): |
171 |
|
self.seqobjs = [] |
172 |
toks = s.split(" "); |
toks = s.split(" "); |
173 |
s = toks[0] |
s = toks[0] |
174 |
self.var = var or s |
self.var = var or s |
175 |
self.name = s |
self.name = s |
176 |
self.list = self.parseContents(None, l) |
self.list = self.parseContents(None, l) |
177 |
|
self.ycode = "" |
178 |
|
|
179 |
def parseContents(self, sourceName, list): |
def parseContents(self, sourceName, list): |
180 |
l = [] |
l = [] |
183 |
s = toks[0] |
s = toks[0] |
184 |
if s == "call": |
if s == "call": |
185 |
l.append(self.call(self, sourceName, toks, el[1:])) |
l.append(self.call(self, sourceName, toks, el[1:])) |
186 |
elif s == "return": |
elif s == "create": |
187 |
|
l.append(self.create(self, sourceName, toks, el[1:])) |
188 |
|
elif s == "return" or s == "delete": |
189 |
pass |
pass |
190 |
else: |
else: |
191 |
assert 0, "Must have call or return" |
assert 0, "Must have call or return, not '"+s+"'" |
192 |
return l |
return l |
193 |
def setupCode(self): |
def setupCode(self): |
194 |
return self.repl( |
return self.repl( |
195 |
" ".join([e.setupCode() for e in self.list]) |
" ".join([e.setupCode() for e in self.list]) |
196 |
) |
) |
197 |
def drawCode(self): |
def drawCode(self): |
198 |
self.yvar = None |
self.yvar = randomVar() |
199 |
m = " ".join([e.drawCode_meas() for e in self.list]) |
self.ycode = "numeric %(yvar)s; %(yvar)s = -50;" % self.__dict__; |
200 |
|
for e in self.list: |
201 |
|
e.measure() |
202 |
|
m = self.ycode |
203 |
|
m += " ".join([e.drawCode_measure() for e in self.list]) |
204 |
|
m += " ".join([ |
205 |
|
"sequencedrawlifeline(%s, %s);" % (so, self.yvar) |
206 |
|
for so in self.seqobjs |
207 |
|
]) |
208 |
m += " ".join([e.drawCode_draw() for e in self.list]) |
m += " ".join([e.drawCode_draw() for e in self.list]) |
209 |
return self.repl(m) |
return self.repl(m) |
210 |
def repl(self, s): |
def repl(self, s): |
312 |
def setupCode(self): |
def setupCode(self): |
313 |
s = """ |
s = """ |
314 |
picture %%.titl, %%.pict; |
picture %%.titl, %%.pict; |
315 |
|
picture %%.ghost.pict; |
316 |
%%.titl = classTitle("%name%"); |
%%.titl = classTitle("%name%"); |
317 |
%%.pict = %%.titl; |
%%.pict = %%.titl; |
318 |
addto %%.pict doublepath bbox %%.titl; |
addto %%.pict doublepath bbox %%.titl; |
319 |
|
%%.ghost.pict = %%.titl; |
320 |
picmeasurements(%%); |
picmeasurements(%%); |
321 |
|
picmeasurements(%%.ghost); |
322 |
|
xpart(%%.c) = xpart(%%.ghost.c); |
323 |
|
""" |
324 |
|
return self.repl(s) |
325 |
|
def drawCode(self): |
326 |
|
s = """ |
327 |
|
if not known(ypart(%%.c)): |
328 |
|
ypart(%%.c) = ypart(%%.ghost.c); |
329 |
|
fi |
330 |
|
drawmeasuredpic(%%); |
331 |
""" |
""" |
332 |
return self.repl(s) |
return self.repl(s) |
333 |
|
|
334 |
|
|
335 |
|
|
336 |
|
|
337 |
class mpcomponent(simpleEl): |
class mpcomponent(simpleEl): |
338 |
def setupCode(self): |
def setupCode(self): |
339 |
s = """ |
s = """ |