Ajuda com JGraphx para grafos usando Swing

0 respostas
P

Boa noite, gostaria de uma pequena ajuda para uma boa solução de como resolver o meu problema.

Estou fazendo um software que gera um grafo wiki para explicação a partir de frases.

Por exemplo, se recebo a frase. João é um bobo.

Tenho um grafo formado com uma proposição apenas, com dois vértices, João e bobo.

A ligação entre esses se dá através da ligação "é um"

Visualmente algo assim:
[img]http://img715.imageshack.us/img715/5020/joaobobo.jpg[/img]

O que ocorre que estou fazendo isso com a lib jPGraphX até aí sem problemas lendo o manual da API consigo gerar
os grafos sem maiores problemas.

Conforme a teoria dos grafos separei os componentes, em classes distintas.

conforme segue:

Aresta:
public class Aresta
{
	/*
	 * mxGraph.insertEdge(parent, id, value, source, target, style) ? 
	 * creates and 
	 * inserts a new edge into the model, within a begin/end update call.
	 * 
	 *	 */
	private Object pai;
	private String id; 
	private String nome;
	private Vertice origem;
	private Vertice destino;
	private String estilo;
	
	
	public Aresta() {}

	public Aresta(Object pai, String id, String nome, Vertice origem,
			Vertice destino, String estilo) {
		super();
		this.pai = pai;
		this.id = id;
		this.nome = nome;
		this.origem = origem;
		this.destino = destino;
		this.estilo = estilo;
	}
	
	public Object getPai() {
		return pai;
	}
	public void setPai(Object pai) {
		this.pai = pai;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public Object getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public Vertice getOrigem() {
		return origem;
	}
	public void setOrigem(Vertice origem) {
		this.origem = origem;
	}
	public Vertice getDestino() {
		return destino;
	}
	public void setDestino(Vertice destino) {
		this.destino = destino;
	}
	public String getEstilo() {
		return estilo;
	}
	public void setEstilo(String estilo) {
		this.estilo = estilo;
	}
	
	
	
}
Classe Vertice:
public class Vertice
{
	// mxGraph.insertVertex(parent, id, value, x, y, width, height, style) ? creates and inserts a new vertex 
	//  into the model, within a begin/end update call.
	private String id;
	private String nome;
	private Integer coordenadaX;
	private Integer coordenadaY;
	private Integer largura;
	private Integer altura;
	private String estilo;
	
	Vertice(){}
	
	Vertice(String id,String nome, Integer coordenadaX, Integer coordenadaY, Integer largura,Integer altura,String estilo){
		try{
			this.id = id;
			this.nome = nome;
			this.coordenadaX = coordenadaX;
			this.coordenadaY = coordenadaY;
			this.largura = largura;
			this.altura = altura;
			this.estilo = estilo;
		}catch(Exception e){
			System.out.println("Erro ao popular o vértice");
		}
		
	}
	
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public Integer getCoordenadaX() {
		return coordenadaX;
	}
	public void setCoordenadaX(Integer coordenadaX) {
		this.coordenadaX = coordenadaX;
	}
	public Integer getCoordenadaY() {
		return coordenadaY;
	}
	public void setCoordenadaY(Integer coordenadaY) {
		this.coordenadaY = coordenadaY;
	}
	public Integer getLargura() {
		return largura;
	}
	public void setLargura(Integer largura) {
		this.largura = largura;
	}
	public Integer getAltura() {
		return altura;
	}
	public void setAltura(Integer altura) {
		this.altura = altura;
	}
	public String getEstilo() {
		return estilo;
	}
	public void setEstilo(String estilo) {
		this.estilo = estilo;
	}

}
Classe Proposição:
public class Proposicao
{
	// A proposição é a composiçao de DOIS vertices ligados via uma aresta
	
