Ventana de progreso en exportacion

ConfiguracionSimplificada
Gerardo 2021-11-15 01:30:16 +01:00
parent 1e77fc2ac5
commit 8cedf825db
6 changed files with 67 additions and 39 deletions

View File

@ -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;

View File

@ -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<ArcGIS.Core.Geometry.Geometry> GetGeomConvexHull(FeatureClass fclss, ArcGIS.Core.Data.QueryFilter filter)
public static Task<ArcGIS.Core.Geometry.Geometry> 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<ArcGIS.Core.Geometry.Geometry>)(() =>
{
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))
{

View File

@ -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<TareaRes> EjecutaAsync(ModosEjec modo, Action<TareaRes> ffin)
public async void EjecutaAsync(ModosEjec modo, CancelableProgressorSource cps, Action<TareaRes> ffin)
{
var tarea = await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run((Func<TareaRes>)(() =>
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;
}
}
}

View File

@ -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;
}
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);

View File

@ -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])
{

View File

@ -8,7 +8,8 @@ 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
@ -22,7 +23,6 @@ namespace OliviaAddInPro
_subPanel2ViewModel = new PaneLimpiezaSub2ViewModel();
_subPanel3ViewModel = new PaneLimpiezaSub3ViewModel();
_subPanel4ViewModel = new PaneLimpiezaSub4ViewModel();
OptionsMenu = new ObservableCollection<OptionsMenuItem>
{
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<TareaRes> 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");
}
}
}