home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 13 / 13.iso / p / p068 / 4.img / PV.CDL < prev    next >
Encoding:
Text File  |  1989-01-04  |  18.6 KB  |  885 lines

  1. REM  @(#)CADKEY SOLIDS    pv.cdl    2.6    11/25/88
  2. REM  
  3. REM "pv.cdl V1.8 -- R.H. LaRochelle 12-November-87 "
  4. REM "This program generates CADKEY SOLIDS animation script pv.ani"
  5. REM "with the user's permission, pv.ani is copied to user specified file "
  6. REM "Menu structure changed 07-October-87 "
  7.  
  8. REM "Initialization "
  9.  
  10. array tfltdat[9]
  11. array    $tstr[1]
  12. array   grpused[129]
  13.  
  14. i = 0
  15. newgroup = 1
  16. :lpgrp
  17. i = i + 1
  18. GETGROUP i
  19. grpused[i] = @INTDAT[0]
  20. if ( grpused[i] != 0 )
  21. newgroup = i + 1
  22. if (( i < 128 ) && ( grpused[i] != 0 ))
  23. goto lpgrp
  24.  
  25. set devout, pv.ani, 0
  26. optdraw = 1
  27. optfill = 0
  28. optdash = 0
  29. incremnt = 22.5
  30. curlevel = 1.0
  31. frame = 1.0
  32. lens = 1.0
  33. standoff = 10000.00
  34. standset = 0
  35. lensset = 0
  36. opt4view = 0
  37. L1 = 1.0
  38. L2 = 0.64
  39. L3 = -0.17
  40. from_main = 1
  41. from_render = 0
  42. from_rotate = 0
  43. from_bool = 0
  44. REM 'Default color classes '
  45. array colran[4][8]
  46. colran[0][0] = 1
  47. colran[1][0] = 16
  48. colran[2][0] = 55
  49.  
  50. colran[0][1] = 2
  51. colran[1][1] = 56
  52. colran[2][1] = 95
  53.  
  54. colran[0][2] = 3
  55. colran[1][2] = 96
  56. colran[2][2] = 135
  57.  
  58. colran[0][3] = 4
  59. colran[1][3] = 136
  60. colran[2][3] = 175
  61.  
  62. colran[0][4] = 5
  63. colran[1][4] = 176
  64. colran[2][4] = 215
  65.  
  66. colran[0][5] = 6
  67. colran[1][5] = 216
  68. colran[2][5] = 255
  69.  
  70. colran[0][6] = 7
  71. colran[1][6] = 1
  72. colran[2][6] = 15
  73.  
  74. colran[0][7] = 8
  75. colran[1][7] = 1
  76. colran[2][7] = 15
  77.  
  78. print "REM this animation file generated by pv.cdl V2.01\n\n"
  79. if (optdraw == 1)
  80.     print "MODE DRAW\n"
  81. if (optdraw == 1)
  82.     print "DRAW 1\n"
  83. if (optfill == 1)
  84.     print "FILL 1\n"
  85. if (optdash == 1)
  86.     print "DASH 1\n"
  87. print "LIGHT %f, %f, %f\n\n", L1, L2, L3
  88. tmp = 0.0
  89. XROT = 0.0
  90. YROT = 0.0
  91. ZROT = 0.0
  92. XANGLE = 0.0
  93. YANGLE = 0.0
  94. ZANGLE = 0.0
  95. DEGREE = 3.141592654 / 180
  96. A0 = 0.0
  97. A1 = 0.0
  98. A2 = 0.0
  99. A3 = 0.0
  100. A4 = 0.0
  101. A5 = 0.0
  102. A6 = 0.0
  103. A7 = 0.0
  104. A8 = 0.0
  105. C1 = 0.0
  106. C2 = 0.0
  107. C3 = 0.0
  108. curscale = @scale
  109. goto mainmenu
  110.  
  111. :cleanup
  112.     if (optdraw == 1)
  113.         print "MODE NORMAL\n"
  114.  
  115. :yes
  116.     if ( frame > 1 ) 
  117.     goto okframes
  118.     getmenu "PV: Action file has no frames, still exit ? (NO)","NO","YES"
  119.     on (@key + 3) goto leave_it ,mainmenu,yes,,mainmenu,okframes
  120.     goto yes
  121. :okframes
  122.     print "exit\n"
  123.     i = 0
  124.     $ts = "sol.act"
  125.     getstr "PV: Enter action file name (%s) => ",$ts,$anname
  126.     on (@key + 3 ) goto no,mainmenu,okframes,
  127. sprint $str,"copy pv.ani %s \n"", $anname
  128. exec 1, $str
  129. :no
  130. :leave_it
  131.     clear tmp,tmp1,tmp2,incremnt, lens, frame, curscale, curlevel, standoff
  132.     clear XROT, YROT, ZROT, XANGLE, YANGLE, ZANGLE, DEGREE
  133.     clear A0, A1, A2, A3, A4, A5, A6, A7, A8, C1, C2, C3, L1, L2, L3
  134.     clear optdraw, optfill, optdash,standset,lensset
  135.     clear tmplens,tfltdat[9]
  136.     clear classnum,classtmp,opt4view
  137.     clear from_main,from_render,from_rotate,from_bool
  138.     clear grp1,grp2,operation,newgroup
  139.     clear $ts,$anname
  140.     exit
  141.  
  142. :mainmenu
  143.     from_main = 1
  144.     from_render = 0
  145.     from_rotate = 0
  146.     from_bool = 0
  147.  
  148.     getmenu "PV: Choose option",\
  149.         "MODE",\
  150.         "4VIEW",\
  151.         "ROTATE",\
  152.         "RENDER",\
  153.         "BOOLEANS",\
  154.         "LEVEL",\
  155.         "VERSION",\
  156.         "FRAME",\
  157.         "DONE"
  158.  
  159.     on (@key + 3) goto no,leave_it,mainmenu,,\
  160.         domode,\
  161.         do4view,\
  162.         rotatemenu,\
  163.         rendermenu,\
  164.         boolmenu,\
  165.         dolevel,\
  166.         dovers ,\
  167.         doframe ,\
  168.         cleanup
  169.     goto mainmenu
  170.  
  171.  
  172. REM '-----------------------------------------------------------------'
  173. REM '--        Handle rotations                                       '
  174. REM '-----------------------------------------------------------------'
  175. :rotatemenu
  176.     from_rotate = 1
  177.     getmenu "PV : Choose option",\
  178.         "TOP OUT",\
  179.         "TOP IN",\
  180.         "RT OUT",\
  181.         "RT IN",\
  182.         "CCW",\
  183.         "CW",\
  184.         "INCRMNT",\
  185.         "FRAME",\
  186.         "DONE"
  187.  
  188.     on (@key + 3) goto no,mainmenu,rotatemenu,,\
  189.         dotopout,\
  190.         dotopin,\
  191.         dortout,\
  192.         dortin,\
  193.         doccw,\
  194.         docw,\
  195.         doincr,\
  196.         doframe,\
  197.         mainmenu
  198.     goto rotatemenu
  199.  
  200. :dotopout
  201.     XROT = incremnt
  202.     goto doview
  203. :dotopin
  204.     XROT = -incremnt
  205.     goto doview
  206. :dortout
  207.     YROT = -incremnt
  208.     goto doview
  209. :dortin
  210.     YROT = incremnt
  211.     goto doview
  212. :doccw
  213.     ZROT = incremnt
  214.     goto doview
  215. :docw
  216.     ZROT = -incremnt
  217.     goto doview
  218. :doincr
  219.     tmp = incremnt
  220.     getflt "PV : Enter rotation increment (%f) =>",tmp,incremnt
  221.     on (@key + 3 ) goto no,rotatemenu,doincr,
  222.     if ( incremnt  >  0.0 )      
  223.     goto rotatemenu
  224.     pause "Invalid increment... press RETURN "
  225.     incremnt = tmp
  226.     goto doincr 
  227.  
  228. :doframe
  229.     print "DUMPCOLOR\n"
  230.     print "CHANGEPAL\n"
  231.     prompt "PV : frame %d",frame
  232.     getview @view
  233.     tfltdat[0] = @fltdat[0]
  234.     tfltdat[1] = @fltdat[1]
  235.     tfltdat[2] = @fltdat[2]
  236.     tfltdat[3] = @fltdat[3]
  237.     tfltdat[4] = @fltdat[4]
  238.     tfltdat[5] = @fltdat[5]
  239.     tfltdat[6] = @fltdat[6]
  240.     tfltdat[7] = @fltdat[7]
  241.     tfltdat[8] = @fltdat[8]
  242.  
  243.     XANGLE = 0.0
  244.     YANGLE = 0.0
  245.     ZANGLE = 0.0
  246.  
  247.     if ((tfltdat[0] < 0.00001) && (tfltdat[0] > -0.00001))
  248.     if ((tfltdat[1] < 0.00001) && (tfltdat[1] > -0.00001))
  249.         goto doframe1
  250.  
  251.     ZANGLE = -atan2(tfltdat[1], tfltdat[0])
  252.  
  253. :doframe1
  254.     C1 = cos(ZANGLE)
  255.     C2 = -sin(ZANGLE)
  256.  
  257.     A0 = tfltdat[0] * C1 + tfltdat[1] * C2
  258.     A3 = tfltdat[3] * C1 + tfltdat[4] * C2
  259.     A6 = tfltdat[6] * C1 + tfltdat[7] * C2
  260.  
  261.     C1 = sin(ZANGLE)
  262.     C2 = cos(ZANGLE)
  263.  
  264.     A1 = tfltdat[0] * C1 + tfltdat[1] * C2
  265.     A4 = tfltdat[3] * C1 + tfltdat[4] * C2
  266.     A7 = tfltdat[6] * C1 + tfltdat[7] * C2
  267.  
  268.     tfltdat[0] = A0
  269.     tfltdat[1] = A1
  270.     tfltdat[3] = A3
  271.     tfltdat[4] = A4
  272.     tfltdat[6] = A6
  273.     tfltdat[7] = A7
  274.  
  275.     if ((tfltdat[2] < 0.00001) && (tfltdat[2] > -0.00001))
  276.         goto doframe2
  277.  
  278.     if (tfltdat[2] < -0.99999)
  279.         YANGLE = 90.0
  280.     if (tfltdat[2] < -0.99999)
  281.         goto doframe2
  282.  
  283.     if (tfltdat[2] > 0.99999)
  284.         YANGLE = -90.0
  285.     if (tfltdat[2] > 0.99999)
  286.         goto doframe2
  287.  
  288.     if ((tfltdat[6] < 0.00001) && (tfltdat[6] > -0.00001))
  289.     if ((tfltdat[8] < 0.00001) && (tfltdat[8] > -0.00001))
  290.         goto doframe2
  291.  
  292.     YANGLE = -atan2(tfltdat[6], tfltdat[8])
  293.  
  294. :doframe2
  295.     C1 = cos(YANGLE)
  296.     C3 = sin(YANGLE)
  297.  
  298.     A0 = tfltdat[0] * C1 + tfltdat[2] * C3
  299.     A3 = tfltdat[3] * C1 + tfltdat[5] * C3
  300.     A6 = tfltdat[6] * C1 + tfltdat[8] * C3
  301.  
  302.     C1 = -sin(YANGLE)
  303.     C3 = cos(YANGLE)
  304.  
  305.     A2 = tfltdat[0] * C1 + tfltdat[2] * C3
  306.     A5 = tfltdat[3] * C1 + tfltdat[5] * C3
  307.     A8 = tfltdat[6] * C1 + tfltdat[8] * C3
  308.  
  309.     tfltdat[0] = A0
  310.     tfltdat[2] = A2
  311.     tfltdat[3] = A3
  312.     tfltdat[5] = A5
  313.     tfltdat[6] = A6
  314.     tfltdat[8] = A8
  315.  
  316.     if ((tfltdat[4] < 0.00001) && (tfltdat[4] > -0.00001))
  317.     if ((tfltdat[5] < 0.00001) && (tfltdat[5] > -0.00001))
  318.         goto doframe3
  319.  
  320.     XANGLE = -atan2(tfltdat[5], tfltdat[4])
  321.  
  322. :doframe3
  323.     A0 = tfltdat[0]
  324.     A3 = tfltdat[3]
  325.     A6 = tfltdat[6]
  326.  
  327.     C2 = cos(XANGLE)
  328.     C3 = -sin(XANGLE)
  329.  
  330.     A1 = tfltdat[1] * C2 + tfltdat[2] * C3
  331.     A4 = tfltdat[4] * C2 + tfltdat[5] * C3
  332.     A7 = tfltdat[7] * C2 + tfltdat[8] * C3
  333.  
  334.     C2 = sin(XANGLE)
  335.     C3 = cos(XANGLE)
  336.  
  337.     A2 = tfltdat[1] * C2 + tfltdat[2] * C3
  338.     A5 = tfltdat[4] * C2 + tfltdat[5] * C3
  339.     A8 = tfltdat[7] * C2 + tfltdat[8] * C3
  340.  
  341.     if (A0 > 0.0)
  342.         goto doframe4
  343.     A0 = -A0
  344.     A8 = -A8
  345.     YANGLE = YANGLE + 180
  346.     XANGLE = XANGLE + 180
  347.  
  348. :doframe4
  349.  
  350.     if (A4 > 0.0)
  351.         goto doframe5
  352.     A4 = -A4
  353.     A8 = -A8
  354.     XANGLE = XANGLE + 180
  355.  
  356. :doframe5
  357.     if (XANGLE > 180)
  358.         XANGLE = XANGLE - 360
  359.     if (YANGLE > 180)
  360.         YANGLE = YANGLE - 360
  361.     if (ZANGLE > 180)
  362.         ZANGLE = ZANGLE - 360
  363.  
  364.     if ( optfill  < 1 )
  365.     print "prompt \"Frame %d: Drawing, please wait...\"\n",frame
  366.     print "AUTOWINDOW 0.05, 0.05, 0.95, 0.95\n"
  367.     if ( optfill == 0 )
  368.         print "LEVELS 1,255\n"
  369. tmp = lens
  370. if ( lensset == 0 )
  371. lens = 0.0
  372. if ( standset == 0 )
  373. goto zerostand
  374. print "CAMERA 0.0, 0.0, 0.0, %f, %f, %f, %f, %f\n",\
  375. (-XANGLE * DEGREE), (-YANGLE * DEGREE), (-ZANGLE * DEGREE), lens, standoff
  376. goto endstand
  377. :zerostand
  378. print "CAMERA 0.0, 0.0, 0.0, %f, %f, %f, %f\n",\
  379. (-XANGLE * DEGREE), (-YANGLE * DEGREE), (-ZANGLE * DEGREE), lens
  380. :endstand
  381.     print "REM VW    %f %f %f\n", A0, A1, A2
  382.     print "REM      %f %f %f\n", A3, A4, A5
  383.     print "REM      %f %f %f\n", A6, A7, A8
  384.     print "CLS\n"
  385.     print "HLR 0, %d\n",curlevel
  386.     if ( opt4view == 0 )
  387.     print "pause \"Frame %d (RETURN for next frame, ESC to quit).\"\n",frame
  388.     frame = frame + 1
  389.     if (optdraw == 1)
  390.         print "if (@key == -3)\n"
  391.     if (optdraw == 1)
  392.         print "MODE NORMAL\n"
  393.     print "if (@key == -3)\n"
  394.     print "exit\n"
  395.     lens = tmp
  396.     if ( from_bool == 1 )
  397.     goto boolmenu
  398.     if ( from_rotate == 1 )
  399.     goto rotatemenu
  400.     if ( from_render == 1 )
  401.     goto rendermenu
  402.     if ( from_main == 1 ) 
  403.     goto mainmenu
  404.  
  405. :doview
  406.     curscale = @scale
  407.     getview @view
  408.  
  409.     C1 = cos(ZROT) * cos(YROT)
  410.     C2 = ((-sin(ZROT)) * cos(XROT) + cos(ZROT) * sin(YROT) * sin(XROT))
  411.     C3 = (sin(ZROT) * sin(XROT) + cos(ZROT) * sin(YROT) * cos(XROT))
  412.  
  413.     A0 = @fltdat[0] * C1 + @fltdat[1] * C2 + @fltdat[2] * C3
  414.     A3 = @fltdat[3] * C1 + @fltdat[4] * C2 + @fltdat[5] * C3
  415.     A6 = @fltdat[6] * C1 + @fltdat[7] * C2 + @fltdat[8] * C3
  416.  
  417.     C1 = sin(ZROT) * cos(YROT)
  418.     C2 = (cos(ZROT) * cos(XROT) + sin(ZROT) * sin(YROT) * sin(XROT))
  419.     C3 = ((-cos(ZROT)) * sin(XROT) + sin(ZROT) * sin(YROT) * cos(XROT))
  420.  
  421.     A1 = @fltdat[0] * C1 + @fltdat[1] * C2 + @fltdat[2] * C3
  422.     A4 = @fltdat[3] * C1 + @fltdat[4] * C2 + @fltdat[5] * C3
  423.     A7 = @fltdat[6] * C1 + @fltdat[7] * C2 + @fltdat[8] * C3
  424.  
  425.     C1 = (-sin(YROT))
  426.     C2 = cos(YROT) * sin(XROT)
  427.     C3 = cos(YROT) * cos(XROT)
  428.  
  429.     A2 = @fltdat[0] * C1 + @fltdat[1] * C2 + @fltdat[2] * C3
  430.     A5 = @fltdat[3] * C1 + @fltdat[4] * C2 + @fltdat[5] * C3
  431.     A8 = @fltdat[6] * C1 + @fltdat[7] * C2 + @fltdat[8] * C3
  432.  
  433.     VIEW 9, A0, A1, A2, A3, A4, A5, A6, A7, A8
  434.     set view, @lastvw
  435.     scale curscale
  436.     redraw
  437.  
  438.     XROT = 0.0
  439.     YROT = 0.0
  440.     ZROT = 0.0
  441.     goto rotatemenu
  442.  
  443. :do4view
  444. print "MODE NORMAL\n"
  445. print "DRAW 0\n"
  446. print "FOURVIEW\n" 
  447. opt4view = 1
  448. prompt "Four view drawing will be produced"
  449. wait 2
  450. goto mainmenu
  451.  
  452. REM '-----------------------------------------------------------------'
  453. REM '--        Handle rendering                                       '
  454. REM '-----------------------------------------------------------------'
  455.  
  456. :rendermenu
  457.     from_render = 1
  458.     getmenu "PV : Choose option",\
  459.         "HIDDEN",\
  460.         "DASHED",\
  461.         "FILL",\
  462.         "SMOOTH",\
  463.         "PERSPC",\
  464.         "LIGHT",\
  465.         "CCLASS",\
  466.         "FRAME"
  467.  
  468.     on (@key + 3) goto no,mainmenu,rendermenu,,\
  469.         dohidden,\
  470.         dodashed,\
  471.         dofilled,\
  472.         dosmooth,\
  473.         doperspective,\
  474.         light_menu,\
  475.         color_menu,\
  476.         doframe,\
  477.         mainmenu
  478.     goto rendermenu
  479.  
  480. :dohidden
  481.     optfill = 0
  482.     print "FILL 0\n"
  483.     print "DASH 0\n"
  484.     prompt "Hidden lines selected"
  485.     wait 2
  486.     goto rendermenu
  487. :dodashed
  488.     optfill = 0
  489.     print "FILL 0\n"
  490.     print "DASH 1\n"
  491.     prompt "Dashed lines selected"
  492.     wait 2
  493.     goto rendermenu
  494.  
  495. :dosmooth
  496.     optfill = 2
  497.     print "FILL 2\n"
  498.     prompt "Smooth shading selected" 
  499.     wait 2
  500.     goto rendermenu
  501.  
  502. :dofilled
  503.      optfill = 1    
  504.      print "FILL 1\n"
  505.     prompt "Shaded solids selected"
  506.     wait 2
  507.     goto rendermenu
  508.  
  509. :light_menu
  510.     getmenu "Choose method of entering light coordinates",\
  511.         "WORLD",\
  512.         "VIEW"
  513.     on (@key + 3) goto no,rendermenu,light_menu,,\
  514.         dolight,\
  515.         dovlight
  516.     goto light_menu
  517.  
  518. :color_menu
  519.     getmenu "PV : Choose option",\
  520.         "CLASS 1",\
  521.         "CLASS 2",\
  522.         "CLASS 3",\
  523.         "CLASS 4",\
  524.         "CLASS 5",\
  525.         "CLASS 6",\
  526.         "CLASS 7",\
  527.         "CLASS 8",\
  528.         "DONE"
  529.  
  530.     on (@key + 3) goto no,rendermenu,color_menu,,\
  531.         do_class ,\
  532.         do_class ,\
  533.         do_class ,\
  534.         do_class ,\
  535.         do_class ,\
  536.         do_class ,\
  537.         do_class ,\
  538.         do_class ,\
  539.         rendermenu
  540.     goto color_menu
  541.  
  542. :do_class
  543.     classnum = @key - 1
  544.     classtmp = @key
  545. :do_cla
  546.     tmp = colran[0][classnum]
  547.     getint "PV : Enter outline index (%d) =>",tmp,colran[0][classnum]
  548.     on (@key + 3 ) goto no,color_menu,do_cla,
  549.     if ( (colran[0][classnum] >= 0) && (colran[0][classnum] <=15))
  550.     goto do_class1
  551.     pause "Invalid Index... press RETURN "
  552.     colran[0][classnum] = tmp
  553.     goto do_cla
  554. :do_class1
  555.     tmp1 = colran[1][classnum]
  556.     getint "PV : Enter range start (%d) =>",tmp1,colran[1][classnum]
  557.     on (@key + 3 ) goto no,do_cla,do_class1,
  558.     if ( (colran[1][classnum] >= 16) && (colran[1][classnum] <=255))
  559.     goto do_class2
  560.     pause "Invalid Range Start... press RETURN "
  561.     colran[1][classnum] = tmp1
  562.     goto do_class1
  563. :do_class2
  564.     tmp2 = colran[2][classnum]
  565.     getint "PV : Enter range end (%d) =>",tmp2,colran[2][classnum]
  566.     on (@key + 3 ) goto no,do_class1,do_class2,
  567.     if ( (colran[2][classnum] >= 16) && (colran[2][classnum] <=255))
  568.     goto do_class3
  569.     pause "Invalid Range End... press RETURN "
  570.     colran[2][classnum] = tmp2
  571.     goto do_class2
  572. :do_class3
  573.     if ( colran[2][classnum] < colran[1][classnum] )
  574.     goto error_class
  575.  
  576.     print "COLORCLASS  %d, %d, %d, %d\n",\
  577.     classtmp,colran[0][classnum],colran[1][classnum],colran[2][classnum]
  578.     goto color_menu
  579.  
  580.     :error_class
  581.     pause "Invalid Range End... press RETURN "
  582.     colran[1][classnum] = tmp1
  583.     colran[2][classnum] = tmp2
  584.     goto do_class1
  585.  
  586. :doperspective
  587.     getmenu "Choose method of creating perspective view",\
  588.         "LENS",\
  589.         "STANDOFF",\
  590.         "NONE"
  591.     on (@key + 3) goto no,rendermenu,doperspective,,\
  592.         dolens,\
  593.         dostandoff,\
  594.         donopersp
  595.     goto rendermenu
  596.  
  597. :domode
  598.     if (optdraw == 1)
  599.         goto dodraw1m
  600.  
  601. :dodrwm
  602.     getmenu "PV : Choose CADL mode option (NORMAL)",\
  603.         "NORMAL",\
  604.         "DRAW"
  605.     on (@key + 3) goto mainmenu,mainmenu,dodrawn,,\
  606.         dodrawn,\
  607.         dodrawy
  608.     goto dodrwm
  609.  
  610. :dodraw1m
  611.     getmenu "PV : choose CADL mode option (DRAW)",\
  612.         "NORMAL",\
  613.         "DRAW"
  614.     on (@key + 3) goto mainmenu,mainmenu,dodrawy,,\
  615.         dodrawn,\
  616.         dodrawy
  617.     goto dodraw1m
  618.  
  619. :dodrawn
  620.     print "MODE NORMAL\n"
  621.     print "DRAW 0\n"
  622.     optdraw = 0
  623.     prompt "Mode set to normal   "
  624.     wait 2
  625.     goto mainmenu
  626.  
  627. :dodrawy
  628.     print "MODE DRAW\n"
  629.     print "DRAW 1\n"
  630.     optdraw = 1
  631.     prompt "Mode set to draw     "
  632.     wait 2
  633.     goto mainmenu
  634.  
  635.  
  636. :dolight
  637.     tmp = L1
  638.     getflt "PV : Enter light source direction X (%f) =>",tmp,L1
  639.     on (@key + 3 ) goto no,rendermenu,dolight,
  640.  
  641. :dolt2
  642.     tmp = L2
  643.     getflt "PV : Enter light source direction Y (%f) =>",tmp,L2
  644.     on (@key + 3 ) goto no,dolight,dolt2,
  645.  
  646. :dolt3
  647.     tmp = L3
  648.     getflt "PV : Enter light source direction Z (%f) =>",tmp,L3
  649.     on (@key + 3 ) goto no,dolt2,dolt3,
  650.     print "LIGHT %f, %f, %f\n", L1, L2, L3
  651.     goto rendermenu 
  652.  
  653. :dovlight
  654.     tmp = L1
  655.     getflt "PV : Enter view light source direction XV (%f) =>",tmp,L1
  656.     on (@key + 3 ) goto no,rendermenu,dovlight,
  657.  
  658. :dovlt2
  659.     tmp = L2
  660.     getflt "PV : Enter view light source direction YV (%f) =>",tmp,L2
  661.     on (@key + 3 ) goto no,dovlight,dovlt2,
  662.  
  663. :dovlt3
  664.     tmp = L3
  665.     getflt "PV : Enter view light source direction ZV (%f) =>",tmp,L3
  666.     on (@key + 3 ) goto no,dovlt2,dovlt3,
  667.  
  668.     getview @view
  669.     C1 = @fltdat[0] * L1 + @fltdat[1] * L2 + @fltdat[2] * L3
  670.     C2 = @fltdat[3] * L1 + @fltdat[4] * L2 + @fltdat[5] * L3
  671.     C3 = @fltdat[6] * L1 + @fltdat[7] * L2 + @fltdat[8] * L3
  672.  
  673.     print "REM VWLIGHT %f, %f, %f\n", L1, L2, L3
  674.     print "LIGHT %f, %f, %f\n", C1, C2, C3
  675.     goto rendermenu
  676.  
  677. :dolevel
  678.     tmp = curlevel
  679.     getint "PV : Enter level (%d) =>",tmp,curlevel
  680.     on (@key + 3 ) goto no,mainmenu,dolevel,
  681.     if (curlevel < 1.0)
  682.         curlevel = 1.0
  683.     goto mainmenu
  684.  
  685. :dolens
  686.     tmp = lens
  687.     getflt "PV : Enter lens (%f) =>",tmp,lens
  688.     on (@key + 3 ) goto no,doperspective,dolens,
  689.      lensset = 1
  690.     if ( lens >= 1.0 )
  691.     goto rendermenu
  692.     pause "Invalid Lens... press RETURN "
  693.     lens = tmp
  694.     lensset = 0
  695.     goto dolens
  696. REM '-----------------------------------------------------------------'
  697. REM '--        Handle standoff                                        '
  698. REM '-----------------------------------------------------------------'
  699. :dostandoff
  700.     tmp = standoff
  701.     tmplens = lens
  702.     getflt "PV : Enter standoff (%f) =>",tmp,standoff
  703.     on (@key + 3 ) goto no,doperspective,dostandoff,
  704.     standset = 1
  705.     lens = 1.0
  706.     if ( standoff  >  0.0 )      
  707.     goto rendermenu
  708.     pause "Invalid Standoff... press RETURN "
  709.     standoff = tmp
  710.     lens = tmplens
  711.     standset = 0
  712.     goto dostandoff
  713. :donopersp 
  714. lensset = 0
  715. standset = 0
  716. prompt "No perspective applied "
  717. wait 2
  718. goto rendermenu
  719. :dovers
  720.     prompt "PV.CDL - CADKEY SOLIDS 3.5 Copyright (C) 1988 CADKEY INC"
  721.     wait 3
  722.     goto mainmenu
  723.  
  724. REM '-----------------------------------------------------------------'
  725. REM '--        Handle booleans                                        '
  726. REM '-----------------------------------------------------------------'
  727. :boolmenu
  728.     from_bool = 1 
  729.     grpcnt = 0
  730.     grp1 = 1
  731.     getmenu "PV : Choose option",\
  732.         "UNION",\
  733.         "INTER",\
  734.         "DIFF",\
  735.         "PLANE",\
  736.         "LINEF",\
  737.         "POLYF",\
  738.         "DONE"
  739.  
  740.     on (@key + 3) goto no,mainmenu,boolmenu,,\
  741.         dounion,\
  742.         dointer,\
  743.         dodiff,\
  744.         doplane,\
  745.         dolinef,\
  746.         dopolyf,\
  747.         mainmenu
  748.     goto boolmenu
  749.  
  750. :doplane
  751.     operation = 4
  752.     goto get_groups
  753. :gp
  754.     grpcnt = 1
  755.     getplane "Select plane to cut group",1
  756.     on (@key + 3 ) goto no,boolmenu,gp,
  757.     a = @fltdat[10]
  758.     b = @fltdat[11]
  759.     c = @fltdat[12]
  760.     d = @fltdat[13]
  761. :gpos
  762.     getpos "Select side of plane to keep",3 
  763.     on (@key + 3 ) goto no,doplane,gpos,
  764.     tmp = @xworld*a + @yworld*b + @zworld*c + d
  765.     if ( tmp < 0.0 ) 
  766.     goto plcut0
  767.     a = -a
  768.     b = -b
  769.     c = -c
  770.     d = -d
  771. :plcut0
  772. goto gg
  773. :plcut
  774. if ( grp1 == 0 )
  775. grp1 = 1
  776. print "PLANCUT %f, %f, %f, %f, %d,\"new\", %d \n\n",  \
  777.     a,b,c,d,grp1,newgroup
  778.     newgroup = newgroup + 1
  779.     goto asframe
  780.  
  781. :dounion
  782.     operation = 1
  783. goto get_groups
  784.  
  785. :dointer
  786.     operation = 2
  787. goto get_groups
  788.  
  789. :dodiff
  790.     operation = 3
  791.  
  792. :get_groups
  793.     getmenu "PV : Choose option",\
  794.         "SELECT",\
  795.         "KEYIN"
  796.  
  797.     on (@key + 3) goto no,boolmenu,get_groups,,\
  798.         selectg,\
  799.         keyin
  800.     goto get_groups
  801.  
  802. :selectg
  803. if ( grpcnt == 0 )
  804. getent "Select first group",etype
  805. if ( grpcnt == 1 )
  806. getent "Select second group",etype
  807. on ( @key + 3 ) goto no, get_groups, selectg,
  808. grpcnt = grpcnt + 1
  809. if ( grpcnt == 1)
  810. grp1 = @INTDAT[1]
  811. if ( grp1 == 0 )
  812.     grp1 = 1
  813. if ( operation == 4 ) 
  814. goto gp
  815. if ( grpcnt == 2)
  816. grp2 = @INTDAT[1]
  817. tmp = grp1
  818. if ( grpcnt == 1 )
  819. goto selectg
  820. goto gg
  821.  
  822. :keyin
  823. tmp = newgroup - 1
  824. if ( grpcnt == 0 )
  825. getint "PV : Enter first group number (%d) =>",tmp,grp
  826. if ( grpcnt == 1 )
  827. getint "PV : Enter second group number (%d) =>",tmp,grp
  828. on ( @key + 3 ) goto no, get_groups, keyin,
  829. grpcnt = grpcnt + 1
  830. if ( grpcnt == 1 )
  831. grp1 = grp
  832. if ( operation == 4 ) 
  833. goto gp
  834. if ( grpcnt == 2 )
  835. grp2 = grp
  836. if ( grpcnt == 1 )
  837. goto keyin
  838.  
  839. :gg
  840. tmp = newgroup
  841. getint "PV : Enter new group number (%d) =>",tmp,newgroup
  842. on (@key + 3 ) goto no,boolmenu,gg,
  843. if ( operation == 4 ) 
  844. goto plcut
  845. if ( grp1 == 0 )
  846. grp1 = 1
  847. if ( grp2 == 0 )
  848. grp2 = 1
  849. print "BOOLEAN %d, %d, %d,\"new\", %d \n\n",grp1,grp2,operation,newgroup
  850. grpused[newgroup] = 1
  851. newgroup = newgroup + 1
  852. :asframe
  853.     getmenu "PV : Create frame",\
  854.         "NO",\
  855.         "YES"
  856.  
  857.     on (@key + 3) goto no,boolmenu,asframe,,\
  858.         boolmenu,\
  859.         doframe
  860. goto boolmenu
  861.  
  862. :dolinef
  863. $tstr = "BOOLLINE"
  864. $nstr = "BOOLLINE"
  865. GETSTR "Enter line file name (%s) => ",$tstr,$nstr
  866. on (@key + 3 ) goto no,boolmenu,dolinef,
  867. CALL STRCPY ,$tstr,@cdlpath
  868. CALL STRCAT ,$tstr,$nstr
  869. $nstr = ".CDL"
  870. CALL STRCAT ,$tstr,$nstr
  871. print "LNFILE %s\n",$tstr
  872. goto boolmenu
  873.  
  874. :dopolyf
  875. $tstr = "BOOLPOLY"
  876. $nstr = "BOOLPOLY"
  877. GETSTR "Enter polygon file name (%s) => ",$tstr,$nstr
  878. on (@key + 3 ) goto no,boolmenu,dolinef,
  879. CALL STRCPY ,$tstr,@cdlpath
  880. CALL STRCAT ,$tstr,$nstr
  881. $nstr = ".CDL"
  882. CALL STRCAT ,$tstr,$nstr
  883. print "PYFILE %s\n",$tstr
  884. goto boolmenu
  885.