00001
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #if HAVE_CONFIG_H
00030 #include <config.h>
00031 #endif
00032 #include <tcl.h>
00033 #include <tk.h>
00034 #include <sadie.h>
00035 #include "tclsadie.h"
00036
00038 enum plot_pos
00039 {
00040 TOP_MARGIN = 15,
00041 RIGHT_MARGIN = 100,
00042 TOP_SPACING = 10,
00043 LEFT_SPACING = 61,
00044 Y_HEIGHT = 100,
00045 AXIS_DEPTH = 1,
00046 MINOR_DEPTH = 4,
00047 MAJOR_DEPTH = 6,
00048 CAPTION_DEPTH = 8,
00049 PLOT_HEIGHT = 140,
00050 TICK_SPACE = 16,
00051 MAJOR_SPACE = 2
00052 };
00053
00055 enum label_index
00056 {
00057 LBL_XMIN,
00058 LBL_XMAX,
00059 LBL_YMIN,
00060 LBL_YMAX,
00061 max_label_index
00062 };
00063
00065 enum plot_obj_index
00066 {
00067 ANCHOR, AXISWIDTH, BLACK, BLUE, CREATE, E, FILL, GREEN, LINE, N, RED,
00068 TEXT, TEXTOPT, WIDTH, max_obj_index
00069 };
00070
00072 enum axis_line_template_index
00073 {
00074 AXL_PATHNAME,
00075 AXL_CREATE,
00076 AXL_LINE,
00077 AXL_X1,
00078 AXL_Y1,
00079 AXL_X2,
00080 AXL_Y2,
00081 AXL_WIDTH,
00082 AXL_OUTLINEWIDTH,
00083 max_axl_index
00084 };
00085
00087 enum bar_template_index
00088 {
00089 BAR_PATHNAME,
00090 BAR_CREATE,
00091 BAR_LINE,
00092 BAR_X1,
00093 BAR_Y1,
00094 BAR_X2,
00095 BAR_Y2,
00096 BAR_FILL,
00097 BAR_COLOR,
00098 max_bar_index
00099 };
00100
00102 enum text_template_index
00103 {
00104 TXT_PATHNAME,
00105 TXT_CREATE,
00106 TXT_TEXT,
00107 TXT_X,
00108 TXT_Y,
00109 TXT_ANCHOR,
00110 TXT_ANCHORPOS,
00111 TXT_FILL,
00112 TXT_COLOR,
00113 TXT_TEXTOPT,
00114 TXT_STRING,
00115 max_text_index
00116 };
00117
00119 enum y_preset_index
00120 {
00121 Y_TOP,
00122 Y_BASE,
00123 Y_MINOR,
00124 Y_MAJOR,
00125 Y_CAPTION,
00126 max_y_preset_index
00127 };
00128
00130 enum x_preset_index
00131 {
00132 X_BASE,
00133 X_MAJOR,
00134 X_CAPTION,
00135 X_RIGHT,
00136 max_x_preset_index
00137 };
00138
00140 typedef const struct Line_value_range * line_value_rangep_t;
00141
00143 struct Line_value_range
00144 {
00145 double min;
00146 double max;
00147 };
00148
00150 typedef double (*bar_sizer_t) (double val, line_value_rangep_t range);
00151
00153 static const double magic_scale = 83.3;
00154
00162 static double
00163 unit_bar_size (double val, line_value_rangep_t range)
00164 {
00165 double size;
00166
00167 size = (magic_scale * (val - range->min)) / (range->max - range->min);
00168 if (size < 0)
00169 size = 0;
00170 return (size > Y_HEIGHT) ? Y_HEIGHT : size;
00171 }
00172
00180 static double
00181 norm_bar_size (double val, line_value_rangep_t range)
00182 {
00183 return Y_HEIGHT * (val - range->min) / (range->max - range->min);
00184 }
00185
00193 static double
00194 log_bar_size (double val, line_value_rangep_t range)
00195 {
00196 return Y_HEIGHT * ((log10 (val + 1) - range->min)
00197 / (range->max - range->min));
00198 }
00199
00207 static void
00208 dispose_objs (Tcl_Obj * obj[], int max_index)
00209 {
00210 int i;
00211
00212 for (i = 0; (i < max_index); i++)
00213 {
00214 if (obj[i])
00215 Tcl_DecrRefCount (obj[i]);
00216 }
00217 }
00218
00227 static int
00228 prepare_objs (Tcl_Obj * obj[], int max_index)
00229 {
00230 int i;
00231 int err = TCL_OK;
00232
00233 for (i = 0; ((err == TCL_OK) && (i < max_index)); i++)
00234 {
00235 if (obj[i] == NULL)
00236 err = TCL_ERROR;
00237 else
00238 Tcl_IncrRefCount (obj[i]);
00239 }
00240 if (err != TCL_OK)
00241 dispose_objs (obj, max_index);
00242 return err;
00243 }
00244
00254 static int
00255 initialize_label_objs (Tcl_Obj * lobj[],
00256 const char *minxlbl, const char *maxxlbl,
00257 line_value_rangep_t range)
00258 {
00259 int i;
00260 char range_mintext[SLEN];
00261 char range_maxtext[SLEN];
00262
00263 if ((!lobj) || (!minxlbl) || (!maxxlbl))
00264 return TCL_ERROR;
00265 for (i = 0; (i < max_label_index); i++)
00266 lobj[i] = NULL;
00267 snprintf (range_mintext, SLEN - 1, "%d", (int) range->min);
00268 snprintf (range_maxtext, SLEN - 1, "%d", (int) range->max);
00269 lobj[LBL_XMIN] = Tcl_NewStringObj (minxlbl, -1);
00270 lobj[LBL_XMAX] = Tcl_NewStringObj (maxxlbl, -1);
00271 lobj[LBL_YMIN] = Tcl_NewStringObj (range_mintext, -1);
00272 lobj[LBL_YMAX] = Tcl_NewStringObj (range_maxtext, -1);
00273 return prepare_objs (lobj, max_label_index);
00274 }
00275
00284 static int
00285 initialize_plot_objs (Tcl_Obj * pobj[])
00286 {
00287 int i;
00288
00289 if (pobj == NULL)
00290 return TCL_ERROR;
00291 for (i = 0; (i < max_obj_index); i++)
00292 pobj[i] = NULL;
00293 pobj[ANCHOR] = Tcl_NewStringObj ("-anchor", -1);
00294 pobj[AXISWIDTH] = Tcl_NewDoubleObj (1.5);
00295 pobj[BLACK] = Tcl_NewStringObj ("black", -1);
00296 pobj[BLUE] = Tcl_NewStringObj ("blue", -1);
00297 pobj[CREATE] = Tcl_NewStringObj ("create", -1);
00298 pobj[E] = Tcl_NewStringObj ("e", -1);
00299 pobj[FILL] = Tcl_NewStringObj ("-fill", -1);
00300 pobj[GREEN] = Tcl_NewStringObj ("green", -1);
00301 pobj[LINE] = Tcl_NewStringObj ("line", -1);
00302 pobj[N] = Tcl_NewStringObj ("n", -1);
00303 pobj[RED] = Tcl_NewStringObj ("red", -1);
00304 pobj[TEXT] = Tcl_NewStringObj ("text", -1);
00305 pobj[TEXTOPT] = Tcl_NewStringObj ("-text", -1);
00306 pobj[WIDTH] = Tcl_NewStringObj ("-width", -1);
00307 return prepare_objs (pobj, max_obj_index);
00308 }
00309
00318 static int
00319 initialize_y_presets (Tcl_Obj * pos[], uint32_t offset, uint32_t * y_origin)
00320 {
00321 int i;
00322
00323 if ((pos == NULL) || (y_origin == NULL))
00324 return TCL_ERROR;
00325 for (i = 0; (i < max_y_preset_index); i++)
00326 pos[i] = NULL;
00327 *y_origin = offset + TOP_SPACING + Y_HEIGHT;
00328 pos[Y_TOP] = Tcl_NewDoubleObj (offset + TOP_SPACING);
00329 pos[Y_BASE] = Tcl_NewDoubleObj (*y_origin + AXIS_DEPTH);
00330 pos[Y_MINOR] = Tcl_NewDoubleObj (*y_origin + MINOR_DEPTH);
00331 pos[Y_MAJOR] = Tcl_NewDoubleObj (*y_origin + MAJOR_DEPTH);
00332 pos[Y_CAPTION] = Tcl_NewDoubleObj (*y_origin + CAPTION_DEPTH);
00333 return prepare_objs (pos, max_y_preset_index);
00334 }
00335
00345 static int
00346 initialize_x_presets (Tcl_Obj * pos[], uint32_t offset, uint32_t xlen,
00347 uint32_t * x_origin)
00348 {
00349 int i;
00350
00351 if ((pos == NULL) || (x_origin == NULL))
00352 return TCL_ERROR;
00353 for (i = 0; (i < max_x_preset_index); i++)
00354 pos[i] = NULL;
00355 *x_origin = offset + LEFT_SPACING;
00356 pos[X_BASE] = Tcl_NewDoubleObj (*x_origin - AXIS_DEPTH);
00357 pos[X_MAJOR] = Tcl_NewDoubleObj (*x_origin - MAJOR_DEPTH);
00358 pos[X_CAPTION] = Tcl_NewDoubleObj (*x_origin - CAPTION_DEPTH);
00359 pos[X_RIGHT] = Tcl_NewDoubleObj (*x_origin + xlen);
00360 return prepare_objs (pos, max_x_preset_index);
00361 }
00362
00370 static void
00371 make_axis_line_template (Tcl_Obj * canvas, Tcl_Obj * cmd[], Tcl_Obj * pobj[])
00372 {
00373 cmd[AXL_PATHNAME] = canvas;
00374 cmd[AXL_CREATE] = pobj[CREATE];
00375 cmd[AXL_LINE] = pobj[LINE];
00376 cmd[AXL_X1] = NULL;
00377 cmd[AXL_Y1] = NULL;
00378 cmd[AXL_X2] = NULL;
00379 cmd[AXL_Y2] = NULL;
00380 cmd[AXL_WIDTH] = pobj[WIDTH];
00381 cmd[AXL_OUTLINEWIDTH] = pobj[AXISWIDTH];
00382 }
00383
00391 static void
00392 make_bar_template (Tcl_Obj * canvas, Tcl_Obj * cmd[], Tcl_Obj * pobj[])
00393 {
00394 cmd[BAR_PATHNAME] = canvas;
00395 cmd[BAR_CREATE] = pobj[CREATE];
00396 cmd[BAR_LINE] = pobj[LINE];
00397 cmd[BAR_X1] = NULL;
00398 cmd[BAR_Y1] = NULL;
00399 cmd[BAR_X2] = NULL;
00400 cmd[BAR_Y2] = NULL;
00401 cmd[BAR_FILL] = pobj[FILL];
00402 cmd[BAR_COLOR] = NULL;
00403 }
00404
00412 static void
00413 make_text_template (Tcl_Obj * canvas, Tcl_Obj * cmd[], Tcl_Obj * pobj[])
00414 {
00415 cmd[TXT_PATHNAME] = canvas;
00416 cmd[TXT_CREATE] = pobj[CREATE];
00417 cmd[TXT_TEXT] = pobj[TEXT];
00418 cmd[TXT_X] = NULL;
00419 cmd[TXT_Y] = NULL;
00420 cmd[TXT_ANCHOR] = pobj[ANCHOR];
00421 cmd[TXT_ANCHORPOS] = NULL;
00422 cmd[TXT_FILL] = pobj[FILL];
00423 cmd[TXT_COLOR] = pobj[BLACK];
00424 cmd[TXT_TEXTOPT] = pobj[TEXTOPT];
00425 cmd[TXT_STRING] = NULL;
00426 }
00427
00437 static int
00438 draw_y_axis (Tcl_Interp * interp,
00439 Tcl_Obj * cmd[], Tcl_Obj * x_pos[], Tcl_Obj * y_pos[])
00440 {
00441 int err = TCL_OK;
00442
00443 if ((!interp) || (!cmd) || (!x_pos) || (!y_pos))
00444 return TCL_ERROR;
00445 cmd[AXL_X1] = x_pos[X_MAJOR];
00446 cmd[AXL_Y2] = cmd[AXL_Y1] = y_pos[Y_TOP];
00447 cmd[AXL_X2] = x_pos[X_BASE];
00448 err = Tcl_EvalObjv (interp, max_axl_index, cmd, TCL_EVAL_GLOBAL);
00449 if (err != TCL_OK)
00450 return err;
00451 cmd[AXL_X1] = cmd[AXL_X2];
00452 cmd[AXL_Y1] = cmd[AXL_Y2];
00453 cmd[AXL_Y2] = y_pos[Y_MAJOR];
00454 return Tcl_EvalObjv (interp, max_axl_index, cmd, TCL_EVAL_GLOBAL);
00455 }
00456
00469 static int
00470 draw_x_axis (Tcl_Interp * interp, Tcl_Obj * cmd[], Tcl_Obj * x_pos[],
00471 Tcl_Obj * y_pos[], uint32_t x_origin, uint32_t axlen)
00472 {
00473 uint32_t tick;
00474 int err = TCL_OK;
00475 Tcl_Obj *x_tick = NULL;
00476
00477 if ((!interp) || (!cmd) || (!x_pos) || (!y_pos))
00478 return TCL_ERROR;
00479 cmd[AXL_X1] = x_pos[X_MAJOR];
00480 cmd[AXL_Y2] = cmd[AXL_Y1] = y_pos[Y_BASE];
00481 cmd[AXL_X2] = x_pos[X_RIGHT];
00482 err = Tcl_EvalObjv (interp, max_axl_index, cmd, TCL_EVAL_GLOBAL);
00483 for (tick = TICK_SPACE;
00484 (err == TCL_OK) && (tick < axlen); tick += TICK_SPACE)
00485 {
00486 x_tick = Tcl_NewDoubleObj (x_origin + tick);
00487 if (x_tick == NULL)
00488 return TCL_ERROR;
00489 else
00490 Tcl_IncrRefCount (x_tick);
00491 cmd[AXL_X1] = cmd[AXL_X2] = x_tick;
00492 cmd[AXL_Y2] = (tick % (TICK_SPACE * MAJOR_SPACE))
00493 ? y_pos[Y_MINOR] : y_pos[Y_MAJOR];
00494 err = Tcl_EvalObjv (interp, max_axl_index, cmd, TCL_EVAL_GLOBAL);
00495 Tcl_DecrRefCount (x_tick);
00496 }
00497 return err;
00498 }
00499
00511 static int
00512 label_y_axis (Tcl_Interp * interp, Tcl_Obj * cmd[], Tcl_Obj * pobj[],
00513 Tcl_Obj * x_pos[], Tcl_Obj * y_pos[], Tcl_Obj * axlabel[])
00514 {
00515 int err = TCL_OK;
00516
00517 if ((!interp) || (!cmd) || (!pobj) || (!x_pos) || (!y_pos) || (!axlabel))
00518 return TCL_ERROR;
00519 cmd[TXT_X] = x_pos[X_CAPTION];
00520 cmd[TXT_Y] = y_pos[Y_TOP];
00521 cmd[TXT_ANCHORPOS] = pobj[E];
00522 cmd[TXT_STRING] = axlabel[LBL_YMAX];
00523 err = Tcl_EvalObjv (interp, max_text_index, cmd, TCL_EVAL_GLOBAL);
00524 if (err != TCL_OK)
00525 return err;
00526 cmd[TXT_Y] = y_pos[Y_BASE];
00527 cmd[TXT_STRING] = axlabel[LBL_YMIN];
00528 return Tcl_EvalObjv (interp, max_text_index, cmd, TCL_EVAL_GLOBAL);
00529 }
00530
00542 static int
00543 label_x_axis (Tcl_Interp * interp, Tcl_Obj * cmd[], Tcl_Obj * pobj[],
00544 Tcl_Obj * x_pos[], Tcl_Obj * y_pos[], Tcl_Obj * axlabel[])
00545 {
00546 int err = TCL_OK;
00547
00548 if ((!interp) || (!cmd) || (!pobj) || (!x_pos) || (!y_pos) || (!axlabel))
00549 return TCL_ERROR;
00550 cmd[TXT_X] = x_pos[X_BASE];
00551 cmd[TXT_Y] = y_pos[Y_CAPTION];
00552 cmd[TXT_ANCHORPOS] = pobj[N];
00553 cmd[TXT_STRING] = axlabel[LBL_XMIN];
00554 err = Tcl_EvalObjv (interp, max_text_index, cmd, TCL_EVAL_GLOBAL);
00555 if (err != TCL_OK)
00556 return err;
00557 cmd[TXT_X] = x_pos[X_RIGHT];
00558 cmd[TXT_STRING] = axlabel[LBL_XMAX];
00559 return Tcl_EvalObjv (interp, max_text_index, cmd, TCL_EVAL_GLOBAL);
00560 }
00561
00578 static int
00579 draw_bars (Tcl_Interp * interp, Tcl_Obj * cmd[],
00580 Tcl_Obj * y_pos[], line_value_rangep_t range, double x_origin,
00581 double y_origin, uint32_t npix, PIXEL * bline,
00582 bar_sizer_t find_bar_size)
00583 {
00584 int err = TCL_OK;
00585 uint32_t x;
00586 Tcl_Obj *bar_x = NULL;
00587 Tcl_Obj *bar_len = NULL;
00588 PIXEL *val = NULL;
00589
00590 if ((!interp) || (!cmd) || (!y_pos) || (!range) || (!bline)
00591 || (!find_bar_size))
00592 return TCL_ERROR;
00593 for (x = 0, val = bline; ((err == TCL_OK) && (x < npix)); x++, val++)
00594 {
00595 bar_x = Tcl_NewDoubleObj (x_origin + x);
00596 if (bar_x != NULL)
00597 {
00598 Tcl_IncrRefCount (bar_x);
00599 bar_len = Tcl_NewDoubleObj (y_origin
00600 - (*find_bar_size) (*val, range));
00601 if (bar_len == NULL)
00602 {
00603 Tcl_DecrRefCount (bar_x);
00604 }
00605 else
00606 {
00607 Tcl_IncrRefCount (bar_len);
00608 }
00609 }
00610 if (bar_len == NULL)
00611 err = TCL_ERROR;
00612 else
00613 {
00614 cmd[BAR_X1] = cmd[BAR_X2] = bar_x;
00615 cmd[BAR_Y1] = y_pos[Y_BASE];
00616 cmd[BAR_Y2] = bar_len;
00617 err = Tcl_EvalObjv (interp, max_bar_index, cmd, TCL_EVAL_GLOBAL);
00618 Tcl_DecrRefCount (bar_len);
00619 Tcl_DecrRefCount (bar_x);
00620 }
00621 }
00622 return err;
00623 }
00624
00638 static int
00639 update_log_view (Tcl_Interp * interp, tclsadie_cmd_skelp_t refresh,
00640 Tcl_Obj * sadievar, uint32_t * y_offset)
00641 {
00642 Tcl_Obj *index = NULL;
00643 Tcl_Obj *offset = NULL;
00644 int err = TCL_OK;
00645
00646 if ((!interp) || (!refresh) || (!refresh->cmd) || (!sadievar))
00647 return TCL_ERROR;
00648 err = Tcl_EvalObjv (interp, refresh->len, refresh->cmd, TCL_EVAL_GLOBAL);
00649 if (err != TCL_OK)
00650 return err;
00651 (*y_offset) += PLOT_HEIGHT;
00652 offset = Tcl_NewLongObj ((long) *y_offset);
00653 if (offset == NULL)
00654 err = TCL_ERROR;
00655 else
00656 {
00657 Tcl_IncrRefCount (offset);
00658 index = Tcl_NewStringObj (DEFAULT_SESSION_LOG_POS_INDEX, -1);
00659 if (index == NULL)
00660 err = TCL_ERROR;
00661 else
00662 {
00663 Tcl_IncrRefCount (index);
00664 if (Tcl_ObjSetVar2
00665 (interp, sadievar, index, offset, TCL_GLOBAL_ONLY) == NULL)
00666 err = TCL_ERROR;
00667 Tcl_DecrRefCount (index);
00668 }
00669 Tcl_DecrRefCount (offset);
00670 }
00671 return err;
00672 }
00673
00701 int
00702 tclsadie_plotter (PIXEL * line, uint32_t nbnd, uint32_t npix,
00703 const char *minxlbl, const char *maxxlbl,
00704 int option, PIXEL gmin, PIXEL gmax, void *data)
00705 {
00706 tclsadie_app_datap_t tclsadie_private = NULL;
00707 Tcl_Interp *interp = NULL;
00708 Tcl_Obj *canvas = NULL;
00709 Tcl_Obj *sadievar = NULL;
00710 Tcl_Obj *y_pos[max_y_preset_index];
00711 Tcl_Obj *x_pos[max_x_preset_index];
00712 Tcl_Obj *axlabel[max_label_index];
00713 Tcl_Obj *labelcmd[max_text_index];
00714 Tcl_Obj *pobj[max_obj_index];
00715 Tcl_Obj *axlcmd[max_axl_index];
00716 Tcl_Obj *barcmd[max_bar_index];
00717 tclsadie_cmd_skelp_t refresh;
00718 uint32_t x_offset, y_offset, x_origin, y_origin, band;
00719 struct Line_value_range full_range;
00720 bar_sizer_t find_bar_size;
00721 int err = TCL_OK;
00722
00723 if ((!line) || (!minxlbl) || (!maxxlbl) || (!data))
00724 return TCL_ERROR;
00725 tclsadie_private = data;
00726 interp = tclsadie_private->main_interp;
00727 canvas = tclsadie_private->sessionlog_canvas;
00728 sadievar = tclsadie_private->sadievar;
00729 refresh = tclsadie_private->log_refresh;
00730 if ((!interp) || (!canvas) || (!sadievar) || (!refresh))
00731 return TCL_ERROR;
00732 switch (option)
00733 {
00734 case UNIT:
00735 find_bar_size = unit_bar_size;
00736 break;
00737 case NORM:
00738 find_bar_size = norm_bar_size;
00739 break;
00740 case LOG:
00741 find_bar_size = log_bar_size;
00742 break;
00743 default:
00744 return TCL_ERROR;
00745 }
00746 err = GetSadieUintFromObj2 (interp, sadievar, DEFAULT_SESSION_LOG_POS_INDEX,
00747 &y_offset);
00748 if (err != TCL_OK)
00749 {
00750 Tcl_BackgroundError (interp);
00751 return err;
00752 }
00753 full_range.min = gmin;
00754 full_range.max = gmax;
00755 y_offset += TOP_MARGIN;
00756 err = initialize_plot_objs (pobj);
00757 if (err == TCL_OK)
00758 {
00759 err = initialize_label_objs (axlabel, minxlbl, maxxlbl, &full_range);
00760 if (err == TCL_OK)
00761 {
00762 err = initialize_y_presets (y_pos, y_offset, &y_origin);
00763 if (err != TCL_OK)
00764 dispose_objs (axlabel, max_label_index);
00765 }
00766 if (err != TCL_OK)
00767 dispose_objs (pobj, max_obj_index);
00768 }
00769 if (err != TCL_OK)
00770 {
00771 Tcl_BackgroundError (interp);
00772 return err;
00773 }
00774 make_axis_line_template (canvas, axlcmd, pobj);
00775 make_text_template (canvas, labelcmd, pobj);
00776 make_bar_template (canvas, barcmd, pobj);
00777 for (band = 0; ((err == TCL_OK) && (band < nbnd)); band++)
00778 {
00779 x_offset = (band * (npix + RIGHT_MARGIN));
00780 if ((nbnd == 1) || (band > 2))
00781 barcmd[BAR_COLOR] = pobj[BLACK];
00782 else if (band == 0)
00783 barcmd[BAR_COLOR] = pobj[RED];
00784 else if (band == 1)
00785 barcmd[BAR_COLOR] = pobj[GREEN];
00786 else
00787 barcmd[BAR_COLOR] = pobj[BLUE];
00788 if ((initialize_x_presets (x_pos, x_offset, npix, &x_origin) != TCL_OK)
00789 || (draw_y_axis (interp, axlcmd, x_pos, y_pos) != TCL_OK)
00790 || (draw_x_axis (interp, axlcmd, x_pos, y_pos, x_origin, npix)
00791 != TCL_OK)
00792 || (label_y_axis (interp, labelcmd, pobj, x_pos, y_pos, axlabel)
00793 != TCL_OK)
00794 || (label_x_axis (interp, labelcmd, pobj, x_pos, y_pos, axlabel)
00795 != TCL_OK)
00796 || (draw_bars (interp, barcmd, y_pos, &full_range, x_origin,
00797 y_origin, npix, (line + (band * npix)),
00798 find_bar_size) != TCL_OK))
00799 {
00800 err = TCL_ERROR;
00801 Tcl_BackgroundError (interp);
00802 }
00803 dispose_objs (x_pos, max_x_preset_index);
00804 }
00805 dispose_objs (y_pos, max_y_preset_index);
00806 dispose_objs (axlabel, max_label_index);
00807 dispose_objs (pobj, max_obj_index);
00808 if (err == TCL_OK)
00809 {
00810 err = update_log_view (interp, refresh, sadievar, &y_offset);
00811 if (err != TCL_OK)
00812 Tcl_BackgroundError (interp);
00813 }
00814 return err;
00815 }