/** * Realiza la función de cortar, si hay algo seleccionado Guarda el valor del portapapeles * anterior. Copia todos los tramos seleccionados y los nodos. Calcula una posicion que será la * referencia a la hora de pegar. Ésta posición será el nodo situado más a la izquierda. Después * elimina del mapa los elementos que se han cortado. Sin embargo, deja en el mapa nodos que, aún * habiendo sido cortados, tienen otros tramos no cortados en el mapa. */ public int hacer(IModelo modelo) { if (modelo.getMapa().getSeleccion() != null) { portapapelesAntiguo = modelo.getMapa().getPortapapeles(); antiguoNodoReferencia = modelo.getMapa().getNodoReferenciaPortapapeles(); modelo.getMapa().setPortapapeles(new Seleccion()); for (int j = 0; j < modelo.getMapa().getSeleccion().getTramosSeleccionados().size(); j++) { Tramo tramoMapa = modelo.getMapa().getSeleccion().getTramosSeleccionados().get(j); Nodo nodoInicialEnPortapapeles = modelo.getMapa().getPortapapeles().existeNodo(tramoMapa.getNodoInicial()); if (nodoInicialEnPortapapeles == null) { nodoInicialEnPortapapeles = tramoMapa.getNodoInicial().pseudoClone(); modelo.getMapa().getPortapapeles().añadirNodo(nodoInicialEnPortapapeles); } Nodo nodoFinalEnPortapapeles = modelo.getMapa().getPortapapeles().existeNodo(tramoMapa.getNodoFinal()); if (nodoFinalEnPortapapeles == null) { nodoFinalEnPortapapeles = tramoMapa.getNodoFinal().pseudoClone(); modelo.getMapa().getPortapapeles().añadirNodo(nodoFinalEnPortapapeles); } Tramo tramoPortapapeles = tramoMapa.pseudoClone(nodoInicialEnPortapapeles, nodoFinalEnPortapapeles); modelo.getMapa().getPortapapeles().añadirTramo(tramoPortapapeles); nodoInicialEnPortapapeles.añadirTramo(tramoPortapapeles); nodoFinalEnPortapapeles.añadirTramo(tramoPortapapeles); } for (int i = 0; i < modelo.getMapa().getSeleccion().getNodosSeleccionados().size(); i++) { Nodo nodoTemp = modelo.getMapa().getSeleccion().getNodosSeleccionados().get(i); Nodo nodoPortapapeles = modelo.getMapa().getPortapapeles().existeNodo(nodoTemp); if (nodoPortapapeles == null) { nodoPortapapeles = nodoTemp.pseudoClone(); modelo.getMapa().getPortapapeles().añadirNodo(nodoPortapapeles); } } Posicion posMinima = new Posicion(Double.MAX_VALUE, Double.MAX_VALUE); for (int i = 0; i < modelo.getMapa().getPortapapeles().getNodosSeleccionados().size(); i++) { Nodo nodoTemp = modelo.getMapa().getPortapapeles().getNodosSeleccionados().get(i); if (nodoTemp.getPos().getLon() <= posMinima.getLon()) { // if (nodoTemp.getPos().getLat()<=posMinima.getLat()) { posMinima = nodoTemp.getPos(); modelo.getMapa().setNodoReferenciaPortapapeles(nodoTemp); } } Iterator<Tramo> it = modelo.getMapa().getSeleccion().getTramosSeleccionados().iterator(); Tramo temp; while (it.hasNext()) { temp = it.next(); modelo.getMapa().getTramos().remove(temp); temp.getNodoInicial().getTramos().remove(temp); temp.getNodoFinal().getTramos().remove(temp); } for (int i = 0; i < modelo.getMapa().getSeleccion().getNodosSeleccionados().size(); i++) { Nodo nodoTemp = modelo.getMapa().getSeleccion().getNodosSeleccionados().get(i); boolean existeTramoEnMapa = false; for (int j = 0; j < modelo.getMapa().getTramos().size() && !existeTramoEnMapa; j++) { if (modelo.getMapa().getTramos().get(j).getNodoInicial().equals(nodoTemp) || modelo.getMapa().getTramos().get(j).getNodoFinal().equals(nodoTemp)) existeTramoEnMapa = true; } if (!existeTramoEnMapa) { boolean nodoEliminado = false; modelo.getMapa().getNodos().remove(nodoTemp); } } } return 0; }