home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 March
/
Chip_1998-03_cd.bin
/
tema
/
MINICAD
/
MC7DEMO
/
MINICAD.1
/
ARC2SEGS.MPC
< prev
next >
Wrap
Text File
|
1997-04-30
|
6KB
|
321 lines
Procedure ConvToPoly;
{
⌐1996, Diehl Graphsoft, Inc.
Developed by Tom Urie
This procedure converts circles and arcs to a polygon by specifying the number of segments or the segment length.
}
LABEL 10,20,99;
VAR
a,b,f,r,Alpha,Beta,Theta1,Theta2,Theta3,x0,y0,x,y,SegLgth,NSegsR : REAL;
k,Method,nObjs,NSegs,ObjType : INTEGER;
SegLgthS : STRING;
Abort,OK : BOOLEAN;
LayerH,ObjH : HANDLE;
UPI,SF : REAL;
Fmt : INTEGER;
UM,UM2 : STRING;
UName,DA : LONGINT;
Procedure Dialog;
{
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;
CONST
y1=100;
scnw=340;
scnh = 155;
DialogType = 1;
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:=-30;
AddField('Method:',3,1,20,39+h,185,55+h);
AddButton('Number of Segments:',4,3,20,65+h,185,80+h);
AddField('',5,2,190,65+h,265,80+h);
AddButton('Segment Length:',6,3,20,90+h,173,105+h);
AddField('',7,2,190,90+h,265,105+h);
AddField('',8,1,270,90+h,320,105+h);
EndDialog;
END;
BEGIN
MakeDialog;
END;
Procedure InputFtIn(inputS:STRING; VAR a:REAL);
{
This procedure converts a 'Ft & In' string into decimal feet.
}
LABEL 90;
VAR
feet,inches : REAL;
pos1,pos2 : INTEGER;
s1,s2 : STRING;
OK : BOOLEAN;
BEGIN
s1:='0';
s2:='0';
feet:=0;
inches:=0;
pos1:=Pos('''', inputS);
pos2:=Pos('"',inputS);
IF pos1=0 THEN
BEGIN
IF pos2=0 THEN
s2:=inputS
ELSE
s2:=Copy(inputS,1,pos2-1);
GOTO 90;
END ELSE
BEGIN
s1:=Copy(inputS,1,pos1-1);
IF Len(inputS)=pos1 THEN GOTO 90;
IF pos2=0 THEN
s2:=Copy(inputS,pos1+1,Len(inputS)-pos1)
ELSE
s2:=Copy(inputS,pos1+1,Len(inputS)-pos1-1);
END;
pos2:=Pos('-',s2);
IF pos2<>0 THEN
Delete(s2,pos2,1);
90: OK:=ValidNumStr(s1,feet);
OK:=ValidNumStr(s2,inches);
inches:=Abs(Inches);
a:=feet + inches/12;
END;
Procedure GetInfo;
{
This procedure diaplays the dialog box and gets the information.
}
LABEL 10,90;
VAR
Item : INTEGER;
Done : BOOLEAN;
BEGIN
Done:=FALSE;
Abort:=FALSE;
Method:=1;
GetDialog(1);
SetTitle('Convert Arc to Segments');
SetItem(4,TRUE);
SetField(5,'0');
SetField(7,'<n/a>');
SetField(8,UM);
SelField(5);
10:REPEAT
DialogEvent(Item);
IF Item=1 THEN
Done:=TRUE;
IF Item=2 THEN
BEGIN
Done:=TRUE;
Abort:=TRUE;
END;
IF ((Item=4)OR(Item=5))AND(Method<>1) THEN
BEGIN
SetItem(6,FALSE);
SetItem(4,TRUE);
Method:=1;
SetField(5,'0');
SetField(7,'<n/a>');
SelField(5);
END;
IF((Item=6)OR(Item=7))AND(Method<>2) THEN
BEGIN
SetItem(4,FALSE);
SetItem(6,TRUE);
Method:=2;
SetField(7,'0');
SetField(5,'<n/a>');
SelField(7);
END;
UNTIL Done;
IF Abort THEN GOTO 90;
IF Method=1 THEN BEGIN
NSegs:=Str2Num(GetField(5));
IF NSegs>1 THEN GOTO 90;
Sysbeep;
SelField(5);
Done:=FALSE;
GOTO 10;
END ELSE
BEGIN
SegLgthS:=GetField(7);
IF UM=' Ft & In' THEN
InputFtIn(SegLgthS,SegLgth)
ELSE
SegLgth:=Str2Num(SegLgthS);
IF SegLgth>0 THEN GOTO 90;
Sysbeep;
SelField(7);
Done:=FALSE;
GOTO 10;
END;
90:ClrDialog;
END;
{
Main Program
}
BEGIN
LayerH:=ActLayer;
nObjs:=NumSObj(LayerH);
IF nObjs=1 THEN GOTO 10;
Sysbeep;
IF nObjs=0 THEN AlrtDialog('There are no objects selected!')
ELSE AlrtDialog('There are too many objects selected!');
GOTO 99;
10:ObjH:=FSActLayer;
ObjType:=GetType(ObjH);
IF ObjType=6 THEN GOTO 20;
Sysbeep;
AlrtDialog('This command only works with circles and arcs.');
GOTO 99;
20:Dialog;
f:=1;
GetUnits(UName,DA,Fmt,UPI,UM,UM2);
IF (UM='"')AND(UM2=' sq ft') THEN
BEGIN
UM:=' Ft & In';
f:=12;
END
ELSE IF UM='''' THEN
UM:=' ft'
ELSE IF (UM='"')AND(UM2=' sq in') THEN
UM:=' in';
GetInfo;
IF Abort THEN GOTO 99;
DSelectAll;
HCenter(ObjH,x0,y0);
x0:=x0/f;
y0:=y0/f;
GetArc(ObjH,Theta1,Theta2);
r:=HPerim(ObjH)/Deg2Rad(Theta2);
x:=x0+r*Cos(Deg2Rad(Theta1));
y:=y0+r*Sin(Deg2Rad(Theta1));
IF Method=1 THEN
Alpha:=Deg2Rad(Theta2/NSegs)
ELSE BEGIN
Alpha:=2*ArcSin(SegLgth/(2*r));
NSegs:=Deg2Rad(Theta2)/Alpha;
END;
Theta3:=Deg2Rad(Theta1+Theta2);
Absolute;
OpenPoly;
BeginPoly;
LineTo(f*x,f*y);
FOR k:=1 TO NSegs DO
BEGIN
Beta:=Deg2Rad(Theta1)+k*Alpha;
IF Beta>Theta3 THEN Beta:=Theta3;
x:=x0+r*Cos(Beta);
y:=y0+r*Sin(Beta);
LineTo(f*x,f*y);
END;
IF Beta<Theta3 THEN
BEGIN
Beta:=Theta3;
x:=x0+r*Cos(Beta);
y:=y0+r*Sin(Beta);
LineTo(f*x,f*y);
END;
EndPoly;
99:END;
Run(ConvToPoly);