USER_OBJECT_ RS_GGOBI(getTourProjection)(USER_OBJECT_ s_display, USER_OBJECT_ s_mode_name) { displayd *display = toDisplay(s_display); ProjectionMode mode = GGOBI(getPModeId)(asCString(s_mode_name)); gint k, n; USER_OBJECT_ matrix; gdouble *x = NULL, *y = NULL; g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); RS_INTERNAL_GGOBI(getTourVectorsFromMode)(display, mode, &x, &y); g_return_val_if_fail(x != NULL, NULL_USER_OBJECT); n = display->d->ncols; PROTECT(matrix = allocMatrix(REALSXP, n, 3)); for (k = 0; k < n; k++) { vartabled *vt = vartable_element_get (k, display->d); REAL(matrix)[k] = x[k]; /* x coeff */ if (y) REAL(matrix)[k+n] = y[k]; /* y coeff */ else REAL(matrix)[k+n] = 0; REAL(matrix)[k+2*n] = vt->lim.max - vt->lim.min; /* range */ } UNPROTECT(1); return matrix; }
void RS_INTERNAL_GGOBI(getTourVectorsFromMode)(displayd *display, ProjectionMode mode, gdouble **x, gdouble **y) { tour *t; switch(mode) { case TOUR1D: t = &display->t1d; break; case TOUR2D: t = &display->t2d; break; case TOUR2D3: t = &display->t2d3; break; case COTOUR: t = &display->tcorr1; break; default: g_critical("Specified mode '%s' is not a tour", GGOBI(getPModeName)(mode)); return; } *x = t->F.vals[0]; *y = NULL; if (mode == COTOUR) *y = display->tcorr2.F.vals[0]; else if (mode != TOUR1D) *y = t->F.vals[1]; }
/* Expects a 2 column matrix with the X and Y coefficients for each var */ USER_OBJECT_ RS_GGOBI(setTourProjection)(USER_OBJECT_ s_display, USER_OBJECT_ s_mode_name, USER_OBJECT_ matrix) { displayd *display = toDisplay(s_display); ProjectionMode mode = GGOBI(getPModeId)(asCString(s_mode_name)); gint k, n; gdouble *x = NULL, *y = NULL; g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); RS_INTERNAL_GGOBI(getTourVectorsFromMode)(display, mode, &x, &y); g_return_val_if_fail(x != NULL, NULL_USER_OBJECT); n = display->d->ncols; for (k = 0; k < n; k++) { x[k] = REAL(matrix)[k]; if (y) y[k] = REAL(matrix)[k+n]; } display_tailpipe (display, FULL, display->ggobi); varcircles_refresh (display->d, display->ggobi); return NULL_USER_OBJECT; }
USER_OBJECT_ RS_GGOBI(getDisplayOptions)(USER_OBJECT_ which) { USER_OBJECT_ ans, names; gint NumOptions = 8; DisplayOptions *options; if (GET_LENGTH(which) == 0) options = GGOBI(getDefaultDisplayOptions)(); else { displayd *display = toDisplay(which); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); options = &(display->options); } g_return_val_if_fail(options != NULL, NULL_USER_OBJECT); PROTECT(ans = NEW_LOGICAL(NumOptions)); PROTECT(names = NEW_CHARACTER(NumOptions)); LOGICAL_DATA(ans)[DOPT_POINTS] = options->points_show_p; SET_STRING_ELT(names, DOPT_POINTS, COPY_TO_USER_STRING("Show points")); LOGICAL_DATA(ans)[DOPT_AXES] = options->axes_show_p; SET_STRING_ELT(names, DOPT_AXES, COPY_TO_USER_STRING("Show axes")); LOGICAL_DATA(ans)[DOPT_AXESLAB] = options->axes_label_p; SET_STRING_ELT(names, DOPT_AXESLAB, COPY_TO_USER_STRING("Show tour axes")); LOGICAL_DATA(ans)[DOPT_AXESVALS] = options->axes_values_p; SET_STRING_ELT(names, DOPT_AXESVALS, COPY_TO_USER_STRING("Show axes labels")); LOGICAL_DATA(ans)[DOPT_EDGES_U] = options->edges_undirected_show_p; SET_STRING_ELT(names, DOPT_EDGES_U, COPY_TO_USER_STRING("Undirected edges")); LOGICAL_DATA(ans)[DOPT_EDGES_A] = options->edges_arrowheads_show_p; SET_STRING_ELT(names, DOPT_EDGES_A, COPY_TO_USER_STRING("Arrowheads")); LOGICAL_DATA(ans)[DOPT_EDGES_D] = options->edges_directed_show_p; SET_STRING_ELT(names, DOPT_EDGES_D, COPY_TO_USER_STRING("Directed edges")); LOGICAL_DATA(ans)[DOPT_WHISKERS] = options->whiskers_show_p; SET_STRING_ELT(names, DOPT_WHISKERS, COPY_TO_USER_STRING("Show whiskers")); /* unused LOGICAL_DATA(ans)[5] = options->missings_show_p; SET_STRING_ELT(names, 5, COPY_TO_USER_STRING("Missing Values")); LOGICAL_DATA(ans)[8] = options->axes_center_p; SET_STRING_ELT(names, 8, COPY_TO_USER_STRING("Center axes")); LOGICAL_DATA(ans)[9] = options->double_buffer_p; SET_STRING_ELT(names, 9, COPY_TO_USER_STRING("Double buffer")); LOGICAL_DATA(ans)[10] = options->link_p; SET_STRING_ELT(names, 10, COPY_TO_USER_STRING("Link")); */ SET_NAMES(ans, names); UNPROTECT(2); return(ans); }
/* Sets a plot as the active plot given a display and a plot index */ USER_OBJECT_ RS_GGOBI(setActivePlot)(USER_OBJECT_ s_display, USER_OBJECT_ s_plot) { USER_OBJECT_ ans = NEW_LOGICAL(1); displayd *display; splotd *sp; display = toDisplay(s_display); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); display_set_current(display, display->ggobi); sp = GGOBI(getPlot)(display, INTEGER_DATA(s_plot)[0]); g_return_val_if_fail(sp != NULL, NULL_USER_OBJECT); GGOBI(splot_set_current_full)(display, sp, display->ggobi); LOGICAL_DATA(ans)[0] = 1; gdk_flush(); return (ans); }
/* Returns a list containing the display reference and the plot index */ USER_OBJECT_ RS_GGOBI(getActivePlot)(USER_OBJECT_ ggobiId) { USER_OBJECT_ ans; ggobid *gg = toGGobi(ggobiId); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); PROTECT(ans = NEW_LIST(2)); SET_VECTOR_ELT(ans, 0, RS_displayInstance(gg->current_display)); SET_VECTOR_ELT(ans, 1, asRInteger(GGOBI(getCurrentPlotIndex)(gg))); UNPROTECT(1); return(ans); }
/* Should it not (also?) go on the display's File menu? The action is for the display. */ gboolean addToToolsMenu(ggobid *gg, GGobiPluginInfo *plugin, PluginInstance *inst) { static GtkActionEntry entry = { "DescribeDisplay", NULL, "Save Display Description", NULL, "Save an S-language description of this display", G_CALLBACK (show_dspdesc_window) }; inst->data = NULL; inst->info = plugin; inst->gg = gg; GGOBI(addToolAction)(&entry, (gpointer)inst, gg); return(true); }
USER_OBJECT_ RS_GGOBI(setDisplayOptions)(USER_OBJECT_ which, USER_OBJECT_ values) { gint i; DisplayOptions *options; displayd *display = NULL; int apply = 0; g_return_val_if_fail(GET_LENGTH(values) == 8, NULL_USER_OBJECT); if(GET_LENGTH(which) == 0) { options = GGOBI(getDefaultDisplayOptions)(); } else { display = toDisplay(which); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); options = &(display->options); g_return_val_if_fail(options != NULL, NULL_USER_OBJECT); apply = 1; } i = 0; options->points_show_p = LOGICAL_DATA(values)[i++]; options->axes_show_p = LOGICAL_DATA(values)[i++]; options->axes_label_p = LOGICAL_DATA(values)[i++]; options->axes_values_p = LOGICAL_DATA(values)[i++]; options->edges_undirected_show_p = LOGICAL_DATA(values)[i++]; options->edges_arrowheads_show_p = LOGICAL_DATA(values)[i++]; options->edges_directed_show_p = LOGICAL_DATA(values)[i++]; options->whiskers_show_p = LOGICAL_DATA(values)[i++]; /* unused options->missings_show_p = LOGICAL_DATA(values)[i++]; options->axes_center_p = LOGICAL_DATA(values)[i++]; options->double_buffer_p = LOGICAL_DATA(values)[i++]; options->link_p = LOGICAL_DATA(values)[i++]; */ if(apply) { set_display_options(display, display->ggobi); } return (NULL_USER_OBJECT); }