Index: ShortestPathSolverAStar.java
===================================================================
--- ShortestPathSolverAStar.java	(revision 20098)
+++ ShortestPathSolverAStar.java	(revision 20099)
@@ -49,13 +49,14 @@
 import com.iver.cit.gvsig.fmap.core.v02.FConverter;
 import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
 import com.iver.cit.gvsig.fmap.layers.VectorialAdapter;
-import com.iver.cit.gvsig.graph.GraphException;
 import com.iver.cit.gvsig.graph.core.AbstractNetSolver;
+import com.iver.cit.gvsig.graph.core.GraphException;
 import com.iver.cit.gvsig.graph.core.GvEdge;
 import com.iver.cit.gvsig.graph.core.GvFlag;
 import com.iver.cit.gvsig.graph.core.GvNode;
 import com.iver.cit.gvsig.graph.core.GvTurn;
 import com.iver.cit.gvsig.graph.core.IGraph;
+import com.iver.cit.gvsig.graph.core.NetworkUtils;
 import com.vividsolutions.jts.geom.Coordinate;
 import com.vividsolutions.jts.geom.Geometry;
 import com.vividsolutions.jts.geom.GeometryFactory;
@@ -190,14 +191,16 @@
 		System.out.println("Salgo con node = " + node.getIdNode());
 	}
 
