202 lines
5.7 KiB
C
202 lines
5.7 KiB
C
#include <gadget/gadget.h>
|
|
|
|
LIB_GADGET_START
|
|
|
|
/* prototypes */
|
|
GD_VIDEO put_chemical_cell( GD_VIDEO table, MT_CELL * E, DS_ARRAY E_data );
|
|
MT_CELL* load_chem_elements( MT_CELL * E, DS_ARRAY * E_data );
|
|
int select_box_chemical_elem( RDS(MT_CELL, Elements) );
|
|
void put_information(RDS( MT_CELL, elem), int i);
|
|
|
|
Main
|
|
|
|
GD_VIDEO table;
|
|
/* las dimensiones del terminal son muy importantes
|
|
para desplegar la tabla */
|
|
Resize_terminal(42,135);
|
|
Init_video( &table );
|
|
|
|
Gpm_Connect conn;
|
|
|
|
if ( ! Init_mouse(&conn)){
|
|
Msg_red("No se puede conectar al servidor del ratón\n");
|
|
Stop(1);
|
|
}
|
|
Enable_raw_mode();
|
|
Hide_cursor;
|
|
|
|
/* I declare a multitype array "Elements", and load the file that will populate this array. */
|
|
New multitype Elements;
|
|
Elements = load_chem_elements( pSDS(Elements) );
|
|
Throw( load_fail );
|
|
|
|
/* I create a "Button" object with which the execution will end. */
|
|
New objects Btn_exit;
|
|
Btn_exit = New_object_mouse( SMD(&Btn_exit), BUTTOM, " Terminar ", 6,44, 15, 0);
|
|
|
|
/* Fill the space on the screen with the table of chemical elements. */
|
|
table = put_chemical_cell( table, SDS(Elements) );
|
|
|
|
/* I print the screen and place the mouse object. */
|
|
Refresh(table);
|
|
Put object Btn_exit;
|
|
|
|
/* I wait for a mouse event. */
|
|
int c;
|
|
Waiting_some_clic(c)
|
|
{
|
|
if( select_box_chemical_elem(SDS(Elements)) ){
|
|
Waiting_some_clic(c) break;
|
|
}
|
|
if (Object_mouse( Btn_exit)) break;
|
|
|
|
Refresh(table);
|
|
Put object Btn_exit;
|
|
}
|
|
|
|
Free object Btn_exit;
|
|
Free multitype Elements;
|
|
|
|
Exception( load_fail ){
|
|
Msg_red("No es un archivo matriciable");
|
|
}
|
|
|
|
Free video table;
|
|
Disable_raw_mode();
|
|
Close_mouse();
|
|
Show_cursor;
|
|
|
|
At SIZE_TERM_ROWS,0;
|
|
Prnl;
|
|
End
|
|
|
|
void put_information(RDS(MT_CELL, elem), int i)
|
|
{
|
|
At 2,19;
|
|
Box_solid(11,64,67,17);
|
|
Color(15,17);
|
|
At 4,22; Print "Elemento (%s) = %s", (char*)$s-elem[i,5],(char*)$s-elem[i,6];
|
|
if (Cell_type(elem,i,7) == double_TYPE ){
|
|
At 5,22; Print "Peso atómico = %f", $d-elem[i,7];
|
|
}else{
|
|
At 5,22; Print "Peso atómico = (%ld)", $l-elem[i,7];
|
|
}
|
|
At 6,22; Print "Posición = (%ld, %ld)",$l-elem[i,0]+ ($l-elem[i,0]>=8 ? 0:1),$l-elem[i,1]+1;
|
|
At 8,22; Print "1ª energía de";
|
|
if (Cell_type(elem,i,12) == double_TYPE ){
|
|
At 9,22; Print "ionización (kJ/mol) = %.*f",2,$d-elem[i,12];
|
|
}else{
|
|
At 9,22; Print "ionización (kJ/mol) = ---";
|
|
}
|
|
if (Cell_type(elem,i,13) == double_TYPE ){
|
|
At 10,22; Print "Electronegatividad = %.*f",2,$d-elem[i,13];
|
|
}else{
|
|
At 10,22; Print "Electronegatividad = ---";
|
|
}
|
|
At 4,56; Print "Conf. electrónica:";
|
|
At 5,56; Print " %s", (char*)$s-elem[i,14];
|
|
At 7,56; Print "Estados de oxidación:";
|
|
if ( Cell_type(elem,i,15) == string_TYPE ){
|
|
At 8,56; Print " %s", (char*)$s-elem[i,15];
|
|
}else{
|
|
/* Strangely, when the file loader detects a "+n", it treats it as a string,
|
|
but when it detects a "-n", it treats it as a "long".
|
|
I must review that. */
|
|
At 8,56; Print " %ld", $l-elem[i,15];
|
|
}
|
|
At 10,56; Print "Número Atómico: %ld",$l-elem[i,4];
|
|
Reset_color;
|
|
}
|
|
|
|
int select_box_chemical_elem( RDS(MT_CELL, elem) )
|
|
{
|
|
int i;
|
|
Iterator up i [0:1:Rows(elem)]{
|
|
if ( Is_range_box( $l-elem[i,8], $l-elem[i,9], $l-elem[i,10], $l-elem[i,11]) ){
|
|
Gotoxy( $l-elem[i,8], $l-elem[i,9] );
|
|
Color_fore( 15 ); Color_back( 0 );
|
|
Box( 4,5, DOUB_ALL );
|
|
|
|
Gotoxy( $l-elem[i,8]+1, $l-elem[i,9]+2); Print "%ld",$l-elem[i,4];
|
|
Gotoxy( $l-elem[i,8]+2, $l-elem[i,9]+2); Print "%s",(char*)$s-elem[i,5];
|
|
Flush_out;
|
|
Reset_color;
|
|
put_information(SDS(elem),i);
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
GD_VIDEO put_chemical_cell(GD_VIDEO table, MT_CELL * elem, DS_ARRAY elem_data)
|
|
{
|
|
int i;
|
|
|
|
/* put each cell */
|
|
Iterator up i [0:1:Rows(elem)]{
|
|
long rx = 2+($l-elem[i,0]*4);
|
|
long cx = 3+($l-elem[i,1]*7);
|
|
long offr = rx+3;
|
|
long offc = cx+6;
|
|
|
|
Gotoxy(table, rx, cx);
|
|
|
|
Color_fore(table, $l-elem[i,2]);
|
|
Color_back(table,$l-elem[i,3]);
|
|
|
|
Box(table, 4,5, SING_ALL );
|
|
|
|
char Atnum[50], Elem[50];
|
|
sprintf(Atnum,"\x1b[3m%ld\x1b[23m",$l-elem[i,4]);
|
|
sprintf(Elem, "\x1b[1m%s\x1b[22m",(char*)$s-elem[i,5]);
|
|
|
|
Outvid(table,rx+1, cx+2, Atnum);
|
|
Outvid(table,rx+2, cx+2, Elem);
|
|
|
|
Reset_text(table);
|
|
/* Update positions of each cell to be detected by the mouse. */
|
|
$l-elem[i,8] = rx;
|
|
$l-elem[i,9] = cx;
|
|
$l-elem[i,10] = offr;
|
|
$l-elem[i,11] = offc;
|
|
|
|
}
|
|
/* put rows and cols */
|
|
Iterator up i [ 1: 1: 19 ]{
|
|
Gotoxy(table, 31, 5+(i-1)*7);
|
|
char num[5]; sprintf( num, "%d",i );
|
|
Outvid(table, num );
|
|
}
|
|
Iterator up i [ 1: 1: 8 ]{
|
|
Gotoxy(table, 3+(i-1)*4, 130);
|
|
char num[5]; sprintf( num, "%d",i );
|
|
Outvid(table, num );
|
|
}
|
|
Outvid( table, 35,116, "8");
|
|
Outvid( table, 39,116, "9");
|
|
|
|
/* others */
|
|
Color_fore(table, 15);
|
|
Color_back(table, 0);
|
|
Outvid(table,35,2,"Lantánidos ->");
|
|
Outvid(table,39,2,"Actínidos ->");
|
|
Reset_text(table);
|
|
return table;
|
|
}
|
|
|
|
MT_CELL* load_chem_elements( MT_CELL * E, DS_ARRAY * E_data )
|
|
{
|
|
F_STAT dataFile = Stat_file("chem_table.txt");
|
|
if( dataFile.is_matrix ){
|
|
/*
|
|
Set the ranges to read from the file.
|
|
You can choose the portion of the file that you want to upload.
|
|
*/
|
|
Range ptr E [0:1:dataFile.total_lines-1, 0:1:dataFile.max_tokens_per_line-1];
|
|
E = Load_matrix_mt( SDS(E), "chem_table.txt", dataFile, DET_LONG);
|
|
}else{
|
|
Is_ok=0;
|
|
}
|
|
return E;
|
|
}
|