// Copyright (C) 1999 Jean-Marc Valin #ifdef HAVE_CONFIG_H # include #endif #ifdef HAVE_LIBGTKEXTRA #include "GtkPlotProbe.h" #include "net_types.h" #include "Object.h" #include #include "misc.h" #include "Vector.h" #include "gtkextra/gtkextra.h" using namespace std; namespace FD { DECLARE_NODE(GtkPlotProbe) /*Node * * @name GtkPlotProbe * @category Probe * @description Plots a vector using GtkPlot * * @input_name INPUT * @input_type Vector * @input_description Input vector * * @output_name OUTPUT * @output_type Vector * @output_description Same as input * * @parameter_name BREAK_AT * @parameter_type int * @parameter_description If set, the probe runs until (count = BREAK_AT) * * @parameter_name SHOW * @parameter_type bool * @parameter_value true * @parameter_description Whether or not to show the the data by default * * @parameter_name SKIP * @parameter_type int * @parameter_description Count increment for each "Next" * * @parameter_name PROBE_NAME * @parameter_type string * @parameter_description Name (title) of the probe * END*/ static void print_click (GtkButton *button, GtkPlotProbe *pr) { pr->print(); } static double tick_size(double range) { const double alpha=.75; double orig = .2*range; double tick=1; while (orig>alpha*10) { tick*=10; orig*=.1; } if (orig>alpha*5) tick*=5; else if (orig>alpha*2) tick*=2; while (alpha*orig<.1) { tick*=.1; orig*=10; } if (alpha*orig<.2) tick*=.2; else if (alpha*orig<.5) tick*=.5; return tick; } GtkPlotProbe::GtkPlotProbe(string nodeName, ParameterSet params) : Probe(nodeName, params) , xmin(0.0) , xmax(530) , ymin(0.0) , ymax(330) /*Got the magic size!*/ { } GtkPlotProbe::~GtkPlotProbe() { } void GtkPlotProbe::initialize() { Probe::initialize(); gdk_threads_enter(); try { gtk_window_set_default_size(GTK_WINDOW(window1), int(xmax-xmin), int(ymax-ymin)); //gtk_window_set_default_size(GTK_WINDOW(window1), int(xmax-xmin+20), int(ymax-ymin+70)); canvas = gtk_plot_canvas_new(int(xmax), int(ymax), 1.); //canvas = gtk_plot_canvas_new(int(xmax+70), int(ymax+70), 1.); GTK_PLOT_CANVAS_SET_FLAGS(GTK_PLOT_CANVAS(canvas), GTK_PLOT_CANVAS_DND_FLAGS); //GTK_PLOT_CANVAS_SET_FLAGS(GTK_PLOT_CANVAS(canvas), 0); gtk_widget_ref (canvas); gtk_object_set_data_full (GTK_OBJECT (window1), "canvas", canvas, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (canvas); gtk_box_pack_start (GTK_BOX (vbox2), canvas, TRUE, TRUE, 0); active_plot = gtk_plot_new_with_size(NULL, .7, .8); gtk_widget_ref (active_plot); gtk_object_set_data_full (GTK_OBJECT (canvas), "active_plot", active_plot, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(active_plot); //activate_plot(active_plot,canvas); gtk_plot_set_range(GTK_PLOT(active_plot), 0., 1., 0., 1.); //gtk_plot_legends_move(GTK_PLOT(active_plot), .500, .05); //gtk_plot_set_legends_border(GTK_PLOT(active_plot), GTK_PLOT_BORDER_NONE, 0); gtk_plot_axis_hide_title(GTK_PLOT(active_plot), GTK_PLOT_AXIS_TOP); gtk_plot_axis_hide_title(GTK_PLOT(active_plot), GTK_PLOT_AXIS_BOTTOM); gtk_plot_axis_hide_title(GTK_PLOT(active_plot), GTK_PLOT_AXIS_RIGHT); gtk_plot_axis_hide_title(GTK_PLOT(active_plot), GTK_PLOT_AXIS_LEFT); gtk_plot_hide_legends(GTK_PLOT(active_plot)); gtk_plot_axis_show_ticks(GTK_PLOT(active_plot), GTK_PLOT_AXIS_BOTTOM, 15, 3); gtk_plot_axis_set_ticks(GTK_PLOT(active_plot), GTK_PLOT_AXIS_X, 1., 1); gtk_plot_axis_set_ticks(GTK_PLOT(active_plot), GTK_PLOT_AXIS_Y, 1., 1); gtk_plot_axis_set_visible(GTK_PLOT(active_plot), GTK_PLOT_AXIS_TOP, TRUE); gtk_plot_axis_set_visible(GTK_PLOT(active_plot), GTK_PLOT_AXIS_RIGHT, TRUE); //gtk_plot_x0_set_visible(GTK_PLOT(active_plot), TRUE); //gtk_plot_y0_set_visible(GTK_PLOT(active_plot), TRUE); gtk_plot_canvas_add_plot(GTK_PLOT_CANVAS(canvas), GTK_PLOT(active_plot), .15, .06); //gtk_plot_axis_set_labels_suffix(GTK_PLOT(active_plot), GTK_PLOT_AXIS_LEFT, "%"); //gtk_widget_show(active_plot); GdkColor color; gdk_color_parse("blue", &color); dataset = GTK_PLOT_DATA(gtk_plot_data_new()); gtk_object_ref (GTK_OBJECT(dataset)); gtk_object_set_data_full (GTK_OBJECT (active_plot), "dataset", dataset, (GtkDestroyNotify) gtk_widget_unref); gtk_plot_add_data(GTK_PLOT(active_plot), dataset); gtk_widget_show(GTK_WIDGET(dataset)); gtk_plot_data_set_points(dataset, &x[0], &y[0], &dx[0], &dy[0], 0); gtk_plot_data_set_line_attributes(dataset, GTK_PLOT_LINE_SOLID, 1, &color); /*Setup the print button*/ GtkWidget *tmp_toolbar_icon = gnome_stock_pixmap_widget (window1, GNOME_STOCK_PIXMAP_PRINT); GtkWidget *print_button = gtk_toolbar_insert_element (GTK_TOOLBAR (toolbar2), GTK_TOOLBAR_CHILD_BUTTON, NULL, _("Print"), NULL, NULL, tmp_toolbar_icon, NULL, NULL, 4); gtk_widget_ref (print_button); gtk_object_set_data_full (GTK_OBJECT (window1), "print_button", print_button, (GtkDestroyNotify) gtk_widget_unref); gtk_button_set_relief(GTK_BUTTON(print_button), GTK_RELIEF_NONE); gtk_widget_show (print_button); gtk_signal_connect (GTK_OBJECT (print_button), "clicked", GTK_SIGNAL_FUNC (print_click), this); } catch (BaseException *e) { gdk_threads_leave(); throw e->add(new NodeException(this, "Exception caught in Probe::specifigInitialize", __FILE__, __LINE__)); } gdk_threads_leave(); } void GtkPlotProbe::reset() { Probe::reset(); } void GtkPlotProbe::display() { GnomeCanvasPoints *points; Vector &data = object_cast > (inputValue); int inputLength = data.size(); if (inputLength>x.size()) { x.resize(inputLength); y.resize(inputLength); dx.resize(inputLength); dy.resize(inputLength); } gdouble dmin=data[0], dmax=data[0]; for (int i=0;i dmax) dmax = y[i]; if (y[i] < dmin) dmin=y[i]; dx[i]=1; dy[i]=1; } gdk_threads_enter(); //gtk_plot_axis_set_ticks(GTK_PLOT(active_plot), GTK_PLOT_AXIS_X, float(inputLength)/5.0, 1); //gtk_plot_axis_set_ticks(GTK_PLOT(active_plot), GTK_PLOT_AXIS_Y, (dmax-dmin)/5, 1); gtk_plot_axis_set_ticks(GTK_PLOT(active_plot), GTK_PLOT_AXIS_X, tick_size(inputLength), 0); gtk_plot_axis_set_ticks(GTK_PLOT(active_plot), GTK_PLOT_AXIS_Y, tick_size(dmax-dmin), 0); gtk_plot_set_range(GTK_PLOT(active_plot), 0, inputLength-1, dmin, dmax); gtk_plot_data_set_points(dataset, &x[0], &y[0], &dx[0], &dy[0], inputLength); gtk_widget_queue_draw (canvas); gdk_threads_leave(); } void GtkPlotProbe::show_hide() { Probe::show_hide(); if (!displayEnable) { gtk_plot_data_set_points(dataset, &x[0], &y[0], &dx[0], &dy[0], 0); gtk_widget_queue_draw (canvas); } } void GtkPlotProbe::print() { gtk_plot_canvas_export_ps_with_size(GTK_PLOT_CANVAS(canvas), "plot.eps", GTK_PLOT_PORTRAIT, 1, GTK_PLOT_MM, .4*xmax, .4*ymax); } }//namespace FD #endif