Exemplo n.º 1
0
        /// <summary>
        /// This model class validates the selected features in a map.
        /// </summary>
        /// <param name="map">The map to validate</param>
        /// <returns></returns>
        public static Task <string> ValidateMap(Map map)
        {
            return(QueuedTask.Run <string>(() =>
            {
                StringBuilder validationStringBuilder = new StringBuilder();

                // Get the selection from the map

                Dictionary <MapMember, List <long> > mapMembersWithSelection = map.GetSelection();

                // Step through each MapMember (FeatureLayer or StandaloneTable) that contains selected features

                foreach (KeyValuePair <MapMember, List <long> > dictionaryItem in mapMembersWithSelection)
                {
                    if (dictionaryItem.Key is FeatureLayer)
                    {
                        FeatureLayer featureLayer = dictionaryItem.Key as FeatureLayer;
                        using (Table table = featureLayer.GetTable())
                        {
                            validationStringBuilder.Append(ValidateTable(table, featureLayer.GetSelection()));
                        }
                    }
                    else if (dictionaryItem.Key is StandaloneTable)
                    {
                        StandaloneTable standaloneTable = dictionaryItem.Key as StandaloneTable;
                        using (Table table = standaloneTable.GetTable())
                        {
                            validationStringBuilder.Append(ValidateTable(table, standaloneTable.GetSelection()));
                        }
                    }
                }
                return validationStringBuilder.ToString();
            }));
        }
Exemplo n.º 2
0
        public async void AddNewRoute(string routeName)
        {
            var map = MapView.Active.Map;

            if (!BuildOnSelect && SegmentsLayer.SelectionCount == 0)
            {
                MessageBox.Show("At least one segment must be selected!");
                return;
            }

            await QueuedTask.Run(async() =>
            {
                using (var routesTable = RoutesStandaloneTable.GetTable())
                    using (var routeToHeadsTable = RouteToTrailheadsTable.GetTable())
                        using (var routeToSegmentsTable = RouteToTrailSegmentsTable.GetTable())
                            using (var routeBuf = routesTable.CreateRowBuffer())
                                using (var tempSegsFeatureClass = TempSegmentsLayer.GetFeatureClass())
                                {
                                    var namesFilter = new QueryFilter()
                                    {
                                        WhereClause = $"Upper({RouteName}) = '{routeName.ToUpper().Replace("'", "''")}'"
                                    };
                                    using (var namesCursor = RoutesStandaloneTable.Search(namesFilter))
                                    {
                                        if (namesCursor.MoveNext())
                                        {
                                            MessageBox.Show($"There is already a route named: {routeName}!");
                                            return;
                                        }
                                    }

                                    var operation  = new EditOperation();
                                    operation.Name = "Create new trails route: " + routeName;

                                    await EnsureIDsForSelectedAsync(operation);
                                    await operation.ExecuteAsync();

                                    if (!operation.IsSucceeded)
                                    {
                                        MessageBox.Show(operation.ErrorMessage);
                                        return;
                                    }

                                    var operation2 = operation.CreateChainedOperation();

                                    operation2.Callback(context =>
                                    {
                                        // create route row
                                        routeBuf[RouteName] = routeName;
                                        routeBuf[RouteID]   = $"{{{Guid.NewGuid()}}}";
                                        using (var routeRow = routesTable.CreateRow(routeBuf))
                                            using (var headsCursor = HeadsLayer.GetSelection().Search(null, false))
                                                using (var segmentCursor = SegmentsLayer.GetSelection().Search((QueryFilter)null, false))
                                                {
                                                    var segments = new List <string>();
                                                    var parts    = new Dictionary <int, List <Polyline> >();
                                                    if (BuildOnSelect)
                                                    {
                                                        // get segments from TempSegments layer
                                                        bool atLeastOne = false;
                                                        using (var tempSegsCursor = tempSegsFeatureClass.Search(null, false))
                                                        {
                                                            while (tempSegsCursor.MoveNext())
                                                            {
                                                                atLeastOne = true;
                                                                var row    = tempSegsCursor.Current;

                                                                var partNum = int.Parse(row[RoutePart].ToString());
                                                                var segID   = (string)row[USNG_SEG];
                                                                CreateRoutePart(segID, (string)routeRow[RouteID], partNum, context, routeToSegmentsTable);

                                                                segments.Add(segID);

                                                                var geometry = (Polyline)row["SHAPE"];
                                                                if (parts.ContainsKey(partNum))
                                                                {
                                                                    parts[partNum].Add(geometry);
                                                                }
                                                                else
                                                                {
                                                                    parts[partNum] = new List <Polyline>()
                                                                    {
                                                                        geometry
                                                                    };
                                                                }
                                                            }
                                                            Reset();
                                                            tempSegsFeatureClass.DeleteRows(new QueryFilter());
                                                            context.Invalidate(tempSegsFeatureClass);
                                                        }

                                                        if (!atLeastOne)
                                                        {
                                                            context.Abort("There must be at least one feature in TempSegments!");
                                                        }
                                                    }
                                                    else
                                                    {
                                                        //get segments from selected features
                                                        while (segmentCursor.MoveNext())
                                                        {
                                                            var segRow = segmentCursor.Current;

                                                            var segID         = (string)segRow[USNG_SEG];
                                                            const int partNum = 1;
                                                            CreateRoutePart(segID, routeRow[RouteID], partNum, context, routeToSegmentsTable);

                                                            segments.Add(segID);

                                                            var geometry = (Polyline)segRow["SHAPE"];
                                                            if (parts.ContainsKey(partNum))
                                                            {
                                                                parts[partNum].Add(geometry);
                                                            }
                                                            else
                                                            {
                                                                parts[partNum] = new List <Polyline>()
                                                                {
                                                                    geometry
                                                                };
                                                            }
                                                        }
                                                    }

                                                    if (segments.Count > 1 && !ValidateConnectivity(parts))
                                                    {
                                                        context.Abort("Not all segments are connected!");
                                                        return;
                                                    }

                                                    // trailhead
                                                    if (HeadsLayer.SelectionCount > 0)
                                                    {
                                                        while (headsCursor.MoveNext())
                                                        {
                                                            using (var headBuffer = routeToHeadsTable.CreateRowBuffer())
                                                            {
                                                                headBuffer[RouteID] = (string)routeRow[RouteID];
                                                                headBuffer[USNG_TH] = headsCursor.Current[USNG_TH];

                                                                using (var headRow = routeToHeadsTable.CreateRow(headBuffer))
                                                                {
                                                                    context.Invalidate(headRow);
                                                                }
                                                            }
                                                        }
                                                    }

                                                    context.Invalidate(routeRow);
                                                }
                                    }, routesTable, routeToSegmentsTable, routeToHeadsTable, tempSegsFeatureClass);

                                    await operation2.ExecuteAsync();
                                    if (operation2.IsSucceeded)
                                    {
                                        FrameworkApplication.AddNotification(new Notification
                                        {
                                            Title    = FrameworkApplication.Title,
                                            Message  = $"Route: \"{routeName}\" added successfully!",
                                            ImageUrl = "pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericCheckMark32.png"
                                        });

                                        SegmentsLayer.ClearSelection();
                                        HeadsLayer.ClearSelection();
                                    }
                                    else
                                    {
                                        MessageBox.Show(operation2.ErrorMessage);
                                    }
                                }
            });
        }