diff --git a/Helper/HelperGdb.cs b/Helper/HelperGdb.cs index 526dff7..216c047 100644 --- a/Helper/HelperGdb.cs +++ b/Helper/HelperGdb.cs @@ -120,7 +120,19 @@ namespace OliviaAddInPro.Helper { if (fc == null) return null; - ArcGIS.Core.Geometry.SpatialReference spatref = fc.GetDefinition().GetSpatialReference(); + ArcGIS.Core.Geometry.SpatialReference spatref = null; + var task = ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => + { + try + { + spatref = fc.GetDefinition().GetSpatialReference(); + } + catch + { + + } + }); + task.Wait(); return spatref; } @@ -131,21 +143,38 @@ namespace OliviaAddInPro.Helper { if (gdbName == null || string.IsNullOrEmpty(dataset)) return null; + Geodatabase gdb = null; + FeatureClassDefinition fcdef = null; try - { - Geodatabase gdb = GetGdb(gdbName).Result; + { + gdb = GetGdb(gdbName).Result; if (gdb == null) return null; - FeatureClassDefinition fcdef = gdb.GetDefinition(dataset); - ArcGIS.Core.Geometry.SpatialReference spatref = fcdef.GetSpatialReference(); - Free(gdb); - Free(fcdef); + ArcGIS.Core.Geometry.SpatialReference spatref = null; + var task = ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => + { + try + { + fcdef = gdb.GetDefinition(dataset); + spatref = fcdef.GetSpatialReference(); + } + catch + { + + } + }); + task.Wait(); return spatref; } catch { return null; } + finally + { + Free(gdb); + Free(fcdef); + } } //Dado el tipo de FtClass y una posición inicial abre un diálogo de búsqueda de ftclass @@ -316,11 +345,11 @@ namespace OliviaAddInPro.Helper } //Abre una feature class cuando es un shapefile - public static async Task GetFtClassFromShp(string pathShp) + public static Task GetFtClassFromShp(string pathShp) { FeatureClass ftclss = null; ReiniciaOutStr(); - return await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run((Func)(() => + return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run((Func)(() => { if (!string.IsNullOrEmpty(pathShp) && pathShp.Contains(SHP_EXT)) { @@ -1272,7 +1301,7 @@ namespace OliviaAddInPro.Helper string message = String.Empty; bool deletionResult = false; - ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => + var task = ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => { EditOperation editOperation = new EditOperation(); @@ -1309,6 +1338,7 @@ namespace OliviaAddInPro.Helper } }); + task.Wait(); if (!string.IsNullOrEmpty(message)) { @@ -1506,6 +1536,8 @@ namespace OliviaAddInPro.Helper }; if (!string.IsNullOrEmpty(initloc_)) dlg.InitialLocation = initloc_; + else + dlg.AlwaysUseInitialLocation = false; if (!string.IsNullOrEmpty(filt_)) dlg.Filter = filt_; if (!string.IsNullOrEmpty(ext_)) @@ -1524,18 +1556,22 @@ namespace OliviaAddInPro.Helper /** * Comprueva si una GDB contiene un Dataset */ - public static bool CheckDataset(Geodatabase gdb, string datasetName) + public static Task CheckDataset(Geodatabase gdb, string datasetName) { - try + + return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run((Func)(() => { - FeatureClass ftclss = gdb.OpenDataset(datasetName); - ftclss.Dispose(); - return true; - } - catch - { - return false; - } + try + { + FeatureClass ftclss = gdb.OpenDataset(datasetName); + ftclss.Dispose(); + return true; + } + catch + { + return false; + } + })); } /** @@ -1558,7 +1594,7 @@ namespace OliviaAddInPro.Helper return res; } //comprueba si extiste ya el dataset - if(CheckDataset(gdb,datasetName)) + if(CheckDataset(gdb,datasetName).Result) { //comprueba si tiene la misma referencia espacial featureDatasetDefinition = gdb.GetDefinition(datasetName); @@ -1575,24 +1611,45 @@ namespace OliviaAddInPro.Helper } } //no existe, lo crea - SchemaBuilder schemaBuilder = new SchemaBuilder(gdb); - // Create a FeatureDataset - FeatureDatasetDescription featureDatasetDescription = new FeatureDatasetDescription(datasetName, spatref); - schemaBuilder.Create(featureDatasetDescription); - - // Build status - bool buildStatus = schemaBuilder.Build(); - if(buildStatus)//ha ido bien + var task = ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run((Func>)(() => + { + Respuesta res2 = new Respuesta { Value = false }; + SchemaBuilder schemaBuilder = null; + try + { + schemaBuilder = new SchemaBuilder(gdb); + // Create a FeatureDataset + FeatureDatasetDescription featureDatasetDescription = new FeatureDatasetDescription(datasetName, spatref); + schemaBuilder.Create(featureDatasetDescription); + // Build status + res2.Value = schemaBuilder.Build(); + if (!res2.Value && schemaBuilder.ErrorMessages.Count > 0) + res2.Error.Add(schemaBuilder.ErrorMessages.FirstOrDefault()); + return res2; + } + catch + { + if (schemaBuilder != null && schemaBuilder.ErrorMessages.Count > 0) + res2.Error.Add(schemaBuilder.ErrorMessages.FirstOrDefault()); + else + res2.Error.Add("Error 1 al crear Dataset."); + return res2; + } + })); + task.Wait(); + if(task.Result.Value)//ha ido bien { if (string.IsNullOrEmpty(datasetNameOut)) res.Value = 0; else res.Value = 2;//avisa + //actualiza la gdb + Refresh(gdbPath); } else// Build errors { res.Value = 1; - res.Error.Add(schemaBuilder.ErrorMessages.FirstOrDefault()); + res.Error.Add(task.Result.Error.FirstOrDefault()); } return res; } @@ -1621,6 +1678,7 @@ namespace OliviaAddInPro.Helper FeatureClass fc = GetFtClassFromShp(nom_shp).Result; if (fc == null) return res; + try { ArcGIS.Core.Geometry.SpatialReference spatref = GetSpatRef(fc); @@ -1642,6 +1700,8 @@ namespace OliviaAddInPro.Helper return res; } res.Value = true; + //actualiza la gdb + Refresh(System.IO.Path.GetDirectoryName(Gdb_dataset)); return res; } catch (Exception ex) @@ -1667,23 +1727,77 @@ namespace OliviaAddInPro.Helper Geodatabase gdb = GetGdb(gdbPath).Result; if (gdb == null) return res; - // Create a FeatureClassDescription object - FeatureClassDescription featureClassDescription = new FeatureClassDescription(ftclss.GetDefinition()); - // Create a SchemaBuilder object - SchemaBuilder schemaBuilder = new SchemaBuilder(gdb); - // Add the deletion fo the feature class to our list of DDL tasks - schemaBuilder.Delete(featureClassDescription); - // Execute the DDL - bool success = schemaBuilder.Build(); - if (success) + + var task = ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run((Func>)(() => + { + Respuesta resp = new Respuesta { Value = false }; + SchemaBuilder schemaBuilder = null; + try + { + // Create a FeatureClassDescription object + FeatureClassDescription featureClassDescription = new FeatureClassDescription(ftclss.GetDefinition()); + // Create a SchemaBuilder object + schemaBuilder = new SchemaBuilder(gdb); + // Add the deletion fo the feature class to our list of DDL tasks + schemaBuilder.Delete(featureClassDescription); + // Execute the DDL + resp.Value = schemaBuilder.Build(); + if(!resp.Value && schemaBuilder.ErrorMessages.Count>0) + resp.Error.Add(schemaBuilder.ErrorMessages.FirstOrDefault()); + return resp; + } + catch + { + resp.Error.Add(schemaBuilder.ErrorMessages.FirstOrDefault()); + return resp; + } + })); + if (task.Result.Value) res.Value = true; else { - res.Error.Add(schemaBuilder.ErrorMessages.FirstOrDefault()); + res.Error.Add(task.Result.Error.FirstOrDefault()); } Free(gdb); Free(ftclss); return res; } + + /** + * Refresca la gdb después de añadir dataset y featureclass + */ + public static void Refresh(string gdbPath) + { + Item gdb=null; + try + { + gdb = ItemFactory.Instance.Create(gdbPath); + if (gdb == null) + return; + var contentItem = gdb; + //Check if the MCT is required for Refresh() + if (contentItem.IsMainThreadRequired) + { + //QueuedTask.Run must be used if item.IsMainThreadRequired + //returns true + QueuedTask.Run(() => contentItem.Refresh()); + } + else + { + //if item.IsMainThreadRequired returns false, any + //thread can be used to invoke Refresh(), though + //BackgroundTask is preferred. + contentItem.Refresh(); + + //Or, via BackgroundTask + ArcGIS.Core.Threading.Tasks.BackgroundTask.Run(() => + contentItem.Refresh(), ArcGIS.Core.Threading.Tasks.BackgroundProgressor.None); + } + } + catch + { + + } + } } } diff --git a/Model/TratamientoComun.cs b/Model/TratamientoComun.cs index a3649f5..65fd014 100644 --- a/Model/TratamientoComun.cs +++ b/Model/TratamientoComun.cs @@ -154,6 +154,7 @@ namespace OliviaAddInPro.Model //comienza ejecución Action, TratamientoComun> ac = FinProceSrv.finEjecuta; //pone los flags + OliviaGlob.RemoveFlagTipEjec(TiposEjecucion.Config); if (modo == ModosEjec.Sectoriza) OliviaGlob.AddFlagTipEjec(TiposEjecucion.EjecSecto); else if (modo == ModosEjec.Planifica || modo == ModosEjec.SoloPlanifica) diff --git a/Services/EjecServ.cs b/Services/EjecServ.cs index 0a4d1a2..28f5016 100644 --- a/Services/EjecServ.cs +++ b/Services/EjecServ.cs @@ -441,15 +441,28 @@ namespace OliviaAddInPro.Services //pregunta a ver si se quiere ese nombre u otro bool replace = false; string dataset = tratamiento; - - string ambitos_aux = HelperGdb.SaveFileDlg("Guardar Feature Class como...", GdbFileName + "\\" + tratamiento + "\\" + ambitos, null, null, - new ArcGIS.Desktop.Core.BrowseProjectFilter()); + bool sal = true; + string ambitos_aux; + //repite por si se ha equivocado hasta que elige el nombre de clase + do + { + sal = true; + ambitos_aux = HelperGdb.SaveFileDlg("Guardar Feature Class como...", GdbFileName + "\\" + tratamiento, null, null, + ArcGIS.Desktop.Core.BrowseProjectFilter.GetFilter("esri_browseDialogFilters_featureClasses_all")); + if (string.IsNullOrEmpty(ambitos_aux)) + sal = HelperGlobal.ponMsg("¿Desea cancelar el proceso de imporación?", + MessageBoxImage.Question, "OLIVIA", MessageBoxButton.YesNo); + } while (!sal); if (!string.IsNullOrEmpty(ambitos_aux)) { //sustituye los ámbitos por los elegidos ambitos = System.IO.Path.GetFileNameWithoutExtension(ambitos_aux); replace = System.IO.File.Exists(ambitos_aux); - dataset = System.IO.Path.GetDirectoryName(ambitos_aux) ; + dataset = System.IO.Path.GetFileNameWithoutExtension(System.IO.Path.GetDirectoryName(ambitos_aux)) ; + } + else { + res.Error.Add("Se ha cancelado la importación de resultados. Se cancela la elección de nombre de la Feature Class."); + return res; } //comprueba si la proyección es la misma la del dataset que la que llega if (!dataset.Equals(tratamiento)) @@ -540,7 +553,7 @@ namespace OliviaAddInPro.Services break; } } - resp2 = HelperGdb.ImportShp(noms_shp[i], GdbFileName + "\\" + dataset, noms_gdb[i]); + resp2 = HelperGdb.ImportShp(dir_shp + "\\" + noms_shp[i] + HelperGdb.SHP_EXT, GdbFileName + "\\" + dataset, noms_gdb[i]); if (!resp2.Value) { err_st = "Error al importar la capa " + noms_gdb[i]; diff --git a/Services/FinProcServ.cs b/Services/FinProcServ.cs index 5d2c92b..7f3e7e0 100644 --- a/Services/FinProcServ.cs +++ b/Services/FinProcServ.cs @@ -61,16 +61,17 @@ namespace OliviaAddInPro.Services BorraFiles(); HelperGlobal.ponMsg(msg); //Application.Current.Dispatcher.Invoke(new Action, TratamientoComun>(((p, v)) => { finEjecuta2(p, v); }));*/ - Application.Current.Dispatcher.Invoke(new Action, TratamientoComun>((p, v) => finEjecuta2(p, v)),res,inst); + Application.Current.Dispatcher.BeginInvoke(new Action, TratamientoComun>((p, v) => finEjecuta2(p, v)),res,inst); //borra los archivos que le toca borrar - BorraFiles(); + //BorraFiles(); } public void finEjecuta2(Respuesta res, TratamientoComun inst) { String msg = string.Empty; String msg_err = "Errores en el proceso de importación de resultados"; + bool mal = false; try { @@ -89,7 +90,10 @@ namespace OliviaAddInPro.Services //importa resultados var resp = IniImport(); if (resp.HasError) + { msg = resp.Error.First(); + mal = true; + } else { string GdbFileName = resp.Value; @@ -99,7 +103,7 @@ namespace OliviaAddInPro.Services //actualiza los flags OliviaGlob.RemoveFlagTipEjec(TiposEjecucion.EjecSecto); //acciones de importación - resp2 = inst.ServCom.ImportSecto(GdbFileName); + resp2 = inst.ServCom.ImportSecto(GdbFileName); } else if (OliviaGlob.HasFlagTipEjec(TiposEjecucion.EjecPlanif)) //Ha terminado bien la planificación { @@ -109,14 +113,17 @@ namespace OliviaAddInPro.Services GuardaCsv(inst); //acciones de importación resp2 = inst.ServCom.ImportPlanif(GdbFileName); - + } if (string.IsNullOrEmpty(resp2.Value)) { if (resp2.HasError) - msg = resp2.Error.First(); + { + msg = resp2.Error.First(); + } else msg = msg_err; + mal = true; } else { @@ -129,14 +136,31 @@ namespace OliviaAddInPro.Services } catch(Exception ex) { - msg = msg_err + ": "+msg+": "+ex.Message; + msg = msg_err + ": "+msg+": "+ex.Message; + mal = true; } + if (mal) + { + //reinicia flags + if(OliviaGlob.IsLimp()) + OliviaGlob.SetFlagTipEjec(TiposEjecucion.Limp); + else if(OliviaGlob.IsReco()) + OliviaGlob.SetFlagTipEjec(TiposEjecucion.Reco); + } HelperGlobal.ponMsg(msg); OliviaGlob.progrDialog.Hide(); //muestra la ventana OliviaGlob.ShowHidePane(true); - } + /*var task = ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => + { + //borra los archivos que le toca borrar + BorraFiles(); + }); + task.Wait();*/ + //borra los archivos que le toca borrar + BorraFiles(); + } /** * Borra los archivos exportados para el proceso @@ -237,7 +261,7 @@ namespace OliviaAddInPro.Services if (string.IsNullOrEmpty(GdbFileName) || !Directory.Exists(GdbFileName)) { - res.Error.Add("Se ha cancelado la importación de resultados."); + res.Error.Add("Se ha cancelado la importación de resultados. Se cancela la elección de GDB."); return res; } res.Value = GdbFileName; diff --git a/Services/LanzaSrv/LanzaLimpSrv.cs b/Services/LanzaSrv/LanzaLimpSrv.cs index b63d09d..de41d4d 100644 --- a/Services/LanzaSrv/LanzaLimpSrv.cs +++ b/Services/LanzaSrv/LanzaLimpSrv.cs @@ -27,8 +27,6 @@ namespace OliviaAddInPro.Services.LanzaSrv res.Value = false; return res; } - - OliviaGlob.TipoEjec = TiposEjecucion.Limp;//OliviaDef.GeneralDef.TiposOliv.OlivLimp; //configura el string de opciones if (!configura_ops_geo(limp, modo)) diff --git a/Services/LanzaSrv/LanzaRecoSrv.cs b/Services/LanzaSrv/LanzaRecoSrv.cs index 2849b1a..312bc70 100644 --- a/Services/LanzaSrv/LanzaRecoSrv.cs +++ b/Services/LanzaSrv/LanzaRecoSrv.cs @@ -26,8 +26,6 @@ namespace OliviaAddInPro.Services.LanzaSrv return res; } - //OliviaGlob.tip_oliv = OliviaDef.GeneralDef.TiposOliv.OlivResi; - OliviaGlob.TipoEjec = TiposEjecucion.Reco;//OliviaDef.GeneralDef.TiposOliv.OlivResi; /*if (!OliviaGlob.gdb_reco.exporta(reco, modo == (int)Ejecuta.ModosEjec.Planif)) { err_str = OliviaGlob.gdb_reco.err_st; diff --git a/ViewModel/Limpieza/DockpaneLimpiezaViewModel.cs b/ViewModel/Limpieza/DockpaneLimpiezaViewModel.cs index 9ddcd53..814e8a6 100644 --- a/ViewModel/Limpieza/DockpaneLimpiezaViewModel.cs +++ b/ViewModel/Limpieza/DockpaneLimpiezaViewModel.cs @@ -63,11 +63,11 @@ namespace OliviaAddInPro //The parameter passed to this method will be true if the Dockpane is being opened and it is false when you close the dockpane protected override void OnShow(bool isVisible) { - if (isVisible == false && !firstTimeShow && !hideTemp) + /*if (isVisible == false && !firstTimeShow && !hideTemp) { //avisa de cerrar la ventana OliviaGlob.SetFlagTipEjec(TiposEjecucion.Ninguno); - } + }*/ if (firstTimeShow) firstTimeShow = false; } diff --git a/ViewModel/Limpieza/PaneLimpiezaSub1ViewModel.cs b/ViewModel/Limpieza/PaneLimpiezaSub1ViewModel.cs index d8d79df..02b83c1 100644 --- a/ViewModel/Limpieza/PaneLimpiezaSub1ViewModel.cs +++ b/ViewModel/Limpieza/PaneLimpiezaSub1ViewModel.cs @@ -210,6 +210,7 @@ namespace OliviaAddInPro CapaElems = string.Empty; OpsAmbs.Clear(); Ambitos.Clear(); + TipoTto = -1; VisTextAnchoVia = System.Windows.Visibility.Hidden; OliviaGlob.AddFlagTipEjec(TiposEjecucion.Config); //lo reinicia, por si estaba después de planificar if (string.IsNullOrEmpty(capa)) diff --git a/ViewModel/Recogida/DockpaneRecogidaViewModel.cs b/ViewModel/Recogida/DockpaneRecogidaViewModel.cs index 442a550..513f754 100644 --- a/ViewModel/Recogida/DockpaneRecogidaViewModel.cs +++ b/ViewModel/Recogida/DockpaneRecogidaViewModel.cs @@ -61,11 +61,11 @@ namespace OliviaAddInPro //also false the first time protected override void OnShow(bool isVisible) { - if (isVisible == false && !firstTimeShow && !hideTemp) + /* if (isVisible == false && !firstTimeShow && !hideTemp) { //avisa de cerrar la ventana OliviaGlob.SetFlagTipEjec(TiposEjecucion.Ninguno); - } + }*/ if (firstTimeShow) firstTimeShow = false; }