|
/*ScianVisSticks.c
November 9, 1992
Eric Pepke
Numbers visualization object in SciAn*/
#include "Scian.h"
#include "ScianTypes.h"
#include "ScianArrays.h"
#include "ScianWindows.h"
#include "ScianTextBoxes.h"
#include "ScianButtons.h"
#include "ScianTitleBoxes.h"
#include "ScianObjWindows.h"
#include "ScianIcons.h"
#include "ScianColors.h"
#include "ScianControls.h"
#include "ScianLists.h"
#include "ScianSliders.h"
#include "ScianIDs.h"
#include "ScianDatasets.h"
#include "ScianPictures.h"
#include "ScianDialogs.h"
#include "ScianErrors.h"
#include "ScianComplexControls.h"
#include "ScianMethods.h"
#include "ScianStyle.h"
#include "ScianVisObjects.h"
#include "ScianVisNumbers.h"
#include "ScianDraw.h"
#include "ScianTemplates.h"
#include "ScianTemplateHelper.h"
#include "ScianTimers.h"
#include "ScianSpaces.h"
#include "ScianDrawings.h"
ObjPtr visNumbers; /*Class for numbers object*/
static ObjPtr ChangeNumberFormat(textBox)
ObjPtr textBox;
/*Changes a numeric display's FORMAT according to textBox*/
{
ObjPtr repObj;
repObj = GetObjectVar("ChangeNumberFormat", textBox, REPOBJ);
if (!repObj) return ObjFalse;
SetVar(repObj, FORMAT, GetValue(textBox));
ImInvalid(repObj);
return ObjTrue;
}
static ObjPtr AddNumbersControls(object, panelContents)
ObjPtr object, panelContents;
/*Adds controls to a numbers object*/
{
ObjPtr titleBox, textBox, checkBox, slider, colorWheel;
ObjPtr var;
real rgb[3], hsv[3];
Bool hasBackground;
ObjPtr corral, icon, name;
ObjPtr numbersField;
ObjPtr defaultIcon;
/*Add in the corral*/
corral = NewIconCorral(NULLOBJ,
MAJORBORDER, MAJORBORDER + ONECORRALWIDTH,
CWINHEIGHT - MAJORBORDER - ONECORRALHEIGHT,
CWINHEIGHT - MAJORBORDER, 0);
SetVar(corral, SINGLECORRAL, ObjTrue);
SetVar(corral, TOPDOWN, ObjTrue);
SetVar(corral, NAME, NewString("Number Field"));
SetVar(corral, HELPSTRING,
NewString("This corral shows the dataset that is being used to make \
the numeric display. The value shown and the position display, if any, is \
calculated from this field. The color of the position display is calculated \
using the Color Field, available in the Color control set."));
PrefixList(panelContents, corral);
SetVar(corral, PARENT, panelContents);
SetVar(corral, REPOBJ, object);
SetMethod(corral, DROPINCONTENTS, DropInMainDatasetCorral);
/*Create the numbers source text box*/
textBox = NewTextBox(MAJORBORDER, MAJORBORDER + ONECORRALWIDTH,
CWINHEIGHT - MAJORBORDER - ONECORRALHEIGHT - TEXTBOXSEP - TEXTBOXHEIGHT,
CWINHEIGHT - MAJORBORDER - ONECORRALHEIGHT - TEXTBOXSEP,
0, "Number Field Text", "Number Field");
PrefixList(panelContents, textBox);
SetVar(textBox, PARENT, panelContents);
SetTextAlign(textBox, CENTERALIGN);
/*Put in an icon that represents the field*/
numbersField = GetVar(object, NUMBERSFIELD);
name = GetVar(numbersField, NAME);
defaultIcon = GetVar(numbersField, DEFAULTICON);
if (defaultIcon)
{
icon = NewObject(defaultIcon, 0);
SetVar(icon, NAME, name);
}
else
{
icon = NewIcon(0, 0, ICONQUESTION, GetString(name));
}
SetVar(icon, ICONLOC, NULLOBJ);
SetVar(icon, REPOBJ, numbersField);
DropIconInCorral(corral, icon);
/*Add in the group of controls for text color*/
titleBox = TemplateTitleBox(VisNumbersTemplate, "Text");
SetVar(titleBox, PARENT, panelContents);
PrefixList(panelContents, titleBox);
/*Get the color for priming the controls*/
MakeVar(object, COLOR);
var = GetVar(object, 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("AddNumbersControls", "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 = TemplateColorWheel(VisNumbersTemplate, "Text Color");
var = NewRealArray(1, 2L);
CArray2Array(var, hsv);
SetValue(colorWheel, var);
SetVar(colorWheel, PARENT, panelContents);
SetVar(colorWheel, REPOBJ, object);
PrefixList(panelContents, 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 numeric 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 = TemplateTextBox(VisNumbersTemplate, "Text Color Label", PLAIN, "Color");
SetVar(textBox, PARENT, panelContents);
PrefixList(panelContents, textBox);
SetTextAlign(textBox, CENTERALIGN);
/*Make the brightness slider*/
slider = TemplateSlider(VisNumbersTemplate, "Text Color Value", PLAIN);
SetVar(slider, PARENT, panelContents);
PrefixList(panelContents, slider);
SetSliderRange(slider, 1.0, 0.0, 0.0);
SetSliderValue(slider, hsv[2]);
SetVar(slider, REPOBJ, object);
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 numeric 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 = TemplateTextBox(VisNumbersTemplate, "Text Value Label", PLAIN, "Value");
SetVar(textBox, PARENT, panelContents);
PrefixList(panelContents, textBox);
SetTextAlign(textBox, CENTERALIGN);
/*Cross link the slider and color wheel*/
SetVar(colorWheel, SLIDER, slider);
SetVar(slider, COLORWHEEL, colorWheel);
/*Make the background controls*/
titleBox = TemplateTitleBox(VisNumbersTemplate, "Background");
SetVar(titleBox, PARENT, panelContents);
PrefixList(panelContents, titleBox);
/*Get the color for priming the controls*/
MakeVar(object, BACKGROUND);
var = GetVar(object, 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 = TemplateColorWheel(VisNumbersTemplate, "Background Color");
var = NewRealArray(1, 2L);
CArray2Array(var, hsv);
SetValue(colorWheel, var);
SetVar(colorWheel, PARENT, panelContents);
SetVar(colorWheel, REPOBJ, object);
PrefixList(panelContents, 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 numeric 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 = TemplateTextBox(VisNumbersTemplate, "Background Color Label", PLAIN, "Color");
SetVar(textBox, PARENT, panelContents);
PrefixList(panelContents, textBox);
SetTextAlign(textBox, CENTERALIGN);
/*Make the brightness slider*/
slider = TemplateSlider(VisNumbersTemplate, "Background Value", PLAIN);
SetVar(slider, PARENT, panelContents);
PrefixList(panelContents, slider);
SetSliderRange(slider, 1.0, 0.0, 0.0);
SetSliderValue(slider, hsv[2]);
SetVar(slider, REPOBJ, object);
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 numeric 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 = TemplateTextBox(VisNumbersTemplate, "Background Value Label", PLAIN, "Value");
SetVar(textBox, PARENT, panelContents);
PrefixList(panelContents, textBox);
SetTextAlign(textBox, CENTERALIGN);
/*Cross link the slider and color wheel*/
SetVar(colorWheel, SLIDER, slider);
SetVar(slider, COLORWHEEL, colorWheel);
/*Make the check box*/
checkBox = TemplateCheckBox(VisNumbersTemplate, "No background", hasBackground ? false : true);
SetVar(checkBox, PARENT, panelContents);
SetVar(checkBox, REPOBJ, object);
SetVar(checkBox, SLIDER, slider);
SetVar(checkBox, COLORWHEEL, colorWheel);
PrefixList(panelContents, 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);
/*Create the format text box*/
textBox = TemplateTextBox(VisNumbersTemplate, "Format:", PLAIN, "Format:");
PrefixList(panelContents, textBox);
SetVar(textBox, PARENT, panelContents);
/*Create the enter format text box*/
MakeVar(object, FORMAT);
var = GetVar(object, FORMAT);
textBox = TemplateTextBox(VisNumbersTemplate, "Format Text",
EDITABLE + WITH_PIT + ONE_LINE,
var ? GetString(var): "");
PrefixList(panelContents, textBox);
SetVar(textBox, PARENT, panelContents);
SetVar(textBox, REPOBJ, object);
SetMethod(textBox, CHANGEDVALUE, ChangeNumberFormat);
SetVar(textBox, HELPSTRING, NewString(
"This text box contains the format used to print the numeric value \
in the field. It works very much like the UNIX function printf, except that \
all conversions in the field refer to the same number."));
return ObjTrue;
}
static ObjPtr NumbersInit(numbers)
ObjPtr numbers;
/*Initializes a numbers object*/
{
ObjPtr repObj, var;
/*Set the format to the dataset name*/
repObj = GetVar(numbers, NUMBERSFIELD);
if (repObj)
{
ObjPtr ds;
ds = repObj;
while (repObj = GetVar(ds, MAINDATASET))
{
ds = repObj;
}
MakeVar(ds, NAME);
var = GetVar(ds, NAME);
if (var)
{
sprintf(tempStr, "%s=%%g", GetString(var));
SetVar(numbers, FORMAT, NewString(tempStr));
}
if (0 == (GetDatasetInfo(repObj) & DS_HASFORM))
{
SetVar(numbers, ABORTCONTROLS, ObjTrue);
}
}
return ObjTrue;
}
static ObjPtr SetNumbersMainDataset(visObj, dataSet)
ObjPtr visObj, dataSet;
/*Sets the main data set of visObj to dataSet*/
{
SetVar(visObj, MAINDATASET, dataSet);
SetVar(visObj, NUMBERSFIELD, dataSet);
return ObjTrue;
}
static ObjPtr MakeReadoutValue(readout)
ObjPtr readout;
/*Makes the VALUE of a readout*/
{
ObjPtr var, format, repObj;
real value;
char s[400];
repObj = GetObjectVar("MakeReadoutValue", readout, REPOBJ);
if (!repObj)
{
return ObjFalse;
}
MakeVar(repObj, VALUE);
var = GetVar(repObj, VALUE);
if (!var)
{
value = 0.0;
}
else
{
value = GetReal(var);
}
MakeVar(readout, FORMAT);
format = GetVar(readout, FORMAT);
if (format)
{
PrintClock(s, GetString(format), value);
}
else
{
sprintf(s, "%#.2f", time);
}
SetVar(readout, VALUE, NewString(s));
return ObjTrue;
}
static ObjPtr MakeNumbersReadoutAppearance(readout)
ObjPtr readout;
/*Dummy make for numbers readout appearance*/
{
SetVar(readout, APPEARANCE, ObjTrue);
ImInvalid(readout);
return ObjTrue;
}
static ObjPtr MakeNumbersReadoutColor(readout)
ObjPtr readout;
/*Makes the COLOR of a numbers readout*/
{
ObjPtr repObj;
repObj = GetVar(readout, REPOBJ);
if (repObj)
{
SetVar(readout, COLOR, GetVar(repObj, COLOR));
}
return ObjTrue;
}
static ObjPtr MakeNumbersReadoutBackground(readout)
ObjPtr readout;
/*Makes the BACKGROUND of a numbers readout*/
{
ObjPtr repObj;
repObj = GetVar(readout, REPOBJ);
if (repObj)
{
SetVar(readout, BACKGROUND, GetVar(repObj, BACKGROUND));
}
return ObjTrue;
}
static ObjPtr MakeNumbersReadoutFormat(readout)
ObjPtr readout;
/*Makes the FORMAT of a numbers readout*/
{
ObjPtr repObj;
repObj = GetVar(readout, REPOBJ);
if (repObj)
{
SetVar(readout, FORMAT, GetVar(repObj, FORMAT));
}
return ObjTrue;
}
#ifdef PROTO
static ObjPtr NewNumericReadout(int left, int right, int bottom, int top, char *name, ObjPtr space)
#else
static ObjPtr NewNumericReadout(left, right, bottom, top, name, space)
int left, right, bottom, top;
char *name;
ObjPtr space;
/*Returns a new numeric readout*/
#endif
{
ObjPtr readout;
readout = NewTextBox(left, right, bottom, top, ADJUSTABLE, name, "");
#if 0
SetMethod(readout, DELETEICON, DeleteClockReadout);
#endif
DeclareDependency(readout, VALUE, FORMAT);
SetVar(readout, SPACE, space);
SetVar(readout, REPOBJONLY, ObjTrue);
DeclareIndirectDependency(readout, VALUE, SPACE, TIME);
DeclareIndirectDependency(readout, VALUE, REPOBJ, VALUE);
#if 0
SetMethod(clockThere, NEWCTLWINDOW, ShowClockDisplayControls);
#endif
SetMethod(readout, VALUE, MakeReadoutValue);
SetVar(readout, HELPSTRING, NewString("This numeric readout displays \
a single scalar value from a dataset. The display format is controlled by the Format \
text box in the readout's control panel.\n"));
DeclareIndirectDependency(readout, APPEARANCE, REPOBJ, SELECTED);
DeclareDependency(readout, APPEARANCE, COLOR);
DeclareDependency(readout, APPEARANCE, BACKGROUND);
DeclareIndirectDependency(readout, APPEARANCE, REPOBJ, SELECTED);
SetMethod(readout, APPEARANCE, MakeNumbersReadoutAppearance);
DeclareIndirectDependency(readout, COLOR, REPOBJ, COLOR);
SetMethod(readout, COLOR, MakeNumbersReadoutColor);
DeclareIndirectDependency(readout, FORMAT, REPOBJ, FORMAT);
SetMethod(readout, FORMAT, MakeNumbersReadoutFormat);
DeclareIndirectDependency(readout, BACKGROUND, REPOBJ, BACKGROUND);
SetMethod(readout, BACKGROUND, MakeNumbersReadoutBackground);
return readout;
}
int nNumericReadouts = 0;
static ObjPtr DroppedNumbersInSpace(numbers, space)
ObjPtr numbers, space;
/*Called when a numbers object is dropped in a space*/
{
ObjPtr frontPanel;
ObjPtr screenObject;
char name[256];
ObjPtr var;
frontPanel = GetVar(space, FRONTPANEL);
if (!frontPanel)
{
return ObjFalse;
}
sprintf(name, "Numeric readout text %d", ++nNumericReadouts);
screenObject = NewNumericReadout(20, 380, 20, 80, name, space);
SetMethod(screenObject, PUSHTOBOTTOM, PushDrawingToBottom);
SetMethod(screenObject, BRINGTOTOP, BringDrawingToTop);
SetMethod(screenObject, MOVETOBACKPANEL, MoveDrawingToBackPanel);
SetMethod(screenObject, MOVETOFRONTPANEL, MoveDrawingToFrontPanel);
SetVar(screenObject, REPOBJ, numbers);
SetTextColor(screenObject, NewInt(UIWHITE));
ImInvalid(screenObject);
SetTextFont(screenObject, ANNOTFONT);
SetTextSize(screenObject, ANNOTFONTSIZE);
SetVar(screenObject, STICKINESS, NewInt(FLOATINGLEFT + FLOATINGRIGHT + FLOATINGTOP + FLOATINGBOTTOM));
PrefixList(GetVar(frontPanel, CONTENTS), screenObject);
SetVar(screenObject, PARENT, frontPanel);
SetVar(numbers, READOUT, screenObject);
return ObjTrue;
}
static ObjPtr MakeNumbersValue(readout)
ObjPtr readout;
/*Makes a readout's value*/
{
ObjPtr value;
ObjPtr field;
long dummy;
real sample;
field = GetVar(readout, NUMBERSFIELD);
if (!field)
{
return ObjFalse;
}
SetCurField(FIELD1, field);
sample = SelectFieldScalar(FIELD1, &dummy);
SetVar(readout, VALUE, NewReal(sample));
return ObjTrue;
}
void InitNumbers()
/*Initializes numbers visualization object*/
{
ObjPtr icon;
/*Class for a numberic display*/
visNumbers = NewObject(visClass, 0);
AddToReferenceList(visNumbers);
SetVar(visNumbers, NAME, NewString("Number"));
SetVar(visNumbers, COLOR, NewInt(UIWHITE));
SetMethod(visNumbers, INITIALIZE, NumbersInit);
SetVar(visNumbers, DEFAULTICON, icon = NewObject(visIcon, 0));
SetVar(icon, WHICHICON, NewInt(ICONANNOTATION));
SetVar(icon, NAME, NewString("Number"));
SetVar(icon, HELPSTRING,
NewString("This icon represents a numberic value display object. \
This object can show the numeric value of any single value in a scalar dataset."));
SetMethod(visNumbers, SETMAINDATASET, SetNumbersMainDataset);
SetMethod(visNumbers, ADDCONTROLS, AddNumbersControls);
icon = NewIcon(0, 0, ICONANNOTATION, "Number");
SetVar(icon, HELPSTRING,
NewString("Click on this icon to see a panel of controls for the numeric display."));
SetVar(visNumbers, CONTROLICON, icon);
SetMethod(visNumbers, DROPPEDINSPACE, DroppedNumbersInSpace);
DeclareIndirectDependency(visNumbers, VALUE, NUMBERSFIELD, CURDATA);
SetMethod(visNumbers, VALUE, MakeNumbersValue);
DefineVisMapping(DS_HASFIELD | DS_HASFORM | DS_UNSTRUCTURED, 0, -1, 1, visNumbers);
DefineVisMapping(DS_HASFIELD | DS_UNSTRUCTURED, 0, -1, 1, visNumbers);
DefineVisMapping(DS_HASFIELD | DS_HASFORM, 0, -1, 1, visNumbers);
DefineVisMapping(DS_HASFIELD, 0, -1, 1, visNumbers);
}
void KillNumbers()
/*Kills sticks visualization*/
{
DeleteThing(visNumbers);
}
|