/// <summary> /// Method to handle the display coordinate type change /// Need to update the list boxes /// </summary> /// <param name="obj">null, not used</param> internal virtual void OnDisplayCoordinateTypeChanged(object obj) { var list = ObserverAddInPoints.ToList(); var inExtentList = ObserverInExtentPoints.ToList(); var outExtentList = ObserverOutExtentPoints.ToList(); ObserverAddInPoints.Clear(); ObserverInExtentPoints.Clear(); ObserverOutExtentPoints.Clear(); foreach (var item in list) { ObserverAddInPoints.Add(item); } foreach (var item in inExtentList) { ObserverInExtentPoints.Add(item); } foreach (var item in outExtentList) { ObserverOutExtentPoints.Add(item); } RaisePropertyChanged(() => HasMapGraphics); }
/// <summary> /// Override to add aditional items in the class to reset tool /// </summary> /// <param name="toolReset"></param> internal override async Task Reset(bool toolReset) { try { await base.Reset(toolReset); if (MapView.Active == null || MapView.Active.Map == null) { return; } // reset surface names OC await ResetSurfaceNames(); Application.Current.Dispatcher.Invoke(() => { // reset observer points ObserverAddInPoints.Clear(); ObserverInExtentPoints.Clear(); ObserverOutExtentPoints.Clear(); ClearTempGraphics(); }); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); } }
/// <summary> /// Override to add aditional items in the class to reset tool /// </summary> /// <param name="toolReset"></param> internal override void Reset(bool toolReset) { base.Reset(toolReset); if (ArcMap.Document == null || ArcMap.Document.FocusMap == null) { return; } // reset surface names OC ResetSurfaceNames(ArcMap.Document.FocusMap); // reset observer points ObserverAddInPoints.Clear(); ObserverInExtentPoints.Clear(); ObserverOutExtentPoints.Clear(); ClearTempGraphics(); }
private async Task <bool> ExecuteVisibilityLLOS() { bool success = false; try { // Check surface spatial reference var surfaceSR = await GetSpatialReferenceFromLayer(SelectedSurfaceName); if (surfaceSR == null || !surfaceSR.IsProjected) { MessageBox.Show(VisibilityLibrary.Properties.Resources.RLOSUserPrompt, VisibilityLibrary.Properties.Resources.RLOSUserPromptCaption); Application.Current.Dispatcher.Invoke(() => { TargetAddInPoints.Clear(); ObserverAddInPoints.Clear(); ObserverInExtentPoints.Clear(); TargetInExtentPoints.Clear(); ObserverOutExtentPoints.Clear(); TargetOutExtentPoints.Clear(); ClearTempGraphics(); }); await Reset(true); return(false); } if (string.IsNullOrEmpty(SelectedSurfaceName)) { MessageBox.Show(VisibilityLibrary.Properties.Resources.MsgSurfaceLayerNotFound, VisibilityLibrary.Properties.Resources.CaptionError, MessageBoxButton.OK); return(true); } //Validate Dataframe Spatial reference with surface spatial reference IsElevationSurfaceValid = ValidateElevationSurface(MapView.Active.Map, SelectedSurfaceName); if (!await IsElevationSurfaceValid) { ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show(VisibilityLibrary.Properties.Resources.LOSDataFrameMatch, VisibilityLibrary.Properties.Resources.LOSSpatialReferenceCaption); SetErrorTemplate(false); return(true); } else { SetErrorTemplate(true); } var observerPoints = new ObservableCollection <AddInPoint>(LLOS_ObserversInExtent.Select(x => x.AddInPoint).Union(ObserverInExtentPoints)); var targetPoints = new ObservableCollection <AddInPoint>(LLOS_TargetsInExtent.Select(x => x.AddInPoint).Union(TargetInExtentPoints)); // Warn if Image Service layer Layer surfaceLayer = GetLayerFromMapByName(SelectedSurfaceName); if (surfaceLayer is ImageServiceLayer) { MessageBoxResult mbr = MessageBox.Show(VisibilityLibrary.Properties.Resources.MsgLayerIsImageService, VisibilityLibrary.Properties.Resources.CaptionLayerIsImageService, MessageBoxButton.YesNo); if (mbr == MessageBoxResult.No) { System.Windows.MessageBox.Show(VisibilityLibrary.Properties.Resources.MsgTryAgain, VisibilityLibrary.Properties.Resources.MsgCalcCancelled); return(false); } } await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => { using (Geodatabase geodatabase = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(CoreModule.CurrentProject.DefaultGeodatabasePath)))) { executionCounter = 0; int featureDataSetSuffix = 0; var enterpriseDefinitionNames = geodatabase.GetDefinitions <FeatureDatasetDefinition>().Where(i => i.GetName().StartsWith(VisibilityLibrary.Properties.Resources.LLOSFeatureDatasetName)).Select(i => i.GetName()).ToList(); foreach (var defName in enterpriseDefinitionNames) { int n; bool isNumeric = int.TryParse(Regex.Match(defName, @"\d+$").Value, out n); if (isNumeric) { featureDataSetSuffix = featureDataSetSuffix < n ? n : featureDataSetSuffix; } } featureDataSetSuffix = enterpriseDefinitionNames.Count > 0 ? featureDataSetSuffix + 1 : 0; var observerLyrSuffix = GetLayerSuffix(VisibilityLibrary.Properties.Resources.LLOSObserversLayerName, geodatabase); var targetLyrSuffix = GetLayerSuffix(VisibilityLibrary.Properties.Resources.LLOSTargetsLayerName, geodatabase); var sightLinesLyrSuffix = GetLayerSuffix(VisibilityLibrary.Properties.Resources.LLOSSightLinesLayerName, geodatabase); var outputLyrSuffix = GetLayerSuffix(VisibilityLibrary.Properties.Resources.LLOSOutputLayerName, geodatabase); executionCounter = new List <int> { featureDataSetSuffix, observerLyrSuffix, targetLyrSuffix, sightLinesLyrSuffix, outputLyrSuffix }.Max(); } }); //Create Feature dataset success = await FeatureClassHelper.CreateFeatureDataset(FeatureDatasetName); if (!success) { return(false); } success = await FeatureClassHelper.CreateLayer(FeatureDatasetName, ObserversLayerName, "POINT", true, true); if (!success) { return(false); } // add fields for observer offset await FeatureClassHelper.AddFieldToLayer(ObserversLayerName, VisibilityLibrary.Properties.Resources.OffsetFieldName, "DOUBLE"); await FeatureClassHelper.AddFieldToLayer(ObserversLayerName, VisibilityLibrary.Properties.Resources.OffsetWithZFieldName, "DOUBLE"); await FeatureClassHelper.AddFieldToLayer(ObserversLayerName, VisibilityLibrary.Properties.Resources.TarIsVisFieldName, "SHORT"); success = await FeatureClassHelper.CreateLayer(FeatureDatasetName, TargetsLayerName, "POINT", true, true); if (!success) { return(false); } // add fields for target offset await FeatureClassHelper.AddFieldToLayer(TargetsLayerName, VisibilityLibrary.Properties.Resources.OffsetFieldName, "DOUBLE"); await FeatureClassHelper.AddFieldToLayer(TargetsLayerName, VisibilityLibrary.Properties.Resources.OffsetWithZFieldName, "DOUBLE"); await FeatureClassHelper.AddFieldToLayer(TargetsLayerName, VisibilityLibrary.Properties.Resources.NumOfObserversFieldName, "SHORT"); // add observer points to feature layer await FeatureClassHelper.CreatingFeatures(ObserversLayerName, observerPoints, GetAsMapZUnits(surfaceSR, ObserverOffset.Value)); // add target points to feature layer await FeatureClassHelper.CreatingFeatures(TargetsLayerName, targetPoints, GetAsMapZUnits(surfaceSR, TargetOffset.Value)); // update with surface information success = await FeatureClassHelper.AddSurfaceInformation(ObserversLayerName, SelectedSurfaceName, VisibilityLibrary.Properties.Resources.ZFieldName); if (!success) { return(false); } success = await FeatureClassHelper.AddSurfaceInformation(TargetsLayerName, SelectedSurfaceName, VisibilityLibrary.Properties.Resources.ZFieldName); if (!success) { return(false); } await FeatureClassHelper.UpdateShapeWithZ(ObserversLayerName, VisibilityLibrary.Properties.Resources.ZFieldName, GetAsMapZUnits(surfaceSR, ObserverOffset.Value)); await FeatureClassHelper.UpdateShapeWithZ(TargetsLayerName, VisibilityLibrary.Properties.Resources.ZFieldName, GetAsMapZUnits(surfaceSR, TargetOffset.Value)); // create sight lines GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); success = await FeatureClassHelper.CreateSightLines(ObserversLayerName, TargetsLayerName, CoreModule.CurrentProject.DefaultGeodatabasePath + System.IO.Path.DirectorySeparatorChar + FeatureDatasetName + System.IO.Path.DirectorySeparatorChar + SightLinesLayerName, VisibilityLibrary.Properties.Resources.OffsetWithZFieldName, VisibilityLibrary.Properties.Resources.OffsetWithZFieldName); if (!success) { return(false); } // LOS GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); success = await FeatureClassHelper.CreateLOS(SelectedSurfaceName, CoreModule.CurrentProject.DefaultGeodatabasePath + System.IO.Path.DirectorySeparatorChar + FeatureDatasetName + System.IO.Path.DirectorySeparatorChar + SightLinesLayerName, CoreModule.CurrentProject.DefaultGeodatabasePath + System.IO.Path.DirectorySeparatorChar + FeatureDatasetName + System.IO.Path.DirectorySeparatorChar + OutputLayerName); if (!success) { return(false); } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); // join fields with sight lines await FeatureClassHelper.JoinField(CoreModule.CurrentProject.DefaultGeodatabasePath + System.IO.Path.DirectorySeparatorChar + FeatureDatasetName + System.IO.Path.DirectorySeparatorChar + SightLinesLayerName, "OID", CoreModule.CurrentProject.DefaultGeodatabasePath + System.IO.Path.DirectorySeparatorChar + FeatureDatasetName + System.IO.Path.DirectorySeparatorChar + OutputLayerName, "SourceOID", new string[] { "TarIsVis" }); // gather results for updating observer and target layers var sourceOIDs = await FeatureClassHelper.GetSourceOIDs(OutputLayerName); //if (sourceOIDs.Count > 0) //{ var visStats = await FeatureClassHelper.GetVisibilityStats(sourceOIDs, SightLinesLayerName); await FeatureClassHelper.UpdateLayersWithVisibilityStats(visStats, ObserversLayerName, TargetsLayerName); //} var observersLayer = GetLayerFromMapByName(ObserversLayerName) as FeatureLayer; var targetsLayer = GetLayerFromMapByName(TargetsLayerName) as FeatureLayer; var sightLinesLayer = GetLayerFromMapByName(SightLinesLayerName) as FeatureLayer; var outputLayer = GetLayerFromMapByName(OutputLayerName) as FeatureLayer; var observerOutOfExtent = new ObservableCollection <AddInPoint>(LLOS_ObserversOutOfExtent.Select(x => x.AddInPoint).Union(ObserverOutExtentPoints)); // add observer points present out of extent to feature layer await FeatureClassHelper.CreatingFeatures(ObserversLayerName, observerOutOfExtent, GetAsMapZUnits(surfaceSR, TargetOffset.Value), VisibilityLibrary.Properties.Resources.TarIsVisFieldName); var targetOutOfExtent = new ObservableCollection <AddInPoint>(LLOS_TargetsOutOfExtent.Select(x => x.AddInPoint).Union(TargetOutExtentPoints)); // add target points present out of extent to feature layer await FeatureClassHelper.CreatingFeatures(TargetsLayerName, targetOutOfExtent, GetAsMapZUnits(surfaceSR, TargetOffset.Value), VisibilityLibrary.Properties.Resources.NumOfObserversFieldName); if (observersLayer != null && targetsLayer != null && sightLinesLayer != null && outputLayer != null) { await FeatureClassHelper.CreateObserversRenderer(GetLayerFromMapByName(ObserversLayerName) as FeatureLayer); await FeatureClassHelper.CreateTargetsRenderer(GetLayerFromMapByName(TargetsLayerName) as FeatureLayer); await FeatureClassHelper.CreateTargetLayerLabels(GetLayerFromMapByName(TargetsLayerName) as FeatureLayer); await FeatureClassHelper.CreateVisCodeRenderer(GetLayerFromMapByName(SightLinesLayerName) as FeatureLayer, VisibilityLibrary.Properties.Resources.TarIsVisFieldName, 1, 0, ColorFactory.Instance.WhiteRGB, ColorFactory.Instance.BlackRGB, 6.0, 6.0); await FeatureClassHelper.CreateVisCodeRenderer(GetLayerFromMapByName(OutputLayerName) as FeatureLayer, VisibilityLibrary.Properties.Resources.VisCodeFieldName, 1, 2, ColorFactory.Instance.GreenRGB, ColorFactory.Instance.RedRGB, 5.0, 3.0); //await Reset(true); //string groupName = "LLOS Group"; //if (executionCounter > 0) // groupName = string.Format("{0}_{1}", groupName, executionCounter.ToString()); //await FeatureClassHelper.CreateGroupLayer(layerList, groupName); // for now we are not resetting after a run of the tool //await Reset(true); List <Layer> lyrList = new List <Layer>(); lyrList.Add(observersLayer); lyrList.Add(targetsLayer); lyrList.Add(outputLayer); lyrList.Add(sightLinesLayer); await FeatureClassHelper.MoveLayersToGroupLayer(lyrList, FeatureDatasetName); var envelope = await QueuedTask.Run(() => outputLayer.QueryExtent()); await ZoomToExtent(envelope); var surfaceEnvelope = await GetSurfaceEnvelope(); await DisplayOutOfExtentMsg(surfaceEnvelope); success = true; } else { success = false; } } catch (Exception ex) { success = false; Debug.Print(ex.Message); } return(success); }