home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 March
/
Chip_1998-03_cd.bin
/
tema
/
MINICAD
/
MC7DEMO
/
MINICAD.1
/
CAP_SCR.MPC
< prev
next >
Wrap
Text File
|
1997-04-30
|
21KB
|
1,165 lines
Procedure CapScrews;
{
(c)1997, Diehl Graphsoft, Inc.
Developed by Tom Urie
This procedure draws various types of slotted machine screws.
}
LABEL 90,99;
CONST
Mac = FALSE;
T1 = 45; {Chamfer angle of head for cap head screws}
k1 = 1.375; {These constants are use to }
k2 = 0.40; {determine the shape of the }
k3 = 0.60; {button head screw. }
k4 = 0.034; {Used to determine fillet radius under the head of the screw.}
k5 = 0.5; {Used to determine the chamfer of the bottom of the threads.}
k6 = 0.75; {Used to draw the the last thread of detailed threads.}
maxPoints = 10;
nDataFiles = 6;
VAR
a,a1,aMin,c,d,di,f,j,h,h1,h2,L,TL,p,r,rf,s,t,td : REAL;
tpi,tpic,tpif,Theta,x0,y0 : REAL;
x,y,dx,dy,Rt,xt,yt : ARRAY[1..maxPoints] OF REAL;
i,nThreads,Type,ThdType,View : INTEGER;
Size,Sz,Size1,Pathname : STRING;
Abort,Inch,SizeNotFound,UNC : BOOLEAN;
SF,UPI : REAL;
Fmt : INTEGER;
UM,UM2 : STRING;
UName,DA : LONGINT;
Procedure CapScrDialog;
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 MakeDialog;
{
This procedure creates the dialog box.
}
CONST
y1=100;
scnh=380;
scnw=300;
DialogType = 2;
VAR
h,h1 : INTEGER;
BEGIN
AlignScr(scnw,x1,x2);
y2:=y1+scnh;
LocateButtons(DialogType,scnh,scnw );
BeginDialog(1,1,x1,y1,x2,y2);
AddButton('OK',1,1,px1,py1,px2,py2);
AddButton('Cancel',2,1,px3,py3,px4,py4);
h:=30;
AddField('Type of Head:',4,1,20,h-1,145,h+15);
AddButton('Hex Socket Head',5,3,20,h+20,200,h+35);
AddButton('Hex Socket Flat Csk Head',6,3,20,h+40,210,h+55);
AddButton('Hex Socket Button Head',7,3,20,h+60,200,h+75);
AddButton('Slotted Flat Csk Head',8,3,20,h+80,180,h+95);
AddButton('Slotted Round Head',9,3,20,h+100,180,h+115);
AddButton('Slotted Fillister Head',10,3,20,h+120,180,h+135);
AddField('',11,1,185,h+80,230,h+95);
AddField('',12,1,185,h+100,230,h+115);
AddField('',13,1,185,h+120,230,h+135);
h:=5;
AddField('Series:',19,1,20,h-1,65,h+15);
AddButton('Inch',20,3,70,h,120,h+15);
AddButton('Metric',21,3,125,h,190,h+15);
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:=240;
AddField('View:',28,1,220,h-1,275,h+15);
AddButton('Top',29,3,220,h+40,275,h+55);
AddButton('Front',30,3,220,h+20,275,h+35);
AddButton('Side',31,3,220,h+60,275,h+75);
h:=240;
AddField('Threads:',34,1,20,h-1,75,h+15);
AddButton('UNC',35,3,80,h,140,h+15);
AddButton('UNF',36,3,145,h,205,h+15);
AddButton('Type 1 (dotted lines)',37,3,20,h+20,200,h+35);
AddButton('Type 2 (solid lines)',38,3,20,h+40,200,h+55);
AddButton('Type 3 (detailed threads)',39,3,20,h+60,190,h+75);
EndDialog;
END;
BEGIN
MakeDialog;
END;
Function GetFilename(Type:INTEGER) : STRING;
{
This procedure assigns filenames to the variable Filename.
}
VAR
k : INTEGER;
Filename : ARRAY[1..2,1..nDataFiles] OF STRING;
BEGIN
Filename[1,1]:='CapHSocE.txt';
Filename[1,2]:='CapHFltE.txt';
Filename[1,3]:='CapHButE.txt';
Filename[1,4]:='CapSFltE.txt';
Filename[1,5]:='CapSRndE.txt';
Filename[1,6]:='CapSFilE.txt';
Filename[2,1]:='CapHSocM.txt';
Filename[2,2]:='CapHFltHM.txt';
Filename[2,3]:='CapHButM.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);
SizeNotFound:=FALSE;
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;
WHILE NOT Eoln(Filename) DO
BEGIN
IF (Type = 1) OR (Type = 3) THEN
ReadLn(Sz,d,tpic,tpif,a,h,s,j)
ELSE IF Type = 2 THEN
ReadLn(Sz,d,tpic,tpif,a,aMin,j)
ELSE IF Type = 4 THEN
ReadLn(Sz,d,tpic,tpif,a,aMin,j,t)
ELSE IF Type = 5 THEN
ReadLn(Sz,d,tpic,tpif,a,h,j,t)
ELSE IF Type = 6 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);
{Message(Sz,' ',d,' ',a,' ',h,' ',j,' ',t,' ',tpic,' ',tpif);}
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;
Inch:=TRUE;
View:=2;
UNC:=TRUE;
ThdType:=1;
Size1:='1/2';
L:=1.000;
RFlag[1]:=Type+4;
RFlag[2]:=20;
RFlag[3]:=View+28;
RFlag[4]:=35;
RFlag[5]:=ThdType+36;
GetDialog(1);
SetTitle('Cap Screws');
SetItem(RFlag[1],TRUE);
SetItem(RFlag[2],TRUE);
SetItem(RFlag[3],TRUE);
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 < 11) THEN
BEGIN
IF (NOT Inch) AND (Item > 7) THEN
Sysbeep
ELSE BEGIN
SetRButton(1,Item);
Type:=Item-4;
END;
END;
IF (Item = 20) AND (NOT Inch) THEN
BEGIN
SetRButton(2,Item);
Inch:=TRUE;
SetField(11,'');
SetField(12,'');
SetField(13,'');
SetField(50,'in');
SetField(51,'in');
END;
IF (Item = 21) AND (Inch) THEN
BEGIN
SetRButton(2,Item);
Inch:=FALSE;
SetField(11,'<n/a>');
SetField(12,'<n/a>');
SetField(13,'<n/a>');
SetField(50,'mm');
SetField(51,'mm');
IF Type >3 THEN
BEGIN
SetRButton(1,5);
Type:=1;
END;
END;
IF (Item > 28) AND (Item < 32) THEN
BEGIN
SetRButton(3,Item);
View:=Item-28;
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 : REAL) : REAL;
{
This procedure determines the length of threads for inch series machine screws.
}
BEGIN
IF L < 2*d + 0.5 THEN
ThdLgthI:=L
ELSE IF L < 4*d + 1 THEN
ThdLgthI:=2*d + 0.5
ELSE ThdLgthI:=L/2;
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.
}
VAR
Alpha,c,q1,q2,q3 : REAL;
BEGIN
Absolute;
MoveTo(x0,y0);
Relative;
{
Hex socket, Flat, and Button heads.
}
IF Type < 4 THEN
BEGIN
Arc(-a/2,a/2,a/2,-a/2,0,360);
IF Type <> 2 THEN
Arc(-c/2,c/2,c/2,-c/2,0,360);
MoveTo(0,f);
Closepoly;
Poly(f,#-30, f,#-90, f,#-150, f,#150, f,#90);
END {of Hex socket, Flat, and Button heads}
{
Slotted Flat Countersunk Head.
}
ELSE IF Type = 4 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);
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 Slotted Flat Countersunk Head}
{
Round Head.
}
ELSE IF Type = 5 THEN
BEGIN
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);
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 Round Head}
{
Fillister Head.
}
ELSE IF Type = 6 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; {of Fillister Head}
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
{
Cap Head.
}
IF Type = 1 THEN
BEGIN
Absolute;
MoveTo(x0 - a/2, y0);
Relative;
ClosePoly;
Poly(0,0, 0,s, (a-c)/2,(h-s), c,0, (a-c)/2,-(h-s), 0,-s);
Move(0,s);
LineTo(-a,0);
END {of Cap Head}
{
Flat Countersunk Head.
}
ELSE IF Type = 2 THEN BEGIN
y0:=y0-h;
Absolute;
MoveTo(x0-d/2, y0);
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
LineTo(-(a1-d)/2, (h-s));
LineTo(0, s);
LineTo(a1, 0);
LineTo(0, -s);
LineTo(-(a1-d)/2, -(h-s));
EndPoly;
Absolute;
MoveTo(x0-a1/2, y0+(h-s));
Relative;
LineTo(a1, 0);
END {of Flat Countersunk Head}
{
Button Head.
}
ELSE IF Type = 3 THEN
BEGIN
p1:=k2*(a-c)/2;
q1:=k3*(h-s);
p2:=(a-c)/2 - p1;
q2:=(h-s) - q1;
Absolute;
MoveTo(x0 - a/2, y0);
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
LineTo(0, s);
CurveThrough(p1, q1);
LineTo(p2, q2);
LineTo(c, 0);
CurveThrough(p2, -q2);
LineTo(p1, -q1);
LineTo(0, -s);
EndPoly;
Absolute;
MoveTo(x0-a/2, y0+s);
Relative;
LineTo(a, 0);
END {of Button Head}
{
Slotted Flat Countersunk.
}
ELSE IF Type = 4 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 Slotted Flat Countersunk}
{
Slotted Round Head.
}
ELSE IF Type = 5 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]:=-p1; y[2]:=q1; Rt[2]:=r;
IF View = 2 THEN
BEGIN
nPoints:=8;
x[3]:=-j/2; y[3]:=q2; 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]:=q2; Rt[6]:=0;
x[7]:=p1; y[7]:=q1; Rt[7]:=r;
x[8]:=a/2; y[8]:=0; Rt[8]:=0;
END ELSE
BEGIN
nPoints:=4;
x[3]:=p1; y[3]:=q1; 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 Slotted Round Head}
{
Slotted Fillister Head.
}
ELSE IF Type = 6 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 View = 2 THEN
BEGIN
LineTo((a-j)/2,0);
MoveTo(j,0);
LineTo((a-j)/2,0);
END ELSE
LineTo(a,0);
END; {of Slotted Fillister Head}
END;
Procedure DrawThdType1;
{
This procedure draws non-detailed threads using dashed lines.
}
LABEL 10;
VAR
ch,pd : REAL;
BEGIN
ch:=td;
pd:=d - td;
{
Draw body.
}
Absolute;
MoveTo((x0-d/2-rf), y0);
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
IF (Type <> 2) OR (Type <> 4) THEN
ArcTo(rf, 0, rf);
LineTo(0, -(L-ch));
LineTo(td, -ch);
LineTo(di, 0);
LineTo(td, ch);
IF (Type <> 2) OR (Type <> 4) THEN
BEGIN
ArcTo(0, (L-ch), rf);
LineTo(rf, 0);
END ELSE
LineTo(0, (L-ch));
EndPoly;
Absolute;
MoveTo(x0-d/2, y0-L+ch);
Relative;
LineTo(d, 0);
IF TL = L THEN GOTO 10;
Absolute;
MoveTo(x0-d/2, y0-L+TL);
Relative;
LineTo(d, 0);
10:Absolute;
MoveTo(x0+di/2, y0-L);
PenPat(-2);
Line(0,TL);
Move(-di, -TL);
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:=td;
pd:=d - td;
{
Draw body.
}
Absolute;
MoveTo((x0-d/2-rf), y0);
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
ArcTo(rf, 0, rf);
LineTo(0, -(L-ch));
LineTo(td, -ch);
LineTo(di, 0);
LineTo(td, ch);
ArcTo(0, (L-ch), rf);
LineTo(rf, 0);
EndPoly;
Absolute;
MoveTo(x0-d/2, y0-L+ch);
Relative;
LineTo(d, 0);
k2:=1;
IF TL = L THEN
BEGIN
nThreads:=(L - ch)/p;
p:=(L - ch)/nThreads;
k2:=0;
END;
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;
IF L > TL THEN
LineTo(d/2, 0);
PenSize(1.5*FPenSize);
Absolute;
MoveTo(x0-di/2, y0-L+ch+p/2);
Relative;
FOR k:=1 TO nThreads-k2 DO
BEGIN
LineTo(di, 0);
Move(-di, p);
END;
IF L > TL THEN
LineTo(3*di/4, 0);
END;
Procedure DrawThdType3;
{
This procedure draws detailed threads.
}
CONST
k1 = 0.75;
k2 = 0.50;
VAR
p1,SL : REAL;
k,nPoints : INTEGER;
BEGIN
p1:=d - 5*td/2;
REPEAT
nThreads:=nThreads-1;
UNTIL ((nThreads+1)*p + p/2 +rf) < L;
SL:=L - ((nThreads+1)*p + p/2);
{
Draw bottom thread.
}
Absolute;
MoveTo(x0 - d/2 + 3*td/2, y0 - L);
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
LineTo(p1, 0);
LineTo(td/2, p/4);
LineTo(-td/2, p/4);
LineTo(td, p/2);
LineTo(-(d-td/2), -p/2);
EndPoly;
Absolute;
MoveTo((x0 + d/2 - td/2), (y0 - L + p/4));
Relative;
LineTo(-(d/2 - td/2), 0);
LineTo(di/2, p/4);
{
Draw first whole thread.
}
Absolute;
MoveTo((x0 - d/2 + td/2), (y0 - L +p/2));
Relative;
Poly(0,0, (d-td/2),p/2, -td, p/2, -di,-p/2);
Poly (0,0, di,p/2, td,p/2, -d,-p/2);
{
Draw remaining whole threads.
}
Relative;
ClosePoly;
FOR i:=1 TO nThreads-1 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.
}
Absolute;
MoveTo((x0 - d/2 - rf), y0);
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
IF rf <> 0 THEN
ArcTo(rf, 0, rf);
LineTo(0, -SL);
LineTo(td, -p/2);
LineTo(-td, -p/2);
LineTo(d, p/2);
IF rf <> 0 THEN
BEGIN
ArcTo(0, SL+p/2, rf);
LineTo(rf, 0);
END ELSE
LineTo(0, SL+p/2);
EndPoly;
Absolute;
MoveTo(x0-d/2, y0-SL);
Relative;
LineTo((k6*di + td),0);
LineTo(-k6*di, -p/2);
END;
BEGIN
{
Main Program.
}
DselectAll;
PushAttrs;
{
Display the main dialog box and get the information.
}
CapScrDialog;
SetCursor(ArrowC);
GetInfo;
IF Abort THEN GOTO 99;
{
Get the location of the screw.
}
GetPt(x0,y0);
{
Determine pitch, thread length and number of threads.
}
IF UNC THEN
tpi:=tpic
ELSE
tpi:=tpif;
p:=1/tpi;
td:=0.86603/tpi;
di:=d-2*td;
IF Type <> 2 THEN
rf:=k4*d
ELSE
rf:=0;
IF Inch THEN
TL:=ThdLgthI(d,L)
ELSE
TL:=ThdLgthM(d,L,p);
nThreads:=TL*tpi;
{
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;
aMin:=aMin*SF;
h:=h*SF;
s:=s*SF;
j:=j*SF;
t:=t*SF;
TL:=TL*SF;
p:=p*SF;
td:=td*SF;
di:=di*SF;
rf:=rf*SF;
{
Calculate the variables needed to draw the screw.
}
IF Type = 1 THEN BEGIN
c:=a - 2*(h-s)/Tan(Deg2Rad(T1));
f:=j*Tan(Pi/6);
END
ELSE IF (Type = 2) OR (Type = 4) THEN
BEGIN
IF Inch THEN Theta:=Deg2Rad(82)
ELSE Theta:=PI/2;
h:=(a-d)/(2*Tan(Theta/2));
a1:=(a+aMin)/2;
s:=(a-a1)/(2*Tan(Theta/2));
L:=L-h;
TL:=TL-h;
rf:=0;
f:=j*Tan(Pi/6);
END
ELSE IF Type = 3 THEN
BEGIN
c:=k1*j;
f:=j*Tan(Pi/6);
END
ELSE IF Type = 5 THEN
BEGIN
r:=((a/2)^2 + h^2)/(2*h);
END
ELSE IF Type = 6 THEN
BEGIN
h1:=h-s;
r:=((a/2)^2 + h1^2)/(2*h1);
END;
{
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(CapScrews);