Registro de operaciones
Este documento explica cómo registrar una nueva operación asociada a una geometría
.. include-document:: org.gvsig.fmap.geom/reference-links :rest: Para poder utilizar una operación esta ha tenido que ser registrada previamente. Si se intenta ejecutar una operación que no haya sido registrada mediante el GeometryManager_, se obtendrá una exceptión. El registro de operaciones se debe hacer en una clase que extienda de GeometryLibrary_, concretamente en el método *postinitialice*. El método *registerGeometryOperation* es el encargado de registrar una operación. Las operaciones se tienen que registrar asociadas a un tipo concreto de geometría (o a más de un tipo) de modo que pueden haber operaciones que sólo sean válidas para un subconjunto de geometrías. Por ejemplo, la operación PrintLn del apartado anterior se puede ejecutar sobre todos los tipos de geometrías. Para que esto sea así, hay que registrarla del siguiente modo: .. code-block:: java GeometryManager geometryManager = GeometryLocator.getGeometryManager(); geometryManager.registerOperation("PrintLn", printLn); El método *registerOperation* acepta dos parámetros: primero está el nombre de la operación y segundo está el objeto que implementa la operación. En este caso se está registrando la operación de dibujado por la salida estándar y se está asociando a todos los tipos de geometrías. Existe un mecanismo para registrar operaciones asociadas a un tipo de geometría concreta. Podemos por ejemplo crear una operación *PrintLn* que únicamente sea capaz de escribir por pantalla puntos en 2 dimensiones. La operación sería la siguiente: .. code-block:: java public class printLnPoint2D extends GeometryOperation { public static final String NAME = "println"; public static final int CODE = GeometryLocator.getGeometryManager().getGeometryOperationCode(NAME); public int getOperationIndex() { return CODE; } public Object invoke(Geometry geom, GeometryOperationContext ctx) throws GeometryOperationException { Point point = (Point)geom; System.out.println("Point 2D, X=" + point.getX() + " Y=" + point.getY()); return null; } } Esta operación sólo sabe manejar objetos de tipo *Point* en 2 dimensiones, por lo que en el método *registerOperation* de registro se tienen que especificar dos nuevos parámetros con el tipo y el subtipo de la geometría sobre la que se aplica esta operación. Cuando se invoque la operación *PrintLn", se ejecutará el código de la operación "PrintLn" para todos los tipos de geomtría menos para el *Point* en 2 dimensiones, que ejecutará el código de la operación específica. .. code-block:: java GeometryManager geometryManager = GeometryLocator.getGeometryManager(); geometryManager.registerOperation("PrintLn", printLnPoint2D, Geometry.TYPES.Point, Geometry.SUBTYPES.GEOM2D); Existe otra sobrecarga del método *registerOperation* que permite asociar una operación a todas las geometrías de un tipo determinado (con independencia del subtipo). Un ejemplo podría ser la siguiente operación que imprime por pantalla cualquier tipo de punto, independientemente de su dimensión. .. code-block:: java public class printLnPoint extends GeometryOperation { public static final String NAME = "println"; public static final int CODE = GeometryLocator.getGeometryManager().getGeometryOperationCode(NAME); public int getOperationIndex() { return CODE; } public Object invoke(Geometry geom, GeometryOperationContext ctx) throws GeometryOperationException { Point point = (Point)geom; System.out.println("Point, "); for (int i=0 ; i