diff --git a/Helper/HelperGdb.cs b/Helper/HelperGdb.cs index a4c8ef0..166c273 100644 --- a/Helper/HelperGdb.cs +++ b/Helper/HelperGdb.cs @@ -549,36 +549,21 @@ 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, CancelableProgressorSource cps=null) + public static Task GetGeomConvexHull(FeatureClass fclss, ArcGIS.Core.Data.QueryFilter filter) { ArcGIS.Core.Geometry.Geometry geomIni = null; return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run((Func)(() => { - geomIni = GetGeomUnique(fclss, filter, cps); - return geomIni; - /*if (geomIni != null) - { - ArcGIS.Core.Geometry.Geometry geomSal = null; - try - { - geomSal = GeometryEngine.Instance.ConvexHull(geomIni); - return geomSal; - } - catch - { - return null; - } - } - else - return null;*/ + geomIni = GetGeomUnique(fclss, filter); + return geomIni; })); } /* * 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 GetGeomUnique(FeatureClass fclss, ArcGIS.Core.Data.QueryFilter filtro, CancelableProgressorSource cps) + public static ArcGIS.Core.Geometry.Geometry GetGeomUnique(FeatureClass fclss, ArcGIS.Core.Data.QueryFilter filtro) { ArcGIS.Core.Geometry.Geometry geomsal = null; ReiniciaOutStr(); @@ -586,7 +571,6 @@ namespace OliviaAddInPro.Helper try { var geom = new List(); - //geomSal = GeometryEngine.Instance.Union(f); using (RowCursor rowCursor = fclss.Search(filtro)) { @@ -595,9 +579,7 @@ namespace OliviaAddInPro.Helper using (Row row = rowCursor.Current) { if (row is Feature ft) - geom.Add(ft.GetShape()); - //geomsal = UneGeom(geomsal, ft.GetShape()); - + geom.Add(ft.GetShape()); } } geomsal= GeometryEngine.Instance.Union(geom); @@ -638,7 +620,7 @@ namespace OliviaAddInPro.Helper { where = $"{fieldName} = {Quote(f)}{selFieldVals[i]}{Quote(f)}"; filtro = new ArcGIS.Core.Data.QueryFilter { WhereClause = where }; - geomAux = GetGeomUnique(fclss, filtro, null); + geomAux = GetGeomUnique(fclss, filtro); if(geomAux == null) { ok = false; @@ -1072,39 +1054,46 @@ namespace OliviaAddInPro.Helper public static Respuesta AddPtoInGeom(Coordinate2D pto, ArcGIS.Core.Geometry.Geometry geom) { Respuesta resp = new Respuesta(); - double buffer = 100;//m de distancia desde la instalación + double buffer = 0;//m de distancia desde la instalación + bool repite = true; + ArcGIS.Core.Geometry.Geometry geom_pto, geom_sal; try { - ArcGIS.Core.Geometry.Geometry geom_pto = GeometryEngine.Instance.Buffer(pto.ToMapPoint(), buffer); - if(geom_pto==null || geom_pto.IsEmpty) + do { - resp.Value = null; - resp.Error.Add("Error al bufferear punto para incluirlo en polígono"); - return resp; + buffer += 100; + geom_pto = GeometryEngine.Instance.Buffer(pto.ToMapPoint(), buffer); + if(geom_pto==null || geom_pto.IsEmpty) + { + resp.Value = null; + resp.Error.Add("Error al bufferear punto para incluirlo en polígono"); + return resp; + } + //hace la convex hull, por si no fueran conexas las zonas + repite= GeometryEngine.Instance.Disjoint(geom_pto, geom); + /*if (geom_aux == null || geom_aux.IsEmpty) + { + ArcGIS.Core.Geometry.Envelope env1 = geom_sal.Extent; + ArcGIS.Core.Geometry.Envelope env2 = geom_pto.Extent; + ArcGIS.Core.Geometry.Envelope env3 = env1.Union(env2); + geom_sal = (ArcGIS.Core.Geometry.Geometry) env3; + //geom_sal = GeometryEngine.Instance.Envelope(geom_sal); + if (geom_sal == null || geom_sal.IsEmpty) + { + resp.Value = null; + resp.Error.Add("Error al hacer envolvente en unir punto al polígono"); + return resp; + } + }*/ } - ArcGIS.Core.Geometry.Geometry geom_sal = GeometryEngine.Instance.Union(geom_pto, geom); + while (repite); + geom_sal = GeometryEngine.Instance.Union(geom_pto, geom); if (geom_sal == null || geom_sal.IsEmpty) { resp.Value = null; resp.Error.Add("Error al unir punto a polígono"); return resp; } - //hace la convez hull, por si no fueran conexas las zonas - ArcGIS.Core.Geometry.Geometry geom_aux= GeometryEngine.Instance.Intersection(geom_pto, geom); - if (geom_aux == null || geom_aux.IsEmpty) - { - ArcGIS.Core.Geometry.Envelope env1 = geom_sal.Extent; - ArcGIS.Core.Geometry.Envelope env2 = geom_pto.Extent; - ArcGIS.Core.Geometry.Envelope env3 = env1.Union(env2); - geom_sal = (ArcGIS.Core.Geometry.Geometry) env3; - //geom_sal = GeometryEngine.Instance.Envelope(geom_sal); - if (geom_sal == null || geom_sal.IsEmpty) - { - resp.Value = null; - resp.Error.Add("Error al hacer envolvente en unir punto al polígono"); - return resp; - } - } resp.Value = geom_sal; return resp; } diff --git a/Model/Limpieza.cs b/Model/Limpieza.cs index 0abf541..625d496 100644 --- a/Model/Limpieza.cs +++ b/Model/Limpieza.cs @@ -52,10 +52,7 @@ namespace OliviaAddInPro.Model public TareaRes Ejecuta(ModosEjec modo, CancelableProgressorSource cps) { TareaRes res = null; - if (modo == ModosEjec.Sectoriza) - res = Serv.Sectoriza(cps); - else if (modo == ModosEjec.Planifica) - res = Serv.Planifica(cps); + res = Serv.Ejecuta(modo, cps); return res; } public async void EjecutaAsync(ModosEjec modo, CancelableProgressorSource cps, Action ffin) diff --git a/Model/Recogida.cs b/Model/Recogida.cs index f58386d..6c2cee2 100644 --- a/Model/Recogida.cs +++ b/Model/Recogida.cs @@ -82,12 +82,9 @@ namespace OliviaAddInPro.Model public TareaRes Ejecuta(ModosEjec modo, CancelableProgressorSource cps) { TareaRes res = null; - if (modo == ModosEjec.Sectoriza) - res = Serv.Sectoriza(cps); - else if (modo == ModosEjec.Planifica) - res = Serv.Planifica(cps); + res = Serv.Ejecuta(modo, cps); return res; - + } public async void EjecutaAsync(ModosEjec modo, CancelableProgressorSource cps, Action ffin) { diff --git a/Services/EjecServ.cs b/Services/EjecServ.cs index e6809fa..8c6b78c 100644 --- a/Services/EjecServ.cs +++ b/Services/EjecServ.cs @@ -40,6 +40,13 @@ namespace OliviaAddInPro.Services ErrStr = string.Empty; try { + //Comprueba que tiene las columnas necesarias para planificar + if ((modo == ModosEjec.Planifica) && !CompruebaPlanif()) + { + ErrStr = "En la capa de ámbitos seleccionada no se encuentran columnas de SECTOR y/o SECUENCIA, necesarias para planificar"; + return false; + } + //Cuenta las filas que cumplen la consulta int nelems = HelperGdb.GetNumElems(com.CapaElems, com.ConsultaAmbs); if (nelems <= 0) @@ -52,7 +59,7 @@ namespace OliviaAddInPro.Services //Obtiene la geometría que envuelve a los ámbitos Geometry geom_export = null; - geom_export = GetGeomAmbitsExport(cps); + geom_export = GetGeomAmbitsExport(); if (geom_export == null || geom_export.IsEmpty) { ErrStr = "No se ha podido generar geometría de los ámbitos" + com.ConsultaAmbs + ErrStr; @@ -212,7 +219,7 @@ namespace OliviaAddInPro.Services /** * Prepara la geometría para exportar los ámbitos */ - public Geometry GetGeomAmbitsExport(CancelableProgressorSource cps) + public Geometry GetGeomAmbitsExport() { Geometry geomAux = null; Geometry geomAmbits = null; @@ -247,14 +254,13 @@ namespace OliviaAddInPro.Services ErrStr = "Al emplear ejes de calle como ámbitos es necesario indicar polígono de exportación"; return null; } - cps.Value = 30; //prepara el filtro con consulta y espacial SpatialQueryFilter filtro = HelperGdb.CreateFiler(com.ConsultaAmbs, geomAux); if (geomAux == null) { //Ahora hace la geometría de los ámbitos que cumplen la consulta, si no hay ya geometría - geomAmbits = HelperGdb.GetGeomConvexHull(fc, filtro, cps).Result; + geomAmbits = HelperGdb.GetGeomConvexHull(fc, filtro).Result; if (geomAmbits == null || geomAmbits.IsEmpty) { ErrStr = "No se ha podido generar geometría de los ámbitos" + com.ConsultaAmbs + HelperGdb.OutStr; @@ -262,7 +268,6 @@ namespace OliviaAddInPro.Services } geomAux = geomAmbits; } - cps.Value = 60; //le quita las restricciones if (com.GeomRestr != null) { @@ -273,7 +278,6 @@ namespace OliviaAddInPro.Services return null; } } - cps.Value = 75; HelperGdb.Free(fc); return geomAux; } @@ -333,6 +337,21 @@ namespace OliviaAddInPro.Services return CompruebaCampos(pathCapa, camps) == 0; } + /** + * Comprueba lo necesario para ver si hay campos para la planificación + */ + public bool CompruebaPlanif() + { + //si ha importado no hace falta que compruebe, seguro que las tiene + if (OliviaGlob.IsConfig2()) + return true; + //no ha importado, comprueba capa + if (ComprCamposPlanif(com.CapaElems)) + return true; + + return false; + } + /** * Borra los archivos exportados para el proceso */ diff --git a/Services/LimpiezaServ.cs b/Services/LimpiezaServ.cs index bf37014..25a4fc7 100644 --- a/Services/LimpiezaServ.cs +++ b/Services/LimpiezaServ.cs @@ -27,7 +27,7 @@ namespace OliviaAddInPro.Services * Modo 0, sectorizar * Modo 1, planificar */ - public TareaRes Sectoriza(CancelableProgressorSource cps) + public TareaRes Ejecuta(ModosEjec modo, CancelableProgressorSource cps) { var res = new TareaRes() { @@ -74,36 +74,7 @@ namespace OliviaAddInPro.Services return false; } return true; - } - - public TareaRes Planifica(CancelableProgressorSource cps) - { - TareaRes res = new TareaRes() - { - Errores = false, - msg = "", - data = null - }; - //se asegura que tiene todo para planif - //ErrStr = string.Empty; - if (!CompruebaPlanif()) - { - 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)) - { - res.msg = "No se ha seleccionado una consulta válida" + limp.ConsultaAmbs; - res.Errores = true; - return res; - } - - return res; - } + } public string DameAmbsConsulta(out string ambs_file) { @@ -134,9 +105,9 @@ namespace OliviaAddInPro.Services /** * Comprueba lo necesario para ver si hay campos para la planificación */ - public bool CompruebaPlanif() + public bool CompruebaPlanif2() { - + //NO SE USA AQUÍ, ESTÁ EN EJECSERV //si ha importado no hace falta que compruebe, seguro que las tiene if (OliviaGlob.IsConfig2()) return true; diff --git a/Services/RecogidaServ.cs b/Services/RecogidaServ.cs index 11c0888..d790e79 100644 --- a/Services/RecogidaServ.cs +++ b/Services/RecogidaServ.cs @@ -60,7 +60,7 @@ namespace OliviaAddInPro.Services * Modo 0, sectorizar * Modo 1, planificar */ - public TareaRes Sectoriza(CancelableProgressorSource cps) + public TareaRes Ejecuta(ModosEjec modo, CancelableProgressorSource cps) { var res = new TareaRes() { @@ -85,7 +85,6 @@ namespace OliviaAddInPro.Services //Prepara nombre //Pone nombre al shape en función de los ámbitos, el tratamiento, y los polígonos + timestamp - //REVISAR PARA RECO reco.NombreShpExp_PrefTto = nombFileAmbs + DameStrPoligs(); string msg = ""; @@ -111,75 +110,43 @@ namespace OliviaAddInPro.Services } return true; } - - public TareaRes Planifica(CancelableProgressorSource cps) + + public string DameAmbsConsulta(out string cap_abrev) { - TareaRes res = new TareaRes() + string consulta, orstr, aux; + + consulta = null; + cap_abrev = ""; + aux = ""; + orstr = null; + + if (reco.TipoFrac != -1) { - Errores = false, - msg = "", - data = null - };/* - //se asegura que tiene todo para planif - //ErrStr = string.Empty; - if (!CompruebaPlanif()) - { - 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; + consulta = consulta + orstr + "(" + RecogidaDef.filtro_str[reco.TipoFrac] + ")"; + cap_abrev = reco.TipoFrac.ToString("00"); + cap_abrev = "F" + cap_abrev + "_"; + if (consulta == "()") + consulta = ""; } - //Prepara consulta - string nombFileAmbs = string.Empty; - //Prepara consulta - if (!PreparaConsulta(out nombFileAmbs)) + if (orstr == null) + orstr = " AND "; + if (reco.TipoCarg != -1) { - res.msg = "No se ha seleccionado una consulta válida" + reco.ConsultaAmbs; - res.Errores = true; - return res; - }*/ - - return res; - } - public string DameAmbsConsulta(out string ambs_file) - { - string consulta, orstr; - - consulta = string.Empty; - ambs_file = ""; - /*orstr = null; - var n = reco.AmbitosSel.Length; - - for (int i = 0; i < n; i++) - { - if (limp.AmbitosSel[i]) - { - consulta = consulta + orstr + "(" + LimpiezaDef.filtro_str[i] + ")"; - ambs_file = ambs_file + i.ToString("00"); - if (orstr == null) - orstr = " OR "; - } + consulta = consulta + orstr + "(" + RecogidaDef.filtro_str[RecogidaDef.tipos_fracc_str.Length + reco.TipoCarg] + ")"; + aux = reco.TipoCarg.ToString("00"); + cap_abrev = cap_abrev + "C" + aux; + if (consulta == "()") + consulta = ""; + } + if (reco.TipoLate > 0) + { + consulta = consulta + orstr + "(" + RecogidaDef.campos_def.cons_lateral + " = '" + RecogidaDef.tipos_lateralidad[reco.TipoLate] + "'" + ")"; + if (consulta == "()") + consulta = ""; } - ambs_file = "_A" + ambs_file; - if (consulta == "()") - consulta = ""; - */ return consulta; } - /** - * Comprueba lo necesario para ver si hay campos para la planificación - */ - public bool CompruebaPlanif() - { - - //si ha importado no hace falta que compruebe, seguro que las tiene - if (OliviaGlob.IsConfig2()) - return true; - //no ha importado, comprueba capa - if (ComprCamposPlanif(reco.CapaElems)) - return true; - - return false; - } + /** * Rellena el array de filtros en base a la config */ diff --git a/View/PaneEjecutar.xaml.cs b/View/PaneEjecutar.xaml.cs index cc1264c..5c4113c 100644 --- a/View/PaneEjecutar.xaml.cs +++ b/View/PaneEjecutar.xaml.cs @@ -28,17 +28,25 @@ namespace OliviaAddInPro private void button_secto_Click(object sender, RoutedEventArgs e) { - if (DataContext is PaneLimpiezaViewModel mod) + if (DataContext is PaneLimpiezaViewModel modlimp) { - mod.Ejecuta(OliviaAddInPro.Services.ModosEjec.Sectoriza); + modlimp.Ejecuta(OliviaAddInPro.Services.ModosEjec.Sectoriza); + } + else if(DataContext is PaneRecogidaViewModel modrec) + { + modrec.Ejecuta(OliviaAddInPro.Services.ModosEjec.Planifica); } } private void button_planif_Click(object sender, RoutedEventArgs e) { - if (DataContext is PaneLimpiezaViewModel mod) + if (DataContext is PaneLimpiezaViewModel modlimp) { - mod.Ejecuta(OliviaAddInPro.Services.ModosEjec.Planifica); + modlimp.Ejecuta(OliviaAddInPro.Services.ModosEjec.Planifica); + } + else if (DataContext is PaneRecogidaViewModel modrec) + { + modrec.Ejecuta(OliviaAddInPro.Services.ModosEjec.Planifica); } } diff --git a/View/Recogida/PaneRecogidaSub1.xaml.cs b/View/Recogida/PaneRecogidaSub1.xaml.cs index dd22206..195af6b 100644 --- a/View/Recogida/PaneRecogidaSub1.xaml.cs +++ b/View/Recogida/PaneRecogidaSub1.xaml.cs @@ -155,7 +155,7 @@ namespace OliviaAddInPro ArcGIS.Core.Geometry.Geometry geomsal = HelperGdb.OpenGeom(HelperGdb.TiposOpenFileDlg.OpenFtrClassPoint,out texto); - if ((DataContext is PaneRecogidaSub1ViewModel mod) && geomsal != null && geomsal is MapPoint mp) + if ((DataContext is PaneRecogidaSub1ViewModel mod) && geomsal != null) { if (geomsal is MapPoint map) mod.CoordsPlanta = map.Coordinate2D; diff --git a/ViewModel/Limpieza/PaneLimpiezaViewModel.cs b/ViewModel/Limpieza/PaneLimpiezaViewModel.cs index 18fa29a..711e513 100644 --- a/ViewModel/Limpieza/PaneLimpiezaViewModel.cs +++ b/ViewModel/Limpieza/PaneLimpiezaViewModel.cs @@ -176,7 +176,6 @@ namespace OliviaAddInPro OliviaGlob.progrDialog.Show(); var progSrc = new CancelableProgressorSource(OliviaGlob.progrDialog); - if (!Lee(out err)) { HelperGlobal.ponMsg(err); diff --git a/ViewModel/Recogida/PaneRecogidaViewModel.cs b/ViewModel/Recogida/PaneRecogidaViewModel.cs index ccfad63..e716a50 100644 --- a/ViewModel/Recogida/PaneRecogidaViewModel.cs +++ b/ViewModel/Recogida/PaneRecogidaViewModel.cs @@ -101,9 +101,7 @@ namespace OliviaAddInPro err_str = "No se ha seleccionado ninguna Capa de Limpieza"; return false; } - reco.CapaElems = _subPanel1ViewModel.CapaElems; - reco.TipoTto = reco.TipoFrac; - reco.TipoTtoStr= RecogidaDef.tipos_fracc_str[reco.TipoFrac]; + reco.CapaElems = _subPanel1ViewModel.CapaElems; //lee la fracción reco.TipoFrac = _subPanel1ViewModel.TipoFrac; if (reco.TipoFrac == -1) @@ -112,6 +110,8 @@ namespace OliviaAddInPro return false; } reco.TipoFracStr = RecogidaDef.tipos_fracc_str[reco.TipoFrac]; + reco.TipoTto = reco.TipoFrac; + reco.TipoTtoStr = RecogidaDef.tipos_fracc_str[reco.TipoFrac]; //lee la densidad del contenedor //si se ha seleccionado que se recogen los contenedores llenos hay que comprobar que se ha rellenado la densidad de los contenedores @@ -213,6 +213,7 @@ namespace OliviaAddInPro } catch { + err_str = "Error al leer ventana de descarga: "+ err_str; return false; } }