| %%BeginResource: procset LoutFigPrependGraphic |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % % |
| % 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 } |
| { 50 string cvs } ifelse |
| show |
| ( Command: ) show |
| $error /command get 50 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 |
| |
| /ldiagdebugposy 432 def |
| /ldiagdebugposx 72 def |
| |
| % <string> <int> ldiagdebugprint - |
| % must be defined outside ldiagdict since used in arbitrary places |
| % print count or <int> stack entries, which ever 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 50 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 |
| |
| % painting (i.e. filling): - ldiagwhite - (etc.) |
| /ldiagnopaint { } def |
| /ldiagnochange { fill } def |
| /ldiagdarkblue { 0.0 0.0 0.5 setrgbcolor fill } def |
| /ldiagblue { 0.0 0.0 1.0 setrgbcolor fill } def |
| /ldiaglightblue { 0.5 0.5 1.0 setrgbcolor fill } def |
| /ldiagdarkgreen { 0.0 0.5 0.0 setrgbcolor fill } def |
| /ldiaggreen { 0.0 1.0 0.0 setrgbcolor fill } def |
| /ldiaglightgreen { 0.5 1.0 0.5 setrgbcolor fill } def |
| /ldiagdarkred { 0.5 0.0 0.0 setrgbcolor fill } def |
| /ldiagred { 1.0 0.0 0.0 setrgbcolor fill } def |
| /ldiaglightred { 1.0 0.5 0.5 setrgbcolor fill } def |
| /ldiagdarkcyan { 0.0 0.5 0.5 setrgbcolor fill } def |
| /ldiagcyan { 0.0 1.0 1.0 setrgbcolor fill } def |
| /ldiaglightcyan { 0.5 1.0 1.0 setrgbcolor fill } def |
| /ldiagdarkmagenta { 0.5 0.0 0.5 setrgbcolor fill } def |
| /ldiagmagenta { 1.0 0.0 1.0 setrgbcolor fill } def |
| /ldiaglightmagenta { 1.0 0.5 1.0 setrgbcolor fill } def |
| /ldiagdarkyellow { 0.5 0.5 0.0 setrgbcolor fill } def |
| /ldiagyellow { 1.0 1.0 0.0 setrgbcolor fill } def |
| /ldiaglightyellow { 1.0 1.0 0.5 setrgbcolor fill } def |
| /ldiagdarkgray { 0.2 0.2 0.2 setrgbcolor fill } def |
| /ldiaggray { 0.5 0.5 0.5 setrgbcolor fill } def |
| /ldiaglightgray { 0.8 0.8 0.8 setrgbcolor fill } def |
| /ldiagdarkgrey { 0.2 0.2 0.2 setrgbcolor fill } def |
| /ldiaggrey { 0.5 0.5 0.5 setrgbcolor fill } def |
| /ldiaglightgrey { 0.8 0.8 0.8 setrgbcolor fill } def |
| /ldiagblack { 0.0 0.0 0.0 setrgbcolor fill } def |
| /ldiagwhite { 1.0 1.0 1.0 setrgbcolor fill } def |
| |
| % shape and labels of the @Box symbol |
| /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 50 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 50 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 50 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 50 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 20 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 20 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 50 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 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 |