Mercurial > hg > ltpda
diff m-toolbox/classes/+utils/@helper/make_class_diagram.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/+utils/@helper/make_class_diagram.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,88 @@ +% A script to plot nicely the class structure of the LTPDA Toolbox, +% showing all the dependencies +% Setting the flag 'show_methods' to true or false, it is possible to +% display also the public methods of the user classes +% +% M Hewitson 08/04/2011 +% +% VERSION: $Id: make_class_diagram.m,v 1.1 2011/07/05 06:51:37 mauro Exp $ + +% display methods or not +show_methods = false; + +% get global variables +prefs = getappdata(0, 'LTPDApreferences'); +DOT = char(prefs.getExternalPrefs.getDotBinaryPath); +FEXT = char(prefs.getExternalPrefs.getDotOutputFormat); + +classes = utils.helper.ltpda_classes; + +out = sprintf('digraph G \n'); +out = [out sprintf('{\n')]; +out = [out sprintf('rankdir = BT\n')]; + +out = [out sprintf('handle [fontsize=8 label="handle" shape="ellipse" ];\n')]; + +% first class nodes +for kk = 1:numel(classes) + class = classes{kk}; + m = eval(['?' class]); + + if ~isempty(m) + if show_methods + label = sprintf('<<table border="1" cellborder="1" cellpadding="3" cellspacing="0" bgcolor="white"><tr><td bgcolor="black" align="center"><font color="white">%s</font></td></tr>\n', m.Name); + + mthds = m.Methods; + for jj = 1:numel(mthds) + mthd = mthds{jj}; + if strcmp(mthd.DefiningClass.Name, m.Name) && strcmp(mthd.Access, 'public') + label = [label sprintf('<tr><td align="left" port="r%d">%s</td></tr>\n', jj, mthd.Name)]; + end + end + label = [label sprintf('</table>>')]; + out = [out sprintf('%s [ shape = "plaintext" fontsize=12 label=%s ];\n', m.Name, label)]; + else + out = [out sprintf('%s [fontsize=12 shape=rectangle label="%s"];\n', m.Name, m.Name)]; + end + end + +end + +% now links +for kk = 1:numel(classes) + class = classes{kk}; + m = eval(['?' class]); + % parents + parents = m.SuperClasses; + + % m -> parent + for jj = 1:numel(parents) + p = parents{jj}; + + out = [out sprintf('%s -> %s\n', m.Name, p.Name)]; + + end + +end + +out = [out sprintf('}\n')]; + +dotfile = 'ltpda_classdiagram.dot'; +fd = fopen(dotfile, 'w+'); +fprintf(fd, out); +fclose(fd); + +[path, name, ext] = fileparts(dotfile); +outfile = fullfile(path, [name '.' FEXT]); + +% Write to graphics file +cmd = sprintf('%s -T%s -o %s %s', DOT, FEXT, outfile, dotfile); +system(cmd); + +% View graphics file +if any(strcmpi(FEXT, {'gif', 'ico', 'jpg', 'jpeg', 'jpe', 'png', 'tiff'})) + image(imread(outfile)); +else + open(outfile); +end +