Revision: 6603 http://sourceforge.net/p/jump-pilot/code/6603 Author: ma15569 Date: 2020-10-26 15:46:00 +0000 (Mon, 26 Oct 2020) Log Message: ----------- Add Add area and Remove area tools from Kosmo
Added Paths: ----------- plug-ins/CADExtension/trunk/src/org/openjump/advancedtools/tools/AddAreaTool.java plug-ins/CADExtension/trunk/src/org/openjump/advancedtools/tools/RemoveAreaTool.java Added: plug-ins/CADExtension/trunk/src/org/openjump/advancedtools/tools/AddAreaTool.java =================================================================== --- plug-ins/CADExtension/trunk/src/org/openjump/advancedtools/tools/AddAreaTool.java (rev 0) +++ plug-ins/CADExtension/trunk/src/org/openjump/advancedtools/tools/AddAreaTool.java 2020-10-26 15:46:00 UTC (rev 6603) @@ -0,0 +1,333 @@ +package org.openjump.advancedtools.tools; + +import java.awt.Cursor; +import java.awt.Point; +import java.awt.geom.NoninvertibleTransformException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import javax.swing.Icon; + +import org.openjump.advancedtools.icon.IconLoader; +import org.openjump.advancedtools.utils.EditUtils; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryCollection; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.LineSegment; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.Polygon; +import com.vividsolutions.jts.geom.TopologyException; +import com.vividsolutions.jts.operation.valid.IsValidOp; +import com.vividsolutions.jump.I18N; +import com.vividsolutions.jump.feature.Feature; +import com.vividsolutions.jump.workbench.WorkbenchContext; +import com.vividsolutions.jump.workbench.model.Layer; +import com.vividsolutions.jump.workbench.model.UndoableCommand; +import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory; +import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck; +import com.vividsolutions.jump.workbench.ui.EditTransaction; +import com.vividsolutions.jump.workbench.ui.GeometryEditor; +import com.vividsolutions.jump.workbench.ui.SelectionManager; +import com.vividsolutions.jump.workbench.ui.cursortool.CursorTool; +import com.vividsolutions.jump.workbench.ui.cursortool.PolygonTool; +import com.vividsolutions.jump.workbench.ui.plugin.PersistentBlackboardPlugIn; + + + +public class AddAreaTool +extends PolygonTool +{ + + /** Plugin name */ + public final static String NAME = "Add Area"; + + public final static String DESCRIPTION = "Select only one feature of polygonal type"; + + + + public static final Icon ICON = IconLoader.icon("AddAreaToPolygon.gif"); + public static final Cursor CURSOR = createCursor(IconLoader.icon("addAreaCursor.png").getImage(), new Point(0, 0)); + + + public AddAreaTool() { + setCloseRing(true); + allowSnapping(); + } + + @Override + public String getName() { + + String tooltip = ""; + tooltip = "<HTML><BODY>"; + tooltip += "<DIV style=\"width: 200px; text-justification: justify;\">"; + tooltip += "<b>" + NAME + "</b>" + "<br>"; + tooltip += DESCRIPTION + "<br>"; + tooltip += "</DIV></BODY></HTML>"; + return tooltip; + } + + @Override + public Icon getIcon() { + return ICON; + } + + @Override + public Cursor getCursor() { + return CURSOR; + } + + + public static MultiEnableCheck createEnableCheck(WorkbenchContext workbenchContext, CursorTool tool) { + MultiEnableCheck solucion = new MultiEnableCheck(); + EnableCheckFactory checkFactory = new EnableCheckFactory(workbenchContext); + solucion.add(checkFactory.createTaskWindowMustBeActiveCheck()); + solucion.add(checkFactory.createOnlyOneLayerMayHaveSelectedFeaturesCheck()); + int MAX_FEATURES_SELECTED = 1; + solucion.add(checkFactory.createExactlyNFeaturesMustBeSelectedCheck(MAX_FEATURES_SELECTED)); + solucion.add(checkFactory.createWindowWithLayerManagerMustBeActiveCheck()); + + /* solucion.add(checkFactory + .createEditableLayerTypeGeometryCheck(new int[] { 5, 4, 15 })); + + + solucion.add(checkFactory + + .createAtLeastNFeaturesMustBeSelectedCheck(new int[] { 5, 4 }, new int[] { 10, 11, 9 }, 1));*/ + solucion.add(checkFactory.createSelectedItemsLayersMustBeEditableCheck()); + + return solucion; + } + GeometryFactory geomFac = new GeometryFactory(); + + /* protected Polygon getPolygon() throws NoninvertibleTransformException { + LinearRing ring = geomFac.createLinearRing(toArray(this.coordinatesCorrected)); + return geomFac.createPolygon(ring, null); + }*/ + + + @SuppressWarnings("unchecked") + @Override + protected Polygon getPolygon() throws NoninvertibleTransformException { + ArrayList<Coordinate> closedPoints = new ArrayList<Coordinate>(getCoordinates()); + + if (!closedPoints.get(0).equals(closedPoints.get(closedPoints.size() - 1))) { + closedPoints.add(new Coordinate(closedPoints.get(0))); + } + + return new GeometryFactory().createPolygon( + new GeometryFactory().createLinearRing(toArray(closedPoints)), + null); + } + + + @Override + protected void gestureFinished() throws Exception { + reportNothingToUndoYet(); + + if (!checkPolygon()) { + getPanel().getContext().warnUser( + I18N.get("ui.EditTransaction.the-geometry-is-invalid-cancelled")); + + return; + } + // boolean selectAdjacents = EditOptionsPanel.isAdjacentEditionActivated(); + + Polygon polygon = getPolygon(); + + if (isRollingBackInvalidEdits() && !polygon.isValid()) { + getPanel() + .getContext() + .warnUser( + "Polygon with invalid geometry"); + // I18N.getString("org.saig.jump.tools.editing.AddAreaTool.polygon-with-invalid-geometry")); + + return; + } + final Layer editableLayer = getPanel().getLayerManager().getEditableLayers() + .iterator().next(); + + if (editableLayer == null) { + return; + } + final SelectionManager selectionManager = getPanel().getSelectionManager(); + final Collection<Feature> selectedFeatures = selectionManager + .getFeaturesWithSelectedItems(editableLayer); + + if (selectedFeatures == null || selectedFeatures.isEmpty()) { + getPanel() + .getContext() + .warnUser( + + I18N.get("com.vividsolutions.jump.workbench.plugin.At-least-one-layer-must-be-selected")); + + return; + } + if (selectedFeatures.size()>1) { + getPanel() + .getContext() + .warnUser( + + I18N.get("com.vividsolutions.jump.workbench.plugin.Exactly-one-item-must-be-selected")); + + return; + } + + Feature selectedFeature = selectedFeatures.iterator().next(); + GeometryEditor editor = new GeometryEditor(); + Geometry digitizedGeometry = editor.removeRepeatedPoints(polygon); + + Geometry geomSel = selectedFeature.getGeometry(); + if ((geomSel instanceof LineString) || (geomSel instanceof com.vividsolutions.jts.geom.Point) ) + { + getPanel() + .getContext() + .warnUser( + "Selected feature must be a Polygon"); + // I18N.get("com.vividsolutions.jump.workbench.plugin.Exactly-one-item-must-be-selected")); + + return; + } + if (!digitizedGeometry.intersects(geomSel)) { + getPanel() + .getContext() + .warnUser( + "It does not intersect the selected geometry"); + //I18N.getString("org.saig.jump.tools.editing.AddAreaTool.it-does-not-intersect-with-the-selection")); + return; + } + if (geomSel.contains(digitizedGeometry)) { + getPanel() + .getContext() + .warnUser( + "Digitalized geometry is contained"); + //I18N.getString("org.saig.jump.tools.editing.AddAreaTool.the-digitized-geometry-is-contained")); + + return; + } + + final List<Feature> featsToUpdate = new ArrayList<Feature>(); + final List<Feature> featsSelectedToUpdate = new ArrayList<Feature>(); + + Geometry modGeometry = null; + + + try { + Geometry[] geometrias = EditUtils.getFragmentos(geomSel, digitizedGeometry); + GeometryCollection gc = geomFac.createGeometryCollection(geometrias); + modGeometry = gc.buffer(0.0D); + + + // if (selectAdjacents) { + Collection colindantesCandidatos = EditUtils.getColindantes(geomSel, editableLayer); + List<Feature> colindantes = new ArrayList(); + Iterator<Feature> itCol = colindantesCandidatos.iterator(); + while (itCol.hasNext()) { + Feature featCol = itCol.next(); + Geometry geomCol = featCol.getGeometry(); + if (digitizedGeometry.intersects(geomCol)) { + colindantes.add(featCol); + } + } + + Iterator<Feature> itColindantes = colindantes.iterator(); + while (itColindantes.hasNext()) { + Feature featCol = itColindantes.next(); + Geometry geomCol = featCol.getGeometry(); + Geometry geomColMod = geomCol.difference(digitizedGeometry); + Geometry geomIntercc = geomCol.intersection( + ((Polygon)digitizedGeometry).getExteriorRing()); + Coordinate[] coordenadas = geomIntercc.getCoordinates(); + for (int i = 0; i < coordenadas.length; i++) { + if (!EditUtils.contieneCoordenada(modGeometry, coordenadas[i])) { + LineSegment s = EditUtils.segmentInRange(modGeometry, coordenadas[i]); + modGeometry = (new GeometryEditor()).insertVertex(modGeometry, s.p0, + s.p1, coordenadas[i]); + } + } + + Feature featColClone = featCol.clone(true); + featColClone.setGeometry(geomColMod); + featsToUpdate.add(featColClone); + featsSelectedToUpdate.add(featCol); + //} + } + } catch (TopologyException ex) { + getPanel() + .getContext() + .warnUser( + I18N.get("ui.cursortool.editing.FeatureDrawingUtil.draw-feature-tool-topology-error")); + //I18N.getString("org.saig.jump.tools.editing.AddAreaTool.topology-error-repeat-the-operation")); + + return; + } + Feature clonedFeature = selectedFeature.clone(true); + clonedFeature.setGeometry(modGeometry); + featsToUpdate.add(clonedFeature); + featsSelectedToUpdate.add(selectedFeature); + + execute(new UndoableCommand(String.valueOf(getName()) + " - " + + I18N.getMessage("org.saig.jump.tools.editing.AddAreaTool.{0}-features-modified", + new Object[] { Integer.valueOf(featsToUpdate.size()) })) { + @Override + public void execute() { + selectionManager.unselectItems(editableLayer); + if (!featsToUpdate.isEmpty()) { + editableLayer.getFeatureCollectionWrapper().removeAll(featsSelectedToUpdate); + editableLayer.getFeatureCollectionWrapper().addAll(featsToUpdate); + //editableLayer.getFeatureCollectionWrapper().updateAll(featsToUpdate); + editableLayer.getLayerManager().fireGeometryModified(featsToUpdate, + editableLayer, featsSelectedToUpdate); + selectionManager.getFeatureSelection() + .selectItems(editableLayer, featsToUpdate); + } + } + + + @Override + public void unexecute() { + selectionManager.unselectItems(editableLayer); + if (!featsToUpdate.isEmpty()) { + editableLayer.getFeatureCollectionWrapper().removeAll(featsToUpdate); + editableLayer.getFeatureCollectionWrapper().addAll(featsSelectedToUpdate); + // editableLayer.getFeatureCollectionWrapper().updateAll(featsSelectedToUpdate); + editableLayer.getLayerManager().fireGeometryModified(featsSelectedToUpdate, + editableLayer, featsToUpdate); + } + selectionManager.getFeatureSelection().selectItems(editableLayer, + selectedFeatures); + } + }); + } + + @Override + protected boolean checkPolygon() throws NoninvertibleTransformException { + if (getCoordinates().size() < 3) { + getPanel() + .getContext() + .warnUser( + I18N.get("ui.cursortool.PolygonTool.the-polygon-must-have-at-least-3-points")); + + return false; + } + + IsValidOp isValidOp = new IsValidOp(getPolygon()); + + if (!isValidOp.isValid()) { + getPanel().getContext().warnUser( + isValidOp.getValidationError().getMessage()); + + if (PersistentBlackboardPlugIn.get(getWorkbench().getContext()) + .get(EditTransaction.ROLLING_BACK_INVALID_EDITS_KEY, false)) { + return false; + } + } + + return true; + } +} + + Property changes on: plug-ins/CADExtension/trunk/src/org/openjump/advancedtools/tools/AddAreaTool.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Added: plug-ins/CADExtension/trunk/src/org/openjump/advancedtools/tools/RemoveAreaTool.java =================================================================== --- plug-ins/CADExtension/trunk/src/org/openjump/advancedtools/tools/RemoveAreaTool.java (rev 0) +++ plug-ins/CADExtension/trunk/src/org/openjump/advancedtools/tools/RemoveAreaTool.java 2020-10-26 15:46:00 UTC (rev 6603) @@ -0,0 +1,339 @@ +package org.openjump.advancedtools.tools; + +import java.awt.Cursor; +import java.awt.Point; +import java.awt.geom.NoninvertibleTransformException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import javax.swing.Icon; + +import org.openjump.advancedtools.icon.IconLoader; +import org.openjump.advancedtools.utils.EditUtils; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryCollection; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.Polygon; +import com.vividsolutions.jts.geom.TopologyException; +import com.vividsolutions.jts.operation.valid.IsValidOp; +import com.vividsolutions.jts.precision.EnhancedPrecisionOp; +import com.vividsolutions.jump.I18N; +import com.vividsolutions.jump.feature.Feature; +import com.vividsolutions.jump.workbench.WorkbenchContext; +import com.vividsolutions.jump.workbench.model.Layer; +import com.vividsolutions.jump.workbench.model.UndoableCommand; +import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory; +import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck; +import com.vividsolutions.jump.workbench.ui.EditTransaction; +import com.vividsolutions.jump.workbench.ui.GeometryEditor; +import com.vividsolutions.jump.workbench.ui.SelectionManager; +import com.vividsolutions.jump.workbench.ui.cursortool.CursorTool; +import com.vividsolutions.jump.workbench.ui.cursortool.PolygonTool; +import com.vividsolutions.jump.workbench.ui.plugin.PersistentBlackboardPlugIn; + + + + +public class RemoveAreaTool +extends PolygonTool +{ + /** Plugin name */ + public final static String NAME = "Remove Area"; + + public final static String DESCRIPTION = "Select only one feature of polygonal type"; + + + + public static final Icon ICON = IconLoader.icon("RemoveAreaToPolygon.gif"); + + + + public static final Cursor CURSOR = createCursor(IconLoader.icon("removeAreaCursor.png").getImage(), + new Point(0, 0)); + + + + protected ArrayList coordinatesCorrected; + + + + public RemoveAreaTool() { + allowSnapping(); + setCloseRing(true); + } + + @Override + public String getName() { + + String tooltip = ""; + tooltip = "<HTML><BODY>"; + tooltip += "<DIV style=\"width: 200px; text-justification: justify;\">"; + tooltip += "<b>" + NAME + "</b>" + "<br>"; + tooltip += DESCRIPTION + "<br>"; + tooltip += "</DIV></BODY></HTML>"; + return tooltip; + } + + @Override + public Icon getIcon() { + return ICON; + } + @Override + public Cursor getCursor() { + return CURSOR; + } + + public static MultiEnableCheck createEnableCheck(WorkbenchContext workbenchContext, CursorTool tool) { + MultiEnableCheck solucion = new MultiEnableCheck(); + EnableCheckFactory checkFactory = new EnableCheckFactory(workbenchContext); + solucion.add(checkFactory.createTaskWindowMustBeActiveCheck()); + solucion.add(checkFactory.createOnlyOneLayerMayHaveSelectedFeaturesCheck()); + int MAX_FEATURES_SELECTED = 1; + solucion.add(checkFactory.createExactlyNFeaturesMustBeSelectedCheck(MAX_FEATURES_SELECTED)); + solucion.add(checkFactory.createWindowWithLayerManagerMustBeActiveCheck()); + + /* solucion.add(checkFactory + .createEditableLayerTypeGeometryCheck(new int[] { 5, 4, 15 })); + + + solucion.add(checkFactory + + .createAtLeastNFeaturesMustBeSelectedCheck(new int[] { 5, 4 }, new int[] { 10, 11, 9 }, 1)); + */ + solucion.add(checkFactory.createSelectedItemsLayersMustBeEditableCheck()); + return solucion; + } + + + + + @Override + protected Polygon getPolygon() throws NoninvertibleTransformException { + ArrayList closedPoints = new ArrayList(getCoordinates()); + + if (!closedPoints.get(0).equals(closedPoints.get(closedPoints.size() - 1))) { + closedPoints.add(new Coordinate((Coordinate) closedPoints.get(0))); + } + + return new GeometryFactory().createPolygon( + new GeometryFactory().createLinearRing(toArray(closedPoints)), + null); + } + + + + + @Override + protected void gestureFinished() throws Exception { + reportNothingToUndoYet(); + if (!checkPolygon()) { + getPanel().getContext().warnUser( + I18N.get("ui.EditTransaction.the-geometry-is-invalid-cancelled")); + + return; + } + // boolean selectAdjacents = EditOptionsPanel.isAdjacentEditionActivated(); + + Polygon polygon = getPolygon(); + + if (isRollingBackInvalidEdits() && !polygon.isValid()) { + getPanel() + .getContext() + .warnUser( + + "Polygon with invalid geometry"); + // I18N.getString("org.saig.jump.tools.editing.AddAreaTool.polygon-with-invalid-geometry")); + + return; + } + WorkbenchContext context = getWorkbench().getContext(); + Collection col = context.getLayerViewPanel().getSelectionManager() + .getLayersWithSelectedItems(); + + final Layer editableLayer = getPanel().getLayerManager().getEditableLayers() + .iterator().next(); + + if (editableLayer == null) { + return; + } + final SelectionManager selectionManager = getPanel().getSelectionManager(); + final Collection<Feature> selectedFeatures = selectionManager + .getFeaturesWithSelectedItems(editableLayer); + + if (selectedFeatures == null || selectedFeatures.isEmpty()) { + getPanel() + .getContext() + .warnUser( + + I18N.get("com.vividsolutions.jump.workbench.plugin.At-least-one-layer-must-be-selected")); + + return; + } + if (selectedFeatures.size()>1) { + getPanel() + .getContext() + .warnUser( + + I18N.get("com.vividsolutions.jump.workbench.plugin.Exactly-one-item-must-be-selected")); + + return; + } + Feature selectedFeature = selectedFeatures.iterator().next(); + GeometryEditor editor = new GeometryEditor(); + Geometry digitizedGeometry = editor.removeRepeatedPoints(polygon); + + Geometry geomSel = selectedFeature.getGeometry(); + if ((geomSel instanceof LineString) || (geomSel instanceof com.vividsolutions.jts.geom.Point) ) + { + getPanel() + .getContext() + .warnUser( + "Selected feature must be a Polygon"); + // I18N.get("com.vividsolutions.jump.workbench.plugin.Exactly-one-item-must-be-selected")); + + return; + } + if (!digitizedGeometry.intersects(geomSel)) { + getPanel() + .getContext() + .warnUser( + "It does not intersect the selected geometry"); + //I18N.getString("org.saig.jump.tools.editing.AddAreaTool.it-does-not-intersect-with-the-selection")); + return; + } + if (geomSel.contains(digitizedGeometry)) { + getPanel() + .getContext() + .warnUser( + "Digitalized geometry is contained"); + //I18N.getString("org.saig.jump.tools.editing.AddAreaTool.the-digitized-geometry-is-contained")); + + return; + } + + final List<Feature> featsToUpdate = new ArrayList<Feature>(); + final List<Feature> featsSelectedToUpdate = new ArrayList<Feature>(); + + Geometry modGeometry = null; + + try { + modGeometry = EnhancedPrecisionOp.difference(geomSel, digitizedGeometry); + + // if (selectAdjacents) { + Collection colindantes = EditUtils.getColindantes(geomSel, editableLayer); + Iterator<Feature> itColindantes = colindantes.iterator(); + int contador = 0; + while (itColindantes.hasNext()) { + Feature featCol = itColindantes.next(); + Geometry geomCol = featCol.getGeometry(); + if (digitizedGeometry.intersects(geomCol)) { + if (contador == 1) { + getPanel() + .getContext() + .warnUser( + "The digitized polygon intersects with more than one neighbour"); + // I18N.getString("org.saig.jump.tools.editing.RemoveAreaTool.the-digitized-polygon-intersects-with-more-than-one-neighbour")); + + return; + } + GeometryFactory geomFac = null; + Geometry[] geometrias = + EditUtils.getFragmentos(geomCol, EnhancedPrecisionOp.intersection(geomSel, digitizedGeometry)); + GeometryCollection gc = geomFac.createGeometryCollection(geometrias); + Geometry geomColMod = gc.buffer(0.0D); + + Feature featColClone = featCol.clone(true); + featColClone.setGeometry(geomColMod); + featsToUpdate.add(featColClone); + featsSelectedToUpdate.add(featCol); + contador++; + } + } + // } + } catch (TopologyException ex) { + getPanel() + .getContext() + .warnUser( + I18N.get("ui.cursortool.editing.FeatureDrawingUtil.draw-feature-tool-topology-error")); + // I18N.getString("org.saig.jump.tools.editing.RemoveAreaTool.topology-error-repeat-the-operation")); + + return; + } + Feature clonedFeature = selectedFeature.clone(true); + clonedFeature.setGeometry(modGeometry); + featsToUpdate.add(clonedFeature); + featsSelectedToUpdate.add(selectedFeature); + + execute(new UndoableCommand(String.valueOf(getName()) + " - " + + I18N.getMessage("org.saig.jump.tools.editing.RemoveAreaTool.{0}-features-modified", + new Object[] { Integer.valueOf(featsToUpdate.size()) })) { + @Override + public void execute() { + selectionManager.unselectItems(editableLayer); + if (!featsToUpdate.isEmpty()) { + editableLayer.getFeatureCollectionWrapper().removeAll(featsSelectedToUpdate); + editableLayer.getFeatureCollectionWrapper().addAll(featsToUpdate); + + + // editableLayer.getFeatureCollectionWrapper().updateAll(featsToUpdate); + editableLayer.getLayerManager().fireGeometryModified(featsToUpdate, + editableLayer, featsSelectedToUpdate); + selectionManager.getFeatureSelection() + .selectItems(editableLayer, featsToUpdate); + } + } + + + @Override + public void unexecute() { + selectionManager.unselectItems(editableLayer); + if (!featsToUpdate.isEmpty()) { + editableLayer.getFeatureCollectionWrapper().removeAll(featsToUpdate); + editableLayer.getFeatureCollectionWrapper().addAll(featsSelectedToUpdate); + // editableLayer.getFeatureCollectionWrapper().updateAll(featsSelectedToUpdate); + editableLayer.getLayerManager().fireGeometryModified(featsSelectedToUpdate, + editableLayer, featsToUpdate); + } + selectionManager.getFeatureSelection().selectItems(editableLayer, + selectedFeatures); + } + }); + } + + + + + + @Override + protected boolean checkPolygon() throws NoninvertibleTransformException { + if (getCoordinates().size() < 3) { + getPanel() + .getContext() + .warnUser( + I18N.get("ui.cursortool.PolygonTool.the-polygon-must-have-at-least-3-points")); + + return false; + } + + IsValidOp isValidOp = new IsValidOp(getPolygon()); + + if (!isValidOp.isValid()) { + getPanel().getContext().warnUser( + isValidOp.getValidationError().getMessage()); + + if (PersistentBlackboardPlugIn.get(getWorkbench().getContext()) + .get(EditTransaction.ROLLING_BACK_INVALID_EDITS_KEY, false)) { + return false; + } + } + + return true; + } +} + + Property changes on: plug-ins/CADExtension/trunk/src/org/openjump/advancedtools/tools/RemoveAreaTool.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel