private async Task QueryRows(object query)
        {
            string where = "";
            if (query != null)
            {
                where = query.ToString();
            }
            IsLoading = true;
            lock (_theLock) {
                ListOfRows.Clear();
            }
            if (_layerSource == null)
            {
                _layerSource = await _selectedLayer.getFeatureClass();
            }
            if (_layerSource != null)
            {
                var data = new List <DynamicDataRow>();
                await QueuingTaskFactory.StartNew(() => {
                    var queryFilter = new ArcGIS.Core.Data.QueryFilter {
                        WhereClause = where
                    };
                    int maxcols      = 6;
                    RowCursor cursor = _layerSource.Search(queryFilter);
                    if (cursor.MoveNext())
                    {
                        ExtendListView.Columns = new List <ArcGIS.Core.Data.Field>();
                        maxcols = cursor.Current.Fields.Count() > 6 ? 6 : cursor.Current.Fields.Count();

                        for (int c = 0; c < maxcols; c++)
                        {
                            ExtendListView.Columns.Add(cursor.Current.Fields[c]);
                        }
                        do
                        {
                            var row = new DynamicDataRow();
                            for (int v = 0; v < maxcols; v++)
                            {
                                row[GetName(cursor.Fields[v])] = cursor.Current[v].ToString();
                            }
                            data.Add(row);
                        } while (cursor.MoveNext());
                    }
                });

                lock (_theLock) {
                    ListOfRows = null;
                    ListOfRows = data;
                }
            }
            RaisePropertyChanged("ListOfRows");
            Status    = string.Format("{0} rows loaded", ListOfRows.Count());
            IsLoading = false;
        }
    protected override async void OnClick()
    {
      var result = await QueuedTask.Run(() =>
      {
        var mapView = MapView.Active;
        if (mapView == null)
          return false;

        //Get the collection of line layers that have at least one feature selected.
        var selection = mapView.Map.GetSelection();
        var keyValuePairs = selection.Where(kvp => (kvp.Key is BasicFeatureLayer) 
          && (kvp.Key as BasicFeatureLayer).ShapeType == esriGeometryType.esriGeometryPolyline);

        foreach (var kvp in keyValuePairs)
        {
          var layer = kvp.Key as BasicFeatureLayer;
          var oid = kvp.Value.First();

          //Get a cursor for the layer using the OID of the first selected feature.
          var oidField = layer.GetTable().GetDefinition().GetObjectIDField();
          var qf = new ArcGIS.Core.Data.QueryFilter() { WhereClause = string.Format("{0} = {1}", oidField, oid) };
          var cursor = layer.Search(qf);
          Feature row = null;

          if (cursor.MoveNext())
            row = cursor.Current as Feature;

          if (row == null)
            continue;

          //If the feature doesn't have Z values in the geometry continue to the next layer.
          var polyline = row.GetShape();
          if (!polyline.HasZ)
            continue;

          //If the layer doesn't have 3D properties set continue to the next layer.
          var layerDef = layer.GetDefinition();
          var layer3DProperties = layerDef.Layer3DProperties;
          if (layer3DProperties == null)
            continue;

          //Get the vertical unit set on the layer and send it and the line feature to the module method to construct the keyframes.
          var verticalUnit = layer3DProperties.VerticalUnit;
          Animation.Current.CreateKeyframesAlongPath(polyline as Polyline, verticalUnit);
          return true;
        }
        return false;
      });

      //If at least 1 selected 3D feature was not found show a message box.
      if (!result)
        MessageBox.Show("Select at least one 3D line feature.", "No 3D line features selected.");
    }
    /// <summary>
    /// Called when the sketch is finished.
    /// </summary>
    protected override async Task<bool> OnSketchCompleteAsync(ArcGIS.Core.Geometry.Geometry geometry)
    {
      //Get the instance of the ViewModel from the dock pane
      var featureSelVM = Module1.FeatureSelectionVM;
      if (featureSelVM == null || featureSelVM.SelectedLayer == null)
        return true;

      return await QueuedTask.Run(() =>
      {
        //Return all the features that intersect the sketch geometry
        var result = MapView.Active.GetFeatures(geometry);
        var layerSelection = result.FirstOrDefault(kvp => kvp.Key == featureSelVM.SelectedLayer);

        //Clear the selection if no features where returned
        if (!result.ContainsKey(featureSelVM.SelectedLayer))
        {
          featureSelVM.SelectedLayer.Select(null, SelectionCombinationMethod.Subtract);
          return true;
        }

        //Construct a query filter using the OIDs of the features that intersected the sketch geometry
        var oidList = result[featureSelVM.SelectedLayer];
        var oid = featureSelVM.SelectedLayer.GetTable().GetDefinition().GetObjectIDField();
        var qf = new ArcGIS.Core.Data.QueryFilter() { WhereClause = string.Format("({0} in ({1}))", oid, string.Join(",", oidList)) };

        //Add to the clause using the where clause specified in the dock pane.
        if (featureSelVM.WhereClause != "" && featureSelVM.WhereClause != null)
          qf.WhereClause += string.Format(" AND ({0})", featureSelVM.WhereClause);

        //Return if the expression is not valid.
        if (!featureSelVM.ValidateExpresion(false))
          return true;

        //Change the method depending on the hot keys that are pressed.
        var method = SelectionCombinationMethod.New;
        if (_ctrlPressed && _shiftPressed)
          method = SelectionCombinationMethod.And;
        else if (_ctrlPressed)
          method = SelectionCombinationMethod.Subtract;
        else if (_shiftPressed)
          method = SelectionCombinationMethod.Add;

        try
        {
          //Create the new selection
          featureSelVM.SelectedLayer.Select(qf, method);
        }
        catch (Exception){} //May occur if expression validates but is still invalid expression.
        return true;
      });
    }
        private Task ShowAttributes()
        {
            return(QueuedTask.Run(() =>
            {
                try
                {
                    _fieldAttributes.Clear();
                    if (SelectedLayer == null || SelectedOID == null)
                    {
                        return;
                    }

                    var oidField = SelectedLayer.GetTable().GetDefinition().GetObjectIDField();
                    var qf = new ArcGIS.Core.Data.QueryFilter()
                    {
                        WhereClause = string.Format("{0} = {1}", oidField, SelectedOID)
                    };
                    var cursor = SelectedLayer.Search(qf);
                    Row row = null;

                    if (cursor.MoveNext())
                    {
                        row = cursor.Current;
                    }

                    if (row == null)
                    {
                        return;
                    }

                    var fields = row.GetFields();
                    lock (_lock)
                    {
                        foreach (ArcGIS.Core.Data.Field field in fields)
                        {
                            if (field.FieldType == FieldType.Geometry)
                            {
                                continue;
                            }
                            var val = row[field.Name];
                            FieldAttributeInfo fa = new FieldAttributeInfo(field, (val is DBNull || val == null) ? null : val.ToString());
                            _fieldAttributes.Add(fa);
                        }
                    }
                }
                catch (Exception)
                {
                }
            }));
        }
