Revision 5893

View differences:

trunk/libraries/libFMap/src/com/iver/cit/gvsig/fmap/edition/rules/RulePolygon.java
40 40
 */
41 41
package com.iver.cit.gvsig.fmap.edition.rules;
42 42

  
43
import com.iver.cit.gvsig.fmap.core.GeneralPathX;
43 44
import com.iver.cit.gvsig.fmap.core.IFeature;
44 45
import com.iver.cit.gvsig.fmap.core.IGeometry;
45 46
import com.iver.cit.gvsig.fmap.core.IRow;
47
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
46 48

  
47 49
/**
48 50
 * @author fjp
......
55 57
	public boolean validate(IRow row) {
56 58
		IFeature feat = (IFeature) row;
57 59
		IGeometry geom = feat.getGeometry();
60
        GeneralPathX gp = new GeneralPathX();
61
        gp.append(geom.getPathIterator(null), true);
62
        if (gp.isClosed())
63
        {
64
        	gp.ensureOrientation(false); // Poligono exterior.
65
        	geom = ShapeFactory.createPolygon2D(gp);
66
        	feat.setGeometry(geom);
67
        	return true;
68
        }
69
		
58 70
		return false;
59 71
	}
60 72

  
trunk/libraries/libFMap/src/com/iver/cit/gvsig/fmap/core/IFeature.java
49 49
 * should get schema information from layer.
50 50
 */
51 51
public interface IFeature extends IRow {
52
    IGeometry getGeometry();   
52
    IGeometry getGeometry();
53

  
54
	void setGeometry(IGeometry geom);   
53 55
}
trunk/libraries/libFMap/src/com/iver/cit/gvsig/fmap/core/GeneralPathX.java
774 774

  
775 775
	/**
776 776
	 * Use this function to ensure you get real polygons or holes
777
	 * En JTS, con bCCW = false obtienes un pol?gono exterior.
778
	 * Nota: Solo se le da la vuelta (si es que lo necesita) al
779
	 * pol?gono exterior. El resto, por ahora, no se tocan.
780
	 * Si se necesita tenerlos en cuenta, habr?a que mirar
781
	 * si est?n dentro del otro, y entonces revisar que tiene
782
	 * un CCW contrario al exterior.
777 783
	 * @param bCCW true if you want the GeneralPath in CCW order
778
	 * TODO: TERMINAR ESTO!!
784
	 * @return true si se le ha dado la vuelta. (true if flipped)
785
	 * TODO: TERMINAR ESTO!! NO EST? COMPLETO!! NO sirve para multipoligonos
779 786
	 */
