diff options
Diffstat (limited to 'include/old.diag.lpg')
-rw-r--r-- | include/old.diag.lpg | 2899 |
1 files changed, 0 insertions, 2899 deletions
diff --git a/include/old.diag.lpg b/include/old.diag.lpg deleted file mode 100644 index 05a067f..0000000 --- a/include/old.diag.lpg +++ /dev/null @@ -1,2899 +0,0 @@ -%%BeginResource: procset LoutDiagPrependGraphic -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% PostScript @SysPrependGraphic file for @Diag Jeffrey H. Kingston % -% Version 2.0 (includes CIRCUM label) September 1996 % -% % -% To assist in avoiding name clashes, the names of all symbols % -% defined here begin with "ldiag". However, this is not feasible % -% with user-defined labels and some labels used by users. % -% % -% <point> is two numbers, a point. % -% <length> is one number, a length % -% <angle> is one number, an angle in degrees % -% <dashlength> is one number, the preferred length of a dash % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -errordict begin - /handleerror - { - { /Times-Roman findfont 8 pt scalefont setfont - 0 setgray 4 pt 4 pt moveto - $error /errorname get - dup ldiagdict exch known - { ldiagdict exch get } - { 100 string cvs } ifelse - show - ( Command: ) show - $error /command get 100 string cvs show - } stopped {} if - showpage stop - } def -end - -% begin diagram: <maxlabels> ldiagbegin - -% must be defined outside ldiagdict since it loads it -/ldiagbegin -{ xsize 0 0 ysize ldiagdict begin - 5 -1 roll /ldiagmaxlabels exch def - (@Diag) ldiagpushtagdict - /OOY ldiagpointdef /OOX ldiagpointdef 0 0 /OOO ldiagpointdef -} def - -% end diagram: - ldiagend - -/ldiagend -{ ldiagpoptagdict end -} def - -% concat strings: <string> <string> ldiagconcat <string> -% must be defined outside ldiagdict since used in ldiagpromotelabels -/ldiagconcat -{ 2 copy length exch length add string - dup 0 4 index putinterval - dup 3 index length 3 index putinterval - 3 1 roll pop pop -} def - -% show string in format start ... end: <string> ldiagsends <string> -/ldiagsends -{ - dup length 20 string cvs (: ) ldiagconcat exch - dup 0 20 getinterval ( ... ) ldiagconcat - 3 -1 roll exch ldiagconcat - exch dup length 20 sub 20 getinterval ldiagconcat -} def - -/ldiagdebugposy 432 def -/ldiagdebugposx 72 def - -% <string> <int> ldiagdebugprint - -% must be defined outside ldiagdict since used in arbitrary places -% print <string> plus count or <int> stack entries, whichever is the smaller -/ldiagdebugprint -{ - exch - gsave - initgraphics - ldiagdebugposy 72 lt - { /ldiagdebugposx ldiagdebugposx 144 add store - /ldiagdebugposy 432 store - } - { - /ldiagdebugposy ldiagdebugposy 12 sub store - } ifelse - ldiagdebugposx ldiagdebugposy moveto - /Times-Roman findfont 10 scalefont setfont - 0 setgray show - count 1 sub 2 copy lt { pop } { exch pop } ifelse 1 sub - 0 exch 1 exch - { - /ldiagdebugposy ldiagdebugposy 12 sub store - ldiagdebugposx 12 add ldiagdebugposy moveto - index 100 string cvs show - } for - grestore -} def - -/ldiagdict 200 dict def -ldiagdict begin - -% error messages -/dictfull (dictfull error: too many labels?) def -/dictstackoverflow (dictstackoverflow error: labels nested too deeply?) def -/execstackoverflow (execstackoverflow error: figure nested too deeply?) def -/limitcheck (limitcheck error: figure nested too deeply or too large?) def -/syntaxerror (syntaxerror error: syntax error in text of figure?) def -/typecheck (typecheck error: syntax error in text of figure?) def -/undefined (undefined error: unknown or misspelt label?) def -/VMError (VMError error: run out of memory?) def - -% push pi onto stack: - ldiagpi <num> -/ldiagpi 3.14159 def - -% push e onto stack: - ldiage <num> -/ldiage 2.71828 def - -% arc directions -/clockwise false def -/anticlockwise true def - -% test equality between two angles: <angle> <angle> ldiagangleeq <bool> -/ldiagangleeq { ldiagfixangle exch ldiagfixangle eq } def - -% test inequality between two angles: <angle> <angle> ldiaganglene <bool> -/ldiaganglene { ldiagangleeq not } def - -% maximum of two numbers: <num> <num> ldiagmax <num> -/ldiagmax { 2 copy gt { pop } { exch pop } ifelse } def - -% minimum of two numbers: <num> <num> ldiagmin <num> -/ldiagmin { 2 copy lt { pop } { exch pop } ifelse } def - -% add two points: <point> <point> ldiagpadd <point> -/ldiagpadd -{ - % (Entering padd) 4 ldiagdebugprint - exch 3 1 roll add 3 1 roll add exch - % (Leaving padd) 2 ldiagdebugprint -} def - -% subtract first point from second: <point> <point> ldiagpsub <point> -/ldiagpsub { 3 2 roll sub 3 1 roll exch sub exch } def - -% max two points: <point> <point> ldiagpmax <point> -/ldiagpmax { exch 3 1 roll ldiagmax 3 1 roll ldiagmax exch } def - -% min two points: <point> <point> ldiagpmin <point> -/ldiagpmin { exch 3 1 roll ldiagmin 3 1 roll ldiagmin exch } def - -% scalar multiplication: <point> <num> ldiagpmul <point> -/ldiagpmul { dup 3 1 roll mul 3 1 roll mul exch } def - -% point at angle and distance: <point> <length> <angle> ldiagatangle <point> -/ldiagatangle { 2 copy cos mul 3 1 roll sin mul ldiagpadd } def - -% angle from one point to another: <point> <point> ldiagangleto <angle> -/ldiagangleto { ldiagpsub 2 copy 0 eq exch 0 eq and {pop} {exch atan} ifelse } def - -% distance between two points: <point> <point> ldiagdistance <length> -/ldiagdistance { ldiagpsub dup mul exch dup mul add sqrt } def - -% stroke a solid line: <length> <dashlength> ldiagsolid - -/ldiagsolid -{ pop pop [] 0 setdash 1 setlinecap stroke -} def - -% stroke a dashed line: <length> <dashlength> ldiagdashed - -/ldiagdashed -{ 2 copy div 2 le 1 index 0 le or - { exch pop 1 pt ldiagmax [ exch dup ] 0 setdash } - { dup [ exch 4 2 roll 2 copy div - 1 sub 2 div ceiling dup 4 1 roll - 1 add mul sub exch div ] 0 setdash - } ifelse 0 setlinecap stroke -} def - -% stroke a cdashed line: <length> <dashlength> ldiagcdashed - -/ldiagcdashed -{ % (Entering ldiagcdashed) 2 ldiagdebugprint - 2 copy le 1 index 0 le or - { exch pop 1 pt ldiagmax [ exch dup ] dup 0 get 2 div setdash } - { dup [ 4 2 roll exch 2 copy exch div - 2 div ceiling div 1 index sub - ] exch 2 div setdash - } ifelse 0 setlinecap stroke - % (Leaving ldiagcdashed) 0 ldiagdebugprint -} def - -% stroke a dotted line: <length> <dashlength> ldiagdotted - -/ldiagdotted -{ 2 copy le 1 index 0 le or - { exch pop 1 pt ldiagmax [ exch 0 exch ] 0 setdash } - { 1 index exch div ceiling div - [ 0 3 2 roll ] 0 setdash - } ifelse 1 setlinecap stroke -} def - -% stroke a noline line: <length> <dashlength> ldiagnoline - -/ldiagnoline -{ pop pop -} def - -/ldiagbox -{ - 0 0 /SW ldiagpointdef - xsize 0 /SE ldiagpointdef - xsize ysize /NE ldiagpointdef - 0 ysize /NW ldiagpointdef - SE 0.5 ldiagpmul /S ldiagpointdef - NW 0.5 ldiagpmul /W ldiagpointdef - W SE ldiagpadd /E ldiagpointdef - S NW ldiagpadd /N ldiagpointdef - NE 0.5 ldiagpmul /CTR ldiagpointdef - - 0 dg /S@ANGLE ldiagangledef - 45 dg /SE@ANGLE ldiagangledef - 90 dg /E@ANGLE ldiagangledef - 135 dg /NE@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 225 dg /NW@ANGLE ldiagangledef - 270 dg /W@ANGLE ldiagangledef - 315 dg /SW@ANGLE ldiagangledef - - [ CTR NE ldiagpsub /ldiagboxcircum cvx ] ldiagcircumdef - SW SE NE NW SW -} def - -% shape and labels of the @CurveBox symbol -% <margin> ldiagcurvebox <shape> -/ldiagcurvebox -{ - - % (Entering ldiagcurvebox) 1 ldiagdebugprint - ldiagdecodelength /cbmgn exch def - - xsize 0.5 mul ysize 0.5 mul /CTR ldiagpointdef - xsize 0.5 mul 0 /S ldiagpointdef - xsize ysize 0.5 mul /E ldiagpointdef - xsize 0.5 mul ysize /N ldiagpointdef - 0 ysize 0.5 mul /W ldiagpointdef - - cbmgn 0.293 mul cbmgn 0.293 mul /SW ldiagpointdef - xsize cbmgn 0.293 mul sub cbmgn 0.293 mul /SE ldiagpointdef - xsize cbmgn 0.293 mul sub ysize cbmgn 0.293 mul sub /NE ldiagpointdef - cbmgn 0.293 mul ysize cbmgn 0.293 mul sub /NW ldiagpointdef - - 0 dg /S@ANGLE ldiagangledef - 45 dg /SE@ANGLE ldiagangledef - 90 dg /E@ANGLE ldiagangledef - 135 dg /NE@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 225 dg /NW@ANGLE ldiagangledef - 270 dg /W@ANGLE ldiagangledef - 315 dg /SW@ANGLE ldiagangledef - - [ xsize ysize 0.5 ldiagpmul cbmgn /ldiagcurveboxcircum cvx ] ldiagcircumdef - - cbmgn 0 - xsize cbmgn sub 0 - [ xsize cbmgn sub cbmgn ] - xsize cbmgn - xsize ysize cbmgn sub - [ xsize cbmgn sub ysize cbmgn sub ] - xsize cbmgn sub ysize - cbmgn ysize - [ cbmgn ysize cbmgn sub ] - 0 ysize cbmgn sub - 0 cbmgn - [ cbmgn cbmgn ] - cbmgn 0 - - % (Leaving ldiagcurvebox) 0 ldiagdebugprint -} def - -% shadow of the @ShadowBox symbol -% its shape and labels are done, somewhat inaccurately, with ldiagbox -% <shadowmargin> ldiagshadow - -/ldiagshadow -{ - /lfshm exch def - - lfshm 0 moveto - 0 lfshm neg rlineto - xsize 0 rlineto - 0 ysize rlineto - lfshm neg 0 rlineto - xsize 0 lineto - closepath fill - -} def - -% shape and labels of the @Square symbol -/ldiagsquare -{ - xsize ysize 0.5 ldiagpmul /CTR ldiagpointdef - CTR xsize xsize ysize ysize ldiagpmax 0.5 ldiagpmul ldiagpadd /NE ldiagpointdef - CTR 0 0 CTR NE ldiagdistance 135 ldiagatangle ldiagpadd /NW ldiagpointdef - CTR 0 0 CTR NE ldiagdistance 225 ldiagatangle ldiagpadd /SW ldiagpointdef - CTR 0 0 CTR NE ldiagdistance 315 ldiagatangle ldiagpadd /SE ldiagpointdef - SW 0.5 ldiagpmul SE 0.5 ldiagpmul ldiagpadd /S ldiagpointdef - NW 0.5 ldiagpmul NE 0.5 ldiagpmul ldiagpadd /N ldiagpointdef - SW 0.5 ldiagpmul NW 0.5 ldiagpmul ldiagpadd /W ldiagpointdef - SE 0.5 ldiagpmul NE 0.5 ldiagpmul ldiagpadd /E ldiagpointdef - - 0 dg /S@ANGLE ldiagangledef - 45 dg /SE@ANGLE ldiagangledef - 90 dg /E@ANGLE ldiagangledef - 135 dg /NE@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 225 dg /NW@ANGLE ldiagangledef - 270 dg /W@ANGLE ldiagangledef - 315 dg /SW@ANGLE ldiagangledef - - [ CTR NE ldiagpsub /ldiagboxcircum cvx ] ldiagcircumdef - SW SE NE NW SW -} def - -% shape and labels of the @Diamond symbol -/ldiagdiamond -{ - xsize 0 0.5 ldiagpmul /S ldiagpointdef - 0 ysize 0.5 ldiagpmul /W ldiagpointdef - S W ldiagpadd /CTR ldiagpointdef - CTR W ldiagpadd /N ldiagpointdef - CTR S ldiagpadd /E ldiagpointdef - E N ldiagpadd 0.5 ldiagpmul /NE ldiagpointdef - N W ldiagpadd 0.5 ldiagpmul /NW ldiagpointdef - S W ldiagpadd 0.5 ldiagpmul /SW ldiagpointdef - S E ldiagpadd 0.5 ldiagpmul /SE ldiagpointdef - - 0 dg /S@ANGLE ldiagangledef - 90 dg /E@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 270 dg /W@ANGLE ldiagangledef - S E ldiagangleto /SE@ANGLE ldiagangledef - E N ldiagangleto /NE@ANGLE ldiagangledef - N W ldiagangleto /NW@ANGLE ldiagangledef - W S ldiagangleto /SW@ANGLE ldiagangledef - - [ xsize ysize 0.5 ldiagpmul /ldiagdiamondcircum cvx ] ldiagcircumdef - S E N W S -} def - -% shape and labels of the @Ellipse symbol -/ldiagellipse -{ - xsize 0 0.5 ldiagpmul /S ldiagpointdef - 0 ysize 0.5 ldiagpmul /W ldiagpointdef - S W ldiagpadd /CTR ldiagpointdef - CTR W ldiagpadd /N ldiagpointdef - CTR S ldiagpadd /E ldiagpointdef - CTR xsize 0 0.3536 ldiagpmul ldiagpadd 0 ysize 0.3536 ldiagpmul ldiagpadd /NE ldiagpointdef - 0 ysize 0.3536 ldiagpmul CTR xsize 0 0.3536 ldiagpmul ldiagpadd ldiagpsub /SE ldiagpointdef - xsize 0 0.3536 ldiagpmul CTR ldiagpsub 0 ysize 0.3536 ldiagpmul ldiagpadd /NW ldiagpointdef - 0 ysize 0.3536 ldiagpmul xsize 0 0.3536 ldiagpmul CTR ldiagpsub ldiagpsub /SW ldiagpointdef - [ xsize ysize 0.5 ldiagpmul /ldiagellipsecircum cvx ] ldiagcircumdef - - 0 dg /S@ANGLE ldiagangledef - 90 dg /E@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 270 dg /W@ANGLE ldiagangledef - - S E ldiagangleto /SE@ANGLE ldiagangledef - E N ldiagangleto /NE@ANGLE ldiagangledef - N W ldiagangleto /NW@ANGLE ldiagangledef - W S ldiagangleto /SW@ANGLE ldiagangledef - - S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S -} def - -% shape and labels of the @Circle symbol -/ldiagcircle -{ - xsize ysize 0.5 ldiagpmul /CTR ldiagpointdef - CTR xsize 0 ysize 0 ldiagpmax 0.5 ldiagpmul ldiagpadd /E ldiagpointdef - CTR 0 0 CTR E ldiagdistance 45 ldiagatangle ldiagpadd /NE ldiagpointdef - CTR 0 0 CTR E ldiagdistance 90 ldiagatangle ldiagpadd /N ldiagpointdef - CTR 0 0 CTR E ldiagdistance 135 ldiagatangle ldiagpadd /NW ldiagpointdef - CTR 0 0 CTR E ldiagdistance 180 ldiagatangle ldiagpadd /W ldiagpointdef - CTR 0 0 CTR E ldiagdistance 225 ldiagatangle ldiagpadd /SW ldiagpointdef - CTR 0 0 CTR E ldiagdistance 270 ldiagatangle ldiagpadd /S ldiagpointdef - CTR 0 0 CTR E ldiagdistance 315 ldiagatangle ldiagpadd /SE ldiagpointdef - [ S E ldiagpsub /ldiagellipsecircum cvx ] ldiagcircumdef - - 0 dg /S@ANGLE ldiagangledef - 45 dg /SE@ANGLE ldiagangledef - 90 dg /E@ANGLE ldiagangledef - 135 dg /NE@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 225 dg /NW@ANGLE ldiagangledef - 270 dg /W@ANGLE ldiagangledef - 315 dg /SW@ANGLE ldiagangledef - - S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S -} def - -% shape and labels of the @VLine and @VArrow symbols -/ldiagvline -{ - xmark ysize ldiagprevious /FROM ldiagpointdef - xmark 0 ldiagprevious /TO ldiagpointdef -} def - -% points of a polygon around base with given no of sides, vert init angle: -% <sides> <angle> ldiagpolygon <point> ... <point> -/ldiagpolygon -{ exch round cvi exch - xsize ysize 0.5 ldiagpmul /CTR ldiagpointdef - 90 sub CTR 2 copy ldiagmax 5 3 roll - [ 4 copy pop /ldiagpolycircum cvx ] ldiagcircumdef - exch dup 360 exch div exch - 1 1 3 2 roll - { 4 string cvs (P) exch ldiagconcat - 3 copy exch pop (@ANGLE) ldiagconcat cvn exch 90 add exch ldiagangledef - cvn 6 copy pop pop ldiagatangle 2 copy 10 2 roll - 3 2 roll ldiagpointdef - dup 3 1 roll add exch - } for - pop ldiagatangle -} def - -% shape and labels of the @Isosceles triangle symbol -/ldiagisosceles -{ - xsize ysize 0.5 ldiagpmul /CTR ldiagpointdef - 0 0 /SW ldiagpointdef - xsize 0 /SE ldiagpointdef - xsize 0.5 mul ysize /N ldiagpointdef - xsize 0.5 mul 0 /S ldiagpointdef - SE 0.5 ldiagpmul N 0.5 ldiagpmul ldiagpadd /NE ldiagpointdef - SW 0.5 ldiagpmul N 0.5 ldiagpmul ldiagpadd /NW ldiagpointdef - - [ xsize ysize /ldiagisoscelescircum cvx ] ldiagcircumdef - - 0 dg /SW@ANGLE ldiagangledef - 0 dg /SE@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 0 dg /S@ANGLE ldiagangledef - SE N ldiagangleto /NE@ANGLE ldiagangledef - N SW ldiagangleto /NW@ANGLE ldiagangledef - - SW SE N SW -} def - -% next array element: <array> <index> ldiaggetnext <array> <index> <any> true -% or <array> <index> false -/ldiaggetnext -{ 2 copy exch length ge - { false } - { 2 copy get exch 1 add exch true } ifelse -} def - -% check whether thing is number: <any> ldiagisnumbertype <any> <bool> -/ldiagisnumbertype -{ dup type dup - /integertype eq exch /realtype eq or -} def - -% check whether thing is an array: <any> ldiagisarraytype <any> <bool> -/ldiagisarraytype { dup type /arraytype eq } def - -% check whether thing is an array: <any> ldiagisnametype <any> <bool> -/ldiagisnametype { dup type /nametype eq } def - -% get next item: <array> <index> ldiaggetnextitem <array> <index> 0 -% or <array> <index> <array> 1 -% or <array> <index> <point> 2 -/ldiaggetnextitem -{ ldiaggetnext - { ldiagisarraytype - { 1 - } - { ldiagisnumbertype - { 3 1 roll - ldiaggetnext - { ldiagisnumbertype - { 4 3 roll exch 2 - } - { pop 3 2 roll pop 0 - } ifelse - } - { 3 2 roll pop 0 - } ifelse - } - { pop 0 - } ifelse - } ifelse - } - { 0 - } ifelse -} def - -% approximate equality: num1 num2 approxeq <boolean> -/approxeq -{ dup 0 eq - { pop 0 eq - } - { dup 3 1 roll sub exch div abs 0.001 lt - } ifelse -} def - -% set arc path: bool x1 y1 x2 y2 x0 y0 ldiagsetarc <angle> <angle> <dist> -% the path goes from x1 y1 to x2 y2 about centre x0 y0, -% anticlockwise if bool is true else clockwise. -% The orientations of backwards pointing and forwards pointing -% arrowheads are returned in the two angles, and -% the length of the arc is returned in <dist>. -/ldiagsetarc -{ - % (Entering ldiagsetarc) 7 ldiagdebugprint - 20 dict begin - matrix currentmatrix 8 1 roll - 2 copy translate 2 copy 8 2 roll - 4 2 roll ldiagpsub 6 2 roll ldiagpsub - dup /y1 exch def dup mul /y1s exch def - dup /x1 exch def dup mul /x1s exch def - dup /y2 exch def dup mul /y2s exch def - dup /x2 exch def dup mul /x2s exch def - /dist1 0 0 x1 y1 ldiagdistance def - /dist2 0 0 x2 y2 ldiagdistance def - - y1s y2s approxeq - { -1 - } - { y1s x2s mul y2s x1s mul sub y1s y2s sub div - } ifelse - /da exch def - - x1s x2s approxeq - { -1 - } - { x1s y2s mul x2s y1s mul sub x1s x2s sub div - } ifelse - /db exch def - - da 0 gt db 0 gt and - { - % ( case 1, ellipse) 0 ldiagdebugprint - /LMax da sqrt db sqrt ldiagmax def - /scalex da sqrt LMax div def - /scaley db sqrt LMax div def - scalex scaley scale - 0 0 LMax - 0 0 x1 scalex mul y1 scaley mul ldiagangleto - 0 0 x2 scalex mul y2 scaley mul ldiagangleto - 2 copy eq { 360 add } if - 2 copy 8 2 roll - 5 index { arc } { arcn } ifelse - 2 index 1 index - { 90 sub } { 90 add } ifelse - dup sin scaley mul exch cos scalex mul atan - 2 index 2 index - { 90 add } { 90 sub } ifelse - dup sin scaley mul exch cos scalex mul atan - 5 2 roll % res1 res2 ang1 ang2 anticlockwise - { exch sub } { sub } ifelse - dup 0 le { 360 add } if ldiagpi mul LMax mul 180 div - } - { - dist1 dist2 approxeq - % x1 y1 dist1 ( x1 y1, d) 3 ldiagdebugprint pop pop pop - % x2 y2 dist2 ( x2 y2, d) 3 ldiagdebugprint pop pop pop - { - % ( case 2, circle) 0 ldiagdebugprint - 0 0 - dist1 - 0 0 x1 y1 ldiagangleto - 0 0 x2 y2 ldiagangleto - 2 copy eq { 360 add } if - 2 copy 8 2 roll - 5 index { arc } { arcn } ifelse - 2 index 1 index - { 90 sub } { 90 add } ifelse - 2 index 2 index - { 90 add } { 90 sub } ifelse - 5 2 roll % res1 res2 ang1 ang2 clockwise - { exch sub } { sub } ifelse - dup 0 le { 360 add } if - ldiagpi mul dist1 mul 180 div - } - { - % ( case 3, line) 0 ldiagdebugprint - x2 y2 lineto pop - x2 y2 x1 y1 ldiagangleto - x1 y1 x2 y2 ldiagangleto - x1 y1 x2 y2 ldiagdistance - } ifelse - } ifelse - 4 -1 roll setmatrix - end - % (Leaving ldiagsetarc) 3 ldiagdebugprint -} def - -% ldiagsetcurve: set up a Bezier curve from x0 y0 to x3 y3 -% and return arrowhead angles and length of curve (actually 0) -% x0 y0 x1 y1 x2 y2 x3 y3 ldiagsetcurve <angle> <angle> <length> -/ldiagsetcurve -{ 8 copy curveto pop pop - ldiagangleto - 5 1 roll - 4 2 roll ldiagangleto - exch - 0 -} def - -% ldiagsetpath: convert a Diag path into a PostScript path -% [ shape ] ldiagsetpath -/ldiagsetpath -{ - 10 dict begin - 0 newpath - /prevseen false def - /curveseen false def - { ldiaggetnextitem - dup 0 eq { pop exit } - { 1 eq - { /curveseen true def - /curve exch def - curve length 0 eq { /curveseen false def } if - } - { /ycurr exch def - /xcurr exch def - prevseen - { curveseen - { curve length 4 eq - { xprev yprev - curve 0 get curve 1 get - curve 2 get curve 3 get - xcurr ycurr - ldiagsetcurve pop pop pop - } - { xprev yprev xcurr ycurr - curve length 1 ge { curve 0 get } { 0 } ifelse - curve length 2 ge { curve 1 get } { 0 } ifelse - curve length 3 ge { curve 2 get } { true } ifelse - 7 1 roll - ldiagsetarc pop pop pop - } ifelse - } - { xcurr ycurr lineto - } ifelse - } - { xcurr ycurr moveto - } ifelse - /xprev xcurr def - /yprev ycurr def - /prevseen true def - /curveseen false def - } ifelse - } ifelse - } loop pop pop - end -} def - -% ldiagpaintpath: paint a path of the given shape -% /paint [ shape ] ldiagpaintpath - -/ldiagpaintpath -{ - ldiagsetpath cvx exec -} def - -% stroke a path of the given shape in the given linestyle and dash length. -% Return the origin and angle of the backward and forward arrow heads. -% dashlength /linestyle [shape] ldiagdopath [<point> <angle>] [<point> <angle>] -/ldiagdopath -{ - 10 dict begin - 0 - /prevseen false def - /curveseen false def - /backarrow [] def - /fwdarrow [] def - { - ldiaggetnextitem - dup 0 eq { pop exit } - { - 1 eq - { /curveseen true def - /curve exch def - curve length 0 eq { /prevseen false def } if - } - { /ycurr exch def - /xcurr exch def - prevseen - { newpath xprev yprev moveto - curveseen - { curve length 4 eq - { xprev yprev - curve 0 get curve 1 get - curve 2 get curve 3 get - xcurr ycurr ldiagsetcurve - } - { xprev yprev xcurr ycurr - curve length 1 ge { curve 0 get } { 0 } ifelse - curve length 2 ge { curve 1 get } { 0 } ifelse - curve length 3 ge { curve 2 get } { true } ifelse - 7 1 roll - ldiagsetarc - } ifelse - } - { xcurr ycurr lineto - xcurr ycurr xprev yprev ldiagangleto dup 180 sub - xprev yprev xcurr ycurr ldiagdistance - } ifelse - 6 index 6 index cvx exec - [ xprev yprev 5 -1 roll ] - backarrow length 0 eq - { /backarrow exch def } - { pop } ifelse - [ xcurr ycurr 4 -1 roll ] /fwdarrow exch def - } if - /xprev xcurr def - /yprev ycurr def - /prevseen true def - /curveseen false def - } ifelse - } ifelse - } loop - pop pop pop pop - backarrow length 0 eq { [ 0 0 0 ] } { backarrow } ifelse - fwdarrow length 0 eq { [ 0 0 0 ] } { fwdarrow } ifelse - end -} def - - -% stroke a path of the given shape in the given linestyle and dash length. -% dashlength [ /linestyle ] [shape] ldiagdosegpath - -/ldiagdosegpath -{ - 12 dict begin - 1 index /seg exch def - 1 index length /seglength exch def - 0 /segcount exch def - 0 - /prevseen false def - /curveseen false def - /backarrow [] def - /fwdarrow [] def - { - ldiaggetnextitem - dup 0 eq { pop exit } - { - 1 eq - { /curveseen true def - /curve exch def - curve length 0 eq { /prevseen false def } if - } - { /ycurr exch def - /xcurr exch def - prevseen - { newpath xprev yprev moveto - curveseen - { curve length 4 eq - { xprev yprev - curve 0 get curve 1 get - curve 2 get curve 3 get - xcurr ycurr ldiagsetcurve - } - { xprev yprev xcurr ycurr - curve length 1 ge { curve 0 get } { 0 } ifelse - curve length 2 ge { curve 1 get } { 0 } ifelse - curve length 3 ge { curve 2 get } { true } ifelse - 7 1 roll - ldiagsetarc - } ifelse - } - { xcurr ycurr lineto - xcurr ycurr xprev yprev ldiagangleto dup 180 sub - xprev yprev xcurr ycurr ldiagdistance - } ifelse - 6 index seg segcount seglength mod get cvx exec - /segcount segcount 1 add def - [ xprev yprev 5 -1 roll ] - backarrow length 0 eq - { /backarrow exch def } - { pop } ifelse - [ xcurr ycurr 4 -1 roll ] /fwdarrow exch def - } if - /xprev xcurr def - /yprev ycurr def - /prevseen true def - /curveseen false def - } ifelse - } ifelse - } loop - pop pop pop pop - end -} def - -% ldiagnodebegin: start of node parameters -% ldiagnodebegin - -/ldiagnodebegin -{ % (Entering ldiagnodebegin) 0 ldiagdebugprint - ldiagmaxlabels dict begin -} def - -% ldiagnodeend: end of node parameters (so do the node) -% <outline> <dashlength> <style> <linewidth> <paint> ldiagnodeend - -/ldiagnodeend -{ - % (Entering ldiagnodeend) 0 ldiagdebugprint - end % matches begin in ldiagnodebegin - 4 index gsave ldiagpaintpath grestore - 3 index ldiagsetpath clip newpath - 2 mul setlinewidth - 3 -1 roll ldiagdosegpath - % (Leaving ldiagnodeend) 0 ldiagdebugprint -} def - -% ldiaglinkbegin: start of link parameters -% <direct> ldiaglinkbegin - -/ldiaglinkbegin -{ ldiagmaxlabels dict begin - 1 eq /direct exch def -} def - -% ldiaglinkend: end of link parameters (so do the link) -% <outline> <dashlength> <style> <linewidth> ldiaglinkend - -/ldiaglinkend -{ - end % matches begin in ldiaglinkbegin - setlinewidth - 3 -1 roll ldiagdosegpath -} def - -% ldiagdoarrow: draw an arrow head of given form -% dashlength /lstyle /pstyle hfrac height width [ <point> <angle> ] ldiagdoarrow - -/ldiagdoarrow -{ matrix currentmatrix 8 1 roll - dup 0 get 1 index 1 get translate - 2 get rotate - [ 2 index neg 2 index 0 0 - 3 index 3 index neg - 1 index 10 index mul 0 - 7 index 7 index ] - 4 1 roll pop pop pop - dup 3 1 roll - gsave ldiagpaintpath grestore ldiagdopath pop pop - setmatrix -} def - -% arrow head styles -/ldiagopen 0.0 def -/ldiaghalfopen 0.5 def -/ldiagclosed 1.0 def - -% stroke no arrows, forward, back, and both -/ldiagnoarrow { pop pop pop pop pop pop pop pop } def -/ldiagforward { 7 -1 roll ldiagdoarrow pop } def -/ldiagback { 8 -2 roll pop ldiagdoarrow } def -/ldiagboth { 8 -1 roll 7 copy ldiagdoarrow pop 7 -1 roll ldiagdoarrow } def - -% ldiagprevious: return previous point on path -/ldiagprevious -{ ldiagisnumbertype - { 2 copy } - { ldiagisarraytype - { 2 index 2 index } - { 0 0 } - ifelse - } ifelse -} def - -% Tag dictionary operators -% -% Diag's tag dictionaries are kept on the same stack as other dictionaries, -% since there is nowhere else to put them. However, they are managed like -% a separate stack using the following operators: -% -% <tag> ldiagpushtagdict - Push a new, empty tag dictionary -% ldiagtoptagdict dict Find the top tag dictionary -% ldiagpoptagdict - Pop and destroy the top tag dictionary -% ldiagpopuptagdict - Pop top tag dict and promote its entries -% ldiagdebugtagdict - Debug print of dictionary stack -% -% They are distinguished from other dictionaries by containing /ldiagtagdict, -% whose value is the <tag> which is used by ldiagpopuptagdict, -% and they are hopefully never the target of any non-tag definition because -% they are never the top dictionary, since push places the new dict second. - -/ldiagpushtagdict -{ ldiagmaxlabels dict dup - currentdict end exch begin begin - exch /ldiagtagdict exch put -} def - -/ldiagtoptagdict -{ /ldiagtagdict where not - { (Diag internal error: no tag dictionary) show stop - } if -} def - -/ldiagpoptagdict -{ - % (Entering poptagdict) 0 ldiagdebugprint - % ldiagdebugtagdict - mark - { currentdict end - dup /ldiagtagdict known - { exit - } if - } loop - pop - counttomark - { begin - } repeat - pop - % (Leaving poptagdict) 0 ldiagdebugprint - % ldiagdebugtagdict -} def - -% promote labels from top tag dictionary to second top tag dictionary -% each prefixed by <string>@ if <string> (value of /ldiagtagdict) is not empty -% - ldiagpopuptagdict - -/ldiagpopuptagdict -{ - ldiagtagdict - % (Entering ldiagpopuptagdict) 1 ldiagdebugprint - % ldiagdebugtagdict - ldiagtoptagdict ldiagpoptagdict ldiagtoptagdict exch - { exch 100 string cvs 3 index - dup length 0 ne - { (@) ldiagconcat - } if - exch ldiagconcat cvn exch 2 index 3 1 roll put - } forall - pop pop - % (Leaving ldiagpopuptagdict) 0 ldiagdebugprint - % ldiagdebugtagdict -} def - -% debug tag dictionary stack -/ldiagdebugtagdict -{ (Entering ldiagdebugtagdict) 0 ldiagdebugprint - 30 array dictstack - { dup /ldiagtagdict known - { dup /ldiagtagdict get 0 ldiagdebugprint - { pop 100 string cvs ( ) exch ldiagconcat - dup 0 ldiagdebugprint - pop - } - forall - } - { pop (other) 0 ldiagdebugprint - } ifelse - } forall - (Leaving ldiagdebugtagdict) 0 ldiagdebugprint -} def - -% label a point in top tag dictionary: <point> /name ldiagpointdef - -/ldiagpointdef -{ - % (Entering ldiagpointdef) 3 ldiagdebugprint - [ 4 2 roll transform /itransform cvx ] cvx - ldiagtoptagdict 3 1 roll put - % (Leaving ldiagpointdef) 0 ldiagdebugprint -} def - -% label an angle in top tag dictionary: <angle> /name ldiagangledef - -/ldiagangledef -{ - % (Entering ldiagangledef) 2 ldiagdebugprint - exch ldiagfixangle ldiagtoptagdict 3 1 roll put - % (Leaving ldiagangledef) 0 ldiagdebugprint -} def - -% add CIRCUM operator with this body: <array> ldiagcircumdef - -/ldiagcircumdef -{ % (Entering ldiagcircumdef) 1 ldiagdebugprint - /CIRCUM exch cvx - ldiagtoptagdict 3 1 roll put - % currentdict end - % 3 1 roll - % def - % begin - % (Leaving ldiagcircumdef) 0 ldiagdebugprint -} def - -% show points (except CIRCUM and ANGLE): - ldiagshowpoints - -/ldiagshowpoints -{ - % (Entering ldiagshowpoints) 0 ldiagdebugprint - ldiagtoptagdict - { 1 index 100 string cvs - (ldiagdebugpos) search - { pop pop pop pop pop } - { - (CIRCUM) search % if CIRCUM in key - { pop pop pop pop pop } - { - (ANGLE) search % if ANGLE in key - { - pop pop pop pop pop - } - { - (ldiagtagdict) search - { - pop pop pop pop pop - } - { - pop cvx exec - newpath 2.0 pt 0 360 arc 0 setgray fill pop - } ifelse - } ifelse - } ifelse - } ifelse - } forall - % (Leaving ldiagshowpoints) 0 ldiagdebugprint -} def - - -/ldiagshowtags -{ - % (Entering ldiagshowtags) 0 ldiagdebugprint - ldiagtoptagdict - { 1 index 100 string cvs - % dup 0 ldiagdebugprint - (ldiagdebugpos) search - { pop pop pop pop pop } - { - (CIRCUM) search % if CIRCUM in key - { pop pop pop pop pop } - { - (ANGLE) search % if ANGLE in key - { - pop pop pop pop pop - } - { - (ldiagtagdict) search - { - pop pop pop pop pop - } - { - pop cvx exec 2 copy - gsave - newpath 2.0 pt 0 360 arc 0 setgray fill - /Times-Roman findfont 8 pt scalefont setfont - translate 40 rotate 0.2 cm 0.1 cm moveto 100 string cvs show - grestore - } ifelse - } ifelse - } ifelse - } ifelse - } forall - % (Leaving ldiagshowtags) 0 ldiagdebugprint -} def - - -% show angles: - ldiagshowangles - -/ldiagshowangles -{ - % (Entering ldiagshowangles) 0 ldiagdebugprint - ldiagtoptagdict - { 1 index 100 string cvs - % dup 0 ldiagdebugprint - (ldiagdebugpos) search - { pop pop pop pop pop } - { - (ldiagtagdict) search - { - pop pop pop pop pop - } - { - (CIRCUM) search % if CIRCUM in key - { pop pop pop pop pop } - { - (@ANGLE) search % if ANGLE in key, draw the angle at the point - { - % (showing ANGLE) 5 ldiagdebugprint - gsave exch pop exch pop cvx - % (about to execute) 1 ldiagdebugprint - exec translate rotate 0.8 0.8 scale pop - newpath 0 0 2.0 pt 0 360 arc 0 setgray fill - newpath 4 pt 0 moveto 9 pt 0 lineto - 9 pt 1.5 pt lineto 11 pt 0 lineto 9 pt -1.5 pt lineto - 9 pt 0 lineto [] 0 setdash 4 pt setlinewidth 0 setlinejoin - stroke grestore - % (finished ANGLE) 5 ldiagdebugprint - } - { - % else must be a point, we aren't showing those - pop pop pop - } ifelse - } ifelse - } ifelse - } ifelse - } forall - % (Leaving ldiagshowangles) 0 ldiagdebugprint -} def - -% fix an angle to 0 <= res < 360: <angle> ldiagfixangle <angle> -/ldiagfixangle -{ - % (Entering ldiagfixangle) 1 ldiagdebugprint - { dup 0 ge { exit } if - 360 add - } loop - { dup 360 lt { exit } if - 360 sub - } loop - % (Leaving ldiagfixangle) 1 ldiagdebugprint -} def - -% find point on circumference of box: alpha a b ldiagboxcircum x y -/ldiagboxcircum -{ - % (Entering ldiagboxcircum) 3 ldiagdebugprint - 4 dict begin - /b exch def - /a exch def - ldiagfixangle /alpha exch def - 0 0 a b ldiagangleto /theta exch def - - % if alpha <= theta, return (a, a*tan(alpha)) - alpha theta le - { a a alpha sin mul alpha cos div } - { - % else if alpha <= 180 - theta, return (b*cot(alpha), b) - alpha 180 theta sub le - { b alpha cos mul alpha sin div b } - { - % else if alpha <= 180 + theta, return (-a, -a*tan(alpha)) - alpha 180 theta add le - { a neg a neg alpha sin mul alpha cos div } - { - % else if alpha <= 360 - theta, return (-b*cot(alpha), -b) - alpha 360 theta sub le - { b neg alpha cos mul alpha sin div b neg } - { - % else 360 - theta <= alpha, return (a, a*tan(alpha)) - a a alpha sin mul alpha cos div - } ifelse - } ifelse - } ifelse - } ifelse - end - % (Leaving ldiagboxcircum) 2 ldiagdebugprint -} def - -% find quadratic roots (assume a != 0): a b c ldiagqroots x1 x2 2 -% or x2 1 -% or 0 -/ldiagqroots -{ - 4 dict begin - /c exch def - /b exch def - /a exch def - /disc b b mul 4 a c mul mul sub def - disc 0 lt - { 0 - } - { disc 0 eq - { b neg 2 a mul div - 1 - } - { b neg disc sqrt add 2 a mul div - b neg disc sqrt sub 2 a mul div - 2 - } - ifelse - } - ifelse - end -} def - -% work our which quadrant: <angle> ldiagquadrant <0-3> -/ldiagquadrant -{ dup 90 lt - { pop 0 - } - { dup 180 lt - { pop 1 - } - { 270 lt - { 2 - } - { 3 - } ifelse - } ifelse - } ifelse -} def - -% find curvebox circum, assuming upper right quadrant: alpha a b xmk ldiagcb x y -/ldiagcb -{ - 6 dict begin - /xmk exch def - /b exch def - /a exch def - /alpha exch def - /theta1 0 0 a b xmk sub ldiagangleto def - /theta2 0 0 a xmk sub b ldiagangleto def - alpha theta1 le - { % if alpha <= theta1, return (a, a*tan(alpha)) - a a alpha sin mul alpha cos div - } - { alpha theta2 ge - { % else if alpha > theta2, return (b*cot(alpha), b) - b alpha cos mul alpha sin div b - } - { - % else, return the intersection of line and circle - a xmk sub b xmk sub xmk 0 0 alpha ldiagcircleintersect - dup 0 eq - { % should never happen, just return any reasonable point - pop - a b 0.5 ldiagpmul - } - { 1 eq - { % should never happen, just return the point on top of stack - } - { % the usual case, two points on stack, return the larger - ldiagpmax - } ifelse - } ifelse - } ifelse - } ifelse - end -} def - -% find point on circumference of curvebox: alpha a b xmk ldiagcurveboxcircum x y -/ldiagcurveboxcircum -{ - % (Entering ldiagcurveboxcircum) 4 ldiagdebugprint - 5 dict begin - /xmk exch def - /b exch def - /a exch def - ldiagfixangle /alpha exch def - - % work out which quadrant we are in, and reflect accordingly - /quad alpha ldiagquadrant def - quad 0 eq - { alpha a b xmk ldiagcb - } - { quad 1 eq - { 180 alpha sub a b xmk ldiagcb exch neg exch - } - { quad 2 eq - { alpha 180 sub a b xmk ldiagcb neg exch neg exch - } - { 360 alpha sub a b xmk ldiagcb neg - } ifelse - } ifelse - } ifelse - end - % (Leaving ldiagcurveboxcircum) 2 ldiagdebugprint -} def - -% find point on circumference of diamond: alpha a b ldiagdiamondcircum x y -/ldiagdiamondcircum -{ - % (Entering ldiagdiamondcircum) 3 ldiagdebugprint - 4 dict begin - /b exch def - /a exch def - ldiagfixangle /alpha exch def - b alpha cos abs mul a alpha sin abs mul add /denom exch def - a b mul alpha cos mul denom div - a b mul alpha sin mul denom div - end - % (Leaving ldiagdiamondcircum) 2 ldiagdebugprint -} def - -% find point on circumference of ellipse: alpha a b ldiagellipsecircum x y -/ldiagellipsecircum -{ - % (Entering ldiagellipsecircum) 3 ldiagdebugprint - 4 dict begin - /b exch def - /a exch def - ldiagfixangle /alpha exch def - b alpha cos mul dup mul a alpha sin mul dup mul add sqrt /denom exch def - a b mul alpha cos mul denom div - a b mul alpha sin mul denom div - end - % (Leaving ldiagellipsecircum) 2 ldiagdebugprint -} def - -% find point on circumference of isosceles: alpha a b ldiagisoscelescircum x y -/ldiagisoscelescircum -{ - % (Entering ldiagisoscelescircum) 3 ldiagdebugprint - 7 dict begin - /b exch def - /a exch def - /alpha exch ldiagfixangle def - /theta1 90 def - /theta2 a b 0.5 ldiagpmul 0 0 ldiagangleto def - /theta3 a b 0.5 ldiagpmul a 0 ldiagangleto def - alpha theta1 ge alpha theta2 le and - { 0 0 a 2 div b - } - { alpha theta2 ge alpha theta3 le and - { 0 0 a 0 - } - { a 0 a 2 div b - } ifelse - } ifelse - a 2 div b 2 div 2 copy 1 ft alpha ldiagatangle ldiaglineintersect - a 2 div b 2 div 4 2 roll ldiagpsub - end - % (Leaving ldiagisoscelescircum) 2 ldiagdebugprint -} def - -% find point of intersection of two lines each defined by two points -% x1 y1 x2 y2 x3 y3 x4 y4 ldiaglineintersect x y -/ldiaglineintersect -{ - % (Entering ldiaglineintersect) 8 ldiagdebugprint - 13 dict begin - /y4 exch def - /x4 exch def - /y3 exch def - /x3 exch def - /y2 exch def - /x2 exch def - /y1 exch def - /x1 exch def - x2 x1 sub /x21 exch def - x4 x3 sub /x43 exch def - y2 y1 sub /y21 exch def - y4 y3 sub /y43 exch def - y21 x43 mul y43 x21 mul sub /det exch def - - % calculate x - y21 x43 mul x1 mul - y43 x21 mul x3 mul sub - y3 y1 sub x21 mul x43 mul add - det div - - % calculate y - x21 y43 mul y1 mul - x43 y21 mul y3 mul sub - x3 x1 sub y21 mul y43 mul add - det neg div - - end - % (Leaving ldiaglineintersect) 2 ldiagdebugprint -} def - -% find point on circumference of polygon -% alpha radius num theta ldiagpolycircum x y -/ldiagpolycircum -{ - % (Entering ldiagpolycircum) 4 ldiagdebugprint - 13 dict begin - /theta exch def - /num exch def - /radius exch def - /alpha exch def - - % calculate delta, the angle from theta to alpha - alpha theta sub ldiagfixangle - - % calculate the angle which is the multiple of 360/num closest to delta - 360 num div div truncate 360 num div mul theta add /anglea exch def - - % calculate the next multiple of 360/num after anglea - anglea 360 num div add /angleb exch def - - % intersect the line through these two points with the alpha line - anglea cos anglea sin angleb cos angleb sin - 0 0 alpha cos 2 mul alpha sin 2 mul - ldiaglineintersect radius ldiagpmul - - end - % (Leaving ldiagpolycircum) 2 ldiagdebugprint -} def - -% find point of intersection of a line and a circle -% x0 y0 r x1 y1 theta ldiagcircleintersect xa ya xb yb 2 -% or xb yb 1 -% or 0 -/ldiagcircleintersect -{ - % (Entering ldiagcircleintersect) 6 ldiagdebugprint - 15 dict begin - /theta exch def - /y1 exch def - /x1 exch def - /r exch def - /y0 exch def - /x0 exch def - - % if sin(theta) = 0 then line is horizontal and y must be y1 - theta sin abs 0.00001 lt - { - /a 1 def - /b -2 x0 mul def - /c x0 dup mul y1 y0 sub dup mul add r dup mul sub def - a b c ldiagqroots dup - 0 eq - { pop - 0 - } - { 1 eq - { y1 1 - } - { y1 exch y1 2 - } ifelse - } ifelse - } - { - /ct theta cos theta sin div def - /a ct ct mul 1 add def - /b ct x1 x0 sub mul y1 add y0 sub 2 mul def - /c x1 x0 sub dup mul y1 y0 sub dup mul add r dup mul sub def - a b c ldiagqroots dup - 0 eq - { pop - 0 - } - { 1 eq - { y1 add /yb exch def - yb y1 sub ct mul x1 add /xb exch def - xb yb 1 - } - { y1 add /ya exch def - ya y1 sub ct mul x1 add /xa exch def - y1 add /yb exch def - yb y1 sub ct mul x1 add /xb exch def - xa ya xb yb 2 - } ifelse - } ifelse - } ifelse - end - % (Leaving ldiagcircleintersect) 1 ldiagdebugprint -} def - -% find line which is the perpendicular bisector of two points, defined -% by two points -% x1 y1 x2 y2 ldiaglinebetween x3 y3 x4 y4 -/ldiaglinebetween -{ % (Entering ldiaglinebetween) 4 ldiagdebugprint - /y2 exch def /x2 exch def - /y1 exch def /x1 exch def - - % let x3, y3 be the point halfway between the two points - x1 y1 x2 y2 ldiagpadd 0.5 ldiagpmul - /y3 exch def /x3 exch def - - % find a point perpendicular to x3, y3 - x3 y3 50 x1 y1 x2 y2 ldiagangleto 90 dg add ldiagatangle - - % plus x3 y3 gives the two points - x3 y3 - - % (Leaving ldiaglinebetween) 4 ldiagdebugprint -} def - -% find <proc>@<string>: <proc> <string> ldiagfindlabel <any> true -% <proc> <string> false -/ldiagfindlabel -{ - % (Entering ldiagfindlabel) 2 ldiagdebugprint - exch dup length 1 ne - { exch false - % (Leaving ldiagfindabel (length not 1)) 3 ldiagdebugprint - } - { dup 0 get type /nametype ne - { exch false - % (Leaving ldiagfindabel (not a name)) 3 ldiagdebugprint - } - { dup 0 get 100 string cvs (@) ldiagconcat 2 index ldiagconcat dup where - { exch get exch pop exch pop cvx exec true - % (Leaving ldiagfindlabel with success) 100 ldiagdebugprint - } - { - pop exch false - % (Leaving ldiagfindabel (concat not sensible)) 3 ldiagdebugprint - } ifelse - } ifelse - } ifelse -} bind def - -% execute <proc>@<string> or else default: <proc> <string> ldiagdolabel <various> -/ldiagdolabel -{ - % (Entering ldiagdolabel) 2 ldiagdebugprint - ldiagfindlabel not - { - dup (CIRCUM) eq - { pop pop pop 0 0 - } - { - dup (ANGLE) eq - { pop pop 0 - } - { pop cvx exec - } ifelse - } ifelse - } if - % (Leaving ldiagdolabel) 2 ldiagdebugprint -} bind def - -% execute a proc depending on whether number is negative, zero, or positive -% procneg proczero procpos number ldiagsigncase <anything> -/ldiagsigncase -{ - % (Entering ldiagsigncase) 4 ldiagdebugprint - dup 0 lt - { pop pop pop exec - } - { 0 gt - { exch pop exch pop exec - } - { pop exch pop exec - } ifelse - } ifelse - % (Leaving ldiagsigncase) 0 ldiagdebugprint -} bind def - -% execute proci if angle is in ith quadrant -% proc45 proc270 proc180 proc90 proc0 proc315 proc225 proc135 angle ldiagquadcase <anything> -/ldiagquadcase -{ - % (Entering ldiagquadcase) 9 ldiagdebugprint - round ldiagfixangle cvi dup 90 mod 0 eq - { 90 idiv 4 add } { 90 idiv } ifelse - 8 exch roll pop pop pop pop pop pop pop exec - % (Leaving ldiagquadcase) 0 ldiagdebugprint -} bind def - -% decode Lout length into PostScript length -% <string> ldiagdecodelength <number> -/ldiagdecodelength -{ - % (Entering ldiagdecodelength) 1 ldiagdebugprint - (f) search - { exch pop exch pop cvr ft - } - { (c) search - { exch pop exch pop cvr cm - } - { (p) search - { exch pop exch pop cvr pt - } - { (m) search - { exch pop exch pop cvr em - } - { (s) search - { exch pop exch pop cvr sp - } - { (v) search - { exch pop exch pop cvr vs - } - { (i) search - { exch pop exch pop cvr in - } - { pop 0 - } ifelse - } ifelse - } ifelse - } ifelse - } ifelse - } ifelse - } ifelse - % (Leaving ldiagdecodelength) 1 ldiagdebugprint -} def - -% implement aabout function -% logical form: <circum> <extra> <centre> aabout <point> -% actual form: { <labelorpoint> } cvlit <length> [ <point> ] cvx aabout <point> -/ldiagaabout -{ - /centre exch def - /extra exch def - /circum exch def - - /ZXCTR [ centre ] cvx def - /ZFCTR [ circum (CTR) ldiagdolabel ] cvx def - /ZAREF ZFCTR ZXCTR ldiagangleto def - /ZAMIN 0 dg def - /ZPMIN [ circum (CTR) ldiagdolabel ZAREF ZAMIN sub - circum (CIRCUM) ldiagdolabel ldiagpadd - 0 0 extra ZAREF ZAMIN sub ldiagatangle - ldiagpadd ] cvx def - - /ZAMAX 90 dg def - /ZPMAX [ circum (CTR) ldiagdolabel ZAREF ZAMAX sub - circum (CIRCUM) ldiagdolabel ldiagpadd - 0 0 extra ZAREF ZAMAX sub ldiagatangle - ldiagpadd ] cvx def - - 1 1 20 - { /xval exch def - /ZAMID ZAMIN ZAMAX add 0.5 mul def - /ZPMID [ circum (CTR) ldiagdolabel ZAREF ZAMID sub - circum (CIRCUM) ldiagdolabel ldiagpadd - 0 0 extra ZAREF ZAMID sub ldiagatangle - ldiagpadd ] cvx def - ZPMID ZXCTR ldiagdistance ZFCTR ZXCTR ldiagdistance gt - { - /ZAMAX [ ZAMID ] cvx def - /ZPMAX [ ZPMID ] cvx def - } - { - /ZAMIN [ ZAMID ] cvx def - /ZPMIN [ ZPMID ] cvx def - } ifelse - } for - ZPMID -} def - -% implement cabout function -% logical form: <circum> <extra> <centre> cabout <point> -% actual form: { <labelorpoint> } cvlit <length> [ <point> ] cvx cabout <point> -/ldiagcabout -{ - /centre exch def - /extra exch def - /circum exch def - - /ZXCTR [ centre ] cvx def - /ZFCTR [ circum (CTR) ldiagdolabel ] cvx def - /ZAREF ZFCTR ZXCTR ldiagangleto def - /ZAMIN 0 dg def - /ZPMIN [ circum (CTR) ldiagdolabel ZAREF ZAMIN add - circum (CIRCUM) ldiagdolabel ldiagpadd - 0 0 extra ZAREF ZAMIN add ldiagatangle - ldiagpadd ] cvx def - - /ZAMAX 90 dg def - /ZPMAX [ circum (CTR) ldiagdolabel ZAREF ZAMAX add - circum (CIRCUM) ldiagdolabel ldiagpadd - 0 0 extra ZAREF ZAMAX add ldiagatangle - ldiagpadd ] cvx def - - 1 1 20 - { /xval exch def - /ZAMID ZAMIN ZAMAX add 0.5 mul def - /ZPMID [ circum (CTR) ldiagdolabel ZAREF ZAMID add - circum (CIRCUM) ldiagdolabel ldiagpadd - 0 0 extra ZAREF ZAMID add ldiagatangle - ldiagpadd ] cvx def - ZPMID ZXCTR ldiagdistance ZFCTR ZXCTR ldiagdistance gt - { - /ZAMAX [ ZAMID ] cvx def - /ZPMAX [ ZPMID ] cvx def - } - { - /ZAMIN [ ZAMID ] cvx def - /ZPMIN [ ZPMID ] cvx def - } ifelse - } for - ZPMID -} def - -% fromarrowlength toarrowlength { from } { to } xindent zindent ldiaglinepath - -/ldiaglinepath -{ - % (entering ldiaglinepath) 0 ldiagdebugprint - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel to (CTR) ldiagdolabel ldiagangleto - /FROM@ANGLE ldiagangledef - from (CTR) ldiagdolabel FROM@ANGLE from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FROM@ANGLE ldiagatangle ldiagpadd - /FROM ldiagpointdef - - FROM@ANGLE /TO@ANGLE ldiagangledef - to (CTR) ldiagdolabel TO@ANGLE 180 dg sub to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TO@ANGLE 180 dg sub ldiagatangle ldiagpadd /TO ldiagpointdef - - FROM 0.5 ldiagpmul TO 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - FROM@ANGLE /LMID@ANGLE ldiagangledef - - /XINDENT xindent FROM LMID ldiagdistance ldiagmin def - FROM 0 0 XINDENT FROM@ANGLE ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - - /ZINDENT zindent TO LMID ldiagdistance ldiagmin def - 0 0 ZINDENT FROM@ANGLE ldiagatangle TO ldiagpsub /LTO ldiagpointdef - FROM@ANGLE /LTO@ANGLE ldiagangledef - - direct { FROM TO } { FROM LFROM LMID LTO TO } ifelse - - % (leaving ldiaglinepath) 0 ldiagdebugprint -} def - -% fromarrowlength toarrowlength { from } { to } xindent zindent pathgap ldiagdoublelinepath - -/ldiagdoublelinepath -{ - % (entering ldiagdoublelinepath) 0 ldiagdebugprint - /pathgap exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel to (CTR) ldiagdolabel ldiagangleto - /FROM@ANGLE ldiagangledef - from (CTR) ldiagdolabel FROM@ANGLE from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FROM@ANGLE ldiagatangle ldiagpadd - /FROM ldiagpointdef - - FROM@ANGLE /TO@ANGLE ldiagangledef - to (CTR) ldiagdolabel TO@ANGLE 180 dg sub to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TO@ANGLE 180 dg sub ldiagatangle ldiagpadd /TO ldiagpointdef - - FROM 0.5 ldiagpmul TO 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - FROM@ANGLE /LMID@ANGLE ldiagangledef - - /XINDENT xindent FROM LMID ldiagdistance ldiagmin def - FROM 0 0 XINDENT FROM@ANGLE ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - - /ZINDENT zindent TO LMID ldiagdistance ldiagmin def - 0 0 ZINDENT FROM@ANGLE ldiagatangle TO ldiagpsub /LTO ldiagpointdef - FROM@ANGLE /LTO@ANGLE ldiagangledef - - direct { - FROM pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - TO pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - [] - FROM pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - TO pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - } - { - FROM pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - LFROM pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - LMID pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - LTO pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - TO pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - [] - FROM pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - LFROM pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - LMID pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - LTO pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - TO pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - } ifelse - - % (leaving ldiagdoublelinepath) 0 ldiagdebugprint -} def - -% fromarrowlen toarrowlen { from } { to } xindent zindent bias ldiagacurvepath - -/ldiagacurvepath -{ - % (entering ldiagacurvepath) 0 ldiagdebugprint - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - %/B1 bias 0.02 ft ldiagmax def - %/B2 from (CTR) ldiagdolabel to (CTR) ldiagdolabel ldiagdistance 0.5 mul def - %/BIAS B1 B2 ldiagmin def - /BIAS bias 0.02 ft ldiagmax def - /XMID [ from (CTR) ldiagdolabel 0.5 ldiagpmul - to (CTR) ldiagdolabel 0.5 ldiagpmul ldiagpadd ] cvx def - /XTOP [ XMID 0 0 BIAS from (CTR) ldiagdolabel to (CTR) ldiagdolabel - ldiagangleto 90 dg sub ldiagatangle ldiagpadd ] cvx def - /CTR [ from (CTR) ldiagdolabel XTOP ldiaglinebetween - to (CTR) ldiagdolabel XTOP ldiaglinebetween - ldiaglineintersect ] cvx def - - from fromarrowlength [ CTR ] cvx ldiagaabout /FROM ldiagpointdef - from (CTR) ldiagdolabel FROM ldiagdistance 0 gt - { from (CTR) ldiagdolabel FROM ldiagangleto - } - { CTR FROM ldiagangleto 90 dg add - } ifelse /FROM@ANGLE ldiagangledef - - to toarrowlength [ CTR ] cvx ldiagcabout /TO ldiagpointdef - TO to (CTR) ldiagdolabel ldiagdistance 0 gt - { TO to (CTR) ldiagdolabel ldiagangleto - } - { CTR TO ldiagangleto 90 dg add - } ifelse /TO@ANGLE ldiagangledef - - /RADIUS CTR FROM ldiagdistance def - CTR 0 0 RADIUS CTR FROM ldiagangleto 360 dg CTR TO ldiagangleto - add CTR FROM ldiagangleto sub cvi 360 mod 0.5 mul add - ldiagatangle ldiagpadd /LMID ldiagpointdef - CTR LMID ldiagangleto 90 dg add /LMID@ANGLE ldiagangledef - - /XINDENT xindent FROM LMID ldiagdistance ldiagmin def - CTR 0 0 RADIUS CTR FROM 0 0 XINDENT FROM@ANGLE ldiagatangle - ldiagpadd ldiagangleto ldiagatangle ldiagpadd /LFROM ldiagpointdef - CTR LFROM ldiagangleto 90 dg add /LFROM@ANGLE ldiagangledef - - /ZINDENT zindent TO LMID ldiagdistance ldiagmin def - CTR 0 0 RADIUS CTR TO 0 0 ZINDENT TO@ANGLE 180 dg add - ldiagatangle ldiagpadd ldiagangleto ldiagatangle ldiagpadd /LTO ldiagpointdef - CTR LTO ldiagangleto 90 dg add /LTO@ANGLE ldiagangledef - - direct - { FROM [CTR] TO } - { FROM [CTR] LFROM [CTR] LMID [CTR] LTO [CTR] TO } - ifelse - - % (leaving ldiagacurvepath) 0 ldiagdebugprint -} def - -% fromarrowlen toarrowlen { from } { to } xindent zindent bias ldiagccurvepath - -/ldiagccurvepath -{ - % (entering ldiagccurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - %/B1 bias 0.02 ft ldiagmax def - %/B2 from (CTR) ldiagdolabel to (CTR) ldiagdolabel ldiagdistance 0.5 mul def - %/BIAS B1 B2 ldiagmin def - /BIAS bias 0.02 ft ldiagmax def - /XMID [ from (CTR) ldiagdolabel 0.5 ldiagpmul - to (CTR) ldiagdolabel 0.5 ldiagpmul ldiagpadd ] cvx def - /XTOP [ XMID 0 0 BIAS from (CTR) ldiagdolabel to (CTR) ldiagdolabel - ldiagangleto 90 dg add ldiagatangle ldiagpadd ] cvx def - /CTR [ from (CTR) ldiagdolabel XTOP ldiaglinebetween - to (CTR) ldiagdolabel XTOP ldiaglinebetween ldiaglineintersect ] cvx def - - from fromarrowlength [ CTR ] cvx ldiagcabout /FROM ldiagpointdef - from (CTR) ldiagdolabel FROM ldiagdistance 0 gt - { from (CTR) ldiagdolabel FROM ldiagangleto } - { CTR FROM ldiagangleto 90 dg sub } - ifelse /FROM@ANGLE ldiagangledef - - to toarrowlength [ CTR ] cvx ldiagaabout /TO ldiagpointdef - TO to (CTR) ldiagdolabel ldiagdistance 0 gt - { TO to (CTR) ldiagdolabel ldiagangleto } - { CTR TO ldiagangleto 90 dg sub } - ifelse /TO@ANGLE ldiagangledef - - /RADIUS [ CTR FROM ldiagdistance ] cvx def - CTR 0 0 RADIUS CTR TO ldiagangleto 360 dg CTR FROM ldiagangleto add - CTR TO ldiagangleto sub cvi 360 cvi mod 2 div add ldiagatangle - ldiagpadd /LMID ldiagpointdef - CTR LMID ldiagangleto 90 dg sub /LMID@ANGLE ldiagangledef - - /XINDENT [ xindent FROM LMID ldiagdistance ldiagmin ] cvx def - CTR 0 0 RADIUS CTR FROM 0 0 XINDENT FROM@ANGLE ldiagatangle ldiagpadd - ldiagangleto ldiagatangle ldiagpadd /LFROM ldiagpointdef - CTR LFROM ldiagangleto 90 dg sub /LFROM@ANGLE ldiagangledef - - /ZINDENT [ zindent TO LMID ldiagdistance ldiagmin ] cvx def - CTR 0 0 RADIUS CTR TO 0 0 ZINDENT TO@ANGLE 180 dg add ldiagatangle - ldiagpadd ldiagangleto ldiagatangle ldiagpadd /LTO ldiagpointdef - CTR LTO ldiagangleto 90 dg sub /LTO@ANGLE ldiagangledef - - direct - { FROM [CTR clockwise] TO } - { FROM [CTR clockwise] LFROM [CTR clockwise] - LMID [CTR clockwise] LTO [CTR clockwise] TO } - ifelse - % (leaving ldiagccurvepath) 0 ldiagdebugprint -} def - - -% farr tarr { from } { to } xindent zindent [frompt] [topt] ldiagbezierpath - -/ldiagbezierpath -{ - % (entering ldiagbezierpath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - cvx /topt exch def - cvx /frompt exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel frompt ldiagangleto /FROM@ANGLE ldiagangledef - from (CTR) ldiagdolabel FROM@ANGLE from (CIRCUM) ldiagdolabel - ldiagpadd 0 0 fromarrowlength FROM@ANGLE ldiagatangle ldiagpadd - /FROM ldiagpointdef - - topt to (CTR) ldiagdolabel ldiagangleto /TO@ANGLE ldiagangledef - to (CTR) ldiagdolabel TO@ANGLE 180 dg add to (CIRCUM) ldiagdolabel - ldiagpadd 0 0 toarrowlength TO@ANGLE 180 dg add ldiagatangle ldiagpadd - /TO ldiagpointdef - - FROM 0 0 xindent FROM@ANGLE ldiagatangle ldiagpadd - /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - - TO 0 0 zindent TO@ANGLE 180 dg add ldiagatangle ldiagpadd - /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - - FROM TO ldiagpadd frompt ldiagpadd topt ldiagpadd 0.25 ldiagpmul - /LMID ldiagpointdef - - FROM [frompt topt] TO - - % (leaving ldiagbezierpath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - - -% farr tarr { from } { to } xindent zindent ldiagvhlinepath - -/ldiagvhlinepath -{ - % (entering ldiagvhlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /CTR [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel exch pop ] cvx def - /FANG [ from (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - /TANG [ to (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - - from (CTR) ldiagdolabel FANG from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FANG ldiagatangle ldiagpadd /FROM ldiagpointdef - FANG /FROM@ANGLE ldiagangledef - - to (CTR) ldiagdolabel TANG to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TANG ldiagatangle ldiagpadd /TO ldiagpointdef - TANG 180 dg add /TO@ANGLE ldiagangledef - - /FDIST [ FROM CTR ldiagdistance ] cvx def - /TDIST [ TO CTR ldiagdistance ] cvx def - /XINDENT [ xindent FDIST ldiagmin ] cvx def - /ZINDENT [ zindent TDIST ldiagmin ] cvx def - FROM 0 0 XINDENT FANG ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - TO 0 0 ZINDENT TANG ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - - CTR /LMID ldiagpointdef - 0 0 1 ft FANG 180 dg add ldiagatangle - 0 0 1 ft TANG 180 dg add ldiagatangle - ldiagangleto /LMID@ANGLE ldiagangledef - - FROM LFROM LMID LTO TO - - % (leaving ldiagvhlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent radius ldiagvhcurvepath - -/ldiagvhcurvepath -{ - % (entering ldiagvhcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /CTR [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel exch pop ] cvx def - /FANG [ from (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - /TANG [ to (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - - from (CTR) ldiagdolabel FANG from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FANG ldiagatangle ldiagpadd /FROM ldiagpointdef - FANG /FROM@ANGLE ldiagangledef - - to (CTR) ldiagdolabel TANG to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TANG ldiagatangle ldiagpadd /TO ldiagpointdef - TANG 180 dg add /TO@ANGLE ldiagangledef - - /FDIST [ FROM CTR ldiagdistance ] cvx def - /TDIST [ TO CTR ldiagdistance ] cvx def - /RADIUS [ radius FDIST TDIST ldiagmin ldiagmin ] cvx def - /XINDENT [ xindent FDIST RADIUS sub ldiagmin ] cvx def - /ZINDENT [ zindent TDIST RADIUS sub ldiagmin ] cvx def - - FROM 0 0 XINDENT FANG ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - TO 0 0 ZINDENT TANG ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - - /FCTR [ CTR 0 0 RADIUS FROM@ANGLE 180 dg add ldiagatangle ldiagpadd ] cvx def - /TCTR [ CTR 0 0 RADIUS TO@ANGLE ldiagatangle ldiagpadd ] cvx def - /XCTR [ CTR 0 0 RADIUS FROM@ANGLE 180 dg add ldiagatangle ldiagpadd - 0 0 RADIUS TO@ANGLE ldiagatangle ldiagpadd ] cvx def - XCTR 0 0 RADIUS XCTR CTR ldiagangleto ldiagatangle ldiagpadd - /LMID ldiagpointdef - FCTR TCTR ldiagangleto /LMID@ANGLE ldiagangledef - - FROM LFROM FCTR - {[XCTR clockwise]} {} {} {} {} {[XCTR]} {[XCTR clockwise]} {[XCTR]} - FCTR TCTR ldiagangleto ldiagquadcase - TCTR LTO TO - - % (leaving ldiagvhcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent ldiaghvlinepath - -/ldiaghvlinepath -{ - % (entering ldiaghvlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /CTR [ to (CTR) ldiagdolabel pop from (CTR) ldiagdolabel exch pop ] cvx def - /FANG [ from (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - /TANG [ to (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - - from (CTR) ldiagdolabel FANG from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FANG ldiagatangle ldiagpadd /FROM ldiagpointdef - FANG /FROM@ANGLE ldiagangledef - - to (CTR) ldiagdolabel TANG to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TANG ldiagatangle ldiagpadd /TO ldiagpointdef - TANG 180 dg add /TO@ANGLE ldiagangledef - - /FDIST [ FROM CTR ldiagdistance ] cvx def - /TDIST [ TO CTR ldiagdistance ] cvx def - /XINDENT [ xindent FDIST ldiagmin ] cvx def - /ZINDENT [ zindent TDIST ldiagmin ] cvx def - - FROM 0 0 XINDENT FANG ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - TO 0 0 ZINDENT TANG ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - - CTR /LMID ldiagpointdef - 0 0 1 ft FANG 180 dg add ldiagatangle - 0 0 1 ft TANG 180 dg add ldiagatangle ldiagangleto - /LMID@ANGLE ldiagangledef - - FROM LFROM LMID LTO TO - - % (leaving ldiaghvlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent radius ldiaghvcurvepath - -/ldiaghvcurvepath -{ - % (entering ldiaghvcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /CTR [ to (CTR) ldiagdolabel pop from (CTR) ldiagdolabel exch pop ] cvx def - /FANG [ from (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - /TANG [ to (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - - from (CTR) ldiagdolabel FANG from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FANG ldiagatangle ldiagpadd /FROM ldiagpointdef - FANG /FROM@ANGLE ldiagangledef - - to (CTR) ldiagdolabel TANG to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TANG ldiagatangle ldiagpadd /TO ldiagpointdef - TANG 180 dg add /TO@ANGLE ldiagangledef - - /FDIST [ FROM CTR ldiagdistance ] cvx def - /TDIST [ TO CTR ldiagdistance ] cvx def - /RADIUS [ radius FDIST TDIST ldiagmin ldiagmin ] cvx def - /XINDENT [ xindent FDIST RADIUS sub ldiagmin ] cvx def - /ZINDENT [ zindent TDIST RADIUS sub ldiagmin ] cvx def - FROM 0 0 XINDENT FANG ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - TO 0 0 ZINDENT TANG ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - - /FCTR [ CTR 0 0 RADIUS FROM@ANGLE 180 dg add ldiagatangle ldiagpadd ] cvx def - /TCTR [ CTR 0 0 RADIUS TO@ANGLE ldiagatangle ldiagpadd ] cvx def - /XCTR [ CTR 0 0 RADIUS FROM@ANGLE 180 dg add ldiagatangle ldiagpadd - 0 0 RADIUS TO@ANGLE ldiagatangle ldiagpadd ] cvx def - XCTR 0 0 RADIUS XCTR CTR ldiagangleto ldiagatangle ldiagpadd - /LMID ldiagpointdef - FCTR TCTR ldiagangleto /LMID@ANGLE ldiagangledef - - FROM LFROM FCTR - {[XCTR]} {} {} {} {} {[XCTR clockwise]} {[XCTR]} {[XCTR clockwise]} - FCTR TCTR ldiagangleto ldiagquadcase - TCTR LTO TO - - % (leaving ldiaghvcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias ldiaglvrlinepath - -/ldiaglvrlinepath -{ - % (entering ldiaglvrlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel 180 dg from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength 180 dg ldiagatangle ldiagpadd /FROM ldiagpointdef - 180 dg /FROM@ANGLE ldiagangledef - - to (CTR) ldiagdolabel 180 dg to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength 180 dg ldiagatangle ldiagpadd /TO ldiagpointdef - 0 dg /TO@ANGLE ldiagangledef - - /XLEFT [ FROM pop TO pop ldiagmin bias sub ] cvx def - XLEFT FROM exch pop /P1 ldiagpointdef - XLEFT TO exch pop /P2 ldiagpointdef - /VERT [ P1 P2 ldiagangleto ] cvx def - P1 P1 0 0 1 ft 180 dg ldiagatangle ldiagpadd 0 0 1 ft VERT ldiagatangle - ldiagpadd ldiagangleto /P1@ANGLE ldiagangledef - P2 P2 0 0 1 ft 0 dg ldiagatangle ldiagpadd 0 0 1 ft VERT ldiagatangle - ldiagpadd ldiagangleto /P2@ANGLE ldiagangledef - - P1 0.5 ldiagpmul P2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - VERT /LMID@ANGLE ldiagangledef - - /XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def - /ZINDENT [ zindent P2 TO ldiagdistance ldiagmin ] cvx def - XINDENT 0 FROM ldiagpsub /LFROM ldiagpointdef - 180 dg /LFROM@ANGLE ldiagangledef - ZINDENT 0 TO ldiagpsub /LTO ldiagpointdef - 0 dg /LTO@ANGLE ldiagangledef - - FROM LFROM P1 LMID P2 LTO TO - - % (leaving ldiaglvrlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias radius ldiaglvrcurvepath - -/ldiaglvrcurvepath -{ - % (entering ldiaglvrcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel 180 dg from (CIRCUM) ldiagdolabel ldiagpadd 0 0 - fromarrowlength 180 dg ldiagatangle ldiagpadd /FROM ldiagpointdef - 180 dg /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel 180 dg to (CIRCUM) ldiagdolabel ldiagpadd 0 0 - toarrowlength 180 dg ldiagatangle ldiagpadd /TO ldiagpointdef - 0 dg /TO@ANGLE ldiagangledef - /XLEFT [ FROM pop TO pop ldiagmin bias sub ] cvx def - /XP1 [ XLEFT FROM exch pop ] cvx def - /XP2 [ XLEFT TO exch pop ] cvx def - /VERT [ XP1 XP2 ldiagangleto ] cvx def - XP1 0.5 ldiagpmul XP2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - VERT /LMID@ANGLE ldiagangledef - /XINDENT [ xindent FROM XP1 ldiagdistance ldiagmin ] cvx def - /ZINDENT [ zindent XP2 TO ldiagdistance ldiagmin ] cvx def - XINDENT 0 FROM ldiagpsub /LFROM ldiagpointdef - 180 dg /LFROM@ANGLE ldiagangledef - ZINDENT 0 TO ldiagpsub /LTO ldiagpointdef - 0 dg /LTO@ANGLE ldiagangledef - /RADIUS [ radius XP1 XP2 ldiagdistance 2 div ldiagmin ] cvx def - /XP1PRE [ XP1 0 0 RADIUS 0 dg ldiagatangle ldiagpadd ] cvx def - /XP1POST [ XP1 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def - /XP1CTR [ XP1PRE 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def - XP1CTR 0 0 RADIUS XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd - /P1 ldiagpointdef - XP1PRE XP1POST ldiagangleto /P1@ANGLE ldiagangledef - /XP2PRE [ 0 0 RADIUS VERT ldiagatangle XP2 ldiagpsub ] cvx def - /XP2POST [ XP2 0 0 RADIUS 0 dg ldiagatangle ldiagpadd ] cvx def - /XP2CTR [ XP2PRE 0 0 RADIUS 0 dg ldiagatangle ldiagpadd ] cvx def - XP2CTR 0 0 RADIUS XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd - /P2 ldiagpointdef - XP2PRE XP2POST ldiagangleto /P2@ANGLE ldiagangledef - FROM LFROM XP1PRE - { } { [XP1CTR] P1 [XP1CTR] } { } { [XP1CTR clockwise] P1 [XP1CTR clockwise] } - { } { } { } { } VERT round ldiagquadcase - XP1POST LMID XP2PRE - { } { [XP2CTR] P2 [XP2CTR] } { } { [XP2CTR clockwise] P2 [XP2CTR clockwise] } - { } { } { } { } VERT round ldiagquadcase - XP2POST LTO TO - - % (leaving ldiaglvrcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias ldiagrvllinepath - -/ldiagrvllinepath -{ - % (entering ldiagrvllinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel 0 dg from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength 0 dg ldiagatangle ldiagpadd /FROM ldiagpointdef - 0 dg /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel 0 dg to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength 0 dg ldiagatangle ldiagpadd /TO ldiagpointdef - 180 dg /TO@ANGLE ldiagangledef - /XRIGHT [ FROM pop TO pop ldiagmax bias add ] cvx def - XRIGHT FROM exch pop /P1 ldiagpointdef - XRIGHT TO exch pop /P2 ldiagpointdef - /VERT [ P1 P2 ldiagangleto ] cvx def - P1 P1 0 0 1 ft 0 dg ldiagatangle ldiagpadd 0 0 1 ft VERT ldiagatangle - ldiagpadd ldiagangleto /P1@ANGLE ldiagangledef - P2 P2 0 0 1 ft 180 dg ldiagatangle ldiagpadd 0 0 1 ft VERT ldiagatangle - ldiagpadd ldiagangleto /P2@ANGLE ldiagangledef - P1 0.5 ldiagpmul P2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - VERT /LMID@ANGLE ldiagangledef - /XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def - /ZINDENT [ zindent P2 TO ldiagdistance ldiagmin ] cvx def - FROM XINDENT 0 ldiagpadd /LFROM ldiagpointdef - 0 dg /LFROM@ANGLE ldiagangledef - TO ZINDENT 0 ldiagpadd /LTO ldiagpointdef - 180 dg /LTO@ANGLE ldiagangledef - FROM LFROM P1 LMID P2 LTO TO - - % (leaving ldiagrvllinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - - -% farr tarr { from } { to } xindent zindent bias radius ldiagrvlcurvepath - -/ldiagrvlcurvepath -{ - % (entering ldiagrvlcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel 0 dg from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength 0 dg ldiagatangle ldiagpadd /FROM ldiagpointdef - 0 dg /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel 0 dg to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength 0 dg ldiagatangle ldiagpadd /TO ldiagpointdef - 180 dg /TO@ANGLE ldiagangledef - /XRIGHT [ FROM pop TO pop ldiagmax bias add ] cvx def - /XP1 [ XRIGHT FROM exch pop ] cvx def - /XP2 [ XRIGHT TO exch pop ] cvx def - /VERT [ XP1 XP2 ldiagangleto ] cvx def - XP1 0.5 ldiagpmul XP2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - VERT /LMID@ANGLE ldiagangledef - /XINDENT [ xindent FROM XP1 ldiagdistance ldiagmin ] cvx def - /ZINDENT [ zindent XP2 TO ldiagdistance ldiagmin ] cvx def - FROM XINDENT 0 ldiagpadd /LFROM ldiagpointdef - 0 dg /LFROM@ANGLE ldiagangledef - TO ZINDENT 0 ldiagpadd /LTO ldiagpointdef - 180 dg /LTO@ANGLE ldiagangledef - /RADIUS [ radius XP1 XP2 ldiagdistance 0.5 mul ldiagmin ] cvx def - /XP1PRE [ XP1 0 0 RADIUS 180 dg ldiagatangle ldiagpadd ] cvx def - /XP1POST [ XP1 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def - /XP1CTR [ XP1PRE 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def - XP1CTR 0 0 RADIUS XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd - /P1 ldiagpointdef - XP1PRE XP1POST ldiagangleto /P1@ANGLE ldiagangledef - /XP2PRE [ 0 0 RADIUS VERT ldiagatangle XP2 ldiagpsub ] cvx def - /XP2POST [ XP2 0 0 RADIUS 180 dg ldiagatangle ldiagpadd ] cvx def - /XP2CTR [ XP2PRE 0 0 RADIUS 180 dg ldiagatangle ldiagpadd ] cvx def - XP2CTR 0 0 RADIUS XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd - /P2 ldiagpointdef - XP2PRE XP2POST ldiagangleto /P2@ANGLE ldiagangledef - FROM LFROM XP1PRE - {} {[XP1CTR clockwise] P1 [XP1CTR clockwise]} {} {[XP1CTR] P1 [XP1CTR]} - {} {} {} {} VERT round ldiagquadcase - XP1POST LMID XP2PRE - {} {[XP2CTR clockwise] P2 [XP2CTR clockwise]} {} {[XP2CTR] P2 [XP2CTR]} - {} {} {} {} VERT round ldiagquadcase - XP2POST LTO TO - - % (leaving ldiagrvlcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent hfrac hbias ldiaghvhlinepath - -/ldiaghvhlinepath % still to do -{ - % (entering ldiaghvhlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /hbias exch def - /hfrac exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /FRDIRN [ { 0 dg } { 180 dg } { 180 dg } { 0 dg } - { 0 dg } { 0 dg } { 180 dg } { 180 dg } - from (CTR) ldiagdolabel to (CTR) ldiagdolabel - ldiagangleto ldiagquadcase ] cvx def - /TODIRN [ FRDIRN 180 dg add ] cvx def - from (CTR) ldiagdolabel FRDIRN from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FRDIRN ldiagatangle ldiagpadd /FROM ldiagpointdef - FRDIRN /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel TODIRN to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TODIRN ldiagatangle ldiagpadd /TO ldiagpointdef - FRDIRN /TO@ANGLE ldiagangledef - /BIAS [ FROM pop TO pop sub abs hfrac mul hbias add ] cvx def - FROM 0 0 BIAS FRDIRN ldiagatangle ldiagpadd /P1 ldiagpointdef - P1 pop TO exch pop /P2 ldiagpointdef - P1 0.5 ldiagpmul P2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - P1 P2 ldiagangleto /LMID@ANGLE ldiagangledef - /XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def - /ZINDENT [ zindent P2 TO ldiagdistance ldiagmin ] cvx def - FROM 0 0 XINDENT FRDIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef - FRDIRN /LFROM@ANGLE ldiagangledef - TO 0 0 ZINDENT TODIRN ldiagatangle ldiagpadd /LTO ldiagpointdef - FRDIRN /LTO@ANGLE ldiagangledef - FROM LFROM P1 LMID P2 LTO TO - - % (leaving ldiaghvhlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - - -% farr tarr { from } { to } xindent zindent hfrac hbias radius ldiaghvhcurvepath - -/ldiaghvhcurvepath % still to do -{ - % (entering ldiaghvhcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /hbias exch def - /hfrac exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /FRDIRN [ { 0 dg } { 180 dg } { 180 dg } { 0 dg } - { 0 dg } { 0 dg } { 180 dg } { 180 dg } - from (CTR) ldiagdolabel to (CTR) ldiagdolabel - ldiagangleto ldiagquadcase ] cvx def - /TODIRN [ FRDIRN 180 dg add ] cvx def - - from (CTR) ldiagdolabel FRDIRN from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FRDIRN ldiagatangle ldiagpadd /FROM ldiagpointdef - FRDIRN /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel TODIRN to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TODIRN ldiagatangle ldiagpadd /TO ldiagpointdef - - FRDIRN /TO@ANGLE ldiagangledef - /BIAS [ FROM pop TO pop sub abs hfrac mul hbias add ] cvx def - /XP1 [ FROM 0 0 BIAS FRDIRN ldiagatangle ldiagpadd ] cvx def - /XP2 [ XP1 pop TO exch pop ] cvx def - XP1 0.5 ldiagpmul XP2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - /VERT [ XP1 XP2 ldiagangleto round ] cvx def - VERT /LMID@ANGLE ldiagangledef - /XINDENT [ xindent FROM XP1 ldiagdistance ldiagmin ] cvx def - /ZINDENT [ zindent XP2 TO ldiagdistance ldiagmin ] cvx def - FROM 0 0 XINDENT FRDIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef - FRDIRN /LFROM@ANGLE ldiagangledef - TO 0 0 ZINDENT TODIRN ldiagatangle ldiagpadd /LTO ldiagpointdef - FRDIRN /LTO@ANGLE ldiagangledef - /RADIUS [ radius XP1 XP2 ldiagdistance 2 div ldiagmin ] cvx def - /XP1PRE [ XP1 0 0 RADIUS TODIRN ldiagatangle ldiagpadd ] cvx def - /XP1POST [ XP1 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def - /XP1CTR [ XP1PRE 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def - XP1CTR 0 0 RADIUS XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd /P1 ldiagpointdef - XP1PRE XP1POST ldiagangleto /P1@ANGLE ldiagangledef - /XP2PRE [ 0 0 RADIUS VERT ldiagatangle XP2 ldiagpsub ] cvx def - /XP2POST [ XP2 0 0 RADIUS FRDIRN ldiagatangle ldiagpadd ] cvx def - /XP2CTR [ 0 0 RADIUS VERT ldiagatangle XP2POST ldiagpsub ] cvx def - XP2CTR 0 0 RADIUS XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd /P2 ldiagpointdef - XP2PRE XP2POST ldiagangleto /P2@ANGLE ldiagangledef - VERT FRDIRN sub 90 eq - { /P1GO [ anticlockwise ] cvx def /P2GO [ clockwise ] cvx def } - { /P1GO [ clockwise ] cvx def /P2GO [ anticlockwise ] cvx def } - ifelse - FROM LFROM - XP1PRE [XP1CTR P1GO] P1 [XP1CTR P1GO] XP1POST - LMID - XP2PRE [XP2CTR P2GO] P2 [XP2CTR P2GO] XP2POST - LTO TO - - % (leaving ldiaghvhcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent hfrac hbias ldiagvhvlinepath - -/ldiagvhvlinepath % still to do -{ - % (entering ldiagvhvlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /hbias exch def - /hfrac exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /FRDIRN [ { 90 dg } { 270 dg } { 270 dg } { 0 dg } - { 90 dg } { 270 dg } { 270 dg } { 90 dg } - from (CTR) ldiagdolabel to (CTR) ldiagdolabel - ldiagangleto ldiagquadcase ] cvx def - /TODIRN [ FRDIRN 180 dg sub ] cvx def - from (CTR) ldiagdolabel FRDIRN from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FRDIRN ldiagatangle ldiagpadd /FROM ldiagpointdef - FRDIRN /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel TODIRN to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TODIRN ldiagatangle ldiagpadd /TO ldiagpointdef - FRDIRN /TO@ANGLE ldiagangledef - /BIAS [ FROM exch pop TO exch pop sub abs hfrac mul hbias ft add ] cvx def - FROM 0 0 BIAS FRDIRN ldiagatangle ldiagpadd /P1 ldiagpointdef - TO pop P1 exch pop /P2 ldiagpointdef - P1 0.5 ldiagpmul P2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - P1 P2 ldiagangleto /LMID@ANGLE ldiagangledef - /XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def - /ZINDENT [ zindent P2 TO ldiagdistance ldiagmin ] cvx def - FROM 0 0 XINDENT FRDIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef - FRDIRN /LFROM@ANGLE ldiagangledef - TO 0 0 ZINDENT TODIRN ldiagatangle ldiagpadd /LTO ldiagpointdef - FRDIRN /LTO@ANGLE ldiagangledef - FROM LFROM P1 LMID P2 LTO TO - - % (leaving ldiagvhvlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - - -% farr tarr { from } { to } xindent zindent hfrac hbias radius ldiagvhvcurvepath - -/ldiagvhvcurvepath % still to do -{ - % (entering ldiagvhvcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /hbias exch def - /hfrac exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /FRDIRN [ { 90 dg } { 270 dg } { 270 dg } { 0 dg } - { 90 dg } { 270 dg } { 270 dg } { 90 dg } - from (CTR) ldiagdolabel to (CTR) ldiagdolabel - ldiagangleto ldiagquadcase ] cvx def - /TODIRN [ FRDIRN 180 dg sub ] cvx def - from (CTR) ldiagdolabel FRDIRN from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FRDIRN ldiagatangle ldiagpadd /FROM ldiagpointdef - FRDIRN /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel TODIRN to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TODIRN ldiagatangle ldiagpadd /TO ldiagpointdef - FRDIRN /TO@ANGLE ldiagangledef - /BIAS [ FROM exch pop TO exch pop sub abs hfrac mul hbias add ] cvx def - /XP1 [ FROM 0 0 BIAS FRDIRN ldiagatangle ldiagpadd ] cvx def - /XP2 [ TO pop XP1 exch pop ] cvx def - XP1 0.5 ldiagpmul XP2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - /VERT [ XP1 XP2 ldiagangleto round ] cvx def - VERT /LMID@ANGLE ldiagangledef - /XINDENT [ xindent FROM XP1 ldiagdistance ldiagmin ] cvx def - /ZINDENT [ zindent XP2 TO ldiagdistance ldiagmin ] cvx def - FROM 0 0 XINDENT FRDIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef - FRDIRN /LFROM@ANGLE ldiagangledef - TO 0 0 ZINDENT TODIRN ldiagatangle ldiagpadd /LTO ldiagpointdef - FRDIRN /LTO@ANGLE ldiagangledef - /RADIUS [ radius XP1 XP2 ldiagdistance 2 div ldiagmin ] cvx def - /XP1PRE [ XP1 0 0 RADIUS TODIRN ldiagatangle ldiagpadd ] cvx def - /XP1POST [ XP1 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def - /XP1CTR [ XP1PRE 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def - XP1CTR 0 0 RADIUS XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd /P1 ldiagpointdef - XP1PRE XP1POST ldiagangleto /P1@ANGLE ldiagangledef - /XP2PRE [ 0 0 RADIUS VERT ldiagatangle XP2 ldiagpsub ] cvx def - /XP2POST [ XP2 0 0 RADIUS FRDIRN ldiagatangle ldiagpadd ] cvx def - /XP2CTR [ 0 0 RADIUS VERT ldiagatangle XP2POST ldiagpsub ] cvx def - XP2CTR 0 0 RADIUS XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd /P2 ldiagpointdef - XP2PRE XP2POST ldiagangleto /P2@ANGLE ldiagangledef - FRDIRN VERT sub 90 eq - { /P1GO [ clockwise ] cvx def /P2GO [ anticlockwise ] cvx def } - { /P1GO [ anticlockwise ] cvx def /P2GO [ clockwise ] cvx def } - ifelse - FROM LFROM - XP1PRE [XP1CTR P1GO] P1 [XP1CTR P1GO] XP1POST - LMID - XP2PRE [XP2CTR P2GO] P2 [XP2CTR P2GO] XP2POST - LTO TO - - - % (leaving ldiagvhvcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias fbias tbias ldiagdwraplinepath - -/ldiagdwraplinepath -{ - % (entering ldiagdwraplinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /tbias exch def - /fbias exch def - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /DIRN [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop - lt { 180 dg } { 0 dg } ifelse ] cvx def - from (CTR) ldiagdolabel DIRN from (CIRCUM) ldiagdolabel ldiagpadd 0 0 - fromarrowlength DIRN ldiagatangle ldiagpadd /FROM ldiagpointdef - DIRN /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel DIRN 180 dg add to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength DIRN 180 dg add ldiagatangle ldiagpadd /TO ldiagpointdef - DIRN /TO@ANGLE ldiagangledef - FROM 0 0 fbias 0 ldiagmax DIRN ldiagatangle ldiagpadd /P1 ldiagpointdef - DIRN 180 dg eq { 225 dg } { -45 dg } ifelse /P1@ANGLE ldiagangledef - TO 0 0 tbias 0 ldiagmax DIRN 180 dg add ldiagatangle ldiagpadd - /P4 ldiagpointdef - DIRN 180 dg eq { 135 dg } { 45 dg } ifelse /P4@ANGLE ldiagangledef - /YC [ from (CTR) ldiagdolabel 270 dg from (CIRCUM) ldiagdolabel ldiagpadd - exch pop to (CTR) ldiagdolabel 270 dg to (CIRCUM) ldiagdolabel ldiagpadd - exch pop ldiagmin bias 0 ldiagmax sub ] cvx def - P1 pop YC /P2 ldiagpointdef - P4@ANGLE 180 dg sub /P2@ANGLE ldiagangledef - P4 pop YC /P3 ldiagpointdef - P1@ANGLE 180 dg sub /P3@ANGLE ldiagangledef - /XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def - FROM 0 0 XINDENT DIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - /ZINDENT [ zindent TO P4 ldiagdistance ldiagmin ] cvx def - TO 0 0 ZINDENT DIRN 180 dg add ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - P2 0.5 ldiagpmul P3 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - DIRN 180 dg sub /LMID@ANGLE ldiagangledef - FROM P1 P2 P3 P4 TO - - % (leaving ldiagdwraplinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias fbias tbias radius -% ldiagdwrapcurvepath - -/ldiagdwrapcurvepath -{ - % (entering ldiagdwrapcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /tbias exch def - /fbias exch def - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /DIRN [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt - { 180 dg } { 0 dg } ifelse ] cvx def - /CLOCK [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt - { anticlockwise } { clockwise } ifelse ] cvx def - from (CTR) ldiagdolabel DIRN from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength DIRN ldiagatangle ldiagpadd /FROM ldiagpointdef - DIRN /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel DIRN 180 dg add to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength DIRN 180 dg add ldiagatangle ldiagpadd /TO ldiagpointdef - DIRN /TO@ANGLE ldiagangledef - /XP1 [ FROM 0 0 fbias 0 ldiagmax DIRN ldiagatangle ldiagpadd ] cvx def - /XP4 [ TO 0 0 tbias 0 ldiagmax DIRN 180 dg add ldiagatangle ldiagpadd ] cvx def - /YC [ from (CTR) ldiagdolabel 270 dg from (CIRCUM) ldiagdolabel ldiagpadd - exch pop to (CTR) ldiagdolabel 270 dg to (CIRCUM) ldiagdolabel ldiagpadd - exch pop ldiagmin bias 0 ldiagmax sub ] cvx def - /XP2 [ XP1 pop YC ] cvx def - /XP3 [ XP4 pop YC ] cvx def - /RP1 [ radius XP1 FROM ldiagdistance XP1 XP2 ldiagdistance 2 div - ldiagmin ldiagmin ] cvx def - /XP1PRE [ XP1 0 0 RP1 XP1 FROM ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP1POST [ XP1 0 0 RP1 XP1 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP1CTR [ XP1PRE 0 0 RP1 XP1 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP1CTR 0 0 RP1 XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd /P1 ldiagpointdef - XP1CTR P1 ldiagangleto DIRN add 90 dg sub /P1@ANGLE ldiagangledef - /RP2 [ radius XP1 XP2 ldiagdistance 2 div XP2 XP3 ldiagdistance 2 div - ldiagmin ldiagmin ] cvx def - /XP2PRE [ XP2 0 0 RP2 XP2 XP1 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP2POST [ XP2 0 0 RP2 XP2 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP2CTR [ XP2PRE 0 0 RP2 XP2 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP2CTR 0 0 RP2 XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd /P2 ldiagpointdef - XP2CTR P2 ldiagangleto DIRN add 90 dg sub /P2@ANGLE ldiagangledef - /RP3 [ radius XP2 XP3 ldiagdistance 2 div XP3 XP4 ldiagdistance 2 div - ldiagmin ldiagmin ] cvx def - /XP3PRE [ XP3 0 0 RP3 XP3 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP3POST [ XP3 0 0 RP3 XP3 XP4 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP3CTR [ XP3PRE 0 0 RP3 XP3 XP4 ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP3CTR 0 0 RP3 XP3CTR XP3 ldiagangleto ldiagatangle ldiagpadd /P3 ldiagpointdef - XP3CTR P3 ldiagangleto DIRN add 90 dg sub /P3@ANGLE ldiagangledef - /RP4 [ radius XP4 XP3 ldiagdistance 2 div XP4 TO ldiagdistance - ldiagmin ldiagmin ] cvx def - /XP4PRE [ XP4 0 0 RP4 XP4 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP4POST [ XP4 0 0 RP4 XP4 TO ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP4CTR [ XP4PRE 0 0 RP4 XP4 TO ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP4CTR 0 0 RP4 XP4CTR XP4 ldiagangleto ldiagatangle ldiagpadd /P4 ldiagpointdef - XP4CTR P4 ldiagangleto DIRN add 90 dg sub /P4@ANGLE ldiagangledef - /XINDENT [ xindent FROM XP1PRE ldiagdistance ldiagmin ] cvx def - FROM 0 0 XINDENT DIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - XP2 0.5 ldiagpmul XP3 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - DIRN 180 dg sub /LMID@ANGLE ldiagangledef - /ZINDENT [ zindent TO XP4POST ldiagdistance ldiagmin ] cvx def - TO 0 0 ZINDENT DIRN 180 dg add ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - FROM LFROM - XP1PRE [XP1CTR CLOCK] XP1POST - XP2PRE [XP2CTR CLOCK] XP2POST - LMID - XP3PRE [XP3CTR CLOCK] XP3POST - XP4PRE [XP4CTR CLOCK] XP4POST - LTO TO - - % (leaving ldiagdwrapcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias fbias tbias ldiaguwraplinepath - -/ldiaguwraplinepath -{ - % (entering ldiaguwraplinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /tbias exch def - /fbias exch def - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /DIRN [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt - { 180 dg } { 0 dg } ifelse ] cvx def - from (CTR) ldiagdolabel DIRN from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength DIRN ldiagatangle ldiagpadd /FROM ldiagpointdef - DIRN /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel DIRN 180 dg add to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength DIRN 180 dg add ldiagatangle ldiagpadd /TO ldiagpointdef - DIRN /TO@ANGLE ldiagangledef - FROM 0 0 fbias 0 ldiagmax DIRN ldiagatangle ldiagpadd /P1 ldiagpointdef - DIRN 180 dg eq { 135 dg } { 45 dg } ifelse /P1@ANGLE ldiagangledef - TO 0 0 tbias 0 ldiagmax DIRN 180 dg add ldiagatangle ldiagpadd - /P4 ldiagpointdef - DIRN 180 dg eq { 225 dg } { -45 dg } ifelse /P4@ANGLE ldiagangledef - /YC [ from (CTR) ldiagdolabel 90 dg from (CIRCUM) ldiagdolabel ldiagpadd - exch pop to (CTR) ldiagdolabel 90 dg to (CIRCUM) ldiagdolabel ldiagpadd - exch pop ldiagmax bias 0 ldiagmax add ] cvx def - P1 pop YC /P2 ldiagpointdef - P4@ANGLE 180 dg sub /P2@ANGLE ldiagangledef - P4 pop YC /P3 ldiagpointdef - P1@ANGLE 180 dg sub /P3@ANGLE ldiagangledef - /XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def - FROM 0 0 XINDENT DIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - /ZINDENT [ zindent TO P4 ldiagdistance ldiagmin ] cvx def - TO 0 0 ZINDENT DIRN 180 dg add ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - P2 0.5 ldiagpmul P3 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - DIRN 180 dg sub /LMID@ANGLE ldiagangledef - FROM P1 P2 P3 P4 TO - - % (leaving ldiaguwraplinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias fbias tbias radius -% ldiaguwrapcurvepath - -/ldiaguwrapcurvepath -{ - % (entering ldiaguwrapcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /tbias exch def - /fbias exch def - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /DIRN [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt - { 180 dg } { 0 dg } ifelse ] cvx def - /CLOCK [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt - { clockwise } { anticlockwise } ifelse ] cvx def - from (CTR) ldiagdolabel DIRN from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength DIRN ldiagatangle ldiagpadd /FROM ldiagpointdef - DIRN /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel DIRN 180 dg add to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength DIRN 180 dg add ldiagatangle ldiagpadd /TO ldiagpointdef - DIRN /TO@ANGLE ldiagangledef - /XP1 [ FROM 0 0 fbias 0 ldiagmax DIRN ldiagatangle ldiagpadd ] cvx def - /XP4 [ TO 0 0 tbias 0 ldiagmax DIRN 180 dg add ldiagatangle ldiagpadd ] cvx def - /YC [ from (CTR) ldiagdolabel 90 dg from (CIRCUM) ldiagdolabel ldiagpadd - exch pop to (CTR) ldiagdolabel 90 dg to (CIRCUM) ldiagdolabel ldiagpadd - exch pop ldiagmax bias 0 ldiagmax add ] cvx def - /XP2 [ XP1 pop YC ] cvx def - /XP3 [ XP4 pop YC ] cvx def - /RP1 [ radius XP1 FROM ldiagdistance XP1 XP2 ldiagdistance 2 div - ldiagmin ldiagmin ] cvx def - /XP1PRE [ XP1 0 0 RP1 XP1 FROM ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP1POST [ XP1 0 0 RP1 XP1 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP1CTR [ XP1PRE 0 0 RP1 XP1 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP1CTR 0 0 RP1 XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd /P1 ldiagpointdef - XP1CTR P1 ldiagangleto DIRN add 90 dg add /P1@ANGLE ldiagangledef - /RP2 [ radius XP1 XP2 ldiagdistance 2 div XP2 XP3 ldiagdistance 2 div - ldiagmin ldiagmin ] cvx def - /XP2PRE [ XP2 0 0 RP2 XP2 XP1 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP2POST [ XP2 0 0 RP2 XP2 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP2CTR [ XP2PRE 0 0 RP2 XP2 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP2CTR 0 0 RP2 XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd /P2 ldiagpointdef - XP2CTR P2 ldiagangleto DIRN add 90 dg add /P2@ANGLE ldiagangledef - /RP3 [ radius XP2 XP3 ldiagdistance 2 div XP3 XP4 ldiagdistance 2 div - ldiagmin ldiagmin ] cvx def - /XP3PRE [ XP3 0 0 RP3 XP3 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP3POST [ XP3 0 0 RP3 XP3 XP4 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP3CTR [ XP3PRE 0 0 RP3 XP3 XP4 ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP3CTR 0 0 RP3 XP3CTR XP3 ldiagangleto ldiagatangle ldiagpadd /P3 ldiagpointdef - XP3CTR P3 ldiagangleto DIRN add 90 dg add /P3@ANGLE ldiagangledef - /RP4 [ radius XP4 XP3 ldiagdistance 2 div XP4 TO ldiagdistance - ldiagmin ldiagmin ] cvx def - /XP4PRE [ XP4 0 0 RP4 XP4 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP4POST [ XP4 0 0 RP4 XP4 TO ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP4CTR [ XP4PRE 0 0 RP4 XP4 TO ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP4CTR 0 0 RP4 XP4CTR XP4 ldiagangleto ldiagatangle ldiagpadd /P4 ldiagpointdef - XP4CTR P4 ldiagangleto DIRN add 90 dg add /P4@ANGLE ldiagangledef - /XINDENT [ xindent FROM XP1PRE ldiagdistance ldiagmin ] cvx def - FROM 0 0 XINDENT DIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - XP2 0.5 ldiagpmul XP3 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - DIRN 180 dg sub /LMID@ANGLE ldiagangledef - /ZINDENT [ zindent TO XP4POST ldiagdistance ldiagmin ] cvx def - TO 0 0 ZINDENT DIRN 180 dg add ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - FROM LFROM - XP1PRE [XP1CTR CLOCK] XP1POST - XP2PRE [XP2CTR CLOCK] XP2POST - LMID - XP3PRE [XP3CTR CLOCK] XP3POST - XP4PRE [XP4CTR CLOCK] XP4POST - LTO TO - - % (leaving ldiaguwrapcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% shape and labels of the @SolidArrowHead symbol -% - ldiagsolidarrowhead - -/ldiagsolidarrowhead -{ - 0 0 xsize ysize 0.5 mul 0 ysize -} def - -% shape and labels of the @OpenArrowHead symbol -% <pathwidth> ldiagopenarrowhead - -/ldiagopenarrowhead -{ - /pathwidth exch def - /PSW [ 0 0 ] cvx def - /PNW [ 0 ysize ] cvx def - /PE [ xsize ysize 0.5 mul ] cvx def - /REL [ 0 0 pathwidth PE PNW ldiagangleto 90 add ldiagatangle ] cvx def - /PNA [ 0 ysize 0.5 mul pathwidth 0.5 mul add ] cvx def - /PSA [ 0 ysize 0.5 mul pathwidth 0.5 mul sub ] cvx def - /PNI [ PNA PNA xsize 0 ldiagpadd PNW REL ldiagpadd - PE REL ldiagpadd ldiaglineintersect ] cvx def - /PSI [ 0 pathwidth PNI ldiagpsub ] cvx def - - PSW PE PNW PNI PNA PSA PSI PSW -} def - -% shape and labels of the @HalfOpenArrowHead symbol -% <pathwidth> ldiaghalfopenarrowhead - -/ldiaghalfopenarrowhead -{ - /pathwidth exch def - 0 0 - xsize ysize 0.5 mul - 0 ysize - xsize 0.3 mul ysize 0.5 mul pathwidth 0.5 mul add - 0 ysize 0.5 mul pathwidth 0.5 mul add - 0 ysize 0.5 mul pathwidth 0.5 mul sub - xsize 0.3 mul ysize 0.5 mul pathwidth 0.5 mul sub - 0 0 -} def - -% shape and labels of the @SolidCurvedArrowHead symbol -% - ldiagsolidcurvedarrowhead - -/ldiagsolidcurvedarrowhead -{ - 0 0 - [0 0 xsize ysize 0.5 mul ldiaglinebetween - xsize 0 xsize ysize ldiaglineintersect clockwise] - xsize ysize 0.5 mul - [xsize ysize 0.5 mul 0 ysize ldiaglinebetween - xsize 0 xsize ysize ldiaglineintersect clockwise] - 0 ysize -} def - -% shape and labels of the @OpenCurvedArrowHead symbol -% <pathwidth> ldiagopencurvedarrowhead - -/ldiagopencurvedarrowhead -{ - /pathwidth exch def - /LR [ 0 0 xsize ysize 0.5 mul ldiaglinebetween - xsize 0 xsize ysize ldiaglineintersect - ] cvx def - /UR [ xsize ysize 0.5 mul 0 ysize ldiaglinebetween - xsize 0 xsize ysize ldiaglineintersect - ] cvx def - /PW2 [ pathwidth 0.5 mul ] cvx def - /UMID [ - 0 ysize 0.5 mul PW2 add - xsize ysize 0.5 mul PW2 add - 0 ysize 0 0 1 ft UR 0 ysize ldiagangleto 90 add ldiagatangle - ldiagpadd 0 ysize ldiaglineintersect - ] cvx def - /LMID [ 0 pathwidth UMID ldiagpsub ] cvx def - 0 0 - [LR clockwise] - xsize ysize 0.5 mul - [UR clockwise] - 0 ysize - UMID - 0 ysize 0.5 mul PW2 add - 0 ysize 0.5 mul PW2 sub - LMID - 0 0 -} def - -% shape and labels of the @HalfOpenCurvedArrowHead symbol -% <pathwidth> ldiaghalfopencurvedarrowhead - -/ldiaghalfopencurvedarrowhead -{ - /pathwidth exch def - /LR [ 0 0 xsize ysize 0.5 mul ldiaglinebetween - xsize 0 xsize ysize ldiaglineintersect - ] cvx def - /UR [ xsize ysize 0.5 mul 0 ysize ldiaglinebetween - xsize 0 xsize ysize ldiaglineintersect - ] cvx def - /BR [ 0 0 LR 0 ysize UR ldiaglineintersect ] cvx def - /BRAD [ 0 0 BR ldiagdistance ] cvx def - /PW2 [ pathwidth 0.5 mul ] cvx def - /XDIST [ BRAD dup mul PW2 dup mul sub sqrt ] cvx def - /UMID [ BR XDIST PW2 ldiagpadd ] cvx def - /LMID [ BR XDIST 0 PW2 sub ldiagpadd ] cvx def - 0 0 - [LR clockwise] - xsize ysize 0.5 mul - [UR clockwise] - 0 ysize - [BR clockwise] - UMID - 0 ysize 0.5 mul PW2 add - 0 ysize 0.5 mul PW2 sub - LMID - [BR clockwise] - 0 0 -} def - -end -%%EndResource |