public static async Task <FolderType> GetWeaselAoiFolderTypeAsync(string folderPath) { if (folderPath.IndexOf(".gdb") > -1) { // The calls below will fail if the folder is a geodatabase folder return(FolderType.FOLDER); } IList <string> lstAoiLayers = new List <string> { folderPath + @"\aoi", folderPath + @"\aoibagis" }; IList <string> lstExistingLayers = await GeneralTools.RasterDatasetsExistAsync(lstAoiLayers); if (lstExistingLayers.Count > 0) { return(FolderType.AOI); } lstAoiLayers.Clear(); lstAoiLayers.Add(folderPath + @"\aoi_v.shp"); lstExistingLayers = await GeneralTools.ShapefilesExistAsync(lstAoiLayers); if (lstExistingLayers.Count > 0) { return(FolderType.BASIN); } return(FolderType.FOLDER); }
private async void RunImplAsync(object param) { // Bring GP History tool forward var cmdShowHistory = FrameworkApplication.GetPlugInWrapper("esri_geoprocessing_showToolHistory") as ICommand; if (cmdShowHistory != null) { if (cmdShowHistory.CanExecute(null)) { cmdShowHistory.Execute(null); } } foreach (var oAoi in Names) { if (oAoi.AoiBatchIsSelected) { // Currently only support AOI conversion but BASIN may be added in future FolderType fType = await GeodatabaseTools.GetWeaselAoiFolderTypeAsync(oAoi.FilePath); IList <string> lstExistingGdb = null; if (fType == FolderType.AOI) { lstExistingGdb = CheckForBagisGdb(oAoi.FilePath); } else { lstExistingGdb = CheckForBasinGdb(oAoi.FilePath); } // Make directory for log if it doesn't exist if (!Directory.Exists(oAoi.FilePath + "\\" + Constants.FOLDER_LOGS)) { DirectoryInfo info = Directory.CreateDirectory(oAoi.FilePath + "\\" + Constants.FOLDER_LOGS); if (info == null) { MessageBox.Show("Unable to create logs directory in Aoi folder!!", "BAGIS-PRO"); } } // Set logger to AOI directory string logFolderName = oAoi.FilePath + "\\" + Constants.FOLDER_LOGS; Module1.Current.ModuleLogManager.UpdateLogFileLocation(logFolderName); // Delete old geodatabases if they exist foreach (var geodatabasePath in lstExistingGdb) { IGPResult gpResult = await QueuedTask.Run(() => { var parameters = Geoprocessing.MakeValueArray(geodatabasePath); return(Geoprocessing.ExecuteToolAsync("Delete_management", parameters, null, CancelableProgressor.None, GPExecuteToolFlags.AddToHistory)); }); if (gpResult.IsFailed) { Module1.Current.ModuleLogManager.LogError(nameof(RunImplAsync), "Unable to delete geodatabase. Error code: " + gpResult.ErrorCode); MessageBox.Show("Unable to delete geodatabase " + geodatabasePath + "!"); } } // Create new geodatabases BA_ReturnCode success = await GeodatabaseTools.CreateGeodatabaseFoldersAsync(oAoi.FilePath, fType); if (success == BA_ReturnCode.Success) { Module1.Current.ModuleLogManager.LogInfo(nameof(RunImplAsync), "Created geodatabases in " + oAoi.FilePath); } else { MessageBox.Show("Unable to create geodatabases in " + oAoi.FilePath + ". Check logs!"); } // Assemble a dictionary with rasters we want to copy IDictionary <string, string> rastersToCopy = GetDictOfReqRasters(oAoi.FilePath, fType); // Accomodate two possible names for raster aoi boundary layer (aoibagis or aoi) IList <string> lstTest = new List <string> { oAoi.FilePath + @"\aoibagis" }; string aoiGdb = GeodatabaseTools.GetGeodatabasePath(oAoi.FilePath, GeodatabaseNames.Aoi, true); IList <string> existingLayers = null; if (fType == FolderType.AOI) { existingLayers = await GeneralTools.RasterDatasetsExistAsync(lstTest); if (existingLayers.Count == 0) { lstTest.Clear(); string strLayer = oAoi.FilePath + @"\aoi"; lstTest.Add(strLayer); existingLayers = await GeneralTools.RasterDatasetsExistAsync(lstTest); if (existingLayers.Count > 0) { rastersToCopy[strLayer] = aoiGdb + Constants.FILE_AOI_RASTER; } } else { rastersToCopy[oAoi.FilePath + @"\aoibagis"] = aoiGdb + Constants.FILE_AOI_RASTER; } } // Check to see if optional layers are present IDictionary <string, string> optRasterDict = GetDictOptWeaselRasters(oAoi.FilePath, fType); existingLayers = await GeneralTools.RasterDatasetsExistAsync(optRasterDict.Keys); foreach (var layerPath in existingLayers) { string gdbPath = optRasterDict[layerPath]; rastersToCopy[layerPath] = gdbPath; } // Raster layers with non-deterministic names in analysis and layers folders string strWeaselFolder = oAoi.FilePath + @"\layers"; string strGdbPath = GeodatabaseTools.GetGeodatabasePath(oAoi.FilePath, GeodatabaseNames.Layers, true); IList <string> lstRasters = await GeneralTools.GetLayersInFolderAsync(strWeaselFolder, "Raster Dataset"); foreach (var item in lstRasters) { rastersToCopy[strWeaselFolder + "\\" + item] = strGdbPath + item; } strWeaselFolder = oAoi.FilePath + @"\analysis"; strGdbPath = GeodatabaseTools.GetGeodatabasePath(oAoi.FilePath, GeodatabaseNames.Analysis, true); lstRasters = await GeneralTools.GetLayersInFolderAsync(strWeaselFolder, "Raster Dataset"); foreach (var item in lstRasters) { rastersToCopy[strWeaselFolder + "\\" + item] = strGdbPath + item; } // Use Geoprocessor to copy the files int errorCount = 0; foreach (var key in rastersToCopy.Keys) { IGPResult gpResult = await QueuedTask.Run(() => { var environments = Geoprocessing.MakeEnvironmentArray(workspace: oAoi.FilePath, cellSize: "MINOF"); var parameters = Geoprocessing.MakeValueArray(key, rastersToCopy[key]); return(Geoprocessing.ExecuteToolAsync("CopyRaster_management", parameters, null, CancelableProgressor.None, GPExecuteToolFlags.AddToHistory)); }); if (gpResult.IsFailed) { Module1.Current.ModuleLogManager.LogError(nameof(RunImplAsync), "Failed to copy raster " + key + "!"); errorCount++; } } Module1.Current.ModuleLogManager.LogDebug(nameof(RunImplAsync), "Raster copy completed with " + errorCount + " errors."); // Assemble a dictionary with vectors we want to copy IDictionary <string, string> vectorsToCopy = GetDictOfReqWeaselVectors(oAoi.FilePath, fType); // Check for an optional vector lstTest.Clear(); lstTest.Add(oAoi.FilePath + @"\unsnappedpp.shp"); existingLayers = await GeneralTools.ShapefilesExistAsync(lstTest); if (existingLayers.Count > 0) { vectorsToCopy[oAoi.FilePath + @"\unsnappedpp.shp"] = aoiGdb + Constants.FILE_UNSNAPPED_POURPOINT; } // Vector layers with non-deterministic names in analysis and layers folders strWeaselFolder = oAoi.FilePath + @"\layers"; strGdbPath = GeodatabaseTools.GetGeodatabasePath(oAoi.FilePath, GeodatabaseNames.Layers, true); IList <string> lstVectors = await GeneralTools.GetLayersInFolderAsync(strWeaselFolder, "Shapefile"); foreach (var item in lstVectors) { string noExtension = Path.GetFileNameWithoutExtension(item); vectorsToCopy[strWeaselFolder + "\\" + item] = strGdbPath + noExtension; } strWeaselFolder = oAoi.FilePath + @"\analysis"; strGdbPath = GeodatabaseTools.GetGeodatabasePath(oAoi.FilePath, GeodatabaseNames.Analysis, true); lstVectors = await GeneralTools.GetLayersInFolderAsync(strWeaselFolder, "Shapefile"); foreach (var item in lstVectors) { string noExtension = Path.GetFileNameWithoutExtension(item); vectorsToCopy[strWeaselFolder + "\\" + item] = strGdbPath + noExtension; } // Use Geoprocessor to copy the files errorCount = 0; foreach (var entry in vectorsToCopy) { string strKey = entry.Key; } string strTempFile = Path.GetFileName("tmpVector"); string strDirectory = ""; foreach (var entry in vectorsToCopy) { IGPResult gpResult = await QueuedTask.Run(() => { var environments = Geoprocessing.MakeEnvironmentArray(workspace: oAoi.FilePath); strDirectory = Path.GetDirectoryName(entry.Value); var parameters = Geoprocessing.MakeValueArray(entry.Key, strDirectory, strTempFile); return(Geoprocessing.ExecuteToolAsync("FeatureClassToFeatureClass_conversion", parameters, null, CancelableProgressor.None, GPExecuteToolFlags.AddToHistory)); }); if (gpResult.IsFailed) { Module1.Current.ModuleLogManager.LogError(nameof(RunImplAsync), "Failed to convert vector " + entry.Key + "!"); errorCount++; } else { //There is a bug with using converted shapefiles in Pro; We need to rename the converted file //so that functions related to extent work gpResult = await QueuedTask.Run(() => { var environments = Geoprocessing.MakeEnvironmentArray(workspace: oAoi.FilePath); strDirectory = Path.GetDirectoryName(entry.Value); var parameters = Geoprocessing.MakeValueArray(strDirectory + "\\" + strTempFile, entry.Value); return(Geoprocessing.ExecuteToolAsync("Rename_management", parameters, null, CancelableProgressor.None, GPExecuteToolFlags.AddToHistory)); }); if (gpResult.IsFailed) { Module1.Current.ModuleLogManager.LogError(nameof(RunImplAsync), "Failed to copy feature class " + entry.Key + "!"); errorCount++; } } } Module1.Current.ModuleLogManager.LogDebug(nameof(RunImplAsync), "Vector copy completed with " + errorCount + " errors."); } } MessageBox.Show("Done!"); }