/*ScianVisWindows.c Visualization window stuff Eric Pepke April 6, 1990 */ #include "Scian.h" #include "ScianTypes.h" #include "ScianArrays.h" #include "ScianLists.h" #include "ScianWindows.h" #include "ScianTextBoxes.h" #include "ScianTitleBoxes.h" #include "ScianObjWindows.h" #include "ScianIcons.h" #include "ScianColors.h" #include "ScianControls.h" #include "ScianButtons.h" #include "ScianSpaces.h" #include "ScianLights.h" #include "ScianSliders.h" #include "ScianIDs.h" #include "ScianVisWindows.h" #include "ScianDatasets.h" #include "ScianPictures.h" #include "ScianDialogs.h" #include "ScianEvents.h" #include "ScianScripts.h" #include "ScianErrors.h" #include "ScianMethods.h" #include "ScianStyle.h" #include "ScianVisObjects.h" #include "ScianDraw.h" #include "ScianDrawings.h" #include "ScianObjFunctions.h" #include "ScianFilters.h" #include "ScianPick.h" #include "ScianSymbols.h" #include "ScianTemplates.h" #include "ScianTemplateHelper.h" ObjPtr visWindowClass; /*Class for vis windows*/ ObjPtr spaceWindowClass; /*Class for space subwindows*/ ObjPtr visCorralClass; /*Class for corral of a vis window*/ Bool showControlPanels = true; /*True iff show control panels by default*/ ObjPtr visualizeAsList; /*List for Visualize As*/ static ObjPtr HideVisWindowPanel(window) WinInfoPtr window; /*Hides the panel of the controls on the vis window. Returns true iff it did*/ { if (window) { ObjPtr panel, space, assocPanel; WinInfoPtr subWindow; int panelWidth; int left, right, bottom, top; int nl, nr, nb, nt; SelWindow(window); GetWindowBounds(&left, &right, &bottom, &top); space = FindSpace(window); if (!space) { return false; } panel = GetVar(space, OBJPANEL); if (panel) { /*Get the panel's bounds*/ Get2DIntBounds(panel, &nl, &nr, &nb, &nt); panelWidth = nr - nl; /*Change panel to be off the screen*/ nl = right + 1; nr = nl + panelWidth; Set2DIntBounds(panel, nl, nr, nb, nt); ImInvalid(panel); } panel = GetVar(space, TOOLPANEL); if (panel) { /*Get the panel's bounds*/ Get2DIntBounds(panel, &nl, &nr, &nb, &nt); panelWidth = nr - nl; /*Change panel to be off the screen*/ nr = left - 1; nl = nr - panelWidth; Set2DIntBounds(panel, nl, nr, nb, nt); ImInvalid(panel); } /*Change the window or space*/ Get2DIntBounds(space, &nl, &nr, &nb, &nt); nr = right; nl = left; if ((subWindow = (WinInfoPtr) GetVar((ObjPtr) window, SPACEWINDOW)) && subWindow != window) { /*Change the window*/ int ox, oy; SelWindow(window); GetWindowOrigin(&ox, &oy); SelWindow(subWindow); SetWindowPosition(ox, ox + nr - nl, oy, oy + nt - nb); } else { /*Change the space*/ Set2DIntBounds(space, nl, nr, nb, nt); ImInvalid(space); /*And its panels*/ assocPanel = GetVar(space, FRONTPANEL); if (assocPanel) { int ol, or, ob, ot; Get2DIntBounds(assocPanel, &ol, &or, &ob, &ot); ReshapeObject(assocPanel, ol, or, ob, ot, nl, nr, nb, nt); ImInvalid(assocPanel); } assocPanel = GetVar(space, BACKPANEL); if (assocPanel) { int ol, or, ob, ot; Get2DIntBounds(assocPanel, &ol, &or, &ob, &ot); ReshapeObject(assocPanel, ol, or, ob, ot, nl, nr, nb, nt); ImInvalid(assocPanel); } } SetVar((ObjPtr) window, PANELHIDDEN, ObjTrue); DeleteMenus(window); return ObjTrue; } else { return ObjFalse; } } void DoHidePanel() { if (selWinInfo) { if (logging) { Log("hide panel\n"); } DeferMessage((ObjPtr) selWinInfo, HIDEPANEL); } } static ObjPtr ShowVisWindowPanel(window) WinInfoPtr window; /*Shows the panel of the controls on the vis window. Returns true iff it did*/ { if (window) { ObjPtr panel, space, assocPanel; WinInfoPtr subWindow; int lPanelWidth, rPanelWidth; int left, right, bottom, top; int nl, nr, nb, nt; SelWindow(window); GetWindowBounds(&left, &right, &bottom, &top); space = FindSpace(window); if (!space) { return false; } panel = GetVar(space, OBJPANEL); if (panel) { /*Get the panel's bounds*/ Get2DIntBounds(panel, &nl, &nr, &nb, &nt); rPanelWidth = nr - nl; /*Change panel to be on the screen*/ nr = right; nl = right - rPanelWidth; Set2DIntBounds(panel, nl, nr, nb, nt); ImInvalid(panel); } panel = GetVar(space, TOOLPANEL); if (panel) { /*Get the panel's bounds*/ Get2DIntBounds(panel, &nl, &nr, &nb, &nt); lPanelWidth = nr - nl; /*Change panel to be on the screen*/ nl = left; nr = left + lPanelWidth; Set2DIntBounds(panel, nl, nr, nb, nt); ImInvalid(panel); } /*Change the window or space*/ Get2DIntBounds(space, &nl, &nr, &nb, &nt); nr = right - rPanelWidth; nl = left + lPanelWidth; if ((subWindow = (WinInfoPtr) GetVar((ObjPtr) window, SPACEWINDOW)) && subWindow != window) { /*Change the window*/ int ox, oy; SelWindow(window); GetWindowOrigin(&ox, &oy); SelWindow(subWindow); SetWindowPosition(ox, ox + nr - nl, oy, oy + nt - nb); } else { /*Change the space*/ Set2DIntBounds(space, nl, nr, nb, nt); ImInvalid(space); /*And its panels*/ assocPanel = GetVar(space, FRONTPANEL); if (assocPanel) { int ol, or, ob, ot; Get2DIntBounds(assocPanel, &ol, &or, &ob, &ot); ReshapeObject(assocPanel, ol, or, ob, ot, nl, nr, nb, nt); ImInvalid(assocPanel); } assocPanel = GetVar(space, BACKPANEL); if (assocPanel) { int ol, or, ob, ot; Get2DIntBounds(assocPanel, &ol, &or, &ob, &ot); ReshapeObject(assocPanel, ol, or, ob, ot, nl, nr, nb, nt); ImInvalid(assocPanel); } } SetVar((ObjPtr) window, PANELHIDDEN, ObjFalse); DeleteMenus(window); return ObjTrue; } else { return ObjFalse; } } void DoShowPanel() { if (selWinInfo) { if (logging) { Log("show panel\n"); } DeferMessage((ObjPtr) selWinInfo, SHOWPANEL); } } int annotStagger = 0; ObjPtr DeleteSpacePanelText(text) ObjPtr text; /*Delete text from a space panel*/ { return ObjTrue; } void AddAnnotation(name, bounds) char *name; real bounds[4]; /*Adds annotation with name and bounds to current window*/ { if (selWinInfo) { /*Search for a space*/ ObjPtr space, frontPanel; space = FindSpace(selWinInfo); if (space) { frontPanel = GetObjectVar("AddAnnotation", space, FRONTPANEL); if (frontPanel) { /*There's a front panel. Stick an annotation there*/ ObjPtr annotation; ++nAnnot; annotation = NewTextBox((int) bounds[0], (int) bounds[1], (int) bounds[2], (int) bounds[3], /*WITH_BG + */EDITABLE + ADJUSTABLE, name, ""); SetMethod(annotation, CLONE, CloneAnnotation); SetMethod(annotation, DUPLICATE, DuplicateDrawing); PrefixList(GetVar(frontPanel, CONTENTS), annotation); SetVar(annotation, PARENT, frontPanel); SetTextColor(annotation, NewInt(UIWHITE)); ImInvalid(annotation); SetTextFont(annotation, ANNOTFONT); SetTextSize(annotation, ANNOTFONTSIZE); SetVar(annotation, STICKINESS, NewInt(FLOATINGLEFT + FLOATINGRIGHT + FLOATINGTOP + FLOATINGBOTTOM)); SetMethod(annotation, DELETEICON, DeleteSpacePanelText); SetMethod(annotation, DELETE, DeleteObject); SetMethod(annotation, PUSHTOBOTTOM, PushDrawingToBottom); SetMethod(annotation, BRINGTOTOP, BringDrawingToTop); SetMethod(annotation, MOVETOBACKPANEL, MoveDrawingToBackPanel); SetMethod(annotation, MOVETOFRONTPANEL, MoveDrawingToFrontPanel); DeselectAll(); Select(annotation, true); MakeMeCurrent(annotation); if (logging) { /*Log the action.*/ char cmd[256]; char *d; d = &(cmd[0]); sprintf(cmd, "annotation "); while (*d) ++d; MakeObjectName(d, annotation); while (*d) ++d; sprintf(d, " [%g %g %g %g]\n", bounds[0], bounds[1], bounds[2], bounds[3]); Log(cmd); } } } } } void AddTimeReadout(name, bounds) char *name; real bounds[4]; /*Adds annotation with name and bounds to current window*/ { if (selWinInfo) { /*Search for a space*/ ObjPtr space, frontPanel, list; space = FindSpace(selWinInfo); if (space) { frontPanel = GetObjectVar("AddTimeReadout", space, FRONTPANEL); if (frontPanel) { /*There's a front panel. Stick a time readout there*/ ObjPtr timeReadout; ++nTimeReadout; timeReadout = NewTimeReadout((int) bounds[0], (int) bounds[1], (int) bounds[2], (int) bounds[3], name, space); SetMethod(timeReadout, CLONE, CloneTimeReadout); SetMethod(timeReadout, DUPLICATE, DuplicateDrawing); PrefixList(GetVar(frontPanel, CONTENTS), timeReadout); SetVar(timeReadout, PARENT, frontPanel); SetTextColor(timeReadout, NewInt(UIWHITE)); ImInvalid(timeReadout); SetTextFont(timeReadout, ANNOTFONT); SetTextSize(timeReadout, ANNOTFONTSIZE); SetVar(timeReadout, STICKINESS, NewInt(FLOATINGLEFT + FLOATINGRIGHT + FLOATINGTOP + FLOATINGBOTTOM)); SetMethod(timeReadout, DELETEICON, DeleteSpacePanelText); SetMethod(timeReadout, DELETE, DeleteObject); SetMethod(timeReadout, PUSHTOBOTTOM, PushDrawingToBottom); SetMethod(timeReadout, BRINGTOTOP, BringDrawingToTop); SetMethod(timeReadout, MOVETOBACKPANEL, MoveDrawingToBackPanel); SetMethod(timeReadout, MOVETOFRONTPANEL, MoveDrawingToFrontPanel); list = NewList(); PrefixList(list, NewSymbol(BOUNDS)); PrefixList(list, NewSymbol(TEXTFONT)); PrefixList(list, NewSymbol(TEXTSIZE)); PrefixList(list, NewSymbol(ALIGNMENT)); SetVar(timeReadout, SNAPVARS, list); DeselectAll(); Select(timeReadout, true); if (logging) { /*Log the action.*/ char cmd[256]; char *d; d = &(cmd[0]); sprintf(cmd, "timereadout "); while (*d) ++d; MakeObjectName(d, timeReadout); while (*d) ++d; sprintf(d, " [%g %g %g %g]\n", bounds[0], bounds[1], bounds[2], bounds[3]); Log(cmd); } } } } } void AddRectangle(name, bounds) char *name; real bounds[4]; /*Adds rectangle with name and bounds to current window*/ { if (selWinInfo) { /*Search for a space*/ ObjPtr space, frontPanel; space = FindSpace(selWinInfo); if (space) { frontPanel = GetObjectVar("AddRectangle", space, FRONTPANEL); if (frontPanel) { /*There's a front panel. Stick a rectangle there*/ ObjPtr rectangle; ++nRect; rectangle = NewRectangle((int) bounds[0], (int) bounds[1], (int) bounds[2], (int) bounds[3], name); PrefixList(GetVar(frontPanel, CONTENTS), rectangle); SetVar(rectangle, PARENT, frontPanel); ImInvalid(rectangle); DeselectAll(); Select(rectangle, true); if (logging) { /*Log the action.*/ char cmd[256]; char *d; d = &(cmd[0]); sprintf(cmd, "rectangle "); while (*d) ++d; MakeObjectName(d, rectangle); while (*d) ++d; sprintf(d, " [%g %g %g %g]\n", bounds[0], bounds[1], bounds[2], bounds[3]); Log(cmd); } } } } } void AddLine(name, x1, y1, x2, y2) char *name; int x1, y1, x2, y2; /*Adds line with name and endpoints (x1, y1)-(x2, y2) to current window*/ { if (selWinInfo) { /*Search for a space*/ ObjPtr space, frontPanel; space = FindSpace(selWinInfo); if (space) { frontPanel = GetObjectVar("AddLine", space, FRONTPANEL); if (frontPanel) { /*There's a front panel. Stick a line there*/ ObjPtr line; ++nLine; line = NewLine(x1, y1, x2, y2, name); PrefixList(GetVar(frontPanel, CONTENTS), line); SetVar(line, PARENT, frontPanel); ImInvalid(line); DeselectAll(); Select(line, true); if (logging) { /*Log the action.*/ char cmd[256]; char *d; d = &(cmd[0]); sprintf(cmd, "line "); while (*d) ++d; MakeObjectName(d, line); while (*d) ++d; sprintf(d, " %d %d %d %d\n", x1, y1, x2, y2); Log(cmd); } } } } } static void DoTogglePanel() /*Toggles the panel of the controls on the top window.*/ { if (selWinInfo) { if (GetPredicate((ObjPtr) selWinInfo, PANELHIDDEN)) { DoShowPanel(); } else { DoHidePanel(); } } } void DoShowControls() /*Shows the controls in the selected objects in the window*/ { DoObjFunction(OF_SHOW_CONTROLS); } ObjPtr MakeLocalCopy(object) ObjPtr object; /*Makes a local copy of an object*/ { object = ObjectWhichRepresents(selWinInfo, object); if (object && IsIcon(object)) { ObjPtr repObj, newObj; FuncTyp method; repObj = GetVar(object, REPOBJ); if (repObj) { ObjPtr contentsList, corral = NULLOBJ; contentsList = GetVar(object, PARENT); if (contentsList || !IsList(contentsList)) { contentsList = GetVar(contentsList, CONTENTS); } if (!contentsList || !IsList(contentsList)) { ReportError("MakeLocalCopy","Internal error: cannot find contents list"); } if (contentsList) { corral = contentsList; while (corral && !IsCorral(corral)) { corral = GetVar(corral, PARENT); } } if (!corral) { ReportError("MakeLocalCopy", "Cannot find local corral"); } method = GetMethodSurely("MakeLocalCopy", repObj, CLONE); if (!method) { return ObjFalse; } method = GetMethod(object, DELETEICON); if (method) { if (IsTrue((*method)(object))) { if (contentsList && IsList(contentsList)) { ImInvalid(corral); DeleteFromList(contentsList, object); } } } method = GetMethod(repObj, CLONE); if (method) { ObjPtr name; newObj = (*method)(repObj); object = Clone(object); SetVar(object, REPOBJ, newObj); MakeVar(newObj, NAME); name = GetVar(newObj, NAME); SetVar(object, NAME, object); SetVar(object, SELECTED, ObjFalse); } method = GetMethod(corral, DROPINCONTENTS); if (method) { ObjPtr locArray; int x, y; real loc[2]; locArray = GetVar(object, ICONLOC); if (locArray) { Array2CArray(loc, locArray); x = loc[0]; y = loc[1]; } else { x = y = 0; } (*method)(corral, object, x, y); } return ObjTrue; } } return ObjFalse; } ObjPtr CloneObject(object) ObjPtr object; /*Clones an individual object*/ { object = ObjectWhichRepresents(selWinInfo, object); if (object && IsIcon(object)) { ObjPtr repObj, newVis; FuncTyp method; repObj = GetVar(object, REPOBJ); if (repObj && !GetPredicate(repObj, ONEONLY)) { ObjPtr corral = NULLOBJ; corral = GetVar(object, PARENT); if (corral) { while (corral && !IsCorral(corral)) { corral = GetVar(corral, PARENT); } } if (!corral) { ReportError("CloneObject", "Cannot find local corral"); return ObjFalse; } method = GetMethodSurely("CloneObject", repObj, CLONE); if (!method) { return ObjFalse; } newVis = (*method)(repObj); SetVar(newVis, SELECTED, ObjFalse); if (IsController(newVis)) { AddControllerToSpace(newVis, FindSpace(selWinInfo), corral, NULLOBJ); ImInvalid(newVis); } else { IdleAllWindows(); AddObjToSpace(newVis, FindSpace(selWinInfo), corral, NULLOBJ, NULLOBJ); } return ObjTrue; } } return ObjFalse; } int vwSerialNumber = 0; void NewSerializedVisWindow() /*Creates a new, serialized visualization window*/ { WinInfoPtr visWindow; /*Create a vis window*/ sprintf(tempStr, "Visualization %d", ++vwSerialNumber); visWindow = NewVisWindow(tempStr, WINDBUF + WINZBUF + WINRGB); } int vawSerialNumber; void DoShowFrontPanelControls() /*Shows the controls for the front panel in the selected vis window*/ { ObjPtr space, panel; if (!selWinInfo) { return; } space = FindSpace(selWinInfo); if (!space) { return; } panel = GetVar(space, FRONTPANEL); if (!panel) { return; } if (logging) { Log("show front panel controls\n"); InhibitLogging(true); } NewControlWindow(panel); if (logging) { InhibitLogging(false); } } void DoShowBackPanelControls() /*Shows the controls for the back panel in the selected vis window*/ { ObjPtr space, panel; if (!selWinInfo) { return; } space = FindSpace(selWinInfo); if (!space) { return; } panel = GetVar(space, BACKPANEL); if (!panel) { return; } if (logging) { Log("show back panel controls\n"); InhibitLogging(true); } NewControlWindow(panel); if (logging) { InhibitLogging(false); } } void DoShowSpaceControls() /*Shows the controls for the space in the selected vis window*/ { ObjPtr space; if (!selWinInfo) { return; } space = FindSpace(selWinInfo); if (!space) { return; } if (logging) { Log("show space controls\n"); InhibitLogging(true); } NewControlWindow(space); if (logging) { InhibitLogging(false); } } #define MINANNOTSIZE 40 #define MINRECTSIZE 0 #define MINLINESIZE 0 static ObjPtr DeleteClockReadout(readout) ObjPtr readout; /*Deletes a clock readout from a space*/ { return ObjTrue; } static ObjPtr MakeClockValue(clockDisplay) ObjPtr clockDisplay; /*Makes the VALUE of a clock display*/ { ObjPtr space, timeObj, format; real time; char s[400]; space = GetObjectVar("MakeClockValue", clockDisplay, SPACE); if (!space) { return ObjFalse; } MakeVar(space, TIME); timeObj = GetVar(space, TIME); if (!timeObj) { time = 0.0; } else { time = GetReal(timeObj); } format = GetVar(clockDisplay, FORMAT); if (format) { PrintClock(s, GetString(format), time); } else { sprintf(s, "%#.2f", time); } SetVar(clockDisplay, VALUE, NewString(s)); return ObjTrue; } ObjPtr ChangeClockDisplayFormat(textBox) ObjPtr textBox; /*Changes a clock display's FORMAT according to textBox*/ { ObjPtr repObj; repObj = GetObjectVar("ChangeClockFormat", textBox, REPOBJ); if (!repObj) return ObjFalse; SetVar(repObj, FORMAT, GetValue(textBox)); ImInvalid(repObj); return ObjTrue; } static ObjPtr ShowClockDisplayControls(display, windowName) ObjPtr display; char *windowName; /*Makes a new control window to control a clock display*/ { WinInfoPtr controlWindow; ObjPtr var; ObjPtr panel; ObjPtr corral; ObjPtr contents; real rgb[3], hsv[3]; WinInfoPtr dialogExists; Bool hasBackground; dialogExists = DialogExists((WinInfoPtr) display, NewString("Controls")); controlWindow = GetDialog((WinInfoPtr) display, NewString("Controls"), windowName, CDWINWIDTH, CDWINHEIGHT, CDWINWIDTH, CDWINHEIGHT, WINDBUF + WINFIXEDSIZE); if (!dialogExists) { long info; ObjPtr value; ObjPtr format; ObjPtr checkBox, icon, name, colorBar, titleBox, textBox, button; ObjPtr colorWheel, slider, radioGroup; int left, right, bottom, top; SetVar((ObjPtr) controlWindow, REPOBJ, display); /*Set help string*/ SetVar((ObjPtr) controlWindow, HELPSTRING, NewString("This window \ shows controls for a clock display. For information about any of the controls \ in the window, use Help In Context on the control.\n")); /*Add in a panel*/ panel = NewPanel(greyPanelClass, 0, CDWINWIDTH, 0, CDWINHEIGHT); if (!panel) { return NULLOBJ; } contents = GetVar((ObjPtr) controlWindow, CONTENTS); PrefixList(contents, panel); SetVar(panel, PARENT, (ObjPtr) controlWindow); ContentsExpectWindowSize(controlWindow, CDWINWIDTH, CDWINHEIGHT); contents = GetVar(panel, CONTENTS); /*Add in the group of controls for text color*/ left = MINORBORDER; top = CDWINHEIGHT - MINORBORDER; right = left + 2 * MINORBORDER + 2 * MAJORBORDER + COLORWHEELWIDTH + SLIDERWIDTH; titleBox = NewTitleBox(left, right, top - TITLEBOXTOP - MINORBORDER - 2 * MINORBORDER - COLORWHEELWIDTH - CHECKBOXHEIGHT - TEXTBOXHEIGHT - TEXTBOXSEP, top, "Text"); SetVar(titleBox, PARENT, panel); PrefixList(contents, titleBox); left += MINORBORDER; right -= MINORBORDER; top -= TITLEBOXTOP + MINORBORDER; /*Get the color for priming the controls*/ var = GetVar(display, COLOR); if (IsArray(var) && RANK(var) == 1 && DIMS(var)[0] == 3) { Array2CArray(rgb, var); } else if (IsInt(var)) { rgb[0] = uiColors[GetInt(var)][0] / 255.0; rgb[1] = uiColors[GetInt(var)][1] / 255.0; rgb[2] = uiColors[GetInt(var)][2] / 255.0; } else { ReportError("ShowClockDisplayControls", "Bad color"); rgb[0] = rgb[1] = rgb[2] = 1.0; } RGB2HSV(&(hsv[0]), &(hsv[1]), &(hsv[2]), (rgb[0]), (rgb[1]), (rgb[2])); /*Make the color wheel*/ colorWheel = NewColorWheel(left, left + COLORWHEELWIDTH, top - COLORWHEELWIDTH, top, "Text Color"); var = NewRealArray(1, 2L); CArray2Array(var, hsv); SetValue(colorWheel, var); SetVar(colorWheel, PARENT, panel); SetVar(colorWheel, REPOBJ, display); PrefixList(contents, colorWheel); SetMethod(colorWheel, CHANGEDVALUE, ChangeTextColorWheel); SetVar(colorWheel, HELPSTRING, NewString("This color wheel controls the \ hue and saturation of the color used to draw the text in the clock display. \ The final color is a combination of this hue and saturation and the value, or brightness, \ given by the Value slider.")); /*Make the text box below*/ textBox = NewTextBox(left, left + COLORWHEELWIDTH, top - COLORWHEELWIDTH - TEXTBOXSEP - TEXTBOXHEIGHT, top - COLORWHEELWIDTH - TEXTBOXSEP, PLAIN, "Text Color Label", "Color"); SetVar(textBox, PARENT, panel); PrefixList(contents, textBox); SetTextAlign(textBox, CENTERALIGN); /*Make the brightness slider*/ slider = NewSlider(right - SLIDERWIDTH, right, top - COLORWHEELWIDTH, top, PLAIN, "Text Color Value"); SetVar(slider, PARENT, panel); PrefixList(contents, slider); SetSliderRange(slider, 1.0, 0.0, 0.0); SetSliderValue(slider, hsv[2]); SetVar(slider, REPOBJ, display); SetMethod(slider, CHANGEDVALUE, ChangeTextColorSlider); SetVar(slider, HELPSTRING, NewString("This slider controls the \ value, or brightness, of the color used to draw the text in the clock display. \ The final color is a combination of this value and the hue and saturation \ given by the Color color wheel.")); /*Make the text box below*/ textBox = NewTextBox(right - SLIDERWIDTH - MINORBORDER, right + MINORBORDER, top - COLORWHEELWIDTH - TEXTBOXSEP - TEXTBOXHEIGHT, top - COLORWHEELWIDTH - TEXTBOXSEP, PLAIN, "Text Value Label", "Value"); SetVar(textBox, PARENT, panel); PrefixList(contents, textBox); SetTextAlign(textBox, CENTERALIGN); /*Cross link the slider and color wheel*/ SetVar(colorWheel, SLIDER, slider); SetVar(slider, COLORWHEEL, colorWheel); left -= MINORBORDER; right += MINORBORDER; /*Make the background controls*/ top = CDWINHEIGHT - MINORBORDER; right = CDWINWIDTH - MINORBORDER; left = right - (2 * MINORBORDER + 2 * MAJORBORDER + COLORWHEELWIDTH + SLIDERWIDTH); titleBox = NewTitleBox(left, right, top - TITLEBOXTOP - MINORBORDER - 2 * MINORBORDER - COLORWHEELWIDTH - CHECKBOXHEIGHT - TEXTBOXHEIGHT - TEXTBOXSEP, top, "Background"); SetVar(titleBox, PARENT, panel); PrefixList(contents, titleBox); left += MINORBORDER; right -= MINORBORDER; top -= TITLEBOXTOP + MINORBORDER; /*Get the color for priming the controls*/ var = GetVar(display, BACKGROUND); if (var && IsArray(var) && RANK(var) == 1 && DIMS(var)[0] == 3) { Array2CArray(rgb, var); hasBackground = true; } else if (var && IsInt(var)) { rgb[0] = uiColors[GetInt(var)][0] / 255.0; rgb[1] = uiColors[GetInt(var)][1] / 255.0; rgb[2] = uiColors[GetInt(var)][2] / 255.0; hasBackground = true; } else { rgb[0] = rgb[1] = rgb[2] = 0.5; hasBackground = false; } RGB2HSV(&(hsv[0]), &(hsv[1]), &(hsv[2]), (rgb[0]), (rgb[1]), (rgb[2])); /*Make the color wheel*/ colorWheel = NewColorWheel(left, left + COLORWHEELWIDTH, top - COLORWHEELWIDTH, top, "Background Color"); var = NewRealArray(1, 2L); CArray2Array(var, hsv); SetValue(colorWheel, var); SetVar(colorWheel, PARENT, panel); SetVar(colorWheel, REPOBJ, display); PrefixList(contents, colorWheel); SetMethod(colorWheel, CHANGEDVALUE, ChangeBackgroundColorWheel); SetVar(colorWheel, HELPSTRING, NewString("This color wheel controls the \ hue and saturation of the color used to draw the background of the clock display. \ The final color is a combination of this hue and saturation and the value, or brightness, \ given by the Value slider.")); /*Make the text box below*/ textBox = NewTextBox(left, left + COLORWHEELWIDTH, top - COLORWHEELWIDTH - TEXTBOXSEP - TEXTBOXHEIGHT, top - COLORWHEELWIDTH - TEXTBOXSEP, PLAIN, "Background Color Label", "Color"); SetVar(textBox, PARENT, panel); PrefixList(contents, textBox); SetTextAlign(textBox, CENTERALIGN); /*Make the brightness slider*/ slider = NewSlider(right - SLIDERWIDTH, right, top - COLORWHEELWIDTH, top, PLAIN, "Background Value"); SetVar(slider, PARENT, panel); PrefixList(contents, slider); SetSliderRange(slider, 1.0, 0.0, 0.0); SetSliderValue(slider, hsv[2]); SetVar(slider, REPOBJ, display); SetMethod(slider, CHANGEDVALUE, ChangeBackgroundColorSlider); SetVar(slider, HELPSTRING, NewString("This slider controls the \ value, or brightness, of the color used to draw the background of the clock display. \ The final color is a combination of this value and the hue and saturation \ given by the Color color wheel.")); /*Make the text box below*/ textBox = NewTextBox(right - SLIDERWIDTH - MINORBORDER, right + MINORBORDER, top - COLORWHEELWIDTH - TEXTBOXSEP - TEXTBOXHEIGHT, top - COLORWHEELWIDTH - TEXTBOXSEP, PLAIN, "Background Value Label", "Value"); SetVar(textBox, PARENT, panel); PrefixList(contents, textBox); SetTextAlign(textBox, CENTERALIGN); /*Cross link the slider and color wheel*/ SetVar(colorWheel, SLIDER, slider); SetVar(slider, COLORWHEEL, colorWheel); /*Make the check box*/ top -= COLORWHEELWIDTH + TEXTBOXSEP + TEXTBOXHEIGHT + MINORBORDER; checkBox = NewCheckBox(left, right, top - CHECKBOXHEIGHT, top, "No background", hasBackground ? false : true); SetVar(checkBox, PARENT, panel); SetVar(checkBox, REPOBJ, display); SetVar(checkBox, SLIDER, slider); SetVar(checkBox, COLORWHEEL, colorWheel); PrefixList(contents, checkBox); SetMethod(checkBox, CHANGEDVALUE, ChangeNoBackground); SetVar(checkBox, HELPSTRING, NewString("This checkbox controls whether \ a background is shown. If it is selected, no background is shown, and the \ objects behind can be seen.")); /*Link the checkbox to the slider and color wheel*/ SetVar(colorWheel, CHECKBOX, checkBox); SetVar(slider, CHECKBOX, checkBox); top -= CHECKBOXHEIGHT + MINORBORDER + MAJORBORDER; left = MINORBORDER; right = CDWINWIDTH - MINORBORDER; /*Create the format text box*/ textBox = NewTextBox(left, left + CDFORMATLABELWIDTH, top - EDITBOXHEIGHT + (EDITBOXHEIGHT - TEXTBOXHEIGHT) / 2, top - (EDITBOXHEIGHT - TEXTBOXHEIGHT) / 2, PLAIN, "Format:", "Format:"); PrefixList(contents, textBox); SetVar(textBox, PARENT, panel); /*Create the format editable text box*/ left = left + CDFORMATLABELWIDTH; format = GetVar(display, FORMAT); textBox = NewTextBox(left, right, top - EDITBOXHEIGHT, top, EDITABLE + WITH_PIT + ONE_LINE, "Format", format ? GetString(format) : "%#.2t"); PrefixList(contents, textBox); SetVar(textBox, PARENT, panel); SetVar(textBox, REPOBJ, display); SetVar(textBox, HELPSTRING, NewString( "This text box contains the format used to print the current time in \ the time readout. It works very much like printf with the special conversion \ characters listed below. Flags and field widths are exactly as in printf. \ All times are printed as real numbers, so you may need to limit the number \ of decimal places. \ There may be several conversions in one string, in which case, all will refer \ to the same time. Hours and minutes are derives from the internal time specified in seconds.\n\ \n\ %h\t\tPrint the number of hours, from 1 to 12.\n\ %H\t\tPrint the number of hours, from 0 to 23.\n\ %m\t\tPrint the number of minutes, from 0 to 59.\n\ %M\t\tPrint the total number of minutes.\n\ %s\t\tPrint the number of seconds from 0 to 59.\n\ %S\t\tPrint the time in seconds.\n\ %t\t\tPrint the time in timesteps. For this to work properly, \ each time step of data must have a time equal to the number of the time step.\n\ \n\ Examples for time = 43440 seconds:\n\ Format\t\t\t\tResult\t\tExplanation\n\ %.0t\t\t\t\t43440\t\tThe time is printed in seconds with no decimal places.\n\ %2.0h:%02.0m %a\t\t\t\t12:04 pm\t\tThe time is assumed to be 43440 seconds after \ midnight and is converted into 12-hour format.\n\ %.2M\t\t\t\t724.00\t\tThe time is printed in minutes with 2 decimal places.")); SetMethod(textBox, CHANGEDVALUE, ChangeClockDisplayFormat); } return (ObjPtr) controlWindow; } #ifdef PROTO static ObjPtr NewTimeReadout(int left, int right, int bottom, int top, char *name, ObjPtr space) #else static ObjPtr NewTimeReadout(left, right, bottom, top, name, space) int left, right, bottom, top; char *name; ObjPtr space; #endif { ObjPtr clockThere; clockThere = NewTextBox(left, right, bottom, top, ADJUSTABLE, name, ""); SetMethod(clockThere, DELETEICON, DeleteClockReadout); DeclareDependency(clockThere, VALUE, FORMAT); SetVar(clockThere, SPACE, space); DeclareIndirectDependency(clockThere, VALUE, SPACE, TIME); SetMethod(clockThere, NEWCTLWINDOW, ShowClockDisplayControls); SetMethod(clockThere, VALUE, MakeClockValue); SetVar(clockThere, FORMAT, NewString("%#.2t")); SetVar(clockThere, HELPSTRING, NewString("This time readout displays the time \ given by the clock in this space. The display format is controlled by the Format \ text box in the readout's control panel.\n")); return clockThere; } #ifdef INTERACTIVE static ObjPtr PressSpacePanel(object, x, y, flags) ObjPtr object; int x, y; long flags; /*Does a press in a field beginning at x and y. Returns true iff the press really was in the field.*/ { int left, right, bottom, top; FuncTyp pressContents; /*Routine to press the contents*/ Get2DIntBounds(object, &left, &right, &bottom, &top); if (x >= left && x <= right && y >= bottom && y <= top) { /*Hey! It really was a click in the field*/ ObjPtr space; int tool; ObjPtr contents; ObjPtr retVal = ObjFalse; contents = GetVar(object, CONTENTS); if (TOOL(flags) == T_HELP) { StartPanel(left, right, bottom, top); retVal = PressObject(contents, x, y, flags); StopPanel(); return retVal; } if (flags & F_OPTIONDOWN) { /*Ignore press if this is the front panel*/ if (GetPredicate(object, FRONTPANEL)) { return ObjFalse; } } if (TOOL(flags) == T_ROTATE) flags |= F_SHIFTDOWN; SetScreenGrid(object); /*See if it's a dragBuffer click*/ if (dragBuffer) { /*Yes it is. Move dragBuffer and exit*/ dropObject = dragBuffer; dragBuffer = NULLOBJ; return ObjTrue; } /*Setup the new viewport*/ StartPanel(left, right, bottom, top); x -= left; y -= bottom; tool = ST_FINGER; space = GetVar(object, SPACE); if (space) { ObjPtr var; var = GetVar(space, EDITTOOL); if (var) { tool = GetInt(var); } } if (TOOL(flags) == T_HELP) { tool = ST_FINGER; } switch (tool) { case ST_FINGER: retVal = PressObject(contents, x, y, flags); if (TOOL(flags) == T_HELP && !IsTrue(retVal)) { ContextHelp(object); StopPanel(); return ObjTrue; } else if (!IsTrue(retVal)) { { StopPanel(); if (!GetPredicate(object, FRONTPANEL)) { ObjPtr space; if (0 == (flags & F_SHIFTDOWN)) { DeselectAll(); } /*Return press to space*/ space = GetVar(object, SPACE); if (TOOL(flags) == T_ROTATE) { RotateSpace(space, x + left, y + bottom, flags); } else { MoveSpace(space, x + left, y + bottom, flags); } return ObjTrue; } else { return ObjFalse; } } } retVal = ObjTrue; break; case ST_ANNOTATION: case ST_RECTANGLE: case ST_LINE: case ST_TIME_READOUT: { char name[30]; int l, r, b, t; int minSize; ObjPtr boundsArray; ObjPtr screenObject; int startX, startY, newX, newY, endX, endY; if (flags & F_SHIFTDOWN) { x = GRIDX(x); y = GRIDY(y); } startX = x; startY = y; if (tool == ST_ANNOTATION || tool == ST_TIME_READOUT) { minSize = MINANNOTSIZE; } else if (tool == ST_RECTANGLE) { minSize = MINRECTSIZE; } else if (tool == ST_LINE) { minSize = MINLINESIZE; } l = startX - HANDLESIZE / 2; r = startX + minSize + HANDLESIZE / 2; b = startY - minSize - HANDLESIZE / 2; t = startY + HANDLESIZE / 2; if (tool == ST_ANNOTATION) { sprintf(name, "Annotation %d", nAnnot++); screenObject = NewTextBox(l, r, b, t, /*WITH_BG + */EDITABLE + ADJUSTABLE, name, ""); SetMethod(screenObject, CLONE, CloneAnnotation); SetMethod(screenObject, DUPLICATE, DuplicateDrawing); SetMethod(screenObject, PUSHTOBOTTOM, PushDrawingToBottom); SetMethod(screenObject, BRINGTOTOP, BringDrawingToTop); SetMethod(screenObject, MOVETOBACKPANEL, MoveDrawingToBackPanel); SetMethod(screenObject, MOVETOFRONTPANEL, MoveDrawingToFrontPanel); } else if (tool == ST_TIME_READOUT) { sprintf(name, "Time Readout %d", nTimeReadout++); screenObject = NewTimeReadout(l, r, b, t, name, space); SetMethod(screenObject, CLONE, CloneTimeReadout); SetMethod(screenObject, DUPLICATE, DuplicateDrawing); SetMethod(screenObject, PUSHTOBOTTOM, PushDrawingToBottom); SetMethod(screenObject, BRINGTOTOP, BringDrawingToTop); SetMethod(screenObject, MOVETOBACKPANEL, MoveDrawingToBackPanel); SetMethod(screenObject, MOVETOFRONTPANEL, MoveDrawingToFrontPanel); } else if (tool == ST_RECTANGLE) { sprintf(name, "Rectangle %d", nRect++); screenObject = NewRectangle(l, r, b, t, name); } else if (tool == ST_LINE) { sprintf(name, "Line %d", nLine++); screenObject = NewLine(startX, startY, startX, startY, name); } SetVar(screenObject, STICKINESS, NewInt(FLOATINGLEFT + FLOATINGRIGHT + FLOATINGTOP + FLOATINGBOTTOM)); PrefixList(contents, screenObject); SetVar(screenObject, PARENT, object); if (tool == ST_ANNOTATION) { SetTextColor(screenObject, NewInt(UIWHITE)); ImInvalid(screenObject); SetTextFont(screenObject, ANNOTFONT); SetTextSize(screenObject, ANNOTFONTSIZE); SetMethod(screenObject, DELETEICON, DeleteSpacePanelText); SetMethod(screenObject, DELETE, DeleteObject); } else if (tool == ST_TIME_READOUT) { SetTextColor(screenObject, NewInt(UIWHITE)); ImInvalid(screenObject); SetTextFont(screenObject, ANNOTFONT); SetTextSize(screenObject, ANNOTFONTSIZE); SetMethod(screenObject, DELETEICON, DeleteClockReadout); SetMethod(screenObject, DELETE, DeleteObject); } if (tool == ST_ANNOTATION || tool == ST_TIME_READOUT) { InhibitLogging(true); Select(screenObject, true); InhibitLogging(false); } /*Set up to draw in the overlay area*/ DrawSkeleton(true); DrawMe(screenObject); while (Mouse(&newX, &newY)) { if (tool == ST_ANNOTATION || tool == ST_TIME_READOUT || tool == ST_RECTANGLE || tool == ST_LINE) { if (newX >= startX && newX - startX < minSize) { newX = startX + minSize; } else if (newX < startX && startX - newX < minSize) { newX = startX - minSize; } if (newY >= startY && newY - startY < minSize) { newY = startY + minSize; } else if (newY < startY && startY - newY < minSize) { newY = startY - minSize; } } if (flags & F_SHIFTDOWN) { newX = GRIDX(newX); newY = GRIDY(newY); } if (newX != x || newY != y) { x = newX; y = newY; Set2DIntBounds(screenObject, MIN(startX, x) - HANDLESIZE / 2, MAX(startX, x) + HANDLESIZE / 2, MIN(startY, y) - HANDLESIZE / 2, MAX(startY, y) + HANDLESIZE / 2); if (tool == ST_LINE) { ObjPtr var; real loc[2]; loc[0] = newX; loc[1] = newY; var = NewRealArray(1, 2L); CArray2Array(var, loc); SetVar(screenObject, ENDPOINT, var); } DrawMe(screenObject); } } DrawSkeleton(false); Get2DIntBounds(screenObject, &l, &r, &b, &t); if (logging) { /*Log the action.*/ char cmd[256]; char *d, *s; s = name; d = &(cmd[0]); if (tool == ST_ANNOTATION) { strcpy(cmd, "annotation "); } else if (tool == ST_RECTANGLE) { strcpy(cmd, "rectangle "); } else if (tool == ST_LINE) { strcpy(cmd, "line "); } else if (tool == ST_TIME_READOUT) { strcpy(cmd, "timereadout "); } while (*d) ++d; MakeObjectName(d, screenObject); while (*d) ++d; if (tool == ST_LINE) { sprintf(d, " %d %d %d %d\n", startX, startY, x, y); } else { sprintf(d, " [%d %d %d %d]\n", l, r, b, t); } Log(cmd); if (flags & F_OPTIONDOWN) { strcpy(d, "move "); d = &(cmd[0]); while (*d) ++d; MakeObjectName(d, screenObject); while (*d) ++d; strcpy(d, " to back panel\n"); Log(cmd); } } SetValue(GetVar(space, TOOLGROUP), NewInt(ST_FINGER)); if (!(flags & F_SHIFTDOWN)) { DeselectAll(); IdleAllWindows(); } Select(screenObject, true); if (tool == ST_ANNOTATION) { MakeMeCurrent(screenObject); } } retVal = ObjTrue; break; } StopPanel(); return retVal; } else { return ObjFalse; } } #endif void SetupVisualizeAsList() { EmptyList(visualizeAsList); } void AddToVisualizeAsList(object) ObjPtr object; { PostfixList(visualizeAsList, object); } void EmptyVisualizeAsList() { EmptyList(visualizeAsList); } ObjPtr ChangeCorralButton(object) ObjPtr object; /*Changedvalue for a corral button*/ { ObjPtr corral, parent, value, curButton; value = GetValue(object); parent = GetObjectVar("ChangeCorralButton", object, PARENT); if (!parent) return ObjFalse; corral = GetObjectVar("ChangeCorralButton", object, CORRAL); if (!corral) return ObjFalse; curButton = GetVar(parent, BUTTON); if (value && IsInt(value) && 0 == GetInt(value) && curButton != object) { SetVar(corral, CONTENTS, GetVar(object, PANELCONTENTS)); if (curButton) { SetVar(curButton, VALUE, NewInt(0)); } SetVar(object, VALUE, NewInt(1)); SetVar(parent, BUTTON, object); ImInvalid(corral); return ObjTrue; } else { return ObjTrue; } } void NewVisAsWindow() /*Brings up a new, empty visAs window*/ { WinInfoPtr newWindow; ObjPtr objList, contents, fieldContents; ObjPtr corral, panel, button, icon; ObjPtr textBox; ObjPtr controlField; ThingListPtr runner; int whichIcon; int bw; char *name; ObjPtr var; int x; int l, r, b, t; /*Create a vis as window*/ sprintf(tempStr, "Visualize As %d", ++vawSerialNumber); newWindow = NewObjWindow(NULLOBJ, tempStr, WINDBUF, VAWINWIDTH, VAWINHEIGHT, SCRWIDTH, SCRHEIGHT); SetVar((ObjPtr) newWindow, HELPSTRING, NewString("This window shows all the possible ways to visualize a \ group of datasets.")); ContentsExpectWindowSize(newWindow, VAWINWIDTH, VAWINHEIGHT); /*Put in a panel*/ panel = NewPanel(greyPanelClass, 0, VAWINWIDTH, 0, VAWINHEIGHT); SetVar(panel, STICKINESS, NewInt(STICKYLEFT + STICKYRIGHT + STICKYBOTTOM + STICKYTOP)); contents = GetVar((ObjPtr) newWindow, CONTENTS); PrefixList(contents, panel); SetVar(panel, PARENT, (ObjPtr) newWindow); /*Put in contents*/ contents = GetListVar("NewVisAsWindow", panel, CONTENTS); if (!contents) { return; } /*Explanatory text at top*/ textBox = TemplateTextBox(VisAsTemplate, "Visualize As String", 0, "Visualize datasets as..."); PrefixList(contents, textBox); SetVar((ObjPtr) newWindow, TITLETEXT, textBox); SetVar(textBox, PARENT, panel); /*Icon corral*/ corral = TemplateIconCorral(VisAsTemplate, "Visualizations Corral", NULLOBJ, OBJECTSFROMTOP + BARRIGHT + BARBOTTOM); SetVar(corral, STICKINESS, NewInt(STICKYLEFT + STICKYRIGHT + STICKYBOTTOM + STICKYTOP)); SetVar((ObjPtr) newWindow, CORRAL, corral); SetVar(corral, HELPSTRING, NewString("This corral contains icons for all possible visualizations of a group of \ datasets. You can visualize or show info on the visualizations by selecting \ some of them and pressing the buttons at the bottom of the window. You can delete \ visualizations by selecting them and choosing Delete from the Object menu.")); PrefixList(contents, corral); SetVar(corral, PARENT, panel); SetVar((ObjPtr) newWindow, CORRAL, corral); /*Control field*/ controlField = TemplateControlField(VisAsTemplate, "Visualization Type Field", BARBOTTOM); SetVar(controlField, STICKINESS, NewInt(STICKYLEFT + STICKYRIGHT + STICKYTOP)); SetVar(controlField, PARENT, panel); PrefixList(contents, controlField); SetVar((ObjPtr) newWindow, VISASFIELD, controlField); /*Buttons in the control field*/ fieldContents = GetVar(controlField, CONTENTS); runner = LISTOF(allVisObjClasses); x = 0; while (runner) { icon = GetVar(runner -> thing, DEFAULTICON); var = GetIntVar("ShowVisControls", icon, WHICHICON); if (var) { whichIcon = GetInt(var); } else { whichIcon = ICONQUESTION; } var = GetVar(runner -> thing, NAME); if (var) { name = GetString(var); } else { name = "?"; } /*Make a button*/ button = NewIconLabeledButton(x, x + VAWINICONBUTWIDTH, 0, CWINICONBUTHEIGHT, whichIcon, UIYELLOW, name, BS_PITTED); x += VAWINICONBUTWIDTH; SetMethod(button, ICONEXTRADRAW, GetMethod(icon, ICONEXTRADRAW)); SetMethod(button, CHANGEDVALUE, ChangeCorralButton); SetVar(button, CORRAL, corral); PostfixList(fieldContents, button); SetVar(button, PARENT, controlField); runner = runner -> next; } RecalcScroll(controlField); l = b = 0; r = VAWINWIDTH; t = VAWINHEIGHT; l += MINORBORDER; r -= MINORBORDER; b += MINORBORDER; t = b + BUTTONHEIGHT; bw = (r - l - MINORBORDER) / 2; /*Make a visualize button*/ button = NewFunctionButton(newWindow, l, l + bw, b, b + BUTTONHEIGHT, OF_VISUALIZE); if (button) { SetVar(button, PARENT, panel); SetVar(button, STICKINESS, NewInt(STICKYBOTTOM + STICKYLEFT + FLOATINGRIGHT)); PrefixList(contents, button); } /*Make a show info button*/ button = NewFunctionButton(newWindow, r - bw, r, b, b + BUTTONHEIGHT, OF_SHOW_CONTROLS); if (button) { SetVar(button, PARENT, panel); SetVar(button, STICKINESS, NewInt(STICKYBOTTOM + FLOATINGLEFT + STICKYRIGHT)); PrefixList(contents, button); } /*Set up the list for modifications*/ SetupVisualizeAsList(); } void ProcessVisAsList() /*Processes the visualize as modification list*/ { ObjPtr allFilters; ThingListPtr visRunner, dataRunner, buttonRunner; ObjPtr firstSuccessful; ObjPtr contentsList, visList, var; ObjPtr corral; if (!selWinInfo) { return; } if (LISTOF(visualizeAsList)) { /*There's at least one vis as*/ ObjPtr var, textBox; if (LISTOF(visualizeAsList) -> next) { /*More than one, don't bother changing text */ } else { var = GetVar(LISTOF(visualizeAsList) -> thing, NAME); textBox = GetVar((ObjPtr) selWinInfo, TITLETEXT); if (var && textBox) { sprintf(tempStr, "Visualize %s as...", GetString(var)); SetValue(textBox, NewString(tempStr)); } } } /*Find all modifications for the list of filters*/ allFilters = AllEasyFilters(visualizeAsList); corral = GetObjectVar("ProcessVisAsList", (ObjPtr) selWinInfo, CORRAL); if (!corral) return; var = GetObjectVar("ProcessVisAsList", (ObjPtr) selWinInfo, VISASFIELD); if (!var) return; var = GetListVar("ProcessVisAsList", var, CONTENTS); if (!var) return; buttonRunner = LISTOF(var); /*Go through all the visualization objects*/ firstSuccessful = NULLOBJ; visRunner = LISTOF(allVisObjClasses); while (visRunner) { contentsList = NewList(); /*Do visualization just on normal data*/ dataRunner = LISTOF(visualizeAsList); while (dataRunner) { visList = GetAllVis(dataRunner -> thing, false, visRunner -> thing); if (visList) { ThingListPtr runner; runner = LISTOF(visList); while (runner) { ObjPtr vis, icon; vis = runner -> thing; if (vis) { SetVar(vis, TEMPLATEP, ObjTrue); icon = NewVisIcon(vis); if (icon) { ObjPtr format; format = GetVar(icon, FORMAT); if (format) { SetVar(icon, FORMAT, format); } SetVar(icon, CORRAL, corral); SetVar(icon, ICONLOC, NULLOBJ); PostfixList(contentsList, icon); if (!firstSuccessful) { firstSuccessful = buttonRunner -> thing; } } } runner = runner -> next; } } dataRunner = dataRunner -> next; } /*Do visualization on filtered data*/ if (allFilters) { dataRunner = LISTOF(allFilters); while (dataRunner) { visList = GetAllVis(dataRunner -> thing, false, visRunner -> thing); if (visList) { ThingListPtr runner; runner = LISTOF(visList); while (runner) { ObjPtr vis, icon; vis = runner -> thing; if (vis) { SetVar(vis, TEMPLATEP, ObjTrue); icon = NewVisIcon(vis); if (icon) { ObjPtr format; format = GetVar(icon, FORMAT); if (format) { SetVar(icon, FORMAT, format); } SetVar(icon, CORRAL, corral); SetVar(icon, ICONLOC, NULLOBJ); PostfixList(contentsList, icon); if (!firstSuccessful) { firstSuccessful = buttonRunner -> thing; } } } runner = runner -> next; } } dataRunner = dataRunner -> next; } } SetVar(buttonRunner -> thing, PANELCONTENTS, contentsList); buttonRunner = buttonRunner -> next; visRunner = visRunner -> next; } if (firstSuccessful) { InhibitLogging(true); SetValue(firstSuccessful, ObjTrue); InhibitLogging(false); } EmptyVisualizeAsList(); } void VisObjectsAs() /*Opens a new VisObjectsAs window using default for all of the selected objects. */ { DoObjFunction(OF_VISUALIZE_AS); } static ObjPtr DropInVisCorral(corral, object, x, y) ObjPtr corral, object; int x, y; /*Drops an icon in a vis corral*/ { ObjPtr repObj; repObj = GetVar(object, REPOBJ); if (repObj) { real loc[2]; ObjPtr locArray; loc[0] = x; loc[1] = y; locArray = NewRealArray(1, 2L); CArray2Array(locArray, loc); if (IsController(repObj)) { AddControllerToSpace(repObj, FindSpace(selWinInfo), GetVar((ObjPtr) selWinInfo, CORRAL), locArray); ImInvalid(repObj); } else { AddObjToSpace(repObj, FindSpace(selWinInfo), GetVar((ObjPtr) selWinInfo, CORRAL), locArray, NULLOBJ); IdleAllWindows(); } return ObjTrue; } else { return ObjFalse; } } void ForAllVisWindows(routine) void (*routine)(); /*Performs (*routine)(window) on all vis windows*/ { WinInfoPtr curWindow; curWindow = allWindows; while (curWindow) { if (IsVisWindow((ObjPtr) curWindow)) { (*routine)(curWindow); } curWindow = curWindow -> next; } } void PushNonVisWindows() /*Pushes all the non vis windows*/ { #ifdef GRAPHICS #ifdef WINDOWS4D int maxDepth; WinInfoPtr curWindow; maxDepth = -1; curWindow = allWindows; while (curWindow) { if (IsVisWindow((ObjPtr) curWindow)) { if ((curWindow) -> id) { maxDepth = MAX(maxDepth, windepth((curWindow) -> id)); } } curWindow = curWindow -> next; } curWindow = allWindows; while (curWindow) { if (!IsVisWindow((ObjPtr) curWindow)) { if ((curWindow) -> id && windepth((curWindow) -> id) < maxDepth) { SelWindow(curWindow); --maxDepth; winpush(); } } curWindow = curWindow -> next; } #endif #endif } void Tile(width, height) int width, height; /*Tiles all the vis windows in the lower left corner as big as width, height*/ { #ifdef GRAPHICS #ifdef WINDOWS4D int nWide, nHigh; /*# of windows wide and high*/ int i, j; int nVisWindows; WinInfoPtr curWindow; long oldWindow; if (logging) { char cmd[256]; sprintf(cmd, "tile %d %d\n", width, height); Log(cmd); } /*Count the number of vis windows*/ nVisWindows = 0; curWindow = allWindows; while (curWindow) { if (IsVisWindow((ObjPtr) curWindow)) { ++nVisWindows; } curWindow = curWindow -> next; } if (!nVisWindows) return; /*Estimate the number of windows high*/ nHigh = sqrt((double) nVisWindows) + 0.49; nWide = nVisWindows / nHigh; if (nWide * nHigh < nVisWindows) ++nHigh; /*Go through and tile the windows*/ i = 0; j = nHigh - 1; curWindow = allWindows; while (curWindow) { if (IsVisWindow((ObjPtr) curWindow)) { long l, r, b, t; if (i) { l = i * width / nWide + 1; } else { l = 0; } r = (i + 1) * width / nWide; if (j) { b = j * height / nHigh + 1; } else { b = 0; } t = (j + 1) * height / nHigh; if (++i >= nWide) { i = 0; --j; } /*Move the window*/ SelWindow(curWindow); SetWindowPosition(l, r, b, t); } curWindow = curWindow -> next; } #endif #endif } void DoTileFullScreen() /*Tiles all the visualization windows within the full screen*/ { Tile(SCRWIDTH, SCRHEIGHT); } void DoTileVideoScreen() /*Tiles all the visualization windows within the full screen*/ { Tile(recScrWidth, recScrHeight); } static void RGBTask() /*Task to change the current window to RGB*/ { if (selWinInfo) { selWinInfo -> flags |= WINRGB; SetMode(selWinInfo); ImInvalid((ObjPtr) selWinInfo); } } static void CMapTask() /*Task to change the current window to CMap mode*/ { if (selWinInfo) { selWinInfo -> flags &= ~WINRGB; SetMode(selWinInfo); ImInvalid((ObjPtr) selWinInfo); } } static ObjPtr ChangeVisColorMode(radio) ObjPtr radio; /*Changes the color mode of the current visualization window according to the value of radio*/ { int rgbp; ObjPtr repObj; rgbp = GetInt(GetValue(radio)); repObj = GetWindowVar("ChangeVisColorMode", radio, REPOBJ); if (!repObj) { return ObjFalse; } if (rgbp) { DeferMessage(repObj, SETTORGBMODE); } else { DeferMessage(repObj, SETTOCMAPMODE); } return ObjTrue; } ObjPtr ChangeShowGrid(checkBox) ObjPtr checkBox; /*Changes show grid according to a check box*/ { ObjPtr repObj; ObjPtr value; real hsv[3], rgb[3]; repObj = GetObjectVar("ChangeShowGrid", checkBox, REPOBJ); if (!repObj) { return ObjFalse; } value = GetValue(checkBox); if (!value) { return ObjFalse; } SetVar(repObj, SHOWGRID, value); ImInvalid(repObj); return ObjTrue; } static ObjPtr ShowFrontSpacePanelControls(spacePanel, windowName) ObjPtr spacePanel; char *windowName; /*Makes a new control window to control a space panel*/ { WinInfoPtr controlWindow; ObjPtr var; ObjPtr panel; ObjPtr corral; ObjPtr contents; real rgb[3], hsv[3]; WinInfoPtr dialogExists; Bool hasBackground; dialogExists = DialogExists((WinInfoPtr) spacePanel, NewString("Controls")); controlWindow = GetDialog((WinInfoPtr) spacePanel, NewString("Controls"), windowName, SPWINWIDTH, SPWINHEIGHT, SPWINWIDTH, SPWINHEIGHT, WINDBUF + WINFIXEDSIZE); if (!dialogExists) { long info; ObjPtr value; ObjPtr checkBox, icon, name, colorBar, titleBox, textBox, button; ObjPtr colorWheel, slider, radioGroup; int left, right, bottom, top; SetVar((ObjPtr) controlWindow, REPOBJ, spacePanel); /*Set help string*/ SetVar((ObjPtr) controlWindow, HELPSTRING, NewString("This window \ shows controls for a space panel. For information about any of the controls \ in the window, use Help In Context on the control.\n")); /*Add in a panel*/ panel = NewPanel(greyPanelClass, 0, SPWINWIDTH, 0, SPWINHEIGHT); if (!panel) { return ObjFalse; } contents = GetVar((ObjPtr) controlWindow, CONTENTS); PrefixList(contents, panel); SetVar(panel, PARENT, (ObjPtr) controlWindow); ContentsExpectWindowSize(controlWindow, SPWINWIDTH, SPWINHEIGHT); contents = GetVar(panel, CONTENTS); /*Add in the group of controls for text color*/ left = MAJORBORDER; top = SPWINHEIGHT - MAJORBORDER; right = SPWINWIDTH - MAJORBORDER; bottom = SPWINHEIGHT - (MAJORBORDER + (COLORWHEELWIDTH + TEXTBOXSEP + TEXTBOXHEIGHT + CHECKBOXHEIGHT + TITLEBOXTOP + 3 * MINORBORDER)) ; titleBox = NewTitleBox(left, right, bottom, top, "Background"); PrefixList(contents, titleBox); SetVar(titleBox, PARENT, panel); left += MINORBORDER; right -= MINORBORDER; top -= MINORBORDER + TITLEBOXTOP; /*Get the color for priming the controls*/ var = GetVar(spacePanel, BACKGROUND); if (var && IsRealArray(var) && RANK(var) == 1 && DIMS(var)[0] == 3) { Array2CArray(rgb, var); hasBackground = true; } else if (var && IsInt(var)) { rgb[0] = uiColors[GetInt(var)][0] / 255.0; rgb[1] = uiColors[GetInt(var)][1] / 255.0; rgb[2] = uiColors[GetInt(var)][2] / 255.0; hasBackground = true; } else { rgb[0] = rgb[1] = rgb[2] = 0.0; hasBackground = false; } RGB2HSV(&(hsv[0]), &(hsv[1]), &(hsv[2]), (rgb[0]), (rgb[1]), (rgb[2])); /*Make the color wheel*/ colorWheel = NewColorWheel(left, left + COLORWHEELWIDTH, top - COLORWHEELWIDTH, top, "Background Color"); var = NewRealArray(1, 2L); CArray2Array(var, hsv); InhibitLogging(true); SetValue(colorWheel, var); InhibitLogging(false); SetVar(colorWheel, PARENT, panel); SetVar(colorWheel, REPOBJ, spacePanel); PrefixList(contents, colorWheel); SetMethod(colorWheel, CHANGEDVALUE, ChangeBackgroundColorWheel); SetVar(colorWheel, HELPSTRING, NewString("This color wheel controls the \ hue and saturation of the color used to draw the background of the space panel. \ The final color is a combination of this hue and saturation and the value, or brightness, \ given by the Value slider.")); /*Make the text box below*/ textBox = NewTextBox(left, left + COLORWHEELWIDTH, top - COLORWHEELWIDTH - TEXTBOXSEP - TEXTBOXHEIGHT, top - COLORWHEELWIDTH - TEXTBOXSEP, PLAIN, "Background Color Label", "Color"); SetVar(textBox, PARENT, panel); PrefixList(contents, textBox); SetTextAlign(textBox, CENTERALIGN); /*Make the brightness slider*/ slider = NewSlider(right - SLIDERWIDTH, right, top - COLORWHEELWIDTH, top, PLAIN, "Background Value"); SetVar(slider, PARENT, panel); PrefixList(contents, slider); SetSliderRange(slider, 1.0, 0.0, 0.0); SetSliderValue(slider, hsv[2]); SetVar(slider, REPOBJ, spacePanel); SetMethod(slider, CHANGEDVALUE, ChangeBackgroundColorSlider); SetVar(slider, HELPSTRING, NewString("This slider controls the \ value, or brightness, of the color used to draw the background of the space panel. \ The final color is a combination of this value and the hue and saturation \ given by the Color color wheel.")); /*Make the text box below*/ textBox = NewTextBox(right - SLIDERWIDTH - MINORBORDER, right + MINORBORDER, top - COLORWHEELWIDTH - TEXTBOXSEP - TEXTBOXHEIGHT, top - COLORWHEELWIDTH - TEXTBOXSEP, PLAIN, "Text Value Label", "Value"); SetVar(textBox, PARENT, panel); PrefixList(contents, textBox); SetTextAlign(textBox, CENTERALIGN); /*Cross link the slider and color wheel*/ SetVar(colorWheel, SLIDER, slider); SetVar(slider, COLORWHEEL, colorWheel); /*Make the check box*/ top -= COLORWHEELWIDTH + TEXTBOXSEP + TEXTBOXHEIGHT + MINORBORDER; checkBox = NewCheckBox(left, right, top - CHECKBOXHEIGHT, top, "No background", hasBackground ? false : true); SetVar(checkBox, PARENT, panel); SetVar(checkBox, REPOBJ, spacePanel); SetVar(checkBox, SLIDER, slider); SetVar(checkBox, COLORWHEEL, colorWheel); PrefixList(contents, checkBox); SetMethod(checkBox, CHANGEDVALUE, ChangeNoBackground); SetVar(checkBox, HELPSTRING, NewString("This checkbox controls whether \ a background is shown. If it is selected, no background is shown, and the \ objects behind can be seen.")); /*Link slider and color wheel to check box*/ SetVar(slider, CHECKBOX, checkBox); SetVar(colorWheel, CHECKBOX, checkBox); /*Make check box for show grid*/ left = MAJORBORDER; top = MAJORBORDER + CHECKBOXHEIGHT; right = SPWINWIDTH - MAJORBORDER; bottom = MAJORBORDER; checkBox = NewCheckBox(left, right, bottom, top, "Show grid", GetPredicate(spacePanel, SHOWGRID)); PrefixList(contents, checkBox); SetVar(checkBox, PARENT, panel); SetVar(checkBox, REPOBJ, spacePanel); SetMethod(checkBox, CHANGEDVALUE, ChangeShowGrid); } return (ObjPtr) controlWindow; } static ObjPtr ShowBackSpacePanelControls(spacePanel, windowName) ObjPtr spacePanel; char *windowName; /*Makes a new control window to control a space panel*/ { WinInfoPtr controlWindow; ObjPtr var; ObjPtr panel; ObjPtr corral; ObjPtr contents; real rgb[3], hsv[3]; WinInfoPtr dialogExists; Bool hasBackground; dialogExists = DialogExists((WinInfoPtr) spacePanel, NewString("Controls")); controlWindow = GetDialog((WinInfoPtr) spacePanel, NewString("Controls"), windowName, SPWINWIDTH, SPWINHEIGHT, SPWINWIDTH, SPWINHEIGHT, WINDBUF + WINFIXEDSIZE); if (!dialogExists) { long info; ObjPtr value; ObjPtr checkBox, icon, name, colorBar, titleBox, textBox, button; ObjPtr colorWheel, slider, radioGroup; int left, right, bottom, top; SetVar((ObjPtr) controlWindow, REPOBJ, spacePanel); /*Set help string*/ SetVar((ObjPtr) controlWindow, HELPSTRING, NewString("This window \ shows controls for a space panel. For information about any of the controls \ in the window, use Help In Context on the control.\n")); /*Add in a panel*/ panel = NewPanel(greyPanelClass, 0, SPWINWIDTH, 0, SPWINHEIGHT); if (!panel) { return ObjFalse; } contents = GetVar((ObjPtr) controlWindow, CONTENTS); PrefixList(contents, panel); SetVar(panel, PARENT, (ObjPtr) controlWindow); ContentsExpectWindowSize(controlWindow, SPWINWIDTH, SPWINHEIGHT); contents = GetVar(panel, CONTENTS); /*Add in the group of controls for text color*/ left = MAJORBORDER; top = SPWINHEIGHT - MAJORBORDER; right = SPWINWIDTH - MAJORBORDER; bottom = SPWINHEIGHT - (MAJORBORDER + (COLORWHEELWIDTH + TEXTBOXSEP + TEXTBOXHEIGHT + CHECKBOXHEIGHT + TITLEBOXTOP + 3 * MINORBORDER)); titleBox = NewTitleBox(left, right, bottom, top, "Background"); PrefixList(contents, titleBox); SetVar(titleBox, PARENT, panel); left += MINORBORDER; right -= MINORBORDER; top -= MINORBORDER + TITLEBOXTOP; /*Get the color for priming the controls*/ var = GetVar(spacePanel, BACKGROUND); if (var && IsRealArray(var) && RANK(var) == 1 && DIMS(var)[0] == 3) { Array2CArray(rgb, var); hasBackground = true; } else if (var && IsInt(var)) { rgb[0] = uiColors[GetInt(var)][0] / 255.0; rgb[1] = uiColors[GetInt(var)][1] / 255.0; rgb[2] = uiColors[GetInt(var)][2] / 255.0; hasBackground = true; } else { rgb[0] = rgb[1] = rgb[2] = 0.0; hasBackground = false; } RGB2HSV(&(hsv[0]), &(hsv[1]), &(hsv[2]), (rgb[0]), (rgb[1]), (rgb[2])); /*Make the color wheel*/ colorWheel = NewColorWheel(left, left + COLORWHEELWIDTH, top - COLORWHEELWIDTH, top, "Background Color"); var = NewRealArray(1, 2L); CArray2Array(var, hsv); InhibitLogging(true); SetValue(colorWheel, var); InhibitLogging(false); SetVar(colorWheel, PARENT, panel); SetVar(colorWheel, REPOBJ, spacePanel); PrefixList(contents, colorWheel); SetMethod(colorWheel, CHANGEDVALUE, ChangeBackgroundColorWheel); SetVar(colorWheel, HELPSTRING, NewString("This color wheel controls the \ hue and saturation of the color used to draw the background of the space panel. \ The final color is a combination of this hue and saturation and the value, or brightness, \ given by the Value slider.")); /*Make the text box below*/ textBox = NewTextBox(left, left + COLORWHEELWIDTH, top - COLORWHEELWIDTH - TEXTBOXSEP - TEXTBOXHEIGHT, top - COLORWHEELWIDTH - TEXTBOXSEP, PLAIN, "Background Color Label", "Color"); SetVar(textBox, PARENT, panel); PrefixList(contents, textBox); SetTextAlign(textBox, CENTERALIGN); /*Make the brightness slider*/ slider = NewSlider(right - SLIDERWIDTH, right, top - COLORWHEELWIDTH, top, PLAIN, "Background Value"); SetVar(slider, PARENT, panel); PrefixList(contents, slider); SetSliderRange(slider, 1.0, 0.0, 0.0); SetSliderValue(slider, hsv[2]); SetVar(slider, REPOBJ, spacePanel); SetMethod(slider, CHANGEDVALUE, ChangeBackgroundColorSlider); SetVar(slider, HELPSTRING, NewString("This slider controls the \ value, or brightness, of the color used to draw the background of the space panel. \ The final color is a combination of this value and the hue and saturation \ given by the Color color wheel.")); /*Make the text box below*/ textBox = NewTextBox(right - SLIDERWIDTH - MINORBORDER, right + MINORBORDER, top - COLORWHEELWIDTH - TEXTBOXSEP - TEXTBOXHEIGHT, top - COLORWHEELWIDTH - TEXTBOXSEP, PLAIN, "Text Value Label", "Value"); SetVar(textBox, PARENT, panel); PrefixList(contents, textBox); SetTextAlign(textBox, CENTERALIGN); /*Cross link the slider and color wheel*/ SetVar(colorWheel, SLIDER, slider); SetVar(slider, COLORWHEEL, colorWheel); /*Make check box for show grid*/ left = MAJORBORDER; top = MAJORBORDER + CHECKBOXHEIGHT; right = SPWINWIDTH - MAJORBORDER; bottom = MAJORBORDER; checkBox = NewCheckBox(left, right, bottom, top, "Show grid", GetPredicate(spacePanel, SHOWGRID)); PrefixList(contents, checkBox); SetVar(checkBox, PARENT, panel); SetVar(checkBox, REPOBJ, spacePanel); SetMethod(checkBox, CHANGEDVALUE, ChangeShowGrid); } return (ObjPtr) controlWindow; } static ObjPtr ChangeSpaceTools(toolGroup) ObjPtr toolGroup; /*Changes a space's tools based on toolGroup*/ { ObjPtr value; int oldValue, newValue, index; ObjPtr space; ObjPtr contents; ObjPtr var; ThingListPtr runner; space = GetObjectVar("ChangeSpaceTools", toolGroup, SPACE); if (!space) { return ObjFalse; } value = GetVar(space, EDITTOOL); if (value) { oldValue = GetInt(value); } else { oldValue = -1; } value = GetValue(toolGroup); if (value) { index = GetInt(value); } else { index = 0; } newValue = ST_FINGER; contents = GetListVar("ChangeSpaceTools", toolGroup, CONTENTS); runner = LISTOF(contents); while (runner) { if (!index) { /*Found it*/ var = GetVar(runner -> thing, EDITTOOL); if (var) { newValue = GetInt(var); } break; } --index; runner = runner -> next; } if (oldValue == newValue) { return ObjFalse; } if (oldValue == ST_FLYING) { /*Transition from flying*/ ObjPtr observer; ObjPtr var; real forward[3], up[3]; observer = GetVar(space, OBSERVER); if (observer) { /*Incorporate changes*/ GetAdjustedVectors(forward, up, observer); var = NewRealArray(1, 3L); CArray2Array(var, forward); SetVar(observer, FORWARDVECTOR, var); var = NewRealArray(1, 3L); CArray2Array(var, up); SetVar(observer, UPVECTOR, var); SetVar(observer, ROLL, NULLOBJ); SetVar(observer, PITCH, NULLOBJ); SetVar(observer, AIRSPEED, NULLOBJ); LogObserver(observer); } } if (newValue == ST_FLYING) { /*Transition from flying*/ ObjPtr observer; ObjPtr var; observer = GetVar(space, OBSERVER); if (observer) { /*Incorporate changes*/ SetVar(observer, ROLL, NewReal(0.0)); SetVar(observer, PITCH, NewReal(0.0)); SetVar(observer, AIRSPEED, NewReal(4.0 * AIRSPEEDFACTOR)); LogObserver(observer); } } SetVar(space, EDITTOOL, NewInt(newValue)); return ObjTrue; } ObjPtr ReshapeVisWindow(window, ol, or, ob, ot, nl, nr, nb, nt) ObjPtr window; int ol, or, ob, ot; int nl, nr, nb, nt; /*Reshapes vis window given that ol, or, ob, and ot was the old viewport. Does not redraw anything.*/ { ObjPtr contents; /*DIKEO reshape the space window, if any*/ contents = GetVar(window, CONTENTS); if (contents && IsList(contents)) { ReshapeList(LISTOF(contents), 0, or - ol, 0, ot - ob, 0, nr - nl, 0, nt - nb); } return ObjTrue; } #ifdef CHANGECURSOR static Bool metering; static Bool pointCurrently; static real meterX, meterY, meterZ; static ObjPtr meterObject; static ObjPtr IdleVisWindowCursor(visWindow, x, y) ObjPtr visWindow; int x, y; /*Idles a vis window with a cursor inside*/ { #ifdef GRAPHICS ObjPtr space, var; int left, right, bottom, top; ObjPtr contents; ThingListPtr runner; FuncTyp method; space = GetVar(visWindow, SPACE); if (!space) { return ObjFalse; } var = GetVar(space, EDITTOOL); if (!var) { return ObjFalse; } if (GetInt(var) == ST_FINGER) { FuncTyp method; /*Have to go through the space to find where this is picked*/ Get2DIntBounds(space, &left, &right, &bottom, &top); StartSpace(space, left, right, bottom, top, PICKSPACE, 0); /*Pick the contents of the space*/ contents = GetVar(space, CONTENTS); runner = LISTOF(contents); while (runner) { if (IsObject(runner -> thing)) { PickObject(runner -> thing, PR_CENTER); method = GetMethod(runner -> thing, PICKPOINT); if (method) { (*method)(runner -> thing); } } runner = runner -> next; } StopSpace(PICKSPACE); if (spacePickedObject && (bestPickVertex >= 0)) { /*There is a vertex to highlight*/ method = GetMethod(spacePickedObject, BEGINSTUFFING); if (method) { (*method)(spacePickedObject); method = GetMethod(spacePickedObject, STUFFSELPOINT); if (method) { real px, py, pz; real xnew, ynew, znew, wnew; Matrix projMatrix, viewMatrix, curMatrix; (*method)(spacePickedObject, bestPickVertex, &px, &py, &pz); StartSpace(space, left, right, bottom, top, OVERDRAWSPACE, 0); mmode(MPROJECTION); getmatrix(projMatrix); mmode(MVIEWING); getmatrix(viewMatrix); MULTMATRIX(viewMatrix, projMatrix, curMatrix); StopSpace(OVERDRAWSPACE); xnew = px * curMatrix[0][0] + py * curMatrix[1][0] + pz * curMatrix[2][0] + curMatrix[3][0]; ynew = px * curMatrix[0][1] + py * curMatrix[1][1] + pz * curMatrix[2][1] + curMatrix[3][1]; znew = px * curMatrix[0][2] + py * curMatrix[1][2] + pz * curMatrix[2][2] + curMatrix[3][2]; wnew = px * curMatrix[0][3] + py * curMatrix[1][3] + pz * curMatrix[2][3] + curMatrix[3][3]; xnew /= wnew; ynew /= wnew; znew /= wnew; SetSubPort(left, right, bottom, top); mmode(MPROJECTION); ortho2(-1.0, 1.0, -1.0, 1.0); mmode(MVIEWING); loadmatrix(Identity); OverDraw(true); EraseAll(); SetUIColor(UIWHITE); DrawSpaceLine(-1.0, ynew, 0.0, 1.0, ynew, 0.0); DrawSpaceLine(xnew, -1.0, 0.0, xnew, 1.0, 0.0); OverDraw(false); RestoreSubPort(); } } } else { SetSubPort(left, right, bottom, top); OverDraw(true); EraseAll(); OverDraw(false); RestoreSubPort(); } } #endif return ObjTrue; } static ObjPtr EnterVisWindow(visWindow) ObjPtr visWindow; /*Enters a vis window*/ { metering = true; pointCurrently = false; } static ObjPtr LeaveVisWindow(visWindow) ObjPtr visWindow; /*Leaves a vis window*/ { if (metering && pointCurrently) { OverDraw(true); EraseAll(); OverDraw(false); } metering = false; } #endif WinInfoPtr NewVisWindow(title, flags) char *title; long flags; /*Creates a new visualization window with title title and flags flags*/ { WinInfoPtr visWindow; WinInfoPtr spaceWindow; ObjPtr space, panel, corral, contents, panelContents; ObjPtr button, radioGroup; int l, r, b, t; ObjPtr lights; ThingListPtr runner; ObjPtr spaceContents; visWindow = NewObjWindow(visWindowClass, title, rgbGoodForUI ? flags : flags & ~WINRGB, VWINWIDTH, VWINHEIGHT, SCRWIDTH, SCRHEIGHT); #ifdef CHANGECURSOR SetMethod((ObjPtr) visWindow, IDLECURSOR, IdleVisWindowCursor); SetMethod((ObjPtr) visWindow, ENTERCURSOR, EnterVisWindow); SetMethod((ObjPtr) visWindow, LEAVECURSOR, LeaveVisWindow); #endif SetMinSize(visWindow, 100, 100); SetVar((ObjPtr) visWindow, HIDEPANEL, ObjTrue); DefineMenuItem((ObjPtr) visWindow, WINDOWSMENU, "Show Front Panel Controls", DoShowFrontPanelControls); DefineMenuItem((ObjPtr) visWindow, WINDOWSMENU, "Show Back Panel Controls", DoShowBackPanelControls); DefineMenuItem((ObjPtr) visWindow, WINDOWSMENU, "Show Space Controls", DoShowSpaceControls); DefineMenuItem((ObjPtr) visWindow, WINSIZEMENU, "Tile Full Screen", DoTileFullScreen); DefineMenuItem((ObjPtr) visWindow, WINSIZEMENU, "Tile Video Screen", DoTileVideoScreen); DefineMenuItem((ObjPtr) visWindow, WINSIZEMENU, "PHSCologram Screen", DoPhscoScreen); DefineMenuItem((ObjPtr) visWindow, TEXTMENU, "", 0); contents = GetVar((ObjPtr) visWindow, CONTENTS); ContentsExpectWindowSize(visWindow, VWINWIDTH, VWINHEIGHT); /*Create the space and its associated panels*/ l = VWINTOOLPWIDTH; r = VWINWIDTH - VWINPANELWIDTH; b = 0; t = VWINHEIGHT; if (rgbGoodForUI) { spaceWindow = visWindow; } else { char newName[300]; int x, y; ObjPtr var; real margins[4]; ObjPtr panelContents, textBox; GetWindowOrigin(&x, &y); spaceWindow = NewObjWindow(spaceWindowClass, title, flags | WINFIXEDLOC | WINRGB | WINNOFRAME, r - l, t - b, x + l, y); SetVar((ObjPtr) visWindow, SPACEWINDOW, (ObjPtr) spaceWindow); var = NewList(); PrefixList(var, (ObjPtr) spaceWindow); SetVar((ObjPtr) visWindow, SUBWINDOWS, var); SetVar((ObjPtr) spaceWindow, SUPERWINDOW, (ObjPtr) visWindow); margins[0] = (real) (l); margins[1] = (real) (VWINWIDTH - r); margins[2] = 0.0; margins[3] = 0.0; var = NewRealArray(1, 4L); CArray2Array(var, margins); SetVar((ObjPtr) spaceWindow, SUBWINDOWMARGIN, var); /*Make a dummy panel to put here*/ panel = NewPanel(greyPanelClass, l, r, b, t); if (!panel) { return (WinInfoPtr) 0; } SetVar(panel, PARENT, (ObjPtr) visWindow); PrefixList(contents, panel); panelContents = GetVar(panel, CONTENTS); r = r - l; l = 0; t = t - b; b = 0; /*And a warning text box*/ textBox = NewTextBox(MAJORBORDER, r - MAJORBORDER, MAJORBORDER, t - MAJORBORDER, 0, "Yaha", "In normal operation, you should never see this message. If you can read this, it means \ that something has gone wrong with the way SciAn is stacking its windows. This is most likely due \ to an X windows operation on the windows that SciAn cannot detect.\n\n\ You can probably fix the \ problem for the time being simply by clicking in the title bar of this window \ to pop it to the top.\n\n\ Please report this bug to scian-bugs@scri.fsu.edu."); PrefixList(panelContents, textBox); SetVar(textBox, PARENT, panel); } spaceContents = GetVar((ObjPtr) spaceWindow, CONTENTS); /*Add in the panel behind the space*/ panel = NewPanel(spaceBackPanelClass, l, r, b, t); if (!panel) { return (WinInfoPtr) 0; } SetVar(panel, NAME, ConcatStrings(NewString(title), NewString(" Back Panel"))); SetVar(panel, STICKINESS, NewInt(STICKYLEFT + STICKYRIGHT + STICKYBOTTOM + STICKYTOP)); SetVar(panel, TYPESTRING, NewString("panel")); SetVar(panel, HELPSTRING, NewString("This panel holds 2-dimensional objects \ and is always drawn behind the space.")); SetVar(panel, OWNERWINDOW, (ObjPtr) spaceWindow); #ifdef INTERACTIVE SetMethod(panel, PRESS, PressSpacePanel); #endif #ifndef BOCKA PrefixList(spaceContents, panel); #endif /*Add in a space*/ space = NewSpace(l, r, b, t); if (!space) { return (WinInfoPtr) 0; } SetVar(space, STICKINESS, NewInt(STICKYLEFT + STICKYRIGHT + STICKYBOTTOM + STICKYTOP)); SetVar(space, NAME, ConcatStrings(NewString(title), NewString(" Space"))); SetVar(space, OWNERWINDOW, (ObjPtr) spaceWindow); PrefixList(spaceContents, space); SetVar(space, PARENT, (ObjPtr) spaceWindow); /*Notify the space that the panel is behind the space*/ SetVar(panel, SPACE, space); SetVar(space, BACKPANEL, panel); SetVar(panel, PARENT, space); SetMethod(panel, NEWCTLWINDOW, ShowBackSpacePanelControls); SetMethod(panel, SHOWCONTROLS, NewControlWindow); /*Add in the panel to cover the space*/ panel = NewPanel(spacePanelClass, l, r, b, t); if (!panel) { return (WinInfoPtr) 0; } SetVar(panel, NAME, ConcatStrings(NewString(title), NewString(" Front Panel"))); SetVar(panel, STICKINESS, NewInt(STICKYLEFT + STICKYRIGHT + STICKYBOTTOM + STICKYTOP)); SetVar(panel, TYPESTRING, NewString("panel")); SetVar(panel, HELPSTRING, NewString("This panel holds 2-dimensional objects \ and is always drawn in front of the space.")); SetVar(panel, OWNERWINDOW, (ObjPtr) spaceWindow); SetVar(panel, SPACE, space); #ifdef INTERACTIVE SetMethod(panel, PRESS, PressSpacePanel); #endif #ifndef BOCKA PrefixList(spaceContents, panel); #endif SetVar(panel, PARENT, space); /*Notify the space that the panel covers the space*/ SetVar(space, FRONTPANEL, panel); SetVar(panel, FRONTPANEL, ObjTrue); SetMethod(panel, NEWCTLWINDOW, ShowFrontSpacePanelControls); SetMethod(panel, SHOWCONTROLS, NewControlWindow); /*Give the space to (potentially) both the windows*/ SetVar((ObjPtr) visWindow, SPACE, space); SetVar((ObjPtr) spaceWindow, SPACE, space); /*Add in a tools panel*/ panel = NewPanel(greyPanelClass, 0, VWINTOOLPWIDTH, 0, VWINHEIGHT); if (!panel) { return (WinInfoPtr) 0; } SetVar(panel, STICKINESS, NewInt(STICKYLEFT + STICKYBOTTOM + STICKYTOP)); #ifndef BOCKA PrefixList(contents, panel); #endif SetVar(panel, PARENT, (ObjPtr) visWindow); SetVar(space, TOOLPANEL, panel); SetVar(panel, TYPESTRING, NewString("panel")); SetVar(panel, HELPSTRING, NewString("You can show or hide this panel by choosing the Toggle Panel \ item from the Windows menu.")); panelContents = GetVar(panel, CONTENTS); /*Put tools in the space tools group*/ radioGroup = NewRadioButtonGroup("Space Tools"); SetVar(space, TOOLGROUP, radioGroup); SetVar(radioGroup, HELPSTRING, NewString("This is a group of tools that allow you to modify the \ space using the mouse. To use one of these tools, click on the icon representing \ the tool before clicking in the space. To find out what each tool does, use \ help in context on each individual button.")); SetVar(radioGroup, PARENT, panel); PrefixList(panelContents, radioGroup); SetVar(radioGroup, HALTHELP, ObjTrue); SetVar(radioGroup, STICKINESS, NewInt(STICKYLEFT + STICKYTOP)); /*First the 3-D tools on the left*/ l = VWTOOLBORDER; t = VWINHEIGHT - VWTOOLBORDER; /*Motion/rotation tool*/ button = NewIconButton(l, l + SMALLICONBUTTONSIZE, t - SMALLICONBUTTONSIZE, t, ICONMOVEROTATE, UIYELLOW, "Space Selection", BS_PLAIN); SetVar(button, STICKINESS, NewInt(STICKYLEFT + STICKYTOP)); AddRadioButton(radioGroup, button); SetVar(button, HELPSTRING, NewString("This button chooses the space and space panel selection tool.\n\ \n\ Click and drag within the space using the center mouse button to rotate \ the entire space around the focus point of the observer at the center of the \ space. The space can be rotated around any axis. Hold down the Shift key \ to constrain to rotation around a principal axis of the space. Double-click \ to snap the space to the nearest straight-on orientation. \ If Space Rotation Guides is turned on in the space control panel, you will see the \ virtual trackball as a wire frame sphere. If Rotation Inertia \ is turned on in the space control panel, the space will continue to rotate if you \ give it a spin and let go while moving the mouse.\n\ \n\ Click on an object within the space to select it. Drag after clicking to move \ the objects in the space. If you hold down the shift key while dragging, motion \ will be constrained to one principal axis of the space.\n\ \n\ Both rotation and motion will affect other spaces controlled by the same observer. This \ is because rotation and motion actually change the position of the observer \ within the space.\n\ \n\ Click on a 2-D object in the front or back panel, such as a text box or line, \ to select it. Once an object is selected, an outline with handles will appear \ around the object. You can click and drag the handled to move and resize the \ object. You can also edit text within text objects by clicking and dragging.")); SetVar(button, EDITTOOL, NewInt(ST_FINGER)); t = t - SMALLICONBUTTONSIZE - VWTOOLBORDER; /*Flight tool*/ button = NewIconButton(l, l + SMALLICONBUTTONSIZE, t - SMALLICONBUTTONSIZE, t, ICONPLANE, UIYELLOW, "Flight Simulator", BS_PLAIN); SetVar(button, STICKINESS, NewInt(STICKYLEFT + STICKYTOP)); AddRadioButton(radioGroup, button); SetVar(button, HELPSTRING, NewString("This button chooses the space flight \ simulator. When this tool is chosen, you can fly through the space like an airplane \ using the mouse. This works best when the window is resized to fill the entire \ screen. It is also a good idea to give the observer a wide field of view from \ within the observer control panel.\n\ \n\ To start flying, click the left mouse button in the space. Pull the mouse back \ toward you to climb and push it forward to dive. Move the mouse to the left or right \ to turn. To accelerate, press the up arrow key repeatedly. To decelerate, press the \ down arrow key. When you are done flying, press the left mouse button once more \ in the space.")); SetVar(button, EDITTOOL, NewInt(ST_FLYING)); t = t - SMALLICONBUTTONSIZE - VWTOOLBORDER; #if 0 /*3-D Finger Tool*/ button = NewIconButton(l, l + SMALLICONBUTTONSIZE, t - SMALLICONBUTTONSIZE, t, ICON3DFINGER, UIYELLOW, "Space Selection", BS_PLAIN); SetVar(button, STICKINESS, NewInt(STICKYLEFT + STICKYTOP)); AddRadioButton(radioGroup, button); SetVar(button, HELPSTRING, NewString("This button chooses the space \ selection tool. Use the left mouse button with this tool to select \ visualization objects within the space.\n")); SetVar(button, EDITTOOL, NewInt(ST_3DFINGER)); t = t - SMALLICONBUTTONSIZE - VWTOOLBORDER; #endif #if 0 /*Meter tool*/ button = NewIconButton(l, l + SMALLICONBUTTONSIZE, t - SMALLICONBUTTONSIZE, t, ICONMETER, UIYELLOW, "Data Meter", BS_PLAIN); SetVar(button, STICKINESS, NewInt(STICKYLEFT + STICKYTOP)); AddRadioButton(radioGroup, button); SetVar(button, HELPSTRING, NewString("This button chooses the data meter \ tool, which is not implemented yet.\n")); SetVar(button, EDITTOOL, NewInt(ST_METER)); t = t - SMALLICONBUTTONSIZE - VWTOOLBORDER; #endif #if 0 /*Now the 3-D tools on the right*/ l = 2 * VWTOOLBORDER + SMALLICONBUTTONSIZE; t = VWINHEIGHT - VWTOOLBORDER; /*2-D finger tool*/ button = NewIconButton(l, l + SMALLICONBUTTONSIZE, t - SMALLICONBUTTONSIZE, t, ICONFINGER, UIYELLOW, "Panel Selection", BS_PLAIN); SetVar(button, STICKINESS, NewInt(STICKYLEFT + STICKYTOP)); AddRadioButton(radioGroup, button); SetVar(button, HELPSTRING, NewString("This button chooses the space panel selection tool.\ Use this tool to select and move objects on the front or back panels of the space.")); SetVar(button, EDITTOOL, NewInt(ST_FINGER)); t = t - SMALLICONBUTTONSIZE - VWTOOLBORDER; #endif /*Annotation tool*/ button = NewIconButton(l, l + SMALLICONBUTTONSIZE, t - SMALLICONBUTTONSIZE, t, ICONANNOTATION, UIYELLOW, "Draw Annotation", BS_PLAIN); SetVar(button, STICKINESS, NewInt(STICKYLEFT + STICKYTOP)); AddRadioButton(radioGroup, button); SetVar(button, HELPSTRING, NewString("This button chooses the annotation drawing tool. \ Use this button to drag out annotation boxes on the panels of the space. \ Normally this tool draws on the front panel. Hold down the Alt or Ctrl key while drawing to draw \ on the back panel. When the box has been drawn, enter text by typing. The appearance of the boxes \ can be modified by selecting them and choosing Show Controls \ from the Objects menu.")); SetVar(button, EDITTOOL, NewInt(ST_ANNOTATION)); t = t - SMALLICONBUTTONSIZE - VWTOOLBORDER; button = NewIconButton(l, l + SMALLICONBUTTONSIZE, t - SMALLICONBUTTONSIZE, t, ICONRECTANGLE, UIYELLOW, "Draw Rectangle", BS_PLAIN); SetVar(button, STICKINESS, NewInt(STICKYLEFT + STICKYTOP)); AddRadioButton(radioGroup, button); SetVar(button, HELPSTRING, NewString("This button chooses the rectangle drawing tool. \ Use this button to drag out rectangular boxes on the panels of the space. \ Normally this tool draws on the front panel. Hold down the Alt or Ctrl key while drawing to draw \ on the back panel. The appearance of the boxes can be modified by selecting them and choosing Show Controls \ from the Objects menu.")); SetVar(button, EDITTOOL, NewInt(ST_RECTANGLE)); t = t - SMALLICONBUTTONSIZE - VWTOOLBORDER; button = NewIconButton(l, l + SMALLICONBUTTONSIZE, t - SMALLICONBUTTONSIZE, t, ICONLINE, UIYELLOW, "Draw Line", BS_PLAIN); SetVar(button, STICKINESS, NewInt(STICKYLEFT + STICKYTOP)); AddRadioButton(radioGroup, button); SetVar(button, HELPSTRING, NewString("This button chooses the line drawing tool. \ Use this button to drag out lines on the panels of the space. \ Normally this tool draws on the front panel. Hold down the Alt or Ctrl key while drawing to draw \ on the back panel. The appearance of the lines can be modified by selecting them and choosing Show Controls \ from the Objects menu. You can also add arrowheads from within this control panel.")); SetVar(button, EDITTOOL, NewInt(ST_LINE)); t = t - SMALLICONBUTTONSIZE - VWTOOLBORDER; button = NewIconButton(l, l + SMALLICONBUTTONSIZE, t - SMALLICONBUTTONSIZE, t, ICONCLOCK, UIYELLOW, "Draw Time Readout", BS_PLAIN); SetVar(button, STICKINESS, NewInt(STICKYLEFT + STICKYTOP)); AddRadioButton(radioGroup, button); SetVar(button, HELPSTRING, NewString("This button chooses the time readout drawing tool. \ Use this button to drag out time readouts on the panels of the space. The time readout is \ a text box which always shows the current time in the space. To change the \ format in which the time is displayed, show the control panel by \ selecting the readout and choosing Show Controls from the Objects menu. \ Normally this tool draws on the front panel. Hold down the Alt or Ctrl key while drawing to draw \ on the back panel.")); SetVar(button, EDITTOOL, NewInt(ST_TIME_READOUT)); /*Give the radio group a default value*/ SetValue(radioGroup, NewInt(ST_FINGER)); SetVar(space, EDITTOOL, NewInt(ST_FINGER)); SetVar(radioGroup, SPACE, space); SetMethod(radioGroup, CHANGEDVALUE, ChangeSpaceTools); /*Add in an object control panel*/ panel = NewPanel(greyPanelClass, VWINWIDTH - VWINPANELWIDTH, VWINWIDTH, 0, VWINHEIGHT); if (!panel) { return (WinInfoPtr) 0; } SetVar(panel, STICKINESS, NewInt(STICKYRIGHT + STICKYBOTTOM + STICKYTOP)); #ifndef BOCKA PrefixList(contents, panel); #endif SetVar(panel, PARENT, (ObjPtr) visWindow); SetVar(space, OBJPANEL, panel); SetVar(panel, TYPESTRING, NewString("panel")); SetVar(panel, HELPSTRING, NewString("You can show or hide this panel by choosing the Toggle Panel \ item from the Windows menu.")); contents = GetVar(panel, CONTENTS); if (!contents) { return (WinInfoPtr) 0; } /*Add in an icon corral*/ corral = NewIconCorral(visCorralClass, MINORBORDER, VWINPANELWIDTH - MINORBORDER, MINORBORDER, VWINHEIGHT - MINORBORDER, BARRIGHT + BARBOTTOM); if (!corral) { return (WinInfoPtr) 0; } SetVar((ObjPtr) visWindow, CORRAL, corral); SetVar(corral, NAME, NewString("Space Contents")); SetVar(corral, HELPSTRING, NewString("This corral shows the objects and space controllers present \ in this visualization window. You can drag new datasets from the datasets window \ into this corral to visualize them along with the other objects. You can also \ drag in observer, renderer, clock, and lights icons. There can only be one \ observer, renderer, and clock in a space, so dragging in these will replace the \ existing controller.\n")); SetVar(corral, STICKINESS, NewInt(STICKYLEFT + STICKYRIGHT + STICKYBOTTOM + STICKYTOP)); PrefixList(contents, corral); SetVar(corral, PARENT, panel); /*Splice the space to the corral*/ SetVar(corral, SPACE, space); SetVar(space, CORRAL, corral); /*Add an observer*/ AddControllerToSpace(NewObserver(), space, corral, NULLOBJ); /*Add a renderer*/ AddControllerToSpace(NewRenderer(), space, corral, NULLOBJ); /*Add some lights*/ #ifdef GRAPHICS if (hasRGB) #endif { lights = NewLights(); runner = LISTOF(lights); while (runner) { AddControllerToSpace(runner -> thing, space, corral, NULLOBJ); runner = runner -> next; } } /*Add a clock*/ AddControllerToSpace(NewClock(), space, corral, NULLOBJ); return visWindow; } ObjPtr FindSpace(win) WinInfoPtr win; /*Finds the space in win*/ { return GetVar((ObjPtr) win, SPACE); } ObjPtr FindObserver(win) WinInfoPtr win; /*Finds the observer in win*/ { ObjPtr space, retVal; retVal = GetVar((ObjPtr) win, REPOBJ); if (retVal && (IsObserver(retVal))) { return retVal; } space = FindSpace(win); if (space) { retVal = GetObjectVar("FindObserver", space, OBSERVER); } else { ReportError("FindObserver", "No space in window"); } return retVal; } #ifdef PROTO void RotateOrthoWindow(WinInfoPtr window, char axis, float amount) #else void RotateOrthoWindow(window, axis, amount) WinInfoPtr window; char axis; float amount; #endif /*Rotates the observer in window about orthogonal axis axis by amount, and stops continuous rotation.*/ { ObjPtr observer; real av[3]; observer = FindObserver(window); if (!observer) return; switch(axis) { case 'x': case 'X': av[0] = 1.0; av[1] = 0.0; av[2] = 0.0; break; case 'y': case 'Y': av[0] = 0.0; av[1] = 1.0; av[2] = 0.0; break; case 'z': case 'Z': av[0] = 0.0; av[1] = 0.0; av[2] = 1.0; break; default: ReportError("RotateOrthoWindow", "Bad axis"); return; } RotateObserver(observer, av, -amount * M_PI / 180.0, false); } static ObjPtr ChangeWindowToRGB(window, button) WinInfoPtr window; int button; /*If button is 1, changes the color mode of window to RGB*/ { if (button == 1) { ObjPtr radio = NULLOBJ; SelWindow(window); if (selWinInfo) { radio = GetVar((ObjPtr) selWinInfo, CMODERADIO); } if (radio) { SetValue(radio, NewInt(1)); } return ObjTrue; } else { return ObjFalse; } } ObjPtr SetVisWindowRGB(window) ObjPtr window; /*Deferred message to choose whether to make window RGB or not*/ { #ifdef GRAPHICS char tempBuf[400]; WinInfoPtr errWindow; WinInfoPtr spaceWindow; /*See if the window is already RGB*/ spaceWindow = (WinInfoPtr) GetVar(window, SPACEWINDOW); if (!spaceWindow) { spaceWindow = (WinInfoPtr) window; } if (spaceWindow -> flags & WINRGB) { return; } if (!hasRGB) { return; } sprintf(tempBuf, "You will see no effects from this action in window %s \ until you change it to full color mode. Would you like to change it now?", ((WinInfoPtr) window) -> winTitle); errWindow = AlertUser(UICAUTIONALERT, (WinInfoPtr) window, tempBuf, ChangeWindowToRGB, 2, "Cancel", "Change"); SetVar((ObjPtr) errWindow, HELPSTRING, NewString("Visualization windows have two color modes: full color and color map. \ Full color specifies full 24-bit RGB color. Color map specifies mapped colors using a color \ table. Some features, such as lighting, only work on windows set to full color mode. \ If you click on the Change button, the affected window will automatically be set \ to this mode.")); #endif } void InitVisWindows() /*Initializes the vis windows*/ { visualizeAsList = NewList(); AddToReferenceList(visualizeAsList); visWindowClass = NewObject(objWindowClass, 0); AddToReferenceList(visWindowClass); SetVar(visWindowClass, CLASSID, NewInt(CLASS_VISWINDOW)); SetVar(visWindowClass, HELPSTRING, NewString("This is a visualizaton window. On the right is a panel which \ shows the visualization objects shown in the window, the controllers which \ affect the appearance of the object, and some buttons which affect the window \ as a whole or the selected icons. If this panel is not shown, it can be brought \ back with the Toggle Panel item in the Window menu. On the left is a \ 3-dimensional space in which \ the visualization object are shown. There is one clear panel in front of the and \ one clear panel behind the space. These panels are used to hold 2-dimensional \ objects such as clock readouts and text boxes, which can be created and modified \ with items in the Text menu.")); #if 0 /*DIKEO I have decided to give up the RGB message*/ SetMethod(visWindowClass, SETRGBMESSAGE, SetVisWindowRGB); #endif SetMethod(visWindowClass, HIDEPANEL, HideVisWindowPanel); SetMethod(visWindowClass, SHOWPANEL, ShowVisWindowPanel); SetMethod(visWindowClass, RESHAPE, ReshapeVisWindow); spaceWindowClass = NewObject(objWindowClass, 0); AddToReferenceList(spaceWindowClass); SetVar(spaceWindowClass, HELPSTRING, NewString("This is a visualizaton window. On the right is a panel which \ shows the visualization objects shown in the window, the controllers which \ affect the appearance of the object, and some buttons which affect the window \ as a whole or the selected icons. If this panel is not shown, it can be brought \ back with the Toggle Panel item in the Window menu. On the left is a \ 3-dimensional space in which \ the visualization object are shown. There is one clear panel in front of the and \ one clear panel behind the space. These panels are used to hold 2-dimensional \ objects such as clock readouts and text boxes, which can be created and modified \ with items in the Text menu.")); /*Class for the corral in a vis window*/ visCorralClass = NewObject(corralClass, 0); AddToReferenceList(visCorralClass); SetMethod(visCorralClass, DROPINCONTENTS, DropInVisCorral); } void KillVisWindows() /*Kills the vis windows*/ { DeleteThing(visCorralClass); DeleteThing(spaceWindowClass); DeleteThing(visWindowClass); DeleteThing(visualizeAsList); }