diff options
Diffstat (limited to 'Master/texmf-dist/metapost/blockdraw_mp/blockdraw.mp')
-rw-r--r-- | Master/texmf-dist/metapost/blockdraw_mp/blockdraw.mp | 310 |
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; |