home *** CD-ROM | disk | FTP | other *** search
- Procedure Spring;
- {
- (Windows version)
- ⌐1996, Diehl Graphsoft, Inc.
- Developed by Tom Urie
-
- This procedure draws a coil spring.
- }
-
- LABEL 10,20,30,99;
- VAR
- D,L,L1,L1a,wd,Theta,Theta2 : REAL;
- x0,y0,x,y,x1,y1,dx1,dy1,dx2,dy2,dx3,dy3,dx4,dy4 : REAL;
- dx,dy,dx1a,dy1a,dx2a,dy2a,dx3a,dy3a : REAL;
- xt,yt,dy5,dx5,dy6,FL : REAL;
- i,j,n,NCoils,Type : INTEGER;
- RFlag : ARRAY[1..2] OF INTEGER;
- Abort,Section,CFlag1 : BOOLEAN;
-
- Procedure SpringDialog;
- {
- This procedure defines the dialog box.
- }
- VAR
- Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2 : INTEGER;
-
- Procedure AlignScr(Width:INTEGER; VAR x1,x2:INTEGER);
- VAR
- scrx1,scry1,scrx2,scry2:INTEGER;
- BEGIN
- GetScreen(scrx1,scry1,scrx2,scry2);
- x1:=((scrx1+scrx2) div 2)-(Width div 2);
- x2:=x1+Width;
- END;
-
- Procedure MakeDialog;
- CONST
- y1=100;
- scnh=190; scnw=420;
- h=30;
- BEGIN
- AlignScr(scnw,x1,x2);
- y2:=y1+scnh;
- px1:=scnw-160;
- px2:=scnw-100;
- px3:=scnw-80;
- px4:=scnw-20;
- py1:=scnh-40;
- py2:=scnh-20;
-
- BeginDialog(1,1,x1,y1,x2,y2);
- AddButton('OK',1,1,px1,py1,px2,py2);
- AddButton('Cancel',2,1,px3,py1,px4,py2);
- AddField('Mean Diameter:',4,1,20,45-h,145,60-h);
- AddField('2.000',5,2,160,45-h,215,60-h);
- AddField('Pitch:',6,1,20,70-h,100,85-h);
- AddField('0.500',7,2,160,70-h,215,85-h);
- AddField('Wire Diameter:',8,1,20,95-h,155,110-h);
- AddField('0.3125',9,2,160,95-h,215,110-h);
- AddField('No. of Active Coils:',10,1,20,120-h,145,135-h);
- AddField('6',11,2,160,120-h,215,135-h);
- AddField('Type of Ends:',12,1,245,40-h,365,55-h);
- AddButton('Plain',13,3,245,65-h,300,80-h);
- AddButton('Squared by Bending',14,3,245,85-h,395,100-h);
- AddButton('Squared by Grinding',15,3,245,105-h,395,120-h);
- AddButton('Squared and Ground',16,3,245,125-h,395,140-h);
- AddButton('Section View',17,2,20,155-h,125,170-h);
- EndDialog
- END;
-
- BEGIN
- MakeDialog;
- END;
-
- Procedure GetInfo;
- {
- This procedure displays the dialog box and retrieves the information.
- }
- LABEL 10,99;
- VAR
- Value : REAL;
- Item : INTEGER;
- Done,OK : BOOLEAN;
-
- Procedure SetRButton(i,Item : INTEGER);
- BEGIN
- IF RFlag[i] <> Item THEN BEGIN
- SetItem(RFlag[i],FALSE);
- SetItem(Item,TRUE);
- RFlag[i]:=Item;
- END;
- END;
-
- BEGIN
- Type:=1;
- D:=1.3125;
- WD:=0.1875;
- L:=0.3215;
- NCoils:=10;
- Section:=FALSE;
- Done:=FALSE;
- Abort:=FALSE;
- RFlag[1]:=13;
- CFlag1:=FALSE;
- GetDialog(1);
- SetTitle('Coil Springs');
- SetItem(RFlag[1],TRUE);
- SetItem(17,CFlag1);
- SetField(5,Num2StrF(D));
- SetField(7,Num2StrF(L));
- SetField(9,Num2StrF(WD));
- SetField(11,Num2Str(0,NCoils));
- SelField(5);
- 10:REPEAT
- DialogEvent(Item);
- IF Item=1 then
- Done:=True;
- IF Item=2 then BEGIN
- Done:=TRUE;
- Abort:=TRUE;
- END;
- IF (Item > 12) AND (Item < 17) THEN BEGIN
- SetRButton(1,Item);
- Type:=Item-12;
- END;
- IF Item=17 THEN BEGIN
- SetItem(Item,NOT CFlag1);
- CFlag1:=NOT CFlag1;
- END;
- UNTIL Done;
- IF Abort THEN GOTO 99;
- OK:=ValidNumStr(Getfield(5),D);
- OK:=ValidNumStr(Getfield(7),L);
- OK:=ValidNumStr(Getfield(9),WD);
- OK:=ValidNumStr(Getfield(11),NCoils);
- IF (D<=0) OR (L<=0) OR (WD<=0) OR (NCoils<=0) THEN BEGIN
- SysBeep;
- Done:=FALSE;
- GOTO 10;
- END;
- Section:=CFlag1;
- 99:ClrDialog;
- END;
-
- {
- Main Program.
- }
- BEGIN
- DselectAll;
- {
- Display the dialog box and get the information.
- }
- SpringDialog;
- SetCursor(ArrowC);
- GetInfo;
- IF Abort THEN GoTo 99;
- PushAttrs;
- FillPat(1);
- {
- Get the location of the spring.
- }
- GetPt(x0,y0);
- {
- Calculate the pitch angle and various information needed to draw the spring.
- }
- Theta:=ArcTan(L/(2*D));
- IF Theta < 0 THEN
- Theta:=-Theta;
- L1:=D/Cos(Theta)+wd;
- dx1:=wd*(Cos(Theta)+Sin(Theta))/2;
- dy1:=-wd*(Sin(Theta)-Cos(Theta))/2;
- dx2:=wd*Sin(Theta);
- dy2:=wd*Cos(Theta);
- dx3:=L1*Cos(Theta);
- dy3:=L1*Sin(Theta);
- xt:=x0;
- yt:=y0;
- Absolute;
- ClosePoly;
- n:=NCoils+1;
- IF (Type=2) OR (Type=4) THEN
- n:=n+1;
- x:=xt;
- {
- Draw coils.
-
- Types 1 & 3.
- }
- IF (Type=2) OR (Type=4) THEN GOTO 10;
- FOR i:=1 TO 2 DO BEGIN
- n:=n-1;
- y:=yt+L;
- FOR j:=1 TO n DO BEGIN
- y:=y-L;
- Absolute;
- IF i=1 THEN
- MoveTo(x-dy1,y-dx1)
- ELSE
- MoveTo(x-dx1,y-dy1);
- Relative;
- IF i=1 THEN BEGIN
- IF NOT Section THEN BEGIN
- BeginPoly;
- ArcTo(0,0,wd/2);
- ArcTo(-dx2,dy2,wd/2);
- ArcTo(dx3,dy3,wd/2);
- ArcTo(dx2,-dy2,wd/2);
- EndPoly;
- END;
- END
- ELSE BEGIN
- BeginPoly;
- ArcTo(0,0,wd/2);
- ArcTo(dx2,dy2,wd/2);
- ArcTo(dx3,-dy3,wd/2);
- ArcTo(-dx2,-dy2,wd/2);
- EndPoly;
- END;
- END;
- END;
- GOTO 20;
- {
- Types 2 & 4.
- }
- 10:dy4:=-dy1+dy2-dy3/2+wd/2;
- IF dy4 < L/2 THEN
- dy4:=L/2;
- Theta2:=ArcTan(dy4/D);
- IF Theta2 < 0 THEN
- Theta2:=-Theta2;
- L1a:=D/Cos(Theta2)+wd;
- dx1a:=wd*(Cos(Theta2)+Sin(Theta2))/2;
- dy1a:=-wd*(Sin(Theta2)-Cos(Theta2))/2;
- dx2a:=wd*Sin(Theta2);
- dy2a:=wd*Cos(Theta2);
- dx3a:=L1a*Cos(Theta2);
- dy3a:=L1a*Sin(Theta2);
- FOR i:=1 TO 2 DO BEGIN
- n:=n-1;
- y:=yt+L;
- FOR j:=1 TO n DO BEGIN
- y:=y-L;
- Absolute;
- IF i=1 THEN BEGIN
- IF j=n THEN
- y:=y-(dy4-L/2);
- IF (j=1) OR (j=n) THEN
- MoveTo(x-dy1a,y-dx1a)
- ELSE
- MoveTo(x-dy1,y-dx1);
- END
- ELSE
- MoveTo(x-dx1,y-dy1);
- Relative;
- IF i=1 THEN BEGIN
- IF NOT Section THEN BEGIN
- IF (j=1) OR (j=n) THEN BEGIN
- IF Type <> 4 THEN BEGIN
- BeginPoly;
- ArcTo(0,0,wd/2);
- ArcTo(-dx2a,dy2a,wd/2);
- ArcTo(dx3a,dy3a,wd/2);
- ArcTo(dx2a,-dy2a,wd/2);
- EndPoly;
- END;
- END
- ELSE BEGIN
- BeginPoly;
- ArcTo(0,0,wd/2);
- ArcTo(-dx2,dy2,wd/2);
- ArcTo(dx3,dy3,wd/2);
- ArcTo(dx2,-dy2,wd/2);
- EndPoly;
- END;
- END;
- END
- ELSE BEGIN
- BeginPoly;
- ArcTo(0,0,wd/2);
- ArcTo(dx2,dy2,wd/2);
- ArcTo(dx3,-dy3,wd/2);
- ArcTo(-dx2,-dy2,wd/2);
- EndPoly;
- END;
- END;
- END;
- {
- Draw ends.
- }
- 20:Absolute;
- {
- Type 1.
- }
- IF Type=1 THEN BEGIN
- MoveTo(xt-dx1,yt-(NCoils-1)*L-dy1);
- Relative;
- ClosePoly;
- BeginPoly;
- ArcTo(0,0,wd/2);
- ArcTo(dx2,dy2,wd/2);
- LineTo(dx3/2,-dy3/2);
- LineTo(-dx2,-dy2);
- EndPoly;
- Absolute;
- MoveTo(xt+D+dy1,yt+L/2-dx1);
- Relative;
- BeginPoly;
- ArcTo(0,0,wd/2);
- ArcTo(dx2,dy2,wd/2);
- LineTo(-dx3/2,dy3/2);
- LineTo(-dx2,-dy2);
- EndPoly;
- END
- {
- Type 2.
- }
- ELSE IF Type=2 THEN BEGIN
- Absolute;
- ClosePoly;
- MoveTo(xt-wd/2,yt-(NCoils-1/2)*L-dy4-wd/2);
- Relative;
- ClosePoly;
- BeginPoly;
- ArcTo(0,0,wd/2);
- ArcTo(0,wd,wd/2);
- LineTo((D+wd)/2,0);
- LineTo(0,-wd);
- EndPoly;
- Absolute;
- MoveTo(xt+D+wd/2,yt+dy4-wd/2);
- Relative;
- BeginPoly;
- ArcTo(0,0,wd/2);
- ArcTo(0,wd,wd/2);
- LineTo(-(D+wd)/2,0);
- LineTo(0,-wd);
- EndPoly;
- END
- {
- Type 3.
- }
- ELSE IF Type=3 THEN BEGIN
- dx3:=D/2+dx1-dx2;
- dy3:=dx3*Tan(Theta);
- dx4:=D/2+wd*Sin(Theta)/2;
- dy4:=wd/2-dy1+dy2-dy3;
- IF dy4 < 0 THEN BEGIN
- dy3:=wd/2+dy2-dy1;
- dx3:=dy3/Tan(Theta);
- dy4:=0;
- dx4:=dx3+dx2-dx1+wd*Sin(Theta)/4;
- END;
- MoveTo(xt-dx1,yt-(NCoils-1)*L-dy1);
- Relative;
- ClosePoly;
- BeginPoly;
- ArcTo(0,0,wd/2);
- ArcTo(dx2,dy2,wd/2);
- LineTo(dx3,-dy3);
- IF dy4 <> 0 THEN
- LineTo(0,-dy4);
- LineTo(-dx4,0);
- EndPoly;
- Absolute;
- MoveTo(xt+D+dx1,yt+L/2+dy1);
- Relative;
- BeginPoly;
- ArcTo(0,0,wd/2);
- ArcTo(-dx2,-dy2,wd/2);
- LineTo(-dx3,dy3);
- IF dy4 <> 0 THEN
- LineTo(0,dy4);
- LineTo(dx4,0);
- EndPoly;
- END
- {
- Type 4.
- }
- ELSE BEGIN
- dx3:=D+dx1-dx2;
- dy3:=dx3*Tan(Theta);
- dx4:=D+wd*Sin(Theta);
- dy4:=wd/2-dy1+dy2-dy3;
- IF dy4 < 0 THEN BEGIN
- dy3:=wd/2+dy2-dy1;
- dx3:=dy3/Tan(Theta);
- dy4:=0;
- dx4:=dx3+dx2-dx1+wd*Sin(Theta)/4;
- END;
- MoveTo(xt-dx1,yt-(NCoils-1)*L-wd/Cos(Theta)-dy1);
- Relative;
- ClosePoly;
- BeginPoly;
- ArcTo(0,0,wd/2);
- ArcTo(dx2,dy2,wd/2);
- LineTo(dx3,-dy3);
- IF dy4 <> 0 THEN
- LineTo(0,-dy4);
- LineTo(-dx4,0);
- EndPoly;
- Absolute;
- MoveTo(xt+D+dx1,yt-L/2+wd/Cos(Theta)+dy1);
- Relative;
- BeginPoly;
- ArcTo(0,0,wd/2);
- ArcTo(-dx2,-dy2,wd/2);
- LineTo(-dx3,dy3);
- IF dy4 <> 0 THEN
- LineTo(0,dy4);
- LineTo(dx4,0);
- EndPoly;
- END;
- {
- Draw sections.
- }
- IF NOT Section THEN GOTO 30;
- IF (Type=1) OR (Type=3) THEN
- dy:=L/2
- ELSE IF Type=2 THEN
- dy:=dy4
- ELSE
- dy:=-L/2+wd/Cos(Theta);
- yt:=yt+dy;
- j:=1;
- n:=NCoils;
- IF (Type=2) OR (Type=4) THEN
- n:=n+1;
- Absolute;
- MoveTo(xt+D,yt);
- Relative;
- Fillpat(27);
- For i:=1 TO 2*n DO BEGIN
- j:=-1*j;
- Arc(-wd/2,wd/2,wd/2,-wd/2,0,360);
- IF (i=1) OR (i=2*n-1) THEN
- Move(j*D,-dy)
- ELSE
- Move(j*D,-L/2);
- END;
- 30:Group;
- {
- Calculate length.
- }
- IF Type=1 THEN
- FL:=Ncoils*L+wd*Cos(Theta)
- ELSE IF Type=2 THEN
- FL:=(Ncoils-1/2)*L+2*dy4+wd
- ELSE IF Type=3 THEN
- FL:=(Ncoils-1/2)*L+wd
- ELSE
- FL:=L*(NCoils-3/2)+wd*(1+2/Cos(Theta));
- Message('Length = ',FL:10:3);
- PopAttrs;
- 99:END;
-
- RUN(Spring);
-