780
	public void ensureOrientation(boolean bCCW) {
787
	public boolean ensureOrientation(boolean bCCW) {
781 788
        byte[] pointTypesAux = new byte[numTypes+1];
782 789
        double[] pointCoordsAux = new double[numCoords+2];
783 790
        int i;
784 791
        int pointIdx = 0;
785 792
        
786
        Coordinate c1;
793
        Coordinate c1, c2, c3;
787 794
        CoordinateList coordList = new CoordinateList();
795
        CoordinateList firstList = new CoordinateList();
796
        boolean bFirstList = true;
797
        Coordinate cInicio = null;
788 798
        
789 799
        for (i=0; i< numTypes; i++)
790 800
        {
......
794 804
        	{
795 805
        	case SEG_MOVETO:
796 806
        		c1= new Coordinate(pointCoords[pointIdx], pointCoords[pointIdx+1]);
807
        		cInicio = c1;
797 808
        		coordList.add(c1, true);
809
        		if (i>0) bFirstList = false;
810
        		if (bFirstList)
811
        		{
812
        			firstList.add(c1,true);
813
        		}
798 814
        		break;
799 815
        	case SEG_LINETO:
800 816
        		c1= new Coordinate(pointCoords[pointIdx], pointCoords[pointIdx+1]);
801 817
        		coordList.add(c1, true);
818
        		if (bFirstList)
819
        		{
820
        			firstList.add(c1,true);        			
821
        		}
802 822
        		break;
803 823
        	case SEG_QUADTO:
804 824
        		c1= new Coordinate(pointCoords[pointIdx], pointCoords[pointIdx+1]);
805 825
        		coordList.add(c1, true);
806
        		c1= new Coordinate(pointCoords[pointIdx+2], pointCoords[pointIdx+3]);
807
        		coordList.add(c1, true);        		
826
        		c2= new Coordinate(pointCoords[pointIdx+2], pointCoords[pointIdx+3]);
827
        		coordList.add(c2, true);
828
        		if (bFirstList)
829
        		{
830
        			firstList.add(c1,true);
831
        			firstList.add(c2,true);
832
        		}
833
        		
808 834
        		break;
809 835
        	case SEG_CUBICTO:
810 836
        		c1= new Coordinate(pointCoords[pointIdx], pointCoords[pointIdx+1]);
811 837
        		coordList.add(c1, true);
812
        		c1= new Coordinate(pointCoords[pointIdx+2], pointCoords[pointIdx+3]);
813
        		coordList.add(c1, true);
814
        		c1= new Coordinate(pointCoords[pointIdx+4], pointCoords[pointIdx+5]);
815
        		coordList.add(c1, true);        		
838
        		c2= new Coordinate(pointCoords[pointIdx+2], pointCoords[pointIdx+3]);
839
        		coordList.add(c2, true);
840
        		c3= new Coordinate(pointCoords[pointIdx+4], pointCoords[pointIdx+5]);
841
        		coordList.add(c3, true);        		
842
        		if (bFirstList)
843
        		{
844
        			firstList.add(c1,true);
845
        			firstList.add(c2,true);
846
        			firstList.add(c3,true);
847
        		}
816 848
        		
817 849
        		break;
818 850
        	case SEG_CLOSE:
819
        		// TODO: IMPLEMENTAR ESTO!!!
851
        		coordList.add(cInicio, true);
852
        		if (bFirstList)
853
        		{
854
        			firstList.add(cInicio,true);
855
        		}        		
820 856
        		break;
821 857
        		
822 858
        	}
......
824 860
        }
825 861
		// Guardamos el path dandole la vuelta
826 862
		Coordinate[] coords = coordList.toCoordinateArray();
863
		boolean bFlipped = false;
827 864
		if (CGAlgorithms.isCCW(coords) != bCCW) // Le damos la vuelta
828 865
		{
829 866
			CoordinateArraySequence seq = new CoordinateArraySequence(coords);
......
871 908
	        pointCoords = pointCoordsAux;
872 909
	        numCoords= numCoords+2;
873 910
	        numTypes++;
911
	        bFlipped  = true;
874 912

  
875 913
		}
876
		
914
		return bFlipped;
877 915
	}
878 916
	
879 917
    public boolean isCCW()
trunk/extensions/extCAD/src/com/iver/cit/gvsig/StartEditing.java
1 1
package com.iver.cit.gvsig;
2 2

  
3 3
import java.awt.event.ActionEvent;
4
import java.awt.event.KeyEvent;
5 4

  
6 5
import javax.swing.AbstractAction;
7
import javax.swing.Action;
8
import javax.swing.ActionMap;
9
import javax.swing.InputMap;
10
import javax.swing.JComponent;
11
import javax.swing.KeyStroke;
12 6

  
13 7
import com.iver.andami.PluginServices;
14 8
import com.iver.andami.messages.NotificationManager;
15 9
import com.iver.andami.plugins.Extension;
16 10
import com.iver.cit.gvsig.fmap.FMap;
17 11
import com.iver.cit.gvsig.fmap.MapControl;
12
import com.iver.cit.gvsig.fmap.core.FShape;
13
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
18 14
import com.iver.cit.gvsig.fmap.edition.EditionException;
19 15
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
16
import com.iver.cit.gvsig.fmap.edition.rules.IRule;
17
import com.iver.cit.gvsig.fmap.edition.rules.RulePolygon;
20 18
import com.iver.cit.gvsig.fmap.layers.FLayer;
21 19
import com.iver.cit.gvsig.fmap.layers.FLayers;
22 20
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
......
72 70
			FMap mapa = model.getMapContext();
73 71
			FLayers layers = mapa.getLayers();
74 72
			
75
//			registerKeyStrokes()
76 73
			for (int i = 0; i < layers.getLayersCount(); i++) {
77 74
				if (layers.getLayer(i) instanceof FLyrVect
78 75
						&& layers.getLayer(i).isActive()) {
......
86 83
					lv.addLayerListener(CADExtension.getEditionManager());
87 84
					try {
88 85
						lv.setEditing(true);
86
						VectorialEditableAdapter vea = (VectorialEditableAdapter) lv
87
								.getSource();
88
						vea.getRules().clear();
89
						if (vea.getShapeType() == FShape.POLYGON)
90
						{
91
							IRule rulePol = new RulePolygon();
92
							vea.getRules().add(rulePol);
93
						}
94
						vea.getCommandRecord().addCommandListener(mapControl);
95
						// Si existe una tabla asociada a esta capa se cambia su
96
						// modelo por el VectorialEditableAdapter.
97
						ProjectExtension pe = (ProjectExtension) PluginServices
98
								.getExtension(ProjectExtension.class);
99
						ProjectTable pt = pe.getProject().getTable(lv);
100
						if (pt != null){
101
							pt.setModel(vea);
102
							changeModelTable(pt);
103
						}
104
						startCommandsApplicable(vista,lv);
89 105
					} catch (EditionException e) {
90 106
						e.printStackTrace();
91 107
						NotificationManager.addError(e);
108
					} catch (DriverIOException e) {
109
						e.printStackTrace();
110
						NotificationManager.addError(e);
92 111
					}
93
					VectorialEditableAdapter vea = (VectorialEditableAdapter) lv
94
							.getSource();
95
					vea.getCommandRecord().addCommandListener(mapControl);
96
					// Si existe una tabla asociada a esta capa se cambia su
97
					// modelo por el VectorialEditableAdapter.
98
					ProjectExtension pe = (ProjectExtension) PluginServices
99
							.getExtension(ProjectExtension.class);
100
					ProjectTable pt = pe.getProject().getTable(lv);
101
					if (pt != null){
102
						pt.setModel(vea);
103
						changeModelTable(pt);
104
					}
105
					startCommandsApplicable(vista,lv);
112
						
106 113
//					return;
107 114
				}
108 115
			}
trunk/extensions/extCAD/src/com/iver/cit/gvsig/gui/cad/MyFinishAction.java
15 15
import com.iver.andami.messages.NotificationManager;
16 16
import com.iver.cit.gvsig.CADExtension;
17 17
import com.iver.cit.gvsig.fmap.MapControl;
18
import com.iver.cit.gvsig.fmap.core.FShape;
18 19
import com.iver.cit.gvsig.fmap.core.ICanReproject;
19 20
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
20 21
import com.iver.cit.gvsig.fmap.drivers.DXFLayerDefinition;
22
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
21 23
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
22 24
import com.iver.cit.gvsig.fmap.drivers.ITableDefinition;
23 25
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
......
26 28
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter;
27 29
import com.iver.cit.gvsig.fmap.edition.EditionException;
28 30
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
31
import com.iver.cit.gvsig.fmap.edition.rules.IRule;
32
import com.iver.cit.gvsig.fmap.edition.rules.RulePolygon;
29 33
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfFieldsMapping;
30 34
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfWriter;
31 35
import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter;
......
228 232
		lyr.setActive(true);
229 233
		try {
230 234
			lyr.setEditing(true);
235
	        VectorialEditableAdapter vea = (VectorialEditableAdapter) lyr.getSource();
236
			vea.getRules().clear();
237
			if (vea.getShapeType() == FShape.POLYGON)
238
			{
239
				IRule rulePol = new RulePolygon();
240
				vea.getRules().add(rulePol);
241
			}
242
	
243
	        vea.getCommandRecord().addCommandListener(mapCtrl);
244
	        view.showConsole();
245
			
246
			// Para cerrar el cuadro de di?logo.
247
			oldAction.performAction();
231 248
		} catch (EditionException e) {
232 249
			e.printStackTrace();
233 250
			NotificationManager.addError(e);
251
		} catch (DriverIOException e) {
252
			e.printStackTrace();
253
			NotificationManager.addError(e);
254

  
234 255
		}
235
        VectorialEditableAdapter vea = (VectorialEditableAdapter) lyr.getSource();
236
        vea.getCommandRecord().addCommandListener(mapCtrl);
237
        view.showConsole();
256

  
238 257
		
239
		// Para cerrar el cuadro de di?logo.
240
		oldAction.performAction();
241
		
242 258
	}
