Changeset dfabbb4 in mmcs for mainwindow.C


Ignore:
Timestamp:
Sep 8, 2016, 12:11:37 PM (8 years ago)
Author:
rudmanmrrod <rudman22@…>
Branches:
master
Children:
b23848e
Parents:
0b59ba5
Message:

Agregada librería para los reportes, modificados los encadenamientos para funcionar por CW(en An) y Rassmusen(Ma)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • mainwindow.C

    r0b59ba5 rdfabbb4  
    1414#include <stackencadenamientos.h>
    1515#include <QDebug>
     16
    1617
    1718using namespace Eigen;
     
    375376    CoeficientesTecnicos.addAction(&actionCV);
    376377
     378    actionEncadenamiento.setText("Clasificar cu&entas");
     379    actionEncadenamiento.setDisabled(true);
     380    CoeficientesTecnicos.addAction(&actionEncadenamiento);
     381
    377382    menuTools.addMenu(&CoeficientesTecnicos);
    378383
     
    381386
    382387    menuTools.addAction(&actionVariableExogena);
    383 
    384     Encadenamientos.setTitle("E&ncadenamientos");
    385     Encadenamientos.setDisabled(true);
    386 
    387     actionEncadenamiento.setText("&Estimar Encadenamientos");
    388     actionEncadenamiento.setDisabled(true);
    389     Encadenamientos.addAction(&actionEncadenamiento);
    390 
    391     actionClasificarCuentas.setText("&Clasificar Cuentas");
    392     actionClasificarCuentas.setDisabled(true);
    393     Encadenamientos.addAction(&actionClasificarCuentas);
    394 
    395     menuTools.addMenu(&Encadenamientos);
    396388
    397389    Modelos.setTitle("&Modelos");
     
    886878void MainWindow::abrirManual()
    887879{
    888     QDesktopServices::openUrl(QUrl("/usr/share/mmcs/Usuario/Entrada.html",QUrl::TolerantMode));
     880    //QDesktopServices::openUrl(QUrl("/usr/share/mmcs/Usuario/Entrada.html",QUrl::TolerantMode));
     881    // generate some data:
     882    /*QCustomPlot *customPlot = new QCustomPlot;
     883    QVector<double> x(101), y(101); // initialize with entries 0..100
     884    for (int i=0; i<10; ++i)
     885    {
     886      x[i] = i/5.0 - 1; // x goes from -1 to 1
     887      y[i] = x[i]*x[i]; // let's plot a quadratic function
     888    }
     889    // create graph and assign data to it:
     890    customPlot->addGraph();
     891    customPlot->graph(0)->setData(x, y);
     892    //customPlot->graph(0)->setLineStyle(QCPGraph::lsNone);
     893    customPlot->graph(0)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCross, 4));
     894    // give the axes some labels:
     895    customPlot->xAxis->setLabel("-y");
     896    customPlot->yAxis->setLabel("-x");
     897    customPlot->xAxis2->setLabel("y");
     898    customPlot->yAxis2->setLabel("x");
     899    // set axes ranges, so we see all data:
     900    customPlot->xAxis->setRange(-5, 5);
     901    customPlot->yAxis->setRange(-5, 5);
     902    customPlot->xAxis2->setRange(-5, 5);
     903    customPlot->yAxis2->setRange(-5, 5);
     904    customPlot->xAxis2->setVisible(true);
     905    customPlot->yAxis2->setVisible(true);
     906    customPlot->replot();
     907    FormExportMatrix *form = new FormExportMatrix(this);
     908    QHBoxLayout *layoutHorizontal = new QHBoxLayout;
     909    layoutHorizontal->addWidget(customPlot);
     910    form->setLayout(layoutHorizontal);
     911    form->show();*/
    889912}
    890913
     
    914937MainWindow::MainWindow()
    915938    : actionNewProject(this),actionLoadMatrix(this), actionExportMatrix(this), actionQuit(this),actionCH(this), actionCV(this),
    916       actionVariableExogena(this),actionEncadenamiento(this),actionClasificarCuentas(this), actionModeloClasico(this),
     939      actionVariableExogena(this),actionEncadenamiento(this),actionModeloClasico(this),
    917940      actionCompararResultados(this),actionModeloNoClasico(this),actionCompararResultadosMNC(this),actionPHClasicoIncidencia100(this),
    918941      actionPHCIncidenciaCuenta(this),actionPHCIncidenciaComponente(this),actionPHNoClasicoIncidencia100(this),actionPHNCIncidenciaCuenta(this),
     
    22492272        EndogenaAn();
    22502273        slotMa();
    2251         Encadenamientos.setEnabled(true);
    22522274        connect(&actionEncadenamiento,SIGNAL(triggered()),this,SLOT(slotEncadenamientos()));
    22532275        actionEncadenamiento.setEnabled(true);
    2254         //Clasificador de Cuentas
    2255         connect(&actionClasificarCuentas,SIGNAL(triggered()),this,SLOT(slotClasificarCuentas()));
    2256         actionClasificarCuentas.setEnabled(true);
    22572276
    22582277        //Se activa la opción de modelo clásico
     
    23202339    insertremoveRowCol(to,0, false);
    23212340    CalcularAn(tw,tablaAn,to,count,true);//Funcion para calcular el Coeficiente Tecnico Horizontal (An)
     2341    //Función para calcular los totales de matriz An
     2342    estimarVIFVC();
    23222343    /*          Se colocan los titulos de cuenta endogena/exogena en la tabla endogena-exogena(Tipo de Variable)*/
    23232344    count=to->rowCount()-1;
     
    24522473    else
    24532474    {
     2475        total_ma = MatrixMa.sum();
    24542476        QTableWidget *tablaMa = new QTableWidget;
    24552477        tablaMa->setObjectName("MatrizMa");
     
    29202942    if(nombre_cuenta!="Sub-Matriz Endógena-Endógena")
    29212943    {
     2944        diccCuentasEncadenamientos.clear();
    29222945        if(!lw->isEnabled())
    29232946        {
     
    31153138        }
    31163139    }
    3117     crearTablaVaciaEncadenamiento(elementos,enTable);
     3140    crearTablaVaciaEncadenamiento(elementos,enTable,7);
    31183141    int columna=0;
     3142    qDebug()<< diccCuentasEncadenamientos;
    31193143    foreach(int key,diccCuentasEncadenamientos.keys())
    31203144    {
     
    31453169                                {
    31463170                                    EncadenamientoAtras = An(k-2,j-2);//Suma Columna(Encadenamiento hacia atras)
    3147                                     EncadenamientoAdelante = An(k-2,j-2);//Suma Fila(Encadenamiento hacia adelante)
     3171                                    EncadenamientoAdelante = An(j-2,k-2);//Suma Fila(Encadenamiento hacia adelante)
    31483172                                }
    31493173                                sumaColumna+=EncadenamientoAtras;
     
    31643188                            valorAdelante->setTextAlignment(Qt::AlignCenter);
    31653189                            enTable->setItem(columna,3,valorAdelante);
     3190                            //Se estiman los clasificadores
     3191                            determinarClasificador(enTable,columna,j-2,total_ma);
    31663192                            columna++;
    31673193                        }
     
    31793205    enTable->setItem(0,2,encAtras);
    31803206    enTable->setItem(0,3,encAdelante);
     3207    //Se agregan los titulos para la clasificación de las cuentas
     3208    QTableWidgetItem *indAdelante = new QTableWidgetItem("Indicador de Encadenamiento Parcial\nhacia adelante");
     3209    encadenamientosStyle(indAdelante);
     3210    QTableWidgetItem *indAtras = new QTableWidgetItem("Indicador de  Encadenamiento Parcial\nhacia atrás");
     3211    encadenamientosStyle(indAtras);
     3212    QTableWidgetItem *clasificacion = new QTableWidgetItem("Clasificación");
     3213    encadenamientosStyle(clasificacion);
     3214    enTable->setItem(0,4,indAdelante);
     3215    enTable->setItem(0,5,indAtras);
     3216    enTable->setItem(0,6,clasificacion);
    31813217    noEditColZero(enTable);
    31823218    //Se agregan las cuentas y sus componentes
     
    31843220    //Se agregan los totales
    31853221    calcularTotalesEncadenamientos(enTable);
     3222    //Se colocan como no editables las celdas debajo de los clasificadores
     3223    RowColNoEditable(enTable,4,6,enTable->rowCount()-1,true);
    31863224    //Se auto ajustan las tablas al contenido
    31873225    enTable->resizeRowsToContents();
     
    31953233        lw->setEnabled(true);
    31963234    }
     3235}
     3236
     3237/**
     3238    @brief Función que permite estimar los valores del clasificador
     3239    @date 08/09/2016
     3240    @author Rodrigo Boet
     3241    @param <fila> Recibe la variable donde se almacenará la fila
     3242    @param <columna> Recibe la variable donde se almacenará la columna
     3243    @param <index> Recibe la ubicación del vector de donde se extraerá el valor
     3244*/
     3245void MainWindow::estimarClasificador(double &fila, double &columna, int index, int total)
     3246{
     3247    //Se buscan los botones para saber si se estimó por coeficientes técnicos o Ma
     3248    QRadioButton *rbCT = findChild<QRadioButton *>("CTButton");
     3249    QRadioButton *rbMa = findChild<QRadioButton *>("MaButton");
     3250    if(rbCT->isChecked())
     3251    {
     3252        double total_col = sumElements(vFila);
     3253        columna = vFila.at(index)/(total_col/vFila.count());
     3254        double total_row = sumElements(vColumna);
     3255        fila = vColumna.at(index)/(total_row/vColumna.count());
     3256    }
     3257    else if(rbMa->isChecked())
     3258    {
     3259        columna = (vFila.at(index)*vFila.count())/total;
     3260        fila = (vColumna.at(index)*vColumna.count())/total;
     3261    }
     3262}
     3263
     3264
     3265/**
     3266    @brief Función que hace el trabajo de calcular y determinar los clasificadores
     3267    @date 08/09/2016
     3268    @author Rodrigo Boet
     3269    @param <to> Recibe el widget de la tabla de encadenamientos
     3270    @param <index_table> Recibe el indice de la tabla de encadenamientos
     3271    @param <element> Recibe el indice de donde se extraerá el valor para calcular el clasificador
     3272*/
     3273void MainWindow::determinarClasificador(QTableWidget *tw, int index_table, int element, int total)
     3274{
     3275    QString value;
     3276    //Se estima la clasificación
     3277    double elementColumna;
     3278    double elementFila;
     3279    estimarClasificador(elementFila,elementColumna,element,total);
     3280    //Elementos de la clasificación columna
     3281    QTableWidgetItem *clasificacionColumna = new QTableWidgetItem(QString::number(elementColumna,'f',precission));
     3282    value = Separador(clasificacionColumna,false);
     3283    clasificacionColumna->setText(value);
     3284    clasificacionColumna->setFlags(clasificacionColumna->flags() ^ Qt::ItemIsEditable);
     3285    clasificacionColumna->setTextAlignment(Qt::AlignCenter);
     3286    tw->setItem(index_table,4,clasificacionColumna);
     3287    //Elementos de la clasificación fila
     3288    QTableWidgetItem *clasificacionFila = new QTableWidgetItem(QString::number(elementFila,'f',precission));
     3289    value = Separador(clasificacionFila,false);
     3290    clasificacionFila->setText(value);
     3291    clasificacionFila->setFlags(clasificacionFila->flags() ^ Qt::ItemIsEditable);
     3292    clasificacionFila->setTextAlignment(Qt::AlignCenter);
     3293    tw->setItem(index_table,5,clasificacionFila);
     3294    QTableWidgetItem *tipo = new QTableWidgetItem;
     3295    tipo->setFlags(tipo->flags() ^ Qt::ItemIsEditable);
     3296    //Se determina que tipo de cuenta es
     3297    if(elementColumna<1 and elementFila<1)
     3298    {
     3299        tipo->setText("Independiente");
     3300    }
     3301    else if(elementColumna>1 and elementFila<1)
     3302    {
     3303        tipo->setText("Impulsor de Economía");
     3304    }
     3305    else if(elementColumna<1 and elementFila>1)
     3306    {
     3307        tipo->setText("Base");
     3308    }
     3309    else if(elementColumna>1 and elementFila>1)
     3310    {
     3311        tipo->setText("Clave");
     3312    }
     3313    tw->setItem(index_table,6,tipo);
    31973314}
    31983315
     
    32603377{
    32613378    int countEndogena = tw->rowCount();
    3262     crearTablaVaciaEncadenamiento(countEndogena-2,enTable);
     3379    crearTablaVaciaEncadenamiento(countEndogena-2,enTable,7);
    32633380    int columna=0;
    32643381    for(int i=2;i<countEndogena;i++)
     
    32873404        valorAdelante->setTextAlignment(Qt::AlignCenter);
    32883405        enTable->setItem(columna,3,valorAdelante);
     3406        //Se estiman los clasificadores
     3407        determinarClasificador(enTable,columna,i-2,total_ma);
    32893408        columna++;
    32903409    }
     
    32983417    enTable->setItem(0,3,encAdelante);
    32993418    noEditColZero(enTable);
     3419    //Se agregan los titulos para la clasificación de las cuentas
     3420    QTableWidgetItem *indAdelante = new QTableWidgetItem("Indicador de Encadenamiento Parcial\nhacia adelante");
     3421    encadenamientosStyle(indAdelante);
     3422    QTableWidgetItem *indAtras = new QTableWidgetItem("Indicador de  Encadenamiento Parcial\nhacia atrás");
     3423    encadenamientosStyle(indAtras);
     3424    QTableWidgetItem *clasificacion = new QTableWidgetItem("Clasificación");
     3425    encadenamientosStyle(clasificacion);
     3426    enTable->setItem(0,4,indAdelante);
     3427    enTable->setItem(0,5,indAtras);
     3428    enTable->setItem(0,6,clasificacion);
    33003429    //Se agregan las cuentas y sus componentes
    33013430    cuentacomponentesResultado(enTable,countEndogena-1);
    33023431    //Se agregan los totales
    33033432    calcularTotalesEncadenamientos(enTable);
     3433    //Se colocan como no editables las celdas debajo de los clasificadores
     3434    RowColNoEditable(enTable,4,6,enTable->rowCount()-1,true);
    33043435    //Se auto ajustan las tablas al contenido
    33053436    enTable->resizeRowsToContents();
     
    33573488        zero->setFlags(zero->flags() ^ Qt::ItemIsEditable);
    33583489        tw->setItem(count,0,zero);
    3359         QTableWidgetItem *titulo = new QTableWidgetItem(QString("Encadenamiento Parcial %1, Total").arg(accName.at(k)));
     3490        QTableWidgetItem *titulo = new QTableWidgetItem(QString("Encadenamiento Parcial %1").arg(accName.at(k)));
    33603491        encadenamientosStyle(titulo);
    33613492        tw->setItem(count,1,titulo);
     
    33743505
    33753506/**
    3376     @brief Función que permite accionar el clasificador de cuentas
    3377     @date 01/09/2015
    3378     @author Rodrigo Boet
    3379 */
    3380 void MainWindow::slotClasificarCuentas()
    3381 {
    3382     QTableWidget *An = findChild<QTableWidget *>("MatrizAn");
    3383     QTableWidget *Ma = findChild<QTableWidget *>("MatrizMa");
    3384     int count = An->rowCount()-1;
    3385     QTableWidget *CC = new QTableWidget;
    3386     CC->setObjectName("Clasificador de Cuentas");
    3387     crearTablaVaciaEncadenamiento(count,CC,8);
    3388     cuentacomponentesResultado(CC,count-1,true);
    3389     QVector<double> vectorFila;
    3390     QVector<double> vectorColumna;
    3391     obtenerUiUj(An,vectorFila,vectorColumna);
    3392     calcularClasificador(CC,vectorFila,vectorColumna);
    3393     vectorFila.clear();
    3394     vectorColumna.clear();
    3395     obtenerUiUj(Ma,vectorFila,vectorColumna);
    3396     calcularClasificador(CC,vectorFila,vectorColumna,5);
    3397     CC->resizeColumnsToContents();//Ajuste de Columnas
    3398     agregarPrimeraCelda(CC);
    3399 
    3400     tabWidget->addTab(new QWidget,"Clasificador");
    3401     int indice=ObtenerIndice("Clasificador");
    3402     QHBoxLayout * layoutCentralWidget = new QHBoxLayout;
    3403     layoutCentralWidget->addWidget(CC);
    3404     QWidget *widget = tabWidget->widget(indice);
    3405     widget->setLayout(layoutCentralWidget);//Se añade el widget y layout a la pestaña creada
    3406     actionClasificarCuentas.setDisabled(true);
    3407     tabWidget->setCurrentIndex(indice);
    3408 }
    3409 
    3410 /**
    3411     @brief Función que permite calcular los Ui y Uj para los clasificadores
    3412     @date 03/09/2015
    3413     @author Rodrigo Boet
    3414 */
    3415 void MainWindow::obtenerUiUj(QTableWidget *tw, QVector<double> &ui, QVector<double> &uj)
    3416 {
    3417     int contador = tw->rowCount();
    3418     double totalFila = 0;
    3419     double totalColumna = 0;
    3420     QVector<double> vectorFila;
    3421     QVector<double> vectorColumna;
    3422     for(int i=2;i<contador;i++)
    3423     {
    3424         double sumaFila = 0;
    3425         double sumaColumna = 0;
    3426         for(int j=2;j<contador;j++)
    3427         {
    3428             QString itemFila = Separador(tw->item(i,j),true);
    3429             QString itemColumna = Separador(tw->item(j,i),true);
    3430             double fila = itemFila.toDouble();
    3431             double columna = itemColumna.toDouble();
    3432             sumaFila+=fila;
    3433             sumaColumna+=columna;
    3434             totalFila+=fila;
    3435             totalColumna+=columna;
    3436         }
    3437         vectorFila.append(sumaFila);
    3438         vectorColumna.append(sumaColumna);
    3439     }
    3440     int cantidad = vectorFila.count();
    3441     totalFila/=cantidad;
    3442     totalColumna/=cantidad;
    3443     for(int i=0;i<cantidad;i++)
    3444     {
    3445         double fila = vectorFila.at(i)/totalFila;
    3446         ui.append(fila);
    3447         double columna = vectorColumna.at(i)/totalColumna;
    3448         uj.append(columna);
    3449     }
    3450 }
    3451 
    3452 /**
    3453     @brief Función que permite hacer los cálculos de los clasificadores
    3454     @date 05/09/2015
    3455     @author Rodrigo Boet
    3456     @param <tw> Recibe el widget de la tabla
    3457     @param <ui> Recibe el vector Ui
    3458     @param <uj> Recibe el vector Uj
    3459     @param <init> Recibe el valor guía para cuentas y componentes
    3460 */
    3461 void MainWindow::calcularClasificador(QTableWidget *tw, QVector<double> ui, QVector<double> uj,int init)
    3462 {
    3463     int count = tw->rowCount()-1;
    3464     //Fuente Negrita
    3465     QFont font;
    3466     font.setBold(true);
    3467     //Titulos Ui, Uj y Tipo de Cuenta
    3468     QTableWidgetItem *uiItem = new QTableWidgetItem("Ui");
    3469     uiItem->setFlags(uiItem->flags() ^ Qt::ItemIsEditable);
    3470     uiItem->setFont(font);
    3471     tw->setItem(0,init,uiItem);
    3472     QTableWidgetItem *ujItem = new QTableWidgetItem("Uj");
    3473     ujItem->setFlags(ujItem->flags() ^ Qt::ItemIsEditable);
    3474     ujItem->setFont(font);
    3475     tw->setItem(0,init+1,ujItem);
    3476     QTableWidgetItem *tcItem = new QTableWidgetItem("Tipo de Cuenta");
    3477     tcItem->setFlags(tcItem->flags() ^ Qt::ItemIsEditable);
    3478     tcItem->setFont(font);
    3479     tw->setItem(0,init+2,tcItem);
     3507    @brief Función que calcular los vectores fila/columna usados para la clasificación de cuentas
     3508    @date 07/09/2016
     3509    @author Rodrigo Boet
     3510*/
     3511void MainWindow::estimarVIFVC()
     3512{
     3513    int count = An.cols();
    34803514    for(int i=0;i<count;i++)
    34813515    {
    3482         QTableWidgetItem *vFila = new QTableWidgetItem(QString::number(ui.at(i),'f',precission));
    3483         vFila->setFlags(vFila->flags() ^ Qt::ItemIsEditable);
    3484         QString itemFila = Separador(vFila,false);
    3485         vFila->setText(itemFila);
    3486         tw->setItem(i+1,init,vFila);
    3487         QTableWidgetItem *vColumna = new QTableWidgetItem(QString::number(uj.at(i),'f',precission));
    3488         vColumna->setFlags(vColumna->flags() ^ Qt::ItemIsEditable);
    3489         QString itemColumna = Separador(vColumna,false);
    3490         vColumna->setText(itemColumna);
    3491         tw->setItem(i+1,init+1,vColumna);
    3492         QTableWidgetItem *tipo = new QTableWidgetItem;
    3493         tipo->setFlags(tipo->flags() ^ Qt::ItemIsEditable);
    3494         //Se determina que tipo de cuenta es
    3495         if(ui.at(i)<1 and uj.at(i)<1)
    3496         {
    3497             tipo->setText("Independiente");
    3498         }
    3499         else if(ui.at(i)>1 and uj.at(i)<1)
    3500         {
    3501             tipo->setText("Impulsor de Economía");
    3502         }
    3503         else if(ui.at(i)<1 and uj.at(i)>1)
    3504         {
    3505             tipo->setText("Base");
    3506         }
    3507         else if(ui.at(i)>1 and uj.at(i)>1)
    3508         {
    3509             tipo->setText("Clave");
    3510         }
    3511         tw->setItem(i+1,init+2,tipo);
     3516        double fila = 0;
     3517        double columna = 0;
     3518        for(int j=0;j<count;j++)
     3519        {
     3520            fila+= An(i,j);
     3521            columna += An(j,i);
     3522        }
     3523        vFila.append(fila);
     3524        vColumna.append(columna);
    35123525    }
    35133526}
     
    35813594    }
    35823595    myHtml.append("</table>");
     3596    QCustomPlot *customPlot = new QCustomPlot;
     3597    QVector<double> x(101), y(101); // initialize with entries 0..100
     3598    for (int i=0; i<10; ++i)
     3599    {
     3600      x[i] = i/5.0 - 1; // x goes from -1 to 1
     3601      y[i] = x[i]*x[i]; // let's plot a quadratic function
     3602    }
     3603    // create graph and assign data to it:
     3604    customPlot->addGraph();
     3605    customPlot->graph(0)->setData(x, y);
     3606    //customPlot->graph(0)->setLineStyle(QCPGraph::lsNone);
     3607    customPlot->graph(0)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCross, 4));
     3608    // give the axes some labels:
     3609    customPlot->xAxis->setLabel("-y");
     3610    customPlot->yAxis->setLabel("-x");
     3611    customPlot->xAxis2->setLabel("y");
     3612    customPlot->yAxis2->setLabel("x");
     3613    // set axes ranges, so we see all data:
     3614    customPlot->xAxis->setRange(-5, 5);
     3615    customPlot->yAxis->setRange(-5, 5);
     3616    customPlot->xAxis2->setRange(-5, 5);
     3617    customPlot->yAxis2->setRange(-5, 5);
     3618    customPlot->xAxis2->setVisible(true);
     3619    customPlot->yAxis2->setVisible(true);
     3620    customPlot->replot();
     3621
    35833622    QTextDocument report;
    35843623    report.setHtml(myHtml.join(""));
    3585     QPrinter printer;
     3624    QTextCursor cursor(&report);
     3625    QPixmap pm = customPlot->toPixmap();
     3626    QImage img = pm.toImage();
     3627    cursor.movePosition(QTextCursor::End, QTextCursor::MoveAnchor);
     3628    cursor.insertImage(img);
     3629    QPrinter printer( QPrinter::HighResolution );
    35863630    printer.setOutputFileName(filename);
    35873631    printer.setOutputFormat(QPrinter::PdfFormat);
    35883632    report.print(&printer);
    3589     printer.newPage();
     3633
     3634    /*QPainter painter( &printer );
     3635    int h = painter.window().height()*0.4;
     3636    int w = h * 1.3;
     3637    int x1 = (painter.window().width() / 2) - (w/2);
     3638    int y1 = (painter.window().height() / 2) - (h/2);
     3639    painter.drawPixmap(x1, y1, w, h, customPlot->toPixmap());*/
     3640
    35903641}
    35913642
Note: See TracChangeset for help on using the changeset viewer.