home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 March / Chip_1998-03_cd.bin / tema / MINICAD / MC7DEMO / MINICAD.1 / KEYWAYS.MPC < prev    next >
Text File  |  1997-04-30  |  13KB  |  589 lines

  1. Procedure Keyways;
  2. {
  3. ⌐1997, Diehl Graphsoft, Inc.
  4. Developed by Tom Urie
  5.  
  6. This program draws a shaft or hub with a standard keyway. The procedure determines the proper keyway per ANSI B17.1 (for inch sizes) or BS 4235:Part 1:1972 (for mm sizes). It also allows the user to change the size of the keyway, if desired. The keyway drawn is the theoretical size without any clearance.
  7. }
  8.  
  9. LABEL 90,99;
  10.  
  11. VAR
  12.     d,h,hr,w,x0,y0,Alpha,Theta,q1,q2,q3 : REAL;
  13.     d_act,h_act,w_act : REAL;
  14.     x,y,R : ARRAY[1..10] OF REAL;
  15.     k,KeyType,KwyType,RFlag1,RFlag2 : INTEGER;
  16.     Abort,Inch,OK,NextClick,CenterMark : BOOLEAN;
  17.     sf,UPI : REAL;
  18.     Fmt : INTEGER;
  19.     UM,UM2 : STRING;
  20.     UName,DA : LONGINT;
  21.  
  22. Procedure KeyDialog;
  23. {
  24. This procedure creates the dialog boxes.
  25. }
  26. VAR
  27.     Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2,py3,py4 : INTEGER;
  28.  
  29. Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER);
  30. VAR
  31.     scrx1,scry1,scrx2,scry2:INTEGER;
  32. BEGIN
  33.     GetScreen(scrx1,scry1,scrx2,scry2);
  34.     x1:=((scrx1+scrx2) div 2)-(Width div 2);
  35.     x2:=x1+Width; 
  36. END;
  37.  
  38. Procedure LocateButtons(DialogType,scnh,scnw : INTEGER);
  39. {
  40. This procedure locates the 'OK' and 'Cancel' buttons.
  41. }
  42. VAR
  43.     v1,v2,v3,v4 : INTEGER;
  44.     Mac : BOOLEAN;
  45.  
  46. Procedure Swap(VAR  m1,m2,m3,m4 : INTEGER);
  47. VAR
  48.     Temp : INTEGER;
  49. BEGIN
  50.     Temp:=m1;
  51.     m1:=m3;
  52.     m3:=Temp;
  53.     Temp:=m2;
  54.     m2:=m4;
  55.     m4:=Temp;
  56. END;        {of Swap}
  57.  
  58. BEGIN
  59.     Mac:=FALSE;
  60.     GetVersion(v1,v2,v3,v4);
  61.     IF v4 = 1 THEN Mac:=TRUE;
  62.  
  63.     IF DialogType = 1 THEN
  64.     BEGIN
  65.         px1:=(scnw DIV 2) - 80;
  66.         px2:=(scnw DIV 2) - 10;
  67.         px3:=(scnw DIV 2) + 10;
  68.         px4:=(scnw DIV 2) + 80;
  69.         IF Mac THEN SWAP(px1,px2,px3,px4);
  70.  
  71.         py1:=scnh-40;
  72.         py2:=scnh-20;
  73.         py3:=py1;
  74.         py4:=py2;
  75.     END ELSE IF DialogType = 2 THEN
  76.     BEGIN
  77.         px1:=scnw - 180;
  78.         px2:=scnw - 110;
  79.         px3:=scnw - 90;
  80.         px4:=scnw - 20;
  81.         IF Mac THEN SWAP(px1,px2,px3,px4);
  82.  
  83.         py1:=scnh-40;
  84.         py2:=scnh-20;
  85.         py3:=py1;
  86.         py4:=py2;
  87.     END ELSE
  88.     BEGIN
  89.         px1:=scnw - 90;
  90.         px2:=scnw - 20;
  91.         px3:=px1;
  92.         px4:=px2;
  93.  
  94.         py1:=scnh -70;
  95.         py2:=scnh - 50;
  96.         py3:=scnh - 40;
  97.         py4:=scnh - 20;
  98.         IF Mac THEN SWAP(py1,py2,py3,py4);
  99.     END;
  100. END;        {of Locate Buttons}
  101.  
  102. Procedure MakeDialog;
  103. {
  104. This procedure defines the main dialog box.
  105. }
  106. CONST
  107.     y1=100;
  108.     scnw = 275;
  109.     scnh = 320;
  110.     DialogType = 3;
  111. VAR
  112.     h,h0,m : INTEGER;
  113. BEGIN
  114.     h0:=0;
  115.     AlignScr(scnw,x1,x2);
  116.     y2:=y1+scnh;
  117.     LocateButtons(DialogType,scnh,scnw);
  118.  
  119.     BeginDialog(1,1,x1,y1,x2,y2);
  120.     AddButton('OK',1,1,px1,py1,px2,py2);
  121.      AddButton('Cancel',2,1,px3,py3,px4,py4);
  122.  
  123.     h:=h0;
  124.     AddField('Units:',22,1,20,9+h,60,25+h);
  125.     AddButton('Inch',23,3,65,10+h,115,25+h);
  126.     AddButton('mm',24,3,120,10+h,165,25+h);
  127.  
  128.     h:=h0-10;
  129.     AddField('Shaft Diameter (in.):',5,1,20,44+h,170,60+h);
  130.     AddField('',6,2,175,45+h,245,60+h);
  131.  
  132.     h:=h0-10;
  133.     AddField('Type of Key:',14,1,20,69+h,200,85+h);
  134.     AddButton('Square',15,3,20,90+h,90,105+h);
  135.     AddButton('Rectangular',16,3,20,110+h,120,125+h);
  136.     AddField('Type of Keyway:',17,1,145,69+h,260,85+h);
  137.     AddButton('Hub',18,3,145,90+h,190,105+h);
  138.     AddButton('Shaft',19,3,145,110+h,200,125+h);
  139.  
  140.     AddField('',25,1,20,135+h,280,150+h);
  141.     AddField('',26,2,60,160+h,130,175+h);
  142.     AddField('x',27,1,140,159+h,150,175+h);
  143.     AddField('',28,2,160,160+h,230,175+h);
  144.  
  145.     m:=215; h:=h0-40;
  146.     AddField('Location:',7,1,20,m+h-1,130,m+15+h);
  147.     AddField('X:',8,1,20,m+25+h-1,50,m+40+h);
  148.     AddField('',9,2,55,m+25+h,155,m+40+h);
  149.     AddField('Y:',10,1,20,m+50+h-1,50,m+65+h);
  150.     AddField('',11,2,55,m+50+h,155,m+65+h);
  151.     AddButton('Next Click',12,3,20,m+75+h,120,m+90+h);
  152.  
  153.     AddButton('Show Center Mark',13,2,20,m+105+h,170,m+120+h);
  154.     
  155.     EndDialog;
  156. END;
  157.  
  158. BEGIN
  159.     MakeDialog;
  160. END;
  161.  
  162. Procedure KeySizeInch(ShaftDia : REAL; VAR kw,khr : REAL);
  163. {
  164. This procedure receives the shaft diameter in inches and determines the recommended key size.
  165. }
  166. LABEL 99;
  167. CONST
  168.     NSizes=22;
  169.     Min=0.3125;
  170. VAR
  171.     NomDia,w,hr : ARRAY[1..NSizes] OF REAL;
  172.     i : INTEGER;
  173. BEGIN
  174.     NomDia[1]:=7/16; w[1]:=3/32;    hr[1]:=3/32;
  175.     NomDia[2]:=9/16; w[2]:=1/8;     hr[2]:=3/32;
  176.     NomDia[3]:=7/8;     w[3]:=3/16;     hr[3]:=1/8;
  177.     NomDia[4]:=1.25; w[4]:=1/4;     hr[4]:=3/16;
  178.     NomDia[5]:=1.375;w[5]:=5/16;     hr[5]:=1/4;
  179.     NomDia[6]:=1.75; w[6]:=3/8;     hr[6]:=1/4;
  180.     NomDia[7]:=2.25; w[7]:=1/2;     hr[7]:=3/8;
  181.     NomDia[8]:=2.75; w[8]:=5/8;     hr[8]:=7/16;
  182.     NomDia[9]:=3.25; w[9]:=3/4;     hr[9]:=1/2;
  183.     NomDia[10]:=3.75;w[10]:=7/8;     hr[10]:=5/8;
  184.     NomDia[11]:=4.5; w[11]:=1;         hr[11]:=3/4;
  185.     NomDia[12]:=5.5; w[12]:=1.25;    hr[12]:=7/8;
  186.     NomDia[13]:=6.5; w[13]:=1.5;     hr[13]:=1;
  187.     NomDia[14]:=7.5; w[14]:=1.75;    hr[14]:=1.5;
  188.     NomDia[15]:=9;     w[15]:=2;         hr[15]:=1.5;
  189.     NomDia[16]:=11;     w[16]:=2.5;     hr[16]:=1.75;
  190.     NomDia[17]:=13;     w[17]:=3;         hr[17]:=2;
  191.     NomDia[18]:=15;     w[18]:=3.5;     hr[18]:=2.5;
  192.     NomDia[19]:=18;     w[19]:=4;         hr[19]:=3;
  193.     NomDia[20]:=22;     w[20]:=5;         hr[20]:=3.5;
  194.     NomDia[21]:=26;     w[21]:=6;         hr[21]:=4;
  195.     NomDia[22]:=30;     w[22]:=7;         hr[22]:=5;
  196.  
  197.     IF ShaftDia <= Min THEN
  198.     BEGIN
  199.         kw:=0;
  200.         khr:=0;
  201.         GOTO 99;
  202.     END;
  203.     FOR i:=1 TO NSizes-1 DO BEGIN
  204.         IF ShaftDia <= NomDia[i] THEN BEGIN
  205.             kw:=w[i];
  206.             khr:=hr[i];
  207.             GOTO 99;
  208.         END;
  209.     END;
  210.     kw:=w[NSizes];
  211.     khr:=hr[NSizes];
  212. 99:END;
  213.  
  214. Procedure KeySizeMM(ShaftDia : REAL; VAR kw,khr : REAL);
  215. {
  216. This procedure receives the shaft diameter in millimeters and determines the recommended key size.
  217. }
  218. LABEL 99;
  219. CONST
  220.     NSizes=26;
  221.     Min=6;
  222. VAR
  223.     NomDia,w,hr : ARRAY[1..26] OF REAL;
  224.     i : INTEGER;
  225. BEGIN
  226.     NomDia[1]:=8;        w[1]:=2;            hr[1]:=2;
  227.     NomDia[2]:=10;     w[2]:=3;         hr[2]:=3;
  228.     NomDia[3]:=12;     w[3]:=4;         hr[3]:=4;
  229.     NomDia[4]:=17;     w[4]:=5;         hr[4]:=5;
  230.     NomDia[5]:=22;        w[5]:=6;         hr[5]:=6;
  231.     NomDia[6]:=30;     w[6]:=8;         hr[6]:=7;
  232.     NomDia[7]:=38;        w[7]:=10;        hr[7]:=8;
  233.     NomDia[8]:=44;     w[8]:=12;         hr[8]:=8;
  234.     NomDia[9]:=50;     w[9]:=14;         hr[9]:=9;
  235.     NomDia[10]:=58;    w[10]:=16;     hr[10]:=10;
  236.     NomDia[11]:=65;     w[11]:=18;        hr[11]:=11;
  237.     NomDia[12]:=75;     w[12]:=20;        hr[12]:=12;
  238.     NomDia[13]:=85;     w[13]:=22;        hr[13]:=14;
  239.     NomDia[14]:=95;     w[14]:=25;        hr[14]:=14;
  240.     NomDia[15]:=110;    w[15]:=28;        hr[15]:=16;
  241.     NomDia[16]:=130;    w[16]:=32;     hr[16]:=18;
  242.     NomDia[17]:=150;    w[17]:=36;        hr[17]:=20;
  243.     NomDia[18]:=170;    w[18]:=40;     hr[18]:=22;
  244.     NomDia[19]:=200;    w[19]:=45;        hr[19]:=25;
  245.     NomDia[20]:=230;    w[20]:=50;        hr[20]:=28;
  246.     NomDia[21]:=260;    w[21]:=56;        hr[21]:=32;
  247.     NomDia[22]:=290;    w[22]:=63;        hr[22]:=32;
  248.     NomDia[23]:=330;    w[23]:=70;        hr[23]:=36;
  249.     NomDia[24]:=380;    w[24]:=80;        hr[24]:=40;
  250.     NomDia[25]:=440;    w[25]:=90;        hr[25]:=45;
  251.     NomDia[26]:=500;    w[26]:=100;    hr[26]:=50;
  252.  
  253.     IF ShaftDia <= Min THEN
  254.     BEGIN
  255.         kw:=0;
  256.         khr:=0;
  257.         GOTO 99;
  258.     END;
  259.     FOR i:=1 TO NSizes-1 DO BEGIN
  260.         IF ShaftDia <= NomDia[i] THEN BEGIN
  261.             kw:=w[i];
  262.             khr:=hr[i];
  263.             GOTO 99;
  264.         END;
  265.     END;
  266.     kw:=w[NSizes];
  267.     khr:=hr[NSizes];
  268. 99:END;
  269.  
  270. Procedure GetInfo;
  271. {
  272. This procedure displays the main dialog box and retrieves the information.
  273. }
  274. LABEL 5,10,20,30,99;
  275. VAR
  276.     Item,NTimes : INTEGER;
  277.     RFlag : ARRAY[1..3] OF INTEGER;
  278.     Done : BOOLEAN;
  279.  
  280. Procedure SetRButton(i,Item : INTEGER);
  281. BEGIN
  282.     IF RFlag[i] <> Item THEN BEGIN
  283.         SetItem(RFlag[i],FALSE);
  284.         SetItem(Item,TRUE);
  285.         RFlag[i]:=Item;
  286.     END;
  287. END;
  288.  
  289. BEGIN
  290.     Done:=FALSE;
  291.     Abort:=FALSE;
  292.     NTimes:=Ntimes+1;
  293.     IF NTimes>1 THEN GOTO 5;
  294.  
  295.     Inch:=TRUE;
  296.     sf:=1.00;
  297.     NextClick:=TRUE;
  298.     CenterMark:=FALSE;
  299.     KeyType:=1;
  300.     KwyType:=1;
  301.     RFlag[1]:=15;
  302.     RFlag[2]:=18;
  303.     RFlag[3]:=23;
  304.  
  305.     5:GetDialog(1);
  306.     SetTitle('Keyways');
  307.     SetItem(12,NextClick);
  308.     SetItem(13,CenterMark);
  309.     SetItem(RFlag[1],TRUE);
  310.     SetItem(RFlag[2],TRUE);
  311.     SetItem(RFlag[3],TRUE);
  312.     SetField(6,Num2StrF(d_act));
  313.     SetField(26,Num2StrF(w_act));
  314.     SetField(28,Num2StrF(h_act));
  315.     IF Inch THEN
  316.     BEGIN
  317.         SetField(5,'Shaft Diameter (in.):');
  318.         SetField(25,'Nominal Key Size [width x height] (in.):');
  319.     END ELSE
  320.     BEGIN
  321.         SetField(5,'Shaft Diameter (mm):');
  322.         SetField(25,'Nominal Key Size [width x height] (mm):');
  323.     END;
  324.     IF NextClick THEN
  325.     BEGIN
  326.         SetField(9,'');
  327.         SetField(11,'');
  328.     END ELSE
  329.     BEGIN
  330.         SetField(9,Num2StrF(x0));
  331.         SetField(11,Num2StrF(y0));
  332.     END;
  333.     SelField(6);
  334.     10:REPEAT
  335.         DialogEvent(Item);
  336.         IF Item=1 THEN
  337.             Done:=TRUE;
  338.  
  339.         IF Item=2 THEN
  340.         BEGIN
  341.             Done:=TRUE;
  342.             Abort:=TRUE;
  343.         END;
  344.  
  345.         IF Item=6 THEN
  346.         BEGIN
  347.             OK:=ValidNumStr(GetField(6),d);
  348.             IF Inch THEN KeySizeInch(d,w,hr)
  349.             ELSE KeySizeMM(d,w,hr);
  350.             IF KeyType=2 THEN h:=hr
  351.             ELSE h:=w;
  352.             SetField(26,Num2StrF(w));
  353.             SetField(28,Num2StrF(h));
  354.         END;
  355.  
  356.         IF Item=9 THEN
  357.         BEGIN
  358.             IF NextClick THEN
  359.             BEGIN
  360.                 NextClick:=FALSE;
  361.                 SetItem(12,FALSE);
  362.                 SetField(9,Num2StrF(x0));
  363.                 SetField(11,Num2StrF(y0));
  364.                 SelField(9);
  365.             END;
  366.         END;
  367.  
  368.         IF Item=11 THEN
  369.         BEGIN
  370.             IF NextClick THEN BEGIN
  371.                 NextClick:=FALSE;
  372.                 SetItem(12,FALSE);
  373.                 SetField(9,Num2StrF(x0));
  374.                 SetField(11,Num2StrF(y0));
  375.                 SelField(9);
  376.             END;
  377.         END;
  378.  
  379.         IF Item=12 THEN
  380.         BEGIN
  381.             IF NOT NextClick THEN
  382.             BEGIN
  383.                 NextClick:=TRUE;
  384.                 SetItem(12,TRUE);
  385.                 SetField(9,'');
  386.                 SetField(11,'');
  387.                 SelField(6);
  388.             END ELSE
  389.             BEGIN
  390.                 NextClick:=FALSE;
  391.                 SetItem(12,FALSE);
  392.                 SetField(9,Num2StrF(x0));
  393.                 SetField(11,Num2StrF(y0));
  394.                 SelField(9);
  395.             END;
  396.         END;
  397.  
  398.         IF Item=13 THEN BEGIN
  399.             CenterMark:=NOT CenterMark;
  400.             SetItem(13,CenterMark);
  401.         END;
  402.  
  403.         IF (Item>14) AND (Item<17) THEN
  404.         BEGIN
  405.             SetRButton(1,Item);
  406.             KeyType:=Item-14;
  407.             OK:=ValidNumStr(GetField(6),d);
  408.             IF Inch THEN KeySizeInch(d,w,hr)
  409.             ELSE KeySizeMM(d,w,hr);
  410.             IF KeyType=2 THEN h:=hr
  411.             ELSE h:=w;
  412.             SetField(28,Num2StrF(h));
  413.         END;
  414.  
  415.         IF (Item>17) AND (Item<20) THEN
  416.         BEGIN
  417.             SetRButton(2,Item);
  418.             KwyType:=Item-17;
  419.         END;
  420.  
  421.         IF (Item=23) AND (NOT Inch) THEN
  422.         BEGIN
  423.             SetRButton(3,Item);
  424.             Inch:=TRUE;
  425.             SetField(5,'Shaft Diameter (in.):');
  426.             SetField(25,'Nominal key size [width x height] (in.):');
  427.             OK:=ValidNumStr(GetField(6),d);
  428.             IF Inch THEN KeySizeInch(d,w,hr)
  429.             ELSE KeySizeMM(d,w,hr);
  430.             IF KeyType=2 THEN h:=hr
  431.             ELSE h:=w;
  432.             SetField(26,Num2StrF(w));
  433.             SetField(28,Num2StrF(h));
  434.         END;
  435.  
  436.         IF (Item=24) AND (Inch) THEN
  437.         BEGIN
  438.             SetRButton(3,Item);
  439.             Inch:=FALSE;
  440.             SetField(5,'Shaft Diameter (mm):');
  441.             SetField(25,'Nominal key size [width x height] (mm):');
  442.             OK:=ValidNumStr(GetField(6),d);
  443.             IF Inch THEN KeySizeInch(d,w,hr)
  444.             ELSE KeySizeMM(d,w,hr);
  445.             IF KeyType=2 THEN h:=hr
  446.             ELSE h:=w;
  447.             SetField(26,Num2StrF(w));
  448.             SetField(28,Num2StrF(h));
  449.         END;
  450.  
  451.     UNTIL Done;
  452.     IF Abort THEN GOTO 99;
  453.     OK:=ValidNumStr(GetField(6),d);
  454.     IF d<=0 THEN  BEGIN
  455.         SysBeep;
  456.         Done:=FALSE;
  457.         SelField(6);
  458.         GOTO 10;
  459.     END;
  460.     OK:=ValidNumStr(GetField(9),x0);
  461.     OK:=ValidNumStr(GetField(11),y0);
  462.     OK:=ValidNumStr(GetField(26),w);
  463.     OK:=ValidNumStr(GetField(28),h);
  464.     ClrDialog;
  465. 99:END;
  466.  
  467.  
  468. Procedure CMark(Dia,x,y,sf : REAL);
  469. {
  470. This procedure draws a centermark.
  471. }
  472. CONST
  473.     k1c=0.25;
  474.     k2c=0.125;
  475.     k3c=0.0625;
  476. VAR
  477.     k1,k2,k3,L1,L2 : REAL;
  478. BEGIN
  479.     k1:=k1c*sf;
  480.     k2:=k2c*sf;
  481.     k3:=k3c*sf;
  482.     PushAttrs;
  483.     PenPat(2);
  484.     PenSize(5);
  485.     L1:=k1;
  486.     IF L1 > Dia/2 THEN L1:=0.5*Dia;
  487.     L2:=Dia/2 + k2 - k3 - L1/2;
  488.     Absolute;
  489.     MoveTo(x,y);
  490.     Relative;
  491.     Move(-(Dia/2+k2),0);
  492.     Line(L2,0);
  493.     Move(k3,0);
  494.     Line(L1,0);
  495.     Move(k3,0);
  496.     Line(L2,0);
  497.     Absolute;
  498.     MoveTo(x,y);
  499.     Relative;
  500.     Move(0,-(Dia/2+k2));
  501.     Line(0,L2);
  502.     Move(0,k3);
  503.     Line(0,L1);
  504.     Move(0,k3);
  505.     Line(0,L2+h/2);
  506.     PopAttrs;
  507. END;
  508.  
  509. {
  510. Main program.
  511. }
  512. BEGIN
  513.     DSelectAll;
  514.     KeyDialog;
  515.     SetCursor(ArrowC);
  516. {
  517. Get information from the dialog boxes.
  518. }
  519.     GetInfo;
  520.     IF Abort THEN GOTO 99;
  521. {
  522. Get drawing units and adjust parameters.
  523. }
  524.     GetUnits(UName,DA,Fmt,UPI,UM,UM2);
  525.     IF Inch THEN
  526.         sf:=UPI
  527.     ELSE
  528.         sf:=UPI/25.4;
  529.     d_act:=d;
  530.     w_act:=w;
  531.     h_act:=h;
  532.     d:=d*sf;
  533.     w:=w*sf;
  534.     h:=h*sf;
  535. {
  536. If next click was chosen, get center.
  537. }
  538.     IF NextClick THEN GetPt(x0,y0);
  539. {
  540. Calculate variables needed to draw keyway; if keyway size=0 draw a circle;
  541. }
  542.     IF w=0 THEN
  543.     BEGIN
  544.         Absolute;
  545.         MoveTo(x0,y0);
  546.         Relative;    
  547.         Arc(-d/2,d/2,d/2,-d/2,0,360);
  548.         GOTO 90;
  549.     END;
  550.     Alpha:=ArcSin(w/d);
  551.     Theta:=(Pi/2-Alpha)/2;
  552.     q1:=d*Cos(Alpha)/2;
  553.     q2:=d*Tan(Theta)/2;
  554.     IF KwyType=1 THEN q3:=q1+h/2
  555.     ELSE q3:=q1-h/2;
  556.  
  557.     x[1]:=-w/2;        y[1]:=q3;        R[1]:=0;
  558.     x[2]:=-w/2;        y[2]:=q1;        R[2]:=0;
  559.     x[3]:=-d/2;        y[3]:=q2;        R[3]:=d/2;
  560.     x[4]:=-d/2;        y[4]:=0;            R[4]:=0;
  561.     x[5]:=-d/2;        y[5]:=-d/2;    R[5]:=d/2;
  562.     FOR k:=6 TO 10 DO
  563.     BEGIN
  564.         x[k]:=-x[11-k];
  565.         y[k]:=y[11-k];
  566.         R[k]:=R[11-k];
  567.     END;
  568. {
  569. Draw keyway and shaft or hub.
  570. }
  571.     Absolute;
  572.     MoveTo(x0-d/2,y0);
  573.     ClosePoly;
  574.     BeginPoly;
  575.         FOR k:=1 TO 10 DO
  576.         BEGIN
  577.             IF R[k]=0 THEN
  578.                 LineTo(x0+x[k], y0+y[k])
  579.             ELSE
  580.                 ArcTo(x0+x[k], y0+y[k], R[k]);
  581.         END;
  582.     EndPoly;
  583.     90:IF CenterMark THEN BEGIN
  584.         CMark(d,x0,y0,sf);
  585.         Group;
  586.     END;
  587. 99:END;
  588.  
  589. RUN(Keyways);