Solidviews User's Manual Last edited by: Bier on July 15, 1983 10:46 am Introduction Solidviews is an interactive three-dimensional illustrator. Objects are represented as the union, intersection, and difference of simple primitives. Because Solidviews is built on top of Cedar Graphics, it inherits device independence; pictures can be drawn on the bitmap display, on the color display, and on a variety of printers. Solidviews currently supports wire-frame drawings, shaded plane-faced approximations, and smoothly shaded ray-tracing drawings. To obtain solidviews, type BringOver /a /p [Indigo]Top>SolidViews.df to a Cedar workarea. Run Solidviews.bcd. Three icons will appear at the bottom of your screen: A solidviews edittool, A two-dimensional scratchpad, and an artwork viewer. Once the solidviews edittool is opened, the New Viewer button will create viewers onto scenes (solidviewers). The function of each of these classes of viewers will be described below. Concepts Saving and Storing Scenes Solidviews takes advantage of some of the paradigms of interaction used in some modern text editors. In particular: 1) There is a menu of command buttons grouped into categories which make all of the facilities of Solidviews visible at a glance. 2) Solidviewers can be split to create two different views onto the same scene. 3) Scenes can be stored, saved, and loaded just as text documents can. 4) New viewers are created with an empty default scene. 5) The user can add and edit objects in a solidviewer and then "store" the new scene under a name which the user provides. Scenes The term "scene" in solidviews does not have the meaning standard to some graphics literature of "a collection of objects viewed from a particular point of view". Instead, a scene is a collection of objects positioned with repect to a WORLD coordinate system. Each solidviewer provides a view onto a scene from a particular camera position. One implication of this is that camera position is not stored when a scene is saved or stored. I have found it useful, therefore, to rotate the entire scene with respect to WORLD so that it looks right with the default camera position. Other camera positions are used to aid design. This may change. A scene is made up of three important parts: 1) A list of light sources, each of which has a position and color. 2) A list of master objects. Master objects will be described in detail below. Briefly, a master object is a shape. A scene may contain many parts having the same shape. All of these parts will probably refer to the same master object. 3) A hierarchically structured set of assemblies. The leaves of this tree, primitive assemblies, refer to 1) a master object, 2) a triplet of scalars which describe how much to scale the master object in x, y, and z before drawing it in the scene, and 3) a coordinate system which describes the position and orientation of the master object in the scene. The intermediate nodes of this tree, cluster assemblies, refer to any number of children which may be either primitive assemblies or composite assemblies themselves. A cluster assembly also has a coordinate system to describe its position in space. Nothing is drawn at this position. However, if a cluster assembly is rotated or translated, all of its children rotate or translate to maintain their position with respect to this coordinate system. Master Objects and Master Object Classes At any point in its development, Solidviews will provide a certain set of Master Object Classes (classes of shapes) which it knows how to draw and manipulate. Currently these classes are: 1) Linear Sweeps ("cookie cutter shapes"). The volume swept out by a given polygon as it moves along a line segment normal to its plane. A particular polygon, and a particular line segment result in a master object (an instance of this master object class). 2) Revolute Sweeps (solids of revolution, or "lathe shapes"). The volume swept out by a polygon in the xy plane, one of whose sides is on the y axis, when it is rotated in 3-space around the y axis. A particular polygon of this sort produces a particular master object. 3) Spheres. This class has only one instance; all spheres are the same shape. 4) Cylinders. This class is a subset of revolute sweeps. It is included for performance and convenience of design. There is only one instance. While cylinders can have different shapes, all can be achieved by scaling parallel or perpendicular to its axis. 5) Cones. This class is a subset of revolute sweeps. It is included for performance and convenience of design. There is only one instance. While cones can have different shapes, all can be achieved by scaling parallel or perpendicular to its axis. 6) Blocks. This class is a subset of linear sweeps. There is only one instance. While blocks can have different shapes, all can be achieved by scaling normal to its faces. 7) Tori. Each inner radius, cross sectional radius ratio produces a master object. Ray tracing is not yet debugged for tori. Point Set Operations A cluster assembly C in the scene tree also specifies a point set operator which is either union, difference, or intersection. The operator describes the manner in which the sons of C should be combined in order to form the shape which C represents. This gives the user of a solid modelling system a flexibility not available to someone working in clay. For example, a cross can be made by taking the union of two rectangles placed at right angles, without worry about cutting away any part of one of them, using glue, etc. It is as though the shapes are made of mist and can pass through each other as they are being positioned. In Fig. 1 , a simple scene is shown, where a pawn has been created as the union of a lathed shape and a sphere. The rook has been formed as the diffence of a lathed shape and three blocks. This is not limited to primitive assemblies. A cluster shape can be added to, subtracted from, or intersected with any other shape. Order of operands. If a cluster assembly uses the union operator, its volume its the union of the volume of its sons. Ordering of the sons is irrelevant. Similarly, intersection indicates that the volume of the cluster is that volume which all of its sons occupy. Order is irrelevant. Finally, with the difference operator, the volume of the cluster assembly is the volume of its first son minus the volume taken up by the union of all of its other sons. The user must be careful to specify the correct son as first. See Creating and Deleting Assemblies--Point Set Operations below. Names In the current implementation, assemblies, lightsources, and master objects are referred to by name. Future implementations will allow some or all of these to be selected by pointing. When using the copy command, the user must specify a prefix which will be added to the name of the original, the original's children, the original grandchildren, etc. so that the names of all of the copied assemblies will be unique. Artworks An artwork is a two-dimensional image which is to be "wrapped around" an assembly by some mapping. Or in other words. it is a description of the surface of the assembly to be used when the assembly is drawn. By default, all assemblies use an artwork which is a solid color. The current implementation also supports artworks which are a sampled image (either color or black and white) on a solid colored background. Future implementations should allow arbitrary synthetic or sampled images. The mapping from 2d image to 3d surface is a bidirectional mapping via a group of simple surfaces. The currently implemented simple surfaces are: tube and box. The Tube Mapping. You can imagine that the 2d image is transfered to the tube by rolling the tube along the picture until the tube has rolled one full revolution (images are assumed to be infinite planes so this is always possible). Remove the rolling pin and imagine that each point on the tube is projecting a beam of light of its own color directly toward the axis of the tube. Any object placed within this tube will be colored accordingly (note: inner surfaces will get painted too. Nothing stops the beams of light). The Box Mapping. Imagine that a box has been unfolded into six rectangles in a plane so that four of the rectangles are adjacent horizontally (number them left to right as 1,2,3 and 4) and rectangles 5 and 6 are above and below rectangle 2 respectively. Rectangles 2 and 4 correspond to the front and rear of the box respectively (as seen from its own positive z axis), rectangles 1 and 3 to the left and right respectively, and rectangles 5 and 6 to the top and bottom respectively. The Viewers Solidviews currently uses five classes of viewers. There are several reasons for having so many viewers. Solidviews needs to provide facilities for editting and viewing three dimensional objects, two dimensional objects, and text. Rather than make one or two "modal" viewers, I opted to have several viewers which behave very differently and do not have to rely heavily on modes for interpreting input or for displaying. Solid Viewer Each solidviewer is a view (camera position) onto a three dimensional scene. Because these viewers are "display" areas I have tried to keep their menus as small as possible. The buttons that remain are involved with camera postion dependent operations (such as hardcopy, or casting rays), display options (such as scene style or double buffer) and file operations (ie Load, Store, and Save). The Edit Tool The Solidviews edittool is currently an important part of editing. Many buttons that were once part of the solidviewers have been thrown into the edit tool to increase the amount of display space. The result is a certain modality. In order to perform a certain operation on a given scene onto which a solidviewer has been opened, the viewer must be selected by clicking its "Selected" button. The edittool will update its "scene" line to show that it will now edit the appropriate scene. The edittool provides facilities for constructing an assembly tree, positioning, orienting and scaling its parts, setting artworks, creating and postioning lightsources, etc. These facilities are discussed in depth below. The Scratchpad The scratchpad is a simple two dimensional polygon editor. It will only display and edit a single polygon at a time. The polygons designed in the scratchpad are intended to be used as the outlines for "cookie cutter shapes" known hereafter as linear sweeps (a 3d shape is created by "sweeping" a polygon along a line perpendicular to the plane of the polygon), and "lathed shapes" or "solids of revolution" refered to herein as revolute sweeps (a 3d shape is created by "sweeping" a polygon in a circle around an axis contained in the plane of the polygon). The scratchpad has two modes: "linSweep" and "revoSweep" which give appropriate feedback for the use to which the user will put his polygon. The Output Viewer An output viewer is created when the New Output button is clicked in the edittool. This is a simple text viewer in which the edittool displays data about the coordinate systems, assemblies, master objects and light sources in the current scene. This information is printed when one of the edittool "List" buttons is clicked. (note: Clicking any list button will open an output viewer if necessary.) The Artwork Tool The artwork tool displays a two dimensional image which is to be mapped onto a surface. It is triggered automatically by the "SetColorArtwork!", "SetTubeArtwork!", "SetBoxArtwork!" and "GetArtwork!" commands. Currently, artworks are AIS files at some translation from the origin (intersection of crosshairs) with some background color. Creating and Deleting Assemblies Perhaps the most important piece of text in the edittool is the name placed next to "Assembly: " since it is this assembly on which most of the commands operate. Call this assembly Star because of all the attention it gets. Second in importance is the "With Respect To: " slot which names the assembly which is to be the parent of a new assembly, or which is to be the base coordinate system for a scaling, translation, or rotation. Call this assembly WRT for short. Adding Assemblies References to clicking in this section mean using the left or middle buttons of the mouse. This results in adding a new assembly with a new unique name. To add a cluster assembly "Comp" under a parent assembly "Par", type the name "Comp" next to "Assembly:" and the name "Par" next to "With Respect To:" and hit "Add Composite!". When new scene is created, it contains the single assembly "sceneAssembly". The user's top level assemblies will be defined with respect to "sceneAssembly". To add a new primitive assembly as the son of an existing cluster assembly, set the parameters next to the "Add" button for the appropriate shape, put a new name next to "Assembly:", and click that "Add" button. This is all you need do for spheres, blocks, cylinders, cones and tori. For linear sweeps and revolute sweeps, you must design a polygon in the scratchpad before clicking the add button (See Using The Scratchpad below). Each primitive assembly refers to a master object. In the case of linear sweeps, revolute sweeps, and tori, you are adding a new master object to the scene whenever you create a new assembly of these shapes (unless you are using the copy! button). On the other hand, the master object for sphere, block, cone and cylinder are part of the system and are reused each time you add an assembly of these types. Replacing Assemblies When any of the above "Add" commands are clicked with the blue (rightmost) button of the mouse, an existing primitive assembly (Star) will lose its old shape and take on the new shape. Its position and orientation in the scene will remain unchanged. These commands print an error message if Star is a cluster assembly. Conceptually, these commands add a new master object to the scene (for revolute sweeps, linear sweeps, and tori only) and allow the old assembly to refer to this new master object. For those concerned about virtual memory space use replace sparingly. The old master object is not deleted from the scene's database since some other assemblies may still refer to it (this is not currently checked, however). If you replace an object which was formerly a sweep shape with a cone, cylinder, sphere, block, or torus, you may have problems since these master objects are tiny (unit radius etc) compared to the sweep shapes which are life size to begin with. Use the scale commands to help. Also, if you convert from simple shapes to sweeps, the resulting sweep will be huge and will probably crash through the lens of the camera and give you an error message. I am looking for a better replace concept. Point Set Ops When Star, a cluster assembly, is created, its point set op (see Concepts) takes on the value currently shown next to "Op:". Click "Op:" to cycle through the possiblilities (union, intersection, and difference). To change the point set op of Star to the value currently next to "Op:", click "Set Pointset Operation!". If the point set op of a cluster assembly is "difference", then the order of its sons is significant. To set the first son, let the first son be Star. Click "First!". Restructuring the Tree If you change your mind about the structure of the tree (Perhaps you wish you had inserted assemblies "spout", "handle", and "body" under a composite assembly "teapot" instead of directly under "sceneAssembly"), you can make some changes using the "Move Assembly!" button. When the "Move Assembly!" button is clicked, Star is added as a son of WRT, and is removed from the list of sons of the assembly which was its parent before. Note that you may wish to add a new composite assembly to your tree and then move an old node to it. (In my example you would "Add Composite!" with "Assembly: teapot" and "With Respect To: sceneAssembly" and then "Move!" with "Assembly: spout" and "With Respect To: teapot"). Copying Any assembly in a scene, be it cluster or primitive can be copied. In the case of linear and revolute sweeps, this saves space over Adding! twice without changing the contents of the scratchpad. It is also vastly more convenient to copy a cluster assembly than to build it over. Unfortunately, because of my current reliance on names, the names created must be unique at every level. To meet this constraint, the user specifies a prefix which will be added to the beginning of the names of all copied assemblies. The system checks to make sure the new names are unique so the user should choose his prefix carefully. To copy an assembly, put its name in the "copy from:" space (this seems a deviation from using "Assembly:" to name the active assembly and may change). Type the prefix into the "prefix:" space. Make sure that the name in "With Respect To:" is the name of the assembly you wish this copy to be a son of. Now press "Copy!". The copy will have the same coordinate system relationship to its parent as the original had to its parent. Hence, if they have the same parent, you will see no change to your picture. But, of course, as soon as you translate, rotate, or scale the copy, there will be a difference. A description of these transform facilities is given in the Transforming Assemblies section. Deleting Any assembly, primitive or cluster can be deleted from the scene. When "Delete Assembly!" is clicked, the entire Star assembly is plucked off the tree and thrown into oblivion. There is no undelete. Proceed with caution. Transforming Assemblies All references to clicking in the sections below on translation, scaling and rotation assume you are using the left or middle mouse button. Using the right button undoes an operation as described below in the Inverses section. Coordinate Systems All of the coordinate systems in Solidviews are right handed coordinate systems. The default camera position is at [0,0,1800] in WORLD coordinates. Hence the axes of WORLD are aligned as follows: positive x runs horizontal to the right, positive y runs vertical up, positive z runs horizontal out of the screen. The "sceneAssembly" is initially normalized with respect to WORLD coordinates (ie their coordinate systems are exactly the same). When a new assembly is added, its coordinates are normalized with respect to its parent's coordinates. Note: Any translations, rotations, or scalings may be done with WRT = WORLD, however WORLD cannot be transformed, renamed, moved, added, etc. Translation Set the translation parameters. They are currently in screen units (72 units per inch). When "Translate!" is clicked, Star will be translated with respect to the coordinate system of WRT. Note that the later assembly does not have to be the parent of the former; any assembly can be translated with respect to the coordinate system of any other (including itself). The three numbers x, y, and z represent the distance to move the assembly parallel to the x axis of WRT, the distance to move the assembly parallel to the y axis of WRT, and the distance to move the assembly parallel to the z axis of WRT, respectively. Rotation Set the number of degrees of rotation. When "RotX!" is clicked, Star is rotated around the x axis of WRT using the right hand rule to determine positive direction of rotation. Similarly for "RotY!" and "RotZ!". Again note that WRT need not be the parent of Star and may, in fact, be any assembly including Star itself. Scaling The mathematics of scaling often produces some very unintuitive effects. In particular, if a parent assembly performs an "uneven" scaling (also known as a "differential" scaling. For example [x = 1, y = 2, z = 3]) then rotating the son with respect to his own coordinate system will cause the son to change shape as it rotates. To cut down on these effects I have reduced the available scaling operations to two simple operations: 1) Scaling a primitive with respect to its own coordinates. Blocks can be made longer/shorter, wider/narrower, taller/shorter. Spheres can be made into oblate spheroids, Cylinders can be lengthened, made elliptical, given a larger radius, and so forth. This uneven scaling has no unexpected side effects since primitives have no children. 2) If Star is a cluster assembly, it can be scaled evenly (x=y=z). This has the effect of scaling each of the primitives evenly and then translating all coordinate systems proportionately so that the composite object represented by the Star exactly maintains its shape. Once again, this scaling can be done with respect to any assembly in the scene including Star itself. Inverses Each of the transforms described above has an inverse. Clicking the function button with the rightmost button of the mouse performs this inverse. In particular, inverse translation is done as though all the displacements were negated. Rotations are done as if the angle in degrees were negated. Primitive scaling and even scaling are done as if each argument x had become 1/x. Of course, you can do the inverse of a transform even if you have never done it forward. Normalizing Transformations Often in manipulating a scene, the user has forgotten the sequence of rotations or translations which have been performed between some pair of coordinate systems, or, if he remembers them, he is not keen to do them all backwards to align the coordinate systems. Solidviews provides a number of normalizing operations which align two coordinate systems into a simple known state. I call these "Normalize", "Normalize Rotation", "Align", "Abut", "AbutX", "AbutY", and "AbutZ". All of these move Star to align it in some fashion with WRT. The Normalize! button puts Star on top of WRT. Their is now no rotation or translation between them. The Normalize Rot! button leaves any translation between Star and WRT but removes all rotation between them. All of their corresponding axes are now parallel. The Align! button rotates Star as little as possible so that its axes will be parallel to some set of the axes of WRT. For example, the positive x of Star may be parallel to the positive z of WRT, positive z to negative x and positive y to positive y. This is like the Normalize Rot! operation in that it preserves translations and aligns rotation. However the alignment may leave the coordinate systems at right angles instead of parallel. The Abut! button removes all translations between Star and WRT leaving rotations as they are. The AbutX! button removes any translations in the x direction between Star and WRT so that the origins of their coordinate systems will now be in the same plane x = x0. The AbutY! button removes any translations in the y direction between Star and WRT so that the origins of their coordinate systems will now be in the same plane y = y0. The AbutZ! button removes any translations in the z direction between Star and WRT so that the origins of their coordinate systems will now be in the same plane z = z0. Editing Assemblies It is often useful to retrieve the size and shape information of a primitive assembly before trying to change it. The Edit! function of the Edittool provides this capablility. The precise behavior of the Edit! function depends on the type of master object Star refers to as described below. Edit If Star is a cylinder, its radius and height will be stuffed in the radius and height areas to the right of Add Cylinder! and three 1's are stuffed into the X,Y,Z slot to the right of Scale Primitive! unless an uneven scaling has given it an elliptical cross section. In this case, the number 1 is stuffed in the radius and height areas to the right of Add Cylinder! and its three scalars are stuffed in the X,Y,Z slot to the right of Scale Primitive!. If Star is a cone, its radius and height will be stuffed in the radius and height areas to the right of Add Cone! and three 1's are stuffed into the X,Y,Z slot to the right of Scale Primitive! unless an uneven scaling has given it an elliptical cross section. In this case, the number 1 is stuffed in the radius and height areas to the right of Add Cone! and its three scalars are stuffed in the X,Y,Z slot to the right of Scale Primitive!. If Star is a block, its x, y, and z dimensions will be stuffed in the x,y,z area to the right of Add Block! and three 1's are stuffed into the X,Y,Z slot to the right of Scale Primitive!. If Star is a sphere, its radius will be stuffed in the radius area to the right of Add Sphere! unless uneven scaling has made it an oblate spheroid. In this case, the number 1 is stuffed in the radius slot and its three scalars are stuffed in the X,Y,Z slot to the right of Scale Primitive!. If Star is a torus, its big radius and cross sectional radius will be stuffed into the appropriate areas to the right of Add Torus! and any scaling which has been performed on it since its creation (even or uneven) will be indicated by suitable values in the X,Y,Z slot to the right of Scale Primitive!. If Star is a linear sweep, its depth will be stuffed into the depth area to the right of Add Linear! and its defining polygon will be displayed in the scratchpad viewer. Any scaling which has been performed on it since its creation (even or uneven) will be indicated by suitable values in the X,Y,Z slot to the right of Scale Primitive!. If Star is a revolute sweep, its defining polygon and that polygon's mirror image will be displayed in the scratchpad viewer. Any scaling which has been performed on it since its creation (even or uneven) will be indicated by suitable values in the X,Y,Z slot to the right of Scale Primitive!. Saving and Restoring Pictures Clear, Reset, Get, Store, and Save As mentioned in Concepts above, the facilities for saving and retrieving pictures are much like the text editor facilities for saving and retrieving documents. Clear. This button flushes the current scene (losing any edits since the last Save) and loads a new scene called NoName.pic. Reset. Use this button to cancel all edits made since the last time this scene was saved. The old version of the file is simply reloaded. Get. Use this button to load an existing picture into a viewer. Works whether or not there is a named scene in the viewer. First click asks you to confirm discard of edits, if there are any, or to confirm the load, if not. Second click loads the picture into the viewer unless there is some problem with the pic file. Some possible problems are discussed below. Store. Use this button when the viewer's header says No Name, ie when you have just created a new scene. Type the name of the new scene (perhaps a name with a ".pic" extension) next to the word "Pic:" at the top of the viewer and click the button. On the first click, you will be told if this pic name already exists. On the second click the scene will be stored overwriting any previous files of the same name. Save. Use this button for saving updates to an already existing file. This button ignores the contents of "Pic:" saving to the same file named in the viewer's header. Details of Loading a File There are several reasons why a picture file may have trouble being loaded: 1) Because the pic files are human readable, minor edits can be made by hand directly on the text. These edits may have errors in syntax or may not preserve the consistency of the file (for instance, adding a new master object to the scene without incrementing the number in "Master Objects: []"). The parser is not very sophisticated and will send a message to the message window complaining that X was expected at position Y in the file but Z was found instead. That is, if you are lucky. If you aren't lucky, you will get an uncaught error from the parser. Sorry about that. 2) Changes in the pic file format occur from time to time making old pic files obsolete. Usually, updating them is a simple application of the Tioga edit tool. The obsolete files will usually cause syntax errors. 3) The solidviews fileout and filein routines may be out of synch. If you think this is the case, send a message to SolidviewsSupport^.pa. 4) If the picture takes advantage of AIS file type artworks (See Creating an Artwork below) then the AIS files it relies on must be present at load time. The message window should tell you that a mapping file could not be opened. 5) After the pic file header, there is a section of "keyword: value" pairs, such as Background color: [1,1,1] Shadows: FALSE The parser currently has trouble if this section is empty. Using the Scratchpad The scratchpad is a viewer which provides a facility for editting a single polygon. Points can be added in sequence, spliced in out of sequence, repositioned, and deleted. Displaying The scratchpad has three display modes: 1) Off. Nothing is displayed. Polygons cannot be drawn. This is the initial mode. 2) Linear Sweep mode. The polygon is displayed exactly as you draw it. One point at a time. The crosshairs show how the cross section of the drived three dimensional linear sweep will look with respect to the x and y axes of its 3d coordinate system. Click "NewLin" to enter this mode and clear the current polygon. When already in this mode, the Scratchpad respends to "NewLin" by clearing the current polygon. 3) Revolute Sweep mode. The scratchpad reminds you that you are designing a shape with revolute symmetry by reflecting each point you add about the y axis. The effect is that you are adding symmetric pairs of points with each click. The x axis of the cross hairs shows how the derived 3d revolute sweep will be positioned with respect to the xz plane of its own 3d coordinate system. Click "NewRevo" to enter this mode and clear the current polygon. When already in this mode, the Scratchpad respends to "NewRevo" by clearing the current polygon. The other buttons are of less interest to the designer. Erase, erases the scratchpad but leaves its polygon intact. CrossHairs redraws the crosshairs. Normals, draws a line normal to each edge of the current polygon. Currently this does not work properly in revo sweep mode. Other buttons are for debugging and should be left alone. Manipulating Points Adding. Clicking the leftmost mouse button adds a point onto the end of the current polygon's path. The natural way to define a shape initially is to add points sequentially in this fashion. Moving. Pushing down the middle mouse button "picks up" the nearest point of the polygon so that it will follow the mouse while this button is held down. When the button is released this point takes on the final position of the mouse at the time of release. Splicing. Holding down the CTRL key and clicking the left mouse button will "splice" a point into the polygon, splitting the edge nearest the mouse point into two edges. Deleting. Clicking the rightmost mouse button in the scratchpad deletes the point nearest to the mouse point. Beware. "Nearest" here is taken literally. Even if the mouse isn't particularly near any vertex, somebody is going to be deleted. (This won't be too hard to fix.) Limits. The current implementation limits the number of points in the defining polygon of both types of sweeps. Linear sweeps cannot have more than 30 points. Revolute sweeps cannot have more than 20 points. This restriction will go away in the future. Changing the Camera Parameters (Multiple Views) Multiple Views on a Single Scene In order to view a scene from more than one view at once, click the button marked "Split" at tahe top of a solidviewer containing the scene in question. Another viewer will open with a view onto the same scene (from the same point of view). To look at the scene from a different point of view, move the camera as described below. Focus Point, Origin, and Focal Length To reposition the camera of a particular viewer, make sure that it is the selected viewer. Its "Selected" button should be displayed white letters on a black background. Click the button to make this true (all other viewers will now have black on white "Selected" buttons). Focus point (in WORLD) coordinates is a point in the scene that you wish the z axis of the camera coordinate system to go through (the focus of attention). Origin is the position of the the center of the screen (again in WORLD coordinates). The screen is initially at (0,0,1800). (1800,0,0) provides the view from the positive x axis and so forth. Focal Length is the distance from the eyepoint to the screen. Increasing the focal length makes the lens more like a telephoto. Decreasing the focal length makes the lens more wide angle. However, increasing the focal length, say from 1800 to 3600 will actually make objects look smaller because the effect of the eyepoint moving away from the scene overwhelms the effect of a narrower angle of view. Likewise, decreasing the focal length makes objects appear larger. I'm working on it. Changing Resolution The user can specify the resolution at which images will be sampled. The sampling resolution is specified in samples per inch. The default is 72 (screen resolution). You can change the resolution by editing the number next to "resolution:" in the edittool. Clicking "resolution:" selects this number pending-delete. Click the left arrow " _ " to the left of "resolution:" causes the camera in the currently selected viewer to switch to the new resolution. Shadows At the bottom of the camera section of the edittool are the shadows buttons. Clicking "Shadows:" toggles this option on and off. Clicking the left arrow " _ " to the left of "resolution:" causes the camera in the currently selected viewer to set or reset the shadows option. In this mode, Solidviews casts secondary rays to see, for each object surface point, if each lightsource is visible from that point. If not, than that lightsource has no effect on the surface color at that point. The Picture Frame The user can specify an aligned clipping box for the current scene. Once this box is specified, all of the drawing operations of the window are clipped to that box (including ray-tracing see Ray Tracing below). To specify a bounding box, position the cursor in a solidviewer. The down transition of the middle mouse button sets the upper left hand corner of the box. The up transition sets the lower left hand corner. If you don't like it, do it again. (Rubber banding is coming). To get rid of the clipping box, hold down the SHIFT key and middle-click in the viewer. Solidviews will once again compute a tight-fitting bounding box for the scene. Adding and Deleting Lightsources The edittool provides a section for defining, viewing, adding and deleting lightsources. Lightsources will be added to or deleted from the scene named in the scene: space at the top of the edittool. To see what lights are currently in the scene use the Listing Facilities described below in Listing Scene Information. Adding a Lightsource To add a new lightsource, type its name next to "light name:". Enter a point in WORLD coordinates to be its position. (See Concepts for a description of WORLD coordinates). . Enter a red, green, blue triplet next to color: in the same section. Click AddLight! with left or middle mouse button. Deleting a Lightsource Type the name of an old lightsource next to "light name:". Click "DeleteLight!". It should go away. Editing a Lightsource Clicking EditLight! with the name "SomeLight" next to "light name:" will stuff SomeLight's position and color into the appropriate slots in the same edittool section. You may change these parameters and then click AddLight! with the rightmost mouse button, which replaces the old parameters with the new ones. Creating an Artwork (Colors and Patterns) Pure Color Artworks When an object is created, its surface is modelled as white shiny plastic. The color of Star can be changed by putting red, green, blue values next to: "r,g,b:" (values from 0 to 1) and clicking "SetColorArtwork!". Star is now considered to have a "pure color" artwork. The relectivity of the surface can be changed by clicking "material:" until the desired material type is shown. Background Color For purposes of the user interface, it is possible to put the word "background" next to Assembly: (ie let Star be a mythical background object) before clicking SetColor as above. This background color will be used in ray-tracing and shaded modes but not in the line drawing modes. Futhermore, you are only setting the background color of the "Selected" viewer (select a viewer by clicking its "Selected" button. Only this viewer will refresh when you change background color. AIS File Artworks The other kind of artwork currently supported is an AIS file (or three registered AIS files representing color seperations) drawn on a colored background. Again, enter the background color as "r,g,b" and set the material type. Give the name of an ais file next to "Source name:". If you are using three color seperations, "isColorFile:" must have "TRUE" next to it. Click it until it does. Otherwise, it must have FALSE. Also, if you are using color separations they must have names of the form: -red.ais, -green.ais, -blue.ais. Enter or .ais next to "Source name:". Now enter a real number next to "resolution:". The idea here is that the user may not always want to treat an AIS file (Array of Intensity Samples) as samples at screen resolution (72 dots per inch). In practice, this gives the user a form of scaling (ie resolution: 36 doubles the size of the image over screen resolution). Again, make sure that the material type is as desired. Finally, click SetTubeArtwork! or SetBoxArtwork! depending on the type of mappings desired (see below). The scene database will be updated and the artwork will be displayed in the Artwork Tool. Mappings In Concepts/Artworks above, the tube and box simple surfaces were described. Once we have transfered the AIS image to these simple surfaces there are an unlimited number of ways we can map it onto an arbitrary object in the scene. The currently implemented schemes are 1) The Shrinkwrap tube mapping. The picture is projected radially inward from the tube simple surface to the surface of the object. 2) The Orthogonal box mapping. The picture is projected perpendicularly from the six faces of the box. Since two or more faces of the box may try to paint the same point on the object, we resolve conflicts by comparing the surface normal of object point with the surface normals of the conflicting faces and pick the face whose surface normal most closely matches. 3) The Radial box mappings. To paint a particular object point, find the ray which starts at the centerpoint of the box and passes through the object point. Look at the intersection of this ray with the box. Whatever color the box is at this point should be the color of the object point. If the object is a sphere, this mapping works best when the box is a cube with side of length the square root of 2 times the radius of the sphere. To use the Shrinkwrap mapping, type values into tubeH and tubeR so that the tube fits around the object snugly. Click "SetTubeArtwork!". To use the Orthogonal mapping, type values into X,Y,Z so that the box will fit around the object snugly. Click "OMap" until the word "Orthogonal" appears next to it. Click "SetBoxArtwork!". To use the Radial mapping, type values into X,Y,Z so that the box will fit around the object snugly. Click "OMap" until the word "Radial" appears next to it. Click "SetBoxArtwork!". Retrieving and Displaying To retrieve the current artwork of any primitive Star, click Get Artwork! Its background color, picname, isColor, material and resolution information will be stuffed into the artwork form. Also, depending on the type of simple surface in the mapping, the size and shape of the simple surface will be retrieved as well (ie the radius and height of a tube or the three dimensions of a box). Finally, the artwork will be displayed in the artwork tool. When displaying an artwork, the Artwork Tool will try to draw an outline of the simple surface projected backwards onto the plane (ie if the simple surface is a box, the Artwork Tool will draw an unfolded box). Postioning the AIS file Currently there is a rudimentary facility for moving the AIS file with respect to the domain of the mapping (ie the unfolded box is the domain when the range (simple surface) is a box). Simply position the mouse where you want the center of the ais file to go and click the middle button. The artwork tool will redraw the artwork. To rotate the current ais file around its center, enter the desired number of degrees (counter-clockwise) next to "degrees:" on the "Rotate!" line of the artwork section of the edittool. Click Rotate!. The artwork should redraw. Clicking Normalize! will return the ais file to its default upright position. Warning The artwork displayed in the artwork tool is the artwork of the object. If you move the artwork in the middle of ray-tracing, Solidviews will probably do something very weird to your picture. Display Modes A display mode is a style for displaying the objects in a scene. Solidviews currently supports four display modes: The Current Four Modes 1) Wire frame. A quick line drawing display for feedback. 2) Plane-faced approximation. This is a very "rough" picture made by appromating each object as a mesh of planar polygons and then drawing the polygons back to front by the depth of their centers. Blocks do not currently break themselves up finely enough. Some parts show through which shouldn't and vice-versa. Gives a rough idea of shading, color, and shapes. Does not try to handle point set operations properly. Assumes that all objects are unioned together. 3) Normals mode. Mostly for debugging. Shows the surface normals of the plane-faced approximations. Depending on my mood, may suppress back-facing normals. In any case, if shown, backfacing normals will have empty arrow heads, forward-facing normals will have filled arrow heads. The above three display modes can be triggered by clicking the "style:" button in a solidviewer until it displays the desired mode next to it. 4) Ray tracing mode. This is the only mode which shows mapped artwoks, displays objects with true shape, and properly interprets all three Boolean operations. Because it takes a while (30 seconds to 2 hours), it is not a style; rather, it is invoked by clicking the RayCast button on the Solid Viewer. Ray tracing can be aborted by hitting the Stop button at the top of the solidviewer. For more details, see the Ray Tracing section. Double Buffering Any of the first three drawing modes can be combined with double buffering. Double buffering is activated by clicking the DoubleBuffer button in the solidviewer menu. This button toggles. With double buffering activated, the scene is drawn first onto a 1 bit per pixel bitmap and then that bitmap is drawn onto the solidviewer. This really only makes sense when using the bitmap display, for two reasons. First, you are losing resolution; on the 8 bit or 24 bit display, the stipple patterns are unwanted. Second, only the bitmap display refreshes fast enough to give you the smooth, flashy transitions that double buffering is all about. Listing Scene Information There are six List! buttons on the edittool. Clicking these buttons causes information to be displayed in the output viewer. An output viewer will be created if one does not already exist (if the program has been loaded a second time, it will not know about the old output viewer). Any information which depends on choosing a particular scene will use the scene named in "Scene:" at the top of the edittool. The information provided is of the following form: The Six List Buttons ListScenes! is not particularly useful. It lists the names of all of the scenes which a viewer has been open unto, listing some more than once they have been loaded more than once. This button will probably go away. ListAssemblies! lists the names of all of the assemblies, cluster or primitive which are in the current scene, along with the names of their coordinate systems (usually the same as their own names), the name of the assembly which they are defined with respect to, and whether they are cluster or primitive. ListCS! lists all of the coordinate systems in the current scene, including the coordinate system they are defined with respect to (the parent of the corresponding assembly), and the matrix describing the transforms between the assembly and its parent. This is a bit long winded for casual use. ListLights! lists the lights sources in the current scene including their name, position, and color. ListMOs! list the master objects in the current scene. You will notice that this list may contain names with number extensions such as "body.2". These result from the replace option described in Adding and Deleting Assemblies--Replacing Assemblies above. The only way to get rid of the master objects which are no longer in use at present is to save the picture, delete the entries from the file (remember to lower the number next in Master Objects [] and load it back in again. ListViewers! lists the viewers which are currently open and names the scene which they are open onto. This function is mostly for debugging purposes. Color and Color Maps Solidviews is prepared to accept and produce output suitable for display on any of: A 24 bit color device, an 8 bit gray scale device, an 8 bit color device, and a bit map display. To set the color of an object see Creating an Artwork above. Grays and Color For the Three Display Modes If an 8 bit device is in use, the user can swap between gray scale and color modes using the ColorMap! and BWMap! (Black and White Map) buttons near the top of the edittool. The picture will have to be redrawn after changing color maps since the frame buffer is actually written differently depending on the color mode (ie more is going on that just a change of color map). There are some holes in the current scheme. I will describe the input and output options here. Line drawing output. The lines are black and should be drawn that way regardless of the output device. Shaded output. Stipple patterns are used on the bitmap display. 8 bit gray converts colors to intensities and displays a gray scale image. 8 bit color finds the closest color in the default color colormap and displays that. 24 bit color is beautiful. Ray Tracing output. Ray tracing produces 4 AIS files: 1 black and white separation and 3 color separations (red, green, and blue). On a bitmap device, draw the black and white separation by clicking #B&W on the solidviewer menu (with the name of the ais file next to "AIS:" in the solidviewer menu). On an 8 bit gray scale device, do the same. On an 8 bit color device, you must produce a dithered AIS file after ray tracing. If someScene.ais is in the "AIS:" spot, then clicking "Dither" will produce someScene-std.ais (it uses someScene-red.ais, someScene-green.ais, and someScene-blue.ais so they must be on the local disk). Type this new name in the "AIS:" spot when dithering is done. Now click #B&W! This produces a color picture even though the name of the button is #B&W. Sorry about that. Finally, on a 24 bit device, click #Color! in the solidviewer menu and the big beautiful full-color version of your ray-traced image will be displayed. Solid Viewer Draw Options There are several buttons on the solidviewer titled #-this-or-that. Clicking one of these buttons will cause an image to be drawn on top of the image currently displayed. These buttons used to say "Draw-this-or-that" but, as more buttons were added, "#" was substituted so buttons would take up less space. The drawing buttons are: The Eight Draw Buttons #BBox. Draws the bounding box of each assembly (including both cluster and primitive assemblies). Notice that if the difference or intersection point set operators are in use, a cluster's bounding box may be smaller than the bounding box which would bound all of the bounding boxes of its children. #Scene. Draws the entire scene using the current display style. Can be used to draw a wire frame scene on top of a ray tracing scene to see what's going on etc. #Coords. Draws the three axes of each of the coordinate systems in the scene (ie one for each assembly). Does not currently label them. #Point. Interprets the numbers next to x,y,z: in the solidviewer as a point in CAMERA coordinates and draws an x at that point on the screen. #Cross. Draws cross hairs which meet at the current origin of the camera coordinate system. #Color. Takes the AIS file name next to AIS: (say someScene.ais) and interprets it as three color separations (someScene-red.ais, someScene-green.ais, and someScene-blue.ais) which are drawn so that a full color picture is shown. Note that this only has the right effect in 24 bit per pixel mode, though it behaves more or less properly on a bitmap or 8 bit gray scale device. Each AIS image is scaled to just fit in the bounding box of the current scene. #B&W. Takes the AIS file name next to AIS: and draws it as a black and white image. The AIS image is scaled to just fit in the bounding box of the current scene. #Dither. Takes the AIS file name next to AIS:. If the name is "Somename.ais", then "Somename-std.ais" is drawn (presumably on the color display). This provides a way to view color pictures on an 8-bit per pixel color mapped display. Before pressing this button, you should have already pressed "Dither" to create "Somename-std.ais". And before pressing "Dither" you should have pressed "ColorMap!" in the edittool to load the dither color map. Hardcopy There are many ways to produce hardcopy of Solidviews pictures. I describe here several methods to produce press files and AIS files. Printing AIS files and Press Files Press files can be printed by sending them to a printer with the Cedar Print command which I will not describe further. AIS files can be printed 1) By turning them into bands files (use [Ivy]Top>BandsClient>BandsClientPackage.bcd), FTPing them to a raven or platemaker and using Mesapress (an Appendix describing Mesapress coming soon). 2) By FTPing the AIS files to a raven or platemaker and using MakePress. See Appendix A for the recipe. The Press Buttons The Press Button draws the scene using the current style into a press file whose name will be the name next to AIS: except that .ais will be replaced with .press. Warning: Shaded approximation style drawings involving even a moderate (small?) number of objects will produce too many color changes in the press file for the press software at the printers to handle. The printer will crash reporting core overflow. Ray Tracing Ray tracing is invoked by the RayCast button on the Solid Viewer. For every pixel on a grid of specified resolution on the screen, Solidviews casts a beam of light to find which object is visible at that pixel, calculates lighting and comes up with a color to paint the pixel. Using Ray Tracing To perform ray tracing, click twice over the RayCast button in the solidviewer. Left-clicking causes four AIS files to be constructed: a black and white separation, and 3 color separations (red, green, and blue). If the name next to "AIS:" in the solidviewer is FooFum.pic, these files will be named FooFum-red.ais, FooFum-green.ais, FooFum-blue.ais, and FooFum.ais. Right-clicking causes only the black and white file FooFum.ais to be constructed. When ray-tracing is done, FooFum.ais is automatically drawn for you. Clicking #B&W will cause it to be drawn again later in the same fashion. To set the grid resoution, see Changing the Camera Parameters above. Details The first thing to know about ray tracing is that it is currently slow. It is not the technique of choice for feedback. A sphere of radius 100, made of plastic takes about 1 minute to ray trace these days at screen resolution. Times are improving but not dramatically. Interactive speeds can be achieved by reducing the grid resoution resolution. You can make the quality/speed trade-off as you like. Is is also possible to ray trace a small part of a scene at a time, so critical details of it can be debugged reasonably fast. Edit the scene bounding box (See Changing the Camera Parameters above) and invoke ray-tracing normally. Only the interior of this box will be traced. Once you have your AIS files, you will want to display them. To do this, you must use some appropriate subset of the #Color, Dither, #Dither, and #B&W buttons; for more details, see Solid Viewer Draw Options below. These files also can be shipped to remote printers; see Hardcopy. The procedures which draw ais files in a solidviewer (#Color and #B&W) center the image in the current bounding box of the scene. Thus if a ray tracing is performed and a simple even scaling of the whole scene or translation of the whole scene is performed, the ray tracing image may no longer correspond to the wire frame, shaded, and normals images. It will redraw at the same size, perhaps translated. Currently, Solidviews is unable to read the comment in the AIS file telling what resolution it was scanned at. Hence, this information is read from the resolution: slot of the edittool. Therefore, changing this entry will cause AIS files to redraw with a different size. It is possible to cast a single ray at the scene for debugging purposes. Pointing to a pixel in the scene and clicking the rightmost button of the mouse will send out a ray corresponding to that pixel. Also, entering two numbers in the first two positions of the "x,y,z" slot of the solidviewer and clicking ARay! will send out a ray at this camera point (z = 0 is assumed). The result of casting a single ray is a printed report in the Output Viewer describing which surfaces the ray hit and what the final color would be at that point. Ray tracing can be aborted by hitting the Stop button at the top of the solidviewer. The AIS files are saved as they are at that point. During ray tracing, a bar indicator at the left margin of the bounding box shows how many lines of the image have been scanned so far. Interactive Editing With the Mouse Pointing You can refer to solidviews objects by pointing at them. Place the mouse over an object and hold down the left mouse button. The name of the object which you are pointing to will be stuffed into the "Assembly:" slot of the edittool and a three dimensional coordinate system will appear which tracks the surface of the object. When you release the mouse button, you have made a primary selection. What is really going on. You are casting a ray into the scene. Solidviews finds the nearest surface which is hit and calculates the surface normal at that point. Hence, if you are using difference or intersection operators, your rays may go right through those surfaces of primitives which are not part of the final constructed volume. The coordinate system which appears has that properties that: Its z axis is the surface normal of the surface found mby ray tracing. The x axis is chosen to be one of the directions perpendicular to the y axis of the selected object, if possible. This works out very naturally in most cases. To make a seconary selection, hold down the SHIFT key and then hold down the left mouse button. Another coordinate system will track the newly selected surface. When you release the left mouse button, your selection is finished. Extending the Selection Pointing as described above only permits the user to point at primitives, since Solidviews has no way of knowing what level of the tree you are interested in. To extend to selection to refer to the parent of the currently selected node, click "Extend" in the solidviewer. Repeatedy clicking "Extend" will exend the selection closer and closer the the sceneAssembly root node. Making Objects Tangent Once you have made a primary selection and a secondary selection, you can perform the move operation, similar to the Tioga move operation (CTRL-SHIFT select). Click the Move button at the top of the solidviewer. As in Tioga, the primary selection serves as a destination for the secondary selection. The secondary object is translated and rotated so that primary surface point and the secondary surface point coincide and the secondary surface is tangent to the primary surface. An operation similar to Tioga Copy will be coming soon. Hints Ray Tracing Don't be afraid to use difference (and intersection) just because the shaded drawing style doesn't support them. The ray tracing pictures are often worth a little extra confusion. Learn to read the human-readable files which Solidviews saves and loads. In particular, a quick read-through of the Assemblies section to make sure that the right point set operations and picture structure are present is often useful. You can even read it while ray tracing is going on. If you find a bug, hit Stop (#B&W will draw what you had so far), edit and try again. Known Bugs In addition to the lack of a shaded approximation drawing mode for the difference and intersection operations (see Display Modes above), the following bugs are present in the current implementation: Viewer Split Sometimes when two viewers are split, they share the same camera when the column is refreshed, producing two pictures from the same point of view (or in the same display mode) when the camera points (or display modes should be different). Click "Erase" and "DrawScene" in the offending viewer to correct the display. (Split also repaints more than it has to.) Finally, if you see a viewer which says "[Split]" when it shouldn't, don't "Destroy" it. This has been known to stop Cedar dead in its tracks. Tell me if this happens. Floating Point Errors Solidviews sometimes triggers floating point errors during refresh. Abort the error and hit "#Scene". Hopefully, the error will not be repeated. If it is, try closing a window in the same column. APPENDIX A - Printing color pictures on Lilac This section describes the recipe to print the AIS files produced by SolidViews on Lilac, a color xerographic printer in CSL. Step 0: Create the AIS files Generate the color separation files for the scene (see Ray Tracing above). If the "AIS:" field of the Solid Viewer says FooBar.ais, ray tracing should have produced three files on your disk, FooBar-red.ais, FooBar-green.ais, and FooBar-blue.ais. Save those files on a remote server. A message giving the size of the scanned image (pixels per line and number of lines) will be written on the Output viewer. Take note of these numbers, they will be needed later. Note: better keep the file names reasonably short, otherwise Lilac may crash. Step 1: Get hold of Lilac Go to Lilac and press SWAT (the upper unmarked key at the right of the keyboard) while holding the left SHIFT key down. This will abort Lilac's server, and bring up the Alto Executive. Frustrated users may come yelling at you; try to ignore them. Step 2: Get space on Lilac's disk This step may not be necessary, but it will put you on the safe side, and you will be contributing to a Good Cause. Type Neptune to the Alto Executive. The display will show two columns of file names, labeled DP0:*.* and NoDisk:*.*. Click the NoDisk: label on the right column. Three disk pack names will appear below it; click TP0. The directory of Lilac's Trident disk pack will then be displayed in the right column. Any files with extension ".ais" are fair game for deletion. Select them with the blue mouse button, and then click Start at the top left corner of the screen. Once the files have been deleted, you can get out of Neptune by clicking the Quit button Step 3: Bring your AIS files over to the Trident disk Type FTP/t to the Alto Executive, and retrieve FooBar-*.ais (-red, -green, -blue) from your remote server. The "/t" switch tells FTP to write them on Lilac's Trident disk instead of DP0. Step 4: Check AIS file parameters If you know the dimensions of your AIS image (as printed by SolidViews in step 0), proceed to step 5. If not, or if you just want to be sure, type AISAtrributes to the Alto Executive. This will bring up a screenful of buttons and fields. Click the "File" field and type FooBar-red.ais there. The file attributes will be displayed; the Scan Lines and Pixels/line fields are all you need to know. All three files have the same dimensions, so you only have to check one of them. Click Quit to exit. Step 5: Create the Press file Type MakePress to the Alto Executive This will bring up a screenful of buttons and parameter fields. Fill them as follows: File name: click this button and then type FooBar.press. Header Name and Header Date: click these buttons until both say No (You don't want headers on each printed page). Sequence: click this button and then type 0 (You don't want page numbers). X Input Samples: click this button and type the number of pixels per scan line of your AIS files, followed by . . Y Input Samples: click this button and type the number of scan lines in your AIS files, followed by Magenta: click the button next to it (in the column labeled File Name) and type FooBar-green.ais Yellow: click and type FooBar-blue.ais Cyan: click and type FooBar-red.ais Copies: click and type the number of copies you want to print. The Black field should be left empty. Note: setting X Input Samples also sets the Y Input Samples, so the two must be given in this order. When all the fields above have been filled and checked, click the large Write Press File button in the center of the screen. FooBar.press will then be written on DP0. Clck Quit to exit. Step 6: Print it Type Press print FooBar.press to the Alto Executive. The screen should go blank, and the cursor will show some status codes: the normal sequence is F, FO, S1, FO, C1, and finally P. C1 will slowly crawl three times across the screen, presumably to give you something interesting to watch while you wait. At this point, the color printer will wake up, and after a few seconds of dramatic suspense, the creature of your efforts will slowly crawl out of it. Step 7: Wait! You aren't done yet! Type @Server.cm to the Alto Executive to restart Lilac's printing server. We won't be responsible for anything that may happen to you or your family in case you forget this last step. Many thanks to Jorge Stolfi for writing Appendix A. Ê Ð–"TiogaDoc" style˜ItitlešÏb˜Ihead˜.š ˜ IbodyšœÐ˜ÐMš œºÏiœž œ žœZžœZ˜³—š˜˜Mšœt˜tMšœ˜MšœO˜OMšœF˜FMšœ7˜7Mšœz˜z—šœ˜Mšœ†˜†Mšœ,˜,MšœC˜CMšœ žœÔ˜ïMšœ'ž œžœ«žœŒ˜ª—šœ(˜(šœ¼˜¼Mšœ„˜„Mšœ˜MšœN˜NMšœ„˜„Mšœü˜üMšœ¯˜¯Mšœ~˜~——šœ˜MšœË˜ËMšœ„˜„Mšœ œžœ˜Í—šœ˜Mšœ¢˜¢—šœ˜šœî˜îMšœRžœ@˜¡MšœŒ˜ŒMšœç˜ç———š ˜ Mšœ§˜§šœ ˜ MšœŠ˜Š—šœ ˜ MšœË˜Ë—šœ˜MšœÁ˜Á—šœ˜Mšœ’˜’—šœ˜šœÑ˜ÑMšœ~˜~———š ˜ Mšœ¶žœŽžœ ˜Öšœ˜Mšœ™˜™Mšœ°˜°Mšœ˜Mšœ±˜±Mšœ—˜——šœ˜MšœÀ˜ÀMšœ—˜—M˜í—šœ ˜ Mšœ¿˜¿Mšœ¨˜¨—šœ˜MšœÅ˜Å—šœ˜Mšœí˜íMšœŸœ ˜¿—šœ˜Mšœß˜ß——š˜MšœÒžœ ˜ãšœ˜Mšœµ˜µ—šœ ˜ Mšœ™œR˜í—šœ˜MšœÁ˜Á—šœ˜Mšœƒ ˜ƒ —šœ˜MšœÖ˜Ö—šœ˜šœ›˜›Mšœe˜eMšœŸ˜ŸMšœ»˜»Mšœ]˜]M˜¨M˜¨M˜¨———š˜Mšœ¤˜¤šœ˜MšœÇ˜ÇMšœº˜ºMšœ»˜»Mšœ¤˜¤Mšœ¯˜¯MšœÒ˜ÒMšœ¦˜¦——˜˜"M˜ŸM˜}M˜‹M˜îM˜ŸM˜¨—˜M˜KM˜ÌM˜×M˜ŒM˜ç˜TIdisplay˜(—M˜:——š˜Mšœ¬˜¬šœ ˜ Mšœ'˜'MšœU˜UMšœ¡˜¡Mšœ¨˜¨MšœÑ˜Ñ—šœ˜MšœÀ˜ÀM˜ƒM˜ªM˜•M˜€——š/˜/˜ M˜Ë—˜%Mšœ“˜“MšœÞ˜ÞMšœì˜ì—˜M˜Ì—˜M˜ê—˜MšœÀ œÊÏsœt˜Ž——š ˜ MšœÇ˜ÇMšœ\œ˜všœ˜Mšœ}œÓœw˜Ñ—šœ˜Mšœe˜e—˜Mšœêž œC˜¶——š)˜)˜Mšœ€˜€—˜M˜Þ—˜Mšœ£ ˜£ —˜˜ŽM˜…M˜ïM˜¸—M˜‰M˜¿M˜·—˜MšœÄ˜ÄMšœÒ˜Ò—˜M˜„—˜Mšœ*žœ•˜Á——š ˜ Mšœs˜s˜Mšœ;˜;MšœÕ˜ÕMšœœ˜œMšœŽ˜ŽMšœ¢ œ ˜¶—šœ˜Mšœƒ˜ƒ——š˜MšœÎ˜Î˜MšœÙ˜ÙMšœ²˜²Mšœ§˜§Mšœd˜dMšœÆœžœí˜çM˜–——š˜MšœØœ˜ò˜+Mšœ×˜×Mšœg˜gMšœþ˜þMšœÚ˜ÚMšœÈ˜ÈMšœ˜˜˜——š˜MšœÎ˜Î˜Mšœ¬˜¬Mšœ¢˜¢Mšœ‰˜‰MšœŽ˜ŽMšœ\˜\MšœÊ˜ÊMšœ£˜£M˜À——š˜Mšœ†˜†˜"Mšœw˜wMšœ˜MšœÅ˜ÅMšœh˜h—˜Mšœž˜ž——š ˜ Mšœ•˜•˜Mšœò˜òM˜áMšœœ˜D—˜Mšœ˜Mšœ„˜„Mšœ¡œW˜–Mšœ·œ@œ˜šMšœ¨˜¨Mšœ|ž œ—˜œMšœ‘˜‘——˜"L˜Mšœüžœ˜ŽM˜úMšœ žœÊ˜æL˜M˜ùL˜M˜áM˜7—˜˜ M˜´M˜ø——˜ M˜Æ˜ M˜”—˜M˜Æ——˜-M˜~˜Mšœ7 œÝ˜ŸMšœ´˜´Inote˜NM˜—˜Mš œœIžœœNŸ=œ˜ùM˜—˜!MšŸs˜sMš œ œRœœœPœ[˜ËMšœSžœœuœ˜ûM˜—˜5Mšœ œ`ŸÐbsŸHœ˜ÁM˜—˜!Mšœ”œN˜óMš œ œœ4 œ œ#ŸPœœ ˜ˆM˜—˜šœ œn˜€Iindentš œ" œ˜8Pš œ œ%œ/˜qPšœ"œ˜NPšœ!žœ*˜xPšœ!žœ$˜hPšœI˜dPšœ˜*Pšœ˜(Pšœ9˜?—Mšœœuž œ˜ŒMšœHœUœ ˜ºM˜—˜MšœœœŸxœš˜ÏM˜—˜#Mšœœ<žm˜¼Iblock˜3M˜—M˜M˜——…—öL"