From a0474a103147948d71208dcfe35e41f604207df8 Mon Sep 17 00:00:00 2001 From: Fernando Jorge Mota Date: Tue, 21 Oct 2014 21:31:07 -0200 Subject: [PATCH 1/5] =?UTF-8?q?Adiciona=20fun=C3=A7=C3=A3o=20'Simular'=20a?= =?UTF-8?q?o=20simulador.=20Precisa=20de=20alguma=20refatora=C3=A7=C3=A3o,?= =?UTF-8?q?=20mas=20aparentemente=20funciona=20:D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../simulador-de-circuitos/.classpath | 6 ++ .../simulador-de-circuitos/.project | 17 ++++ src/Main.java | 38 +++++--- src/editores/EditorAnd.java | 18 ++-- src/editores/EditorBotao.java | 20 +++++ src/editores/EditorLinha.java | 62 ++++++------- src/editores/EditorNOR.java | 20 ++--- src/editores/EditorNOT.java | 18 ++-- src/editores/EditorNXOR.java | 18 ++-- src/editores/EditorNand.java | 16 ++-- src/editores/EditorOR.java | 20 +++-- src/editores/EditorPortaLogica.java | 10 ++- src/editores/EditorXor.java | 16 ++-- src/models/AND.java | 58 ++++++++---- src/models/Botao.java | 37 ++++++++ src/models/Circulo.java | 50 +++++++++-- src/models/Entrada.java | 6 +- src/models/Linha.java | 88 ++++++++++++++++--- src/models/NAND.java | 28 +++++- src/models/NOR.java | 52 +++++++---- src/models/NOT.java | 50 +++++++---- src/models/NXOR.java | 50 +++++++---- src/models/OR.java | 59 +++++++++---- src/models/Ponto.java | 17 ++-- src/models/PortaLogica.java | 56 +++++++++++- src/models/Retangulo.java | 27 +++--- src/models/Saida.java | 11 ++- src/models/Sinal.java | 8 ++ src/models/XOR.java | 25 +++++- src/views/Editavel.java | 11 ++- src/views/FigAND.java | 24 ++--- src/views/FigBotao.java | 28 ++++++ src/views/FigLinha.java | 15 +++- src/views/FigNAND.java | 22 ++--- src/views/FigNOR.java | 24 ++--- src/views/FigNOT.java | 24 ++--- src/views/FigNXOR.java | 24 ++--- src/views/FigOR.java | 24 ++--- src/views/FigXOR.java | 24 ++--- src/views/Modo.java | 25 +++--- src/views/Paleta.java | 29 +++--- src/views/Quadro.java | 13 +-- src/views/Selecionavel.java | 1 + 43 files changed, 836 insertions(+), 353 deletions(-) create mode 100644 classes/production/simulador-de-circuitos/.classpath create mode 100644 classes/production/simulador-de-circuitos/.project create mode 100644 src/editores/EditorBotao.java create mode 100644 src/models/Botao.java create mode 100644 src/models/Sinal.java create mode 100644 src/views/FigBotao.java diff --git a/classes/production/simulador-de-circuitos/.classpath b/classes/production/simulador-de-circuitos/.classpath new file mode 100644 index 0000000..233be1d --- /dev/null +++ b/classes/production/simulador-de-circuitos/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/classes/production/simulador-de-circuitos/.project b/classes/production/simulador-de-circuitos/.project new file mode 100644 index 0000000..0f6f6a7 --- /dev/null +++ b/classes/production/simulador-de-circuitos/.project @@ -0,0 +1,17 @@ + + + src + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/src/Main.java b/src/Main.java index 025ed04..e058208 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,4 +1,5 @@ import editores.Editor; +import models.Botao; import views.Modo; import views.Paleta; import views.Quadro; @@ -74,6 +75,11 @@ public static void main(String[] argv) { item.addActionListener(paleta); guia.add(item); + item = new JMenuItem("Botão"); + item.setActionCommand(Paleta.BOTAO); + item.addActionListener(paleta); + guia.add(item); + guia = new JMenu("Modo"); barra.add(guia); @@ -92,6 +98,11 @@ public static void main(String[] argv) { item.addActionListener(modo); guia.add(item); + item = new JMenuItem("Simular"); + item.setActionCommand(Modo.SIMULAR); + item.addActionListener(modo); + guia.add(item); + f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(800, 600); @@ -99,7 +110,7 @@ public static void main(String[] argv) { desenhar(); } - public void actionPerformed(ActionEvent e){ + public void actionPerformed(ActionEvent e) { System.exit(0); //sai da aplicação com o código de status zero } @@ -114,7 +125,7 @@ public void mouseClicked(MouseEvent e) { int x = e.getX(); int y = e.getY(); Editor editor = Main.paleta.editor(); - if(editor == null){ + if (editor == null) { JOptionPane.showMessageDialog(null, "Selecione um componente no menu 'Paleta'!"); } else { @@ -128,24 +139,31 @@ public void mousePressed(MouseEvent e) { int x = e.getX(); int y = e.getY(); figuraSelecionada = Main.quadro.pegaObjetoEm(x, y); - if(figuraSelecionada == null) { + if (figuraSelecionada == null) { JOptionPane.showMessageDialog(null, "Selecione um componente e arraste!"); - } - else { + } else { figuraSelecionada.selecionaPonto(x, y); } - } - else if(modo.estaApagando()){ + } else if (modo.estaApagando()) { int x = e.getX(); int y = e.getY(); figuraSelecionada = Main.quadro.pegaObjetoEm(x, y); - if(figuraSelecionada == null) { + if (figuraSelecionada == null) { JOptionPane.showMessageDialog(null, "Selecione um componente para apagar"); - } - else { + } else { quadro.removeFig(figuraSelecionada); quadro.repaint(); } + } else if (modo.estaSimulando()) { + int x = e.getX(); + int y = e.getY(); + figuraSelecionada = Main.quadro.pegaObjetoEm(x, y); + if (figuraSelecionada instanceof Botao) { + figuraSelecionada.calcula(); + quadro.repaint(); + } else { + JOptionPane.showMessageDialog(null, "Clique em um botão para simular"); + } } } diff --git a/src/editores/EditorAnd.java b/src/editores/EditorAnd.java index 7b20f74..207fe97 100644 --- a/src/editores/EditorAnd.java +++ b/src/editores/EditorAnd.java @@ -1,19 +1,19 @@ package editores; -import views.*; -import models.*; - -import javax.swing.*; +import models.Ponto; +import views.FigAND; +import views.Quadro; public class EditorAnd extends EditorPortaLogica { - public EditorAnd(Quadro quadro){ + public EditorAnd(Quadro quadro) { super(quadro); - } - public void clique(int x, int y){ + } + + public void clique(int x, int y) { FigAND and = new FigAND(new Ponto(x, y)); - if(this.continuaInsercao(and)){ + if (this.continuaInsercao(and)) { this.quadro.addFig(and); this.quadro.repaint(); } - } + } } diff --git a/src/editores/EditorBotao.java b/src/editores/EditorBotao.java new file mode 100644 index 0000000..f07744f --- /dev/null +++ b/src/editores/EditorBotao.java @@ -0,0 +1,20 @@ +package editores; + +import models.Ponto; +import views.FigAND; +import views.FigBotao; +import views.Quadro; + +public class EditorBotao extends EditorPortaLogica { + public EditorBotao(Quadro quadro) { + super(quadro); + } + + public void clique(int x, int y) { + FigBotao botao = new FigBotao(new Ponto(x, y)); + if (this.continuaInsercao(botao)) { + this.quadro.addFig(botao); + this.quadro.repaint(); + } + } +} diff --git a/src/editores/EditorLinha.java b/src/editores/EditorLinha.java index 4c8583a..a41ac12 100644 --- a/src/editores/EditorLinha.java +++ b/src/editores/EditorLinha.java @@ -2,35 +2,34 @@ import models.*; import views.FigLinha; -import views.Modo; import views.Quadro; import views.Reproduzivel; import javax.swing.*; -public class EditorLinha implements Editor{ +public class EditorLinha implements Editor { private Quadro quadro; private FigLinha linha; private int nEstado = 0; + public EditorLinha(Quadro quadro) { this.quadro = quadro; } - public void clique(int x, int y){ + public void clique(int x, int y) { Circulo circulo = null; Reproduzivel figura = this.quadro.pegaObjetoEm(x, y); - if(nEstado == 0) { + if (nEstado == 0) { linha = new FigLinha(); this.quadro.addFig(linha); - if(figura == null) { + if (figura == null) { JOptionPane.showMessageDialog(null, "Selecione um ponto em um conector ou saida em uma porta logica!"); return; - } - else if (figura instanceof PortaLogica) { // Se o objeto selecionado for uma PortaLogica... + } else if (figura instanceof PortaLogica) { // Se o objeto selecionado for uma PortaLogica... PortaLogica porta = (PortaLogica) figura; Saida[] saidas = porta.pegaSaidas(); - for(int i=0; i < saidas.length; i++){ - if(saidas[i].contemPonto(x, y)) { + for (int i = 0; i < saidas.length; i++) { + if (saidas[i].contemPonto(x, y)) { circulo = saidas[i]; break; } @@ -39,25 +38,26 @@ else if (figura instanceof PortaLogica) { // Se o objeto selecionado for uma Por JOptionPane.showMessageDialog(null, "Selecione a saida da porta logica!"); return; } - } - else if(figura instanceof Linha) { // Se o objeto selecionado for uma Linha... - Linha linha = (Linha) figura; - Circulo[] pontos = linha.pontos(); - for(int i=0; i 1) { + } else if (linha.npontos() > 1) { + porta.conectaEntrada(linha); + linha.conectaSaida(porta); nEstado = 0; - } - else { + } else { JOptionPane.showMessageDialog(null, "Por favor, adicione pelo menos mais um ponto antes de conectar este cabo diretamente a uma porta lógica!"); return; } - } - else if(figura instanceof Linha) { + } else if (figura instanceof Linha) { Linha linhaSelecionada = (Linha) figura; Circulo[] pontos = linhaSelecionada.pontos(); - for(int i=0; i 1) { + if (linha.npontos() > 1) { + linhaSelecionada.conectaEntrada(linha); + linha.conectaSaida(linhaSelecionada); nEstado = 0; - } - else { + } else { JOptionPane.showMessageDialog(null, "Por favor, adicione pelo menos mais um ponto antes de conectar este cabo diretamente a uma outro cabo!"); return; } diff --git a/src/editores/EditorNOR.java b/src/editores/EditorNOR.java index ccc8f50..5ed134c 100644 --- a/src/editores/EditorNOR.java +++ b/src/editores/EditorNOR.java @@ -1,20 +1,20 @@ package editores; -import views.*; -import models.*; - -import javax.swing.*; +import models.Ponto; +import views.FigNOR; +import views.Quadro; public class EditorNOR extends EditorPortaLogica { - public EditorNOR(Quadro quadro){ - super(quadro); - } - public void clique(int x, int y){ + public EditorNOR(Quadro quadro) { + super(quadro); + } + + public void clique(int x, int y) { FigNOR nand = new FigNOR(new Ponto(x, y)); - if(this.continuaInsercao(nand)){ + if (this.continuaInsercao(nand)) { this.quadro.addFig(nand); this.quadro.repaint(); } - } + } } \ No newline at end of file diff --git a/src/editores/EditorNOT.java b/src/editores/EditorNOT.java index 2e06aa8..d00f5c4 100644 --- a/src/editores/EditorNOT.java +++ b/src/editores/EditorNOT.java @@ -1,17 +1,19 @@ package editores; -import views.*; -import models.*; +import models.Ponto; +import views.FigNOT; +import views.Quadro; public class EditorNOT extends EditorPortaLogica { - public EditorNOT(Quadro quadro){ - super(quadro); - } - public void clique(int x, int y){ + public EditorNOT(Quadro quadro) { + super(quadro); + } + + public void clique(int x, int y) { FigNOT not = new FigNOT(new Ponto(x, y)); - if(this.continuaInsercao(not)) { + if (this.continuaInsercao(not)) { this.quadro.addFig(not); this.quadro.repaint(); } - } + } } \ No newline at end of file diff --git a/src/editores/EditorNXOR.java b/src/editores/EditorNXOR.java index 2f0bd7b..7f4f9e7 100644 --- a/src/editores/EditorNXOR.java +++ b/src/editores/EditorNXOR.java @@ -1,17 +1,19 @@ package editores; -import views.*; -import models.*; +import models.Ponto; +import views.FigNXOR; +import views.Quadro; public class EditorNXOR extends EditorPortaLogica { - public EditorNXOR(Quadro quadro){ - super(quadro); - } - public void clique(int x, int y){ + public EditorNXOR(Quadro quadro) { + super(quadro); + } + + public void clique(int x, int y) { FigNXOR nxor = new FigNXOR(new Ponto(x, y)); - if(this.continuaInsercao(nxor)) { + if (this.continuaInsercao(nxor)) { this.quadro.addFig(nxor); this.quadro.repaint(); } - } + } } \ No newline at end of file diff --git a/src/editores/EditorNand.java b/src/editores/EditorNand.java index 700475f..2eeb2ce 100644 --- a/src/editores/EditorNand.java +++ b/src/editores/EditorNand.java @@ -1,17 +1,17 @@ package editores; -import views.*; -import models.*; - -import javax.swing.*; +import models.Ponto; +import views.FigNAND; +import views.Quadro; public class EditorNand extends EditorPortaLogica { - public EditorNand(Quadro quadro){ + public EditorNand(Quadro quadro) { super(quadro); } - public void clique(int x, int y){ - FigNAND nand = new FigNAND(new Ponto(x,y)); - if(this.continuaInsercao(nand)){ + + public void clique(int x, int y) { + FigNAND nand = new FigNAND(new Ponto(x, y)); + if (this.continuaInsercao(nand)) { this.quadro.addFig(nand); this.quadro.repaint(); } diff --git a/src/editores/EditorOR.java b/src/editores/EditorOR.java index 9185c9d..f9c9244 100644 --- a/src/editores/EditorOR.java +++ b/src/editores/EditorOR.java @@ -1,18 +1,20 @@ package editores; -import views.*; -import models.*; +import models.Ponto; +import views.FigOR; +import views.Quadro; -public class EditorOR extends EditorPortaLogica{ - public EditorOR(Quadro quadro){ - super(quadro); - } - public void clique(int x, int y){ +public class EditorOR extends EditorPortaLogica { + public EditorOR(Quadro quadro) { + super(quadro); + } + + public void clique(int x, int y) { FigOR or = new FigOR(new Ponto(x, y)); - if(this.continuaInsercao(or)) { + if (this.continuaInsercao(or)) { this.quadro.addFig(or); this.quadro.repaint(); } - } + } } \ No newline at end of file diff --git a/src/editores/EditorPortaLogica.java b/src/editores/EditorPortaLogica.java index 19174f1..ab9e5ce 100644 --- a/src/editores/EditorPortaLogica.java +++ b/src/editores/EditorPortaLogica.java @@ -7,21 +7,23 @@ public abstract class EditorPortaLogica implements Editor { protected Quadro quadro; + public EditorPortaLogica(Quadro quadro) { this.quadro = quadro; } + protected boolean colideCom(PortaLogica porta) { - return this.quadro.pegaObjetoEm(porta.x(), porta.y()) != null + return this.quadro.pegaObjetoEm(porta.x(), porta.y()) != null || this.quadro.pegaObjetoEm(porta.x() + porta.largura(), porta.y()) != null || this.quadro.pegaObjetoEm(porta.x(), porta.y() + porta.altura()) != null || this.quadro.pegaObjetoEm(porta.x() + porta.largura(), porta.y() + porta.altura()) != null; } + protected boolean continuaInsercao(PortaLogica porta) { - if(this.colideCom(porta)){ + if (this.colideCom(porta)) { JOptionPane.showMessageDialog(null, "Não sobreponha esta porta lógica sob outra porta lógica ou cabo!"); return false; - } - else { + } else { return true; } } diff --git a/src/editores/EditorXor.java b/src/editores/EditorXor.java index c83222c..e6c25cb 100644 --- a/src/editores/EditorXor.java +++ b/src/editores/EditorXor.java @@ -1,15 +1,17 @@ package editores; -import views.*; -import models.*; +import models.Ponto; +import views.FigXOR; +import views.Quadro; -public class EditorXor extends EditorPortaLogica{ - public EditorXor(Quadro quadro){ +public class EditorXor extends EditorPortaLogica { + public EditorXor(Quadro quadro) { super(quadro); } - public void clique(int x, int y){ - FigXOR xor = new FigXOR(new Ponto(x,y)); - if(this.continuaInsercao(xor)) { + + public void clique(int x, int y) { + FigXOR xor = new FigXOR(new Ponto(x, y)); + if (this.continuaInsercao(xor)) { this.quadro.addFig(xor); this.quadro.repaint(); } diff --git a/src/models/AND.java b/src/models/AND.java index dcfdb82..b5b6384 100644 --- a/src/models/AND.java +++ b/src/models/AND.java @@ -1,23 +1,45 @@ package models; -public class AND extends PortaLogica{ - public AND(Ponto superiorEsquerdo){ - super(superiorEsquerdo); - } - - public Entrada[] pegaEntradas() { - Entrada[] entradasAnd = new Entrada[2]; - entradasAnd[0] = new Entrada(this, 0, 13); - entradasAnd[1] = new Entrada(this, 0, 39); - return entradasAnd; - } - public Saida[] pegaSaidas() { - Saida[] saidasAnd = new Saida[1]; - saidasAnd[0] = new Saida(this, 87, 26); - return saidasAnd; - } - - public int altura(){ +import views.Editavel; + +import java.util.ArrayList; +import java.util.List; + +public class AND extends PortaLogica { + public AND(Ponto superiorEsquerdo) { + super(superiorEsquerdo); + } + + public Entrada[] pegaEntradas() { + Entrada[] entradasAnd = new Entrada[2]; + entradasAnd[0] = new Entrada(this, 0, 13); + entradasAnd[1] = new Entrada(this, 0, 39); + return entradasAnd; + } + + public Saida[] pegaSaidas() { + Saida[] saidasAnd = new Saida[1]; + saidasAnd[0] = new Saida(this, 87, 26); + return saidasAnd; + } + + public void calcula() { + Sinal oldValor = this.valor; + this.valor = this.entradas.isEmpty() ? Sinal.DESATIVADO : Sinal.ATIVADO; + for(Editavel entrada: this.entradas) { + if (entrada.pegaValor() == Sinal.DESATIVADO) { + this.valor = Sinal.DESATIVADO; + break; + } + } + if (oldValor != this.valor) { + for(Editavel saida: this.saidas) { + saida.calcula(); + } + } + } + + public int altura() { return 53; } diff --git a/src/models/Botao.java b/src/models/Botao.java new file mode 100644 index 0000000..69fdf97 --- /dev/null +++ b/src/models/Botao.java @@ -0,0 +1,37 @@ +package models; + + +import views.Editavel; + +public class Botao extends PortaLogica +{ + public Botao(Ponto superiorEsquerdo) { + super(superiorEsquerdo); + } + + public Entrada[] pegaEntradas() { + Entrada[] entradasBotao = new Entrada[0]; + return entradasBotao; + } + + public Saida[] pegaSaidas() { + Saida[] saidasAnd = new Saida[1]; + saidasAnd[0] = new Saida(this, 10, 10, 10); + return saidasAnd; + } + + public void calcula() { + this.valor = this.valor == Sinal.ATIVADO ? Sinal.DESATIVADO : Sinal.ATIVADO; + for(Editavel saida: this.saidas) { + saida.calcula(); + } + } + + public int altura() { + return 20; + } + + public int largura() { + return 20; + } +} diff --git a/src/models/Circulo.java b/src/models/Circulo.java index c31655a..f9d4ec3 100644 --- a/src/models/Circulo.java +++ b/src/models/Circulo.java @@ -2,38 +2,74 @@ import views.Editavel; -public class Circulo extends Ponto implements Editavel{ +public class Circulo extends Ponto implements Editavel { private int raio; private int xSel, ySel; public Circulo(int x, int y, int raio) { - super(x,y); + super(x, y); this.raio = raio; } + @Override + public void apaga() { + + } + + @Override + public void conectaSaida(Editavel saida) { + + } + + @Override + public void conectaEntrada(Editavel entrada) { + + } + + @Override + public void desconectaSaida(Editavel saida) { + + } + + @Override + public void desconectaEntrada(Editavel entrada) { + + } + + @Override + public void calcula() { + + } + + @Override + public Sinal pegaValor() { + return null; + } + public int diametro() { - return 2*raio; + return 2 * raio; } public int x0() { return this.x0(raio); } + public int y0() { return this.y0(raio); } public boolean contemPonto(int x, int y) { - return this.x0() <= x && (this.x0() + this.diametro()) >= x && this.y0() <= y && (this.y0()+this.diametro()) >= y; + return this.x0() <= x && (this.x0() + this.diametro()) >= x && this.y0() <= y && (this.y0() + this.diametro()) >= y; } // Seleciona o retangulo public void selecionaPonto(int x, int y) { - this.xSel = x-this.x0(); - this.ySel = y-this.y0(); + this.xSel = x - this.x0(); + this.ySel = y - this.y0(); } // Move o ponto - public void movePara(int x, int y){ + public void movePara(int x, int y) { x -= this.xSel; y -= this.ySel; this.deslocarX(x - this.x0()); diff --git a/src/models/Entrada.java b/src/models/Entrada.java index 19e3323..15ab357 100644 --- a/src/models/Entrada.java +++ b/src/models/Entrada.java @@ -1,9 +1,10 @@ package models; -import models.Ponto; +import views.Editavel; public class Entrada extends Circulo { PortaLogica referencia; + Entrada(PortaLogica referencia, int x, int y) { super(x, y, 5); this.referencia = referencia; @@ -12,7 +13,8 @@ public class Entrada extends Circulo { public int x0() { return this.referencia.x() + super.x0(); } + public int y0() { - return this.referencia.y() + super.y0() ; + return this.referencia.y() + super.y0(); } } diff --git a/src/models/Linha.java b/src/models/Linha.java index 8bccb01..e44f1cb 100644 --- a/src/models/Linha.java +++ b/src/models/Linha.java @@ -1,18 +1,78 @@ package models; -import models.Ponto; import views.Editavel; +import views.Reproduzivel; import java.util.ArrayList; import java.util.List; -public class Linha implements Editavel{ +public class Linha implements Editavel { private List pontos = new ArrayList(); private Circulo pontoSelecionado = null; // Guarda o ponto selecionado da linha. Ver se ha melhor forma de fazer isso. + protected List entradas = new ArrayList(); + protected List saidas = new ArrayList(); + protected Sinal valor; + + public void apaga() { + for(Editavel entrada: entradas) { + if (entrada instanceof PortaLogica) { + PortaLogica porta = (PortaLogica) entrada; + porta.desconectaSaida(this); + } else if(entrada instanceof Linha) { + Linha linha = (Linha) entrada; + linha.desconectaSaida(this); + } + } + for(Editavel saida: saidas) { + if (saida instanceof PortaLogica) { + PortaLogica porta = (PortaLogica) saida; + porta.desconectaEntrada(this); + } else if(saida instanceof Linha) { + Linha linha = (Linha) saida; + linha.desconectaEntrada(this); + } + } + } + + public void conectaSaida(Editavel saida) { + this.saidas.add(saida); + } + + public void conectaEntrada(Editavel entrada) { + this.entradas.add(entrada); + } + + public void desconectaSaida(Editavel saida) { + this.saidas.remove(saida); + } + + public void desconectaEntrada(Editavel entrada) { + this.entradas.remove(entrada); + } + + public void calcula(){ + Sinal oldValor = this.valor; + this.valor = Sinal.DESATIVADO; + for(Editavel entrada: this.entradas) { + if (entrada.pegaValor() == Sinal.ATIVADO) { + this.valor = Sinal.ATIVADO; + break; + } + } + if (oldValor != this.valor) { + for(Editavel saida: this.saidas) { + saida.calcula(); + } + } + } + + public Sinal pegaValor() { + return this.valor; + } public int[] x() { int[] x = new int[npontos()]; - for(int i=0, l = npontos(); i < l; i++) { + for (int i = 0, l = npontos(); i < l; i++) { x[i] = pontos.get(i).x0(); } return x; @@ -20,27 +80,27 @@ public int[] x() { public int[] y() { int[] y = new int[npontos()]; - for(int i=0, l = npontos(); i < l; i++) { + for (int i = 0, l = npontos(); i < l; i++) { y[i] = pontos.get(i).y0(); } return y; } - public Circulo[] pontos(){ + public Circulo[] pontos() { Circulo[] resultado = new Circulo[pontos.size()]; - for(int i=0; i entradas = new ArrayList(); + protected List saidas = new ArrayList(); + protected Sinal valor; + protected PortaLogica(Ponto superiorEsquerdo) { super(superiorEsquerdo); this.centralizaClique(); } + public void apaga() { + for(Editavel entrada: entradas) { + Linha linha = (Linha) entrada; + linha.desconectaSaida(this); + } + for(Editavel saida: saidas) { + Linha linha = (Linha) saida; + linha.desconectaEntrada(this); + } + } + + public void conectaSaida(Editavel saida) { + this.saidas.add(saida); + } + + public void conectaEntrada(Editavel entrada) { + if (this.entradas.size() >= this.pegaEntradas().length) { + JOptionPane.showMessageDialog(null, "Você não pode adicionar mais entradas a esta porta lógica"); + return; + } + this.entradas.add(entrada); + } + + public void desconectaSaida(Editavel saida) { + this.saidas.remove(saida); + } + + public void desconectaEntrada(Editavel entrada) { + this.entradas.remove(entrada); + } + + public abstract void calcula(); + + public Sinal pegaValor() { + return this.valor; + } + + // Porta logicas tambem tem entradas... public abstract Entrada[] pegaEntradas(); @@ -18,10 +66,10 @@ protected PortaLogica(Ponto superiorEsquerdo) { // E tambem altura.. abstract public int altura(); - // Desloca X e Y de forma que a porta logica apaerca exatamente no meio do clique do usuario + // Desloca X e Y de forma que a porta logica apareca exatamente no meio do clique do usuario protected void centralizaClique() { - int mediaAltura = this.altura()/2; - int mediaLargura = this.largura()/2; + int mediaAltura = this.altura() / 2; + int mediaLargura = this.largura() / 2; this.deslocarX(-(mediaLargura)); this.deslocarY(-(mediaAltura)); } diff --git a/src/models/Retangulo.java b/src/models/Retangulo.java index 2f7d4c6..e378cdf 100644 --- a/src/models/Retangulo.java +++ b/src/models/Retangulo.java @@ -1,26 +1,27 @@ package models; import views.Editavel; -import views.Selecionavel; -public class Retangulo implements Editavel { +public abstract class Retangulo implements Editavel { private Ponto ponto1, ponto2; private int xSel, ySel; // Usados para guardar o x e y selecionados. Ver se ha melhor forma de fazer isso. - public Retangulo(Ponto ponto1, Ponto ponto2){ + + public Retangulo(Ponto ponto1, Ponto ponto2) { this.ponto1 = ponto1; this.ponto2 = ponto2; } public Retangulo(Ponto superiorEsquerdo) { this.ponto1 = superiorEsquerdo; - this.ponto2 = new Ponto(superiorEsquerdo.x()+this.largura(), superiorEsquerdo.y()+this.altura()); + this.ponto2 = new Ponto(superiorEsquerdo.x() + this.largura(), superiorEsquerdo.y() + this.altura()); } - public void deslocarX(int val){ + public void deslocarX(int val) { ponto1.deslocarX(val); ponto2.deslocarX(val); } - public void deslocarY(int val){ + + public void deslocarY(int val) { ponto1.deslocarY(val); ponto2.deslocarY(val); } @@ -30,29 +31,29 @@ public int x() { } public int y() { - return this.ponto1.ysup(this.ponto2); + return this.ponto1.ysup(this.ponto2); } - public int largura(){ + public int largura() { return ponto1.distanciaX(ponto2); } - public int altura(){ + public int altura() { return ponto1.distanciaY(ponto2); } public boolean contemPonto(int x, int y) { - return this.x() <= x && (this.x() + this.largura()) >= x && this.y() <= y && (this.y()+this.altura()) >= y; + return this.x() <= x && (this.x() + this.largura()) >= x && this.y() <= y && (this.y() + this.altura()) >= y; } // Seleciona o retangulo public void selecionaPonto(int x, int y) { - this.xSel = x-this.x(); - this.ySel = y-this.y(); + this.xSel = x - this.x(); + this.ySel = y - this.y(); } // Move o ponto - public void movePara(int x, int y){ + public void movePara(int x, int y) { x -= this.xSel; y -= this.ySel; this.deslocarX(x - this.x()); diff --git a/src/models/Saida.java b/src/models/Saida.java index c34b389..103ec57 100644 --- a/src/models/Saida.java +++ b/src/models/Saida.java @@ -1,18 +1,25 @@ package models; -import models.Ponto; +import views.Editavel; public class Saida extends Circulo { PortaLogica referencia; + Saida(PortaLogica referencia, int x, int y) { super(x, y, 5); this.referencia = referencia; } + Saida(PortaLogica referencia, int x, int y, int raio) { + super(x, y, raio); + this.referencia = referencia; + } + public int x0() { return this.referencia.x() + super.x0(); } + public int y0() { - return this.referencia.y() + super.y0() ; + return this.referencia.y() + super.y0(); } } diff --git a/src/models/Sinal.java b/src/models/Sinal.java new file mode 100644 index 0000000..2209457 --- /dev/null +++ b/src/models/Sinal.java @@ -0,0 +1,8 @@ +package models; + +/** + * Created by fernando on 21/10/14. + */ +public enum Sinal { + ATIVADO, DESATIVADO; +} diff --git a/src/models/XOR.java b/src/models/XOR.java index 7f2d7f9..a62af75 100644 --- a/src/models/XOR.java +++ b/src/models/XOR.java @@ -1,8 +1,10 @@ package models; +import views.Editavel; + public class XOR extends PortaLogica { //private int numeroPortas; - public XOR(Ponto superiorEsquerdo){ + public XOR(Ponto superiorEsquerdo) { super(superiorEsquerdo); } @@ -13,17 +15,32 @@ public Entrada[] pegaEntradas() { return entradasXor; } - public Saida[] pegaSaidas(){ + public void calcula() { + Sinal oldValor = this.valor; + this.valor = Sinal.DESATIVADO; + if (this.entradas.size() == 2) { + Editavel entrada1 = this.entradas.get(0); + Editavel entrada2 = this.entradas.get(1); + this.valor = entrada1.pegaValor() != entrada2.pegaValor() ? Sinal.ATIVADO: Sinal.DESATIVADO; + } + if (oldValor != this.valor) { + for(Editavel saida: this.saidas) { + saida.calcula(); + } + } + } + + public Saida[] pegaSaidas() { Saida[] saidasXor = new Saida[1]; saidasXor[0] = new Saida(this, 80, 24); return saidasXor; } - public int altura(){ + public int altura() { return 53; } - public int largura(){ + public int largura() { return 83; } } diff --git a/src/views/Editavel.java b/src/views/Editavel.java index d8c2adb..56caacf 100644 --- a/src/views/Editavel.java +++ b/src/views/Editavel.java @@ -1,5 +1,14 @@ package views; -public interface Editavel extends Selecionavel{ +import models.Sinal; + +public interface Editavel extends Selecionavel { public void movePara(int x, int y); + public void apaga(); + public void conectaSaida(Editavel saida); + public void conectaEntrada(Editavel entrada); + public void desconectaSaida(Editavel saida); + public void desconectaEntrada(Editavel entrada); + public void calcula(); + public Sinal pegaValor(); } diff --git a/src/views/FigAND.java b/src/views/FigAND.java index 39b0b20..b612b4a 100644 --- a/src/views/FigAND.java +++ b/src/views/FigAND.java @@ -1,9 +1,6 @@ package views; -import models.AND; -import models.Entrada; -import models.Ponto; -import models.Saida; +import models.*; import javax.imageio.ImageIO; import javax.swing.*; @@ -13,10 +10,11 @@ import java.io.IOException; public class FigAND extends AND implements Reproduzivel { - public FigAND(Ponto superiorEsquerdo){ - super(superiorEsquerdo); - } - public void reproduzir(Graphics g) { + public FigAND(Ponto superiorEsquerdo) { + super(superiorEsquerdo); + } + + public void reproduzir(Graphics g) { BufferedImage image; try { image = ImageIO.read(new File("imagens/and.png")); @@ -28,11 +26,15 @@ public void reproduzir(Graphics g) { Entrada[] entradas = this.pegaEntradas(); Saida[] saidas = this.pegaSaidas(); g.setColor(Color.RED); - for(int i=0; i 0) { + if (i > 0) { // O "+5" aqui e para centralizar a linha junto ao circulo - g.drawLine(x[i - 1]+5, y[ i - 1]+5, x[i]+5, y[i]+5); + g.drawLine(x[i - 1] + 5, y[i - 1] + 5, x[i] + 5, y[i] + 5); } g.fillOval(x[i], y[i], 10, 10); } + g.setColor(Color.BLACK); } } diff --git a/src/views/FigNAND.java b/src/views/FigNAND.java index 770456a..dd91cb9 100644 --- a/src/views/FigNAND.java +++ b/src/views/FigNAND.java @@ -1,9 +1,6 @@ package views; -import models.Entrada; -import models.NAND; -import models.Ponto; -import models.Saida; +import models.*; import javax.imageio.ImageIO; import javax.swing.*; @@ -13,14 +10,15 @@ import java.io.IOException; public class FigNAND extends NAND implements Reproduzivel { - public FigNAND(Ponto superiorEsquerdo){ + public FigNAND(Ponto superiorEsquerdo) { super(superiorEsquerdo); } - public void reproduzir(Graphics g){ + + public void reproduzir(Graphics g) { BufferedImage image; try { image = ImageIO.read(new File("imagens/nand.png")); - } catch(IOException e){ + } catch (IOException e) { JOptionPane.showMessageDialog(null, "Erro ao carregar imagem: imagens/nand.png"); return; } @@ -28,11 +26,15 @@ public void reproduzir(Graphics g){ Entrada[] entradas = this.pegaEntradas(); Saida[] saidas = this.pegaSaidas(); g.setColor(Color.RED); - for(int i=0; i fig = new ArrayList(); - public void addFig(Reproduzivel fig){ + public void addFig(Reproduzivel fig) { this.fig.add(fig); } - public void removeFig(Reproduzivel fig){ - this.fig.remove(fig); + + public void removeFig(Reproduzivel fig) { + fig.apaga(); + this.fig.remove(fig); } - public Reproduzivel pegaObjetoEm(int x, int y){ - for(int i=0; i < fig.size(); i++) { + + public Reproduzivel pegaObjetoEm(int x, int y) { + for (int i = 0; i < fig.size(); i++) { if (fig.get(i).contemPonto(x, y)) { return fig.get(i); } diff --git a/src/views/Selecionavel.java b/src/views/Selecionavel.java index 1f6c3b7..71882a5 100644 --- a/src/views/Selecionavel.java +++ b/src/views/Selecionavel.java @@ -2,5 +2,6 @@ public interface Selecionavel { public boolean contemPonto(int x, int y); + public void selecionaPonto(int x, int y); } From 9eb8710443d718cca88dbcc5dfdad22ba233e020 Mon Sep 17 00:00:00 2001 From: Fernando Jorge Mota Date: Wed, 22 Oct 2014 17:22:52 -0200 Subject: [PATCH 2/5] =?UTF-8?q?Corrige=20problema=20de=20orienta=C3=A7?= =?UTF-8?q?=C3=A3o=20a=20objetos=20envolvendo=20a=20interface=20Editavel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/META-INF/MANIFEST.MF | 3 +++ src/models/Circulo.java | 37 +------------------------------------ src/models/PortaLogica.java | 2 +- src/models/Retangulo.java | 4 +--- 4 files changed, 6 insertions(+), 40 deletions(-) create mode 100644 src/META-INF/MANIFEST.MF diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF new file mode 100644 index 0000000..37197ef --- /dev/null +++ b/src/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: Main + diff --git a/src/models/Circulo.java b/src/models/Circulo.java index f9d4ec3..08ef609 100644 --- a/src/models/Circulo.java +++ b/src/models/Circulo.java @@ -2,7 +2,7 @@ import views.Editavel; -public class Circulo extends Ponto implements Editavel { +public class Circulo extends Ponto { private int raio; private int xSel, ySel; @@ -11,41 +11,6 @@ public Circulo(int x, int y, int raio) { this.raio = raio; } - @Override - public void apaga() { - - } - - @Override - public void conectaSaida(Editavel saida) { - - } - - @Override - public void conectaEntrada(Editavel entrada) { - - } - - @Override - public void desconectaSaida(Editavel saida) { - - } - - @Override - public void desconectaEntrada(Editavel entrada) { - - } - - @Override - public void calcula() { - - } - - @Override - public Sinal pegaValor() { - return null; - } - public int diametro() { return 2 * raio; } diff --git a/src/models/PortaLogica.java b/src/models/PortaLogica.java index 96501a9..9b39ad0 100644 --- a/src/models/PortaLogica.java +++ b/src/models/PortaLogica.java @@ -6,7 +6,7 @@ import java.util.ArrayList; import java.util.List; -public abstract class PortaLogica extends Retangulo { +public abstract class PortaLogica extends Retangulo implements Editavel { protected List entradas = new ArrayList(); protected List saidas = new ArrayList(); protected Sinal valor; diff --git a/src/models/Retangulo.java b/src/models/Retangulo.java index e378cdf..1258510 100644 --- a/src/models/Retangulo.java +++ b/src/models/Retangulo.java @@ -1,8 +1,6 @@ package models; -import views.Editavel; - -public abstract class Retangulo implements Editavel { +public class Retangulo { private Ponto ponto1, ponto2; private int xSel, ySel; // Usados para guardar o x e y selecionados. Ver se ha melhor forma de fazer isso. From ac97a7115d0ae5afadd9ff8c8157c68042e414c7 Mon Sep 17 00:00:00 2001 From: Fernando Jorge Mota Date: Wed, 22 Oct 2014 18:42:41 -0200 Subject: [PATCH 3/5] =?UTF-8?q?Corrige=20problema=20com=20cliques=20nas=20?= =?UTF-8?q?entradas=20e=20saidas=20da=20porta=20l=C3=B3gica=20e=20melhora?= =?UTF-8?q?=20visualiza=C3=A7=C3=A3o=20de=20desligado=20vs.=20ligado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../META-INF/MANIFEST.MF | 3 +++ src/editores/EditorLinha.java | 21 +++++++++++++++---- src/models/Botao.java | 2 +- src/models/Circulo.java | 5 ++++- src/models/Linha.java | 2 +- src/views/FigAND.java | 13 +++++++----- src/views/FigBotao.java | 7 ++++--- src/views/FigLinha.java | 2 +- src/views/FigNAND.java | 14 ++++++++----- src/views/FigNOR.java | 13 +++++++----- src/views/FigNOT.java | 13 +++++++----- src/views/FigNXOR.java | 13 +++++++----- src/views/FigOR.java | 13 +++++++----- src/views/FigXOR.java | 13 +++++++----- src/views/Quadro.java | 19 +++++++++++++++-- 15 files changed, 105 insertions(+), 48 deletions(-) create mode 100644 classes/production/simulador-de-circuitos/META-INF/MANIFEST.MF diff --git a/classes/production/simulador-de-circuitos/META-INF/MANIFEST.MF b/classes/production/simulador-de-circuitos/META-INF/MANIFEST.MF new file mode 100644 index 0000000..37197ef --- /dev/null +++ b/classes/production/simulador-de-circuitos/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: Main + diff --git a/src/editores/EditorLinha.java b/src/editores/EditorLinha.java index a41ac12..c09b3f1 100644 --- a/src/editores/EditorLinha.java +++ b/src/editores/EditorLinha.java @@ -16,6 +16,19 @@ public EditorLinha(Quadro quadro) { this.quadro = quadro; } + private boolean verificaClique(Circulo circ, int x, int y) { + boolean match = false; + int margin = 5; + for(int xVerify=x-margin; xVerify <= (x+margin); xVerify++) { + for(int yVerify=y-margin; yVerify <= (y+margin); yVerify++) { + if(match) { + break; + } + match = circ.contemPonto(xVerify, yVerify); + } + } + return match; + } public void clique(int x, int y) { Circulo circulo = null; Reproduzivel figura = this.quadro.pegaObjetoEm(x, y); @@ -29,7 +42,7 @@ public void clique(int x, int y) { PortaLogica porta = (PortaLogica) figura; Saida[] saidas = porta.pegaSaidas(); for (int i = 0; i < saidas.length; i++) { - if (saidas[i].contemPonto(x, y)) { + if (this.verificaClique(saidas[i], x, y)) { circulo = saidas[i]; break; } @@ -44,7 +57,7 @@ public void clique(int x, int y) { Linha novaLinha = (Linha) figura; Circulo[] pontos = novaLinha.pontos(); for (int i = 0; i < pontos.length; i++) { - if (pontos[i].contemPonto(x, y)) { + if (this.verificaClique(pontos[i], x, y)) { circulo = pontos[i]; break; } @@ -61,7 +74,7 @@ public void clique(int x, int y) { PortaLogica porta = (PortaLogica) figura; Entrada[] entradas = porta.pegaEntradas(); for (int i = 0; i < entradas.length; i++) { - if (entradas[i].contemPonto(x, y)) { + if (this.verificaClique(entradas[i], x, y)) { circulo = entradas[i]; break; } @@ -81,7 +94,7 @@ public void clique(int x, int y) { Linha linhaSelecionada = (Linha) figura; Circulo[] pontos = linhaSelecionada.pontos(); for (int i = 0; i < pontos.length; i++) { - if (pontos[i].contemPonto(x, y)) { + if (this.verificaClique(pontos[i], x, y)) { circulo = pontos[i]; break; } diff --git a/src/models/Botao.java b/src/models/Botao.java index 69fdf97..8e13551 100644 --- a/src/models/Botao.java +++ b/src/models/Botao.java @@ -16,7 +16,7 @@ public Entrada[] pegaEntradas() { public Saida[] pegaSaidas() { Saida[] saidasAnd = new Saida[1]; - saidasAnd[0] = new Saida(this, 10, 10, 10); + saidasAnd[0] = new Saida(this, 10, 10, 5); return saidasAnd; } diff --git a/src/models/Circulo.java b/src/models/Circulo.java index 08ef609..af47f61 100644 --- a/src/models/Circulo.java +++ b/src/models/Circulo.java @@ -24,7 +24,10 @@ public int y0() { } public boolean contemPonto(int x, int y) { - return this.x0() <= x && (this.x0() + this.diametro()) >= x && this.y0() <= y && (this.y0() + this.diametro()) >= y; + int x0 = this.x0(); + int y0 = this.y0(); + int diametro = this.diametro(); + return x0 <= x && (x0 + diametro) >= x && y0 <= y && (y0 + diametro) >= y; } // Seleciona o retangulo diff --git a/src/models/Linha.java b/src/models/Linha.java index e44f1cb..ab9304b 100644 --- a/src/models/Linha.java +++ b/src/models/Linha.java @@ -11,7 +11,7 @@ public class Linha implements Editavel { private Circulo pontoSelecionado = null; // Guarda o ponto selecionado da linha. Ver se ha melhor forma de fazer isso. protected List entradas = new ArrayList(); protected List saidas = new ArrayList(); - protected Sinal valor; + protected Sinal valor = Sinal.DESATIVADO; public void apaga() { for(Editavel entrada: entradas) { diff --git a/src/views/FigAND.java b/src/views/FigAND.java index b612b4a..48da0fc 100644 --- a/src/views/FigAND.java +++ b/src/views/FigAND.java @@ -30,12 +30,15 @@ public void reproduzir(Graphics g) { g.fillOval(entradas[i].x0(), entradas[i].y0(), entradas[i].diametro(), entradas[i].diametro()); } if (this.valor == Sinal.ATIVADO) { - g.setColor(Color.DARK_GRAY); + g.setColor(Color.YELLOW); + for (int i = 0; i < saidas.length; i++) { + g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } else { - g.setColor(Color.LIGHT_GRAY); - } - for (int i = 0; i < saidas.length; i++) { - g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + g.setColor(Color.BLACK); + for (int i = 0; i < saidas.length; i++) { + g.drawOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } g.setColor(Color.BLACK); } diff --git a/src/views/FigBotao.java b/src/views/FigBotao.java index e629277..0facef7 100644 --- a/src/views/FigBotao.java +++ b/src/views/FigBotao.java @@ -18,11 +18,12 @@ public void reproduzir(Graphics g) { g.drawRect(this.x(), this.y(), this.largura(), this.altura()); if (this.valor == Sinal.ATIVADO) { - g.setColor(Color.DARK_GRAY); + g.setColor(Color.YELLOW); + g.fillOval(this.x(), this.y(), this.largura(), this.altura()); } else { - g.setColor(Color.LIGHT_GRAY); + g.setColor(Color.BLACK); + g.drawOval(this.x(), this.y(), this.largura(), this.altura()); } - g.fillOval(this.x(), this.y(), this.largura(), this.altura()); g.setColor(Color.BLACK); } } diff --git a/src/views/FigLinha.java b/src/views/FigLinha.java index bf0c384..1b5937a 100644 --- a/src/views/FigLinha.java +++ b/src/views/FigLinha.java @@ -10,7 +10,7 @@ public void reproduzir(Graphics g) { int[] x = x(); int[] y = y(); if (this.valor == Sinal.ATIVADO) { - g.setColor(Color.DARK_GRAY); + g.setColor(Color.YELLOW); } else { g.setColor(Color.LIGHT_GRAY); } diff --git a/src/views/FigNAND.java b/src/views/FigNAND.java index dd91cb9..8add862 100644 --- a/src/views/FigNAND.java +++ b/src/views/FigNAND.java @@ -30,13 +30,17 @@ public void reproduzir(Graphics g) { g.fillOval(entradas[i].x0(), entradas[i].y0(), entradas[i].diametro(), entradas[i].diametro()); } if (this.valor == Sinal.ATIVADO) { - g.setColor(Color.DARK_GRAY); + g.setColor(Color.YELLOW); + for (int i = 0; i < saidas.length; i++) { + g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } else { - g.setColor(Color.LIGHT_GRAY); - } - for (int i = 0; i < saidas.length; i++) { - g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + g.setColor(Color.BLACK); + for (int i = 0; i < saidas.length; i++) { + g.drawOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } + g.setColor(Color.BLACK); } } diff --git a/src/views/FigNOR.java b/src/views/FigNOR.java index e2e4c7e..feda84a 100644 --- a/src/views/FigNOR.java +++ b/src/views/FigNOR.java @@ -30,12 +30,15 @@ public void reproduzir(Graphics g) { g.fillOval(entradas[i].x0(), entradas[i].y0(), entradas[i].diametro(), entradas[i].diametro()); } if (this.valor == Sinal.ATIVADO) { - g.setColor(Color.DARK_GRAY); + g.setColor(Color.YELLOW); + for (int i = 0; i < saidas.length; i++) { + g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } else { - g.setColor(Color.LIGHT_GRAY); - } - for (int i = 0; i < saidas.length; i++) { - g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + g.setColor(Color.BLACK); + for (int i = 0; i < saidas.length; i++) { + g.drawOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } g.setColor(Color.BLACK); } diff --git a/src/views/FigNOT.java b/src/views/FigNOT.java index f2028e2..c5340d0 100644 --- a/src/views/FigNOT.java +++ b/src/views/FigNOT.java @@ -30,12 +30,15 @@ public void reproduzir(Graphics g) { g.fillOval(entradas[i].x0(), entradas[i].y0(), entradas[i].diametro(), entradas[i].diametro()); } if (this.valor == Sinal.ATIVADO) { - g.setColor(Color.DARK_GRAY); + g.setColor(Color.YELLOW); + for (int i = 0; i < saidas.length; i++) { + g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } else { - g.setColor(Color.LIGHT_GRAY); - } - for (int i = 0; i < saidas.length; i++) { - g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + g.setColor(Color.BLACK); + for (int i = 0; i < saidas.length; i++) { + g.drawOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } g.setColor(Color.BLACK); } diff --git a/src/views/FigNXOR.java b/src/views/FigNXOR.java index b45cf99..79ce247 100644 --- a/src/views/FigNXOR.java +++ b/src/views/FigNXOR.java @@ -30,12 +30,15 @@ public void reproduzir(Graphics g) { g.fillOval(entradas[i].x0(), entradas[i].y0(), entradas[i].diametro(), entradas[i].diametro()); } if (this.valor == Sinal.ATIVADO) { - g.setColor(Color.DARK_GRAY); + g.setColor(Color.YELLOW); + for (int i = 0; i < saidas.length; i++) { + g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } else { - g.setColor(Color.LIGHT_GRAY); - } - for (int i = 0; i < saidas.length; i++) { - g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + g.setColor(Color.BLACK); + for (int i = 0; i < saidas.length; i++) { + g.drawOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } g.setColor(Color.BLACK); } diff --git a/src/views/FigOR.java b/src/views/FigOR.java index ff39277..53dfeb5 100644 --- a/src/views/FigOR.java +++ b/src/views/FigOR.java @@ -30,12 +30,15 @@ public void reproduzir(Graphics g) { g.fillOval(entradas[i].x0(), entradas[i].y0(), entradas[i].diametro(), entradas[i].diametro()); } if (this.valor == Sinal.ATIVADO) { - g.setColor(Color.DARK_GRAY); + g.setColor(Color.YELLOW); + for (int i = 0; i < saidas.length; i++) { + g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } else { - g.setColor(Color.LIGHT_GRAY); - } - for (int i = 0; i < saidas.length; i++) { - g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + g.setColor(Color.BLACK); + for (int i = 0; i < saidas.length; i++) { + g.drawOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } g.setColor(Color.BLACK); } diff --git a/src/views/FigXOR.java b/src/views/FigXOR.java index f665cd8..da3bc5d 100644 --- a/src/views/FigXOR.java +++ b/src/views/FigXOR.java @@ -30,12 +30,15 @@ public void reproduzir(Graphics g) { g.fillOval(entradas[i].x0(), entradas[i].y0(), entradas[i].diametro(), entradas[i].diametro()); } if (this.valor == Sinal.ATIVADO) { - g.setColor(Color.DARK_GRAY); + g.setColor(Color.YELLOW); + for (int i = 0; i < saidas.length; i++) { + g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } else { - g.setColor(Color.LIGHT_GRAY); - } - for (int i = 0; i < saidas.length; i++) { - g.fillOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + g.setColor(Color.BLACK); + for (int i = 0; i < saidas.length; i++) { + g.drawOval(saidas[i].x0(), saidas[i].y0(), saidas[i].diametro(), saidas[i].diametro()); + } } g.setColor(Color.BLACK); } diff --git a/src/views/Quadro.java b/src/views/Quadro.java index 449393e..48f2ca0 100644 --- a/src/views/Quadro.java +++ b/src/views/Quadro.java @@ -16,10 +16,25 @@ public void removeFig(Reproduzivel fig) { this.fig.remove(fig); } + private boolean verificaObjetoEm(Reproduzivel obj, int x, int y) { + boolean match = false; + int margin = 10; + for(int xVerify=x-margin; xVerify <= (x+margin); xVerify++) { + for(int yVerify=y-margin; yVerify <= (y+margin); yVerify++) { + if(match) { + break; + } + match = obj.contemPonto(xVerify, yVerify); + } + } + return match; + } + public Reproduzivel pegaObjetoEm(int x, int y) { for (int i = 0; i < fig.size(); i++) { - if (fig.get(i).contemPonto(x, y)) { - return fig.get(i); + Reproduzivel obj = fig.get(i); + if (this.verificaObjetoEm(obj, x, y)) { + return obj; } } return null; From 191691c22ce48224a13f634039988b62867f553e Mon Sep 17 00:00:00 2001 From: Fernando Jorge Mota Date: Sun, 12 Apr 2015 16:28:52 -0300 Subject: [PATCH 4/5] Remove ffiles That never should be created --- .../simulador-de-circuitos/.classpath | 6 ------ .../production/simulador-de-circuitos/.project | 17 ----------------- .../simulador-de-circuitos/META-INF/MANIFEST.MF | 3 --- 3 files changed, 26 deletions(-) delete mode 100644 classes/production/simulador-de-circuitos/.classpath delete mode 100644 classes/production/simulador-de-circuitos/.project delete mode 100644 classes/production/simulador-de-circuitos/META-INF/MANIFEST.MF diff --git a/classes/production/simulador-de-circuitos/.classpath b/classes/production/simulador-de-circuitos/.classpath deleted file mode 100644 index 233be1d..0000000 --- a/classes/production/simulador-de-circuitos/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/classes/production/simulador-de-circuitos/.project b/classes/production/simulador-de-circuitos/.project deleted file mode 100644 index 0f6f6a7..0000000 --- a/classes/production/simulador-de-circuitos/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - src - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/classes/production/simulador-de-circuitos/META-INF/MANIFEST.MF b/classes/production/simulador-de-circuitos/META-INF/MANIFEST.MF deleted file mode 100644 index 37197ef..0000000 --- a/classes/production/simulador-de-circuitos/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Main-Class: Main - From 1144e4f784ab53452d4c1a0dfa265b64a233f8cd Mon Sep 17 00:00:00 2001 From: Fernando Jorge Mota Date: Sun, 12 Apr 2015 16:29:22 -0300 Subject: [PATCH 5/5] Improve the simulator By an order of 1000x --- src/Main.java | 290 ++++++++++++++++++++++------------ src/editores/Editor.java | 2 +- src/editores/EditorAnd.java | 4 +- src/editores/EditorBotao.java | 4 +- src/editores/EditorLinha.java | 22 ++- src/editores/EditorNOR.java | 4 +- src/editores/EditorNOT.java | 4 +- src/editores/EditorNXOR.java | 4 +- src/editores/EditorNand.java | 4 +- src/editores/EditorOR.java | 4 +- src/editores/EditorXor.java | 4 +- src/models/AND.java | 4 + src/models/Circulo.java | 8 + src/models/Linha.java | 48 +++++- src/models/Ponto.java | 6 +- src/models/PortaLogica.java | 1 + src/models/Retangulo.java | 13 +- src/views/FigAND.java | 5 +- src/views/FigBotao.java | 1 - src/views/FigLinha.java | 14 +- src/views/FigNAND.java | 5 +- src/views/FigNOR.java | 5 +- src/views/FigNOT.java | 5 +- src/views/FigNXOR.java | 5 +- src/views/FigOR.java | 5 +- src/views/FigXOR.java | 5 +- src/views/Modo.java | 24 ++- src/views/Paleta.java | 21 ++- src/views/Quadro.java | 24 ++- src/views/Reproduzivel.java | 5 + src/views/Selecionavel.java | 9 +- 31 files changed, 397 insertions(+), 162 deletions(-) diff --git a/src/Main.java b/src/Main.java index e058208..4a62ba4 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,4 +1,5 @@ import editores.Editor; +import editores.EditorLinha; import models.Botao; import views.Modo; import views.Paleta; @@ -6,112 +7,203 @@ import views.Reproduzivel; import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.border.CompoundBorder; +import javax.swing.border.LineBorder; +import javax.swing.filechooser.*; +import javax.swing.filechooser.FileFilter; +import java.awt.*; import java.awt.event.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.ArrayList; public class Main implements MouseListener, MouseMotionListener, ActionListener { static Quadro quadro; static Paleta paleta; static Modo modo; + static JFileChooser fc; + static JFrame f; + static JToolBar toolbar; static Reproduzivel figuraSelecionada; + static final String NEW = "NEW"; + static final String SAVE = "SAVE"; + static final String OPEN = "OPEN"; + static final String EXIT = "EXIT"; + public static void main(String[] argv) { - JFrame f = new JFrame(); + f = new JFrame(); + fc = new JFileChooser(); + fc.setMultiSelectionEnabled(false); + fc.setFileFilter(new FileFilter() { + @Override + public boolean accept(File f) { + return f.getName().endsWith(".sim1"); + } + + @Override + public String getDescription() { + return "Simulador de Circuitor (.sim1)"; + } + }); + fc.setAcceptAllFileFilterUsed(false); + f.setLayout(new BorderLayout()); quadro = new Quadro(); modo = new Modo(); - paleta = new Paleta(quadro); - f.setContentPane(quadro); + paleta = new Paleta(quadro, modo); JMenuBar barra = new JMenuBar(); f.setJMenuBar(barra); + Main main = new Main(); + JMenu guia; guia = new JMenu("Arquivo"); barra.add(guia); JMenuItem item; - item = new JMenuItem("Sair"); - item.addActionListener(new Main()); - guia.add(item); - guia = new JMenu("Paleta"); - barra.add(guia); - - item = new JMenuItem("Porta AND"); - item.setActionCommand(Paleta.AND); - item.addActionListener(paleta); - guia.add(item); - - item = new JMenuItem("Porta OR"); - item.setActionCommand(Paleta.OR); - item.addActionListener(paleta); - guia.add(item); - - item = new JMenuItem("Porta XOR"); - item.setActionCommand(Paleta.XOR); - item.addActionListener(paleta); - guia.add(item); - - item = new JMenuItem("Porta NOT"); - item.setActionCommand(Paleta.NOT); - item.addActionListener(paleta); + item = new JMenuItem("Novo"); + item.setActionCommand(NEW); + item.addActionListener(main); guia.add(item); - item = new JMenuItem("Porta NAND"); - item.setActionCommand(Paleta.NAND); - item.addActionListener(paleta); + item = new JMenuItem("Abrir"); + item.setActionCommand(OPEN); + item.addActionListener(main); guia.add(item); - item = new JMenuItem("Porta NOR"); - item.setActionCommand(Paleta.NOR); - item.addActionListener(paleta); + item = new JMenuItem("Salvar"); + item.setActionCommand(SAVE); + item.addActionListener(main); guia.add(item); - item = new JMenuItem("Porta NXOR"); - item.setActionCommand(Paleta.NXOR); - item.addActionListener(paleta); - guia.add(item); - - item = new JMenuItem("Conector"); - item.setActionCommand(Paleta.LINHA); - item.addActionListener(paleta); - guia.add(item); - - item = new JMenuItem("Botão"); - item.setActionCommand(Paleta.BOTAO); - item.addActionListener(paleta); - guia.add(item); - - guia = new JMenu("Modo"); - barra.add(guia); - - item = new JMenuItem("Criar"); - item.setActionCommand(Modo.CRIAR); - item.addActionListener(modo); - guia.add(item); - - item = new JMenuItem("Editar"); - item.setActionCommand(Modo.EDITAR); - item.addActionListener(modo); - guia.add(item); - - item = new JMenuItem("Apagar"); - item.setActionCommand(Modo.APAGAR); - item.addActionListener(modo); + item = new JMenuItem("Sair"); + item.setActionCommand(EXIT); + item.addActionListener(main); guia.add(item); - item = new JMenuItem("Simular"); - item.setActionCommand(Modo.SIMULAR); - item.addActionListener(modo); - guia.add(item); + toolbar = new JToolBar(); + toolbar.setOrientation(JToolBar.VERTICAL); + JButton botao; + f.add(toolbar, BorderLayout.WEST); + f.add(new JScrollPane( + quadro, + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED + ), BorderLayout.CENTER, 1); + + + botao = new JButton("Porta AND"); + botao.setActionCommand(Paleta.AND); + botao.addActionListener(paleta); + toolbar.add(botao); + + botao = new JButton("Porta OR"); + botao.setActionCommand(Paleta.OR); + botao.addActionListener(paleta); + toolbar.add(botao); + + botao = new JButton("Porta XOR"); + botao.setActionCommand(Paleta.XOR); + botao.addActionListener(paleta); + toolbar.add(botao); + + botao = new JButton("Porta NOT"); + botao.setActionCommand(Paleta.NOT); + botao.addActionListener(paleta); + toolbar.add(botao); + + botao = new JButton("Porta NAND"); + botao.setActionCommand(Paleta.NAND); + botao.addActionListener(paleta); + toolbar.add(botao); + + botao = new JButton("Porta NOR"); + botao.setActionCommand(Paleta.NOR); + botao.addActionListener(paleta); + toolbar.add(botao); + + botao = new JButton("Porta NXOR"); + botao.setActionCommand(Paleta.NXOR); + botao.addActionListener(paleta); + toolbar.add(botao); + + botao = new JButton("Conector"); + botao.setActionCommand(Paleta.LINHA); + botao.addActionListener(paleta); + toolbar.add(botao); + + botao = new JButton("Botão"); + botao.setActionCommand(Paleta.BOTAO); + botao.addActionListener(paleta); + toolbar.add(botao); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(800, 600); f.setTitle("Simulador de Circuitos"); desenhar(); + for(Component c: toolbar.getComponents()) { + botao = (JButton) c; + botao.setBackground(null); + } } public void actionPerformed(ActionEvent e) { - System.exit(0); //sai da aplicação com o código de status zero + String command = e.getActionCommand(); + if (command.equals(EXIT)) { + System.exit(0); //sai da aplicação com o código de status zero + } + else if (command.equals(OPEN)) { + int returnVal = fc.showOpenDialog(f); + if (returnVal == JFileChooser.APPROVE_OPTION) { + File file = fc.getSelectedFile(); + FileInputStream fi; + ObjectInputStream is; + ArrayList q; + try { + fi = new FileInputStream(file); + is = new ObjectInputStream(fi); + q = (ArrayList) is.readObject(); + fi.close(); + } catch (IOException e1) { + JOptionPane.showMessageDialog(null, "Arquivo inválido!"); + return; + } catch(ClassNotFoundException e2) { + e2.printStackTrace(); + return; + } + quadro.setFigs(q); + } + } else if(command.equals(SAVE)) { + int returnVal = fc.showSaveDialog(f); + if (returnVal == JFileChooser.APPROVE_OPTION) { + File file = fc.getSelectedFile(); + if(!file.getAbsolutePath().endsWith(".sim1")) { + file = new File(file.getAbsolutePath()+".sim1"); + } + FileOutputStream fo; + ObjectOutputStream os; + try { + fo = new FileOutputStream(file); + os = new ObjectOutputStream(fo); + os.writeObject(quadro.getFigs()); + os.flush(); + fo.close(); + } catch(FileNotFoundException e1) { + e1.printStackTrace(); + return; + } catch (IOException e2) { + e2.printStackTrace(); + return; + } + } + + } else if(command.equals(NEW)) { + quadro.getFigs().clear(); + quadro.repaint(); + } } static void desenhar() { @@ -121,56 +213,50 @@ static void desenhar() { } public void mouseClicked(MouseEvent e) { + int x = e.getX(); + int y = e.getY(); if (modo.estaCriando()) { - int x = e.getX(); - int y = e.getY(); Editor editor = Main.paleta.editor(); - if (editor == null) { - JOptionPane.showMessageDialog(null, "Selecione um componente no menu 'Paleta'!"); - - } else { - editor.clique(x, y); + if (editor != null) { + if (editor.clique(x, y)) { + modo.setaEditando(); + for(Component c: toolbar.getComponents()) { + JButton botao = (JButton) c; + botao.setBackground(null); + } + } + } + } else if (modo.estaEditando()) { + figuraSelecionada = Main.quadro.pegaObjetoEm(x, y); + if (figuraSelecionada instanceof Botao) { + figuraSelecionada.calcula(); } } } public void mousePressed(MouseEvent e) { - if (modo.estaEditando()) { - int x = e.getX(); - int y = e.getY(); - figuraSelecionada = Main.quadro.pegaObjetoEm(x, y); - if (figuraSelecionada == null) { - JOptionPane.showMessageDialog(null, "Selecione um componente e arraste!"); - } else { + if (modo.estaCriando()) { + return; + } + int x = e.getX(); + int y = e.getY(); + figuraSelecionada = Main.quadro.pegaObjetoEm(x, y); + if (figuraSelecionada != null) { + if(e.getButton() == MouseEvent.BUTTON1) { figuraSelecionada.selecionaPonto(x, y); - } - } else if (modo.estaApagando()) { - int x = e.getX(); - int y = e.getY(); - figuraSelecionada = Main.quadro.pegaObjetoEm(x, y); - if (figuraSelecionada == null) { - JOptionPane.showMessageDialog(null, "Selecione um componente para apagar"); } else { quadro.removeFig(figuraSelecionada); quadro.repaint(); } - } else if (modo.estaSimulando()) { - int x = e.getX(); - int y = e.getY(); - figuraSelecionada = Main.quadro.pegaObjetoEm(x, y); - if (figuraSelecionada instanceof Botao) { - figuraSelecionada.calcula(); - quadro.repaint(); - } else { - JOptionPane.showMessageDialog(null, "Clique em um botão para simular"); - } + } } public void mouseReleased(MouseEvent e) { - if (modo.estaEditando() && figuraSelecionada != null) { - figuraSelecionada = null; + if (modo.estaCriando()) { + return; } + quadro.repaint(); } public void mouseEntered(MouseEvent e) { diff --git a/src/editores/Editor.java b/src/editores/Editor.java index 0c7bd10..31a1adb 100644 --- a/src/editores/Editor.java +++ b/src/editores/Editor.java @@ -1,6 +1,6 @@ package editores; public interface Editor { - void clique(int x, int y); + boolean clique(int x, int y); } diff --git a/src/editores/EditorAnd.java b/src/editores/EditorAnd.java index 207fe97..70c3a03 100644 --- a/src/editores/EditorAnd.java +++ b/src/editores/EditorAnd.java @@ -9,11 +9,13 @@ public EditorAnd(Quadro quadro) { super(quadro); } - public void clique(int x, int y) { + public boolean clique(int x, int y) { FigAND and = new FigAND(new Ponto(x, y)); if (this.continuaInsercao(and)) { this.quadro.addFig(and); this.quadro.repaint(); + return true; } + return false; } } diff --git a/src/editores/EditorBotao.java b/src/editores/EditorBotao.java index f07744f..ff2db15 100644 --- a/src/editores/EditorBotao.java +++ b/src/editores/EditorBotao.java @@ -10,11 +10,13 @@ public EditorBotao(Quadro quadro) { super(quadro); } - public void clique(int x, int y) { + public boolean clique(int x, int y) { FigBotao botao = new FigBotao(new Ponto(x, y)); if (this.continuaInsercao(botao)) { this.quadro.addFig(botao); this.quadro.repaint(); + return true; } + return false; } } diff --git a/src/editores/EditorLinha.java b/src/editores/EditorLinha.java index c09b3f1..c036e73 100644 --- a/src/editores/EditorLinha.java +++ b/src/editores/EditorLinha.java @@ -29,7 +29,7 @@ private boolean verificaClique(Circulo circ, int x, int y) { } return match; } - public void clique(int x, int y) { + public boolean clique(int x, int y) { Circulo circulo = null; Reproduzivel figura = this.quadro.pegaObjetoEm(x, y); if (nEstado == 0) { @@ -37,7 +37,7 @@ public void clique(int x, int y) { this.quadro.addFig(linha); if (figura == null) { JOptionPane.showMessageDialog(null, "Selecione um ponto em um conector ou saida em uma porta logica!"); - return; + return false; } else if (figura instanceof PortaLogica) { // Se o objeto selecionado for uma PortaLogica... PortaLogica porta = (PortaLogica) figura; Saida[] saidas = porta.pegaSaidas(); @@ -49,7 +49,7 @@ public void clique(int x, int y) { } if (circulo == null) { JOptionPane.showMessageDialog(null, "Selecione a saida da porta logica!"); - return; + return false; } porta.conectaSaida(linha); linha.conectaEntrada(porta); @@ -81,15 +81,18 @@ public void clique(int x, int y) { } if (circulo == null) { JOptionPane.showMessageDialog(null, "Selecione uma entrada se você deseja conectar o cabo a esta porta lógica!"); - return; + return false; } else if (linha.npontos() > 1) { porta.conectaEntrada(linha); linha.conectaSaida(porta); - nEstado = 0; + linha.addPonto(circulo); + this.quadro.repaint(); + return true; } else { JOptionPane.showMessageDialog(null, "Por favor, adicione pelo menos mais um ponto antes de conectar este cabo diretamente a uma porta lógica!"); - return; + return false; } + } else if (figura instanceof Linha) { Linha linhaSelecionada = (Linha) figura; Circulo[] pontos = linhaSelecionada.pontos(); @@ -102,14 +105,17 @@ public void clique(int x, int y) { if (linha.npontos() > 1) { linhaSelecionada.conectaEntrada(linha); linha.conectaSaida(linhaSelecionada); - nEstado = 0; + linha.addPonto(circulo); + this.quadro.repaint(); + return true; } else { JOptionPane.showMessageDialog(null, "Por favor, adicione pelo menos mais um ponto antes de conectar este cabo diretamente a uma outro cabo!"); - return; + return false; } } linha.addPonto(circulo); } this.quadro.repaint(); + return false; } } diff --git a/src/editores/EditorNOR.java b/src/editores/EditorNOR.java index 5ed134c..bfa7b9c 100644 --- a/src/editores/EditorNOR.java +++ b/src/editores/EditorNOR.java @@ -10,11 +10,13 @@ public EditorNOR(Quadro quadro) { super(quadro); } - public void clique(int x, int y) { + public boolean clique(int x, int y) { FigNOR nand = new FigNOR(new Ponto(x, y)); if (this.continuaInsercao(nand)) { this.quadro.addFig(nand); this.quadro.repaint(); + return true; } + return false; } } \ No newline at end of file diff --git a/src/editores/EditorNOT.java b/src/editores/EditorNOT.java index d00f5c4..12ff3eb 100644 --- a/src/editores/EditorNOT.java +++ b/src/editores/EditorNOT.java @@ -9,11 +9,13 @@ public EditorNOT(Quadro quadro) { super(quadro); } - public void clique(int x, int y) { + public boolean clique(int x, int y) { FigNOT not = new FigNOT(new Ponto(x, y)); if (this.continuaInsercao(not)) { this.quadro.addFig(not); this.quadro.repaint(); + return true; } + return false; } } \ No newline at end of file diff --git a/src/editores/EditorNXOR.java b/src/editores/EditorNXOR.java index 7f4f9e7..c6085b7 100644 --- a/src/editores/EditorNXOR.java +++ b/src/editores/EditorNXOR.java @@ -9,11 +9,13 @@ public EditorNXOR(Quadro quadro) { super(quadro); } - public void clique(int x, int y) { + public boolean clique(int x, int y) { FigNXOR nxor = new FigNXOR(new Ponto(x, y)); if (this.continuaInsercao(nxor)) { this.quadro.addFig(nxor); this.quadro.repaint(); + return true; } + return false; } } \ No newline at end of file diff --git a/src/editores/EditorNand.java b/src/editores/EditorNand.java index 2eeb2ce..4f8441e 100644 --- a/src/editores/EditorNand.java +++ b/src/editores/EditorNand.java @@ -9,11 +9,13 @@ public EditorNand(Quadro quadro) { super(quadro); } - public void clique(int x, int y) { + public boolean clique(int x, int y) { FigNAND nand = new FigNAND(new Ponto(x, y)); if (this.continuaInsercao(nand)) { this.quadro.addFig(nand); this.quadro.repaint(); + return true; } + return false; } } \ No newline at end of file diff --git a/src/editores/EditorOR.java b/src/editores/EditorOR.java index f9c9244..39a4888 100644 --- a/src/editores/EditorOR.java +++ b/src/editores/EditorOR.java @@ -10,11 +10,13 @@ public EditorOR(Quadro quadro) { super(quadro); } - public void clique(int x, int y) { + public boolean clique(int x, int y) { FigOR or = new FigOR(new Ponto(x, y)); if (this.continuaInsercao(or)) { this.quadro.addFig(or); this.quadro.repaint(); + return true; } + return false; } } \ No newline at end of file diff --git a/src/editores/EditorXor.java b/src/editores/EditorXor.java index e6c25cb..a6599e1 100644 --- a/src/editores/EditorXor.java +++ b/src/editores/EditorXor.java @@ -9,11 +9,13 @@ public EditorXor(Quadro quadro) { super(quadro); } - public void clique(int x, int y) { + public boolean clique(int x, int y) { FigXOR xor = new FigXOR(new Ponto(x, y)); if (this.continuaInsercao(xor)) { this.quadro.addFig(xor); this.quadro.repaint(); + return true; } + return false; } } \ No newline at end of file diff --git a/src/models/AND.java b/src/models/AND.java index b5b6384..517d829 100644 --- a/src/models/AND.java +++ b/src/models/AND.java @@ -26,6 +26,10 @@ public Saida[] pegaSaidas() { public void calcula() { Sinal oldValor = this.valor; this.valor = this.entradas.isEmpty() ? Sinal.DESATIVADO : Sinal.ATIVADO; + if (this.entradas.size() == 1) { + this.valor = Sinal.DESATIVADO; + return; + } for(Editavel entrada: this.entradas) { if (entrada.pegaValor() == Sinal.DESATIVADO) { this.valor = Sinal.DESATIVADO; diff --git a/src/models/Circulo.java b/src/models/Circulo.java index af47f61..ee69c8f 100644 --- a/src/models/Circulo.java +++ b/src/models/Circulo.java @@ -36,6 +36,14 @@ public void selecionaPonto(int x, int y) { this.ySel = y - this.y0(); } + public int getXSel() { + return this.xSel + this.x(); + } + + public int getYSel() { + return this.ySel + this.y(); + } + // Move o ponto public void movePara(int x, int y) { x -= this.xSel; diff --git a/src/models/Linha.java b/src/models/Linha.java index ab9304b..c0e92df 100644 --- a/src/models/Linha.java +++ b/src/models/Linha.java @@ -70,18 +70,42 @@ public Sinal pegaValor() { return this.valor; } - public int[] x() { - int[] x = new int[npontos()]; - for (int i = 0, l = npontos(); i < l; i++) { - x[i] = pontos.get(i).x0(); + public int altura() { + int altura = 0; + for(Circulo ponto: pontos) { + if(altura < ponto.y()+ponto.diametro()) { + altura = ponto.y()+ponto.diametro(); + } + } + return altura; + } + + public int largura() { + int largura = 0; + for(Circulo ponto: pontos) { + if(largura < ponto.x()+ponto.diametro()) { + largura = ponto.x()+ponto.diametro(); + } + } + return largura; + } + + public int x() { + int x = Integer.MAX_VALUE; + for(Circulo ponto: pontos) { + if(x > ponto.x()) { + x = ponto.x(); + } } return x; } - public int[] y() { - int[] y = new int[npontos()]; - for (int i = 0, l = npontos(); i < l; i++) { - y[i] = pontos.get(i).y0(); + public int y() { + int y = Integer.MAX_VALUE; + for(Circulo ponto: pontos) { + if(y > ponto.y()) { + y = ponto.y(); + } } return y; } @@ -122,6 +146,14 @@ public void selecionaPonto(int x, int y) { } } + public int getXSel(){ + return this.pontoSelecionado.getXSel(); + } + + public int getYSel(){ + return this.pontoSelecionado.getXSel(); + } + // Move o ponto selecionado public void movePara(int x, int y) { if (this.pontoSelecionado != null) { diff --git a/src/models/Ponto.java b/src/models/Ponto.java index 8554051..53974d6 100644 --- a/src/models/Ponto.java +++ b/src/models/Ponto.java @@ -1,8 +1,12 @@ package models; -public class Ponto { +import java.io.Serializable; + +public class Ponto implements Serializable { private int x, y; + public Ponto() {} + public Ponto(int x, int y) { this.x = x; this.y = y; diff --git a/src/models/PortaLogica.java b/src/models/PortaLogica.java index 9b39ad0..7ad98ce 100644 --- a/src/models/PortaLogica.java +++ b/src/models/PortaLogica.java @@ -11,6 +11,7 @@ public abstract class PortaLogica extends Retangulo implements Editavel { protected List saidas = new ArrayList(); protected Sinal valor; + protected PortaLogica(Ponto superiorEsquerdo) { super(superiorEsquerdo); this.centralizaClique(); diff --git a/src/models/Retangulo.java b/src/models/Retangulo.java index 1258510..d28569c 100644 --- a/src/models/Retangulo.java +++ b/src/models/Retangulo.java @@ -1,8 +1,11 @@ package models; -public class Retangulo { +import java.io.Serializable; + +public class Retangulo implements Serializable { private Ponto ponto1, ponto2; private int xSel, ySel; // Usados para guardar o x e y selecionados. Ver se ha melhor forma de fazer isso. + public Retangulo() {} public Retangulo(Ponto ponto1, Ponto ponto2) { this.ponto1 = ponto1; @@ -50,6 +53,14 @@ public void selecionaPonto(int x, int y) { this.ySel = y - this.y(); } + public int getXSel() { + return this.xSel + this.x(); + } + + public int getYSel() { + return this.ySel + this.y(); + } + // Move o ponto public void movePara(int x, int y) { x -= this.xSel; diff --git a/src/views/FigAND.java b/src/views/FigAND.java index 48da0fc..dc0a7ee 100644 --- a/src/views/FigAND.java +++ b/src/views/FigAND.java @@ -8,6 +8,7 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.io.InputStream; public class FigAND extends AND implements Reproduzivel { public FigAND(Ponto superiorEsquerdo) { @@ -17,7 +18,9 @@ public FigAND(Ponto superiorEsquerdo) { public void reproduzir(Graphics g) { BufferedImage image; try { - image = ImageIO.read(new File("imagens/and.png")); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + InputStream input = classLoader.getResourceAsStream("imagens/and.png"); + image = ImageIO.read(input); } catch (IOException e) { JOptionPane.showMessageDialog(null, "Erro ao carregar imagem: imagens/and.png"); return; diff --git a/src/views/FigBotao.java b/src/views/FigBotao.java index 0facef7..287d569 100644 --- a/src/views/FigBotao.java +++ b/src/views/FigBotao.java @@ -15,7 +15,6 @@ public FigBotao(Ponto superiorEsquerdo) { } public void reproduzir(Graphics g) { - g.drawRect(this.x(), this.y(), this.largura(), this.altura()); if (this.valor == Sinal.ATIVADO) { g.setColor(Color.YELLOW); diff --git a/src/views/FigLinha.java b/src/views/FigLinha.java index 1b5937a..51826bc 100644 --- a/src/views/FigLinha.java +++ b/src/views/FigLinha.java @@ -1,26 +1,28 @@ package views; +import models.Circulo; import models.Linha; +import models.Ponto; import models.Sinal; import java.awt.*; public class FigLinha extends Linha implements Reproduzivel { public void reproduzir(Graphics g) { - int[] x = x(); - int[] y = y(); if (this.valor == Sinal.ATIVADO) { g.setColor(Color.YELLOW); } else { g.setColor(Color.LIGHT_GRAY); } - for (int i = 0; i < npontos(); i++) { + Circulo pontoAnterior = null; + for (Circulo ponto: pontos()) { // Nos nao vamos desenhar o primeiro ponto pois afinal nao temos...pontos - if (i > 0) { + if (pontoAnterior != null) { // O "+5" aqui e para centralizar a linha junto ao circulo - g.drawLine(x[i - 1] + 5, y[i - 1] + 5, x[i] + 5, y[i] + 5); + g.drawLine(pontoAnterior.x0() + 5, pontoAnterior.y0() + 5, ponto.x0() + 5, ponto.y0() + 5); } - g.fillOval(x[i], y[i], 10, 10); + g.fillOval(ponto.x0(), ponto.y0(), 10, 10); + pontoAnterior = ponto; } g.setColor(Color.BLACK); } diff --git a/src/views/FigNAND.java b/src/views/FigNAND.java index 8add862..896deb6 100644 --- a/src/views/FigNAND.java +++ b/src/views/FigNAND.java @@ -8,6 +8,7 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.io.InputStream; public class FigNAND extends NAND implements Reproduzivel { public FigNAND(Ponto superiorEsquerdo) { @@ -17,7 +18,9 @@ public FigNAND(Ponto superiorEsquerdo) { public void reproduzir(Graphics g) { BufferedImage image; try { - image = ImageIO.read(new File("imagens/nand.png")); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + InputStream input = classLoader.getResourceAsStream("imagens/nand.png"); + image = ImageIO.read(input); } catch (IOException e) { JOptionPane.showMessageDialog(null, "Erro ao carregar imagem: imagens/nand.png"); return; diff --git a/src/views/FigNOR.java b/src/views/FigNOR.java index feda84a..3720a5c 100644 --- a/src/views/FigNOR.java +++ b/src/views/FigNOR.java @@ -8,6 +8,7 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.io.InputStream; public class FigNOR extends NOR implements Reproduzivel { public FigNOR(Ponto superiorEsquerdo) { @@ -17,7 +18,9 @@ public FigNOR(Ponto superiorEsquerdo) { public void reproduzir(Graphics g) { BufferedImage image; try { - image = ImageIO.read(new File("imagens/nor.png")); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + InputStream input = classLoader.getResourceAsStream("imagens/nor.png"); + image = ImageIO.read(input); } catch (IOException e) { JOptionPane.showMessageDialog(null, "Erro ao carregar imagem: imagens/nor.png"); return; diff --git a/src/views/FigNOT.java b/src/views/FigNOT.java index c5340d0..1f99834 100644 --- a/src/views/FigNOT.java +++ b/src/views/FigNOT.java @@ -8,6 +8,7 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.io.InputStream; public class FigNOT extends NOT implements Reproduzivel { public FigNOT(Ponto superiorEsquerdo) { @@ -17,7 +18,9 @@ public FigNOT(Ponto superiorEsquerdo) { public void reproduzir(Graphics g) { BufferedImage image; try { - image = ImageIO.read(new File("imagens/not.png")); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + InputStream input = classLoader.getResourceAsStream("imagens/not.png"); + image = ImageIO.read(input); } catch (IOException e) { JOptionPane.showMessageDialog(null, "Erro ao carregar imagem: imagens/not.png"); return; diff --git a/src/views/FigNXOR.java b/src/views/FigNXOR.java index 79ce247..f49a89e 100644 --- a/src/views/FigNXOR.java +++ b/src/views/FigNXOR.java @@ -8,6 +8,7 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.io.InputStream; public class FigNXOR extends NXOR implements Reproduzivel { public FigNXOR(Ponto superiorEsquerdo) { @@ -17,7 +18,9 @@ public FigNXOR(Ponto superiorEsquerdo) { public void reproduzir(Graphics g) { BufferedImage image; try { - image = ImageIO.read(new File("imagens/nxor.png")); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + InputStream input = classLoader.getResourceAsStream("imagens/not.png"); + image = ImageIO.read(input); } catch (IOException e) { JOptionPane.showMessageDialog(null, "Erro ao carregar imagem: imagens/xor.png"); return; diff --git a/src/views/FigOR.java b/src/views/FigOR.java index 53dfeb5..2961dfb 100644 --- a/src/views/FigOR.java +++ b/src/views/FigOR.java @@ -8,6 +8,7 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.io.InputStream; public class FigOR extends OR implements Reproduzivel { public FigOR(Ponto superiorEsquerdo) { @@ -17,7 +18,9 @@ public FigOR(Ponto superiorEsquerdo) { public void reproduzir(Graphics g) { BufferedImage image; try { - image = ImageIO.read(new File("imagens/or.png")); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + InputStream input = classLoader.getResourceAsStream("imagens/or.png"); + image = ImageIO.read(input); } catch (IOException e) { JOptionPane.showMessageDialog(null, "Erro ao carregar imagem: imagens/or.png"); return; diff --git a/src/views/FigXOR.java b/src/views/FigXOR.java index da3bc5d..14b5211 100644 --- a/src/views/FigXOR.java +++ b/src/views/FigXOR.java @@ -8,6 +8,7 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.io.InputStream; public class FigXOR extends XOR implements Reproduzivel { public FigXOR(Ponto superiorEsquerdo) { @@ -17,7 +18,9 @@ public FigXOR(Ponto superiorEsquerdo) { public void reproduzir(Graphics g) { BufferedImage image; try { - image = ImageIO.read(new File("imagens/xor.png")); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + InputStream input = classLoader.getResourceAsStream("imagens/xor.png"); + image = ImageIO.read(input); } catch (IOException e) { JOptionPane.showMessageDialog(null, "Erro ao carregar a imagem: imagens/xor.png"); return; diff --git a/src/views/Modo.java b/src/views/Modo.java index bea038d..ff97fae 100644 --- a/src/views/Modo.java +++ b/src/views/Modo.java @@ -6,11 +6,9 @@ public class Modo implements ActionListener { public static String EDITAR = "EDITAR", - CRIAR = "CRIAR", - APAGAR = "APAGAR", - SIMULAR = "SIMULAR"; + CRIAR = "CRIAR"; - public String modoAtual = CRIAR; + public String modoAtual = EDITAR; public void actionPerformed(ActionEvent e) { String comando = e.getActionCommand(); @@ -18,25 +16,21 @@ public void actionPerformed(ActionEvent e) { modoAtual = EDITAR; } else if (comando.equals(CRIAR)) { modoAtual = CRIAR; - } else if (comando.equals(APAGAR)) { - modoAtual = APAGAR; - } else if (comando.equals(SIMULAR)) { - modoAtual = SIMULAR; } } - public boolean estaEditando() { - return modoAtual.equals(EDITAR); + public void setaCriando() { + this.modoAtual = CRIAR; + } + public void setaEditando() { + this.modoAtual = EDITAR; } - public boolean estaApagando() { - return modoAtual.equals(APAGAR); + public boolean estaEditando() { + return modoAtual.equals(EDITAR); } public boolean estaCriando() { return modoAtual.equals(CRIAR); } - public boolean estaSimulando() { - return modoAtual.equals(SIMULAR); - } } diff --git a/src/views/Paleta.java b/src/views/Paleta.java index a5af55a..0ba4a54 100644 --- a/src/views/Paleta.java +++ b/src/views/Paleta.java @@ -2,6 +2,10 @@ import editores.*; +import javax.swing.*; +import javax.swing.border.CompoundBorder; +import javax.swing.border.LineBorder; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -21,9 +25,11 @@ public class Paleta implements ActionListener { BOTAO = "BOTAO"; private Editor editor; private Quadro quadro; + private Modo modo; - public Paleta(Quadro quadro) { + public Paleta(Quadro quadro, Modo modo) { this.quadro = quadro; + this.modo = modo; this.editor = null; } @@ -32,6 +38,18 @@ public Editor editor() { } public void actionPerformed(ActionEvent e) { + JButton botao = (JButton) e.getSource(); + if (botao.getBackground().equals(Color.CYAN)) { + this.editor = null; + modo.setaEditando(); + botao.setBackground(null); + return; + } + if (modo.estaCriando()) { + JOptionPane.showMessageDialog(null, "Apenas uma ferramenta pode ser selecionada por vez!"); + return; + } + modo.setaCriando(); String comando = e.getActionCommand(); if (comando.equals(AND)) { this.editor = new EditorAnd(this.quadro); @@ -52,5 +70,6 @@ public void actionPerformed(ActionEvent e) { } else if (comando.equals(BOTAO)) { this.editor = new EditorBotao(this.quadro); } + botao.setBackground(Color.CYAN); } } diff --git a/src/views/Quadro.java b/src/views/Quadro.java index 48f2ca0..34941d2 100644 --- a/src/views/Quadro.java +++ b/src/views/Quadro.java @@ -5,7 +5,7 @@ import java.util.ArrayList; public class Quadro extends JPanel { - private java.util.List fig = new ArrayList(); + private ArrayList fig = new ArrayList(); public void addFig(Reproduzivel fig) { this.fig.add(fig); @@ -16,6 +16,15 @@ public void removeFig(Reproduzivel fig) { this.fig.remove(fig); } + public ArrayList getFigs() { + return fig; + } + + public void setFigs(ArrayList figs) { + this.fig = figs; + this.repaint(); + } + private boolean verificaObjetoEm(Reproduzivel obj, int x, int y) { boolean match = false; int margin = 10; @@ -45,8 +54,19 @@ public void paintComponent(Graphics g) { g.setColor(Color.WHITE); g.fillRect(0, 0, this.getWidth(), this.getHeight()); g.setColor(Color.BLACK); + int maxX = 0; + int maxY = 0; for (int i = 0; i < fig.size(); i++) { - fig.get(i).reproduzir(g); + Reproduzivel figure = fig.get(i); + figure.reproduzir(g); + if (maxX < figure.x()+figure.largura()) { + maxX = figure.x()+figure.largura(); + } + if (maxY < figure.y()+figure.altura()) { + maxY = figure.y()+figure.altura(); + } } + setPreferredSize(new Dimension(maxX+20, maxY+20)); + this.revalidate(); } } \ No newline at end of file diff --git a/src/views/Reproduzivel.java b/src/views/Reproduzivel.java index b8038d2..e077647 100644 --- a/src/views/Reproduzivel.java +++ b/src/views/Reproduzivel.java @@ -4,4 +4,9 @@ public interface Reproduzivel extends Editavel { public void reproduzir(Graphics g); + public int x(); + public int y(); + public int largura(); + public int altura(); + } diff --git a/src/views/Selecionavel.java b/src/views/Selecionavel.java index 71882a5..8136cb2 100644 --- a/src/views/Selecionavel.java +++ b/src/views/Selecionavel.java @@ -1,7 +1,14 @@ package views; -public interface Selecionavel { +import java.io.Serializable; + +public interface Selecionavel extends Serializable { public boolean contemPonto(int x, int y); public void selecionaPonto(int x, int y); + + public int getXSel(); + + public int getYSel(); + }