svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / clipping / ui / listener / ClippingMouseViewListener.java @ 30938
History | View | Annotate | Download (5.61 KB)
1 | 11352 | bsanchez | /* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
---|---|---|---|
2 | *
|
||
3 | * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
|
||
4 | *
|
||
5 | * This program is free software; you can redistribute it and/or
|
||
6 | * modify it under the terms of the GNU General Public License
|
||
7 | * as published by the Free Software Foundation; either version 2
|
||
8 | * of the License, or (at your option) any later version.
|
||
9 | *
|
||
10 | * This program is distributed in the hope that it will be useful,
|
||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
13 | * GNU General Public License for more details.
|
||
14 | *
|
||
15 | * You should have received a copy of the GNU General Public License
|
||
16 | * along with this program; if not, write to the Free Software
|
||
17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
||
18 | */
|
||
19 | 14827 | bsanchez | package org.gvsig.rastertools.clipping.ui.listener; |
20 | 11352 | bsanchez | |
21 | 12793 | nacho | import java.awt.geom.AffineTransform; |
22 | import java.awt.geom.NoninvertibleTransformException; |
||
23 | import java.awt.geom.Point2D; |
||
24 | 11352 | bsanchez | |
25 | 12425 | nacho | import org.gvsig.fmap.raster.layers.FLyrRasterSE; |
26 | 18148 | nbrodin | import org.gvsig.fmap.raster.tools.SaveRasterListenerImpl; |
27 | 15680 | bsanchez | import org.gvsig.gui.beans.buttonspanel.ButtonsPanel; |
28 | 23612 | nbrodin | import org.gvsig.raster.util.RasterToolsUtil; |
29 | 11352 | bsanchez | import org.gvsig.raster.util.RasterUtilities; |
30 | 21015 | nbrodin | import org.gvsig.rastertools.clipping.ClippingData; |
31 | 14827 | bsanchez | import org.gvsig.rastertools.clipping.ui.ClippingPanel; |
32 | 11352 | bsanchez | |
33 | import com.iver.cit.gvsig.fmap.MapControl; |
||
34 | import com.iver.cit.gvsig.fmap.tools.Events.RectangleEvent; |
||
35 | /**
|
||
36 | 14846 | bsanchez | * <code>ClippingMouseViewListener</code> es un listener del recorte de raster.
|
37 | 11408 | bsanchez | * Al seleccionar un ?rea sobre la vista debe cargar el cuadro con los datos de
|
38 | * coordenadas pixel, coordenadas reales, ancho y alto del raster resultante,
|
||
39 | * tama?o de celda.
|
||
40 | 12369 | bsanchez | *
|
41 | 11352 | bsanchez | * @version 19/04/2007
|
42 | 12369 | bsanchez | * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
|
43 | 11352 | bsanchez | */
|
44 | 14829 | bsanchez | public class ClippingMouseViewListener extends SaveRasterListenerImpl { |
45 | 21044 | nbrodin | private FLyrRasterSE layer = null; |
46 | private ClippingPanel clippingPanel = null; |
||
47 | private ClippingData data = null; |
||
48 | private MapControl mapControl = null; |
||
49 | private String currentTool = null; |
||
50 | 12369 | bsanchez | |
51 | 11352 | bsanchez | /**
|
52 | 14846 | bsanchez | * Crea un nuevo <code>ClippingMouseViewListener</code>
|
53 | 12369 | bsanchez | *
|
54 | 11352 | bsanchez | * @param mapCtrl
|
55 | * @param cutRasterDialog
|
||
56 | */
|
||
57 | 21044 | nbrodin | public ClippingMouseViewListener(MapControl mapControl, ClippingPanel clippingPanel, ClippingData data, FLyrRasterSE lyr) {
|
58 | 11352 | bsanchez | super(mapControl);
|
59 | 14846 | bsanchez | this.clippingPanel = clippingPanel;
|
60 | 21044 | nbrodin | this.data = data;
|
61 | this.layer = lyr;
|
||
62 | 11352 | bsanchez | this.mapControl = mapControl;
|
63 | 13414 | bsanchez | this.currentTool = mapControl.getCurrentTool();
|
64 | 11352 | bsanchez | } |
65 | |||
66 | /**
|
||
67 | * Asigna la capa raster.
|
||
68 | * @param flyr Capa raster
|
||
69 | */
|
||
70 | public void setRasterLayer(FLyrRasterSE flyr) { |
||
71 | layer = flyr; |
||
72 | } |
||
73 | 12369 | bsanchez | |
74 | 11352 | bsanchez | /**
|
75 | * Realiza las acciones de selecci?n del ?rea de recorte por medio de un rectangulo
|
||
76 | * sobre la vista.
|
||
77 | */
|
||
78 | public void rectangle(RectangleEvent event) { |
||
79 | super.rectangle(event);
|
||
80 | 15680 | bsanchez | clippingPanel.getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(false);
|
81 | 19930 | nbrodin | clippingPanel.getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(false);
|
82 | 13021 | bsanchez | |
83 | 23659 | nbrodin | if(((FLyrRasterSE) layer).getAffineTransform() == null) |
84 | return;
|
||
85 | |||
86 | 12793 | nacho | AffineTransform at = ((FLyrRasterSE) layer).getAffineTransform();
|
87 | 21015 | nbrodin | //Temporalmente cargamos las coordenadas reales para luego transformarlas a pixel
|
88 | 23612 | nbrodin | Point2D ulWc = new Point2D.Double(rect.getMinX(), rect.getMaxY()); |
89 | Point2D lrWc = new Point2D.Double(rect.getMaxX(), rect.getMinY()); |
||
90 | Point2D urWc = new Point2D.Double(rect.getMaxX(), rect.getMaxY()); |
||
91 | Point2D llWc = new Point2D.Double(rect.getMinX(), rect.getMinY()); |
||
92 | Point2D ulPx = new Point2D.Double(); |
||
93 | Point2D lrPx = new Point2D.Double(); |
||
94 | Point2D urPx = new Point2D.Double(); |
||
95 | Point2D llPx = new Point2D.Double(); |
||
96 | 12793 | nacho | try {
|
97 | 23612 | nbrodin | at.inverseTransform(ulWc, ulPx); |
98 | at.inverseTransform(lrWc, lrPx); |
||
99 | at.inverseTransform(urWc, urPx); |
||
100 | at.inverseTransform(llWc, llPx); |
||
101 | 12793 | nacho | } catch (NoninvertibleTransformException e) { |
102 | 23612 | nbrodin | RasterToolsUtil.messageBoxError(RasterToolsUtil.getText(this, "coordenadas_erroneas"), null); |
103 | 12793 | nacho | return;
|
104 | } |
||
105 | 15680 | bsanchez | |
106 | 12807 | nacho | Point2D[] pointList = new Point2D[]{ulPx, lrPx, urPx, llPx}; |
107 | Point2D dim = new Point2D.Double(layer.getPxWidth(), layer.getPxHeight()); |
||
108 | 11352 | bsanchez | |
109 | 23612 | nbrodin | //Comprobamos si la selecci?n est? completamente fuera del ?rea
|
110 | 12807 | nacho | if(isOutside(ulPx, lrPx)) {
|
111 | 21015 | nbrodin | data.setOutOfArea(); |
112 | 11352 | bsanchez | return;
|
113 | } |
||
114 | 13021 | bsanchez | |
115 | 12807 | nacho | //Ajustamos los puntos al ?rea en pixeles del raster
|
116 | RasterUtilities.adjustToPixelSize(pointList, dim); |
||
117 | 13021 | bsanchez | |
118 | 23612 | nbrodin | //Convertimos nuevamente a coordenadas reales despu?s de ajustar
|
119 | at.transform(ulPx, ulWc); |
||
120 | at.transform(lrPx, lrWc); |
||
121 | at.transform(llPx, llWc); |
||
122 | at.transform(urPx, urWc); |
||
123 | 11408 | bsanchez | |
124 | 23612 | nbrodin | data.setCoorPixel(ulPx, lrPx, llPx, urPx); |
125 | data.setCoorReal(ulWc, lrWc, llWc, urWc); |
||
126 | data.setAffineTransform(at); |
||
127 | 21015 | nbrodin | data.initSize(); |
128 | 23612 | nbrodin | |
129 | 21044 | nbrodin | clippingPanel.saveStatus(data); |
130 | 12369 | bsanchez | |
131 | 15680 | bsanchez | clippingPanel.getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
|
132 | clippingPanel.getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
|
||
133 | 13414 | bsanchez | |
134 | 12807 | nacho | if (currentTool != null) |
135 | mapControl.setTool(currentTool); |
||
136 | 11352 | bsanchez | } |
137 | 13021 | bsanchez | |
138 | 12807 | nacho | /**
|
139 | 13021 | bsanchez | * Comprueba si la selecci?n del punto est? fuera del ?rea del raster.
|
140 | 12807 | nacho | * @param ulPx Coordenada superior izquierda en pixeles
|
141 | * @param lrPx Corrdenada inferior derecha en pixeles
|
||
142 | * @return true si la selecci?n del punto est? fuera del raster y false si no lo est?
|
||
143 | */
|
||
144 | private boolean isOutside(Point2D ulPx, Point2D lrPx) { |
||
145 | double minX = Math.min(ulPx.getX(), lrPx.getX()); |
||
146 | double minY = Math.min(ulPx.getY(), lrPx.getY()); |
||
147 | double maxX = Math.max(ulPx.getX(), lrPx.getX()); |
||
148 | double maxY = Math.max(ulPx.getY(), lrPx.getY()); |
||
149 | 13021 | bsanchez | if(minX >= layer.getPxWidth() || minY >= layer.getPxHeight() || maxX < 0 || maxY < 0) |
150 | 12807 | nacho | return true; |
151 | return false; |
||
152 | } |
||
153 | 11352 | bsanchez | } |