public void Clear() { FeatureEditors.Clear(); if (trackingLayer.DataSource.GetFeatureCount() <= 0) { return; } trackers.Clear(); trackingLayer.RenderRequired = true; UpdateMapControlSelection(); }
private void Clear(bool fireSelectionChangedEvent) { FeatureEditors.Clear(); if (trackingLayer.DataSource.GetFeatureCount() <= 0) { return; } trackers.Clear(); trackingLayer.RenderRequired = true; UpdateMapControlSelection(fireSelectionChangedEvent); }
//public void UpdateSelection(IGeometry geometry) // HACK: select tool must select features, not edit them //{ // FeatureEditors[0].SourceFeature.Geometry = geometry; //} private void RemoveSelection(IFeature feature) { for (int i = 0; i < FeatureEditors.Count; i++) { if (FeatureEditors[i].SourceFeature == feature) { FeatureEditors.RemoveAt(i); break; } } UpdateMapControlSelection(); }
/// TODO: note if no features are selected the selection rectangle maintains visible after mouse up /// ISSUE 2373 private void HandleMultiSelectMouseUp(ICoordinate worldPosition) { StopMultiSelect(); List <IFeature> selectedFeatures = null; if (!KeyExtendSelection) { selectedFeatures = new List <IFeature>(FeatureEditors.Select(fe => fe.SourceFeature).ToArray()); Clear(false); } IPolygon selectionPolygon = CreateSelectionPolygon(worldPosition); if (null != selectionPolygon) { foreach (ILayer layer in Map.GetAllLayers(false)) { //make sure parent layer is selectable or null var parentLayer = Map.GetGroupLayerContainingLayer(layer); if ((parentLayer == null || parentLayer.IsSelectable) && (layer.IsSelectable) && (layer is VectorLayer)) { // do not use the maptool provider but the datasource of each layer. var vectorLayer = (VectorLayer)layer; IList multiFeatures = vectorLayer.DataSource.GetFeatures(selectionPolygon); for (int i = 0; i < multiFeatures.Count; i++) { var feature = (IFeature)multiFeatures[i]; if ((null != selectedFeatures) && (selectedFeatures.Contains(feature))) { continue; } AddSelection(vectorLayer, feature, -1, false); } } } } else { // if mouse hasn't moved handle as single select. A normal multi select uses the envelope // of the geometry and this has as result that unwanted features will be selected. ILayer selectedLayer; float limit = (float)MapHelper.ImageToWorld(Map, 4); IFeature nearest = FindNearestFeature(worldPosition, limit, out selectedLayer, ol => ol.Visible); if (null != nearest) //&& (selectedLayer.IsVisible)) { AddSelection(selectedLayer, nearest, -1, false); } } selectPoints.Clear(); // synchronize with map selection, possible check if selection is already set; do not remove UpdateMapControlSelection(true); }
private bool StartSelection(ILayer layer, IFeature feature, int trackerIndex) { IFeatureEditor featureEditor = GetFeatureEditor(layer, feature); if (null == featureEditor) { return(false); } if (featureEditor.AllowSingleClickAndMove()) { // do not yet select, but allow MltiSelect FeatureEditors.Add(featureEditor); SynchronizeTrackers(); UpdateMapControlSelection(); return(true); } return(false); }
public void AddSelection(ILayer layer, IFeature feature, int trackerIndex, bool synchronizeUI) { if (!layer.Enabled) { return; } IFeatureEditor featureEditor = GetFeatureEditor(layer, feature); if (null == featureEditor) { return; } FeatureEditors.Add(featureEditor); SynchronizeTrackers(); if (synchronizeUI) { UpdateMapControlSelection(); } }
public override void OnMouseUp(ICoordinate worldPosition, MouseEventArgs e) { if (IsMultiSelect) { StopMultiSelect(); List <IFeature> selectedFeatures = null; if (!KeyExtendSelection) { selectedFeatures = new List <IFeature>(FeatureEditors.Select(fe => fe.SourceFeature).ToArray()); Clear(); } IPolygon selectionPolygon = CreateSelectionPolygon(worldPosition); if (null != selectionPolygon) { foreach (ILayer layer in MapHelper.GetAllMapLayers(Map.Layers, false)) { if ((!layer.ReadOnly) && (layer is VectorLayer)) { // do not use the maptool provider but the datasource of each layer. VectorLayer vectorLayer = (VectorLayer)layer; if (vectorLayer.IsVisible) { IList multiFeatures = vectorLayer.DataSource.GetFeatures(selectionPolygon); for (int i = 0; i < multiFeatures.Count; i++) { IFeature feature = (IFeature)multiFeatures[i]; if ((null != selectedFeatures) && (selectedFeatures.Contains(feature))) { continue; } AddSelection(vectorLayer, feature, -1, false); } } } } } else { // if mouse hasn't moved handle as single select. A normal multi select uses the envelope // of the geometry and this has as result that unwanted features will be selected. ILayer selectedLayer; float limit = (float)MapControlHelper.ImageToWorld(Map, 4); IFeature nearest = FindNearestFeature(worldPosition, limit, out selectedLayer, ol => ol.IsVisible); if (null != nearest) //&& (selectedLayer.IsVisible)) { AddSelection(selectedLayer, nearest, -1, false); } } // synchronize with map selection, possible check if selection is already set; do not remove UpdateMapControlSelection(); //MapControl.Refresh(); //IsMultiSelect = false; } else { if ((null != orgMouseDownLocation) && (orgMouseDownLocation.X == worldPosition.X) && (orgMouseDownLocation.Y == worldPosition.Y) && (e.Button == MouseButtons.Left)) { // check if mouse was pressed at a selected object without moving the mouse. The default behaviour // should be to select 'the next' object TimeSpan timeSpan = DateTime.Now - orgClickTime; int dc = SystemInformation.DoubleClickTime; if (dc < timeSpan.TotalMilliseconds) { if (1 == FeatureEditors.Count) { // check if selection exists; could be toggled Layer outLayer; IFeature nextFeature = GetNextFeatureAtPosition(worldPosition, // set limit from 4 to 10: TOOLS-1499 (float)MapControlHelper.ImageToWorld(Map, 10), out outLayer, FeatureEditors[0].SourceFeature, ol => ol.IsVisible); if (null != nextFeature) { Clear(); SetSelection(nextFeature, outLayer, 0); //-1 for ILineString //MapControl.Refresh(); } } } } UpdateMapControlSelection(); } IsBusy = false; orgClickTime = DateTime.Now; //for (int i=0; i<FeatureEditors.Count; i++) //{ // IFeatureEditor featureEditor = FeatureEditors[i]; // if (featureEditor.Layer.CustomRenderers.Count > 0) // { // // todo move to IFeatureEditor // featureEditor.Layer.CustomRenderers[0]. // UpdateRenderedFeatureGeometry(FeatureEditors[i].SourceFeature, FeatureEditors[i].Layer); // IGeometry g = featureEditor.Layer.CustomRenderers[0]. // GetRenderedFeatureGeometry(FeatureEditors[i].SourceFeature, FeatureEditors[i].Layer); // FeatureEditors[i].UpdateTracker(g); // } // //featureEditor.Stop(); //} }