%%% These paramaters determine the size of nodes and the grid distance.
newinternal applwidth; applwidth := 30bp;
newinternal applheight; applheight := 14bp;
newinternal extwidth; extwidth := 30bp;
newinternal extheight; extheight := 14bp;
newinternal rowscale; rowscale := 100bp;
newinternal colscale; colscale := 100bp;
%%% This macro builds and draws a rectangular node at a given location
%%% with text indicating an application.
%% @param i Node suffix.
%% @param row Row.
%% @param col Column.
%% @param text The text to render in the box node.
def appl(suffix i)(expr coor)(text t) =
boxit.i(t);
i.c = coor;
i.e = i.c + .5applwidth*right;
i.n = i.c + .5applheight*up;
_drawNode(i);
enddef;
%%% This macro builds and draws an oval node at a given location with
%%% text indicating a file name extension.
%% @param i Node suffix.
%% @param row Row.
%% @param col Column.
%% @param text The text to render in the oval node.
def ext(suffix i)(expr coor)(text t) =
circleit.i(t);
i.c = coor;
i.e = i.c + .5extwidth*right;
i.n = i.c + .5extheight*up;
_drawNode(i);
enddef;
%%% This macro builds and draws a rectangular node at a given location
%%% with text indicating an application.
%% @param i Node suffix.
%% @param row Row.
%% @param col Column.
%% @param text The text to render in the box node.
def appl_rc(suffix i)(expr coor)(text t) =
boxit.i(t);
i.c = (colscale * ypart coor, -rowscale * xpart coor);
i.e = i.c + .5applwidth*right;
i.n = i.c + .5applheight*up;
_drawNode(i);
enddef;
%%% This macro builds and draws an oval node at a given location with
%%% text indicating a file name extension.
%% @param i Node suffix.
%% @param row Row.
%% @param col Column.
%% @param text The text to render in the oval node.
def ext_rc(suffix i)(expr coor)(text t) =
circleit.i(t);
i.c = (colscale * ypart coor, -rowscale * xpart coor);
i.e = i.c + .5extwidth*right;
i.n = i.c + .5extheight*up;
_drawNode(i);
enddef;
%%% This macro draws a straight arrow between two nodes. Arrow length
%%% is corrected for the pen width, so that the arrow doesn't sink into
%%% the frame of the target node. If pen width is changed, the code
%%% "0.5bp" has to be replaced by half of the new pen width.
%% @param a Source node.
%% @param b Target node.
def line(suffix a,b) =
begingroup
save p;path p;
p := a.c--b.c cutbefore bpath(a) cutafter bpath(b);
drawarrow subpath (0, arctime (arclength p - 0.5bp) of p) of p;
endgroup
enddef;
%%% This macro draws a curved arrow between two nodes with determined
%%% leaving and entering angles. Arrow length is corrected for the pen
%%% width so that the arrow doesn't sink into the frame of the target
%%% node. If pen width is changed, the code "0.5bp" has to be replaced
%%% by half of the new pen width.
%% @param a Source node.
%% @param b Target node.
%% @param anga Leaving angle at (center of) node a.
%% @param angb Entering angle at (center of) node b.
def curve(suffix a,b)(expr anga,angb) =
begingroup
save p;path p;
p := a.c{dir anga}..{dir angb}b.c cutbefore bpath(a) cutafter bpath(b);
drawarrow subpath (0, arctime (arclength p - 0.5bp) of p) of p;
endgroup
enddef;
%%% This macro draws a curved arrow between two nodes with determined
%%% leaving and entering angles offset. Arrow length is corrected for
%%% the pen width so that the arrow doesn't sink into the frame of the
%%% target node. If pen width is changed, the code "0.5bp" has to be
%%% replaced by half of the new pen width.
%% @param a Source node.
%% @param b Target node.
%% @param angr Offset to entering and leaving angles at nodes a and b.
def curve_rel(suffix a,b)(expr angr) =
begingroup
save alpha;
alpha = angle(b.c-a.c);
curve(a, b, alpha+angr, alpha-angr);
endgroup
enddef;