-	private void populateRoute(GvFlag origin, GvFlag dest, int idStart, int idEnd) throws DriverException {
+	private void populateRoute(GvFlag origin, GvFlag dest, int idStart,
+			int idEnd) throws DriverException {
 		int idEnlace;
 		GvNode node;
 		GvEdge link;
 		double costeEntrada;
 
-		// Trazar el camino desde idEnd hasta idStart hacia atrás marcando los Enlaces
-		
+		// Trazar el camino desde idEnd hasta idStart hacia atrás marcando los
+		// Enlaces
+
 		if (idStart == idEnd)
 			return;
 		IGraph graph = net.getGraph();
@@ -206,203 +209,196 @@
 		VectorialAdapter va = (VectorialAdapter) net.getLayer().getSource();
 		try {
 			va.start();
-		/*	Miramos los nodos de los tramos inicio y final, y cogemos el nodo que tenga el from_link rellenado. E IGUAL A NUMSOLUCGLOBAL!!!!
-			A partir de ahí, recorremos hacia atrás y tenemos el cuerpo principal del shape. Luego, para
-			las puntas hay que tener en cuenta los porcentajes, viendo el trozo que está pegando a los nodos
-			que sabemos que están en el path
-		*/
+			/*
+			 * Miramos los nodos de los tramos inicio y final, y cogemos el nodo
+			 * que tenga el from_link rellenado. E IGUAL A NUMSOLUCGLOBAL!!!! A
+			 * partir de ahí, recorremos hacia atrás y tenemos el cuerpo
+			 * principal del shape. Luego, para las puntas hay que tener en
+			 * cuenta los porcentajes, viendo el trozo que está pegando a los
+			 * nodos que sabemos que están en el path
+			 */
 
-		/* 22/9/2003 Corregimos el fallo que había de escribir el shape de atrás adelante.
-		*  Guardamos lo que necesitamos en listaShapes y recorremos esa lista guardando los tramos
-		*	con el sentido adecuado.
-		*/
+			/*
+			 * 22/9/2003 Corregimos el fallo que había de escribir el shape de
+			 * atrás adelante. Guardamos lo que necesitamos en listaShapes y
+			 * recorremos esa lista guardando los tramos con el sentido
+			 * adecuado.
+			 */
 
-		/* 3/Febrero/2005 Limpieza de código superfluo y correción de un fallo raro. Ahora es más simple y parece
-		* que no falla. A ver si dura. IDEA: quizás se necesite meter el porcentaje en los arcos partidos.
-		*/	
+			/*
+			 * 3/Febrero/2005 Limpieza de código superfluo y correción de un
+			 * fallo raro. Ahora es más simple y parece que no falla. A ver si
+			 * dura. IDEA: quizás se necesite meter el porcentaje en los arcos
+			 * partidos.
+			 */
 
-		// Define a template class for a vector of IDs.
-		InfoShp infoShp;
-		Stack pilaShapes = new Stack();
-//		typedef stack<CInfoShp> PILAINFO;
-//		PILAINFO pilaShapes;
+			// Define a template class for a vector of IDs.
+			InfoShp infoShp;
+			Stack pilaShapes = new Stack();
+			// typedef stack<CInfoShp> PILAINFO;
+			// PILAINFO pilaShapes;
 
-		double costeTramoFinal=-1;
-		GvNode nodeEnd = graph.getNodeByID(idEnd);
-		GvEdge finalEdge = graph.getEdgeByID(nodeEnd.getFromLink());
-		costeTramoFinal = finalEdge.getWeight();
+			double costeTramoFinal = -1;
+			GvNode nodeEnd = graph.getNodeByID(idEnd);
+			GvEdge finalEdge = graph.getEdgeByID(nodeEnd.getFromLink());
+			costeTramoFinal = finalEdge.getWeight();
 
-		GvNode pNodo;
-		GvEdge pEnlace;
-		
-		boolean bFlipearShape = false;
+			GvNode pNodo;
+			GvEdge pEnlace;
 
-		double pctMax, pctMin;
+			boolean bFlipearShape = false;
 
+			double pctMax, pctMin;
 
+			// ////////////////////////////////////////////////////////////////////////////////////
+			// Trozo del final
+			// El shape va de idStop1 a idStop2, y el porcentaje viene en ese
+			// sentido.
+			// Si el idEnd es idStop1, quiere decir que el tramo que falta va en
+			// ese sentido también,
+			// así que recorremos ese shape desde idStop1 hasta que rebasemos o
+			// igualemos ese porcentaje.
+			// Si no, hemos pasado por idStop2 y la parte que hay que meter es
+			// desde el pto interior a idStop2
+			// /////////////////////////////////////////////////////////////////////////////////////
+			IFeature feat = va.getFeature(finalEdge.getIdArc());
+			MultiLineString jtsGeom = (MultiLineString) feat.getGeometry()
+					.toJTSGeometry();
+			// CoordinateFilter removeDuplicates = new
+			// UniqueCoordinateArrayFilter();
+			// jtsGeom.apply(removeDuplicates);
+			// jtsGeom.geometryChanged();
 
-		//////////////////////////////////////////////////////////////////////////////////////
-		// Trozo del final
-		// El shape va de idStop1 a idStop2, y el porcentaje viene en ese sentido.
-		// Si el idEnd es idStop1, quiere decir que el tramo que falta va en ese sentido también,
-		// así que recorremos ese shape desde idStop1 hasta que rebasemos o igualemos ese porcentaje.
-		// Si no, hemos pasado por idStop2 y la parte que hay que meter es desde el pto interior a idStop2
-		///////////////////////////////////////////////////////////////////////////////////////
-		IFeature feat = va.getFeature(finalEdge.getIdArc());
-		MultiLineString jtsGeom = (MultiLineString) feat.getGeometry().toJTSGeometry();
-//		CoordinateFilter removeDuplicates = new UniqueCoordinateArrayFilter(); 
-//		jtsGeom.apply(removeDuplicates);
-//		jtsGeom.geometryChanged();
-		
-		
-		
-		// SI ESTAMOS SOBRE EL MISMO TRAMO, CASO PARTICULAR
-		// y el sentido de circulación es correcto
-		if ((origin.getIdArc() == dest.getIdArc()) && (nodeEnd.getBestCost() <= costeTramoFinal))
-		{
-			if (dest.getPct() > origin.getPct())
-			{
-				pctMax = dest.getPct();
-				pctMin = origin.getPct(); 
-			}
-			else
-			{
-				pctMax = origin.getPct();
-				pctMin = dest.getPct();
-				bFlipearShape = true;
-			}
+			// SI ESTAMOS SOBRE EL MISMO TRAMO, CASO PARTICULAR
+			// y el sentido de circulación es correcto
+			if ((origin.getIdArc() == dest.getIdArc())
+					&& (nodeEnd.getBestCost() <= costeTramoFinal)) {
+				if (dest.getPct() > origin.getPct()) {
+					pctMax = dest.getPct();
+					pctMin = origin.getPct();
+				} else {
+					pctMax = origin.getPct();
+					pctMin = dest.getPct();
+					bFlipearShape = true;
+				}
 
-			LineString line = SituaSobreTramo(jtsGeom,dest.getIdArc(), dest.getPct(),1);
-			
-			pctMin = pctMin / pctMax; // Porque ha cambiado la longitud del shape
+				LineString line = NetworkUtils.getPartialLineString(jtsGeom, 
+						pctMax, 1);
 
-			line = SituaSobreTramo(line,dest.getIdArc(), pctMin,0);
+				pctMin = pctMin / pctMax; // Porque ha cambiado la longitud
+											// del shape
 
-			if (bFlipearShape)
-				line = line.reverse();
-			
-			IGeometry geom = FConverter.jts_to_igeometry(line);
-			// TODO: Calcular bien el length de este arco, 
-			// basandonos en el porcentaje costeTramoFinal / costeOriginal
-			route.addRouteFeature(geom, origin.getIdArc(), 
-					costeTramoFinal, line.getLength(), feat.getAttribute(getFieldIndexStreetName()).toString());
+				line = NetworkUtils.getPartialLineString(line, pctMin, 0);
 
+				if (bFlipearShape)
+					line = line.reverse();
 
-			return ; // Debería sacar el coste
-		}
+				IGeometry geom = FConverter.jts_to_igeometry(line);
+				// TODO: Calcular bien el length de este arco,
+				// basandonos en el porcentaje costeTramoFinal / costeOriginal
+				route.addRouteFeature(geom, origin.getIdArc(), costeTramoFinal,
+						line.getLength(), feat.getAttribute(
+								getFieldIndexStreetName()).toString());
 
-		
+				return; // Debería sacar el coste
+			}
 
-		// Trazar el camino desde idEnd hasta idStart hacia atrás marcando los Enlaces
-		pNodo = graph.getNodeByID(idEnd);
+			// Trazar el camino desde idEnd hasta idStart hacia atrás marcando
+			// los Enlaces
+			pNodo = graph.getNodeByID(idEnd);
 
-		while ((pNodo.getIdNode() != idStart)) 
-		{
-			idEnlace = pNodo.getFromLink();
-			pEnlace = graph.getEdgeByID(idEnlace);
+			while ((pNodo.getIdNode() != idStart)) {
+				idEnlace = pNodo.getFromLink();
+				pEnlace = graph.getEdgeByID(idEnlace);
 
-			pNodo = graph.getNodeByID(pEnlace.getIdNodeOrig());
-			
-			infoShp = new InfoShp();
-			infoShp.distance = pEnlace.getDistance();
-			infoShp.cost = pEnlace.getWeight();
+				pNodo = graph.getNodeByID(pEnlace.getIdNodeOrig());
 
-			if ((pEnlace.getIdArc() == origin.getIdArc()) || (pEnlace.getIdArc() == dest.getIdArc()))
-			{
-				if (pEnlace.getIdArc() == origin.getIdArc())
-				{
-					infoShp.pct = origin.getPct();
-					infoShp.idArc = origin.getIdArc();
-					if (pEnlace.getDirec() == 0) 
-					{
-						infoShp.direction = 1;
-						infoShp.bFlip = true;
+				infoShp = new InfoShp();
+				infoShp.distance = pEnlace.getDistance();
+				infoShp.cost = pEnlace.getWeight();
+
+				if ((pEnlace.getIdArc() == origin.getIdArc())
+						|| (pEnlace.getIdArc() == dest.getIdArc())) {
+					if (pEnlace.getIdArc() == origin.getIdArc()) {
+						infoShp.pct = origin.getPct();
+						infoShp.idArc = origin.getIdArc();
+						if (pEnlace.getDirec() == 0) {
+							infoShp.direction = 1;
+							infoShp.bFlip = true;
+						} else // Hemos pasado por el 2
+						{
+							infoShp.direction = 0;
+							infoShp.bFlip = false;
+						} // if else */
+					} else {
+						infoShp.pct = dest.getPct();
+						infoShp.idArc = dest.getIdArc();
+						if (pEnlace.getDirec() == 0) {
+							infoShp.direction = 0;
+							infoShp.bFlip = true;
+						} else {
+							infoShp.direction = 1;
+							infoShp.bFlip = false;
+						} // if else */
 					}
-					else // Hemos pasado por el 2
-					{
-						infoShp.direction = 0;
+				} else {
+					infoShp.pct = 1.0;
+					infoShp.idArc = pEnlace.getIdArc();
+
+					infoShp.direction = 1;
+					if (pEnlace.getDirec() == 1)
 						infoShp.bFlip = false;
-					} // if else */
-				}
-				else
-				{
-					infoShp.pct = dest.getPct();
-					infoShp.idArc = dest.getIdArc();
-					if (pEnlace.getDirec() == 0)
-					{
-						infoShp.direction = 0;
-						infoShp.bFlip = true;
-					}
 					else
-					{
-						infoShp.direction = 1;
-						infoShp.bFlip = false;
-					} // if else */
+						infoShp.bFlip = true;
 				}
+
+				pilaShapes.push(infoShp);
 			}
-			else
-			{
-				infoShp.pct = 1.0;
-				infoShp.idArc = pEnlace.getIdArc();
-				
-				infoShp.direction =1;
-				if (pEnlace.getDirec() == 1)
-					infoShp.bFlip = false;
-				else
-					infoShp.bFlip = true;
-			}
 
-			pilaShapes.push(infoShp);
-		}
+			// Y ahora recorremos hacia atrás el vector y escribimos los shapes.
+			// VECTORINFO::iterator theIterator;
+			int auxC = 0;
 
-		// Y ahora recorremos hacia atrás el vector y escribimos los shapes.
-		// VECTORINFO::iterator theIterator;
-		int auxC = 0;
-		
-		while (!pilaShapes.empty())  
-		{
-			infoShp = (InfoShp) pilaShapes.peek();
-			feat = va.getFeature(infoShp.idArc);
-			MultiLineString line = (MultiLineString) feat.getGeometry().toJTSGeometry();
-//			line.apply(removeDuplicates);
-//			line.geometryChanged();
-			
-			LineString aux = null;
-			if (infoShp.pct < 1.0)
-				aux = SituaSobreTramo(line,infoShp.idArc, infoShp.pct, infoShp.direction);
+			while (!pilaShapes.empty()) {
+				infoShp = (InfoShp) pilaShapes.peek();
+				feat = va.getFeature(infoShp.idArc);
+				MultiLineString line = (MultiLineString) feat.getGeometry()
+						.toJTSGeometry();
+				// line.apply(removeDuplicates);
+				// line.geometryChanged();
 
-			IGeometry geom = null;
-			if (aux == null)
-			{
-				if (infoShp.bFlip)
-					line = line.reverse();
-				geom = FConverter.jts_to_igeometry(line);
-			}	
-			else
-			{
-				if (infoShp.bFlip)
-					aux = aux.reverse();
-				geom = FConverter.jts_to_igeometry(aux);
-			}	
+				LineString aux = null;
+				if (infoShp.pct < 1.0)
+					aux = NetworkUtils.getPartialLineString(line, infoShp.pct,
+							infoShp.direction);
 
+				IGeometry geom = null;
+				if (aux == null) {
+					if (infoShp.bFlip)
+						line = line.reverse();
+					geom = FConverter.jts_to_igeometry(line);
+				} else {
+					if (infoShp.bFlip)
+						aux = aux.reverse();
+					geom = FConverter.jts_to_igeometry(aux);
+				}
 
-			route.addRouteFeature(geom, infoShp.idArc, 
-					infoShp.cost, infoShp.distance, feat.getAttribute(getFieldIndexStreetName()).toString());
+				route.addRouteFeature(geom, infoShp.idArc, infoShp.cost,
+						infoShp.distance, feat.getAttribute(
+								getFieldIndexStreetName()).toString());
 
+				pilaShapes.pop();
+				auxC++;
 
-			pilaShapes.pop();
-			auxC++;
-			
-		}
-		va.stop();
-		} catch (DriverIOException e) {
+			}
+			va.stop();
+		} catch (Exception e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
 		}
 
 		return;
 
-		
 	}
 
 	LineString SituaSobreTramo(Geometry geom, int idArc, double pct, int parte)
