home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 13 / 13.iso / p / p030 / 2.ddi / 3D.LSP next >
Encoding:
Lisp/Scheme  |  1988-09-21  |  18.8 KB  |  552 lines

  1. ;--------------------------------------------------------------------------
  2. ; 3D.LSP
  3. ; The user may initiate 3d.lsp by picking "3d objects" from the screen      
  4. ; menu, or by selecting the objects themselves from the "3d Construction"
  5. ; icon menu, or by loading it. Nine 3d objects can be drawn including 
  6. ; a box, cone, dish, dome, mesh, pyramid, sphere, torus, and wedge.
  7. ;
  8. ; When constructing a pyramid with the "ridge" option, enter the ridge
  9. ; points in the same direction as the base points, ridge point one being
  10. ; closest to base point one.  This will prevent the "bowtie" effect.
  11. ; Note that this is also true for the pyramid's "top" option.
  12. ;
  13. ; by Simon Jones - Autodesk UK Ltd.
  14. ; and Duff Kurland - Autodesk, Inc.
  15. ; November, 1986
  16. ;
  17. ; Combined into a single "3D" command - July 1987
  18. ;
  19. ; Changed functions to build shapes using the surface commands, and
  20. ; added box, wedge, pyramid, and mesh. - March 1988
  21. ;--------------------------------------------------------------------------
  22. ; Allow easier reloads
  23.  
  24. (setq boxwed     nil  
  25.       cone       nil
  26.       mesh       nil
  27.       pyramid    nil
  28.       spheres    nil
  29.       torus      nil
  30.       3derr      nil
  31.       C:3D       nil)
  32.  
  33. ;--------------------------------------------------------------------------
  34. ; System variable save
  35.  
  36. (defun modes (a)
  37.    (setq MLST nil)
  38.    (repeat (length a)
  39.       (setq MLST (append MLST (list (list (car a) (getvar (car a))))))
  40.       (setq a (cdr a))
  41.    )
  42. )
  43.  
  44. ;--------------------------------------------------------------------------
  45. ; System variable restore
  46.  
  47. (defun moder ()
  48.    (repeat (length MLST)
  49.       (setvar (caar MLST) (cadar MLST))
  50.       (setq MLST (cdr MLST))
  51.    )
  52. )
  53.  
  54. ;--------------------------------------------------------------------------
  55. ;Draw a cone
  56.  
  57. (defun cone (/ elev cen1 rad top h numseg cen2 oldelev e1 e2)
  58.    (setq numseg 0)
  59.    (initget 17)                       ;3D point can't be null
  60.    (setq elev (caddr (setq cen1 (getpoint "\nBase center point: "))))
  61.    (initget 7 "Diameter")             ;Base radius can't be 0, neg, or null
  62.    (setq rad (getdist cen1 "\nDiameter/<radius> of base: "))
  63.    (if (= rad "Diameter")
  64.       (progn
  65.          (initget 7)                  ;Base diameter can't be 0, neg, or null
  66.          (setq rad (/ (getdist cen1 "\nDiameter of base: ") 2.0))
  67.       )
  68.    )
  69.  
  70.    (initget 4 "Diameter")             ;Top radius can't be neg
  71.    (setq top (getdist cen1 "\nDiameter/<radius> of top <0>: "))
  72.    (if (= top "Diameter")
  73.       (progn
  74.          (initget 4)                  ;Top diameter can't be neg
  75.          (setq top (getdist cen1 "\nDiameter of top <0>: "))
  76.          (if top
  77.             (setq top (/ top 2.0))
  78.          )
  79.       )
  80.    )
  81.    (if (null top)
  82.       (setq top 0.0)
  83.    )
  84.    
  85.    (initget 7 "Height")               ;Height can't be 0, neg, or null
  86.    (setq h (getdist cen1 "\nHeight: "))
  87.  
  88.    (while (< numseg 2)                ;SURFTAB1 can't be less than 2
  89.       (initget 6)
  90.       (setq numseg (getint "\nNumber of segments <16>: "))
  91.       (if (null numseg)
  92.          (setq numseg 16)
  93.       )  
  94.       (if (< numseg 2)
  95.          (princ "\nNumber of segments must be greater than 1.")
  96.       )
  97.    )
  98.    (setvar "SURFTAB1" numseg)
  99.  
  100.    (command "CIRCLE" cen1 rad)        ;Draw base circle
  101.    (setq undoit T)
  102.    (setq e1 (entlast))
  103.    (setq cen2 (list (car cen1) (cadr cen1) (+ (caddr cen1) h)))
  104.    (setq oldelev (getvar "ELEVATION"))
  105.    (command "ELEV" (+ elev h) "")
  106.    (cond ((= top 0.0) (command "POINT" cen2)) ;Draw top point or circle
  107.          (t (command "CIRCLE" cen2 top))
  108.    )
  109.    (setq e2 (entlast))
  110.    (setvar "ELEVATION" oldelev)
  111.  
  112.    (command "RULESURF" (list e1 cen1) (list e2 cen2)) ;Draw cone
  113.    (entdel e1) 
  114.    (entdel e2)
  115. )
  116.  
  117. ;--------------------------------------------------------------------------
  118. ;Draw a sphere, dome, or dish
  119.  
  120. (defun spheres (typ / cen r numseg ax ax1 e1 e2)
  121.    (setq numseg 0)
  122.    (initget 17)                       ;3D point can't be null
  123.    (setq cen (getpoint (strcat "\nCenter of " typ": ")))
  124.    (initget 7 "Diameter")             ;Radius can't be 0, neg, or null
  125.    (setq r (getdist cen (strcat "\nDiameter/<radius>: ")))
  126.    (if (= r "Diameter")
  127.       (progn
  128.          (initget 7)                  ;Diameter can't be 0, neg, or null
  129.          (setq r (/ (getdist cen (strcat "\nDiameter: ")) 2.0))
  130.       )
  131.    )
  132.    (setq cen (trans cen 1 0))         ;Translate from UCS to WCS
  133.          
  134.    (while (< numseg 2)                ;SURFTAB1 can't be less than 2
  135.       (initget 6)
  136.       (setq numseg (getint "\nNumber of longitudinal segments <16>: "))
  137.       (if (null numseg)
  138.          (setq numseg 16)
  139.       )
  140.       (if (< numseg 2)
  141.          (princ "\nNumber of segments must be greater than 1.")
  142.       )
  143.    )
  144.    (setvar "SURFTAB1" numseg)
  145.     
  146.  
  147.    (setq numseg 0)
  148.    (while (< numseg 2)                ;SURFTAB2 can't be less than 2
  149.       (initget 6)
  150.       (princ "\nNumber of latitudinal segments ") 
  151.       (if (= typ "sphere")
  152.          (princ "<16>: ")             ;Set default to 16 for a sphere
  153.          (princ "<8>: ")              ;Set default to 8 for a dome or dish
  154.       )
  155.       (setq numseg (getint))
  156.       (if (null numseg)
  157.          (if (= typ "sphere")
  158.             (setq numseg 16)
  159.             (setq numseg 8)
  160.          )
  161.       )
  162.       (if (< numseg 2)
  163.          (princ "\nNumber of segments must be greater than 1.")
  164.       )
  165.    )
  166.    (setvar "SURFTAB2" numseg)
  167.  
  168.    (command "UCS" "x" "90")
  169.    (setq undoit T)
  170.  
  171.    (setq cen (trans cen 0 1))         ;Translate from WCS to UCS
  172.    (cond
  173.        ((= typ "sphere")
  174.           (setq ax (list (car cen) (+ (cadr cen) r) (caddr cen)))
  175.           (setq ax1 (list (car cen) (- (cadr cen) r) (caddr cen)))
  176.           (command "3DLINE" ax ax1 "") ;Draw axis of revolution
  177.           (setq e1 (entlast))
  178.           (command "ARC" ax "e" ax1 "a" "180.0") ;Draw path curve
  179.           (setq e2 (entlast)))
  180.        (t
  181.           (if (= typ "dome")
  182.              (setq ax (list (car cen) (+ (cadr cen) r) (caddr cen)))
  183.              (setq ax (list (car cen) (- (cadr cen) r) (caddr cen)))
  184.           )
  185.           (command "3DLINE" cen ax "") ;Draw axis of revolution
  186.           (setq e1 (entlast))
  187.           (command "ARC" "c" cen ax "a" "90.0") ;Draw path curve
  188.           (setq e2 (entlast)))
  189.    )
  190.  
  191.    (command "REVSURF" (list e2 ax) (list e1 cen) "" "") ;Draw dome or dish
  192.    (entdel e1)                 
  193.    (entdel e2)
  194.    (command "UCS" "prev")
  195. )
  196.  
  197. ;--------------------------------------------------------------------------
  198. ;Draw a torus
  199.  
  200. (defun torus (/ cen l trad numseg hrad tcen ax e1 e2)
  201.    (setq numseg 0)
  202.    (initget 17)                       ;3D point can't be null
  203.    (setq cen (getpoint "\nCenter of torus: "))
  204.    (setq trad 0 l -1)
  205.    (while (> trad (/ l 2.0))
  206.       (initget 7 "Diameter")          ;Radius can't be 0, neg, or null
  207.       (setq l (getdist cen "\nDiameter/<radius> of torus: "))
  208.       (if (= l "Diameter")
  209.          (progn
  210.             (initget 7)               ;Diameter can't be 0, neg, or null
  211.             (setq l (/ (getdist cen "\nDiameter: ") 2.0))
  212.          )
  213.       )
  214.       (initget 7 "Diameter")          ;Radius can't be 0, neg, or null
  215.       (setq trad (getdist cen "\nDiameter/<radius> of tube: "))
  216.       (if (= trad "Diameter")
  217.          (progn
  218.             (initget 7)
  219.             (setq trad (/ (getdist cen "\nDiameter: ") 2.0))
  220.          )
  221.       )
  222.       (if (> trad (/ l 2.0))
  223.          (prompt "\nTube diameter cannot exceed torus radius.")
  224.       )
  225.    )
  226.    (setq cen (trans cen 1 0))         ;Translate from UCS to WCS
  227.  
  228.    (initget 6)                        ;SURFTAB1 can't be 0 or neg
  229.    (setq numseg (getint "\nSegments around tube circumference <16>: "))
  230.    (if (null numseg)
  231.       (setq numseg 16)
  232.    )
  233.    (setvar "SURFTAB1" numseg)
  234.  
  235.    (setq numseg 0)
  236.    (initget 6)                        ;SURFTAB2 can't be 0 or neg
  237.    (setq numseg (getint "\nSegments around torus circumference <16>: "))
  238.    (if (null numseg)
  239.       (setq numseg 16)
  240.    )
  241.    (setvar "SURFTAB2" numseg)
  242.  
  243.    (command "UCS" "x" "90")
  244.    (setq undoit T)
  245.  
  246.    (setq cen (trans cen 0 1))         ;Translate from WCS to UCS
  247.    (setq hrad (- l (* trad 2.0)))
  248.    (setq tcen (list (+ (+ (car cen) trad) hrad) (cadr cen) (caddr cen)))
  249.    (setq ax (list (car cen) (+ (cadr cen) 2.0) (caddr cen)))
  250.  
  251.    (command "CIRCLE" tcen trad)       ;Draw path curve
  252.    (setq e1 (entlast))
  253.    (command "3DLINE" cen ax "")       ;Draw axis of revolution
  254.    (setq e2 (entlast))
  255.    (command "REVSURF" (list e1 tcen) (list e2 ax) "" "") ;Draw torus
  256.    (entdel e1)            
  257.    (entdel e2)
  258.    (command "UCS" "prev")
  259. )
  260.  
  261. ;--------------------------------------------------------------------------
  262. ;Draw a box or wedge
  263.  
  264. (defun boxwed (typ / pt1 l w h1 h2 a ang pt2 pt3 pt4 pt5 pt6 pt7 pt8)
  265.    (initget 17)                       ;3D point can't be null
  266.    (setq pt1 (getpoint (strcat "\nCorner of "typ": ")))
  267.    (setvar "ORTHOMODE" 1)
  268.    (initget 7)                        ;Length can't be 0, neg, or null
  269.    (setq l (getdist pt1 "\nLength: "))
  270.    (setq pt3 (list (+ (car pt1) l) (cadr pt1) (caddr pt1)))
  271.    (grdraw pt1 pt3 2)
  272.    (cond ((= typ "wedge")
  273.             (initget 7)               ;Width can't be 0, neg, or null
  274.             (setq w (getdist pt1 "\nWidth: ")))
  275.          (t (initget 7 "Cube")        ;Width can't be 0, neg, or null
  276.             (setq w (getdist pt1 "\nCube/<Width>: "))
  277.             (if (= w "Cube") 
  278.                (setq w l h1 l h2 l)
  279.             ))
  280.    )
  281.    (setq pt2 (list (car pt1) (+ (cadr pt1) w) (caddr pt1)))
  282.    (setq pt4 (list (car pt3) (+ (cadr pt3) w) (caddr pt3)))
  283.    (grdraw pt3 pt4 2)
  284.    (grdraw pt4 pt2 2)
  285.    (grdraw pt2 pt1 2)
  286.    (setvar "ORTHOMODE" 0)
  287.    (cond ((= typ "wedge")
  288.              (initget 7)              ;Height can't be 0, neg, or null
  289.              (setq h1 (getdist pt1 "\nHeight: "))
  290.              (setq h2 0.0))
  291.          (t  (if (/= h1 l) 
  292.                 (progn
  293.                    (initget 7)        ;Height can't be 0, neg, or null
  294.                    (setq h1 (getdist pt1 "\nHeight: "))
  295.                    (setq h2 h1))))
  296.    )
  297.  
  298.    (setq pt5 (list (car pt3) (cadr pt3) (+ (caddr pt3) h2)))
  299.    (setq pt6 (list (car pt4) (cadr pt4) (+ (caddr pt4) h2)))
  300.    (setq pt7 (list (car pt1) (cadr pt1) (+ (caddr pt1) h1)))
  301.    (setq pt8 (list (car pt2) (cadr pt2) (+ (caddr pt2) h1)))
  302.    (command "3DMESH" "6" "3" pt5 pt3 pt3 pt7 pt1 pt1 pt8 pt2
  303.     pt1 pt6 pt4 pt3 pt6 pt6 pt5 pt8 pt8 pt7)            
  304.  
  305. (setq undoit T)
  306. (prompt "\nRotation angle about Z axis: ")
  307. (command "rotate" "l" "" pt1 pause)
  308. )
  309.  
  310. ;--------------------------------------------------------------------------
  311. ;Draw a pyramid
  312.  
  313. (defun pyramid (/ pt1 pt2 pt3 pt4 pt5 tp1 tp2 tp3 tp4)
  314.    (initget 17)                       ;3D point can't be null
  315.    (setq pt1 (getpoint "\nFirst base point: "))
  316.    (initget 17)
  317.    (setq pt2 (getpoint pt1 "\nSecond base point: "))
  318.    (grdraw pt1 pt2 2)
  319.    (initget 17)
  320.    (setq pt3 (getpoint pt2 "\nThird base point: ")) 
  321.    (grdraw pt2 pt3 2)
  322.    (initget 17 "Tetrahedron")         ;Choose 3 or 4 point base
  323.    (setq pt4 (getpoint pt3 "\nTetrahedron/<Fourth base point>: ")) 
  324.    (if (= pt4 "Tetrahedron")
  325.       (grdraw pt3 pt1 2)
  326.       (progn
  327.          (grdraw pt3 pt4 2)
  328.          (grdraw pt4 pt1 2)
  329.       )
  330.    )
  331.    (cond ((= pt4 "Tetrahedron")       ;3 point may have top or apex
  332.             (initget 17 "Top")
  333.             (setq pt5 (getpoint "\nTop/<Apex point>: ")))
  334.          (t                           ;4 point may have ridge, top, or apex
  335.             (initget 17 "Top Ridge") 
  336.             (setq pt5 (getpoint "\nRidge/Top/<Apex point>: ")))
  337.    )
  338.    (cond ((= pt5 "Top")               ;Prompt for top points
  339.             (initget 17)
  340.             (setq tp1 (getpoint pt1 "\nFirst top point: "))
  341.             (grdraw pt1 tp1 2)
  342.             (initget 17)
  343.             (setq tp2 (getpoint pt2 "\nSecond top point: "))
  344.             (grdraw tp1 tp2 2)
  345.             (grdraw pt2 tp2 2)
  346.             (initget 17)
  347.             (setq tp3 (getpoint pt3 "\nThird top point: "))
  348.             (grdraw tp2 tp3 2)
  349.             (grdraw pt3 tp3 2)
  350.             (if (/= pt4 "Tetrahedron")
  351.                (progn
  352.                   (initget 17)
  353.                   (setq tp4 (getpoint pt4 "\nFourth top point: "))
  354.                   (grdraw tp3 tp4 2)
  355.                   (grdraw pt4 tp4 2))))
  356.          ((= pt5 "Ridge")             ;Prompt for ridge points
  357.             (grdraw pt4 pt1 2 -1)
  358.             (initget 17)                
  359.             (setq tp1 (getpoint "\nFirst ridge point: "))
  360.             (grdraw pt4 pt1 2)
  361.             (grdraw pt1 tp1 2)
  362.             (grdraw pt4 tp1 2)
  363.             (grdraw pt3 pt2 2 -1)
  364.             (initget 17)                
  365.             (setq tp2 (getpoint tp1 "\nSecond ridge point: "))
  366.             (grdraw pt2 tp2 2)
  367.             (grdraw pt3 tp2 2))
  368.          (t (setq tp1 pt5)            ;Must be apex
  369.             (setq tp2 tp1))
  370.    )
  371.  
  372.    (cond ((and (/= pt4 "Tetrahedron")(/= pt5 "Top"))
  373.             (command "3DMESH" "4" "4" tp1 tp1 tp2 tp2 tp1 pt4 pt3 tp2 
  374.              tp1 pt1 pt2 tp2 tp1 tp1 tp2 tp2))
  375.          ((and (/= pt4 "Tetrahedron")(= pt5 "Top"))
  376.             (command "3DMESH" "5" "4" tp1 tp1 tp2 tp2 tp4 tp4 tp3 tp3
  377.              tp4 pt4 pt3 tp3 tp1 pt1 pt2 tp2 tp1 tp1 tp2 tp2))
  378.          ((and (= pt4 "Tetrahedron")(/= pt5 "Top"))
  379.             (command "3DMESH" "5" "2" tp1 pt2 pt3 pt2 pt3 pt1 tp1 pt1 
  380.              tp1 pt2))
  381.          (t (command "3DMESH" "4" "4" pt3 pt1 tp1 tp3 pt2 pt2 tp2 tp2
  382.              pt3 pt3 tp3 tp3 pt3 pt1 tp1 tp3))
  383.    )     
  384. )
  385.  
  386. ;--------------------------------------------------------------------------
  387. ; Draw a mesh
  388.  
  389. ; Given a starting and an ending point, this function finds the next
  390. ; set of points in the N direction.
  391.  
  392. (defun next-n (pt1 pt2 / xinc yinc zinc loop pt)
  393.    (setq xinc (/ (- (car pt2) (car pt1)) (1- n)))
  394.    (setq yinc (/ (- (cadr pt2) (cadr pt1)) (1- n)))
  395.    (setq zinc (/ (- (caddr pt2) (caddr pt1)) (1- n)))
  396.    (setq loop (1- n))
  397.    (setq pt pt1)
  398.    (while (> loop 0)
  399.       (setq pt (list (+ (car pt) xinc) (+ (cadr pt) yinc) (+ (caddr pt) zinc)))
  400.       (setq l (cons pt l))
  401.       (setq loop (1- loop))
  402.    )
  403. )
  404.  
  405. ; This function finds the next point in the M direction.
  406.  
  407. (defun next-m (pt1 pt2 loop / xinc yinc zinc)
  408.    (if (/= m loop)
  409.       (progn
  410.          (setq xinc (/ (- (car pt2) (car pt1)) (- m loop)))
  411.          (setq yinc (/ (- (cadr pt2) (cadr pt1)) (- m loop)))
  412.          (setq zinc (/ (- (caddr pt2) (caddr pt1)) (- m loop)))
  413.       )
  414.       (progn
  415.          (setq xinc 0)
  416.          (setq yinc 0)
  417.          (setq zinc 0)
  418.       )
  419.    )
  420.    (setq pt1 (list (+ (car pt1) xinc) (+ (cadr pt1) yinc) (+ (caddr pt1) zinc)))
  421. )
  422.  
  423. (defun mesh (/ c1 c2 c3 c4 m n l loop i)
  424.    (setq m 0 n 0)                     ;Initialize variables
  425.    (initget 17)                     
  426.    (setq c1 (getpoint "\nFirst corner: "))
  427.    (initget 17)                     
  428.    (setq c2 (getpoint c1 "\nSecond corner: "))
  429.    (grdraw c1 c2 2)
  430.    (initget 17)                     
  431.    (setq c3 (getpoint c2 "\nThird corner: "))
  432.    (grdraw c2 c3 2)
  433.    (initget 17)                     
  434.    (setq c4 (getpoint c3 "\nFourth corner: "))
  435.    (grdraw c3 c4 2)
  436.    (grdraw c4 c1 2 1)
  437.    (while (or (< m 2) (> m 256))
  438.       (initget 7)                     
  439.       (setq m (getint "\nMesh M size: "))
  440.       (if (or (< m 2) (> m 256)) 
  441.          (princ "\nValue must be between 2 and 256.")
  442.       )
  443.    )
  444.    (grdraw c4 c1 2)
  445.    (grdraw c1 c2 2 1)
  446.    (while (or (< n 2) (> n 256))
  447.       (initget 7)                     
  448.       (setq n (getint "\nMesh N size: "))
  449.       (if (or (< n 2) (> n 256)) 
  450.          (princ "\nValue must be between 2 and 256.")
  451.       )
  452.    )
  453.  
  454.    (setq l (list c1))
  455.    (setq loop 1)
  456.    (next-n c1 c2)
  457.    (while (< loop m)
  458.       (setq c1 (next-m c1 c4 loop)) 
  459.       (setq c2 (next-m c2 c3 loop))
  460.       (setq l (cons c1 l))
  461.       (next-n c1 c2)
  462.       (setq loop (1+ loop))
  463.    )
  464.    (setvar "blipmode" 0)              ;Turn BLIPMODE off
  465.    (setq i 0)
  466.    (command "3dmesh" m n)
  467.    (while (<= i (* m n)) (command (nth i l)) (setq i (1+ i)))
  468. )
  469.  
  470. ;--------------------------------------------------------------------------
  471. ;Internal error handler
  472.  
  473. (defun 3derr (s)                      ;If an error (such as CTRL-C) occurs
  474.                                       ;while this command is active...
  475.    (if (/= s "Function cancelled")
  476.        (princ (strcat "\nError: " s))
  477.    )
  478.    (if undoit
  479.       (progn
  480.          (command)
  481.          (command "UNDO" "e")         ;Terminate undo group
  482.          (princ "\nundoing...") 
  483.          (command "U")                ;Erase partially drawn shape
  484.       )
  485.       (command "UNDO" "e")               
  486.    )
  487.    (moder)                            ;Restore saved modes
  488.    (command "REDRAWALL")
  489.    (setvar "CMDECHO" oce)             ;Restore saved cmdecho value
  490.    (setq *error* olderr)              ;Restore old *error* handler
  491.    (princ)
  492.  
  493. )
  494.  
  495. ;--------------------------------------------------------------------------
  496.  
  497. ; Main program.  Draws 3D object specified by "key" argument.
  498. ; If "key" is nil, asks which object is desired.
  499.  
  500. (defun 3d (key / olderr)
  501.    (if m:err                            ;If called from the menu
  502.       (setq olderr m:err *error* 3derr) ;save the menus trapped *error*
  503.       (setq olderr *error* *error* 3derr)
  504.    )
  505.    (setq undoit nil)
  506.    (setq oce (getvar "cmdecho"))
  507.    (setvar "CMDECHO" 0)
  508.    (modes '("BLIPMODE" "GRIDMODE" "ORTHOMODE" "OSMODE"
  509.             "SURFTAB1" "SURFTAB2" "UCSFOLLOW"))
  510.    (command "UNDO" "group")
  511.    (setvar "UCSFOLLOW" 0)
  512.    (setvar "GRIDMODE" 0)
  513.    (setvar "OSMODE" 0)
  514.    (if (null key)
  515.        (progn
  516.            (initget "Box Cone DIsh DOme Mesh Pyramid Sphere Torus Wedge")
  517.            (setq key (getkword "\nBox/Cone/DIsh/DOme/Mesh/Pyramid/Sphere/Torus/Wedge: "))
  518.        )
  519.    )
  520.    (cond ((= key "Box")     (boxwed "box")) 
  521.          ((= key "Cone")    (cone))
  522.          ((= key "DIsh")    (spheres "dish"))
  523.          ((= key "DOme")    (spheres "dome"))
  524.          ((= key "Mesh")    (mesh))
  525.          ((= key "Pyramid") (pyramid))
  526.          ((= key "Sphere")  (spheres "sphere"))
  527.          ((= key "Torus")   (torus))
  528.          ((= key "Wedge")   (boxwed "wedge"))
  529.          (T nil)                      ;Null reply?  Just exit
  530.    )
  531.    (moder)                            ;Restore saved modes
  532.    (command "REDRAWALL")
  533.    (command "UNDO" "e")               ;Terminate undo group
  534.    (setvar "CMDECHO" oce)             ;Restore saved cmdecho value
  535.    (setq *error* olderr)              ;Restore old *error* handler
  536.    (princ)
  537. )
  538.  
  539. ;--------------------------------------------------------------------------
  540.  
  541. (defun C:BOX ()     (3d "Box"))
  542. (defun C:CONE ()    (3d "Cone"))
  543. (defun C:DISH ()    (3d "DIsh"))
  544. (defun C:DOME ()    (3d "DOme"))
  545. (defun C:MESH ()    (3d "Mesh"))
  546. (defun C:PYRAMID () (3d "Pyramid"))
  547. (defun C:SPHERE ()  (3d "Sphere"))
  548. (defun C:TORUS ()   (3d "Torus"))
  549. (defun C:WEDGE ()   (3d "Wedge"))
  550. (defun C:3D ()      (3d nil))
  551.