home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 March
/
Chip_1998-03_cd.bin
/
tema
/
MINICAD
/
MC7DEMO
/
MINICAD.1
/
MACH_SCR.MPC
< prev
next >
Wrap
Text File
|
1997-04-30
|
28KB
|
1,499 lines
Procedure MachineScrews;
{
(c)1997, Diehl Graphsoft, Inc.
Developed by Tom Urie
This procedure draws various types of slotted machine screws.
}
LABEL 10,90,99;
CONST
maxPoints = 10;
k1= 0.3333;
k2 = 0.132; {Used to determine thickness of flange of Metric hex flange head.}
nDataFiles = 12;
VAR
a,b,c,d,di,f,j,h,h1,h2,L,TL,p,r,rf,s,t,td,u,w : REAL;
tpi,tpic,tpif,Theta,x0,y0 : REAL;
x,y,Rt,xt,yt : ARRAY[1..maxPoints] OF REAL;
PathLength : INTEGER;
i,nThreads,Type,ThdType,View : INTEGER;
Size,Sz,Size1,Pathname : STRING;
SizeNotFound,Abort,Inch,FirstTime,ShowThreads,ShowSlot,UNC : BOOLEAN;
SF,UPI : REAL;
Fmt : INTEGER;
UM,UM2 : STRING;
UName,DA : LONGINT;
Procedure MachScrDialogs;
{
This procedure creates the dialog boxes.
}
VAR
Width,x1,y1,x2,y2,px1,px2,px3,px4,py1,py2,py3,py4 : 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 LocateButtons(DialogType,scnh,scnw : INTEGER);
{
This procedure locates the 'OK' and 'Cancel' buttons.
}
VAR
v1,v2,v3,v4 : INTEGER;
Mac : BOOLEAN;
Procedure Swap(VAR m1,m2,m3,m4 : INTEGER);
VAR
Temp : INTEGER;
BEGIN
Temp:=m1;
m1:=m3;
m3:=Temp;
Temp:=m2;
m2:=m4;
m4:=Temp;
END; {of Swap}
BEGIN
Mac:=FALSE;
PathName:='External\Data\';
GetVersion(v1,v2,v3,v4);
IF v4 = 1 THEN
BEGIN
Mac:=TRUE;
PathName:=':Externals:External Data:';
END;
IF DialogType = 1 THEN
BEGIN
px1:=(scnw DIV 2) - 80;
px2:=(scnw DIV 2) - 10;
px3:=(scnw DIV 2) + 10;
px4:=(scnw DIV 2) + 80;
IF Mac THEN SWAP(px1,px2,px3,px4);
py1:=scnh-40;
py2:=scnh-20;
py3:=py1;
py4:=py2;
END ELSE IF DialogType = 2 THEN
BEGIN
px1:=scnw - 180;
px2:=scnw - 110;
px3:=scnw - 90;
px4:=scnw - 20;
IF Mac THEN SWAP(px1,px2,px3,px4);
py1:=scnh-40;
py2:=scnh-20;
py3:=py1;
py4:=py2;
END ELSE
BEGIN
px1:=scnw - 90;
px2:=scnw - 20;
px3:=px1;
px4:=px2;
py1:=scnh -70;
py2:=scnh - 50;
py3:=scnh - 40;
py4:=scnh - 20;
IF Mac THEN SWAP(py1,py2,py3,py4);
END;
END; {of Locate Buttons}
Procedure MakeDialogs;
{
This procedure defines the dialog boxes.
}
CONST
y1=100;
scnh=380;
scnw=300;
DialogType = 1;
VAR
h : INTEGER;
BEGIN
AlignScr(scnw,x1,x2);
y2:=y1+scnh;
LocateButtons(DialogType,scnh,scnw);
{
Inch dialog box.
}
BeginDialog(1,1,x1,y1,x2,y2);
AddButton('OK',1,1,px1,py1,px2,py2);
AddButton('Cancel',2,1,px3,py3,px4,py4);
h:=15;
AddField('Type of Head:',4,1,20,44-h,145,60-h);
AddButton('Flat Csk (82 deg)',5,3,20,65-h,155,80-h);
AddButton('Flat Csk (100 deg)',6,3,20,85-h,155,100-h);
AddButton('Oval Countersunk',7,3,20,105-h,155,120-h);
AddButton('Fillister',13,3,20,125-h,165,140-h);
AddButton('Hex Washer (no slot)',8,3,20,145-h,165,160-h);
AddButton('Hex Washer (slotted)',9,3,20,165-h,165,180-h);
AddButton('Truss',10,3,175,65-h,250,80-h);
AddButton('Binding',11,3,175,85-h,250,100-h);
AddButton('Pan',12,3,175,105-h,250,120-h);
AddButton('Round',14,3,175,125-h,250,140-h);
AddButton('Hex (no slot)',15,3,175,145-h,270,160-h);
AddButton('Hex (slotted)',16,3,175,165-h,270,180-h);
h:=150;
AddField('Series:',19,1,20,154-h,65,170-h);
AddButton('Inch',20,3,70,155-h,120,170-h);
AddButton('Metric',21,3,125,155-h,190,170-h);
h:=185;
AddField('Size:',22,1,20,h-1,75,h+15);
AddField('',23,2,80,h,145,h+15);
AddField('in',50,1,153,h-1,175,h+15);
AddField('Length:',24,1,20,h+24,75,h+40);
AddField('',25,2,80,h+25,145,h+40);
AddField('in',51,1,153,h+25,175,h+40);
h:=-200;
AddField('View:',28,1,220,39-h,275,55-h);
AddButton('Top',29,3,220,80-h,275,95-h);
AddButton('Front',30,3,220,60-h,275,75-h);
AddButton('Side',31,3,220,100-h,275,115-h);
h:=235;
AddField('Threads:',34,1,20,h+4,75,h+20);
AddButton('UNC',35,3,80,h+4,130,h+20);
AddButton('UNF',36,3,135,h+4,200,h+20);
AddButton('Type 1 (dashed lines)',37,3,20,h+25,200,h+40);
AddButton('Type 2 (solid lines)',38,3,20,h+45,200,h+60);
AddButton('Type 3 (detailed threads)',39,3,20,h+65,190,h+80);
EndDialog;
{
Metric dialog box.
}
BeginDialog(2,1,x1,y1,x2,y2-20);
AddButton('OK',1,1,px1,py1-20,px2,py2-20);
AddButton('Cancel',2,1,px3,py3-20,px4,py4-20);
h:=15;
AddField('Type of Head:',4,1,20,44-h,145,60-h);
AddButton('Flat Csk (90 deg)',5,3,20,65-h,155,80-h);
AddButton('Oval Countersunk',7,3,20,85-h,155,100-h);
AddButton('Pan',12,3,20,105-h,155,120-h);
AddButton('Hex',15,3,20,125-h,165,140-h);
AddButton('Hex Flange',8,3,20,145-h,155,160-h);
h:=150;
AddField('Series:',19,1,20,154-h,65,170-h);
AddButton('Inch',20,3,70,155-h,120,170-h);
AddButton('Metric',21,3,125,155-h,190,170-h);
h:=165;
AddField('Size:',22,1,20,h-1,75,h+15);
AddField('',23,2,80,h,145,h+15);
AddField('mm',50,1,153,h-1,175,h+15);
AddField('Length:',24,1,20,h+24,75,h+40);
AddField('',25,2,80,h+25,145,h+40);
AddField('mm',51,1,153,h+25,175,h+40);
h:=-180;
AddField('View:',28,1,220,39-h,275,55-h);
AddButton('Top',29,3,220,80-h,275,95-h);
AddButton('Front',30,3,220,60-h,275,75-h);
AddButton('Side',31,3,220,100-h,275,115-h);
h:=215;
AddField('Threads:',34,1,20,h+4,75,h+20);
AddButton('Type 1 (dotted lines)',37,3,20,h+25,200,h+40);
AddButton('Type 2 (solid lines)',38,3,20,h+45,200,h+60);
AddButton('Type 3 (detailed threads)',39,3,20,h+65,190,h+80);
EndDialog;
END;
BEGIN
MakeDialogs;
END;
Function GetFilename(Type:INTEGER) : STRING;
{
This procedure assigns file names to the variable Filename.
}
VAR
k : INTEGER;
Filename : ARRAY[1..2,1..nDataFiles] OF STRING;
BEGIN
Filename[1,1]:='MFlat82E.txt';
Filename[1,2]:='MFlat00E.txt';
Filename[1,3]:='MOvalE.txt';
Filename[1,4]:='MHexWE.txt';
Filename[1,5]:='MHexWE.txt';
Filename[1,6]:='MTrussE.txt';
Filename[1,7]:='MBindE.txt';
Filename[1,8]:='MPanE.txt';
Filename[1,9]:='MFillE.txt';
Filename[1,10]:='MRoundE.txt';
Filename[1,11]:='MHexE.txt';
Filename[1,12]:='MHexE.txt';
Filename[2,1]:='MFlat90M.txt';
Filename[2,3]:='MOvalM.txt';
Filename[2,4]:='MHexFM.txt';
Filename[2,8]:='MPanM.txt';
Filename[2,11]:='MHexM.txt';
IF Inch THEN k:=1
ELSE k:=2;
GetFilename:=Filename[k,Type];
END;
Procedure GetData;
{
This procedure opens the data file and retreives the data.
}
LABEL 10,99;
VAR
File,Filename,WarningStr : STRING;
BEGIN
File:=GetFilename(Type);
Filename:=Concat(Pathname,File);
Open(Filename);
IF FndError THEN BEGIN
ClrDialog;
Sysbeep;
WarningStr:=Concat('The data file <',File,'> cannot be found. Check your Toolkit Manual for further explanation.');
AlrtDialog(WarningStr);
Abort:=TRUE;
GoTo 99;
END;
SizeNotFound:=FALSE;
WHILE NOT Eoln(Filename) DO
BEGIN
IF (Type = 1) OR (Type = 2) THEN
ReadLn(Sz,d,tpic,tpif,a,j,t)
ELSE IF (Type = 3) OR (Type = 10) OR (Type = 11) OR (Type = 12) THEN
ReadLn(Sz,d,tpic,tpif,a,h,j,t)
ELSE IF (Type = 4) OR (Type = 5) THEN
ReadLn(Sz,d,tpic,tpif,a,h,b,u,j,t)
ELSE IF (Type = 6) OR (Type = 8) THEN
ReadLn(Sz,d,tpic,tpif,a,h,r,j,t)
ELSE IF Type = 7 THEN
ReadLn(Sz,d,tpic,tpif,a,h,f,j,t)
ELSE IF Type = 9 THEN
ReadLn(Sz,d,tpic,tpif,a,h,s,j,t);
IF Sz = Size THEN GOTO 10;
END;
Close(Filename);
SysBeep;
AlrtDialog('That size is not available!');
SizeNotFound:=TRUE;
GoTo 99;
10:Close(Filename);
99:END;
Procedure GetInfo;
{
This procedure displays the main dialog box and retreives the information input by the user.
}
LABEL 10,20,99;
VAR
Done:Boolean;
Item:Integer;
RFlag : ARRAY [1..5] OF INTEGER;
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
Done:=FALSE;
Abort:=FALSE;
Type:=1;
View:=2;
ThdType:=1;
Inch:=TRUE;
UNC:=TRUE;
Size1:='3/8';
L:=1.000;
10:RFlag[1]:=Type+4;
RFlag[2]:=View+28;
IF UNC THEN
RFlag[4]:=35
ELSE
RFlag[4]:=36;
RFlag[5]:=ThdType+36;
IF Inch THEN
BEGIN
RFlag[3]:=20;
GetDialog(1);
END ELSE
BEGIN
RFlag[3]:=21;
GetDialog(2);
END;
SetTitle('Machine Screws');
SetItem(RFlag[1],TRUE);
SetItem(RFlag[2],TRUE);
SetItem(RFlag[3],TRUE);
IF Inch THEN
SetItem(RFlag[4],TRUE);
SetItem(RFlag[5],TRUE);
SetField(23,Size1);
SetField(25,Num2Str(3,L));
20:SelField(23);
REPEAT
DialogEvent(Item);
IF Item=1 then
Done:=TRUE;
IF Item=2 THEN
BEGIN
Done:=TRUE;
Abort:=TRUE;
END;
IF (Item > 4) AND (Item < 17) THEN
BEGIN
SetRButton(1,Item);
Type:=Item-4;
END;
IF (Item > 28) AND (Item < 32) THEN
BEGIN
SetRButton(2,Item);
View:=Item-28;
END;
IF (Item = 20) AND (NOT Inch) THEN
BEGIN
Inch:=TRUE;
SetRButton(3,Item);
ClrDialog;
GetDialog(1);
GOTO 10;
END;
IF (Item = 21) AND (Inch) THEN
BEGIN
Inch:=FALSE;
SetRButton(3,Item);
ClrDialog;
IF (Type=2) OR (Type=6) OR (Type=7) OR (Type=9) OR (Type=10) THEN
BEGIN;
Type:=1;
RFlag[1]:=5;
END;
GetDialog(2);
GOTO 10;
END;
IF (Item = 35) OR (Item = 36) THEN
BEGIN
SetRButton(4,Item);
IF Item = 35 THEN UNC:=TRUE
ELSE UNC:=FALSE;
END;
IF (Item > 36) AND (Item < 40) THEN
BEGIN
SetRButton(5,Item);
ThdType:=Item-36;
END;
UNTIL Done;
IF Abort THEN GOTO 99;
Size1:=GetField(23);
Size:=Concat('''',Size1,'''');
UprString(Size);
L:=Str2Num(GetField(25));
GetData;
IF Abort THEN GOTO 99;
IF SizeNotFound THEN
BEGIN
Done:=FALSE;
GOTO 20;
END;
99: ClrDialog;
END;
Procedure DrawPolyPoint(x,y,R : REAL);
{
This procedure draws a polyline point based on the value of R:
R = 0 ==> Corner point
R > 0 ==> Arc point of radius, R
R = -1 ==> Cubic spline point
R = any value less than 0 except -1
==> Bezier control point
}
BEGIN
IF R = 0 THEN
LineTo(x,y)
ELSE IF R > 0 THEN
ArcTo(x,y,R)
ELSE IF R = -1 THEN
CurveThrough(x,y)
ELSE
CurveTo(x,y);
END; {of DrawPolyPoint}
Function ThdLgthI(d,L,p : REAL) : REAL;
{
This procedure determines the length of threads for inch series machine screws.
}
BEGIN
IF d <= 0.125 THEN
BEGIN
IF L <= 3*d THEN
ThdLgthI:=L-p
ELSE IF L < 1.125+2*p THEN
ThdLgthI:=L-2*p
ELSE
ThdLgthI:=1.125;
END ELSE
BEGIN
IF L <= 3*d THEN
ThdLgthI:=L-p
ELSE IF L < 2.000+2*p THEN
ThdLgthI:=L-2*p
ELSE
ThdLgthI:=2.000;
END;
END;
Function ThdLgthM(d,L,p : REAL) : REAL;
{
This procedure determines the length of threads for mm series machine screws.
}
BEGIN
IF d <= 3 THEN
BEGIN
IF L <= 3*d THEN
ThdLgthM:=L-p
ELSE IF L < 30 THEN
ThdLgthM:=L-2*p
ELSE
ThdLgthM:=25;
END ELSE
BEGIN
IF L <= 3*d THEN
ThdLgthM:=L-p
ELSE IF L < 50 THEN
ThdLgthM:=L-2*p
ELSE
ThdLgthM:=38;
END;
END;
Procedure DrawTopView(Type : INTEGER);
{
This procedure draws the top view.
}
LABEL 10;
VAR
c,q1,q2,q3,Alpha,Beta : REAL;
i,k,nPoints : INTEGER;
BEGIN
{
Flat and Oval Countersunk Heads.
}
IF Type <= 3 THEN BEGIN
IF Type = 3 THEN
t:=t-h2;
Alpha:=ArcCos(j/a);
q1:=a*Tan(Alpha/2)/2;
q2:=a*Sin(Alpha)/2;
c:=a/2 - t*Tan(Theta/2);
q3:=Sqrt(c^2 - (j/2)^2);
Absolute;
MoveTo(x0+j/2, y0+q2);
Relative;
ClosePoly;
BeginPoly;
LineTo(0,0);
ArcTo((a-j)/2, -(q2-q1), a/2);
ArcTo(0, -2*q1, a/2);
LineTo(-(a-j)/2, -(q2-q1));
EndPoly;
Absolute;
MoveTo(x0-j/2, y0+q2);
Relative;
BeginPoly;
LineTo(0,0);
ArcTo(-(a-j)/2, -(q2-q1), a/2);
ArcTo(0, -2*q1, a/2);
LineTo((a-j)/2, -(q2-q1));
EndPoly;
Absolute;
MoveTo(x0-j/2, y0+q3);
Relative;
BeginPoly;
LineTo(0,0);
CurveThrough(j/2, (c-q3));
LineTo(j/2, -(c-q3));
LineTo(0,-2*q3);
CurveThrough(-j/2, -(c-q3));
LineTo(-j/2, (c-q3));
EndPoly;
END {of Flat and Oval Countersunk Heads}
{
Hex and Hex Washer Heads (no slots).
}
ELSE IF (Type = 4) OR (Type = 11) THEN
BEGIN
IF Type = 4 THEN
BEGIN
Absolute;
MoveTo(x0,y0);
Relative;
Arc(-b/2,b/2,b/2,-b/2,0,360);
END;
Absolute;
MoveTo(x0-w/2, y0);
Closepoly;
Poly(f,#-60, f,#0, f,#60, f,#120, f,#-180);
Absolute;
MoveTo(x0,y0);
Relative;
Arc(-a/2,a/2,a/2,-a/2,0,360);
END
{
Hex and Hex Washer Heads (slotted).
}
ELSE IF (Type = 5) OR (Type = 12) THEN
BEGIN
Alpha:=ArcCos(j/a);
q1:=a*Tan(Alpha/2)/2;
q2:=a*Sin(Alpha)/2;
c:=a/2 - t*Tan(Theta/2);
q3:=Sqrt(c^2 - (j/2)^2);
IF Type = 5 THEN
BEGIN
Absolute;
MoveTo(x0,y0);
Relative;
Arc(-b/2,b/2,b/2,-b/2,0,360);
END;
Absolute;
MoveTo(x0-w/2, y0);
Closepoly;
Poly(f,#-60, f,#0, f,#60, f,#120, f,#-180);
Absolute;
MoveTo(x0+j/2, y0+q2);
Relative;
ClosePoly;
BeginPoly;
LineTo(0,0);
ArcTo((a-j)/2, -(q2-q1), a/2);
ArcTo(0, -2*q1, a/2);
LineTo(-(a-j)/2, -(q2-q1));
EndPoly;
Absolute;
MoveTo(x0-j/2, y0+q2);
Relative;
BeginPoly;
LineTo(0,0);
ArcTo(-(a-j)/2, -(q2-q1), a/2);
ArcTo(0, -2*q1, a/2);
LineTo((a-j)/2, -(q2-q1));
EndPoly;
END
{
Truss, Binding and Round Heads.
}
ELSE IF (Type = 6) OR (Type = 7) OR (Type = 10) THEN
BEGIN
IF Type = 7 THEN
BEGIN
c:=a/2 - (h-t)*Tan(Deg2Rad(5));
Alpha:=Rad2Deg(ArcCos(j/b));
END ELSE
c:=Sqrt(r^2 - (r-t)^2);
q1:=Sqrt(c^2 - (j/2)^2);
Absolute;
MoveTo(x0,y0);
Relative;
Arc(-a/2,a/2,a/2,-a/2,0,360);
IF Type = 7 THEN
BEGIN
Arc(-b/2,b/2,b/2,-b/2,-Alpha,2*Alpha);
Arc(-b/2,b/2,b/2,-b/2,180-Alpha,2*Alpha);
END;
Absolute;
MoveTo(x0-j/2, y0+q1);
Relative;
BeginPoly;
LineTo(0,0);
CurveThrough(j/2, (c-q1));
LineTo(j/2, -(c-q1));
LineTo(0,-2*q1);
CurveThrough(-j/2, -(c-q1));
LineTo(-j/2, (c-q1));
EndPoly;
END {of Truss, Binding and Round Heads}
{
Pan and Fillister Heads.
}
ELSE IF (Type = 8) OR (Type = 9) THEN
BEGIN
q1:=Sqrt(a^2 - j^2)/2;
Absolute;
MoveTo(x0,y0);
Relative;
Arc(-a/2,a/2,a/2,-a/2,0,360);
Move(j/2, q1);
LineTo(0, -2*q1);
Move(-j, 0);
LineTo(0, 2*q1);
END;
END;
Procedure DrawSideViewOfHead(Type : INTEGER);
{
This procedure draws the side view of the head.
}
LABEL 10;
VAR
ch,p1,p2,q1,q2 : REAL;
Alpha,Beta1,Beta2 : REAL;
k, nPoints : INTEGER;
BEGIN
{
Flat Countersunk Head.
}
IF (Type = 1) OR (Type = 2) THEN BEGIN
y0:=y0-h;
Absolute;
MoveTo(x0-d/2, y0);
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
LineTo(-(a-d)/2, h);
IF View = 2 THEN
BEGIN
LineTo((a-j)/2, 0);
LineTo(0, -t);
LineTo(j, 0);
LineTo(0, t);
LineTo((a-j)/2 ,0);
END ELSE
LineTo(a, 0);
LineTo(-(a-d)/2, -h);
EndPoly;
END {of Flat Countersunk Head}
{
Oval Countersunk Head.
}
ELSE IF Type = 3 THEN
BEGIN
IF View = 3 THEN
j:=0;
Alpha:=ArcSin(a/(2*r));
Beta1:=ArcCos(a/(2*r));
Beta2:=ArcSin(j/(2*r));
Alpha:=Pi/2 - (Beta1+Beta2);
p1:=r*Sin(Beta2 + Alpha/2)/Cos(Alpha/2);
q1:=r*Cos(Beta2 + Alpha/2)/Cos(Alpha/2) - r*Sin(Beta1);
q2:=r*(Cos(Beta2)-Sin(Beta1));
x[1]:=-d/2; y[1]:=0; Rt[1]:=0;
x[2]:=-a/2; y[2]:=h1; Rt[2]:=0;
x[3]:=-p1; y[3]:=h1+q1; Rt[3]:=r;
IF View = 2 THEN
BEGIN
nPoints:=10;
x[4]:=-j/2; y[4]:=h1+q2; Rt[4]:=0;
x[5]:=-j/2; y[5]:=h-t; Rt[5]:=0;
x[6]:=j/2; y[6]:=h-t; Rt[6]:=0;
x[7]:=j/2; y[7]:=h1+q2; Rt[7]:=0;
x[8]:=p1; y[8]:=h1+q1; Rt[8]:=r;
x[9]:=a/2; y[9]:=h1; Rt[9]:=0;
x[10]:=d/2; y[10]:=0; Rt[10]:=0;
END ELSE
BEGIN
nPoints:=6;
x[4]:=p1; y[4]:=h1+q1; Rt[4]:=r;
x[5]:=a/2; y[5]:=h1; Rt[5]:=0;
x[6]:=d/2; y[6]:=0; Rt[6]:=0;
END;
y0:=y0-h1;
ClosePoly;
Absolute;
BeginPoly;
FOR k:=1 TO nPoints DO
BEGIN
xt[k]:=x0+x[k]; yt[k]:=y0+y[k];
DrawPolyPoint(xt[k],yt[k],Rt[k]);
END;
EndPoly;
Absolute;
MoveTo(x0-a/2,y0+h1);
Relative;
IF View = 2 THEN
BEGIN
LineTo((a-j)/2, 0);
MoveTo(j, 0);
LineTo((a-j)/2, 0);
END ELSE
LineTo(a, 0);
END {of Oval Countersunk Head}
{
Hex and Hex Washer Heads.
}
ELSE IF (Type = 4) OR (Type = 5) OR (Type = 11) OR (Type = 12) THEN BEGIN
ch:=(w-a)*Tan(Pi/6)/2;
p1:=(w+f)/4;
IF (Type = 4) AND (NOT Inch) THEN BEGIN
c:=k2*(h+u);
u:=u-ch;
h:=h+ch;
END ELSE
c:=u;
IF View = 3 THEN BEGIN
Absolute;
MoveTo(x0-a/2, y0+u);
Relative;
IF Inch THEN ClosePoly
ELSE OpenPoly;
Poly(0,0, 0,h, a,0, 0,-h);
Move(-a, (h-ch));
OpenPoly;
BeginPoly;
LineTo(0, 0);
CurveThrough(a/4, ch);
LineTo(a/4, -ch);
CurveThrough(a/4, ch);
LineTo(a/4, -ch);
EndPoly;
Move(-a/2, 0);
LineTo(0, -(h-ch));
IF (Type = 4) AND (NOT Inch) THEN
BEGIN
Absolute;
MoveTo(x0-b/2, y0+c);
Relative;
OpenPoly;
BeginPoly;
LineTo(0,0);
LineTo((b-a)/2, (u-c));
CurveThrough(a/4, ch);
LineTo(a/4, -ch);
CurveThrough(a/4, ch);
LineTo(a/4, -ch);
LineTo((b-a)/2, -(u-c));
EndPoly;
END;
GOTO 10;
END;
Absolute;
MoveTo(x0-w/2, y0+u);
Relative;
IF Inch THEN ClosePoly
ELSE OpenPoly;
BeginPoly;
LineTo(0, 0);
LineTo(0, (h-ch));
LineTo((w-a)/2, ch);
IF (Type = 5) OR (Type = 12) THEN
BEGIN
LineTo((a-j)/2, 0);
LineTo(0, -t);
LineTo(j, 0);
LineTo(0, t);
LineTo((a-j)/2, 0);
END ELSE
LineTo(a, 0);
LineTo((w-a)/2, -ch);
LineTo(0,- (h-ch));
EndPoly;
Absolute;
MoveTo(x0-w/2, y0+u+(h-ch));
Relative;
OpenPoly;
IF (Type = 5) OR (Type = 12) THEN
BEGIN
BeginPoly;
LineTo(0, 0);
CurveThrough((w/2-p1), ch);
LineTo((p1-f/2), -ch);
CurveThrough(f/6, 2*ch/3);
LineTo((f/3 - j/2), ch/3);
EndPoly;
Move(j, 0);
BeginPoly;
LineTo(0, 0);
CurveThrough((f/3 - j/2), -ch/3);
LineTo(f/6, -2*ch/3);
CurveThrough((p1-f/2), ch);
LineTo((w/2-p1), -ch);
EndPoly;
END ELSE
BEGIN
BeginPoly;
LineTo(0, 0);
CurveThrough((w/2-p1), ch);
LineTo((p1-f/2), -ch);
CurveThrough(f/2, ch);
LineTo(f/2, -ch);
CurveThrough((p1-f/2), ch);
LineTo((w/2-p1), -ch);
EndPoly;
END;
Absolute;
MoveTo(x0+f/2, y0+u);
Relative;
LineTo(0, (h-ch));
Move(-f, 0);
LineTo(0, -(h-ch));
IF (Type = 4) AND (NOT Inch) THEN
BEGIN
Absolute;
MoveTo(x0-b/2, y0+c);
Relative;
OpenPoly;
BeginPoly;
LineTo(0,0);
LineTo((b-w)/2, (u-c));
CurveThrough((w/2-p1), ch);
LineTo((p1-f/2), -ch);
CurveThrough(f/2, ch);
LineTo(f/2, -ch);
CurveThrough((p1-f/2), ch);
LineTo((w/2-p1), -ch);
LineTo((b-w)/2, -(u-c));
EndPoly;
END;
10:IF (Type = 4) OR (Type =5) THEN
BEGIN
Absolute;
MoveTo(x0-b/2, y0);
Relative;
Rect(0,0,b,c);
END;
END {of Hex and Hex Washer Heads}
{
Truss Head & Fillister Head.
}
ELSE IF (Type = 6) OR (Type = 9) THEN
BEGIN
IF View = 3 THEN
j:=0;
Beta1:=ArcCos(a/(2*r));
Beta2:=ArcSin(j/(2*r));
Alpha:=Pi/2 - (Beta1+Beta2);
p1:=r*Sin(Beta2 + Alpha/2)/Cos(Alpha/2);
q1:=r*Cos(Beta2 + Alpha/2)/Cos(Alpha/2) - r*Sin(Beta1);
q2:=r*(Cos(Beta2)-Sin(Beta1));
x[1]:=-a/2; y[1]:=-0; Rt[1]:=0;
x[2]:=-a/2; y[2]:=s; Rt[2]:=0;
x[3]:=-p1; y[3]:=s+q1; Rt[3]:=r;
IF View = 2 THEN
BEGIN
nPoints:=10;
x[4]:=-j/2; y[4]:=s+q2; Rt[4]:=0;
x[5]:=-j/2; y[5]:=h-t; Rt[5]:=0;
x[6]:=j/2; y[6]:=h-t; Rt[6]:=0;
x[7]:=j/2; y[7]:=s+q2; Rt[7]:=0;
x[8]:=p1; y[8]:=s+q1; Rt[8]:=r;
x[9]:=a/2; y[9]:=s; Rt[9]:=0;
x[10]:=a/2; y[10]:=0; Rt[10]:=0;
END ELSE
BEGIN
nPoints:=6;
x[4]:=p1; y[4]:=s+q1; Rt[4]:=r;
x[5]:=a/2; y[5]:=s; Rt[5]:=0;
x[6]:=a/2; y[6]:=0; Rt[6]:=0;
END;
ClosePoly;
Absolute;
BeginPoly;
FOR k:=1 TO nPoints DO
BEGIN
xt[k]:=x0+x[k]; yt[k]:=y0+y[k];
DrawPolyPoint(xt[k],yt[k],Rt[k]);
END;
EndPoly;
MoveTo(x0-a/2,y0+s);
Relative;
IF Type = 9 THEN
BEGIN
LineTo((a-j)/2,0);
MoveTo(j,0);
LineTo((a-j)/2,0);
END ELSE
LineTo(a,0);
END {of Truss Head & Fillister Head}
{
Binding Head.
}
ELSE IF TYPE = 7 THEN
BEGIN
IF View = 3 THEN
j:=0;
Beta1:=ArcCos(b/(2*r));
Beta2:=ArcSin(j/(2*r));
Alpha:=Pi/2 - (Beta1+Beta2);
p1:=r*Sin(Beta2 + Alpha/2)/Cos(Alpha/2);
q1:=r*Cos(Beta2 + Alpha/2)/Cos(Alpha/2) - r*Sin(Beta1);
q2:=r*(Cos(Beta2)-Sin(Beta1));
x[1]:=-a/2; y[1]:=-0; Rt[1]:=0;
x[2]:=-b/2; y[2]:=h1; Rt[2]:=0;
x[3]:=-p1; y[3]:=h1+q1; Rt[3]:=r;
IF View = 2 THEN
BEGIN
nPoints:=10;
x[4]:=-j/2; y[4]:=h1+q2; Rt[4]:=0;
x[5]:=-j/2; y[5]:=h-t; Rt[5]:=0;
x[6]:=j/2; y[6]:=h-t; Rt[6]:=0;
x[7]:=j/2; y[7]:=h1+q2; Rt[7]:=0;
x[8]:=p1; y[8]:=h1+q1; Rt[8]:=r;
x[9]:=b/2; y[9]:=h1; Rt[9]:=0;
x[10]:=a/2; y[10]:=0; Rt[10]:=0;
END ELSE
BEGIN
nPoints:=6;
x[4]:=p1; y[4]:=h1+q1; Rt[4]:=r;
x[5]:=b/2; y[5]:=h1; Rt[5]:=0;
x[6]:=a/2; y[6]:=0; Rt[6]:=0;
END;
ClosePoly;
Absolute;
BeginPoly;
FOR k:=1 TO nPoints DO
BEGIN
xt[k]:=x0+x[k]; yt[k]:=y0+y[k];
DrawPolyPoint(xt[k],yt[k],Rt[k]);
END;
EndPoly;
Absolute;
MoveTo(x0-b/2,y0+h1);
Relative;
LineTo((b-j)/2,0);
MoveTo(j,0);
LineTo((b-j)/2,0);
END {of Binding Head}
{
Pan Head.
}
ELSE IF TYPE = 8 THEN
BEGIN
x[1]:=-a/2; y[1]:=0; Rt[1]:=0;
x[2]:=-a/2; y[2]:=h; Rt[2]:=r;
IF View = 2 THEN
BEGIN
nPoints:=8;
x[3]:=-j/2; y[3]:=h; Rt[3]:=0;
x[4]:=-j/2; y[4]:=h-t; Rt[4]:=0;
x[5]:=j/2; y[5]:=h-t; Rt[5]:=0;
x[6]:=j/2; y[6]:=h; Rt[6]:=0;
x[7]:=a/2; y[7]:=h; Rt[7]:=r;
x[8]:=a/2; y[8]:=0; Rt[8]:=0;
END ELSE
BEGIN
nPoints:=4;
x[3]:=a/2; y[3]:=h; Rt[3]:=r;
x[4]:=a/2; y[4]:=0; Rt[4]:=0;
END;
ClosePoly;
Absolute;
BeginPoly;
FOR k:=1 TO nPoints DO
BEGIN
xt[k]:=x0+x[k]; yt[k]:=y0+y[k];
DrawPolyPoint(xt[k],yt[k],Rt[k]);
END;
EndPoly;
END {of Pan Head}
{
Round Head.
}
ELSE IF Type = 10 THEN
BEGIN
q1:=0.9*h;
Absolute;
MoveTo(x0-a/2, y0);
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
CurveTo(0, q1);
IF View = 2 THEN
BEGIN
LineTo((a-j)/2, (h-q1));
LineTo(0, -t);
LineTo(j, 0);
LineTo(0, t);
CurveTo((a-j)/2, -(h-q1));
END ELSE
CurveTo(a, 0);
LineTo(0, -q1);
EndPoly;
END; {of Round Head}
END;
Procedure DrawThdType1;
{
This procedure draws Type 1 threads (dashed lines).
}
VAR
ch,pd : REAL;
BEGIN
ch:=(d-di)*Tan(PI/4)/2;
pd:=d - td;
{Absolute;
MoveTo(x0-pd/2, y0);
Relative;
Rect(0,0,pd,-(L-TL));}
Absolute;
MoveTo((x0-pd/2), y0-(L-TL));
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
ArcTo(0, (L-TL), rf);
LineTo(-rf, 0);
LineTo((pd+2*rf), 0);
ArcTo(-rf, 0, rf);
LineTo(0, -(L-TL));
EndPoly;
Absolute;
MoveTo(x0-d/2, y0-(L-TL));
Relative;
ClosePoly;
Poly(0,0, 0,-(TL-ch), td,-ch, di,0, td,ch, 0,(TL-ch));
Move(0,-(TL-ch));
LineTo(-d,0);
Move(td,-ch);
PenPat(-2);
Line(0,TL);
Move(di,0);
Line(0,-TL);
END;
Procedure DrawThdType2;
{
This procedure draws non-detailed threads using solid lines.
}
LABEL 10;
VAR
ch,pd : REAL;
k,k2 : INTEGER;
BEGIN
ch:=(d-di)*Tan(PI/4)/2;
pd:=d - td;
nThreads:=(TL - ch)/p;
p:=(TL - ch)/nThreads;
{
Draw body.
}
Absolute;
MoveTo((x0-pd/2), y0-(L-TL));
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
ArcTo(0, (L-TL), rf);
LineTo(-rf, 0);
LineTo((pd+2*rf), 0);
ArcTo(-rf, 0, rf);
LineTo(0, -(L-TL));
EndPoly;
Absolute;
MoveTo(x0-d/2, y0-(L-TL));
Relative;
ClosePoly;
Poly(0,0, 0,-(TL-ch), td,-ch, di,0, td,ch, 0,(TL-ch));
Move(0,-(TL-ch));
LineTo(-d,0);
{
Draw threads.
}
Absolute;
MoveTo(x0-d/2, y0-L+ch+p);
Relative;
FOR k:=1 TO nThreads-1 DO
BEGIN
LineTo(d, 0);
Move(-d, p);
END;
PenSize(1.5*FPenSize);
Absolute;
MoveTo(x0-di/2, y0-L+ch+p/2);
Relative;
FOR k:=1 TO nThreads DO
BEGIN
LineTo(di, 0);
Move(-di, p);
END;
END;
Procedure DrawThdType3;
{
This procedure draws Type 3 threads (detailed).
}
CONST
k1 = 0.75;
k2 = 0.50;
VAR
q1,q2 : REAL;
BEGIN
{
Draw bottom thread.
}
Absolute;
MoveTo(x0-d/2, y0-L);
Relative;
ClosePoly;
Poly(0,0, d,p/2, -td,-p/2);
{
Draw whole threads.
}
Absolute;
MoveTo(x0-d/2, y0-L);
Relative;
ClosePoly;
FOR i:=1 TO nThreads DO BEGIN
Poly(0,0, d,p/2, -td,p/2, -di,-p/2);
Poly(0,0, di,p/2, td,p/2, -d,-p/2);
END;
{
Draw last thread and shoulder.
}
q1:=L - (p*(nThreads + 1/2) + k1*p/2 + (k1-k2)*p/2);
q2:=L - (p*(nThreads + 1/2) + k2*p/2);
ClosePoly;
BeginPoly;
LineTo(0, 0);
LineTo(td, p/2);
LineTo(-k1*td, k1*p/2);
LineTo((k1-k2)*td, (k1-k2)*p/2);
ArcTo(0, q1, rf);
LineTo(-rf, 0);
LineTo((d - 2*k2*td + 2*rf), 0);
ArcTo(-rf, 0, rf);
LineTo(0, -q2);
LineTo(k2*td, -k2*p/2);
EndPoly;
Move(-(di+td),0);
LineTo(k1*di,k1*p/2);
LineTo(-k1*(di+td),0);
END;
BEGIN
{
Main Program.
}
DselectAll;
PushAttrs;
{
Display the main dialog box, get the information and read the data file.
}
MachScrDialogs;
SetCursor(ArrowC);
FirstTime:=TRUE;
GetInfo;
IF Abort THEN GOTO 99;
IF UNC THEN
tpi:=tpic
ELSE
tpi:=tpif;
{
Get the location of the screw.
}
GetPt(x0,y0);
{
Get drawing units and adjust parameters accordingly.
}
GetUnits(UName,DA,Fmt,UPI,UM,UM2);
IF Inch = TRUE THEN
SF:=UPI
ELSE
SF:=UPI/25.4;
d:=d*SF;
L:=L*SF;
a:=a*SF;
b:=b*SF;
f:=f*SF;
j:=j*SF;
h:=h*SF;
t:=t*SF;
u:=u*SF;
tpi:=tpi/SF;
{
Calculate the variables needed to draw the screw.
}
IF (Type = 1) OR (Type = 2) THEN BEGIN
IF Type = 1 THEN
BEGIN
IF Inch THEN
Theta:=Deg2Rad(82)
ELSE
Theta:=PI/2;
END ELSE
Theta:=Deg2Rad(100);
h:=(a-d)/(2*Tan(Theta/2));
L:=L-h;
TL:=TL-h;
END
ELSE IF Type = 3 THEN
BEGIN
IF Inch THEN Theta:=Deg2Rad(82)
ELSE Theta:=PI/2;
h1:=(a-d)/(2*Tan(Theta/2));
h2:=h-h1;
r:=((a/2)^2 + h2^2)/(2*h2);
L:=L-h1;
TL:=TL-h1;
END
ELSE IF (Type = 4) OR (Type = 5) OR (Type = 11) OR (Type = 12) THEN
BEGIN
w:=a/Cos(Pi/6);
f:=a*Tan(Pi/6);
IF (Type = 11) OR (Type = 12) THEN
u:=0;
END
ELSE IF Type = 6 THEN
BEGIN
IF 4*r^2 >= a^2 THEN
h1:=(2*r - Sqrt(4*r^2 - a^2))/2
ELSE
h1:=h;
s:=h-h1;
END
ELSE IF TYPE = 7 THEN
BEGIN
h1:=h-f;
b:=a - 2*h1*Tan(Deg2Rad(5));
r:=((b/2)^2 + f^2)/(2*f);
END
ELSE IF Type = 9 THEN
BEGIN
h1:=h-s;
r:=((a/2)^2 + h1^2)/(2*h1);
END;
p:=1/tpi;
td:=0.86603/tpi;
di:=d-2*td;
rf:=td/2;
IF Inch THEN
TL:=ThdLgthI(d,L,p)
ELSE
TL:=ThdLgthM(d,L,p);
nThreads:=TL*tpi-1;
IF (nThreads + 1/4)*p > L THEN
nThreads:=nThreads-1;
{
Draw top view
}
IF View = 1 THEN
BEGIN
DrawTopView(Type);
GOTO 90;
END;
{
Draw side view.
}
DrawSideViewOfHead(Type);
{
Draw the threads.
}
IF L <= 0 THEN GOTO 90;
IF ThdType = 1 THEN
DrawThdType1
ELSE IF ThdType = 2 THEN
DrawThdType2
ELSE
DrawThdType3;
90:Group;
PopAttrs;
99:END;
RUN(MachineScrews);