/// <summary> /// This method will /// 1. Make sure if a Feature Layer is selected. /// 2. The Workspace is not null /// 3. Make sure that the workspace is an Enterprise SQL Server Geodatabase Workspace /// /// and then create a new version (In a Queued Task) /// and Connect to the newly created version and delete all the features for the selected subtype (In a separate QueuedTask) /// </summary> /// <param name="item">The newly selected combo box item</param> protected override async void OnSelectionChange(ComboBoxItem item) { if (item == null) { return; } if (string.IsNullOrEmpty(item.Text)) { return; } Layer layer = MapView.Active.GetSelectedLayers()[0]; FeatureLayer featureLayer = null; if (layer is FeatureLayer) { featureLayer = layer as FeatureLayer; Geodatabase geodatabase = null; await QueuedTask.Run(() => geodatabase = (featureLayer.GetTable().GetDatastore() as Geodatabase)); using (geodatabase) { if (geodatabase == null) { return; } } } else { return; } EnterpriseDatabaseType enterpriseDatabaseType = EnterpriseDatabaseType.Unknown; await QueuedTask.Run(() => { using (Table table = (MapView.Active.GetSelectedLayers()[0] as FeatureLayer).GetTable()) { try { enterpriseDatabaseType = (table.GetDatastore() as Geodatabase).GetEnterpriseDatabaseType(); } catch (InvalidOperationException e) { } } }); if (enterpriseDatabaseType != EnterpriseDatabaseType.SQLServer) { Enabled = false; return; } string versionName = String.Empty; await QueuedTask.Run(async() => { using (Table table = featureLayer.GetTable()) { versionName = await CreateVersion(table); } }); if (versionName == null) { return; } await QueuedTask.Run(async() => { using (Table table = featureLayer.GetTable()) { if (table.GetRegistrationType().Equals(RegistrationType.Nonversioned)) { return; } } }); QueuedTask.Run(async() => { using (Table table = featureLayer.GetTable()) { string subtypeField = table.GetDefinition().GetSubtypeField(); int code = table.GetDefinition().GetSubtypes().First(subtype => subtype.GetName().Equals(item.Text)).GetCode(); QueryFilter queryFilter = new QueryFilter { WhereClause = string.Format("{0} = {1}", subtypeField, code) }; try { VersionManager versionManager = (table.GetDatastore() as Geodatabase).GetVersionManager(); Version newVersion = versionManager.GetVersions().First(version => version.GetName().Contains(versionName)); Geodatabase newVersionGeodatabase = newVersion.Connect(); using (Table newVersionTable = newVersionGeodatabase.OpenDataset <Table>(table.GetName())) { using (var rowCursor = newVersionTable.Search(queryFilter, false)) { EditOperation editOperation = new EditOperation { EditOperationType = EditOperationType.Long, Name = "Delete Based On Subtype" }; editOperation.Callback(context => { while (rowCursor.MoveNext()) { using (Row row = rowCursor.Current) { context.Invalidate(row); row.Delete(); } } }, newVersionTable); bool result = await editOperation.ExecuteAsync(); if (!result) { MessageBox.Show(String.Format("Could not delete features for subtype {0} : {1}", item.Text, editOperation.ErrorMessage)); } await Project.Current.SaveEditsAsync(); } } } catch (Exception e) { Console.WriteLine(e); } } }); }
/// <summary> /// This method will /// 1. Make sure if a Feature Layer is selected. /// 2. The Workspace is not null /// 3. Make sure that the workspace is an Enterprise SQL Server Geodatabase Workspace /// /// and then create a new version (In a Queued Task) /// and Connect to the newly created version and delete all the features for the selected subtype (In a separate QueuedTask) /// </summary> /// <param name="item">The newly selected combo box item</param> protected override async void OnSelectionChange(ComboBoxItem item) { await QueuedTask.Run(async() => { if (item == null) { return; } if (string.IsNullOrEmpty(item.Text)) { return; } Layer layer = MapView.Active.GetSelectedLayers()[0]; if (layer is FeatureLayer featureLayer) { using (Geodatabase geodatabase = featureLayer.GetTable().GetDatastore() as Geodatabase) using (Table table = featureLayer.GetTable()) { if (geodatabase == null) { return; } EnterpriseDatabaseType enterpriseDatabaseType = ((DatabaseConnectionProperties)geodatabase.GetConnector()).DBMS; if (enterpriseDatabaseType != EnterpriseDatabaseType.SQLServer) { Enabled = false; return; } if (table.GetRegistrationType().Equals(RegistrationType.Nonversioned)) { return; } using (Version newVersion = await CreateVersionAsync(table)) using (Geodatabase newVersionGeodatabase = newVersion.Connect()) using (Table newVersionTable = newVersionGeodatabase.OpenDataset <Table>(table.GetName())) { string subtypeField = table.GetDefinition().GetSubtypeField(); int code = table.GetDefinition().GetSubtypes().First(subtype => subtype.GetName().Equals(item.Text)).GetCode(); QueryFilter queryFilter = new QueryFilter { WhereClause = string.Format("{0}={1}", subtypeField, code) }; using (var rowCursor = newVersionTable.Search(queryFilter, false)) { EditOperation editOperation = new EditOperation { EditOperationType = EditOperationType.Long, Name = "Delete Based On Subtype" }; editOperation.Callback(context => { while (rowCursor.MoveNext()) { using (Row row = rowCursor.Current) { context.Invalidate(row); row.Delete(); } } }, newVersionTable); bool result = await editOperation.ExecuteAsync(); if (!result) { MessageBox.Show(String.Format("Could not delete features for subtype {0} : {1}", item.Text, editOperation.ErrorMessage)); } await Project.Current.SaveEditsAsync(); } } } } }); }
private string ValidateChangedFeatures(Layer layer) { StringBuilder resultString = new StringBuilder(); // Get utility network and geodatabase using (UtilityNetwork utilityNetwork = UtilityNetworkUtils.GetUtilityNetworkFromLayer(layer)) using (Geodatabase geodatabase = utilityNetwork.GetDatastore() as Geodatabase) { // Determine what to validate // File geodatabase - validate everything, synchronously // Default version - validate everything, asynchronously // Branch version - validate changes only, synchronously bool shouldValidateEverything; bool runAsync; if (!geodatabase.IsVersioningSupported()) { shouldValidateEverything = true; runAsync = false; } else { using (VersionManager versionManager = geodatabase.GetVersionManager()) using (Version currentVersion = versionManager.GetCurrentVersion()) { if (IsDefaultVersion(currentVersion)) { shouldValidateEverything = true; runAsync = true; } else { shouldValidateEverything = false; runAsync = false; } } } // If we validating everything, get an envelope from the dirty areas table EnvelopeBuilderEx envelopeBuilder = new EnvelopeBuilderEx(layer.GetSpatialReference()); if (shouldValidateEverything) { using (Table dirtyAreaTable = utilityNetwork.GetSystemTable(SystemTableType.DirtyAreas)) using (RowCursor rowCursor = dirtyAreaTable.Search()) { envelopeBuilder = GetExtentFromRowCursor(envelopeBuilder, rowCursor); } } // else get an envelope using version differences else { using (VersionManager versionManager = geodatabase.GetVersionManager()) using (Version currentVersion = versionManager.GetCurrentVersion()) using (Version defaultVersion = currentVersion.GetParent()) using (Geodatabase defaultGeodatabase = defaultVersion.Connect()) using (UtilityNetwork defaultUtilityNetwork = defaultGeodatabase.OpenDataset <UtilityNetwork>(utilityNetwork.GetName())) using (Table dirtyAreaTable = utilityNetwork.GetSystemTable(SystemTableType.DirtyAreas)) using (Table defaultDirtyAreaTable = defaultUtilityNetwork.GetSystemTable(SystemTableType.DirtyAreas)) using (DifferenceCursor inserts = dirtyAreaTable.Differences(defaultDirtyAreaTable, DifferenceType.Insert)) { envelopeBuilder = GetExtentFromDifferenceCursor(envelopeBuilder, inserts); } } // Run validate topology on our envelope Envelope extent = envelopeBuilder.ToGeometry(); ValidationResult result = utilityNetwork.ValidateNetworkTopologyInEditOperation(extent, runAsync ? ServiceSynchronizationType.Asynchronous : ServiceSynchronizationType.Synchronous); if (result.HasErrors) { resultString.AppendLine("Errors found."); } else { resultString.AppendLine("No errors found."); } } return(resultString.ToString()); }