source: mmcs/genericFunctions.cpp @ b0c244f

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

Agregado el modulo de descomposicion

  • Property mode set to 100644
File size: 15.4 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)
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        int fin=tw->rowCount();
245        if(opcion==1)
246        {
247            tw->setItem(fin-1,i,twi);
248        }
249        else
250        {
251            tw->setItem(i,fin-1,twi);
252        }
253    }
254}
255
256/**
257   @brief Funcion para volver la celda(0,0) no editable
258   @date 08/07/2015
259   @author Rodrigo Boet
260   @param <tw> Recibe el widget de la tabla
261*/
262void noEditColZero(QTableWidget *tw)
263{
264    QTableWidgetItem *ValoraInsertar = new QTableWidgetItem;
265    ValoraInsertar->setFlags(ValoraInsertar->flags() ^ Qt::ItemIsEditable);
266    tw->setItem(0,0,ValoraInsertar);
267}
268
269/**
270   @brief Funcion estandar para hacer algunas celdas no editables debido a que son dificiles de manipular(por motivos de colocado y borrado dinamico)
271   @date 08/07/2015
272   @author Rodrigo Boet
273   @param <tw> Recibe el widget de la tabla
274   @param <inicio> Recibe el inicio
275   @param <fin> Recibe el fin
276   @param <opcion> Recibe la columna (por defecto 0)
277*/
278void ItemsNoEditable(QTableWidget *tw,int inicio,int fin,int col)
279{
280    noEditColZero(tw);
281    for(int i=inicio;i<fin;i++)
282    {
283        QTableWidgetItem *ValoraInsertarFila = new QTableWidgetItem;
284        ValoraInsertarFila->setFlags(ValoraInsertarFila->flags() ^ Qt::ItemIsEditable);
285        tw->setItem(i,col,ValoraInsertarFila);
286        QTableWidgetItem *ValoraInsertarColumna = new QTableWidgetItem;
287        ValoraInsertarColumna->setFlags(ValoraInsertarColumna->flags() ^ Qt::ItemIsEditable);
288        tw->setItem(col,i,ValoraInsertarColumna);
289
290    }
291}
292
293/**
294    @brief Función para retornar todos los componentes en una lista
295    @date 10/10/2015
296    @author Rodrigo Boet
297    @param <tw> Recibe el widget de la tabla
298    @return <elements> retorna una lista con los elementos
299*/
300QStringList ObtenerComponentes(QTableWidget *tw)
301{
302    QStringList MiLista;
303    int contador=tw->rowCount();
304    for(int i=1;i<contador-1;i++)
305    {
306        MiLista.append(tw->item(0,i)->text());
307    }
308    return MiLista;
309}
310
311
312/**
313    @brief Funcion que permite llenar una lista con los elementos en un intervalo dado(fila o columna)
314    @date 10/10/2015
315    @author Rodrigo Boet
316    @param <lista> Recibe la lista en la que escribirán los componenentes
317    @param <tw> Recibe el widget de la tabla
318    @param <valor> Recibe el valor de fila/cloumna
319    @param <opcion> Recibe la opción (1 para fila y 0 para columna)
320    @return <elements> retorna una lista con los elementos
321*/
322QList<QString> llenarLista(QList<QString> lista,QTableWidget *tw,int valor,int opcion)
323{
324    int cantidad = tw->rowCount();
325    for(int i=0;i<cantidad;i++)
326    {
327        if(opcion==1)
328        {
329            lista.append(tw->item(valor,i)->text());
330        }
331        else
332        {
333            lista.append(tw->item(i,valor)->text());
334        }
335    }
336    return lista;
337}
338
339/**
340    @brief Funcion para crear una tabla cuadrada vacía en un rango dado
341    @date 08/07/2015
342    @author Rodrigo Boet
343    @param <contador> Recibe la dimensión de la tabla
344    @param <tw> Recibe el widget de la tabla
345*/
346void CrearTablaVacia(int contador, QTableWidget *tw)
347{
348    for(int k=0;k<contador-1;k++)
349    {
350        tw->insertRow(k);
351        tw->insertColumn(k);
352    }
353}
354
355/**
356    @brief Funcion para crear una tabla vacia no cuadrada, específicamente para los encadenamientos
357    @date 08/07/2015
358    @author Rodrigo Boet
359    @param <filas> Recibe la dimensión de las filas
360    @param <tw> Recibe el widget de la tabla
361    @param <columnas> Recibe la dimensión de las columnas
362*/
363/*          Funcion para crear una tabla vacia, específicamente para los encadenamientos        */
364void crearTablaVaciaEncadenamiento(int filas, QTableWidget *tw,int columnas)
365{
366    for(int j=0;j<columnas;j++)
367    {
368        tw->insertColumn(0);
369    }
370    for(int k=0;k<filas;k++)
371    {
372        tw->insertRow(k);
373    }
374}
375
376/**
377    @brief Funcion que permite contar los elementos en el map o diccionario
378    @date 10/10/2015
379    @author Rodrigo Boet
380    @param <diccionario> Recibe el diccionario (clave,valor) -> QString y QStringList Respectivamente
381    @return <contador> retorna la cantidad de elementos
382*/
383int contarElementosMap(QMap<QString,QStringList> diccionario)
384{
385    int contador=0;
386    foreach(QString key,diccionario.keys())
387    {
388        contador+=diccionario[key].count();
389    }
390    return contador;
391}
392
393/**
394    @brief Funcion que sumar todos los elementos de un vector
395    @date 08/09/2016
396    @author Rodrigo Boet
397    @param <valor> Recibe un vector de tipo <double>
398    @return <suma> retorna la suma de los elementos
399*/
400double sumElements(QVector<double> valor)
401{
402    int cantidad = valor.count();
403    double suma = 0;
404    for(int i=0;i<cantidad;i++)
405    {
406        suma+= valor.at(i);
407    }
408    return suma;
409}
410
411/**
412   @brief Funcion que permite colocar filas/columnas como no editables
413   @date 08/09/2016
414   @author Rodrigo Boet
415   @param <tw> Recibe el widget de la tabla
416   @param <inicio> Recibe el inicio
417   @param <fin> Recibe el fin
418   @param <item> Recibe el indice de la fila/columna
419   @param <fila> Recibe un booleano (True si es fila, de lo contrario es una columna)
420*/
421void RowColNoEditable(QTableWidget *tw,int inicio,int fin,int item, bool fila)
422{
423    for(int i=inicio;i<=fin;i++)
424    {
425        if(fila)
426        {
427            QTableWidgetItem *ValoraInsertarFila = new QTableWidgetItem;
428            ValoraInsertarFila->setFlags(ValoraInsertarFila->flags() ^ Qt::ItemIsEditable);
429            tw->setItem(item,i,ValoraInsertarFila);
430        }
431        else
432        {
433            QTableWidgetItem *ValoraInsertarColumna = new QTableWidgetItem;
434            ValoraInsertarColumna->setFlags(ValoraInsertarColumna->flags() ^ Qt::ItemIsEditable);
435            tw->setItem(i,item,ValoraInsertarColumna);
436        }
437
438    }
439}
440
441/**
442   @brief Funcion que extraer una submatriz de una tabla
443   @date 27/09/2016
444   @author Rodrigo Boet
445   @param <tw> Recibe el widget de la tabla
446   @param <nombre_fila> Recibe el nombre de la cuenta en fila
447   @param <nombre_columna> Recibe el nombre de la cuenta en columna
448   @param <matriz> Recibe la sub-matriz de donde se sacarán los valores
449   @return <result> Retorna la sub-matriz
450*/
451Eigen::MatrixXd extractSubMatriz(QTableWidget *tw, QString nombre_fila, QString nombre_columna, Eigen::MatrixXd Matrix)
452{
453    int rows = tw->rowCount();
454    Eigen::MatrixXd result;
455    int pos = 0;
456    for(int i = 2; i < rows ;i++)
457    {
458        bool entro = false;
459        int cant = 0;
460        QVector <double> values;
461        for(int j = 2; j < rows;j++)
462        {
463            if(tw->item(0,i)->text()==nombre_fila and tw->item(j,0)->text()==nombre_columna)
464            {
465                entro = true;
466                double value = Matrix(i-2,j-2);
467                values.append(value);
468                cant++;
469            }
470        }
471        if(entro)
472        {
473            result.resize(cant,cant);
474            for(int k=0;k<values.count();k++)
475            {
476                result(pos,k) = values.at(k);
477            }
478            pos++;
479        }
480    }
481    return result;
482}
483
484/**
485   @brief Funcion que extraer la diagonal principal de una matriz de Eigen
486   @date 28/09/2016
487   @author Rodrigo Boet
488   @param <matriz> Recibe la sub-matriz de donde se sacarán los valores
489   @return <resul> Retorna la suma de la diagonal
490*/
491QVector<double> extractDiagonal(Eigen::MatrixXd Matrix)
492{
493    QVector<double> result;
494    for(int i=0;i<Matrix.rows();i++)
495    {
496        for(int j=0;j<Matrix.rows();j++)
497        {
498            if(i==j)
499            {
500                result.append(Matrix(i,j));
501            }
502        }
503    }
504    return result;
505}
506
507/**
508   @brief Funcion que valida que la diagonal sea distinta de cero
509   @date 28/09/2016
510   @author Rodrigo Boet
511   @param <diagonal> Recibe el vector con la diagonal
512   @return <valida> Retorna verdadero si la diagonal es distinta de cero, falso en caso contrario
513*/
514bool validarDiagonal(QVector<double> diagonal)
515{
516    int count = diagonal.count();
517    bool valida = true;
518    for(int i=0;i<count;i++)
519    {
520        if(qAbs(diagonal.at(i))<0.00001)
521        {
522            valida = false;
523        }
524    }
525    return valida;
526}
527
528/**
529   @brief Funcion para llenar un vector con otro
530   @date 28/09/2016
531   @author Rodrigo Boet
532   @param <elements> Recibe el vector con los elementos
533   @param <vector> Recibe el vector que se llenara
534*/
535void appendElements(QVector<double> elements, QVector<double> &vector)
536{
537    foreach (double value, elements) {
538        vector.append(value);
539    }
540}
541
Note: See TracBrowser for help on using the repository browser.