tkar 0.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,539 @@
1
+ = Tkar protocol
2
+
3
+ This document describes the syntax and semantics of the text commands sent over the two-way communication stream (pipe, tcp socket, unix socket) to the tkar process. (The binary protocol is not documented here.)
4
+
5
+ See also the command-line options for tkar by running it with the -h option:
6
+
7
+ tkar -h
8
+
9
+ == Syntax
10
+
11
+ Commands are case sensitive and separated by newlines, and arguments are separated (from commands and from each other) by spaces:
12
+
13
+ command1 arg0 arg1 arg2
14
+ command2 arg0 arg1 arg2
15
+
16
+ Use a backslash ("\") character at the end of a line to continue to the next line:
17
+
18
+ command1 arg0 \
19
+ arg1 arg2
20
+
21
+ Blank lines are ignored. Spaces before text on a line are ignored. Extra spaces between arguments is not significant.
22
+
23
+ Lines which are blank up to a # character are ignored (the text after the # is a comment):
24
+
25
+ command1 arg0 arg1 arg2
26
+ #command2 arg0 arg1 arg2 this line is not executed
27
+
28
+ However, # characters are significant after non-whitespace characters:
29
+
30
+ command1 arg0 arg1 #F0A020
31
+
32
+ The last argument is a typical color parameter.
33
+
34
+ == Process control
35
+
36
+ <b><tt>wait t</tt></b>
37
+
38
+ Tells tkar to sleep for up to t seconds before processessing the next command. The value may be floating point.
39
+
40
+ Wait is a way to keep the frame rate constant. A single timer with memory is used for all waits, so that if wait is called repeatedly, sleep time is reduced by the amount of time used for processing since the last wait. If processing time is less than wait time, the next processing cycle will begin exactly t seconds after the previous one (subject to OS process scheduling limitations).
41
+
42
+ <b><tt>done</tt></b>
43
+
44
+ Tells tkar to stop processing inputs, closing the input stream.
45
+
46
+ This is useful in exactly one case: only on MS Windows _and_ when input comes from a pipe (not a socket). Send a +done+ message when you are finished sending animation data to tkar. Otherwise, waiting for input that never arrives causes the UI thread to freeze, due to a bug in the VC6 MSVCRT.DLL.
47
+
48
+ <b><tt>exit</tt></b>
49
+
50
+ Exit the tkar process.
51
+
52
+ <b><tt>load FILE</tt></b>
53
+
54
+ Load the specified command file before proceeding with the next command. Any commands take the same effect as if they occurred in the current command sequence. Any number of files may be nested. The file is searched for first assuming that <tt>FILE</tt> is an absolute path and then, if the load command is nested in another file, relative to the dir of that file. The file name may contain spaces; no quotation is needed.
55
+
56
+ <b><tt>echo arg arg ...</tt></b>
57
+
58
+ Echo the arguments back on the output stream from tkar (the same output stream that contains user command messages as described later in this document).
59
+
60
+
61
+ == Window control
62
+
63
+ <b><tt>title TITLE</tt></b>
64
+
65
+ Sets the title of the window to <tt>TITLE</tt>.
66
+
67
+ <b><tt>background COLOR</tt></b>
68
+
69
+ Sets the window background color to <TT>COLOR</tt>. See the section on colors for an explanation of the argument.
70
+
71
+ <b><tt>width X</tt></b>
72
+
73
+ Sets the width (in pixels) of the animation window. (The window can be resized using the mouse.)
74
+
75
+ <b><tt>height Y</tt></b>
76
+
77
+ Sets the height (in pixels) of the animation window. (The window can be resized using the mouse.)
78
+
79
+ <b><tt>window_xy X Y</tt></b>
80
+
81
+ Sets the position of the window on the screen. Positive coordinates denote offset of window from left or top edge of screen. Negative coordinates denote offset from right or bottom edge.
82
+
83
+ <b><tt>zoom_to Z</tt></b>
84
+
85
+ Sets the zoom level of the animation window. A value of 1 means no zoom. A larger value makes objects look bigger. A smaller (positive) value makes objects look smaller. (The zoom can be changed using the mouse or the keyboard--see the help text for the window.)
86
+
87
+ <b><tt>view_at X Y</tt></b>
88
+
89
+ Scroll the canvas so that the point X Y (in canvas coordinates) is at the center of the window.
90
+
91
+ <b><tt>view_id ID</tt></b>
92
+
93
+ Scroll the canvas so that the object with specified id is at the center of the window.
94
+
95
+ <b><tt>follow ID</tt></b>
96
+
97
+ As the animation updates, scroll the window so that the object with specified id is at the center of the window.
98
+
99
+ <b><tt>bounds X_MIN Y_MIN X_MAX Y_MAX</tt></b>
100
+
101
+ Sets the dimensions of the canvas (of which only a portion is visible at a time in the window). The default values are <tt>-3000 -3000 3000 3000</tt>.
102
+
103
+ <b><tt>update</tt></b>
104
+
105
+ Draws all changed objects to the canvas.
106
+
107
+ <i>Should be called after each time-step (and after all the +move+, +rot+, etc. commands pertaining to the timestep have been sent) to update the display</i>.
108
+
109
+
110
+ == Shape definition
111
+
112
+ A shape definition is used to define how an object is drawn. Each object on the canvas has a shape. A shape is built out of one or more drawing primitives. A shape can reference another shape as a macro and can be parametrized, so that two objects with the same shape may look quite different. A parametrized shape can also be used for an object which changes its geometry or color dynamically.
113
+
114
+ The basic syntax of a shape definition is:
115
+
116
+ <b><tt>shape SHAPE_NAME PART0 PART1 PART2...</tt></b>
117
+
118
+ This defines a new shape with specified SHAPE_NAME, which may be any string without whitespace. The PART strings are one or more space-free strings defining
119
+ the parts of the shape.
120
+
121
+ The order of the PARTs is significant: later parts are drawn after, and therefore appear to be above the earlier parts.
122
+
123
+ The parts can be primitives (discussed below) or other shapes that have already been defined.
124
+
125
+ === Part Syntax
126
+
127
+ Each PART is of the form:
128
+
129
+ partnameARG,ARG,ARG,....
130
+
131
+ There are no spaces (or line continuations) within the entire PART.
132
+
133
+ The following rules apply:
134
+
135
+ - +partname+ can be the name of a primitive or of another shape. In the latter case, the other shape acts as a _macro_, expanding its own primitives within the shape being defined. For example:
136
+
137
+ shape foo line0,0,10,10
138
+ shape bar foo
139
+
140
+ is equivalent to
141
+
142
+ shape foo line0,0,10,10
143
+ shape bar line0,0,10,10
144
+
145
+ Any (finite!) number of macros can be nested. Macros may take arguments; see the section on parametrized shapes.
146
+
147
+ - Arguments are separated from each other by a comma, but no spaces.
148
+
149
+ - The _positional_ arguments (i.e., the arguments whose meaning derives from their index in the list of arguments) of a primitive are appended to the name of the primitive <i>without any separating spaces or other characters</i>. For example:
150
+
151
+ shape label text0,50
152
+
153
+ Positional arguments are almost always coordinates, distances, or angles.
154
+
155
+ - The _key_-_value_ arguments (i.e., the arguments whose meaning derives from the key string paired with the value), if any, are appended after the positional arguments. They may occur in any order. The key and value are separated by a colon. For example:
156
+
157
+ shape label text0,50,anchor:c,justify:center,width:40,text:Untitled,fc:0
158
+
159
+ - In some cases, a single argument must be used to designate a list. In those cases, the "+" character is used to separate the values. For example, as an argument to a line primitive, the following denotes a list of three numbers, 10, 8, and 6, as the value for the arrowshape option:
160
+
161
+ shape arrow line0,0,*0,0,arrow:last,arrowshape:10+8+6
162
+
163
+ - If only key-value arguments are present, use a comma to separate the first argument from the name of the shape:
164
+
165
+ shape car carbox,fc:red
166
+
167
+ - In some cases, a value might need to include spaces (text, for example). In that case, use a parameter for that value and use the +param+ command to set the actual value. See the +text+ command entry.
168
+
169
+ === Parametrized shapes
170
+
171
+ If a string of the form <tt>*N</tt>, where N is a sequence of digits, occurs in a shape definition, then the shape is parametric. Parameters are not named and can only be referred to by the number +N+.
172
+
173
+ In an +add+ command, the +N+-th parameter supplied with the command is substituted into all places where <tt>*N</tt> appears in the shape definition. For example, the commands:
174
+
175
+ shape box rect*0,*0,*1,*1
176
+ add box 3 - 100 30 50 0 5 10
177
+
178
+ add a box defined by the points 5 5 and 10 10 at position 30 50. (Note that the coordinates 5 5 and 10 10 are in the shape's local coordinate system, whereas the coordinates 30 50 are in the canvas's global coordinates.)
179
+
180
+ <i>Note: all of these examples can be entered as standard input to tkar. Just make sure to type</i> +update+ <i>when you want to see the effect.</i>
181
+
182
+ Parametrized shapes can be used as macros inside of shape definitions, in which case their parameters are substituted when the macro is expanded. For example:
183
+
184
+ shape box rect*0,*0,*1,*1
185
+ shape two_boxes box-20,-10 box10,20
186
+ add two_boxes 3 - 100 30 50 0
187
+
188
+ Paramters can be passed to a macro as well as to a primitive:
189
+
190
+ shape box rect*0,*0,*1,*1
191
+ shape two_boxes box-20,*0 box*0,20
192
+ add two_boxes 3 - 100 30 50 0 10
193
+
194
+ Note that the last line above ends with a single parameter value, 10, which is passed to the *0 parameter in +two_boxes+.
195
+
196
+ Note that not only positional arguments but also key-value arguments can be parametrized:
197
+
198
+ shape box rect*0,*0,*1,*1,fc:*2
199
+ add box 3 - 100 30 50 0 5 10 red
200
+
201
+ == Drawing primitives
202
+
203
+ Drawing primitives are used only within shape definitions. Primitives cannot be +add+-ed directily to the canvas. (This is because all primitives require some coordinates to outline the shape, but the +add+ command only supplies coordinates of the _center_ [or origin] of the shape.)
204
+
205
+ Since these primitives are implemented directly in terms of TkCanvas primitives, the Tk manual is a helpful reference: http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm. Individual sections are linked to from the sections below.
206
+
207
+ Points to bear in mind when reading the Tk documentation:
208
+
209
+ - TkCanvas "items" correspond to Tkar primitives.
210
+
211
+ - Each primitive takes a list (possibly variable length) of positional arguments, which are typically coordinates.
212
+
213
+ - Most primitives take, in addition to the positional arguments, key-value pair arguments, which follow the positional arguments and may be in any order. (The Tk documentation refers to the key as an "option".)
214
+
215
+ - Not all Tk features are supported.
216
+
217
+ - Tkar "objects" are groupings of multiple TkCanvas items. (The grouping is the effect of having multiple parts in a shape definition.)
218
+
219
+ - The object ID is handled by Tk as a _tag_.
220
+
221
+ === Coordinates
222
+
223
+ The coordinate system while defining shapes always has the following characteristics, regardless of the <tt>--flip</tt> and <tt>--radians</tt> command-line arguments:
224
+
225
+ - The coordinate system is left-handed: positive x is to the right, positive y is down.
226
+
227
+ - The origin is the center of the shape (about which the shape will be rotated by the +rot+ command).
228
+
229
+ - Angles are measured in degrees clockwise from the positive x axis.
230
+
231
+ All primitives in the shape definition use this same coordinate system.
232
+
233
+ The coordinate system used when _adding_ objects to the canvas or moving them is different, and the orientation and units depend on the <tt>--flip</tt> and <tt>--radians</tt> options.
234
+
235
+ === Colors
236
+
237
+ Color can be specified by name or by numeric value, using one of the notations
238
+
239
+ #RGB
240
+ #RRGGBB
241
+ #RRRGGGBBB
242
+
243
+ where each R or G or B is replaced by a hexidecimal digit. Alternately, a decimal integer can be used.
244
+
245
+ A list of color names is at http://www.tcl.tk/man/tcl8.4/TkCmd/colors.htm. Examples:
246
+
247
+ green
248
+ DarkOrchid2
249
+ #EECC66
250
+ #F0F
251
+
252
+ === Generic options
253
+
254
+ The following options apply to most primitives (each option has a shortcut, which is listed second).
255
+
256
+ ====<b><tt>fill:COLOR</tt></b>
257
+
258
+ ====<b><tt>fc:COLOR</tt></b>
259
+
260
+ Set the fill color of the primitive.
261
+
262
+ ====<b><tt>outline:COLOR</tt></b>
263
+
264
+ ====<b><tt>oc:COLOR</tt></b>
265
+
266
+ Set the outline color of the primitive.
267
+
268
+ ====<b><tt>width:WIDTH</tt></b>
269
+
270
+ ====<b><tt>wi:WIDTH</tt></b>
271
+
272
+ Set the line (or outline) width.
273
+
274
+ ====<b><tt>dash:DASH_TYPE</tt></b>
275
+
276
+ ====<b><tt>da:DASH_TYPE</tt></b>
277
+
278
+ Set the dash type for the line (or outline). The value can be an integer or a string. See http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M27. For example,
279
+
280
+ da:48
281
+
282
+ produces a nice dashed line to represent the lines between lanes in a roadway. The 4 means 4 pixels without color; the 8 means 8 pixels with the specified outline color. Tk accepts any sequence of digits, but not all platforms support all sequences.
283
+
284
+ ====<b><tt>stipple:STIPPLE_TYPE</tt></b>
285
+
286
+ ====<b><tt>st:STIPPLE_TYPE</tt></b>
287
+
288
+ Set the stipple type for the region. See http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M111. (This is not very useful.)
289
+
290
+ === Primitives
291
+
292
+ The primitives are the basic shapes from which user-defined shapes are built.
293
+
294
+ ==== arc
295
+
296
+ <b><tt>arcX,Y,W,H,key:val...</tt></b>
297
+
298
+ Draw an arc-based shape, which may be a pieslice, a chord region (between a chord and the arc), or a true arc (segment of a circle or oval).
299
+
300
+ The point X Y is the center, W is width, H is height.
301
+
302
+ <i>Note that this differs from Tk's arc command,</i> whose inputs are two points: "two diagonally opposite corners of a rectangular region enclosing the oval". It's generally easier to work with center and height/width. Rotation may look strange if width != height (this is because the rectangular region is still used internally, and Tk doesn't rotate rectangles).
303
+
304
+ Options (in addition to the generic options) are:
305
+
306
+ <tt>extent:angle</tt>:: angular span of the arc
307
+ <tt>start:angle</tt>:: angle of rotation of the arc, measured
308
+ _counterclockwise_ from the positive x-axis
309
+ <tt>style:sty</tt>:: +pieslice+, +chord+, or +arc+
310
+ <tt></tt>
311
+
312
+ See http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M119
313
+
314
+ ==== line
315
+
316
+ <b><tt>lineX1,Y1,X2,Y2...,key:val...</tt></b>
317
+
318
+ Draw a line or other one-dimensional curve.
319
+
320
+ The curve follows the sequence of points X1 Y1, X2 Y2, ....
321
+
322
+ Options (in addition to the generic options) are:
323
+
324
+ <tt>arrow:val</tt>:: +none+, +first+, +last+, or +both+
325
+ <tt>arrowshape:N+N+N</tt>:: three numbers separated by a \+ character(*)
326
+ <tt>capstyle:style</tt>:: +butt+, +projecting+, +round+
327
+ <tt>joinstyle:style</tt>:: +miter+, +bevel+, +round+
328
+ <tt>smooth:bool</tt>:: +true+ or +false+
329
+ <tt>splinesteps:number</tt>:: number of smoothing steps
330
+ <tt></tt>
331
+
332
+ (*) Paraphrasing the Tk documentation on arrowshape: The first number gives the distance along the line from the neck of the arrowhead to its tip. The second number gives the distance along the line from the trailing points of the arrowhead to the tip, and the third number gives the distance from the outside edge of the line to the trailing points.
333
+
334
+ See http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M139
335
+
336
+ ==== oval
337
+
338
+ <b><tt>ovalX1,Y1,X2,Y2,key:val...</tt></b>
339
+
340
+ Draws a circle or oval.
341
+
342
+ The points X1 Y1 and X2 Y2 define the diagonally opposite corners of the bounding box of the oval.
343
+
344
+ There are no options other than the generic options.
345
+
346
+ See http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M146
347
+
348
+ ==== rect
349
+
350
+ <b><tt>rectX1,Y1,X2,Y2,key:val...</tt></b>
351
+
352
+ Draws a rectangle.
353
+
354
+ The points X1 Y1 and X2 Y2 define the diagonally opposite corners.
355
+
356
+ <i>Note: A rect is not rotatable. Use a polygon instead.</i>
357
+
358
+ There are no options other than the generic options.
359
+
360
+ See http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M151
361
+
362
+ ==== poly
363
+
364
+ <b><tt>polyX1,Y1,X2,Y2,...key:val...</tt></b>
365
+
366
+ Draw a polygon or closed curve.
367
+
368
+ The edges or curve segments follow the sequence of points X1 Y1, X2 Y2, .... and the last point is connected to the first.
369
+
370
+ Options (in addition to the generic options) are:
371
+
372
+ <tt>joinstyle:val</tt>:: +miter+, +bevel+, or +round+
373
+ <tt>smooth:bool</tt>:: +true+ or +false+
374
+ <tt>splinesteps:number</tt>:: number of smoothing steps
375
+ <tt></tt>
376
+
377
+ See http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M147
378
+
379
+ ==== text
380
+
381
+ <b><tt>textX,Y,key:val...</tt></b>
382
+
383
+ Draws text string at the indicated location. (Text is not rotatable.)
384
+
385
+ Options (in addition to the generic options) are:
386
+
387
+ <tt>anchor:anchorPos</tt>:: +center+, +n+, +nw+, ...
388
+ <tt>font:fontName</tt>:: font name
389
+ <tt>justify:how</tt>:: +left+, +right+, or +center+
390
+ <tt>text:string</tt>:: string to display(**)
391
+ <tt>width:lineLength</tt>:: length at which line is wrapped
392
+ <tt></tt>
393
+
394
+ (**) text with embedded spaces can be specified only via a param command.
395
+
396
+ See http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M152
397
+
398
+ ==== image
399
+
400
+ <b><tt>imageX,Y,key:val...</tt></b>
401
+
402
+ Draws an image from a file at the indicated location. (An image is not rotatable.)
403
+
404
+ Tk supports only GIF, by default, though Tk can be extended to support other formats.
405
+
406
+ Options (in addition to the generic options) are:
407
+
408
+ <tt>anchor:anchorPos</tt>:: +center+, +n+, +nw+, ...
409
+ <tt>image:imageFileName</tt>:: file name of the gif file
410
+ <tt></tt>
411
+
412
+ Note that tkar is smart about caching image data. The file is read once, no matter how many times it is referenced in different shapes.
413
+
414
+ See http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M134
415
+
416
+ ==== polybox
417
+
418
+ <b><tt>polyboxDX,DY</tt></b>
419
+
420
+ Draws a rotatable rectangle extending DX units on each side of the Y axis, and extending DY units above and below the X axis.
421
+
422
+ Not a Tk primitive, but a simple poly-derived shape that can be used to draw a rectangle with rotation. This doesn't have an offset parameter. If the rectangle needs to be offset from the shape origin, use a polygon.
423
+
424
+ There are no options other than the generic options.
425
+
426
+
427
+ == Object manipulation
428
+
429
+ <b><tt>add SHAPE_NAME ID FLAGS LAYER X Y R [PARAM0 PARAM1 ...]</tt></b>
430
+
431
+ Add an object to the canvas. The shape of the object is determined by the SHAPE_NAME, which must have been defined using the <tt>shape</tt> command.
432
+
433
+ The ID must be a unique nonnegative integer in the range 0..2^32-1. If an object with that ID already exists (with any shape), the new object will replace the existing object.
434
+
435
+ FLAGS is a string which is currently unused but will be used to set various flags (such as clickable and draggable).
436
+
437
+ LAYER is a nonnegative integer in the range 0..2^32-1 which specifies the drawing order. Higher numbers cause objects to be drawn on top of objects with lower layer numbers.
438
+
439
+ The X Y and R parameters are floating point signed decimal numbers describing the global coordinates and rotation of the object. These numbers define the origin and rotation that are used to draw the primitives of SHAPE_NAME. See the <tt>moveto</tt> and <tt>rot</tt> commands.
440
+
441
+ The PARAM parameters are as described for the <tt>param</tt> command. A PARAM given in the add command cannot include spaces. However, a PARAM given with the param command _can_ include spaces.
442
+
443
+ Only the PARAM fields are optional--all others are required.
444
+
445
+ <b><tt>del ID</tt></b>
446
+
447
+ Deletes the object with the specified ID from the canvas.
448
+
449
+ <b><tt>delete_all</tt></b>
450
+
451
+ Deletes all objects. Does not delete shape definitions.
452
+
453
+ <b><tt>moveto ID X Y</tt></b>
454
+
455
+ Move the object with the specified ID to canvas coordinates X Y. (The coordinate system is left handed unless the --flip command line option is used.)
456
+
457
+ <b><tt>rot ID R</tt></b>
458
+
459
+ Rotate the object with the specified ID to R degrees (absolute, not relative to current rotation). (Uses radians if the --radians command line option is given.)
460
+
461
+ <b><tt>param ID N VALUE</tt></b>
462
+
463
+ Set the N-th parameter (index starting from 0) of object ID to VALUE. Params can be used to control many aspects of a shape, including colors, dimensions, offsets, line characteristics, boolean flags, text, etc.
464
+
465
+ It is not possible to modify the flags, layer, or shape--use an add command to do that (if you add an object with the same ID as before, the old object will be deleted).
466
+
467
+ <b><tt>scale_obj ID xf yf</tt></b>
468
+
469
+ Scales the object in the x dimension by a x factor of +xf+ and in the y dimension by a factor of +yf+. A factor of 1.0 means no scaling. A factor of 2.0 means double size, and so on.
470
+
471
+ == Abbreviations
472
+
473
+ Most commands have abbreviated or alternate versions. The following list shows all commands with alternates indicated by a | character and abbreviations indicated by a > character (for example, update can be abbreviated as "u" or "up").
474
+
475
+ a>dd
476
+ d>el>ete
477
+ m>ove>to
478
+ r>ot>ate
479
+ p>ar>am
480
+ s>h>ape
481
+ u>p>date
482
+ title
483
+ background|bg
484
+ height
485
+ width
486
+ zoom_to|zoom
487
+ view_at|view
488
+ view_id
489
+ wait
490
+ follow
491
+ done
492
+ bound>s
493
+ load
494
+ exit
495
+ delete_all
496
+ scale>_obj
497
+ echo
498
+ window_xy
499
+
500
+
501
+ == Tkar outputs
502
+
503
+ Tkar sends outputs back on the stream to the controlling process. Typically this stream is either the stdout of tkar or a socket. Tkar also writes output to stderr.
504
+
505
+ === User command messages
506
+
507
+ Tkar sends back outputs as the result of user interaction. These output commands can be used to update the controlling program's model of the objects, or to implement simple GUI widgets (buttons, sliders, control points, etc.).
508
+
509
+ <b><tt>drag DRAG_ID X Y</tt></b>
510
+
511
+ User has dragged the object with id DRAG_ID to X Y.
512
+
513
+ <b><tt>drop DRAG_ID [TARGET_ID]</tt></b>
514
+
515
+ User has dropped the object with id DRAG_ID. If TARGET_ID is given, the object was dropped on top of the object with id TARGET_ID.
516
+
517
+ <b><tt>click ID</tt></b>
518
+
519
+ User has clicked on object with id ID.
520
+
521
+ <b><tt></tt>doubleclick ID</b>
522
+
523
+ User has doubleclicked on object with id ID.
524
+
525
+ <b><tt>quit</tt></b>
526
+
527
+ User has pressed Ctrl-q
528
+
529
+ <b><tt>update</tt></b>
530
+
531
+ Update cycle has finished. This message is sent back out by tkar once for every update command that comes into tkar. This is useful to keep the two programs, tkar and the controlling program, in sync.
532
+
533
+ === Error messages
534
+
535
+ Error messages are also sent back to the controlling process on the stream.
536
+
537
+ === stderr messages
538
+
539
+ Tkar uses stderr as a second destination for outputs, separate from the stream used by the controlling process. This is useful for diagnostics and logging. If the -v (verbose) command-line option is given, the stderr output copies all input commands. This can be used to create a replayable record of the animation. The stderr stream also includes error messages.