home *** CD-ROM | disk | FTP | other *** search
/ PC & Mediji 1997 January / PCM_9701.iso / programi / minicad / minicad.1 / CRE_CIRC.MPC < prev    next >
Encoding:
Text File  |  1996-04-30  |  4.9 KB  |  224 lines

  1. Procedure CreateCircle;
  2. {
  3. (Windows version)
  4. @1996, Diehl Graphsoft, Inc.
  5. Developed by Tom Urie
  6.  
  7. This procedure allows the user to place an unlimited number of circles of the same size on a drawing.
  8. }
  9. LABEL 10,99;
  10. CONST
  11.     k1=0.25;
  12.     k2=0.125;
  13.     k3=0.0625;
  14. VAR
  15.     x,y,x1,y1,xm,ym,Dia : REAL;
  16.     cCode : INTEGER;
  17.     Abort,OK,NextClick,CenterMark : BOOLEAN;
  18.  
  19. Procedure CircleDialog;
  20. {
  21. This procedure creates the dialog box.
  22. }
  23. VAR
  24.     Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER;
  25.  
  26. Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER);
  27. VAR
  28.     scrx1,scry1,scrx2,scry2:INTEGER;
  29. BEGIN
  30.     GetScreen(scrx1,scry1,scrx2,scry2);
  31.     x1:=((scrx1+scrx2) div 2)-(Width div 2);
  32.     x2:=x1+Width; 
  33. END;
  34.  
  35. Procedure MakeDialog;
  36. {
  37. This procedure defines the dialog box.
  38. }
  39. CONST
  40.     y1=100;
  41.     scnh=225; scnw=230;
  42.     h=30;
  43. BEGIN
  44.     AlignScr(scnw,x1,x2);
  45.     y2:=y1+scnh;
  46.     px3:=(scnw div 2) - 70;
  47.     px4:=(scnw div 2) - 10;
  48.     px1:=(scnw div 2) + 10;
  49.     px2:=(scnw div 2) + 70;
  50.     py1:=scnh-40;
  51.     py2:=scnh-20;
  52.  
  53.     BeginDialog(1,1,x1,y1,x2,y2);
  54.         AddButton('OK',1,1,px3,py1,px4,py2);
  55.         AddButton('Cancel',2,1,px1,py1,px2,py2);
  56.         AddField('Diameter:',5,1,20,45-h,100,60-h);
  57.         AddField('',6,2,105,45-h,205,60-h);
  58.         AddField('Location:',7,1,20,75-h,130,90-h);
  59.         AddField('X:',8,1,20,100-h,50,115-h);
  60.         AddField('',9,2,55,100-h,155,115-h);
  61.         AddField('Y:',10,1,20,125-h,50,140-h);
  62.         AddField('',11,2,55,125-h,155,140-h);
  63.         AddButton('Next Click(s)',12,3,20,155-h,120,170-h);
  64.         AddButton('Show Center Mark',13,2,20,180-h,170,195-h);
  65.     EndDialog;
  66. END;
  67.  
  68. BEGIN
  69.     MakeDialog;
  70. END;
  71.  
  72. Procedure GetInfo;
  73. {
  74. This procedure displays the dialog box and retrieves the information.
  75. }
  76. LABEL 10,20,30,99;
  77. VAR
  78.     Item : INTEGER;
  79.     Done : BOOLEAN;
  80.  
  81. BEGIN
  82.     Done:=FALSE;
  83.     Abort:=FALSE;
  84.     NextClick:=TRUE;
  85.     CenterMark:=FALSE;
  86.     GetDialog(1);
  87.     SetTitle('Create Circle');
  88.     SetItem(12,NextClick);
  89.     SetField(6,Num2Str(4,Dia));
  90.     SelField(6);
  91.     REPEAT
  92.         DialogEvent(Item);
  93.         IF Item = 1 THEN
  94.             Done:=TRUE;
  95.         IF Item = 2 THEN BEGIN
  96.             Done:=TRUE;
  97.             Abort:=TRUE;
  98.         END;
  99.         IF Item = 9 THEN BEGIN
  100.             IF NextClick THEN BEGIN
  101.                 NextClick:=FALSE;
  102.                 SetItem(12,FALSE);
  103.                 SetField(9,Num2StrF(x));
  104.                 SetField(11,Num2StrF(y));
  105.                 SelField(9);
  106.             END;
  107.         END;
  108.         IF Item = 11 THEN BEGIN
  109.             IF NextClick THEN BEGIN
  110.                 NextClick:=FALSE;
  111.                 SetItem(12,FALSE);
  112.                 SetField(9,Num2StrF(x));
  113.                 SetField(11,Num2StrF(y));
  114.                 SelField(9);
  115.             END;
  116.         END;
  117.         IF Item = 12 THEN BEGIN
  118.             IF NOT NextClick THEN BEGIN
  119.                 NextClick:=TRUE;
  120.                 SetItem(12,TRUE);
  121.                 SetField(9,'');
  122.                 SetField(11,'');
  123.                 SelField(6);
  124.             END
  125.             ELSE BEGIN
  126.                 NextClick:=FALSE;
  127.                 SetItem(12,FALSE);
  128.                 SetField(9,Num2StrF(x));
  129.                 SetField(11,Num2StrF(y));
  130.                 SelField(9);
  131.             END;
  132.         END;
  133.         IF Item = 13 THEN BEGIN
  134.             CenterMark:=NOT CenterMark;
  135.             SetItem(13,CenterMark);
  136.         END;
  137.     UNTIL Done;
  138.     IF Abort THEN GOTO 99;
  139.     OK:=ValidNumStr(GetField(6),Dia);
  140.     IF Dia <= 0 THEN BEGIN
  141.         Sysbeep;
  142.         GOTO 10;
  143.     END;
  144.     OK:=ValidNumStr(GetField(9),x);
  145.     OK:=ValidNumStr(GetField(11),y);
  146. 99:ClrDialog;
  147. END;
  148.  
  149. Procedure CMark(Dia,x,y : REAL);
  150. VAR
  151.     L1,L2 : REAL;
  152. BEGIN
  153.     PushAttrs;
  154.     PenPat(2);
  155.     PenSize(5);
  156.     L1:=k1;
  157.     IF L1 > Dia/2 THEN L1:=0.5*Dia;
  158.     L2:=Dia/2 + k2 - k3 - L1/2;
  159.     Absolute;
  160.     MoveTo(x,y);
  161.     Relative;
  162.     Move(-(Dia/2+k2),0);
  163.     Line(L2,0);
  164.     Move(k3,0);
  165.     Line(L1,0);
  166.     Move(k3,0);
  167.     Line(L2,0);
  168.     Absolute;
  169.     MoveTo(x,y);
  170.     Relative;
  171.     Move(0,-(Dia/2+k2));
  172.     Line(0,L2);
  173.     Move(0,k3);
  174.     Line(0,L1);
  175.     Move(0,k3);
  176.     Line(0,L2);
  177.     PopAttrs;
  178. END;
  179.  
  180. {
  181. Main Program.
  182. }
  183. BEGIN
  184.     DSelectAll;
  185. {
  186. Display dialog box.
  187. }
  188.     CircleDialog;
  189.     SetCursor(ArrowC);
  190. {
  191. Get information from the dialog box.
  192. }
  193.     GetInfo;
  194.     IF Abort THEN GOTO 99;
  195.     SetCursor(SmCrossC);
  196.     x1:=9999;
  197.     y1:=9999;
  198. {
  199. If next click was chosen, get center. If same as previous center, terminate program.
  200. }
  201.     10:IF NextClick THEN BEGIN
  202.         GetPt(x,y);
  203.         IF (x=x1) AND (y=y1) THEN GOTO 99;
  204.     END;
  205.     Absolute;
  206. {
  207. Draw circles.
  208. }
  209.     MoveTo(x,y);
  210.     Relative;
  211.     Arc(-Dia/2,Dia/2,Dia/2,-Dia/2,0,360);
  212.     IF CenterMark THEN BEGIN
  213.         CMark(Dia,x,y);
  214.         Group;
  215.         DSelectAll;
  216.     END;
  217.     Redraw;
  218.     x1:=x;
  219.     y1:=y;
  220.     IF NextClick THEN GOTO 10;
  221. 99:END;
  222.  
  223. RUN(CreateCircle);
  224.