243 259
	  
244 260
}
trunk/extensions/extCAD/src/com/iver/cit/gvsig/gui/cad/DefaultCADTool.java
49 49
import java.io.IOException;
50 50
import java.util.ArrayList;
51 51

  
52
import org.apache.log4j.Logger;
53

  
52 54
import com.hardcode.driverManager.DriverLoadException;
53 55
import com.hardcode.gdbms.engine.data.driver.DriverException;
54 56
import com.hardcode.gdbms.engine.values.Value;
......
57 59
import com.iver.cit.gvsig.CADExtension;
58 60
import com.iver.cit.gvsig.fmap.ViewPort;
59 61
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
62
import com.iver.cit.gvsig.fmap.core.FPolygon2D;
60 63
import com.iver.cit.gvsig.fmap.core.FShape;
61 64
import com.iver.cit.gvsig.fmap.core.GeneralPathX;
62 65
import com.iver.cit.gvsig.fmap.core.Handler;
63 66
import com.iver.cit.gvsig.fmap.core.IFeature;
64 67
import com.iver.cit.gvsig.fmap.core.IGeometry;
65 68
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
69
import com.iver.cit.gvsig.fmap.core.v02.FConverter;
66 70
import com.iver.cit.gvsig.fmap.core.v02.FGraphicUtilities;
67 71
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
68 72
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
......
73 77
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
74 78
import com.iver.cit.gvsig.gui.View;
75 79
import com.iver.cit.gvsig.gui.cad.exception.CommandException;
80
import com.iver.cit.gvsig.gui.cad.tools.PolylineCADTool;
76 81
import com.iver.cit.gvsig.layers.VectorialLayerEdited;
77 82
import com.iver.utiles.console.JConsole;
83
import com.vividsolutions.jts.geom.Geometry;
78 84

  
79 85
/**
80 86
 * DOCUMENT ME!
......
82 88
 * @author Vicente Caballero Navarro
83 89
 */
84 90
public abstract class DefaultCADTool implements CADTool {
91
	private static Logger logger = Logger.getLogger(DefaultCADTool.class.getName());
85 92
	private CADToolAdapter cadToolAdapter;
86 93

  
87 94
	private String question;
......
152 159
	public void addGeometry(IGeometry geometry) {
153 160
		VectorialEditableAdapter vea = getVLE().getVEA();
154 161
		try {
162
			// Deber?amos comprobar que lo que escribimos es correcto:
163
			// Lo hacemos en el VectorialAdapter, justo antes de
164
			// a?adir, borrar o modificar una feature
165

  
155 166
			int numAttr = vea.getRecordset().getFieldCount();
156 167
			Value[] values = new Value[numAttr];
157 168
			for (int i = 0; i < numAttr; i++) {

Also available in: Unified diff