home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 March / Chip_1998-03_cd.bin / tema / MINICAD / MC7DEMO / MINICAD.1 / STR_DUCT.MPC < prev    next >
Text File  |  1997-04-30  |  4KB  |  194 lines

  1. PROCEDURE StraightDuctSetup;
  2. {
  3. ⌐1996, Diehl Graphsoft, Inc.
  4. Developed by Frank Brault
  5. Last modified: 4/3/97
  6. }
  7. CONST
  8.     kLineSize = 12;
  9.     kInsulatedOffset = 1.0;
  10.     kLinedOffset = 1.0;
  11.     kFilledPat = 5;
  12.     kPlainPat = 1;
  13.     kDashedLine = -2;
  14.     kSolidLine = 2;
  15.     
  16. VAR
  17. han1,han2 : HANDLE;
  18. item, x1, x2 : INTEGER;
  19. px1,py1,px2,py2,px3,py3,px4,py4 : INTEGER;
  20. dWidth, dDepth, dHtAFF,wallAngle : REAL;
  21. cx1,cy1,tx,ty,xPt1,yPt1,xPt2,yPt2 : REAL;
  22. defaultWallWidth, wallLength : REAL;
  23. theFillPat,defaultPenSize : INTEGER;
  24. cancel,finished : BOOLEAN;
  25. lined, Insulated, filled, labeled : BOOLEAN;
  26. labelString : STRING;
  27.  
  28. FUNCTION Pts2Ang(x1,y1,x2,y2 : REAL) : REAL;
  29. VAR
  30. tR : REAL;
  31. BEGIN
  32.     IF X1 = X2 THEN tR:= 90
  33.     ELSE tR:=arcTan((y2-y1)/(x2-x1)) * 180/pi;
  34.     IF ((tR = 90) & (y2 < y1)) OR (x2 < x1) THEN tR:= -tR;
  35.     IF x2 < x1 THEN
  36.     IF y1 < y2 THEN tR:= 180 - tR
  37.     ELSE 
  38.     IF 180 + tR <> 180 THEN tR:= -(180 + tR)
  39.     ELSE tR:= 180 + tR;
  40.     Pts2Ang:= tR;
  41. END;
  42.  
  43. PROCEDURE CenterDialog(dX1,dX2 : INTEGER; VAR x1,x2 : INTEGER);
  44. VAR
  45. scrX1,scrY1,scrX2,scrY2,w : INTEGER;
  46. BEGIN
  47. GetScreen(scrX1,scrY1,scrX2,scrY2);
  48. w := dX2 - dX1;
  49. x1 := ((scrX1 + scrX2) DIV 2) - (w DIV 2);
  50. x2 := x1 + w;
  51. END;
  52.  
  53. Procedure LocateButtons1(scnh,scnw : INTEGER);
  54. {
  55. This procedure locates the 'OK' and 'Cancel' buttons centered at the bottom of the dialog box.
  56. }
  57. VAR
  58.     v1,v2,v3,v4 : INTEGER;
  59.  
  60. Procedure Swap(VAR  m1,m2,m3,m4 : INTEGER);
  61. VAR
  62.     Temp : INTEGER;
  63. BEGIN
  64.     Temp:=m1;
  65.     m1:=m3;
  66.     m3:=Temp;
  67.     Temp:=m2;
  68.     m2:=m4;
  69.     m4:=Temp;
  70. END;        {of Swap}
  71.  
  72. BEGIN
  73.     px1:=(scnw DIV 2) - 80;
  74.     px2:=(scnw DIV 2) - 10;
  75.     px3:=(scnw DIV 2) + 10;
  76.     px4:=(scnw DIV 2) + 80;
  77.  
  78.     py1:=scnh-40;
  79.     py2:=scnh-20;
  80.     py3:=py1;
  81.     py4:=py2;
  82.  
  83.     GetVersion(v1,v2,v3,v4);
  84.     IF v4 = 1 THEN Swap(px1,px2,px3,px4);
  85. END;        {of Locate Buttons1}
  86.  
  87.  
  88. {***********  MAIN  ***********}
  89. BEGIN
  90.     PushAttrs;
  91.     FillFore(0,0,0);
  92.     defaultWallWidth := GetWallWidth;
  93.     defaultPenSize := FPenSize;
  94.     PenSize(12);
  95.     CENTERDIALOG(0,252,x1,x2);
  96.     LocateButtons1(197,252);
  97.     BEGINDIALOG(1,1,x1,209,x2,406);
  98.         ADDBUTTON('OK',1,1,px1,py1,px2,py2);
  99.         ADDBUTTON('Cancel',2,1,px3,py3,px4,py4);
  100.         ADDFIELD('X',3,1,121,14,132,32);
  101.         ADDFIELD('( Width     X     Depth )',4,1,54,38,199,56);
  102.         ADDFIELD('Duct Height AFF:',5,1,31,68,145,86);
  103.         ADDFIELD('20',6,2,55,12,106,28);
  104.         ADDFIELD('12',7,2,151,12,200,28);
  105.         ADDFIELD('120',8,2,151,67,200,82);
  106.         ADDBUTTON('Lined',9,2,46,104,106,122);
  107.         ADDBUTTON('Insulated',10,2,46,124,126,142);
  108.         ADDBUTTON('Filled',11,2,140,104,200,122);
  109.         ADDBUTTON('Labeled',12,2,140,124,210,142);
  110.     ENDDIALOG;
  111.     
  112.     GetDialog(1);
  113.     finished := FALSE;
  114.     cancel:= FALSE;
  115.     SetTitle('Wall Duct Setup');
  116.     REPEAT DialogEvent(item);
  117.         IF item > 8 THEN SetItem(item,NOT(ItemSel(item)));
  118.         IF item = 2 THEN
  119.         BEGIN
  120.             finished := TRUE;
  121.             cancel := TRUE;
  122.         END;
  123.     IF item = 1 THEN finished := TRUE;
  124.     UNTIL finished;
  125.     lined := ItemSel(9);
  126.     Insulated := ItemSel(10);
  127.     filled := ItemSel(11);
  128.     labeled := ItemSel(12);
  129.     labelString := CONCAT(getField(6),' X ',getField(7));
  130.     dWidth := str2Num(getField(6));
  131.     dDepth := str2Num(getField(7));
  132.     dHtAFF := str2Num(getField(8));
  133.     CLRDIALOG;
  134.  
  135.     IF NOT(cancel) THEN
  136.     BEGIN
  137.         SetZVals(dHtAFF, dDepth);
  138.         IF insulated THEN DoubLines(dWidth + (kInsulatedOffset*2)) ELSE DoubLines(dWidth);
  139.         ClearCavities;
  140.         
  141.         IF filled THEN
  142.         BEGIN
  143.             IF insulated THEN FillPat(kPlainPat) ELSE FillPat(kFilledPat);
  144.             theFillPat := kFilledPat;
  145.         END
  146.         ELSE
  147.         BEGIN
  148.             FillPat(kPlainPat);
  149.             theFillPat := kPlainPat;
  150.         END;
  151.         
  152.         IF lined THEN
  153.         BEGIN
  154.             PenPat(kDashedLine);
  155.             AddCavity(TRUE,-((dWidth/2)-kLinedOffset),(dWidth/2)-kLinedOffset,theFillPat);
  156.         END;
  157.         
  158.         IF Insulated THEN
  159.         BEGIN
  160.             PenPat(kSolidLine);
  161.             AddCavity(TRUE,-(dWidth/2),dWidth/2,theFillPat);
  162.         END;
  163.         IF insulated THEN PenPat(kDashedLine) ELSE PenPat(kSolidLine);
  164.         
  165.         MESSAGE('Draw duct. Double-click to finish...');
  166.         CallTool(-208);
  167.         CLRMESSAGE;
  168.         {WallCap(True,False,False,0.0,0.0);
  169.         WallCap(False,False,False,0.0,0.0);}
  170.         IF labeled THEN
  171.         BEGIN
  172.             han1 := LOBJECT;
  173.             HCenter(han1,cx1,cy1);
  174.             GetSegPt1(han1,xPt1,yPt1);
  175.             GetSegPt2(han1,xPt2,yPt2);
  176.             wallLength := Distance(xPt1,yPt1,xPt2,yPt2);
  177.             wallAngle := Pts2Ang(xPt1,yPt1,xPt2,yPt2);
  178.             IF wallAngle > 90 THEN wallAngle := wallAngle + 180;
  179.             TextOrigin(0,0);
  180.             BeginText;
  181.                 labelString
  182.             EndText;
  183.             han2:= LOBJECT;
  184.             HCENTER(han2,tx,ty);
  185.             HRotate(han2,tx,ty,wallAngle);
  186.             HMove(han2,cx1-tx,cy1-ty);
  187.         END;
  188.     END;
  189.     DoubLines(defaultWallWidth);
  190.     PenSize(defaultPenSize);
  191.     PopAttrs;
  192. END; {** of MAIN}
  193. RUN(StraightDuctSetup);
  194.