home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 March
/
Chip_1998-03_cd.bin
/
tema
/
MINICAD
/
MC7DEMO
/
MINICAD.1
/
HOLES.MPC
< prev
next >
Wrap
Text File
|
1997-04-30
|
12KB
|
606 lines
Procedure Holes;
{
@1997, Diehl Graphsoft, Inc.
Developed by Tom Urie
This procedure allows the user to place an unlimited number of same size drilled or tapped holes on a drawing.
}
LABEL 5,10,15,20,30,90,99;
CONST
Alpha=30;
k1sd=0.20;
k1st=0.125;
k2s=0.1875;
k1t=0.25;
k2t=0.125;
k3t=0.0625;
k4=0.20;
VAR
x,y,x1,y1,xm,ym,Dia,ID,Depth,D2,DD2,Dy,MaxDia : REAL;
Beta,Beta1,CDia,CDepth,CAngle,CskDepth,DDepth,k1s : REAL;
DPenSize,DPenPat,KeyCode,Type,View : INTEGER;
Abort,OK,NextClick,CenterMark : BOOLEAN;
Counterbore, Countersink : BOOLEAN;
Procedure HoleDialog;
{
This procedure creates the dialog box.
}
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;
GetVersion(v1,v2,v3,v4);
IF v4 = 1 THEN Mac:=TRUE;
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 defines the dialog box.
}
CONST
y1 = 100;
scnw = 390;
scnh = 275;
DialogType = 2;
VAR
h,h0 : INTEGER;
BEGIN
h0:=0;
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:=h0;
AddField('Type:',30,1,20,9+h,60,25+h);
AddButton('Drilled',31,3,65,10+h,125,25+h);
AddButton('Tapped',32,3,130,10+h,200,25+h);
h:=h0-25;
AddField('Size:',19,1,20,59+h,130,75+h);
AddField('Diameter:',5,1,20,79+h,110,95+h);
AddField('',6,2,115,80+h,180,95+h);
AddField('Total Depth:',14,1,20,104+h,110,120+h);
AddField('',15,2,115,105+h,180,120+h);
h:=h0+95;
AddField('View:',26,1,20,19+h,100,35+h);
AddButton('Top view',16,3,20,80+h,100,95+h);
AddButton('Side view - blind hole',17,3,20,40+h,200,55+h);
AddButton('Side view - thru hole',18,3,20,60+h,200,75+h);
h:=h0-30;
AddButton('Counterbore',20,2,220,40+h,320,55+h);
AddButton('Countersink',21,2,220,60+h,320,75+h);
AddField('Diameter:',22,1,220,84+h,295,100+h);
AddField('',23,2,300,85+h,365,100+h);
AddField('Depth:',24,1,220,109+h,295,125+h);
AddField('',25,2,300,110+h,365,125+h);
h:=h0+60;
AddField('Location:',7,1,220,h+54,295,h+70);
AddField('X:',8,1,220,h+79,245,h+95);
AddField('',9,2,250,h+80,325,h+95);
AddField('Y:',10,1,220,h+104,245,h+120);
AddField('',11,2,250,h+105,325,h+120);
AddButton('Next Click(s)',12,3,220,h+130,325,h+145);
AddButton('Show Center Mark',13,2,20,h+140,160,h+155);
EndDialog;
END;
BEGIN
MakeDialog;
END;
Procedure GetInfo;
{
This procedure displays the dialog box and retrieves the information.
}
LABEL 5,10,30,99;
VAR
Item,NTimes : INTEGER;
RFlag : ARRAY[1..2] OF INTEGER;
Done : 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
Done:=FALSE;
Abort:=FALSE;
NTimes:=NTimes+1;
IF NTimes>1 THEN GOTO 5;
{Dia:=0.500;
Depth:=2.000;
CDia:=0.750;
CDepth:=0.500;}
Type:=1;
View:=2;
RFlag[1]:=17;
RFlag[2]:=31;
NextClick:=TRUE;
CenterMark:=TRUE;
Counterbore:=FALSE;
Countersink:=FALSE;
5:GetDialog(1);
SetTitle('Holes');
SetItem(12,NextClick);
SetItem(13,CenterMark);
SetItem(RFlag[1],TRUE);
SetItem(RFlag[2],TRUE);
SetField(6,Num2StrF(Dia));
IF View<>1 THEN
SetField(15,Num2StrF(Depth))
ELSE
SetField(15,'<n/a>');
SetItem(20, Counterbore);
SetItem(21, Countersink);
IF Counterbore OR Countersink THEN
BEGIN
SetField(23,Num2StrF(CDia));
IF View=1 THEN
SetField(25,'<n/a>')
ELSE IF Counterbore THEN
SetField(25,Num2StrF(CDepth))
ELSE
BEGIN
SetField(24,'Incl. Angle:');
SetField(25,Num2StrF(Beta1));
END;
END ELSE
BEGIN
SetField(23,'<n/a>');
SetField(25,'<n/a>');
END;
IF NextClick THEN
BEGIN
SetField(9,'');
SetField(11,'');
END ELSE
BEGIN
SetField(9,Num2StrF(x));
SetField(11,Num2StrF(y));
END;
SelField(6);
10:REPEAT
DialogEvent(Item);
IF Item=1 THEN
Done:=TRUE;
IF Item=2 THEN
BEGIN
Done:=TRUE;
Abort:=TRUE;
END;
IF Item=9 THEN
BEGIN
IF NextClick THEN
BEGIN
NextClick:=FALSE;
SetItem(12,FALSE);
SetField(9,Num2StrF(x));
SetField(11,Num2StrF(y));
SelField(9);
END;
END;
IF Item=11 THEN
BEGIN
IF NextClick THEN
BEGIN
NextClick:=FALSE;
SetItem(12,FALSE);
SetField(9,Num2StrF(x));
SetField(11,Num2StrF(y));
SelField(9);
END;
END;
IF Item=12 THEN
BEGIN
IF NOT NextClick THEN
BEGIN
NextClick:=TRUE;
SetItem(12,TRUE);
SetField(9,'');
SetField(11,'');
SelField(6);
END ELSE
BEGIN
NextClick:=FALSE;
SetItem(12,FALSE);
SetField(9,Num2StrF(x));
SetField(11,Num2StrF(y));
SelField(9);
END;
END;
IF Item=13 THEN BEGIN
CenterMark:=NOT CenterMark;
SetItem(13,CenterMark);
END;
IF (Item=15) AND (View=1) THEN
Sysbeep;
IF Item=16 THEN
BEGIN
SetRButton(1,Item);
View:=1;
SetField(15,'<n/a>');
SetField(25,'<n/a>');
END;
IF (Item=17) OR (Item=18) THEN
BEGIN
IF View=1 THEN
BEGIN
SetField(15,Num2StrF(Depth));
IF Counterbore OR Countersink THEN
SetField(25,Num2StrF(CDepth));
END;
SetRButton(1,Item);
View:=Item-15;
END;
IF Item=20 THEN
BEGIN
Counterbore:=NOT Counterbore;
SetItem(20, Counterbore);
IF Counterbore THEN BEGIN
Countersink:=FALSE;
SetItem(21, FALSE);
SetField(24,'Depth:');
SetField(23,Num2StrF(CDia));
IF View<>1 THEN
SetField(25,Num2StrF(CDepth));
END ELSE IF NOT Countersink THEN
BEGIN
SetField(23,'<n/a>');
SetField(25,'<n/a>');
END;
END;
If Item=21 THEN
BEGIN
Countersink:=NOT Countersink;
SetItem(21, Countersink);
IF Countersink THEN BEGIN
Counterbore:=FALSE;
SetItem(20, FALSE);
SetField(24,'Incl. Angle:');
SetField(23,Num2StrF(CDia));
IF View<>1 THEN
SetField(25,Num2StrF(Beta1));
END ELSE IF NOT Counterbore THEN
BEGIN
SetField(23,'<n/a>');
SetField(25,'<n/a>');
END;
END;
IF Item=23 THEN
BEGIN
IF NOT(Counterbore OR Countersink) THEN BEGIN
SysBeep;
SetField(23,'<n/a>');
END;
END;
IF Item=25 THEN
BEGIN
IF (NOT(Counterbore OR Countersink))OR(View=1) THEN
BEGIN
Sysbeep;
SetField(25,'<n/a>');
END;
END;
IF (Item=31) OR (Item=32) THEN
BEGIN
SetRButton(2,Item);
Type:=Item-30;
END;
UNTIL Done;
IF Abort THEN GOTO 99;
OK:=ValidNumStr(GetField(6),Dia);
OK:=ValidNumStr(GetField(15),Depth);
IF (Dia<=0) OR ((Depth<=0) AND (View< 1)) THEN
BEGIN
Sysbeep;
Done:=FALSE;
IF Dia<=0 THEN SelField(6)
ELSE SelField(15);
GOTO 10;
END;
IF Counterbore OR Countersink THEN
BEGIN;
OK:=ValidNumStr(GetField(23),CDia);
IF Counterbore THEN
OK:=ValidNumStr(GetField(25),CDepth)
ELSE
OK:=ValidNumStr(GetField(25),Beta1);
IF ((CDia<=0) OR ((((CDepth<=0) AND Counterbore) OR ((Beta1<=0) AND Countersink)) AND (View<>1))) THEN
BEGIN
Sysbeep;
Done:=FALSE;
IF CDia<=0 THEN SelField(23)
ELSE SelField(25);
GOTO 10;
END;
END;
OK:=ValidNumStr(GetField(9),x);
OK:=ValidNumStr(GetField(11),y);
99:ClrDialog;
END;
Procedure CMark1(Dia,x,y : REAL);
VAR
L1,L2 : REAL;
BEGIN
PushAttrs;
PenPat(2);
PenSize(5);
L1:=k1t;
IF L1 > Dia/2 THEN L1:=0.5*Dia;
L2:=Dia/2 + k2t - k3t - L1/2;
Absolute;
MoveTo(x,y);
Relative;
Move(-(Dia/2+k2t),0);
Line(L2,0);
Move(k3t,0);
Line(L1,0);
Move(k3t,0);
Line(L2,0);
Absolute;
MoveTo(x,y);
Relative;
Move(0,-(Dia/2+k2t));
Line(0,L2);
Move(0,k3t);
Line(0,L1);
Move(0,k3t);
Line(0,L2);
PopAttrs;
END;
{
Main Program.
}
BEGIN
DSelectAll;
{
Display dialog box.
}
HoleDialog;
SetCursor(ArrowC);
{
Get information from the dialog box.
}
GetInfo;
IF Abort THEN GOTO 99;
{
Calculate variables.
}
IF Type=1 THEN
BEGIN
k1s:=k1sd;
IF View= 3THEN Dy:=0
ELSE Dy:=Dia*Tan(Deg2Rad(Alpha))/2;
END ELSE
BEGIN
k1s:=k1st;
ID:=Dia*(1-k4);
IF View = 3 THEN
BEGIN
D2:=Depth;
Dy:=0;
END ELSE
BEGIN
D2:=Depth + k1s*Dia;
Dy:=ID*Tan(Deg2Rad(Alpha))/2;
END;
DDepth:=Depth;
DD2:=D2;
END;
DPenSize:=FPenSize;
DPenPat:=FPenPat;
PushAttrs;
{
Draw holes.
}
IF NextClick THEN
BEGIN
Message('Click location of hole(s). Hit any key to quit.');
SetCursor(LgCrossC);
END;
WHILE NOT KeyDown(KeyCode) DO
BEGIN
IF NOT NextClick THEN GOTO 5;
IF MouseDown(x,y) THEN
BEGIN
5:Absolute;
MoveTo(x,y);
IF View>1 THEN GOTO 15;
{
Top view.
}
Relative;
IF Counterbore OR Countersink THEN
BEGIN
Arc(-CDia/2,CDia/2,CDia/2,-CDia/2,0,360);
MaxDia:=CDia;
END ELSE
MaxDia:=Dia;
IF Type=1 THEN
Arc(-Dia/2,Dia/2,Dia/2,-Dia/2,0,360)
ELSE
BEGIN
PenPat(-2);
PenSize(0.5*DPenSize);
Arc(-Dia/2,Dia/2,Dia/2,-Dia/2,0,360);
PenPat(DPenPat);
PenSize(DPenSize);
Arc(-ID/2,ID/2,ID/2,-ID/2,0,360);
END;
IF CenterMark THEN CMark1(MaxDia,x,y);
GOTO 90;
{
Side View.
}
15:Relative;
DDepth:=Depth;
IF Counterbore THEN
BEGIN
DDepth:=Depth-CDepth;
DD2:=D2-CDepth;
Move(-CDia/2,0);
Rect(0,0,CDia,-CDepth);
Move(CDia/2,-CDepth);
END ELSE IF Countersink THEN
BEGIN
Beta:=Deg2Rad(Beta1/2);
CskDepth:=(CDia-Dia)/(2*Tan(Beta));
DDepth:=Depth-CskDepth;
DD2:=D2-CskDepth;
Move(-CDia/2,0);
ClosePoly;
Poly(0,0,(CDia-Dia)/2,-CskDepth,Dia,0,(CDia-Dia)/2,CskDepth);
Move(-CDia/2,-CskDepth);
END;
IF Type=1 THEN
BEGIN
Move(-Dia/2,0);
Rect(0,0,Dia,-DDepth);
IF View=3 THEN GOTO 20;
Move(0,-DDepth);
ClosePoly;
Poly(0,0,Dia/2,-Dy,Dia/2,Dy);
END ELSE
BEGIN
Move(-ID/2,0);
Rect(0,0,ID,-DD2);
PenPat(-2);
PenSize(0.5*DPenSize);
Move(-(Dia-ID)/2,0);
Line(0,-DDepth);
IF View = 2 THEN
Line(Dia,0)
ELSE
Move(Dia,0);
Line(0,DDepth);
PenPat(DPenPat);
PenSize(DPenSize);
IF View=3 THEN GOTO 20;
Move(-(Dia+ID)/2,-DD2);
ClosePoly;
Poly(0,0,ID/2,-Dy,ID/2,Dy);
END;
20:IF CenterMark THEN BEGIN
PushAttrs;
PenPat(-9);
PenSize(10);
Absolute;
MoveTo(x,y+k2s);
Line(0,-(Depth+Dy+2*k2s));
PopAttrs;
END;
90:Group;
Redraw;
DSelectAll;
IF NOT NextClick THEN GOTO 99;
END;
END;
ClrMessage;
99:END;
RUN(Holes);