|
|
|
The following source code can be used to start the development of XY application.
The aim of the test program is to draw the graph below.
Remark: In this application, the IUP widget toolkit will be used only
to offer menus, buttons and canvases. The IUP canvas will be associated to a CD
device, where the graph will be drawn.
As a start, programmers should declare que include files needed.
#include "iup.h" // IUP #include "cd.h" // CD #include "cdiup.h" // IUP + CD #include "xy.h" // XY #include "xyserfil.h" // my own series |
To define the titles, just declare two text objects:
XYText tipo_de_curva(
"Curva de Destilação",
XY_BLACK,
XYText::large,
XYText::helvetica,
XYText::italic,
XYText::north,
XYText::horizontal,
xytrue);
XYText periodo(
"Amostra do Mês de Junho/96",
XY_BLUE,
XYText::standard,
XYText::timesRoman,
XYText::bold,
XYText::north,
XYText::horizontal);
|
Then, the axes should be declared (linear). Note that some definitions should be made before! They correspond to the axes' titles and decorator scales.
| The titles are text objects (just like stated before). | |
| The decorators specify the numeric, date/time or string format associated to values.As the decorators refer to string transformation, it should be associated to a scale text object. So, these text objects should be defined before! |
// Defining text scales...
XYText escala_porcentagem(
XY_BLACK,
XYText::small,
XYText::timesRoman,
XYText::plain,
XYText::north,
XYText::horizontal);
XYText escala_temperatura(
XY_BLACK,
XYText::small,
XYText::timesRoman,
XYText::plain,
XYText::east,
XYText::horizontal);
// Defining scales... (0.1 precision)
XYNumericalScaleDecorator decorador_porcentagem(
"%.1f", &escala_porcentagem);
XYNumericalScaleDecorator decorador_temperatura(
"%.1f", &escala_temperatura);
// Defining titles...
XYText tit_porcentagem (
"Porcentagem (%)",
0.5, 0.15,
XY_RED,
XYText::standard,
XYText::timesRoman,
XYText::plain,
XYText::center,
XYText::horizontal);
XYText tit_temperatura (
"Graus Centígrados",
0.03, 0.5,
XY_RED,
XYText::standard,
XYText::timesRoman,
XYText::plain,
XYText::center,
XYText::vertBotTop);
// Finally, defining axes...
XYLinearAxis eixo_porcentagem(
0.0, 96.0,
0.11, 0.2,
XY_RED,
0.7,
0.0,
4.,
&decorator_porcentagem,
&tit_porcentagem);
XYLinearAxis eixo_temperatura(
-300, 950,
0.11, 0.2,
XY_RED,
0.6,
90.0,
50.,
&decorator_temperatura,
&tit_temperatura);
|
Then, the programmer can set two grid objects that will be plot inside the graph. Each grid is associated to one direction (horizontal or vertical).
XYGrid grv ( 0., 96., 0., XY_GRAY, 0., 4.); XYGrid grh (-300., 950., -300., XY_GRAY, 90., 50.); |
After the axes definition, the new curve can be assingned to them. This definition is divided in two parts:
| series definition - a XYSerie object should be created. This object provides the data set. | |
| mask definition - the data representation (lines, marks etc). |
In our example, the data set is represented by the variable arquivo, provided by the class XYSeriesFile. Check others tutorial sections fo detailed explanation on how building application series.
// this object will ready the content of "dado.dat" file
XYSeriesFile arquivo ("dado.dat");
|
For this application, a simple line mask is set with three attributes: a title, a series and two axes.
| The title is a common text object (created for this purpose). This text is used at the graph legend. | |
| The series is the arquivo variable. | |
| The axes were already described before. |
// Defining the curve title...
XYText mask_titulo(
"Óleo CRU",
XY_BLACK,
XYText::tile,
XYText::timesRoman,
XYText::plain,
XYText::north,
XYText::horizontal);
// Defining line mask
XYCartesianLineMask marquivo(
&mask_titulo, // title
&arquivo, // series
&eixo_porcentagem, &eixo_temperatura, // axes
XY_RED,
1,
XYCartesianLineMask::continuous);
|
A legend can construted with a simple constructor.
XYLegend legend (0.83, 0.3, 1, 1); |
At last, the graph can be defined. This time, the constructor is called inside the main function. Then, the following declaration builds only a pointer.
XYCartesian* grafico = NULL; |
After the graph construction, a special redraw callback should be set to force a graph repaint when the IUP/CD canvas is exposed. The following function uses the IUP callback paradigm: It clears and redraw the graph.
int frepaint (Ihandle *) {
grafico->clear();
grafico->draw();
return IUP_DEFAULT;
}
|
void main(void){
// Initializing IUP anda building a simple dialog...
IupOpen ();
Ihandle *c = IupCanvas ("arepaint");
Ihandle *d = IupDialog (c);
IupSetAttributes (d," SIZE = 400x300, TITLE = XY++");
IupSetFunction ("arepaint", (Icallback) frepaint);
IupMap(d);
// Constructing the graph:
// Association to "c": the IUP canvas
// Assoctiation to the grids declared before
grafico = new XYCartesian (c, 0.0, 0.0, 1.0, 1.0, &grv, &grh);
// Setting titles...
grafico->insert (&período);
grafico->insert (&tipo_de_curva);
// Setting colors...
grafico->color (XY_GRAY);
// Inserting axes...
grafico->insert (&eixo_temperatura);
grafico->insert (&eixo_porcentagem);
// Calculating the mask area (after the axes definition and insertion)
grafico->calcMaskArea (0);
// Setting mask area color
grafico->maskAreaColor (XY_WHITE);
// Inserting the curve (mask).
// Remember: the mask is already associated to a constructed series (arquivo)
grafico->insert (&marquivo);
// Defining the legend...
grafico->legend (&legend);
// IUP call: exposing the main dialog ("d")...
// Entering IUP event loop. If the loop ends, the application is down!
IupShow (d);
IupMainLoop ();
IupClose ();
}
|