source: mmcs/genericFunctions.cpp

Last change on this file was 8f1b6a6, checked in by rudmanmrrod <rudman22@…>, 8 years ago

Agregado primera aproximacion al impacto a corto plazo, solucionado bug al no mostrar la ultima fila/columna en la descomposicion

  • Property mode set to 100644
File size: 15.5 KB
Line 
1/**
2    @file genericFunctions.cpp
3    @brief Serie de funciones genéricas para el Sistema de Matrices de Contabilidad Social
4    @date 01/08/2016
5    @author Rodrigo Boet
6    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
7*/
8#include <genericFunctions.h>
9
10using namespace Eigen;
11
12
13/**
14    @brief Función que permite obtener los elementos distintos en una lista
15    @author Autor: Rodrigo Boet
16    @date Fecha: 01/08/2016
17    @param <my_list> Lista para en la que se definirán los elementos distintos
18    @return elementos distintos de la lista
19*/
20int diferent_elements(QStringList my_list)
21{
22    QStringList elements;
23    foreach (QString item, my_list) {
24        if(!elements.contains(item))
25        {
26            elements.append(item);
27        }
28    }
29    return elements.count();
30}
31
32/**
33    @brief Función que permite agregar un mensaje en el label cuando se selecciona la opción de componentes
34    @date 29/07/2016
35    @author Rodrigo Boet
36    @param <tw> Recibe el widget de la tabla
37    @param <row> Recibe la fila de la que se extraeran los datos
38    @param <init> Recibe el inicio de la fila de donde extraeran los datos
39    @param <end> Recibe el fin de la fila de donde extraeran los datos
40    @return <elements> retorna una lista con los elementos
41*/
42QStringList get_list(QTableWidget *tw, int row, int init, int end)
43{
44    QStringList elements;
45    for(int i=init;i<end;i++)
46    {
47        elements.append(tw->item(row,i)->text());
48    }
49    return elements;
50}
51
52/**
53   @brief Funcion para agregar el span en los titulos de la matriz seleccionada
54   @date 10/10/2015
55   @author Rodrigo Boet
56   @param <tw> Recibe el widget de la tabla
57*/
58void titleSeleccionar(QTableWidget *tw)
59{
60    QStringList CuentaFila;
61    QStringList CuentaColumna;
62    int fila = tw->rowCount();
63    int columna = tw->columnCount();
64    /*      Se crea una lista con las veces que se repiten cuentas en filas/columnas*/
65    //Fila
66    for(int i = 2;i<fila;i++)
67    {
68        CuentaFila.append(tw->item(i,0)->text());
69    }
70    //Columna
71    for(int j = 2;j<columna;j++)
72    {
73        CuentaColumna.append(tw->item(0,j)->text());
74    }
75    /*      Se crea el span tomando en cuenta las veces que se repite una cuenta en las listas      */
76    //Fila
77    for(int i=2;i<fila-1;i++)
78    {
79        QString accName=tw->item(i,0)->text();
80        if(CuentaFila.contains(accName))
81        {
82            int contar = CuentaFila.count(accName);
83            qDebug()<<contar;
84            if(contar>1)
85            {
86                tw->setSpan(i,0,contar,1);
87            }
88            CuentaFila.removeAll(accName);
89        }
90        if(CuentaFila.isEmpty())
91        {
92            break;
93        }
94    }
95    //Columna
96    for(int j=2;j<columna-1;j++)
97    {
98        QString accName=tw->item(0,j)->text();
99        if(CuentaColumna.contains(accName))
100        {
101            int contar = CuentaColumna.count(accName);
102            qDebug()<<contar;
103            if(contar>1)
104            {
105                tw->setSpan(0,j,1,contar);
106            }
107            CuentaColumna.removeAll(accName);
108        }
109        if(CuentaColumna.isEmpty())
110        {
111            break;
112        }
113    }
114}
115
116/**
117   @brief Funcion para generar las tablas de comparación entre matrices
118   @date 10/10/2015
119   @author Rodrigo Boet
120   @param <tw> Recibe el widget de la tabla que se modificará
121   @param <tw> Recibe el widget de la tabla de donde se sacan los valores
122*/
123void crearTablaComparar(QTableWidget *to, QTableWidget *tw)
124{
125    int count = to->rowCount();
126    int col = to->columnCount();
127    to->insertColumn(col);
128    to->insertColumn(col);
129    for(int i=0;i<count;i++)
130    {
131        QTableWidgetItem *item1 = new QTableWidgetItem(tw->item(i,2)->text());
132        item1->setTextAlignment(Qt::AlignCenter);
133        item1->setFlags(item1->flags() ^ Qt::ItemIsEditable);
134        QTableWidgetItem *item2 = new QTableWidgetItem(tw->item(i,3)->text());
135        item2->setTextAlignment(Qt::AlignCenter);
136        item2->setFlags(item2->flags() ^ Qt::ItemIsEditable);
137        if(i==0)
138        {
139            QFont font;
140            font.setBold(true);
141            item1->setFont(font);
142            item2->setFont(font);
143        }
144        to->setItem(i,col,item1);
145        to->setItem(i,col+1,item2);
146    }
147    to->resizeColumnsToContents();
148    to->resizeRowsToContents();
149}
150
151/**
152   @brief Funcion para agregar los estilos de la tabla de encadenamientos
153   @date 10/10/2015
154   @author Rodrigo Boet
155   @param <tw> Recibe el widget de la tabla
156*/
157void encadenamientosStyle(QTableWidgetItem *ti)
158{
159    QFont font;
160    font.setBold(true);
161    ti->setFont(font);
162    ti->setFlags(ti->flags() ^ Qt::ItemIsEditable);
163    ti->setTextAlignment(Qt::AlignCenter);
164}
165
166/**
167   @brief Funcion para agregar un texto en una tabla en los rangos especificados
168   @date 10/10/2015
169   @author Rodrigo Boet
170   @param <tw> Recibe el widget de la tabla donde se agregrá el texto
171   @param <inicio> Recibe desde donde se escribirá el texto
172   @param <fin> Recibe hasta donde se escribirá el texto
173   @param <texto> Recibe el texto
174*/
175void tableItem(QTableWidget *tw, int inicio, int fin, QString texto)
176{
177    for(int i=inicio;i<fin;i++)
178    {
179        QTableWidgetItem *itemFila = new QTableWidgetItem(texto);
180        itemFila->setFlags(itemFila->flags() ^ Qt::ItemIsEditable);
181        QTableWidgetItem *itemColumna = new QTableWidgetItem(texto);
182        itemColumna->setFlags(itemColumna->flags() ^ Qt::ItemIsEditable);
183        tw->setItem(0,i,itemFila);
184        tw->setItem(i,0,itemColumna);
185    }
186}
187
188/**
189   @brief Funcion para agregar el estilo de una celda en negrita(letra blanca) con fondo de color azul (Cuenta)
190   @date 10/10/2015
191   @author Rodrigo Boet
192   @param <tw> Recibe el widget de la tabla en la que se agregarán los estilos
193*/
194void CellStyle(QTableWidgetItem *ti)
195{
196    ti->setBackgroundColor(QColor(53,140,203));
197    ti->setTextColor(Qt::white);
198    QFont font;
199    font.setBold(true);
200    ti->setFont(font);
201}
202
203/**
204   @brief Funcion para agregar el estilo de una celda con fondo de color gris (Componente)
205   @date 10/10/2015
206   @author Rodrigo Boet
207   @param <tw> Recibe el widget de la tabla en la que se agregarán los estilos
208*/
209void CellStyleComponente(QTableWidgetItem *ti)
210{
211    ti->setBackgroundColor(QColor(221,227,230));
212}
213
214/**
215   @brief Funcion para agregar el estilo de una celda en negrita(letras blancas) con fondo de color gris oscuro (endogéna-exogéna)
216   @date 10/10/2015
217   @author Rodrigo Boet
218   @param <tw> Recibe el widget de la tabla en la que se agregarán los estilos
219*/
220void CellStyleExEn(QTableWidgetItem *ti)
221{
222    ti->setBackgroundColor(QColor(110,110,110));
223    ti->setTextColor(Qt::white);
224    QFont font;
225    font.setBold(true);
226    ti->setFont(font);
227}
228
229/**
230   @brief Funcion que escribe en una columna o fila con la lista dada
231   @date 10/10/2015
232   @author Rodrigo Boet
233   @param <lista> Recibe la lista de donde se sacarán los valores
234   @param <tw> Recibe el widget de la tabla
235   @param <opcion> Recibe la opción (1 para escribir en columna y 0 para la fila)
236*/
237void insertRowExogena(QList<QString> lista,QTableWidget *tw,int opcion, bool center, int init)
238{
239    for(int i=0;i<tw->rowCount();i++)
240    {
241        QTableWidgetItem *twi =new QTableWidgetItem;
242        twi->setText(lista[i]);
243        twi->setFlags(twi->flags() ^ Qt::ItemIsEditable);
244        if(center and i>=init)
245        {
246            twi->setTextAlignment(Qt::AlignCenter);
247        }
248        int fin=tw->rowCount();
249        if(opcion==1)
250        {
251            tw->setItem(fin-1,i,twi);
252        }
253        else
254        {
255            tw->setItem(i,fin-1,twi);
256        }
257    }
258}
259
260/**
261   @brief Funcion para volver la celda(0,0) no editable
262   @date 08/07/2015
263   @author Rodrigo Boet
264   @param <tw> Recibe el widget de la tabla
265*/
266void noEditColZero(QTableWidget *tw)
267{
268    QTableWidgetItem *ValoraInsertar = new QTableWidgetItem;
269    ValoraInsertar->setFlags(ValoraInsertar->flags() ^ Qt::ItemIsEditable);
270    tw->setItem(0,0,ValoraInsertar);
271}
272
273/**
274   @brief Funcion estandar para hacer algunas celdas no editables debido a que son dificiles de manipular(por motivos de colocado y borrado dinamico)
275   @date 08/07/2015
276   @author Rodrigo Boet
277   @param <tw> Recibe el widget de la tabla
278   @param <inicio> Recibe el inicio
279   @param <fin> Recibe el fin
280   @param <opcion> Recibe la columna (por defecto 0)
281*/
282void ItemsNoEditable(QTableWidget *tw,int inicio,int fin,int col)
283{
284    noEditColZero(tw);
285    for(int i=inicio;i<fin;i++)
286    {
287        QTableWidgetItem *ValoraInsertarFila = new QTableWidgetItem;
288        ValoraInsertarFila->setFlags(ValoraInsertarFila->flags() ^ Qt::ItemIsEditable);
289        tw->setItem(i,col,ValoraInsertarFila);
290        QTableWidgetItem *ValoraInsertarColumna = new QTableWidgetItem;
291        ValoraInsertarColumna->setFlags(ValoraInsertarColumna->flags() ^ Qt::ItemIsEditable);
292        tw->setItem(col,i,ValoraInsertarColumna);
293
294    }
295}
296
297/**
298    @brief Función para retornar todos los componentes en una lista
299    @date 10/10/2015
300    @author Rodrigo Boet
301    @param <tw> Recibe el widget de la tabla
302    @return <elements> retorna una lista con los elementos
303*/
304QStringList ObtenerComponentes(QTableWidget *tw)
305{
306    QStringList MiLista;
307    int contador=tw->rowCount();
308    for(int i=1;i<contador-1;i++)
309    {
310        MiLista.append(tw->item(0,i)->text());
311    }
312    return MiLista;
313}
314
315
316/**
317    @brief Funcion que permite llenar una lista con los elementos en un intervalo dado(fila o columna)
318    @date 10/10/2015
319    @author Rodrigo Boet
320    @param <lista> Recibe la lista en la que escribirán los componenentes
321    @param <tw> Recibe el widget de la tabla
322    @param <valor> Recibe el valor de fila/cloumna
323    @param <opcion> Recibe la opción (1 para fila y 0 para columna)
324    @return <elements> retorna una lista con los elementos
325*/
326QList<QString> llenarLista(QList<QString> lista,QTableWidget *tw,int valor,int opcion)
327{
328    int cantidad = tw->rowCount();
329    for(int i=0;i<cantidad;i++)
330    {
331        if(opcion==1)
332        {
333            lista.append(tw->item(valor,i)->text());
334        }
335        else
336        {
337            lista.append(tw->item(i,valor)->text());
338        }
339    }
340    return lista;
341}
342
343/**
344    @brief Funcion para crear una tabla cuadrada vacía en un rango dado
345    @date 08/07/2015
346    @author Rodrigo Boet
347    @param <contador> Recibe la dimensión de la tabla
348    @param <tw> Recibe el widget de la tabla
349*/
350void CrearTablaVacia(int contador, QTableWidget *tw)
351{
352    for(int k=0;k<contador-1;k++)
353    {
354        tw->insertRow(k);
355        tw->insertColumn(k);
356    }
357}
358
359/**
360    @brief Funcion para crear una tabla vacia no cuadrada, específicamente para los encadenamientos
361    @date 08/07/2015
362    @author Rodrigo Boet
363    @param <filas> Recibe la dimensión de las filas
364    @param <tw> Recibe el widget de la tabla
365    @param <columnas> Recibe la dimensión de las columnas
366*/
367/*          Funcion para crear una tabla vacia, específicamente para los encadenamientos        */
368void crearTablaVaciaEncadenamiento(int filas, QTableWidget *tw,int columnas)
369{
370    for(int j=0;j<columnas;j++)
371    {
372        tw->insertColumn(0);
373    }
374    for(int k=0;k<filas;k++)
375    {
376        tw->insertRow(k);
377    }
378}
379
380/**
381    @brief Funcion que permite contar los elementos en el map o diccionario
382    @date 10/10/2015
383    @author Rodrigo Boet
384    @param <diccionario> Recibe el diccionario (clave,valor) -> QString y QStringList Respectivamente
385    @return <contador> retorna la cantidad de elementos
386*/
387int contarElementosMap(QMap<QString,QStringList> diccionario)
388{
389    int contador=0;
390    foreach(QString key,diccionario.keys())
391    {
392        contador+=diccionario[key].count();
393    }
394    return contador;
395}
396
397/**
398    @brief Funcion que sumar todos los elementos de un vector
399    @date 08/09/2016
400    @author Rodrigo Boet
401    @param <valor> Recibe un vector de tipo <double>
402    @return <suma> retorna la suma de los elementos
403*/
404double sumElements(QVector<double> valor)
405{
406    int cantidad = valor.count();
407    double suma = 0;
408    for(int i=0;i<cantidad;i++)
409    {
410        suma+= valor.at(i);
411    }
412    return suma;
413}
414
415/**
416   @brief Funcion que permite colocar filas/columnas como no editables
417   @date 08/09/2016
418   @author Rodrigo Boet
419   @param <tw> Recibe el widget de la tabla
420   @param <inicio> Recibe el inicio
421   @param <fin> Recibe el fin
422   @param <item> Recibe el indice de la fila/columna
423   @param <fila> Recibe un booleano (True si es fila, de lo contrario es una columna)
424*/
425void RowColNoEditable(QTableWidget *tw,int inicio,int fin,int item, bool fila)
426{
427    for(int i=inicio;i<=fin;i++)
428    {
429        if(fila)
430        {
431            QTableWidgetItem *ValoraInsertarFila = new QTableWidgetItem;
432            ValoraInsertarFila->setFlags(ValoraInsertarFila->flags() ^ Qt::ItemIsEditable);
433            tw->setItem(item,i,ValoraInsertarFila);
434        }
435        else
436        {
437            QTableWidgetItem *ValoraInsertarColumna = new QTableWidgetItem;
438            ValoraInsertarColumna->setFlags(ValoraInsertarColumna->flags() ^ Qt::ItemIsEditable);
439            tw->setItem(i,item,ValoraInsertarColumna);
440        }
441
442    }
443}
444
445/**
446   @brief Funcion que extraer una submatriz de una tabla
447   @date 27/09/2016
448   @author Rodrigo Boet
449   @param <tw> Recibe el widget de la tabla
450   @param <nombre_fila> Recibe el nombre de la cuenta en fila
451   @param <nombre_columna> Recibe el nombre de la cuenta en columna
452   @param <matriz> Recibe la sub-matriz de donde se sacarán los valores
453   @return <result> Retorna la sub-matriz
454*/
455Eigen::MatrixXd extractSubMatriz(QTableWidget *tw, QString nombre_fila, QString nombre_columna, Eigen::MatrixXd Matrix)
456{
457    int rows = tw->rowCount();
458    Eigen::MatrixXd result;
459    int pos = 0;
460    for(int i = 2; i < rows ;i++)
461    {
462        bool entro = false;
463        int cant = 0;
464        QVector <double> values;
465        for(int j = 2; j < rows;j++)
466        {
467            if(tw->item(0,i)->text()==nombre_fila and tw->item(j,0)->text()==nombre_columna)
468            {
469                entro = true;
470                double value = Matrix(i-2,j-2);
471                values.append(value);
472                cant++;
473            }
474        }
475        if(entro)
476        {
477            result.resize(cant,cant);
478            for(int k=0;k<values.count();k++)
479            {
480                result(pos,k) = values.at(k);
481            }
482            pos++;
483        }
484    }
485    return result;
486}
487
488/**
489   @brief Funcion que extraer la diagonal principal de una matriz de Eigen
490   @date 28/09/2016
491   @author Rodrigo Boet
492   @param <matriz> Recibe la sub-matriz de donde se sacarán los valores
493   @return <result> Retorna la suma de la diagonal
494*/
495QVector<double> extractDiagonal(Eigen::MatrixXd Matrix)
496{
497    QVector<double> result;
498    for(int i=0;i<Matrix.rows();i++)
499    {
500        for(int j=0;j<Matrix.rows();j++)
501        {
502            if(i==j)
503            {
504                result.append(Matrix(i,j));
505            }
506        }
507    }
508    return result;
509}
510
511/**
512   @brief Funcion que valida que la diagonal sea distinta de cero
513   @date 28/09/2016
514   @author Rodrigo Boet
515   @param <diagonal> Recibe el vector con la diagonal
516   @return <valida> Retorna verdadero si la diagonal es distinta de cero, falso en caso contrario
517*/
518bool validarDiagonal(QVector<double> diagonal)
519{
520    int count = diagonal.count();
521    bool valida = true;
522    for(int i=0;i<count;i++)
523    {
524        if(qAbs(diagonal.at(i))<0.00001)
525        {
526            valida = false;
527        }
528    }
529    return valida;
530}
531
532/**
533   @brief Funcion para llenar un vector con otro
534   @date 28/09/2016
535   @author Rodrigo Boet
536   @param <elements> Recibe el vector con los elementos
537   @param <vector> Recibe el vector que se llenara
538*/
539void appendElements(QVector<double> elements, QVector<double> &vector)
540{
541    foreach (double value, elements) {
542        vector.append(value);
543    }
544}
545
Note: See TracBrowser for help on using the repository browser.