	private Vertice VerticePai = new Vertice();
	private Vertice VerticeFilho = new Vertice();
	private Aresta aresta = new Aresta();
	
	
	public Vertice getVerticePai() {
		return VerticePai;
	}
	public void setVerticePai(Vertice VerticePai) {
		this.VerticePai = VerticePai;
	}
	public Vertice getVerticeFilho() {
		return VerticeFilho;
	}
	public void setVerticeFilho(Vertice VerticeFilho) {
		this.VerticeFilho = VerticeFilho;
	}
	public Aresta getAresta() {
		return aresta;
	}
	public void setAresta(Aresta aresta) {
		this.aresta = aresta;
	}
	
}
E tudo isso é reunido via JGraph na classe MapaConceitual:
import java.util.List;

import javax.swing.JComponent;

import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.view.mxGraph;

public class MapaConceitual 
{
	public static  mxGraphComponent geraMapa(final List<Proposicao> listaProposicoes){
		
		mxGraph graph = new mxGraph();
		graph.setAllowDanglingEdges(false);
		graph.setAutoOrigin(true);
		Object parent = graph.getDefaultParent();
		
		graph.getModel().beginUpdate();
		try
		{
			int referencial = 1 ;
			for (Proposicao proposicao : listaProposicoes) {
				
				
				// Vertice Pai
				Object v1 = graph.insertVertex(
						parent, 
						proposicao.getVerticePai().getId(), 
						proposicao.getVerticePai().getNome(), 
						proposicao.getVerticePai().getCoordenadaX()+referencial*50, 
						proposicao.getVerticePai().getCoordenadaY()+referencial*25,
						proposicao.getVerticePai().getLargura(),
						proposicao.getVerticePai().getAltura());

				// Vertice Filho
				Object v2 = graph.insertVertex(
						parent, 
						proposicao.getVerticeFilho().getId(), 
						proposicao.getVerticeFilho().getNome(), 
						(proposicao.getVerticeFilho().getCoordenadaX()+referencial*50)+100, 
						(proposicao.getVerticeFilho().getCoordenadaY()+referencial*25)+100,
						proposicao.getVerticeFilho().getLargura(),
						proposicao.getVerticeFilho().getAltura());
				
				// Aresta
				
				graph.insertEdge(
						parent, 
						proposicao.getAresta().getId(), 
						proposicao.getAresta().getNome(), 
						v1, 
						v2);
				referencial+=4;
			}
		}
		finally
		{
			graph.getModel().endUpdate();
		}

		mxGraphComponent graphComponent = new mxGraphComponent(graph);
		return graphComponent;
	}
	
}

Esse graphComponent é jogado em um panel. Até aí sem problemas.

Minha dúvida é no fim das contas conceitual.

Existem casos de reincidência de um item ou vários. E o meu grafo tem que suportar isso.

Por exemplo se recebo três frases:

João é um bobo.
João é um gênio.
Pedro não é um bobo.

Obviamente o grafo não irá repetir os vertices resultando em algo assim:
[img]http://img101.imageshack.us/img101/8291/triodj.jpg[/img]

Só que tenho o objeto de proposição (conjunto do trio pai-ligação-filho) com diversas informações e quero dicas de como montar essa lista e plotar tudo na tela.

Basicamente preciso disso, idéias de como receber várias frases de parâmetro (isso já recebo sem problemas) e
ir circulando as opções unindo as coisas repetidas para deixar apenas um repetição de cada parâmetro.

Pensei em normalizar a entrada, por exemplo João seria colocado pra lower + removido acentos e jogado em um hashmap de "pais" e fazer o mesmo de filhos..
Os problemas começam quando o pai de um, pode e normalmente é filho de outro, onde no caso poderia usar o serial id do graphComponent em um hash map

Exemplo:
[img]http://img694.imageshack.us/img694/8806/frutasb.jpg[/img]

Bom preciso de ajuda, ando trabalhando demais, e quando vejo esse meu trabalho fumego minha cabeça mas sem idéias.. o.O
Quem já mexeu com essa lib, ou tenha feito algo parecido pode me dar essa luz...

Obrigado a você por ter lido. :D E desculpe pelas imagens exemplo.. :lol: Agora faça uma pessoa feliz e dê uma dica :roll: :idea:

Qualquer dúvida perguntem que eu respondo e posso mostrar mais alguns fontes, embora o que importa está aí.......

Obrigado por ter lido tudo isso :D

Criado 1 de junho de 2011
Respostas 0
Participantes 1