![]() ![]() ![]() |
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 (); } |