Hi!
I've extended the PyDia Code Generator from UML Diagrams to write Object
Pascal source code (i.e. for FreePascal and Delphi). I'll attach a patch
to codegen.py to this EMail. I'd be happy if you add this as a feature
to Dia.
Bye
Hansi
--
Johann Glaser <[email protected]>
Vienna University of Technology
Electrical Engineering
____ http://www.johann-glaser.at/ ____
--- codegen.py.ori 2008-11-15 22:30:54.000000000 +0100
+++ codegen.py 2009-02-20 23:03:07.000000000 +0100
@@ -67,7 +67,8 @@
params = []
for par in op[8] :
# par : again fixed placement, see objects/UML/umlparameter.c:umlparameter_props
- params.append((par[0], par[1]))
+ # name, type, value, comment, kind
+ params.append((par[0], par[1], par[2], par[3], par[4]))
k.AddOperation (op[0], op[1], op[4], params, op[5], op[2], op[7])
#print o.properties["attributes"].value
for attr in o.properties["attributes"].value :
@@ -188,6 +189,98 @@
f.close()
ObjRenderer.end_render(self)
+class PascalRenderer(ObjRenderer) :
+ def __init__(self) :
+ ObjRenderer.__init__(self)
+ def end_render(self) :
+ f = open(self.filename, "w")
+ f.write("/* generated by dia/codegen.py */\n")
+ f.write("Type\n")
+ # declaration
+ for sk in self.klasses.keys() :
+ k = self.klasses[sk]
+ if k.inheritance_type == "abstract" :
+ f.write (" %s = interface" % (sk))
+ else :
+ f.write (" %s = class %s" % (sk, k.inheritance_type))
+ p = []
+ if k.parents :
+ p.append(k.parents[0])
+ if k.templates :
+ p.append(",".join(k.templates))
+ if len(p) > 0 :
+ f.write("(%s)" % ",".join(p))
+ f.write ("\n")
+ # first sort by visibility
+ ops = [[], [], [], [], [], []]
+ for so, (t, v, p, i, c, s) in k.operations :
+ ops[v].append((t,so,p,c,i))
+ vars = [[], [], [], []]
+ for sa, (t, vi, va) in k.attributes.iteritems() :
+ vars[vi].append((t, sa))
+ visibilities = ("public", "private", "protected", "/* implementation */")
+ for v in [1,2,0,3] :
+ if len(ops[v]) == 0 and len(vars[v]) == 0 :
+ continue
+ f.write (" %s\n" % visibilities[v])
+ for op in ops[v] :
+ # detect ctor/dtor
+ if len(op[3]) > 0 :
+ f.write (" /// %s\n" % op[3])
+ if len(op[0]) == 0 :
+ f.write (" Procedure %s" % op[1])
+ else :
+ f.write (" Function %s" % op[1])
+ if len(op[2]) > 0 :
+ f.write ("(")
+ i = 0
+ m = len(op[2]) - 1
+ for p in op[2] :
+ if p[4] == 2 :
+ f.write ("Out ")
+ elif p[4] == 3 :
+ f.write ("Var ")
+ f.write ("%s:%s" % (p[0], p[1]))
+ if len(p[2]) > 0 :
+ f.write (":=%s" % p[2])
+ if i != m :
+ f.write(";")
+ i = i + 1
+ f.write (")")
+ if len(op[0]) == 0 :
+ f.write(";")
+ else :
+ f.write (" : %s;" % op[0])
+ # inheritance type
+ if op[4] == 0 :
+ f.write (" virtual; abstract;");
+ elif op[4] == 1 :
+ f.write (" virtual;");
+ f.write ("\n")
+ for var in vars[v] :
+ if var[1].endswith("]") :
+ i = var[1].find("[")
+ varname = var[1]
+ arraysize = varname[i+1:-1]
+ varname = varname[:i]
+ if len(arraysize) > 0 :
+ if arraysize.find("..") > 0 :
+ f.write(" %s : Array[%s] of %s;\n" % (varname, arraysize, var[0]))
+ elif arraysize.isdigit() :
+ arraysize = int(arraysize)-1
+ f.write(" %s : Array[0..%d] of %s;\n" % (varname, arraysize, var[0]))
+ else :
+ f.write(" %s : Array[0..%s-1] of %s;\n" % (varname, arraysize, var[0]))
+ else :
+ f.write(" %s : Array of %s;\n" % (varname, var[0]))
+ else :
+ f.write(" %s : %s;\n" % (var[1], var[0]))
+ f.write (" End;\n\n")
+ # implementation
+ # ...
+ f.close()
+ ObjRenderer.end_render(self)
+
class JavaRenderer(ObjRenderer) :
def __init__(self) :
ObjRenderer.__init__(self)
@@ -263,4 +356,5 @@
# dia-python keeps a reference to the renderer class and uses it on demand
dia.register_export ("PyDia Code Generation (Python)", "py", PyRenderer())
dia.register_export ("PyDia Code Generation (C++)", "cxx", CxxRenderer())
+dia.register_export ("PyDia Code Generation (Pascal)", "pas", PascalRenderer())
dia.register_export ("PyDia Code Generation (Java)", "java", JavaRenderer())
_______________________________________________
dia-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/dia-list
FAQ at http://live.gnome.org/Dia/Faq
Main page at http://live.gnome.org/Dia