The two modules related to the high-level operation of the workarea are presented in Table 3.3. A number of lower-level submodules related to components, netlists and multiboxes are also related to the workarea and are presented in subsequent sections.
|attrib.tcl||Highlights and dehighlights workarea circuit elements (such as components and wires) as the mouse pointer enters and leaves them.|
|workarea.tcl||This module is responsible for the creation, configuration and manipulation of the workarea upon which the components and netlists are placed, modified and deleted by the user.|
The workarea is created by the procedure workarea_create of the workarea.tcl module. Its basic duties are to create and position the workarea canvas and the horizontal and vertical scrollbars. It also dispatches another procedure to draw the grid lines on the canvas using the intensity specified in the user's configuration file. The workarea.tcl module also contains procedures which translate between screen and canvas coordinates and some data abstraction procedures which return the workarea widget and canvas widget for use by other modules.
The second module related to the workarea, attrib.tcl, changes the colour and width attributes of circuit elements as the mouse pointer enters and leaves them. This is done so that the user can easily determine which circuit element will be affected by the current operation. All the procedures contained in this module work basically the same way. The parameters to these procedures consist of the workarea canvas widget name, the highlighted status of the element (either normal or selected) and the tag or identifier of the circuit element to change. The procedures retrieve the desired colour and width attributes of the circuit element from the resource database and then use the itemconfigure canvas widget command to change the appearance of all the canvas primitives which comprise the circuit element. For some circuit elements, such as wires and points, this operation is simple, since they are comprised of only one canvas primitive. For more complicated elements such as gates, the operation must iterate over all the canvas primitives which comprise the element and change the width and colour attribute for each primitive.
A brief discussion of how structured graphics are created and manipulated using the Tk canvas is in order. Consider the short, but complete, code fragment presented in Figure 3.5. The first two lines simply create a canvas and place it on the display. Note that -borderwidth and -highlightthickness are called widget options and control the width of the canvas border and the thickness of the highlight focus ring surrounding the canvas respectively. In this particular case, they are both set to zero, meaning that the canvas will have no border and no highlight focus ring. The next two lines use the create canvas widget command to create two canvas items. These two commands create two short oblique line segments which intersect each other at their end points, forming a in the upper left region of the canvas.
Figure 3.5: Creating Structured Graphics on a Canvas
The create canvas widget command always returns a unique numeric identifier representing the canvas item just created, so that the canvas item may be referenced in the future. In our code example, the identifier of the first line is returned but discarded by our script. The identifier of the second line, however, is saved in the variable id, as it is used later. Also note that each of the line segments created are given the tag x, which may be used in the future to refer to both of these canvas items as a single entity.
The fifth line of the script moves all canvas items tagged with x 40 pixels down and 40 pixels to the right relative to their last position. Both lines are moved because they have both been tagged with the x tag when they were created. The sixth line then modifies the -fill and -width attributes of both lines to blue and 3 respectively using the itemconfigure widget command. This has the effect of colouring both line segments blue and increasing their width, making them easier to see on the canvas. Finally, the seventh line moves the canvas item identified by the contents of variable id (the second line segment created earlier) 20 pixels to the left. The end result of this script is that a will be displayed at an offset of 30 pixels horizontally and 40 pixels vertically from the upper left corner of the canvas widget.
Note that when this script is run, the user will see only the cumulative results of all the canvas operations; the creation of the and its subsequent manipulation will not be seen. This is because Tk, for efficiency purposes, buffers all the screen updates until idle time is available to actually flush the updates to the display. To actually see the effect each line of the script has on the canvas, the code sequence ``update; after 1000'' can be inserted between each line. This causes Tk to flush the updates to the display immediately and to wait 1000 milliseconds (one second) so that the user may see the incremental effects of the script.