home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 March
/
Chip_1998-03_cd.bin
/
tema
/
MINICAD
/
MC7DEMO
/
MINICAD.1
/
HEX_BOLT.MPC
< prev
next >
Wrap
Text File
|
1997-04-30
|
16KB
|
927 lines
Procedure HexBolts;
{
(c)1996, Diehl Graphsoft, Inc.
Developed by Tom Urie
This procedure draws various types of hex and square bolts.
}
LABEL 10,90,99;
CONST
Alpha1 = 25; {Chamfer angle of head for square bolts}
Alpha2 = 30; {Chamfer angle of head for hex bolts}
nDataFiles = 6;
VAR
a,ch,d,di,f,g,h,h1,L,TL,p,r,s,t,td : REAL;
tpi,tpic,tpif,x0,y0 : REAL;
PathLength : INTEGER;
i,nThreads,Type,ThdType,View : INTEGER;
Size,Sz,Size1,Pathname : STRING;
SizeNotFound,Abort,Inch,UNC : BOOLEAN;
SF,UPI : REAL;
Fmt : INTEGER;
UM,UM2 : STRING;
UName,DA : LONGINT;
Procedure HexBoltDialog;
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 main dialog box.
}
CONST
y1=100;
scnh=380;
scnw=300;
DialogType = 2;
VAR
h : 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:=10;
AddField('Type of Bolt:',4,1,20,h+19,145,h+35);
AddButton('Hex Bolt',6,3,20,h+40,200,h+55);
AddButton('Heavy Hex Bolt',7,3,20,h+60,200,h+75);
AddButton('Hex Cap Screw (Finished Hex Bolt)',8,3,20,h+80,250,h+95);
AddButton('Heavy Hex Structural Bolt',9,3,20,h+100,200,h+115);
AddButton('Heavy Hex Screw',10,3,20,h+120,200,h+135);
AddButton('Square Bolt',5,3,20,h+140,120,h+155);
AddField('',50,1,125,h+139,170,h+155);
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',26,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',27,1,153,h+24,175,h+40);
h:=240;
AddField('View:',28,1,220,h-1,255,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]:='SqBoltE.txt';
Filename[1,2]:='HxBolt1E.txt';
Filename[1,3]:='HxBolt2E.txt';
Filename[1,4]:='HxBolt3E.txt';
Filename[1,5]:='HxBolt4E.txt';
Filename[1,6]:='HxBolt5E.txt';
Filename[2,2]:='HxBolt1M.txt';
Filename[2,3]:='HxBolt2M.txt';
Filename[2,4]:='HxBolt3M.txt';
Filename[2,5]:='HxBolt4M.txt';
Filename[2,6]:='HxBolt5M.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
ReadLn(Sz,d,tpic,tpif,a,h,r,s);
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:=2;
View:=2;
Inch:=TRUE;
ThdType:=1;
UNC:=TRUE;
Size1:='1/2';
L:=2.000;
RFlag[1]:=Type+4;
RFlag[2]:=20;
RFlag[3]:=View+28;
RFlag[4]:=35;
RFlag[5]:=ThdType+36;
GetDialog(1);
SetTitle('Square & Hex Bolts');
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 < 17) THEN
BEGIN
IF (Item = 5) AND (NOT Inch) THEN
Sysbeep
ELSE BEGIN
SetRButton(1,Item);
Type:=Item-4;
END;
END;
IF (Item = 20) AND (NOT Inch) THEN
BEGIN
Inch:=TRUE;
SetRButton(2,Item);
SetField(26,'in');
SetField(27,'in');
END;
IF (Item = 21) AND (Inch) THEN
BEGIN
Inch:=FALSE;
SetRButton(2,Item);
SetField(26,'mm');
SetField(27,'mm');
SetField(50,'<n/a>');
IF Type = 1 THEN
BEGIN
Type:=2;
SetRButton(1,6);
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;
Function ThdLgthI(d,L : REAL) : REAL;
{
This procedure determines the length of threads for inch series machine screws.
}
BEGIN
IF L < 2*d + 0.25 THEN
ThdLgthI:=L
ELSE IF L < 6 THEN
ThdLgthI:=2*d + 0.25
ELSE ThdLgthI:=2*d + 0.5;
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.
}
BEGIN
Absolute;
MoveTo(x0-g/2,y0);
Relative;
ClosePoly;
IF Type = 1 THEN
Poly(0,0, g/2,g/2, g/2,-g/2, -g/2,-g/2)
ELSE
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;
Procedure DrawSideViewOfHead(Type : INTEGER);
{
This procedure draws the side view of the head.
}
LABEL 10;
VAR
p1,p2,q1,q2 : REAL;
k, nPoints : INTEGER;
BEGIN
{
Square Head.
}
IF Type = 1 THEN
BEGIN
p1:=g/4;
IF View = 3 THEN BEGIN
Absolute;
MoveTo(x0-a/2, y0+s);
Relative;
ClosePoly;
Poly(0,0, 0,h, a,0, 0,-h);
Absolute;
MoveTo(x0-a/2, y0+s+(h-ch));
Relative;
OpenPoly;
BeginPoly;
LineTo(0, 0);
CurveThrough(a/2, ch);
LineTo(a/2, -ch);
EndPoly;
END
ELSE BEGIN
Absolute;
MoveTo(x0-g/2, y0+s);
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
LineTo(0, (h-ch));
LineTo((g-a)/2, ch);
LineTo(a, 0);
LineTo((g-a)/2, -ch);
LineTo(0,- (h-ch));
EndPoly;
Absolute;
MoveTo(x0-g/2, y0+s+(h-ch));
Relative;
OpenPoly;
BeginPoly;
LineTo(0, 0);
CurveThrough(p1, ch);
LineTo(p1, -ch);
CurveThrough(p1, ch);
LineTo(p1, -ch);
EndPoly;
Absolute;
MoveTo(x0, y0+s);
Relative;
LineTo(0, (h-ch));
END;
Absolute;
MoveTo(x0-a/2, y0);
Relative;
IF s <> 0 THEN
Rect(0,0,a,s);
END {of Square Head}
{
Hex Head.
}
ELSE BEGIN
p1:=(g-f)/2;
IF View = 3 THEN BEGIN
Absolute;
MoveTo(x0-a/2, y0+s);
Relative;
ClosePoly;
Poly(0,0, 0,h1, a,0, 0,-h1);
Move(-a, (h1-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, -(h1-ch));
GOTO 10;
END;
Absolute;
MoveTo(x0-g/2, y0+s);
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
LineTo(0, (h1-ch));
LineTo((g-a)/2, ch);
LineTo(a, 0);
LineTo((g-a)/2, -ch);
LineTo(0,- (h1-ch));
EndPoly;
Absolute;
MoveTo(x0-g/2, y0+s+(h1-ch));
Relative;
OpenPoly;
BeginPoly;
LineTo(0, 0);
CurveThrough(p1/2, ch);
LineTo(p1/2, -ch);
CurveThrough(f/2, ch);
LineTo(f/2, -ch);
CurveThrough(p1/2, ch);
LineTo(p1/2, -ch);
EndPoly;
Absolute;
MoveTo(x0+f/2, y0+s);
Relative;
LineTo(0, (h1-ch));
Move(-f, 0);
LineTo(0, -(h1-ch));
10:Absolute;
MoveTo(x0-a/2, y0);
Relative;
IF s <> 0 THEN
Rect(0,0,a,s);
END; {of Hex 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-r), y0);
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
IF r <> 0 THEN
ArcTo(r, 0, r);
LineTo(0, -(L-ch));
LineTo(td, -ch);
LineTo(di, 0);
LineTo(td, ch);
IF r <> 0 THEN
BEGIN
ArcTo(0, (L-ch), r);
LineTo(r, 0);
END ELSE
LineTo(0, (L-ch));
EndPoly;
Absolute;
MoveTo(x0-d/2, y0-L+ch);
Relative;
LineTo(d, 0);
{
Draw threads.
}
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-r), y0);
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
IF r <> 0 THEN
ArcTo(r, 0, r);
LineTo(0, -(L-ch));
LineTo(td, -ch);
LineTo(di, 0);
LineTo(td, ch);
IF r <> 0 THEN
BEGIN
ArcTo(0, (L-ch), r);
LineTo(r, 0);
END ELSE
LineTo(0, (L-ch));
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.25*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 +r) < 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 - r), y0);
Relative;
ClosePoly;
BeginPoly;
LineTo(0, 0);
IF r <> 0 THEN
ArcTo(r, 0, r);
LineTo(0, -SL);
LineTo(td, -p/2);
LineTo(-td, -p/2);
LineTo(d, p/2);
IF r <> 0 THEN
BEGIN
ArcTo(0, SL+p/2, r);
LineTo(r, 0);
END ELSE
LineTo(0, SL+p/2);
EndPoly;
Absolute;
MoveTo(x0-d/2, y0-SL);
Relative;
LineTo((k1*di + td),0);
LineTo(-k1*di, -p/2);
END;
BEGIN
{
Main Program.
}
DselectAll;
PushAttrs;
{
Display the main dialog box and get the information.
}
HexBoltDialog;
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 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 THEN
SF:=UPI
ELSE
SF:=UPI/25.4;
d:=d*SF;
L:=L*SF;
a:=a*SF;
h:=h*SF;
r:=r*SF;
s:=s*SF;
TL:=TL*SF;
p:=p*SF;
td:=td*SF;
di:=di*SF;
{
Calculate the variables needed to draw the screw.
}
IF Type = 1 THEN BEGIN
g:=a/Cos(PI/4);
ch:=(g-a)*Tan(Deg2Rad(Alpha1)/2);
END
ELSE BEGIN
g:=a/Cos(PI/6);
ch:=(g-a)*Tan(Deg2Rad(Alpha2))/2;
f:=a*Tan(PI/6);
h1:=h-s;
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(HexBolts);