Revision 5893
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