home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 March
/
Chip_1998-03_cd.bin
/
tema
/
MINICAD
/
MC7DEMO
/
MINICAD.1
/
SET_SCR.MPC
< prev
next >
Wrap
Text File
|
1997-04-30
|
16KB
|
845 lines
Procedure SetScr;
{
(c)1997, Diehl Graphsoft, Inc.
Developed by Tom Urie.
This procedure draws various types of set screws.
}
LABEL 10,99;
CONST
Mac = FALSE;
Filename1 = 'SetScrE.txt';
Filename2 = 'SetScrM.txt';
PathLength = 14;
k1=0.6935; {Used to draw slotted head set screw with non-detailed threads.}
kps1 = 0.75; {Determines the pen size for dashed lines}
kps2 = 1.25; {Determines the pen size for solid lines}
VAR
a,a1,b,c,c1,c2,c3,c4,ch,d,h,L,TL,r1,rh,sw,sd,sl : REAL;
di,f,j,p,td,tpi,x0,y0 : REAL;
tpic,tpif : ARRAY[1..3] OF REAL;
i,nthds,Type,Point,ThdType,View,SizeLgth : INTEGER;
Size,Sz,Size1,Pathname : STRING;
Ans,Abort,Inch,OK,SizeNotFound,UNC : BOOLEAN;
SF,UPI : REAL;
Fmt : INTEGER;
UM,UM2 : STRING;
UName,DA : LONGINT;
Procedure SetScrDialog;
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 MakeDialog1;
{
This procedure creates the main dialog box.
}
CONST
y1=100;
scnh=250;
scnw=420;
DialogType =2;
VAR
g,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:=5;
AddField('Type of Head:',4,1,20,h-1,145,15+h);
AddButton('Square',5,3,20,65+h,85,80+h);
AddField('',29,1,90,65+h,125,80+h);
AddButton('Slotted',6,3,20,45+h,85,60+h);
AddField('',30,1,90,45+h,125,60+h);
AddButton('Hex Socket',7,3,20,25+h,125,40+h);
AddField('Type of Point:',8,1,150,h-1,275,15+h);
AddButton('Cup/Flat',9,3,150,25+h,230,40+h);
AddButton('Full Dog',10,3,150,45+h,230,60+h);
AddButton('Half Dog',11,3,150,65+h,230,80+h);
AddButton('Oval',12,3,240,25+h,290,40+h);
AddButton('Cone',13,3,240,45+h,290,60+h);
AddField('View:',14,1,330,h-1,405,15+h);
AddButton('Top',15,3,330,45+h,375,60+h);
AddButton('Side',16,3,330,25+h,375,40+h);
h:=100;
AddField('Series:',24,1,20,4+h,65,20+h);
AddButton('Inch',25,3,70,5+h,120,20+h);
AddButton('Metric',26,3,130,5+h,200,20+h);
h:=130;
AddField('Size:',20,1,20,4+h,65,20+h);
AddField('',21,2,70,5+h,135,20+h);
AddField('in',27,1,143,4+h,165,20+h);
AddField('Length:',22,1,20,29+h,65,45+h);
AddField('',23,2,70,30+h,135,45+h);
AddField('in',28,1,143,29+h,165,45+h);
h:=105;
g:=200;
AddField('Threads:',34,1,20+g,h-1,75+g,h+15);
AddButton('UNC',35,3,80+g,h,140+g,h+15);
AddButton('UNF',36,3,145+g,h,205+g,h+15);
h:=100;
AddButton('Type 1 (dashed lines)',37,3,20+g,h+25,200+g,h+40);
AddButton('Type 2 (solid lines)',38,3,20+g,h+45,200+g,h+60);
AddButton('Type 3 (detailed threads)',39,3,20+g,h+65,190+g,h+80);
EndDialog;
END;
BEGIN
MakeDialog1;
END;
Procedure GetData(Type:INTEGER);
{
This procedure opens the data file and retreives the data for the selected screw.
}
LABEL 5,10,99;
VAR
File,Filename,WarningStr : STRING;
BEGIN
SizeNotFound:=FALSE;
IF Inch=True THEN
File:=Filename1
ELSE
File:=Filename2;
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;
WHILE NOT Eoln(Filename) DO BEGIN
ReadLn(Sz,d,tpic[1],tpif[1],tpic[2],tpif[2],tpic[3],tpif[3],j);
IF Sz=Size THEN BEGIN
IF tpic[Type] = 0 THEN
GOTO 5
ELSE
GOTO 10;
END;
END;
5: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,15,20,99;
VAR
Done : BOOLEAN;
Item : INTEGER;
RFlag : ARRAY [1..6] 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:=3;
Point:=1;
View:=2;
ThdType:=1;
Inch:=TRUE;
UNC:=TRUE;
Size:='1/2';
L:=1.000;
RFlag[1]:=7;
RFlag[2]:=9;
RFlag[3]:=16;
RFlag[4]:=25;
RFlag[5]:=35;
RFlag[6]:=37;
GetDialog(1);
SetTitle('Set Screws');
SetItem(RFlag[1],TRUE);
SetItem(RFlag[2],TRUE);
SetItem(RFlag[3],TRUE);
SetItem(RFlag[4],TRUE);
SetItem(RFlag[5],TRUE);
SetItem(RFlag[6],TRUE);
SetField(21,Size);
SetField(23,Num2Str(3,L));
SelField(21);
15:REPEAT
DialogEvent(Item);
IF Item=1 then
Done:=True;
IF Item=2 THEN
BEGIN
Done:=TRUE;
Abort:=TRUE;
END;
IF (Item = 5) OR (Item = 6) THEN
BEGIN
IF Inch THEN
BEGIN
SetRButton(1,Item);
Type:=Item-4;
END
ELSE BEGIN
SysBeep;
SetRButton(1,7);
Type:=3;
END;
END;
IF Item = 7 THEN
BEGIN
SetRButton(1,Item);
Type:=Item-4;
END;
IF (Item > 8) AND (Item < 14) THEN
BEGIN
SetRButton(2,Item);
Point:=Item-8;
END;
IF Item = 15 THEN
BEGIN
SetRButton(3,15);
View:=1;
SetField(23,'n/a');
END;
IF Item = 16 THEN
BEGIN
SetRButton(3,16);
View:=2;
SetField(23,Num2StrF(L));
END;
IF Item = 25 THEN
BEGIN
SetRButton(4,Item);
Inch:=TRUE;
SetField(27,'in');
SetField(28,'in');
SetField(29,'');
SetField(30,'');
SelField(21);
END;
IF Item = 26 THEN
BEGIN
SetRButton(4,Item);
Inch:=FALSE;
SetField(27,'mm');
SetField(28,'mm');
SetField(29,'<n/a>');
SetField(30,'<n/a>');
SetRButton(1,7);
Type:=3;
SelField(21);
END;
IF (Item = 35) OR (Item = 36) THEN
BEGIN
SetRButton(5,Item);
IF Item = 35 THEN UNC:=TRUE
ELSE UNC:=FALSE;
END;
IF (Item > 36) AND (Item < 40) THEN
BEGIN
SetRButton(6,Item);
ThdType:=Item-36;
END;
UNTIL Done;
IF Abort THEN GOTO 99;
Size1:=GetField(21);
Size:=Concat('''',Size1,'''');
UprString(Size);
OK:=ValidNumStr(GetField(23),L);
IF (View = 2) AND (L <= 0) THEN BEGIN
Sysbeep;
Done:=FALSE;
SelField(23);
GOTO 15;
END;
GetData(Type);
IF Abort THEN GOTO 99;
IF SizeNotFound THEN
BEGIN
Done:=FALSE;
SelField(21);
GOTO 15;
END;
99:ClrDialog;
END;
Procedure DrawTop(Type:INTEGER);
{
This procedure draws the top view.
}
BEGIN
Absolute;
MoveTo(x0,y0);
Relative;
IF Type=1 THEN BEGIN
a:=d;
Move(0,0.70711*a);
Closepoly;
Poly(a,#-45,a,#-135,a,#135);
END
ELSE IF Type=2 THEN BEGIN
sw:=d/6;
sd:=d/4;
sl:=2*sqrt((d/2)^2-(sw/2)^2);
Arc(-d/2,d/2,d/2,-d/2,#0,#360);
Move(-sw/2,sl/2);
Line(0,-sl);
Move(sw,0);
Line(0,sl);
END
ELSE BEGIN
f:=0.5774*j;
Arc(-d/2,d/2,d/2,-d/2,#0,#360);
Arc(-di/2,di/2,di/2,-di/2,#0,#360);
Move(0,f);
Closepoly;
Poly(f,#-30,f,#-90,f,#-150,f,#150,f,#90);
END;
Group;
END;
Function ThdLgth(Type,Point:integer):REAL;
{
This procedure determines the length of the threads on the screw. It also calculates various parameters used to draw the
screw.
}
BEGIN
IF Type=1 THEN BEGIN
rh:=2.5*d;
h:=3*d/4;
a:=d;
a1:=a/0.70711;
c2:=0;
c3:=rh-sqrt(rh^2-(a1/2)^2);
c4:=0.76733*(a1/2-d/2);
END
ELSE IF Type=2 THEN BEGIN
rh:=d;
sw:=d/6;
sd:=d/4;
c2:=rh-sqrt(rh^2-(d/2)^2);
END
ELSE
c2:=(d-di)/2;
IF Point = 1 THEN BEGIN
b:=3*d/5;
ch:={(d-b)/2}p;
c1:=ch;
END
ELSE IF (Point=2) OR (Point=3) THEN BEGIN
b:=di;
c:=d/(2*Point-2);
ch:=0.35010*(d-b);
c1:=c+ch;
END
ELSE IF Point=4 THEN BEGIN
r1:=3*d/4;
c1:=r1-sqrt(r1^2-(d/2)^2);
END
ELSE BEGIN
c1:=d/2;
END;
ThdLgth:=L-(c1+c2);
END;
Procedure DrawPoint1(Point : INTEGER);
{
This procedure draws the point of a set screw with non-detailed threads.
}
BEGIN
Relative;
Move(-d/2,c1);
OpenPoly;
IF (Point = 1) OR (Point = 2) OR (Point = 3) THEN
Poly(0,0,(d-b)/2,-ch,b,0,(d-b)/2,ch);
IF (Point = 2) OR (Point = 3) THEN BEGIN
ClosePoly;
Move(-(d-b)/2,-ch);
Poly(0,0,0,-c,-b,0,0,c);
END;
IF Point = 4 THEN BEGIN
BeginPoly;
LineTo(0,0);
CurveThrough(d/2,-c1);
Lineto(d/2,c1);
EndPoly;
END;
IF Point = 5 THEN
Poly(0,0,d/2,-c1,d/2,c1);
END;
Procedure DrawPoint2(Point : INTEGER);
{
This procedure draws the point of a set screw with detailed threads.
}
BEGIN
Relative;
Move(-d/2,c1);
OpenPoly;
IF (Point = 1) OR (Point = 2) OR (Point = 3) THEN
Poly(0,0, (d-b)/2,-ch, b,0, (d-b)/2-td/2,ch-p/4, -td/2,p/4);
IF (Point = 2) OR (Point = 3) THEN BEGIN
ClosePoly;
Move(0,-ch);
Poly(0,0,0,-c,-b,0,0,c);
END;
IF Point = 4 THEN BEGIN
BeginPoly;
LineTo(0,0);
CurveThrough(d/2,-c1);
Lineto(d/2-td/2,c1-p/4);
Lineto(-td/2,p/4);
EndPoly;
END;
IF Point = 5 THEN
Poly(0,0, d/2,-c1, d/2-td/2,c1-p/4, -td/2,p/4);
END;
Procedure Curve(x,y : REAL);
{
This procedure draws a curve through three points.
}
BEGIN
LineTo(0,0);
CurveThrough(x/2,y);
Lineto(x/2,-y);
END;
Procedure DrawHead1(Type : INTEGER);
{
This procedure draws the heads on set screws with non-detailed threads.
}
BEGIN
Relative;
IF Type = 1 THEN
BEGIN
Move(-a1/2,h-c3);
OpenPoly;
BeginPoly;
Curve(a1,c3);
EndPoly;
Move(0,-(h-(c3+c4)));
Poly(0,0,-(a1-d)/2,-c4,-d,0,-(a1-d)/2,c4);
ClosePoly;
BeginPoly;
LineTo(0,0);
LineTo(0,(h-(c3+c4)));
Curve(a1/2,c3/2);
LineTo(0,-(h-(c3+c4)));
Curve(-a1/2,-c3/2);
EndPoly;
Move(a1/2,0);
BeginPoly;
LineTo(0,0);
LineTo(0,(h-(c3+c4)));
Curve(a1/2,c3/2);
LineTo(0,-(h-(c3+c4)));
Curve(-a1/2,-c3/2);
EndPoly;
END
ELSE IF Type = 2 THEN
BEGIN
{
Move(-sw/2,-c2);
BeginPoly;
LineTo(0,0);
LineTo(0,c2);
CurveThrough(-(d-sw)/4,-(1-k1)*c2);
LineTo(-(d-sw)/4,-k1*c2);
EndPoly;
Move(d,0);
BeginPoly;
LineTo(0,0);
CurveThrough(-(d-sw)/4,k1*c2);
LineTo(-(d-sw)/4,(1-k1)*c2);
LineTo(0,-c2);
EndPoly;
}
Move(-d/2,-c2);
BeginPoly;
LineTo(0,0);
CurveThrough(d/2, c2);
LineTo(d/2, -c2);
EndPoly;
END
ELSE BEGIN
Move(-d/2,-c2);
Poly(0,0,c2,c2,(d-2*c2),0,c2,-c2);
END;
END;
Procedure DrawHead2(Type : INTEGER);
VAR
x3,y3 : REAL;
BEGIN
x3:=(d-c2)/2;
y3:=L-(Nthds*p+c1+p/2);
Relative;
OpenPoly;
IF Type = 1 THEN BEGIN
Move(-a1/2,h-c3);
BeginPoly;
Curve(a1,c3);
EndPoly;
Move(0,-(h-(c3+c4)));
Poly(0,0, -(a1-d)/2,-c4, 0,-y3, -(d-td),0, -td/2,p/4, -td/2,y3-p/4, -(a1-d)/2,c4);
ClosePoly;
BeginPoly;
LineTo(0,0);
LineTo(0,(h-(c3+c4)));
Curve(a1/2,c3/2);
LineTo(0,-(h-(c3+c4)));
Curve(-a1/2,-c3/2);
EndPoly;
Move(a1/2,0);
BeginPoly;
LineTo(0,0);
LineTo(0,(h-(c3+c4)));
Curve(a1/2,c3/2);
LineTo(0,-(h-(c3+c4)));
Curve(-a1/2,-c3/2);
EndPoly;
END
ELSE IF Type = 2 THEN BEGIN
Move(d/2,-y3);
BeginPoly;
LineTo(0,0);
CurveThrough(-d/2,y3);
LineTo(-(d-td)/2,-(y3-p/4));
Lineto(td/2,-p/4);
EndPoly;
END
ELSE BEGIN
Move(d/2,-y3);
Poly(0,0, -c2,y3, -(d-2*c2),0, -(c2-td/2),-(y3-p/4), td/2,-p/4);
END;
END;
Procedure DrawThreads1(Type : INTEGER);
{
This procedure draws Thread Type 1 (non-detailed threads - dashed lines)
}
BEGIN
Relative;
{
IF Type = 2 THEN
Poly((d-sw)/2,0, 0,-(sd-c2), sw,0, 0,(sd-c2), (d-sw)/2,0, 0,-tl, -d,0, 0,tl)
ELSE
}
Rect(0,0,d,-tl);
PenPat(-2);
PenSize(kps1*FPenSize);
Move((d-di)/2,0);
Line(0,-tl);
Move(di,tl);
Line(0,-tl);
END;
Procedure DrawThreads2(Type : INTEGER);
{
This procedure draws Thread Type 2 (non-detailed threads - solid lines)
}
BEGIN
nThds:=tl/p;
p:=tl/nThds;
Relative;
Rect(0,0,d,-tl);
FOR i:=1 TO nThds-1 DO
BEGIN
Move(d, -p);
LineTo(-d, 0);
END;
PenSize(kps2*FPenSize);
Move(td, -p/2);
FOR i:=1 TO nThds DO
BEGIN
LineTo(di, 0);
Move(-di, p);
END;
END;
Procedure DrawThreads3(d,di,p,td,Nthds : REAL);
{
This procedure draws Thread Type 3 (detailed threads)
}
BEGIN
Relative;
Move((d-td)/2,c1-p/4);
ClosePoly;
Poly(0,0, -(d-td)/2,0, di/2,p/4, td/2,-p/4);
Move(-td/2,p/4);
OpenPoly;
Poly(0,0, td,p/2, -d,-p/2);
ClosePoly;
FOR i:= 1 TO NThds DO BEGIN
Poly(0,0, td,p/2, di,p/2, td,-p/2);
Move(-td,p/2);
Poly(0,0, td,p/2, -d,-p/2, td,-p/2);
Move(-td,p/2);
END;
Move(d,p/2);
OpenPoly;
Poly(0,0, -d,-p/2, td,p/2);
ClosePoly;
Poly(0,0, -td/2,p/4, (d-td)/2,0, -di/2,-p/4);
END;
BEGIN
{
Main Program.
}
DselectAll;
PushAttrs;
FillPat(1);
{
Display the main dialog box and get the information.
}
SetScrDialog;
Ans:=FALSE;
SetCursor(ArrowC);
GetInfo;
IF Abort THEN GOTO 99;
IF UNC THEN
tpi:=tpic[Type]
ELSE
tpi:=tpif[Type];
{
Get drawing units and adjust parameters accordingly.
}
GetUnits(UName,DA,Fmt,UPI,UM,UM2);
IF Inch=TRUE THEN
SF:=UPI
ELSE BEGIN
SF:=UPI/25.4;
END;
d:=SF*d;
j:=SF*j;
L:=SF*L;
tpi:=tpi/SF;
td:=0.86603/tpi;
p:=2*td*Tan(PI/6);
di:=d-2*td;
{
Get the location of the screw.
}
PushAttrs;
GetPt(x0,y0);
{
Get thread length and parameters needed to draw screw; determine the number of threads;
}
TL:=ThdLgth(Type,Point);
p:=1/tpi;
Nthds:=TL*tpi-1;
IF (L-c1-c2-NThds*p) > p THEN
NThds:=NThds+1;
IF Type = 1 THEN
NThds:=NThds-1;
{
Draw top view
}
IF View=1 THEN BEGIN
Absolute;
MoveTo(x0,y0);
DrawTop(Type);
GOTO 99;
END;
{
Draw side view.
}
{
Draw Thread TYpes 1 & 2.
}
IF (ThdType = 1) OR (ThdType = 2) THEN BEGIN
Absolute;
MoveTo(x0,y0);
DrawPoint1(Point);
Absolute;
MoveTo(x0,y0+L);
DrawHead1(Type);
Absolute;
MoveTo(x0-d/2,y0+L-c2);
IF ThdType = 1 THEN
DrawThreads1(Type)
ELSE
DrawThreads2(Type);
END
{
Draw Thread Type 3 (Detailed threads).
}
ELSE BEGIN
{p:=1/tpic;
Nthds:=TL*tpic-1;
IF (L-c1-c2-NThds*p) > p THEN
NThds:=NThds+1;
IF Type = 1 THEN
NThds:=NThds-1;}
Absolute;
MoveTo(x0,y0);
DrawPoint2(Point);
Absolute;
MoveTo(x0,y0+L);
DrawHead2(Type);
Absolute;
MoveTo(x0,y0);
DrawThreads3(d,di,p,td,Nthds);
END;
Group;
PopAttrs;
99:END;
RUN(SetScr);