
Geoprocesos
===============

Insertar geoproceso en la Toolbox
----------------

Creación de un geoproceso desde Scripting::

	# encoding: utf-8


	from gvsig import *
	from gvsig.commonsdialog import *

	from gvsig.libs.toolbox import *
	from es.unex.sextante.gui import core
	from es.unex.sextante.gui.core import NameAndIcon

	class XYShift(ToolboxProcess):
	  
	  def defineCharacteristics(self):
		"""
	En esta operacion debemos definir los parametros de netrada y salida que va a precisar nuetro proceso.
		"""
		# Fijamos el nombre con el que se va a mostrar nuestro proceso
		self.setName("Prueba desplazamiento en X e Y")
		
		# Indicamos el grupo en el que aparecera
		self.setGroup("Vectorial")
			
		params = self.getParameters()
		# Indicamos que precisamos un parametro LAYER, del tipo punto y que es obligatorio
		params.addInputVectorLayer("LAYER","Caoa de entrada", SHAPE_TYPE_POINT,True)
		# Indicamos que precisamos un par de valores numericos, X e Y 
		params.addNumericalValue("X", "X_traslation",0, NUMERICAL_VALUE_DOUBLE)
		params.addNumericalValue("Y", "Y_traslation", 0, NUMERICAL_VALUE_DOUBLE)
		
		# Y por ultimo indicamos que precisaremos una capa de salida de puntos.
		self.addOutputVectorLayer("RESULT_POINT", "XYShift_point", SHAPE_TYPE_POINT)

	  def processAlgorithm(self):
		"""
	Esta operacion es la encargada de realizar nuetro proceso.
		"""
		features=None
	   
		try:

		  """
		  Recogemos los parametros y creamos el conjunto de entidades asociadas a la capa
		  de entrada.
		  """
		  params = self.getParameters()
		  layer = params.getParameterValueAsVectorLayer("LAYER")
		  x = params.getParameterValueAsDouble("X")
		  y = params.getParameterValueAsDouble("Y")

		  input_store = layer.getFeatureStore()

		  features = input_store.getFeatureSet()
		  """
		  Generamos la capa de salida con la misma estructura que la capa de entrada
		  """
		  output_store = self.buildOutPutStore(
			features.getDefaultFeatureType(), 
			SHAPE_TYPE_POINT,
			"XYShift_points",
			"RESULT_POINT"
		  )

		  """
		  Nos recorremos todas las entidades de entrada, y creamos las de salida desplazando la geometria
		  en los valores indicados por la X e Y de los parametros.
		  """
		  self.setRangeOfValues(0,features.getSize())
		  n = 0
		  for feature in features.iterator():
			if self.isCanceled():
			  # Si el usuario indico que quiere cancelar el proceso abortamos.
			  print "Proceso cancelado"
			  break
			
			# Incrementamos el progreso de nuestro proceso.
			self.next()

			# Creamos una nueva entidad para nuestro almacen de salida.
			newfeature = self.createNewFeature(output_store,feature)

			# Desplazamos la geometria de la nueva entidad
			geom = newfeature.getDefaultGeometry()
			geom.move(x,y)
			
			# Guardamos la nueva entidad
			output_store.insert(newfeature)
			n+=1
			self.setCurValue(n)

		  # Cuando hemos terminado de recorrernos las entidades terminamos la edicion.
		  output_store.finishEditing()   
		  
		finally:
		  DisposeUtils.disposeQuietly(features)
		  print "Proceso terminado %s" % self.getCommandLineName() 
		  return True
		

	def main(*args):
		# Creamos nuesto geoproceso
		process = XYShift()
		# Lo registramos entre los procesos disponibles en el grupo de "Scripting"
		process.selfregister("Scripting")
		from es.unex.sextante.gui.core import SextanteGUI
		#SextanteGUI.addAlgorithmProvider(process.__class__)
		from org.gvsig.geoprocess.lib.api import GeoProcessLocator
		gm = GeoProcessLocator.getGeoProcessManager()

		alg = gm.getAlgorithms()
		for a in alg:
			print a
		#gm.registerGeoProcess(process)
		
		# Actualizamos el interface de usuario de la Toolbox
		process.updateToolbox()

		msgbox("Incorporado el script '%s/%s/%s' a la paleta de geoprocesos." % (
			"Scripting",
			process.getGroup(),
			process.getName()
		  )
		)
