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   <johann.gla...@gmx.at>
   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
dia-list@gnome.org
http://mail.gnome.org/mailman/listinfo/dia-list
FAQ at http://live.gnome.org/Dia/Faq
Main page at http://live.gnome.org/Dia

Reply via email to