1 2 3 4Geomview(5gv) Geomview(5gv) 5 6 7NAME 8 Geomview - Geomview command language 9 10NOTE 11 The material in this manual page also appears in the 12 Geomview manual. 13 14DESCRIPTION 15 gcl: the Geomview Command Language 16 ********************************** 17 18 Gcl has the syntax of lisp -- i.e. an expression of the form (f a b 19 ...) means pass the values of a, b, ... to the function f. 20 Gcl is very limited and is by no means an implementation of lisp. It 21 is simply a language for expressing commands to be executed in the order 22 given, rather than a programming language. It does not support variable 23 or function definition. 24 25 Gcl is the language that Geomview understands for files that it loads 26 as well as for communication with other programs. 27 To execute a gcl command interactively, you can bring up the 28 *Commands* panel which lets you type in a command; Geomview 29 executes the command when you hit the return key. Output from such 30 commands is printed to standard output. Alternately, you can invoke 31 Geomview as `geomview -c -' which causes it to read gcl commands 32 from standard input. 33 34 Gcl functions return a value, and you can nest function calls in ways 35 which use this returned value. For example 36 (f (g a b)) 37 evaluates `(g a b)' and then evaluates `(f x)' where `x' 38 is the result returned by `(g a b)'. Geomview maintains these 39 return values internally but does not normally print them out. 40 To print out a return value pass it to the `echo' function. 41 For example the `geomview-version' function returns a string 42 representing the version of Geomview that is running, and 43 (echo (geomview-version)) 44 prints out this string. 45 46 Many functions simply return `t' for success or `nil' for 47 failure; this is the case if the documentation for the function does not 48 indicate otherwise. These are the lisp symbols for true and false, 49 respectively. (They correspond to the C variables `Lt' and 50 `Lnil' which you are likely to see if you look at the source code 51 for Geomview or some of the external modules.) 52 53 In the descriptions of the commands below several references are made to 54 "OOGL" formats. OOGL is the data description language that Geomview 55 uses for describing geometry, cameras, appearances, and other basic 56 objects. For details of the OOGL formats, *Note OOGL File Formats::. 57 (Or equivalently, see the oogl(5) manual page, distributed with Geomview 58 in the file man/cat5/oogl.5. 59 60 The gcl commands and argument types are listed below. Most 61 62 63 64Geometry Center Thu Dec 12 02:41:23 CST 1996 1 65 66 67 68 69 70Geomview(5) Geomview(5) 71 72 73 of the documentation in this section of the manual is available within 74 Geomview via the `?' and `??' commands. The command `(? 75 COMMAND)' causes Geomview to print out a one-line summary of the 76 syntax of COMMAND, and `(?? COMMAND)' prints out an 77 explanation of what COMMAND does. You can include the wild-card 78 character `*' in COMMAND to print information for a group of 79 commands matching a pattern. For example, `(?? *emodule*)' will 80 print all information about all commands containing the string 81 `emodule'. `(? *)' will print a short list of all commands. 82 83 Conventions Used In Describing Argument Types 84 ============================================= 85 86 The following symbols are used to describe argument types 87 in the documentation for gcl functions. 88 89 90 `APPEARANCE' 91 is an OOGL appearance specification. 92 93 `CAM-ID' 94 is an ID that refers to a camera. 95 96 `CAMERA' 97 is an OOGL camera specification. 98 99 `GEOM-ID' 100 is an ID that refers to a geometry. 101 102 `GEOMETRY' 103 is an OOGL geometry specification. 104 105 `ID' 106 is a string which names a geometry or camera. Besides 107 those you create, valid ones are: 108 109 110 ``World, world, worldgeom, g0'' 111 the collection of all geom's 112 113 `target' 114 selected target object (cam or geom) 115 116 `center' 117 selected center-of-motion object 118 119 `targetcam' 120 last selected target camera 121 122 `targetgeom' 123 last selected target geom 124 125 `focus' 126 camera where cursor is (or most recently was) 127 128 129 130Geometry Center Thu Dec 12 02:41:23 CST 1996 2 131 132 133 134 135 136Geomview(5) Geomview(5) 137 138 139 `allgeoms' 140 all geom objects 141 142 `allcams' 143 all cameras 144 145 ``default, defaultcam, prototype'' 146 future cameras inherit default's settings 147 148 149 The following IDs are used to name coordinate systems, 150 e.g. in `pick' and `write' commands: 151 152 153 ``World, world, worldgeom, g0'' 154 the world, within which all other geoms live. 155 156 `universe ' 157 the universe, in which the World, lights and cameras live. Cameras' 158 world2cam transforms might better be called universe2cam, etc. 159 160 `self' 161 "this Geomview object". Transform from an object to `self' is the 162 identity; writing its geometry gives the object itself with no 163 enclosing transform; picked points appear in the object's coordinates. 164 165 `primitive' 166 (for `pick' only) Picked points appear in the coordinate system of the 167 lowest-level OOGL primitive. 168 169 170 A name is also an acceptable id. Given names are made unique by 171 appending numbers if necessary (i.e. `foo<2>'). Every geom is also 172 named g[n] and every camera is also named c[n] (`g0' is always the 173 worldgeom): this name is used as a prefix to keyboard commands and can 174 also be used as a gcl id. Numbers are reused after an 175 object is deleted. Both names are shown in the Object browser. 176 177 `STATEMENT' 178 represents a function call. Function calls have the form `(func arg1 179 arg2 ... )', where `func' is the name of the function and `arg1', 180 `arg2', ... are the arguments. 181 182 `TRANSFORM' 183 is an OOGL 4x4 transformation matrix. 184 185 `WINDOW' 186 is an OOGL winddow specification. 187 188 189 190 Gcl Reference Guide 191 =================== 192 193 194 195 196Geometry Center Thu Dec 12 02:41:23 CST 1996 3 197 198 199 200 201 202Geomview(5) Geomview(5) 203 204 205 `! is a synonym for `shell'' 206 207 `(< EXPR1 EXPR2)' 208 Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should 209 be either both integers or floats, or both strings. 210 211 `(= EXPR1 EXPR2)' 212 Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should 213 be either both integers or floats, or both strings. 214 215 `(> EXPR1 EXPR2)' 216 Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should 217 be either both integers or floats, or both strings. 218 219 `(? [command])' 220 Gives one-line usage summary for `command'. 221 Command may include `*'s as wildcards; see also `??' 222 One-line command help; lists names only if multiple commands match. 223 ? is a synonym for `help' 224 225 `(?? command) `command' may include `*' wildcards' 226 Prints more info than `(? command)'. ?? is a synonym 227 for `morehelp'. 228 229 `| is a synonym for `emodule-run'.' 230 231 `(all geometry) returns a list of names of all geometry objects.' 232 Use e.g. `(echo (all geometry))' to print such a list. 233 `(all camera) returns a list of names of all cameras.' 234 `(all emodule defined) returns a list of all defined external modules.' 235 `(all emodule running) returns a list of all running external modules.' 236 237 `(ap-override [on|off])' 238 Selects whether appearance controls should override objects' own 239 settings. On by default. With no arguments, returns current setting. 240 241 `(backcolor CAM-ID R G B)' 242 Set the background color of CAM-ID; R G B are numbers 243 between 0 and 1. 244 245 `(background-image CAM-ID [FILENAME])' 246 Use the given image as the background of camera CAM-ID (which must be a 247 real camera, not `default' or `allcams'). Centers the image on 248 the window area. Works only with GL and OpenGL graphics. 249 Use "" for filename to remove background. With no filename argument, 250 returns name of that window's current background image, or "". 251 Any file type acceptable as a texture is allowed, e.g. .ppm.gz, .sgi, etc. 252 253 `(bbox-color GEOM-ID R G B)' 254 Set the bounding-box color of GEOM-ID; R G B are numbers 255 between 0 and 1. 256 257 `(bbox-draw GEOM-ID [yes|no])' 258 Say whether GEOM-ID's bounding-box should be drawn; `yes' if omitted. 259 260 261 262Geometry Center Thu Dec 12 02:41:23 CST 1996 4 263 264 265 266 267 268Geomview(5) Geomview(5) 269 270 271 `(camera CAM-ID [CAMERA])' 272 Specify data for CAM-ID; CAMERA is a string giving an OOGL 273 camera specification. If no camera CAM-ID exists, 274 it is created; in this case, the second argument is optional, 275 and if omitted, a default camera is used. See also: new-camera. 276 277 `(camera-draw CAM-ID [yes|no])' 278 Say whether or not cameras should be drawn in CAM-ID; `yes' if omitted. 279 280 `(camera-prop { geometry object } [projective])' 281 Specify the object to be shown when drawing other cameras. 282 By default, this object is drawn with its origin at the camera, 283 and with the camera looking toward the object's -Z axis. 284 With the `projective' keyword, the camera's viewing projection is 285 also applied to the object; this places the object's Z=-1 and Z=+1 at 286 near and far clipping planes, with the viewing area -1<={X,Y}<=+1. 287 Example: (camera-prop { < cube } projective) 288 289 `(camera-reset CAM-ID)' 290 Reset CAM-ID to its default value. 291 292 `(car LIST)' 293 returns the first element of LIST. 294 295 `(cdr LIST)' 296 returns the list obtained by removing the first element of LIST. 297 298 `(clock)' 299 Returns the current time, in seconds, as shown by this stream's clock. 300 See also set-clock and sleep-until. 301 302 `(command INFILE [OUTFILE])' 303 Read commands from INFILE; send corresponding responses 304 (e.g. anything written to filename `-') to OUTFILE, stdout 305 by default. 306 307 `(copy [ID] [name])' 308 Copies an object or camera. If ID is not specified, it 309 is assumed to be targetgeom. If name is not specified, it 310 is assumed to be the same as the name of ID. 311 312 `(cursor-still [INT])' 313 Sets the number of microseconds for which the cursor must not 314 move to register as holding still. If INT is not specified, 315 the value will be reset to the default. 316 317 `(cursor-twitch [INT])' 318 Sets the distance which the cursor must not move (in x or 319 y) to register as holding still. If INT is not specified, 320 the value will be reset to the default. 321 322 `(delete ID)' 323 Delete object or camera ID. 324 325 326 327 328Geometry Center Thu Dec 12 02:41:23 CST 1996 5 329 330 331 332 333 334Geomview(5) Geomview(5) 335 336 337 `(dice GEOM-ID N)' 338 Dice any Bezier patches within GEOM-ID into NxN meshes; default 10. 339 See also the appearance attribute `dice', which makes this command 340 obsolete. 341 342 `(dimension [N])' 343 Sets or reads the space dimension for N-dimensional viewing. 344 (Since calculations are done using homogeneous coordinates, 345 this means matrices are (N+1)x(N+1).) 346 With no arguments, returns the current dimension, or 0 if 347 N-dimensional viewing has not been enabled. 348 349 `(dither CAM-ID {on|off|toggle})' 350 Turn dithering on or off in that camera. 351 352 `(draw CAM-ID)' 353 Draw the view in CAM-ID, if it needs redrawing. See also `redraw'. 354 355 `(echo ...)' 356 Write the given data to the special file `-'. Strings are written 357 literally; lisp expressions are evaluated and their values written. 358 If received from an external program, `echo' sends to the program's 359 input. Otherwise writes to geomview's own standard output 360 (typically the terminal). 361 362 `(emodule-clear)' 363 Clears the geomview application (external module) browser. 364 365 `(emodule-define NAME SHELL-COMMAND ...)' 366 Define an external module called NAME, which then appears in the 367 external-module browser. The SHELL-COMMAND string 368 is a UNIX shell command which invokes the module. 369 See emodule-run for discussion of external modules. 370 371 `(emodule-defined `modulename')' 372 If the given external-module name is known, returns the name of 373 the program invoked when it's run as a quoted string; otherwise 374 returns nil. `(echo (emodule-defined `name'))' prints the string. 375 376 `(emodule-isrunning NAME)' 377 Returns Lt if the emodule NAME is running, or Lnil 378 if it is not running. NAME is searched for in the 379 names as they appear in the browser and in the shell commands 380 used to execute the external modules (not including arguments). 381 382 `(emodule-path)' 383 Returns the current search path for external modules. 384 Note: to actually see the value returned by this function 385 you should wrap it in a call to echo: (echo (emodule-path)). 386 See also set-emodule-path. 387 388 `(emodule-run SHELL-COMMAND ARGS...)' 389 Runs the given SHELL-COMMAND (a string containing a UNIX shell 390 command) as an external module. The module's standard output 391 392 393 394Geometry Center Thu Dec 12 02:41:23 CST 1996 6 395 396 397 398 399 400Geomview(5) Geomview(5) 401 402 403 is taken as geomview commands; responses (written to filename 404 `-') are sent to the module's standard input. The shell 405 command is interpreted by /bin/sh, so e.g. I/O redirection may 406 be used; a program which prompts the user for input from the 407 terminal could be run with: 408 (emodule-run yourprogram <&2) 409 If not already set, the environment variable $MACHTYPE is set 410 to the name of the machine type. Input and output 411 connections to geomview are dropped when the shell command 412 terminates. Clicking on a running program's module-browser entry 413 sends the signal SIGHUP to the program. For this to work, programs 414 should avoid running in the background; those using FORMS or GL 415 should call foreground() before the first FORMS or winopen() call. 416 See also emodule-define, emodule-start. 417 418 `(emodule-sort)' 419 Sorts the modules in the application browser alphabetically. 420 421 `(emodule-start NAME)' 422 Starts the external module NAME, defined by emodule-define. 423 Equivalent to clicking on the corresponding module-browser entry. 424 425 `(emodule-transmit NAME LIST)' 426 Places LIST into external module NAME's standard input. NAME is 427 searched for in the names of the modules as they appear in the 428 External Modules browser and then in the shell commands used to 429 execute the external modules. Does nothing if modname is not 430 running. 431 432 `(escale GEOM-ID FACTOR)' 433 Same as scale but multiplies by exp(scale). Obsolete. 434 435 `(event-keys {on|off})' 436 Turn keyboard events on or off to enable/disable keyboard shortcuts. 437 438 `(event-mode MODESTRING)' 439 Set the mouse event (motion) mode; MODESTRING should be one of 440 the following strings: 441 1. "[r] Rotate" 442 2. "[t] Translate" 443 3. "[z] Cam Zoom" 444 4. "[s] Geom Scale" 445 5. "[f] Cam Fly" 446 6. "[o] Cam Orbit" 447 7. "[le] Edit Lights" 448 449 `(event-pick {on|off})' 450 Turn picking on or off. 451 452 `(evert GEOM-ID [yes|no])' 453 Set the normal eversion state of GEOM-ID. If the second argument 454 is omitted, toggle the eversion state. 455 456 `(exit)' 457 Terminates geomview. 458 459 `(ezoom GEOM-ID FACTOR)' 460 Same as zoom but multiplies by exp(zoom). Obsolete. 461 462 `(freeze CAM-ID)' 463 464 465 466Geometry Center Thu Dec 12 02:41:23 CST 1996 7 467 468 469 470 471 472Geomview(5) Geomview(5) 473 474 475 Freeze CAM-ID; drawing in this camera's window is turned off 476 until it is explicitly redrawn with `(redraw CAM-ID)', after 477 which time drawing resumes as normal. 478 479 `(geometry GEOM-ID [GEOMETRY])' 480 Specify the geometry for GEOM-ID. GEOMETRY is a string 481 giving an OOGL geometry specification. If no object 482 called GEOM-ID exists, it is created; in this case the 483 GEOMETRY argument is optional, and if omitted, the new 484 object GEOM-ID is given an empty geometry. 485 486 `(geomview-version)' 487 Returns a string representing the version of geomview that is 488 running. 489 490 `(hdefine `geometry'|`camera'|`transform'|`window' name value)' 491 Sets the value of a handle of a given type. 492 (hdefine <type> <name> <value>) 493 is generally equivalent to 494 (read <type> { define <name> <value> }) 495 except that the assignment is done when hdefine is executed, 496 (possibly not at all if inside a conditional statement), 497 while the `read ... define' performs assignment as soon as the 498 text is read. 499 500 501 `(help [command])' 502 Command may include `*'s as wildcards; see also `??' 503 One-line command help; lists names only if multiple commands match. 504 505 `(hmodel CAMID {virtual|projective|conformal})' 506 Set the model used to display geometry in 507 this camera; see also `space'. 508 509 `(hsphere-draw CAMID [yes|no])' 510 Say whether to draw a unit sphere: the sphere at infinity in 511 hyperbolic space, and a reference sphere in Euclidean and spherical 512 spaces. If the second argument is omitted, `yes' is assumed. 513 514 `(if TEST EXPR1 [EXPR2])' 515 Evaluates TEST; if TEST returns a non-nil value, returns the 516 value of EXPR1. If TEST returns nil, returns the value of 517 EXPR2 if EXPR2 is present, otherwise returns nil. 518 519 `(inhibit-warning STRING)' 520 Inhibit warning inhbits geomview from displaying a 521 particular warning message determined by STRING. 522 At present there are no warning messages that this 523 applies to, so this command is rather useless. 524 525 `(input-translator "#prefix_string" "Bourne-shell-command")' 526 Defines an external translation program for special input types. 527 When asked to read a file which begins with the specified string, 528 geomview invokes that program with standard input coming from the given file. 529 530 531 532Geometry Center Thu Dec 12 02:41:23 CST 1996 8 533 534 535 536 537 538Geomview(5) Geomview(5) 539 540 541 The program is expected to emit OOGL geometric data to its standard output. 542 In this implementation, only prefixes beginning with # are recognized. 543 Useful as in 544 (input-translator "#VRML" "vrml2oogl") 545 546 `(interest (COMMAND [args]))' 547 548 Allows you to express interest in a command. When geomview 549 executes that command in the future it will echo it to the 550 communication pool from which the interest command came. 551 COMMAND can be any command. Args specify restrictions on the 552 values of the arguments; if args are present in the interest 553 command, geomview will only echo calls to the command in which 554 the arguments match those given in the interest command. Two 555 special argument values may appear in the argument list. `*' 556 matches any value. `nil' matches any value but supresses the 557 reporting of that value; its value is reported as `nil'. 558 559 The purpose of the interest command is to allow external 560 modules to find out about things happening inside geomview. 561 For example, a module interested in knowing when a geom called 562 `foo' is deleted could say `(interest (delete foo))' and would 563 receive the string `(delete foo)' when foo is deleted. 564 565 Picking is a special case of this. For most modules 566 interested in pick events the command `(interest (pick 567 world))' is sufficient. This causes geomview to send a string 568 of the form `(pick world ...)' every time a pick event (right 569 mouse double click). See the `pick' command for details. 570 571 `(lines-closer CAM-ID DIST)' 572 Draw lines (including edges) closer to the camera than polygons 573 by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default. 574 If DIST is too small, a line lying on a surface may be 575 dotted or invisible, depending on the viewpoint. 576 If DIST is too large, lines may appear in front of surfaces 577 that they actually lie behind. Good values for DIST vary with 578 the scene, viewpoint, and distance between near and far clipping 579 planes. This feature is a kludge, but can be helpful. 580 581 `(load filename [command|geometry|camera])' 582 Loads the given file into geomview. The optional second argument 583 specifies the type of data it contains, which may be `command' 584 (geomview commands), `geometry' (OOGL geometric data), or 585 `camera' (OOGL camera definition). If omitted, attempts to guess 586 about the file's contents. 587 Loading geometric data creates a new visible object; loading a camera 588 opens a new window; loading a command file executes those commands. 589 590 591 `(load-path)' 592 Returns the current search path for command, geometry, etc. files. 593 Note: to actually see the value returned by this function 594 you should wrap it in a call to echo: (echo (load-path)). 595 596 597 598Geometry Center Thu Dec 12 02:41:23 CST 1996 9 599 600 601 602 603 604Geomview(5) Geomview(5) 605 606 607 See also set-load-path. 608 609 `(look [objectID] [cameraID])' 610 Rotates the named camera to point toward the center of the 611 bounding box of the named object (or the origin in hyperbolic or 612 spherical space). In Euclidean space, moves the camera 613 forward or backward until the object appears as large 614 as possible while still being entirely visible. Equivalent to 615 progn ( 616 (look-toward [objectID] [cameraID] {center | origin}) 617 [(look-encompass [objectID] [cameraID])] 618 ) 619 If objectID is not specified, it is assumed to be World. If 620 cameraID is not specified, it is assumed to be targetcam. 621 622 `(look-encompass [objectID] [cameraID])' 623 Moves cameraID backwards or forwards until its field of view 624 surrounds objectID. This routine works only in Euclidean space. 625 If objectID is not specified, it is assumed to be the world. 626 If cameraID is not specified, it is assumed to be the targetcam. 627 See also (look-encompass-size). 628 629 `(look-encompass-size [view-fraction clip-ratio near-margin far-margin])' 630 Sets/returns parameters used by (look-encompass). 631 view-fraction is the portion of the camera window filled by the object, 632 clip-ratio is the max allowed ratio of near-to-far clipping planes. 633 The near clipping plane is 1/near-margin times closer than the near 634 edge of the object, and the far clipping plane is far-margin times 635 further away. Returns the list of current values. 636 Defaults: .75 100 0.1 4.0 637 638 639 `(look-recenter [objectID] [cameraID])' 640 Translates and rotates the camera so that it is looking in the 641 -z direction (in objectID's coordinate system) at the center of 642 objectID's bounding box (or the origin of the coordinate system 643 in non-Eudlidean space). In Euclidean space, the camera is also 644 moved as close as possible to the object while allowing the 645 entire object to be visible. Also makes sure that the y-axes of 646 objectID and cameraID are parallel. 647 648 `(look-toward [objectID] [cameraID] [origin | center])' 649 Rotates the named camera to point toward the origin of the 650 object's coordinate system, or the center of the object's 651 bounding box (in non-Euclidean space, the origin will be used 652 automatically). Default objectID is the world, default camera 653 is targetcam, default location to point towards is the center 654 of the bounding box. 655 656 `(merge {window|camera} CAM-ID { WINDOW or CAMERA ... } )' 657 Modify the given window or camera, changing just those properties 658 specified in the last argument. E.g. 659 (merge camera `Camera' { far 20 }) 660 sets Camera's far clipping plane to 20 while leaving 661 662 663 664Geometry Center Thu Dec 12 02:41:23 CST 1996 10 665 666 667 668 669 670Geomview(5) Geomview(5) 671 672 673 other attributes untouched. 674 675 `(merge-ap GEOM-ID APPEARANCE)' 676 Merge in some appearance characteristics to GEOM-ID. 677 Appearance parameters include surface and line color, shading 678 style, line width, and lighting. 679 680 `merge-base-ap is a synonym for merge-baseap.' 681 682 `(merge-baseap APPEARANCE)' 683 Merge in some appearance characteristics to the base default 684 appearance (applied to every geom before its own apperance). 685 Lighting is typically included in the base appearance. 686 687 `(morehelp command)' 688 `command' may include `*' wildcards. 689 Prints more info than `(help command)'. 690 691 `(name-object ID NAME)' 692 Assign a new NAME (a string) to ID. A number is appended if 693 that name is in use (for example, `foo' -> `foo<2>'). The new 694 name, possibly with number appended, may be used as object's 695 id thereafter. 696 697 `(ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex]])' 698 In our model for N-D viewing (enabled by (dimension)), objects in 699 N-space are viewed by N-dimensional *camera clusters*. 700 Each real camera window belongs to some cluster, and shows & 701 manipulates a 3-D axis-aligned projected subspace of the N-space seen 702 by its cluster. Moving one camera in a cluster affects its siblings. 703 704 The ND-axes command configures all this. It specifies a camera's 705 cluster membership, and the set of N-space axes which become the 706 3-D camera's X, Y, and Z axes. Axes are specified by their indices, 707 from 0 to N-1 for an N-dimensional space. Cluster CLUSTERNAME is 708 implicitly created if not previously known. 709 To read a camera's configuration, use `(echo (ND-axes CAMID))'. 710 711 712 `(ND-color CAMID' 713 [ (( [ID] (x0 x1 x2 ... xn) v r g b a v r g b a ... ) 714 ((x0 ... xn) v r g b a v r g b a ...) ...)] ) 715 Specifies a function, applied to each N-D vertex, which determines the 716 colors of N-dimensional objects as shown in camera CAMID. 717 Each coloring function is defined by a vector (in ID's coordinate system) 718 [x0 x1 ... xn] and by a sequence of value (v)/color(r g b a) tuples, 719 ordered by increasing v. The inner product v = P.[x] is linearly 720 interpolated in this table to give a color. 721 If ID is omitted, the (xi) vector is assumed in universe coordinates. 722 The ND-color command specifies a list of such functions; each vertex 723 is colored by their sum (so e.g. green intensity could indicate 724 projection along one axis while red indicated another. 725 An empty list, as in (ND-color CAMID ()), suppresses coloring. 726 With no second argument, (ND-color CAMID) returns that camera's 727 728 729 730Geometry Center Thu Dec 12 02:41:23 CST 1996 11 731 732 733 734 735 736Geomview(5) Geomview(5) 737 738 739 color-function list. 740 Even when coloring is enabled, objects tagged with the `keepcolor' 741 appearance attribute are shown in their natural colors. 742 743 744 `(ND-xform OBJID [ntransform { idim odim ... }])' 745 Sets or returns the N-D transform of the given object. 746 In dimension N, this is an (N+1)x(N+1) matrix. 747 Note that all cameras in a camera-cluster have the same N-D transform. 748 749 750 `(ND-xform-get ID [from-ID])' 751 Returns the N-D transform of the given object in the coordinate system 752 of from-ID (default `universe'), in the sense 753 <point-in-ID-coords> * Transform = <point-in-from-ID-coords> 754 755 756 `(new-alien name [GEOMETRY])' 757 Create a new alien (geom not in the world) with the given name 758 (a string). GEOMETRY is a string giving an OOGL geometry 759 specification. If GEOMETRY is omitted, the new alien 760 is given an empty geometry. If an object with that name 761 already exists, the new alien is given a unique name. The 762 light beams that are used to move around the lights are an 763 example of aliens. They're drawn but are not controllable the 764 way ordinary objects are: they don't appear in the object 765 browser and the user can't move them with the normal motion 766 modes. 767 768 `(new-camera name [CAMERA])' 769 Create a new camera with the given name (a string). If a 770 camera with that name already exists, the new object is given 771 a unique name. If CAMERA is omitted a default camera is used. 772 773 `(new-center [id])' 774 Stop id, then set id's transform to the identity. Default id 775 is target. Also, if the id is a camera, calls 776 (look-recenter World id). The main function of the call to 777 (look-recenter) is to place the camera so that it is pointing 778 parallel to the z axis toward the center of the world. 779 780 `(new-geometry name [GEOMETRY])' 781 Create a new geom with the given name (a string). GEOMETRY is 782 a string giving an OOGL geometry specification. If 783 GEOMETRY is omitted, the new object is given an empty geometry. 784 If an object with that name already exists, the new object is 785 given a unique name. 786 787 `(new-reset)' 788 Equivalent to (progn (new-center ALLGEOMS)(new-center ALLCAMS)) 789 790 `(NeXT)' 791 Returns t if running on a NeXT, nil if not 792 793 794 795 796Geometry Center Thu Dec 12 02:41:23 CST 1996 12 797 798 799 800 801 802Geomview(5) Geomview(5) 803 804 805 `(normalization GEOM-ID {each|none|all|keep})' 806 Set the normalization status of GEOM-ID. 807 `none' 808 suppresses all normalization. 809 `each' 810 normalizes the object's bounding box to fit into the unit 811 sphere, with the center of its bounding box translated 812 to the origin. The box is scaled such that its long diagonal, 813 sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2. 814 `all' 815 resembles `each', except when an object is changing 816 (e.g. when its geometry is being changed by an external program). 817 Then, `each' tightly fits the bounding box around the 818 object whenever it changes and normalizes accordingly, 819 while `all' normalizes the union of all variants of the object 820 and normalizes accordingly. 821 `keep' 822 leaves the current normalization transform unchanged 823 when the object changes. It may be useful to apply `each' or 824 `all' normalization apply to the first version of a changing 825 object to bring it in view, then switch to `keep'. 826 827 `(pick COORDSYS GEOMID G V E F P VI EI FI)' 828 The pick command is executed internally in response to pick 829 events (right mouse double click). 830 831 COORDSYS = coordinate system in which coordinates of the following 832 arguments are specified. This can be: 833 world: world coord sys 834 self: coord sys of the picked geom (GEOMID) 835 primitive: coord sys of the actual primitive within 836 the picked geom where the pick occurred. 837 GEOMID = id of picked geom 838 G = picked point (actual intersection of pick ray with object) 839 V = picked vertex, if any 840 E = picked edge, if any 841 F = picked face 842 P = path to picked primitive [0 or more] 843 VI = index of picked vertex in primitive 844 EI = list of indices of endpoints of picked edge, if any 845 FI = index of picked face 846 847 External modules can find out about pick events by registering 848 interest in calls to `pick' via the `interest' command. 849 850 `(pick-invisible [yes|no])' 851 Selects whether picks should be sensitive to objects whose appearance 852 makes them invisible; default yes. 853 With no arguments, returns current status. 854 855 `(pickable GEOM-ID {yes|no})' 856 Say whether or not GEOM-ID is included in the pool of objects 857 that could be returned from the pick command. 858 859 860 861 862Geometry Center Thu Dec 12 02:41:23 CST 1996 13 863 864 865 866 867 868Geomview(5) Geomview(5) 869 870 871 `(position objectID otherID)' 872 Set the transform of objectID to that of otherID. 873 874 `(position-at objectID otherID [center | origin])' 875 Translate objectID to the center of the bounding box or the 876 origin of the coordinate system of otherID (parallel translation). 877 Default is center. 878 879 `(position-toward objectID otherID [center | origin])' 880 Rotate objectID so that the center of the bounding box 881 or the origin of the coordinate system of the otherID 882 lies on the positive z-axis of the first object. Default is 883 the center of the bounding box. 884 885 `(progn STATEMENT [ ... ])' 886 evaluates each STATEMENT in order and returns the value of the 887 last one. Use progn to group a collection of commands together, 888 forcing them to be treated as a single command. 889 890 `quit is a synonym for `exit'' 891 892 `(quote EXPR)' 893 returns the symbolic lisp expression EXPR without evaluating it. 894 895 `(rawevent dev val x y t)' 896 Enter the specified raw event into the event queue. The 897 arguments directly specify the members of the event structure 898 used internally by geomview. This is the lowest level event 899 handler and is not intended for general use. 900 901 `(rawpick CAMID X Y)' 902 Process a pick event in camera CAMID at location (X,Y) given in 903 integer pixel coordinates. This is a low-level procedure not 904 intended for external use. 905 906 `(read {geometry|camera|transform|command} {GEOMETRY or CAMERA or ...})' 907 Read and interpret the text in ... as containing the 908 given type of data. Useful for defining objects using OOGL 909 reference syntax, e.g. 910 911 (geometry thing { INST transform : T geom : fred }) 912 (read geometry { define fred QUAD 1 0 0 0 1 0 0 0 1 1 0 0 }) 913 (read transform { define T <myfile}) 914 915 `(real-id ID)' 916 Returns a string canonically identifying the given ID, 917 or `nil' if the object does not exist. Examples: 918 (if (real-id fred) (delete fred)) 919 deletes `fred' if it exists but reports no error if it doesn't, and 920 (if (= (real-id targetgeom) (real-id World)) () (delete targetgeom)) 921 deletes `targetgeom' if it is different from the World. 922 923 924 `(redraw CAM-ID)' 925 926 927 928Geometry Center Thu Dec 12 02:41:23 CST 1996 14 929 930 931 932 933 934Geomview(5) Geomview(5) 935 936 937 States that the view in CAM-ID should be redrawn on the 938 next pass through the main loop or the next invocation of `draw'. 939 940 `(regtable) --- shows the registry table' 941 942 `(rehash-emodule-path)' 943 Rebuilds the application (external module) browser by reading 944 all .geomview-* files in all directories on the emodule-path. 945 Primarily intended for internal use; any applications defined 946 by (emodule-define ...) commands outside of the .geomview-* 947 files on the emodule-path will be lost. Does not sort the 948 entries in the brower; see (emodule-sort) for that. 949 950 `(replace-geometry GEOM-ID PART-SPECIFICATION GEOMETRY)' 951 Replace a part of the geometry for GEOM-ID. 952 953 `(rib-display [frame|tiff] FILEPREFIX)' 954 Set Renderman display to framebuffer (popup screen window) or a 955 TIFF format disk file. FILEPREFIX is used to construct 956 names of the form `prefixNNNN.suffix'. (i.e. foo0000.rib) 957 The number is incremented on every call to `rib-snapshot' and 958 reset to 0000 when `rib-display' is called. TIFF files are given 959 the same prefix and number as the RIB file (i.e. foo0004.rib 960 generates foo0004.tiff). The default FILEPREFIX is `geom' and 961 the default format is TIFF. (Note that geomview just generates a 962 RIB file, which must then be rendered.) 963 964 `(rib-snapshot CAM-ID [filename])' 965 Write Renderman snapshot (in RIB format) of CAM-ID to <filename>. 966 If no filename specified, see `rib-display' for explanation of 967 the filename used. 968 969 `(scale GEOM-ID FACTOR [FACTORY FACTORZ])' 970 Scale GEOM-ID, multiplying its size by FACTOR. The factors 971 should be positive numbers. If FACTORY and FACTORZ are 972 present and non-zero, the object is scaled by FACTOR in x, by 973 FACTORY in y, and by FACTORZ in z. If only FACTOR is present, 974 the object is scaled by FACTOR in x, y, and z. Scaling only 975 really makes sense in Euclidean space. Mouse-driven scaling in 976 other spaces is not allowed; the scale command may be issued 977 in other spaces but should be used with caution because it may 978 cause the data to extend beyond the limits of the space. 979 980 `(scene CAM-ID [GEOMETRY])' 981 Make CAM-ID look at GEOMETRY instead of at the universe. 982 983 `(set-clock TIME)' 984 Adjusts the clock for this command stream to read TIME (in seconds) 985 as of the moment the command is received. See also sleep-until, clock. 986 987 `(set-conformal-refine CMX [N [SHOWEDGES]])' 988 Sets the parameters for the refinement algorithm used in drawing 989 in the conformal model. CMX is the cosine of the maximum angle 990 an edge can bend before it is refined. Its value should be between 991 992 993 994Geometry Center Thu Dec 12 02:41:23 CST 1996 15 995 996 997 998 999 1000Geomview(5) Geomview(5) 1001 1002 1003 -1 and 1; the default is 0.95; decreasing its value will cause less 1004 refinement. N is the maximum number of iterations of refining; 1005 the default is 6. SHOWEDGES, which should be `no' or `yes', 1006 determines whether interior edges in the refinement are drawn. 1007 1008 `(set-emodule-path (PATH1 ... PATHN))' 1009 Sets the search path for external modules. The PATHi should 1010 be pathnames of directories containing, for each module, the 1011 module's executable file and a .geomview-<modulename> file 1012 which contains an (emodule-define ...) command for that 1013 module. This command implicitly calls (rehash-emodule-path) 1014 to rebuild the application brower from the new path setting. 1015 The special directory name `+' is replaced by the existing path, 1016 so e.g. (set-emodule-path (mydir +)) prepends mydir to the path. 1017 1018 `(set-load-path (PATH1 ... PATHN))' 1019 Sets search path for command, geometry, etc. files. The PATHi 1020 are strings giving the pathnames of directories to be searched. 1021 The special directory name `+' is replaced by the existing path, 1022 so e.g. (set-load-path (mydir +)) prepends mydir to the path. 1023 1024 `(set-motionscale X)' 1025 Set the motion scale factor to X (default value 0.5). These 1026 commands scale their motion by an amount which depends on the 1027 distance from the frame to the center and on the size of the 1028 frame. Specifically, they scale by 1029 dist + scaleof(frame) * motionscale 1030 where dist is the distance from the center to the frame and 1031 motionscale is the motion scale factor set by this function. 1032 Scaleof(frame) measures the size of the frame object. 1033 1034 `(setenv name string) sets the environment variable `name' to the value' 1035 1036 STRING; 1037 the name is visible to geomview (as in pathnames containing `$name') 1038 and to processes it creates, e.g. external modules. 1039 1040 `(sgi)' 1041 Returns t if running on an sgi machine, nil if not 1042 1043 `(shell SHELL-COMMAND)' 1044 Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview 1045 waits for it to complete and will be unresponsive until it does. 1046 A synonym is `!'. 1047 1048 `(sleep-for TIME)' 1049 Suspend reading commands from this stream for TIME seconds. 1050 Commands already read will still be executed; `sleep-for' inside 1051 `progn' won't delay execution of the rest of the progn's contents. 1052 1053 `(sleep-until TIME)' 1054 Suspend reading commands from this stream until TIME (in seconds). 1055 Commands already read will still be executed; `sleep-until' inside 1056 `progn' won't delay execution of the rest of the progn's contents. 1057 1058 1059 1060Geometry Center Thu Dec 12 02:41:23 CST 1996 16 1061 1062 1063 1064 1065 1066Geomview(5) Geomview(5) 1067 1068 1069 Time is measured according to this stream's clock, as set by 1070 `set-clock'; if never set, the first sleep-until sets it to 0 1071 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). 1072 Returns the number of seconds until TIME. 1073 1074 `(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])' 1075 Save a snapshot of CAM-ID in the FILENAME (a string). The 1076 FORMAT argument is optional; it may be `ppmscreen', 1077 `sgi', `ps', or `ppm'. A `ppmscreen' snapshot is created by reading 1078 the image directly from the given window; the window is popped above 1079 other windows and redrawn first, then its contents are written as a 1080 PPM format image. With `ps', dumps a Postscript picture representing 1081 the view from that window; hidden-surface removal might be incorrect. 1082 With `ppm', dumps a PPM-format image produced by geomview's internal 1083 software renderer; this may be of arbitrary size. If the FILENAME 1084 argument begins with the vertical bar `|', it's interpreted as a 1085 /bin/sh command to which the PPM or PS data should be piped. 1086 Optional XSIZE and YSIZE values are relevant only for `ppm' format, 1087 and render to a window of that size (or scaled to that size, 1088 with aspect fixed, if only XSIZE is given) 1089 1090 `(soft-shader CAM-ID {on|off|toggle})' 1091 Select whether to use software or hardware shading in that camera. 1092 1093 `(space {euclidean|hyperbolic|spherical})' 1094 Set the space associated with the world. 1095 1096 `(stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize])' 1097 Configure CAM-ID as a stereo window. 1098 no: entire window is a single pane, stereo disabled 1099 horizontal: split left/right: left is stereo eye#0, right is #1. 1100 vertical: split top/bottom: bottom is eye#0, top is #1. 1101 colored: panes overlap, red is stereo eye#0, cyan is #1. 1102 1103 A gap of `gapsize' pixels is left between subwindows; 1104 if omitted, subwindows are adjacent. 1105 If both layout and gapsize are omitted, e.g. (stereowin CAM-ID), 1106 returns current settings as a `(stereowin ...)' command list. 1107 This command doesn't set stereo projection; use `merge camera' or 1108 `camera' to set the stereyes transforms, and `merge window' or 1109 `window' to set the pixel aspect ratio & window position if needed. 1110 1111 `(time-interests deltatime initial prefix [suffix])' 1112 Indicates that all interest-related messages, when separated by at 1113 least `deltatime' seconds of real time, should be preceded by 1114 the string `prefix' and followed by `suffix'; the first message 1115 is preceded by `initial'. All three are printf format strings, 1116 whose argument is the current clock time (in seconds) on that stream. 1117 A `deltatime' of zero timestamps every message. Typical usage: 1118 (time-interests .1 `(set-clock %g)' `(sleep-until %g)') or 1119 (time-interests .1 `(set-clock %g)' 1120 "(sleep-until %g) (progn (set-clock %g)" ")") or 1121 (time-interests .1 "(set-clock %g)" 1122 "(if (> 0 (sleep-until %g)) (" "))". 1123 1124 1125 1126Geometry Center Thu Dec 12 02:41:23 CST 1996 17 1127 1128 1129 1130 1131 1132Geomview(5) Geomview(5) 1133 1134 1135 `(transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [dt] [`smooth'])' 1136 Apply a motion (rotation, translation, scaling) to object `objectID'; 1137 that is, construct and concatenate a transformation matrix with 1138 objectID's transform The 3 IDs involved are the object 1139 that moves, the center of motion, and the frame of reference 1140 in which to apply the motion. The center is easiest understood 1141 for rotations: if centerID is the same as objectID then it will 1142 spin around its own axes; otherwise the moving object will orbit 1143 the center object. Normally frameID, in whose coordinate system 1144 the (mouse) motions are interpreted, is `focus', the current camera. 1145 Translations can be scaled proportional to the 1146 distance between the target and the center. Support for 1147 spherical and hyperbolic as well as Euclidean space is 1148 built-in: use the `space' command to change spaces. With type 1149 `rotate' x, y, and z are floats specifying angles in RADIANS. 1150 For types `translate' and `translate-scaled' x, y, and z are 1151 floats specifying distances in the coordinate system of the 1152 center object. The optional `dt' field allows a simple form of 1153 animation; if present, the object moves by just that amount during 1154 approximately `dt' seconds, then stops. If present and followed by 1155 the `smooth' keyword, the motion is animated with a 3t^2-2t^3 1156 function, so as to start and stop smoothly. If absent, the motion is 1157 applied immediately. 1158 1159 `(transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [dt])' 1160 Apply continuing motion: construct a transformation matrix and 1161 concatenate it with the current transform of objectID every 1162 refresh (sets objectID's incremental transform). Same syntax 1163 as transform. If optional `dt' argument is present, 1164 the object is moved at each time step such that its average motion 1165 equals one instance of the motion per `dt' seconds. E.g. 1166 (transform-incr World World World rotate 6.28318 0 0 10.0) 1167 rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds. 1168 1169 1170 `(transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z)' 1171 Set objectID's transform to the constructed transform. 1172 Same syntax as transform. 1173 1174 `(ui-center ID)' 1175 Set the center for user interface (i.e. mouse) controlled 1176 motions to object ID. 1177 1178 `ui-emotion-program is an obsolete command.' 1179 Use its new eqivalent `emodule-define' instead. 1180 1181 `ui-emotion-run is an obsolete command.' 1182 Use its new eqivalent `emodule_start' instead. 1183 1184 `(ui-freeze [on|off])' 1185 Toggle updating user interface panels. Off by default. 1186 1187 `(ui-panel PANELNAME {on|off} [ WINDOW ] )' 1188 Do or don't display the given user-interface panel. 1189 1190 1191 1192Geometry Center Thu Dec 12 02:41:23 CST 1996 18 1193 1194 1195 1196 1197 1198Geomview(5) Geomview(5) 1199 1200 1201 Case is ignored in panel names. Current PANELNAMEs are: 1202 geomview main panel 1203 tools motion controls 1204 appearance appearance controls 1205 cameras camera controls 1206 lighting lighting controls 1207 obscure obscure controls 1208 materials material properties controls 1209 command command entry box 1210 credits geomview credits 1211 By default, the `geomview' and `tools' panels appear when 1212 geomview starts. If the optional Window is supplied, a 1213 `position' clause (e.g. (ui-panel obscure on { position xmin 1214 xmax ymin ymax }) sets the panel's default position. (Only 1215 xmin and ymin values are actually used.) A present but empty 1216 Window, e.g. `(ui-panel obscure on {})' causes interactive 1217 positioning. 1218 1219 `(ui-target ID [yes|no])' 1220 Set the target of user actions (the selected line of the 1221 target object browser) to ID. The second argument specifies 1222 whether to make ID the current object regardless of its type. 1223 If `no', then ID becomes the current object of its type 1224 (geom or camera). The default is `yes'. This command may 1225 result in a change of motion modes based on target choice. 1226 1227 `(uninterest (COMMAND [args]))' 1228 Undoes the effect of an `interest' command. (COMMAND [args]) must 1229 be identical to those used in the `interest' command. 1230 1231 `(update [timestep_in_seconds])' 1232 Apply each incremental motion once. Uses timestep if it's present and 1233 nonzero; otherwise motions are proportional to elapsed real time. 1234 1235 `(update-draw CAM-ID [timestep_in_seconds])' 1236 Apply each incremental motion once and then draw CAM-ID. 1237 Applies `timestep' seconds' worth of motion, or uses elapsed real 1238 time if `timestep' is absent or zero. 1239 1240 `(window CAM-ID WINDOW)' 1241 Specify attributes for the window of CAM-ID, e.g. its size 1242 or initial position, in the OOGL Window syntax. 1243 The special CAM-ID `default' specifies 1244 properties of future windows (created by `camera' or 1245 `new-camera'). 1246 1247 `(winenter CAM-ID)' 1248 Tell geomview that the mouse cursor is in the window 1249 of CAM-ID. This function is for development purposes 1250 and is not intended for general use. 1251 1252 `(write {command,geometry,camera,transform,window} FILENAME [ID|(ID ...)] [self|world|universe|otherID])' 1253 write description of ID in given format to FILENAME. Last 1254 parameter chooses coordinate system for geometry & transform: 1255 1256 1257 1258Geometry Center Thu Dec 12 02:41:23 CST 1996 19 1259 1260 1261 1262 1263 1264Geomview(5) Geomview(5) 1265 1266 1267 self: just the object, no transformation or appearance (geometry only) 1268 world: the object as positioned within the World. 1269 universe: object's position in universal coordinates; 1270 includes Worldtransform 1271 other ID: the object transformed to otherID's coordinate system. 1272 1273 A filename of `-' is a special case: data are written to the 1274 stream from which the 'write' command was read. For external 1275 modules, the data are sent to the module's standard input. 1276 For commands not read from an external program, `-' means 1277 geomview's standard output. (See also the `command' 1278 command.) 1279 1280 The ID can either be a single id or a parenthesized list of 1281 ids, like `g0' or `(g2 g1 dodec.off)'. 1282 1283 `(write-comments FILENAME GEOMID PICKPATH)' 1284 write OOGL COMMENT objects in the GEOMID hierarchy at the 1285 level of the pick path to FILENAME. Specifically, COMMENTS 1286 at level (a b c ... f g) will match pick paths of the form 1287 (a b c ... f *) where * includes any value of g, and also 1288 any values of possible further indices h,i,j, etc. The pick 1289 path (returned in the `pick' command) is a list of 1290 integer counters specifying a subpart of a hierarchical 1291 OOGL object. Descent into a complex object (LIST or INST) 1292 adds a new integer to the path. Traversal of simple objects 1293 increments the counter at the current level. 1294 Individual COMMENTS are enclosed by curly braces, and the 1295 entire string of zero, one, or more COMMENTS (written in 1296 the order in which they are encountered during hierarchy 1297 traversal) is enclosed by parentheses. 1298 1299 Note that arbitrary data can only be passed through the OOGL 1300 libraries as full-fledged OOGL COMMENT objects, which can be 1301 attached to other OOGL objects via the LIST type as described 1302 above. Ordinary comments in OOGL files (i.e. everything after 1303 '#' on a line) are ignored at when the file is loaded and 1304 cannot be returned. 1305 1306 `(write-sexpr FILENAME LISPOBJECT)' 1307 Writes the given LISPOBJECT to FILENAME. This function is intended 1308 for internal debugging use only. 1309 1310 `(xform ID TRANSFORM)' 1311 Concatenate TRANSFORM with the current transform of the object 1312 (apply TRANSFORM to object ID). 1313 1314 `(xform-incr ID TRANSFORM)' 1315 Apply continual motion: concatenate TRANSFORM with the current 1316 transform of the object every refresh (set object ID's 1317 incremental transform to TRANSFORM). 1318 1319 `(xform-set ID TRANSFORM)' 1320 Overwrite the current object transform with TRANSFORM (set 1321 1322 1323 1324Geometry Center Thu Dec 12 02:41:23 CST 1996 20 1325 1326 1327 1328 1329 1330Geomview(5) Geomview(5) 1331 1332 1333 object ID's transform to TRANSFORM). 1334 1335 `(zoom CAM-ID FACTOR)' 1336 Zoom CAM-ID, multiplying its field of view by FACTOR. 1337 FACTOR should be a positive number. 1338 1339 1340 1341 Info file: geomview, -*-Text-*- 1342 produced by texinfo-format-buffer 1343 from file: geomview.tex 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390Geometry Center Thu Dec 12 02:41:23 CST 1996 21 1391 1392 1393