Finished individual and cleaned up code
This commit is contained in:
@@ -12,9 +12,8 @@ import org.w3c.dom.Document;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* Clase que contiene método que guarda y ordena cada transición del archivo XML ya validado
|
||||
* Clase que contiene métodos que guarda y ordena cada transición del archivo XML ya validado
|
||||
*/
|
||||
|
||||
public class Automata {
|
||||
private ArrayList<Estado> estados;
|
||||
private ArrayList<Integer> estadosExistentes;
|
||||
@@ -25,30 +24,28 @@ public class Automata {
|
||||
*
|
||||
* @param document Document del XML
|
||||
*/
|
||||
|
||||
public Automata(Document document) {
|
||||
setEstados(new ArrayList<>());
|
||||
for (int i = 0; i < document.getElementsByTagName("transicion").getLength(); i++) {
|
||||
char move = document.getElementsByTagName("movimiento").item(i).getTextContent().charAt(0);
|
||||
if (move == 'E' || move == 'R' || move == 'L' || move == '*') {
|
||||
char mover = document.getElementsByTagName("movimiento").item(i).getTextContent().charAt(0);
|
||||
if (mover == 'E' || mover == 'R' || mover == 'L' || mover == '*' || mover == 'S') {
|
||||
int qi = Integer.parseInt(document.getElementsByTagName("qi").item(i).getTextContent());
|
||||
int qj = Integer.parseInt(document.getElementsByTagName("qj").item(i).getTextContent());
|
||||
char si = document.getElementsByTagName("si").item(i).getTextContent().charAt(0);
|
||||
char sj = document.getElementsByTagName("sj").item(i).getTextContent().charAt(0);
|
||||
if (estados.size() <= qi) {
|
||||
estados.add(qi, new Estado(qi));
|
||||
if (getEstados().size() <= qi) {
|
||||
getEstados().add(qi, new Estado(qi));
|
||||
}
|
||||
if (estados.size() <= qj) {
|
||||
estados.add(qj, new Estado(qj));
|
||||
if (getEstados().size() <= qj) {
|
||||
getEstados().add(qj, new Estado(qj));
|
||||
}
|
||||
estados.get(qi).createLink(si, estados.get(qj), sj, move);
|
||||
getEstados().get(qi).crearEnlace(si, getEstados().get(qj), sj, mover);
|
||||
}
|
||||
else {
|
||||
System.out.println("Movimiento invalido de cinta");
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
estadosExistentes = new ArrayList<>();
|
||||
setEstadosExistentes(new ArrayList<>());
|
||||
for (int i = 0; i < getEstados().size(); i++) {
|
||||
if (getEstados().get(i) != null) {
|
||||
getEstadosExistentes().add(getEstados().get(i).getQ());
|
||||
@@ -86,7 +83,7 @@ public class Automata {
|
||||
/**
|
||||
* Asigna una lista de estados existentes
|
||||
*
|
||||
* @param estadosExistentes
|
||||
* @param estadosExistentes Los estados a guardar
|
||||
*/
|
||||
public void setEstadosExistentes(ArrayList<Integer> estadosExistentes) {
|
||||
this.estadosExistentes = estadosExistentes;
|
||||
|
||||
@@ -19,13 +19,13 @@ public class Enlace {
|
||||
/**
|
||||
* Contructor de la clase
|
||||
*
|
||||
* @param si Simbolo a analizar en la cadena
|
||||
* @param qj Estado con que se enlaza
|
||||
* @param sj Simbolo a escribir en la cadena
|
||||
* @param move Movimiento del indice de la cadena
|
||||
* @param si Simbolo a analizar en la cadena
|
||||
* @param qj Estado con que se enlaza
|
||||
* @param sj Simbolo a escribir en la cadena
|
||||
* @param mover Movimiento del indice de la cadena
|
||||
*/
|
||||
public Enlace(char si, Estado qj, char sj, char move) {
|
||||
setMovimiento(move);
|
||||
public Enlace(char si, Estado qj, char sj, char mover) {
|
||||
setMovimiento(mover);
|
||||
setSj(sj);
|
||||
setQj(qj);
|
||||
setSi(si);
|
||||
@@ -43,7 +43,7 @@ public class Enlace {
|
||||
/**
|
||||
* Asigna simbolo a analizar
|
||||
*
|
||||
* @param si
|
||||
* @param si simbolo
|
||||
*/
|
||||
private void setSi(char si) {
|
||||
this.si = si;
|
||||
@@ -61,7 +61,7 @@ public class Enlace {
|
||||
/**
|
||||
* Asigna simbolo a escribir
|
||||
*
|
||||
* @param sj
|
||||
* @param sj simbolo
|
||||
*/
|
||||
public void setSj(char sj) {
|
||||
this.sj = sj;
|
||||
|
||||
@@ -49,20 +49,18 @@ public class Estado {
|
||||
* @param si Simbolo a analizar en la cadena
|
||||
* @param qj Estado adyacente
|
||||
* @param sj Simbolo que escribe en la cadena
|
||||
* @param move Movimiento del cabezal (indice de la cadena)
|
||||
* @return Verdadero si se creó, falso si ya existe
|
||||
* @param mover Movimiento del cabezal (indice de la cadena)
|
||||
*/
|
||||
public boolean createLink(char si, Estado qj, char sj, char move) {
|
||||
public void crearEnlace(char si, Estado qj, char sj, char mover) {
|
||||
if (enlaces.isEmpty()) {
|
||||
enlaces.add(new Enlace(si, qj, sj, move));
|
||||
enlaces.add(new Enlace(si, qj, sj, mover));
|
||||
}
|
||||
for (Enlace aLink : enlaces) {
|
||||
if (aLink.getSi() == si) {
|
||||
return false;
|
||||
for (Enlace enlace : enlaces) {
|
||||
if (enlace.getSi() == si) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
enlaces.add(new Enlace(si, qj, sj, move));
|
||||
return true;
|
||||
enlaces.add(new Enlace(si, qj, sj, mover));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -15,7 +15,6 @@ import java.util.ArrayList;
|
||||
public class EstadosFinales {
|
||||
private ArrayList<Integer> estadosExistentes;
|
||||
private ArrayList<Integer> estadosElegidos;
|
||||
|
||||
private Maquina maquina;
|
||||
|
||||
/**
|
||||
@@ -78,4 +77,4 @@ public class EstadosFinales {
|
||||
public void setMaquina(Maquina maquina) {
|
||||
this.maquina = maquina;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,6 @@ import java.util.ArrayList;
|
||||
public class EstadosFinalesController {
|
||||
@FXML
|
||||
private VBox contenido;
|
||||
|
||||
private EstadosFinales estadosFinales;
|
||||
|
||||
/**
|
||||
@@ -68,4 +67,4 @@ public class EstadosFinalesController {
|
||||
contenido.getChildren().add(hBox);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
197
src/cl/cromer/mt/IndividualController.java
Normal file
197
src/cl/cromer/mt/IndividualController.java
Normal file
@@ -0,0 +1,197 @@
|
||||
/* Copyright (c) 2017 Christopher Cromer
|
||||
* Copyright (c) 2017 Carlos Faúndez
|
||||
*
|
||||
* This file is part of mt. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution.
|
||||
* This file may not be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
package cl.cromer.mt;
|
||||
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.layout.HBox;
|
||||
import javafx.scene.layout.StackPane;
|
||||
import javafx.scene.layout.VBox;
|
||||
import javafx.scene.paint.Color;
|
||||
import javafx.scene.shape.Rectangle;
|
||||
import javafx.scene.text.Text;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
public class IndividualController extends VBox {
|
||||
@FXML
|
||||
private VBox contenido;
|
||||
|
||||
@FXML
|
||||
private TextField cadena;
|
||||
|
||||
@FXML
|
||||
private HBox cinta;
|
||||
|
||||
@FXML
|
||||
private Button aceptar;
|
||||
|
||||
@FXML
|
||||
private Button paso;
|
||||
|
||||
@FXML
|
||||
private Text estadoActual;
|
||||
|
||||
@FXML
|
||||
private Text estadoPrevio;
|
||||
|
||||
@FXML
|
||||
private Text simboloLeido;
|
||||
|
||||
@FXML
|
||||
private Text simboloEscrito;
|
||||
|
||||
@FXML
|
||||
private Text movimiento;
|
||||
|
||||
private String cadenaAceptada;
|
||||
|
||||
private EstadosFinales estadosFinales;
|
||||
|
||||
private Maquina maquina;
|
||||
|
||||
private int cabezalAnterior;
|
||||
|
||||
private int cajas;
|
||||
|
||||
private int estadoPrevioi;
|
||||
|
||||
private char simboloAnterior;
|
||||
|
||||
/**
|
||||
* Este metodo se crea una caja para poner un simbolo de la cinta
|
||||
*
|
||||
* @param label El label para encontrar la caja despues
|
||||
* @param texto El simbolo de la cinta
|
||||
*
|
||||
* @return Retorna un StackPane que contiene la caja
|
||||
*/
|
||||
private static StackPane crearCaja(String label, String texto) {
|
||||
Rectangle rectangle = new Rectangle();
|
||||
rectangle.setHeight(20);
|
||||
rectangle.setWidth(20);
|
||||
rectangle.setFill(Color.WHITE);
|
||||
rectangle.setStroke(Color.BLACK);
|
||||
rectangle.setId("caja_" + label);
|
||||
Text text = new Text();
|
||||
text.setId("simbolo_" + label);
|
||||
text.setStroke(Color.BLACK);
|
||||
text.setText(texto);
|
||||
|
||||
StackPane stackPane = new StackPane();
|
||||
stackPane.getChildren().addAll(rectangle, text);
|
||||
return stackPane;
|
||||
}
|
||||
|
||||
/**
|
||||
* Boton de aceptar cadena
|
||||
*/
|
||||
@FXML
|
||||
protected void aceptarCadena() {
|
||||
Scene scene = contenido.getScene();
|
||||
estadosFinales = (EstadosFinales) scene.getUserData();
|
||||
maquina = estadosFinales.getMaquina();
|
||||
cadenaAceptada = cadena.getText();
|
||||
StringBuilder temp = new StringBuilder(cadenaAceptada);
|
||||
temp.insert(0, "#");
|
||||
temp.insert(cadenaAceptada.length() + 1, "#");
|
||||
cadenaAceptada = temp.toString();
|
||||
for (int i = 0; i < cadenaAceptada.length(); i++) {
|
||||
cinta.getChildren().add(crearCaja(String.valueOf(i), String.valueOf(cadenaAceptada.charAt(i))));
|
||||
cajas = i + 1;
|
||||
}
|
||||
Rectangle rectangle = (Rectangle) scene.lookup("#caja_1");
|
||||
rectangle.setFill(Color.BLUE);
|
||||
Text simbolo = (Text) scene.lookup("#simbolo_1");
|
||||
simbolo.setStroke(Color.WHITE);
|
||||
cadena.setText("");
|
||||
cadena.setDisable(true);
|
||||
aceptar.setDisable(true);
|
||||
paso.setDisable(false);
|
||||
cabezalAnterior = 1;
|
||||
estadoPrevioi = 0;
|
||||
|
||||
estadoActual.setText("Estado actual: q" + maquina.getEstadoActual().getQ());
|
||||
estadoPrevio.setText("Estado previo: q" + estadoPrevioi);
|
||||
simboloLeido.setText("Simbolo leido: #");
|
||||
simboloEscrito.setText("Simbolo escrito: #");
|
||||
movimiento.setText("Movimiento: #");
|
||||
}
|
||||
|
||||
/**
|
||||
* Boton de cerrar
|
||||
*/
|
||||
@FXML
|
||||
protected void paso() {
|
||||
Scene scene = contenido.getScene();
|
||||
|
||||
int resultado = maquina.comprobarCadenaS2S(new StringBuilder(cadenaAceptada), estadosFinales.getEstadosElegidos().stream().mapToInt(i -> i).toArray());
|
||||
|
||||
if (resultado == 1) {
|
||||
MT.mostrarMensaje("Resultado", "La cadena fue aceptada!");
|
||||
cadena.setDisable(false);
|
||||
aceptar.setDisable(false);
|
||||
paso.setDisable(true);
|
||||
maquina.reset();
|
||||
}
|
||||
else if (resultado == -1) {
|
||||
MT.mostrarMensaje("Resultado", "La cadena fue rechazada!");
|
||||
cadena.setDisable(false);
|
||||
aceptar.setDisable(false);
|
||||
paso.setDisable(true);
|
||||
maquina.reset();
|
||||
}
|
||||
else {
|
||||
if (maquina.getCintaAnterior().length() > cajas) {
|
||||
for (int i = cajas; i < maquina.getCintaAnterior().length(); i++) {
|
||||
cinta.getChildren().add(crearCaja(String.valueOf(i), String.valueOf(maquina.getCintaAnterior().charAt(i))));
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < maquina.getCintaAnterior().length(); i++) {
|
||||
Text simbolo = (Text) scene.lookup("#simbolo_" + i);
|
||||
if (i == maquina.getCabezal()) {
|
||||
simboloAnterior = simbolo.getText().charAt(0);
|
||||
}
|
||||
simbolo.setText(String.valueOf(maquina.getCintaAnterior().charAt(i)));
|
||||
}
|
||||
|
||||
// Undo cabezel anterior
|
||||
Rectangle rectangle = (Rectangle) scene.lookup("#caja_" + cabezalAnterior);
|
||||
rectangle.setFill(Color.WHITE);
|
||||
Text simbolo = (Text) scene.lookup("#simbolo_" + cabezalAnterior);
|
||||
simbolo.setStroke(Color.BLACK);
|
||||
|
||||
estadoActual.setText("Estado actual: q" + maquina.getEstadoActual().getQ());
|
||||
estadoPrevio.setText("Estado previo: q" + estadoPrevioi);
|
||||
simboloLeido.setText("Simbolo leido: " + simboloAnterior);
|
||||
simboloEscrito.setText("Simbolo escrito: " + simbolo.getText());
|
||||
movimiento.setText("Movimiento: " + maquina.getEnlaceActual().getMovimiento());
|
||||
|
||||
// Cabezel
|
||||
rectangle = (Rectangle) scene.lookup("#caja_" + maquina.getCabezal());
|
||||
rectangle.setFill(Color.BLUE);
|
||||
simbolo = (Text) scene.lookup("#simbolo_" + maquina.getCabezal());
|
||||
simbolo.setStroke(Color.WHITE);
|
||||
|
||||
cabezalAnterior = maquina.getCabezal();
|
||||
estadoPrevioi = maquina.getEstadoActual().getQ();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Boton de cerrar
|
||||
*/
|
||||
@FXML
|
||||
protected void cerrar() {
|
||||
Scene scene = contenido.getScene();
|
||||
Stage stage = (Stage) scene.getWindow();
|
||||
stage.close();
|
||||
}
|
||||
}
|
||||
@@ -9,14 +9,16 @@ package cl.cromer.mt;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.ErrorHandler;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.SAXParseException;
|
||||
|
||||
import javax.print.Doc;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* Esta clase puede abrir y validar un archivo de XML. Se necesita un archivo mtbase_.dtd
|
||||
* Esta clase puede abrir y validar un archivo de XML. Se necesita un archivo mtbase.dtd
|
||||
*/
|
||||
class LeerXML {
|
||||
/**
|
||||
@@ -61,6 +63,7 @@ class LeerXML {
|
||||
dbf.setNamespaceAware(true);
|
||||
|
||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||
db.setErrorHandler(new CustomErrorHandler());
|
||||
documento = db.parse(archivo);
|
||||
documento.getDocumentElement().normalize();
|
||||
if(validarEtiquetas(documento)){
|
||||
@@ -116,10 +119,10 @@ class LeerXML {
|
||||
BufferedReader br = new BufferedReader(new FileReader(original));
|
||||
BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
|
||||
if ((aux = br.readLine()).startsWith("<?xml")) {
|
||||
bw.write(aux + "\n<!DOCTYPE root SYSTEM \"mtbase_.dtd\">");
|
||||
bw.write(aux + "\n<!DOCTYPE root SYSTEM \"mtbase.dtd\">");
|
||||
}
|
||||
else {
|
||||
bw.write("<!DOCTYPE root SYSTEM \"mtbase_.dtd\">\n" + aux);
|
||||
bw.write("<!DOCTYPE root SYSTEM \"mtbase.dtd\">\n" + aux);
|
||||
}
|
||||
for (aux = ""; aux != null; aux = br.readLine()) {
|
||||
if (!aux.startsWith("<!DOCTYPE")) {
|
||||
@@ -135,11 +138,11 @@ class LeerXML {
|
||||
}
|
||||
|
||||
/**
|
||||
* Valida las etiquetas en el XML
|
||||
* Validar las etiquetas en el XML
|
||||
*
|
||||
* @param document XML a analizar
|
||||
*
|
||||
* @return Verdadero si esta correcto, caso contrario falso
|
||||
* @return Verdadero si está correcto, caso contrario falso
|
||||
*/
|
||||
private boolean validarEtiquetas(Document document) {
|
||||
NodeList etiquetas = document.getElementsByTagName("*");
|
||||
@@ -165,4 +168,47 @@ class LeerXML {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Esta clase es para manejar problemas en los archivo .xml
|
||||
*/
|
||||
public class CustomErrorHandler implements ErrorHandler {
|
||||
/**
|
||||
* Errores fatales, el archivo es invalido.
|
||||
*
|
||||
* @param exception La excepción
|
||||
*
|
||||
* @throws SAXException La SAX excepción
|
||||
*/
|
||||
@Override
|
||||
public void warning(SAXParseException exception) throws SAXException {
|
||||
//System.out.println("Warning: " + exception);
|
||||
// No es fatal, sigue
|
||||
}
|
||||
|
||||
/**
|
||||
* Errores fatales, el archivo es invalido.
|
||||
*
|
||||
* @param exception La excepción
|
||||
*
|
||||
* @throws SAXException La SAX excepción
|
||||
*/
|
||||
@Override
|
||||
public void error(SAXParseException exception) throws SAXException {
|
||||
//System.out.println("Error: " + exception);
|
||||
// No es fatal, sigue
|
||||
}
|
||||
|
||||
/**
|
||||
* Errores fatales, el archivo es invalido.
|
||||
*
|
||||
* @param exception La excepción
|
||||
*
|
||||
* @throws SAXException La SAX excepción
|
||||
*/
|
||||
@Override
|
||||
public void fatalError(SAXParseException exception) throws SAXException {
|
||||
System.err.println("Fatal error: " + exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -30,10 +30,9 @@ public class LoteController extends VBox {
|
||||
|
||||
/**
|
||||
* Boton de run MT
|
||||
* @throws Exception La excepción
|
||||
*/
|
||||
@FXML
|
||||
protected void runLote() throws Exception {
|
||||
protected void runLote() {
|
||||
Scene scene = contenido.getScene();
|
||||
EstadosFinales estadosFinales = (EstadosFinales) scene.getUserData();
|
||||
Maquina maquina = estadosFinales.getMaquina();
|
||||
@@ -54,7 +53,14 @@ public class LoteController extends VBox {
|
||||
*/
|
||||
@FXML
|
||||
protected void agregarCadena() {
|
||||
tablaData.add(new TablaData(cadena.getText(), ""));
|
||||
StringBuilder temp = new StringBuilder(cadena.getText());
|
||||
if (temp.charAt(0) != '#') {
|
||||
temp.insert(0, "#");
|
||||
}
|
||||
if (temp.charAt(temp.length() - 1) != '#') {
|
||||
temp.insert(temp.length(), "#");
|
||||
}
|
||||
tablaData.add(new TablaData(temp.toString(), ""));
|
||||
Scene scene = contenido.getScene();
|
||||
@SuppressWarnings("unchecked")
|
||||
TableView<TablaData> tableView = (TableView<TablaData>) scene.lookup("#tableView");
|
||||
@@ -72,4 +78,4 @@ public class LoteController extends VBox {
|
||||
Stage stage = (Stage) scene.getWindow();
|
||||
stage.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -47,7 +47,7 @@ public class MT extends Application {
|
||||
}
|
||||
|
||||
/**
|
||||
* Metodo de JavaFX llamada para generar el interfaz grafico.
|
||||
* Metodo de JavaFX llamada para generar el interfaz grafico
|
||||
* @param primaryStage La ventana principal
|
||||
* @throws Exception La excepción
|
||||
*/
|
||||
@@ -64,4 +64,4 @@ public class MT extends Application {
|
||||
primaryStage.getIcons().add(new Image(getClass().getResourceAsStream("/cl/cromer/mt/images/icon.png")));
|
||||
primaryStage.show();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -50,7 +50,7 @@ public class Maquina {
|
||||
/**
|
||||
* Asigna un estado actual que esta la maquina en un instante de tiempo
|
||||
*
|
||||
* @param estadoActual
|
||||
* @param estadoActual En que estado es la maquina
|
||||
*/
|
||||
public void setEstadoActual(Estado estadoActual) {
|
||||
this.estadoActual = estadoActual;
|
||||
@@ -68,7 +68,7 @@ public class Maquina {
|
||||
/**
|
||||
* Asigna un enlace actual que esta la maquina en un instante de tiempo
|
||||
*
|
||||
* @param enlaceActual
|
||||
* @param enlaceActual La enlace donde esta la maquina
|
||||
*/
|
||||
public void setEnlaceActual(Enlace enlaceActual) {
|
||||
this.enlaceActual = enlaceActual;
|
||||
@@ -85,7 +85,7 @@ public class Maquina {
|
||||
|
||||
/**
|
||||
* Asigna la cadena anterior a que la maquina hiciera cambios
|
||||
* @param cintaAnterior
|
||||
* @param cintaAnterior La cinta a verificar
|
||||
*/
|
||||
public void setCintaAnterior(String cintaAnterior) {
|
||||
this.cintaAnterior = cintaAnterior;
|
||||
@@ -103,7 +103,7 @@ public class Maquina {
|
||||
/**
|
||||
* Asigna el indice en que se ubica en la cadena (Cabezal)
|
||||
*
|
||||
* @param cabezal
|
||||
* @param cabezal Donde poner la cabezal
|
||||
*/
|
||||
public void setCabezal(int cabezal) {
|
||||
this.cabezal = cabezal;
|
||||
@@ -116,34 +116,31 @@ public class Maquina {
|
||||
setEstadoActual(getMaquina().getEstados().get(0));
|
||||
setEnlaceActual(null);
|
||||
setCintaAnterior("");
|
||||
setCabezal(0);
|
||||
setCabezal(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Comprueba que si la cadena ingresada es reconocida por la maquina
|
||||
*
|
||||
* @param cinta cadena ingresada por el usuario
|
||||
* @param estadoFinal Arreglo de estados finales, también ingresados por usuario
|
||||
* @param estadosFinales Arreglo de estados finales, también ingresados por usuario
|
||||
* @return Verdadero si lo reconoce, caso contrario, falso
|
||||
*/
|
||||
public boolean comprobarCadena(StringBuilder cinta, int[] estadoFinal) {
|
||||
int i;
|
||||
for (i = 0; i < getEstadoActual().getEnlaces().size(); i++) {
|
||||
public boolean comprobarCadena(StringBuilder cinta, int[] estadosFinales) {
|
||||
for (int i = 0; i < getEstadoActual().getEnlaces().size(); i++) {
|
||||
if (getEstadoActual().getEnlaces().get(i).getSi() == cinta.charAt(getCabezal())) {
|
||||
setEnlaceActual(getEstadoActual().getEnlaces().get(i));
|
||||
cinta.setCharAt(getCabezal(), getEnlaceActual().getSj());
|
||||
movimientoCabezal(getEnlaceActual().getMovimiento(),cinta);
|
||||
movimientoCabezal(getEnlaceActual().getMovimiento(), cinta);
|
||||
setEstadoActual(getEnlaceActual().getQj());
|
||||
i = -1;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < estadoFinal.length; i++) {
|
||||
if (getEstadoActual().getQ() == estadoFinal[i]) {
|
||||
reset();
|
||||
for (int estadoFinal : estadosFinales) {
|
||||
if (getEstadoActual().getQ() == estadoFinal) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
reset();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -153,28 +150,32 @@ public class Maquina {
|
||||
* un enlace actual
|
||||
*
|
||||
* @param cinta Cadena ingresada por el usuario
|
||||
* @param estadoFinal Arreglo de estados finales, también ingresados por usuario
|
||||
* @return
|
||||
* @param estadosFinales Arreglo de estados finales, también ingresados por usuario
|
||||
* @return Verdadero si reconce la cinta, sino falso
|
||||
*/
|
||||
public boolean comprobarCadenaS2S(StringBuilder cinta, int[] estadoFinal) {
|
||||
setCintaAnterior(cinta.toString());
|
||||
int i;
|
||||
for (i = 0; i < getEstadoActual().getEnlaces().size(); i++) {
|
||||
public int comprobarCadenaS2S(StringBuilder cinta, int[] estadosFinales) {
|
||||
if (cintaAnterior.equals("")) {
|
||||
setCintaAnterior(cinta.toString());
|
||||
}
|
||||
else {
|
||||
cinta = new StringBuilder(getCintaAnterior());
|
||||
}
|
||||
for (int i = 0; i < getEstadoActual().getEnlaces().size(); i++) {
|
||||
if (getEstadoActual().getEnlaces().get(i).getSi() == cinta.charAt(getCabezal())) {
|
||||
setEnlaceActual(getEstadoActual().getEnlaces().get(i));
|
||||
setEstadoActual(getEnlaceActual().getQj());
|
||||
cinta.setCharAt(getCabezal(), getEnlaceActual().getSj());
|
||||
movimientoCabezal(getEnlaceActual().getMovimiento(),cinta);
|
||||
return true;
|
||||
movimientoCabezal(getEnlaceActual().getMovimiento(), cinta);
|
||||
setEstadoActual(getEnlaceActual().getQj());
|
||||
setCintaAnterior(cinta.toString());
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < estadoFinal.length; i++) {
|
||||
if (getEstadoActual().getQ() == estadoFinal[i]) {
|
||||
setEnlaceActual(null); // Indicar que no hay más transiciones
|
||||
return true;
|
||||
for (int estadoFinal : estadosFinales) {
|
||||
if (getEstadoActual().getQ() == estadoFinal) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -182,25 +183,24 @@ public class Maquina {
|
||||
* @param mov caracter asociado al movimiento
|
||||
* @param cinta Cadena ingresada por el usuario
|
||||
*/
|
||||
private void movimientoCabezal(char mov,StringBuilder cinta) {
|
||||
switch (mov) {
|
||||
case 'L': {
|
||||
setCabezal(getCabezal() - 1);
|
||||
if (getCabezal() == (-1)) {
|
||||
cinta.insert(0, "#");
|
||||
private void movimientoCabezal(char mov, StringBuilder cinta) {
|
||||
switch (mov) {
|
||||
case 'L': {
|
||||
setCabezal(getCabezal() - 1);
|
||||
if (getCabezal() == (-1)) {
|
||||
cinta.insert(0, "#");
|
||||
setCabezal(getCabezal() + 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'R': {
|
||||
setCabezal(getCabezal() + 1);
|
||||
if (getCabezal() == cinta.length()) {
|
||||
cinta.insert(getCabezal(), "#");
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default: {/*Se mantiene*/}
|
||||
}
|
||||
case 'R': {
|
||||
setCabezal(getCabezal() + 1);
|
||||
if (getCabezal() == cinta.length()) {
|
||||
cinta.insert(getCabezal(), "#");
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {/*Se mantiene*/}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -36,19 +36,15 @@ import java.util.regex.Pattern;
|
||||
* Controlar las acciones cuando una opción es elegido en el menu.
|
||||
*/
|
||||
public class MenuController {
|
||||
private EstadosFinales estadosFinales;
|
||||
|
||||
private TableView<TablaData> tableView;
|
||||
|
||||
@FXML
|
||||
private MenuBar menuBar;
|
||||
|
||||
@FXML
|
||||
private MenuItem menuIndiv;
|
||||
|
||||
@FXML
|
||||
private MenuItem menuLote;
|
||||
|
||||
private EstadosFinales estadosFinales;
|
||||
|
||||
/**
|
||||
* Menu opción cargar transiciones
|
||||
*
|
||||
@@ -61,7 +57,6 @@ public class MenuController {
|
||||
FileChooser fileChooser = new FileChooser();
|
||||
fileChooser.setTitle("Abrir archivo XML");
|
||||
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Archivos XML (*.xml)", "*.xml"));
|
||||
//fileChooser.setSelectedExtensionFilter(new FileChooser.ExtensionFilter("Archivos XML (*.xml)", "*.xml"));
|
||||
File archivo = fileChooser.showOpenDialog(parentStage);
|
||||
LeerXML xml = new LeerXML();
|
||||
Document documento = xml.leerArchivo(archivo);
|
||||
@@ -77,12 +72,13 @@ public class MenuController {
|
||||
Text text = new Text(0, 0, "TRANSICIONES CARGADAS");
|
||||
text.setFill(Color.BLACK);
|
||||
text.setFont(Font.font(java.awt.Font.SANS_SERIF, 25));
|
||||
text.setId("cargada");
|
||||
contenido.getChildren().add(text);
|
||||
|
||||
menuIndiv.setDisable(false);
|
||||
menuLote.setDisable(false);
|
||||
}
|
||||
tableView = FXMLLoader.load(getClass().getResource("/cl/cromer/mt/fxml/tabla.fxml"));
|
||||
TableView<TablaData> tableView = FXMLLoader.load(getClass().getResource("/cl/cromer/mt/fxml/tabla.fxml"));
|
||||
VBox.setVgrow(tableView, Priority.ALWAYS);
|
||||
tableView.skinProperty().addListener((source, oldWidth, newWidth) -> {
|
||||
final TableHeaderRow header = (TableHeaderRow) tableView.lookup("TableHeaderRow");
|
||||
@@ -128,22 +124,48 @@ public class MenuController {
|
||||
stage.show();
|
||||
}
|
||||
else {
|
||||
TableView tableView = (TableView) scene.lookup("#tableView");
|
||||
VBox contenido = (VBox) scene.lookup("#contenido");
|
||||
if (tableView != null) {
|
||||
tableView.setItems(null);
|
||||
Text cargada = (Text) scene.lookup("#cargada");
|
||||
contenido.getChildren().removeAll(tableView, cargada);
|
||||
}
|
||||
menuIndiv.setDisable(true);
|
||||
menuLote.setDisable(true);
|
||||
if(archivo != null) MT.mostrarMensaje("Error","El archivo "+ archivo.getName()+ " no es un xml valido");
|
||||
else MT.mostrarMensaje("Aviso","No se ha seleccionado archivo");
|
||||
if (archivo != null) {
|
||||
MT.mostrarMensaje("Error", "El archivo " + archivo.getName() + " no es un xml valido");
|
||||
}
|
||||
else {
|
||||
MT.mostrarMensaje("Aviso", "No se ha seleccionado archivo!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Menu opción reconocimiento individual
|
||||
*
|
||||
* @throws Exception La excepción
|
||||
*/
|
||||
@FXML
|
||||
protected void reconoceIndividual() {
|
||||
@SuppressWarnings("unchecked")
|
||||
protected void reconoceIndividual() throws Exception {
|
||||
Scene parentScene = menuBar.getScene();
|
||||
Stage parentStage = (Stage) parentScene.getWindow();
|
||||
|
||||
FXMLLoader fxmlLoader = new FXMLLoader();
|
||||
fxmlLoader.setLocation(getClass().getResource("/cl/cromer/mt/fxml/individual.fxml"));
|
||||
Scene scene = new Scene(fxmlLoader.load(), 640, 480);
|
||||
scene.setUserData(estadosFinales);
|
||||
scene.getStylesheets().add("/cl/cromer/mt/css/mt.css");
|
||||
Stage stage = new Stage();
|
||||
stage.initModality(Modality.WINDOW_MODAL);
|
||||
stage.initOwner(parentStage);
|
||||
stage.setTitle("Reconocimiento individual");
|
||||
stage.setMinHeight(480);
|
||||
stage.setMinWidth(640);
|
||||
stage.setScene(scene);
|
||||
stage.getIcons().add(new Image(getClass().getResourceAsStream("/cl/cromer/mt/images/icon.png")));
|
||||
stage.show();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -165,7 +187,7 @@ public class MenuController {
|
||||
Stage stage = new Stage();
|
||||
stage.initModality(Modality.WINDOW_MODAL);
|
||||
stage.initOwner(parentStage);
|
||||
stage.setTitle("Reconocimiento por lotes");
|
||||
stage.setTitle("Reconocimiento por lote");
|
||||
stage.setMinHeight(480);
|
||||
stage.setMinWidth(640);
|
||||
stage.setScene(scene);
|
||||
@@ -180,11 +202,13 @@ public class MenuController {
|
||||
});
|
||||
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
|
||||
|
||||
tableView.setEditable(true);
|
||||
TableColumn<TablaData, String> columna1 = (TableColumn<TablaData, String>) tableView.getColumns().get(0);
|
||||
columna1.setCellFactory(TextFieldTableCell.forTableColumn());
|
||||
columna1.setOnEditCommit(
|
||||
columna -> columna.getTableView().getItems().get(columna.getTablePosition().getRow()).setPrimera(columna.getNewValue())
|
||||
);
|
||||
columna1.setOnEditCommit(event -> {
|
||||
event.getTableView().getItems().get(event.getTablePosition().getRow()).setPrimera(agregarGatos(event.getNewValue()));
|
||||
event.getTableView().refresh();
|
||||
});
|
||||
|
||||
tableView.getColumns().get(0).setText("Cadena");
|
||||
tableView.getColumns().get(0).setEditable(true);
|
||||
@@ -194,4 +218,22 @@ public class MenuController {
|
||||
VBox contenido = (VBox) scene.lookup("#contenido");
|
||||
contenido.getChildren().add(tableView);
|
||||
}
|
||||
|
||||
/**
|
||||
* Agregar un gato al inicio y al final de un string si no existen
|
||||
*
|
||||
* @param string El string a agregar los gatos
|
||||
*
|
||||
* @return String con gatos
|
||||
*/
|
||||
private String agregarGatos(String string) {
|
||||
StringBuilder temp = new StringBuilder(string);
|
||||
if (string.charAt(0) != '#') {
|
||||
temp.insert(0, "#");
|
||||
}
|
||||
if (temp.charAt(temp.length() - 1) != '#') {
|
||||
temp.insert(temp.length(), "#");
|
||||
}
|
||||
return temp.toString();
|
||||
}
|
||||
}
|
||||
@@ -88,4 +88,4 @@ public class TablaData {
|
||||
public SimpleStringProperty segundaProperty() {
|
||||
return segunda;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,4 +26,4 @@ This file may not be copied, modified, propagated, or distributed except accordi
|
||||
</Button>
|
||||
</VBox>
|
||||
</ScrollPane>
|
||||
</VBox>
|
||||
</VBox>
|
||||
42
src/cl/cromer/mt/fxml/individual.fxml
Normal file
42
src/cl/cromer/mt/fxml/individual.fxml
Normal file
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (c) 2017 Christopher Cromer
|
||||
Copyright (c) 2017 Carlos Faúndez
|
||||
|
||||
This file is part of mt. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution.
|
||||
This file may not be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.
|
||||
-->
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
<?import javafx.scene.text.*?>
|
||||
<VBox xmlns:fx="http://javafx.com/fxml/1" prefHeight="480.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8.0.92" fx:controller="cl.cromer.mt.IndividualController">
|
||||
<ScrollPane fitToHeight="true" fitToWidth="true" VBox.vgrow="ALWAYS">
|
||||
<VBox alignment="TOP_CENTER" VBox.vgrow="ALWAYS" fx:id="contenido">
|
||||
<VBox alignment="CENTER" VBox.vgrow="ALWAYS" spacing="5">
|
||||
<HBox alignment="TOP_CENTER" fx:id="cinta"/>
|
||||
<Text fx:id="estadoActual"/>
|
||||
<Text fx:id="estadoPrevio"/>
|
||||
<Text fx:id="simboloLeido"/>
|
||||
<Text fx:id="simboloEscrito"/>
|
||||
<Text fx:id="movimiento"/>
|
||||
</VBox>
|
||||
<HBox alignment="CENTER" spacing="10.0">
|
||||
<Text>Cadena:</Text>
|
||||
<TextField id="cadena" fx:id="cadena" HBox.hgrow="ALWAYS"/>
|
||||
<Button fx:id="aceptar" onAction="#aceptarCadena" text="Aceptar"/>
|
||||
<padding>
|
||||
<Insets left="5.0" right="5.0" top="5.0" bottom="5.0"/>
|
||||
</padding>
|
||||
</HBox>
|
||||
<HBox alignment="CENTER" spacing="10.0">
|
||||
<Button fx:id="paso" disable="true" onAction="#paso" text="Correr Paso"/>
|
||||
<Button onAction="#cerrar" text="Cerrar"/>
|
||||
<padding>
|
||||
<Insets left="5.0" right="5.0" top="5.0" bottom="5.0"/>
|
||||
</padding>
|
||||
</HBox>
|
||||
</VBox>
|
||||
</ScrollPane>
|
||||
</VBox>
|
||||
@@ -36,4 +36,4 @@ This file may not be copied, modified, propagated, or distributed except accordi
|
||||
</HBox>
|
||||
</VBox>
|
||||
</ScrollPane>
|
||||
</VBox>
|
||||
</VBox>
|
||||
@@ -14,4 +14,4 @@ This file may not be copied, modified, propagated, or distributed except accordi
|
||||
<MenuItem fx:id="menuIndiv" text="Reconocimiento individual" disable="true" onAction="#reconoceIndividual"/>
|
||||
<MenuItem fx:id="menuLote" text="Reconocimiento por lote" disable="true" onAction="#reconoceLote"/>
|
||||
</Menu>
|
||||
</MenuBar>
|
||||
</MenuBar>
|
||||
Reference in New Issue
Block a user