home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 March
/
Chip_1998-03_cd.bin
/
tema
/
MINICAD
/
MC7DEMO
/
MINICAD.1
/
2DCON23D.MPC
< prev
next >
Wrap
Text File
|
1997-04-30
|
12KB
|
379 lines
PROCEDURE PolyTo3DObject;
LABEL 1,2;
CONST
kSourceClassStr = 'DTM Source Objs';
kLocusClassStr = '3DLocus';
kPolyClassStr = '3DPolys';
kLocusLayerStr = '_3DLocus';
kPolyLayerStr = '_3DPolys';
kNameLength = 20;
kPolyID = 5;
kLocus3Did = 9;
kPoly3Did = 25;
VAR
polyHandle,layerHandle,targetHandle : HANDLE;
red, green, blue, numObjects, numSObjects : LONGINT;
startElev, interval, suffix, myClassStr, s : STRING;
item, other, x1, x2, badFld, ck, convertPref : INTEGER;
dlogX1, dlogY1, dlogX2, dlogY2 : INTEGER;
cancel,finished,didNothing,interrupted,foundNonPoly : BOOLEAN;
foundStartElev,foundInterval,setLocusBtn,isOpen : BOOLEAN;
dummy, n, height,targetX,targetY,targetZ : REAL;
prevLW, keyCode, copyCount, j : INTEGER;
targetLayerName,sourceLayerName,candidateLayerName : STRING;
polyLayerName,locusLayerName:STRING;
layerName : STRING;
{**********************************************************}
{* Proc PolyTo3DObject by Frank Brault *}
{* ⌐ 1996 Diehl Graphsoft, Inc. *}
{* Convert procedure based on work by Craig Hollinshead *}
{* Converts contour polygons to 3D contour polys. *}
{* Use to preprocess contour data for DTM external. *}
{**********************************************************}
PROCEDURE CenterDialog(dX1,dX2 : INTEGER; VAR x1,x2 : INTEGER);
VAR
scrX1,scrY1,scrX2,scrY2,w : INTEGER;
BEGIN
GetScreen(scrX1,scrY1,scrX2,scrY2);
w := dX2 - dX1;
x1 := ((scrX1 + scrX2) DIV 2) - (w DIV 2);
x2 := x1 + w;
END;
PROCEDURE LowDialog(width,height : INTEGER; VAR x1,y1,x2,y2 : INTEGER);
CONST
kScreenSpace = 16;
VAR
scrX1,scrY1,scrX2,scrY2 : INTEGER;
BEGIN
GetScreen(scrX1,scrY1,scrX2,scrY2);
x1 := ((scrX1 + scrX2) DIV 2) - (width DIV 2);
x2 := x1 + width;
y2 := scrY2 - kScreenSpace;
y1 := y2 - height;
END;
PROCEDURE AlertUser(fldNum : INTEGER);
BEGIN
SysBeep;
finished := FALSE;
selField(fldNum);
END;
Function PolyIsOpen(PolyH : HANDLE) : BOOLEAN;
{** Written by Tom Urie ⌐ 1996 Diehl Graphsoft, Inc.}
LABEL 10,99;
VAR
x0,y0,x1,y1,x2,y2,Perim : REAL;
j,NumVert,Type : INTEGER;
sp,sp1 : STRING;
BEGIN
Type:=GetType(PolyH);
IF Type <> 5 THEN GOTO 99;
NumVert:=GetVertNum(PolyH);
Perim:=0;
FOR j:=1 TO NumVert DO BEGIN;
GetPolyPt(PolyH,j,x2,y2);
IF j = 1 THEN BEGIN
x0:=x2; y0:=y2;
GOTO 10;
END;
Perim:=Perim + Distance(x2,y2,x1,y1);
10:x1:=x2; y1:=y2;
END;
Perim:=Perim + Distance(x1,y1,x0,y0);
sp:=Num2Str(5,Perim);
sp1:=Num2Str(5,HPerim(PolyH));
IF sp <> sp1 THEN
PolyIsOpen:=TRUE
ELSE
PolyIsOpen:=FALSE;
99:END;
Procedure Convert2Polys(sourceHandle : HANDLE; elev : REAL);
VAR
verX,verY,verX2,verY2:REAL;
i,totVertex:INTEGER;
newHandle : HANDLE;
BEGIN
totVertex:=GetVertNum(sourceHandle);
Layer(targetLayerName);
GetPolyPt(sourceHandle,1,verX,verY);
GetPolyPt(sourceHandle,2,verX2,verY2);
{** create 3D poly and acquire handle }
IF isOpen THEN OPENPOLY ELSE CLOSEPOLY;
Poly3D(verX,verY,elev,verX2,verY2,elev);
newHandle:=LNewObj;
FOR i := 3 TO totVertex DO BEGIN
GetPolyPt(sourceHandle,i,verX,verY);
AddVertex3D(newHandle,verX,verY,elev);
END;
Layer(sourceLayerName);
SetLW(sourceHandle,prevLW); {** Make line weight what it was. }
SetPenFore(sourceHandle,red,green,blue); {** Make pen color normal. }
didNothing := False;
Redraw;
END; {** of Convert2Polys procedure }
Procedure Convert2Loci(sourceHandle : HANDLE; elev : REAL);
VAR
verX,verY:REAL;
i,totVertex:INTEGER;
BEGIN
totVertex:=GetVertNum(sourceHandle);
Layer(targetLayerName);
FOR i := 1 TO totVertex DO BEGIN
GetPolyPt(sourceHandle,i,verX,verY);
Locus3D(verX,verY,elev);
END;
Layer(sourceLayerName);
SetLW(sourceHandle,prevLW); {** Make line weight what it was. }
SetPenFore(sourceHandle,red,green,blue); {** Make pen color normal. }
didNothing := False;
Redraw;
END; {** of Convert2Locci procedure }
BEGIN
Absolute;
PushAttrs;
didNothing := True;
isOpen := True;
interrupted := False;
foundStartElev := False;
foundInterval := False;
foundNonPoly := False;
setLocusBtn := False;
sourceLayerName := GetLName(ActLayer);
numObjects := Count((T=Poly) & (L=sourceLayerName));
numSObjects := Count((T=Poly) & (SEL=TRUE) AND (L=sourceLayerName));
IF ((numSObjects < 1) AND (numObjects < 1)) THEN BEGIN
SysBeep;
AlrtDialog('I found no 2D polygons in this layer. Be sure 2D polygons are present and try again.');
GOTO 2;
END;
SetCursor(WatchC);
IF ((numSObjects = 1) AND (GetClass(FSActLayer) = kSourceClassStr))THEN BEGIN
interrupted := True;
IF (Len(sourceLayerName) < (kNameLength - Len(kLocusLayerStr))) Then copyCount := Len(sourceLayerName) ELSE copyCount := (kNameLength - Len(kLocusLayerStr));
locusLayerName := Concat(Copy(sourceLayerName, 1, copyCount),kLocusLayerStr);
IF (Len(sourceLayerName) < (kNameLength - Len(kPolyLayerStr))) Then copyCount := Len(sourceLayerName) ELSE copyCount := (kNameLength - Len(kPolyLayerStr));
polyLayerName := Concat(Copy(sourceLayerName, 1, copyCount),kPolyLayerStr);
layerHandle := FLayer;
targetLayerName := sourceLayerName; {Load legit value in so it won't be empty for first time through. }
WHILE (targetLayerName <> locusLayerName) AND (targetLayerName <> polyLayerName) DO BEGIN
IF layerHandle = NIL THEN GOTO 1;
targetLayerName := GetLName(layerHandle);
candidateLayerName := targetLayerName;
layerHandle := NextLayer(layerHandle);
END;
IF (candidateLayerName = locusLayerName) Then Layer(locusLayerName);
IF (candidateLayerName = polyLayerName) Then Layer(polyLayerName);
IF (GetLName(ActLayer) = sourceLayerName) Then GOTO 1;
targetHandle := FInLayer(ActLayer);
FOR j := 1 TO (NumObj(ActLayer) -1) DO targetHandle := NextObj(targetHandle);
IF (targetHandle <> NIL) Then Begin
IF (GetType(targetHandle) = kPoly3DID) THEN BEGIN
Get3DCntr(targetHandle,targetX,targetY,targetZ);
startElev := Num2StrF(targetZ);
foundStartElev := True;
WHILE ((targetHandle <> NIL) AND (targetZ = str2Num(StartElev))) DO Begin
targetHandle := PrevObj(targetHandle);
Get3DCntr(targetHandle,targetX,targetY,targetZ);
End;
IF (targetZ <> str2Num(StartElev)) Then Begin
interval := Num2StrF(ABS(str2Num(startElev) - targetZ));
startElev := Num2StrF(str2Num(StartElev) + str2Num(interval));
foundInterval := True;
End;
End;
IF (GetType(targetHandle) = kLocus3DID) THEN BEGIN
GetLocus3D(targetHandle,targetX,targetY,targetZ);
setLocusBtn := True;
startElev := Num2StrF(targetZ);
foundStartElev := True;
WHILE ((targetHandle <> NIL) AND (targetZ = str2Num(StartElev))) DO Begin
targetHandle := PrevObj(targetHandle);
GetLocus3D(targetHandle,targetX,targetY,targetZ);
End;
IF (targetZ <> str2Num(StartElev)) Then Begin
interval := Num2StrF(ABS(str2Num(startElev) - targetZ));
startElev := Num2StrF(str2Num(StartElev) + str2Num(interval));
foundInterval := True;
End;
End;
End;
End;
1:Layer(sourceLayerName);
IF NOT(foundStartElev) THEN startElev := Num2StrF(0);
IF NOT(foundInterval) THEN interval := Num2StrF(2);
fPenFore(red,green,blue);
SetCursor(ArrowC);
CenterDialog(0,320,x1,x2);
BeginDialog(1,1,x1,166,x2,377);
AddButton('OK',1,1,238,169,302,192);
AddButton('Cancel',2,1,156,169,220,192);
AddField('___________________________________',3,1,11,11,312,29);
AddField('Poly To 3D Object Setup Dialog',4,1,12,4,225,22);
AddField('Start Elevation:',5,1,12,50,123,68);
AddField('Interval:',6,1,60,79,124,97);
AddField(startElev,7,2,144,50,230,65);
AddField(interval,8,2,144,82,230,97);
AddButton('Create 3D Polygons',9,3,11,117,169,135);
AddButton('Create 3D Loci',10,3,11,135,169,153);
EndDialog;
GetDialog(1);
finished := FALSE;
cancel:= FALSE;
other := 9;
SelField(7);
IF setLocusBtn THEN
setItem(10,TRUE)
ELSE
SetItem(9,TRUE);
REPEAT DialogEvent(item);
IF item = 1 THEN BEGIN
finished := TRUE;
{** Check for unusable field entries }
badFld := 0;
FOR ck := 7 TO 8 DO BEGIN
IF NOT(ValidNumStr(GetField(ck), dummy)) THEN badFld := ck;
END;
IF (str2Num(GetField(8)) <= 0) THEN badFld := 8;
IF (badFld <> 0) THEN alertUser(badFld);
END;
IF item = 2 THEN
BEGIN
finished := TRUE;
cancel := TRUE;
END;
IF item > 8 THEN
BEGIN
SetItem(other,FALSE);
SetItem(item,TRUE);
other := item;
END;
UNTIL finished;
startElev := GetField(7);
interval := GetField(8);
IF ItemSel(9)THEN BEGIN
convertPref := kPoly3Did;
myClassStr := kPolyClassStr;
suffix := kPolyLayerStr;
END;
IF ItemSel(10)THEN BEGIN
convertPref := kLocus3Did;
myClassStr := kLocusClassStr;
suffix := kLocusLayerStr;
END;
CLRDIALOG;
IF cancel THEN GOTO 2;
IF Len(sourceLayerName) < (kNameLength - Len(suffix)) THEN copyCount := Len(sourceLayerName) ELSE copyCount := (kNameLength - Len(suffix));
targetLayerName := CONCAT(Copy(sourceLayerName,1,copyCount),suffix);
{** Prepare polys for processing }
IF NOT(interrupted) THEN BEGIN
IF numObjects > 25 THEN MESSAGE('One moment please╔');
SetCursor(WATCHC);
DSelectAll;
SelectObj((T=Poly) & (L=sourceLayerName));
polyHandle := FSACTLAYER;
if (PolyIsOpen(polyHandle)) THEN isOpen := True Else isOpen := False;
While polyHandle <> NIL DO BEGIN
IF GetType(polyHandle) = kPolyID THEN BEGIN
SetClass(polyHandle,kSourceClassStr);
SetPenFore(polyHandle,0,0,65535); {** Make it Blue. }
polyHandle := NextSObj(polyHandle);
if (PolyIsOpen(polyHandle)) THEN isOpen := True Else isOpen := False;
END
ELSE foundNonPoly := True;
END;
END;
ClrMessage;
polyHandle := FSActLayer;
if (PolyIsOpen(polyHandle)) THEN isOpen := True Else isOpen := False;
SetCursor(ARROWC);
DSelectAll;
IF NOT(interrupted) THEN DoMenuText('Fit To Objects');
SetSelect(polyHandle);
IF (interrupted AND didNothing) THEN
prevLW := 1
ELSE
prevLW := GetLW(polyHandle);
SetPenFore(polyHandle,65535,0,0); {** Make color Red. }
SetLW(polyHandle,28); {** Make line weight thicker. }
ReDrawAll;
LowDialog(462,93,dlogX1, dlogY1, dlogX2, dlogY2);
BeginDialog(2,1,dlogX1, dlogY1, dlogX2, dlogY2);
AddButton('Next',1,1,381,60,445,83);
AddButton('Done',2,1,300,60,364,83);
AddField('Interval:',3,1,17,13,84,31);
AddField(interval,4,1,86,13,145,31);
AddField(startElev,5,1,238,39,300,57);
AddField('Height of highlighted contour:',6,1,17,39,228,57);
AddButton('Use same height as prev.',7,2,16,66,215,84);
AddButton('Up',8,1,239,12,271,35);
AddButton('Dn',9,1,239,60,271,83);
{AddButton('< Back',11,1,300,12,364,35);}
{AddButton('Skip >',10,1,381,12,445,35);}
EndDialog;
GetDialog(2);
finished := FALSE;
cancel:= FALSE;
REPEAT DialogEvent(item);
IF KeyDown(keyCode) THEN BEGIN
IF keyCode = 30 THEN SetField(5,Num2StrF(str2Num(GetField(5)) + str2Num(interval)));
IF keyCode = 31 THEN SetField(5,Num2StrF(str2Num(GetField(5)) - str2Num(interval)));
END;
IF item = 1 THEN BEGIN
height := str2Num(GetField(5));
IF (convertPref = kLocus3Did) THEN Convert2Loci(polyHandle, height);
IF (convertPref = kPoly3Did) THEN Convert2Polys(polyHandle, height);
SelectObj(C = kSourceClassStr);
polyHandle := NextSObj(polyHandle);
if (PolyIsOpen(polyHandle)) THEN isOpen := True Else isOpen := False;
IF polyHandle = NIL THEN finished := True;
IF NOT(finished) THEN BEGIN
DSelectAll;
SetSelect(polyHandle);
prevLW := GetLW(polyHandle);
SetPenFore(polyHandle,65535,0,0); {** Make pen color Red. }
SetLW(polyHandle,28); {** Make line weight thicker. }
ReDrawAll;
IF NOT(didNothing OR itemSel(7)) THEN SetField(5,Num2StrF(str2Num(GetField(5)) + str2Num(interval)));
END;
END;
IF item = 2 THEN BEGIN
finished := TRUE;
cancel := TRUE;
END;
IF item = 7 THEN SetItem(item,NOT(itemSel(item)));
IF item = 8 THEN BEGIN
IF (itemSel(7)) THEN SetItem(7,False);
SetField(5,Num2StrF(str2Num(GetField(5)) + str2Num(interval)));
END;
IF item = 9 THEN BEGIN
IF (itemSel(7)) THEN SetItem(7,False);
SetField(5,Num2StrF(str2Num(GetField(5)) - str2Num(interval)));
END;
{** Do we need to Check that we have more than 2 vertexes? }
UNTIL finished;
CLRDIALOG;
IF cancel THEN GOTO 2;
IF (foundNonPoly = TRUE) THEN AlrtDialog('One or more non-polygon objects were found and ignored.');
DSelectAll;
2:IF NOT(didNothing) THEN Layer(targetLayerName);
PopAttrs;
END;
RUN(PolyTo3DObject);