Desenvolvimento de software com a biblioteca JFreeChart (Java)
- Publicado em Java C#
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:
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:
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:
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, true, false, false);
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);
}
}