From 8cedf825dbb2621d87afbbe6a3f50d8744165876 Mon Sep 17 00:00:00 2001 From: Gerardo Date: Mon, 15 Nov 2021 01:30:16 +0100 Subject: [PATCH] Ventana de progreso en exportacion --- Button/ButtonLimp.cs | 2 ++ Helper/HelperGdb.cs | 21 +++++++++++----- Model/Limpieza.cs | 19 ++++++++------ Services/EjecServ.cs | 28 ++++++++++++--------- Services/LimpiezaServ.cs | 14 +++++++---- ViewModel/Limpieza/PaneLimpiezaViewModel.cs | 22 ++++++++++------ 6 files changed, 67 insertions(+), 39 deletions(-) diff --git a/Button/ButtonLimp.cs b/Button/ButtonLimp.cs index ff71c56..49258f1 100644 --- a/Button/ButtonLimp.cs +++ b/Button/ButtonLimp.cs @@ -25,6 +25,8 @@ namespace OliviaAddInPro { protected override void OnClick() { + OliviaGlob.progrDialog= new ProgressDialog( + "Procesando", "Canceled", 100, false); if (OliviaGlob.TipoEjec == TiposEjecucion.Ninguno) { OliviaGlob.TipoEjec = TiposEjecucion.Limp; diff --git a/Helper/HelperGdb.cs b/Helper/HelperGdb.cs index ea92052..70ab86e 100644 --- a/Helper/HelperGdb.cs +++ b/Helper/HelperGdb.cs @@ -433,13 +433,13 @@ namespace OliviaAddInPro.Helper * Forma la envolvente convexa, el mínimo polígono, * que contiene los ámbitos para exportar, a partir de ahí la red navegable ampliando a un buffer */ - public static Task GetGeomConvexHull(FeatureClass fclss, ArcGIS.Core.Data.QueryFilter filter) + public static Task GetGeomConvexHull(FeatureClass fclss, ArcGIS.Core.Data.QueryFilter filter, CancelableProgressorSource cps) { ArcGIS.Core.Geometry.Geometry geomIni = null; return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run((Func)(() => { - geomIni = GetGeomUnica(fclss, filter); + geomIni = GetGeomUnica(fclss, filter, cps); if (geomIni != null) { ArcGIS.Core.Geometry.Geometry geomSal = null; @@ -461,7 +461,7 @@ namespace OliviaAddInPro.Helper /* * A partir de una capa recorre todos los elementos que cumplen el filtro y los une en una única geometría */ - public static ArcGIS.Core.Geometry.Geometry GetGeomUnica(FeatureClass fclss, ArcGIS.Core.Data.QueryFilter filtro) + public static ArcGIS.Core.Geometry.Geometry GetGeomUnica(FeatureClass fclss, ArcGIS.Core.Data.QueryFilter filtro, CancelableProgressorSource cps) { ArcGIS.Core.Geometry.Geometry geomsal = null; ReiniciaOutStr(); @@ -470,6 +470,7 @@ namespace OliviaAddInPro.Helper { using (RowCursor rowCursor = fclss.Search(filtro)) { + while (rowCursor.MoveNext()) { using (Row row = rowCursor.Current) @@ -515,7 +516,7 @@ namespace OliviaAddInPro.Helper { where = $"{fieldName} = {Quote(f)}{selFieldVals[i]}{Quote(f)}"; filtro = new ArcGIS.Core.Data.QueryFilter { WhereClause = where }; - geomAux = GetGeomUnica(fclss, filtro); + geomAux = GetGeomUnica(fclss, filtro, null); if(geomAux == null) { ok = false; @@ -636,13 +637,14 @@ namespace OliviaAddInPro.Helper return res; } - public static bool ExportShp(string pathLayerIn, SpatialQueryFilter filter, string nameShp, string outpath,out string msgOut, ProgressorSource progrDialog = null) + public static bool ExportShp(string pathLayerIn, SpatialQueryFilter filter, string nameShp, string outpath, CancelableProgressorSource cps, out string msgOut, ProgressorSource progrDialog = null) { msgOut = ""; if (!System.IO.Directory.Exists(outpath)) System.IO.Directory.CreateDirectory(outpath); ReiniciaOutStr(); System.Threading.CancellationTokenSource _cts= new System.Threading.CancellationTokenSource(); + cps.Status = "Guardando geometria a shp"; var progSrc = new CancelableProgressorSource(); string[] args = { pathLayerIn, outpath }; @@ -664,6 +666,8 @@ namespace OliviaAddInPro.Helper string msg = string.Format("{0}: {1}", new object[] { event_name, (string)o }); //progrDialog.Message = (string)o; Debug.WriteLine(msg); + +; //System.Windows.MessageBox.Show(msg); //_cts.Cancel(); } @@ -673,6 +677,11 @@ namespace OliviaAddInPro.Helper { string msg2 = string.Format("{0}: {1} %", new object[] { event_name, (int)o }); Debug.WriteLine(msg2); + var av = (int)0; + if (av > 0) + { + cps.Value = (uint)(80 * av * 0.2); + } // if ((int)o < 0) //System.Windows.MessageBox.Show(msg2); //_cts.Cancel(); @@ -680,7 +689,7 @@ namespace OliviaAddInPro.Helper } } }).Result; - + cps.Status = "Finalizando exportacion"; //renombrado de ficheros: if (!RenameSHP(outpath, pathLayerIn, nameShp)) { diff --git a/Model/Limpieza.cs b/Model/Limpieza.cs index 24a7243..d639d21 100644 --- a/Model/Limpieza.cs +++ b/Model/Limpieza.cs @@ -10,6 +10,8 @@ using ArcGIS.Core.CIM; using ArcGIS.Core.Data; using OliviaAddInPro.Services; using static OliviaAddInPro.Model.LimpiezaDef; +using ArcGIS.Desktop.Framework.Threading.Tasks; +using ArcGIS.Desktop.Framework.Contracts; namespace OliviaAddInPro.Model { @@ -46,13 +48,13 @@ namespace OliviaAddInPro.Model Serv = new LimpiezaServ(this); } - public TareaRes Ejecuta(ModosEjec modo) + public TareaRes Ejecuta(ModosEjec modo, CancelableProgressorSource cps) { TareaRes res = null; if (modo == ModosEjec.Sectoriza) - res = Serv.Sectoriza(); + res = Serv.Sectoriza(cps); else if (modo == ModosEjec.Planifica) - res = Serv.Planifica(); + res = Serv.Planifica(cps); return res; /*if(!res) { @@ -64,17 +66,18 @@ namespace OliviaAddInPro.Model HelperGlobal.ponMsg(msg); }*/ } - public async Task EjecutaAsync(ModosEjec modo, Action ffin) + public async void EjecutaAsync(ModosEjec modo, CancelableProgressorSource cps, Action ffin) { - var tarea = await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run((Func)(() => + await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => { - var res = Ejecuta(modo); + cps.Status = "Procesando"; + cps.Value = 0; + var res = Ejecuta(modo, cps); ffin(res); return res; - })); + }); - return tarea; } } } diff --git a/Services/EjecServ.cs b/Services/EjecServ.cs index 99cd696..ee74637 100644 --- a/Services/EjecServ.cs +++ b/Services/EjecServ.cs @@ -35,7 +35,7 @@ namespace OliviaAddInPro.Services * Modo 0, sectorizar * Modo 1, planificar */ - public bool ComienzaEjec(ModosEjec modo, out string ErrStr) + public bool ComienzaEjec(ModosEjec modo, CancelableProgressorSource cps, out string ErrStr) { bool fue_mal = false; ErrStr = string.Empty; @@ -47,18 +47,20 @@ namespace OliviaAddInPro.Services fue_mal = true; } - //Obtiene la geometría que envuelve a los ámbitos - Geometry geom_export = null; + cps.Status = "Exportando geometria"; + + //Obtiene la geometría que envuelve a los ámbitos + Geometry geom_export = null; if (!fue_mal) { - geom_export = GetGeomAmbitsExport(); + geom_export = GetGeomAmbitsExport(cps); if (geom_export == null || geom_export.IsEmpty) { ErrStr = "No se ha podido generar geometría de los ámbitos" + com.ConsultaAmbs + ErrStr; fue_mal = true; } } - + // cps.Value = 80; //crea el filtro de exportación if (!fue_mal) { @@ -71,9 +73,10 @@ namespace OliviaAddInPro.Services } + cps.Value = 80; if (!fue_mal) - fue_mal = Ejecuta(modo, out ErrStr); + fue_mal = Ejecuta(modo, cps, out ErrStr); return fue_mal; @@ -83,7 +86,7 @@ namespace OliviaAddInPro.Services /** * Prepara la geometría para exportar los ámbitos */ - public Geometry GetGeomAmbitsExport() + public Geometry GetGeomAmbitsExport(CancelableProgressorSource cps) { Geometry geomAux = null; ErrStr = string.Empty; @@ -95,12 +98,13 @@ namespace OliviaAddInPro.Services return null; } //Primero hace la geometría de los ámbitos que cumplen la consulta - geomAux = HelperGdb.GetGeomConvexHull(fc, filtro).Result; + geomAux = HelperGdb.GetGeomConvexHull(fc, filtro, cps).Result; if (geomAux == null || geomAux.IsEmpty) { ErrStr = "No se ha podido generar geometría de los ámbitos" + com.ConsultaAmbs + HelperGdb.OutStr; return null; } + cps.Value = 60; //Hace la intersección de dicha geometría con las zonas if (com.GeomZon != null) { @@ -116,7 +120,7 @@ namespace OliviaAddInPro.Services return null; } } - + cps.Value = 70; //Hace la intersección de la geometría con los niveles if (com.GeomNiv != null) { @@ -132,7 +136,7 @@ namespace OliviaAddInPro.Services return null; } } - + cps.Value = 75; //le quita las restricciones if (com.GeomRestr != null) { @@ -178,11 +182,11 @@ namespace OliviaAddInPro.Services /** * Exporta y lanza proceso y ventana de proceso */ - public bool Ejecuta(ModosEjec modo, out string msg) + public bool Ejecuta(ModosEjec modo, CancelableProgressorSource cps, out string msg) { msg = ""; //exporta los datos de entrada - return HelperGdb.ExportShp(com.CapaElems, filtroEspacial, com.NombreShpExport, OliviaGlob.Paths.DirData, out msg); + return HelperGdb.ExportShp(com.CapaElems, filtroEspacial, com.NombreShpExport, OliviaGlob.Paths.DirData, cps, out msg); diff --git a/Services/LimpiezaServ.cs b/Services/LimpiezaServ.cs index 35dff16..6b61d17 100644 --- a/Services/LimpiezaServ.cs +++ b/Services/LimpiezaServ.cs @@ -1,6 +1,7 @@ using ArcGIS.Core.Data; using ArcGIS.Core.Geometry; using ArcGIS.Core.Internal.CIM; +using ArcGIS.Desktop.Framework.Threading.Tasks; using OliviaAddInPro.Helper; using OliviaAddInPro.Model; using System; @@ -27,7 +28,7 @@ namespace OliviaAddInPro.Services * Modo 0, sectorizar * Modo 1, planificar */ - public TareaRes Sectoriza() + public TareaRes Sectoriza(CancelableProgressorSource cps) { var res = new TareaRes() { @@ -38,7 +39,7 @@ namespace OliviaAddInPro.Services com = (TratamientoComun)limp; string nombFileAmbs = string.Empty; - + cps.Status = "Preparando filtro para la exportacion"; //Prepara consulta ErrStr = string.Empty; if (!PreparaConsulta(out nombFileAmbs)) @@ -47,6 +48,7 @@ namespace OliviaAddInPro.Services res.Errores = true; return res; } + cps.Value = 10; //Prepara nombre string fechaHora = string.Empty; @@ -57,7 +59,7 @@ namespace OliviaAddInPro.Services string msg = ""; //comienza ejecucion - if(!ComienzaEjec(ModosEjec.Sectoriza, out msg)) + if(!ComienzaEjec(ModosEjec.Sectoriza, cps, out msg)) { res.Errores = true; res.msg = msg; @@ -79,7 +81,7 @@ namespace OliviaAddInPro.Services return true; } - public TareaRes Planifica() + public TareaRes Planifica(CancelableProgressorSource cps) { TareaRes res = new TareaRes() { @@ -115,7 +117,9 @@ namespace OliviaAddInPro.Services consulta = string.Empty; ambs_file = ""; orstr = null; - for (int i = 0; i < limp.AmbitosSel.Length; i++) + var n = limp.AmbitosSel.Length; + + for (int i = 0; i < n; i++) { if (limp.AmbitosSel[i]) { diff --git a/ViewModel/Limpieza/PaneLimpiezaViewModel.cs b/ViewModel/Limpieza/PaneLimpiezaViewModel.cs index d1a8ad3..016f2cf 100644 --- a/ViewModel/Limpieza/PaneLimpiezaViewModel.cs +++ b/ViewModel/Limpieza/PaneLimpiezaViewModel.cs @@ -8,21 +8,21 @@ using System.Threading.Tasks; using System.Windows.Media.Imaging; using OliviaAddInPro.Helper; using static OliviaAddInPro.Model.LimpiezaDef; - +using ArcGIS.Desktop.Framework.Threading.Tasks; +using ArcGIS.Desktop.Framework.Contracts; namespace OliviaAddInPro { class PaneLimpiezaViewModel : PanelViewModelBase { private PaneLimpiezaSub1ViewModel _subPanel1ViewModel; - Limpieza limp; - + Limpieza limp; + public PaneLimpiezaViewModel() { _subPanel1ViewModel = new PaneLimpiezaSub1ViewModel(); _subPanel2ViewModel = new PaneLimpiezaSub2ViewModel(); _subPanel3ViewModel = new PaneLimpiezaSub3ViewModel(); - _subPanel4ViewModel = new PaneLimpiezaSub4ViewModel(); - + _subPanel4ViewModel = new PaneLimpiezaSub4ViewModel(); OptionsMenu = new ObservableCollection { new OptionsMenuItem(new BitmapImage(new Uri("pack://application:,,,/OliviaAddInPro;component/Resources/Dog32.png")), Resource1.String_tto, _subPanel1ViewModel), @@ -146,23 +146,29 @@ namespace OliviaAddInPro public void Ejecuta(OliviaAddInPro.Services.ModosEjec modo) { string err = ""; - if(!Lee(out err)) + + + OliviaGlob.progrDialog.Show(); + var progSrc = new CancelableProgressorSource(OliviaGlob.progrDialog); + + + if (!Lee(out err)) { HelperGlobal.ponMsg(err); return; } Action ac = finEjecuta; - var res = OliviaGlob.Limp.EjecutaAsync(modo, ac); + OliviaGlob.Limp.EjecutaAsync(modo, progSrc, ac); //res. } public void finEjecuta(TareaRes res) { + OliviaGlob.progrDialog.Hide(); if (res.Errores) { HelperGlobal.ponMsg(res.msg); } - HelperGlobal.ponMsg("Proceso terminado"); } } }