// // // PHPH.com.br - Desenvolvimento de software com a biblioteca JFreeChart (Java)
All for Joomla All for Webmasters

Desenvolvimento de software com a biblioteca JFreeChart (Java)

Sempre que necessitamos desenvolver ferramentas computacionais convencionais (que não sejam do escopo de outras soluções mais específicas como MATLAB, Simulink ou LabVIEW), utilizamos as plataformas de desenvolvimento C# ou Java. Neste exemplo de aplicação, demonstrarem o desenvolvimento de um software escrito em Java que consiste em uma interface gráfica livre (software livre GNU GPL) composta por cerca de 10.000 linhas de código-fonte e 80 (oitenta) classes diferentes para um simulador de sistemas de potência brasileiro ANAFAS. Esse software livre denominado ANAFAS-GUI utiliza a poderosa biblioteca de plotagem de gráficos JFreeChart.

A aplicação visou a simulação de faltas de maneira automatizada e gráfica, com a interpretação das entradas e saídas do software de simulação em si, que apresenta uma sistema bastante obsoleto de transferência de dados baseado nos antigos campos em cartões. A modelagem orientada a objetos do software foi baseada no manual do usuário da aplicação e sempre que possível ela tentou se afastar da metodologia de funcionamento do ANAFAS em si e convergir para os modelos e parâmetros estudos na Análise de Sistemas de Potência.

A IDE que utilizamos para desenvolvimento Java é o NetBeans e todo o sistema foi devidamente organizado em pacotes:

java anafasgui pacotes

Ainda, para garantir o término do software de acordo com o cronograma exigido, todo o sistema foi modelado previamente por meio da UML, amenizando as dificuldades em trabalhar com outro software obsoleto:

java anafasgui UML

java anafasgui UML

Um dos recursos que consideramos mais importantes em qualquer desenvolvimento Java do NetBeans é o GUI Builder que permite o fácil trabalho com os componentes gráficos da plataforma Java:

java anafasgui janela impedancias

java anafasgui gui builder

java anafasgui gui builder

Em relação ao JFreeChart, trata-se de uma framework bem documentada e com suporte a inúmeros tipos de gráficos. É clarividente que não temos as mesmas facilidades do MATLAB ou LabVIEW, mas nem sempre essas duas plataformas são a melhor escolha no desenvolvimento de softwares para engenharia.

Abaixo, podemos verificar a simplicidade do código-fonte correlacionado à geração de gráficos no JFreeChart desse sistema. Conforme podemos visualizar, o código-fonte foi desenvolvido em português inclusive com a utilização de acentos, o que não gera nenhum problema devido à capacidade de suportar UTF-8 do Java e NetBeans IDE.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


package anafasgui.formatação;

import anafas.sistema.Barra;
import anafas.sistema.Circuito;
import anafas.sistema.defeito.ImpedânciasFalta;
import anafasgui.resultados.ResultadoMonitoração;
import anafasgui.resultados.ResultadoSimulações;
import java.io.Serializable;
import java.util.HashMap;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 * Geração e formatação de gráficos com o JFreeChart
 */

public class GeradorGráficos {

    /**
     * Retorna o gráfico XY referentes aos resultados de uma falta deslizante - 
     * módulo da tensão da fase com o pior afundamento de tensão
     * O título pode incluir ou não a expressão "com GD" conforme o argumento títuloComGD
     * @param resultado resultado da falta deslizante
     * @return gráfico AMT X posição
     */

    public static ChartPanel getGráficoXY_PiorFase(ResultadoSimulações resultado, boolean títuloComGD){
        HashMap<Barra, XYSeries> coleçãoSéries = new HashMap<Barra,XYSeries>();        
        XYSeriesCollection dataset = new XYSeriesCollection();
        
        ResultadoMonitoração monitor = resultado.getResultadoLocalização(0);
        for (Barra indice: monitor.getBarrasMonitoradas()){
            XYSeries série = new XYSeries("Barra nº "+indice.getNúmero()+": "+indice.getNome());
            coleçãoSéries.put(indice, série);
            dataset.addSeries(série);
        }
            
        
        //ImpedânciasFalta impedâncias = resultado.getImpedânciasFalta();
        

        for (Integer i:resultado.getPontosFalta()){
            monitor = resultado.getResultadoLocalização(i);
            for (Barra indice: monitor.getBarrasMonitoradas()){
                coleçãoSéries.get(indice).add((double)i, monitor.getMóduloTensãoPiorFase(indice));
            }
        }

        Circuito circuitoDefeituoso = resultado.getCircuitoDefeituoso();
        String especificaçãoCircuito = circuitoDefeituoso.getBarraDe().getNúmero()+ " ("+circuitoDefeituoso.getBarraDe().getNome()+")" + " e " + circuitoDefeituoso.getBarraPara().getNúmero()+ " ("+circuitoDefeituoso.getBarraPara().getNome()+")";
        String título = "Falta deslizante no circuito entre as barras "+especificaçãoCircuito;

        if (títuloComGD == true){
            título += "\n (com geração distribuída)";
        }

        JFreeChart chart = ChartFactory.createXYLineChart(título, "Localização do curto-circuito (%)""Tensão remanescente [p.u.]", dataset, PlotOrientation.VERTICAL, truefalsefalse);
        XYPlot plot = (XYPlot) chart.getPlot();
        plot.getDomainAxis().setRange(0, 100);

        return new ChartPanel(chart, false);
    }

    /**
     * Retorna o gráfico XY referentes aos resultados de uma falta deslizante -
     * módulo da tensão da fase com o pior afundamento de tensão.
     * O título não incluirá a expressão "com GD"
     * @param resultado resultado da falta deslizante
     * @return gráfico AMT X posição
     */

    public static ChartPanel getGráficoXY_PiorFase(ResultadoSimulações resultado){
        return GeradorGráficos.getGráficoXY_PiorFase(resultado, false);
    }
}

Deixe um comentário

Certifique-se de preencher os campos indicados com (*). Não é permitido código HTML.