Example #5
0
        public void SearchAndUpdate()
        {
            #region Search for layer features and update a field
            ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
            {
                //find layer
                var disLayer = ArcGIS.Desktop.Mapping.MapView.Active.Map.FindLayers("Distribution mains").FirstOrDefault() as BasicFeatureLayer;

                //Search by attribute
                var queryFilter         = new ArcGIS.Core.Data.QueryFilter();
                queryFilter.WhereClause = "CONTRACTOR = 'KCGM'";

                var oidSet = new List <long>();
                using (var rc = disLayer.Search(queryFilter))
                {
                    //Create list of oids to update
                    while (rc.MoveNext())
                    {
                        oidSet.Add(rc.Current.GetObjectID());
                    }
                }

                //Create edit operation
                var op  = new ArcGIS.Desktop.Editing.EditOperation();
                op.Name = "Update date";

                // load features into inspector and update field
                var insp = new ArcGIS.Desktop.Editing.Attributes.Inspector();
                insp.Load(disLayer, oidSet);
                insp["InspDate"] = "9/21/2013";

                // modify and execute
                op.Modify(insp);
                op.Execute();
            });
            #endregion
        }
    private Task ShowAttributes()
    {
      return QueuedTask.Run(() =>
      {
        try
        {
          _fieldAttributes.Clear();
          if (SelectedLayer == null || SelectedOID == null)
            return;

          var oidField = SelectedLayer.GetTable().GetDefinition().GetObjectIDField();
          var qf = new ArcGIS.Core.Data.QueryFilter() { WhereClause = string.Format("{0} = {1}", oidField, SelectedOID) };
          var cursor = SelectedLayer.Search(qf);
          Row row = null;

          if (cursor.MoveNext())
            row = cursor.Current;

          if (row == null)
            return;

          var fields = row.GetFields();
          lock (_lock)
          {
            foreach (ArcGIS.Core.Data.Field field in fields)
            {
              if (field.FieldType == FieldType.Geometry)
                continue;
              var val = row[field.Name];
              FieldAttributeInfo fa = new FieldAttributeInfo(field, (val is DBNull || val == null) ? null : val.ToString());
              _fieldAttributes.Add(fa);
            }
          }
        }
        catch (Exception ex)
        {
        }
      });
    }
        public void EditOperations()
        {
            var featureLayer = MapView.Active.Map.GetLayersAsFlattenedList()[0] as FeatureLayer;
            var polygon      = new PolygonBuilder().ToGeometry();
            var clipPoly     = new PolygonBuilder().ToGeometry();
            var cutLine      = new PolylineBuilder().ToGeometry();
            var modifyLine   = cutLine;
            var oid          = 1;
            var layer        = featureLayer;

            #region Edit Operation Create Features

            var createFeatures = new EditOperation();
            createFeatures.Name = "Create Features";
            //Create a feature with a polygon
            createFeatures.Create(featureLayer, polygon);

            //with a callback
            createFeatures.Create(featureLayer, polygon, (object_id) => {
                //TODO - use the oid of the created feature
                //in your callback
            });

            //Do a create features and set attributes
            var attributes = new Dictionary <string, object>();
            attributes.Add("SHAPE", polygon);
            attributes.Add("NAME", "Corner Market");
            attributes.Add("SIZE", 1200.5);
            attributes.Add("DESCRIPTION", "Corner Market");

            createFeatures.Create(featureLayer, attributes);

            //Create features using the current template
            //Must be within a MapTool
            createFeatures.Create(this.CurrentTemplate, polygon);

            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            createFeatures.Execute();

            //or use async flavor
            //await createFeatures.ExecuteAsync();

            #endregion

            #region Create a feature using the current template
            var myTemplate = ArcGIS.Desktop.Editing.Templates.EditingTemplate.Current;
            var myGeometry = _geometry;

            //Create edit operation and execute
            var op = new ArcGIS.Desktop.Editing.EditOperation();
            op.Name = "Create my feature";
            op.Create(myTemplate, myGeometry);
            op.Execute();
            #endregion

            #region Create feature from a modified inspector

            var insp = new ArcGIS.Desktop.Editing.Attributes.Inspector();
            insp.Load(layer, 86);

            ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
            {
                // modify attributes if necessary
                // insp["Field1"] = newValue;

                //Create new feature from an existing inspector (copying the feature)
                var createOp  = new ArcGIS.Desktop.Editing.EditOperation();
                createOp.Name = "Create from insp";
                createOp.Create(insp.MapMember, insp.ToDictionary(a => a.FieldName, a => a.CurrentValue));
                createOp.Execute();
            });
            #endregion

            var csvData = new List <CSVData>();

            #region Create features from a CSV file
            //Run on MCT
            ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
            {
                //Create the edit operation
                var createOperation  = new ArcGIS.Desktop.Editing.EditOperation();
                createOperation.Name = "Generate points";
                createOperation.SelectNewFeatures = false;

                // determine the shape field name - it may not be 'Shape'
                string shapeField = layer.GetFeatureClass().GetDefinition().GetShapeField();

                //Loop through csv data
                foreach (var item in csvData)
                {
                    //Create the point geometry
                    ArcGIS.Core.Geometry.MapPoint newMapPoint = ArcGIS.Core.Geometry.MapPointBuilder.CreateMapPoint(item.X, item.Y);

                    // include the attributes via a dictionary
                    var atts = new Dictionary <string, object>();
                    atts.Add("StopOrder", item.StopOrder);
                    atts.Add("FacilityID", item.FacilityID);
                    atts.Add(shapeField, newMapPoint);

                    // queue feature creation
                    createOperation.Create(layer, atts);
                }

                // execute the edit (feature creation) operation
                return(createOperation.Execute());
            });
            #endregion

            #region Edit Operation Clip Features

            var clipFeatures = new EditOperation();
            clipFeatures.Name = "Clip Features";
            clipFeatures.Clip(featureLayer, oid, clipPoly, ClipMode.PreserveArea);
            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            clipFeatures.Execute();

            //or use async flavor
            //await clipFeatures.ExecuteAsync();

            #endregion

            #region Edit Operation Cut Features

            var select = MapView.Active.SelectFeatures(clipPoly);

            var cutFeatures = new EditOperation();
            cutFeatures.Name = "Cut Features";
            cutFeatures.Split(featureLayer, oid, cutLine);

            //Cut all the selected features in the active view
            //Select using a polygon (for example)
            var kvps = MapView.Active.SelectFeatures(polygon).Select(
                k => new KeyValuePair <MapMember, List <long> >(k.Key as MapMember, k.Value));
            cutFeatures.Split(kvps, cutLine);

            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            cutFeatures.Execute();

            //or use async flavor
            //await cutFeatures.ExecuteAsync();

            #endregion

            #region Edit Operation Delete Features

            var deleteFeatures = new EditOperation();
            deleteFeatures.Name = "Delete Features";
            var table = MapView.Active.Map.StandaloneTables[0];
            //Delete a row in a standalone table
            deleteFeatures.Delete(table, oid);

            //Delete all the selected features in the active view
            //Select using a polygon (for example)
            var selection = MapView.Active.SelectFeatures(polygon).Select(
                k => new KeyValuePair <MapMember, List <long> >(k.Key as MapMember, k.Value));

            deleteFeatures.Delete(selection);

            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            deleteFeatures.Execute();

            //or use async flavor
            //await deleteFeatures.ExecuteAsync();

            #endregion

            #region Edit Operation Duplicate Features

            var duplicateFeatures = new EditOperation();
            duplicateFeatures.Name = "Duplicate Features";

            //Duplicate with an X and Y offset of 500 map units
            duplicateFeatures.Duplicate(featureLayer, oid, 500.0, 500.0, 0.0);

            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            duplicateFeatures.Execute();

            //or use async flavor
            //await duplicateFeatures.ExecuteAsync();

            #endregion

            #region Edit Operation Explode Features

            var explodeFeatures = new EditOperation();
            explodeFeatures.Name = "Explode Features";

            //Take a multipart and convert it into one feature per part
            //Provide a list of ids to convert multiple
            explodeFeatures.Explode(featureLayer, new List <long>()
            {
                oid
            }, true);

            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            explodeFeatures.Execute();

            //or use async flavor
            //await explodeFeatures.ExecuteAsync();

            #endregion

            var destinationLayer = featureLayer;

            #region Edit Operation Merge Features

            var mergeFeatures = new EditOperation();
            mergeFeatures.Name = "Merge Features";

            //Merge three features into a new feature using defaults
            //defined in the current template
            mergeFeatures.Merge(this.CurrentTemplate as EditingFeatureTemplate, featureLayer, new List <long>()
            {
                10, 96, 12
            });

            //Merge three features into a new feature in the destination layer
            mergeFeatures.Merge(destinationLayer, featureLayer, new List <long>()
            {
                10, 96, 12
            });

            //Use an inspector to set the new attributes of the merged feature
            var inspector = new Inspector();
            inspector.Load(featureLayer, oid);//base attributes on an existing feature
            //change attributes for the new feature
            inspector["NAME"]        = "New name";
            inspector["DESCRIPTION"] = "New description";

            //Merge features into a new feature in the same layer using the
            //defaults set in the inspector
            mergeFeatures.Merge(featureLayer, new List <long>()
            {
                10, 96, 12
            }, inspector);

            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            mergeFeatures.Execute();

            //or use async flavor
            //await mergeFeatures.ExecuteAsync();

            #endregion

            #region Edit Operation Modify single feature

            var modifyFeature = new EditOperation();
            modifyFeature.Name = "Modify a feature";

            //use an inspector
            var modifyInspector = new Inspector();
            modifyInspector.Load(featureLayer, oid);//base attributes on an existing feature

            //change attributes for the new feature
            modifyInspector["SHAPE"] = polygon;        //Update the geometry
            modifyInspector["NAME"]  = "Updated name"; //Update attribute(s)

            modifyFeature.Modify(modifyInspector);

            //update geometry and attributes using overload
            var featureAttributes = new Dictionary <string, object>();
            featureAttributes["NAME"] = "Updated name";//Update attribute(s)
            modifyFeature.Modify(featureLayer, oid, polygon, featureAttributes);

            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            modifyFeature.Execute();

            //or use async flavor
            //await modifyFeatures.ExecuteAsync();

            #endregion

            #region Edit Operation Modify multiple features

            //Search by attribute
            var queryFilter = new QueryFilter();
            queryFilter.WhereClause = "OBJECTID < 1000000";
            //Create list of oids to update
            var oidSet = new List <long>();
            using (var rc = featureLayer.Search(queryFilter))
            {
                while (rc.MoveNext())
                {
                    using (var record = rc.Current)
                    {
                        oidSet.Add(record.GetObjectID());
                    }
                }
            }

            //create and execute the edit operation
            var modifyFeatures = new EditOperation();
            modifyFeatures.Name           = "Modify features";
            modifyFeatures.ShowProgressor = true;

            var muultipleFeaturesInsp = new Inspector();
            muultipleFeaturesInsp.Load(featureLayer, oidSet);
            muultipleFeaturesInsp["MOMC"] = 24;
            modifyFeatures.Modify(muultipleFeaturesInsp);
            modifyFeatures.ExecuteAsync();
            #endregion

            #region Search for layer features and update a field
            ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() =>
            {
                //find layer
                var disLayer = ArcGIS.Desktop.Mapping.MapView.Active.Map.FindLayers("Distribution mains").FirstOrDefault() as BasicFeatureLayer;

                //Search by attribute
                var filter         = new ArcGIS.Core.Data.QueryFilter();
                filter.WhereClause = "CONTRACTOR = 'KCGM'";

                var oids = new List <long>();
                using (var rc = disLayer.Search(filter))
                {
                    //Create list of oids to update
                    while (rc.MoveNext())
                    {
                        using (var record = rc.Current)
                        {
                            oidSet.Add(record.GetObjectID());
                        }
                    }
                }

                //Create edit operation
                var modifyOp  = new ArcGIS.Desktop.Editing.EditOperation();
                modifyOp.Name = "Update date";

                // load features into inspector and update field
                var dateInsp = new ArcGIS.Desktop.Editing.Attributes.Inspector();
                dateInsp.Load(disLayer, oids);
                dateInsp["InspDate"] = "9/21/2013";

                // modify and execute
                modifyOp.Modify(insp);
                modifyOp.Execute();
            });
            #endregion

            #region Move features

            //Get all of the selected ObjectIDs from the layer.
            var firstLayer       = MapView.Active.Map.GetLayersAsFlattenedList().OfType <FeatureLayer>().FirstOrDefault();
            var selectionfromMap = firstLayer.GetSelection();

            // set up a dictionary to store the layer and the object IDs of the selected features
            var selectionDictionary = new Dictionary <MapMember, List <long> >();
            selectionDictionary.Add(firstLayer as MapMember, selectionfromMap.GetObjectIDs().ToList());

            var moveFeature = new EditOperation();
            moveFeature.Name = "Move features";
            moveFeature.Move(selectionDictionary, 10, 10); //specify your units along axis to move the geometry

            moveFeature.Execute();
            #endregion

            #region Move feature to a specific coordinate

            //Get all of the selected ObjectIDs from the layer.
            var abLayer     = MapView.Active.Map.GetLayersAsFlattenedList().OfType <FeatureLayer>().FirstOrDefault();
            var mySelection = abLayer.GetSelection();
            var selOid      = mySelection.GetObjectIDs().FirstOrDefault();

            var moveToPoint = new MapPointBuilder(1.0, 2.0, 3.0, 4.0, MapView.Active.Map.SpatialReference); //can pass in coordinates.

            var modifyFeatureCoord = new EditOperation();
            modifyFeatureCoord.Name = "Move features";
            modifyFeatureCoord.Modify(abLayer, selOid, moveToPoint.ToGeometry()); //Modify the feature to the new geometry
            modifyFeatureCoord.Execute();

            #endregion

            #region Edit Operation Planarize Features

            var planarizeFeatures = new EditOperation();
            planarizeFeatures.Name = "Planarize Features";

            //Planarize one or more features
            planarizeFeatures.Planarize(featureLayer, new List <long>()
            {
                oid
            });

            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            planarizeFeatures.Execute();

            //or use async flavor
            //await planarizeFeatures.ExecuteAsync();

            #endregion

            #region Edit Operation Reshape Features

            var reshapeFeatures = new EditOperation();
            reshapeFeatures.Name = "Reshape Features";

            reshapeFeatures.Reshape(featureLayer, oid, modifyLine);

            //Reshape a set of features that intersect some geometry....
            var selFeatures = MapView.Active.GetFeatures(modifyLine).Select(
                k => new KeyValuePair <MapMember, List <long> >(k.Key as MapMember, k.Value));

            reshapeFeatures.Reshape(selFeatures, modifyLine);

            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            reshapeFeatures.Execute();

            //or use async flavor
            //await reshapeFeatures.ExecuteAsync();

            #endregion

            var origin = MapPointBuilder.CreateMapPoint(0, 0, null);

            #region Edit Operation Rotate Features

            var rotateFeatures = new EditOperation();
            rotateFeatures.Name = "Rotate Features";

            //Rotate works on a selected set of features
            //Get all features that intersect a polygon
            var rotateSelection = MapView.Active.GetFeatures(polygon).Select(
                k => new KeyValuePair <MapMember, List <long> >(k.Key as MapMember, k.Value));

            //Rotate selected features 90 deg about "origin"
            rotateFeatures.Rotate(rotateSelection, origin, Math.PI / 2);

            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            rotateFeatures.Execute();

            //or use async flavor
            //await rotateFeatures.ExecuteAsync();

            #endregion

            #region Edit Operation Scale Features

            var scaleFeatures = new EditOperation();
            scaleFeatures.Name = "Scale Features";

            //Rotate works on a selected set of features
            var scaleSelection = MapView.Active.GetFeatures(polygon).Select(
                k => new KeyValuePair <MapMember, List <long> >(k.Key as MapMember, k.Value));

            //Scale the selected features by 2.0 in the X and Y direction
            scaleFeatures.Scale(scaleSelection, origin, 2.0, 2.0, 0.0);

            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            scaleFeatures.Execute();

            //or use async flavor
            //await scaleFeatures.ExecuteAsync();

            #endregion

            var mp1 = MapPointBuilder.CreateMapPoint(0, 0, null);
            var mp2 = mp1;
            var mp3 = mp1;

            #region Edit Operation Split Features

            var splitFeatures = new EditOperation();
            splitFeatures.Name = "Split Features";

            var splitPoints = new List <MapPoint>()
            {
                mp1, mp2, mp3
            };

            //Split the feature at 3 points
            splitFeatures.Split(featureLayer, oid, splitPoints);

            // split using percentage
            var splitByPercentage = new SplitByPercentage()
            {
                Percentage = 33, SplitFromStartPoint = true
            };
            splitFeatures.Split(featureLayer, oid, splitByPercentage);

            // split using equal parts
            var splitByEqualParts = new SplitByEqualParts()
            {
                NumParts = 3
            };
            splitFeatures.Split(featureLayer, oid, splitByEqualParts);

            // split using single distance
            var splitByDistance = new SplitByDistance()
            {
                Distance = 27.3, SplitFromStartPoint = false
            };
            splitFeatures.Split(featureLayer, oid, splitByDistance);

            // split using varying distance
            var distances = new List <double>()
            {
                12.5, 38.2, 89.99
            };
            var splitByVaryingDistance = new SplitByVaryingDistance()
            {
                Distances = distances, SplitFromStartPoint = true, ProportionRemainder = true
            };
            splitFeatures.Split(featureLayer, oid, splitByVaryingDistance);

            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            splitFeatures.Execute();

            //or use async flavor
            //await splitAtPointsFeatures.ExecuteAsync();

            #endregion

            var linkLayer = featureLayer;

            #region Edit Operation Transform Features

            var transformFeatures = new EditOperation();
            transformFeatures.Name = "Transform Features";

            //Transform a selected set of features
            var transformSelection = MapView.Active.GetFeatures(polygon).Select(
                k => new KeyValuePair <MapMember, List <long> >(k.Key as MapMember, k.Value));

            transformFeatures.Transform(transformSelection, linkLayer);

            //Transform just a layer
            transformFeatures.Transform(featureLayer, linkLayer);

            //Perform an affine transformation
            transformFeatures.TransformAffine(featureLayer, linkLayer);

            //Execute to execute the operation
            //Must be called within QueuedTask.Run
            transformFeatures.Execute();

            //or use async flavor
            //await transformFeatures.ExecuteAsync();

            #endregion

            #region Edit Operation Perform a Clip, Cut, and Planarize

            //Multiple operations can be performed by a single
            //edit operation.
            var clipCutPlanarizeFeatures = new EditOperation();
            clipCutPlanarizeFeatures.Name = "Clip, Cut, and Planarize Features";
            clipCutPlanarizeFeatures.Clip(featureLayer, oid, clipPoly);
            clipCutPlanarizeFeatures.Split(featureLayer, oid, cutLine);
            clipCutPlanarizeFeatures.Planarize(featureLayer, new List <long>()
            {
                oid
            });

            //Note: An edit operation is a single transaction.
            //Execute the operations (in the order they were declared)
            clipCutPlanarizeFeatures.Execute();

            //or use async flavor
            //await clipCutPlanarizeFeatures.ExecuteAsync();

            #endregion

            #region Edit Operation Chain Edit Operations

            //Chaining operations is a special case. Use "Chained Operations" when you require multiple transactions
            //to be undo-able with a single "Undo".

            //The most common use case for operation chaining is creating a feature with an attachement.
            //Adding an attachment requires the object id (of a new feature) has already been created.
            var editOperation1 = new EditOperation();
            editOperation1.Name = string.Format("Create point in '{0}'", CurrentTemplate.Layer.Name);

            long newFeatureID = -1;
            //The Create operation has to execute so we can get an object_id
            editOperation1.Create(this.CurrentTemplate, polygon, (object_id) => newFeatureID = object_id);
            //Must be within a QueuedTask
            editOperation1.Execute();

            //or use async flavor
            //await editOperation1.ExecuteAsync();

            //Now, because we have the object id, we can add the attachment.  As we are chaining it, adding the attachment
            //can be undone as part of the "Undo Create" operation. In other words, only one undo operation will show on the
            //Pro UI and not two.
            var editOperation2 = editOperation1.CreateChainedOperation();
            //Add the attachement using the new feature id
            editOperation2.AddAttachment(this.CurrentTemplate.Layer, newFeatureID, @"C:\data\images\Hydrant.jpg");

            //editOperation1 and editOperation2 show up as a single Undo operation on the UI even though
            //we had two transactions
            //Must be within a QueuedTask
            editOperation2.Execute();

            //or use async flavor
            //await editOperation2.ExecuteAsync();

            #endregion

            #region Edit Operation add attachment via RowToken

            //ArcGIS Pro 2.5 extends the EditOperation.AddAttachment method to take a RowToken as a paramter.
            //This allows you to create a feature, using EditOperation.CreateEx, and add an attachment in one transaction.

            var editOpAttach = new EditOperation();
            editOperation1.Name = string.Format("Create point in '{0}'", CurrentTemplate.Layer.Name);

            var attachRowToken = editOpAttach.CreateEx(this.CurrentTemplate, polygon);
            editOpAttach.AddAttachment(attachRowToken, @"c:\temp\image.jpg");

            //Must be within a QueuedTask
            editOpAttach.Execute();
            #endregion

            #region SetOnUndone, SetOnRedone, SetOnComitted

            // SetOnUndone, SetOnRedone and SetOnComittedManage can be used to manage
            // external actions(such as writing to a log table) that are associated with
            // each edit operation.

            //get selected feature and update attribute
            var selectedFeatures = MapView.Active.Map.GetSelection();
            var testInspector    = new Inspector();
            testInspector.Load(selectedFeatures.Keys.First(), selectedFeatures.Values.First());
            testInspector["Name"] = "test";

            //create and execute the edit operation
            var updateTestField = new EditOperation();
            updateTestField.Name = "Update test field";
            updateTestField.Modify(insp);

            //actions for SetOn...
            updateTestField.SetOnUndone(() =>
            {
                //Sets an action that will be called when this operation is undone.
                Debug.WriteLine("Operation is undone");
            });

            updateTestField.SetOnRedone(() =>
            {
                //Sets an action that will be called when this editoperation is redone.
                Debug.WriteLine("Operation is redone");
            });

            updateTestField.SetOnComitted((bool b) => //called on edit session save(true)/discard(false).
            {
                // Sets an action that will be called when this editoperation is committed.
                Debug.WriteLine("Operation is committed");
            });

            updateTestField.Execute();
        }
