summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/metapost/blockdraw_mp/blockdraw.mp
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/metapost/blockdraw_mp/blockdraw.mp')
-rw-r--r--Master/texmf-dist/metapost/blockdraw_mp/blockdraw.mp310
1 files changed, 310 insertions, 0 deletions
diff --git a/Master/texmf-dist/metapost/blockdraw_mp/blockdraw.mp b/Master/texmf-dist/metapost/blockdraw_mp/blockdraw.mp
new file mode 100644
index 00000000000..1396f574ea4
--- /dev/null
+++ b/Master/texmf-dist/metapost/blockdraw_mp/blockdraw.mp
@@ -0,0 +1,310 @@
+%% blockdraw.mp
+%% Copyright 2006 Henrik Tidefelt
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained´.
+%
+% The Current Maintainer of this work is Henrik Tidefelt,
+% tidefelt@isy.liu.se.
+%
+% This work, referred to as blockdraw.mp, consists of the files
+% shiftoff.mp
+% blockdraw.mp
+% bondgraph.mp
+% blockdraw_mp.pdf
+
+numeric longblockrx;
+numeric longblockry;
+numeric smallblockr;
+longblockrx := 0.7cm;
+longblockry := 0.4cm;
+smallblockr := 0.3cm;
+
+numeric connectionlw;
+numeric blocklw;
+connectionlw := 0.8pt;
+blocklw = connectionlw;
+
+numeric textscale;
+textscale := 1;
+
+boolean implicitdraw;
+implicitdraw := true;
+
+input shiftoff;
+
+def sizedblock(expr txt, z, rx, ry ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := nullpicture;
+ addto tmppic also shiftoff( txt scaled textscale, to_center );
+ addto tmppic doublepath (-rx,-ry)--(-rx,ry)--(rx,ry)--(rx,-ry)--cycle withpen pencircle scaled blocklw;
+ tmppic := tmppic shifted z;
+ if implicitdraw:
+ draw tmppic;
+ fi
+ tmppic
+ endgroup
+enddef;
+def longblock(expr txt, z ) =
+ sizedblock( txt, z, longblockrx, longblockry )
+enddef;
+def squareblock(expr txt, z ) =
+ sizedblock( txt, z, smallblockr, smallblockr )
+enddef;
+def roundblock(expr txt, z ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := nullpicture;
+ addto tmppic also shiftoff( txt scaled textscale, to_center );
+ addto tmppic doublepath (smallblockr,0)...(0,smallblockr)...(-smallblockr,0)...(0,-smallblockr)...cycle withpen pencircle scaled blocklw;
+ tmppic := tmppic shifted z;
+ if implicitdraw:
+ draw tmppic;
+ fi
+ tmppic
+ endgroup
+enddef;
+def splitdot(expr z ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := nullpicture;
+ addto tmppic contour fullcircle scaled 2.5connectionlw shifted z;
+ if implicitdraw:
+ draw tmppic;
+ fi
+ tmppic
+ endgroup
+enddef;
+def termcircle(expr z ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := nullpicture;
+ addto tmppic doublepath fullcircle scaled 7connectionlw shifted z;
+ if implicitdraw:
+ draw tmppic;
+ fi
+ tmppic
+ endgroup
+enddef;
+def pointpicture(expr z ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := nullpicture;
+ addto tmppic contour fullcircle scaled 0 shifted z;
+ tmppic
+ endgroup
+enddef;
+
+def mspoint( expr pth, mediation, slide ) =
+(point (arctime mediation * arclength(pth) + slide of pth) of pth)
+enddef;
+def hhconnect(expr pa, pb, mediation, slide ) =
+ begingroup
+ save mid, respath;
+ numeric mid;
+ path respath;
+ mid := (mediation)[ xpart pa, xpart pb ] + (if (xpart pb) > (xpart pa): 1 else: -1 fi) * slide;
+ respath := pa--( mid, ypart pa )--( mid, ypart pb )--pb;
+ if implicitdraw:
+ drawarrow respath withpen pencircle scaled connectionlw;
+ fi
+ respath
+ endgroup
+enddef;
+def vvconnect(expr pa, pb, mediation, slide ) =
+ begingroup
+ save mid, respath;
+ numeric mid;
+ path respath;
+ mid := (mediation)[ ypart pa, ypart pb ] + (if (ypart pb) > (ypart pa): 1 else: -1 fi) * slide;
+ respath := pa--( xpart pa, mid )--( xpart pb, mid )--pb;
+ if implicitdraw:
+ drawarrow respath withpen pencircle scaled connectionlw;
+ fi
+ respath
+ endgroup
+enddef;
+def hvconnect(expr pa, pb ) =
+ begingroup
+ save respath;
+ path respath;
+ respath := pa--( xpart pb, ypart pa )--pb;
+ if implicitdraw:
+ drawarrow respath withpen pencircle scaled connectionlw;
+ fi
+ respath
+ endgroup
+enddef;
+def vhconnect(expr pa, pb ) =
+ begingroup
+ save respath;
+ path respath;
+ respath := pa--( xpart pa, ypart pb )--pb;
+ if implicitdraw:
+ drawarrow respath withpen pencircle scaled connectionlw;
+ fi
+ respath
+ endgroup
+enddef;
+
+def conlabel(expr shiftdir, txt, z ) =
+ begingroup
+ save tmppic;
+ picture tmppic;
+ tmppic := shiftoffwlm( txt scaled textscale, shiftdir ) shifted z;
+ if implicitdraw:
+ draw tmppic;
+ fi
+ tmppic
+ endgroup
+enddef;
+
+def leftpoint(expr pic, n, i ) =
+ (i/(n+1))[llcorner pic,ulcorner pic]
+enddef;
+def rightpoint(expr pic, n, i ) =
+ (i/(n+1))[lrcorner pic,urcorner pic]
+enddef;
+def bottompoint(expr pic, n, i ) =
+ (i/(n+1))[llcorner pic,lrcorner pic]
+enddef;
+def toppoint(expr pic, n, i ) =
+ (i/(n+1))[ulcorner pic,urcorner pic]
+enddef;
+def llconnect(expr pica, picb, slide ) =
+ begingroup
+ hhconnect( leftpoint( pica, 1, 1 ), leftpoint( picb, 1, 1 ), 0.5, slide )
+ endgroup
+enddef;
+def rrconnect(expr pica, picb, slide ) =
+ begingroup
+ hhconnect( rightpoint( pica, 1, 1 ), rightpoint( picb, 1, 1 ), 0.5, slide )
+ endgroup
+enddef;
+def ttconnect(expr pica, picb, slide ) =
+ begingroup
+ vvconnect( toppoint( pica, 1, 1 ), toppoint( picb, 1, 1 ), 0.5, slide )
+ endgroup
+enddef;
+def bbconnect(expr pica, picb, slide ) =
+ begingroup
+ vvconnect( bottompoint( pica, 1, 1 ), bottompoint( picb, 1, 1 ), 0.5, slide )
+ endgroup
+enddef;
+def lrconnect(expr pica, picb ) =
+ begingroup
+ hhconnect( leftpoint( pica, 1, 1 ), rightpoint( picb, 1, 1 ), 0.5, 0 )
+ endgroup
+enddef;
+def rlconnect(expr pica, picb ) =
+ begingroup
+ hhconnect( rightpoint( pica, 1, 1 ), leftpoint( picb, 1, 1 ), 0.5, 0 )
+ endgroup
+enddef;
+def btconnect(expr pica, picb ) =
+ begingroup
+ vvconnect( bottompoint( pica, 1, 1 ), toppoint( picb, 1, 1 ), 0.5, 0 )
+ endgroup
+enddef;
+def tbconnect(expr pica, picb ) =
+ begingroup
+ vvconnect( toppoint( pica, 1, 1 ), bottompoint( picb, 1, 1 ), 0.5, 0 )
+ endgroup
+enddef;
+def ltconnect(expr pica, picb ) =
+ begingroup
+ hvconnect( leftpoint( pica, 1, 1 ), toppoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def lbconnect(expr pica, picb ) =
+ begingroup
+ hvconnect( leftpoint( pica, 1, 1 ), bottompoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def rtconnect(expr pica, picb ) =
+ begingroup
+ hvconnect( rightpoint( pica, 1, 1 ), toppoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def rbconnect(expr pica, picb ) =
+ begingroup
+ hvconnect( rightpoint( pica, 1, 1 ), bottompoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def tlconnect(expr pica, picb ) =
+ begingroup
+ vhconnect( toppoint( pica, 1, 1 ), leftpoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def trconnect(expr pica, picb ) =
+ begingroup
+ vhconnect( toppoint( pica, 1, 1 ), rightpoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def blconnect(expr pica, picb ) =
+ begingroup
+ vhconnect( bottompoint( pica, 1, 1 ), leftpoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+def brconnect(expr pica, picb ) =
+ begingroup
+ vhconnect( bottompoint( pica, 1, 1 ), rightpoint( picb, 1, 1 ) )
+ endgroup
+enddef;
+
+def connect(expr pica, picb ) =
+ begingroup
+ save rxa, rya, rxb, ryb;
+ numeric rxa;
+ numeric rya;
+ numeric rxb;
+ numeric ryb;
+ save ca, cb;
+ pair ca;
+ pair cb;
+ rxa = 0.5 * ((xpart lrcorner pica) - (xpart llcorner pica));
+ rya = 0.5 * ((ypart ulcorner pica) - (ypart llcorner pica));
+ rxb = 0.5 * ((xpart lrcorner picb) - (xpart llcorner picb));
+ ryb = 0.5 * ((ypart ulcorner picb) - (ypart llcorner picb));
+ ca = center pica;
+ cb = center picb;
+ if (xpart ca) < (xpart cb) - ( rxa + rxb ):
+ if (ypart ca) < (ypart cb) - ( rya + ryb ):
+ rbconnect( pica, picb )
+ elseif (ypart ca) > (ypart cb) + ( rya + ryb ):
+ rtconnect( pica, picb )
+ else:
+ rlconnect( pica, picb )
+ fi
+ elseif (xpart ca) > (xpart cb) + ( rxa + rxb ):
+ if (ypart ca) < (ypart cb) - ( rya + ryb ):
+ lbconnect( pica, picb )
+ elseif (ypart ca) > (ypart cb) + ( rya + ryb ):
+ ltconnect( pica, picb )
+ else:
+ lrconnect( pica, picb )
+ fi
+ else:
+ if (ypart ca) < (ypart cb) - ( rya + ryb ):
+ tbconnect( pica, picb )
+ elseif (ypart ca) > (ypart cb) + ( rya + ryb ):
+ btconnect( pica, picb )
+ else:
+ hvconnect( center pica, center picb )
+ fi
+ fi
+ endgroup
+enddef;