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 dcdda94..0d5b855 100644 --- a/Helper/HelperGdb.cs +++ b/Helper/HelperGdb.cs @@ -18,6 +18,8 @@ using ArcGIS.Desktop.Core.Geoprocessing; using ArcGIS.Desktop.Framework.Threading.Tasks; using ArcGIS.Desktop.Editing; using OliviaAddInPro.Model; +using System.IO; +using System.Diagnostics; namespace OliviaAddInPro.Helper { @@ -441,13 +443,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; @@ -469,7 +471,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(); @@ -478,6 +480,7 @@ namespace OliviaAddInPro.Helper { using (RowCursor rowCursor = fclss.Search(filtro)) { + while (rowCursor.MoveNext()) { using (Row row = rowCursor.Current) @@ -523,7 +526,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; @@ -647,93 +650,103 @@ namespace OliviaAddInPro.Helper Free(fc); return n; } - - public static async Task ExportShp(string pathLayerIn, SpatialQueryFilter filter, string nameShp, string outpath, ProgressDialog progrDialog = null) + static public bool RenameSHP(string dir, string path, string nameNew) { - if (!System.IO.Directory.Exists(outpath)) - System.IO.Directory.CreateDirectory(outpath); - ReiniciaOutStr(); - string dirPath; - string fclassName = System.IO.Path.GetFileName(pathLayerIn); - IReadOnlyList parameters = null; - IReadOnlyList parameters2 = null; + var extensions = new[] { "cpg", "dbf", "prj", "sbn", "sbx", "shp", "shp.xml", "shx" }; + string old_ext = System.IO.Path.GetExtension(path); - FeatureClass featureClass = null; - var fin = ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run((Func)(() => + string name = System.IO.Path.GetFileName(path); + if (!string.IsNullOrEmpty(old_ext)) + name.Replace(old_ext,""); + string _ex =System.IO.Path.GetExtension(nameNew); + string nn = nameNew; + if (!string.IsNullOrEmpty(_ex)) + nn.Replace(_ex, ""); + var res = true; + foreach(var ex in extensions) { - if (string.IsNullOrEmpty(fclassName)) - return false; - try { - if (System.IO.Path.GetExtension(pathLayerIn).Equals(".shp")) - { - dirPath = System.IO.Path.GetDirectoryName(pathLayerIn); - //es un shape de entrada - FileSystemConnectionPath fileConnection = new FileSystemConnectionPath(new Uri(dirPath), FileSystemDatastoreType.Shapefile); - using (FileSystemDatastore shapefile = new FileSystemDatastore(fileConnection)) - { - featureClass = shapefile.OpenDataset(fclassName); - } - } - else - { - dirPath = GetPathGdb(pathLayerIn); - //es una feature class de una gdb - using (Geodatabase fileGeodatabase = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(dirPath)))) - { - featureClass = fileGeodatabase.OpenDataset(fclassName); - } - } - if (featureClass == null) - return false; - - //Selection selFeatures = featureClass.Select(filter, SelectionType.ObjectID, SelectionOption.Normal); - // make a value array of strings to be passed to ExecuteToolAsync - parameters = Geoprocessing.MakeValueArray(pathLayerIn, outpath);//, nameShp); - var aux = pathLayerIn.Split('\\'); - parameters2 = Geoprocessing.MakeValueArray(outpath + aux[aux.Length - 1]+".shp", outpath, nameShp); + var po = string.Format("{0}{1}.{2}", dir, name, ex); + var pn = string.Format("{0}{1}.{2}", dir, nn, ex); + if (!File.Exists(po)) + res = false;//no existe + if (!File.Exists(pn)) + File.Delete(pn); + File.Move(po,pn ); } catch { - OutStr = "Ha ocurrido un error al convertir a shape"; - return false; + res = false; } - return true; - })); - fin.Wait(); - if(!fin.Result)// || parameters==null) - { - OutStr = "Ha ocurrido un error al convertir a shape"; - return false; } - - - var progSrc = new CancelableProgressorSource(progrDialog); - + return res; + } + + 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 }; // execute the tool - IGPResult gpResult = Geoprocessing.ExecuteToolAsync("FeatureClassToShapefile_conversion", parameters, - null, progSrc.Progressor, GPExecuteToolFlags.GPThread).Result; + IGPResult gpResult = Geoprocessing.ExecuteToolAsync("FeatureClassToShapefile_conversion", args, + null, _cts.Token, - //renombrar shp - //param2.Add(nameShp); - IGPResult gpResult2 = Geoprocessing.ExecuteToolAsync("FeatureClassToFeatureClass", parameters2, - null, progSrc.Progressor, GPExecuteToolFlags.GPThread).Result; + (event_name, o) => // implement delegate and handle events + { + switch (event_name) + { + case "OnValidate": // stop execute if any warnings + //if ((o as IGPMessage[]).Any(it => it.Type == GPMessageType.Warning)) + //_cts.Cancel(); + break; - - Free(featureClass); - if (string.IsNullOrEmpty(gpResult.ReturnValue)) + case "OnProgressMessage": + { + 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(); + } + break; + + case "OnProgressPos": + { + 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(); + break; + } + } + }).Result; + cps.Status = "Finalizando exportacion"; + //renombrado de ficheros: + if (!RenameSHP(outpath, pathLayerIn, nameShp)) { - OutStr = "Ha ocurrido un error en la herramienta de GeoProcesamiento: " + gpResult.ErrorMessages; + msgOut = "Error al exportar a shp."; return false; + } - else - { - OutStr = "Ok: " + gpResult.ReturnValue; - return true; - } + + return true; } } diff --git a/Helper/HelperGlobal.cs b/Helper/HelperGlobal.cs index 8bb9079..aae50a3 100644 --- a/Helper/HelperGlobal.cs +++ b/Helper/HelperGlobal.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using ArcGIS.Desktop.Internal.Framework.Controls; using ArcGIS.Desktop.Framework.Dialogs; using System.Windows; +using System.IO; namespace OliviaAddInPro.Helper { @@ -50,5 +51,33 @@ namespace OliviaAddInPro.Helper return false; } } + + public static void create_folder(string dir) + { + string[] pathParts = dir.Split('\\'); + string path = ""; + foreach (var d in pathParts) + { + if(string.IsNullOrEmpty(path)) + path = d; + + else + path = path + '\\'+d; + + if (!Directory.Exists(path)) + { + try + { + Directory.CreateDirectory(path); + + } + catch + { + + } + } + + } + } } } diff --git a/Model/Limpieza.cs b/Model/Limpieza.cs index f73cee1..e116619 100644 --- a/Model/Limpieza.cs +++ b/Model/Limpieza.cs @@ -9,6 +9,9 @@ using System.Collections.ObjectModel; 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 { @@ -39,15 +42,17 @@ namespace OliviaAddInPro.Model public Limpieza() { Serv = new LimpiezaServ(this); - } - public void Ejecuta(ModosEjec modo) + } + + public TareaRes Ejecuta(ModosEjec modo, CancelableProgressorSource cps) { - bool bien = true; + TareaRes res = null; if (modo == ModosEjec.Sectoriza) - bien = Serv.Sectoriza(); + res = Serv.Sectoriza(cps); else if (modo == ModosEjec.Planifica) - bien=Serv.Planifica(); - if(!bien) + res = Serv.Planifica(cps); + return res; + /*if(!res) { string msg; if (Serv.ErrStr.Length > 0) @@ -55,7 +60,20 @@ namespace OliviaAddInPro.Model else msg = "Han ocurrido errores al comenzar la ejeción."; HelperGlobal.ponMsg(msg); - } + }*/ + } + public async void EjecutaAsync(ModosEjec modo, CancelableProgressorSource cps, Action ffin) + { + await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => + { + cps.Status = "Procesando"; + cps.Value = 0; + var res = Ejecuta(modo, cps); + ffin(res); + return res; + + }); + } } } diff --git a/Model/LimpiezaDef.cs b/Model/LimpiezaDef.cs index d647f94..8aa7f32 100644 --- a/Model/LimpiezaDef.cs +++ b/Model/LimpiezaDef.cs @@ -788,6 +788,12 @@ namespace OliviaAddInPro.Model LimpiezaDef.filtro_str[(int)LimpiezaDef.AmbitsTra.AmbPipi] = LimpiezaDef.Campos.consulta_entidad + " = '" + LimpiezaDef.Atributos.atr_pipi + "'"; LimpiezaDef.filtro_str[(int)LimpiezaDef.AmbitsTra.AmbSane] = LimpiezaDef.Campos.consulta_entidad + " = '" + LimpiezaDef.Atributos.atr_sane + "'"; } + public class TareaRes + { + public bool Errores { get; set; } + public object data { get; set; } + public string msg { get; set; } + } } } diff --git a/Model/OliviaGlob.cs b/Model/OliviaGlob.cs index b85446c..68ddccb 100644 --- a/Model/OliviaGlob.cs +++ b/Model/OliviaGlob.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using OliviaAddInPro.Services; using ArcGIS.Core.Geometry; using ArcGIS.Desktop.Framework.Threading.Tasks; +using OliviaAddInPro.Helper; namespace OliviaAddInPro.Model { @@ -155,6 +156,9 @@ namespace OliviaAddInPro.Model Paths.PathTemp = c.path_temp; c.PathCartela = c.PathCartela; + HelperGlobal.create_folder(Paths.DirData); + HelperGlobal.create_folder(Paths.PathTemp); + Paths.PathGdbGen = c.PathGdbGen; Paths.PathGdbNw = c.red_carreteras; Paths.PathSimbVSM = c.PathSimbVSM; @@ -272,82 +276,84 @@ namespace OliviaAddInPro.Model LimpiezaDef.OtrosParam.desv_max = c.Desv_max; LimpiezaDef.OtrosParam.desv_max_abs = c.Desv_max_abs; - /////////////////////////////////////// - /////FALTA MACHEAR A CONFIG + //Capas, consultas, atributos y filtros de RECOGIDA - RecogidaDef.campos_def.cons_id = RecogidaDef.campos.cons_id = "OBJECTID"; - RecogidaDef.campos_def.cons_nomrec = RecogidaDef.campos.cons_nomrec = "NOMB_TIP_REC"; - RecogidaDef.campos_def.cons_lateral = RecogidaDef.campos.cons_lateral = "LATERALIDAD"; - RecogidaDef.campos_def.cons_fracc = RecogidaDef.campos.cons_fracc = "FRACCION"; - RecogidaDef.campos_def.cons_capac = RecogidaDef.campos.cons_capac = "CAPACIDAD"; - RecogidaDef.campos_def.cons_uds = RecogidaDef.campos.cons_uds = "UNIDADES"; - RecogidaDef.campos_def.cons_kgrec = RecogidaDef.campos.cons_kgrec = "KGRECO"; - RecogidaDef.kgrec_cont = 200; + RecogidaDef.campos_def.cons_id = c.id; + RecogidaDef.campos_def.cons_nomrec = c.nomrec; + RecogidaDef.campos_def.cons_lateral = c.lateralidad; + RecogidaDef.campos_def.cons_fracc = c.frac; + RecogidaDef.campos_def.cons_capac = c.capac; + RecogidaDef.campos_def.cons_uds = c.uds; + RecogidaDef.campos_def.cons_kgrec = c.kgrec; + RecogidaDef.kgrec_cont = c.kgrec_val; //Rellena los tipos de fracción - RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Organica] = "Organica"; - RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Resto] = "Resto"; - RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Envases] = "Envases"; - RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Papel] = "PapelCarton"; - RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Vidrio] = "Vidrio"; + RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Organica] = c.organica; + RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Resto] = c.resto; + RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Envases] = c.envase; + RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Papel] = c.papel; + RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Vidrio] = c.vidrio; //Rellena los tipos de carga - RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Trasera] = "Carga Trasera"; - RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Lateral] = "Carga Lateral"; - RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Superior] = "Carga Superior"; - RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Bilateral] = "Carga Bilateral"; - RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.BolseoPtaPta] = "Bolseo"; - RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Lavado] = "Lavado de cont"; + RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Trasera] = c.trasera; + RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Lateral] = c.lateral; + RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Superior] = c.superior; + RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Bilateral] = c.bilat; + RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.BolseoPtaPta] = c.bolseo; + RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Lavado] = c.lavado; - RecogidaDef.Parametros.t_vaciM = 40000; - RecogidaDef.Parametros.t_vacim = 0; - RecogidaDef.Parametros.t_llegsalM = 40000; - RecogidaDef.Parametros.t_llegsalm = 0; - RecogidaDef.Parametros.t_llegsal = 5; - RecogidaDef.Parametros.t_descM = 40000; - RecogidaDef.Parametros.t_descm = 0; - RecogidaDef.Parametros.t_desc = 40; - RecogidaDef.Parametros.t_convM = 40000; - RecogidaDef.Parametros.t_convm = 0; - RecogidaDef.Parametros.t_conv = 60 * 8; - RecogidaDef.Parametros.t_descansoM = 40000; - RecogidaDef.Parametros.t_descansom = 0; - RecogidaDef.Parametros.t_descanso = 30; - RecogidaDef.Parametros.h_inicio = 420; - RecogidaDef.Parametros.dens_vehi_org = 500; - RecogidaDef.Parametros.dens_vehi_res = 500; - RecogidaDef.Parametros.dens_vehi_env = 120; - RecogidaDef.Parametros.dens_vehi_pap = 250; - RecogidaDef.Parametros.dens_vehi_vid = 350; - RecogidaDef.Parametros.dens_vehi_otr = 100; - RecogidaDef.Parametros.dens_cont_org = 150; - RecogidaDef.Parametros.dens_cont_res = 100; - RecogidaDef.Parametros.dens_cont_env = 28; - RecogidaDef.Parametros.dens_cont_pap = 90; - RecogidaDef.Parametros.dens_cont_vid = 250; - RecogidaDef.Parametros.dens_cont_otr = 100; - RecogidaDef.Parametros.anch_vehi_3 = 2.4; - RecogidaDef.Parametros.anch_vehi_2 = 2.2; - RecogidaDef.Parametros.anch_vehi_s = 2; - RecogidaDef.Parametros.rad_giro_3 = 175; - RecogidaDef.Parametros.rad_giro_2 = 175; - RecogidaDef.Parametros.rad_giro_s = 175; - RecogidaDef.Parametros.t_vaci_tra = 30; - RecogidaDef.Parametros.t_vaci_lat = 90; - RecogidaDef.Parametros.t_vaci_sup = 180; - RecogidaDef.Parametros.t_vaci_bi = 100; - RecogidaDef.Parametros.t_vaci_bol = 5; - RecogidaDef.Parametros.t_vaci_lav = 60; - RecogidaDef.Parametros.t_vaci_otr = 60; - RecogidaDef.Parametros.kgmaxM = 20000; - RecogidaDef.Parametros.kgmaxm = 0; - RecogidaDef.Parametros.carga_maxM = 100; - RecogidaDef.Parametros.carga_maxm = 50; + RecogidaDef.lleno = c.is_lleno; + RecogidaDef.kgrec_camp = c.is_campo; + + RecogidaDef.Parametros.t_vaciM = c.t_vaciado_max; + RecogidaDef.Parametros.t_vacim = c.t_vaciado_min; + RecogidaDef.Parametros.t_llegsalM = c.t_llega_sale_max; + RecogidaDef.Parametros.t_llegsalm = c.t_llega_sale_min; + RecogidaDef.Parametros.t_llegsal = c.t_llega_sale; + RecogidaDef.Parametros.t_descM = c.t_descarga_max; + RecogidaDef.Parametros.t_descm = c.t_descarga_min; + RecogidaDef.Parametros.t_desc = c.t_descarga; + RecogidaDef.Parametros.t_convM = c.R_t_convenio_max; + RecogidaDef.Parametros.t_convm = c.R_t_convenio_min; + RecogidaDef.Parametros.t_conv = c.R_t_convenio; + RecogidaDef.Parametros.t_descansoM = c.R_t_descanso_max; + RecogidaDef.Parametros.t_descansom = c.R_t_descanso_min; + RecogidaDef.Parametros.t_descanso = c.R_t_descanso; + RecogidaDef.Parametros.h_inicio = c.R_hora_inicio; + RecogidaDef.Parametros.dens_vehi_org = c.dens_vehi_org; + RecogidaDef.Parametros.dens_vehi_res = c.dens_vehi_res; + RecogidaDef.Parametros.dens_vehi_env = c.dens_vehi_env; + RecogidaDef.Parametros.dens_vehi_pap = c.dens_vehi_pap; + RecogidaDef.Parametros.dens_vehi_vid = c.dens_vehi_vid; + RecogidaDef.Parametros.dens_vehi_otr = c.dens_vehi_otr; + RecogidaDef.Parametros.dens_cont_org = c.dens_cont_org; + RecogidaDef.Parametros.dens_cont_res = c.dens_cont_res; + RecogidaDef.Parametros.dens_cont_env = c.dens_cont_env; + RecogidaDef.Parametros.dens_cont_pap = c.dens_cont_pap; + RecogidaDef.Parametros.dens_cont_vid = c.dens_cont_vid; + RecogidaDef.Parametros.dens_cont_otr = c.dens_cont_otr; + RecogidaDef.Parametros.anch_vehi_3 = c.anch_vehi_3; + RecogidaDef.Parametros.anch_vehi_2 = c.anch_vehi_2; + RecogidaDef.Parametros.anch_vehi_s = c.anch_vehi_s; + RecogidaDef.Parametros.rad_giro_3 = c.radio_giro_3; + RecogidaDef.Parametros.rad_giro_2 = c.radio_giro_2; + RecogidaDef.Parametros.rad_giro_s = c.radio_giro_s; + RecogidaDef.Parametros.t_vaci_tra = c.t_vaci_trasera; + RecogidaDef.Parametros.t_vaci_lat = c.t_vaci_lateral; + RecogidaDef.Parametros.t_vaci_sup = c.t_vaci_superior; + RecogidaDef.Parametros.t_vaci_bi = c.t_vaci_bilateral; + RecogidaDef.Parametros.t_vaci_bol = c.t_vaci_bolseo; + RecogidaDef.Parametros.t_vaci_lav = c.t_vaci_lavado; + RecogidaDef.Parametros.t_vaci_otr = c.t_vaci_otra; + RecogidaDef.Parametros.kgmaxM = c.kgmax_max; + RecogidaDef.Parametros.kgmaxm = c.kgmax_min; + RecogidaDef.Parametros.carga_maxM = c.carga_max_max; + RecogidaDef.Parametros.carga_maxm = c.carga_max_min; //Atributos LATERALIDAD - RecogidaDef.tipos_lateralidad[(int)RecogidaDef.Lateralidad.Ambos] = "Ambos"; - RecogidaDef.tipos_lateralidad[(int)RecogidaDef.Lateralidad.Dcha] = "Derecha"; - RecogidaDef.tipos_lateralidad[(int)RecogidaDef.Lateralidad.Izqda] = "Izquierda"; + RecogidaDef.tipos_lateralidad[(int)RecogidaDef.Lateralidad.Ambos] = c.ambos; + RecogidaDef.tipos_lateralidad[(int)RecogidaDef.Lateralidad.Dcha] = c.derecha; + RecogidaDef.tipos_lateralidad[(int)RecogidaDef.Lateralidad.Izqda] = c.izquierda; //Campos de la red navegable que se leen diff --git a/Services/EjecServ.cs b/Services/EjecServ.cs index aad49b3..73f25d7 100644 --- a/Services/EjecServ.cs +++ b/Services/EjecServ.cs @@ -35,69 +35,55 @@ namespace OliviaAddInPro.Services * Modo 0, sectorizar * Modo 1, planificar */ - public bool ComienzaEjec(ModosEjec modo) + public bool ComienzaEjec(ModosEjec modo, CancelableProgressorSource cps, out string ErrStr) { - bool fue_mal = false; - - //esconde el pane - OliviaGlob.ShowHidePane(false); + bool fue_mal = false; ErrStr = string.Empty; - //Cuenta las filas que cumplen la consulta int nelems = HelperGdb.GetNumElems(com.CapaElems, com.ConsultaAmbs); - if(nelems<=0) + if (nelems <= 0) { ErrStr = "No existen ámbitos que cumplan las condiciones introducidas para la exportación " + com.ConsultaAmbs; 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; } - - if (geom_export == null || geom_export.IsEmpty) - { - fue_mal = true; - } } - + // cps.Value = 80; //crea el filtro de exportación if (!fue_mal) { //mira spatialreference de los datos de entrada spatRef = geom_export.SpatialReference; filtroEspacial = CreaFiltro(com.ConsultaAmbs, geom_export); - if (filtroEspacial == null) - { - fue_mal = true; - } - } + fue_mal = filtroEspacial == null; + if (fue_mal) + ErrStr = "error al crear el filtro de exportacion"; + + cps.Value = 80; + + if (!fue_mal) + fue_mal = Ejecuta(modo, cps, out ErrStr); - if (!fue_mal) - { - Ejecuta(modo); - return true; } - - //fue mal - //muestra pane - OliviaGlob.ShowHidePane(true); - - return false; + return fue_mal; } - /** * Prepara la geometría para exportar los ámbitos */ - public Geometry GetGeomAmbitsExport() + public Geometry GetGeomAmbitsExport(CancelableProgressorSource cps) { Geometry geomAux = null; ErrStr = string.Empty; @@ -109,12 +95,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) { @@ -130,7 +117,7 @@ namespace OliviaAddInPro.Services return null; } } - + cps.Value = 70; //Hace la intersección de la geometría con los niveles if (com.GeomNiv != null) { @@ -146,7 +133,7 @@ namespace OliviaAddInPro.Services return null; } } - + cps.Value = 75; //le quita las restricciones if (com.GeomRestr != null) { @@ -192,21 +179,15 @@ namespace OliviaAddInPro.Services /** * Exporta y lanza proceso y ventana de proceso */ - public void Ejecuta(ModosEjec modo) + public bool Ejecuta(ModosEjec modo, CancelableProgressorSource cps, out string msg) { - //lanza ventana de progreso - OliviaGlob.progrDialog = new ProgressDialog("Exportando Datos", "Cancelar", 100); - OliviaGlob.progrDialog.Show(); - + msg = ""; //exporta los datos de entrada - bool res=HelperGdb.ExportShp(com.CapaElems, filtroEspacial, com.NombreShpExport, OliviaGlob.Paths.DirData, OliviaGlob.progrDialog).Result; - if(!res) - { - string msg = HelperGdb.OutStr; - if (!string.IsNullOrEmpty(msg)) - msg = "Han ocurrido errores al convertir a shape."; - HelperGlobal.ponMsg(msg); - } + return HelperGdb.ExportShp(com.CapaElems, filtroEspacial, com.NombreShpExport, OliviaGlob.Paths.DirData, cps, out msg); + + + + } /* * Lee la capa que se ha seleccionzdo de recogida y se comprueba que contiene los campos necesarios diff --git a/Services/LimpiezaServ.cs b/Services/LimpiezaServ.cs index 91357f0..67141a6 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; @@ -9,6 +10,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; +using static OliviaAddInPro.Model.LimpiezaDef; namespace OliviaAddInPro.Services { @@ -25,17 +27,27 @@ namespace OliviaAddInPro.Services * Modo 0, sectorizar * Modo 1, planificar */ - public bool Sectoriza() + public TareaRes Sectoriza(CancelableProgressorSource cps) { + var res = new TareaRes() + { + Errores = false, + data = null, + msg = "" + }; + com = (TratamientoComun)limp; string nombFileAmbs = string.Empty; + cps.Status = "Preparando filtro para la exportacion"; //Prepara consulta ErrStr = string.Empty; if (!PreparaConsulta(out nombFileAmbs)) { - ErrStr = "No se ha seleccionado una consulta válida" + limp.ConsultaAmbs; - return false; + res.msg= "No se ha seleccionado una consulta válida" + limp.ConsultaAmbs; + res.Errores = true; + return res; } + cps.Value = 10; //Prepara nombre string fechaHora = string.Empty; @@ -44,13 +56,16 @@ namespace OliviaAddInPro.Services //Pone nombre al shape en función de los ámbitos, el tratamiento, y los polígonos + timestamp limp.NombreShpExport = prefNameExport + "T" + limp.TipoTto.ToString("00") + nombFileAmbs + DameStrPoligs() + "_" + fechaHora + extShp; + string msg = ""; //comienza ejecucion - if(!ComienzaEjec(ModosEjec.Sectoriza)) + if(!ComienzaEjec(ModosEjec.Sectoriza, cps, out msg)) { - return false; + res.Errores = true; + res.msg = msg; + return res; } - return true; + return res; } @@ -65,25 +80,33 @@ namespace OliviaAddInPro.Services return true; } - public bool Planifica() + public TareaRes Planifica(CancelableProgressorSource cps) { + TareaRes res = new TareaRes() + { + Errores = false, + msg = "", + data = null + }; //se asegura que tiene todo para planif - ErrStr = string.Empty; + //ErrStr = string.Empty; if (!CompruebaPlanif()) { - //ErrStr = "En la capa de ámbitos seleccionada no se encuentran columnas de SECTOR y/o SECUENCIA, necesarias para planificar"; - return false; + res.msg = "En la capa de ámbitos seleccionada no se encuentran columnas de SECTOR y/o SECUENCIA, necesarias para planificar"; + res.Errores = true; + return res; } //Prepara consulta string nombFileAmbs = string.Empty; //Prepara consulta if (!PreparaConsulta(out nombFileAmbs)) { - ErrStr = "No se ha seleccionado una consulta válida" + limp.ConsultaAmbs; - return false; + res.msg = "No se ha seleccionado una consulta válida" + limp.ConsultaAmbs; + res.Errores = true; + return res; } - return true; + return res; } public string DameAmbsConsulta(out string ambs_file) @@ -93,7 +116,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 deef3a5..b47228d 100644 --- a/ViewModel/Limpieza/PaneLimpiezaViewModel.cs +++ b/ViewModel/Limpieza/PaneLimpiezaViewModel.cs @@ -7,7 +7,9 @@ using System.Text; 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 @@ -20,8 +22,7 @@ namespace OliviaAddInPro _subPanel1ViewModel = new PaneLimpiezaSub1ViewModel(); _subPanel2ViewModel = new PaneLimpiezaSub2ViewModel(); _subPanel3ViewModel = new PaneLimpiezaSub3ViewModel(); - _subPanel4ViewModel = new PaneLimpiezaSub4ViewModel(); - + _subPanel4ViewModel = new PaneLimpiezaSub4ViewModel(); OptionsMenu = new ObservableCollection { @@ -150,14 +151,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; } - OliviaGlob.Limp.Ejecuta(modo); - + Action ac = finEjecuta; + OliviaGlob.Limp.EjecutaAsync(modo, progSrc, ac); + //res. + } + public void finEjecuta(TareaRes res) + { + OliviaGlob.progrDialog.Hide(); + if (res.Errores) + { + HelperGlobal.ponMsg(res.msg); + } } } }