Example #8
0
        private async void OnSelectionChanged(MapSelectionChangedEventArgs obj)
        {
            if (MapView.Active != null && MapView.Active.Map != null && obj.Selection.Count == 1)
            {
                var fl = obj.Selection.FirstOrDefault().Key as FeatureLayer;
                if (fl == null || fl.SelectionCount != 1 || fl.ShapeType != esriGeometryType.esriGeometryPoint)
                {
                    return;
                }

                var pointd = await QueuedTask.Run(() =>
                {
                    try
                    {
                        var SelectedOID = fl.GetSelection().GetObjectIDs().FirstOrDefault();
                        if (SelectedOID < 0)
                        {
                            return(null);
                        }

                        var SelectedLayer = fl as BasicFeatureLayer;

                        var oidField = SelectedLayer.GetTable().GetDefinition().GetObjectIDField();
                        var qf       = new ArcGIS.Core.Data.QueryFilter()
                        {
                            WhereClause = string.Format("{0} = {1}", oidField, SelectedOID)
                        };
                        var cursor = SelectedLayer.Search(qf);
                        Row row    = null;

                        if (cursor.MoveNext())
                        {
                            row = cursor.Current;
                        }

                        if (row == null)
                        {
                            return(null);
                        }

                        var fields = row.GetFields();
                        lock (_lock)
                        {
                            foreach (ArcGIS.Core.Data.Field field in fields)
                            {
                                if (field.FieldType == FieldType.Geometry)
                                {
                                    // have mappoint here
                                    var val = row[field.Name];
                                    if (val is MapPoint)
                                    {
                                        var temp = val as MapPoint;
                                        return(temp);
                                    }
                                    break;
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.WriteLine(ex.Message);
                    }

                    return(null);
                });

                if (pointd != null)
                {
                    Mediator.NotifyColleagues(CoordinateConversionLibrary.Constants.NewMapPointSelection, pointd);
                }
            }
        }
        protected override async void OnClick()
        {
            var result = await QueuedTask.Run(() =>
            {
                var mapView = MapView.Active;
                if (mapView == null)
                {
                    return(false);
                }

                //Get the collection of line layers that have at least one feature selected.
                var selection     = mapView.Map.GetSelection();
                var keyValuePairs = selection.ToDictionary().Where(kvp => (kvp.Key is BasicFeatureLayer) &&
                                                                   (kvp.Key as BasicFeatureLayer).ShapeType == esriGeometryType.esriGeometryPolyline);

                foreach (var kvp in keyValuePairs)
                {
                    var layer = kvp.Key as BasicFeatureLayer;
                    var oid   = kvp.Value.First();

                    //Get a cursor for the layer using the OID of the first selected feature.
                    var oidField = layer.GetTable().GetDefinition().GetObjectIDField();
                    var qf       = new ArcGIS.Core.Data.QueryFilter()
                    {
                        WhereClause = string.Format("{0} = {1}", oidField, oid)
                    };
                    var cursor = layer.Search(qf);

                    if (cursor.MoveNext())
                    {
                        using (var row = cursor.Current as Feature)
                        {
                            if (row == null)
                            {
                                continue;
                            }

                            //If the feature doesn't have Z values in the geometry continue to the next layer.
                            var polyline = row.GetShape();
                            if (!polyline.HasZ)
                            {
                                continue;
                            }

                            //If the layer doesn't have 3D properties set continue to the next layer.
                            var layerDef          = layer.GetDefinition();
                            var layer3DProperties = layerDef.Layer3DProperties;
                            if (layer3DProperties == null)
                            {
                                continue;
                            }

                            //Get the vertical unit set on the layer and send it and the line feature to the module method to construct the keyframes.
                            var verticalUnit = layer3DProperties.VerticalUnit;
                            Animation.Current.CreateKeyframesAlongPath(polyline as Polyline, verticalUnit);
                            return(true);
                        }
                    }
                }
                return(false);
            });

            //If at least 1 selected 3D feature was not found show a message box.
            if (!result)
            {
                MessageBox.Show("Select at least one 3D line feature.", "No 3D line features selected.");
            }
        }
        /// <summary>
        /// Execute a query against the selected layer's feature class and 
        /// display the resulting datatable
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        private async Task QueryRows(object query)
        {
            var where = string.Empty;
            if (query != null) where = query.ToString();
            IsLoading = true;
            var rowCount = 0;
            // get the features using the query
            if (_selectedLayer != null)
            {
                await QueuedTask.Run(() =>
                {
                    var basicFl = _selectedLayer as BasicFeatureLayer;
                    if (basicFl != null)
                    {
                        Table layerTable = basicFl.GetTable();

                        var dt = new DataTable();
                        var queryFilter = new ArcGIS.Core.Data.QueryFilter
                        {
                            WhereClause = where
                        };
                        RowCursor cursor;
                        // Use try catch to catch invalid SQL statements in queryFilter
                        try
                        {
                            cursor = layerTable.Search(queryFilter);
                        }
                        catch (GeodatabaseGeneralException gdbEx)
                        {
                            ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show("Error searching data. " + gdbEx.Message,
                                "Search Error", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                            return;
                        }
                        if (cursor.MoveNext())
                        {
                            var maxcols = cursor.Current.GetFields().Count() > 6
                                ? 6
                                : cursor.Current.GetFields().Count();
                            for (var c = 0; c < maxcols; c++)
                            {
                                Type colType = typeof(string);
                                var format = string.Empty;
                                var fldDefinition = cursor.Current.GetFields()[c];
                                switch (fldDefinition.FieldType)
                                {
                                    case FieldType.Blob:
                                        format = "Blob";
                                        break;
                                    case FieldType.Raster:
                                        format = "Raster";
                                        break;
                                    case FieldType.Geometry:
                                        format = "Geom";
                                        break;
                                    case FieldType.Date:
                                        colType = typeof(DateTime);
                                        format = @"mm/dd/yyyy";
                                        break;
                                    case FieldType.Double:
                                        format = "0,0.0##";
                                        break;
                                    case FieldType.Integer:
                                    case FieldType.OID:
                                    case FieldType.Single:
                                    case FieldType.SmallInteger:
                                        format = "0,0";
                                        break;
                                    case FieldType.GlobalID:
                                    case FieldType.GUID:
                                    case FieldType.String:
                                    case FieldType.XML:
                                    default:
                                        break;
                                }
                                var col = new DataColumn(fldDefinition.Name, colType)
                                {
                                    Caption = fldDefinition.AliasName
                                };
                                dt.Columns.Add(col);
                            }
                            do
                            {
                                var row = dt.NewRow();
                                rowCount++;
                                for (var colIdx = 0; colIdx < maxcols; colIdx++)
                                {
                                    row[colIdx] = cursor.Current[colIdx];
                                }
                                dt.Rows.Add(row);
                            } while (cursor.MoveNext());
                        }
                        Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                            (Action)(() => UpdateDataTableOnUI(dt)));
                    }
                });
            }
            Status = string.Format("{0} rows loaded", rowCount);
            IsLoading = false;
        }
Example #11
0
        private async Task QueryRows(object query)
        {
            string where = "";
            if (query != null)
            {
                where = query.ToString();
            }
            IsLoading = true;
            lock (_theLock)
            {
                ListOfRows.Clear();
            }
            if (_layerSource == null)
            {
                _layerSource = await _selectedLayer.getFeatureClass();
            }
            if (_layerSource != null)
            {
                var data = new List <DynamicDataRow>();
                await QueuedTask.Run(() =>
                {
                    var queryFilter = new ArcGIS.Core.Data.QueryFilter
                    {
                        WhereClause = where
                    };
                    int maxcols = 6;

                    RowCursor cursor = null;

                    // Use try catch to catch invalid SQL statements in queryFilter
                    try
                    {
                        cursor = _layerSource.Search(queryFilter);
                    }
                    catch (GeodatabaseGeneralException gdbEx)
                    {
                        System.Windows.MessageBox.Show("Error searching data. " + gdbEx.Message, "Search Error",
                                                       System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Exclamation);
                        return;
                    }

                    if (cursor.MoveNext())
                    {
                        ExtendListView.Columns = new List <ArcGIS.Core.Data.Field>();
                        maxcols = cursor.Current.GetFields().Count() > 6 ? 6 : cursor.Current.GetFields().Count();

                        for (int c = 0; c < maxcols; c++)
                        {
                            ExtendListView.Columns.Add(cursor.Current.GetFields()[c]);
                        }
                        do
                        {
                            var row = new DynamicDataRow();
                            for (int v = 0; v < maxcols; v++)
                            {
                                if (cursor.Current[v] != null)
                                {
                                    row[GetName(cursor.GetFields()[v])] = cursor.Current[v].ToString();
                                }
                            }
                            data.Add(row);
                        } while (cursor.MoveNext());
                    }
                });

                lock (_theLock)
                {
                    ListOfRows = null;
                    ListOfRows = data;
                }
            }
            RaisePropertyChanged("ListOfRows");
            Status    = string.Format("{0} rows loaded", ListOfRows.Count());
            IsLoading = false;
        }
Example #12
0
        protected override async void OnClick()
        {
            Polygon polygone = null;
            await QueuedTask.Run(() =>
            {
                try
                {
                    //Get the active map view.
                    var mapView = MapView.Active;
                    if (mapView == null)
                    {
                        return;
                    }

                    //Get the selected features from the map and filter out the standalone table selection.
                    var selectedFeatures = mapView.Map.GetSelection()
                                           .Where(kvp => kvp.Key is BasicFeatureLayer)
                                           .ToDictionary(kvp => (BasicFeatureLayer)kvp.Key, kvp => kvp.Value);
                    foreach (var item in selectedFeatures)
                    {
                        Console.WriteLine(item.Key);
                    }
                    var rowCursor = mapView.Map.GetSelection();

                    var selection     = mapView.Map.GetSelection();
                    var keyValuePairs = selection.Where(kvp => (kvp.Key is BasicFeatureLayer) &&
                                                        (kvp.Key as BasicFeatureLayer).ShapeType == esriGeometryType.esriGeometryPolygon);
                    foreach (var kvp in keyValuePairs)
                    {
                        var layer = kvp.Key as BasicFeatureLayer;
                        if (kvp.Value.Count > 1)
                        {
                            var oid      = kvp.Value.First();
                            var oidField = layer.GetTable().GetDefinition().GetObjectIDField();
                            var qf       = new ArcGIS.Core.Data.QueryFilter()
                            {
                                WhereClause = string.Format("{0} = {1}", oidField, oid)
                            };
                            var cursor  = layer.Search(qf);
                            Feature row = null;

                            if (cursor.MoveNext())
                            {
                                row = cursor.Current as Feature;
                            }

                            if (row == null)
                            {
                                continue;
                            }
                            polygone = (Polygon)row.GetShape();
                        }
                        else
                        {
                            var oid      = kvp.Value.First();
                            var oidField = layer.GetTable().GetDefinition().GetObjectIDField();
                            var qf       = new ArcGIS.Core.Data.QueryFilter()
                            {
                                WhereClause = string.Format("{0} = {1}", oidField, oid)
                            };
                            var cursor  = layer.Search(qf);
                            Feature row = null;

                            if (cursor.MoveNext())
                            {
                                row = cursor.Current as Feature;
                            }

                            if (row == null)
                            {
                                continue;
                            }
                            polygone = (Polygon)row.GetShape();
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("There was an error getting the geometry of the selected shape. Please try your selection again." + Environment.NewLine + "Error: " + ex.Message);
                    Console.WriteLine("Error getting select shape geom");
                    return;
                }
            });


            if (polygone.PointCount > 500)
            {
                MessageBox.Show("Too many vertices. Please simplify the selected Polygon or choose another one. Max vertices: 500");
                return;
            }

            DockPane pane = FrameworkApplication.DockPaneManager.Find("Planet_Data_DocPane");
            Data_DocPaneViewModel data_DocPaneViewModel = (Data_DocPaneViewModel)pane;

            data_DocPaneViewModel.AOIGeometry = (Geometry)polygone;
            pane.IsVisible = true;
            data_DocPaneViewModel.Activate(true);
        }
        private async Task QueryRows(object query) {
            string where = "";
            if (query != null)
                where = query.ToString();
            IsLoading = true;
            lock (_theLock) {
                ListOfRows.Clear();
            }
            if (_layerSource == null)
                _layerSource = await _selectedLayer.getFeatureClass();
            if (_layerSource != null) {
                var data = new List<DynamicDataRow>();
                await QueuingTaskFactory.StartNew(() => {
                    var queryFilter = new ArcGIS.Core.Data.QueryFilter {
                        WhereClause = where
                    };
                    int maxcols = 6;
                    RowCursor cursor = _layerSource.Search(queryFilter);
                    if (cursor.MoveNext()) {
                        ExtendListView.Columns = new List<ArcGIS.Core.Data.Field>();
                        maxcols = cursor.Current.Fields.Count() > 6 ? 6 : cursor.Current.Fields.Count();

                        for (int c = 0; c < maxcols; c++) {
                            ExtendListView.Columns.Add(cursor.Current.Fields[c]);
                        }
                        do {
                            var row = new DynamicDataRow();
                            for (int v = 0; v < maxcols; v++) {
                                row[GetName(cursor.Fields[v])] = cursor.Current[v].ToString();

                            }
                            data.Add(row);
                        } while (cursor.MoveNext());
                    }
                });

                lock (_theLock) {
                    ListOfRows = null;
                    ListOfRows = data;
                }
            }
            RaisePropertyChanged("ListOfRows");
            Status = string.Format("{0} rows loaded", ListOfRows.Count());
            IsLoading = false;
        }
        private async void OnSelectionChanged(MapSelectionChangedEventArgs obj)
        {
            if (MapView.Active.Map != null && obj.Selection.Count == 1)
            {
                var fl = obj.Selection.FirstOrDefault().Key as FeatureLayer;
                if (fl == null || fl.SelectionCount != 1 || fl.ShapeType != esriGeometryType.esriGeometryPoint)
                    return;

                var pointd = await QueuedTask.Run(() =>
                {
                    try
                    {
                        var SelectedOID = fl.GetSelection().GetObjectIDs().FirstOrDefault();
                        if (SelectedOID < 0)
                            return string.Empty;

                        var SelectedLayer = fl as BasicFeatureLayer;

                        var oidField = SelectedLayer.GetTable().GetDefinition().GetObjectIDField();
                        var qf = new ArcGIS.Core.Data.QueryFilter() { WhereClause = string.Format("{0} = {1}", oidField, SelectedOID) };
                        var cursor = SelectedLayer.Search(qf);
                        Row row = null;

                        if (cursor.MoveNext())
                            row = cursor.Current;

                        if (row == null)
                            return string.Empty;

                        var fields = row.GetFields();
                        lock (_lock)
                        {
                            foreach (ArcGIS.Core.Data.Field field in fields)
                            {
                                if (field.FieldType == FieldType.Geometry)
                                {
                                    // have mappoint here
                                    var val = row[field.Name];
                                    if (val is MapPoint)
                                    {
                                        var temp = val as MapPoint;
                                        // project to WGS1984
                                        proCoordGetter.Point = temp;
                                        proCoordGetter.Project(4326);
                                        return string.Format("{0:0.0####} {1:0.0####}", proCoordGetter.Point.Y, proCoordGetter.Point.X);
                                    }
                                    break;
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                    }

                    return string.Empty;
                });

                if (!string.IsNullOrWhiteSpace(pointd))
                {
                    InputCoordinate = pointd;
                }
            }
        }
Example #15
0
        /// <summary>
        /// Execute a query against the selected layer's feature class and
        /// display the resulting datatable
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        private async Task QueryRows(object query)
        {
            var where = string.Empty;
            if (query != null)
            {
                where = query.ToString();
            }
            IsLoading = true;
            var rowCount = 0;

            // get the features using the query
            if (_selectedLayer != null)
            {
                await QueuedTask.Run(() =>
                {
                    var basicFl = _selectedLayer as BasicFeatureLayer;
                    if (basicFl != null)
                    {
                        Table layerTable = basicFl.GetTable();

                        var dt          = new DataTable();
                        var queryFilter = new ArcGIS.Core.Data.QueryFilter
                        {
                            WhereClause = where
                        };
                        RowCursor cursor;
                        // Use try catch to catch invalid SQL statements in queryFilter
                        try
                        {
                            cursor = layerTable.Search(queryFilter);
                        }
                        catch (GeodatabaseGeneralException gdbEx)
                        {
                            ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show("Error searching data. " + gdbEx.Message,
                                                                             "Search Error", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                            return;
                        }
                        if (cursor.MoveNext())
                        {
                            using (Row currentRow = cursor.Current)
                            {
                                var maxcols = currentRow.GetFields().Count() > 6
                                ? 6
                                : currentRow.GetFields().Count();
                                for (var c = 0; c < maxcols; c++)
                                {
                                    Type colType      = typeof(string);
                                    var format        = string.Empty;
                                    var fldDefinition = currentRow.GetFields()[c];
                                    switch (fldDefinition.FieldType)
                                    {
                                    case FieldType.Blob:
                                        format = "Blob";
                                        break;

                                    case FieldType.Raster:
                                        format = "Raster";
                                        break;

                                    case FieldType.Geometry:
                                        format = "Geom";
                                        break;

                                    case FieldType.Date:
                                        colType = typeof(DateTime);
                                        format  = @"mm/dd/yyyy";
                                        break;

                                    case FieldType.Double:
                                        format = "0,0.0##";
                                        break;

                                    case FieldType.Integer:
                                    case FieldType.OID:
                                    case FieldType.Single:
                                    case FieldType.SmallInteger:
                                        format = "0,0";
                                        break;

                                    case FieldType.GlobalID:
                                    case FieldType.GUID:
                                    case FieldType.String:
                                    case FieldType.XML:
                                    default:
                                        break;
                                    }
                                    var col = new DataColumn(fldDefinition.Name, colType)
                                    {
                                        Caption = fldDefinition.AliasName
                                    };
                                    dt.Columns.Add(col);
                                }
                                do
                                {
                                    var row = dt.NewRow();
                                    rowCount++;
                                    for (var colIdx = 0; colIdx < maxcols; colIdx++)
                                    {
                                        row[colIdx] = currentRow[colIdx];
                                    }
                                    dt.Rows.Add(row);
                                } while (cursor.MoveNext());
                            }
                        }
                        Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                                                                   (Action)(() => UpdateDataTableOnUI(dt)));
                    }
                });
            }
            Status    = string.Format("{0} rows loaded", rowCount);
            IsLoading = false;
        }
        public Task<bool> SelectFeaturesInDxLayers()
        {
            try
            {
                File.Delete(Common.GetConfiguration("DesignTxt"));
            }
            catch { }
            string designNameAndExpressDesignID = SelectedDesign.ToString();
            int firstParen = designNameAndExpressDesignID.IndexOf("(");
            int lastParen = designNameAndExpressDesignID.IndexOf(")");
            int selectedDesign = Convert.ToInt32(designNameAndExpressDesignID.Substring(firstParen + 1, lastParen - firstParen - 1));
            var featuresInDesign = DxCommisionModel.GetFeaturesInDesign(selectedDesign);

            Dictionary<string, int> idsByName = new Dictionary<string, int>();
            foreach (KeyValuePair<int, string> kvp in DxCommisionModel.GetNameByID)
            {
                if (kvp.Value != null && kvp.Key != null)
                {
                    idsByName.Add(kvp.Value, kvp.Key);
                }
            }

            Dictionary<string, string> objectIDsToSelectByLayer = new Dictionary<string, string>();
            foreach (var dxFe in featuresInDesign)
            {
                string className = DxCommisionModel.GetNameByID[dxFe.FeatureClassID];
                if (objectIDsToSelectByLayer.ContainsKey(className) == false)
                {
                    objectIDsToSelectByLayer.Add(className,dxFe.FeatureOID.ToString());
                }
                else
                {
                    objectIDsToSelectByLayer[className] += "," + dxFe.FeatureOID.ToString();
                }
            }

            

            return QueuedTask.Run(() =>
            {
                EnvelopeBuilder envBuilder = new EnvelopeBuilder();
                if (true) { 
                    #region Get Extent from ArcGIS Pro
                StreamWriter sw = File.CreateText(Common.GetConfiguration("DesignTxt"));
                //Determine the extent
                //EnvelopeBuilder envBuilder = new EnvelopeBuilder();
                envBuilder.XMin = 0;
                envBuilder.XMax = 0;
                envBuilder.YMin = 0;
                envBuilder.YMax = 0;
                var env = envBuilder.ToGeometry().Extent;
                List<FeatureLayer> dxLayers = GetDxLayers();

                foreach (var f in dxLayers)
                {
                    try
                    {
                        if (objectIDsToSelectByLayer.ContainsKey(f.Name))
                        {
                            var oids = objectIDsToSelectByLayer[f.Name];
                            if (oids.Count() > 0)
                            {
                                Table table = f.GetTable();
                                sw.WriteLine(f.Name);
                                foreach (string oid in oids.Split(','))
                                {
                                    List<Row> features = null;

                                    features = GetRowListFor(table, new QueryFilter
                                    {
                                        WhereClause = "OBJECTID = " + oid
                                    });
                                    using (var feature = features[0])
                                    {
                                        Geometry shape = feature.GetOriginalValue(feature.FindField("SHAPE")) as Geometry;
                                        Common.UnionEnvelopes(envBuilder, shape);
                                        sw.WriteLine(oid);
 
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception ex) {
                        if (Common.GetConfiguration("DebugMessages") == "True")
                        {
                            MessageBox.Show("ERROR  : " + ex.ToString());
                        }
                    }
                    finally
                    {

                    }
                }
                //Select the features
                //if (Common.GetConfiguration("DebugMessages") == "True")
                //{
                 //   MessageBox.Show("About to close the stream");
                //}
                sw.Close();
                //if (Common.GetConfiguration("DebugMessages") == "True")
                //{
                //MessageBox.Show("closed the stream stream");
                //}
                ArcGIS.Core.Data.QueryFilter qf = new ArcGIS.Core.Data.QueryFilter();
                //if (Common.GetConfiguration("DebugMessages") == "True")
                //{
                //    MessageBox.Show("dx layer count is " + dxLayers.Count);
                //}
                foreach (FeatureLayer fl in dxLayers)
                {
                    if (objectIDsToSelectByLayer.ContainsKey(fl.Name)) 
                    { 
                        qf.WhereClause = "OBJECTID in (" + objectIDsToSelectByLayer[fl.Name] + ")";
                        //if (Common.GetConfiguration("DebugMessages") == "True")
                        //{
                        //    MessageBox.Show("Where clause for " + fl.Name + " : " + qf.WhereClause);
                        //}
                        try
                        {
                            fl.Select(qf, ArcGIS.Desktop.Mapping.SelectionCombinationMethod.New); //New works, add throws error
                        }
                        catch (Exception ex)
                        {
                            //MessageBox.Show("Selection Error " + ex.ToString());
                        }
                    }
                }
                //Zoom to it
                //if (Common.GetConfiguration("DebugMessages") == "True")
                //{
                //    MessageBox.Show("About to zoom");
                //}

                #endregion
                }
                else
                {
                    //Get from ArcObjects
                }


                Map activeMap = MapView.Active.Map;
                var extent = envBuilder.ToGeometry().Extent;
                var expandedExtent = extent.Expand(1.2, 1.2, true);
                MapView.Active.ZoomTo(expandedExtent);
                
                return true;
            });
            
            //return Task.FromResult(true);
        }
        private async void OnSelectionChanged(MapSelectionChangedEventArgs obj)
        {
            if (MapView.Active.Map != null && obj.Selection.Count == 1)
            {
                var fl = obj.Selection.FirstOrDefault().Key as FeatureLayer;
                if (fl == null || fl.SelectionCount != 1 || fl.ShapeType != esriGeometryType.esriGeometryPoint)
                {
                    return;
                }

                var pointd = await QueuedTask.Run(() =>
                {
                    try
                    {
                        var SelectedOID = fl.GetSelection().GetObjectIDs().FirstOrDefault();
                        if (SelectedOID < 0)
                        {
                            return(string.Empty);
                        }

                        var SelectedLayer = fl as BasicFeatureLayer;

                        var oidField = SelectedLayer.GetTable().GetDefinition().GetObjectIDField();
                        var qf       = new ArcGIS.Core.Data.QueryFilter()
                        {
                            WhereClause = string.Format("{0} = {1}", oidField, SelectedOID)
                        };
                        var cursor = SelectedLayer.Search(qf);
                        Row row    = null;

                        if (cursor.MoveNext())
                        {
                            row = cursor.Current;
                        }

                        if (row == null)
                        {
                            return(string.Empty);
                        }

                        var fields = row.GetFields();
                        lock (_lock)
                        {
                            foreach (ArcGIS.Core.Data.Field field in fields)
                            {
                                if (field.FieldType == FieldType.Geometry)
                                {
                                    // have mappoint here
                                    var val = row[field.Name];
                                    if (val is MapPoint)
                                    {
                                        var temp = val as MapPoint;
                                        // project to WGS1984
                                        proCoordGetter.Point = temp;
                                        proCoordGetter.Project(4326);
                                        return(string.Format("{0:0.0####} {1:0.0####}", proCoordGetter.Point.Y, proCoordGetter.Point.X));
                                    }
                                    break;
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                    }

                    return(string.Empty);
                });

                if (!string.IsNullOrWhiteSpace(pointd))
                {
                    InputCoordinate = pointd;
                }
            }
        }
        public  Task<bool>  SelectFeaturesAsync(object obj)
        {
            string designNameAndExpressDesignID = SelectedDesign.ToString();
            int firstParen = designNameAndExpressDesignID.IndexOf("(");
            int lastParen = designNameAndExpressDesignID.IndexOf(")");
            int selectedDesign = Convert.ToInt32(designNameAndExpressDesignID.Substring(firstParen + 1, lastParen - firstParen - 1));

            //int selectedDesign = Convert.ToInt32( SelectedDesign);
            var featuresInDesign =  DxCommisionModel.GetFeaturesInDesign(selectedDesign);
            List<FeatureLayer> dxLayers = Common.GetDxLayers();

            Dictionary<string, int> idsByName = new Dictionary<string, int>();
            foreach (KeyValuePair<int, string> kvp in DxCommisionModel.GetNameByID)
            {
                if (kvp.Value != null && kvp.Key != null)
                {
                    idsByName.Add(kvp.Value, kvp.Key);
                }
            }
            try
            {
                QueuedTask.Run(() =>
                {
                    ArcGIS.Core.Data.QueryFilter qf = new ArcGIS.Core.Data.QueryFilter();
                    foreach (FeatureLayer fl in dxLayers)
                    {
                        string name = fl.Name;
                        int idToLookFor = idsByName[name];
                        // DxCommisionModel.GetNameByID(1);
                        foreach (var feInDesign in featuresInDesign)
                        {
                            if (feInDesign.FeatureClassID == idToLookFor ) 
                            {
                                string name2 = name;
                                int feClassID = feInDesign.FeatureClassID;
                                qf.WhereClause = "OBJECTID = " + feInDesign.FeatureOID;
                                var selection = fl.Select(qf, ArcGIS.Desktop.Mapping.SelectionCombinationMethod.Add);

                            }
                        }
                    }
                    return true;
                });
            }
            catch (Exception ex)
            {
                System.Diagnostics.Trace.WriteLine(ex.ToString());
            }
            return Task.FromResult(true);
        }
        /// <summary>
        /// Called when the sketch is finished.
        /// </summary>
        protected override async Task <bool> OnSketchCompleteAsync(ArcGIS.Core.Geometry.Geometry geometry)
        {
            //Get the instance of the ViewModel from the dock pane
            var featureSelVM = Module1.FeatureSelectionVM;

            if (featureSelVM == null || featureSelVM.SelectedLayer == null)
            {
                return(true);
            }

            return(await QueuedTask.Run(() =>
            {
                //Return all the features that intersect the sketch geometry
                var result = MapView.Active.GetFeatures(geometry);
                var layerSelection = result.FirstOrDefault(kvp => kvp.Key == featureSelVM.SelectedLayer);

                //Clear the selection if no features where returned
                if (!result.ContainsKey(featureSelVM.SelectedLayer))
                {
                    featureSelVM.SelectedLayer.Select(null, SelectionCombinationMethod.Subtract);
                    return true;
                }

                //Construct a query filter using the OIDs of the features that intersected the sketch geometry
                var oidList = result[featureSelVM.SelectedLayer];
                var oid = featureSelVM.SelectedLayer.GetTable().GetDefinition().GetObjectIDField();
                var qf = new ArcGIS.Core.Data.QueryFilter()
                {
                    WhereClause = string.Format("({0} in ({1}))", oid, string.Join(",", oidList))
                };

                //Add to the clause using the where clause specified in the dock pane.
                if (featureSelVM.WhereClause != "" && featureSelVM.WhereClause != null)
                {
                    qf.WhereClause += string.Format(" AND ({0})", featureSelVM.WhereClause);
                }

                //Return if the expression is not valid.
                if (!featureSelVM.ValidateExpresion(false))
                {
                    return true;
                }

                //Change the method depending on the hot keys that are pressed.
                var method = SelectionCombinationMethod.New;
                if (_ctrlPressed && _shiftPressed)
                {
                    method = SelectionCombinationMethod.And;
                }
                else if (_ctrlPressed)
                {
                    method = SelectionCombinationMethod.Subtract;
                }
                else if (_shiftPressed)
                {
                    method = SelectionCombinationMethod.Add;
                }

                try
                {
                    //Create the new selection
                    featureSelVM.SelectedLayer.Select(qf, method);
                }
                catch (Exception) {} //May occur if expression validates but is still invalid expression.
                return true;
            }));
        }
        private async Task QueryRows(object query)
        {
            string where = "";
            if (query != null)
                where = query.ToString();
            IsLoading = true;
            lock (_theLock)
            {
                ListOfRows.Clear();
            }
            if (_layerSource == null)
                _layerSource = await _selectedLayer.getFeatureClass();
            if (_layerSource != null)
            {
                var data = new List<DynamicDataRow>();
                await QueuedTask.Run(() =>
                {
                    var queryFilter = new ArcGIS.Core.Data.QueryFilter
                    {
                        WhereClause = where
                    };
                    int maxcols = 6;

                    RowCursor cursor = null;

                    // Use try catch to catch invalid SQL statements in queryFilter
                    try
                    {
                        cursor = _layerSource.Search(queryFilter);
                    }
                    catch (GeodatabaseGeneralException gdbEx)
                    {
                        System.Windows.MessageBox.Show("Error searching data. " + gdbEx.Message, "Search Error", 
                                                    System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Exclamation);
                        return;
                    }

                    if (cursor.MoveNext())
                    {
                        ExtendListView.Columns = new List<ArcGIS.Core.Data.Field>();
                        maxcols = cursor.Current.GetFields().Count() > 6 ? 6 : cursor.Current.GetFields().Count();

                        for (int c = 0; c < maxcols; c++)
                        {
                            ExtendListView.Columns.Add(cursor.Current.GetFields()[c]);
                        }
                        do
                        {
                            var row = new DynamicDataRow();
                            for (int v = 0; v < maxcols; v++)
                            {
                                if (cursor.Current[v] != null)
                                { 
                                    row[GetName(cursor.GetFields()[v])] = cursor.Current[v].ToString();
                                }

                            }
                            data.Add(row);
                        } while (cursor.MoveNext());
                    }
                });

                lock (_theLock)
                {
                    ListOfRows = null;
                    ListOfRows = data;
                }
            }
            RaisePropertyChanged("ListOfRows");
            Status = string.Format("{0} rows loaded", ListOfRows.Count());
            IsLoading = false;
        }